github.com/cloud-green/juju@v0.0.0-20151002100041-a00291338d3d/api/machiner/machine.go (about)

     1  // Copyright 2012, 2013 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package machiner
     5  
     6  import (
     7  	"github.com/juju/errors"
     8  	"github.com/juju/names"
     9  
    10  	"github.com/juju/juju/api/common"
    11  	"github.com/juju/juju/api/watcher"
    12  	"github.com/juju/juju/apiserver/params"
    13  	"github.com/juju/juju/network"
    14  )
    15  
    16  // Machine represents a juju machine as seen by a machiner worker.
    17  type Machine struct {
    18  	tag  names.MachineTag
    19  	life params.Life
    20  	st   *State
    21  }
    22  
    23  // Tag returns the machine's tag.
    24  func (m *Machine) Tag() names.Tag {
    25  	return m.tag
    26  }
    27  
    28  // Life returns the machine's lifecycle value.
    29  func (m *Machine) Life() params.Life {
    30  	return m.life
    31  }
    32  
    33  // Refresh updates the cached local copy of the machine's data.
    34  func (m *Machine) Refresh() error {
    35  	life, err := m.st.machineLife(m.tag)
    36  	if err != nil {
    37  		return err
    38  	}
    39  	m.life = life
    40  	return nil
    41  }
    42  
    43  // SetStatus sets the status of the machine.
    44  func (m *Machine) SetStatus(status params.Status, info string, data map[string]interface{}) error {
    45  	var result params.ErrorResults
    46  	args := params.SetStatus{
    47  		Entities: []params.EntityStatusArgs{
    48  			{Tag: m.tag.String(), Status: status, Info: info, Data: data},
    49  		},
    50  	}
    51  	err := m.st.facade.FacadeCall("SetStatus", args, &result)
    52  	if err != nil {
    53  		return err
    54  	}
    55  	return result.OneError()
    56  }
    57  
    58  // SetMachineAddresses sets the machine determined addresses of the machine.
    59  func (m *Machine) SetMachineAddresses(addresses []network.Address) error {
    60  	var result params.ErrorResults
    61  	args := params.SetMachinesAddresses{
    62  		MachineAddresses: []params.MachineAddresses{
    63  			{Tag: m.Tag().String(), Addresses: params.FromNetworkAddresses(addresses)},
    64  		},
    65  	}
    66  	err := m.st.facade.FacadeCall("SetMachineAddresses", args, &result)
    67  	if err != nil {
    68  		return err
    69  	}
    70  	return result.OneError()
    71  }
    72  
    73  // EnsureDead sets the machine lifecycle to Dead if it is Alive or
    74  // Dying. It does nothing otherwise.
    75  func (m *Machine) EnsureDead() error {
    76  	var result params.ErrorResults
    77  	args := params.Entities{
    78  		Entities: []params.Entity{{Tag: m.tag.String()}},
    79  	}
    80  	err := m.st.facade.FacadeCall("EnsureDead", args, &result)
    81  	if err != nil {
    82  		return err
    83  	}
    84  	return result.OneError()
    85  }
    86  
    87  // Watch returns a watcher for observing changes to the machine.
    88  func (m *Machine) Watch() (watcher.NotifyWatcher, error) {
    89  	return common.Watch(m.st.facade, m.tag)
    90  }
    91  
    92  // Jobs returns a list of jobs for the machine.
    93  func (m *Machine) Jobs() (*params.JobsResult, error) {
    94  	var results params.JobsResults
    95  	args := params.Entities{
    96  		Entities: []params.Entity{{Tag: m.Tag().String()}},
    97  	}
    98  	err := m.st.facade.FacadeCall("Jobs", args, &results)
    99  	if err != nil {
   100  		return nil, errors.Annotate(err, "error from FacadeCall")
   101  	}
   102  	if len(results.Results) != 1 {
   103  		return nil, errors.Errorf("expected 1 result, got %d", len(results.Results))
   104  	}
   105  	result := results.Results[0]
   106  	if result.Error != nil {
   107  		return nil, result.Error
   108  	}
   109  	return &result, nil
   110  }