func (i *importer) relation(rel description.Relation) error { relationDoc := i.makeRelationDoc(rel) ops := []txn.Op{ { C: relationsC, Id: relationDoc.Key, Assert: txn.DocMissing, Insert: relationDoc, }, } dbRelation := newRelation(i.st, relationDoc) // Add an op that adds the relation scope document for each // unit of the service, and an op that adds the relation settings // for each unit. for _, endpoint := range rel.Endpoints() { units := i.serviceUnits[endpoint.ServiceName()] for _, unit := range units { ru, err := dbRelation.Unit(unit) if err != nil { return errors.Trace(err) } ruKey := ru.key() ops = append(ops, txn.Op{ C: relationScopesC, Id: ruKey, Assert: txn.DocMissing, Insert: relationScopeDoc{ Key: ruKey, }, }, createSettingsOp(ruKey, endpoint.Settings(unit.Name())), ) } } if err := i.st.runTransaction(ops); err != nil { return errors.Trace(err) } return nil }
func (i *importer) makeRelationDoc(rel description.Relation) *relationDoc { endpoints := rel.Endpoints() doc := &relationDoc{ Key: rel.Key(), Id: rel.Id(), Endpoints: make([]Endpoint, len(endpoints)), Life: Alive, } for i, ep := range endpoints { doc.Endpoints[i] = Endpoint{ ServiceName: ep.ServiceName(), Relation: charm.Relation{ Name: ep.Name(), Role: charm.RelationRole(ep.Role()), Interface: ep.Interface(), Optional: ep.Optional(), Limit: ep.Limit(), Scope: charm.RelationScope(ep.Scope()), }, } doc.UnitCount += ep.UnitCount() } return doc }