github.com/makyo/juju@v0.0.0-20160425123129-2608902037e9/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 }