diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/examples/elevate2018.json | 6 | ||||
-rwxr-xr-x | src/flufigut.py | 84 |
2 files changed, 65 insertions, 25 deletions
diff --git a/src/examples/elevate2018.json b/src/examples/elevate2018.json index b0a5ea7..a8e8116 100644 --- a/src/examples/elevate2018.json +++ b/src/examples/elevate2018.json @@ -42,10 +42,10 @@ "workers": { "dione": [ "input-*", "resize-*", "resample-*", "encode-sdi-orig-vorbis-*", "encode-sdi-orig-aac-*", "encode-sdi-orig-mp3-*", "encode-sdi-orig-h264-*", "encode-sdi-orig-mjpeg-*", "encode-sdi-orig-raw-*" ], - "calypso": [ "encode-sdi-orig-vp8-*", "encode-sdi-orig-h264-360p25", "mux-*", "stream-local1-*", "recorder-av", "recorder-audio" ], + "helene": [ "encode-sdi-orig-vp8-*", "encode-sdi-orig-h264-360p25", "mux-*", "port-local1*", "http-local1*", "record-*" ], "emc-00": [ "repeater-public*" ], - "emc-01": [ "streamer-public1*" ], - "emc-02": [ "streamer-public2*" ] + "emc-01": [ "port-public1*", "http-public1*" ], + "emc-02": [ "port-public2*", "http-public2*" ] } }, "inputs": { diff --git a/src/flufigut.py b/src/flufigut.py index 1acdf44..99631de 100755 --- a/src/flufigut.py +++ b/src/flufigut.py @@ -44,6 +44,14 @@ def rand_string(size=8, chars=string.ascii_lowercase + string.ascii_uppercase + # a flufigut stream description ############################### # +class WorkerPattern: + + def __init__(self, pattern, is_prefix, worker_name): + self.pattern = pattern + self.is_prefix = is_prefix + self.worker_name = worker_name + + class Description: def __init__(self): @@ -59,21 +67,19 @@ class Description: for worker_name, worker in self.globals['workers'].items(): for pattern in worker: is_prefix = False - orig_pattern = pattern + search_string = pattern if '*' in pattern: if '*' in pattern[:-1]: raise Exception("invalid worker pattern '%s' (component globs may only have a single '*' at the end)" % pattern) is_prefix = True - pattern = pattern[:-1] + search_string = pattern[:-1] if not pattern: - raise Exception("worker '%s' has wildcard pattern '%s' which is not allowed" % (worker_name, orig_pattern)) - if pattern in self.worker_patterns: - raise Exception("the worker pattern '%s' is used by at least two workers (%s and %s)" % - (orig_pattern, self.worker_patterns[pattern]['worker'], worker_name)) - self.worker_patterns[pattern] = { - 'worker': worker_name, - 'is_prefix': is_prefix - } + raise Exception("worker '%s' has wildcard pattern '%s' which is not allowed" % (worker_name, pattern)) + if search_string in self.worker_patterns: + raise Exception("worker pattern '%s' is used by at least two workers (%s and %s)" % + (pattern, self.worker_patterns[search_string].worker_name, worker_name)) + + self.worker_patterns[search_string] = WorkerPattern(pattern, is_prefix, worker_name) def parse(self, config_file): cf = open(config_file, 'r') @@ -107,10 +113,35 @@ class Porter: class Planet: def __init__(self, desc): - self._desc = desc self.atmosphere = {} self.flow = {} + self._desc = desc + self._unassigned_components = [] + + def __get_worker(self, comp_name): + matched_prefix_len = 0 + match = None + for search_string, pattern in self._desc.worker_patterns.items(): + if pattern.is_prefix: + if comp_name.startswith(search_string): + if len(search_string) == matched_prefix_len: + raise Exception("component '%s': both patterns '%s' of worker '%s' and '%s' of worker '%s' match the component name and have the same length" % + (comp_name, match.pattern, match.worker_name, pattern.pattern, pattern.worker_name)) + elif len(search_string) > matched_prefix_len: + match_prefix_len = len(search_string) + match = pattern + else: + if comp_name == search_string: + match = pattern + break + + if not match: + self._unassigned_components.append(comp_name) + return None + + return match.worker_name + # # inputs def __set_input_properties(self, comp_name, props): @@ -131,7 +162,7 @@ class Planet: self.flow['inputs'][comp_name] = { 'type': input['type'], 'desc': comp_desc, - 'worker': None, + 'worker': self.__get_worker(comp_name), 'master': input['master'], 'properties': {}, } @@ -155,7 +186,7 @@ class Planet: self.flow['inputs'][comp_name] = { 'type': 'audio-resample', 'desc': comp_desc, - 'worker': None, + 'worker': self.__get_worker(comp_name), 'feeder': input, 'properties': { 'samplerate': target_samplerate, @@ -185,7 +216,7 @@ class Planet: self.flow['encoders-audio'][comp_name] = { 'type': '%s-encode' % encoder, 'desc': comp_desc, - 'worker': None, + 'worker': self.__get_worker(comp_name), 'feeder': feeder, 'properties': { 'bitrate': bitrate, @@ -206,7 +237,7 @@ class Planet: self.flow['inputs'][comp_name] = { 'type': 'video-resize', 'desc': comp_desc, - 'worker': None, + 'worker': self.__get_worker(comp_name), 'feeder': input, 'properties': { 'width': self._desc.globals['resolutions'][target_resolution]['width'], @@ -239,7 +270,7 @@ class Planet: self.flow['encoders-video'][comp_name] = { 'type': '%s-encode' % encoder, 'desc': comp_desc, - 'worker': None, + 'worker': self.__get_worker(comp_name), 'feeder': feeder, 'properties': { 'bitrate': bitrate, @@ -255,7 +286,7 @@ class Planet: self.flow['muxers'][comp_name] = { 'type': '%s-mux' % muxer, 'desc': comp_desc, - 'worker': None, + 'worker': self.__get_worker(comp_name), 'feeder_audio': feeder_audio, 'feeder_video': feeder_video, 'properties': {}, @@ -291,7 +322,7 @@ class Planet: self.atmosphere[porter.name] = { 'type': "porter", 'desc': "Porter for %s%i on %s" % (stream, idx + 1, addr), - 'worker': None, + 'worker': self.__get_worker(comp_name), 'properties': { 'port': port, 'socket-path': porter.socket_path, @@ -313,7 +344,7 @@ class Planet: self.flow['repeaters'][comp_name] = { 'type': 'repeater', 'desc': "repeater for %s (%s %s-%s)" % (stream, mux, format, profile), - 'worker': None, + 'worker': self.__get_worker(comp_name), 'feeder': feeder, } return comp_name @@ -371,7 +402,7 @@ class Planet: self.flow['streamers'][comp_name] = { 'type': "%s-stream" % stream['type'], 'desc': "%s streamer for %s %s-%s (part %i of %i in %s cluster)" % (stream['type'], mux, format, profile, idx + 1, cnt, stream_name), - 'worker': None, + 'worker': self.__get_worker(comp_name), 'feeder': feeder, 'properties': { 'description': self._desc.globals['description'], @@ -425,7 +456,7 @@ class Planet: self.flow['recorders'][comp_name] = { 'type': "recorder", 'desc': comp_desc, - 'worker': None, + 'worker': self.__get_worker(comp_name), 'feeder': feeder, 'properties': {} } @@ -441,6 +472,14 @@ class Planet: self._generate_streams() self._generate_records() + if len(p._unassigned_components) > 0: + print("unassinged components: ") + for c in p._unassigned_components: + print(" " + c) + return 1 + + return 0 + # Main ######################################################## # @@ -461,7 +500,8 @@ if __name__ == '__main__': d.parse(config_file) p = Planet(d) - p.generate() + if p.generate() != 0: + sys.exit(1) print("****************************************************") print("** atmosphere **") |