summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorChristian Pointner <equinox@spreadspace.org>2018-01-31 00:35:51 +0100
committerChristian Pointner <equinox@spreadspace.org>2018-01-31 00:35:51 +0100
commit6fd68e5127fcd8fbadb1119be6e30c7248269a1a (patch)
tree345f4fcfb08ee671241636b58e9304d68fabfc14 /src
parentadded worker templates (not done yet) (diff)
worker assignment works now
Diffstat (limited to 'src')
-rw-r--r--src/examples/elevate2018.json6
-rwxr-xr-xsrc/flufigut.py84
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 **")