Skip to content

Commit a8d8389

Browse files
memtkmcchelmo
authored andcommitted
Issue #2798127 by memtkmcc: Improve Migrate task reliability with extra sub-tasks and fixes (BOA unfork)
1 parent 948ef85 commit a8d8389

File tree

1 file changed

+103
-6
lines changed

1 file changed

+103
-6
lines changed

platform/migrate.provision.inc

Lines changed: 103 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -77,11 +77,82 @@ function drush_provision_drupal_provision_migrate($platform, $new_name = NULL) {
7777
$options = array();
7878
$options['uri'] = d()->uri;
7979

80+
// If the site is migrated between platforms and not just renamed,
81+
// we should update the info collected about source and target platform first.
82+
// Note that we have to exclude Hostmaster platform from this extra verify.
83+
if (d()->profile != 'hostmaster') {
84+
if (!is_null(d($platform)->name) && (d($platform)->name != d()->platform->name)) {
85+
provision_backend_invoke('@hostmaster', 'hosting-task', array(d()->platform->name, 'verify'), array('force' => TRUE));
86+
sleep(5); // A small trick to avoid high load and race conditions.
87+
provision_backend_invoke('@hostmaster', 'hosting-task', array(d($platform)->name, 'verify'), array('force' => TRUE));
88+
sleep(5); // A small trick to avoid high load and race conditions.
89+
}
90+
}
91+
8092
if (!is_null($new_name) && ($new_name != d()->name)) {
8193
$options = d()->options;
8294
$options['uri'] = ltrim($new_name, '@');
8395
$hash_name = drush_get_option('#name') ? '#name' : 'name';
8496
$options[$hash_name] = $new_name;
97+
$new_aliases = array();
98+
$old_aliases = (is_array($options['aliases'])) ? $options['aliases'] : FALSE;
99+
$pre_old_uri = ltrim(d()->uri, '@');
100+
$pre_new_uri = ltrim($new_name, '@');
101+
$raw_old_uri = preg_replace('/^www\./', '', $pre_old_uri);
102+
$raw_new_uri = preg_replace('/^www\./', '', $pre_new_uri);
103+
$www_old_uri = "www." . $raw_old_uri;
104+
$www_new_uri = "www." . $raw_new_uri;
105+
if (is_array($old_aliases) && !empty($old_aliases)) {
106+
foreach ($old_aliases as $alias) {
107+
drush_log(dt("DEBUG RENAME old_aliases is @this", array('@this' => $alias)));
108+
if (!preg_match("/^www\./", $pre_old_uri) && preg_match("/^www\./", $pre_new_uri)) {
109+
$new_aliases[] = str_replace($www_old_uri, $raw_new_uri, $alias);
110+
}
111+
elseif (preg_match("/^www\./", $pre_old_uri) && !preg_match("/^www\./", $pre_new_uri)) {
112+
$new_aliases[] = str_replace($raw_old_uri, $www_new_uri, $alias);
113+
}
114+
elseif (!preg_match("/^www\./", $pre_old_uri) && !preg_match("/^www\./", $pre_new_uri)) {
115+
$new_aliases[] = str_replace($www_old_uri, $www_new_uri, $alias);
116+
}
117+
elseif (preg_match("/^www\./", $pre_old_uri) && preg_match("/^www\./", $pre_new_uri)) {
118+
$new_aliases[] = str_replace($raw_old_uri, $raw_new_uri, $alias);
119+
}
120+
}
121+
$unique_aliases = array_unique($new_aliases); // Make sure there are no duplicates.
122+
$options['aliases'] = array(); // Reset original aliases array.
123+
$options['aliases'] = $unique_aliases; // Use rewritten aliases array.
124+
if (!is_null(d($platform)->name) && (d($platform)->name == d()->platform->name)) {
125+
drush_set_option('rename_only', TRUE);
126+
foreach ($new_aliases as $alias) {
127+
drush_log(dt("DEBUG RENAME new_aliases is @this", array('@this' => $alias)));
128+
}
129+
foreach ($unique_aliases as $alias) {
130+
drush_log(dt("DEBUG RENAME unique_aliases is @this", array('@this' => $alias)));
131+
}
132+
}
133+
drush_set_option('aliases', $unique_aliases);
134+
}
135+
else {
136+
$detected_aliases = provision_drupal_find_aliases();
137+
foreach ($detected_aliases as $alias) {
138+
drush_log(dt("DEBUG RENAME detected_aliases is @this", array('@this' => $alias)));
139+
}
140+
drush_set_option('aliases', $detected_aliases);
141+
}
142+
// Warning: do not try to re-verify the original site here
143+
// even with backend-only verify, because it would create
144+
// (and never delete) duplicate vhost with old domain
145+
// and all aliases included - see issue #1067702.
146+
}
147+
else {
148+
// We have to exclude Hostmaster site from any extra verify steps.
149+
if (d()->profile != 'hostmaster') {
150+
// We should update also the info collected about the site before running migrate task.
151+
// Doing this is safe only when the site is migrated with the same name - see issue #1067702.
152+
$local_uri_verify = '@' . d()->uri;
153+
provision_backend_invoke('@hostmaster', 'hosting-task', array($local_uri_verify, 'verify'), array('force' => TRUE));
154+
sleep(5); // A small trick to avoid high load and race conditions.
155+
}
85156
}
86157
$options['platform'] = $platform;
87158
$options['root'] = d($platform)->root;
@@ -140,17 +211,43 @@ function drush_provision_drupal_post_provision_migrate($platform, $new_name = NU
140211
d()->service('http')->sync(d()->site_path);
141212
}
142213

143-
144-
145214
if (!is_null($new_name) && ($new_name != d()->name)) {
146-
// remove the existing alias
215+
// Use correct context for cleanup operations.
216+
$source_name = drush_get_option('source_name');
217+
drush_log(dt("DEBUG RENAME source_name is @this", array('@this' => $source_name)));
218+
// Remove the existing drush alias.
147219
$config = new Provision_Config_Drushrc_Alias(d()->name);
148220
$config->unlink();
149-
221+
// Delete the old site directory.
222+
_provision_recursive_delete(d($source_name)->site_path);
223+
d()->service('http')->sync(d($source_name)->site_path);
224+
// Remove old site name aliases.
225+
_provision_drupal_delete_aliases();
150226
// Remove the symlink in the clients directory.
151227
_provision_client_delete_symlink();
152228
}
153229

154-
// Load the config file of the newly migrated site and return it to hosting.
155-
provision_reload_config('site', drush_get_option('new_site_path', d()->site_path) . '/drushrc.php');
230+
$rename_only = drush_get_option('rename_only');
231+
if ($rename_only) {
232+
// We run this extra tricky backend verify to avoid issue #1004526.
233+
if (d()->profile != 'hostmaster') {
234+
drush_log(dt("DEBUG RENAME new_uri is @this", array('@this' => $new_name)));
235+
$deploy_replace_site = drush_get_option('deploy_replace_site');
236+
drush_log(dt("DEBUG RENAME deploy_replace_site is @this", array('@this' => $deploy_replace_site)));
237+
$final_aliases = drush_get_option('aliases');
238+
foreach ($final_aliases as $alias) {
239+
drush_log(dt("DEBUG RENAME final_aliases is @this", array('@this' => $alias)));
240+
}
241+
provision_reload_config('site', drush_get_option('new_site_path', d($new_name)->site_path) . '/drushrc.php');
242+
d($new_name)->aliases = drush_set_option('aliases', $final_aliases);
243+
d($new_name)->write_alias();
244+
drush_set_option('aliases', drush_get_option('aliases'), 'site');
245+
drush_set_option('provision_save_config', false);
246+
provision_backend_invoke($new_name, 'provision-verify');
247+
}
248+
}
249+
else {
250+
// Load the config file of the newly migrated site and return it to hosting.
251+
provision_reload_config('site', drush_get_option('new_site_path', d()->site_path) . '/drushrc.php');
252+
}
156253
}

0 commit comments

Comments
 (0)