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: &params.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  }