github.com/mattyw/juju@v0.0.0-20140610034352-732aecd63861/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/juju/environs/simplestreams" 10 "github.com/juju/juju/version" 11 ) 12 13 // ToolsMetadataLookupParams is used to query metadata for matching tools. 14 type ToolsMetadataLookupParams struct { 15 simplestreams.MetadataLookupParams 16 Version string 17 Major int 18 Minor int 19 } 20 21 // ValidateToolsMetadata attempts to load tools metadata for the specified cloud attributes and returns 22 // any tools versions found, or an error if the metadata could not be loaded. 23 func ValidateToolsMetadata(params *ToolsMetadataLookupParams) ([]string, *simplestreams.ResolveInfo, error) { 24 if len(params.Architectures) == 0 { 25 return nil, nil, fmt.Errorf("required parameter arches not specified") 26 } 27 if len(params.Sources) == 0 { 28 return nil, nil, fmt.Errorf("required parameter sources not specified") 29 } 30 if params.Version == "" && params.Major == 0 { 31 params.Version = version.Current.Number.String() 32 } 33 var toolsConstraint *ToolsConstraint 34 if params.Version == "" { 35 toolsConstraint = NewGeneralToolsConstraint(params.Major, params.Minor, false, simplestreams.LookupParams{ 36 CloudSpec: simplestreams.CloudSpec{ 37 Region: params.Region, 38 Endpoint: params.Endpoint, 39 }, 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 Series: []string{params.Series}, 54 Arches: params.Architectures, 55 }) 56 } 57 matchingTools, resolveInfo, err := Fetch(params.Sources, simplestreams.DefaultIndexPath, toolsConstraint, false) 58 if err != nil { 59 return nil, resolveInfo, err 60 } 61 if len(matchingTools) == 0 { 62 return nil, resolveInfo, fmt.Errorf("no matching tools found for constraint %+v", toolsConstraint) 63 } 64 versions := make([]string, len(matchingTools)) 65 for i, tm := range matchingTools { 66 vers := version.Binary{ 67 Number: version.MustParse(tm.Version), 68 Series: tm.Release, 69 Arch: tm.Arch, 70 } 71 versions[i] = vers.String() 72 } 73 return versions, resolveInfo, nil 74 }