Commit f7eb20ac authored by Ryo Yamashita's avatar Ryo Yamashita Committed by Yas Naoi
Browse files

Issue #3309974 by Ryo Yamashita, yas: Add a copy form for the AWS Cloud launch template list in SPA

parent d45f1708
Loading
Loading
Loading
Loading
+12 −0
Changes for cloud.routing.yml: 12 added lines, 0 removed lines.
Original line number Diff line number Diff line
@@ -135,6 +135,18 @@ entity.cloud_config.geocoder:
    _access: 'TRUE'

# Cloud launch template REST API
entity.cloud_launch_template.image_options:
  path: '/cloud_dashboard/cloud/{cloud_context}/cloud_launch_template/image_options'
  defaults:
    _controller: '\Drupal\cloud\Controller\ApiController::getImageOptions'
  methods: [GET]
  requirements:
    # Use custom access that will check for cloud_context and the desired permission.
    # Desired permission is passed as an option in the "perm" variable
    _custom_access: '\Drupal\cloud\Controller\CloudConfigController::access'
  options:
    perm: 'access dashboard'

entity.cloud_launch_template.delete:
  path: '/cloud_dashboard/{cloud_service_provider}/{cloud_context}/cloud_launch_template/{entity_id}/delete'
  defaults:
+165 −0
Changes for modules/cloud_dashboard/cloud_dashboard/src/constant/form_template/launch_template/aws_cloud.ts: 165 added lines, 0 removed lines.
Original line number Diff line number Diff line
import EntityFormTemplate from 'model/EntityFormTemplate';

