Skip to content

Commit

Permalink
checkpoint
Browse files Browse the repository at this point in the history
  • Loading branch information
VeggieMeat committed Mar 1, 2014
1 parent e01e864 commit 680f4bc
Show file tree
Hide file tree
Showing 6 changed files with 162 additions and 34 deletions.
8 changes: 6 additions & 2 deletions modules/provider/opencloud_provider.module
Expand Up @@ -215,7 +215,8 @@ function opencloud_provider_create($values = array()) {
* The provider object.
*/
function opencloud_provider_load($provider_id) {
return reset(entity_load('opencloud_provider', array($provider_id)));
$entities = entity_load('opencloud_provider', array($provider_id));
return reset($entities);
}

/**
Expand Down Expand Up @@ -302,7 +303,10 @@ function opencloud_provider_connect($provider) {
$connection = new $class($provider->url, $credentials);

// Let other provider modules alter the connection.
drupal_alter('opencloud_provider_connection', $connection);
$context = array(
'provider' => clone $provider,
);
drupal_alter('opencloud_provider_connection', $connection, $context);

return $connection;
}
Expand Down
Expand Up @@ -27,8 +27,9 @@ function opencloud_provider_rackspace_opencloud_provider_credentials($provider)
/**
* Implements hook_opencloud_provider_connection_alter().
*/
function opencloud_provider_rackspace_opencloud_provider_connection_alter($connection) {
function opencloud_provider_rackspace_opencloud_provider_connection_alter(&$connection, $context) {
$provider = $context['provider'];
if ('Rackspace' == $provider->type) {
$connection->SetDefaults('Compute', 'cloudServersOpenStack', $provider->region);
//$connection->SetDefaults('Compute', 'cloudServersOpenStack', $provider->region);
}
}
84 changes: 84 additions & 0 deletions modules/server/includes/opencloud_server.controller.inc
@@ -0,0 +1,84 @@
<?php

/**
* Entity controller implementing EntityAPIControllerInterface
*
* Based on RemoteEntityAPIDefaultController.
*/
class OpencloudServerEntityController extends EntityAPIController implements EntityAPIControllerInterface {

/**
* Determines whether to bypass remote retrieval of entities.
*/
public $bypass_remote_retrieve = FALSE;

/**
* Overridden to retrieve entities from remote source if expired.
*
* Retrieving remote entities can be bypassed by setting the value of the
* property $bypass_remote_retrieve on the controller object to TRUE.
*
* @see DrupalDefaultEntityController#load($ids,$conditions)
*/
public function load($ids = array(), $conditions = array()) {
$entities = parent::load($ids, $conditions);

// Check for expiry, allowing the controller setting to bypass this.
if (!$this->bypass_remote_retrieve) {
foreach ($entities as $id => $entity) {
// A value of 0 for the expiry means it doesn't expire.
if (!empty($entity->expires) && $entity->expires < REQUEST_TIME) {
// Entity has expired.
// Fetch the remote server and update.
$compute = opencloud_server_compute($entity->provider_id);
$server = opencloud_server_fetch_server($compute, $entity->uuid);
if (!empty($server)) {
$entities[$id] = opencloud_server_map_properties($server, $entity);
}
}
}
}

return $entities;
}

/**
* Save the remote server.
*
* This simply overrides the default save function.
*
* @param obj $entity
* The entity to save.
* @param array $remote_properties
* (Optional) An array of properties to save.
*/
public function save($entity, $remote_properties = array()) {
// Bypass remote retrievals.
$this->bypass_remote_retrieve = TRUE;

if (!$entity->uuid) {
$compute = opencloud_server_compute($entity->provider_id);
opencloud_server_create_server($server, $remote_properties);
}
else {
try {
$server = opencloud_server_fetch_server($compute, $entity->uuid);
$server->update($remote_properties);
}
catch (\Guzzle\Http\Exception\BadResponseException $e) {
if ('404' == $e->getResponse()->getStatusCode()) {
$server = $compute->server();
opencloud_server_create_server($server, $remote_properties);
}
else {
watchdog('opencloud_server', print_r($e, TRUE), array(), WATCHDOG_WARNING);
}
}
}

$entity->expires = REQUEST_TIME + variable_get('opencloud_server_expiration', 600);
$return = parent::save($entity);

return $return;
}
}
1 change: 1 addition & 0 deletions modules/server/opencloud_server.info
Expand Up @@ -5,5 +5,6 @@ core = 7.x

dependencies[] = opencloud_provider

files[] = includes/opencloud_server.controller.inc
files[] = includes/views/plugins/opencloud_server_views_plugin_query.inc
files[] = includes/views/handlers/opencloud_server_views_handler_field.inc
94 changes: 65 additions & 29 deletions modules/server/opencloud_server.module
Expand Up @@ -39,56 +39,47 @@ function opencloud_server_entity_property_info() {
$properties = &$info['opencloud_server']['properties'];

$properties['server_id'] = array(
'label' => t('Server ID'),
'description' => t('The unique server ID.'),
'schema field' => 'server_id',
);
$properties['provider_id'] = array(
'label' => t('Provider ID'),
'description' => t('The Provider this server belongs to.'),
'setter callback' => 'entity_property_verbatim_set',
'required' => TRUE,
'schema field' => 'provider_id',
);
$properties['name'] = array(
'label' => t('Name'),
'description' => t('The name of the server.'),
'setter callback' => 'entity_property_verbatim_set',
'required' => TRUE,
'schema field' => 'name',
);
$properties['status'] = array(
'label' => t('Status'),
'description' => t('The current status of this server.'),
'setter callback' => 'entity_property_verbatim_set',
'schema field' => 'status',
);
$properties['hostid'] = array(
'label' => t('Host ID'),
'description' => t('The host that this server resides on.'),
'setter callback' => 'entity_property_verbatim_set',
'schema field' => 'hostid',
);
$properties['uuid'] = array(
'label' => t('UUID'),
'description' => t('The UUID of this server.'),
'setter callback' => 'entity_property_verbatim_set',
'schema field' => 'uuid',
);
$properties['image'] = array(
'label' => t('Image UUID'),
'description' => t('The UUID of the image used to build this server.'),
'setter callback' => 'entity_property_verbatim_set',
'schema field' => 'image',
);
$properties['flavor'] = array(
'label' => t('Flavor'),
'description' => t('The flavor of this server.'),
'setter callback' => 'entity_property_verbatim_set',
'schema field' => 'flavor',
);
$properties['addresses'] = array(
'label' => t('IP Addresses'),
'description' => t('The networks and IP addresses for this server.'),
'setter callback' => 'entity_property_verbatim_set',
'schema field' => 'addresses',
Expand Down Expand Up @@ -180,7 +171,8 @@ function opencloud_server_create($values = array()) {
* The server object.
*/
function opencloud_server_load($server_id) {
return reset(entity_load('opencloud_server', array($server_id)));
$entity = entity_load('opencloud_server', array($server_id));
return reset($entity);
}

/**
Expand Down Expand Up @@ -240,7 +232,7 @@ function opencloud_server_access($op, $server = NULL, $account = NULL) {
function opencloud_server_compute($provider_id) {
$provider = opencloud_provider_load($provider_id);
$cloud = opencloud_provider_connect($provider);
return $cloud->Compute(NULL, $provider->region);
return $cloud->computeService(null, $provider->region);
}

/**
Expand Down Expand Up @@ -329,27 +321,31 @@ function opencloud_server_import_all_servers($provider_id) {
* @return array
* An array of properties.
*/
function opencloud_server_map_properties($server, $provider_id) {
$properties = entity_get_property_info('opencloud_server');

$properties['name'] = $server->name;
$properties['provider_id'] = $provider_id;
$properties['status'] = $server->status;
$properties['uuid'] = $server->id;
$properties['hostid'] = $server->hostId;
$properties['image'] = $server->image->id;
$properties['flavor'] = $server->flavor->id;
$properties['addresses'] = json_encode($server->addresses);
function opencloud_server_map_properties($server, $entity) {
$local_properties = entity_get_property_info('opencloud_server');
$local_properties = array_keys($local_properties['properties']);

$entity->name = $server->name;
$entity->provider_id = $entity->provider_id;
$entity->status = $server->status;
$entity->uuid = $server->id;
$entity->hostid = $server->hostId;
$entity->image = $server->image->id;
$entity->flavor = $server->flavor->id;
$entity->addresses = json_encode($server->addresses);
$entity->created = date("U", strtotime($server->created));
$entity->updated = date("U", strtotime($server->updated));

// Allow other modules to provide mappings for their properties.
$provider = opencloud_provider_load($provider_id);
$provider = opencloud_provider_load($entity->provider_id);
$context = array(
'server' => clone $server,
'provider' => clone $provider,
'local_properties' => $local_properties,
);
drupal_alter('opencloud_server_map_properties', $properties, $context);
drupal_alter('opencloud_server_map_properties', $entity, $context);

return $array;
return $properties;
}

/**
Expand Down Expand Up @@ -398,7 +394,7 @@ function opencloud_server_rebuild_server($id, $options = array()) {
* @return array
* An array of available flavors.
*/
function opencloud_get_flavors($compute, $full = TRUE, $options = array()) {
function opencloud_server_get_flavors($compute, $full = TRUE, $options = array()) {
$return = array();

$flavors = $compute->FlavorList();
Expand All @@ -422,7 +418,7 @@ function opencloud_get_flavors($compute, $full = TRUE, $options = array()) {
* @return obj
* An Openstack flavor object.
*/
function opencloud_get_flavor($compute, $id) {
function opencloud_server_get_flavor($compute, $id) {
return $compute->Flavor($id);
}

Expand All @@ -440,7 +436,7 @@ function opencloud_get_flavor($compute, $id) {
* @return array
* An array of available images.
*/
function opencloud_get_images($compute, $full = TRUE, $options = array()) {
function opencloud__server_get_images($compute, $full = TRUE, $options = array()) {
$return = array();

$images = $compute->ImageList($full, $options);
Expand All @@ -459,7 +455,7 @@ function opencloud_get_images($compute, $full = TRUE, $options = array()) {
* @param bool $hard
* Whether to issue a hard reboot if available.
*/
function opencloud_reboot_server($server, $hard = FALSE) {
function opencloud_server_reboot_server($server, $hard = FALSE) {
$server->Reboot();
// @TODO Add check for what provider we are using so we can provide the right
// constant for a hard or soft reboot.
Expand All @@ -486,3 +482,43 @@ function opencloud_server_views_api() {
'path' => drupal_get_path('module', 'opencloud_server') . '/includes/views',
);
}

/**
* Implements hook_cron().
*/
function opencloud_server_cron() {
$fetch_queue = DrupalQueue::get('opencloud_server_fetch');
$query = db_select('opencloud_server', 'b');
$query->addField('b', 'server_id');
$query->condition('b.expires', REQUEST_TIME, '<=');
$result = $query->execute();
$records = $result->fetchAll();
foreach ($records as $record) {
$queue_item = array(
'server_id' => $record->server_id,
);
$fetch_queue->createItem($queue_item);
}
}

/**
* Implements hook_cron_queue_info().
*/
function opencloud_server_cron_queue_info() {
$queues['opencloud_server_fetch'] = array(
'worker callback' => 'opencloud_server_cron_queue_fetch',
);

return $queues;
}

/**
* Implements callback_cron_queue_info_worker().
*/
function opencloud_server_cron_queue_fetch($queue_item) {
$entity = opencloud_server_load($queue_item->server_id);

if (isset($entity) && $entity->expires < REQUEST_TIME) {
opencloud_server_save($entity);
}
}
4 changes: 3 additions & 1 deletion opencloud.module
Expand Up @@ -15,10 +15,12 @@ function opencloud_loaded() {
$loaded = &drupal_static(__FUNCTION__);
if (!isset($loaded)) {
if (!class_exists('\OpenCloud\OpenStack') && module_exists('composer_manager')) {
composer_manager_register_autoload();
composer_manager_register_autoloader();
$loaded = class_exists('\OpenCloud\OpenStack');
}
}

return $loaded;
}

/**
Expand Down

0 comments on commit 680f4bc

Please sign in to comment.