cloud-8.x-2.0-beta1/modules/cloud_service_providers/aws_cloud/aws_cloud.install

modules/cloud_service_providers/aws_cloud/aws_cloud.install
<?php

/**
 * @file
 * Install and updates for aws_cloud.
 */

use Drupal\Core\Config\FileStorage;
use Drupal\field\Entity\FieldConfig;
use Drupal\field\Entity\FieldStorageConfig;
use Drupal\Core\Field\BaseFieldDefinition;

use Drupal\aws_cloud\Service\Pricing\PricingService;

/**
 * Implements hook_uninstall().
 */
function aws_cloud_uninstall() {

  $entity_type_manager = \Drupal::entityTypeManager();

  // Delete all aws_cloud cloud_config entities.
  $entities = $entity_type_manager
    ->getStorage('cloud_config')
    ->loadByProperties(
      [
        'type' => 'aws_ec2',
      ]
    );

  if (!empty($entities)) {
    $entity_type_manager->getStorage('cloud_config')->delete($entities);
  }

  // Delete the aws_cloud entity type.
  $entity_type = $entity_type_manager
    ->getStorage('cloud_config_type')
    ->load('aws_ec2');

  if (!empty($entity_type)) {
    $entity_type->delete();
  }

  // Rebuild caches.
  drupal_flush_all_caches();
}

/**
 * Add the termination_timestamp field to aws_cloud_instance.
 *
 * Backup database before running this update.
 * This applies updates to the entity tables.
 */
function aws_cloud_update_8101() {
  aws_cloud_update_entity_definitions();
}

/**
 * Set timestamp values with 0 to NULL.
 *
 * This will make the Timestamp widget display blank instead of
 * the current date.
 */
function aws_cloud_update_8102() {
  \Drupal::database()
    ->query("UPDATE {aws_cloud_instance} set termination_timestamp = NULL where termination_timestamp = 0")
    ->execute();
}

/**
 * Add notification configurations.
 */
function aws_cloud_update_8103() {
  $config_factory = \Drupal::configFactory();
  $config = $config_factory->getEditable('aws_cloud.settings');
  $config->set('aws_cloud_notification_frequency', 86400);
  $config->set('aws_cloud_notification', 0);
  $config->set('aws_cloud_notification_criteria', 30);
  $config->set('aws_cloud_notification_subject', '[aws_cloud_instance:name] has been running for since [aws_cloud_instance:launch_time]');
  $config->set('aws_cloud_notification_msg', "Your instance [aws_cloud_instance:name] has been running since [aws_cloud_instance:launch_time].  Please review if the instance still needs to be running.");
  $config->save();
}

/**
 * Add automatically terminating instance configurations.
 */
function aws_cloud_update_8104() {
  $config_factory = \Drupal::configFactory();
  $config = $config_factory->getEditable('aws_cloud.settings');
  $config->set('aws_cloud_instance_terminate', FALSE);  $config->save();
}

/**
 * Add field_vpc and field_subnet.
 */
function aws_cloud_update_8105() {
  aws_cloud_add_fields('cloud_server_template', 'aws_cloud', ['field_vpc', 'field_subnet']);
}

/**
 * Add support for AWS Instance Scheduler.
 *
 * This update runs entity db update.
 * Backup database before running this update.
 */
function aws_cloud_update_8106() {
  aws_cloud_update_entity_definitions();

  $config_factory = \Drupal::configFactory();
  $config = $config_factory->getEditable('aws_cloud.settings');
  $config->set('aws_cloud_scheduler_tag', 'Schedule');
  $config->save();
}

/**
 * Add schedule field to aws_cloud server template implementation.
 */
function aws_cloud_update_8107() {
  aws_cloud_add_fields('cloud_server_template', 'aws_cloud', 'field_schedule');
}

/**
 * Add snapshot_name to entity volume.
 */
function aws_cloud_update_8108() {
  aws_cloud_update_entity_definitions();
}

/**
 * Add a link to EBS snapshot detail page for field name in snapshot list page.
 */
function aws_cloud_update_8109() {
  $config_factory = \Drupal::configFactory();
  $view = $config_factory->getEditable('views.view.aws_snapshot');
  $view->set('display.default.display_options.fields.name.settings.link_to_entity', TRUE);
  $view->save(TRUE);
}

/**
 * Make following fields required.
 *
 * Field_min_count, field_availability_zone, field_vpc, field_subnet,
 * field_security_group, field_ssh_key.
 *
 * Change label of field_network.
 */
function aws_cloud_update_8110() {
  $field_names = [
    'field_min_count',
    'field_availability_zone',
    'field_vpc',
    'field_subnet',
    'field_security_group',
    'field_ssh_key',
  ];
  $config_factory = \Drupal::configFactory();

  foreach ($field_names as $field_name) {
    $field = $config_factory->getEditable("field.field.cloud_server_template.aws_cloud.$field_name");
    $field->set('required', TRUE);
    $field->save(TRUE);
  }

  $field = $config_factory->getEditable("field.field.cloud_server_template.aws_cloud.field_network");
  $field->set('label', t('Network Interface'));
  $field->save(TRUE);
}

/**
 * Delete owner from entity network interface.
 */
function aws_cloud_update_8111() {
  aws_cloud_update_entity_definitions();
}

/**
 * Add IP Permissions field to aws_cloud_security_group.
 *
 * This update runs entity db update. Backup database before
 * running this update.
 */
function aws_cloud_update_8112() {
  aws_cloud_update_entity_definitions();
}

/**
 * Delete Eucalyptus from field_cloud_type.
 */
function aws_cloud_update_8113() {
  $config_factory = \Drupal::configFactory();
  $field = $config_factory->getEditable("field.storage.cloud_config.field_cloud_type");
  $allowed_values = $field->get('settings.allowed_values');
  $new_allowed_values = [];
  foreach ($allowed_values as $allowed_value) {
    if ($allowed_value['value'] == 'eucalyptus') {
      continue;
    }

    $new_allowed_values[] = $allowed_value;
  }
  $field->set('settings.allowed_values', $new_allowed_values);
  $field->save(TRUE);
}

/**
 * Clean up the aws_cloud_instance_types configuration field.
 *
 * The instance_types are now being pulled from an EC2 pricing endpoint.
 */
function aws_cloud_update_8114() {
  $config = \Drupal::configFactory()->getEditable('aws_cloud.settings');
  $config->clear('aws_cloud_instance_types')->save();
}

/**
 * Add Tags field to aws_cloud_instance and update instances.
 */
function aws_cloud_update_8115() {
  aws_cloud_update_entity_definitions();

  /* @var \Drupal\aws_cloud\Service\Ec2\Ec2ServiceInterface $ec2_service */
  $ec2_service = \Drupal::service('aws_cloud.ec2');
  $entities = \Drupal::service('plugin.manager.cloud_config_plugin')->loadConfigEntities('aws_ec2');

  foreach ($entities as $entity) {
    /* @var \Drupal\cloud\Entity\CloudConfig $entity */
    $ec2_service->setCloudContext($entity->getCloudContext());

    $ec2_service->updateInstances();
  }
}

