From 05170ec174ebbcaa7a32db0a9541d5078fa354ea Mon Sep 17 00:00:00 2001 From: Jacky Hu Date: Tue, 6 Mar 2018 18:11:16 +0800 Subject: [PATCH] Being able to change insert headers of listener Change-Id: I8de70e4f3edf22b316e691388413116b14697081 Story: 1713861 Task: 5368 --- octavia_dashboard/api/rest/lbaasv2.py | 4 +- .../lbaasv2/listeners/details/detail.html | 2 +- .../lbaasv2/listeners/details/drawer.html | 2 +- .../lbaasv2/listeners/listeners.module.js | 8 ++- .../workflow/listener/listener.help.html | 7 +++ .../lbaasv2/workflow/listener/listener.html | 36 +++++++++++++ .../project/lbaasv2/workflow/model.service.js | 27 ++++++---- .../lbaasv2/workflow/model.service.spec.js | 51 ++++++++++++++++++- package.json | 6 ++- .../add-insert-headers-a6fd80c837a89536.yaml | 4 ++ 10 files changed, 130 insertions(+), 17 deletions(-) create mode 100644 releasenotes/notes/add-insert-headers-a6fd80c837a89536.yaml diff --git a/octavia_dashboard/api/rest/lbaasv2.py b/octavia_dashboard/api/rest/lbaasv2.py index e0f7ae8c..6200ac2b 100644 --- a/octavia_dashboard/api/rest/lbaasv2.py +++ b/octavia_dashboard/api/rest/lbaasv2.py @@ -169,7 +169,8 @@ def create_listener(request, **kwargs): connection_limit=data['listener'].get('connection_limit'), default_tls_container_ref=default_tls_ref, sni_container_refs=None, - admin_state_up=data['listener'].get('admin_state_up') + admin_state_up=data['listener'].get('admin_state_up'), + insert_headers=data['listener'].get('insert_headers'), ) if data.get('pool'): @@ -394,6 +395,7 @@ def update_listener(request, **kwargs): connection_limit=data['listener'].get('connection_limit'), admin_state_up=data['listener'].get('admin_state_up'), default_pool_id=default_pool_id, + insert_headers=data['listener'].get('insert_headers'), ) if data.get('pool'): diff --git a/octavia_dashboard/static/dashboard/project/lbaasv2/listeners/details/detail.html b/octavia_dashboard/static/dashboard/project/lbaasv2/listeners/details/detail.html index f810dde1..1c09cc59 100644 --- a/octavia_dashboard/static/dashboard/project/lbaasv2/listeners/details/detail.html +++ b/octavia_dashboard/static/dashboard/project/lbaasv2/listeners/details/detail.html @@ -51,7 +51,7 @@ item="ctrl.listener" property-groups="[[ 'id', 'name', 'description', 'project_id', 'created_at', 'updated_at', - 'connection_limit', 'default_pool_id']]"> + 'connection_limit', 'insert_headers', 'default_pool_id']]"> diff --git a/octavia_dashboard/static/dashboard/project/lbaasv2/listeners/details/drawer.html b/octavia_dashboard/static/dashboard/project/lbaasv2/listeners/details/drawer.html index cec0fec1..faf42c80 100644 --- a/octavia_dashboard/static/dashboard/project/lbaasv2/listeners/details/drawer.html +++ b/octavia_dashboard/static/dashboard/project/lbaasv2/listeners/details/drawer.html @@ -5,5 +5,5 @@ ['name', 'id', 'project_id'], ['created_at', 'updated_at', 'description'], ['protocol', 'protocol_port', 'connection_limit'], - ['default_pool_id']]"> + ['insert_headers', 'default_pool_id']]"> diff --git a/octavia_dashboard/static/dashboard/project/lbaasv2/listeners/listeners.module.js b/octavia_dashboard/static/dashboard/project/lbaasv2/listeners/listeners.module.js index 07515593..6ff8fd77 100644 --- a/octavia_dashboard/static/dashboard/project/lbaasv2/listeners/listeners.module.js +++ b/octavia_dashboard/static/dashboard/project/lbaasv2/listeners/listeners.module.js @@ -170,7 +170,13 @@ filters: ['noName'] }, l7_policies: gettext('L7 Policies'), - insert_headers: gettext('Insert Headers'), + insert_headers: { + label: gettext('Insert Headers'), + filters: [ + 'json', + loadBalancerService.nullFilter + ] + }, load_balancers: gettext('Load Balancers') }; } diff --git a/octavia_dashboard/static/dashboard/project/lbaasv2/workflow/listener/listener.help.html b/octavia_dashboard/static/dashboard/project/lbaasv2/workflow/listener/listener.help.html index d8ae8d79..e28699b2 100644 --- a/octavia_dashboard/static/dashboard/project/lbaasv2/workflow/listener/listener.help.html +++ b/octavia_dashboard/static/dashboard/project/lbaasv2/workflow/listener/listener.help.html @@ -30,3 +30,10 @@ The ID of the pool used by the listener if no L7 policies match.

+

+ Insert Headers: + + Additional headers insertion into HTTP header, + only "X-Forwarded-For" and "X-Forwarded-Port" are supported. + +

diff --git a/octavia_dashboard/static/dashboard/project/lbaasv2/workflow/listener/listener.html b/octavia_dashboard/static/dashboard/project/lbaasv2/workflow/listener/listener.html index 1a26d935..31c8e317 100644 --- a/octavia_dashboard/static/dashboard/project/lbaasv2/workflow/listener/listener.html +++ b/octavia_dashboard/static/dashboard/project/lbaasv2/workflow/listener/listener.html @@ -96,6 +96,42 @@ +

