github.com/mhilton/juju-juju@v0.0.0-20150901100907-a94dd2c73455/api/instancepoller/machine.go (about)

     1  // Copyright 2015 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package instancepoller
     5  
     6  import (
     7  	"github.com/juju/errors"
     8  	"github.com/juju/names"
     9  
    10  	"github.com/juju/juju/api/base"
    11  	"github.com/juju/juju/api/common"
    12  	"github.com/juju/juju/apiserver/params"
    13  	"github.com/juju/juju/instance"
    14  	"github.com/juju/juju/network"
    15  )
    16  
    17  // Machine represents a juju machine as seen by an instancepoller
    18  // worker.
    19  type Machine struct {
    20  	facade base.FacadeCaller
    21  
    22  	tag  names.MachineTag
    23  	life params.Life
    24  }
    25  
    26  // Id returns the machine's id.
    27  func (m *Machine) Id() string {
    28  	return m.tag.Id()
    29  }
    30  
    31  // Tag returns the machine's tag.
    32  func (m *Machine) Tag() names.MachineTag {
    33  	return m.tag
    34  }
    35  
    36  // String returns the machine as a string.
    37  func (m *Machine) String() string {
    38  	return m.Id()
    39  }
    40  
    41  // Life returns the machine's lifecycle value.
    42  func (m *Machine) Life() params.Life {
    43  	return m.life
    44  }
    45  
    46  // Refresh updates the cached local copy of the machine's data.
    47  func (m *Machine) Refresh() error {
    48  	life, err := common.Life(m.facade, m.tag)
    49  	if err != nil {
    50  		return errors.Trace(err)
    51  	}
    52  	m.life = life
    53  	return nil
    54  }
    55  
    56  // Status returns the machine status.
    57  func (m *Machine) Status() (params.StatusResult, error) {
    58  	var results params.StatusResults
    59  	args := params.Entities{Entities: []params.Entity{
    60  		{Tag: m.tag.String()},
    61  	}}
    62  	err := m.facade.FacadeCall("Status", args, &results)
    63  	if err != nil {
    64  		return params.StatusResult{}, errors.Trace(err)
    65  	}
    66  	if len(results.Results) != 1 {
    67  		err := errors.Errorf("expected 1 result, got %d", len(results.Results))
    68  		return params.StatusResult{}, err
    69  	}
    70  	result := results.Results[0]
    71  	if result.Error != nil {
    72  		return params.StatusResult{}, result.Error
    73  	}
    74  	return result, nil
    75  }
    76  
    77  // IsManual returns whether the machine is manually provisioned.
    78  func (m *Machine) IsManual() (bool, error) {
    79  	var results params.BoolResults
    80  	args := params.Entities{Entities: []params.Entity{
    81  		{Tag: m.tag.String()},
    82  	}}
    83  	err := m.facade.FacadeCall("AreManuallyProvisioned", args, &results)
    84  	if err != nil {
    85  		return false, errors.Trace(err)
    86  	}
    87  	if len(results.Results) != 1 {
    88  		err := errors.Errorf("expected 1 result, got %d", len(results.Results))
    89  		return false, err
    90  	}
    91  	result := results.Results[0]
    92  	if result.Error != nil {
    93  		return false, result.Error
    94  	}
    95  	return result.Result, nil
    96  }
    97  
    98  // InstanceId returns the machine's instance id.
    99  func (m *Machine) InstanceId() (instance.Id, error) {
   100  	var results params.StringResults
   101  	args := params.Entities{Entities: []params.Entity{
   102  		{Tag: m.tag.String()},
   103  	}}
   104  	err := m.facade.FacadeCall("InstanceId", args, &results)
   105  	if err != nil {
   106  		return "", errors.Trace(err)
   107  	}
   108  	if len(results.Results) != 1 {
   109  		err := errors.Errorf("expected 1 result, got %d", len(results.Results))
   110  		return "", err
   111  	}
   112  	result := results.Results[0]
   113  	if result.Error != nil {
   114  		return "", result.Error
   115  	}
   116  	return instance.Id(result.Result), nil
   117  }
   118  
   119  // InstanceStatus returns the machine's instance status.
   120  func (m *Machine) InstanceStatus() (string, error) {
   121  	var results params.StringResults
   122  	args := params.Entities{Entities: []params.Entity{
   123  		{Tag: m.tag.String()},
   124  	}}
   125  	err := m.facade.FacadeCall("InstanceStatus", args, &results)
   126  	if err != nil {
   127  		return "", errors.Trace(err)
   128  	}
   129  	if len(results.Results) != 1 {
   130  		err := errors.Errorf("expected 1 result, got %d", len(results.Results))
   131  		return "", err
   132  	}
   133  	result := results.Results[0]
   134  	if result.Error != nil {
   135  		return "", result.Error
   136  	}
   137  	return result.Result, nil
   138  }
   139  
   140  // SetInstanceStatus sets the instance status of the machine.
   141  func (m *Machine) SetInstanceStatus(status string) error {
   142  	var result params.ErrorResults
   143  	args := params.SetInstancesStatus{Entities: []params.InstanceStatus{
   144  		{Tag: m.tag.String(), Status: status},
   145  	}}
   146  	err := m.facade.FacadeCall("SetInstanceStatus", args, &result)
   147  	if err != nil {
   148  		return err
   149  	}
   150  	return result.OneError()
   151  }
   152  
   153  // ProviderAddresses returns all addresses of the machine known to the
   154  // cloud provider.
   155  func (m *Machine) ProviderAddresses() ([]network.Address, error) {
   156  	var results params.MachineAddressesResults
   157  	args := params.Entities{Entities: []params.Entity{
   158  		{Tag: m.tag.String()},
   159  	}}
   160  	err := m.facade.FacadeCall("ProviderAddresses", args, &results)
   161  	if err != nil {
   162  		return nil, errors.Trace(err)
   163  	}
   164  	if len(results.Results) != 1 {
   165  		err := errors.Errorf("expected 1 result, got %d", len(results.Results))
   166  		return nil, err
   167  	}
   168  	result := results.Results[0]
   169  	if result.Error != nil {
   170  		return nil, result.Error
   171  	}
   172  	return params.NetworkAddresses(result.Addresses), nil
   173  }
   174  
   175  // SetProviderAddresses sets the cached provider addresses for the
   176  // machine.
   177  func (m *Machine) SetProviderAddresses(addrs ...network.Address) error {
   178  	var result params.ErrorResults
   179  	args := params.SetMachinesAddresses{
   180  		MachineAddresses: []params.MachineAddresses{{
   181  			Tag:       m.tag.String(),
   182  			Addresses: params.FromNetworkAddresses(addrs),
   183  		}}}
   184  	err := m.facade.FacadeCall("SetProviderAddresses", args, &result)
   185  	if err != nil {
   186  		return err
   187  	}
   188  	return result.OneError()
   189  }