Search in sources :

Example 1 with Model

use of com.structurizr.model.Model in project tutorials by eugenp.

the class StructurizrSimple method addContainers.

private static void addContainers(Workspace workspace) {
    Model model = workspace.getModel();
    SoftwareSystem paymentTerminal = model.getSoftwareSystemWithName(PAYMENT_TERMINAL);
    Container f5 = paymentTerminal.addContainer("Payment Load Balancer", "Payment Load Balancer", "F5");
    Container jvm1 = paymentTerminal.addContainer("JVM-1", "JVM-1", "Java Virtual Machine");
    Container jvm2 = paymentTerminal.addContainer("JVM-2", "JVM-2", "Java Virtual Machine");
    Container jvm3 = paymentTerminal.addContainer("JVM-3", "JVM-3", "Java Virtual Machine");
    Container oracle = paymentTerminal.addContainer("oracleDB", "Oracle Database", "RDBMS");
    f5.uses(jvm1, "route");
    f5.uses(jvm2, "route");
    f5.uses(jvm3, "route");
    jvm1.uses(oracle, "storage");
    jvm2.uses(oracle, "storage");
    jvm3.uses(oracle, "storage");
    ContainerView view = workspace.getViews().createContainerView(paymentTerminal, CONTAINER_VIEW, "Container View");
    view.addAllContainers();
}
Also used : Container(com.structurizr.model.Container) Model(com.structurizr.model.Model) SoftwareSystem(com.structurizr.model.SoftwareSystem) ContainerView(com.structurizr.view.ContainerView)

Example 2 with Model

use of com.structurizr.model.Model 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)

Example 3 with Model

use of com.structurizr.model.Model in project agile-architecture-documentation-system by Riduidel.

the class SequenceDiagramVisitorTest method can_read_a_model.

@Test
@Disabled
void can_read_a_model() {
    // Given all those elements
    Workspace workspace = new Workspace("test workspace", "test workspace");
    Model model = workspace.getModel();
    SoftwareSystem system = model.addSoftwareSystem("agile-architecture-documentation-system");
    Container sequenceGenerator = system.addContainer("sequence-generator", "generator", "Java/Maven");
    sequenceGenerator.addProperty(SequenceGenerator.GENERATES_WITH, StructurizrUtils.getCanonicalPath(sequenceGenerator));
    sequenceGenerator.addProperty(ModelElementKeys.JAVA_SOURCES, new File("src/main/java").toURI().toString());
    Component visitor = sequenceGenerator.addComponent(SequenceDiagramVisitor.class.getSimpleName(), "visitor building the sequence");
    visitor.addSupportingType(SequenceDiagramVisitor.class.getName());
    Component callGraphModel = sequenceGenerator.addComponent(CallGraphModel.class.getSimpleName(), "navigator accumulating data");
    callGraphModel.addSupportingType(CallGraphModel.class.getName());
    Component generator = sequenceGenerator.addComponent(SequenceDiagramGenerator.class.getSimpleName(), "Component producing the sequence diagram");
    generator.addSupportingType(SequenceDiagramGenerator.class.getName());
    // Let's build a sequence diagram visitor
    SequenceDiagramVisitor tested = new SequenceDiagramVisitor();
    tested.logger = Logger.getLogger(getClass().getName());
    tested.destination = new File("target/tests/" + getClass().getSimpleName());
    // Emulate the standard visit
    tested.startVisit(model);
    tested.startVisit(system);
    assertThat(tested.allContainers).hasSize(1);
    assertThat(tested.codeToComponents).hasSize(3);
    assertThat(tested.callGraphModel).isNull();
    // And finally, visit the container and parse source code
    tested.startVisit(sequenceGenerator);
    assertThat(tested.callGraphModel).isNotNull();
    // And visit components to see what happens
    assertThat(tested.startVisit(visitor)).isTrue();
    // And that something is generated
    tested.endVisit(visitor, new SimpleOutputBuilder(tested.destination));
    assertThat(tested.destination).isDirectoryContaining(file -> file.getName().equals(system.getName()));
}
Also used : Container(com.structurizr.model.Container) CallGraphModel(org.ndx.agile.architecture.sequence.generator.javaparser.adapter.CallGraphModel) SequenceDiagramGenerator(org.ndx.agile.architecture.sequence.generator.javaparser.generator.SequenceDiagramGenerator) CallGraphModel(org.ndx.agile.architecture.sequence.generator.javaparser.adapter.CallGraphModel) Model(com.structurizr.model.Model) SoftwareSystem(com.structurizr.model.SoftwareSystem) Component(com.structurizr.model.Component) File(java.io.File) Workspace(com.structurizr.Workspace) SimpleOutputBuilder(org.ndx.agile.architecture.base.utils.SimpleOutputBuilder) Test(org.junit.jupiter.api.Test) Disabled(org.junit.jupiter.api.Disabled)

Example 4 with Model

use of com.structurizr.model.Model in project archifacts by archifacts.

the class C4ModelBuilder method initSoftwareSystem.

private SoftwareSystem initSoftwareSystem(final Workspace workspace) {
    final Model model = workspace.getModel();
    model.setImpliedRelationshipsStrategy(new CreateImpliedRelationshipsUnlessSameRelationshipExistsStrategy());
    return model.addSoftwareSystem(workspace.getName());
}
Also used : CreateImpliedRelationshipsUnlessSameRelationshipExistsStrategy(com.structurizr.model.CreateImpliedRelationshipsUnlessSameRelationshipExistsStrategy) Model(com.structurizr.model.Model)

Example 5 with Model

use of com.structurizr.model.Model in project tutorials by eugenp.

the class StructurizrSimple method addComponents.

private static void addComponents(Workspace workspace) {
    Model model = workspace.getModel();
    SoftwareSystem paymentTerminal = model.getSoftwareSystemWithName(PAYMENT_TERMINAL);
    Container jvm1 = paymentTerminal.getContainerWithName("JVM-1");
    Component jaxrs = jvm1.addComponent("jaxrs-jersey", "restful webservice implementation", "rest");
    Component gemfire = jvm1.addComponent("gemfire", "Clustered Cache Gemfire", "cache");
    Component hibernate = jvm1.addComponent("hibernate", "Data Access Layer", "jpa");
    jaxrs.uses(gemfire, "");
    gemfire.uses(hibernate, "");
    ComponentView componentView = workspace.getViews().createComponentView(jvm1, COMPONENT_VIEW, "JVM Components");
    componentView.addAllComponents();
}
Also used : Container(com.structurizr.model.Container) ComponentView(com.structurizr.view.ComponentView) Model(com.structurizr.model.Model) SoftwareSystem(com.structurizr.model.SoftwareSystem) Component(com.structurizr.model.Component)

Aggregations

Model (com.structurizr.model.Model)8 SoftwareSystem (com.structurizr.model.SoftwareSystem)7 Container (com.structurizr.model.Container)6 Workspace (com.structurizr.Workspace)5 ViewSet (com.structurizr.view.ViewSet)4 Component (com.structurizr.model.Component)3 Person (com.structurizr.model.Person)3 DeploymentNode (com.structurizr.model.DeploymentNode)2 ComponentView (com.structurizr.view.ComponentView)2 ContainerView (com.structurizr.view.ContainerView)2 DeploymentView (com.structurizr.view.DeploymentView)2 Styles (com.structurizr.view.Styles)2 SystemContextView (com.structurizr.view.SystemContextView)2 ComponentFinder (com.structurizr.analysis.ComponentFinder)1 StructurizrAnnotationsComponentFinderStrategy (com.structurizr.analysis.StructurizrAnnotationsComponentFinderStrategy)1 CreateImpliedRelationshipsUnlessSameRelationshipExistsStrategy (com.structurizr.model.CreateImpliedRelationshipsUnlessSameRelationshipExistsStrategy)1 Enterprise (com.structurizr.model.Enterprise)1 SystemLandscapeView (com.structurizr.view.SystemLandscapeView)1 File (java.io.File)1 URLClassLoader (java.net.URLClassLoader)1