|
119 | 119 | - {dependsOn}
|
120 | 120 | """
|
121 | 121 |
|
| 122 | +DockerCompilerFileTemplates['dependency'] = """\ |
| 123 | + {dep_name}: |
| 124 | + condition: {dep_condi} |
| 125 | +""" |
| 126 | + |
122 | 127 | DockerCompilerFileTemplates['compose_service'] = """\
|
123 | 128 | {nodeId}:
|
124 | 129 | build: ./{nodeId}
|
125 | 130 | container_name: {nodeName}
|
126 |
| - depends_on: |
127 |
| - - {dependsOn} |
| 131 | +{dependencies} |
128 | 132 | cap_add:
|
129 | 133 | - ALL
|
130 | 134 | sysctls:
|
@@ -835,8 +839,26 @@ def realNetName(self,net):
|
835 | 839 | net_prefix = self._contextToPrefix(netscope, 'net')
|
836 | 840 | if net.getType() == NetworkType.Bridge: net_prefix = ''
|
837 | 841 | 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') ) |
838 | 857 |
|
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 |
840 | 862 | """!
|
841 | 863 | @brief Compile a single node. Will create folder for node and the
|
842 | 864 | dockerfile.
|
@@ -980,12 +1002,18 @@ def _compileNode(self, node: Node) -> str:
|
980 | 1002 | print(dockerfile, file=open('Dockerfile', 'w'))
|
981 | 1003 |
|
982 | 1004 | 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')) |
983 | 1010 |
|
984 | 1011 |
|
985 | 1012 | return DockerCompilerFileTemplates['compose_service'].format(
|
986 | 1013 | 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 ) ), |
989 | 1017 | networks = node_nets,
|
990 | 1018 | # privileged = 'true' if node.isPrivileged() else 'false',
|
991 | 1019 | ports = ports,
|
@@ -1065,23 +1093,23 @@ def _doCompile(self, emulator: Emulator):
|
1065 | 1093 | for ((scope, type, name), obj) in registry.getAll().items():
|
1066 | 1094 | if type == 'rnode':
|
1067 | 1095 | self._log('compiling router node {} for as{}...'.format(name, scope))
|
1068 |
| - self.__services += self._compileNode(obj) |
| 1096 | + self.__services += self._compileNode(obj,registry) |
1069 | 1097 |
|
1070 | 1098 | if type == 'csnode':
|
1071 | 1099 | self._log('compiling control service node {} for as{}...'.format(name, scope))
|
1072 |
| - self.__services += self._compileNode(obj) |
| 1100 | + self.__services += self._compileNode(obj,registry) |
1073 | 1101 |
|
1074 | 1102 | if type == 'hnode':
|
1075 | 1103 | self._log('compiling host node {} for as{}...'.format(name, scope))
|
1076 |
| - self.__services += self._compileNode(obj) |
| 1104 | + self.__services += self._compileNode(obj,registry) |
1077 | 1105 |
|
1078 | 1106 | if type == 'rs':
|
1079 | 1107 | self._log('compiling rs node for {}...'.format(name))
|
1080 |
| - self.__services += self._compileNode(obj) |
| 1108 | + self.__services += self._compileNode(obj,registry) |
1081 | 1109 |
|
1082 | 1110 | if type == 'snode':
|
1083 | 1111 | self._log('compiling service node {}...'.format(name))
|
1084 |
| - self.__services += self._compileNode(obj) |
| 1112 | + self.__services += self._compileNode(obj,registry) |
1085 | 1113 |
|
1086 | 1114 | if self.__internet_map_enabled:
|
1087 | 1115 | self._log('enabling seedemu-internet-map...')
|
|
0 commit comments