diff --git a/modules/cloud_service_providers/openstack/src/Service/OpenStackBatchOperations.php b/modules/cloud_service_providers/openstack/src/Service/OpenStackBatchOperations.php index c465a78564fb78edeea1fec8bb1ab9a830baa267..e708184d653b58ca838d0cd9e85bf2d5457f8324 100644 --- a/modules/cloud_service_providers/openstack/src/Service/OpenStackBatchOperations.php +++ b/modules/cloud_service_providers/openstack/src/Service/OpenStackBatchOperations.php @@ -1251,7 +1251,7 @@ class OpenStackBatchOperations { public static function updateStackResource(string $cloud_context, array $resource): void { $timestamp = time(); $name = $resource['Name'] ?? $resource['ResourceId']; - $uid = 0; + $uid = $resource['Uid'] ?? 0; $entity_id = \Drupal::service('cloud')->getEntityId($cloud_context, 'openstack_stack_resource', 'resource_id', $resource['ResourceId']); // Skip if $entity already exists, by updating 'refreshed' time. diff --git a/modules/cloud_service_providers/openstack/src/Service/Rest/OpenStackService.php b/modules/cloud_service_providers/openstack/src/Service/Rest/OpenStackService.php index f3f4172dee48fc231b1f39cde509c3e54bf1edd3..d7397563852eabf31e4bb33c09608d927981487a 100644 --- a/modules/cloud_service_providers/openstack/src/Service/Rest/OpenStackService.php +++ b/modules/cloud_service_providers/openstack/src/Service/Rest/OpenStackService.php @@ -6215,6 +6215,7 @@ class OpenStackService extends CloudServiceBase implements OpenStackServiceInter } $resource['StackEntityId'] = $stack->id(); + $resource['Uid'] = $stack->getOwner(); if ($batch_mode) { $batch_builder->addOperation([ diff --git a/modules/cloud_service_providers/openstack/tests/src/Functional/OpenStack/OpenStackStackTest.php b/modules/cloud_service_providers/openstack/tests/src/Functional/OpenStack/OpenStackStackTest.php index 899e561c52f5625df3b69d739f2d0b6617c98fd0..f167f8cb88e67fa953236ad65718403b3cd22d16 100644 --- a/modules/cloud_service_providers/openstack/tests/src/Functional/OpenStack/OpenStackStackTest.php +++ b/modules/cloud_service_providers/openstack/tests/src/Functional/OpenStack/OpenStackStackTest.php @@ -2,6 +2,8 @@ namespace Drupal\Tests\openstack\Functional\OpenStack; +use Drupal\Component\Serialization\Yaml; +use Drupal\cloud\Service\CloudServiceInterface; use Drupal\openstack\Entity\OpenStackStack; use Drupal\Tests\openstack\Functional\OpenStackTestBase; @@ -25,6 +27,7 @@ class OpenStackStackTest extends OpenStackTestBase { 'view any openstack stack', 'edit any openstack stack', 'delete any openstack stack', + 'list openstack stack resource', ]; } @@ -36,6 +39,7 @@ class OpenStackStackTest extends OpenStackTestBase { protected function getMockDataTemplateVars(): array { return [ 'stack_id' => 'eni-' . $this->getRandomId(), + 'resource_id' => 'rni-' . $this->getRandomId(), 'project_id' => $this->cloudConfig->get('field_project_id')->value, 'create_time' => date('c'), ]; @@ -54,20 +58,32 @@ class OpenStackStackTest extends OpenStackTestBase { $this->drupalGet("/clouds/openstack/$cloud_context/stack"); $this->assertNoErrorMessage(); + $cloud_service_mock = $this->createMock(CloudServiceInterface::class); + // Add a new stack. $add = $this->createStackTestFormData(self::OPENSTACK_STACK_REPEAT_COUNT); $add_extra = $this->createStackTestExtraFormData(self::OPENSTACK_STACK_REPEAT_COUNT); for ($i = 0, $num = 1; $i < self::OPENSTACK_STACK_REPEAT_COUNT; $i++, $num++) { $mock_data = array_merge_recursive($add[$i], $add_extra[$i]); - $this->addStackMockData($mock_data, $cloud_context, $this->webUser->id()); + $conditions = []; + $conditions['stack_id'] = $mock_data['stack_id']; + $cloud_service_mock->expects($this->any()) + ->method('loadAllEntities') + ->with($cloud_context, 'openstack_stack', $conditions) + ->willReturnMap([$mock_data]); + $this->addStackMockData($mock_data, $cloud_context, $this->webUser->id(), $num); $this->showStackMockData($mock_data, $cloud_context, $this->webUser->id()); - + $this->addStackResourceMockData($mock_data, $this->webUser->id(), $num); $this->drupalGet("/clouds/openstack/$cloud_context/stack/add"); $this->submitForm( $add[$i], $this->t('Next') ); + unset( + $add_extra[$i]['stack_id'] + ); + $this->submitForm( $add_extra[$i], $this->t('Save') @@ -94,6 +110,11 @@ class OpenStackStackTest extends OpenStackTestBase { $this->assertSession()->pageTextContains($this->webUser->getAccountName()); // Make sure stack status. $this->assertSession()->pageTextContains('CREATE_COMPLETE'); + + $template_data = Yaml::decode($add[$i]['template_data']); + foreach ($template_data['resources'] ?: [] as $name => $resource) { + $this->assertSession()->pageTextContains($name); + } } for ($i = 0, $num = 1; $i < self::OPENSTACK_STACK_REPEAT_COUNT; $i++, $num++) { @@ -118,6 +139,10 @@ class OpenStackStackTest extends OpenStackTestBase { $this->t('Next') ); + unset( + $edit_extra[$i]['stack_id'] + ); + $this->submitForm( $edit_extra[$i], $this->t('Save') diff --git a/modules/cloud_service_providers/openstack/tests/src/Traits/OpenStackTestFormDataTrait.php b/modules/cloud_service_providers/openstack/tests/src/Traits/OpenStackTestFormDataTrait.php index c67f9b94797165d09ef9680709b7e97498c99688..099ad675a59a685a802c33323dcdb0484a348172 100644 --- a/modules/cloud_service_providers/openstack/tests/src/Traits/OpenStackTestFormDataTrait.php +++ b/modules/cloud_service_providers/openstack/tests/src/Traits/OpenStackTestFormDataTrait.php @@ -733,6 +733,7 @@ EOS; for ($i = 0, $num = 1; $i < $repeat_count; $i++, $num++) { $data[$i] = [ + 'stack_id' => "stack-{$this->getRandomId()}", 'name' => "stack-name-$num-{$this->random->name(8, TRUE)}", 'timeout_mins' => 60, ]; diff --git a/modules/cloud_service_providers/openstack/tests/src/Traits/OpenStackTestMockTrait.php b/modules/cloud_service_providers/openstack/tests/src/Traits/OpenStackTestMockTrait.php index 71a844f57c220a40f013a3a937963baeff529504..064c7c5e18b2ad7ffd25488a19e770dd27999398 100644 --- a/modules/cloud_service_providers/openstack/tests/src/Traits/OpenStackTestMockTrait.php +++ b/modules/cloud_service_providers/openstack/tests/src/Traits/OpenStackTestMockTrait.php @@ -953,10 +953,10 @@ trait OpenStackTestMockTrait { $mock_data = $this->getMockDataFromConfig(); $vars = $this->getMockDataTemplateVars(); - $mock_data['CreateStack']['Stack']['StackId'] = $vars['stack_id']; + $mock_data['CreateStack']['Stack']['StackId'] = $data['stack_id']; $stack = [ - 'StackId' => $vars['stack_id'], + 'StackId' => $data['stack_id'], 'Name' => $data['name'], 'ProjectId' => $vars['project_id'], 'TimeoutMins' => 60, @@ -976,6 +976,45 @@ trait OpenStackTestMockTrait { $this->updateMockDataToConfig($mock_data); } + /** + * Add Stack resource mock data. + * + * @param array $data + * Array of stack data. + * @param int $uid + * The uid. + * @param int $stack_entity_id + * The stack entity id. + * + * @throws \Exception + */ + protected function addStackResourceMockData( + array $data, + int $uid = 0, + int $stack_entity_id = 0 + ): void { + $mock_data = $this->getMockDataFromConfig(); + $vars = $this->getMockDataTemplateVars(); + + $resource = [ + 'ResourceId' => 'resource-' . $this->getRandomId(), + 'Name' => 'sample_net', + 'ProjectId' => $vars['project_id'], + 'StackId' => $data['stack_id'], + 'StackName' => $data['name'], + 'StackEntityId' => $stack_entity_id, + 'ResourceStatus' => 'CREATE_COMPLETE', + 'ResourceStatusReason' => 'state changed', + 'ResourceType' => 'OS::Neutron::Net', + 'CreationTime' => $vars['create_time'], + 'UpdatedTime' => $vars['create_time'], + 'Uid' => $uid, + ]; + + $mock_data['describeStackResources']['Resources'][] = $resource; + $this->updateMockDataToConfig($mock_data); + } + /** * Update Stack mock data. *