/**
 * Update allowed values and allowed values function of the following fields.
 *
 * The fields are: field_api_endpoint_uri, field_image_upload_url and
 * field_region.
 */
function aws_cloud_update_8116() {
  $field_config_names = [
    'field.storage.cloud_config.field_api_endpoint_uri',
    'field.storage.cloud_config.field_image_upload_url',
    'field.storage.cloud_config.field_region',
  ];

  $config_path = drupal_get_path('module', 'aws_cloud') . '/config/install';
  $source = new FileStorage($config_path);
  $config_factory = \Drupal::configFactory();
  foreach ($field_config_names as $field_config_name) {

    // Read allowed values from the config file.
    $field_config = $source->read($field_config_name);
    $allowed_values = $field_config['settings']['allowed_values'];
    $allowed_values_function = $field_config['settings']['allowed_values_function'];

    // Update allowed values.
    $field = $config_factory->getEditable($field_config_name);
    $field->set('settings.allowed_values', $allowed_values);
    $field->set('settings.allowed_values_function', $allowed_values_function);
    $field->save(TRUE);
  }
}

/**
 * Add field_termination_protection to aws_cloud server template implementation.
 */
function aws_cloud_update_8117() {
  aws_cloud_add_fields('cloud_server_template', 'aws_cloud', 'field_termination_protection');
}

/**
 * Add field_iam_role to aws_cloud server template implementation.
 */
function aws_cloud_update_8118() {
  aws_cloud_add_fields('cloud_server_template', 'aws_cloud', 'field_iam_role');
}

/**
 * Add Secondary Association ID field to Network Interfaces.
 *
 * Update Elastic IP views title.
 */
function aws_cloud_update_8119() {
  aws_cloud_update_entity_definitions();

  $files = [
    'views.view.aws_elastic_ip.yml',
  ];
  cloud_update_yml_definitions($files, 'aws_cloud');
}

/**
 * Add configuration item aws_cloud_view_refresh_interval.
 */
function aws_cloud_update_8120() {
  aws_cloud_update_entity_definitions();

  $config_factory = \Drupal::configFactory();
  $config = $config_factory->getEditable('aws_cloud.settings');
  $config->set('aws_cloud_view_refresh_interval', 10);
  $config->save();
}

/**
 * Update display settings of field_instance_type.
 *
 * Change the label setting from above to inline
 * and change type setting from list_default to list_key.
 */
function aws_cloud_update_8121() {
  $config_factory = \Drupal::configFactory();
  $template = $config_factory->getEditable('core.entity_view_display.cloud_server_template.aws_cloud.default');
  $template->set('content.field_instance_type.label', 'inline');
  $template->set('content.field_instance_type.type', 'list_key');
  $template->save(TRUE);
}

/**
 * Update cloud_config entities and write their credentials to an ini file.
 */
function aws_cloud_update_8122() {
  // Add new fields.
  aws_cloud_add_fields(
    'cloud_config',
    'aws_ec2',
    [
      'field_assume_role',
      'field_iam_role',
      'field_use_instance_credentials',
    ]
  );

  // Update description on access key ID, secret access key.
  $config_factory = \Drupal::configFactory();

  $field = $config_factory->getEditable("field.field.cloud_config.aws_ec2.field_secret_key");
  $field->set('label', 'Secret Access Key');
  $field->set('description', "e.g. 123ABC/defGHIjkl34+LMNopq567RSTuvwxYz89Z 16-32 Characters.  If <em>Assume Role</em> is selected, enter the secret access key of the child user.");
  $field->set('required', FALSE);
  $field->save(TRUE);

  $field = $config_factory->getEditable("field.field.cloud_config.aws_ec2.field_access_key");
  $field->set('label', 'Access Key ID');
  $field->set('description', "16-32 Characters, e.g. 12ABCDEFGHIJKVWXYZ89.  If <em>Assume Role</em> is selected, enter the access key ID of the child user.");
  $field->set('required', FALSE);
  $field->save(TRUE);

  // Update any existing entities.
  $entities = \Drupal::service('plugin.manager.cloud_config_plugin')->loadConfigEntities('aws_ec2');
  foreach ($entities as $entity) {
    // The presave hook takes care of writing the credential file.
    $entity->save();
  }
}

/**
 * Update fields due to refactoring.
 *
 * 1. Migrate field_user_id to field_account_id.
 * 2. Migrate field owner of following entity type to account_id,
 *   Instance,
 *   NetworkInterface,
 *   Snapshot,
 *   Image.
 */
function aws_cloud_update_8123() {
  // Add field_account_id.
  aws_cloud_add_fields('cloud_config', 'aws_ec2', 'field_account_id');
  drupal_flush_all_caches();

  // Copy value from field_user_id to field_account_id.
  $config_entities = \Drupal::service('plugin.manager.cloud_config_plugin')->loadConfigEntities('aws_ec2');
  foreach ($config_entities as $config_entity) {
    $config_entity->set('field_account_id', $config_entity->field_user_id->value);
    $config_entity->save();
  }

  // Delete field_user_id.
  aws_cloud_delete_fields('cloud_config', 'aws_ec2', 'field_user_id');

  // Update fields.
  aws_cloud_update_entity_definitions();

  // Update entities of Instance, NetworkInterface, Snapshot, Image.
  $ec2_service = \Drupal::service('aws_cloud.ec2');
  foreach ($config_entities as $config_entity) {
    $ec2_service->setCloudContext($config_entity->getCloudContext());

    $ec2_service->updateInstances();
    $ec2_service->updateNetworkInterfaces();
    $ec2_service->updateSnapshots();

    $account_id = $config_entity->get('field_account_id')->value;
    $ec2_service->updateImages(['Owners' => [$account_id]], TRUE);
  }
}

/**
 * Change label of fields for cloud server template to inline.
 */
function aws_cloud_update_8124() {
  $config_factory = \Drupal::configFactory();
  $template = $config_factory->getEditable(
    'core.entity_view_display.cloud_server_template.aws_cloud.default'
  );

  $field_names = [
    'field_availability_zone',
    'field_image_id',
    'field_network',
    'field_security_group',
    'field_ssh_key',
    'field_subnet',
    'field_vpc',
  ];
  foreach ($field_names as $field_name) {
    $template->set("content.${field_name}.label", 'inline');
  }
  $template->save(TRUE);
}

/**
 * Update EBS snapshot header configuration.
 */
function aws_cloud_update_8125() {
  $files = [
    'views.view.aws_snapshot.yml',
    'views.view.aws_instances.yml',
    'views.view.aws_network_interfaces.yml',
    'views.view.aws_volume.yml',
  ];
  cloud_update_yml_definitions($files, 'aws_cloud');
}

/**
 * Update following views pagination.
 *
 * EC2 Instances, Images, Security Groups, Elastic IPs (EIP), Elastic Network
 * Interfaces (ENI), Key Pairs, EBS Volumes, EBS Snapshots views.
 *
 * Also add table header to Key Pairs view.
 */
