2121
2222from pydantic import Field
2323
24- from structurizr .model .deployment_node import DeploymentNode
25-
2624from ..abstract_base import AbstractBase
2725from ..base_model import BaseModel
2826from .container import Container
2927from .container_instance import ContainerInstance
28+ from .deployment_node import DeploymentNode , DeploymentNodeIO
3029from .element import Element
3130from .enterprise import Enterprise , EnterpriseIO
3231from .implied_relationship_strategies import (
@@ -69,12 +68,11 @@ class ModelIO(BaseModel):
6968 alias = "softwareSystems" ,
7069 description = "The set of software systems belonging to this model." ,
7170 )
72- # TODO:
73- # deployment_nodes: List[DeploymentNodeIO] = Field(
74- # default=(),
75- # alias="deploymentNodes",
76- # description="The set of deployment nodes belonging to this model.",
77- # )
71+ deployment_nodes : List [DeploymentNodeIO ] = Field (
72+ default = (),
73+ alias = "deploymentNodes" ,
74+ description = "The set of top-level deployment nodes belonging to this model." ,
75+ )
7876
7977
8078class Model (AbstractBase ):
@@ -156,9 +154,10 @@ def hydrate(cls, model_io: ModelIO) -> "Model":
156154 for software_system_io in model_io .software_systems :
157155 model += SoftwareSystem .hydrate (software_system_io , model = model )
158156
159- # for deployment_node_io in model_io.deployment_nodes:
160- # deployment_node = DeploymentNode.hydrate(deployment_node_io)
161- # model.add_deployment_node(deployment_node=deployment_node)
157+ for deployment_node_io in model_io .deployment_nodes :
158+ DeploymentNode .hydrate (
159+ deployment_node_io , model = model
160+ ) # Auto-registers with the model
162161
163162 for element in model .get_elements ():
164163 for relationship in element .relationships :
@@ -215,6 +214,8 @@ def add_software_system(self, **kwargs) -> SoftwareSystem:
215214
216215 def __iadd__ (self , element : Element ) -> "Model" :
217216 """Add a newly constructed element to the model."""
217+ if element in self .get_elements ():
218+ return self
218219 if isinstance (element , Person ):
219220 if any (element .name == p .name for p in self .people ):
220221 raise ValueError (
@@ -229,12 +230,12 @@ def __iadd__(self, element: Element) -> "Model":
229230 )
230231 elif isinstance (element , DeploymentNode ):
231232 if any (
232- element .name == d .name and isinstance ( d , DeploymentNode )
233- for d in self .get_elements ()
233+ element .name == d .name and element . environment == d . environment
234+ for d in self .deployment_nodes
234235 ):
235236 raise ValueError (
236237 f"A deployment node with the name '{ element .name } ' already "
237- f"exists in the model."
238+ f"exists in environment ' { element . environment } ' of the model."
238239 )
239240 elif element .parent is None :
240241 raise ValueError (
0 commit comments