Update URL routing

This updates the URL routing so URLs include all IDs of the resource
hierarchy. This makes it much easier to create links in pages and to
obtain the information for parent resources.

Partially-Implements: blueprint horizon-lbaas-v2-ui
Change-Id: I6cdfb5446362e854da6a18eb16420d9121329ab9
This commit is contained in:
Justin Pomeroy 2016-02-11 10:57:02 -06:00
parent b16542e6a0
commit 900d73820e
22 changed files with 172 additions and 432 deletions

View File

@ -39,62 +39,22 @@
function HealthMonitorDetailController(api, $routeParams) { function HealthMonitorDetailController(api, $routeParams) {
var ctrl = this; var ctrl = this;
ctrl.healthmonitor = {};
ctrl.pool = {};
ctrl.listener = {};
ctrl.loadbalancer = {};
var healthmonitorID = $routeParams.healthmonitorId;
init(); init();
//////////////////////////////// ////////////////////////////////
function init() { function init() {
api.getHealthMonitor(healthmonitorID).success(healthMonitorSuccess); api.getHealthMonitor($routeParams.healthmonitorId).success(set('healthmonitor'));
api.getPool($routeParams.poolId).success(set('pool'));
api.getListener($routeParams.listenerId).success(set('listener'));
api.getLoadBalancer($routeParams.loadbalancerId).success(set('loadbalancer'));
} }
function healthMonitorSuccess(response) { function set(property) {
ctrl.healthmonitor = response; return angular.bind(null, function setProp(property, value) {
ctrl[property] = value;
if (ctrl.healthmonitor.hasOwnProperty('pools') && }, property);
ctrl.healthmonitor.pools.length > 0) {
getPoolDetails(ctrl.healthmonitor.pools[0].id);
}
}
function getPoolDetails(poolId) {
api.getPool(poolId).success(poolSuccess);
}
function poolSuccess(response) {
ctrl.pool = response;
if (ctrl.pool.hasOwnProperty('listeners') &&
ctrl.pool.listeners.length > 0) {
getListenerDetails(ctrl.pool.listeners[0].id);
}
}
function getListenerDetails(listenerId) {
api.getListener(listenerId).success(listenerSuccess);
}
function listenerSuccess(response) {
ctrl.listener = response;
if (ctrl.listener.hasOwnProperty('loadbalancers') &&
ctrl.listener.loadbalancers.length > 0) {
getLoadBalancerDetails(ctrl.listener.loadbalancers[0].id);
}
}
function getLoadBalancerDetails(loadbalancerId) {
api.getLoadBalancer(loadbalancerId).success(loadbalancerSuccess);
}
function loadbalancerSuccess(response) {
ctrl.loadbalancer = response;
} }
} }

View File

@ -17,36 +17,12 @@
'use strict'; 'use strict';
describe('LBaaS v2 Healthmonitor Detail Controller', function() { describe('LBaaS v2 Healthmonitor Detail Controller', function() {
var controller, lbaasv2API, healthmonitor, pool, listener, loadbalancer; var lbaasv2API, ctrl;
function fakeHealthMonitorAPI() { function fakeAPI() {
return { return {
success: function(callback) { success: function(callback) {
callback(healthmonitor); callback('foo');
}
};
}
function fakePoolAPI() {
return {
success: function(callback) {
callback(pool);
}
};
}
function fakeListenerAPI() {
return {
success: function(callback) {
callback(listener);
}
};
}
function fakeLoadBalancerAPI() {
return {
success: function(callback) {
callback(loadbalancer);
} }
}; };
} }
@ -61,60 +37,30 @@
beforeEach(inject(function($injector) { beforeEach(inject(function($injector) {
lbaasv2API = $injector.get('horizon.app.core.openstack-service-api.lbaasv2'); lbaasv2API = $injector.get('horizon.app.core.openstack-service-api.lbaasv2');
controller = $injector.get('$controller'); spyOn(lbaasv2API, 'getHealthMonitor').and.callFake(fakeAPI);
spyOn(lbaasv2API, 'getHealthMonitor').and.callFake(fakeHealthMonitorAPI); spyOn(lbaasv2API, 'getPool').and.callFake(fakeAPI);
spyOn(lbaasv2API, 'getPool').and.callFake(fakePoolAPI); spyOn(lbaasv2API, 'getListener').and.callFake(fakeAPI);
spyOn(lbaasv2API, 'getListener').and.callFake(fakeListenerAPI); spyOn(lbaasv2API, 'getLoadBalancer').and.callFake(fakeAPI);
spyOn(lbaasv2API, 'getLoadBalancer').and.callFake(fakeLoadBalancerAPI); var controller = $injector.get('$controller');
ctrl = controller('HealthMonitorDetailController', {
$routeParams: {
loadbalancerId: 'loadbalancerId',
listenerId: 'listenerId',
poolId: 'poolId',
healthmonitorId: 'healthmonitorId'
}
});
})); }));
function createController() {
return controller('HealthMonitorDetailController', {
api: lbaasv2API,
$routeParams: { healthmonitorId: 'healthmonitorId' }
});
}
it('should invoke lbaasv2 apis', function() { it('should invoke lbaasv2 apis', function() {
healthmonitor = { id: 'healthmonitorId', pools: [{id: 'poolId'}] };
pool = { id: 'poolId', listeners: [{id: 'listenerId'}] };
listener = { id: 'listenerId', loadbalancers: [{id: 'loadbalancerId'}] };
loadbalancer = { id: 'loadbalancerId' };
createController();
expect(lbaasv2API.getHealthMonitor).toHaveBeenCalledWith('healthmonitorId'); expect(lbaasv2API.getHealthMonitor).toHaveBeenCalledWith('healthmonitorId');
expect(lbaasv2API.getPool).toHaveBeenCalledWith('poolId'); expect(lbaasv2API.getPool).toHaveBeenCalledWith('poolId');
expect(lbaasv2API.getListener).toHaveBeenCalledWith('listenerId'); expect(lbaasv2API.getListener).toHaveBeenCalledWith('listenerId');
expect(lbaasv2API.getLoadBalancer).toHaveBeenCalledWith('loadbalancerId'); expect(lbaasv2API.getLoadBalancer).toHaveBeenCalledWith('loadbalancerId');
}); expect(ctrl.loadbalancer).toBe('foo');
expect(ctrl.listener).toBe('foo');
it('should not invoke the getPool, getListener or getLoadBalancer lbaasv2 api', function() { expect(ctrl.pool).toBe('foo');
healthmonitor = { id: 'healthmonitorId', pools: [] }; expect(ctrl.healthmonitor).toBe('foo');
createController();
expect(lbaasv2API.getHealthMonitor).toHaveBeenCalledWith('healthmonitorId');
expect(lbaasv2API.getPool).not.toHaveBeenCalled();
expect(lbaasv2API.getListener).not.toHaveBeenCalled();
expect(lbaasv2API.getLoadBalancer).not.toHaveBeenCalled();
});
it('should not invoke the getListener or getLoadBalancer lbaasv2 api', function() {
healthmonitor = { id: 'healthmonitorId', pools: [{id: 'poolId'}] };
pool = { id: 'poolId', listeners: [] };
createController();
expect(lbaasv2API.getHealthMonitor).toHaveBeenCalledWith('healthmonitorId');
expect(lbaasv2API.getPool).toHaveBeenCalledWith('poolId');
expect(lbaasv2API.getListener).not.toHaveBeenCalled();
expect(lbaasv2API.getLoadBalancer).not.toHaveBeenCalled();
});
it('should not invoke getLoadBalancer lbaasv2 api', function() {
healthmonitor = { id: 'healthmonitorId', pools: [{id: 'poolId'}] };
pool = { id: 'poolId', listeners: [{id: 'listenerId'}] };
listener = { id: 'listenerId', loadbalancers: [] };
createController();
expect(lbaasv2API.getHealthMonitor).toHaveBeenCalledWith('healthmonitorId');
expect(lbaasv2API.getPool).toHaveBeenCalledWith('poolId');
expect(lbaasv2API.getListener).toHaveBeenCalledWith('listenerId');
expect(lbaasv2API.getLoadBalancer).not.toHaveBeenCalled();
}); });
}); });