function aws_cloud_update_8126() {
  $files = [
    'views.view.aws_cloud_key_pairs.yml',
    'views.view.aws_elastic_ip.yml',
    'views.view.aws_images.yml',
    'views.view.aws_instances.yml',
    'views.view.aws_network_interfaces.yml',
    'views.view.aws_security_group.yml',
    'views.view.aws_snapshot.yml',
    'views.view.aws_volume.yml',
  ];
  cloud_update_yml_definitions($files, 'aws_cloud');
}

/**
 * Add field_tags field to cloud server template of aws_cloud.
 */
function aws_cloud_update_8127() {
  aws_cloud_add_fields('cloud_server_template', 'aws_cloud', 'field_tags');
}

/**
 * Add column volume_id to EBS volumes view.
 */
function aws_cloud_update_8128() {
  $files = ['views.view.aws_volume.yml'];
  cloud_update_yml_definitions($files, 'aws_cloud');
}

/**
 * Update fields.
 *
 * 1. Update elastic network interface field for EC2 instances.
 * 2. Update image entity visibility field to boolean.
 * 3. Add cost to EC2 instance entity and instance list.
 * 4. Add created column to image and EBS snapshot list.
 * 5. Update EC2 instance entity launch_time field to timestamp.
 */
function aws_cloud_update_8129() {
  $db = \Drupal::database();

  // Clean out the network_interfaces column before updating changing the
  // column type.
  if ($db->schema()->fieldExists('aws_cloud_instance', 'network_interfaces')) {
    $db->update('aws_cloud_instance')
      ->fields(['network_interfaces' => NULL])
      ->execute();
  }

  // Clean out the launch_time column before updating changing the
  // column type.
  if ($db->schema()->fieldExists('aws_cloud_instance', 'launch_time')) {
    $db->update('aws_cloud_instance')
      ->fields(['launch_time' => NULL])
      ->execute();
  }

  aws_cloud_update_entity_definitions();

  // Update views.
  $files = [
    'views.view.aws_instances.yml',
    'views.view.aws_images.yml',
    'views.view.aws_snapshot.yml',
  ];
  cloud_update_yml_definitions($files, 'aws_cloud');

  // Update EC2 instances and EBS snapshots.
  $cloud_configs = \Drupal::service('plugin.manager.cloud_config_plugin')->loadConfigEntities('aws_ec2');
  foreach ($cloud_configs as $cloud_config) {
    $ec2_service = \Drupal::service('aws_cloud.ec2');
    $ec2_service->setCloudContext($cloud_config->getCloudContext());
    $ec2_service->updateInstances();
    $ec2_service->updateSnapshots();
  }
}

/**
 * Update setting of attachment_information in aws_volume view.
 */
function aws_cloud_update_8130() {
  $files = ['views.view.aws_volume.yml'];
  cloud_update_yml_definitions($files, 'aws_cloud');
}

/**
 * Change the field name of user_id to uid.
 */
function aws_cloud_update_8131() {
  $db = \Drupal::database();

  $tables = [
    'aws_cloud_elastic_ip',
    'aws_cloud_image',
    'aws_cloud_instance',
    'aws_cloud_key_pair',
    'aws_cloud_network_interface',
    'aws_cloud_security_group',
    'aws_cloud_snapshot',
    'aws_cloud_volume',
  ];
  $old_data = [];
  foreach ($tables as $table) {
    $old_data[$table] = [];
    if ($db->schema()->fieldExists($table, 'user_id')) {
      $result = $db->select($table, 't')
        ->fields('t', ['id', 'user_id'])
        ->execute()
        ->fetchAll();
      foreach ($result as $row) {
        $old_data[$table][] = $row;
      }

      $db->update($table)
        ->fields(['user_id' => NULL])
        ->execute();
    }
  }

  aws_cloud_update_entity_definitions();

  foreach ($tables as $table) {
    foreach ($old_data[$table] as $row) {
      $db->update($table)
        ->fields(['uid' => $row->user_id])
        ->condition('id', $row->id)
        ->execute();
    }
  }
}

/**
 * Add a configuration item and a field.
 *
 * Add configuration item google_credential_file_path to aws_cloud.settings,
 * and Add field field_google_spreadsheet_pricing_url to cloud_config.
 */
function aws_cloud_update_8132() {
  aws_cloud_update_entity_definitions();

  // Update value of google_credential_file_path.
  $config_factory = \Drupal::configFactory();
  $config = $config_factory->getEditable('aws_cloud.settings');
  $config->set('google_credential_file_path', aws_cloud_google_credential_file_default_path());
  $config->save();

  // Add field_google_spreadsheet_pricing_url.
  aws_cloud_add_fields('cloud_config', 'aws_ec2', 'field_spreadsheet_pricing_url');
}

/**
 * Set default pager options for views.
 */
function aws_cloud_update_8133() {
  $config_factory = \Drupal::configFactory();
  $config = $config_factory->getEditable('aws_cloud.settings');
  $config->set('aws_cloud_view_items_per_page', 50);
  $config->set('aws_cloud_view_expose_items_per_page', TRUE);
  $config->save();

  $views = [
    'views.view.aws_cloud_key_pairs',
    'views.view.aws_elastic_ip',
    'views.view.aws_images',
    'views.view.aws_instances',
    'views.view.aws_network_interfaces',
    'views.view.aws_security_group',
    'views.view.aws_snapshot',
    'views.view.aws_volume',
  ];

  $items_per_page = aws_cloud_get_views_items_options();
  $options = [
    'display.default.display_options.pager.options.items_per_page' => 50,
    'display.default.display_options.pager.options.expose.items_per_page' => TRUE,
    'display.default.display_options.pager.options.expose.items_per_page_options' => implode(',', $items_per_page),
    'display.default.display_options.pager.options.expose.items_per_page_options_all' => TRUE,
  ];

  foreach ($views as $view_name) {
    aws_cloud_update_views_configuration($view_name, $options);
  }
}

/**
 * Add unused EBS volume configurations.
 *
 * Update EBS volume views configuration.
 */
function aws_cloud_update_8134() {
  $config_factory = \Drupal::configFactory();
  $config = $config_factory->getEditable('aws_cloud.settings');
  $config->set('aws_cloud_unused_volume_criteria', 60);
  $config->set('aws_cloud_volume_notification_subject', 'Unused EBS volumes');
  $config->set('aws_cloud_volume_notification_msg', 'The following EBS volumes are not in use.  Please review them.');
  $config->set('aws_cloud_volume_notification_frequency', 604800);
  $config->set('aws_cloud_volume_notification_time', '09:00:00');
  $config->set('aws_cloud_volume_notification_hour', '09');
  $config->set('aws_cloud_volume_notification_minutes', '00');
  $config->save();

  cloud_update_yml_definitions(['views.view.aws_volume.yml'], 'aws_cloud');
}

/**
 * Update field instance_id in Elastic IP views configurations.
 */
function aws_cloud_update_8135() {
  cloud_update_yml_definitions(['views.view.aws_elastic_ip.yml'], 'aws_cloud');
}

/**
 * Update field_account_id and field_access_key definitions.
 */
function aws_cloud_update_8136() {
  cloud_update_yml_definitions(
    [
      'field.field.cloud_config.aws_ec2.field_account_id.yml',
      'field.field.cloud_config.aws_ec2.field_access_key.yml',
    ],
    'aws_cloud'
  );
}

