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 }