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 ¶ms.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 ¶ms.GetLeadershipSettingsBulkResults{}, nil 123 } 124 125 bulkArgs := params.Entities{Entities: args} 126 var results params.GetLeadershipSettingsBulkResults 127 return &results, lsa.facadeCaller("Read", bulkArgs, &results) 128 }