Search in sources :

Example 11 with DeploymentView

use of com.structurizr.view.DeploymentView in project dsl by structurizr.

the class DeploymentViewContentParserTests method test_parseInclude_AddsAllDeploymentNodesAndChildrenInTheDeploymentEnvironment_WhenTheWildcardIsSpecifiedAndTheViewHasNoSoftwareSystemScope.

@Test
void test_parseInclude_AddsAllDeploymentNodesAndChildrenInTheDeploymentEnvironment_WhenTheWildcardIsSpecifiedAndTheViewHasNoSoftwareSystemScope() {
    SoftwareSystem ss1 = model.addSoftwareSystem("SS1", "Description");
    Container c1 = ss1.addContainer("C1", "Description", "Technology");
    SoftwareSystem ss2 = model.addSoftwareSystem("SS2", "Description");
    Container c2 = ss2.addContainer("C2", "Description", "Technology");
    DeploymentNode dev1 = model.addDeploymentNode("Dev", "Dev 1", "Description", "Technology");
    DeploymentNode dev2 = dev1.addDeploymentNode("Dev 2", "Description", "Technology");
    InfrastructureNode dev3 = dev2.addInfrastructureNode("Dev 3", "Description", "Technology");
    ContainerInstance dev4 = dev2.add(c1);
    ContainerInstance dev5 = dev2.add(c2);
    DeploymentNode live1 = model.addDeploymentNode("Live", "Live 1", "Description", "Technology");
    DeploymentNode live2 = live1.addDeploymentNode("Live 2", "Description", "Technology");
    InfrastructureNode live3 = live2.addInfrastructureNode("Live 3", "Description", "Technology");
    ContainerInstance live4 = live2.add(c1);
    ContainerInstance live5 = live2.add(c2);
    DeploymentView view = views.createDeploymentView("key", "Description");
    view.setEnvironment("Live");
    DeploymentViewDslContext context = new DeploymentViewDslContext(view);
    context.setWorkspace(workspace);
    parser.parseInclude(context, tokens("include", "*"));
    assertEquals(5, view.getElements().size());
    assertTrue(view.getElements().stream().anyMatch(ev -> ev.getElement().equals(live1)));
    assertTrue(view.getElements().stream().anyMatch(ev -> ev.getElement().equals(live2)));
    assertTrue(view.getElements().stream().anyMatch(ev -> ev.getElement().equals(live3)));
    assertTrue(view.getElements().stream().anyMatch(ev -> ev.getElement().equals(live4)));
    assertTrue(view.getElements().stream().anyMatch(ev -> ev.getElement().equals(live5)));
}
Also used : com.structurizr.model(com.structurizr.model) Test(org.junit.jupiter.api.Test) Assertions(org.junit.jupiter.api.Assertions) RelationshipView(com.structurizr.view.RelationshipView) DeploymentView(com.structurizr.view.DeploymentView) DeploymentView(com.structurizr.view.DeploymentView) Test(org.junit.jupiter.api.Test)

Example 12 with DeploymentView

use of com.structurizr.view.DeploymentView in project dsl by structurizr.

the class DeploymentViewContentParserTests method test_parseExclude_RemovesTheRelationshipFromAView_WhenAnExpressionIsSpecifiedWithSourceAndDestination.

@Test
void test_parseExclude_RemovesTheRelationshipFromAView_WhenAnExpressionIsSpecifiedWithSourceAndDestination() {
    SoftwareSystem ss1 = model.addSoftwareSystem("SS1", "Description");
    SoftwareSystem ss2 = model.addSoftwareSystem("SS2", "Description");
    Relationship rel = ss1.uses(ss2, "Uses");
    DeploymentNode dn = model.addDeploymentNode("Live", "Live", "Description", "Technology");
    dn.add(ss1);
    dn.add(ss2);
    DeploymentView view = views.createDeploymentView("key", "Description");
    view.setEnvironment("Live");
    view.add(dn);
    DeploymentViewDslContext context = new DeploymentViewDslContext(view);
    context.setWorkspace(workspace);
    IdentifiersRegister elements = new IdentifiersRegister();
    elements.register("ss1", ss1);
    elements.register("ss2", ss2);
    context.setIdentifierRegister(elements);
    parser.parseExclude(context, tokens("exclude", "relationship.source==ss1 && relationship.destination==ss2"));
    assertEquals(0, view.getRelationships().size());
}
Also used : DeploymentView(com.structurizr.view.DeploymentView) Test(org.junit.jupiter.api.Test)