View File

@ -2,9 +2,9 @@
<div class='page-header'> <div class='page-header'>
<ol class="breadcrumb"> <ol class="breadcrumb">
<li><a href="project/ngloadbalancersv2/"><translate>Load Balancers</translate></a></li> <li><a href="project/ngloadbalancersv2/"><translate>Load Balancers</translate></a></li>
<li><a href="project/ngloadbalancersv2/detail/{$ ::ctrl.loadbalancer.id $}">{$ ::(ctrl.loadbalancer.name || ctrl.loadbalancer.id) $}</a></li> <li><a href="project/ngloadbalancersv2/{$ ::ctrl.loadbalancer.id $}">{$ ::(ctrl.loadbalancer.name || ctrl.loadbalancer.id) $}</a></li>
<li><a href="project/ngloadbalancersv2/listeners/detail/{$ ::ctrl.listener.id $}">{$ ::(ctrl.listener.name || ctrl.listener.id) $}</a></li> <li><a href="project/ngloadbalancersv2/{$ ::ctrl.loadbalancer.id $}/listeners/{$ ::ctrl.listener.id $}">{$ ::(ctrl.listener.name || ctrl.listener.id) $}</a></li>
<li><a href="project/ngloadbalancersv2/pools/detail/{$ ::ctrl.pool.id $}">{$ ::(ctrl.pool.name || ctrl.pool.id) $}</a></li> <li><a href="project/ngloadbalancersv2/{$ ::ctrl.loadbalancer.id $}/listeners/{$ ::ctrl.listener.id $}/pools/{$ ::ctrl.pool.id $}">{$ ::(ctrl.pool.name || ctrl.pool.id) $}</a></li>
<li class="active">{$ ::(ctrl.healthmonitor.name || ctrl.healthmonitor.id) $}</li> <li class="active">{$ ::(ctrl.healthmonitor.name || ctrl.healthmonitor.id) $}</li>
</ol> </ol>
</div> </div>

View File

