func (c *DebugHooksCommand) validateHooks(unit *state.Unit) error { if len(c.hooks) == 0 { return nil } service, err := unit.Service() if err != nil { return err } eps, err := service.Endpoints() if err != nil { return err } validHooks := make(map[string]bool) for _, hook := range hooks.UnitHooks() { validHooks[string(hook)] = true } for _, ep := range eps { for _, hook := range hooks.RelationHooks() { hook := fmt.Sprintf("%s-%s", ep.Relation.Name, hook) validHooks[hook] = true } } for _, hook := range c.hooks { if !validHooks[hook] { return fmt.Errorf("unit %q does not contain hook %q", unit.Name(), hook) } } return nil }
// startUnit creates a new data value for tracking details of the // unit and starts watching the unit for port changes. The provided // machineId must be the id for the machine the unit was last observed // to be assigned to. func (fw *Firewaller) startUnit(unit *state.Unit, machineId string) error { service, err := unit.Service() if err != nil { return err } serviceName := service.Name() unitName := unit.Name() unitd := &unitData{ fw: fw, unit: unit, ports: unit.OpenedPorts(), } fw.unitds[unitName] = unitd unitd.machined = fw.machineds[machineId] unitd.machined.unitds[unitName] = unitd if fw.serviceds[serviceName] == nil { err := fw.startService(service) if err != nil { delete(fw.unitds, unitName) return err } } unitd.serviced = fw.serviceds[serviceName] unitd.serviced.unitds[unitName] = unitd ports := make([]instance.Port, len(unitd.ports)) copy(ports, unitd.ports) go unitd.watchLoop(ports) return nil }
// remove will remove the supplied unit from state. It will panic if it // observes inconsistent internal state. func (d *Deployer) remove(unit *state.Unit) error { if d.deployed[unit.Name()] { panic("must not remove a deployed unit") } else if unit.Life() == state.Alive { panic("must not remove an Alive unit") } log.Printf("worker/deployer: removing unit %q", unit) if err := unit.EnsureDead(); err != nil { return err } service, err := unit.Service() if err != nil { return err } return service.RemoveUnit(unit) }