319 lines
9.7 KiB
JavaScript
319 lines
9.7 KiB
JavaScript
/**
|
|
* (c) Copyright 2015 Hewlett-Packard Development Company, L.P.
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
* not use this file except in compliance with the License. You may obtain
|
|
* a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
* License for the specific language governing permissions and limitations
|
|
* under the License.
|
|
*/
|
|
|
|
(function() {
|
|
'use strict';
|
|
|
|
/**
|
|
* @ngdoc overview
|
|
* @ngname horizon.app.core.images
|
|
*
|
|
* @description
|
|
* Provides all of the services and widgets required
|
|
* to support and display images related content.
|
|
*/
|
|
angular
|
|
.module('horizon.app.core.images', [
|
|
'ngRoute',
|
|
'horizon.app.core.images.actions',
|
|
'horizon.app.core.images.details'
|
|
])
|
|
.constant('horizon.app.core.images.events', events())
|
|
.constant('horizon.app.core.images.non_bootable_image_types', ['aki', 'ari'])
|
|
.constant('horizon.app.core.images.validationRules', validationRules())
|
|
.constant('horizon.app.core.images.imageFormats', imageFormats())
|
|
.constant('horizon.app.core.images.resourceType', 'OS::Glance::Image')
|
|
.constant('horizon.app.core.images.statuses', {
|
|
'active': gettext('Active'),
|
|
'saving': gettext('Saving'),
|
|
'queued': gettext('Queued'),
|
|
'pending_delete': gettext('Pending Delete'),
|
|
'killed': gettext('Killed'),
|
|
'deactivated': gettext('Deactivated'),
|
|
'deleted': gettext('Deleted')
|
|
})
|
|
.constant('horizon.app.core.images.transitional-statuses', [
|
|
"saving",
|
|
"queued",
|
|
"pending_delete"
|
|
])
|
|
.run(run)
|
|
.config(config);
|
|
|
|
run.$inject = [
|
|
'horizon.framework.conf.resource-type-registry.service',
|
|
'horizon.app.core.images.basePath',
|
|
'horizon.app.core.images.service',
|
|
'horizon.app.core.images.statuses',
|
|
'horizon.app.core.images.resourceType',
|
|
'horizon.framework.util.filters.$memoize',
|
|
'horizon.app.core.openstack-service-api.keystone'
|
|
];
|
|
|
|
function run(registry,
|
|
basePath,
|
|
imagesService,
|
|
statuses,
|
|
imageResourceType,
|
|
$memoize,
|
|
keystone) {
|
|
registry.getResourceType(imageResourceType)
|
|
.setNames('Image', 'Images', ngettext('Image', 'Images', 1))
|
|
.setSummaryTemplateUrl(basePath + 'details/drawer.html')
|
|
.setDefaultIndexUrl('/project/images/')
|
|
.setItemInTransitionFunction(imagesService.isInTransition)
|
|
.setProperties(imageProperties(imagesService, statuses))
|
|
.setListFunction(imagesService.getImagesPromise)
|
|
.setNeedsFilterFirstFunction(imagesService.getFilterFirstSettingPromise)
|
|
.tableColumns
|
|
.append({
|
|
id: 'owner',
|
|
priority: 1,
|
|
filters: [$memoize(keystone.getProjectName)],
|
|
policies: [{rules: [['identity', 'identity:get_project']]}]
|
|
})
|
|
.append({
|
|
id: 'name',
|
|
priority: 1,
|
|
sortDefault: true,
|
|
classes: "word-wrap",
|
|
urlFunction: imagesService.getDetailsPath
|
|
})
|
|
.append({
|
|
id: 'type',
|
|
priority: 1
|
|
})
|
|
.append({
|
|
id: 'status',
|
|
priority: 1,
|
|
itemInTransitionFunction: imagesService.isInTransition
|
|
})
|
|
.append({
|
|
id: 'visibility',
|
|
priority: 1
|
|
})
|
|
.append({
|
|
id: 'protected',
|
|
priority: 1
|
|
})
|
|
.append({
|
|
id: 'disk_format',
|
|
priority: 2
|
|
})
|
|
.append({
|
|
id: 'size',
|
|
priority: 2
|
|
});
|
|
|
|
registry.getResourceType(imageResourceType).filterFacets
|
|
.append({
|
|
label: gettext('Name'),
|
|
name: 'name',
|
|
isServer: true,
|
|
singleton: true,
|
|
persistent: true
|
|
})
|
|
.append({
|
|
label: gettext('Status'),
|
|
name: 'status',
|
|
isServer: true,
|
|
singleton: true,
|
|
options: [
|
|
{label: gettext('Active'), key: 'active'},
|
|
{label: gettext('Saving'), key: 'saving'},
|
|
{label: gettext('Queued'), key: 'queued'},
|
|
{label: gettext('Pending Delete'), key: 'pending_delete'},
|
|
{label: gettext('Killed'), key: 'killed'},
|
|
{label: gettext('Deactivated'), key: 'deactivated'},
|
|
{label: gettext('Deleted'), key: 'deleted'}
|
|
]
|
|
})
|
|
.append({
|
|
label: gettext('Visibility'),
|
|
name: 'visibility',
|
|
isServer: true,
|
|
singleton: true,
|
|
options: [
|
|
{label: gettext('Public'), key: 'public'},
|
|
{label: gettext('Private'), key: 'private'},
|
|
{label: gettext('Shared With Project'), key: 'shared'},
|
|
{label: gettext('Community'), key: 'community'}
|
|
]
|
|
})
|
|
.append({
|
|
label: gettext('Protected'),
|
|
name: 'protected',
|
|
isServer: true,
|
|
singleton: true,
|
|
options: [
|
|
{label: gettext('Yes'), key: 'true'},
|
|
{label: gettext('No'), key: 'false'}
|
|
]
|
|
})
|
|
.append({
|
|
label: gettext('Format'),
|
|
name: 'disk_format',
|
|
isServer: true,
|
|
singleton: true,
|
|
options: [
|
|
{label: gettext('AKI'), key: 'aki'},
|
|
{label: gettext('AMI'), key: 'ami'},
|
|
{label: gettext('ARI'), key: 'ari'},
|
|
{label: gettext('Docker'), key: 'docker'},
|
|
{label: gettext('ISO'), key: 'iso'},
|
|
{label: gettext('OVA'), key: 'ova'},
|
|
{label: gettext('PLOOP'), key: 'ploop'},
|
|
{label: gettext('QCOW2'), key: 'qcow2'},
|
|
{label: gettext('Raw'), key: 'raw'},
|
|
{label: gettext('VDI'), key: 'vdi'},
|
|
{label: gettext('VHD'), key: 'vhd'},
|
|
{label: gettext('VMDK'), key: 'vmdk'}
|
|
]
|
|
})
|
|
.append({
|
|
label: gettext('Min. Size (bytes)'),
|
|
name: 'size_min',
|
|
isServer: true,
|
|
singleton: true
|
|
})
|
|
.append({
|
|
label: gettext('Max. Size (bytes)'),
|
|
name: 'size_max',
|
|
isServer: true,
|
|
singleton: true
|
|
});
|
|
}
|
|
|
|
/**
|
|
* @ngdoc constant
|
|
* @name horizon.app.core.images.validationRules
|
|
* @description constants for use in validation fields
|
|
*/
|
|
function validationRules() {
|
|
return {
|
|
integer: /^[0-9]+$/,
|
|
fieldMaxLength: 255
|
|
};
|
|
}
|
|
|
|
/**
|
|
* @ngdoc constant
|
|
* @name horizon.app.core.images.imageFormats
|
|
* @description constants for list of image types in dropdowns
|
|
*/
|
|
function imageFormats() {
|
|
return {
|
|
iso: gettext('ISO - Optical Disk Image'),
|
|
ova: gettext('OVA - Open Virtual Appliance'),
|
|
ploop: gettext('PLOOP - Virtuozzo/Parallels Loopback Disk'),
|
|
qcow2: gettext('QCOW2 - QEMU Emulator'),
|
|
raw: gettext('Raw'),
|
|
vdi: gettext('VDI - Virtual Disk Image'),
|
|
vhd: gettext('VHD - Virtual Hard Disk'),
|
|
vmdk: gettext('VMDK - Virtual Machine Disk'),
|
|
aki: gettext('AKI - Amazon Kernel Image'),
|
|
ami: gettext('AMI - Amazon Machine Image'),
|
|
ari: gettext('ARI - Amazon Ramdisk Image'),
|
|
docker: gettext('Docker')
|
|
};
|
|
}
|
|
|
|
/**
|
|
* @name imageProperties
|
|
* @description resource properties for image module
|
|
*/
|
|
function imageProperties(imagesService, statuses) {
|
|
return {
|
|
id: gettext('ID'),
|
|
checksum: gettext('Checksum'),
|
|
members: gettext('Members'),
|
|
min_disk: gettext('Min. Disk'),
|
|
min_ram: gettext('Min. RAM'),
|
|
name: gettext('Name'),
|
|
owner: gettext('Owner'),
|
|
tags: gettext('Tags'),
|
|
'updated_at': {label: gettext('Updated At'), filters: ['simpleDate'] },
|
|
virtual_size: gettext('Virtual Size'),
|
|
visibility: gettext('Visibility'),
|
|
description: gettext('Description'),
|
|
architecture: gettext('Architecture'),
|
|
kernel_id: gettext('Kernel ID'),
|
|
ramdisk_id: gettext('Ramdisk ID'),
|
|
'created_at': {label: gettext('Created At'), filters: ['simpleDate'] },
|
|
container_format: { label: gettext('Container Format'), filters: ['uppercase'] },
|
|
disk_format: { label: gettext('Disk Format'), filters: ['noValue', 'uppercase'] },
|
|
is_public: { label: gettext('Is Public'), filters: ['yesno'] },
|
|
type: { label: gettext('Type')},
|
|
'protected': { label: gettext('Protected'), filters: ['yesno'] },
|
|
size: { label: gettext('Size'), filters: ['bytes'] },
|
|
status: { label: gettext('Status'), values: statuses }
|
|
};
|
|
}
|
|
|
|
/**
|
|
* @ngdoc value
|
|
* @name horizon.app.core.images.events
|
|
* @description a list of events for images
|
|
* @returns {Object} The event object
|
|
*/
|
|
function events() {
|
|
return {
|
|
IMAGE_UPLOAD_PROGRESS: 'horizon.app.core.images.IMAGE_UPLOAD_PROGRESS'
|
|
};
|
|
}
|
|
|
|
config.$inject = [
|
|
'$provide',
|
|
'$windowProvider',
|
|
'$routeProvider',
|
|
'horizon.app.core.detailRoute'
|
|
];
|
|
|
|
/**
|
|
* @name config
|
|
* @param {Object} $provide
|
|
* @param {Object} $windowProvider
|
|
* @param {Object} $routeProvider
|
|
* @description Routes used by this module.
|
|
* @returns {undefined} Returns nothing
|
|
*/
|
|
function config($provide, $windowProvider, $routeProvider, detailRoute) {
|
|
var path = $windowProvider.$get().STATIC_URL + 'app/core/images/';
|
|
$provide.constant('horizon.app.core.images.basePath', path);
|
|
|
|
$routeProvider.when('/project/images/:id', {
|
|
redirectTo: goToAngularDetails
|
|
});
|
|
|
|
$routeProvider.when('/admin/images/:id/detail', {
|
|
redirectTo: goToAngularDetails
|
|
});
|
|
|
|
$routeProvider.when('/project/images', {
|
|
templateUrl: path + 'panel.html'
|
|
});
|
|
|
|
$routeProvider.when('/admin/images', {
|
|
templateUrl: path + 'admin-panel.html'
|
|
});
|
|
|
|
function goToAngularDetails(params) {
|
|
return detailRoute + 'OS::Glance::Image/' + params.id;
|
|
}
|
|
}
|
|
|
|
})();
|