launchpad.net/~rogpeppe/juju-core/500-errgo-fix@v0.0.0-20140213181702-000000002356/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 "launchpad.net/juju-core/environs/simplestreams" 10 "launchpad.net/juju-core/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, error) { 24 if len(params.Architectures) == 0 { 25 return nil, fmt.Errorf("required parameter arches not specified") 26 } 27 if len(params.Sources) == 0 { 28 return 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{params.Region, params.Endpoint}, 37 Series: []string{params.Series}, 38 Arches: params.Architectures, 39 }) 40 } else { 41 toolsConstraint = NewVersionedToolsConstraint(params.Version, simplestreams.LookupParams{ 42 CloudSpec: simplestreams.CloudSpec{params.Region, params.Endpoint}, 43 Series: []string{params.Series}, 44 Arches: params.Architectures, 45 }) 46 } 47 matchingTools, err := Fetch(params.Sources, simplestreams.DefaultIndexPath, toolsConstraint, false) 48 if err != nil { 49 return nil, err 50 } 51 if len(matchingTools) == 0 { 52 return nil, fmt.Errorf("no matching tools found for constraint %+v", toolsConstraint) 53 } 54 versions := make([]string, len(matchingTools)) 55 for i, tm := range matchingTools { 56 vers := version.Binary{version.MustParse(tm.Version), tm.Release, tm.Arch} 57 versions[i] = vers.String() 58 } 59 return versions, nil 60 }