const AWS_CLOUD_LAUNCH_TEMPLATE: EntityFormTemplate[] = [
  {
    cloudServiceProvider: 'aws_cloud',
    entityName: 'cloud_launch_template',
    actionType: 'copy',
    entityRecords: [
      {
        type: 'panel',
        panelName: 'Instance',
        keyValueRecords: [
          {
            type: 'default', labelName: 'Name', name: 'name',
            defaultValue: '', required: true
          },
          {
            type: 'textarea', labelName: 'Description', name: 'field_description',
            defaultValue: ''
          },
          {
            type: 'select', labelName: 'Instance type', name: 'field_instance_type',
            url: '/cloud_dashboard/aws_cloud/{cloud_context}/instance_types',
            defaultValue: '', readOnly: true
          },
          {
            type: 'select', labelName: 'IAM role', name: 'field_iam_role',
            url: '/cloud_dashboard/aws_cloud/{cloud_context}/iam_role_options',
            defaultValue: ''
          },
          {
            type: 'number', labelName: 'Min count', name: 'field_min_count',
            defaultValue: 1, required: true
          },
          {
            type: 'number', labelName: 'Max count', name: 'field_max_count',
            defaultValue: 1 
          },
          {
            type: 'boolean', labelName: 'Test only', name: 'field_test_only',
            defaultValue: false
          },
        ]
      },
      {
        type: 'panel',
        panelName: 'AMI',
        keyValueRecords: [
          {
            type: 'select', labelName: 'Image ID', name: 'field_image_id',
            url: '/cloud_dashboard/cloud/{cloud_context}/cloud_launch_template/image_options',
            defaultValue: '', required: true
          },
          {
            type: 'default', labelName: 'Kernel ID', name: 'field_kernel_id',
            defaultValue: '',
          },
          {
            type: 'default', labelName: 'Ramdisk ID', name: 'field_ram',
            defaultValue: '',
          },
        ]
      },
      {
        type: 'panel',
        panelName: 'Network',
        keyValueRecords: [
          {
            type: 'select', labelName: 'Availability Zone', name: 'field_availability_zone',
            url: '/cloud_dashboard/aws_cloud/{cloud_context}/availability_zone',
            defaultValue: '', required: true
          },
          {
            labelName: 'VPC', 'name': 'field_vpc', type: 'join', info: {
              entityTypeId: 'aws_cloud_vpc',
              keyColumn: 'vpc_id',
              label: '{name} ({vpc_id} | {cidr_block})',
            }, defaultValue: '',
          },
          {
            type: 'select', labelName: 'Subnet', name: 'field_subnet',
            url: '/cloud_dashboard/aws_cloud/{cloud_context}/aws_cloud_network_interface/subnet_options',
            defaultValue: ''
          },
          // TODO: Check specifications (name key)
          {
            type: 'multi-select', labelName: 'Security groups', name: 'security_groups',
            url: '/cloud_dashboard/aws_cloud/{cloud_context}/aws_cloud_network_interface/security_group_options/{subnet_id}',
            defaultValue: []
          },
          // TODO: Check specifications (name key)
          {
            type: 'join', labelName: 'SSH key', name: 'ssh_key', info: {
              entityTypeId: 'aws_cloud_key_pair',
              keyColumn: 'key_pair_name',
              label: '{key_pair_name}'
            },
            defaultValue: ''
          },
          // TODO: Check specifications (name key)
          {
            type: 'select', labelName: 'Network interface', name: 'network_interface_id',
            url: '/cloud_dashboard/aws_cloud/{cloud_context}/aws_cloud_elastic_ip/{entity_id}/unassociated_network_interface_ids',
            defaultValue: ''
          },
        ]
      },
      {
        type: 'panel',
        panelName: 'Tags',
        keyValueRecords: [
          {
            type: 'key-value', labelName: 'Tags', name: 'field_tags',
            defaultValue: []
          },
        ]
      },
      {
        type: 'panel',
        panelName: 'Workflow',
        keyValueRecords: [
          { type: 'select-local', name: 'field_workflow_status', labelName: 'Status', defaultValue: 'Draft', value: [
            { name: 'Draft', labelName: 'Draft' },
            { name: 'Review', labelName: 'Review' },
            { name: 'Approved', labelName: 'Approved' },
          ], required: true },
        ]
      },
      {
        type: 'panel',
        panelName: 'Option',
        keyValueRecords: [
          { type: 'select-local', name: 'field_instance_shutdown_behavior', labelName: 'Instance shutdown behavior', defaultValue: 'stop', value: [
            { name: 'stop', labelName: 'Stop' },
            { name: 'terminate', labelName: 'Terminate' },
          ]},
          {
            type: 'boolean', labelName: 'Termination protection', name: 'field_termination_protection',
            defaultValue: false
          },
          {
            type: 'boolean', labelName: 'Monitoring', name: 'field_monitoring',
            defaultValue: false
          },
          {
            type: 'select', labelName: 'Schedule', name: 'field_schedule',
            url: '/cloud_dashboard/schedule_options',
            defaultValue: '',
          },
          {
            type: 'textarea', labelName: 'User data', name: 'field_user_data',
            defaultValue: ''
          },
        ]
      },
      {
        type: 'panel',
        panelName: 'Others',
        keyValueRecords: [
          {
            type: 'textarea', labelName: 'Revision log message', name: 'revision_log_message',
            defaultValue: ''
          },
        ]
      },
    ],
    submitButtonLabel: 'Copy',
  },
  {
    cloudServiceProvider: 'aws_cloud',
    entityName: 'cloud_launch_template',
+31 −0
Changes for src/Controller/ApiController.php: 31 added lines, 0 removed lines.
Original line number Diff line number Diff line
@@ -120,4 +120,35 @@ class ApiController extends ControllerBase implements ApiControllerInterface {
    }
  }

  /**
   * {@inheritdoc}
   */
  public function getImageOptions($cloud_context): JsonResponse {
    /** @var \Drupal\aws_cloud\Entity\Ec2\ImageInterface[] $images */
    $images = $this->entityTypeManager
      ->getStorage("aws_cloud_image")
      ->loadByProperties([
        'cloud_context' => $cloud_context,
      ]);

    $options = [];
    foreach ($images as $image) {
      $options[$image->getImageId()] = sprintf('%s (%s)',
        $image->getName(),
        $image->getImageId()
      );
    }

    natcasesort($options);

    $output = [];
    foreach ($options ?: [] as $value => $label) {
      $output[] = [
        'value' => $value,
        'label' => $label,
      ];
    }
    return new JsonResponse($output, 200);
  }

}
+11 −0
Changes for src/Controller/ApiControllerInterface.php: 11 added lines, 0 removed lines.
Original line number Diff line number Diff line
@@ -31,4 +31,15 @@ interface ApiControllerInterface {
   */
  public function operateEntity(Request $request, string $cloud_service_provider, string $cloud_context, string $entity_type_id, string $entity_id, string $command): JsonResponse;

  /**
   * Get select options of image.
   *
   * @param string $cloud_context
   *   The cloud context.
   *
   * @return \Symfony\Component\HttpFoundation\JsonResponse
   *   The JSON response.
   */
  public function getImageOptions($cloud_context): JsonResponse;

}