github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/environs/tools/validation.go (about) 1 // Copyright 2013 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package tools 5 6 import ( 7 "fmt" 8 9 "github.com/juju/version" 10 11 "github.com/juju/juju/environs/simplestreams" 12 jujuversion "github.com/juju/juju/version" 13 ) 14 15 // ToolsMetadataLookupParams is used to query metadata for matching tools. 16 type ToolsMetadataLookupParams struct { 17 simplestreams.MetadataLookupParams 18 Version string 19 Major int 20 Minor int 21 } 22 23 // ValidateToolsMetadata attempts to load tools metadata for the specified cloud attributes and returns 24 // any tools versions found, or an error if the metadata could not be loaded. 25 func ValidateToolsMetadata(params *ToolsMetadataLookupParams) ([]string, *simplestreams.ResolveInfo, error) { 26 if len(params.Sources) == 0 { 27 return nil, nil, fmt.Errorf("required parameter sources not specified") 28 } 29 if params.Version == "" && params.Major == 0 { 30 params.Version = jujuversion.Current.String() 31 } 32 var toolsConstraint *ToolsConstraint 33 if params.Version == "" { 34 toolsConstraint = NewGeneralToolsConstraint(params.Major, params.Minor, simplestreams.LookupParams{ 35 CloudSpec: simplestreams.CloudSpec{ 36 Region: params.Region, 37 Endpoint: params.Endpoint, 38 }, 39 Stream: params.Stream, 40 Series: []string{params.Series}, 41 Arches: params.Architectures, 42 }) 43 } else { 44 versNum, err := version.Parse(params.Version) 45 if err != nil { 46 return nil, nil, err 47 } 48 toolsConstraint = NewVersionedToolsConstraint(versNum, simplestreams.LookupParams{ 49 CloudSpec: simplestreams.CloudSpec{ 50 Region: params.Region, 51 Endpoint: params.Endpoint, 52 }, 53 Stream: params.Stream, 54 Series: []string{params.Series}, 55 Arches: params.Architectures, 56 }) 57 } 58 matchingTools, resolveInfo, err := Fetch(params.Sources, toolsConstraint) 59 if err != nil { 60 return nil, resolveInfo, err 61 } 62 if len(matchingTools) == 0 { 63 return nil, resolveInfo, fmt.Errorf("no matching agent binaries found for constraint %+v", toolsConstraint) 64 } 65 versions := make([]string, len(matchingTools)) 66 for i, tm := range matchingTools { 67 vers := version.Binary{ 68 Number: version.MustParse(tm.Version), 69 Series: tm.Release, 70 Arch: tm.Arch, 71 } 72 versions[i] = vers.String() 73 } 74 return versions, resolveInfo, nil 75 }