Skip to content

Commit 17504f1

Browse files
committed
impose start up constraints between endhosts and their dependencies
start the endhost containers only after the routers and csservices are up
1 parent 2d3a943 commit 17504f1

File tree

1 file changed

+34
-9
lines changed

1 file changed

+34
-9
lines changed

seedemu/compiler/Docker.py

+34-9
Original file line numberDiff line numberDiff line change
@@ -119,12 +119,16 @@
119119
- {dependsOn}
120120
"""
121121

122+
DockerCompilerFileTemplates['dependency'] = """\
123+
{dep_name}:
124+
condition: {dep_condi}
125+
"""
126+
122127
DockerCompilerFileTemplates['compose_service'] = """\
123128
{nodeId}:
124129
build: ./{nodeId}
125130
container_name: {nodeName}
126-
depends_on:
127-
- {dependsOn}
131+
{dependencies}
128132
cap_add:
129133
- ALL
130134
sysctls:
@@ -835,8 +839,26 @@ def realNetName(self,net):
835839
net_prefix = self._contextToPrefix(netscope, 'net')
836840
if net.getType() == NetworkType.Bridge: net_prefix = ''
837841
return '{}{}'.format(net_prefix, net.getName())
842+
843+
def startUpDependencies(self, node, registry):
844+
"""
845+
@brief returns a list of container names , that need to start before 'node'
846+
i.e. a scion host(node) depends on border-routers and control-services in its AS
847+
"""
848+
849+
dependency_container: List[Tuple[str,str]] = [] # (container-name,condition)
850+
(scope,type,name) = node.getRegistryInfo()
851+
if type == 'hnode':
852+
for router in registry.getByType(scope,'rnode'):
853+
dependency_container.append( (self.realNodeName(router),'service_started') )
854+
855+
for service in registry.getByType(scope,'csnode'):
856+
dependency_container.append( (self.realNodeName(service),'service_started') )
857+
858+
return dependency_container
859+
838860

839-
def _compileNode(self, node: Node) -> str:
861+
def _compileNode(self, node: Node, registry ) -> str: # add registry here as param, in order for a node to find its dependencies
840862
"""!
841863
@brief Compile a single node. Will create folder for node and the
842864
dockerfile.
@@ -980,6 +1002,7 @@ def _compileNode(self, node: Node) -> str:
9801002
print(dockerfile, file=open('Dockerfile', 'w'))
9811003

9821004
chdir('..')
1005+
deps = self.startUpDependencies(node,registry)
9831006

9841007
name = self.__naming_scheme.format(
9851008
asn = node.getAsn(),
@@ -994,7 +1017,9 @@ def _compileNode(self, node: Node) -> str:
9941017
return DockerCompilerFileTemplates['compose_service'].format(
9951018
nodeId = real_nodename,
9961019
nodeName = name,
997-
dependsOn = md5(image.getName().encode('utf-8')).hexdigest(),
1020+
# dependsOnImage = md5(image.getName().encode('utf-8')).hexdigest(), # how can i keept this ? maybe move to 'image:' ..
1021+
dependencies = ( " depends_on:\n" if len(deps) >0 else '' )+ '\n'.join( map( lambda x: DockerCompilerFileTemplates['dependency'].format(dep_name=x[0], dep_condi=x[1]),
1022+
deps ) ),
9981023
networks = node_nets,
9991024
# privileged = 'true' if node.isPrivileged() else 'false',
10001025
ports = ports,
@@ -1074,23 +1099,23 @@ def _doCompile(self, emulator: Emulator):
10741099
for ((scope, type, name), obj) in registry.getAll().items():
10751100
if type == 'rnode':
10761101
self._log('compiling router node {} for as{}...'.format(name, scope))
1077-
self.__services += self._compileNode(obj)
1102+
self.__services += self._compileNode(obj,registry)
10781103

10791104
if type == 'csnode':
10801105
self._log('compiling control service node {} for as{}...'.format(name, scope))
1081-
self.__services += self._compileNode(obj)
1106+
self.__services += self._compileNode(obj,registry)
10821107

10831108
if type == 'hnode':
10841109
self._log('compiling host node {} for as{}...'.format(name, scope))
1085-
self.__services += self._compileNode(obj)
1110+
self.__services += self._compileNode(obj,registry)
10861111

10871112
if type == 'rs':
10881113
self._log('compiling rs node for {}...'.format(name))
1089-
self.__services += self._compileNode(obj)
1114+
self.__services += self._compileNode(obj,registry)
10901115

10911116
if type == 'snode':
10921117
self._log('compiling service node {}...'.format(name))
1093-
self.__services += self._compileNode(obj)
1118+
self.__services += self._compileNode(obj,registry)
10941119

10951120
if self.__internet_map_enabled:
10961121
self._log('enabling seedemu-internet-map...')

0 commit comments

Comments
 (0)