Skip to content
Snippets Groups Projects
Commit 23e53f30 authored by baldwinlouie's avatar baldwinlouie
Browse files

Issue #1911342 by baldwinlouie: Removed detach from the terminate queue.

parent d1f7f7c9
No related branches found
No related tags found
No related merge requests found
......@@ -612,7 +612,8 @@ function cloud_metering_terminate_budget_crossed_instances($maxed_instances) {
$instance_volumes = cloud_get_instance_volumes($cloud_context, $instance_id);
$volumes = array();
// if only one volume and if it is the root volume, it can't be detached
if (is_array($instance_volumes) && sizeof($instance_volumes) > 0) {
foreach ($instance_volumes as $volume_id => $volume) {
$volumes[$volume_id] = array();
......
......@@ -29,7 +29,7 @@ define('CLOUD_METERING_DEFAULT_THRESHOLD_MAIL_BODY' , variable_get('cloud_me
// terminate mail
define('CLOUD_METERING_DEFAULT_TERMINATE_MAIL_SUBJECT' , variable_get('cloud_metering_terminate_mail_subject', 'The instance [cloud_metering_instance:instance-name] has crossed the allocated budget!'));
define('CLOUD_METERING_DEFAULT_TERMINATE_MAIL_BODY' , variable_get('cloud_metering_terminate_mail_template', "Dear [cloud_metering_instance:username],\n\nYour cloud instance named [cloud_metering_instance:instance-name] has crossed the budget allocated to it. The instance will be automatically terminated after a backup and detaching any attached volumes.\n\n-- [site:name]"));
define('CLOUD_METERING_DEFAULT_TERMINATE_MAIL_BODY' , variable_get('cloud_metering_terminate_mail_template', "Dear [cloud_metering_instance:username],\n\nYour cloud instance named [cloud_metering_instance:instance-name] has crossed the budget allocated to it. The instance will be automatically terminated after the volumes are backed up.\n\n-- [site:name]"));
// user default mail templates
define('CLOUD_METERING_DEFAULT_USER_MAIL_SUBJECT' , variable_get('cloud_metering_user_mail_subject', 'The total cost of your cloud instances has gone past your budget!'));
......
......@@ -12,12 +12,10 @@
* Implementation of hook_cron_queue_info()
*/
function cloud_metering_cron_queue_info() {
$queues[CLOUD_METERING_QUEUE] = array(
'worker callback' => '_cloud_metering_process_queue',
'time' => 600,
);
return $queues;
}
......@@ -30,18 +28,12 @@ function _cloud_metering_process_queue() {
if ($next_task['task'] == CLOUD_METERING_BACKUP) {
_cloud_metering_backup($next_task);
}
elseif ($next_task['task'] == CLOUD_METERING_DETACH) {
_cloud_metering_detach_volumes($next_task);
}
elseif ($next_task['task'] == CLOUD_METERING_TERMINATE) {
_cloud_metering_terminate($next_task);
}
elseif ($next_task['task'] == CLOUD_METERING_BACKUP_CHECK) {
_cloud_metering_check_backup($next_task);
}
elseif ($next_task['task'] == CLOUD_METERING_DETACH_CHECK) {
_cloud_metering_check_detach($next_task);
}
elseif ($next_task['task'] == CLOUD_METERING_TERMINATE_CHECK) {
_cloud_metering_check_terminate($next_task);
}
......@@ -67,7 +59,6 @@ function _cloud_metering_get_uuid($cloud_context, $instance_id) {
* Check task progress and add new tasks if needed
*/
function _cloud_metering_check_task($task) {
$qid = $task['qid'];
$data = $task['data'];
$cloud_context = $data['cloud_context'];
......@@ -75,21 +66,13 @@ function _cloud_metering_check_task($task) {
$module = cloud_get_module($cloud_context);
switch ($task['task']) {
case CLOUD_METERING_BACKUP:
$volumes = $data['volumes'];
$backup_complete = FALSE;
$snapshots_complete = array();
foreach ($volumes as $volume_id => $volume) {
if (!isset($volume['snapshot_id'])) {
break;
}
$snapshot_id = $volume['snapshot_id'];
$params = array(
'cloud_context' => $cloud_context,
......@@ -100,73 +83,28 @@ function _cloud_metering_check_task($task) {
if (!$snapshot_complete) {
break;
}
$snapshots_complete[] = $snapshot_id;
}
$backup_complete = ( sizeof($volumes) == sizeof($snapshots_complete) );
if ($backup_complete) {
if ((sizeof($volumes) == sizeof($snapshots_complete))) {
// Backup is complete. We mark the backup task as complete and start a detach job for the instance
_cloud_metering_update_task_status($qid, CLOUD_METERING_QUEUE_STATUS_COMPLETED, array());
// Start detach task, send in the volume information already in $data
_cloud_metering_add_task($cloud_context, $instance_id, CLOUD_METERING_DETACH, $data);
}
break;
case CLOUD_METERING_DETACH:
$volumes = $data['volumes'];
$detach_complete = FALSE;
$volumes_detached = array();
foreach ($volumes as $volume_id => $volume) {
$params = array(
'cloud_context' => $cloud_context,
'volume_id' => $volume_id,
);
$volume_attached = module_invoke($module, 'cloud_action', 'check_volume_attached_status', $params);
if ($volume_attached) {
break;
}
$volumes_detached[] = $volume_id;
}
$detach_complete = ( sizeof($volumes) == sizeof($volumes_detached) );
if ($detach_complete) {
// Set the detach task as complete
_cloud_metering_update_task_status($qid, CLOUD_METERING_QUEUE_JOB_COMPLETED, array());
// Start a terminate task for the instance
// _cloud_metering_add_task($cloud_context, $instance_id, CLOUD_METERING_TERMINATE, $data);
}
break;
case CLOUD_METERING_TERMINATE:
// Check if the instance is terminated
$params = array(
'cloud_context' => $cloud_context,
'instance_id' => $instance_id,
);
$terminated = module_invoke($module, 'cloud_action', 'check_instance_terminated', $params);
if ($terminated) {
// Termination complete
_cloud_metering_update_task_status($qid, CLOUD_METERING_QUEUE_JOB_COMPLETED, array());
}
break;
}
}
/**
......@@ -199,54 +137,17 @@ function _cloud_metering_backup($task) {
}
}
$data['volumes'] = $volumes;
// The backup task will be on a wait as we keep monitoring for the backup to complete
_cloud_metering_update_task_status($qid, CLOUD_METERING_QUEUE_STATUS_IN_PROGRESS, $data);
// We will start a checker task in next cron run
}
/**
* Detach volumes
*/
function _cloud_metering_detach_volumes($task) {
$qid = $task['qid'];
$data = $task['data'];
$volumes = $data['volumes'];
$cloud_context = $data['cloud_context'];
$instance_id = $data['instance_id'];
// Start detach for each volume
foreach ($volumes as $volume_id => $volume) {
$params = array(
'volume_id' => $volume_id,
);
$result = cloud_perform_action('', 'detach_volume', $cloud_context, $params);
if (!$result) {
_cloud_metering_activity_audit(t('Detaching of volume @volume-id failed.', array('!volume-id' => $volume_id)), 'user_activity', '', WATCHDOG_ERROR);
}
}
// Detach task will be on wait till the detachings are completed
_cloud_metering_update_task_status($qid, CLOUD_METERING_QUEUE_STATUS_IN_PROGRESS);
}
/**
* Terminate instance
*/
function _cloud_metering_terminate($task) {
$qid = $task['qid'];
$data = $task['data'];
$cloud_context = $data['cloud_context'];
$instance_id = $data['instance_id'];
......@@ -260,17 +161,15 @@ function _cloud_metering_terminate($task) {
0 => $instance_id,
'instance_id' => $instance_id,
);
// Start termination of instance
cloud_perform_action('', 'terminate', $cloud_context, $params);
// Update the task status. Terminate task will be waiting for the termination to complete.
_cloud_metering_update_task_status($qid, CLOUD_METERING_QUEUE_STATUS_WAITING);
}
/**
* Check backup task. If completed then mark as completed. Otherwise start a new check task.
* If backups completed, go straight for terminate. Let EC2 do the volume detaching
*/
function _cloud_metering_check_backup($task) {
......@@ -292,18 +191,15 @@ function _cloud_metering_check_backup($task) {
if (!$snapshot_complete) {
break;
}
$snapshots_complete[] = $snapshot_id;
}
if (sizeof($volumes) == sizeof($snapshots_complete)) {
// Backup of all volumes completed
_cloud_metering_update_task_status($b_qid, CLOUD_METERING_QUEUE_STATUS_COMPLETED, array());
// Initiate a detach task
_cloud_metering_add_task($cloud_context, $instance_id, CLOUD_METERING_DETACH, $data);
// go straight to terminate. Let EC2 detach the volumes
_cloud_metering_add_task($cloud_context, $instance_id, CLOUD_METERING_TERMINATE, $data);
}
else {
$backup_task = _cloud_metering_get_task($b_qid);
......@@ -320,66 +216,10 @@ function _cloud_metering_check_backup($task) {
}
/**
* Check detach task. If completed, mark as completed. Otherwise keep monitoring.
*/
function _cloud_metering_check_detach($task) {
$qid = $task['qid'];
$data = $task['data'];
$d_qid = $data['qid']; // Id of task being monitored
$cloud_context = $data['cloud_context'];
$instance_id = $data['instance_id'];
$volumes = $data['volumes'];
$detach_complete = FALSE;
$volumes_detached = array();
foreach ($volumes as $volume_id => $volume) {
$params = array('volume_id' => $volume_id);
$volume_attached = cloud_perform_action('', 'check_volume_attached_status', $cloud_context, $params);
if ($volume_attached) {
break;
}
$volumes_detached[] = $volume_id;
}
$detach_complete = ( sizeof($volumes) == sizeof($volumes_detached) );
if ($detach_complete) {
// Mark detach task as completed and start a terminate task
_cloud_metering_update_task_status($d_qid, CLOUD_METERING_QUEUE_STATUS_COMPLETED, array());
_cloud_metering_add_task($cloud_context, $instance_id, CLOUD_METERING_TERMINATE, $data);
}
else {
// If task ran for more than stipulated time, cancel it
$d_task = _cloud_metering_get_task($d_qid);
if ($d_task['time_running'] > 10) {
_cloud_metering_update_task_status($d_qid, CLOUD_METERING_QUEUE_STATUS_FAILED, array());
_cloud_metering_activity_audit(t('Task with Id %qid failed due to expiry of allocated time.', array('%qid' => $d_qid)), 'user_activity', '', WATCHDOG_ERROR);
// We proceed to terminate instance even if detaching failed
_cloud_metering_add_task($cloud_context, $instance_id, CLOUD_METERING_TERMINATE, $data);
}
}
_cloud_metering_update_task_status($qid, CLOUD_METERING_QUEUE_STATUS_COMPLETED, array());
}
/**
* Monitor termination of instances
*/
function _cloud_metering_check_terminate($task) {
$qid = $task['qid'];
$data = $task['data'];
$t_qid = $data['qid'];
......@@ -410,18 +250,14 @@ function _cloud_metering_check_terminate($task) {
* Get the base tasks - backup, detach, terminate
*/
function _cloud_metering_get_base_tasks() {
return array(CLOUD_METERING_BACKUP, CLOUD_METERING_DETACH, CLOUD_METERING_TERMINATE);
return array(CLOUD_METERING_BACKUP, CLOUD_METERING_TERMINATE);
}
/**
* Get checker tasks - backup check, detach check, terminate check
*/
function _cloud_metering_get_checker_tasks() {
return array(CLOUD_METERING_BACKUP_CHECK, CLOUD_METERING_DETACH_CHECK, CLOUD_METERING_TERMINATE_CHECK);
return array(CLOUD_METERING_BACKUP_CHECK, CLOUD_METERING_TERMINATE_CHECK);
}
/**
......@@ -430,17 +266,13 @@ function _cloud_metering_get_checker_tasks() {
* @return String "base" or "checker"
*/
function _cloud_metering_get_task_type($task) {
$base_tasks = _cloud_metering_get_base_tasks();
if (in_array($task, $base_tasks)) {
return 'base';
}
$checker_tasks = _cloud_metering_get_checker_tasks();
if (in_array($task, $checker_tasks)) {
return 'checker';
}
return 'base';
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment