/** * Adds a deployment node to this view, including relationships to/from that deployment node (and children). * * @param deploymentNode the DeploymentNode to add */ public void add(@Nonnull DeploymentNode deploymentNode) { add(deploymentNode, true); }
@Test public void test_addAllDeploymentNodes_DoesNothing_WhenThereAreNoTopLevelDeploymentNodes() { deploymentView = views.createDeploymentView("deployment", "Description"); deploymentView.addAllDeploymentNodes(); assertEquals(0, deploymentView.getElements().size()); }
/** * Creates a deployment view. * * @param key the key for the deployment view (must be unique) * @param description a description of the view * @return a DeploymentView object * @throws IllegalArgumentException if the key is not unique */ public DeploymentView createDeploymentView(String key, String description) { assertThatTheViewKeyIsSpecifiedAndUnique(key); DeploymentView view = new DeploymentView(model, key, description); view.setViewSet(this); deploymentViews.add(view); return view; }
/** * Gets the (computed) name of this view. * * @return the name, as a String */ @Override public String getName() { String name; if (getSoftwareSystem() != null) { name = getSoftwareSystem().getName() + " - Deployment"; } else { name = "Deployment"; } if (!StringUtils.isNullOrEmpty(getEnvironment())) { name = name + " - " + getEnvironment(); } return name; }
private boolean addContainerInstancesAndDeploymentNodes(DeploymentNode deploymentNode, boolean addRelationships) { boolean hasContainers = false; for (ContainerInstance containerInstance : deploymentNode.getContainerInstances()) { Container container = containerInstance.getContainer(); if (getSoftwareSystem() == null || container.getParent().equals(getSoftwareSystem())) { addElement(containerInstance, addRelationships); hasContainers = true; } } for (DeploymentNode child : deploymentNode.getChildren()) { hasContainers = hasContainers | addContainerInstancesAndDeploymentNodes(child, addRelationships); } if (hasContainers) { addElement(deploymentNode, addRelationships); } return hasContainers; }
views.setDynamicViews(Collections.singleton(dynamicView)); DeploymentView deploymentView = new DeploymentView(); deploymentView.setSoftwareSystemId(softwareSystem.getId()); deploymentView.setElements(elementViewsFor(deploymentNode, containerInstance)); views.setDeploymentViews(Collections.singleton(deploymentView)); assertSame(component, dynamicView.getElementView(component).getElement()); assertSame(model, deploymentView.getModel()); assertSame(views, deploymentView.getViewSet()); assertSame(softwareSystem, deploymentView.getSoftwareSystem()); assertSame(deploymentNode, deploymentView.getElementView(deploymentNode).getElement()); assertSame(containerInstance, deploymentView.getElementView(containerInstance).getElement());
@Test public void test_copyLayoutInformationFrom_WhenTheDeploymentViewKeysMatch() { Workspace workspace1 = createWorkspace(); DeploymentNode deploymentNode1 = workspace1.getModel().getDeploymentNodeWithName("Deployment Node"); DeploymentView view1 = workspace1.getViews().createDeploymentView("key", "Description"); view1.add(deploymentNode1); view1.getElements().stream().filter(ev -> ev.getElement() instanceof ContainerInstance).findFirst().get().setX(100); view1.getElements().stream().filter(ev -> ev.getElement() instanceof ContainerInstance).findFirst().get().setY(200); view1.setPaperSize(PaperSize.A3_Landscape); Workspace workspace2 = createWorkspace(); DeploymentNode deploymentNode2 = workspace2.getModel().getDeploymentNodeWithName("Deployment Node"); DeploymentView view2 = workspace2.getViews().createDeploymentView("key", "Description"); view2.add(deploymentNode2); workspace2.getViews().copyLayoutInformationFrom(workspace1.getViews()); assertEquals(100, view2.getElements().stream().filter(ev -> ev.getElement() instanceof ContainerInstance).findFirst().get().getX()); assertEquals(200, view2.getElements().stream().filter(ev -> ev.getElement() instanceof ContainerInstance).findFirst().get().getY()); assertEquals(PaperSize.A3_Landscape, view2.getPaperSize()); }
developmentDeploymentView.setEnvironment("Development"); developmentDeploymentView.add(developerLaptop); developmentDeploymentView.setPaperSize(PaperSize.A5_Landscape); liveDeploymentView.setEnvironment("Live"); liveDeploymentView.add(bigBankDataCenter); liveDeploymentView.add(customerMobileDevice); liveDeploymentView.add(customerComputer); liveDeploymentView.add(dataReplicationRelationship); liveDeploymentView.setPaperSize(PaperSize.A5_Landscape);
@Test public void test_createDeploymentView() { Workspace workspace = new Workspace("Name", "Description"); DeploymentView deploymentView = workspace.getViews().createDeploymentView("key", "Description"); assertEquals("key", deploymentView.getKey()); assertEquals("Description", deploymentView.getDescription()); assertNull(deploymentView.getSoftwareSystem()); }
@Test public void test_copyLayoutInformationFrom_DoesNotDoAnythingIfThereIsNoDeploymentViewToCopyInformationFrom() { Workspace workspace1 = createWorkspace(); Workspace workspace2 = createWorkspace(); DeploymentNode deploymentNode2 = workspace2.getModel().getDeploymentNodeWithName("Deployment Node"); DeploymentView view2 = workspace2.getViews().createDeploymentView("key", "Description"); view2.add(deploymentNode2); workspace2.getViews().copyLayoutInformationFrom(workspace1.getViews()); assertEquals(0, view2.getElements().stream().filter(ev -> ev.getElement() instanceof ContainerInstance).findFirst().get().getX()); // default assertEquals(0, view2.getElements().stream().filter(ev -> ev.getElement() instanceof ContainerInstance).findFirst().get().getY()); // default assertNull(view2.getPaperSize()); // default }
@Test public void test_getName_WithNoSoftwareSystemAndAnEnvironment() { deploymentView = views.createDeploymentView("deployment", "Description"); deploymentView.setEnvironment("Live"); assertEquals("Deployment - Live", deploymentView.getName()); }
@Test public void test_addDeploymentNode_AddsTheParentToo() { SoftwareSystem softwareSystem = model.addSoftwareSystem("Software System", ""); Container container = softwareSystem.addContainer("Container", "Description", "Technology"); DeploymentNode deploymentNodeParent = model.addDeploymentNode("Deployment Node", "Description", "Technology"); DeploymentNode deploymentNodeChild = deploymentNodeParent.addDeploymentNode("Deployment Node", "Description", "Technology"); ContainerInstance containerInstance = deploymentNodeChild.add(container); deploymentView = views.createDeploymentView(softwareSystem, "deployment", "Description"); deploymentView.add(deploymentNodeChild); assertEquals(3, deploymentView.getElements().size()); assertTrue(deploymentView.getElements().contains(new ElementView(deploymentNodeParent))); assertTrue(deploymentView.getElements().contains(new ElementView(deploymentNodeChild))); assertTrue(deploymentView.getElements().contains(new ElementView(containerInstance))); }
public static void main(String[] args) throws Exception { Workspace workspace = new Workspace("HTTP-based health checks example", "An example of how to use the HTTP-based health checks feature"); Model model = workspace.getModel(); ViewSet views = workspace.getViews(); SoftwareSystem structurizr = model.addSoftwareSystem("Structurizr", "A publishing platform for software architecture diagrams and documentation based upon the C4 model."); Container webApplication = structurizr.addContainer("structurizr.com", "Provides all of the server-side functionality of Structurizr, serving static and dynamic content to users.", "Java and Spring MVC"); Container database = structurizr.addContainer("Database", "Stores information about users, workspaces, etc.", "Relational Database Schema"); database.addTags(DATABASE_TAG); webApplication.uses(database, "Reads from and writes to", "JDBC"); DeploymentNode amazonWebServices = model.addDeploymentNode("Amazon Web Services", "", "us-east-1"); DeploymentNode pivotalWebServices = amazonWebServices.addDeploymentNode("Pivotal Web Services", "Platform as a Service provider.", "Cloud Foundry"); ContainerInstance liveWebApplication = pivotalWebServices.addDeploymentNode("www.structurizr.com", "An open source Java EE web server.", "Apache Tomcat") .add(webApplication); ContainerInstance liveDatabaseInstance = amazonWebServices.addDeploymentNode("Amazon RDS", "Database as a Service provider.", "MySQL") .add(database); // add health checks to the container instances, which return a simple HTTP 200 to say everything is okay liveWebApplication.addHealthCheck("Web Application is running", "https://www.structurizr.com/health"); liveDatabaseInstance.addHealthCheck("Database is accessible from Web Application", "https://www.structurizr.com/health/database"); // the pass/fail status from the health checks is used to supplement any deployment views that include the container instances that have health checks defined DeploymentView deploymentView = views.createDeploymentView(structurizr, "Deployment", "A deployment diagram showing the live environment."); deploymentView.setEnvironment("Live"); deploymentView.addAllDeploymentNodes(); views.getConfiguration().getStyles().addElementStyle(Tags.ELEMENT).color("#ffffff"); views.getConfiguration().getStyles().addElementStyle(DATABASE_TAG).shape(Shape.Cylinder); StructurizrClient structurizrClient = new StructurizrClient(API_KEY, API_SECRET); structurizrClient.putWorkspace(WORKSPACE_ID, workspace); }
DeploymentView sourceView = findView(source.getDeploymentViews(), view); if (sourceView != null) { view.copyLayoutInformationFrom(sourceView); } else { log.warn("Could not find a matching view for \"" + view.getName() + "\" ... diagram layout information may be lost.");
deploymentView.addAllDeploymentNodes();
@Test public void test_getName_WithNoSoftwareSystemAndNoEnvironment() { deploymentView = views.createDeploymentView("deployment", "Description"); assertEquals("Deployment", deploymentView.getName()); }
/** * Adds all of the top-level deployment nodes to this view. */ public void addAllDeploymentNodes() { getModel().getDeploymentNodes().forEach(this::add); }
protected void write(DeploymentView view, Writer writer) { try { writeHeader(view, writer); view.getElements().stream() .filter(ev -> ev.getElement() instanceof DeploymentNode && ev.getElement().getParent() == null) .map(ev -> (DeploymentNode)ev.getElement()) .sorted((e1, e2) -> e1.getName().compareTo(e2.getName())) .forEach(e -> write(view, e, writer, 0)); writeRelationships(view, writer); writeFooter(writer); } catch (IOException e) { e.printStackTrace(); } }
@Test public void test_createDeploymentViewForSoftwareSystem() { Workspace workspace = new Workspace("Name", "Description"); SoftwareSystem softwareSystem = workspace.getModel().addSoftwareSystem("Name", "Description"); DeploymentView deploymentView = workspace.getViews().createDeploymentView(softwareSystem, "key", "Description"); assertEquals("key", deploymentView.getKey()); assertEquals("Description", deploymentView.getDescription()); assertSame(softwareSystem, deploymentView.getSoftwareSystem()); }