// ConfigureBootstrapMachine adds the initial machine into state. As a part // of this process the environmental constraints are saved as constraints used // when bootstrapping are considered constraints for the entire environment. func ConfigureBootstrapMachine( st *state.State, cons constraints.Value, datadir string, jobs []state.MachineJob, instId instance.Id, characteristics instance.HardwareCharacteristics, ) error { logger.Debugf("setting environment constraints") if err := st.SetEnvironConstraints(cons); err != nil { return err } logger.Debugf("create bootstrap machine in state") m, err := st.InjectMachine(version.Current.Series, cons, instId, characteristics, jobs...) if err != nil { return err } // Read the machine agent's password and change it to // a new password (other agents will change their password // via the API connection). logger.Debugf("create new random password for machine %v", m.Id()) mconf, err := agent.ReadConf(datadir, m.Tag()) if err != nil { return err } newPassword, err := utils.RandomPassword() if err != nil { return err } mconf.StateInfo.Password = newPassword mconf.APIInfo.Password = newPassword mconf.OldPassword = "" if err := mconf.Write(); err != nil { return err } if err := m.SetMongoPassword(newPassword); err != nil { return err } if err := m.SetPassword(newPassword); err != nil { return err } return nil }