github.com/wallyworld/juju@v0.0.0-20161013125918-6cf1bc9d917a/api/imagemetadata/client.go (about)

     1  // Copyright 2015 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package imagemetadata
     5  
     6  import (
     7  	"github.com/juju/errors"
     8  
     9  	"github.com/juju/juju/api/base"
    10  	"github.com/juju/juju/apiserver/params"
    11  )
    12  
    13  // Client provides access to cloud image metadata.
    14  // It is used to find, save and update image metadata.
    15  type Client struct {
    16  	base.ClientFacade
    17  	facade base.FacadeCaller
    18  }
    19  
    20  // NewClient returns a new metadata client.
    21  func NewClient(st base.APICallCloser) *Client {
    22  	frontend, backend := base.NewClientFacade(st, "ImageMetadata")
    23  	return &Client{ClientFacade: frontend, facade: backend}
    24  }
    25  
    26  // List returns image metadata that matches filter.
    27  // Empty filter will return all image metadata.
    28  func (c *Client) List(
    29  	stream, region string,
    30  	series, arches []string,
    31  	virtType, rootStorageType string,
    32  ) ([]params.CloudImageMetadata, error) {
    33  	in := params.ImageMetadataFilter{
    34  		Region:          region,
    35  		Series:          series,
    36  		Arches:          arches,
    37  		Stream:          stream,
    38  		VirtType:        virtType,
    39  		RootStorageType: rootStorageType,
    40  	}
    41  	out := params.ListCloudImageMetadataResult{}
    42  	err := c.facade.FacadeCall("List", in, &out)
    43  	return out.Result, err
    44  }
    45  
    46  // Save saves specified image metadata.
    47  // Supports bulk saves for scenarios like cloud image metadata caching at bootstrap.
    48  func (c *Client) Save(metadata []params.CloudImageMetadata) error {
    49  	in := params.MetadataSaveParams{
    50  		Metadata: []params.CloudImageMetadataList{{metadata}},
    51  	}
    52  	out := params.ErrorResults{}
    53  	err := c.facade.FacadeCall("Save", in, &out)
    54  	if err != nil {
    55  		return errors.Trace(err)
    56  	}
    57  	if len(out.Results) != 1 {
    58  		return errors.Errorf("exected 1 result, got %d", len(out.Results))
    59  	}
    60  	if out.Results[0].Error != nil {
    61  		return errors.Trace(out.Results[0].Error)
    62  	}
    63  	return nil
    64  }
    65  
    66  // UpdateFromPublishedImages retrieves currently published image metadata and
    67  // updates stored ones accordingly.
    68  // This method is primarily intended for a worker.
    69  func (c *Client) UpdateFromPublishedImages() error {
    70  	return errors.Trace(
    71  		c.facade.FacadeCall("UpdateFromPublishedImages", nil, nil))
    72  }
    73  
    74  // Delete removes image metadata for given image id from stored metadata.
    75  func (c *Client) Delete(imageId string) error {
    76  	in := params.MetadataImageIds{[]string{imageId}}
    77  	out := params.ErrorResults{}
    78  	err := c.facade.FacadeCall("Delete", in, &out)
    79  	if err != nil {
    80  		return errors.Trace(err)
    81  	}
    82  
    83  	result := out.Results
    84  	if len(result) != 1 {
    85  		return errors.Errorf("expected to find one result for image id %q but found %d", imageId, len(result))
    86  	}
    87  
    88  	theOne := result[0]
    89  	if theOne.Error != nil {
    90  		return errors.Trace(theOne.Error)
    91  	}
    92  	return nil
    93  }