Code Coverage |
||||||||||
Lines |
Functions and Methods |
Classes and Traits |
||||||||
| Total | |
100.00% |
64 / 64 |
|
100.00% |
21 / 21 |
CRAP | |
100.00% |
1 / 1 |
| BareMetalService | |
100.00% |
64 / 64 |
|
100.00% |
21 / 21 |
35 | |
100.00% |
1 / 1 |
| getBareMetals | |
100.00% |
1 / 1 |
|
100.00% |
1 / 1 |
1 | |||
| getBareMetal | |
100.00% |
1 / 1 |
|
100.00% |
1 / 1 |
1 | |||
| deleteBareMetal | |
100.00% |
1 / 1 |
|
100.00% |
1 / 1 |
1 | |||
| createBareMetal | |
100.00% |
1 / 1 |
|
100.00% |
1 / 1 |
1 | |||
| updateBareMetal | |
100.00% |
6 / 6 |
|
100.00% |
1 / 1 |
2 | |||
| getIPv4Addresses | |
100.00% |
1 / 1 |
|
100.00% |
1 / 1 |
1 | |||
| getIPv6Addresses | |
100.00% |
1 / 1 |
|
100.00% |
1 / 1 |
1 | |||
| getAddressInfo | |
100.00% |
11 / 11 |
|
100.00% |
1 / 1 |
3 | |||
| startBareMetal | |
100.00% |
1 / 1 |
|
100.00% |
1 / 1 |
1 | |||
| startBareMetals | |
100.00% |
1 / 1 |
|
100.00% |
1 / 1 |
1 | |||
| rebootBareMetal | |
100.00% |
1 / 1 |
|
100.00% |
1 / 1 |
1 | |||
| rebootBareMetals | |
100.00% |
1 / 1 |
|
100.00% |
1 / 1 |
1 | |||
| reinstallBareMetal | |
100.00% |
1 / 1 |
|
100.00% |
1 / 1 |
1 | |||
| haltBareMetal | |
100.00% |
1 / 1 |
|
100.00% |
1 / 1 |
1 | |||
| haltBareMetals | |
100.00% |
1 / 1 |
|
100.00% |
1 / 1 |
1 | |||
| singleServerAction | |
100.00% |
3 / 3 |
|
100.00% |
1 / 1 |
2 | |||
| multipleServersAction | |
100.00% |
3 / 3 |
|
100.00% |
1 / 1 |
2 | |||
| getBandwidth | |
100.00% |
10 / 10 |
|
100.00% |
1 / 1 |
4 | |||
| getUserData | |
100.00% |
4 / 4 |
|
100.00% |
1 / 1 |
2 | |||
| getAvailableUpgrades | |
100.00% |
10 / 10 |
|
100.00% |
1 / 1 |
5 | |||
| getVNCUrl | |
100.00% |
4 / 4 |
|
100.00% |
1 / 1 |
2 | |||
| 1 | <?php |
| 2 | |
| 3 | declare(strict_types=1); |
| 4 | |
| 5 | namespace Vultr\VultrPhp\Services\BareMetal; |
| 6 | |
| 7 | use Vultr\VultrPhp\Services\Applications\Application; |
| 8 | use Vultr\VultrPhp\Services\OperatingSystems\OperatingSystem; |
| 9 | use Vultr\VultrPhp\Services\VultrService; |
| 10 | use Vultr\VultrPhp\Util\ListOptions; |
| 11 | use Vultr\VultrPhp\Util\ModelInterface; |
| 12 | use Vultr\VultrPhp\Util\VultrUtil; |
| 13 | use Vultr\VultrPhp\VultrClientException; |
| 14 | |
| 15 | /** |
| 16 | * Baremetal service handler, for bare-metals endpoints. |
| 17 | * |
| 18 | * @see https://www.vultr.com/api/#tag/baremetal |
| 19 | */ |
| 20 | class BareMetalService extends VultrService |
| 21 | { |
| 22 | /** |
| 23 | * List all Bare Metal instances in your account. |
| 24 | * @see https://www.vultr.com/api/#operation/list-baremetals |
| 25 | * @param $options - ListOptions|null - Interact via reference. |
| 26 | * @throws BareMetalException |
| 27 | * @return BareMetal[] |
| 28 | */ |
| 29 | public function getBareMetals(?ListOptions &$options = null) : array |
| 30 | { |
| 31 | return $this->getListObjects('bare-metals', new BareMetal(), $options); |
| 32 | } |
| 33 | |
| 34 | /** |
| 35 | * Get information for a Bare Metal instance. |
| 36 | * @see https://www.vultr.com/api/#operation/get-baremetal |
| 37 | * @param $id - string - Example: cb676a46-66fd-4dfb-b839-443f2e6c0b60 |
| 38 | * @throws BareMetalException |
| 39 | * @return BareMetal |
| 40 | */ |
| 41 | public function getBareMetal(string $id) : BareMetal |
| 42 | { |
| 43 | return $this->getObject('bare-metals/'.$id, new BareMetal()); |
| 44 | } |
| 45 | |
| 46 | /** |
| 47 | * Delete a Bare Metal instance. |
| 48 | * @see https://www.vultr.com/api/#operation/delete-baremetal |
| 49 | * @throws BareMetalException |
| 50 | * @return void |
| 51 | */ |
| 52 | public function deleteBareMetal(string $id) : void |
| 53 | { |
| 54 | $this->deleteObject('bare-metals/'.$id, new BareMetal()); |
| 55 | } |
| 56 | |
| 57 | /** |
| 58 | * Create a new Bare Metal instance based on BareMetalCreate |
| 59 | * @see BareMetalCreate |
| 60 | * @see https://www.vultr.com/api/#operation/create-baremetal |
| 61 | * @param $payload - BareMetalCreate |
| 62 | * @throws BareMetalException |
| 63 | * @return BareMetal |
| 64 | */ |
| 65 | public function createBareMetal(BareMetalCreate $payload) : BareMetal |
| 66 | { |
| 67 | return $this->createObject('bare-metals', new BareMetal(), $payload->getPayloadParams()); |
| 68 | } |
| 69 | |
| 70 | /** |
| 71 | * Update a Bare Metal instance. All attributes are optional in BareMetalUpdate. If not set the attributes will not be sent to the API. |
| 72 | * @see https://www.vultr.com/api/#operation/update-baremetal |
| 73 | * @param $id - string - Example: cb676a46-66fd-4dfb-b839-443f2e6c0b60 |
| 74 | * @param $payload - BareMetalUpdate |
| 75 | * @throws BareMetalException |
| 76 | * @return BareMetal |
| 77 | */ |
| 78 | public function updateBareMetal(string $id, BareMetalUpdate $payload) : BareMetal |
| 79 | { |
| 80 | $client = $this->getClientHandler(); |
| 81 | |
| 82 | try |
| 83 | { |
| 84 | $response = $client->patch('bare-metals/'.$id, $payload->getPayloadParams()); |
| 85 | } |
| 86 | catch (VultrClientException $e) |
| 87 | { |
| 88 | throw new BareMetalException('Failed to update baremetal server: '.$e->getMessage(), $e->getHTTPCode(), $e); |
| 89 | } |
| 90 | |
| 91 | $model = new BareMetal(); |
| 92 | |
| 93 | return VultrUtil::convertJSONToObject((string)$response->getBody(), $model, $model->getResponseName()); |
| 94 | } |
| 95 | |
| 96 | /** |
| 97 | * Get all IPv4 information for the Bare Metal instance. |
| 98 | * @see https://www.vultr.com/api/#operation/get-ipv4-baremetal |
| 99 | * @param $id - string - Example: cb676a46-66fd-4dfb-b839-443f2e6c0b60 |
| 100 | * @throws BareMetalException |
| 101 | * @throws VultrException |
| 102 | * @return BareMetalIPv4Info[] |
| 103 | */ |
| 104 | public function getIPv4Addresses(string $id) : array |
| 105 | { |
| 106 | return $this->getAddressInfo(new BareMetalIPv4Info(), 'bare-metals/'.$id.'/ipv4', $id); |
| 107 | } |
| 108 | |
| 109 | /** |
| 110 | * Get all IPv6 information for the Bare Metal instance. |
| 111 | * @see https://www.vultr.com/api/#operation/get-ipv6-baremetal |
| 112 | * @param $id - string - Example: cb676a46-66fd-4dfb-b839-443f2e6c0b60 |
| 113 | * @throws BareMetalException |
| 114 | * @throws VultrException |
| 115 | * @return BareMetalIPv6Info[] |
| 116 | */ |
| 117 | public function getIPv6Addresses(string $id) : array |
| 118 | { |
| 119 | return $this->getAddressInfo(new BareMetalIPv6Info(), 'bare-metals/'.$id.'/ipv6', $id); |
| 120 | } |
| 121 | |
| 122 | private function getAddressInfo(ModelInterface $model, string $uri, string $id) : array |
| 123 | { |
| 124 | $client = $this->getClientHandler(); |
| 125 | |
| 126 | try |
| 127 | { |
| 128 | $response = $client->get($uri); |
| 129 | } |
| 130 | catch (VultrClientException $e) |
| 131 | { |
| 132 | throw new BareMetalException('Failed to get baremetal address information: '.$e->getMessage(), $e->getHTTPCode(), $e); |
| 133 | } |
| 134 | |
| 135 | $objects = []; |
| 136 | $decode = VultrUtil::decodeJSON((string)$response->getBody()); |
| 137 | $response_name = $model->getResponseListName(); |
| 138 | foreach ($decode->$response_name as $info) |
| 139 | { |
| 140 | $object = VultrUtil::mapObject($info, $model); |
| 141 | $objects[] = $object; |
| 142 | } |
| 143 | return $objects; |
| 144 | } |
| 145 | |
| 146 | /** |
| 147 | * @see https://www.vultr.com/api/#operation/start-baremetal |
| 148 | * @param $id - string - Example: cb676a46-66fd-4dfb-b839-443f2e6c0b60 |
| 149 | * @throws BareMetalException |
| 150 | * @return void |
| 151 | */ |
| 152 | public function startBareMetal(string $id) : void |
| 153 | { |
| 154 | $this->singleServerAction('start', $id); |
| 155 | } |
| 156 | |
| 157 | /** |
| 158 | * Start the Bare Metal instance. |
| 159 | * @see https://www.vultr.com/api/#operation/start-bare-metals |
| 160 | * @param $ids - array - Example: [cb676a46-66fd-4dfb-b839-443f2e6c0b60, cb676a46-66fd-4dfb-b839-443f2e6c0b65] |
| 161 | * @throws BareMetalException |
| 162 | * @return void |
| 163 | */ |
| 164 | public function startBareMetals(array $ids) : void |
| 165 | { |
| 166 | $this->multipleServersAction('start', $ids); |
| 167 | } |
| 168 | |
| 169 | /** |
| 170 | * Reboot the Bare Metal instance. |
| 171 | * @see https://www.vultr.com/api/#operation/reboot-baremetal |
| 172 | * @param $id - string - Example: cb676a46-66fd-4dfb-b839-443f2e6c0b60 |
| 173 | * @throws BareMetalException |
| 174 | * @return void |
| 175 | */ |
| 176 | public function rebootBareMetal(string $id) : void |
| 177 | { |
| 178 | $this->singleServerAction('reboot', $id); |
| 179 | } |
| 180 | |
| 181 | /** |
| 182 | * Reboot multiple Bare Metal instances with 1 api call. |
| 183 | * @see https://www.vultr.com/api/#operation/reboot-bare-metals |
| 184 | * @param $ids - array - Example: [cb676a46-66fd-4dfb-b839-443f2e6c0b60, cb676a46-66fd-4dfb-b839-443f2e6c0b65] |
| 185 | * @throws BareMetalException |
| 186 | * @return void |
| 187 | */ |
| 188 | public function rebootBareMetals(array $ids) : void |
| 189 | { |
| 190 | $this->multipleServersAction('reboot', $ids); |
| 191 | } |
| 192 | |
| 193 | /** |
| 194 | * Reinstall the Bare Metal instance. This action usually takes a few seconds to complete. |
| 195 | * @see https://www.vultr.com/api/#operation/reinstall-baremetal |
| 196 | * @param $id - string - Example: cb676a46-66fd-4dfb-b839-443f2e6c0b60 |
| 197 | * @throws BareMetalException |
| 198 | * @return BareMetal |
| 199 | */ |
| 200 | public function reinstallBareMetal(string $id) : BareMetal |
| 201 | { |
| 202 | return $this->createObject('bare-metals/'.$id.'/reinstall', new BareMetal(), []); |
| 203 | } |
| 204 | |
| 205 | /** |
| 206 | * Halt the Bare Metal instance. The machine will remain off till started again. |
| 207 | * @see https://www.vultr.com/api/#operation/halt-baremetal |
| 208 | * @param $id - string - Example: cb676a46-66fd-4dfb-b839-443f2e6c0b60 |
| 209 | * @throws BareMetalException |
| 210 | * @return void |
| 211 | */ |
| 212 | public function haltBareMetal(string $id) : void |
| 213 | { |
| 214 | $this->singleServerAction('halt', $id); |
| 215 | } |
| 216 | |
| 217 | /** |
| 218 | * Halt multiple Bare Metal instances. The machines will remain off till started again. |
| 219 | * @see https://www.vultr.com/api/#operation/halt-baremetals |
| 220 | * @param $ids - array - Example: [cb676a46-66fd-4dfb-b839-443f2e6c0b60, cb676a46-66fd-4dfb-b839-443f2e6c0b65] |
| 221 | * @throws BareMetalException |
| 222 | * @return void |
| 223 | */ |
| 224 | public function haltBareMetals(array $ids) : void |
| 225 | { |
| 226 | $this->multipleServersAction('halt', $ids); |
| 227 | } |
| 228 | |
| 229 | private function singleServerAction(string $action, string $id) : void |
| 230 | { |
| 231 | try |
| 232 | { |
| 233 | $this->getClientHandler()->post('bare-metals/'.$id.'/'.$action); |
| 234 | } |
| 235 | catch (VultrClientException $e) |
| 236 | { |
| 237 | throw new BareMetalException('Failed to '.$action.' baremetal server: '.$e->getMessage(), $e->getHTTPCode(), $e); |
| 238 | } |
| 239 | } |
| 240 | |
| 241 | private function multipleServersAction(string $action, array $ids) : void |
| 242 | { |
| 243 | try |
| 244 | { |
| 245 | $this->getClientHandler()->post('bare-metals/'.$action, ['baremetal_ids' => $ids]); |
| 246 | } |
| 247 | catch (VultrClientException $e) |
| 248 | { |
| 249 | throw new BareMetalException('Failed to '.$action.' baremetal servers: '.$e->getMessage(), $e->getHTTPCode(), $e); |
| 250 | } |
| 251 | } |
| 252 | |
| 253 | /** |
| 254 | * Get bandwidth information for the Bare Metal instance |
| 255 | * |
| 256 | * The structure of the array will follow this format. |
| 257 | * ['2022-11-05' => ['incoming_bytes' => 234523452352, 'outgoing_bytes' => 132432423]] |
| 258 | * |
| 259 | * @see https://www.vultr.com/api/#operation/get-bandwidth-baremetal |
| 260 | * @param $id - string - Example: cb676a46-66fd-4dfb-b839-443f2e6c0b60 |
| 261 | * @throws BareMetalException |
| 262 | * @throws VultrException |
| 263 | * @return array |
| 264 | */ |
| 265 | public function getBandwidth(string $id) : array |
| 266 | { |
| 267 | try |
| 268 | { |
| 269 | $response = $this->getClientHandler()->get('bare-metals/'.$id.'/bandwidth'); |
| 270 | } |
| 271 | catch (VultrClientException $e) |
| 272 | { |
| 273 | throw new BareMetalException('Failed to get bandwidth for baremetal server: '.$e->getMessage(), $e->getHTTPCode(), $e); |
| 274 | } |
| 275 | |
| 276 | $decode = VultrUtil::decodeJSON((string)$response->getBody(), true); |
| 277 | |
| 278 | $output = []; |
| 279 | // Just a standardization, in the event the api ever changes its attributes. We can just change it here maintain backwards compat. |
| 280 | foreach ($decode['bandwidth'] as $date => $attr) |
| 281 | { |
| 282 | $output[$date] = []; |
| 283 | foreach (['incoming_bytes', 'outgoing_bytes'] as $attribute) |
| 284 | { |
| 285 | $output[$date][$attribute] = $attr[$attribute]; |
| 286 | } |
| 287 | } |
| 288 | |
| 289 | return $output; |
| 290 | } |
| 291 | |
| 292 | /** |
| 293 | * Get the user-supplied, which is decoded for you from base64 that the api returns. |
| 294 | * |
| 295 | * @see https://www.vultr.com/api/#operation/get-bare-metal-userdata |
| 296 | * @param $id - string - Example: cb676a46-66fd-4dfb-b839-443f2e6c0b60 |
| 297 | * @throws BareMetalException |
| 298 | * @throws VultrException |
| 299 | * @return string |
| 300 | */ |
| 301 | public function getUserData(string $id) : string |
| 302 | { |
| 303 | try |
| 304 | { |
| 305 | $response = $this->getClientHandler()->get('bare-metals/'.$id.'/user-data'); |
| 306 | } |
| 307 | catch (VultrClientException $e) |
| 308 | { |
| 309 | throw new BareMetalException('Failed to get user data: '.$e->getMessage(), $e->getHTTPCode(), $e); |
| 310 | } |
| 311 | |
| 312 | return base64_decode(VultrUtil::decodeJSON((string)$response->getBody(), true)['user_data']['data']); |
| 313 | } |
| 314 | |
| 315 | /** |
| 316 | * Get available upgrades for a Bare Metal instance. |
| 317 | * |
| 318 | * @see https://www.vultr.com/api/#operation/get-bare-metals-upgrades |
| 319 | * @param $id - string - Example: cb676a46-66fd-4dfb-b839-443f2e6c0b60 |
| 320 | * @param $type - string - filter based on upgrade types. |
| 321 | * @throws BareMetalException |
| 322 | * @return OperatingSystem|Application[] |
| 323 | */ |
| 324 | public function getAvailableUpgrades(string $id, string $type = 'all') : array |
| 325 | { |
| 326 | try |
| 327 | { |
| 328 | $response = $this->getClientHandler()->get('bare-metals/'.$id.'/upgrades', ['type' => $type]); |
| 329 | } |
| 330 | catch (VultrClientException $e) |
| 331 | { |
| 332 | throw new BareMetalException('Failed to get available upgrades: '.$e->getMessage(), $e->getHTTPCode(), $e); |
| 333 | } |
| 334 | |
| 335 | $output = []; |
| 336 | $application = new Application(); |
| 337 | $os = new OperatingSystem(); |
| 338 | foreach (VultrUtil::decodeJSON((string)$response->getBody())->upgrades as $type => $upgrades) |
| 339 | { |
| 340 | foreach ($upgrades as $upgrade) |
| 341 | { |
| 342 | $output[] = VultrUtil::mapObject($upgrade, $type === 'os' ? clone $os : clone $application); |
| 343 | } |
| 344 | } |
| 345 | |
| 346 | return $output; |
| 347 | } |
| 348 | |
| 349 | /** |
| 350 | * Get the VNC URL for a Bare Metal instance. Which can be used to access the console of the machine. |
| 351 | * |
| 352 | * @see https://www.vultr.com/api/#operation/get-bare-metal-vnc |
| 353 | * @param $id - string - Example: cb676a46-66fd-4dfb-b839-443f2e6c0b60 |
| 354 | * @throws BareMetalException |
| 355 | * @throws VultrException |
| 356 | * @return string |
| 357 | */ |
| 358 | public function getVNCUrl(string $id) : string |
| 359 | { |
| 360 | try |
| 361 | { |
| 362 | $response = $this->getClientHandler()->get('bare-metals/'.$id.'/vnc'); |
| 363 | } |
| 364 | catch (VultrClientException $e) |
| 365 | { |
| 366 | throw new BareMetalException('Failed to get vnc url: '.$e->getMessage(), $e->getHTTPCode(), $e); |
| 367 | } |
| 368 | |
| 369 | return VultrUtil::decodeJSON((string)$response->getBody(), true)['vnc']['url']; |
| 370 | } |
| 371 | } |