github.com/altoros/juju-vmware@v0.0.0-20150312064031-f19ae857ccca/provider/vmware/image_metadata.go (about) 1 package vmware 2 3 import ( 4 "github.com/juju/errors" 5 6 "github.com/juju/juju/environs" 7 "github.com/juju/juju/environs/imagemetadata" 8 "github.com/juju/juju/environs/simplestreams" 9 ) 10 11 type OvfFileMetadata struct { 12 Url string 13 Arch string `json:"arch"` 14 Size int `json:"size"` 15 Path string `json:"path"` 16 FileType string `json:"ftype"` 17 Sha256 string `json:"sha256"` 18 Md5 string `json:"md5"` 19 } 20 21 func init() { 22 simplestreams.RegisterStructTags(OvfFileMetadata{}) 23 } 24 25 var findImageMetadata = func(env *environ, args environs.StartInstanceParams) (*OvfFileMetadata, error) { 26 arches := args.Tools.Arches() 27 series := args.Tools.OneSeries() 28 ic := &imagemetadata.ImageConstraint{ 29 simplestreams.LookupParams{ 30 Series: []string{series}, 31 Arches: arches, 32 }, 33 } 34 sources, err := environs.ImageMetadataSources(env) 35 if err != nil { 36 return nil, errors.Trace(err) 37 } 38 39 matchingImages, err := imageMetadataFetch(sources, ic) 40 if err != nil { 41 return nil, errors.Trace(err) 42 } 43 if len(matchingImages) == 0 { 44 return nil, errors.Errorf("No mathicng images found for given constraints: %v", ic) 45 } 46 47 return matchingImages[0], nil 48 } 49 50 func imageMetadataFetch(sources []simplestreams.DataSource, cons *imagemetadata.ImageConstraint) ([]*OvfFileMetadata, error) { 51 params := simplestreams.GetMetadataParams{ 52 StreamsVersion: imagemetadata.StreamsVersionV1, 53 OnlySigned: false, 54 LookupConstraint: cons, 55 ValueParams: simplestreams.ValueParams{ 56 DataType: "image-downloads", 57 FilterFunc: appendMatchingFunc, 58 ValueTemplate: OvfFileMetadata{}, 59 }, 60 } 61 items, _, err := simplestreams.GetMetadata(sources, params) 62 if err != nil { 63 return nil, errors.Trace(err) 64 } 65 metadata := make([]*OvfFileMetadata, len(items)) 66 for i, md := range items { 67 metadata[i] = md.(*OvfFileMetadata) 68 } 69 return metadata, nil 70 } 71 72 func appendMatchingFunc(source simplestreams.DataSource, matchingImages []interface{}, 73 images map[string]interface{}, cons simplestreams.LookupConstraint) []interface{} { 74 75 for _, val := range images { 76 file := val.(*OvfFileMetadata) 77 if file.FileType == "ovf" { 78 //ignore error for url data source 79 url, _ := source.URL(file.Path) 80 file.Url = url 81 matchingImages = append(matchingImages, file) 82 } 83 } 84 return matchingImages 85 }