github.com/axw/juju@v0.0.0-20161005053422-4bd6544d08d4/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 }