/**
 * Add all_aws_cloud_instances view.
 */
function aws_cloud_update_8137() {
  cloud_update_yml_definitions(['views.view.all_aws_cloud_instances.yml'], 'aws_cloud');
}

/**
 * Add instance notificaiton configurations.
 */
function aws_cloud_update_8138() {
  $config_factory = \Drupal::configFactory();
  $config = $config_factory->getEditable('aws_cloud.settings');
  $config->set('aws_cloud_notify_owner', 0);
  $config->set('aws_cloud_instance_notification_time', '09:00:00');
  $config->set('aws_cloud_instance_notification_hour', '09');
  $config->set('aws_cloud_instance_notification_minutes', '00');
  $config->set('aws_cloud_notification_msg', "The following EC2 instance is running for a long time. Please review it.\n\n--------------------------------\nInstance name: [aws_cloud_instance:name]\nInstance url: [aws_cloud_instance:instance_link]\nRunning since: [aws_cloud_instance:launch_time].\n--------------------------------");
  $config->save();
}

/**
 * Make table headers always visible at the top of the page.
 */
function aws_cloud_update_8139() {
  $views = [
    'views.view.aws_cloud_key_pairs',
    'views.view.aws_elastic_ip',
    'views.view.aws_images',
    'views.view.aws_instances',
    'views.view.aws_network_interfaces',
    'views.view.aws_security_group',
    'views.view.aws_snapshot',
    'views.view.aws_volume',
    'views.view.all_aws_cloud_instances',
  ];

  $options = [
    'display.default.display_options.style.options.sticky' => TRUE,
    'display.page_1.display_options.style.options.sticky' => TRUE,
  ];

  foreach ($views as $view_name) {
    aws_cloud_update_views_configuration($view_name, $options);
  }
}

/**
 * Add cost management configurations.
 */
function aws_cloud_update_8140() {
  $config_factory = \Drupal::configFactory();
  $config = $config_factory->getEditable('aws_cloud.settings');
  $config->set('aws_cloud_instance_type_prices', TRUE);
  $config->set('aws_cloud_instance_type_prices_spreadsheet', TRUE);
  $config->set('aws_cloud_instance_type_cost', TRUE);
  $config->set('aws_cloud_instance_type_cost_list', TRUE);
  $config->set('aws_cloud_instance_list_cost_column', TRUE);
  $config->save();
}

/**
 * Update field_user_data in cloud_server_template entity view.
 */
function aws_cloud_update_8141() {
  $files = [
    'core.entity_view_display.cloud_server_template.aws_cloud.default.yml',
  ];
  cloud_update_yml_definitions($files, 'aws_cloud');

}

/**
 * Update EC2 instance, EBS volume and snapshot notification configuration.
 */
function aws_cloud_update_8142() {
  $config_factory = \Drupal::configFactory();
  $config = $config_factory->getEditable('aws_cloud.settings');
  $config->set('aws_cloud_notification_subject', 'Long running EC2 instances');
  $config->set('aws_cloud_notification_msg', "The following EC2 instances have been running for a long time. Please review them. \n\n[aws_cloud_instance_email:instances] \n\nSent from [site:url]");
  $config->set('aws_cloud_instance_notification_instance_info', "--------------------------------\nInstance name: [aws_cloud_instance:name]\nInstance url: [aws_cloud_instance:instance_link]\nRunning since: [aws_cloud_instance:launch_time].\n--------------------------------");

  $config->set('aws_cloud_volume_notification_subject', 'Unused EBS volumes');
  $config->set('aws_cloud_volume_notification_msg', "The following EBS volumes are not in use. Please review them. \n\n[aws_cloud_volume_email:volumes] \n\nSent from [site:url]");
  $config->set('aws_cloud_volume_notification_volume_info', "--------------------------------\nVolume name: [aws_cloud_volume:name]\nVolume url: [aws_cloud_volume:volume_link]\nUnused since: [aws_cloud_volume:created]\n--------------------------------");

  $config->set('aws_cloud_snapshot_notify_owner', 0);
  $config->set('aws_cloud_snapshot_notification_subject', 'Unused EBS snapshots');
  $config->set('aws_cloud_snapshot_notification_msg', "The following EBS snapshots are unused and not associated with an EBS volume. Please review them. \n\n[aws_cloud_snapshot_email:snapshots] \n\nSent from [site:url]");
  $config->set('aws_cloud_snapshot_notification_snapshot_info', "--------------------------------\nSnapshot name: [aws_cloud_snapshot:name]\nSnapshot url: [aws_cloud_snapshot:snapshot_link]\nSnapshot created: [aws_cloud_snapshot:created]\n--------------------------------");
  $config->set('aws_cloud_snapshot_notification_frequency', 604800);
  $config->set('aws_cloud_snapshot_notification_time', '09:00:00');
  $config->set('aws_cloud_snapshot_notification_hour', '09');
  $config->set('aws_cloud_snapshot_notification_minutes', '00');
  $config->save();
}

/**
 * Add field_vpc and field_subnet.
 */
function aws_cloud_update_8143() {
  aws_cloud_add_fields('cloud_server_template', 'aws_cloud', 'field_version');
}

/**
 * Update field public_ip in instance views configurations.
 */
function aws_cloud_update_8144() {
  cloud_update_yml_definitions(['views.view.aws_instances.yml'], 'aws_cloud');
}

/**
 * Add the Switch Role fields.
 */
function aws_cloud_update_8145() {
  aws_cloud_add_fields(
    'cloud_config',
    'aws_ec2',
    [
      'field_switch_role',
      'field_switch_role_account_id',
      'field_switch_role_iam_role',
    ]
  );
}

/**
 * Update the type of user_data to string_long.
 */
function aws_cloud_update_8146() {
  $db = \Drupal::database();

  // Clean out the user_data column before changing the column type.
  if ($db->schema()->fieldExists('aws_cloud_instance', 'user_data')) {
    $db->update('aws_cloud_instance')
      ->fields(['user_data' => NULL])
      ->execute();
  }

  // Delete user_data.
  $update_manager = \Drupal::entityDefinitionUpdateManager();
  $field_storage_definition = $update_manager->getFieldStorageDefinition(
    'user_data',
    'aws_cloud_instance'
  );
  if ($field_storage_definition) {
    $update_manager->uninstallFieldStorageDefinition($field_storage_definition);
  }

  // Install user data.
  $field_storage_definition = BaseFieldDefinition::create('string_long')
    ->setLabel(t('User Data'))
    ->setDescription(t('User Data to pass to an instance when launching.'))
    ->setDisplayOptions('view', [
      'label' => 'inline',
      'type' => 'pre_string_formatter',
      'weight' => -5,
    ]);

  $update_manager->installFieldStorageDefinition(
    'user_data',
    'aws_cloud_instance',
    'aws_cloud',
    $field_storage_definition
  );

  drupal_flush_all_caches();

  // Update instances.
  $config_entities = \Drupal::service('plugin.manager.cloud_config_plugin')
    ->loadConfigEntities('aws_ec2');
  $ec2_service = \Drupal::service('aws_cloud.ec2');
  foreach ($config_entities as $config_entity) {
    $ec2_service->setCloudContext($config_entity->getCloudContext());
    $ec2_service->updateInstancesWithoutBatch();
  }
}

