migrating to drupal 8
a brief history
drupal.org/upgrade
update vs. upgrade
what types drupal “renewing” we have?
drupal update
drupal update
minor version update
7.24 > 7.25
drupal update
minor version update
7.24 > 7.25

drupal upgrade
drupal update
minor version update
7.24 > 7.25

drupal upgrade
major version upgrade
7.x > 8.x
drupal update
minor version update
7.24 > 7.25

drupal upgrade
major version upgrade
7.x > 8.x
the migrate module
“in service” since 2009

drupal.org/project/migrate
the migrate module
• How it worked?
• Migrations = classes extending Migration.
• Main elements: source, destination, map,...
migrate in D8 core
disclaimer
disclaimer
• the migrate system is under heavy
development right now.
disclaimer
• the migrate system is under heavy
development right now.

• some of the features or APIs may change in
the fu...
disclaimer
• the migrate system is under heavy
development right now.

• some of the features or APIs may change in
the fu...
disclaimer
• the migrate system is under heavy
development right now.

• some of the features or APIs may change in
the fu...
credits
Károly Négyesi (chx)
Mike Ryan (mikeryan)
Moshe Weitzman (moshe weitzman)
Ben Dougherty (benjy)
drupal 8 migration
note
note
• While a significant portion of the code and
the interaction between the elements is
brand new, the actual migrate-y ...
note
• While a significant portion of the code and
the interaction between the elements is
brand new, the actual migrate-y ...
structure/modules
Migrate
core/modules/migrate/
Migrate
core/modules/migrate/

• provides general API for all migrations
Migrate
core/modules/migrate/

• provides general API for all migrations
• provides interfaces and base classes for all

m...
Migrate
core/modules/migrate/

• provides general API for all migrations
• provides interfaces and base classes for all

m...
Migrate
core/modules/migrate/

• provides general API for all migrations
• provides interfaces and base classes for all

m...
Migrate Drupal
core/modules/migrate_drupal/
Migrate Drupal
core/modules/migrate_drupal/

• the first module using the new Migrate API.
Migrate Drupal
core/modules/migrate_drupal/

• the first module using the new Migrate API.
• kind of migrate_d2d successor.
Migrate Drupal
core/modules/migrate_drupal/

• the first module using the new Migrate API.
• kind of migrate_d2d successor....
Migrate Drupal
core/modules/migrate_drupal/

• the first module using the new Migrate API.
• kind of migrate_d2d successor....
Migrate Drupal
core/modules/migrate_drupal/

• the first module using the new Migrate API.
• kind of migrate_d2d successor....
Migrate Drupal
core/modules/migrate_drupal/

• the first module using the new Migrate API.
• kind of migrate_d2d successor....
Migrate Drupal
core/modules/migrate_drupal/

• the first module using the new Migrate API.
• kind of migrate_d2d successor....
understanding migrations
migrations are configurables
small peek
into configurables
what is a configurable?
what is a configurable?
• “Configurables” are migrations entities.
what is a configurable?
• “Configurables” are migrations entities.
• In Drupal 8 the content is separated from

configuration...
what is a configurable?
• “Configurables” are migrations entities.
• In Drupal 8 the content is separated from

configuration...
what is a configurable?
• “Configurables” are migrations entities.
• In Drupal 8 the content is separated from

configuration...
what is a configurable?
• “Configurables” are migrations entities.
• In Drupal 8 the content is separated from

configuration...
what is a configurable?
• “Configurables” are migrations entities.
• In Drupal 8 the content is separated from

configuration...
what is a configurable?
•
•
•
•

A configurable is the way Drupal 8 stores the
configuration of a specific functionality. E.g....
what is a configurable?
how it’s stored?
example
migration plugins
parts implemented by specific migrations
source plugins
• plugins returning information and data from
the source of migration.

• usually: the list of fields, the s...
destination plugins
• are handling data at the destination: import,
rollback.

• different plugins for different destinati...
id map plugin
• plugins of this type are handling and storing the
•
•
•

relation between primary IDs of source and
destin...
processors
• plugins that are performing small but very specialized
operations against values to be migrated.

• Some simp...
the anatomy of a migration
migrating user roles from a dupal 6 site
creating the config file
config/migrate.migration.d6_user_role.yml

