Commit fbe85604 authored by Dom Sekotill's avatar Dom Sekotill
Browse files

Make PROXY protocol selectable in the port-proxy

parent 013b72d3
Loading
Loading
Loading
Loading
+45 −15
Original line number Diff line number Diff line
@@ -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):
		"""
@@ -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)

@@ -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
				),
			)


+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' }};
}