Issue #2314289 by benjy: Track result of migrations and use it to properly define migrate_dependencies.

8.0.x
Alex Pott 2014-08-11 08:59:58 -05:00
parent cdab062b60
commit 453a4451b7
12 changed files with 94 additions and 18 deletions

View File

@ -1,7 +1,7 @@
# Schema for the configuration files of the Migrate module.
migrate.migration.*:
type: mapping
type: config_entity
label: 'Migration'
mapping:
id:

View File

@ -326,15 +326,7 @@ class Migration extends ConfigEntityBase implements MigrationInterface, Requirem
$required_migrations = \Drupal::entityManager()->getStorage('migration')->loadMultiple($this->requirements);
// Check if the dependencies are in good shape.
foreach ($required_migrations as $required_migration) {
// If the dependent source migration has no IDs then no mappings can
// be recorded thus it is impossible to see whether the migration ran.
if (!$required_migration->getSourcePlugin()->getIds()) {
return FALSE;
}
// If the dependent migration has not processed any record, it means the
// dependency requirements are not met.
if (!$required_migration->getIdMap()->processedCount()) {
if (!$required_migration->isComplete()) {
return FALSE;
}
}
@ -346,4 +338,27 @@ class Migration extends ConfigEntityBase implements MigrationInterface, Requirem
return TRUE;
}
/**
* {@inheritdoc}
*/
public function setMigrationResult($result) {
$migrate_result_store = \Drupal::keyValue('migrate_result');
$migrate_result_store->set($this->id(), $result);
}
/**
* {@inheritdoc}
*/
public function getMigrationResult() {
$migrate_result_store = \Drupal::keyValue('migrate_result');
return $migrate_result_store->get($this->id(), static::RESULT_INCOMPLETE);
}
/**
* {@inheritdoc}
*/
public function isComplete() {
return $this->getMigrationResult() === static::RESULT_COMPLETED;
}
}

View File

@ -102,4 +102,28 @@ interface MigrationInterface extends ConfigEntityInterface {
*/
public function saveHighwater($highwater);
/**
* Check if this migration is complete.
*
* @return bool
* TRUE if this migration is complete otherwise FALSE.
*/
public function isComplete();
/**
* Set the migration result.
*
* @param int $result
* One of the RESULT_* constants.
*/
public function setMigrationResult($result);
/**
* Get the current migration result.
*
* @return int
* The current migration result. Defaults to RESULT_INCOMPLETE.
*/
public function getMigrationResult();
}

View File

@ -21,7 +21,7 @@ class MigrateExecutable {
/**
* The configuration of the migration to do.
*
* @var \Drupal\migrate\Entity\MigrationInterface
* @var \Drupal\migrate\Entity\Migration
*/
protected $migration;
@ -333,6 +333,7 @@ class MigrateExecutable {
*/
#$this->progressMessage($return);
$this->migration->setMigrationResult($return);
return $return;
}

View File

@ -116,6 +116,11 @@ abstract class MigrateTestBase extends WebTestBase implements MigrateMessageInte
$migrations = entity_load_multiple('migration', array_keys($id_mappings));
foreach ($id_mappings as $migration_id => $data) {
$migration = $migrations[$migration_id];
// @TODO, rename prepareIdMappings() in https://drupal.org/node/2315489
// which will make the position of this more appropriate.
$migration->setMigrationResult(MigrationInterface::RESULT_COMPLETED);
$id_map = $migration->getIdMap();
$id_map->setMessage($this);
$source_ids = $migration->getSourcePlugin()->getIds();

View File

@ -84,6 +84,6 @@ process:
destination:
plugin: entity:block
migration_dependencies:
optional:
required:
- d6_menu
- d6_custom_block

View File

@ -48,10 +48,9 @@ process:
destination:
plugin: entity:comment
migration_dependencies:
optional:
- d6_comment_type
required:
- d6_node
- d6_comment_type
- d6_user
- d6_comment_entity_display
- d6_comment_entity_form_display

View File

@ -33,8 +33,7 @@ destination:
migration_dependencies:
required:
- d6_node_type
- d6_node_settings
- d6_filter_format
optional:
- d6_field_instance_widget_settings
- d6_field_formatter_settings
- d6_node_settings

View File

@ -22,3 +22,6 @@ migration_dependencies:
# migration as an optional dependency to ensure it runs first.
optional:
- d6_file
dependencies:
module:
- file

View File

@ -52,7 +52,10 @@ class MigrateBlockTest extends MigrateDrupalTestBase {
array(array(11), array(2)),
array(array(12), array(1)),
array(array(13), array(2)),
)
),
'd6_menu' => array(
array(array('menu1'), array('menu')),
),
));
// Set Bartik and Seven as the default public and admin theme.

View File

@ -8,6 +8,7 @@
namespace Drupal\migrate_drupal\Tests\d6;
use Drupal\migrate_drupal\Tests\MigrateDrupalTestBase;
use Drupal\migrate\Entity\MigrationInterface;
/**
* Base class for Node migration tests.
@ -33,9 +34,24 @@ abstract class MigrateNodeTestBase extends MigrateDrupalTestBase {
array(array(1), array('filtered_html')),
array(array(2), array('full_html')),
),
'd6_field_instance_widget_settings' => array(
array(
array('page', 'field_test'),
array('node', 'page', 'default', 'test'),
),
),
'd6_field_formatter_settings' => array(
array(
array('page', 'default', 'node', 'field_test'),
array('node', 'page', 'default', 'field_test'),
),
),
);
$this->prepareIdMappings($id_mappings);
$migration = entity_load('migration', 'd6_node_settings');
$migration->setMigrationResult(MigrationInterface::RESULT_COMPLETED);
// Create a test node.
$node = entity_create('node', array(
'type' => 'story',

View File

@ -30,7 +30,18 @@ class MigrateDependenciesTest extends MigrateDrupalTestBase {
$migrations = entity_load_multiple('migration', $migration_items);
$expected_order = array('d6_filter_format', 'd6_node', 'd6_comment');
$this->assertEqual(array_keys($migrations), $expected_order);
$expected_requirements = array('d6_node', 'd6_node_type', 'd6_filter_format', 'd6_user', 'd6_comment_entity_display', 'd6_comment_entity_form_display');
$expected_requirements = array(
'd6_node',
'd6_node_type',
'd6_node_settings',
'd6_field_instance_widget_settings',
'd6_field_formatter_settings',
'd6_filter_format',
'd6_user',
'd6_comment_type',
'd6_comment_entity_display',
'd6_comment_entity_form_display',
);
// Migration dependencies for comment include dependencies for node
// migration as well.
$actual_requirements = $migrations['d6_comment']->get('requirements');