/**
 * Change view's ids.
 *
 * Change view's ids, yml file names and related field definitions.
 */
function aws_cloud_update_8147() {
  $view_ids = [
    'aws_elastic_ip',
    'aws_images',
    'aws_instances',
    'aws_network_interfaces',
    'aws_security_group',
    'aws_snapshot',
    'aws_volume',
    'all_aws_cloud_instances',
  ];

  cloud_delete_views($view_ids);

  $files = [
    'views.view.aws_cloud_instances.yml',
    'views.view.aws_cloud_images.yml',
    'views.view.aws_cloud_volume.yml',
    'views.view.aws_cloud_security_group.yml',
    'views.view.aws_cloud_instances_all.yml',
    'views.view.aws_cloud_network_interfaces.yml',
    'views.view.aws_cloud_elastic_ip.yml',
    'views.view.aws_cloud_snapshot.yml',
    'field.field.cloud_server_template.aws_cloud.field_image_id.yml',
    'field.field.cloud_server_template.aws_cloud.field_network.yml',
    'field.field.cloud_server_template.aws_cloud.field_security_group.yml',
  ];

  cloud_update_yml_definitions($files, 'aws_cloud');
}

/**
 * Update view aws_cloud_snapshot and add aws_cloud_snapshot_delete_action.
 */
function aws_cloud_update_8148() {
  $files = [
    'views.view.aws_cloud_snapshot.yml',
    'system.action.aws_cloud_snapshot_delete_action.yml',
  ];
  cloud_update_yml_definitions($files, 'aws_cloud');
}

/**
 * Update view aws_cloud_volume and add aws_cloud_volume_delete_action.
 */
function aws_cloud_update_8149() {
  $files = [
    'views.view.aws_cloud_volume.yml',
    'system.action.aws_cloud_volume_delete_action.yml',
  ];
  cloud_update_yml_definitions($files, 'aws_cloud');
}

/**
 * Update view aws_cloud_image and add aws_cloud_image_delete_action.
 */
function aws_cloud_update_8150() {
  $files = [
    'views.view.aws_cloud_images.yml',
    'system.action.aws_cloud_image_delete_action.yml',
  ];
  cloud_update_yml_definitions($files, 'aws_cloud');
}

/**
 * Change view's ids.
 *
 * Change view's ids, yml file names and related field definitions.
 */
function aws_cloud_update_8151() {
  $view_ids = [
    'aws_cloud_images',
    'aws_cloud_instances',
    'aws_cloud_network_interfaces',
    'aws_cloud_key_pairs',
    'aws_cloud_instances_all',
  ];

  cloud_delete_views($view_ids);

  $files = [
    'views.view.aws_cloud_instance.yml',
    'views.view.aws_cloud_image.yml',
    'views.view.aws_cloud_volume.yml',
    'views.view.aws_cloud_security_group.yml',
    'views.view.aws_cloud_instance_all.yml',
    'views.view.aws_cloud_network_interface.yml',
    'views.view.aws_cloud_elastic_ip.yml',
    'views.view.aws_cloud_snapshot.yml',
    'views.view.aws_cloud_key_pair.yml',
    'field.field.cloud_server_template.aws_cloud.field_image_id.yml',
    'field.field.cloud_server_template.aws_cloud.field_network.yml',
    'field.field.cloud_server_template.aws_cloud.field_security_group.yml',
  ];

  cloud_update_yml_definitions($files, 'aws_cloud');
}

/**
 * Add view aws_cloud_vpc and entity type aws_cloud_vpc.
 */
function aws_cloud_update_8152() {
  $files = [
    'views.view.aws_cloud_vpc.yml',
  ];
  cloud_update_yml_definitions($files, 'aws_cloud');

  // Add entity type aws_cloud_vpc.
  $definition_update_manager = \Drupal::entityDefinitionUpdateManager();
  $entity_type = \Drupal::entityTypeManager()->getDefinition('aws_cloud_vpc');
  $definition_update_manager->installEntityType($entity_type);

  // Update VPCs.
  /* @var \Drupal\aws_cloud\Service\Ec2\Ec2ServiceInterface $ec2_service */
  $ec2_service = \Drupal::service('aws_cloud.ec2');
  $entities = \Drupal::service('plugin.manager.cloud_config_plugin')->loadConfigEntities('aws_ec2');

  foreach ($entities as $entity) {
    /* @var \Drupal\cloud\Entity\CloudConfig $entity */
    $ec2_service->setCloudContext($entity->getCloudContext());
    $ec2_service->updateVpcs();
  }
}

/**
 * Add multiple Elastic IP disassociate and delete action.
 *
 * Update view aws_cloud_elastic_ip,
 * add aws_cloud_elastic_ip_disassociate_action,
 * aws_cloud_elastic_ip_delete_action.
 */
function aws_cloud_update_8153() {
  $files = [
    'views.view.aws_cloud_elastic_ip.yml',
    'system.action.aws_cloud_elastic_ip_disassociate_action.yml',
    'system.action.aws_cloud_elastic_ip_delete_action.yml',
  ];
  cloud_update_yml_definitions($files, 'aws_cloud');
}

/**
 * Add multiple instance delete action.
 *
 * Update view aws_cloud_instance,
 * add aws_cloud_instance_delete_action.
 */
function aws_cloud_update_8154() {
  $files = [
    'views.view.aws_cloud_instance.yml',
    'system.action.aws_cloud_instance_delete_action.yml',
  ];
  cloud_update_yml_definitions($files, 'aws_cloud');
}

/**
 * Add multiple Key Pair delete action.
 *
 * Update view aws_cloud_key_pair, aws_cloud_key_pair_delete_action.
 */
function aws_cloud_update_8155() {
  $files = [
    'views.view.aws_cloud_key_pair.yml',
    'system.action.aws_cloud_key_pair_delete_action.yml',
  ];
  cloud_update_yml_definitions($files, 'aws_cloud');
}

/**
 * Add multiple instance stop action.
 *
 * Update view aws_cloud_instance_all,
 * add aws_cloud_instance_stop_action.
 */
function aws_cloud_update_8156() {
  $files = [
    'views.view.aws_cloud_instance_all.yml',
    'system.action.aws_cloud_instance_stop_action.yml',
  ];
  cloud_update_yml_definitions($files, 'aws_cloud');
}

/**
 * Add multiple instance start action.
 *
 * Update view aws_cloud_instance_all,
 * add aws_cloud_instance_start_action.
 */
function aws_cloud_update_8157() {
  $files = [
    'views.view.aws_cloud_instance_all.yml',
    'system.action.aws_cloud_instance_start_action.yml',
  ];
  cloud_update_yml_definitions($files, 'aws_cloud');
}

/**
 * Add multiple instance reboot action.
 */
function aws_cloud_update_8158() {
  $files = [
    'system.action.aws_cloud_instance_reboot_action.yml',
  ];
  cloud_update_yml_definitions($files, 'aws_cloud');
}

