launchpad.net/~rogpeppe/juju-core/500-errgo-fix@v0.0.0-20140213181702-000000002356/state/api/keyupdater/authorisedkeys.go (about) 1 // Copyright 2013 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package keyupdater 5 6 import ( 7 "launchpad.net/errgo/errors" 8 "launchpad.net/juju-core/state/api/base" 9 "launchpad.net/juju-core/state/api/params" 10 "launchpad.net/juju-core/state/api/watcher" 11 ) 12 13 // State provides access to a worker's view of the state. 14 type State struct { 15 caller base.Caller 16 } 17 18 // NewState returns a version of the state that provides functionality required by the worker. 19 func NewState(caller base.Caller) *State { 20 return &State{caller} 21 } 22 23 // AuthorisedKeys returns the authorised ssh keys for the machine specified by machineTag. 24 func (st *State) AuthorisedKeys(machineTag string) ([]string, error) { 25 var results params.StringsResults 26 args := params.Entities{ 27 Entities: []params.Entity{{Tag: machineTag}}, 28 } 29 err := st.caller.Call("KeyUpdater", "", "AuthorisedKeys", args, &results) 30 if err != nil { 31 // TODO: Not directly tested 32 return nil, base.WrapError(err) 33 } 34 if len(results.Results) != 1 { 35 // TODO: Not directly tested 36 return nil, errors.Newf("expected one result, got %d", len(results.Results)) 37 } 38 result := results.Results[0] 39 if err := result.Error; err != nil { 40 return nil, base.WrapError(err) 41 } 42 return result.Result, nil 43 } 44 45 // WatchAuthorisedKeys returns a notify watcher that looks for changes in the 46 // authorised ssh keys for the machine specified by machineTag. 47 func (st *State) WatchAuthorisedKeys(machineTag string) (watcher.NotifyWatcher, error) { 48 var results params.NotifyWatchResults 49 args := params.Entities{ 50 Entities: []params.Entity{{Tag: machineTag}}, 51 } 52 err := st.caller.Call("KeyUpdater", "", "WatchAuthorisedKeys", args, &results) 53 if err != nil { 54 // TODO: Not directly tested 55 return nil, base.WrapError(err) 56 } 57 if len(results.Results) != 1 { 58 // TODO: Not directly tested 59 return nil, errors.Newf("expected one result, got %d", len(results.Results)) 60 } 61 result := results.Results[0] 62 if result.Error != nil { 63 // TODO: Not directly tested 64 return nil, base.WrapError(result.Error) 65 } 66 w := watcher.NewNotifyWatcher(st.caller, result) 67 return w, nil 68 }