github.com/mhilton/juju-juju@v0.0.0-20150901100907-a94dd2c73455/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, simplestreams.LookupParams{ 36 CloudSpec: simplestreams.CloudSpec{ 37 Region: params.Region, 38 Endpoint: params.Endpoint, 39 }, 40 Stream: params.Stream, 41 Series: []string{params.Series}, 42 Arches: params.Architectures, 43 }) 44 } else { 45 versNum, err := version.Parse(params.Version) 46 if err != nil { 47 return nil, nil, err 48 } 49 toolsConstraint = NewVersionedToolsConstraint(versNum, simplestreams.LookupParams{ 50 CloudSpec: simplestreams.CloudSpec{ 51 Region: params.Region, 52 Endpoint: params.Endpoint, 53 }, 54 Stream: params.Stream, 55 Series: []string{params.Series}, 56 Arches: params.Architectures, 57 }) 58 } 59 matchingTools, resolveInfo, err := Fetch(params.Sources, toolsConstraint, false) 60 if err != nil { 61 return nil, resolveInfo, err 62 } 63 if len(matchingTools) == 0 { 64 return nil, resolveInfo, fmt.Errorf("no matching tools found for constraint %+v", toolsConstraint) 65 } 66 versions := make([]string, len(matchingTools)) 67 for i, tm := range matchingTools { 68 vers := version.Binary{ 69 Number: version.MustParse(tm.Version), 70 Series: tm.Release, 71 Arch: tm.Arch, 72 } 73 versions[i] = vers.String() 74 } 75 return versions, resolveInfo, nil 76 }