func assertToolsList(c *gc.C, list coretools.List, expected []version.Binary) { urls := list.URLs() c.Check(urls, gc.HasLen, len(expected)) for _, vers := range expected { c.Assert(urls[vers], gc.Not(gc.Equals), "") } }
// findCompatibleTools finds tools in the list that have the same major, minor // and patch level as version.Current. // // Build number is not important to match; uploaded tools will have // incremented build number, and we want to match them. func findCompatibleTools(possibleTools coretools.List, version version.Number) (version.Number, coretools.List) { var compatibleTools coretools.List for _, tools := range possibleTools { if isCompatibleVersion(tools.Version.Number, version) { compatibleTools = append(compatibleTools, tools) } } return compatibleTools.Newest() }
// checkToolsSeries verifies that all the given possible tools are for the // given OS series. func checkToolsSeries(toolsList coretools.List, series string) error { toolsSeries := toolsList.AllSeries() if len(toolsSeries) != 1 { return fmt.Errorf("expected single series, got %v", toolsSeries) } if toolsSeries[0] != series { return fmt.Errorf("tools mismatch: expected series %v, got %v", series, toolsSeries[0]) } return nil }
// SetBootstrapTools returns the newest tools from the given tools list, // and updates the agent-version configuration attribute. func SetBootstrapTools(environ environs.Environ, possibleTools coretools.List) (coretools.List, error) { if len(possibleTools) == 0 { return nil, fmt.Errorf("no bootstrap tools available") } var newVersion version.Number newVersion, toolsList := possibleTools.Newest() logger.Infof("newest version: %s", newVersion) cfg := environ.Config() if agentVersion, _ := cfg.AgentVersion(); agentVersion != newVersion { cfg, err := cfg.Apply(map[string]interface{}{ "agent-version": newVersion.String(), }) if err == nil { err = environ.SetConfig(cfg) } if err != nil { return nil, fmt.Errorf("failed to update environment configuration: %v", err) } } bootstrapVersion := newVersion // We should only ever bootstrap the exact same version as the client, // or we risk bootstrap incompatibility. We still set agent-version to // the newest version, so the agent will immediately upgrade itself. if !isCompatibleVersion(newVersion, version.Current.Number) { compatibleVersion, compatibleTools := findCompatibleTools(possibleTools, version.Current.Number) if len(compatibleTools) == 0 { logger.Warningf( "failed to find %s tools, will attempt to use %s", version.Current.Number, newVersion, ) } else { bootstrapVersion, toolsList = compatibleVersion, compatibleTools } } logger.Infof("picked bootstrap tools version: %s", bootstrapVersion) return toolsList, nil }
func (s *ListSuite) TestURLs(c *gc.C) { empty := tools.List{} c.Check(empty.URLs(), gc.DeepEquals, map[version.Binary]string{}) full := tools.List{t100precise, t190quantal, t2001precise} c.Check(full.URLs(), gc.DeepEquals, map[version.Binary]string{ t100precise.Version: t100precise.URL, t190quantal.Version: t190quantal.URL, t2001precise.Version: t2001precise.URL, }) }