// ChangeAgentTools does the actual agent upgrade. func (e *UpgradeReadyError) ChangeAgentTools() error { tools, err := environs.ChangeAgentTools(e.DataDir, e.AgentName, e.NewTools.Binary) if err != nil { return err } log.Printf("cmd/jujud: upgrader upgraded from %v to %v (%q)", e.OldTools.Binary, tools.Binary, tools.URL) return nil }
func (t *ToolsSuite) TestChangeAgentTools(c *C) { files := []*testing.TarFile{ testing.NewTarFile("jujuc", 0755, "juju executable"), testing.NewTarFile("jujud", 0755, "jujuc executable"), } tools := &state.Tools{ URL: "http://foo/bar1", Binary: version.MustParseBinary("1.2.3-foo-bar"), } err := environs.UnpackTools(t.dataDir, tools, bytes.NewReader(testing.TarGz(files...))) c.Assert(err, IsNil) gotTools, err := environs.ChangeAgentTools(t.dataDir, "testagent", tools.Binary) c.Assert(err, IsNil) c.Assert(*gotTools, Equals, *tools) assertDirNames(c, t.toolsDir(), []string{"1.2.3-foo-bar", "testagent"}) assertDirNames(c, environs.AgentToolsDir(t.dataDir, "testagent"), []string{"jujuc", "jujud", urlFile}) // Upgrade again to check that the link replacement logic works ok. files2 := []*testing.TarFile{ testing.NewTarFile("foo", 0755, "foo content"), testing.NewTarFile("bar", 0755, "bar content"), } tools2 := &state.Tools{ URL: "http://foo/bar2", Binary: version.MustParseBinary("1.2.4-foo-bar"), } err = environs.UnpackTools(t.dataDir, tools2, bytes.NewReader(testing.TarGz(files2...))) c.Assert(err, IsNil) gotTools, err = environs.ChangeAgentTools(t.dataDir, "testagent", tools2.Binary) c.Assert(err, IsNil) c.Assert(*gotTools, Equals, *tools2) assertDirNames(c, t.toolsDir(), []string{"1.2.3-foo-bar", "1.2.4-foo-bar", "testagent"}) assertDirNames(c, environs.AgentToolsDir(t.dataDir, "testagent"), []string{"foo", "bar", urlFile}) }
// primeAgent writes the configuration file and tools // for an agent with the given entity name. // It returns the agent's configuration and the current tools. func (s *agentSuite) primeAgent(c *C, entityName, password string) (*agent.Conf, *state.Tools) { tools := s.primeTools(c, version.Current) tools1, err := environs.ChangeAgentTools(s.DataDir(), entityName, version.Current) c.Assert(err, IsNil) c.Assert(tools1, DeepEquals, tools) conf := &agent.Conf{ DataDir: s.DataDir(), OldPassword: password, StateInfo: s.StateInfo(c), } conf.StateInfo.EntityName = entityName err = conf.Write() c.Assert(err, IsNil) return conf, tools }
func (mgr *SimpleManager) DeployUnit(unitName, initialPassword string) (err error) { // Check sanity. svc := mgr.upstartService(unitName) if svc.Installed() { return fmt.Errorf("unit %q is already deployed", unitName) } // Link the current tools for use by the new agent. entityName := state.UnitEntityName(unitName) _, err = environs.ChangeAgentTools(mgr.DataDir, entityName, version.Current) toolsDir := environs.AgentToolsDir(mgr.DataDir, entityName) defer removeOnErr(&err, toolsDir) info := *mgr.StateInfo // Prepare the agent's configuration data. conf := &agent.Conf{ DataDir: mgr.DataDir, OldPassword: initialPassword, StateInfo: &info, } conf.StateInfo.EntityName = entityName conf.StateInfo.Password = "" if err := conf.Write(); err != nil { return err } defer removeOnErr(&err, conf.Dir()) // Install an upstart job that runs the unit agent. logPath := filepath.Join(mgr.LogDir, entityName+".log") cmd := strings.Join([]string{ filepath.Join(toolsDir, "jujud"), "unit", "--data-dir", conf.DataDir, "--unit-name", unitName, "--debug", // TODO: propagate debug state sensibly }, " ") uconf := &upstart.Conf{ Service: *svc, Desc: "juju unit agent for " + unitName, Cmd: cmd, Out: logPath, } return uconf.Install() }