/**
 * Add multiple VPC delete action.
 *
 * Update view aws_cloud_vpc, aws_cloud_vpc_delete_action.
 */
function aws_cloud_update_8159() {
  $files = [
    'views.view.aws_cloud_vpc.yml',
    'system.action.aws_cloud_vpc_delete_action.yml',
  ];
  cloud_update_yml_definitions($files, 'aws_cloud');
}

/**
 * Add multiple Network Interface delete action.
 *
 * Update view aws_cloud_network_interface,
 * aws_cloud_network_interface_delete_action.
 */
function aws_cloud_update_8160() {
  $files = [
    'views.view.aws_cloud_network_interface.yml',
    'system.action.aws_cloud_network_interface_delete_action.yml',
  ];
  cloud_update_yml_definitions($files, 'aws_cloud');
}

/**
 * Add multiple Security Group delete action.
 *
 * Update view aws_cloud_security_group,
 * aws_cloud_security_group_delete_action.
 */
function aws_cloud_update_8161() {
  $files = [
    'views.view.aws_cloud_security_group.yml',
    'system.action.aws_cloud_security_group_delete_action.yml',
  ];
  cloud_update_yml_definitions($files, 'aws_cloud');
}

/**
 * Update view aws_cloud_image.
 */
function aws_cloud_update_8162() {
  $files = [
    'views.view.aws_cloud_image.yml',
  ];
  cloud_update_yml_definitions($files, 'aws_cloud');
}

/**
 * Add configurations about automatically assigning VPC.
 */
function aws_cloud_update_8163() {
  $config_factory = \Drupal::configFactory();
  $config = $config_factory->getEditable('aws_cloud.settings');
  $config->set('aws_cloud_vpc_automatically_assign_vpc', 1);
  $config->set('aws_cloud_vpc_default_vpc_name', 'default for user [user_name]');
  $config->set('aws_cloud_vpc_default_vpc_cidr_block', '10.0.0.0/16');
  $config->set('aws_cloud_vpc_default_subnet_name', 'default for user [user_name]');
  $config->set('aws_cloud_vpc_default_subnet_cidr_block', '10.0.0.0/24');
  $config->save();
}

/**
 * Add field_system_vpc to cloud_config.
 */
function aws_cloud_update_8164() {
  // Add new fields.
  aws_cloud_add_fields('cloud_config', 'aws_ec2', ['field_system_vpc']);
}

/**
 * Update AWS Cloud Profile list view.
 *
 * Update view 'cloud_config_aws_cloud_profile.yml'.
 */
function aws_cloud_update_8165() {
  $files = [
    'views.view.cloud_config_aws_cloud_profile.yml',
  ];
  cloud_update_yml_definitions($files, 'aws_cloud');

  $db = \Drupal::database();

  // Clean out the security_groups column before changing the column type.
  if ($db->schema()->fieldExists('aws_cloud_instance', 'security_groups')) {
    $db->update('aws_cloud_instance')
      ->fields(['security_groups' => NULL])
      ->execute();
  }

  // Delete security_groups data.
  $update_manager = \Drupal::entityDefinitionUpdateManager();
  $field_storage_definition = $update_manager->getFieldStorageDefinition(
    'security_groups',
    'aws_cloud_instance'
  );
  if ($field_storage_definition) {
    $update_manager->uninstallFieldStorageDefinition($field_storage_definition);
  }

  // Install security_groups data.
  $field_storage_definition = BaseFieldDefinition::create('string_long')
    ->setLabel(t('Security Groups'))
    ->setDescription(t('The security groups to which the instance belongs. A security group is a collection of firewall rules that restrict the network traffic for the instance. Click View rules to see the rules for the specific group.'))
    ->setDisplayOptions('view', [
      'label' => 'inline',
      'type' => 'entity_link',
      'settings' => [
        'target_type' => 'aws_cloud_security_group',
        'field_name' => 'group_name',
        'comma_separated' => TRUE,
      ],
      'weight' => -5,
    ])
    ->setReadOnly(TRUE);

  $update_manager->installFieldStorageDefinition(
    'security_groups',
    'aws_cloud_instance',
    'aws_cloud',
    $field_storage_definition
  );

  drupal_flush_all_caches();

  // Update instances.
  $config_entities = \Drupal::service('plugin.manager.cloud_config_plugin')
    ->loadConfigEntities('aws_ec2');
  $ec2_service = \Drupal::service('aws_cloud.ec2');
  foreach ($config_entities as $config_entity) {
    $ec2_service->setCloudContext($config_entity->getCloudContext());
    $ec2_service->updateInstancesWithoutBatch();
  }
}

/**
 * Update multiple Network Interface delete action.
 */
function aws_cloud_update_8166() {
  $files = [
    'system.action.aws_cloud_network_interface_delete_action.yml',
  ];
  cloud_update_yml_definitions($files, 'aws_cloud');
}

/**
 * Add resource Subnet.
 *
 * Add view aws_cloud_subnet and entity type aws_cloud_subnet
 * and aws_cloud_vpc_delete_action.
 */
function aws_cloud_update_8167() {
  $files = [
    'views.view.aws_cloud_subnet.yml',
    'system.action.aws_cloud_subnet_delete_action.yml',
  ];
  cloud_update_yml_definitions($files, 'aws_cloud');

  // Add entity type aws_cloud_subnet.
  $definition_update_manager = \Drupal::entityDefinitionUpdateManager();
  $entity_type = \Drupal::entityTypeManager()->getDefinition('aws_cloud_subnet');
  $definition_update_manager->installEntityType($entity_type);

  // Update Subnets.
  /* @var \Drupal\aws_cloud\Service\Ec2\Ec2ServiceInterface $ec2_service */
  $ec2_service = \Drupal::service('aws_cloud.ec2');
  $entities = \Drupal::service('plugin.manager.cloud_config_plugin')->loadConfigEntities('aws_ec2');

  foreach ($entities as $entity) {
    /* @var \Drupal\cloud\Entity\CloudConfig $entity */
    $ec2_service->setCloudContext($entity->getCloudContext());
    $ec2_service->updateSubnets();
  }
}

/**
 * Update view aws_cloud_subnet.
 */
function aws_cloud_update_8168() {
  $files = [
    'views.view.aws_cloud_subnet.yml',
  ];
  cloud_update_yml_definitions($files, 'aws_cloud');
}

/**
 * Update SSH key field of cloud server template.
 */
function aws_cloud_update_8169() {
  cloud_update_yml_definitions([
    'field.field.cloud_server_template.aws_cloud.field_ssh_key.yml',
  ], 'aws_cloud');
}

/**
 * Update AWS Cloud Profile list view.
 */
function aws_cloud_update_8170() {
  cloud_update_yml_definitions([
    'views.view.cloud_config_aws_cloud_profile.yml',
  ], 'aws_cloud');

}

/**
 * Update view aws_cloud_instance.
 *
 * Add link to instance_type field.
 */
function aws_cloud_update_8171() {
  $files = [
    'views.view.aws_cloud_instance.yml',
  ];
  cloud_update_yml_definitions($files, 'aws_cloud');
}

