Loading cloud.routing.yml +12 −0 Changes for cloud.routing.yml: 12 added lines, 0 removed lines. Original line number Diff line number Diff line Loading @@ -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: Loading modules/cloud_dashboard/cloud_dashboard/src/constant/form_template/launch_template/aws_cloud.ts +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', Loading src/Controller/ApiController.php +31 −0 Changes for src/Controller/ApiController.php: 31 added lines, 0 removed lines. Original line number Diff line number Diff line Loading @@ -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); } } src/Controller/ApiControllerInterface.php +11 −0 Changes for src/Controller/ApiControllerInterface.php: 11 added lines, 0 removed lines. Original line number Diff line number Diff line Loading @@ -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; } Loading
cloud.routing.yml +12 −0 Changes for cloud.routing.yml: 12 added lines, 0 removed lines. Original line number Diff line number Diff line Loading @@ -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: Loading
modules/cloud_dashboard/cloud_dashboard/src/constant/form_template/launch_template/aws_cloud.ts +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', Loading
src/Controller/ApiController.php +31 −0 Changes for src/Controller/ApiController.php: 31 added lines, 0 removed lines. Original line number Diff line number Diff line Loading @@ -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); } }
src/Controller/ApiControllerInterface.php +11 −0 Changes for src/Controller/ApiControllerInterface.php: 11 added lines, 0 removed lines. Original line number Diff line number Diff line Loading @@ -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; }