summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZuul <zuul@review.opendev.org>2021-04-27 14:13:27 +0000
committerGerrit Code Review <review@openstack.org>2021-04-27 14:13:27 +0000
commit0c4937897092533091ff106fd41f145e833a0ee5 (patch)
tree0a93a9001dd0f385f3b238ccb2baa72419157a88
parent7b2df7b9586861f8d36311371d8858bf725f516d (diff)
parentc63e4c91aea30c3732403d9f5c031478e735d251 (diff)
downloadhorizon-0c4937897092533091ff106fd41f145e833a0ee5.tar.gz
Merge "Fix community image handling in launch instance form" into stable/victoria
-rw-r--r--openstack_dashboard/dashboards/project/static/dashboard/project/workflow/launch-instance/launch-instance-model.service.js29
-rw-r--r--openstack_dashboard/dashboards/project/static/dashboard/project/workflow/launch-instance/launch-instance-model.service.spec.js67
2 files changed, 63 insertions, 33 deletions
diff --git a/openstack_dashboard/dashboards/project/static/dashboard/project/workflow/launch-instance/launch-instance-model.service.js b/openstack_dashboard/dashboards/project/static/dashboard/project/workflow/launch-instance/launch-instance-model.service.js
index c8878c411..91d03a323 100644
--- a/openstack_dashboard/dashboards/project/static/dashboard/project/workflow/launch-instance/launch-instance-model.service.js
+++ b/openstack_dashboard/dashboards/project/static/dashboard/project/workflow/launch-instance/launch-instance-model.service.js
@@ -567,7 +567,12 @@
if (enabledImage || enabledSnapshot) {
var filter = {status: 'active', sort_key: 'name', sort_dir: 'asc'};
- glanceAPI.getImages(filter).then(
+ var filterCommunity = angular.merge({}, filter, {visibility: 'community'});
+ var imagePromises = [
+ glanceAPI.getImages(filter),
+ glanceAPI.getImages(filterCommunity)
+ ];
+ $q.all(imagePromises).then(
function(data) {
onGetImageSources(data, enabledImage, enabledSnapshot);
}
@@ -678,13 +683,21 @@
model.imageSnapshots.length = 0;
model.images.length = 0;
- angular.forEach(data.data.items, function(image) {
- if (isValidSnapshot(image) && enabledSnapshot) {
- model.imageSnapshots.push(image);
- } else if (isValidImage(image) && enabledImage) {
- image.name_or_id = image.name || image.id;
- model.images.push(image);
- }
+ var imageIdsProcessed = [];
+
+ angular.forEach(data, function(data) {
+ angular.forEach(data.data.items, function(image) {
+ if (imageIdsProcessed.includes(image.id)) {
+ return;
+ }
+ imageIdsProcessed.push(image.id);
+ if (isValidSnapshot(image) && enabledSnapshot) {
+ model.imageSnapshots.push(image);
+ } else if (isValidImage(image) && enabledImage) {
+ image.name_or_id = image.name || image.id;
+ model.images.push(image);
+ }
+ });
});
if (enabledImage) {
diff --git a/openstack_dashboard/dashboards/project/static/dashboard/project/workflow/launch-instance/launch-instance-model.service.spec.js b/openstack_dashboard/dashboards/project/static/dashboard/project/workflow/launch-instance/launch-instance-model.service.spec.js
index 112803a3e..471770581 100644
--- a/openstack_dashboard/dashboards/project/static/dashboard/project/workflow/launch-instance/launch-instance-model.service.spec.js
+++ b/openstack_dashboard/dashboards/project/static/dashboard/project/workflow/launch-instance/launch-instance-model.service.spec.js
@@ -131,19 +131,35 @@
beforeEach(module(function($provide) {
$provide.value('horizon.app.core.openstack-service-api.glance', {
- getImages: function () {
- var images = [
- {container_format: 'aki', properties: {}},
- {container_format: 'ari', properties: {}},
- {container_format: 'ami', properties: {}, name: 'ami_image'},
- {container_format: 'raw', properties: {}, name: 'raw_image'},
- {container_format: 'ami', properties: {image_type: 'image'}, id: '1'},
- {container_format: 'raw', properties: {image_type: 'image'}, id: '2'},
- {container_format: 'ami', properties: {
- block_device_mapping: '[{"source_type": "snapshot"}]'}},
- {container_format: 'raw', properties: {
- block_device_mapping: '[{"source_type": "snapshot"}]'}}
- ];
+ getImages: function (params) {
+ var images;
+ if (params.visibility === 'community') {
+ images = [
+ {id: '10', container_format: 'raw', properties: {image_type: 'image'},
+ visibility: 'community'},
+ // ID 6 is already returned by the first call (below), so this should be ignored.
+ // To clarify the difference, the content here is different intentionally.
+ {id: '6', container_format: 'raw', properties: {image_type: 'image'},
+ visibility: 'community'}
+ ];
+ } else {
+ images = [
+ // container_format aki and ari are not considered as bootable
+ {id: '1', container_format: 'aki', properties: {}},
+ {id: '2', container_format: 'ari', properties: {}},
+ // The following images are considered as "image" sources.
+ {id: '3', container_format: 'ami', properties: {}, name: 'ami_image'},
+ {id: '4', container_format: 'raw', properties: {}, name: 'raw_image'},
+ {id: '5', container_format: 'ami', properties: {image_type: 'image'}},
+ {id: '6', container_format: 'raw', properties: {image_type: 'image'}},
+ // The following images are considered as "snapshot" sources.
+ {id: '7', container_format: 'ami',
+ properties: {block_device_mapping: '[{"source_type": "snapshot"}]'}},
+ {id: '8', container_format: 'raw',
+ properties: {block_device_mapping: '[{"source_type": "snapshot"}]'}},
+ {id: '9', container_format: 'raw', properties: {image_type: 'snapshot'}}
+ ];
+ }
var deferred = $q.defer();
deferred.resolve({data: {items: images}});
@@ -387,22 +403,23 @@
expect(model.newInstanceSpec).toBeDefined();
var expectedImages = [
- {container_format: 'ami', properties: {}, name: 'ami_image', name_or_id: 'ami_image'},
- {container_format: 'raw', properties: {}, name: 'raw_image', name_or_id: 'raw_image'},
- {container_format: 'ami', properties: {image_type: 'image'}, id: '1', name_or_id: '1'},
- {container_format: 'raw', properties: {image_type: 'image'}, id: '2', name_or_id: '2'}
+ {id: '3', container_format: 'ami', properties: {}, name: 'ami_image',
+ name_or_id: 'ami_image'},
+ {id: '4', container_format: 'raw', properties: {}, name: 'raw_image',
+ name_or_id: 'raw_image'},
+ {id: '5', container_format: 'ami', properties: {image_type: 'image'}, name_or_id: '5'},
+ {id: '6', container_format: 'raw', properties: {image_type: 'image'}, name_or_id: '6'},
+ {id: '10', container_format: 'raw', properties: {image_type: 'image'}, name_or_id: '10',
+ visibility: 'community'}
];
expect(model.images).toEqual(expectedImages);
var expectedSnapshots = [
- {
- container_format: 'ami',
- properties: {block_device_mapping: '[{"source_type": "snapshot"}]'}
- },
- {
- container_format: 'raw',
- properties: {block_device_mapping: '[{"source_type": "snapshot"}]'}
- }
+ {id: '7', container_format: 'ami',
+ properties: {block_device_mapping: '[{"source_type": "snapshot"}]'}},
+ {id: '8', container_format: 'raw',
+ properties: {block_device_mapping: '[{"source_type": "snapshot"}]'}},
+ {id: '9', container_format: 'raw', properties: {image_type: 'snapshot'}}
];
expect(model.imageSnapshots).toEqual(expectedSnapshots);