func (s *supportedSeriesSuite) TestOSSupportedSeries(c *gc.C) { setSeriesTestData() supported := series.OSSupportedSeries(os.Ubuntu) c.Assert(supported, jc.SameContents, []string{"trusty", "utopic"}) supported = series.OSSupportedSeries(os.Windows) c.Assert(supported, jc.SameContents, []string{"win7", "win81", "win2016nano"}) supported = series.OSSupportedSeries(os.CentOS) c.Assert(supported, jc.SameContents, []string{"centos7"}) supported = series.OSSupportedSeries(os.Arch) c.Assert(supported, jc.SameContents, []string{"arch"}) }
// populateTools stores uploaded tools in provider storage // and updates the tools metadata. func (c *BootstrapCommand) populateTools(st *state.State, env environs.Environ) error { agentConfig := c.CurrentConfig() dataDir := agentConfig.DataDir() current := version.Binary{ Number: jujuversion.Current, Arch: arch.HostArch(), Series: series.HostSeries(), } tools, err := agenttools.ReadTools(dataDir, current) if err != nil { return errors.Trace(err) } data, err := ioutil.ReadFile(filepath.Join( agenttools.SharedToolsDir(dataDir, current), "tools.tar.gz", )) if err != nil { return errors.Trace(err) } toolstorage, err := st.ToolsStorage() if err != nil { return errors.Trace(err) } defer toolstorage.Close() var toolsVersions []version.Binary if strings.HasPrefix(tools.URL, "file://") { // Tools were uploaded: clone for each series of the same OS. os, err := series.GetOSFromSeries(tools.Version.Series) if err != nil { return errors.Trace(err) } osSeries := series.OSSupportedSeries(os) for _, series := range osSeries { toolsVersion := tools.Version toolsVersion.Series = series toolsVersions = append(toolsVersions, toolsVersion) } } else { // Tools were downloaded from an external source: don't clone. toolsVersions = []version.Binary{tools.Version} } for _, toolsVersion := range toolsVersions { metadata := binarystorage.Metadata{ Version: toolsVersion.String(), Size: tools.Size, SHA256: tools.SHA256, } logger.Debugf("Adding tools: %v", toolsVersion) if err := toolstorage.Add(bytes.NewReader(data), metadata); err != nil { return errors.Trace(err) } } return nil }
// 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 }