diff options
-rw-r--r-- | src/examples/elevate2018.yml | 7 | ||||
-rwxr-xr-x | src/flufigut.py | 77 | ||||
-rw-r--r-- | templates/default/kubernetes/nginx-streamer-cm.yml.j2 | 11 | ||||
-rw-r--r-- | templates/default/kubernetes/nginx-streamer-svc.yml.j2 | 2 | ||||
-rw-r--r-- | templates/default/kubernetes/sfive-cm.yml.j2 (renamed from templates/default/kubernetes/sfive-proxy-cm.yml.j2) | 5 | ||||
-rw-r--r-- | templates/default/kubernetes/sfive-deploy.yml.j2 (renamed from templates/default/kubernetes/sfive-proxy-deploy.yml.j2) | 9 |
6 files changed, 62 insertions, 49 deletions
diff --git a/src/examples/elevate2018.yml b/src/examples/elevate2018.yml index 443df97..4d8b7be 100644 --- a/src/examples/elevate2018.yml +++ b/src/examples/elevate2018.yml @@ -12,10 +12,11 @@ globals: username: equinox password: change-me stats: - sfive-proxy: + sfive: socket: "/srv/hub.sock" duration: 15s tags: [ "elevate", "2018", "discourse" ] + type: proxy resolutions: 1080p25: { width: 1920, height: 1080, rate: 25/1 } 720p25: { width: 1280, height: 720, rate: 25/1 } @@ -57,6 +58,7 @@ globals: flumotion_image_version: 12 nginx_image_version: 4 sfive_image_version: 2 + onion_service_image_version: 3 inputs: sdi-orig: type: decklink @@ -92,7 +94,6 @@ streams: type: http count: 1 port: 8000 - nginx-port: 8000 max-con: 100 burst-on-connect: 5 hostname: elevate-feed.spreadspace.org @@ -102,11 +103,11 @@ streams: type: http count: 4 port: 8000 - nginx-port: 8000 max-bw: 290000000 burst-on-connect: 5 hostname: "emc-%02i.spreadspace.org" repeater: True + onion-service: True records: av: mux: avr diff --git a/src/flufigut.py b/src/flufigut.py index 1be9ffd..366c13e 100755 --- a/src/flufigut.py +++ b/src/flufigut.py @@ -494,7 +494,7 @@ class Planet: self.flow['streamers'][comp_name]['plugs']['rrd']['bytes'] = "%s/%s_bytes.rrd" % ( self._desc.globals['stats']['rrd']['directory'], comp_name) - if 'sfive' in self._desc.globals['stats']: + if 'sfive' in self._desc.globals['stats'] and self._desc.globals['stats']['sfive']['type'] == 'flumotion-plug': self.flow['streamers'][comp_name]['plugs']['sfive'] = {} self.flow['streamers'][comp_name]['plugs']['sfive']['socket'] = self._desc.globals['stats']['sfive']['socket'] self.flow['streamers'][comp_name]['plugs']['sfive']['duration'] = self._desc.globals['stats']['sfive']['duration'] @@ -545,6 +545,8 @@ class Planet: self.__add_worker_flag_exclusive(worker, "stream", stream_name) self.__add_worker_flag_exclusive(worker, "stream-hostname", hostname) self.__add_worker_flag_exclusive(worker, "stream-index", idx) + if 'sfive' in self._desc.globals['stats']: + self.__add_worker_flag_exclusive(worker, "sfive", self._desc.globals['stats']['sfive']['type']) def __generate_stream_instance(self, stream_name, stream, idx, cnt): port = stream['port'] @@ -620,10 +622,44 @@ class Planet: out += "%s:%s\n" % (worker['name'], crypt.crypt(worker['password'], salt)) return out.encode('utf-8') + def sfive_proxy_config(self, worker_name, for_onion=False): + # TODO: hardcoded values + hostname_prefix = "streamer" + addr = "" + port = 8000 + if for_onion: + hostname_prefix = "streamer-onion" + addr = "127.0.0.1" + port = 8001 + + listen = "%s:%i" % (addr, port) + hostname = "%s-%s%d" % (hostname_prefix, self.workers[worker_name]['flags']['stream'], (self.workers[worker_name]['flags']['stream-index'] + 1)) + + conf = {'listen': listen, 'protocol': 'http'} + conf['connect'] = 'http://flumotion-worker-' + self.workers[worker_name]['name'] + ':8000' + conf['request_header'] = [{'op': 'del', 'header': 'X-Forwarded-For'}] + conf['response_header'] = [{'op': 'set', 'header': 'Cache-Control', 'value': 'no-cache'}, + {'op': 'add', 'header': 'Cache-Control', 'value': 'no-store'}, + {'op': 'add', 'header': 'Cache-Control', 'value': 'must-revalidate'}, + {'op': 'add', 'header': 'Cache-Control', 'value': 'max-age=0'}, + {'op': 'time', 'header': 'Expires', 'value': '-1s'}] + conf['backends'] = {} + conf['backends']['/hls/'] = {'connect': 'http://nginx-streamer-' + self.workers[worker_name]['name'] + ':8000'} + conf['backends']['/dash/'] = {'connect': 'http://nginx-streamer-' + self.workers[worker_name]['name'] + ':8000'} + + conf['sfive'] = {'hostname': hostname} + conf['sfive']['socket'] = self._desc.globals['stats']['sfive']['socket'] + conf['sfive']['duration'] = self._desc.globals['stats']['sfive']['duration'] + conf['sfive']['tags'] = self._desc.globals['stats']['sfive']['tags'] + conf['sfive']['matches'] = [{'format': '/${content}-${format}-${quality}', 'streams': 'av-orig/flash,webm/high,medium,low,mini'}, + {'format': '/${format}/${content}-${quality}', 'streams': 'av-orig/dash,hls/high,medium,low,mini'}] + + return conf # kubernetes handling ############################# # + class K8sDeployment: def __init__(self, desc, planet, namespace=None): @@ -703,38 +739,21 @@ class K8sDeployment: appsV1.create_namespaced_deployment(self._namespace, deploy) def _deploy_sfive_worker(self, template_dir, tmpl_env, v1, appsV1, worker): - needs_sfive = False - if 'sfive-proxy' in self._desc.globals['stats'] and 'stream' in worker['flags']: - needs_sfive = True - - if not needs_sfive: + if 'sfive' not in worker['flags']: return - # TODO: hardcoded values - proxy_conf = {'listen': ':8000', 'protocol': 'http'} - proxy_conf['connect'] = 'http://flumotion-worker-' + worker['name'] + ':8000' - proxy_conf['request_header'] = [{'op': 'del', 'header': 'X-Forwarded-For'}] - proxy_conf['response_header'] = [{'op': 'set', 'header': 'Cache-Control', 'value': 'no-cache'}, - {'op': 'add', 'header': 'Cache-Control', 'value': 'no-store'}, - {'op': 'add', 'header': 'Cache-Control', 'value': 'must-revalidate'}, - {'op': 'add', 'header': 'Cache-Control', 'value': 'max-age=0'}, - {'op': 'time', 'header': 'Expires', 'value': '-1s'}] - proxy_conf['backends'] = {} - proxy_conf['backends']['/hls/'] = {'connect': 'http://nginx-streamer-' + worker['name'] + ':8000'} - proxy_conf['backends']['/dash/'] = {'connect': 'http://nginx-streamer-' + worker['name'] + ':8000'} - - proxy_conf['sfive'] = {'hostname': "streamer-%s%d" % (worker['flags']['stream'], (worker['flags']['stream-index'] + 1))} - proxy_conf['sfive']['socket'] = self._desc.globals['stats']['sfive-proxy']['socket'] - proxy_conf['sfive']['duration'] = self._desc.globals['stats']['sfive-proxy']['duration'] - proxy_conf['sfive']['tags'] = self._desc.globals['stats']['sfive-proxy']['tags'] - proxy_conf['sfive']['matches'] = [{'format': '/${content}-${format}-${quality}', 'streams': 'av-orig/flash,webm/high,medium,low,mini'}, - {'format': '/${format}/${content}-${quality}', 'streams': 'av-orig/dash,hls/high,medium,low,mini'}] - - cm = self.__generate_object(tmpl_env, 'sfive-proxy-cm.yml', worker) - cm['data']['proxy.json'] = json.dumps(proxy_conf) + cm = self.__generate_object(tmpl_env, 'sfive-cm.yml', worker) + if 'data' not in cm or not cm['data']: + cm['data'] = {} + if worker['flags']['sfive'] == 'proxy' and 'stream' in worker['flags']: + cm['data']['proxy.json'] = json.dumps(self._planet.sfive_proxy_config(worker['name'])) + stream_name = worker['flags']['stream'] + if 'onion-service' in self._desc.streams[stream_name] and len(self._desc.streams[stream_name]['nginx-muxes']) > 0: + cm['data']['proxy-onion.json'] = json.dumps(self._planet.sfive_proxy_config(worker['name'], True)) + v1.create_namespaced_config_map(self._namespace, cm) - deploy = self.__generate_object(tmpl_env, 'sfive-proxy-deploy.yml', worker) + deploy = self.__generate_object(tmpl_env, 'sfive-deploy.yml', worker) appsV1.create_namespaced_deployment(self._namespace, deploy) def deploy(self, template_dir): diff --git a/templates/default/kubernetes/nginx-streamer-cm.yml.j2 b/templates/default/kubernetes/nginx-streamer-cm.yml.j2 index b7a9901..563245c 100644 --- a/templates/default/kubernetes/nginx-streamer-cm.yml.j2 +++ b/templates/default/kubernetes/nginx-streamer-cm.yml.j2 @@ -1,6 +1,3 @@ -%% set flumotion_port = desc.streams[worker.flags.stream].port -%% set nginx_port = desc.streams[worker.flags.stream]['nginx-port'] -%% set hostname = worker.flags['stream-hostname'] apiVersion: v1 kind: ConfigMap metadata: @@ -38,8 +35,8 @@ data: access_log /dev/null; server { - listen {{ nginx_port }} default_server; - listen [::]:{{ nginx_port }} default_server; + listen {{ desc.streams[worker.flags.stream].port }} default_server; + listen [::]:{{ desc.streams[worker.flags.stream].port }} default_server; server_name _; root /srv/www; @@ -72,7 +69,7 @@ data: hls_fragment_naming timestamp; hls_fragment_slicing aligned; hls_type live; - hls_base_url http://{{ hostname }}:{{ nginx_port }}/hls/; + hls_base_url http://{{ worker.flags['stream-hostname'] }}:{{ desc.streams[worker.flags.stream].port }}/hls/; %% for mux in desc.streams[worker.flags.stream]['nginx-muxes'] %% for profile in desc.muxes[mux].formats.flash @@ -97,7 +94,7 @@ data: respawn on; %% for mux in desc.streams[worker.flags.stream]['nginx-muxes'] %% for profile in desc.muxes[mux].formats.flash - exec_static ffmpeg -i http://flumotion-worker-{{ worker.name }}:{{ flumotion_port }}/{{ mux }}-flash-{{ profile }}.flv + exec_static ffmpeg -i http://flumotion-worker-{{ worker.name }}:{{ desc.streams[worker.flags.stream].port }}/{{ mux }}-flash-{{ profile }}.flv -acodec copy -vcodec copy -vbsf h264_mp4toannexb -f flv rtmp://localhost/hls/{{ mux }}-{{ profile }} -acodec copy -vcodec copy -vbsf h264_mp4toannexb -f flv rtmp://localhost/dash/{{ mux }}-{{ profile }}; %% endfor diff --git a/templates/default/kubernetes/nginx-streamer-svc.yml.j2 b/templates/default/kubernetes/nginx-streamer-svc.yml.j2 index b6bcfe5..9be5ed7 100644 --- a/templates/default/kubernetes/nginx-streamer-svc.yml.j2 +++ b/templates/default/kubernetes/nginx-streamer-svc.yml.j2 @@ -13,4 +13,4 @@ spec: type: streamer worker: {{ worker.name }} ports: - - port: {{ desc.streams[worker.flags.stream]['nginx-port'] }} + - port: {{ desc.streams[worker.flags.stream].port }} diff --git a/templates/default/kubernetes/sfive-proxy-cm.yml.j2 b/templates/default/kubernetes/sfive-cm.yml.j2 index e109e85..dea9222 100644 --- a/templates/default/kubernetes/sfive-proxy-cm.yml.j2 +++ b/templates/default/kubernetes/sfive-cm.yml.j2 @@ -2,11 +2,8 @@ apiVersion: v1 kind: ConfigMap metadata: namespace: {{ namespace }} - name: sfive-proxy-{{ worker.name }} + name: sfive-{{ worker.name }} labels: app: sfive - type: proxy worker: {{ worker.name }} data: - proxy.json: | - {} diff --git a/templates/default/kubernetes/sfive-proxy-deploy.yml.j2 b/templates/default/kubernetes/sfive-deploy.yml.j2 index 62ed9fe..06c84dc 100644 --- a/templates/default/kubernetes/sfive-proxy-deploy.yml.j2 +++ b/templates/default/kubernetes/sfive-deploy.yml.j2 @@ -2,17 +2,15 @@ apiVersion: apps/v1 kind: Deployment metadata: namespace: {{ namespace }} - name: sfive-proxy-{{ worker.name }} + name: sfive-{{ worker.name }} labels: app: sfive - type: proxy worker: {{ worker.name }} spec: replicas: 1 selector: matchLabels: app: sfive - type: proxy worker: {{ worker.name }} strategy: type: Recreate @@ -21,7 +19,6 @@ spec: metadata: labels: app: sfive - type: proxy worker: {{ worker.name }} spec: nodeName: {{ worker.name }} @@ -31,6 +28,7 @@ spec: hostNetwork: true dnsPolicy: ClusterFirstWithHostNet containers: +{% if worker.flags.sfive == 'proxy' %} - name: proxy image: spreadspace/sfive:{{ desc.globals.deployment.parameter.sfive_image_version }} imagePullPolicy: Always @@ -43,6 +41,7 @@ spec: mountPath: /srv - name: proxy-config mountPath: /srv/config +{% endif %} - name: hub image: spreadspace/sfive:{{ desc.globals.deployment.parameter.sfive_image_version }} imagePullPolicy: Always @@ -66,7 +65,7 @@ spec: medium: Memory - name: proxy-config configMap: - name: sfive-proxy-{{ worker.name }} + name: sfive-{{ worker.name }} - name: hub-data hostPath: type: DirectoryOrCreate |