diff --git a/neutron/Chart.yaml b/neutron/Chart.yaml index faf64739b1..d7025df741 100644 --- a/neutron/Chart.yaml +++ b/neutron/Chart.yaml @@ -14,7 +14,7 @@ apiVersion: v1 appVersion: v1.0.0 description: OpenStack-Helm Neutron name: neutron -version: 0.2.18 +version: 0.2.19 home: https://docs.openstack.org/neutron/latest/ icon: https://www.openstack.org/themes/openstack/images/project-mascots/Neutron/OpenStack_Project_Neutron_vertical.png sources: diff --git a/neutron/templates/bin/_neutron-netns-cleanup-cron.py.tpl b/neutron/templates/bin/_neutron-netns-cleanup-cron.py.tpl index a56e87d7c0..273041ac0a 100644 --- a/neutron/templates/bin/_neutron-netns-cleanup-cron.py.tpl +++ b/neutron/templates/bin/_neutron-netns-cleanup-cron.py.tpl @@ -1,18 +1,135 @@ #!/usr/bin/env python import sys +import os import time - +import socket +from neutron.common import config from oslo_config import cfg +from neutron.agent.linux import dhcp +from neutron.agent.l3 import namespaces +from neutron.agent.l3 import dvr_snat_ns +from neutron.agent.l3 import dvr_fip_ns +from neutron.cmd.netns_cleanup import setup_conf +from neutron.cmd.netns_cleanup import destroy_namespace +from neutron.cmd.netns_cleanup import eligible_for_deletion +from neutron.conf.agent import common as agent_config +from neutron.agent.linux import ip_lib +from keystoneauth1.identity import v3 +from keystoneauth1 import session +from neutronclient.neutron import client as neutron_client +NS_PREFIXES = {'l3': [namespaces.NS_PREFIX, dvr_snat_ns.SNAT_NS_PREFIX, + dvr_fip_ns.FIP_NS_PREFIX]} +DHCP_NS_PREFIX = dhcp.NS_PREFIX -from neutron.cmd.netns_cleanup import main +def get_neutron_creds(): + opts = {'auth_url': os.getenv('OS_AUTH_URL', 'https://keystone-api.openstack.svc.cluster.local:5000/v3'), + 'password': os.getenv('OS_PASSWORD','nopassword'), + 'project_domain_name': os.getenv('OS_PROJECT_DOMAIN_NAME', 'default'), + 'project_name': os.getenv('OS_PROJECT_NAME', 'admin'), + 'user_domain_name': os.getenv('OS_USER_DOMAIN_NAME', 'default'), + 'username': os.getenv('OS_USERNAME', 'admin'), + 'cafile' : os.getenv('OS_CACERT','/var/lib/neutron/openstack-helm/openstack-helm.crt'), + 'insecure' : os.getenv('NEUTRON_CLEANUP_INSECURE', 'true'), + 'debug': os.getenv('NEUTRON_CLEANUP_DEBUG', 'false'), + 'wait': os.getenv('NEUTRON_CLEANUP_TIMEOUT', '1800')} + return opts + +def net_list(neutron_get): + hosts = dict() + net_list = neutron_get.list_networks() + if net_list['networks']: + for item in net_list['networks']: + net_id=item['id'] + dhcp_agents = neutron_get.list_dhcp_agent_hosting_networks(net_id)['agents'] + agents = list() + if dhcp_agents: + for agent in dhcp_agents: + agents.append(agent['host'].split('.')[0]) + hosts[net_id] = agents + return hosts + +def sort_ns(all_ns, dhcp_prefix): + dhcp_ns = list() + not_dhcp_ns = list() + for ns in all_ns: + if ns[:len(dhcp_prefix)] == dhcp_prefix: + dhcp_ns.append(ns) + else: + not_dhcp_ns.append(ns) + return dhcp_ns, not_dhcp_ns + +def del_bad_dhcp(dhcp_ns, dhcp_hosts, conf, dhcp_prefix, debug): + for ns in dhcp_ns: + cut_ns_name = ns[len(dhcp_prefix):] + if cut_ns_name in dhcp_hosts: + if hostname not in dhcp_hosts[cut_ns_name]: + destroy_namespace(conf, ns, conf.force) + if debug: + sys.stdout.write("DEBUG: {} host {} deleted {} because host wrong\n" + .format(sys.argv[0], hostname, ns)) + else: + if debug: + sys.stdout.write("DEBUG: {} host {} {} looks ok\n" + .format(sys.argv[0], hostname, ns)) + else: + destroy_namespace(conf, ns, conf.force) + if debug: + sys.stdout.write("DEBUG: {} host {} deleted {} because no related network found\n" + .format(sys.argv[0], hostname, ns)) + +def del_bad_not_dhcp(not_dhcp_ns, conf, debug): + for ns in not_dhcp_ns: + if eligible_for_deletion(conf, ns, conf.force): + destroy_namespace(conf, ns, conf.force) + if debug: + sys.stdout.write("DEBUG: {} host {} deleted {} because no IP addr\n" + .format(sys.argv[0], hostname, ns)) if __name__ == "__main__": + + conf = setup_conf() + cfg.CONF(sys.argv[1:]) + opts = get_neutron_creds() + debug = False + verify= False + if opts.pop('debug') in ('true', '1', 'True'): + debug = True + insecure = opts.pop('insecure') + cafile = opts.pop('cafile') + if insecure in ('false', '0', 'False'): + verify = cafile + timeout = int(opts.pop('wait')) + conf() + config.setup_logging() + agent_config.setup_privsep() + auth = v3.Password(**opts) + hostname = socket.gethostname().split('.')[0] + while True: try: - main() - # Sleep for 12 hours - time.sleep(43200) + all_ns = ip_lib.list_network_namespaces() + sess = session.Session(auth=auth, verify=verify) + neutron_get = neutron_client.Client('2.0', session=sess) + dhcp_hosts = net_list(neutron_get) + if all_ns: + dhcp_ns, not_dhcp_ns = sort_ns(all_ns, DHCP_NS_PREFIX) + if dhcp_ns: + del_bad_dhcp(dhcp_ns, dhcp_hosts, conf, DHCP_NS_PREFIX, debug) + else: + if debug: + sys.stdout.write("DEBUG: {} host {} no dhcp ns found\n" + .format(sys.argv[0], hostname)) + if not_dhcp_ns: + del_bad_not_dhcp(not_dhcp_ns, conf, debug) + else: + if debug: + sys.stdout.write("DEBUG: {} host {} no not_dhcp ns found\n" + .format(sys.argv[0], hostname)) + else: + if debug: + sys.stdout.write("DEBUG: {} host {} no ns found at all\n" + .format(sys.argv[0], hostname)) except Exception as ex: sys.stderr.write( "Cleaning network namespaces caught an exception %s" @@ -24,3 +141,4 @@ if __name__ == "__main__": time.sleep(30) finally: cfg.CONF.clear() + time.sleep(timeout) diff --git a/neutron/templates/daemonset-netns-cleanup-cron.yaml b/neutron/templates/daemonset-netns-cleanup-cron.yaml index 78acf03914..022e8f33f2 100644 --- a/neutron/templates/daemonset-netns-cleanup-cron.yaml +++ b/neutron/templates/daemonset-netns-cleanup-cron.yaml @@ -76,6 +76,10 @@ spec: - /etc/neutron/dhcp_agent.ini - --config-file - /etc/neutron/l3_agent.ini + env: +{{- with $env := dict "ksUserSecret" $envAll.Values.secrets.identity.admin "useCA" false }} +{{- include "helm-toolkit.snippets.keystone_openrc_env_vars" $env | indent 12 }} +{{- end }} volumeMounts: - name: pod-tmp mountPath: /tmp diff --git a/releasenotes/notes/neutron.yaml b/releasenotes/notes/neutron.yaml index ea3f865045..86cef8b072 100644 --- a/releasenotes/notes/neutron.yaml +++ b/releasenotes/notes/neutron.yaml @@ -32,4 +32,5 @@ neutron: - 0.2.16 Remove usage of six - 0.2.17 Migrated PodDisruptionBudget resource to policy/v1 API version - 0.2.18 Updated naming for subchart compatibility + - 0.2.19 Added qdhcp NS host validation for deleting wrong namespaces. ...