github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/apiserver/common/imagecommon/imagemetadata.go (about)

     1  // Copyright 2017 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package imagecommon
     5  
     6  import (
     7  	"github.com/juju/errors"
     8  
     9  	"github.com/juju/juju/apiserver/common"
    10  	"github.com/juju/juju/apiserver/params"
    11  	"github.com/juju/juju/environs/config"
    12  	"github.com/juju/juju/state/cloudimagemetadata"
    13  )
    14  
    15  // ImageMetadataInterface is an interface for manipulating images metadata.
    16  type ImageMetadataInterface interface {
    17  
    18  	// SaveMetadata persists collection of given images metadata.
    19  	SaveMetadata([]cloudimagemetadata.Metadata) error
    20  
    21  	// ModelConfig retrieves configuration for a current model.
    22  	ModelConfig() (*config.Config, error)
    23  }
    24  
    25  // Save stores given cloud image metadata using given persistence interface.
    26  func Save(st ImageMetadataInterface, metadata params.MetadataSaveParams) ([]params.ErrorResult, error) {
    27  	all := make([]params.ErrorResult, len(metadata.Metadata))
    28  	if len(metadata.Metadata) == 0 {
    29  		return nil, nil
    30  	}
    31  	modelCfg, err := st.ModelConfig()
    32  	if err != nil {
    33  		return nil, errors.Annotatef(err, "getting model config")
    34  	}
    35  	for i, one := range metadata.Metadata {
    36  		md := ParseMetadataListFromParams(one, modelCfg)
    37  		err := st.SaveMetadata(md)
    38  		all[i] = params.ErrorResult{Error: common.ServerError(err)}
    39  	}
    40  	return all, nil
    41  }
    42  
    43  // ParseMetadataListFromParams translates params.CloudImageMetadataList
    44  // into a collection of cloudimagemetadata.Metadata.
    45  func ParseMetadataListFromParams(p params.CloudImageMetadataList, cfg *config.Config) []cloudimagemetadata.Metadata {
    46  	results := make([]cloudimagemetadata.Metadata, len(p.Metadata))
    47  	for i, metadata := range p.Metadata {
    48  		results[i] = cloudimagemetadata.Metadata{
    49  			MetadataAttributes: cloudimagemetadata.MetadataAttributes{
    50  				Stream:          metadata.Stream,
    51  				Region:          metadata.Region,
    52  				Version:         metadata.Version,
    53  				Series:          metadata.Series,
    54  				Arch:            metadata.Arch,
    55  				VirtType:        metadata.VirtType,
    56  				RootStorageType: metadata.RootStorageType,
    57  				RootStorageSize: metadata.RootStorageSize,
    58  				Source:          metadata.Source,
    59  			},
    60  			Priority: metadata.Priority,
    61  			ImageId:  metadata.ImageId,
    62  		}
    63  		// TODO (anastasiamac 2016-08-24) This is a band-aid solution.
    64  		// Once correct value is read from simplestreams, this needs to go.
    65  		// Bug# 1616295
    66  		if results[i].Stream == "" {
    67  			results[i].Stream = cfg.ImageStream()
    68  		}
    69  	}
    70  	return results
    71  }