@ -54,27 +54,32 @@
]; ];
function config($provide, $windowProvider, $routeProvider) { function config($provide, $windowProvider, $routeProvider) {
var href = '/project/ngloadbalancersv2/';
var basePath = $windowProvider.$get().STATIC_URL + 'dashboard/project/lbaasv2/'; var basePath = $windowProvider.$get().STATIC_URL + 'dashboard/project/lbaasv2/';
$provide.constant('horizon.dashboard.project.lbaasv2.basePath', basePath); $provide.constant('horizon.dashboard.project.lbaasv2.basePath', basePath);
var loadbalancers = '/project/ngloadbalancersv2';
var listener = loadbalancers + '/:loadbalancerId/listeners/:listenerId';
var pool = listener + '/pools/:poolId';
var member = pool + '/members/:memberId';
var healthmonitor = pool + '/healthmonitors/:healthmonitorId';
$routeProvider $routeProvider
.when(href, { .when(loadbalancers, {
templateUrl: basePath + 'loadbalancers/table.html' templateUrl: basePath + 'loadbalancers/table.html'
}) })
.when(href + 'detail/:loadbalancerId', { .when(loadbalancers + '/:loadbalancerId', {
templateUrl: basePath + 'loadbalancers/detail.html' templateUrl: basePath + 'loadbalancers/detail.html'
}) })
.when(href + 'listeners/detail/:listenerId', { .when(listener, {
templateUrl: basePath + 'listeners/detail.html' templateUrl: basePath + 'listeners/detail.html'
}) })
.when(href + 'pools/detail/:poolId', { .when(pool, {
templateUrl: basePath + 'pools/detail.html' templateUrl: basePath + 'pools/detail.html'
}) })
.when(href + 'pools/:poolId/members/detail/:memberId', { .when(member, {
templateUrl: basePath + 'members/detail.html' templateUrl: basePath + 'members/detail.html'
}) })
.when(href + 'healthmonitors/detail/:healthmonitorId', { .when(healthmonitor, {
templateUrl: basePath + 'healthmonitors/detail.html' templateUrl: basePath + 'healthmonitors/detail.html'
}); });
} }

View File

