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