added new endpoint to retrieve user information and Updated tenant view
Change-Id: I93d00eb203bf7626221dc6e107fefa9f097d8011
diff --git a/views/ngXosViews/tenant/spec/sample.test.js b/views/ngXosViews/tenant/spec/sample.test.js
index 3bd610b..ba28499 100644
--- a/views/ngXosViews/tenant/spec/sample.test.js
+++ b/views/ngXosViews/tenant/spec/sample.test.js
@@ -13,7 +13,7 @@
httpBackend.whenGET('/api/core/sites/?no_hyperlinks=1').respond(200, []);
// Setting up mock request
scope = $rootScope.$new();
- element = angular.element('<users-list></users-list>');
+ element = angular.element('<site-list></site-list>');
$compile(element)(scope);
scope.$digest();
isolatedScope = element.isolateScope().vm;
diff --git a/views/ngXosViews/tenant/src/index.html b/views/ngXosViews/tenant/src/index.html
index e1a83d4..d647aa5 100644
--- a/views/ngXosViews/tenant/src/index.html
+++ b/views/ngXosViews/tenant/src/index.html
@@ -33,4 +33,6 @@
<!-- inject:js -->
<script src="/../../../xos/core/xoslib/static/js/vendor/ngXosHelpers.js"></script>
<script src="/.tmp/main.js"></script>
+<script src="/.tmp/sitedetail.js"></script>
+<script src="/.tmp/createslice.js"></script>
<!-- endinject -->
\ No newline at end of file
diff --git a/views/ngXosViews/tenant/src/js/createslice.js b/views/ngXosViews/tenant/src/js/createslice.js
new file mode 100644
index 0000000..933542e
--- /dev/null
+++ b/views/ngXosViews/tenant/src/js/createslice.js
@@ -0,0 +1,278 @@
+/**
+ * Created by arpit on 7/7/2016.
+ */
+'use strict';
+
+angular.module('xos.tenant')
+.directive('createSlice', function(){
+ return {
+ //sites : {},
+ restrict: 'E',
+ scope: {},
+ bindToController: true,
+ controllerAs: 'cs',
+ templateUrl: 'templates/createslice.html',
+ controller: function(Slices, SlicesPlus, Sites, Images, $stateParams, $http, $state, $q, XosUserPrefs){
+ this.config = {
+ exclude: ['site', 'password', 'last_login', 'mount_data_sets', 'default_flavor', 'creator', 'exposed_ports', 'networks', 'omf_friendly', 'omf_friendly', 'no_sync', 'no_policy', 'lazy_blocked', 'write_protect', 'deleted', 'backend_status', 'backend_register', 'policed', 'enacted', 'updated', 'created', 'validators', 'humanReadableName'],
+ formName: 'SliceDetails',
+ feedback: {
+ show: false,
+ message: 'Form submitted successfully !!!',
+ type: 'success'
+ },
+ actions: [
+ {
+ label: 'Save',
+ icon: 'ok', // refers to bootstraps glyphicon
+ cb: (model, form) => { // receive the model
+ saveform(model, form).then(()=> {
+ $state.go('site', {id: this.model.site});
+ });
+ },
+ class: 'success'
+ }, {
+ label: 'Save and continue editing',
+ icon: 'ok', // refers to bootstraps glyphicon
+ cb: (model, form) => { // receive the model
+ saveform(model,form);
+ },
+ class: 'primary'
+ },
+ {
+ label: 'Save and add another',
+ icon: 'ok', // refers to bootstraps glyphicon
+ cb: (model, form) => {
+ saveform(model,form).then(()=> {
+ $state.go('createslice',{site : this.model.site,id : ''});
+ });
+ },
+ class: 'primary'
+ }
+ ],
+ fields:
+ {
+ site: {
+ label: 'Site',
+ type: 'select',
+ validators: { required: true},
+ hint: 'The Site this Slice belongs to',
+ options: []
+
+ },
+ name: {
+ label: 'Name',
+ type: 'string',
+ hint: 'The Name of the Slice',
+ validators: {
+ required: true
+ }
+ },
+ serviceClass: {
+ label: 'ServiceClass',
+ type: 'select',
+ validators: {required: true},
+ hint: 'The Site this Slice belongs to',
+ options: [
+ {
+ id: 1,
+ label: 'Best effort'
+ }
+ ]
+ },
+ enabled: {
+ label: 'Enabled',
+ type: 'boolean',
+ hint: 'Status for this Slice'
+ },
+ description: {
+ label: 'Description',
+ type: 'string',
+ hint: 'High level description of the slice and expected activities',
+ validators: {
+ required: false,
+ minlength: 10
+ }
+ },
+ service: {
+ label: 'Service',
+ type: 'select',
+ validators: { required: false},
+ options: [
+ {
+ id: 0,
+ label: '--------'
+ }
+ ]
+ },
+ slice_url: {
+ label: 'Slice url',
+ type: 'string',
+ validators: {
+ required: false,
+ minlength: 10
+ }
+ },
+ max_instances: {
+ label: 'Max Instances',
+ type: 'number',
+ validators: {
+ required: false,
+ min: 0
+ }
+ },
+ default_isolation: {
+ label: 'Default Isolation',
+ type: 'select',
+ validators: { required: false},
+ options: [
+ {
+ id: 'vm',
+ label: 'Virtual Machine'
+ },
+ {
+ id: 'container',
+ label: 'Container'
+ },
+ {
+ id: 'container_vm',
+ label: 'Container in VM'
+ }
+ ]
+ },
+ default_image: {
+ label: 'Default image',
+ type: 'select',
+ validators: { required: false},
+ options: []
+ },
+ network: {
+ label: 'Network',
+ type: 'select',
+ validators: { required: false},
+ options: [
+ {
+ id: 'default',
+ label: 'Default'
+ },
+ {
+ id: 'host',
+ label: 'Host'
+ },
+ {
+ id: 'bridged',
+ label: 'Bridged'
+ },
+ {
+ id: 'noauto',
+ label: 'No Automatic Networks'
+ }
+ ]
+ }
+
+ }
+ };
+ var data;
+ Images.query().$promise
+ .then((users) => {
+ this.users = users;
+ data = this.users;
+ this.optionValImg = this.setData(data, {field1: 'id', field2: 'name'});
+ this.config.fields['default_image'].options = this.optionValImg;
+ })
+ .catch((e) => {
+ throw new Error(e);
+ });
+
+ // Use this method for select by seting object in fields variable of format { field1 : "val1", field2 : "val2"}
+ this.setData = (data, fields) => {
+ var i;
+ var retObj=[];
+ for(i = 0; i<data.length; i++){
+ var optVal = {id: data[i][fields.field1], label: data[i][fields.field2]};
+ retObj.push(optVal);
+
+ }
+ return retObj;
+ };
+
+ // retrieving user list
+
+ if ($stateParams.id)
+ {
+ delete this.config.fields['site'];
+ this.config.exclude.push('site');
+
+ Slices.get({id: $stateParams.id}).$promise
+ .then((users) => {
+ this.users = users;
+ data = users;
+
+ this.model = data;
+ })
+ .catch((e) => {
+ throw new Error(e);
+ });
+ }
+ else
+ {
+
+
+ this.model = {};
+ XosUserPrefs.getUserDetailsCookie().$promise
+ .then((userdata)=>{
+ this.model['creator'] =userdata.current_user_id;
+ })
+ .catch ((e) => {
+ throw new Error(e);
+ });
+
+ Sites.query().$promise
+ .then((users) => {
+ this.users_site = users;
+ this.optionVal = this.setData(this.users_site, {field1: 'id', field2: 'name'});
+ this.config.fields['site'].options = this.optionVal;
+ })
+ .catch((e) => {
+ throw new Error(e);
+ });
+ }
+
+ var saveform = (model,form) =>
+ { // receive the model
+ var deferred = $q.defer();
+ delete model.networks;
+ if (form.$valid )
+ {
+ if(model.id){
+ var pr = Slices.update(model).$promise;
+ }
+ else{
+ var pr = Slices.save(model).$promise;
+ }
+ pr.then((users) => {
+ this.model = users;
+ //data = users;
+ //this.model = this.users;
+ this.config.feedback.show = true;
+ deferred.resolve(this.model);
+ })
+ .catch((e) => {
+ this.config.feedback.show = true;
+ this.config.feedback.type='danger';
+ if(e.data && e.data.detail )
+ {
+ this.config.feedback.message = e.data.detail;
+ }
+ else {
+ this.config.feedback.message=e.statusText;
+ }
+ deferred.reject(e);
+ });
+ }
+
+ return deferred.promise;
+ }
+ }
+ };
+});
\ No newline at end of file
diff --git a/views/ngXosViews/tenant/src/js/main.js b/views/ngXosViews/tenant/src/js/main.js
index 7ed4af6..e3dd54a 100644
--- a/views/ngXosViews/tenant/src/js/main.js
+++ b/views/ngXosViews/tenant/src/js/main.js
@@ -1,418 +1,99 @@
-'use strict';
-
-angular.module('xos.tenant', [
- 'ngResource',
- 'ngCookies',
- 'ui.router',
- 'xos.helpers'
-])
-.config(($stateProvider) => {
- $stateProvider
- .state('user-list', {
- url: '/',
- template: '<users-list></users-list>'
- })
- .state('site', {
- url: '/site/:id',
- template: '<site-detail></site-detail>'
-
- })
- .state('createslice', {
- url: '/site/:site/slice/:id?',
- template: '<create-slice></create-slice>'
-
- });
-})
-.config(function($httpProvider){
- $httpProvider.interceptors.push('NoHyperlinks');
-})
-.directive('usersList', function(){
- return {
- //sites : {},
- restrict: 'E',
- scope: {},
- bindToController: true,
- controllerAs: 'vm',
- templateUrl: 'templates/users-list.tpl.html',
- controller: function(Sites, SlicesPlus){
-
-
-
- this.tableConfig = {
- columns: [
- {
- label: 'Site1',
- prop: 'name',
- link: item => `#/site/${item.id}`
- },
- {
- label: 'Allocated',
- prop: 'instance_total'
- },
- {
- label: 'Ready',
- prop: 'instance_total_ready'
- }
- ]
- };
-
- // retrieving user list
- Sites.query().$promise
- .then((users) => {
- this.sites = users;
- return SlicesPlus.query().$promise
- })
- .then((users) => {
- this.slices = users;
- this.site_list = this.returnData(this.sites, this.slices);
- })
- .catch((e) => {
- throw new Error(e);
- });
-
-
- this.returnData = (sites, slices) => {
- var i, j=0;
- var site_list=[];
-
- for(i = 0; i<sites.length; i++){
- var instance_t = 0;
- var instance_t_r = 0;
- for(j=0;j<slices.length;j++){
- if (sites[i].id != null && slices[j].site !=null && sites[i].id === slices[j].site){
- instance_t = instance_t + slices[j].instance_total;
- instance_t_r = instance_t_r + slices[j].instance_total_ready;
- }
- }
- var data_sites = {
- 'id': sites[i].id,
- 'name': sites[i].name,
- 'instance_total': instance_t,
- 'instance_total_ready': instance_t_r
- };
- site_list.push(data_sites);
- }
- return site_list;
- }
- }
- };
-})
-.directive('siteDetail', function(){
- return {
- restrict: 'E',
- scope: {},
- bindToController: true,
- controllerAs: 'sl',
- templateUrl: 'templates/slicelist.html',
- controller: function(SlicesPlus, $stateParams){
- this.siteId = $stateParams.id;
- this.tableConfig = {
- columns: [
- {
- label: 'Slice List',
- prop: 'name',
- link: item => `#/site/${item.site}/slice/${item.id}`
- },
- {
- label: 'Allocated',
- prop: 'instance_total'
- },
- {
- label: 'Ready',
- prop: 'instance_total_ready'
- }
- ]
- };
-
- // retrieving user list
- SlicesPlus.query({
- site: $stateParams.id
- }).$promise
- .then((users) => {
- this.sliceList = users;
- })
- .catch((e) => {
- throw new Error(e);
- });
- }
- };
-})
-.directive('createSlice', function(){
- return {
- //sites : {},
- restrict: 'E',
- scope: {},
- bindToController: true,
- controllerAs: 'cs',
- templateUrl: 'templates/createslice.html',
- controller: function(Slices, SlicesPlus, Sites, Images, $stateParams, $http, $state, $q){
- this.config = {
- exclude: ['site', 'password', 'last_login', 'mount_data_sets', 'default_flavor', 'creator', 'exposed_ports', 'networks', 'omf_friendly', 'omf_friendly', 'no_sync', 'no_policy', 'lazy_blocked', 'write_protect', 'deleted', 'backend_status', 'backend_register', 'policed', 'enacted', 'updated', 'created', 'validators', 'humanReadableName'],
- formName: 'SliceDetails',
- feedback: {
- show: false,
- message: 'Form submitted successfully !!!',
- type: 'success'
- },
- actions: [
- {
- label: 'Save',
- icon: 'ok', // refers to bootstraps glyphicon
- cb: (model, form) => { // receive the model
- saveform(model, form).then(()=> {
- $state.go('site', {id: this.model.site});
- });
- },
- class: 'success'
- }, {
- label: 'Save and continue editing',
- icon: 'ok', // refers to bootstraps glyphicon
- cb: (model, form) => { // receive the model
- saveform(model,form);
- },
- class: 'primary'
- },
- {
- label: 'Save and add another',
- icon: 'ok', // refers to bootstraps glyphicon
- cb: (model, form) => {
- saveform(model,form).then(()=> {
- $state.go('createslice',{site : this.model.site,id : ''});
- });
- },
- class: 'primary'
- }
- ],
- fields:
- {
- site: {
- label: 'Site',
- type: 'select',
- validators: { required: true},
- hint: 'The Site this Slice belongs to',
- options: []
-
- },
- name: {
- label: 'Name',
- type: 'string',
- hint: 'The Name of the Slice',
- validators: {
- required: true
- }
- },
- serviceClass: {
- label: 'ServiceClass',
- type: 'select',
- validators: {required: true},
- hint: 'The Site this Slice belongs to',
- options: [
- {
- id: 1,
- label: 'Best effort'
- }
- ]
- },
- enabled: {
- label: 'Enabled',
- type: 'boolean',
- hint: 'Status for this Slice'
- },
- description: {
- label: 'Description',
- type: 'string',
- hint: 'High level description of the slice and expected activities',
- validators: {
- required: false,
- minlength: 10
- }
- },
- service: {
- label: 'Service',
- type: 'select',
- validators: { required: false},
- options: [
- {
- id: 0,
- label: '--------'
- }
- ]
- },
- slice_url: {
- label: 'Slice url',
- type: 'string',
- validators: {
- required: false,
- minlength: 10
- }
- },
- max_instances: {
- label: 'Max Instances',
- type: 'number',
- validators: {
- required: false,
- min: 0
- }
- },
- default_isolation: {
- label: 'Default Isolation',
- type: 'select',
- validators: { required: false},
- options: [
- {
- id: 'vm',
- label: 'Virtual Machine'
- },
- {
- id: 'container',
- label: 'Container'
- },
- {
- id: 'container_vm',
- label: 'Container in VM'
- }
- ]
- },
- default_image: {
- label: 'Default image',
- type: 'select',
- validators: { required: false},
- options: []
- },
- network: {
- label: 'Network',
- type: 'select',
- validators: { required: false},
- options: [
- {
- id: 'default',
- label: 'Default'
- },
- {
- id: 'host',
- label: 'Host'
- },
- {
- id: 'bridged',
- label: 'Bridged'
- },
- {
- id: 'noauto',
- label: 'No Automatic Networks'
- }
- ]
- }
-
- }
- };
- var data;
- Images.query().$promise
- .then((users) => {
- this.users = users;
- data = this.users;
- this.optionValImg = this.setData(data, {field1: 'id', field2: 'name'});
- this.config.fields['default_image'].options = this.optionValImg;
- })
- .catch((e) => {
- throw new Error(e);
- });
-
- // Use this method for select by seting object in fields variable of format { field1 : "val1", field2 : "val2"}
- this.setData = (data, fields) => {
- var i;
- var retObj=[];
- for(i = 0; i<data.length; i++){
- var optVal = {id: data[i][fields.field1], label: data[i][fields.field2]};
- retObj.push(optVal);
-
- }
- return retObj;
- };
-
- // retrieving user list
-
- if ($stateParams.id)
- {
- delete this.config.fields['site'];
- this.config.exclude.push('site');
-
- Slices.get({id: $stateParams.id}).$promise
- .then((users) => {
- this.users = users;
- data = users;
-
- this.model = data;
- })
- .catch((e) => {
- throw new Error(e);
- });
- }
- else
- {
-
-
- this.model = {};
- $http.get('/xoslib/tenantview/').
- success((data) => {
- this.userList = data;
- this.model['creator'] = this.userList.current_user_id;
-
- });
-
-
-
-
-
-
- Sites.query().$promise
- .then((users) => {
- this.users_site = users;
- this.optionVal = this.setData(this.users_site, {field1: 'id', field2: 'name'});
- this.config.fields['site'].options = this.optionVal;
- //= this.optionVal;
-
- })
- .catch((e) => {
- throw new Error(e);
- });
-
- }
-
- var saveform = (model,form) =>
- { // receive the model
- var deferred = $q.defer();
- delete model.networks;
- if (form.$valid )
- {
- if(model.id){
- var pr = Slices.update(model).$promise;
- }
- else{
- var pr = Slices.save(model).$promise;
- }
- pr.then((users) => {
- this.model = users;
- //data = users;
- //this.model = this.users;
- this.config.feedback.show = true;
- deferred.resolve(this.model);
- })
- .catch((e) => {
- this.config.feedback.show = true;
- this.config.feedback.type='danger';
- if(e.data && e.data.detail )
- {
- this.config.feedback.message = e.data.detail;
- }
- else {
- this.config.feedback.message=e.statusText;
- }
- deferred.reject(e);
- });
- }
-
- return deferred.promise;
- }
- }
- };
-});
\ No newline at end of file
+'use strict';
+
+angular.module('xos.tenant', [
+ 'ngResource',
+ 'ngCookies',
+ 'ui.router',
+ 'xos.helpers'
+])
+.config(($stateProvider) => {
+ $stateProvider
+ .state('site-list', {
+ url: '/',
+ template: '<site-list></site-list>'
+ })
+ .state('site', {
+ url: '/site/:id',
+ template: '<site-detail></site-detail>'
+
+ })
+ .state('createslice', {
+ url: '/site/:site/slice/:id?',
+ template: '<create-slice></create-slice>'
+
+ });
+})
+.config(function($httpProvider){
+ $httpProvider.interceptors.push('NoHyperlinks');
+})
+.directive('siteList', function(){
+ return {
+ //sites : {},
+ restrict: 'E',
+ scope: {},
+ bindToController: true,
+ controllerAs: 'vm',
+ templateUrl: 'templates/users-list.tpl.html',
+ controller: function(Sites, SlicesPlus){
+
+
+
+ this.tableConfig = {
+ columns: [
+ {
+ label: 'Site',
+ prop: 'name',
+ link: item => `#/site/${item.id}`
+ },
+ {
+ label: 'Allocated',
+ prop: 'instance_total'
+ },
+ {
+ label: 'Ready',
+ prop: 'instance_total_ready'
+ }
+ ]
+ };
+
+ // retrieving user list
+ Sites.query().$promise
+ .then((users) => {
+ this.sites = users;
+ return SlicesPlus.query().$promise
+ })
+ .then((users) => {
+ this.slices = users;
+ this.site_list = this.returnData(this.sites, this.slices);
+ })
+ .catch((e) => {
+ throw new Error(e);
+ });
+
+
+ this.returnData = (sites, slices) => {
+ var i, j=0;
+ var site_list=[];
+
+ for(i = 0; i<sites.length; i++){
+ var instance_t = 0;
+ var instance_t_r = 0;
+ for(j=0;j<slices.length;j++){
+ if (sites[i].id != null && slices[j].site !=null && sites[i].id === slices[j].site){
+ instance_t = instance_t + slices[j].instance_total;
+ instance_t_r = instance_t_r + slices[j].instance_total_ready;
+ }
+ }
+ var data_sites = {
+ 'id': sites[i].id,
+ 'name': sites[i].name,
+ 'instance_total': instance_t,
+ 'instance_total_ready': instance_t_r
+ };
+ site_list.push(data_sites);
+ }
+ return site_list;
+ }
+ }
+ };
+});
diff --git a/views/ngXosViews/tenant/src/js/sitedetail.js b/views/ngXosViews/tenant/src/js/sitedetail.js
new file mode 100644
index 0000000..c29a904
--- /dev/null
+++ b/views/ngXosViews/tenant/src/js/sitedetail.js
@@ -0,0 +1,46 @@
+/**
+ * Created by arpit on 7/7/2016.
+ */
+'use strict';
+
+angular.module('xos.tenant')
+.directive('siteDetail', function(){
+ return {
+ restrict: 'E',
+ scope: {},
+ bindToController: true,
+ controllerAs: 'sl',
+ templateUrl: 'templates/slicelist.html',
+ controller: function(SlicesPlus, $stateParams){
+ this.siteId = $stateParams.id;
+ this.tableConfig = {
+ columns: [
+ {
+ label: 'Slice List',
+ prop: 'name',
+ link: item => `#/site/${item.site}/slice/${item.id}`
+ },
+ {
+ label: 'Allocated',
+ prop: 'instance_total'
+ },
+ {
+ label: 'Ready',
+ prop: 'instance_total_ready'
+ }
+ ]
+ };
+
+ // retrieving user list
+ SlicesPlus.query({
+ site: $stateParams.id
+ }).$promise
+ .then((users) => {
+ this.sliceList = users;
+ })
+ .catch((e) => {
+ throw new Error(e);
+ });
+ }
+ };
+});
\ No newline at end of file