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