Example 13 with DeploymentView

use of com.structurizr.view.DeploymentView in project dsl by structurizr.

the class AbstractExpressionParserTests method test_parseExpression_ReturnsRelationships_WhenUsingARelationshipTagExpressionAndTheTagIsSetOnTheLinkedRelationship.

@Test
void test_parseExpression_ReturnsRelationships_WhenUsingARelationshipTagExpressionAndTheTagIsSetOnTheLinkedRelationship() {
    SoftwareSystem a = model.addSoftwareSystem("A");
    SoftwareSystem b = model.addSoftwareSystem("B");
    Relationship r = a.uses(b, "Uses");
    r.addTags("Tag 1");
    DeploymentNode dn = model.addDeploymentNode("DN");
    SoftwareSystemInstance ai = dn.add(a);
    SoftwareSystemInstance bi = dn.add(b);
    DeploymentView view = views.createDeploymentView("key", "Description");
    DeploymentViewDslContext context = new DeploymentViewDslContext(view);
    context.setWorkspace(workspace);
    context.setIdentifierRegister(new IdentifiersRegister());
    Set<ModelItem> relationships = parser.parseExpression("relationship.tag==Tag 1", context);
    assertEquals(2, relationships.size());
    assertTrue(relationships.contains(r));
    assertTrue(relationships.contains(ai.getRelationships().iterator().next()));
}
Also used : DeploymentView(com.structurizr.view.DeploymentView) Test(org.junit.jupiter.api.Test)

Example 14 with DeploymentView

use of com.structurizr.view.DeploymentView in project dsl by structurizr.

the class ViewParserTests method test_parseDescription_SetsTheTitleOfADeploymentView.

@Test
void test_parseDescription_SetsTheTitleOfADeploymentView() {
    DeploymentView view = workspace.getViews().createDeploymentView("key", "description");
    DeploymentViewDslContext context = new DeploymentViewDslContext(view);
    context.setWorkspace(workspace);
    assertEquals("description", view.getDescription());
    parser.parseDescription(context, tokens("description", "A new description"));
    assertEquals("A new description", view.getDescription());
}
Also used : DeploymentView(com.structurizr.view.DeploymentView) Test(org.junit.jupiter.api.Test)

Example 15 with DeploymentView

use of com.structurizr.view.DeploymentView in project cia by Hack23.

the class AppPublicSystemDocumentation method main.

/**
 * The main method.
 *
 * @param args
 *            the arguments
 * @throws Exception
 *             the exception
 */
