From 4e48040c42a6d589aef272ae44c0a8bcbe289f96 Mon Sep 17 00:00:00 2001 From: Pierre-Yves Jourel Date: Thu, 15 Sep 2022 19:11:43 +0000 Subject: [PATCH] Add ability to create Prometheus listener This changes allows the user to create a Prometheus listener through Horizon. Story 2010300 Task 46296 Change-Id: I34cd06054c9eecde8f4938786de1d52dc7c78614 --- octavia_dashboard/api/rest/lbaasv2.py | 25 +++++++++++++++++++ .../workflow/listener/listener.controller.js | 15 ++++++++++- .../listener/listener.controller.spec.js | 5 ++++ .../lbaasv2/workflow/listener/listener.html | 2 +- .../loadbalancer/loadbalancer.help.html | 6 +++++ .../workflow/loadbalancer/loadbalancer.html | 24 ++++++++++++++++++ .../project/lbaasv2/workflow/model.service.js | 6 +++-- .../lbaasv2/workflow/model.service.spec.js | 9 ++++--- ...-Prometheus-listener-42c22822637119ca.yaml | 4 +++ 9 files changed, 88 insertions(+), 8 deletions(-) create mode 100644 releasenotes/notes/add-ability-to-create-Prometheus-listener-42c22822637119ca.yaml diff --git a/octavia_dashboard/api/rest/lbaasv2.py b/octavia_dashboard/api/rest/lbaasv2.py index 73ed77ea..83fca183 100644 --- a/octavia_dashboard/api/rest/lbaasv2.py +++ b/octavia_dashboard/api/rest/lbaasv2.py @@ -216,6 +216,11 @@ def create_loadbalancer(request): kwargs = {'from_state': 'PENDING_CREATE'} thread.start_new_thread(poll_loadbalancer_status, args, kwargs) + if data['loadbalancer'].get('prometheus'): + args = (request, loadbalancer.id, create_prometheus_listener) + kwargs = {'from_state': 'PENDING_CREATE'} + thread.start_new_thread(poll_loadbalancer_status, args, kwargs) + return _get_sdk_object_dict(loadbalancer) @@ -261,6 +266,26 @@ def create_listener(request, **kwargs): return _get_sdk_object_dict(listener) +def create_prometheus_listener(request, **kwargs): + """Create a Prometheus listener + + """ + + data = request.DATA + + conn = _get_sdk_connection(request) + + listener = conn.load_balancer.create_listener( + protocol="PROMETHEUS", + protocol_port=data['loadbalancer'].get('prometheus_port'), + load_balancer_id=kwargs['loadbalancer_id'], + connection_limit=-1, + name="Prometheus" + ) + + return _get_sdk_object_dict(listener) + + def create_l7_policy(request, **kwargs): """Create a new l7 policy. diff --git a/octavia_dashboard/static/dashboard/project/lbaasv2/workflow/listener/listener.controller.js b/octavia_dashboard/static/dashboard/project/lbaasv2/workflow/listener/listener.controller.js index ad219f54..8f93db8a 100644 --- a/octavia_dashboard/static/dashboard/project/lbaasv2/workflow/listener/listener.controller.js +++ b/octavia_dashboard/static/dashboard/project/lbaasv2/workflow/listener/listener.controller.js @@ -54,7 +54,8 @@ //////////// function protocolChange(protocol) { - var defaultPort = { HTTP: 80, TERMINATED_HTTPS: 443 }[protocol]; + var defaultPort = { HTTP: 80, TERMINATED_HTTPS: 443, PROMETHEUS: 9100 }[protocol]; + var nextButtonSelector = "div.modal-footer button:nth-last-of-type(2)"; while (listenerPortExists(defaultPort)) { defaultPort += 1; } @@ -65,6 +66,18 @@ member.port = { HTTP: 80, TERMINATED_HTTPS: 80 }[protocol]; }); + if (protocol === 'PROMETHEUS') { + $('#wizard-side-nav ul').children().slice(-4).hide(); + $scope.model.context.create_pool = false; + $scope.model.context.create_monitor = false; + $(nextButtonSelector).attr("disabled", ""); + } else { + $('#wizard-side-nav ul').children().slice(-4).show(); + $scope.model.context.create_pool = true; + $scope.model.context.create_monitor = true; + $(nextButtonSelector).removeAttr("disabled"); + } + if (protocol === 'TERMINATED_HTTPS') { $('#wizard-side-nav ul li:last').show(); } else { diff --git a/octavia_dashboard/static/dashboard/project/lbaasv2/workflow/listener/listener.controller.spec.js b/octavia_dashboard/static/dashboard/project/lbaasv2/workflow/listener/listener.controller.spec.js index aca2d4ab..86d451cd 100644 --- a/octavia_dashboard/static/dashboard/project/lbaasv2/workflow/listener/listener.controller.spec.js +++ b/octavia_dashboard/static/dashboard/project/lbaasv2/workflow/listener/listener.controller.spec.js @@ -68,6 +68,11 @@ expect(listener.protocol_port).toBe(443); }); + it('should update port on protocol change to PROMETHEUS', function() { + ctrl.protocolChange('PROMETHEUS'); + expect(listener.protocol_port).toBe(9100); + }); + it('should update port on protocol change to TCP', function() { ctrl.protocolChange('TCP'); expect(listener.protocol_port).toBeUndefined(); 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 37de5ef3..9cfa9179 100644 --- a/octavia_dashboard/static/dashboard/project/lbaasv2/workflow/listener/listener.html +++ b/octavia_dashboard/static/dashboard/project/lbaasv2/workflow/listener/listener.html @@ -54,7 +54,7 @@ ng-change="ctrl.protocolChange(model.spec.listener.protocol)" ng-disabled="model.context.id"> + ng-disabled="(protocol==='TERMINATED_HTTPS' && model.certificatesError) || (protocol==='PROMETHEUS' && model.spec.loadbalancer.prometheus)">{$ protocol $} diff --git a/octavia_dashboard/static/dashboard/project/lbaasv2/workflow/loadbalancer/loadbalancer.help.html b/octavia_dashboard/static/dashboard/project/lbaasv2/workflow/loadbalancer/loadbalancer.help.html index 6f5d5226..03529f19 100644 --- a/octavia_dashboard/static/dashboard/project/lbaasv2/workflow/loadbalancer/loadbalancer.help.html +++ b/octavia_dashboard/static/dashboard/project/lbaasv2/workflow/loadbalancer/loadbalancer.help.html @@ -15,3 +15,9 @@ The network on which to allocate the load balancer's IP address.

+

+ Prometheus + + This option create a Prometheus listerner for you. + +

diff --git a/octavia_dashboard/static/dashboard/project/lbaasv2/workflow/loadbalancer/loadbalancer.html b/octavia_dashboard/static/dashboard/project/lbaasv2/workflow/loadbalancer/loadbalancer.html index a364ea70..e8a3a024 100644 --- a/octavia_dashboard/static/dashboard/project/lbaasv2/workflow/loadbalancer/loadbalancer.html +++ b/octavia_dashboard/static/dashboard/project/lbaasv2/workflow/loadbalancer/loadbalancer.html @@ -117,6 +117,30 @@ +
+
+ +
+
+ +
+
+
+
+ + +
+
+
+ + +
+
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 bd97cfd6..8b05e614 100644 --- a/octavia_dashboard/static/dashboard/project/lbaasv2/workflow/model.service.js +++ b/octavia_dashboard/static/dashboard/project/lbaasv2/workflow/model.service.js @@ -86,7 +86,7 @@ members: [], networks: {}, flavors: {}, - listenerProtocols: ['HTTP', 'TCP', 'TERMINATED_HTTPS', 'HTTPS', 'UDP', 'SCTP'], + listenerProtocols: ['HTTP', 'TCP', 'TERMINATED_HTTPS', 'HTTPS', 'UDP', 'SCTP', 'PROMETHEUS'], availability_zones: {}, l7policyActions: ['REJECT', 'REDIRECT_TO_URL', 'REDIRECT_TO_POOL'], l7ruleTypes: ['HOST_NAME', 'PATH', 'FILE_TYPE', 'HEADER', 'COOKIE'], @@ -156,7 +156,9 @@ vip_subnet_id: null, flavor_id: null, availability_zone: null, - admin_state_up: true + admin_state_up: true, + prometheus: false, + prometheus_port: null, }, listener: { id: null, 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 a0e2a8b3..7b0bb3b0 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 @@ -495,7 +495,7 @@ it('has array of listener protocols', function() { expect(model.listenerProtocols).toEqual(['HTTP', 'TCP', 'TERMINATED_HTTPS', 'HTTPS', - 'UDP', 'SCTP']); + 'UDP', 'SCTP', 'PROMETHEUS']); }); it('has array of pool lb_algorithms', function() { @@ -866,8 +866,9 @@ }); it('should initialize listener protocols', function() { - expect(model.listenerProtocols.length).toBe(6); + expect(model.listenerProtocols.length).toBe(7); expect(model.listenerProtocols.indexOf('TERMINATED_HTTPS')).toBe(2); + expect(model.listenerProtocols.indexOf('PROMETHEUS')).toBe(6); }); }); @@ -917,7 +918,7 @@ }); it('should initialize listener protocols', function() { - expect(model.listenerProtocols.length).toBe(5); + expect(model.listenerProtocols.length).toBe(6); expect(model.listenerProtocols.indexOf('TERMINATED_HTTPS')).toBe(-1); }); }); @@ -1358,7 +1359,7 @@ // to implement tests for them. it('has the right number of properties', function() { expect(Object.keys(model.spec).length).toBe(11); - expect(Object.keys(model.spec.loadbalancer).length).toBe(7); + expect(Object.keys(model.spec.loadbalancer).length).toBe(9); expect(Object.keys(model.spec.listener).length).toBe(16); expect(Object.keys(model.spec.l7policy).length).toBe(8); expect(Object.keys(model.spec.l7rule).length).toBe(7); diff --git a/releasenotes/notes/add-ability-to-create-Prometheus-listener-42c22822637119ca.yaml b/releasenotes/notes/add-ability-to-create-Prometheus-listener-42c22822637119ca.yaml new file mode 100644 index 00000000..8e41de8d --- /dev/null +++ b/releasenotes/notes/add-ability-to-create-Prometheus-listener-42c22822637119ca.yaml @@ -0,0 +1,4 @@ +--- +features: + - | + Add the ability to create a Prometheus listener. \ No newline at end of file