relative to core/modules/migrate_drupal
config .yml file content
config .yml file content
• id: same as the last part of filename (d6_user_role)
config .yml file content
• id: same as the last part of filename (d6_user_role)
• sourceIds: Source fields, providing a primar...
config .yml file content
• id: same as the last part of filename (d6_user_role)
• sourceIds: Source fields, providing a primar...
config .yml file content
• id: same as the last part of filename (d6_user_role)
• sourceIds: Source fields, providing a primar...
config .yml file content
• id: same as the last part of filename (d6_user_role)
• sourceIds: Source fields, providing a primar...
id
id
• this is the configurable unique id.
id
• this is the configurable unique id.
• it must be exactly as the same as the last
part of filename: d6_user_role.
id
• this is the configurable unique id.
• it must be exactly as the same as the last
part of filename: d6_user_role.

id: d...
sourceIds
sourceIds
• look in D6 schema to find the role primary ID.
sourceIds
• look in D6 schema to find the role primary ID.
• lines 107 - 115 of drupal/modules/user/user.install.
sourceIds
• look in D6 schema to find the role primary ID.
• lines 107 - 115 of drupal/modules/user/user.install.
$schema['...
sourceIds
sourceIds
• use TypedData identifiers for data type.
sourceIds
• use TypedData identifiers for data type.
• Here are the .yml lines that we need to add.
sourceIds
• use TypedData identifiers for data type.
• Here are the .yml lines that we need to add.
sourceIds: 
  rid:
    ...
sourceIds
• use TypedData identifiers for data type.
• Here are the .yml lines that we need to add.
sourceIds: 
  rid:
    ...
source
source
• we need to implement a source plugin first, that
provides the list of fields and the iterator by
querying the D6 ba...
source
• we need to implement a source plugin first, that
provides the list of fields and the iterator by
querying the D6 ba...
source
• we need to implement a source plugin first, that
provides the list of fields and the iterator by
querying the D6 ba...
source
• we need to implement a source plugin first, that
provides the list of fields and the iterator by
querying the D6 ba...
process
process
• process keys are destination “fields”.
process
• process keys are destination “fields”.
• for configurables: the public properties (except uuid)
process
• process keys are destination “fields”.
• for configurables: the public properties (except uuid)
• for content: the...
process
• process keys are destination “fields”.
• for configurables: the public properties (except uuid)
• for content: the...
process
• process keys are destination “fields”.
• for configurables: the public properties (except uuid)
• for content: the...
destination
destination
• should point to the destination plugin.
destination
• should point to the destination plugin.
• in this case we’re importing into user_role entity,
so we’re passi...
destination
• should point to the destination plugin.
• in this case we’re importing into user_role entity,
so we’re passi...
running a migration
• via drush
• There will be a brief UI implemented in
core (to come!)
final notes
final notes

• Minor version updates are unchanged. Developers
continue to use hook_update_N() for those.
final notes

• Minor version updates are unchanged. Developers
continue to use hook_update_N() for those.

• Contrib and cu...
final notes

• Minor version updates are unchanged. Developers
continue to use hook_update_N() for those.

• Contrib and cu...
final notes

• Minor version updates are unchanged. Developers
continue to use hook_update_N() for those.

• Contrib and cu...
Questions?
Thank you.
Migrating to Drupal 8
Upcoming SlideShare
Loading in...5
×

Migrating to Drupal 8

229

Published on

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
229
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
9
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Migrating to Drupal 8

  1. 1. migrating to drupal 8
  2. 2. a brief history drupal.org/upgrade
  3. 3. update vs. upgrade what types drupal “renewing” we have?
  4. 4. drupal update
  5. 5. drupal update minor version update 7.24 > 7.25
  6. 6. drupal update minor version update 7.24 > 7.25 drupal upgrade
  7. 7. drupal update minor version update 7.24 > 7.25 drupal upgrade major version upgrade 7.x > 8.x
  8. 8. drupal update minor version update 7.24 > 7.25 drupal upgrade major version upgrade 7.x > 8.x
  9. 9. the migrate module “in service” since 2009 drupal.org/project/migrate
  10. 10. the migrate module • How it worked? • Migrations = classes extending Migration. • Main elements: source, destination, map, mappings, “hooks” (prepareRow, prepare, complete, createStub, etc). • Each migration has to extend the Migration class or one of its successors.
  11. 11. migrate in D8 core
  12. 12. disclaimer
  13. 13. disclaimer • the migrate system is under heavy development right now.
  14. 14. disclaimer • the migrate system is under heavy development right now. • some of the features or APIs may change in the future
  15. 15. disclaimer • the migrate system is under heavy development right now. • some of the features or APIs may change in the future • not all the current work is pushed to 8.x.
  16. 16. disclaimer • the migrate system is under heavy development right now. • some of the features or APIs may change in the future • not all the current work is pushed to 8.x. • The work is in the sandbox at https://drupal.org/sandbox/chx/2105305
  17. 17. credits Károly Négyesi (chx) Mike Ryan (mikeryan) Moshe Weitzman (moshe weitzman) Ben Dougherty (benjy)
  18. 18. drupal 8 migration
  19. 19. note
  20. 20. note • While a significant portion of the code and the interaction between the elements is brand new, the actual migrate-y code is coming straight from D7: highwater marks, track changes, id map, this is here to
  21. 21. note • While a significant portion of the code and the interaction between the elements is brand new, the actual migrate-y code is coming straight from D7: highwater marks, track changes, id map, this is here to • The new interaction allows for really nice and powerful migrations but at the same time we are most definitely not reinventing wheel.
  22. 22. structure/modules
  23. 23. Migrate core/modules/migrate/
  24. 24. Migrate core/modules/migrate/ • provides general API for all migrations
  25. 25. Migrate core/modules/migrate/ • provides general API for all migrations • provides interfaces and base classes for all migration plugin components (source, destination, process, id_map, row).
  26. 26. Migrate core/modules/migrate/ • provides general API for all migrations • provides interfaces and base classes for all migration plugin components (source, destination, process, id_map, row). • provides a plugin manager for manipulation on migration plugins.
  27. 27. Migrate core/modules/migrate/ • provides general API for all migrations • provides interfaces and base classes for all migration plugin components (source, destination, process, id_map, row). • provides a plugin manager for manipulation on migration plugins. • provides the migrate configurable (configuration entity type).
  28. 28. Migrate Drupal core/modules/migrate_drupal/
  29. 29. Migrate Drupal core/modules/migrate_drupal/ • the first module using the new Migrate API.
  30. 30. Migrate Drupal core/modules/migrate_drupal/ • the first module using the new Migrate API. • kind of migrate_d2d successor.
  31. 31. Migrate Drupal core/modules/migrate_drupal/ • the first module using the new Migrate API. • kind of migrate_d2d successor. • migrates out-of-the-box from Drupal 6 and 7 into Drupal 8.
  32. 32. Migrate Drupal core/modules/migrate_drupal/ • the first module using the new Migrate API. • kind of migrate_d2d successor. • migrates out-of-the-box from Drupal 6 and 7 into Drupal 8. • Defines migrations for all system components:
  33. 33. Migrate Drupal core/modules/migrate_drupal/ • the first module using the new Migrate API. • kind of migrate_d2d successor. • migrates out-of-the-box from Drupal 6 and 7 into Drupal 8. • Defines migrations for all system components: • Drupal 6 settings (site name, slogan, roles, etc)
  34. 34. Migrate Drupal core/modules/migrate_drupal/ • the first module using the new Migrate API. • kind of migrate_d2d successor. • migrates out-of-the-box from Drupal 6 and 7 into Drupal 8. • Defines migrations for all system components: • Drupal 6 settings (site name, slogan, roles, etc) • Content definitions (vocabularies, node types, etc)
  35. 35. Migrate Drupal core/modules/migrate_drupal/ • the first module using the new Migrate API. • kind of migrate_d2d successor. • migrates out-of-the-box from Drupal 6 and 7 into Drupal 8. • Defines migrations for all system components: • Drupal 6 settings (site name, slogan, roles, etc) • Content definitions (vocabularies, node types, etc) • Content (noded, terms, users, etc).
  36. 36. understanding migrations
  37. 37. migrations are configurables
  38. 38. small peek into configurables
  39. 39. what is a configurable?
  40. 40. what is a configurable? • “Configurables” are migrations entities.
  41. 41. what is a configurable? • “Configurables” are migrations entities. • In Drupal 8 the content is separated from configuration. Both are classes and are sharing the same ancestor: the Entity class.
  42. 42. what is a configurable? • “Configurables” are migrations entities. • In Drupal 8 the content is separated from configuration. Both are classes and are sharing the same ancestor: the Entity class. DrupalCoreEntityEntity
  43. 43. what is a configurable? • “Configurables” are migrations entities. • In Drupal 8 the content is separated from configuration. Both are classes and are sharing the same ancestor: the Entity class. DrupalCoreEntityContentEntityBase DrupalCoreEntityEntity
  44. 44. what is a configurable? • “Configurables” are migrations entities. • In Drupal 8 the content is separated from configuration. Both are classes and are sharing the same ancestor: the Entity class. DrupalCoreEntityContentEntityBase DrupalCoreEntityEntity DrupalCoreConfigConfigEntityBase
  45. 45. what is a configurable? • “Configurables” are migrations entities. • In Drupal 8 the content is separated from configuration. Both are classes and are sharing the same ancestor: the Entity class. DrupalCoreEntityContentEntityBase DrupalCoreEntityEntity DrupalCoreConfigConfigEntityBase
  46. 46. what is a configurable? • • • • A configurable is the way Drupal 8 stores the configuration of a specific functionality. E.g. the the definition of a node type is stored in a configuration entity of type “node_type”. Configuration entity types are annotated classes, meaning that the object meta information is stored in annotation rather than in info hooks - as it was in Drupal <= 7. Imagine configurables as entities storing their data in config YAML files rather than DB. The “fields” of a configurable are the public properties exposed by the configurable object.
  47. 47. what is a configurable?
  48. 48. how it’s stored? example
  49. 49. migration plugins parts implemented by specific migrations
  50. 50. source plugins • plugins returning information and data from the source of migration. • usually: the list of fields, the source iterator (used retrieve data from source). • each migration should configure a source.
  51. 51. destination plugins • are handling data at the destination: import, rollback. • different plugins for different destination components: entity, config, etc. • are defined in the base module (migrate) as destination is always drupal 8 but if necessary it can be extended. • each migration should specify a destination.
  52. 52. id map plugin • plugins of this type are handling and storing the • • • relation between primary IDs of source and destination. without this, rollback and continuous migrations are impossible. in 99% of the cases you’ll use the sql id map plugin (Sql) that keeps the map of each migration in a table. table name migrate_map_MIGRATION_ID
  53. 53. processors • plugins that are performing small but very specialized operations against values to be migrated. • Some simple examples: DefaultValue, Concat, etc. • The most important interface method: transform().
  54. 54. the anatomy of a migration migrating user roles from a dupal 6 site
  55. 55. creating the config file config/migrate.migration.d6_user_role.yml relative to core/modules/migrate_drupal
  56. 56. config .yml file content
  57. 57. config .yml file content • id: same as the last part of filename (d6_user_role)
  58. 58. config .yml file content • id: same as the last part of filename (d6_user_role) • sourceIds: Source fields, providing a primary ID.
  59. 59. config .yml file content • id: same as the last part of filename (d6_user_role) • sourceIds: Source fields, providing a primary ID. • source: configure the source of data, usually the source plugin to be used
  60. 60. config .yml file content • id: same as the last part of filename (d6_user_role) • sourceIds: Source fields, providing a primary ID. • source: configure the source of data, usually the source plugin to be used • process: describe the list of processors to be applied per destination field.
  61. 61. config .yml file content • id: same as the last part of filename (d6_user_role) • sourceIds: Source fields, providing a primary ID. • source: configure the source of data, usually the source plugin to be used • process: describe the list of processors to be applied per destination field. • destination: destination configuration, usually the destination plugin.
  62. 62. id
  63. 63. id • this is the configurable unique id.
  64. 64. id • this is the configurable unique id. • it must be exactly as the same as the last part of filename: d6_user_role.
  65. 65. id • this is the configurable unique id. • it must be exactly as the same as the last part of filename: d6_user_role. id: d6_user_role
  66. 66. sourceIds
  67. 67. sourceIds • look in D6 schema to find the role primary ID.
  68. 68. sourceIds • look in D6 schema to find the role primary ID. • lines 107 - 115 of drupal/modules/user/user.install.
  69. 69. sourceIds • look in D6 schema to find the role primary ID. • lines 107 - 115 of drupal/modules/user/user.install. $schema['role'] = array( 'description' => 'Stores user roles.',   'fields' => array(    'rid' => array(     'type' => 'serial',     'unsigned' => TRUE,     'not null' => TRUE,     'description' => 'Primary Key: Unique role id.',
  70. 70. sourceIds
  71. 71. sourceIds • use TypedData identifiers for data type.
  72. 72. sourceIds • use TypedData identifiers for data type. • Here are the .yml lines that we need to add.
  73. 73. sourceIds • use TypedData identifiers for data type. • Here are the .yml lines that we need to add. sourceIds:    rid:     type: integer
  74. 74. sourceIds • use TypedData identifiers for data type. • Here are the .yml lines that we need to add. sourceIds:    rid:     type: integer Note: sourceIds will be removed in the near future and the source plugin will set also the primary id.
  75. 75. source
  76. 76. source • we need to implement a source plugin first, that provides the list of fields and the iterator by querying the D6 backend.
  77. 77. source • we need to implement a source plugin first, that provides the list of fields and the iterator by querying the D6 backend. • let’s see how it should look (code).
  78. 78. source • we need to implement a source plugin first, that provides the list of fields and the iterator by querying the D6 backend. • let’s see how it should look (code). • add the source plugin id in the configuration .yml file.
  79. 79. source • we need to implement a source plugin first, that provides the list of fields and the iterator by querying the D6 backend. • let’s see how it should look (code). • add the source plugin id in the configuration .yml file. source:   plugin: drupal6_user_role
  80. 80. process
  81. 81. process • process keys are destination “fields”.
  82. 82. process • process keys are destination “fields”. • for configurables: the public properties (except uuid)
  83. 83. process • process keys are destination “fields”. • for configurables: the public properties (except uuid) • for content: the keys from baseFieldDefinitions
  84. 84. process • process keys are destination “fields”. • for configurables: the public properties (except uuid) • for content: the keys from baseFieldDefinitions • let’s see how it looks! (code).
  85. 85. process • process keys are destination “fields”. • for configurables: the public properties (except uuid) • for content: the keys from baseFieldDefinitions • let’s see how it looks! (code). process:   id:   label:   weight:   permissions:
  86. 86. destination
  87. 87. destination • should point to the destination plugin.
  88. 88. destination • should point to the destination plugin. • in this case we’re importing into user_role entity, so we’re passing also the entity_type argument.
  89. 89. destination • should point to the destination plugin. • in this case we’re importing into user_role entity, so we’re passing also the entity_type argument. destination: plugin: entity entity_type: user_role
  90. 90. running a migration • via drush • There will be a brief UI implemented in core (to come!)
  91. 91. final notes
  92. 92. final notes • Minor version updates are unchanged. Developers continue to use hook_update_N() for those.
  93. 93. final notes • Minor version updates are unchanged. Developers continue to use hook_update_N() for those. • Contrib and custom modules are encouraged to ship with migrations of their data from D6/D7 to D8. Use core modules as model.
  94. 94. final notes • Minor version updates are unchanged. Developers continue to use hook_update_N() for those. • Contrib and custom modules are encouraged to ship with migrations of their data from D6/D7 to D8. Use core modules as model. • The underlying Migrate API is source-agnostic.You can easily migrate into D8 from MS SQL, Oracle, piles of HTML files, XML feeds, CSV files, etc.
  95. 95. final notes • Minor version updates are unchanged. Developers continue to use hook_update_N() for those. • Contrib and custom modules are encouraged to ship with migrations of their data from D6/D7 to D8. Use core modules as model. • The underlying Migrate API is source-agnostic.You can easily migrate into D8 from MS SQL, Oracle, piles of HTML files, XML feeds, CSV files, etc. • Similarly, Drupal 4.x and Drupal 5.x sites are able to migrate using this same approach.
  96. 96. Questions? Thank you.
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×