public static void main(final String[] args) throws Exception {
    final Workspace workspace = new Workspace("Citizen Intelligence Agency", "Public System Documentation");
    final Model model = workspace.getModel();
    final ViewSet viewSet = workspace.getViews();
    final Person userPerson = model.addPerson("User", "User of the system");
    final Person adminPerson = model.addPerson("Admin", "Manager of the system");
    final SoftwareSystem ciaSystem = model.addSoftwareSystem("Citizen Intelligence Agency System", "Tracking politicians like bugs!");
    final SoftwareSystem riksdagenApiSystem = model.addSoftwareSystem(Location.External, "data.riksdagen.se", "Public API Swedish Parliament data");
    final SoftwareSystem worldBankApiSystem = model.addSoftwareSystem(Location.External, "data.worldbank.org", "Public API Country indicators");
    final SoftwareSystem valApiSystem = model.addSoftwareSystem(Location.External, "www.val.se", "Public API Swedish Election data");
    final SoftwareSystem esvApiSystem = model.addSoftwareSystem(Location.External, "www.esv.se", "Public Data Swedish public sector spending data");
    final Container loadBalancerContainer = ciaSystem.addContainer("Loadbalancer", "Loadbalancer", "ALB/ELB/Apache/Nginx/HaProxy");
    final Container ciaWebContainer = ciaSystem.addContainer("Web Application", "Web Application", "Jetty/Java");
    // final SpringComponentFinderStrategy springComponentFinderStrategy = new SpringComponentFinderStrategy(new FirstImplementationOfInterfaceSupportingTypesStrategy()
    // ,new ReferencedTypesSupportingTypesStrategy(),new ReferencedTypesInSamePackageSupportingTypesStrategy());
    // springComponentFinderStrategy.setIncludePublicTypesOnly(false);
    // final ComponentFinder componentFinderWeb = new ComponentFinder(ciaWebContainer, "com.hack23.cia",
    // springComponentFinderStrategy);
    // componentFinderWeb.exclude(".*ui.application.web.*");
    // componentFinderWeb.exclude(".*ui.application.views.common.pagelinks.*");
    // componentFinderWeb.exclude(".*ui.application.views.admin.*");
    // componentFinderWeb.exclude(".*ui.application.views.user.*");
    // 
    // componentFinderWeb.exclude(".*service.external.*");
    // componentFinderWeb.exclude(".*service.component.*");
    // componentFinderWeb.exclude(".*package.*");
    // componentFinderWeb.exclude(".*service.impl.action.*");
    // componentFinderWeb.exclude(".*service.impl.email.*");
    // componentFinderWeb.exclude(".*service.impl.rules.*");
    // componentFinderWeb.exclude(".*service.impl.task.*");
    // componentFinderWeb.exclude(".*service.data.impl.*");
    // componentFinderWeb.findComponents();
    final Container relationalDatabase = ciaSystem.addContainer("Database", "Stores information", "Postgresql");
    relationalDatabase.addTags("Database");
    adminPerson.uses(ciaSystem, "Manages");
    userPerson.uses(ciaSystem, "Uses");
    ciaSystem.uses(riksdagenApiSystem, "Loads data");
    ciaSystem.uses(worldBankApiSystem, "Loads data");
    ciaSystem.uses(valApiSystem, "Loads data");
    ciaSystem.uses(esvApiSystem, "Loads data");
    loadBalancerContainer.uses(ciaWebContainer, "HTTPS/H2");
    ciaWebContainer.uses(relationalDatabase, "JDBC");
    final SystemLandscapeView enterpriseContextView = viewSet.createSystemLandscapeView("\"Enterprise\"", "\"Enterprise\"");
    enterpriseContextView.addAllElements();
    final Enterprise enterprise = new Enterprise("Hack23");
    enterpriseContextView.getModel().setEnterprise(enterprise);
    viewSet.createSystemContextView(ciaSystem, "\"System context\"", "\"System context\"").addAllElements();
    viewSet.createContainerView(ciaSystem, "\"Container view\"", "\"Application Overview\"").addAllContainers();
    viewSet.createComponentView(ciaWebContainer, "\"Web\"", "\"Web\"").addAllComponents();
    final DeploymentNode awsAccountNode = model.addDeploymentNode("AppOrg Account", "AWS", "Aws Account");
    final DeploymentNode awsVpcNode = awsAccountNode.addDeploymentNode("Project Network", "AWS", "VPC");
    final DeploymentNode wafNode = awsAccountNode.addDeploymentNode("Web Application Firewall", "AWS", "WAF");
    final Container ciaWafContainer = ciaSystem.addContainer("WebACL Rules", "AWS", "WAF");
    wafNode.add(ciaWafContainer);
    ciaWafContainer.uses(loadBalancerContainer, "Protects/Filter");
    final DeploymentNode awsAuditAccountNode = model.addDeploymentNode("Audit Account", "AWS", "Aws Account");
    final DeploymentNode awsConfigNode = awsAuditAccountNode.addDeploymentNode("Config", "AWS", "Config");
    final Container awsConfigContainer = ciaSystem.addContainer("Rules", "AWS", "Config Rules");
    awsConfigNode.add(awsConfigContainer);
    final DeploymentNode awsInspectorNode = awsAccountNode.addDeploymentNode("System Compliance checks", "AWS", "Inspector");
    final Container awsInspectorContainer = ciaSystem.addContainer("ScanningRules", "AWS", "Scanning Rules");
    awsInspectorNode.add(awsInspectorContainer);
    awsInspectorContainer.uses(ciaWebContainer, "Inspects");
    final DeploymentNode awsSSMNode = awsAccountNode.addDeploymentNode("Patch Compliance", "AWS", "System Mananger");
    final Container awsSSMContainer = ciaSystem.addContainer("InventoryList", "AWS", "InventoryList");
    awsSSMNode.add(awsSSMContainer);
    awsSSMContainer.uses(ciaWebContainer, "Run Commands");
    final DeploymentNode awsQuickSightNode = awsAccountNode.addDeploymentNode("Business analytics", "AWS", "QuickSight");
    final Container awsQuickSightContainer = ciaSystem.addContainer("Dashboards", "AWS", "Dashboards");
    awsQuickSightNode.add(awsQuickSightContainer);
    awsQuickSightContainer.uses(relationalDatabase, "Loads Data");
    final DeploymentNode awsGuardDutyNode = awsAuditAccountNode.addDeploymentNode("Guard Duty", "AWS", "GuardDuty");
    final Container awsGuardDutyContainer = ciaSystem.addContainer("Intelligent threat detection and continuous monitoring", "AWS", "Intelligent threat detection and continuous monitoring");
    awsGuardDutyNode.add(awsGuardDutyContainer);
    final DeploymentNode awsMacieNode = awsAuditAccountNode.addDeploymentNode("A machine learning-powered security", "AWS", "macie");
    final Container awsMacieContainer = ciaSystem.addContainer("discover, classify, and protect sensitive data", "AWS", "discover, classify, and protect sensitive data");
    awsMacieNode.add(awsMacieContainer);
    final DeploymentNode awsLogGroupNode = awsAuditAccountNode.addDeploymentNode("LogGroup", "AWS", "Cloudwatch");
    final Container awsLogstreamContainer = ciaSystem.addContainer("Logstreams", "AWS", "LogStream");
    awsLogGroupNode.add(awsLogstreamContainer);
    ciaWebContainer.uses(awsLogstreamContainer, "Write logs");
    relationalDatabase.uses(awsLogstreamContainer, "Write logs");
    final DeploymentNode awsCloudtrailNode = awsAuditAccountNode.addDeploymentNode("Audit", "AWS", "Cloudtrail");
    final Container awsAuditLogBucketContainer = ciaSystem.addContainer("LogBucket", "AWS", "S3");
    awsCloudtrailNode.add(awsAuditLogBucketContainer);
    final DeploymentNode awsAcessLogsNode = awsAuditAccountNode.addDeploymentNode("Access Logs", "AWS", "S3");
    final Container awsAccessLogBucketContainer = ciaSystem.addContainer("AccessLogBucket", "AWS", "S3");
    awsAcessLogsNode.add(awsAccessLogBucketContainer);
    loadBalancerContainer.uses(awsAccessLogBucketContainer, "Write logs");
    final DeploymentNode applicationLoadbalancerNode = awsAccountNode.addDeploymentNode("Application Loadbalancer", "AWS", "ALB");
    applicationLoadbalancerNode.add(loadBalancerContainer);
    wafNode.uses(applicationLoadbalancerNode, "Protects", "filter rules");
    final DeploymentNode webNode = awsVpcNode.addDeploymentNode("Application", "AWS", "EC2", 2);
    webNode.addDeploymentNode("Jetty", "Jetty", "JVM").add(ciaWebContainer);
    applicationLoadbalancerNode.uses(webNode, "Uses", "https");
    final DeploymentNode databaseNode = awsVpcNode.addDeploymentNode("Database", "AWS", "RDS", 2);
    databaseNode.add(relationalDatabase);
    webNode.uses(databaseNode, "Uses", "jdbc");
    final DeploymentNode githubAccountNode = model.addDeploymentNode("Github Org", "Github", "Github Org");
    final Container sourceCodeContainer = ciaSystem.addContainer("SCM", "Github", "Scm");
    githubAccountNode.add(sourceCodeContainer);
    final Container documentationContainer = ciaSystem.addContainer("Documentation", "Github", "Documentation");
    githubAccountNode.add(documentationContainer);
    final DeploymentNode devNetworkNode = model.addDeploymentNode("Dev Network", "AWS", "Dev Network");
    final Container nexusContainer = ciaSystem.addContainer("Nexus", "Dev", "Nexus");
    devNetworkNode.add(nexusContainer);
    final Container sonarContainer = ciaSystem.addContainer("Sonarqube", "Dev", "Sonarqube");
    devNetworkNode.add(sonarContainer);
    final Container jenkinsContainer = ciaSystem.addContainer("Jenkins", "Dev", "Jenkins");
    jenkinsContainer.uses(sourceCodeContainer, "builds");
    jenkinsContainer.uses(sonarContainer, "Publish QA metrics", "https");
    jenkinsContainer.uses(nexusContainer, "publish artifacts", "https");
    jenkinsContainer.uses(documentationContainer, "publish Documentation", "https");
    devNetworkNode.add(jenkinsContainer);
    final DeploymentNode sumologicSecurityAccountNode = model.addDeploymentNode("Security Account", "Sumologic", "Sumologic Account");
    final DeploymentNode sumologicNetworkSecurityDashboardNode = sumologicSecurityAccountNode.addDeploymentNode("Nework Security Dashboard", "AWS", "Nework Security Dashboard");
    final DeploymentNode sumologicServerSecurityDashboardNode = sumologicSecurityAccountNode.addDeploymentNode("Server Security Dashboard", "AWS", "Server Security Dashboard");
    final DeploymentNode sumologicAwsAccountSecurityDashboardNode = sumologicSecurityAccountNode.addDeploymentNode("AWS Account Security Dashboard", "AWS", "AWS Account Security Dashboard");
    final DeploymentNode sumologicApplicationSecurityDashboardNode = sumologicSecurityAccountNode.addDeploymentNode("Application Security Dashboard", "AWS", "Application Security Dashboard");
    final Container sumologicVpcFlowLogsContainer = ciaSystem.addContainer("VpcFlowLogs", "Sumologic", "VpcFlowLogs");
    sumologicVpcFlowLogsContainer.uses(awsLogstreamContainer, "Recieve logs");
    sumologicNetworkSecurityDashboardNode.add(sumologicVpcFlowLogsContainer);
    final Container sumologicCloudtrailConfigContainer = ciaSystem.addContainer("CloudTrailLogs", "Sumologic", "CloudTrailLogs");
    sumologicCloudtrailConfigContainer.uses(awsAuditLogBucketContainer, "Recieve logs");
    sumologicAwsAccountSecurityDashboardNode.add(sumologicCloudtrailConfigContainer);
    final Container sumologicAwsConfigContainer = ciaSystem.addContainer("AwsConfigLogs", "Sumologic", "AwsConfigLogs");
    sumologicAwsConfigContainer.uses(awsConfigContainer, "Recieve logs");
    sumologicAwsAccountSecurityDashboardNode.add(sumologicAwsConfigContainer);
    final Container sumologicEc2SystemLogsContainer = ciaSystem.addContainer("Ec2SystemLogs", "Sumologic", "Ec2SystemLogs");
    sumologicEc2SystemLogsContainer.uses(awsLogstreamContainer, "Recieve logs");
    sumologicServerSecurityDashboardNode.add(sumologicEc2SystemLogsContainer);
    final Container sumologicEc2ApplicationLogsContainer = ciaSystem.addContainer("Ec2ApplicationLogs", "Sumologic", "Ec2ApplicationLogs");
    sumologicEc2ApplicationLogsContainer.uses(awsLogstreamContainer, "Recieve logs");
    sumologicApplicationSecurityDashboardNode.add(sumologicEc2ApplicationLogsContainer);
    final Container sumologicAwsInspectorResultsContainer = ciaSystem.addContainer("AwsInspectorResults", "Sumologic", "AwsInspectorResults");
    sumologicAwsInspectorResultsContainer.uses(awsInspectorContainer, "Recieve reports");
    sumologicServerSecurityDashboardNode.add(sumologicAwsInspectorResultsContainer);
    final Container sumologicAwsAlbLogsContainer = ciaSystem.addContainer("AwsLoadbalancerAccessLogs", "Sumologic", "AwsLoadbalancerAccessLogs");
    sumologicAwsAlbLogsContainer.uses(awsAccessLogBucketContainer, "Recieve logs");
    sumologicNetworkSecurityDashboardNode.add(sumologicAwsAlbLogsContainer);
    final DeploymentView developmentDeploymentView = viewSet.createDeploymentView(ciaSystem, "\"Deployment\"", "\"Deployment Aws.\"");
    developmentDeploymentView.add(awsAuditAccountNode);
    developmentDeploymentView.add(wafNode);
    developmentDeploymentView.add(awsQuickSightNode);
    developmentDeploymentView.add(awsInspectorNode);
    developmentDeploymentView.add(awsSSMNode);
    developmentDeploymentView.add(sumologicSecurityAccountNode);
    developmentDeploymentView.add(githubAccountNode);
    developmentDeploymentView.add(devNetworkNode);
    developmentDeploymentView.add(applicationLoadbalancerNode);
    developmentDeploymentView.add(webNode);
    developmentDeploymentView.add(databaseNode);
    final Styles styles = viewSet.getConfiguration().getStyles();
    styles.addElementStyle(Tags.COMPONENT).background("#1168bd").color("#ffffff");
    styles.addElementStyle(Tags.CONTAINER).background("#1168bd").color("#ffffff");
    styles.addElementStyle(Tags.SOFTWARE_SYSTEM).background("#1168bd").color("#ffffff");
    styles.addElementStyle(Tags.PERSON).background("#519823").color("#ffffff").shape(Shape.Person);
    styles.addElementStyle("Database").shape(Shape.Cylinder);
    // StructurizrClient structurizrClient = new StructurizrClient(API_KEY,
    // API_SECRET);
    // structurizrClient.putWorkspace(WORKSPACE_ID, workspace);
    printPlantUml(workspace);
    System.setProperty("PLANTUML_LIMIT_SIZE", "16384");
    Run.main(new String[] { Paths.get(".").toAbsolutePath().normalize().toString() + File.separator + "target" + File.separator + "site" + File.separator + "architecture" + File.separator });
}
Also used : Container(com.structurizr.model.Container) ViewSet(com.structurizr.view.ViewSet) DeploymentNode(com.structurizr.model.DeploymentNode) Model(com.structurizr.model.Model) Enterprise(com.structurizr.model.Enterprise) SoftwareSystem(com.structurizr.model.SoftwareSystem) SystemLandscapeView(com.structurizr.view.SystemLandscapeView) Person(com.structurizr.model.Person) Workspace(com.structurizr.Workspace) DeploymentView(com.structurizr.view.DeploymentView) Styles(com.structurizr.view.Styles)

Aggregations

DeploymentView (com.structurizr.view.DeploymentView)31 Test (org.junit.jupiter.api.Test)27 SoftwareSystem (com.structurizr.model.SoftwareSystem)6 com.structurizr.model (com.structurizr.model)4 RelationshipView (com.structurizr.view.RelationshipView)4 Assertions (org.junit.jupiter.api.Assertions)4 Workspace (com.structurizr.Workspace)3 ArrayList (java.util.ArrayList)3 Container (com.structurizr.model.Container)2 DeploymentNode (com.structurizr.model.DeploymentNode)2 Model (com.structurizr.model.Model)2 Styles (com.structurizr.view.Styles)2 SystemLandscapeView (com.structurizr.view.SystemLandscapeView)2 ViewSet (com.structurizr.view.ViewSet)2 StructurizrDslParser (com.structurizr.dsl.StructurizrDslParser)1 StructurizrDslParserException (com.structurizr.dsl.StructurizrDslParserException)1 Diagram (com.structurizr.export.Diagram)1 StructurizrPlantUMLExporter (com.structurizr.export.plantuml.StructurizrPlantUMLExporter)1 Element (com.structurizr.model.Element)1 Enterprise (com.structurizr.model.Enterprise)1