github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/payload/api/private/client/unitfacade.go (about) 1 // Copyright 2015 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package client 5 6 import ( 7 "github.com/juju/errors" 8 9 "github.com/juju/juju/apiserver/params" 10 "github.com/juju/juju/payload" 11 internal "github.com/juju/juju/payload/api/private" 12 ) 13 14 type facadeCaller interface { 15 FacadeCall(request string, params, response interface{}) error 16 } 17 18 // UnitFacadeClient provides methods for interacting with Juju's internal 19 // RPC API, relative to payloads. 20 type UnitFacadeClient struct { 21 facadeCaller 22 } 23 24 // NewUnitFacadeClient builds a new payload API client. 25 func NewUnitFacadeClient(caller facadeCaller) UnitFacadeClient { 26 return UnitFacadeClient{caller} 27 } 28 29 // Track calls the Track API server method. 30 func (c UnitFacadeClient) Track(payloads ...payload.Payload) ([]payload.Result, error) { 31 args := internal.Payloads2TrackArgs(payloads) 32 33 var rs params.PayloadResults 34 if err := c.FacadeCall("Track", &args, &rs); err != nil { 35 return nil, errors.Trace(err) 36 } 37 38 return api2results(rs) 39 } 40 41 // List calls the List API server method. 42 func (c UnitFacadeClient) List(fullIDs ...string) ([]payload.Result, error) { 43 var ids []string 44 if len(fullIDs) > 0 { 45 actual, err := c.lookUp(fullIDs) 46 if err != nil { 47 return nil, errors.Trace(err) 48 } 49 ids = actual 50 } 51 args := internal.IDs2ListArgs(ids) 52 53 var rs params.PayloadResults 54 if err := c.FacadeCall("List", &args, &rs); err != nil { 55 return nil, errors.Trace(err) 56 } 57 58 return api2results(rs) 59 } 60 61 // LookUp calls the LookUp API server method. 62 func (c UnitFacadeClient) LookUp(fullIDs ...string) ([]payload.Result, error) { 63 if len(fullIDs) == 0 { 64 // Unlike List(), LookUp doesn't fall back to looking up all IDs. 65 return nil, nil 66 } 67 args := internal.FullIDs2LookUpArgs(fullIDs) 68 69 var rs params.PayloadResults 70 if err := c.FacadeCall("LookUp", &args, &rs); err != nil { 71 return nil, err 72 } 73 74 return api2results(rs) 75 } 76 77 // SetStatus calls the SetStatus API server method. 78 func (c UnitFacadeClient) SetStatus(status string, fullIDs ...string) ([]payload.Result, error) { 79 ids, err := c.lookUp(fullIDs) 80 if err != nil { 81 return nil, errors.Trace(err) 82 } 83 args := internal.IDs2SetStatusArgs(ids, status) 84 85 var rs params.PayloadResults 86 if err := c.FacadeCall("SetStatus", &args, &rs); err != nil { 87 return nil, err 88 } 89 90 return api2results(rs) 91 } 92 93 // Untrack calls the Untrack API server method. 94 func (c UnitFacadeClient) Untrack(fullIDs ...string) ([]payload.Result, error) { 95 logger.Tracef("Calling untrack API: %q", fullIDs) 96 97 ids, err := c.lookUp(fullIDs) 98 if err != nil { 99 return nil, errors.Trace(err) 100 } 101 args := internal.IDs2UntrackArgs(ids) 102 103 var rs params.PayloadResults 104 if err := c.FacadeCall("Untrack", &args, &rs); err != nil { 105 return nil, err 106 } 107 108 return api2results(rs) 109 } 110 111 func (c UnitFacadeClient) lookUp(fullIDs []string) ([]string, error) { 112 results, err := c.LookUp(fullIDs...) 113 if err != nil { 114 return nil, errors.Annotate(err, "while looking up IDs") 115 } 116 117 var ids []string 118 for _, result := range results { 119 if result.Error != nil { 120 // TODO(ericsnow) Do not short-circuit? 121 return nil, errors.Annotate(result.Error, "while looking up IDs") 122 } 123 ids = append(ids, result.ID) 124 } 125 return ids, nil 126 } 127 128 func api2results(rs params.PayloadResults) ([]payload.Result, error) { 129 var results []payload.Result 130 for _, r := range rs.Results { 131 result, err := internal.API2Result(r) 132 if err != nil { 133 // This should not happen; we safely control the result. 134 return nil, errors.Trace(err) 135 } 136 results = append(results, result) 137 } 138 return results, nil 139 }