~nskaggs/+junk/xenial-test

« back to all changes in this revision

Viewing changes to src/github.com/juju/juju/api/imagemetadata/client.go

  • Committer: Nicholas Skaggs
  • Date: 2016-10-24 20:56:05 UTC
  • Revision ID: nicholas.skaggs@canonical.com-20161024205605-z8lta0uvuhtxwzwl
Initi with beta15

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
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
}