github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/api/imagemetadatamanager/client.go (about) 1 // Copyright 2017 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package imagemetadatamanager 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, "ImageMetadataManager") 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 // Delete removes image metadata for given image id from stored metadata. 67 func (c *Client) Delete(imageId string) error { 68 in := params.MetadataImageIds{[]string{imageId}} 69 out := params.ErrorResults{} 70 err := c.facade.FacadeCall("Delete", in, &out) 71 if err != nil { 72 return errors.Trace(err) 73 } 74 75 result := out.Results 76 if len(result) != 1 { 77 return errors.Errorf("expected to find one result for image id %q but found %d", imageId, len(result)) 78 } 79 80 theOne := result[0] 81 if theOne.Error != nil { 82 return errors.Trace(theOne.Error) 83 } 84 return nil 85 }