Index: migrate/hosting_migrate.module
===================================================================
RCS file: /cvs/drupal/contributions/modules/hosting/migrate/hosting_migrate.module,v
retrieving revision 1.24
diff -u -p -r1.24 hosting_migrate.module
--- migrate/hosting_migrate.module 23 Sep 2009 13:11:34 -0000 1.24
+++ migrate/hosting_migrate.module 25 Sep 2009 12:28:54 -0000
@@ -1,17 +1,10 @@
t('Migrate'),
- 'description' => t('Move the site to a new platform.'),
- 'weight' => 7
- );
- }
- return $options;
-}
function hosting_migrate_perm() {
@@ -30,18 +23,179 @@ function hosting_migrate_menu() {
'type' => MENU_CALLBACK
);
+ $items['node/%hosting_task_platform/task_migrate'] = array(
+ 'title' => t('Migrate'),
+ 'description' => t('Migrate sites to a new platform'),
+ 'page callback' => 'drupal_get_form',
+ 'page arguments' => array('hosting_migrate_platform', 1),
+ 'access arguments' => array('access content'),
+ 'type' => MENU_LOCAL_TASK,
+ 'weight' => ($info['weight']) ? $info['weight'] : 0,
+ );
+
+ return $items;
+}
+
+/**
+ * Implementation of hook_hosting_tasks()
+ */
+function hosting_migrate_hosting_tasks($type, $task = null) {
+ $options = array();
+
+ if ($type == 'site') {
+ $options['migrate'] = array(
+ 'title' => t('Migrate'),
+ 'description' => t('Move the site to a new platform.'),
+ 'weight' => 7
+ );
+ }
+ return $options;
+}
+
+/**
+ * Batch migration of sites between platforms
+ */
+function hosting_migrate_platform($form_state, $node) {
+ $step = isset($form_state['storage']['step']) ? $form_state['storage']['step'] : 1;
+
+ // Step 1 - choose target platform
+ if ($step == 1) {
+ $platforms = _hosting_get_platforms();
+ unset($platforms[$node->nid]);
+ $form['#current_platform'] = $node;
+ $form['target_platform'] = array(
+ '#type' => 'radios',
+ '#required' => TRUE,
+ '#title' => t('Platform'),
+ '#description' => t('Choose where you want to migrate the sites on this platform to'),
+ '#options' => $platforms,
+ );
+ $form['status'] = array('#type' => 'value');
+ }
- return $items;
+ // Step 2 - review sites that pass or fail the requirements to be migrated
+ if ($step == 2) {
+ $title = array(
+ 'passed' => t("The following sites will be migrated"),
+ 'failed' => t("The following sites will not be migrated")
+ );
+ foreach (array('passed', 'failed') as $type) {
+ if (sizeof($form_state['storage'][$type])) {
+ foreach ($form_state['storage'][$type] as $site_id => $url) {
+ $form['output'][$type]['title'] = array(
+ '#type' => 'markup',
+ '#value' => '
' . $title[$type] . '
',
+ );
+ $status = $form_state['storage']['status'][$site_id];
+
+ $description = t("Upgrades: !upgrades, Warnings: !missing, Errors: !errors", array(
+ '!upgrades' => $status['upgrade'],
+ '!missing' => $status['missing'],
+ '!errors' => $status['error']));
+
+ $form['output'][$type][$site_id] = array(
+ '#type' => 'item',
+ '#title' => $url,
+ '#description' => $description,
+ );
+ }
+ }
+ }
+ }
+ $form['submit'] = array(
+ '#type' => 'submit',
+ '#value' => 'Submit',
+ );
+ return $form;
}
+/**
+ * Implementation of hook_submit()
+ */
+function hosting_migrate_platform_submit($form, &$form_state) {
+ $step = isset($form_state['storage']['step']) ? $form_state['storage']['step'] : 1;
+ switch ($step) {
+ case 1:
+ $form_state['storage']['target_platform'] = $form_state['values']['target_platform'];
+ $max_per_batch = 5;
+ $result = db_query("SELECT nid FROM {hosting_site} WHERE platform = %d AND status = %d", $form['#current_platform']->nid, HOSTING_SITE_ENABLED);
+ $operations = array();
+ while ($site = db_fetch_object($result)) {
+ $operations[] = array('hosting_migrate_platform_batch',
+ array($site->nid, $form_state['values']['target_platform'], $form_state));
+ }
+ if (sizeof($operations)) {
+ $batch = array(
+ 'operations' => $operations,
+ 'finished' => 'hosting_migrate_platform_finished',
+ 'title' => t('Checking for sites that can be migrated.'),
+ 'init_message' => t('Retrieving list of sites.'),
+ 'progress_message' => t('Evaluated @current out of @total sites.'),
+ 'error_message' => t('Bulk migration has encountered an error.'),
+ );
+ batch_set($batch);
+ }
+ break;
+ case 2:
+ if ($form_state['storage']['passed']) {
+ foreach ($form_state['storage']['passed'] as $nid => $url) {
+ hosting_add_task($nid, 'migrate', array('target_platform' => $form_state['storage']['target_platform']));
+ }
+ $form_state['redirect'] = 'node/' . $form_state['storage']['target_platform'];
+ unset($form_state['rebuild']);
+ unset($form_state['storage']);
+ drupal_set_message(t('The sites have been added to the task queue to be migrated'));
+ return false;
+ // this does not seem to work ?
+ break;
+ }
+ else {
+ form_set_error('', t('Unmet site dependencies prevent a batch migration to this target platform.'));
+ }
+ }
+ $form_state['storage']['step'] = $step + 1;
+}
+/**
+ * Batch comparison of site packages between platforms to determine
+ * if the site can be migrated to the target platform or not.
+ */
+function hosting_migrate_platform_batch($site_id, $target_platform, &$context) {
+ if (!isset($context['sandbox']['progress'])) {
+ $context['sandbox']['progress'] = 0;
+ }
+ $site = node_load($site_id);
+ $batch =& batch_get();
+ // Determine whether the install profile is available on the target platform
+ $profile_instance = hosting_package_instance_load(
+ array('i.rid' => $target_platform,
+ 'r.type' => 'platform',
+ 'n.nid' => $site->profile));
+ if ($profile_instance) {
+ $status = hosting_package_comparison($site->nid, $profile_instance->iid);
+ $batch['form_state']['storage']['status'][$site->nid] = $status;
+ // If there were no errors, this site passes and can be migrated
+ if (!$status['error']) {
+ $batch['form_state']['storage']['passed'][$site->nid] = $site->title;
+ return true;
+ }
+ }
+ $batch['form_state']['storage']['failed'][$site->nid] = $site->title;
+}
+
+/**
+ * Implementation of hook_validate()
+ */
function hosting_task_migrate_form_validate($form, &$form_state) {
if (!$form_state['values']['parameters']['target_platform'] || $form_state['values']['parameters']['hidden']) {
form_set_error('parameters][target_platform', t('You may not select your current platform to migrate your site to.'));
}
}
+/**
+ * Implementation of hook_theme()
+ */
function hosting_migrate_theme($existing, $type, $theme, $path) {
return array(
'hosting_migrate_comparison' => array(
@@ -49,6 +203,9 @@ function hosting_migrate_theme($existing
));
}
+/**
+ * Implementation of hook_form()
+ */
function hosting_task_migrate_form($node) {
$packages = array();
@@ -104,24 +261,11 @@ function hosting_task_migrate_form($node
$form['#node'] = $node;
return $form;
- $table = array();
-
- if (sizeof($options)) {
- $form['target_platform'] = array(
- '#type' => 'radios',
- '#title' => t('Migrate to'),
- '#options' => $options,
- '#required' => TRUE
- );
- }
- else {
- $form['target_text'] = array('#type' => 'item',
- '#value' => t('No valid platforms to migrate to.')
- );
- }
- return $form;
}
+/**
+ * Compare package schema versions between the current and target platform in temp tables
+ */
function hosting_migrate_comparison($current, $target) {
_hosting_package_temporary_table("current", $current);