Skip to content

Commit e7a512c

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 278f7ed commit e7a512c

File tree

1 file changed

+38
-10
lines changed

1 file changed

+38
-10
lines changed

seedemu/compiler/Docker.py

Lines changed: 38 additions & 10 deletions
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') )
838857

839-
def _compileNode(self, node: Node) -> str:
858+
return dependency_container
859+
860+
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,12 +1002,18 @@ def _compileNode(self, node: Node) -> str:
9801002
print(dockerfile, file=open('Dockerfile', 'w'))
9811003

9821004
chdir('..')
1005+
deps = self.startUpDependencies(node,registry)
1006+
1007+
# this is required to support ARM and docker-compose v2
1008+
(image, _) = self._selectImageFor(node)
1009+
deps.append((md5(image.getName().encode('utf-8')).hexdigest(), 'service_started'))
9831010

9841011

9851012
return DockerCompilerFileTemplates['compose_service'].format(
9861013
nodeId = real_nodename,
987-
nodeName = name,
988-
dependsOn = md5(image.getName().encode('utf-8')).hexdigest(),
1014+
nodeName = name,
1015+
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]),
1016+
deps ) ),
9891017
networks = node_nets,
9901018
# privileged = 'true' if node.isPrivileged() else 'false',
9911019
ports = ports,
@@ -1065,23 +1093,23 @@ def _doCompile(self, emulator: Emulator):
10651093
for ((scope, type, name), obj) in registry.getAll().items():
10661094
if type == 'rnode':
10671095
self._log('compiling router node {} for as{}...'.format(name, scope))
1068-
self.__services += self._compileNode(obj)
1096+
self.__services += self._compileNode(obj,registry)
10691097

10701098
if type == 'csnode':
10711099
self._log('compiling control service node {} for as{}...'.format(name, scope))
1072-
self.__services += self._compileNode(obj)
1100+
self.__services += self._compileNode(obj,registry)
10731101

10741102
if type == 'hnode':
10751103
self._log('compiling host node {} for as{}...'.format(name, scope))
1076-
self.__services += self._compileNode(obj)
1104+
self.__services += self._compileNode(obj,registry)
10771105

10781106
if type == 'rs':
10791107
self._log('compiling rs node for {}...'.format(name))
1080-
self.__services += self._compileNode(obj)
1108+
self.__services += self._compileNode(obj,registry)
10811109

10821110
if type == 'snode':
10831111
self._log('compiling service node {}...'.format(name))
1084-
self.__services += self._compileNode(obj)
1112+
self.__services += self._compileNode(obj,registry)
10851113

10861114
if self.__internet_map_enabled:
10871115
self._log('enabling seedemu-internet-map...')

0 commit comments

Comments
 (0)