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  }