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
from ping3 import ping
import openstack
from icmplib import traceroute
import keystoneauth1.exceptions.catalog as ks_exc
import timeout
......@@ -346,55 +347,58 @@ class AppMetrics:
# remove all statuses (clears delete loadbalancers)
self.openstack_loadbalancer_status.clear()
# Reports LBs inaccessible via FIP
for lb in self.os_connection.load_balancer.load_balancers():
if lb.is_admin_state_up:
# catch partly created loadbalancers
ip_address = None
ports = []
try:
vip_port = self.os_connection.network.find_port(lb.vip_port_id)
sg = self.os_connection.network.find_security_group(vip_port.security_group_ids[0])
sg_rules = sg.security_group_rules
fips = list(self.os_connection.network.ips(port_id=lb.vip_port_id))
ip_address = ipaddress.ip_address(lb.vip_address)
if fips:
ip_address = ipaddress.ip_address(fips[0].floating_ip_address)
logging.debug(str(ip_address) + " | Loadbalancer security group: " + str(sg))
# ip address from private scopes, hidden from script
if ip_address.is_private:
try:
for lb in self.os_connection.load_balancer.load_balancers():
if lb.is_admin_state_up:
# catch partly created loadbalancers
ip_address = None
ports = []
try:
vip_port = self.os_connection.network.find_port(lb.vip_port_id)
sg = self.os_connection.network.find_security_group(vip_port.security_group_ids[0])
sg_rules = sg.security_group_rules
fips = list(self.os_connection.network.ips(port_id=lb.vip_port_id))
ip_address = ipaddress.ip_address(lb.vip_address)
if fips:
ip_address = ipaddress.ip_address(fips[0].floating_ip_address)
logging.debug(str(ip_address) + " | Loadbalancer security group: " + str(sg))
# 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(
id=lb.id,
status=IPAddressStatus.HIDDEN.value
status=IPAddressStatus.UNREACHABLE.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(
id=lb.id,
status=IPAddressStatus.UNREACHABLE.value
).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)
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)
except ks_exc.EndpointNotFound:
logging.info("Loadbalancer endpoint not found. Skipping loadbalancer checks...")
def parse_arguments(script_summary="script"):
""" argument parser """
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment