func (t *ToolsSuite) TestPutGetTools(c *C) { tools, err := environs.PutTools(t.env.Storage(), nil) c.Assert(err, IsNil) c.Assert(tools.Binary, Equals, version.Current) c.Assert(tools.URL, Not(Equals), "") for i, get := range []func(dataDir string, t *state.Tools) error{ getTools, getToolsWithTar, } { c.Logf("test %d", i) // Unarchive the tool executables into a temp directory. dataDir := c.MkDir() err = get(dataDir, tools) c.Assert(err, IsNil) dir := environs.ToolsDir(dataDir, version.Current) // Verify that each tool executes and produces some // characteristic output. for i, test := range commandTests { c.Logf("command test %d", i) out, err := exec.Command(filepath.Join(dir, test.cmd[0]), test.cmd[1:]...).CombinedOutput() if err != nil { c.Assert(err, FitsTypeOf, (*exec.ExitError)(nil)) } c.Check(string(out), Matches, test.output) } data, err := ioutil.ReadFile(filepath.Join(dir, urlFile)) c.Assert(err, IsNil) c.Assert(string(data), Equals, tools.URL) } }
func (s *ToolsSuite) SetUpTest(c *C) { s.dataDir = c.MkDir() s.toolsDir = environs.ToolsDir(s.dataDir, version.Current) err := os.MkdirAll(s.toolsDir, 0755) c.Assert(err, IsNil) err = os.Symlink(s.toolsDir, environs.AgentToolsDir(s.dataDir, "unit-u-123")) c.Assert(err, IsNil) }
// assertToolsContents asserts that the directory for the tools // has the given contents. func (t *ToolsSuite) assertToolsContents(c *C, tools *state.Tools, files []*testing.TarFile) { var wantNames []string for _, f := range files { wantNames = append(wantNames, f.Header.Name) } wantNames = append(wantNames, urlFile) dir := environs.ToolsDir(t.dataDir, tools.Binary) assertDirNames(c, dir, wantNames) assertFileContents(c, dir, urlFile, tools.URL, 0200) for _, f := range files { assertFileContents(c, dir, f.Header.Name, f.Contents, 0400) } gotTools, err := environs.ReadTools(t.dataDir, tools.Binary) c.Assert(err, IsNil) c.Assert(*gotTools, Equals, *tools) }
func (t *ToolsSuite) TestReadToolsErrors(c *C) { vers := version.MustParseBinary("1.2.3-precise-amd64") tools, err := environs.ReadTools(t.dataDir, vers) c.Assert(tools, IsNil) c.Assert(err, ErrorMatches, "cannot read URL in tools directory: .*") dir := environs.ToolsDir(t.dataDir, vers) err = os.MkdirAll(dir, 0755) c.Assert(err, IsNil) err = ioutil.WriteFile(filepath.Join(dir, urlFile), []byte(" \t\n"), 0644) c.Assert(err, IsNil) tools, err = environs.ReadTools(t.dataDir, vers) c.Assert(tools, IsNil) c.Assert(err, ErrorMatches, "empty URL in tools directory.*") }
func (fix *SimpleToolsFixture) SetUp(c *C, dataDir string) { fix.dataDir = dataDir fix.initDir = c.MkDir() fix.logDir = c.MkDir() toolsDir := environs.ToolsDir(fix.dataDir, version.Current) err := os.MkdirAll(toolsDir, 0755) c.Assert(err, IsNil) jujudPath := filepath.Join(toolsDir, "jujud") err = ioutil.WriteFile(jujudPath, []byte(fakeJujud), 0755) c.Assert(err, IsNil) urlPath := filepath.Join(toolsDir, "downloaded-url.txt") err = ioutil.WriteFile(urlPath, []byte("http://example.com/tools"), 0644) c.Assert(err, IsNil) fix.binDir = c.MkDir() fix.origPath = os.Getenv("PATH") os.Setenv("PATH", fix.binDir+":"+fix.origPath) fix.makeBin(c, "status", `echo "blah stop/waiting"`) fix.makeBin(c, "stopped-status", `echo "blah stop/waiting"`) fix.makeBin(c, "started-status", `echo "blah start/running, process 666"`) fix.makeBin(c, "start", "cp $(which started-status) $(which status)") fix.makeBin(c, "stop", "cp $(which stopped-status) $(which status)") }
// getToolsWithTar is the same as getTools but uses tar // itself so we're not just testing the Go tar package against // itself. func getToolsWithTar(dataDir string, tools *state.Tools) error { resp, err := http.Get(tools.URL) if err != nil { return err } defer resp.Body.Close() dir := environs.ToolsDir(dataDir, tools.Binary) err = os.MkdirAll(dir, 0755) if err != nil { return err } cmd := exec.Command("tar", "xz") cmd.Dir = dir cmd.Stdin = resp.Body out, err := cmd.CombinedOutput() if err != nil { return fmt.Errorf("tar extract failed: %s", out) } return ioutil.WriteFile(filepath.Join(cmd.Dir, urlFile), []byte(tools.URL), 0644) }
func (s *UpgraderSuite) TestUpgrader(c *C) { currentTools := s.primeTools(c, version.MustParseBinary("2.0.0-foo-bar")) // Remove the tools from the storage so that we're sure that the // uploader isn't trying to fetch them. resp, err := http.Get(currentTools.URL) c.Assert(err, IsNil) err = environs.UnpackTools(s.DataDir(), currentTools, resp.Body) c.Assert(err, IsNil) s.removeVersion(c, currentTools.Binary) var ( u *Upgrader upgraderDone <-chan error ) defer func() { if u != nil { c.Assert(u.Stop(), IsNil) } }() uploaded := make(map[version.Number]*state.Tools) for i, test := range upgraderTests { c.Logf("%d. %s; current version: %v", i, test.about, version.Current) for _, v := range test.upload { vers := version.Current vers.Number = version.MustParse(v) tools := s.uploadTools(c, vers) uploaded[vers.Number] = tools } if test.current != "" { version.Current = version.MustParseBinary(test.current) currentTools, err = environs.ReadTools(s.DataDir(), version.Current) c.Assert(err, IsNil) } if u == nil { u = s.startUpgrader(c, currentTools) } if test.propose != "" { s.proposeVersion(c, version.MustParse(test.propose), test.devVersion) s.State.StartSync() } if test.upgradeTo == "" { s.State.StartSync() assertNothingHappens(c, upgraderDone) } else { ug := waitDeath(c, u) tools := uploaded[version.MustParse(test.upgradeTo)] c.Check(ug.NewTools, DeepEquals, tools) c.Check(ug.OldTools.Binary, Equals, version.Current) c.Check(ug.DataDir, Equals, s.DataDir()) c.Check(ug.AgentName, Equals, "testagent") // Check that the upgraded version was really downloaded. data, err := ioutil.ReadFile(filepath.Join(environs.ToolsDir(s.DataDir(), tools.Binary), "jujud")) c.Assert(err, IsNil) c.Assert(string(data), Equals, "jujud contents "+tools.Binary.String()) u, upgraderDone = nil, nil currentTools = tools version.Current = tools.Binary } } }
func (cfg *MachineConfig) jujuTools() string { return environs.ToolsDir(cfg.DataDir, cfg.Tools.Binary) }
func (t *ToolsSuite) TestToolsDir(c *C) { c.Assert(environs.ToolsDir("/var/lib/juju", binaryVersion("1.2.3-precise-amd64")), Equals, "/var/lib/juju/tools/1.2.3-precise-amd64") }