123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180 |
- <?php
- /* For licensing terms, see /license.txt */
- use DigitalOcean\DigitalOcean;
- use DigitalOcean\Credentials;
- /**
- * Class DigitalOceanVM
- */
- class DigitalOceanVM extends AbstractVM implements VirtualMachineInterface
- {
- /**
- *
- */
- public function __construct($settings)
- {
- parent::__construct($settings);
- $this->connect();
- }
- /**
- * @inheritdoc
- */
- public function connect()
- {
- // Set up your credentials.
- $credentials = new Credentials($this->vmClientId, $this->apiKey);
- // Use the default adapter, CurlHttpAdapter.
- $this->connector = new DigitalOcean($credentials);
- // Or use BuzzHttpAdapter.
- //$this->connector = new DigitalOcean($credentials, new BuzzHttpAdapter());
- }
- /**
- * @return DigitalOcean
- */
- public function getConnector()
- {
- return $this->connector;
- }
- /**
- * @param string $type min or max
- */
- public function resizeTo($type = 'min')
- {
- try {
- $droplets = $this->getConnector()->droplets();
- $sizes = $this->getConnector()->sizes();
- $availableSizes = $sizes->getAll();
- if (isset($availableSizes->status) && $availableSizes->status == 'OK') {
- $minSizeIdExists = false;
- $maxSizeIdExists = false;
- foreach ($availableSizes->sizes as $size) {
- if ($size->id == $this->vmMaxSize) {
- $maxSizeIdExists = true;
- }
- if ($size->id == $this->vmMinSizeSize) {
- $minSizeIdExists = true;
- }
- }
- if ($maxSizeIdExists && $minSizeIdExists) {
- throw new \Exception('Sizes are not well configured');
- }
- } else {
- throw new \Exception('Sizes not available');
- }
- // Returns all active droplets that are currently running in your account.
- //$allActive = $droplets->showAllActive();
- $dropletInfo = $droplets->show($this->vmId);
- if ($dropletInfo->status == 'OK') {
- switch ($type) {
- case 'min':
- if ($dropletInfo->droplet->size_id == $this->vmMinSize) {
- // No resize
- $this->addMessage(
- 'Nothing to execute. The size was already reduced.'
- );
- } else {
- $this->resize($this->vmMinSize);
- }
- break;
- case 'max':
- if ($dropletInfo->droplet->size_id == $this->vmMaxSize) {
- // No resize
- $this->addMessage(
- 'Nothing to execute. The size was already boost.'
- );
- } else {
- $this->resize($this->vmMaxSize);
- }
- break;
- }
- } else {
- throw new \Exception(" Id ".$this->vmId." doesn't exists.");
- }
- } catch (Exception $e) {
- die($e->getMessage());
- }
- }
- /**
- * Turns off / resize / turns on
- * @param int $sizeId
- */
- public function resize($sizeId)
- {
- $droplets = $this->getConnector()->droplets();
- $dropletInfo = $droplets->show($this->vmId);
- $powerOff = $droplets->powerOff($this->vmId);
- $this->addMessage('Power off droplet #'.$this->vmId);
- $this->waitForEvent($powerOff->event_id);
- $this->addMessage('Current status: '.$dropletInfo->droplet->status);
- $resizeDroplet = $droplets->resize(
- $this->vmId,
- array('size_id' => intval($sizeId))
- );
- $this->addMessage('Resize droplet to size id: '.$sizeId);
- $this->waitForEvent($resizeDroplet->event_id);
- $powerOn = $droplets->powerOn($this->vmId);
- $this->waitForEvent($powerOn->event_id);
- $this->addMessage('Power on droplet #'.$this->vmId);
- }
- /**
- * Loops until an event answer 100 percentage
- * @param int $eventId
- */
- public function waitForEvent($eventId)
- {
- $events = $this->getConnector()->events();
- $status = false;
- while ($status == false) {
- $infoStatus = $events->show($eventId);
- if ($infoStatus->status == 'OK' && $infoStatus->event->percentage == 100) {
- $status = true;
- }
- }
- }
- /**
- * @inheritdoc
- */
- public function runCron()
- {
- $this->resizeToMinLimit();
- echo $this->getMessageToString();
- }
- /**
- * @inheritdoc
- */
- public function resizeToMaxLimit()
- {
- $this->resizeTo('max');
- }
- /**
- * @inheritdoc
- */
- public function resizeToMinLimit()
- {
- $this->resizeTo('min');
- }
- }
|