func (t *ToolsGetter) oneAgentTools(canRead AuthFunc, tag string, agentVersion version.Number, env environs.Environ) (*coretools.Tools, error) { if !canRead(tag) { return nil, ErrPerm } entity, err := t.st.FindEntity(tag) if err != nil { return nil, err } tooler, ok := entity.(state.AgentTooler) if !ok { return nil, NotSupportedError(tag, "agent tools") } existingTools, err := tooler.AgentTools() if err != nil { return nil, err } // TODO(jam): Avoid searching the provider for every machine // that wants to upgrade. The information could just be cached // in state, or even in the API servers return envtools.FindExactTools(env, agentVersion, existingTools.Version.Series, existingTools.Version.Arch) }
func (u *UnitUpgraderAPI) getMachineTools(tag string) params.ToolsResult { var result params.ToolsResult machine, err := u.getAssignedMachine(tag) if err != nil { result.Error = common.ServerError(err) return result } machineTools, err := machine.AgentTools() if err != nil { result.Error = common.ServerError(err) return result } // For older 1.16 upgrader workers, we need to supply a tools URL since the worker will attempt to // download the tools even though they already have been fetched by the machine agent. Newer upgrader // workers do not have this problem. So to be compatible across all versions, we return the full // tools metadata. // TODO (wallyworld) - remove in 1.20, just return machineTools cfg, err := u.st.EnvironConfig() if err != nil { result.Error = common.ServerError(err) return result } // SSLHostnameVerification defaults to true, so we need to // invert that, for backwards-compatibility (older versions // will have DisableSSLHostnameVerification: false by default). result.DisableSSLHostnameVerification = !cfg.SSLHostnameVerification() env, err := environs.New(cfg) if err != nil { result.Error = common.ServerError(err) return result } agentTools, err := envtools.FindExactTools( env, machineTools.Version.Number, machineTools.Version.Series, machineTools.Version.Arch) if err != nil { result.Error = common.ServerError(err) return result } result.Tools = agentTools return result }
func (s *SimpleStreamsToolsSuite) TestFindExactTools(c *gc.C) { for i, test := range findExactToolsTests { c.Logf("\ntest %d: %s", i, test.info) s.reset(c, nil) custom := s.uploadCustom(c, test.custom...) public := s.uploadPublic(c, test.public...) actual, err := envtools.FindExactTools(s.env, test.seek.Number, test.seek.Series, test.seek.Arch) if test.err == nil { if !c.Check(err, gc.IsNil) { continue } c.Check(actual.Version, gc.Equals, test.seek) if _, ok := custom[actual.Version]; ok { c.Check(actual.URL, gc.DeepEquals, custom[actual.Version]) } else { c.Check(actual.URL, gc.DeepEquals, public[actual.Version]) } } else { c.Check(err, jc.Satisfies, errors.IsNotFound) } } }