Insert Headers

+ +
+ +
+
+
+ + +
+
+
+ +
+
+
+ + +
+
+
+ +
+
diff --git a/octavia_dashboard/static/dashboard/project/lbaasv2/workflow/model.service.js b/octavia_dashboard/static/dashboard/project/lbaasv2/workflow/model.service.js index 175da853..88177699 100644 --- a/octavia_dashboard/static/dashboard/project/lbaasv2/workflow/model.service.js +++ b/octavia_dashboard/static/dashboard/project/lbaasv2/workflow/model.service.js @@ -152,7 +152,8 @@ connection_limit: -1, admin_state_up: true, default_pool: null, - default_pool_id: null + default_pool_id: null, + insert_headers: {} }, l7policy: { id: null, @@ -455,15 +456,22 @@ // Listener requires protocol and port delete finalSpec.listener; delete finalSpec.certificates; - } else if (finalSpec.listener.protocol !== 'TERMINATED_HTTPS') { - // Remove certificate containers if not using TERMINATED_HTTPS - delete finalSpec.certificates; } else { - var containers = []; - angular.forEach(finalSpec.certificates, function(cert) { - containers.push(cert.id); - }); - finalSpec.certificates = containers; + for (var header in finalSpec.listener.insert_headers) { + if (!finalSpec.listener.insert_headers[header]) { + delete finalSpec.listener.insert_headers[header]; + } + } + if (finalSpec.listener.protocol !== 'TERMINATED_HTTPS') { + // Remove certificate containers if not using TERMINATED_HTTPS + delete finalSpec.certificates; + } else { + var containers = []; + angular.forEach(finalSpec.certificates, function(cert) { + containers.push(cert.id); + }); + finalSpec.certificates = containers; + } } } @@ -735,6 +743,7 @@ spec.connection_limit = listener.connection_limit; spec.admin_state_up = listener.admin_state_up; spec.default_pool_id = listener.default_pool_id; + spec.insert_headers = listener.insert_headers; } function setL7PolicySpec(l7policy) { diff --git a/octavia_dashboard/static/dashboard/project/lbaasv2/workflow/model.service.spec.js b/octavia_dashboard/static/dashboard/project/lbaasv2/workflow/model.service.spec.js index 5a5c3aee..e9904bc2 100644 --- a/octavia_dashboard/static/dashboard/project/lbaasv2/workflow/model.service.spec.js +++ b/octavia_dashboard/static/dashboard/project/lbaasv2/workflow/model.service.spec.js @@ -34,7 +34,11 @@ protocol_port: 80, connection_limit: 999, load_balancers: [ { id: '1234' } ], - sni_container_refs: ['container2'] + sni_container_refs: ['container2'], + insert_headers: { + 'X-Forwarded-For': 'True', + 'X-Forwarded-Port': 'True' + } }, pool: { admin_state_up: true, @@ -1173,7 +1177,7 @@ it('has the right number of properties', function() { expect(Object.keys(model.spec).length).toBe(11); expect(Object.keys(model.spec.loadbalancer).length).toBe(5); - expect(Object.keys(model.spec.listener).length).toBe(9); + expect(Object.keys(model.spec.listener).length).toBe(10); expect(Object.keys(model.spec.l7policy).length).toBe(8); expect(Object.keys(model.spec.l7rule).length).toBe(7); expect(Object.keys(model.spec.pool).length).toBe(7); @@ -2442,6 +2446,49 @@ }); + describe('Model visible resources (edit listener, no insert headers)', function() { + + beforeEach(function() { + delete listenerResources.listener.insert_headers; + delete listenerResources.pool; + model.initialize('listener', '1234'); + scope.$apply(); + }); + + it('should only show listener details', function() { + expect(model.context.resource).toEqual('listener'); + }); + }); + + describe('Model visible resources (edit listener, no x forwared for)', function() { + + beforeEach(function() { + listenerResources.listener.insert_headers['X-Forwarded-For'] = ''; + delete listenerResources.pool; + model.initialize('listener', '1234'); + scope.$apply(); + }); + + it('should only show listener details', function() { + model.submit(); + expect(model.context.resource).toEqual('listener'); + }); + }); + + describe('Model visible resources (edit listener, no x forwared port)', function() { + + beforeEach(function() { + delete listenerResources.listener.insert_headers['X-Forwarded-Port']; + delete listenerResources.pool; + model.initialize('listener', '1234'); + scope.$apply(); + }); + + it('should only show listener details', function() { + expect(model.context.resource).toEqual('listener'); + }); + }); + describe('Model visible resources (edit listener, no pool)', function() { beforeEach(function() { diff --git a/package.json b/package.json index b31cab34..7db8375a 100644 --- a/package.json +++ b/package.json @@ -8,10 +8,12 @@ "OpenStack", "octavia", "octavia-dashboard", - "load-balancer"], + "load-balancer" + ], "repository": { "type": "git", - "url": "https://git.openstack.org/openstack/octavia-dashboard"}, + "url": "https://git.openstack.org/openstack/octavia-dashboard" + }, "bugs": "https://storyboard.openstack.org/#!/project/909", "license": "Apache 2.0", "devDependencies": { diff --git a/releasenotes/notes/add-insert-headers-a6fd80c837a89536.yaml b/releasenotes/notes/add-insert-headers-a6fd80c837a89536.yaml new file mode 100644 index 00000000..17a551c5 --- /dev/null +++ b/releasenotes/notes/add-insert-headers-a6fd80c837a89536.yaml @@ -0,0 +1,4 @@ +--- +features: + - | + Adds the ability to set the insertion headers on listeners.