@ -95,45 +95,36 @@
}); });
it('should route URLs', function () { it('should route URLs', function () {
var href = '/project/ngloadbalancersv2/'; var loadbalancers = '/project/ngloadbalancersv2';
var routes = [ var listener = loadbalancers + '/:loadbalancerId/listeners/:listenerId';
[ var pool = listener + '/pools/:poolId';
href, var member = pool + '/members/:memberId';
{ var healthmonitor = pool + '/healthmonitors/:healthmonitorId';
var routes = [[
loadbalancers, {
templateUrl: basePath + 'loadbalancers/table.html' templateUrl: basePath + 'loadbalancers/table.html'
} }
], ], [
[ loadbalancers + '/:loadbalancerId', {
href + 'detail/:loadbalancerId',
{
templateUrl: basePath + 'loadbalancers/detail.html' templateUrl: basePath + 'loadbalancers/detail.html'
} }
], ], [
[ listener, {
href + 'listeners/detail/:listenerId',
{
templateUrl: basePath + 'listeners/detail.html' templateUrl: basePath + 'listeners/detail.html'
} }
], ], [
[ pool, {
href + 'pools/detail/:poolId',
{
templateUrl: basePath + 'pools/detail.html' templateUrl: basePath + 'pools/detail.html'
} }
], ], [
[ member, {
href + 'pools/:poolId/members/detail/:memberId',
{
templateUrl: basePath + 'members/detail.html' templateUrl: basePath + 'members/detail.html'
} }
], ], [
[ healthmonitor, {
href + 'healthmonitors/detail/:healthmonitorId',
{
templateUrl: basePath + 'healthmonitors/detail.html' templateUrl: basePath + 'healthmonitors/detail.html'
} }
] ]];
];
expect($routeProvider.when.calls.count()).toBe(6); expect($routeProvider.when.calls.count()).toBe(6);
angular.forEach($routeProvider.when.calls.all(), function(call, i) { angular.forEach($routeProvider.when.calls.all(), function(call, i) {

View File

@ -39,34 +39,20 @@
function ListenerDetailController(api, $routeParams) { function ListenerDetailController(api, $routeParams) {
var ctrl = this; var ctrl = this;
ctrl.listener = {};
ctrl.loadbalancer = {};
var listenerID = $routeParams.listenerId;
init(); init();
//////////////////////////////// ////////////////////////////////
function init() { function init() {
api.getListener(listenerID).success(listenerSuccess); api.getListener($routeParams.listenerId).success(set('listener'));
api.getLoadBalancer($routeParams.loadbalancerId).success(set('loadbalancer'));
} }
function listenerSuccess(response) { function set(property) {
ctrl.listener = response; return angular.bind(null, function setProp(property, value) {
ctrl[property] = value;
if (ctrl.listener.hasOwnProperty('loadbalancers') && }, property);
ctrl.listener.loadbalancers.length > 0) {
getLoadBalancerDetails(ctrl.listener.loadbalancers[0].id);
}
}
function getLoadBalancerDetails(loadbalancerId) {
api.getLoadBalancer(loadbalancerId).success(loadbalancerSuccess);
}
function loadbalancerSuccess(response) {
ctrl.loadbalancer = response;
} }
} }

View File

@ -17,12 +17,12 @@
'use strict'; 'use strict';
describe('LBaaS v2 Listener Detail Controller', function() { describe('LBaaS v2 Listener Detail Controller', function() {
var controller, lbaasv2API, listener; var lbaasv2API, ctrl;
function fakeAPI() { function fakeAPI() {
return { return {
success: function(callback) { success: function(callback) {
callback(listener); callback('foo');
} }
}; };
} }
@ -37,29 +37,22 @@
beforeEach(inject(function($injector) { beforeEach(inject(function($injector) {
lbaasv2API = $injector.get('horizon.app.core.openstack-service-api.lbaasv2'); lbaasv2API = $injector.get('horizon.app.core.openstack-service-api.lbaasv2');
controller = $injector.get('$controller');
spyOn(lbaasv2API, 'getListener').and.callFake(fakeAPI); spyOn(lbaasv2API, 'getListener').and.callFake(fakeAPI);
spyOn(lbaasv2API, 'getLoadBalancer').and.callFake(fakeAPI); spyOn(lbaasv2API, 'getLoadBalancer').and.callFake(fakeAPI);
var controller = $injector.get('$controller');
ctrl = controller('ListenerDetailController', {
$routeParams: {
loadbalancerId: 'loadbalancerId',
listenerId: 'listenerId'
}
});
})); }));
function createController() {
return controller('ListenerDetailController', {
api: lbaasv2API,
$routeParams: { listenerId: '1234' }
});
}
it('should invoke lbaasv2 apis', function() { it('should invoke lbaasv2 apis', function() {
listener = { id: '1234', loadbalancers: [{id: '5678'}] }; expect(lbaasv2API.getListener).toHaveBeenCalledWith('listenerId');
createController(); expect(lbaasv2API.getLoadBalancer).toHaveBeenCalledWith('loadbalancerId');
expect(lbaasv2API.getListener).toHaveBeenCalledWith('1234'); expect(ctrl.loadbalancer).toBe('foo');
expect(lbaasv2API.getLoadBalancer).toHaveBeenCalledWith('5678'); expect(ctrl.listener).toBe('foo');
});
it('should not invoke getLoadBalancer lbaasv2 api', function() {
listener = { id: '1234', loadbalancers: [] };
createController();
expect(lbaasv2API.getListener).toHaveBeenCalledWith('1234');
}); });
}); });

View File

@ -2,7 +2,7 @@
<div class='page-header'> <div class='page-header'>
<ol class="breadcrumb"> <ol class="breadcrumb">
<li><a href="project/ngloadbalancersv2/"><translate>Load Balancers</translate></a></li> <li><a href="project/ngloadbalancersv2/"><translate>Load Balancers</translate></a></li>
<li><a href="project/ngloadbalancersv2/detail/{$ ::ctrl.loadbalancer.id $}">{$ ::(ctrl.loadbalancer.name || ctrl.loadbalancer.id) $}</a></li> <li><a href="project/ngloadbalancersv2/{$ ::ctrl.loadbalancer.id $}">{$ ::(ctrl.loadbalancer.name || ctrl.loadbalancer.id) $}</a></li>
<li class="active">{$ ::(ctrl.listener.name || ctrl.listener.id) $}</li> <li class="active">{$ ::(ctrl.listener.name || ctrl.listener.id) $}</li>
</ol> </ol>
<p ng-if="::ctrl.listener.description">{$ ::ctrl.listener.description $}</p> <p ng-if="::ctrl.listener.description">{$ ::ctrl.listener.description $}</p>
@ -37,7 +37,7 @@
<dt translate>Default Pool ID</dt> <dt translate>Default Pool ID</dt>
<dd> <dd>
<div ng-if="ctrl.listener.default_pool_id"> <div ng-if="ctrl.listener.default_pool_id">
<a ng-href="project/ngloadbalancersv2/pools/detail/{$ ::ctrl.listener.default_pool_id $}">{$ ::ctrl.listener.default_pool_id $}</a> <a ng-href="project/ngloadbalancersv2/{$ ::ctrl.loadbalancer.id $}/listeners/{$ ::ctrl.listener.id $}/pools/{$ ::ctrl.listener.default_pool_id $}">{$ ::ctrl.listener.default_pool_id $}</a>
</div> </div>
<div ng-if="!ctrl.listener.default_pool_id"> <div ng-if="!ctrl.listener.default_pool_id">
{$ 'None' | translate $} {$ 'None' | translate $}

View File

@ -46,15 +46,14 @@
ctrl.src = []; ctrl.src = [];
ctrl.checked = {}; ctrl.checked = {};
ctrl.batchActions = batchActions; ctrl.batchActions = batchActions;
ctrl.loadbalancerId = $routeParams.loadbalancerId;
var loadbalancerId = $routeParams.loadbalancerId;
init(); init();
//////////////////////////////// ////////////////////////////////
function init() { function init() {
api.getListeners(loadbalancerId).success(success); api.getListeners(ctrl.loadbalancerId).success(success);
} }
function success(response) { function success(response) {

View File

@ -68,7 +68,7 @@
duration="200"> duration="200">
</span> </span>
</td> </td>
<td class="rsp-p1"><a ng-href="project/ngloadbalancersv2/listeners/detail/{$ ::item.id $}">{$ ::(item.name || item.id) $}</a></td> <td class="rsp-p1"><a ng-href="project/ngloadbalancersv2/{$ ::table.loadbalancerId $}/listeners/{$ ::item.id $}">{$ ::(item.name || item.id) $}</a></td>
<td class="rsp-p1">{$ ::item.description | noValue $}</td> <td class="rsp-p1">{$ ::item.description | noValue $}</td>
<td class="rsp-p1">{$ ::item.protocol$}</td> <td class="rsp-p1">{$ ::item.protocol$}</td>
<td class="rsp-p1">{$ ::item.protocol_port$}</td> <td class="rsp-p1">{$ ::item.protocol_port$}</td>

View File

@ -78,7 +78,7 @@
} }
function onCreate(response) { function onCreate(response) {
$location.path('project/ngloadbalancersv2/detail/' + response.data.id); $location.path('project/ngloadbalancersv2/' + response.data.id);
} }
} }

View File

@ -75,7 +75,7 @@
it('should redirect after create', function() { it('should redirect after create', function() {
spyOn($location, 'path').and.callThrough(); spyOn($location, 'path').and.callThrough();
actions[0].service.perform(); actions[0].service.perform();
expect($location.path).toHaveBeenCalledWith('project/ngloadbalancersv2/detail/1'); expect($location.path).toHaveBeenCalledWith('project/ngloadbalancersv2/1');
}); });
}); });

View File

@ -40,19 +40,16 @@
*/ */
function LoadBalancerDetailController(api, rowActions, $routeParams) { function LoadBalancerDetailController(api, rowActions, $routeParams) {
var ctrl = this; var ctrl = this;
ctrl.loadbalancer = null;
ctrl.actions = rowActions.actions;
var loadbalancerId = $routeParams.loadbalancerId; ctrl.actions = rowActions.actions;
init(); init();
//////////////////////////////// ////////////////////////////////
function init() { function init() {
api.getLoadBalancer(loadbalancerId).success(success); api.getLoadBalancer($routeParams.loadbalancerId).success(success);
} }
function success(response) { function success(response) {

View File

@ -71,7 +71,7 @@
duration="200"> duration="200">
</span> </span>
</td> </td>
<td class="rsp-p1"><a ng-href="project/ngloadbalancersv2/detail/{$ ::item.id $}">{$ ::(item.name || item.id) $}</a></td> <td class="rsp-p1"><a ng-href="project/ngloadbalancersv2/{$ ::item.id $}">{$ ::(item.name || item.id) $}</a></td>
<td class="rsp-p1">{$ ::item.description | noValue $}</td> <td class="rsp-p1">{$ ::item.description | noValue $}</td>
<td class="rsp-p1">{$ ::item.operating_status | operatingStatus $}</td> <td class="rsp-p1">{$ ::item.operating_status | operatingStatus $}</td>
<td class="rsp-p1">{$ ::item.provisioning_status | provisioningStatus $}</td> <td class="rsp-p1">{$ ::item.provisioning_status | provisioningStatus $}</td>

View File

@ -39,58 +39,22 @@
function MemberDetailController(api, $routeParams) { function MemberDetailController(api, $routeParams) {
var ctrl = this; var ctrl = this;
ctrl.member = {};
ctrl.pool = {};
ctrl.listener = {};
ctrl.loadbalancer = {};
var poolID = $routeParams.poolId;
var memberID = $routeParams.memberId;
init(); init();
//////////////////////////////// ////////////////////////////////
function init() { function init() {
api.getMember(poolID, memberID).success(memberSuccess); api.getMember($routeParams.poolId, $routeParams.memberId).success(set('member'));
api.getPool($routeParams.poolId).success(set('pool'));
api.getListener($routeParams.listenerId).success(set('listener'));
api.getLoadBalancer($routeParams.loadbalancerId).success(set('loadbalancer'));
} }
function memberSuccess(response) { function set(property) {
ctrl.member = response; return angular.bind(null, function setProp(property, value) {
getPoolDetails(poolID); ctrl[property] = value;
} }, property);
function getPoolDetails(poolId) {
api.getPool(poolId).success(poolSuccess);
}
function poolSuccess(response) {
ctrl.pool = response;
if (ctrl.pool.hasOwnProperty('listeners') &&
ctrl.pool.listeners.length > 0) {
getListenerDetails(ctrl.pool.listeners[0].id);
}
}
function getListenerDetails(listenerId) {
api.getListener(listenerId).success(listenerSuccess);
}
function listenerSuccess(response) {
ctrl.listener = response;
if (ctrl.listener.hasOwnProperty('loadbalancers') &&
ctrl.listener.loadbalancers.length > 0) {
getLoadBalancerDetails(ctrl.listener.loadbalancers[0].id);
}
}
function getLoadBalancerDetails(loadbalancerId) {
api.getLoadBalancer(loadbalancerId).success(loadbalancerSuccess);
}
function loadbalancerSuccess(response) {
ctrl.loadbalancer = response;
} }
} }

View File

@ -17,36 +17,12 @@
'use strict'; 'use strict';
describe('LBaaS v2 Member Detail Controller', function() { describe('LBaaS v2 Member Detail Controller', function() {
var controller, lbaasv2API, member, pool, listener, loadbalancer; var lbaasv2API, ctrl;
function fakeMemberAPI() { function fakeAPI() {
return { return {
success: function(callback) { success: function(callback) {
callback(member); callback('foo');
}
};
}
function fakePoolAPI() {
return {
success: function(callback) {
callback(pool);
}
};
}
function fakeListenerAPI() {
return {
success: function(callback) {
callback(listener);
}
};
}
function fakeLoadBalancerAPI() {
return {
success: function(callback) {
callback(loadbalancer);
} }
}; };
} }
@ -60,50 +36,31 @@
beforeEach(module('horizon.dashboard.project.lbaasv2')); beforeEach(module('horizon.dashboard.project.lbaasv2'));
beforeEach(inject(function($injector) { beforeEach(inject(function($injector) {
member = { id: '5678' };
lbaasv2API = $injector.get('horizon.app.core.openstack-service-api.lbaasv2'); lbaasv2API = $injector.get('horizon.app.core.openstack-service-api.lbaasv2');
controller = $injector.get('$controller'); spyOn(lbaasv2API, 'getMember').and.callFake(fakeAPI);
spyOn(lbaasv2API, 'getMember').and.callFake(fakeMemberAPI); spyOn(lbaasv2API, 'getPool').and.callFake(fakeAPI);
spyOn(lbaasv2API, 'getPool').and.callFake(fakePoolAPI); spyOn(lbaasv2API, 'getListener').and.callFake(fakeAPI);
spyOn(lbaasv2API, 'getListener').and.callFake(fakeListenerAPI); spyOn(lbaasv2API, 'getLoadBalancer').and.callFake(fakeAPI);
spyOn(lbaasv2API, 'getLoadBalancer').and.callFake(fakeLoadBalancerAPI); var controller = $injector.get('$controller');
ctrl = controller('MemberDetailController', {
$routeParams: {
loadbalancerId: 'loadbalancerId',
listenerId: 'listenerId',
poolId: 'poolId',
memberId: 'memberId'
}
});
})); }));
function createController() {
return controller('MemberDetailController', {
api: lbaasv2API,
$routeParams: { poolId: 'poolId', memberId: 'memberId' }
});
}
it('should invoke lbaasv2 apis', function() { it('should invoke lbaasv2 apis', function() {
pool = { id: 'poolId', listeners: [{id: 'listenerId'}] }; expect(lbaasv2API.getMember).toHaveBeenCalledWith('poolId','memberId');
listener = { id: 'listenerId', loadbalancers: [{id: 'loadbalancerId'}] };
loadbalancer = { id: 'loadbalancerId' };
createController();
expect(lbaasv2API.getMember).toHaveBeenCalledWith('poolId', 'memberId');
expect(lbaasv2API.getPool).toHaveBeenCalledWith('poolId'); expect(lbaasv2API.getPool).toHaveBeenCalledWith('poolId');
expect(lbaasv2API.getListener).toHaveBeenCalledWith('listenerId'); expect(lbaasv2API.getListener).toHaveBeenCalledWith('listenerId');
expect(lbaasv2API.getLoadBalancer).toHaveBeenCalledWith('loadbalancerId'); expect(lbaasv2API.getLoadBalancer).toHaveBeenCalledWith('loadbalancerId');
}); expect(ctrl.loadbalancer).toBe('foo');
expect(ctrl.listener).toBe('foo');
it('should not invoke the getListener or getLoadBalancer lbaasv2 api', function() { expect(ctrl.pool).toBe('foo');
pool = { id: 'poolId', listeners: [] }; expect(ctrl.member).toBe('foo');
createController();
expect(lbaasv2API.getMember).toHaveBeenCalledWith('poolId', 'memberId');
expect(lbaasv2API.getPool).toHaveBeenCalledWith('poolId');
expect(lbaasv2API.getListener).not.toHaveBeenCalled();
expect(lbaasv2API.getLoadBalancer).not.toHaveBeenCalled();
});
it('should not invoke getLoadBalancer lbaasv2 api', function() {
pool = { id: 'poolId', listeners: [{id: 'listenerId'}] };
listener = { id: 'listenerId', loadbalancers: [] };
createController();
expect(lbaasv2API.getMember).toHaveBeenCalledWith('poolId', 'memberId');
expect(lbaasv2API.getPool).toHaveBeenCalledWith('poolId');
expect(lbaasv2API.getListener).toHaveBeenCalledWith('listenerId');
expect(lbaasv2API.getLoadBalancer).not.toHaveBeenCalled();
}); });
}); });

View File

@ -2,9 +2,9 @@
<div class='page-header'> <div class='page-header'>
<ol class="breadcrumb"> <ol class="breadcrumb">
<li><a href="project/ngloadbalancersv2/"><translate>Load Balancers</translate></a></li> <li><a href="project/ngloadbalancersv2/"><translate>Load Balancers</translate></a></li>
<li><a href="project/ngloadbalancersv2/detail/{$ ::ctrl.loadbalancer.id $}">{$ ::(ctrl.loadbalancer.name || ctrl.loadbalancer.id) $}</a></li> <li><a href="project/ngloadbalancersv2/{$ ::ctrl.loadbalancer.id $}">{$ ::(ctrl.loadbalancer.name || ctrl.loadbalancer.id) $}</a></li>
<li><a href="project/ngloadbalancersv2/listeners/detail/{$ ::ctrl.listener.id $}">{$ ::(ctrl.listener.name || ctrl.listener.id) $}</a></li> <li><a href="project/ngloadbalancersv2/{$ ::ctrl.loadbalancer.id $}/listeners/{$ ::ctrl.listener.id $}">{$ ::(ctrl.listener.name || ctrl.listener.id) $}</a></li>
<li><a href="project/ngloadbalancersv2/pools/detail/{$ ::ctrl.pool.id $}">{$ ::(ctrl.pool.name || ctrl.pool.id) $}</a></li> <li><a href="project/ngloadbalancersv2/{$ ::ctrl.loadbalancer.id $}/listeners/{$ ::ctrl.listener.id $}/pools/{$ ::ctrl.pool.id $}">{$ ::(ctrl.pool.name || ctrl.pool.id) $}</a></li>
<li class="active">{$ ::(ctrl.member.name || ctrl.member.id) $}</li> <li class="active">{$ ::(ctrl.member.name || ctrl.member.id) $}</li>
</ol> </ol>
</div> </div>

View File

@ -43,16 +43,16 @@
ctrl.items = []; ctrl.items = [];
ctrl.src = []; ctrl.src = [];
ctrl.checked = {}; ctrl.checked = {};
ctrl.loadbalancerId = $routeParams.loadbalancerId;
var poolID = $routeParams.poolId; ctrl.listenerId = $routeParams.listenerId;
ctrl.pool_id = poolID; ctrl.poolId = $routeParams.poolId;
init(); init();
//////////////////////////////// ////////////////////////////////
function init() { function init() {
api.getMembers(poolID).success(success); api.getMembers(ctrl.poolId).success(success);
} }
function success(response) { function success(response) {

View File

@ -60,7 +60,7 @@
ng-model="selected[item.id].checked" ng-model="selected[item.id].checked"
hz-select="item"> hz-select="item">
</td> </td>
<td class="rsp-p1"><a ng-href="project/ngloadbalancersv2/pools/{$ ::table.pool_id $}/members/detail/{$ ::item.id $}">{$ ::item.id $}</a></td> <td class="rsp-p1"><a ng-href="project/ngloadbalancersv2/{$ ::table.loadbalancerId $}/listeners/{$ ::table.listenerId $}/pools/{$ ::table.poolId $}/members/{$ ::item.id $}">{$ ::item.id $}</a></td>
<td class="rsp-p1">{$ ::item.address $}</td> <td class="rsp-p1">{$ ::item.address $}</td>
<td class="rsp-p1">{$ ::item.protocol_port $}</td> <td class="rsp-p1">{$ ::item.protocol_port $}</td>
<td class="rsp-p1">{$ ::item.weight $}</td> <td class="rsp-p1">{$ ::item.weight $}</td>

View File

@ -41,52 +41,27 @@
function PoolDetailController(api, $routeParams, gettext) { function PoolDetailController(api, $routeParams, gettext) {
var ctrl = this; var ctrl = this;
ctrl.pool = {};
ctrl.listener = {}; ctrl.loadBalancerAlgorithm = {
ctrl.loadbalancer = {};
ctrl.lb_algorithm_mappings = {
'ROUND_ROBIN': gettext('Round Robin'), 'ROUND_ROBIN': gettext('Round Robin'),
'LEAST_CONNECTIONS': gettext('Least Connections'), 'LEAST_CONNECTIONS': gettext('Least Connections'),
'SOURCE_IP': gettext('Source IP') 'SOURCE_IP': gettext('Source IP')
}; };
var poolId = $routeParams.poolId;
init(); init();
//////////////////////////////// ////////////////////////////////
function init() { function init() {
api.getPool(poolId).success(poolSuccess); api.getPool($routeParams.poolId).success(set('pool'));
api.getListener($routeParams.listenerId).success(set('listener'));
api.getLoadBalancer($routeParams.loadbalancerId).success(set('loadbalancer'));
} }
function poolSuccess(response) { function set(property) {
ctrl.pool = response; return angular.bind(null, function setProp(property, value) {
if (ctrl.pool.hasOwnProperty('listeners') && ctrl[property] = value;
ctrl.pool.listeners.length > 0) { }, property);
getListenerDetails(ctrl.pool.listeners[0].id);
}
}
function getListenerDetails(listenerId) {
api.getListener(listenerId).success(listenerSuccess);
}
function listenerSuccess(response) {
ctrl.listener = response;
if (ctrl.listener.hasOwnProperty('loadbalancers') &&
ctrl.listener.loadbalancers.length > 0) {
getLoadBalancerDetails(ctrl.listener.loadbalancers[0].id);
}
}
function getLoadBalancerDetails(loadbalancerId) {
api.getLoadBalancer(loadbalancerId).success(loadbalancerSuccess);
}
function loadbalancerSuccess(response) {
ctrl.loadbalancer = response;
} }
} }

View File

@ -17,83 +17,50 @@
'use strict'; 'use strict';
describe('LBaaS v2 Pool Detail Controller', function() { describe('LBaaS v2 Pool Detail Controller', function() {
var controller, lbaasv2API, gettextService, pool, listener, loadbalancer; var lbaasv2API, ctrl;
function fakePoolAPI() { function fakeAPI() {
return { return {
success: function(callback) { success: function(callback) {
callback(pool); callback('foo');
}
};
}
function fakeListenerAPI() {
return {
success: function(callback) {
callback(listener);
}
};
}
function fakeLoadBalancerAPI() {
return {
success: function(callback) {
callback(loadbalancer);
} }
}; };
} }
/////////////////////// ///////////////////////
beforeEach(module('horizon.framework.util.http')); beforeEach(module('horizon.framework.util'));
beforeEach(module('horizon.framework.widgets.toast')); beforeEach(module('horizon.framework.widgets.toast'));
beforeEach(module('horizon.framework.conf')); beforeEach(module('horizon.framework.conf'));
beforeEach(module('horizon.app.core.openstack-service-api')); beforeEach(module('horizon.app.core.openstack-service-api'));
beforeEach(module('horizon.dashboard.project.lbaasv2')); beforeEach(module('horizon.dashboard.project.lbaasv2'));
beforeEach(module('horizon.framework.util.i18n'));
beforeEach(inject(function($injector) { beforeEach(inject(function($injector) {
gettextService = $injector.get('horizon.framework.util.i18n.gettext');
lbaasv2API = $injector.get('horizon.app.core.openstack-service-api.lbaasv2'); lbaasv2API = $injector.get('horizon.app.core.openstack-service-api.lbaasv2');
controller = $injector.get('$controller'); spyOn(lbaasv2API, 'getPool').and.callFake(fakeAPI);
spyOn(lbaasv2API, 'getPool').and.callFake(fakePoolAPI); spyOn(lbaasv2API, 'getListener').and.callFake(fakeAPI);
spyOn(lbaasv2API, 'getListener').and.callFake(fakeListenerAPI); spyOn(lbaasv2API, 'getLoadBalancer').and.callFake(fakeAPI);
spyOn(lbaasv2API, 'getLoadBalancer').and.callFake(fakeLoadBalancerAPI); var controller = $injector.get('$controller');
ctrl = controller('PoolDetailController', {
$routeParams: {
loadbalancerId: 'loadbalancerId',
listenerId: 'listenerId',
poolId: 'poolId'
}
});
})); }));
function createController() {
return controller('PoolDetailController', {
api: lbaasv2API,
$routeParams: { poolId: 'poolId' },
gettext: gettextService
});
}
it('should invoke lbaasv2 apis', function() { it('should invoke lbaasv2 apis', function() {
pool = { id: 'poolId', listeners: [{id: 'listenerId'}] };
listener = { id: 'listenerId', loadbalancers: [{id: 'loadbalancerId'}] };
loadbalancer = { id: 'loadbalancerId' };
createController();
expect(lbaasv2API.getPool).toHaveBeenCalledWith('poolId'); expect(lbaasv2API.getPool).toHaveBeenCalledWith('poolId');
expect(lbaasv2API.getListener).toHaveBeenCalledWith('listenerId'); expect(lbaasv2API.getListener).toHaveBeenCalledWith('listenerId');
expect(lbaasv2API.getLoadBalancer).toHaveBeenCalledWith('loadbalancerId'); expect(lbaasv2API.getLoadBalancer).toHaveBeenCalledWith('loadbalancerId');
expect(ctrl.loadbalancer).toBe('foo');
expect(ctrl.listener).toBe('foo');
expect(ctrl.pool).toBe('foo');
}); });
it('should not invoke the getListener or getLoadBalancer lbaasv2 api', function() { it('should define mapping for the load balancer algorithm', function() {
pool = { id: 'poolId', listeners: [] }; expect(ctrl.loadBalancerAlgorithm).toBeDefined();
createController();
expect(lbaasv2API.getPool).toHaveBeenCalledWith('poolId');
expect(lbaasv2API.getListener).not.toHaveBeenCalled();
expect(lbaasv2API.getLoadBalancer).not.toHaveBeenCalled();
});
it('should not invoke getLoadBalancer lbaasv2 api', function() {
pool = { id: 'poolId', listeners: [{id: 'listenerId'}] };
listener = { id: 'listenerId', loadbalancers: [] };
createController();
expect(lbaasv2API.getPool).toHaveBeenCalledWith('poolId');
expect(lbaasv2API.getListener).toHaveBeenCalledWith('listenerId');
expect(lbaasv2API.getLoadBalancer).not.toHaveBeenCalled();
}); });
}); });

View File

@ -2,8 +2,8 @@
<div class='page-header'> <div class='page-header'>
<ol class="breadcrumb"> <ol class="breadcrumb">
<li><a href="project/ngloadbalancersv2/"><translate>Load Balancers</translate></a></li> <li><a href="project/ngloadbalancersv2/"><translate>Load Balancers</translate></a></li>
<li><a href="project/ngloadbalancersv2/detail/{$ ::ctrl.loadbalancer.id $}">{$ ::(ctrl.loadbalancer.name || ctrl.loadbalancer.id) $}</a></li> <li><a href="project/ngloadbalancersv2/{$ ::ctrl.loadbalancer.id $}">{$ ::(ctrl.loadbalancer.name || ctrl.loadbalancer.id) $}</a></li>
<li><a href="project/ngloadbalancersv2/listeners/detail/{$ ::ctrl.listener.id $}">{$ ::(ctrl.listener.name || ctrl.listener.id) $}</a></li> <li><a href="project/ngloadbalancersv2/{$ ::ctrl.loadbalancer.id $}/listeners/{$ ::ctrl.listener.id $}">{$ ::(ctrl.listener.name || ctrl.listener.id) $}</a></li>
<li class="active">{$ ::(ctrl.pool.name || ctrl.pool.id) $}</li> <li class="active">{$ ::(ctrl.pool.name || ctrl.pool.id) $}</li>
</ol> </ol>
<p ng-if="::ctrl.pool.description">{$ ::ctrl.pool.description $}</p> <p ng-if="::ctrl.pool.description">{$ ::ctrl.pool.description $}</p>
@ -30,7 +30,7 @@
</div> </div>
<div> <div>
<dt translate>Load Balancer Algorithm</dt> <dt translate>Load Balancer Algorithm</dt>
<dd>{$ ctrl.pool.lb_algorithm | decode:ctrl.lb_algorithm_mappings $}</dd> <dd>{$ ctrl.pool.lb_algorithm | decode:ctrl.loadBalancerAlgorithm $}</dd>
</div> </div>
<div> <div>
<dt translate>Session Persistence</dt> <dt translate>Session Persistence</dt>
@ -47,7 +47,7 @@
<dt translate>Health Monitor ID</dt> <dt translate>Health Monitor ID</dt>
<dd> <dd>
<div ng-if="ctrl.pool.healthmonitor_id"> <div ng-if="ctrl.pool.healthmonitor_id">
<a ng-href="project/ngloadbalancersv2/healthmonitors/detail/{$ ::ctrl.pool.healthmonitor_id $}">{$ ::ctrl.pool.healthmonitor_id $}</a> <a ng-href="project/ngloadbalancersv2/{$ ::ctrl.loadbalancer.id $}/listeners/{$ ::ctrl.listener.id $}/pools/{$ ::ctrl.pool.id $}/healthmonitors/{$ ::ctrl.pool.healthmonitor_id $}">{$ ::ctrl.pool.healthmonitor_id $}</a>
</div> </div>
<div ng-if="!ctrl.pool.healthmonitor_id"> <div ng-if="!ctrl.pool.healthmonitor_id">
{$ 'None' | translate $} {$ 'None' | translate $}