aboutsummaryrefslogtreecommitdiffstats
path: root/moon_dashboard/moon/static/moon/pdp
diff options
context:
space:
mode:
Diffstat (limited to 'moon_dashboard/moon/static/moon/pdp')
-rw-r--r--moon_dashboard/moon/static/moon/pdp/pdp.controller.js121
-rw-r--r--moon_dashboard/moon/static/moon/pdp/pdp.html41
-rwxr-xr-xmoon_dashboard/moon/static/moon/pdp/pdp.service.js123
-rwxr-xr-xmoon_dashboard/moon/static/moon/pdp/pdp.service.spec.js143
4 files changed, 428 insertions, 0 deletions
diff --git a/moon_dashboard/moon/static/moon/pdp/pdp.controller.js b/moon_dashboard/moon/static/moon/pdp/pdp.controller.js
new file mode 100644
index 00000000..c57f3b28
--- /dev/null
+++ b/moon_dashboard/moon/static/moon/pdp/pdp.controller.js
@@ -0,0 +1,121 @@
+(function () {
+ 'use strict';
+
+ angular
+ .module('moon')
+ .controller('moon.pdp.controller',
+ controller);
+
+ controller.$inject = ['moon.util.service', 'moon.pdp.service', 'horizon.framework.widgets.form.ModalFormService'];
+
+ function controller(util, pdpService, ModalFormService) {
+ var self = this;
+ self.model = pdpService;
+ pdpService.initialize();
+
+ self.createPdp = function createPdp() {
+ var schema = {
+ type: "object",
+ properties: {
+ name: { type: "string", minLength: 2, title: gettext("Name") },
+ description: { type: "string", minLength: 2, title: gettext("Description") }
+ }
+ };
+ var pdp = { name: '', description: '' };
+ var config = {
+ title: gettext('Create PDP'),
+ schema: schema,
+ form: ['name', { key: 'description', type: 'textarea' }],
+ model: pdp
+ };
+ ModalFormService.open(config).then(submit);
+
+ function submit(form) {
+ pdpService.createPdp(form.model);
+ }
+ }
+
+ self.updatePdp = function updatePdp(pdp) {
+ var schema = {
+ type: "object",
+ properties: {
+ name: { type: "string", minLength: 2, title: gettext("Name") },
+ description: { type: "string", minLength: 2, title: gettext("Description") }
+ }
+ };
+ var config = {
+ title: gettext('Update PDP'),
+ schema: schema,
+ form: ['name', { key: 'description', type: 'textarea' }],
+ model: angular.copy(pdp)
+ };
+ ModalFormService.open(config).then(submit);
+
+ function submit(form) {
+ pdpService.updatePdp(form.model);
+ }
+ }
+
+ self.removePdp = function removePdp(pdp) {
+ if (confirm(gettext('Are you sure to delete this PDP?')))
+ pdpService.removePdp(pdp);
+ }
+
+ self.addPolicy = function addPolicy(pdp) {
+ var schema = {
+ type: "object",
+ properties: {
+ id: { type: "string", title: gettext("Select a Policy:") }
+ }
+ };
+ var titleMap = util.arrayToTitleMap(pdpService.policies)
+ var config = {
+ title: gettext('Add Policy'),
+ schema: schema,
+ form: [{ key: 'id', type: 'select', titleMap: titleMap }],
+ model: {}
+ };
+ ModalFormService.open(config).then(submit);
+
+ function submit(form) {
+ var pdpCopy = angular.copy(pdp);
+ pdpCopy.security_pipeline.push(pdpService.getPolicy(form.model.id));
+ pdpService.updatePdp(pdpCopy);
+ }
+ }
+
+ self.removePolicyFromPdp = function removePolicyFromPdp(pdp, policy) {
+ if (confirm(gettext('Are you sure to remove this Policy from PDP?'))) {
+ var pdpCopy = angular.copy(pdp);
+ pdpCopy.security_pipeline.splice(pdp.security_pipeline.indexOf(policy), 1);
+ pdpService.updatePdp(pdpCopy);
+ }
+ }
+
+ self.changeProject = function changeProject(pdp) {
+ var schema = {
+ type: "object",
+ properties: {
+ id: { type: "string", title: gettext("Select a Project:") }
+ }
+ };
+ var model = {id : pdp.keystone_project_id};
+
+ var titleMap = util.arrayToTitleMap(pdpService.projects)
+ var config = {
+ title: gettext('Change Project'),
+ schema: schema,
+ form: [{ key: 'id', type: 'select', titleMap: titleMap }],
+ model: model
+ };
+ ModalFormService.open(config).then(submit);
+
+ function submit(form) {
+ var pdpCopy = angular.copy(pdp);
+ pdpCopy.project = pdpService.getProject(form.model.id);
+ pdpService.updatePdp(pdpCopy);
+ }
+ }
+
+ }
+})(); \ No newline at end of file
diff --git a/moon_dashboard/moon/static/moon/pdp/pdp.html b/moon_dashboard/moon/static/moon/pdp/pdp.html
new file mode 100644
index 00000000..2456a261
--- /dev/null
+++ b/moon_dashboard/moon/static/moon/pdp/pdp.html
@@ -0,0 +1,41 @@
+<div ng-controller="moon.pdp.controller as ctrl">
+ <div class="clearfix list-group">
+ <div class="pull-right">
+ <input type="search" class="form-control filter" placeholder="Filter" ng-model="filterText">
+ <button type="button" class="btn btn-default" ng-click="ctrl.createPdp()">
+ <span class="fa fa-plus"></span>
+ <translate>Create PDP</translate>
+ </button>
+ </div>
+ </div>
+ <div class="list-group">
+ <div ng-repeat="pdp in ctrl.model.pdps | orderBy:'name' | filter:filterText " class="list-group-item">
+ <h3 class="list-group-item-heading inline">{$ pdp.name $}</h3>
+ <div class="pull-right">
+ <button type="button" class="fa fa-trash" ng-click="ctrl.removePdp(pdp)" title="{$ 'Remove PDP' | translate $}"></button>
+ <button type="button" class="fa fa-edit" ng-click="ctrl.updatePdp(pdp)" title="{$ 'Edit PDP' | translate $}"></button>
+ </div>
+ <p class="list-group-item-text">{$ pdp.description $}</p>
+ <h4 class="list-group-item-text">
+ <translate>Project: {$ pdp.project ? pdp.project.name : 'none' $}</translate>
+ <button type="button" class="fa fa-edit" ng-click="ctrl.changeProject(pdp)" title="{$ 'Change project' | translate $}"></button>
+ </h4>
+
+ <details class="list-group-item-text">
+ <summary>
+ <h4 class="inline">{$ pdp.security_pipeline.length $}
+ <translate>policy(ies)</translate>
+ </h4>
+ <button type="button" class="fa fa-plus " ng-click="ctrl.addPolicy(pdp)" title="{$ 'Add Policy' | translate $}"></button>
+ </summary>
+ <div class="list-group">
+ <div ng-repeat="policy in pdp.security_pipeline | orderBy:'name'" class="list-group-item">
+ <h3 class="list-group-item-heading inline">{$ policy.name $}</h3>
+ <button type="button" class="fa fa-trash pull-right" ng-click="ctrl.removePolicyFromPdp(pdp, policy)" title="{$ 'Remove Policy' | translate $}"></button>
+ <p class="list-group-item-text">{$ policy.description $}</p>
+ </div>
+ </div>
+ </details>
+ </div>
+ </div>
+</div> \ No newline at end of file
diff --git a/moon_dashboard/moon/static/moon/pdp/pdp.service.js b/moon_dashboard/moon/static/moon/pdp/pdp.service.js
new file mode 100755
index 00000000..e18971be
--- /dev/null
+++ b/moon_dashboard/moon/static/moon/pdp/pdp.service.js
@@ -0,0 +1,123 @@
+(function () {
+
+ 'use strict';
+
+ angular
+ .module('moon')
+ .factory('moon.pdp.service', pdpService);
+
+ pdpService.$inject = ['moon.util.service', '$resource', 'moon.URI', '$q', 'horizon.app.core.openstack-service-api.keystone'];
+
+ function pdpService(util, $resource, URI, $q, keystone) {
+ var host = URI.API;
+
+ var pdpResource = $resource(host + '/pdp/' + ':id', {}, {
+ get: { method: 'GET' },
+ query: { method: 'GET' },
+ create: { method: 'POST' },
+ remove: { method: 'DELETE' },
+ update: { method: 'PATCH' }
+ });
+
+ var policyResource = $resource(host + '/policies/' + ':id', {}, {
+ query: { method: 'GET' },
+ });
+
+ var pdpsMap = {};
+ var pdps = [];
+ var policiesMap = {};
+ var policies = [];
+ var projectsMap = {};
+ var projects = [];
+
+ function loadPdps() {
+ var queries = {
+ pdps: pdpResource.query().$promise,
+ policies: policyResource.query().$promise,
+ projects: keystone.getProjects()
+ }
+
+ $q.all(queries).then(function (result) {
+ createPdps(result.pdps, result.policies, result.projects.data)
+ console.log('moon', 'pdps initialized', pdps)
+ })
+ }
+
+ function createPdps(pdpsData, policiesData, projectsData) {
+ pdps.splice(0, pdps.length);
+ policies.splice(0, policies.length);
+ projects.splice(0, projects.length);
+ util.cleanObject(pdpsMap);
+ util.cleanObject(policiesMap);
+ util.cleanObject(projectsMap)
+
+ util.createInternal(policiesData.policies, policies, policiesMap);
+ util.pushAll(projects, projectsData.items);
+ util.addToMap(projects, projectsMap);
+ createPdpInternal(pdpsData.pdps);
+ }
+
+ function mapPdp(pdp) {
+ util.mapIdToItem(pdp.security_pipeline, policiesMap);
+ pdp.project = null;
+ if (pdp.keystone_project_id) {
+ pdp.project = projectsMap[pdp.keystone_project_id];
+ }
+ }
+
+ function createPdpInternal(data) {
+ return util.createInternal(data, pdps, pdpsMap, mapPdp);
+ }
+
+ function updatePdpInternal(data) {
+ return util.updateInternal(data, pdpsMap, mapPdp);
+ }
+
+ function removePdpInternal(id) {
+ return util.removeInternal(id, pdps, pdpsMap);
+ }
+
+ return {
+ initialize: loadPdps,
+ createPdps: createPdps,
+ pdps: pdps,
+ policies: policies,
+ projects: projects,
+ createPdp: function createPdp(pdp) {
+ pdp.keystone_project_id = null;
+ pdp.security_pipeline = [];
+ pdpResource.create(null, pdp, success, util.displayErrorFunction('Unable to create PDP'));
+
+ function success(data) {
+ createPdpInternal(data.pdps);
+ util.displaySuccess('PDP created');
+ }
+ },
+ removePdp: function removePdp(pdp) {
+ pdpResource.remove({ id: pdp.id }, null, success, util.displayErrorFunction('Unable to remove PDP'));
+
+ function success(data) {
+ removePdpInternal(pdp.id);
+ util.displaySuccess('PDP removed');
+ }
+ },
+ updatePdp: function updatePdp(pdp) {
+ util.mapItemToId(pdp.security_pipeline);
+ pdp.keystone_project_id = pdp.project ? pdp.project.id : null;
+ pdpResource.update({ id: pdp.id }, pdp, success, util.displayErrorFunction('Unable to update PDP'));
+
+ function success(data) {
+ updatePdpInternal(data.pdps)
+ util.displaySuccess('PDP updated');
+ }
+ },
+ getPolicy: function getPolicy(id) {
+ return policiesMap[id];
+ },
+ getProject: function getProject(id) {
+ return projectsMap[id];
+ },
+ }
+
+ }
+})(); \ No newline at end of file
diff --git a/moon_dashboard/moon/static/moon/pdp/pdp.service.spec.js b/moon_dashboard/moon/static/moon/pdp/pdp.service.spec.js
new file mode 100755
index 00000000..4208467f
--- /dev/null
+++ b/moon_dashboard/moon/static/moon/pdp/pdp.service.spec.js
@@ -0,0 +1,143 @@
+(function () {
+ 'use strict';
+
+ describe('moon.pdp.service', function () {
+ var service, $httpBackend, URI;
+ var pdpsData, policiesData, projectsData;
+
+
+ function initData() {
+ pdpsData = {
+ pdps:
+ { 'pdpId1': { name: 'pdp1', description: 'pdpDescription1', security_pipeline: ['policyId1'], keystone_project_id: 'projectId1' } }
+ };
+
+ policiesData = {
+ policies:
+ {
+ 'policyId1': { name: 'policy1', description: 'pDescription1' },
+ 'policyId2': { name: 'policy2', description: 'pDescription2' }
+ }
+ };
+
+ projectsData = {
+ items: [
+ { name: "project1", id: "projectId1" },
+ { name: "project2", id: "projectId2" }
+ ]
+ };
+
+ }
+
+ beforeEach(module('horizon.app.core'));
+ beforeEach(module('horizon.framework'));
+ beforeEach(module('moon'));
+
+ beforeEach(inject(function ($injector) {
+ service = $injector.get('moon.pdp.service');
+ $httpBackend = $injector.get('$httpBackend');
+ URI = $injector.get('moon.URI');
+ }));
+
+ afterEach(function () {
+ $httpBackend.verifyNoOutstandingExpectation();
+ $httpBackend.verifyNoOutstandingRequest();
+ });
+
+ it('should initialize', function () {
+ initData();
+ $httpBackend.expectGET(URI.API + '/pdp').respond(200, pdpsData);
+ $httpBackend.expectGET(URI.API + '/policies').respond(200, policiesData);
+ $httpBackend.expectGET('/api/keystone/projects/').respond(200, projectsData);
+
+
+ service.initialize();
+ $httpBackend.flush();
+
+ expect(service.pdps.length).toBe(1);
+ var pdp = service.pdps[0];
+ expect(pdp.id).toBe('pdpId1');
+ expect(pdp.name).toBe('pdp1');
+ expect(pdp.description).toBe('pdpDescription1');
+ expect(pdp.security_pipeline.length).toBe(1);
+ expect(pdp.security_pipeline[0].id).toBe('policyId1');
+ expect(pdp.keystone_project_id).toBe('projectId1');
+ expect(pdp.project.id).toBe('projectId1');
+
+ expect(service.policies.length).toBe(2);
+ var policy = service.policies[0];
+ expect(policy.id).toBe('policyId1');
+ expect(policy.name).toBe('policy1');
+ expect(policy.description).toBe('pDescription1');
+
+
+ expect(service.projects.length).toBe(2);
+ var project = service.projects[0];
+ expect(project.id).toBe('projectId1');
+ expect(project.name).toBe('project1');
+
+ });
+
+
+
+ it('should create pdp', function () {
+ var pdpCreatedData = {
+ pdps:
+ { 'pdpId1': { name: 'pdp1', description: 'pdpDescription1', security_pipeline: [], keystone_project_id: null } }
+ };
+
+ $httpBackend.expectPOST(URI.API + '/pdp').respond(200, pdpCreatedData);
+
+ service.createPdp({ name: 'pdp1', description: 'pdpDescription1' });
+ $httpBackend.flush();
+
+ expect(service.pdps.length).toBe(1);
+ var pdp = service.pdps[0];
+ expect(pdp.id).toBe('pdpId1');
+ expect(pdp.name).toBe('pdp1');
+ expect(pdp.description).toBe('pdpDescription1');
+ expect(pdp.project).toBe(null);
+ expect(pdp.security_pipeline.length).toBe(0);
+ });
+
+ it('should remove pdp', function () {
+ initData();
+ service.createPdps(pdpsData, policiesData, projectsData);
+
+ $httpBackend.expectDELETE(URI.API + '/pdp/pdpId1').respond(200);
+
+ service.removePdp({ id: 'pdpId1' });
+ $httpBackend.flush();
+
+ expect(service.pdps.length).toBe(0);
+ });
+
+ it('should update pdp', function () {
+ initData();
+ var pdpUpdatedData = {
+ pdps:
+ { 'pdpId1': { name: 'pdp2', description: 'pdpDescription2', security_pipeline: ['policyId2'], keystone_project_id: 'projectId2' } }
+ };
+ service.createPdps(pdpsData, policiesData, projectsData);
+
+ $httpBackend.expectPATCH(URI.API + '/pdp/pdpId1').respond(200, pdpUpdatedData);
+
+ service.updatePdp({ id: 'pdpId1', name: 'pdp2', description: 'pdpDescription2', security_pipeline: [service.getPolicy('policyId2')], project: service.getProject('projectId2') });
+ $httpBackend.flush();
+
+ expect(service.pdps.length).toBe(1);
+ var pdp = service.pdps[0];
+ expect(pdp.id).toBe('pdpId1');
+ expect(pdp.name).toBe('pdp2');
+ expect(pdp.description).toBe('pdpDescription2');
+ expect(pdp.project.id).toBe('projectId2');
+ expect(pdp.security_pipeline.length).toBe(1);
+ expect(pdp.security_pipeline[0].id).toBe('policyId2');
+
+ });
+
+
+ });
+
+
+})(); \ No newline at end of file