/**
 * Update entity view display of cloud_server_template.aws_ec2.default.
 *
 * Add entity links to field_vpc and field_subnet.
 */
function aws_cloud_update_8172() {
  $files = [
    'core.entity_view_display.cloud_server_template.aws_cloud.default.yml',
  ];
  cloud_update_yml_definitions($files, 'aws_cloud');
}

/**
 * Update AWS Cloud Profile list view permissions.
 */
function aws_cloud_update_8173() {
  cloud_update_yml_definitions([
    'views.view.cloud_config_aws_cloud_profile.yml',
  ], 'aws_cloud');
}

/**
 * Add fields about flow log to cloud_config.
 */
function aws_cloud_update_8174() {
  // Add new fields.
  aws_cloud_add_fields('cloud_config', 'aws_ec2', [
    'field_log_destination_type',
    'field_log_destination',
    'field_log_group_name',
    'field_logs_permission_arn',
    'field_traffic_type',
  ]);

  // Update entity cloud_config.aws_ec2.
  $files = [
    'core.entity_form_display.cloud_config.aws_ec2.default.yml',
    'core.entity_view_display.cloud_config.aws_ec2.default.yml',
  ];
  cloud_update_yml_definitions($files, 'aws_cloud');
}

/**
 * Add link to instance_type in view aws_cloud_instance_all.
 */
function aws_cloud_update_8175() {
  cloud_update_yml_definitions([
    'views.view.aws_cloud_instance_all.yml',
  ], 'aws_cloud');
}

/**
 * Change field_instance_type formatter to instance_type_link_formatter.
 */
function aws_cloud_update_8176() {
  cloud_update_yml_definitions([
    'core.entity_view_display.cloud_server_template.aws_cloud.default.yml',
  ], 'aws_cloud');
}

/**
 * Delete field_cloud_type from cloud_config entity.
 */
function aws_cloud_update_8177() {

  // Delete field_user_id.
  aws_cloud_delete_fields('cloud_config', 'aws_ec2', 'field_cloud_type');
}

/**
 * Update argument index in views.
 */
function aws_cloud_update_8178() {
  cloud_update_yml_definitions([
    'views.view.aws_cloud_image.yml',
    'views.view.aws_cloud_key_pair.yml',
    'views.view.aws_cloud_security_group.yml',
    'views.view.aws_cloud_network_interface.yml',
  ], 'aws_cloud');
}

/**
 * Add links to the VPC on list of Security Groups and Network Interfaces.
 */
function aws_cloud_update_8179() {
  $files = [
    'views.view.aws_cloud_security_group.yml',
    'views.view.aws_cloud_network_interface.yml',
  ];
  cloud_update_yml_definitions($files, 'aws_cloud');
}

/**
 * Update views.
 *
 * Views: Instance, All Instances, Image, Elastic IP, Key Pair,
 * Network, Security Group, Snapshot, Volume, VPC, Subnet.
 */
function aws_cloud_update_8180() {
  $files = [
    'views.view.aws_cloud_instance.yml',
    'views.view.aws_cloud_instance_all.yml',
    'views.view.aws_cloud_image.yml',
    'views.view.aws_cloud_elastic_ip.yml',
    'views.view.aws_cloud_key_pair.yml',
    'views.view.aws_cloud_network_interface.yml',
    'views.view.aws_cloud_security_group.yml',
    'views.view.aws_cloud_snapshot.yml',
    'views.view.aws_cloud_volume.yml',
    'views.view.aws_cloud_vpc.yml',
    'views.view.aws_cloud_subnet.yml',
  ];
  cloud_update_yml_definitions($files, 'aws_cloud');
}

/**
 * Add fields about VPCs to cloud_config.
 */
function aws_cloud_update_8181() {
  // Add new fields.
  aws_cloud_add_fields('cloud_config', 'aws_ec2', [
    'field_automatically_assign_vpc',
    'field_default_vpc_name',
    'field_default_vpc_cidr_block',
    'field_default_subnet_name',
    'field_default_subnet_cidr_block',
  ]);

  // Update entity cloud_config.aws_ec2.
  $files = [
    'core.entity_form_display.cloud_config.aws_ec2.default.yml',
    'core.entity_view_display.cloud_config.aws_ec2.default.yml',
  ];
  cloud_update_yml_definitions($files, 'aws_cloud');
}

/**
 * Update views.
 *
 * Views: Image.
 */
function aws_cloud_update_8182() {
  $files = [
    'views.view.aws_cloud_image.yml',
  ];
  cloud_update_yml_definitions($files, 'aws_cloud');
}

/**
 * Migrate aws cloud service provider permissions.
 *
 * Backup database before performing this update!
 */
function aws_cloud_update_8183() {

  $permission_map = [
    'add aws cloud provider' => 'add aws cloud service provider',
    'list aws cloud provider' => 'list aws cloud service provider',
    'view aws cloud provider' => 'view aws cloud service provider',
    'edit aws cloud provider' => 'edit aws cloud service provider',
    'delete aws cloud provider' => 'delete aws cloud service provider',
  ];

  cloud_update_permissions($permission_map);
}

/**
 * Add multiple Volume detach action.
 *
 * Add aws_cloud_volume_detach_action.
 */
function aws_cloud_update_8184() {
  cloud_update_yml_definitions(['system.action.aws_cloud_volume_detach_action.yml'], 'aws_cloud');
}

/**
 * Add stale snapshot criteria configuration option.
 */
function aws_cloud_update_8185() {
  $config_factory = \Drupal::configFactory();
  $config = $config_factory->getEditable('aws_cloud.settings');
  $config->set('aws_cloud_stale_snapshot_criteria', 60);
  $config->save();
}

/**
 * Update field_availability_zone of cloud server template.
 */
function aws_cloud_update_8186() {
  $files = [
    'field.storage.cloud_server_template.field_availability_zone.yml',
  ];
  cloud_update_yml_definitions($files, 'aws_cloud');
}

/**
 * Update field_image_id in cloud_server_template entity view.
 */
