Add details view for capsule
This patch adds details view for capsule. Change-Id: Ia6a46b88aeedaea3642c1d424fedaae65f485655 Partial-Implements: blueprint capsule
This commit is contained in:
@@ -272,6 +272,10 @@ def capsule_list(request, limit=None, marker=None, sort_key=None,
|
|||||||
sort_dir)
|
sort_dir)
|
||||||
|
|
||||||
|
|
||||||
|
def capsule_show(request, id):
|
||||||
|
return zunclient(request).capsules.get(id)
|
||||||
|
|
||||||
|
|
||||||
def image_list(request, limit=None, marker=None, sort_key=None,
|
def image_list(request, limit=None, marker=None, sort_key=None,
|
||||||
sort_dir=None, detail=False):
|
sort_dir=None, detail=False):
|
||||||
# FIXME(shu-mutou): change "detail" param to True, if it enabled.
|
# FIXME(shu-mutou): change "detail" param to True, if it enabled.
|
||||||
|
|||||||
@@ -179,6 +179,17 @@ class Capsules(generic.View):
|
|||||||
return {'items': [i.to_dict() for i in result]}
|
return {'items': [i.to_dict() for i in result]}
|
||||||
|
|
||||||
|
|
||||||
|
@urls.register
|
||||||
|
class Capsule(generic.View):
|
||||||
|
"""API for retrieving a single capsule"""
|
||||||
|
url_regex = r'zun/capsules/(?P<id>[^/]+)$'
|
||||||
|
|
||||||
|
@rest_utils.ajax()
|
||||||
|
def get(self, request, id):
|
||||||
|
"""Get a specific capsule"""
|
||||||
|
return change_to_id(client.capsule_show(request, id).to_dict())
|
||||||
|
|
||||||
|
|
||||||
@urls.register
|
@urls.register
|
||||||
class Images(generic.View):
|
class Images(generic.View):
|
||||||
"""API for Zun Images"""
|
"""API for Zun Images"""
|
||||||
|
|||||||
@@ -26,7 +26,8 @@
|
|||||||
angular
|
angular
|
||||||
.module('horizon.dashboard.container.capsules', [
|
.module('horizon.dashboard.container.capsules', [
|
||||||
'ngRoute',
|
'ngRoute',
|
||||||
'horizon.dashboard.container.capsules.actions'
|
'horizon.dashboard.container.capsules.actions',
|
||||||
|
'horizon.dashboard.container.capsules.details'
|
||||||
])
|
])
|
||||||
.constant('horizon.dashboard.container.capsules.events', events())
|
.constant('horizon.dashboard.container.capsules.events', events())
|
||||||
.constant('horizon.dashboard.container.capsules.resourceType', 'OS::Zun::Capsule')
|
.constant('horizon.dashboard.container.capsules.resourceType', 'OS::Zun::Capsule')
|
||||||
@@ -47,6 +48,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
run.$inject = [
|
run.$inject = [
|
||||||
|
'$filter',
|
||||||
'horizon.framework.conf.resource-type-registry.service',
|
'horizon.framework.conf.resource-type-registry.service',
|
||||||
'horizon.app.core.openstack-service-api.zun',
|
'horizon.app.core.openstack-service-api.zun',
|
||||||
'horizon.dashboard.container.capsules.basePath',
|
'horizon.dashboard.container.capsules.basePath',
|
||||||
@@ -54,19 +56,19 @@
|
|||||||
'horizon.dashboard.container.capsules.service'
|
'horizon.dashboard.container.capsules.service'
|
||||||
];
|
];
|
||||||
|
|
||||||
function run(registry, zun, basePath, resourceType, capsuleService) {
|
function run($filter, registry, zun, basePath, resourceType, capsuleService) {
|
||||||
registry.getResourceType(resourceType)
|
registry.getResourceType(resourceType)
|
||||||
.setNames(gettext('Capsule'), gettext('Capsules'))
|
.setNames(gettext('Capsule'), gettext('Capsules'))
|
||||||
// for detail summary view on table row.
|
|
||||||
.setSummaryTemplateUrl(basePath + 'drawer.html')
|
.setSummaryTemplateUrl(basePath + 'drawer.html')
|
||||||
// for table row items and detail summary view.
|
.setDefaultIndexUrl('/project/container/capsules/')
|
||||||
.setProperties(capsuleProperties())
|
.setProperties(capsuleProperties())
|
||||||
.setListFunction(capsuleService.getCapsulesPromise)
|
.setListFunction(capsuleService.getCapsulesPromise)
|
||||||
.tableColumns
|
.tableColumns
|
||||||
.append({
|
.append({
|
||||||
id: 'meta_name',
|
id: 'name',
|
||||||
priority: 1,
|
priority: 1,
|
||||||
sortDefault: true
|
sortDefault: true,
|
||||||
|
urlFunction: capsuleService.getDetailsPath
|
||||||
})
|
})
|
||||||
.append({
|
.append({
|
||||||
id: 'id',
|
id: 'id',
|
||||||
@@ -87,13 +89,13 @@
|
|||||||
// for magic-search
|
// for magic-search
|
||||||
registry.getResourceType(resourceType).filterFacets
|
registry.getResourceType(resourceType).filterFacets
|
||||||
.append({
|
.append({
|
||||||
'label': gettext('ID'),
|
'label': gettext('Capsule ID'),
|
||||||
'name': 'id',
|
'name': 'capsule_id',
|
||||||
'singleton': true
|
'singleton': true
|
||||||
})
|
})
|
||||||
.append({
|
.append({
|
||||||
'label': gettext('Name'),
|
'label': gettext('Name'),
|
||||||
'name': 'meta_name',
|
'name': 'name',
|
||||||
'singleton': true
|
'singleton': true
|
||||||
})
|
})
|
||||||
.append({
|
.append({
|
||||||
@@ -115,7 +117,7 @@
|
|||||||
'links': {label: gettext('Links'), filters: ['noValue', 'json'] },
|
'links': {label: gettext('Links'), filters: ['noValue', 'json'] },
|
||||||
'memory': { label: gettext('Memory'), filters: ['noValue'] },
|
'memory': { label: gettext('Memory'), filters: ['noValue'] },
|
||||||
'meta_labels': {label: gettext('Labels'), filters: ['noValue', 'json'] },
|
'meta_labels': {label: gettext('Labels'), filters: ['noValue', 'json'] },
|
||||||
'meta_name': { label: gettext('Name'), filters: ['noName'] },
|
'name': { label: gettext('Name'), filters: ['noName'] },
|
||||||
'project_id': { label: gettext('Project ID'), filters: ['noValue'] },
|
'project_id': { label: gettext('Project ID'), filters: ['noValue'] },
|
||||||
'restart_policy': { label: gettext('Restart Policy'), filters: ['noValue'] },
|
'restart_policy': { label: gettext('Restart Policy'), filters: ['noValue'] },
|
||||||
'status': { label: gettext('Status'), filters: ['noValue'] },
|
'status': { label: gettext('Status'), filters: ['noValue'] },
|
||||||
|
|||||||
@@ -33,9 +33,36 @@
|
|||||||
*/
|
*/
|
||||||
function capsulesService(detailRoute, zun) {
|
function capsulesService(detailRoute, zun) {
|
||||||
return {
|
return {
|
||||||
|
getDetailsPath: getDetailsPath,
|
||||||
|
getCapsulePromise: getCapsulePromise,
|
||||||
getCapsulesPromise: getCapsulesPromise
|
getCapsulesPromise: getCapsulesPromise
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @ngdoc function
|
||||||
|
* @name getDetailsPath
|
||||||
|
* @param item {Object} - The capsule object
|
||||||
|
* @description
|
||||||
|
* Returns the relative path to the details view.
|
||||||
|
*/
|
||||||
|
function getDetailsPath(item) {
|
||||||
|
return detailRoute + 'OS::Zun::Capsule/' + item.id;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @ngdoc function
|
||||||
|
* @name getCapsulePromise
|
||||||
|
* @description
|
||||||
|
* Given an id, returns a promise for the capsule data.
|
||||||
|
*/
|
||||||
|
function getCapsulePromise(identifier) {
|
||||||
|
return zun.getCapsule(identifier).then(modifyDetails);
|
||||||
|
}
|
||||||
|
|
||||||
|
function modifyDetails(response) {
|
||||||
|
return {data: modifyItem(response.data)};
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* @ngdoc function
|
* @ngdoc function
|
||||||
* @name getCapsulesPromise
|
* @name getCapsulesPromise
|
||||||
@@ -52,9 +79,10 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
function modifyItem(item) {
|
function modifyItem(item) {
|
||||||
item.id = item.uuid;
|
item.name = item.meta_name;
|
||||||
item.trackBy = item.uuid;
|
item.capsule_id = item.id;
|
||||||
item.trackBy = item.trackBy.concat(item.updated_at);
|
item.id = item.uuid ? item.uuid : item.capsule_id;
|
||||||
|
item.trackBy = item.id.concat(item.updated_at);
|
||||||
return item;
|
return item;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,51 @@
|
|||||||
|
/**
|
||||||
|
* 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.dashboard.container.capsules.details
|
||||||
|
*
|
||||||
|
* @description
|
||||||
|
* Provides details features for capsule.
|
||||||
|
*/
|
||||||
|
angular.module('horizon.dashboard.container.capsules.details',
|
||||||
|
['horizon.framework.conf', 'horizon.app.core'])
|
||||||
|
.run(registerDetails);
|
||||||
|
|
||||||
|
registerDetails.$inject = [
|
||||||
|
'horizon.dashboard.container.capsules.basePath',
|
||||||
|
'horizon.dashboard.container.capsules.resourceType',
|
||||||
|
'horizon.dashboard.container.capsules.service',
|
||||||
|
'horizon.framework.conf.resource-type-registry.service'
|
||||||
|
];
|
||||||
|
|
||||||
|
function registerDetails(
|
||||||
|
basePath,
|
||||||
|
resourceType,
|
||||||
|
capsuleService,
|
||||||
|
registry
|
||||||
|
) {
|
||||||
|
registry.getResourceType(resourceType)
|
||||||
|
.setLoadFunction(capsuleService.getCapsulePromise)
|
||||||
|
.detailsViews
|
||||||
|
.append({
|
||||||
|
id: 'capsuleDetailsOverview',
|
||||||
|
name: gettext('Overview'),
|
||||||
|
template: basePath + 'details/overview.html'
|
||||||
|
});
|
||||||
|
}
|
||||||
|
})();
|
||||||
@@ -0,0 +1,37 @@
|
|||||||
|
/*
|
||||||
|
* 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";
|
||||||
|
|
||||||
|
angular
|
||||||
|
.module('horizon.dashboard.container.capsules')
|
||||||
|
.controller('horizon.dashboard.container.capsules.OverviewController', controller);
|
||||||
|
|
||||||
|
controller.$inject = [
|
||||||
|
'$scope', '$window'
|
||||||
|
];
|
||||||
|
|
||||||
|
function controller(
|
||||||
|
$scope, $window
|
||||||
|
) {
|
||||||
|
var ctrl = this;
|
||||||
|
ctrl.webRoot = $window.WEBROOT;
|
||||||
|
|
||||||
|
$scope.context.loadPromise.then(onGetCapsule);
|
||||||
|
|
||||||
|
function onGetCapsule(capsule) {
|
||||||
|
ctrl.capsule = capsule.data;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})();
|
||||||
@@ -0,0 +1,50 @@
|
|||||||
|
<div ng-controller="horizon.dashboard.container.capsules.OverviewController as ctrl">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-6 detail">
|
||||||
|
<h3 translate>Info</h3>
|
||||||
|
<hr>
|
||||||
|
<hz-resource-property-list
|
||||||
|
resource-type-name="OS::Zun::Capsule"
|
||||||
|
cls="dl-horizontal"
|
||||||
|
item="ctrl.capsule"
|
||||||
|
property-groups="[['id', 'name', 'capsule_versionid', 'status', 'status_reason',
|
||||||
|
'created_at', 'updated_at', 'project_id', 'user_id']]">
|
||||||
|
</hz-resource-property-list>
|
||||||
|
</div>
|
||||||
|
<div class="col-md-6 detail">
|
||||||
|
<h3 translate>Spec</h3>
|
||||||
|
<hr>
|
||||||
|
<hz-resource-property-list
|
||||||
|
resource-type-name="OS::Zun::Capsule"
|
||||||
|
cls="dl-horizontal"
|
||||||
|
item="ctrl.capsule"
|
||||||
|
property-groups="[['cpu', 'memory', 'restart_policy',
|
||||||
|
'meta_labels', 'links', 'addresses']]">
|
||||||
|
</hz-resource-property-list>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-6 detail">
|
||||||
|
<h3 translate>Containers</h3>
|
||||||
|
<hr>
|
||||||
|
<div class="row">
|
||||||
|
<dl class="col-md-12 dl-horizontal" ng-repeat="container in ctrl.capsule.containers">
|
||||||
|
<dt>Name</dt>
|
||||||
|
<dd><a href="{$ ctrl.webRoot $}ngdetails/OS::Zun::Container/{$ container.uuid $}">{$ container.name $}</a></dd>
|
||||||
|
<dt>Container ID</dt>
|
||||||
|
<dd>{$ container.uuid $}</dd>
|
||||||
|
</dl>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col-md-6 detail">
|
||||||
|
<h3 translate>Volumes</h3>
|
||||||
|
<hr>
|
||||||
|
<hz-resource-property-list
|
||||||
|
resource-type-name="OS::Zun::Capsule"
|
||||||
|
cls="dl-horizontal"
|
||||||
|
item="ctrl.capsule"
|
||||||
|
property-groups="[['volumes_info']]">
|
||||||
|
</hz-resource-property-list>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
@@ -0,0 +1,36 @@
|
|||||||
|
/**
|
||||||
|
* 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 controller
|
||||||
|
* @name horizon.dashboard.container.capsules.DrawerController
|
||||||
|
* @description
|
||||||
|
* This is the controller for the drawer (summary) view.
|
||||||
|
* Its primary purpose is to provide the metadata definitions to
|
||||||
|
* the template via the ctrl.metadataDefs member.
|
||||||
|
*/
|
||||||
|
angular
|
||||||
|
.module('horizon.dashboard.container.capsules')
|
||||||
|
.controller('horizon.dashboard.container.capsules.DrawerController', controller);
|
||||||
|
|
||||||
|
controller.$inject = [
|
||||||
|
];
|
||||||
|
|
||||||
|
function controller() {
|
||||||
|
}
|
||||||
|
|
||||||
|
})();
|
||||||
@@ -2,6 +2,5 @@
|
|||||||
resource-type-name="OS::Zun::Capsule"
|
resource-type-name="OS::Zun::Capsule"
|
||||||
item="item"
|
item="item"
|
||||||
property-groups="[['id', 'cpu', 'memory', 'capsule_versionid'],
|
property-groups="[['id', 'cpu', 'memory', 'capsule_versionid'],
|
||||||
['meta_labels', 'created_at', 'updated_at'],
|
['meta_labels', 'created_at', 'updated_at', 'status_reason']]">
|
||||||
['addresses', 'volumes_info', 'status_reason']]">
|
|
||||||
</hz-resource-property-list>
|
</hz-resource-property-list>
|
||||||
|
|||||||
@@ -54,6 +54,7 @@
|
|||||||
updatePortSecurityGroup: updatePortSecurityGroup,
|
updatePortSecurityGroup: updatePortSecurityGroup,
|
||||||
getZunAvailabilityZones: getZunAvailabilityZones,
|
getZunAvailabilityZones: getZunAvailabilityZones,
|
||||||
getCapsules: getCapsules,
|
getCapsules: getCapsules,
|
||||||
|
getCapsule: getCapsule,
|
||||||
pullImage: pullImage,
|
pullImage: pullImage,
|
||||||
getImages: getImages,
|
getImages: getImages,
|
||||||
deleteImage: deleteImage,
|
deleteImage: deleteImage,
|
||||||
@@ -208,6 +209,11 @@
|
|||||||
return apiService.get(capsulesPath).error(error(msg));
|
return apiService.get(capsulesPath).error(error(msg));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function getCapsule(id) {
|
||||||
|
var msg = gettext('Unable to retrieve the Capsule.');
|
||||||
|
return apiService.get(capsulesPath + id).error(error(msg));
|
||||||
|
}
|
||||||
|
|
||||||
////////////
|
////////////
|
||||||
// Images //
|
// Images //
|
||||||
////////////
|
////////////
|
||||||
|
|||||||
Reference in New Issue
Block a user