Chamilo is a learning management system focused on ease of use and accessibility
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 
chamilo-lms/plugin/bbb/lib/vm/DigitalOceanVM.php

180 lines
5.0 KiB

<?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');
}
}