function aws_cloud_update_8187() {

  // Migrate an 'field_image_id' stored as the entity reference of
  // aws_cloud_image to an AMI ID as string in CloudServerTemplates.
  // First, temporarily it stores the AMI IDs since we'll delete the existing
  // field_image_id config incl. the data. And then add a new field_image_id
  // config.  Finally we copy the AMI IDs to 'field_image_id.
  $temp_ami_ids = [];
  $server_template_storage = \Drupal::entityTypeManager()->getStorage('cloud_server_template');
  $cloud_service_providers = \Drupal::service('plugin.manager.cloud_config_plugin')->loadConfigEntities('aws_ec2');
  foreach ($cloud_service_providers as $cloud_service_provider) {
    /* @var \Drupal\cloud\Entity\CloudConfig $entity */
    $server_templates = $server_template_storage->loadByProperties(
      ['cloud_context' => $cloud_service_provider->getCloudContext()]
    );
    foreach ($server_templates as $server_template) {
      // Get the entity_reference.
      // Full code: $image_ref_id = $server_template->get('field_image_id')->getValue()->getValue()[0]['target_id'];.
      $aws_cloud_image_id = $server_template->field_image_id->target_id;
      $image = array_shift(\Drupal::entityTypeManager()
        ->getStorage('aws_cloud_image')->loadByProperties([
          'id' => $aws_cloud_image_id,
        ])
      );
      $ami_id = $image->getImageId();
      $temp_ami_ids[$server_template->id()] = $ami_id;
    }
  }

  // Delete the existing 'field_image_id' field.
  aws_cloud_delete_fields('cloud_server_template', 'aws_cloud', [
    'field_image_id',
  ]);

  // Add a new 'field_image_id' field.
  aws_cloud_add_fields('cloud_server_template', 'aws_cloud', [
    'field_image_id',
  ]);

  // Update a cloud_server_template view.
  $files = [
    'core.entity_view_display.cloud_server_template.aws_cloud.default.yml',
  ];
  cloud_update_yml_definitions($files, 'aws_cloud');

  // Restore the AMI IDs into 'field_image_id'.
  foreach ($cloud_service_providers as $cloud_service_provider) {
    /* @var \Drupal\cloud\Entity\CloudConfig $entity */
    $cloud_context = $cloud_service_provider->getCloudContext();
    $server_templates = $server_template_storage->loadByProperties(
      ['cloud_context' => $cloud_context]
    );
    foreach ($server_templates as $server_template) {

      $ec2_service = \Drupal::service('aws_cloud.ec2');
      $ec2_service->setCloudContext($cloud_context);

      // Copy AMI IDs to 'field_image_id'.
      $server_template->field_image_id->value = $temp_ami_ids[$server_template->id()];
      // Create a new revision.
      $server_template->setNewRevision(TRUE);

      $params = [];
      $params['LaunchTemplateName'] = $server_template->getName();
      $params['VersionDescription'] = $server_template->getRevisionLogMessage();
      $params['LaunchTemplateData'] = aws_cloud_get_launch_template_data($server_template);
      $result = $ec2_service->createLaunchTemplateVersion($params);

      $success = isset($result['LaunchTemplateVersion']);
      if ($success) {
        aws_cloud_server_template_update_field_tags($server_template, $params['LaunchTemplateData']);

        $version = $result['LaunchTemplateVersion']['VersionNumber'];
        $server_template->set('field_version', $version);

        // Set default version.
        $params = [];
        $params['LaunchTemplateName'] = $server_template->getName();
        $params['DefaultVersion'] = $version;
        $ec2_service->modifyLaunchTemplate($params);
      }

      if (!($success && $server_template->save())) {
        \Drupal::logger('aws_cloud')->error(
          t("The cloud server template @name couldn't create.", [
            '@name' => $server_template->getName(),
          ])
        );
      }
    }
  }

  drupal_flush_all_caches();
}

/**
 * Add a configuration item aws_cloud_price_rate_ec2.
 */
function aws_cloud_update_8188() {
  $config_factory = \Drupal::configFactory();
  $config = $config_factory->getEditable('aws_cloud.settings');
  $config->set('aws_cloud_price_rate_ec2', 100);
  $config->save();
}

/**
 * Add EC2 pricing endpoint configuration item.
 */
function aws_cloud_update_8189() {
  $config_factory = \Drupal::configFactory();
  $config = $config_factory->getEditable('aws_cloud.settings');
  $config->set('aws_cloud_ec2_pricing_endpoint', PricingService::DEFAULT_ENDPOINT);
  $config->save();
}

/**
 * Add fields about Locaion to cloud_config.
 */
function aws_cloud_update_8190() {
  // Add new fields and update entity cloud_config.aws_ec2.
  $files = [
    'field.field.cloud_config.aws_ec2.field_location_country.yml',
    'field.field.cloud_config.aws_ec2.field_location_city.yml',
    'field.field.cloud_config.aws_ec2.field_location_latitude.yml',
    'field.field.cloud_config.aws_ec2.field_location_longitude.yml',
    'core.entity_form_display.cloud_config.aws_ec2.default.yml',
    'core.entity_view_display.cloud_config.aws_ec2.default.yml',
  ];
  cloud_update_yml_definitions($files, 'aws_cloud');
}

/**
 * Helper function to add fields to the entity type.
 *
 * @param string $entity_type
 *   The entity type, such as cloud_server_template.
 * @param string $bundle
 *   The bundle the entity type, such as aws_cloud.
 * @param mixed $fields
 *   The fields to be added, such as 'field_a' or ['field_a', 'field_b'].
 */
function aws_cloud_add_fields($entity_type, $bundle, $fields) {
  $config_path = drupal_get_path('module', 'aws_cloud') . '/config/install';
  $source      = new FileStorage($config_path);

  if (!is_array($fields)) {
    $fields = [$fields];
  }

  foreach ($fields as $field) {
    // Obtain the storage manager for field termination protection bases
    // Create a new field from the yaml configuration and save.
    \Drupal::entityTypeManager()->getStorage('field_storage_config')
      ->create($source->read("field.storage.$entity_type.$field"))
      ->save();

    // Obtain the storage manager for field termination protection
    // Create a new field IAM role from the yaml configuration and save.
    \Drupal::entityTypeManager()->getStorage('field_config')
      ->create($source->read("field.field.$entity_type.$bundle.$field"))
      ->save();
  }

  // Reload the default field display and form.
  // Reference https://drupal.stackexchange.com/questions/164713/how-do-i-update-the-configuration-of-a-module
  $files = [
    "core.entity_view_display.$entity_type.$bundle.default.yml",
    "core.entity_form_display.$entity_type.$bundle.default.yml",
  ];
  cloud_update_yml_definitions($files, 'aws_cloud');
}

/**
 * Helper function to delete fields from the entity type.
 *
 * @param string $entity_type
 *   The entity type, such as cloud_server_template.
 * @param string $bundle
 *   The bundle the entity type, such as aws_cloud.
 * @param mixed $field_names
 *   The names of fields to be added, such as 'field_a',
 *   or ['field_a', 'field_b'].
 */
function aws_cloud_delete_fields($entity_type, $bundle, $field_names) {
  if (!is_array($field_names)) {
    $field_names = [$field_names];
  }

  // Delete field in bundles.
  foreach ($field_names as $field_name) {
    $field = FieldConfig::loadByName($entity_type, $bundle, $field_name);
    if (!is_null($field)) {
      $field->delete();
    }
  }

  // Delete field storage.
  foreach ($field_names as $field_name) {
    $field_storage = FieldStorageConfig::loadByName($entity_type, $field_name);
    if (!is_null($field_storage)) {
      $field_storage->delete();
    }
  }
}

/**
 * Helper function to update entity definitions.
 */
function aws_cloud_update_entity_definitions() {
  drupal_flush_all_caches();
  // @todo https://www.drupal.org/node/3034742.
  \Drupal::entityDefinitionUpdateManager()->applyupdates();
}

/**
 * Implements update_dependencies().
 */
function aws_cloud_update_dependencies() {
  $dependencies = [];

  $dependencies['aws_cloud'][8190] = [
    'cloud' => 8122,
  ];

  return $dependencies;
}

Главная | Обратная связь

drupal hosting | друпал хостинг | it patrol .inc