Skip to content
Snippets Groups Projects
Commit d831b45c authored by Josef Němec's avatar Josef Němec
Browse files

Merge branch 'fix/optional-loadbalancers' into 'master'

Make loadbalancer checks optional

See merge request !15
parents 848daa50 1ddff537
No related branches found
No related tags found
1 merge request!15Make loadbalancer checks optional
Pipeline #335363 passed
...@@ -22,6 +22,7 @@ from prometheus_client import start_http_server, Gauge, REGISTRY, PROCESS_COLLEC ...@@ -22,6 +22,7 @@ from prometheus_client import start_http_server, Gauge, REGISTRY, PROCESS_COLLEC
from ping3 import ping from ping3 import ping
import openstack import openstack
from icmplib import traceroute from icmplib import traceroute
import keystoneauth1.exceptions.catalog as ks_exc
import timeout import timeout
...@@ -346,55 +347,58 @@ class AppMetrics: ...@@ -346,55 +347,58 @@ class AppMetrics:
# remove all statuses (clears delete loadbalancers) # remove all statuses (clears delete loadbalancers)
self.openstack_loadbalancer_status.clear() self.openstack_loadbalancer_status.clear()
# Reports LBs inaccessible via FIP # Reports LBs inaccessible via FIP
for lb in self.os_connection.load_balancer.load_balancers(): try:
if lb.is_admin_state_up: for lb in self.os_connection.load_balancer.load_balancers():
# catch partly created loadbalancers if lb.is_admin_state_up:
ip_address = None # catch partly created loadbalancers
ports = [] ip_address = None
try: ports = []
vip_port = self.os_connection.network.find_port(lb.vip_port_id) try:
sg = self.os_connection.network.find_security_group(vip_port.security_group_ids[0]) vip_port = self.os_connection.network.find_port(lb.vip_port_id)
sg_rules = sg.security_group_rules sg = self.os_connection.network.find_security_group(vip_port.security_group_ids[0])
fips = list(self.os_connection.network.ips(port_id=lb.vip_port_id)) sg_rules = sg.security_group_rules
ip_address = ipaddress.ip_address(lb.vip_address) fips = list(self.os_connection.network.ips(port_id=lb.vip_port_id))
if fips: ip_address = ipaddress.ip_address(lb.vip_address)
ip_address = ipaddress.ip_address(fips[0].floating_ip_address) if fips:
ip_address = ipaddress.ip_address(fips[0].floating_ip_address)
logging.debug(str(ip_address) + " | Loadbalancer security group: " + str(sg))
logging.debug(str(ip_address) + " | Loadbalancer security group: " + str(sg))
# ip address from private scopes, hidden from script
if ip_address.is_private: # ip address from private scopes, hidden from script
if ip_address.is_private:
self.openstack_loadbalancer_status.labels(
id=lb.id,
status=IPAddressStatus.HIDDEN.value
).set(1.0)
continue
# check opened ports in health monitor range (1025+)
for sg_rule in sg_rules:
ports.append(sg_rule.get('port_range_min') or 0)
# add manually if missing - kypo fix
if not AppMetrics.loadbalancer_accessibility_ports[0] in ports:
ports.append(AppMetrics.loadbalancer_accessibility_ports[0])
logging.info(str(ip_address) + " | Loadbalancer ports: " + str(ports))
except Exception:
self.openstack_loadbalancer_status.labels( self.openstack_loadbalancer_status.labels(
id=lb.id, id=lb.id,
status=IPAddressStatus.HIDDEN.value status=IPAddressStatus.UNREACHABLE.value
).set(1.0) ).set(1.0)
continue continue
# check opened ports in health monitor range (1025+) lb_status = self.get_ip_accessibility_status_ports(
for sg_rule in sg_rules: ip_address,
ports.append(sg_rule.get('port_range_min') or 0) [port for port in ports if port in AppMetrics.loadbalancer_accessibility_ports]
# add manually if missing - kypo fix )
if not AppMetrics.loadbalancer_accessibility_ports[0] in ports: if lb_status == IPAddressStatus.UNREACHABLE.value:
ports.append(AppMetrics.loadbalancer_accessibility_ports[0]) ping_status = self.get_ip_accessibility_status_ping(ip_address)
logging.info(str(ip_address) + " | Loadbalancer, ports unreachable, pinged with status: " + str(ping_status))
logging.info(str(ip_address) + " | Loadbalancer ports: " + str(ports)) if ping_status:
lb_status = ping_status
except Exception: logging.info(str(ip_address) + " | LB id: " + str(lb.id) + ", status: " + str(lb_status))
self.openstack_loadbalancer_status.labels( self.openstack_loadbalancer_status.labels(id=lb.id, status=lb_status).set(1.0)
id=lb.id, except ks_exc.EndpointNotFound:
status=IPAddressStatus.UNREACHABLE.value logging.info("Loadbalancer endpoint not found. Skipping loadbalancer checks...")
).set(1.0)
continue
lb_status = self.get_ip_accessibility_status_ports(
ip_address,
[port for port in ports if port in AppMetrics.loadbalancer_accessibility_ports]
)
if lb_status == IPAddressStatus.UNREACHABLE.value:
ping_status = self.get_ip_accessibility_status_ping(ip_address)
logging.info(str(ip_address) + " | Loadbalancer, ports unreachable, pinged with status: " + str(ping_status))
if ping_status:
lb_status = ping_status
logging.info(str(ip_address) + " | LB id: " + str(lb.id) + ", status: " + str(lb_status))
self.openstack_loadbalancer_status.labels(id=lb.id, status=lb_status).set(1.0)
def parse_arguments(script_summary="script"): def parse_arguments(script_summary="script"):
""" argument parser """ """ argument parser """
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment