github.com/altoros/juju-vmware@v0.0.0-20150312064031-f19ae857ccca/api/uniter/leadership.go (about)

     1  // Copyright 2015 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package uniter
     5  
     6  import (
     7  	"fmt"
     8  
     9  	"github.com/juju/errors"
    10  	"github.com/juju/names"
    11  
    12  	"github.com/juju/juju/api/watcher"
    13  	"github.com/juju/juju/apiserver/params"
    14  )
    15  
    16  // NewLeadershipSettingsAccessor returns a new LeadershipSettingsAccessor.
    17  func NewLeadershipSettingsAccessor(
    18  	caller FacadeCallFn,
    19  	newWatcher NewNotifyWatcherFn,
    20  	checkApiVersion CheckApiVersionFn,
    21  ) *LeadershipSettingsAccessor {
    22  	return &LeadershipSettingsAccessor{caller, newWatcher, checkApiVersion}
    23  }
    24  
    25  type FacadeCallFn func(request string, params, response interface{}) error
    26  type NewNotifyWatcherFn func(params.NotifyWatchResult) watcher.NotifyWatcher
    27  type CheckApiVersionFn func(functionName string) error
    28  
    29  // LeadershipSettingsAccessor provides a type that can make RPC calls
    30  // to a service which can read, write, and watch leadership settings.
    31  type LeadershipSettingsAccessor struct {
    32  	facadeCaller     FacadeCallFn
    33  	newNotifyWatcher NewNotifyWatcherFn
    34  	checkApiVersion  CheckApiVersionFn
    35  }
    36  
    37  // Merge merges the provided settings into the leadership settings for
    38  // the given service ID. Only leaders of a given service may perform
    39  // this operation.
    40  func (lsa *LeadershipSettingsAccessor) Merge(serviceId string, settings map[string]string) error {
    41  
    42  	if err := lsa.checkApiVersion("Merge"); err != nil {
    43  		return err
    44  	}
    45  
    46  	results, err := lsa.bulkMerge(lsa.prepareMerge(serviceId, settings))
    47  	if err != nil {
    48  		return errors.Annotate(err, "could not merge settings")
    49  	}
    50  	return results.Results[0].Error
    51  }
    52  
    53  // Read retrieves the leadership settings for the given service
    54  // ID. Anyone may perform this operation.
    55  func (lsa *LeadershipSettingsAccessor) Read(serviceId string) (map[string]string, error) {
    56  
    57  	if err := lsa.checkApiVersion("Read"); err != nil {
    58  		return nil, err
    59  	}
    60  
    61  	results, err := lsa.bulkRead(lsa.prepareRead(serviceId))
    62  	if err != nil {
    63  		return nil, errors.Annotate(err, "could not read leadership settings")
    64  	}
    65  	return results.Results[0].Settings, results.Results[0].Error
    66  }
    67  
    68  // WatchLeadershipSettings returns a watcher which can be used to wait
    69  // for leadership settings changes to be made for a given service ID.
    70  func (lsa *LeadershipSettingsAccessor) WatchLeadershipSettings(serviceId string) (watcher.NotifyWatcher, error) {
    71  
    72  	if err := lsa.checkApiVersion("WatchLeadershipSettings"); err != nil {
    73  		return nil, err
    74  	}
    75  
    76  	var results params.NotifyWatchResults
    77  	if err := lsa.facadeCaller(
    78  		"WatchLeadershipSettings",
    79  		params.Entities{[]params.Entity{{names.NewServiceTag(serviceId).String()}}},
    80  		&results,
    81  	); err != nil {
    82  		return nil, errors.Annotate(err, "could not watch leadership settings")
    83  	}
    84  	fmt.Printf("%v", results)
    85  	return lsa.newNotifyWatcher(results.Results[0]), nil
    86  }
    87  
    88  //
    89  // Prepare functions for building bulk-calls.
    90  //
    91  
    92  func (lsa *LeadershipSettingsAccessor) prepareMerge(serviceId string, settings map[string]string) params.MergeLeadershipSettingsParam {
    93  	return params.MergeLeadershipSettingsParam{
    94  		ServiceTag: names.NewServiceTag(serviceId).String(),
    95  		Settings:   settings,
    96  	}
    97  }
    98  
    99  func (lsa *LeadershipSettingsAccessor) prepareRead(serviceId string) params.Entity {
   100  	return params.Entity{Tag: names.NewServiceTag(serviceId).String()}
   101  }
   102  
   103  //
   104  // Bulk calls.
   105  //
   106  
   107  func (lsa *LeadershipSettingsAccessor) bulkMerge(args ...params.MergeLeadershipSettingsParam) (*params.ErrorResults, error) {
   108  	// Don't make the jump over the network if we don't have to.
   109  	if len(args) <= 0 {
   110  		return &params.ErrorResults{}, nil
   111  	}
   112  
   113  	bulkArgs := params.MergeLeadershipSettingsBulkParams{Params: args}
   114  	var results params.ErrorResults
   115  	return &results, lsa.facadeCaller("Merge", bulkArgs, &results)
   116  }
   117  
   118  func (lsa *LeadershipSettingsAccessor) bulkRead(args ...params.Entity) (*params.GetLeadershipSettingsBulkResults, error) {
   119  
   120  	// Don't make the jump over the network if we don't have to.
   121  	if len(args) <= 0 {
   122  		return &params.GetLeadershipSettingsBulkResults{}, nil
   123  	}
   124  
   125  	bulkArgs := params.Entities{Entities: args}
   126  	var results params.GetLeadershipSettingsBulkResults
   127  	return &results, lsa.facadeCaller("Read", bulkArgs, &results)
   128  }