func (s *HookContextSuite) AddUnit(c *C, svc *state.Service) *state.Unit { unit, err := svc.AddUnit() c.Assert(err, IsNil) name := strings.Replace(unit.Name(), "/", "-", 1) err = unit.SetPrivateAddress(name + ".testing.invalid") c.Assert(err, IsNil) return unit }
func (s *SSHCommonSuite) addUnit(srv *state.Service, m *state.Machine, c *C) { u, err := srv.AddUnit() c.Assert(err, IsNil) err = u.AssignToMachine(m) c.Assert(err, IsNil) // fudge unit.SetPublicAddress id, err := m.InstanceId() c.Assert(err, IsNil) insts, err := s.Conn.Environ.Instances([]state.InstanceId{id}) c.Assert(err, IsNil) addr, err := insts[0].WaitDNSName() c.Assert(err, IsNil) err = u.SetPublicAddress(addr) c.Assert(err, IsNil) }
// AddUnits starts n units of the given service and allocates machines // to them as necessary. func (conn *Conn) AddUnits(svc *state.Service, n int) ([]*state.Unit, error) { units := make([]*state.Unit, n) // TODO what do we do if we fail half-way through this process? for i := 0; i < n; i++ { policy := conn.Environ.AssignmentPolicy() unit, err := svc.AddUnit() if err != nil { return nil, fmt.Errorf("cannot add unit %d/%d to service %q: %v", i+1, n, svc.Name(), err) } if err := conn.State.AssignUnit(unit, policy); err != nil { return nil, err } units[i] = unit } return units, nil }
func addRU(c *C, svc *state.Service, rel *state.Relation, principal *state.Unit) (*state.Unit, *state.RelationUnit) { // Given the service svc in the relation rel, add a unit of svc and create // a RelationUnit with rel. If principal is supplied, svc is assumed to be // subordinate and the unit will be created by temporarily entering the // relation's scope as the principal. var u *state.Unit if principal == nil { unit, err := svc.AddUnit() c.Assert(err, IsNil) u = unit } else { origUnits, err := svc.AllUnits() c.Assert(err, IsNil) pru, err := rel.Unit(principal) c.Assert(err, IsNil) err = pru.EnterScope(nil) // to create the subordinate c.Assert(err, IsNil) err = pru.LeaveScope() // to reset to initial expected state c.Assert(err, IsNil) newUnits, err := svc.AllUnits() c.Assert(err, IsNil) for _, unit := range newUnits { found := false for _, old := range origUnits { if unit.Name() == old.Name() { found = true break } } if !found { u = unit break } } c.Assert(u, NotNil) } preventUnitDestroyRemove(c, u) ru, err := rel.Unit(u) c.Assert(err, IsNil) return u, ru }
// AddUnits starts n units of the given service and allocates machines // to them as necessary. func (conn *Conn) AddUnits(svc *state.Service, n int, machineIdSpec string) ([]*state.Unit, error) { units := make([]*state.Unit, n) // Hard code for now till we implement a different approach. policy := state.AssignCleanEmpty // TODO what do we do if we fail half-way through this process? for i := 0; i < n; i++ { unit, err := svc.AddUnit() if err != nil { return nil, fmt.Errorf("cannot add unit %d/%d to service %q: %v", i+1, n, svc.Name(), err) } if machineIdSpec != "" { if n != 1 { return nil, fmt.Errorf("cannot add multiple units of service %q to a single machine", svc.Name()) } // machineIdSpec may be an existing machine or container, eg 3/lxc/2 // or a new container on a machine, eg lxc:3 mid := machineIdSpec var containerType instance.ContainerType specParts := strings.Split(machineIdSpec, ":") if len(specParts) > 1 { firstPart := specParts[0] var err error if containerType, err = instance.ParseSupportedContainerType(firstPart); err == nil { mid = strings.Join(specParts[1:], "/") } else { mid = machineIdSpec } } if !names.IsMachine(mid) { return nil, fmt.Errorf("invalid force machine id %q", mid) } var err error var m *state.Machine // If a container is to be used, create it. if containerType != "" { params := state.AddMachineParams{ Series: unit.Series(), ParentId: mid, ContainerType: containerType, Jobs: []state.MachineJob{state.JobHostUnits}, } m, err = conn.State.AddMachineWithConstraints(¶ms) } else { m, err = conn.State.Machine(mid) } if err != nil { return nil, fmt.Errorf("cannot assign unit %q to machine: %v", unit.Name(), err) } err = unit.AssignToMachine(m) if err != nil { return nil, err } } else if err := conn.State.AssignUnit(unit, policy); err != nil { return nil, err } units[i] = unit } return units, nil }