launchpad.net/~rogpeppe/juju-core/500-errgo-fix@v0.0.0-20140213181702-000000002356/state/api/upgrader/upgrader.go (about) 1 // Copyright 2012, 2013 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package upgrader 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 "launchpad.net/juju-core/tools" 12 "launchpad.net/juju-core/version" 13 ) 14 15 // State provides access to an upgrader worker's view of the state. 16 type State struct { 17 caller base.Caller 18 } 19 20 // NewState returns a version of the state that provides functionality 21 // required by the upgrader worker. 22 func NewState(caller base.Caller) *State { 23 return &State{caller} 24 } 25 26 // SetVersion sets the tools version associated with the entity with 27 // the given tag, which must be the tag of the entity that the 28 // upgrader is running on behalf of. 29 func (st *State) SetVersion(tag string, v version.Binary) error { 30 var results params.ErrorResults 31 args := params.EntitiesVersion{ 32 AgentTools: []params.EntityVersion{{ 33 Tag: tag, 34 Tools: ¶ms.Version{v}, 35 }}, 36 } 37 err := st.caller.Call("Upgrader", "", "SetTools", args, &results) 38 if err != nil { 39 // TODO: Not directly tested 40 return base.WrapError(err) 41 } 42 return results.OneError() 43 } 44 45 func (st *State) DesiredVersion(tag string) (version.Number, error) { 46 var results params.VersionResults 47 args := params.Entities{ 48 Entities: []params.Entity{{Tag: tag}}, 49 } 50 err := st.caller.Call("Upgrader", "", "DesiredVersion", args, &results) 51 if err != nil { 52 // TODO: Not directly tested 53 return version.Number{}, base.WrapError(err) 54 } 55 if len(results.Results) != 1 { 56 // TODO: Not directly tested 57 return version.Number{}, errors.Newf("expected one result, got %d", len(results.Results)) 58 } 59 result := results.Results[0] 60 if err := result.Error; err != nil { 61 return version.Number{}, base.WrapError(err) 62 } 63 if result.Version == nil { 64 // TODO: Not directly tested 65 return version.Number{}, errors.Newf("received no error, but got a nil Version") 66 } 67 return *result.Version, nil 68 } 69 70 // Tools returns the agent tools that should run on the given entity, 71 // along with a flag whether to disable SSL hostname verification. 72 func (st *State) Tools(tag string) (*tools.Tools, bool, error) { 73 var results params.ToolsResults 74 args := params.Entities{ 75 Entities: []params.Entity{{Tag: tag}}, 76 } 77 err := st.caller.Call("Upgrader", "", "Tools", args, &results) 78 if err != nil { 79 // TODO: Not directly tested 80 return nil, false, base.WrapError(err) 81 } 82 if len(results.Results) != 1 { 83 // TODO: Not directly tested 84 return nil, false, errors.Newf("expected one result, got %d", len(results.Results)) 85 } 86 result := results.Results[0] 87 if err := result.Error; err != nil { 88 return nil, false, base.WrapError(err) 89 } 90 return result.Tools, result.DisableSSLHostnameVerification, nil 91 } 92 93 func (st *State) WatchAPIVersion(agentTag string) (watcher.NotifyWatcher, error) { 94 var results params.NotifyWatchResults 95 args := params.Entities{ 96 Entities: []params.Entity{{Tag: agentTag}}, 97 } 98 err := st.caller.Call("Upgrader", "", "WatchAPIVersion", args, &results) 99 if err != nil { 100 // TODO: Not directly tested 101 return nil, base.WrapError(err) 102 } 103 if len(results.Results) != 1 { 104 // TODO: Not directly tested 105 return nil, errors.Newf("expected one result, got %d", len(results.Results)) 106 } 107 result := results.Results[0] 108 if result.Error != nil { 109 // TODO: Not directly tested 110 return nil, result.Error 111 } 112 w := watcher.NewNotifyWatcher(st.caller, result) 113 return w, nil 114 }