func (s *badBuildSuite) TestBuildToolsBadBuild(c *gc.C) { // Test that original BuildAgentTarball fails builtTools, err := sync.BuildAgentTarball(true, nil, "released") c.Assert(err, gc.ErrorMatches, `cannot build jujud agent binary from source: build command \"go\" failed: exit status 1; `) c.Assert(builtTools, gc.IsNil) // Test that BuildAgentTarball func passes after BundleTools func is // mocked out s.PatchValue(&envtools.BundleTools, toolstesting.GetMockBundleTools(c, nil)) builtTools, err = sync.BuildAgentTarball(true, nil, "released") s.assertEqualsCurrentVersion(c, builtTools.Version) c.Assert(err, jc.ErrorIsNil) }
func (s *uploadSuite) TestMockBundleTools(c *gc.C) { var ( writer io.Writer forceVersion *version.Number n int p bytes.Buffer ) p.WriteString("Hello World") s.PatchValue(&envtools.BundleTools, func(build bool, writerArg io.Writer, forceVersionArg *version.Number) (vers version.Binary, sha256Hash string, err error) { c.Assert(build, jc.IsTrue) writer = writerArg n, err = writer.Write(p.Bytes()) c.Assert(err, jc.ErrorIsNil) forceVersion = forceVersionArg vers.Number = jujuversion.Current return }) _, err := sync.BuildAgentTarball(true, &jujuversion.Current, "released") c.Assert(err, jc.ErrorIsNil) c.Assert(*forceVersion, gc.Equals, jujuversion.Current) c.Assert(writer, gc.NotNil) c.Assert(n, gc.Equals, len(p.Bytes())) }
func (s *uploadSuite) TestSyncTools(c *gc.C) { s.patchBundleTools(c, nil) builtTools, err := sync.BuildAgentTarball(true, nil, "released") c.Assert(err, jc.ErrorIsNil) t, err := sync.SyncBuiltTools(s.targetStorage, "released", builtTools) c.Assert(err, jc.ErrorIsNil) s.assertEqualsCurrentVersion(c, t.Version) c.Assert(t.URL, gc.Not(gc.Equals), "") }
func (s *uploadSuite) TestSyncAndForceVersion(c *gc.C) { vers := jujuversion.Current vers.Patch++ s.patchBundleTools(c, &vers) builtTools, err := sync.BuildAgentTarball(true, &vers, "released") c.Assert(err, jc.ErrorIsNil) t, err := sync.SyncBuiltTools(s.targetStorage, "released", builtTools) c.Assert(err, jc.ErrorIsNil) // Reported version from build call matches the real jujud version. c.Assert(t.Version, gc.Equals, version.Binary{Number: jujuversion.Current, Arch: arch.HostArch(), Series: series.HostSeries()}) }
func (s *uploadSuite) TestSyncToolsFakeSeries(c *gc.C) { s.patchBundleTools(c, nil) seriesToUpload := "precise" if seriesToUpload == series.HostSeries() { seriesToUpload = "raring" } builtTools, err := sync.BuildAgentTarball(true, nil, "testing") c.Assert(err, jc.ErrorIsNil) t, err := sync.SyncBuiltTools(s.targetStorage, "testing", builtTools, "quantal", seriesToUpload) c.Assert(err, jc.ErrorIsNil) s.assertUploadedTools(c, t, []string{seriesToUpload, "quantal", series.HostSeries()}, "testing") }
// uploadTools compiles jujud from $GOPATH and uploads it into the supplied // storage. If no version has been explicitly chosen, the version number // reported by the built tools will be based on the client version number. // In any case, the version number reported will have a build component higher // than that of any otherwise-matching available envtools. // uploadTools resets the chosen version and replaces the available tools // with the ones just uploaded. func (context *upgradeContext) uploadTools(buildAgent bool) (err error) { // TODO(fwereade): this is kinda crack: we should not assume that // jujuversion.Current matches whatever source happens to be built. The // ideal would be: // 1) compile jujud from $GOPATH into some build dir // 2) get actual version with `jujud version` // 3) check actual version for compatibility with CLI tools // 4) generate unique build version with reference to available tools // 5) force-version that unique version into the dir directly // 6) archive and upload the build dir // ...but there's no way we have time for that now. In the meantime, // considering the use cases, this should work well enough; but it // won't detect an incompatible major-version change, which is a shame. // // TODO(cherylj) If the determination of version changes, we will // need to also change the upgrade version checks in Run() that check // if a major upgrade is allowed. if context.chosen == version.Zero { context.chosen = context.client } context.chosen = uploadVersion(context.chosen, context.tools) builtTools, err := sync.BuildAgentTarball(buildAgent, &context.chosen, "upgrade") if err != nil { return errors.Trace(err) } defer os.RemoveAll(builtTools.Dir) uploadToolsVersion := builtTools.Version uploadToolsVersion.Number = context.chosen toolsPath := path.Join(builtTools.Dir, builtTools.StorageName) logger.Infof("uploading agent binary %v (%dkB) to Juju controller", uploadToolsVersion, (builtTools.Size+512)/1024) f, err := os.Open(toolsPath) if err != nil { return errors.Trace(err) } defer f.Close() os, err := series.GetOSFromSeries(builtTools.Version.Series) if err != nil { return errors.Trace(err) } additionalSeries := series.OSSupportedSeries(os) uploaded, err := context.apiClient.UploadTools(f, uploadToolsVersion, additionalSeries...) if err != nil { return errors.Trace(err) } context.tools = uploaded return nil }
func (s *badBuildSuite) TestBuildToolsNoBinaryAvailable(c *gc.C) { builtTools, err := sync.BuildAgentTarball(false, nil, "released") c.Assert(err, gc.ErrorMatches, `no prepackaged agent available and no jujud binary can be found`) c.Assert(builtTools, gc.IsNil) }