Loading monitor.py +45 −15 Original line number Diff line number Diff line Loading @@ -32,14 +32,10 @@ class StreamConfig: Manage an Nginx stream configuration """ def __init__(self, name, protocol, external_port, internal_port): def __init__(self, name, **values): self.name = name self.path = None self.vals = dict( protocol=protocol, external_port=external_port, internal_port=internal_port, ) self.vals = values def enable(self, engine, nginx_base=NGINX_BASE): """ Loading Loading @@ -113,6 +109,33 @@ def parse_cmdline(argv=None): return opts def parse_annotation(annotation): parser = argparse.ArgumentParser() parser.add_argument('--proxy-all', action='store_true', default=False, ) parser.add_argument('--proxy', action='append', default=[], ) parser.add_argument('names', nargs='+', ) def split(string): if ':' in string: proto, port = string.split(':') return proto.upper(), int(port) return string.lower() opts = parser.parse_args(annotation.split()) opts.names = set(opts.names) opts.proxy = set(split(port) for port in opts.proxy) return opts def main(argv=None): opts = parse_cmdline(argv) Loading Loading @@ -235,28 +258,35 @@ def node_ports(service: dict, host_addrs: Set[IPAddress]): ports = spec['ports'] # TODO: Awaiting #20 # cluster_ip = ipaddress.ip_address(spec['clusterIP']) ext_ip = metadata['annotations']['kodo.org.uk/port-proxy'] proxy_args = metadata['annotations']['kodo.org.uk/port-proxy'] except KeyError as exc: logger.debug("rejecting service: missing %s", exc) return logger.debug("kodo.org.uk/port-proxy: %s", ext_ip) exts = set(addr_from_names(n.strip() for n in ext_ip.split(','))) exts.intersection_update(host_addrs) if not exts: logger.debug("kodo.org.uk/port-proxy: %s", proxy_args) opts = parse_annotation(proxy_args) addresses = set(addr_from_names(opts.names)) addresses.intersection_update(host_addrs) if not addresses: logger.debug("rejecting service: no available addresses") return for ext_ip in exts: for addr in addresses: for port in ports: logger.debug("generating for %s and %s", ext_ip, port['name']) logger.debug("generating for %s and %s", addr, port['name']) yield uid, StreamConfig( name=f"{name}.{port['name']}", protocol=port['protocol'], external_port=(ext_ip, port['port']), external_port=(addr, port['port']), # TODO: Awaiting #20 # internal_port=(cluster_ip, port['port']), internal_port=(ext_ip, port['nodePort']), internal_port=(addr, port['nodePort']), use_proxy_protocol = ( opts.proxy_all or port['name'] in opts.proxy or (port['protocol'], port['port']) in opts.proxy ), ) Loading templates/stream.conf +1 −1 Original line number Diff line number Diff line server { listen {{ external_port|join(':') }} {{ 'udp' if protocol == 'UDP' else '' }}; proxy_pass {{ internal_port|join(':') }}; proxy_protocol on; proxy_protocol {{ 'on' if use_proxy_protocol else 'off' }}; } Loading
monitor.py +45 −15 Original line number Diff line number Diff line Loading @@ -32,14 +32,10 @@ class StreamConfig: Manage an Nginx stream configuration """ def __init__(self, name, protocol, external_port, internal_port): def __init__(self, name, **values): self.name = name self.path = None self.vals = dict( protocol=protocol, external_port=external_port, internal_port=internal_port, ) self.vals = values def enable(self, engine, nginx_base=NGINX_BASE): """ Loading Loading @@ -113,6 +109,33 @@ def parse_cmdline(argv=None): return opts def parse_annotation(annotation): parser = argparse.ArgumentParser() parser.add_argument('--proxy-all', action='store_true', default=False, ) parser.add_argument('--proxy', action='append', default=[], ) parser.add_argument('names', nargs='+', ) def split(string): if ':' in string: proto, port = string.split(':') return proto.upper(), int(port) return string.lower() opts = parser.parse_args(annotation.split()) opts.names = set(opts.names) opts.proxy = set(split(port) for port in opts.proxy) return opts def main(argv=None): opts = parse_cmdline(argv) Loading Loading @@ -235,28 +258,35 @@ def node_ports(service: dict, host_addrs: Set[IPAddress]): ports = spec['ports'] # TODO: Awaiting #20 # cluster_ip = ipaddress.ip_address(spec['clusterIP']) ext_ip = metadata['annotations']['kodo.org.uk/port-proxy'] proxy_args = metadata['annotations']['kodo.org.uk/port-proxy'] except KeyError as exc: logger.debug("rejecting service: missing %s", exc) return logger.debug("kodo.org.uk/port-proxy: %s", ext_ip) exts = set(addr_from_names(n.strip() for n in ext_ip.split(','))) exts.intersection_update(host_addrs) if not exts: logger.debug("kodo.org.uk/port-proxy: %s", proxy_args) opts = parse_annotation(proxy_args) addresses = set(addr_from_names(opts.names)) addresses.intersection_update(host_addrs) if not addresses: logger.debug("rejecting service: no available addresses") return for ext_ip in exts: for addr in addresses: for port in ports: logger.debug("generating for %s and %s", ext_ip, port['name']) logger.debug("generating for %s and %s", addr, port['name']) yield uid, StreamConfig( name=f"{name}.{port['name']}", protocol=port['protocol'], external_port=(ext_ip, port['port']), external_port=(addr, port['port']), # TODO: Awaiting #20 # internal_port=(cluster_ip, port['port']), internal_port=(ext_ip, port['nodePort']), internal_port=(addr, port['nodePort']), use_proxy_protocol = ( opts.proxy_all or port['name'] in opts.proxy or (port['protocol'], port['port']) in opts.proxy ), ) Loading
templates/stream.conf +1 −1 Original line number Diff line number Diff line server { listen {{ external_port|join(':') }} {{ 'udp' if protocol == 'UDP' else '' }}; proxy_pass {{ internal_port|join(':') }}; proxy_protocol on; proxy_protocol {{ 'on' if use_proxy_protocol else 'off' }}; }