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' ) )
857
+
858
+ return dependency_container
859
+
838
860
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
840
862
"""!
841
863
@brief Compile a single node. Will create folder for node and the
842
864
dockerfile.
@@ -980,6 +1002,7 @@ 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 )
983
1006
984
1007
name = self .__naming_scheme .format (
985
1008
asn = node .getAsn (),
@@ -994,7 +1017,9 @@ def _compileNode(self, node: Node) -> str:
994
1017
return DockerCompilerFileTemplates ['compose_service' ].format (
995
1018
nodeId = real_nodename ,
996
1019
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 ) ),
998
1023
networks = node_nets ,
999
1024
# privileged = 'true' if node.isPrivileged() else 'false',
1000
1025
ports = ports ,
@@ -1074,23 +1099,23 @@ def _doCompile(self, emulator: Emulator):
1074
1099
for ((scope , type , name ), obj ) in registry .getAll ().items ():
1075
1100
if type == 'rnode' :
1076
1101
self ._log ('compiling router node {} for as{}...' .format (name , scope ))
1077
- self .__services += self ._compileNode (obj )
1102
+ self .__services += self ._compileNode (obj , registry )
1078
1103
1079
1104
if type == 'csnode' :
1080
1105
self ._log ('compiling control service node {} for as{}...' .format (name , scope ))
1081
- self .__services += self ._compileNode (obj )
1106
+ self .__services += self ._compileNode (obj , registry )
1082
1107
1083
1108
if type == 'hnode' :
1084
1109
self ._log ('compiling host node {} for as{}...' .format (name , scope ))
1085
- self .__services += self ._compileNode (obj )
1110
+ self .__services += self ._compileNode (obj , registry )
1086
1111
1087
1112
if type == 'rs' :
1088
1113
self ._log ('compiling rs node for {}...' .format (name ))
1089
- self .__services += self ._compileNode (obj )
1114
+ self .__services += self ._compileNode (obj , registry )
1090
1115
1091
1116
if type == 'snode' :
1092
1117
self ._log ('compiling service node {}...' .format (name ))
1093
- self .__services += self ._compileNode (obj )
1118
+ self .__services += self ._compileNode (obj , registry )
1094
1119
1095
1120
if self .__internet_map_enabled :
1096
1121
self ._log ('enabling seedemu-internet-map...' )
0 commit comments