// remove will remove the supplied unit from state. It will panic if it // observes inconsistent internal state. func (d *Deployer) remove(unit *apideployer.Unit) error { unitName := unit.Name() if d.deployed.Contains(unitName) { panic("must not remove a deployed unit") } else if unit.Life() == params.Alive { panic("must not remove an Alive unit") } logger.Infof("removing unit %q", unitName) return unit.Remove() }
// deploy will deploy the supplied unit with the deployer's manager. It will // panic if it observes inconsistent internal state. func (d *Deployer) deploy(unit *apideployer.Unit) error { unitName := unit.Name() if d.deployed.Contains(unit.Name()) { panic("must not re-deploy a deployed unit") } if err := unit.SetStatus(status.Waiting, status.MessageInstallingAgent, nil); err != nil { return errors.Trace(err) } logger.Infof("deploying unit %q", unitName) initialPassword, err := utils.RandomPassword() if err != nil { return err } if err := unit.SetPassword(initialPassword); err != nil { return fmt.Errorf("cannot set password for unit %q: %v", unitName, err) } if err := d.ctx.DeployUnit(unitName, initialPassword); err != nil { return err } d.deployed.Add(unitName) return nil }