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