github.com/mwhudson/juju@v0.0.0-20160512215208-90ff01f3497f/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.Architectures) == 0 { 27 return nil, nil, fmt.Errorf("required parameter arches not specified") 28 } 29 if len(params.Sources) == 0 { 30 return nil, nil, fmt.Errorf("required parameter sources not specified") 31 } 32 if params.Version == "" && params.Major == 0 { 33 params.Version = jujuversion.Current.String() 34 } 35 var toolsConstraint *ToolsConstraint 36 if params.Version == "" { 37 toolsConstraint = NewGeneralToolsConstraint(params.Major, params.Minor, simplestreams.LookupParams{ 38 CloudSpec: simplestreams.CloudSpec{ 39 Region: params.Region, 40 Endpoint: params.Endpoint, 41 }, 42 Stream: params.Stream, 43 Series: []string{params.Series}, 44 Arches: params.Architectures, 45 }) 46 } else { 47 versNum, err := version.Parse(params.Version) 48 if err != nil { 49 return nil, nil, err 50 } 51 toolsConstraint = NewVersionedToolsConstraint(versNum, simplestreams.LookupParams{ 52 CloudSpec: simplestreams.CloudSpec{ 53 Region: params.Region, 54 Endpoint: params.Endpoint, 55 }, 56 Stream: params.Stream, 57 Series: []string{params.Series}, 58 Arches: params.Architectures, 59 }) 60 } 61 matchingTools, resolveInfo, err := Fetch(params.Sources, toolsConstraint) 62 if err != nil { 63 return nil, resolveInfo, err 64 } 65 if len(matchingTools) == 0 { 66 return nil, resolveInfo, fmt.Errorf("no matching tools found for constraint %+v", toolsConstraint) 67 } 68 versions := make([]string, len(matchingTools)) 69 for i, tm := range matchingTools { 70 vers := version.Binary{ 71 Number: version.MustParse(tm.Version), 72 Series: tm.Release, 73 Arch: tm.Arch, 74 } 75 versions[i] = vers.String() 76 } 77 return versions, resolveInfo, nil 78 }