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