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  }