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