archsight 0.3.2 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +7 -1
- data/docs/archimate.md +21 -1
- data/docs/configuration.md +1 -0
- data/docs/diagram.md +15 -3
- data/docs/docker.md +4 -1
- data/docs/icons.md +32 -0
- data/docs/import.md +178 -55
- data/docs/index.md.erb +31 -8
- data/docs/modeling.md +772 -24
- data/docs/pages.md +44 -13
- data/docs/search.md +21 -1
- data/docs/togaf.md +5 -1
- data/lib/archsight/analysis/result.rb +8 -2
- data/lib/archsight/analysis/sandbox.rb +8 -0
- data/lib/archsight/analysis/typst_renderer.rb +246 -0
- data/lib/archsight/analysis.rb +1 -0
- data/lib/archsight/annotations/annotation.rb +30 -3
- data/lib/archsight/annotations/architecture_annotations.rb +47 -0
- data/lib/archsight/annotations/asset_annotations.rb +34 -0
- data/lib/archsight/annotations/link_annotations.rb +15 -0
- data/lib/archsight/annotations/resource_reference.rb +12 -0
- data/lib/archsight/annotations/risk_annotations.rb +21 -0
- data/lib/archsight/cli.rb +124 -23
- data/lib/archsight/database.rb +40 -0
- data/lib/archsight/diagram/cli.rb +50 -2
- data/lib/archsight/diagram/formatter.rb +112 -0
- data/lib/archsight/diagram/routing/edge_router/orthogonal_path.rb +38 -10
- data/lib/archsight/diagram/routing/edge_router.rb +29 -4
- data/lib/archsight/diagram/routing/edge_routing.rb +61 -5
- data/lib/archsight/diagram/style/theme.rb +7 -2
- data/lib/archsight/documentation.rb +3 -2
- data/lib/archsight/editor/page_source.rb +13 -1
- data/lib/archsight/export/confluence/analysis_output.rb +101 -0
- data/lib/archsight/export/confluence/client.rb +13 -0
- data/lib/archsight/export/confluence/diagram_links.rb +1 -1
- data/lib/archsight/export/confluence/exporter.rb +40 -13
- data/lib/archsight/export/confluence/labels.rb +25 -0
- data/lib/archsight/export/confluence/page_properties.rb +4 -6
- data/lib/archsight/export/confluence/storage.rb +38 -2
- data/lib/archsight/helpers/embeds.rb +18 -7
- data/lib/archsight/helpers/resource_resolver.rb +25 -0
- data/lib/archsight/import/executor.rb +139 -16
- data/lib/archsight/import/handler.rb +55 -6
- data/lib/archsight/import/handler_loader.rb +64 -0
- data/lib/archsight/import/handlers/cache_pruner.rb +30 -7
- data/lib/archsight/import/handlers/command.rb +120 -0
- data/lib/archsight/import/handlers/github.rb +4 -1
- data/lib/archsight/import/handlers/gitlab.rb +4 -1
- data/lib/archsight/import/handlers/go_dep_resolver.rb +10 -2
- data/lib/archsight/import/handlers/go_grapher.rb +102 -5
- data/lib/archsight/import/handlers/go_module_parser.rb +88 -0
- data/lib/archsight/import/handlers/grapher.rb +40 -1
- data/lib/archsight/import/handlers/repository.rb +3 -0
- data/lib/archsight/import/handlers/rest_api_index.rb +3 -0
- data/lib/archsight/import/registry.rb +22 -1
- data/lib/archsight/import.rb +64 -1
- data/lib/archsight/linter/structure.rb +239 -0
- data/lib/archsight/linter.rb +217 -6
- data/lib/archsight/page_loader.rb +12 -1
- data/lib/archsight/query/evaluator.rb +13 -6
- data/lib/archsight/query/parser.rb +73 -6
- data/lib/archsight/query.rb +1 -1
- data/lib/archsight/references.rb +3 -3
- data/lib/archsight/renderer.rb +80 -23
- data/lib/archsight/resources/analysis.rb +3 -2
- data/lib/archsight/resources/application_component.rb +83 -8
- data/lib/archsight/resources/application_event.rb +79 -0
- data/lib/archsight/resources/application_service.rb +18 -2
- data/lib/archsight/resources/base.rb +58 -5
- data/lib/archsight/resources/business_actor.rb +14 -1
- data/lib/archsight/resources/business_contract.rb +72 -0
- data/lib/archsight/resources/business_control.rb +10 -2
- data/lib/archsight/resources/business_event.rb +79 -0
- data/lib/archsight/resources/business_process.rb +8 -1
- data/lib/archsight/resources/business_product.rb +12 -0
- data/lib/archsight/resources/business_role.rb +70 -0
- data/lib/archsight/resources/compliance_evidence.rb +8 -2
- data/lib/archsight/resources/data_object.rb +6 -1
- data/lib/archsight/resources/implementation_deliverable.rb +63 -0
- data/lib/archsight/resources/implementation_event.rb +52 -0
- data/lib/archsight/resources/implementation_gap.rb +49 -0
- data/lib/archsight/resources/implementation_plateau.rb +67 -0
- data/lib/archsight/resources/implementation_work_package.rb +84 -0
- data/lib/archsight/resources/import.rb +37 -11
- data/lib/archsight/resources/location.rb +56 -0
- data/lib/archsight/resources/motivation_assessment.rb +121 -0
- data/lib/archsight/resources/motivation_constraint.rb +7 -1
- data/lib/archsight/resources/motivation_driver.rb +50 -0
- data/lib/archsight/resources/motivation_goal.rb +13 -1
- data/lib/archsight/resources/motivation_principle.rb +75 -0
- data/lib/archsight/resources/motivation_requirement.rb +18 -2
- data/lib/archsight/resources/motivation_stakeholder.rb +21 -0
- data/lib/archsight/resources/page.rb +9 -7
- data/lib/archsight/resources/strategy_capability.rb +9 -0
- data/lib/archsight/resources/technology_artifact.rb +11 -4
- data/lib/archsight/resources/technology_communication_network.rb +89 -0
- data/lib/archsight/resources/technology_device.rb +88 -0
- data/lib/archsight/resources/technology_equipment.rb +75 -0
- data/lib/archsight/resources/technology_event.rb +80 -0
- data/lib/archsight/resources/technology_facility.rb +70 -0
- data/lib/archsight/resources/technology_node.rb +57 -1
- data/lib/archsight/resources/technology_service.rb +33 -0
- data/lib/archsight/resources/technology_system_software.rb +28 -0
- data/lib/archsight/resources.rb +12 -0
- data/lib/archsight/version.rb +1 -1
- data/lib/archsight/web/api/analysis_helpers.rb +55 -0
- data/lib/archsight/web/api/json_helpers.rb +3 -37
- data/lib/archsight/web/api/openapi/spec.yaml +10 -8
- data/lib/archsight/web/api/page_helpers.rb +1 -8
- data/lib/archsight/web/api/routes.rb +7 -2
- data/lib/archsight/web/application.rb +38 -2
- data/lib/archsight/web/editor/routes.rb +2 -1
- data/lib/archsight/web/public/vue/ApiDocsPage-COp4onwn.js +1 -0
- data/lib/archsight/web/public/vue/DocPage-D52OwaKc.js +1 -0
- data/lib/archsight/web/public/vue/EditorPage-3aqL7yVf.js +35 -0
- data/lib/archsight/web/public/vue/ErrorPage--b9XeSYa.js +2 -0
- data/lib/archsight/web/public/vue/GraphView-qh_EtRrQ.js +1 -0
- data/lib/archsight/web/public/vue/HomePage-C2TNh2U-.js +2 -0
- data/lib/archsight/web/public/vue/InstanceRouter-ZaCcjlIX.css +1 -0
- data/lib/archsight/web/public/vue/InstanceRouter-uzb_OMG0.js +1 -0
- data/lib/archsight/web/public/vue/KindList-CyJuP_uq.js +1 -0
- data/lib/archsight/web/public/vue/KindList-yYcRT2BV.css +1 -0
- data/lib/archsight/web/public/vue/PageView-B93woeN3.css +1 -0
- data/lib/archsight/web/public/vue/PageView-FyygrS-b.js +1 -0
- data/lib/archsight/web/public/vue/QueryError-B4Ex_csZ.js +1 -0
- data/lib/archsight/web/public/vue/ResourceList-BY6Z1Kcb.js +2 -0
- data/lib/archsight/web/public/vue/ResourceList-D75O87zG.css +1 -0
- data/lib/archsight/web/public/vue/{SearchResults-CyPUZZSC.css → SearchResults-BV6UHriJ.css} +1 -1
- data/lib/archsight/web/public/vue/SearchResults-CkFpHF8m.js +1 -0
- data/lib/archsight/web/public/vue/WikiPage-BoHNewCX.js +3 -0
- data/lib/archsight/web/public/vue/WikiPage-TpmM1VAF.css +1 -0
- data/lib/archsight/web/public/vue/architecture-7GRP2DOG-BvzKZE4e.js +1 -0
- data/lib/archsight/web/public/vue/cynefin-OW5HDTMX-D-xs_Hxh.js +1 -0
- data/lib/archsight/web/public/vue/eventmodeling-NTZA5JFV-nbjxG01S.js +1 -0
- data/lib/archsight/web/public/vue/gitGraph-4MIJSDKK-CW6mw2ab.js +1 -0
- data/lib/archsight/web/public/vue/index-BGlYCbi7.js +3 -0
- data/lib/archsight/web/public/vue/index-eUHmJ7K2.css +1 -0
- data/lib/archsight/web/public/vue/info-A6RAGUB7-C12sjlHe.js +1 -0
- data/lib/archsight/web/public/vue/{mermaid-BjEi5URd.js → mermaid-DjsXQ_XN.js} +35 -35
- data/lib/archsight/web/public/vue/packet-AYTQ26CC-wMwKwHmA.js +1 -0
- data/lib/archsight/web/public/vue/pie-WAS4IAKB-w1-sAU_K.js +1 -0
- data/lib/archsight/web/public/vue/radar-RG4KPBEZ-DpwqIFoy.js +1 -0
- data/lib/archsight/web/public/vue/railroad-74A4TZTK-Ce5XC24d.js +1 -0
- data/lib/archsight/web/public/vue/railroad-abnf-HS5TGJTU-BSQO2pds.js +1 -0
- data/lib/archsight/web/public/vue/railroad-ebnf-LZEXJU2U-Dq1c2YtD.js +1 -0
- data/lib/archsight/web/public/vue/railroad-peg-WCYAUIDC-DKj6dli0.js +1 -0
- data/lib/archsight/web/public/vue/rolldown-runtime-hePW80VL.js +1 -0
- data/lib/archsight/web/public/vue/treeView-Q6P3EWNA-BmHNTWxU.js +1 -0
- data/lib/archsight/web/public/vue/treemap-WGGIJYW6-DsEI7sSD.js +1 -0
- data/lib/archsight/web/public/vue/{useGraphviz-DweKV7Kg.js → useGraphviz-4evusK9i.js} +13 -1
- data/lib/archsight/web/public/vue/{useHighlight-D5Gf8DLl.js → useHighlight-DPguaxfm.js} +8 -8
- data/lib/archsight/web/public/vue/usePanZoom-seQE1TPk.js +12 -0
- data/lib/archsight/web/public/vue/wardley-WFR3VGLG-CSCW83-M.js +1 -0
- data/lib/archsight/web/public/vue.html +5 -5
- metadata +72 -38
- data/lib/archsight/web/public/vue/ApiDocsPage-DoOxKjG0.js +0 -1
- data/lib/archsight/web/public/vue/DocPage-CfsC3CeQ.js +0 -1
- data/lib/archsight/web/public/vue/EditorPage-CsJA0q8n.js +0 -35
- data/lib/archsight/web/public/vue/ErrorPage-OJpJz9df.js +0 -2
- data/lib/archsight/web/public/vue/GraphView-CBq6oFRV.js +0 -1
- data/lib/archsight/web/public/vue/HomePage-BwgMLgVC.js +0 -2
- data/lib/archsight/web/public/vue/InstanceRouter-DQz-SsQq.js +0 -1
- data/lib/archsight/web/public/vue/InstanceRouter-jeavM6PW.css +0 -1
- data/lib/archsight/web/public/vue/KindList-4q0K9Cll.js +0 -1
- data/lib/archsight/web/public/vue/PageView-DzeGnvoS.js +0 -1
- data/lib/archsight/web/public/vue/QueryError-kg6Yf-pW.js +0 -1
- data/lib/archsight/web/public/vue/ResourceList-B0FLaFR3.css +0 -1
- data/lib/archsight/web/public/vue/ResourceList-Df_0e0qt.js +0 -2
- data/lib/archsight/web/public/vue/SearchResults-CKgY6_wH.js +0 -1
- data/lib/archsight/web/public/vue/WikiPage-DoFJ0dbW.css +0 -1
- data/lib/archsight/web/public/vue/WikiPage-DrvCHwJ7.js +0 -13
- data/lib/archsight/web/public/vue/architecture-7GRP2DOG-BfA1TPxQ.js +0 -1
- data/lib/archsight/web/public/vue/cynefin-OW5HDTMX-BmgdUKVD.js +0 -1
- data/lib/archsight/web/public/vue/eventmodeling-NTZA5JFV-DbXDvAWF.js +0 -1
- data/lib/archsight/web/public/vue/gitGraph-4MIJSDKK-BkVhrKS1.js +0 -1
- data/lib/archsight/web/public/vue/index-D0Q5GZRs.js +0 -3
- data/lib/archsight/web/public/vue/index-oF-iyZvk.css +0 -1
- data/lib/archsight/web/public/vue/info-A6RAGUB7-BIlCVuUY.js +0 -1
- data/lib/archsight/web/public/vue/packet-AYTQ26CC-eoQTjY3j.js +0 -1
- data/lib/archsight/web/public/vue/pie-WAS4IAKB-DEOotGhh.js +0 -1
- data/lib/archsight/web/public/vue/radar-RG4KPBEZ-C2yucuUN.js +0 -1
- data/lib/archsight/web/public/vue/railroad-74A4TZTK-CzONK5VY.js +0 -1
- data/lib/archsight/web/public/vue/railroad-abnf-HS5TGJTU-9zRPsDsx.js +0 -1
- data/lib/archsight/web/public/vue/railroad-ebnf-LZEXJU2U-BJ4dkz9l.js +0 -1
- data/lib/archsight/web/public/vue/railroad-peg-WCYAUIDC-DFy_rqAj.js +0 -1
- data/lib/archsight/web/public/vue/treeView-Q6P3EWNA-2cq5CyD2.js +0 -1
- data/lib/archsight/web/public/vue/treemap-WGGIJYW6-DK-e9Ez4.js +0 -1
- data/lib/archsight/web/public/vue/wardley-WFR3VGLG-BQwqUqfB.js +0 -1
|
@@ -35,26 +35,52 @@ class Archsight::Resources::Import < Archsight::Resources::Base
|
|
|
35
35
|
icon "download"
|
|
36
36
|
layer "other"
|
|
37
37
|
|
|
38
|
-
# Handler selection
|
|
38
|
+
# Handler selection: a built-in handler or one the resources repository registers (import/handlerPath)
|
|
39
39
|
annotation "import/handler",
|
|
40
|
-
description: "
|
|
40
|
+
description: "Name of the handler that executes this import: a built-in one or one registered by the file " \
|
|
41
|
+
"in import/handlerPath",
|
|
41
42
|
title: "Handler",
|
|
42
43
|
summary: true,
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
44
|
+
filter: :word,
|
|
45
|
+
validator: lambda { |value|
|
|
46
|
+
require "archsight/import/handler_loader"
|
|
47
|
+
Archsight::Import::HandlerLoader.load_builtin!
|
|
48
|
+
next if Archsight::Import::Registry[value]
|
|
49
|
+
|
|
50
|
+
"unknown import handler '#{value}'. Registered: #{Archsight::Import::Registry.handlers.sort.join(", ")}; " \
|
|
51
|
+
"a handler of the resources repository needs import/handlerPath"
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
annotation "import/handlerPath",
|
|
55
|
+
description: "Ruby file of a handler that lives in the resources repository, relative to the resources " \
|
|
56
|
+
"root (e.g., 'importers/deployments.rb'). It registers the name used in import/handler.",
|
|
57
|
+
title: "Handler Path"
|
|
58
|
+
|
|
59
|
+
annotation "import/dependsOn",
|
|
60
|
+
description: "Imports that must run first, by name or glob pattern (e.g., 'Import:Repo:*'), comma " \
|
|
61
|
+
"separated. Adds to the dependency on the import that generated this one.",
|
|
62
|
+
title: "Depends On",
|
|
63
|
+
filter: :list,
|
|
64
|
+
sidebar: false
|
|
52
65
|
|
|
53
66
|
# Output configuration
|
|
54
67
|
annotation "import/outputPath",
|
|
55
68
|
description: "Output file path relative to resources root (e.g., 'imports/generated/gitlab.yaml')",
|
|
56
69
|
title: "Output Path"
|
|
57
70
|
|
|
71
|
+
annotation "generated/inputsHash",
|
|
72
|
+
description: "Hash of the files matched by import/config/inputs at the last run (for change detection)",
|
|
73
|
+
title: "Inputs Hash",
|
|
74
|
+
sidebar: false,
|
|
75
|
+
editor: false
|
|
76
|
+
|
|
77
|
+
annotation "generated/outputs",
|
|
78
|
+
description: "Files the last run wrote, relative to the resources root",
|
|
79
|
+
title: "Outputs",
|
|
80
|
+
filter: :list,
|
|
81
|
+
sidebar: false,
|
|
82
|
+
editor: false
|
|
83
|
+
|
|
58
84
|
# Control flags
|
|
59
85
|
annotation "import/enabled",
|
|
60
86
|
description: "Whether this import is enabled",
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# Location represents a geographic or conceptual place
|
|
4
|
+
class Archsight::Resources::Location < Archsight::Resources::Base
|
|
5
|
+
include_annotations :git, :architecture
|
|
6
|
+
|
|
7
|
+
description <<~MD
|
|
8
|
+
Represents a place: a country, a metro area, a region or any other geographic or conceptual position.
|
|
9
|
+
|
|
10
|
+
## ArchiMate Definition
|
|
11
|
+
|
|
12
|
+
**Layer:** Other (ArchiMate: composite element)
|
|
13
|
+
**Aspect:** Composite
|
|
14
|
+
|
|
15
|
+
A location is a conceptual or physical place or position where concepts are located (structure elements)
|
|
16
|
+
or performed (behavior elements). In archsight it is the coarse place that facilities sit in.
|
|
17
|
+
|
|
18
|
+
## Usage
|
|
19
|
+
|
|
20
|
+
Use Location to represent:
|
|
21
|
+
|
|
22
|
+
- Countries and regions (Germany, EU)
|
|
23
|
+
- Metro areas and cities (Frankfurt)
|
|
24
|
+
- Conceptual places (a cloud region, a jurisdiction)
|
|
25
|
+
|
|
26
|
+
## Not this kind
|
|
27
|
+
|
|
28
|
+
- A building, campus or hall is a `TechnologyFacility` that is `locatedAt` the location
|
|
29
|
+
- A cloud region that is really a set of data centers: a location, with the data centers as facilities in it
|
|
30
|
+
|
|
31
|
+
Which kind to pick: "Choosing the Kind: Infrastructure" in the modeling guide.
|
|
32
|
+
|
|
33
|
+
## How it connects
|
|
34
|
+
|
|
35
|
+
- A `TechnologyFacility` is `locatedAt` a location (many facilities, one location)
|
|
36
|
+
- Everything located at a facility of the location is found through the facility; the location page lists the
|
|
37
|
+
facilities that are located there, grouped by kind
|
|
38
|
+
|
|
39
|
+
Model the sites themselves as `TechnologyFacility`, not as locations: a data center is a physical structure.
|
|
40
|
+
MD
|
|
41
|
+
|
|
42
|
+
icon "map-pin"
|
|
43
|
+
layer "other"
|
|
44
|
+
|
|
45
|
+
annotation "location/country",
|
|
46
|
+
description: "Country of the location (name or ISO 3166 code)",
|
|
47
|
+
title: "Country",
|
|
48
|
+
filter: :word,
|
|
49
|
+
summary: true
|
|
50
|
+
|
|
51
|
+
annotation "location/city",
|
|
52
|
+
description: "City or metro area of the location",
|
|
53
|
+
title: "City",
|
|
54
|
+
filter: :word,
|
|
55
|
+
summary: true
|
|
56
|
+
end
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# MotivationAssessment represents the outcome of an analysis: a risk, a vulnerability, a finding
|
|
4
|
+
class Archsight::Resources::MotivationAssessment < Archsight::Resources::Base
|
|
5
|
+
include_annotations :git, :architecture, :risk
|
|
6
|
+
|
|
7
|
+
description <<~MD
|
|
8
|
+
Represents the outcome of an analysis of some aspect of the architecture with respect to a driver: a risk, a
|
|
9
|
+
vulnerability, an audit finding, a supplier or protection-need assessment.
|
|
10
|
+
|
|
11
|
+
## ArchiMate Definition
|
|
12
|
+
|
|
13
|
+
**Layer:** Motivation
|
|
14
|
+
**Aspect:** Behavior
|
|
15
|
+
|
|
16
|
+
An assessment is the outcome of an analysis of the state of affairs of the enterprise with respect to some
|
|
17
|
+
driver. In the risk and security overlay of the Open Group paper (*Modeling Enterprise Risk Management and
|
|
18
|
+
Security with the ArchiMate Language*) a **risk** is a quantification of a threat and a **vulnerability** is
|
|
19
|
+
the result of analysing weaknesses of architecture elements; both are assessments with a type. Set
|
|
20
|
+
`assessment/type` to say which.
|
|
21
|
+
|
|
22
|
+
## Usage
|
|
23
|
+
|
|
24
|
+
Use MotivationAssessment to represent:
|
|
25
|
+
|
|
26
|
+
- Risks (`risk`) with an initial and a residual profile and a treatment decision
|
|
27
|
+
- Vulnerabilities (`vulnerability`), also the results of a scan or penetration test
|
|
28
|
+
- Audit and review findings (`finding`)
|
|
29
|
+
- Supplier assessments (`supplier`) and protection-need analyses (`protection-need`)
|
|
30
|
+
|
|
31
|
+
## Risk profile
|
|
32
|
+
|
|
33
|
+
Initial risk is the risk before mitigation, residual risk the one after. Describe both with likelihood and
|
|
34
|
+
impact (`risk/initial-*`, `risk/residual-*`) and record the decision in `risk/treatment` (avoid, transfer,
|
|
35
|
+
mitigate, accept).
|
|
36
|
+
|
|
37
|
+
## How it connects
|
|
38
|
+
|
|
39
|
+
- A `MotivationDriver` (the threat) `influences` the risk
|
|
40
|
+
- The assessment `assesses` the assets it is about (applications, nodes, processes, data, suppliers)
|
|
41
|
+
- A vulnerability `influences` the loss events it makes possible; a risk `influences` other risks
|
|
42
|
+
- It is `mitigatedBy` a `MotivationGoal` (control objective), a `MotivationRequirement` (control measure), a
|
|
43
|
+
`BusinessControl` or an `ImplementationWorkPackage` (remediation); read top-down: risk, objective, measure,
|
|
44
|
+
control
|
|
45
|
+
- It is `ownedBy` the accountable actor or role
|
|
46
|
+
MD
|
|
47
|
+
|
|
48
|
+
icon "stats-up-square"
|
|
49
|
+
layer "motivation"
|
|
50
|
+
|
|
51
|
+
likelihood = %w[very-low low medium high very-high]
|
|
52
|
+
|
|
53
|
+
annotation "assessment/id",
|
|
54
|
+
description: "Identifier of the assessment in its register (risk id, CVE, finding number)",
|
|
55
|
+
title: "Assessment ID"
|
|
56
|
+
|
|
57
|
+
annotation "assessment/type",
|
|
58
|
+
description: "What kind of assessment this is (specialization of the assessment)",
|
|
59
|
+
enum: %w[risk vulnerability finding supplier protection-need],
|
|
60
|
+
filter: :word,
|
|
61
|
+
summary: true
|
|
62
|
+
|
|
63
|
+
annotation "assessment/status",
|
|
64
|
+
description: "Where the assessment is in its life cycle",
|
|
65
|
+
enum: %w[open treating accepted closed],
|
|
66
|
+
filter: :word,
|
|
67
|
+
summary: true
|
|
68
|
+
|
|
69
|
+
annotation "assessment/severity",
|
|
70
|
+
description: "Severity of a vulnerability or finding",
|
|
71
|
+
enum: %w[info low medium high critical],
|
|
72
|
+
filter: :word
|
|
73
|
+
|
|
74
|
+
annotation "assessment/assessed",
|
|
75
|
+
description: "When the assessment was made (ISO 8601 date or time)",
|
|
76
|
+
title: "Assessed",
|
|
77
|
+
validator: ->(value) { Archsight::Resources::Page.timestamp_error(value) }
|
|
78
|
+
|
|
79
|
+
annotation "risk/initial-likelihood",
|
|
80
|
+
description: "Likelihood of the loss before mitigation",
|
|
81
|
+
enum: likelihood,
|
|
82
|
+
filter: :word
|
|
83
|
+
|
|
84
|
+
annotation "risk/initial-impact",
|
|
85
|
+
description: "Impact of the loss before mitigation",
|
|
86
|
+
enum: likelihood,
|
|
87
|
+
filter: :word
|
|
88
|
+
|
|
89
|
+
annotation "risk/residual-likelihood",
|
|
90
|
+
description: "Likelihood of the loss after mitigation",
|
|
91
|
+
enum: likelihood,
|
|
92
|
+
filter: :word
|
|
93
|
+
|
|
94
|
+
annotation "risk/residual-impact",
|
|
95
|
+
description: "Impact of the loss after mitigation",
|
|
96
|
+
enum: likelihood,
|
|
97
|
+
filter: :word
|
|
98
|
+
|
|
99
|
+
annotation "risk/treatment",
|
|
100
|
+
description: "How the risk is treated",
|
|
101
|
+
enum: %w[avoid transfer mitigate accept],
|
|
102
|
+
filter: :word,
|
|
103
|
+
summary: true
|
|
104
|
+
|
|
105
|
+
relation :ownedBy, :businessActors, :BusinessActor
|
|
106
|
+
relation :ownedBy, :businessRoles, :BusinessRole
|
|
107
|
+
relation :assesses, :businessProcesses, :BusinessProcess
|
|
108
|
+
relation :assesses, :businessActors, :BusinessActor
|
|
109
|
+
relation :assesses, :applicationComponents, :ApplicationComponent
|
|
110
|
+
relation :assesses, :applicationServices, :ApplicationService
|
|
111
|
+
relation :assesses, :technologyNodes, :TechnologyNode
|
|
112
|
+
relation :assesses, :dataObjects, :DataObject
|
|
113
|
+
relation :influences, :businessEvents, :BusinessEvent
|
|
114
|
+
relation :influences, :applicationEvents, :ApplicationEvent
|
|
115
|
+
relation :influences, :technologyEvents, :TechnologyEvent
|
|
116
|
+
relation :influences, :motivationAssessments, :MotivationAssessment
|
|
117
|
+
relation :mitigatedBy, :goals, :MotivationGoal
|
|
118
|
+
relation :mitigatedBy, :motivationRequirements, :MotivationRequirement
|
|
119
|
+
relation :mitigatedBy, :businessControls, :BusinessControl
|
|
120
|
+
relation :mitigatedBy, :implementationWorkPackages, :ImplementationWorkPackage
|
|
121
|
+
end
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
# MotivationConstraint represents restrictions or limitations on architecture
|
|
4
4
|
class Archsight::Resources::MotivationConstraint < Archsight::Resources::Base
|
|
5
|
-
include_annotations :git, :architecture
|
|
5
|
+
include_annotations :git, :architecture, :risk
|
|
6
6
|
|
|
7
7
|
description <<~MD
|
|
8
8
|
Represents a factor that limits the realization of goals or influences architecture decisions.
|
|
@@ -25,6 +25,12 @@ class Archsight::Resources::MotivationConstraint < Archsight::Resources::Base
|
|
|
25
25
|
- Organizational standards
|
|
26
26
|
- Technical limitations
|
|
27
27
|
- Budget or resource constraints
|
|
28
|
+
|
|
29
|
+
## Security and risk modelling
|
|
30
|
+
|
|
31
|
+
Use a constraint for rules that only restrict and are not a design statement: regulation, contractual duties,
|
|
32
|
+
operational policy (the overlay paper has no element for operational policy). Policies stated as principles
|
|
33
|
+
belong in `MotivationPrinciple`.
|
|
28
34
|
MD
|
|
29
35
|
|
|
30
36
|
icon "prohibition"
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# MotivationDriver represents an external or internal condition that motivates the enterprise to act
|
|
4
|
+
class Archsight::Resources::MotivationDriver < Archsight::Resources::Base
|
|
5
|
+
include_annotations :git, :architecture, :risk
|
|
6
|
+
|
|
7
|
+
description <<~MD
|
|
8
|
+
Represents an external or internal condition that motivates the enterprise to define its goals and act.
|
|
9
|
+
|
|
10
|
+
## ArchiMate Definition
|
|
11
|
+
|
|
12
|
+
**Layer:** Motivation
|
|
13
|
+
**Aspect:** Active Structure
|
|
14
|
+
|
|
15
|
+
A driver is something that creates, motivates and fuels the change of an organization. In the risk and
|
|
16
|
+
security overlay of the Open Group paper (*Modeling Enterprise Risk Management and Security with the ArchiMate
|
|
17
|
+
Language*) the general notion of a **threat** (a threatening circumstance) is a driver; opportunities,
|
|
18
|
+
regulations and market forces are drivers too. Set `driver/type` to say which.
|
|
19
|
+
|
|
20
|
+
## Usage
|
|
21
|
+
|
|
22
|
+
Use MotivationDriver to represent:
|
|
23
|
+
|
|
24
|
+
- Threats ("machines may fail", "attackers target customer data")
|
|
25
|
+
- Opportunities
|
|
26
|
+
- Regulation and legal change
|
|
27
|
+
- Market and customer demand
|
|
28
|
+
|
|
29
|
+
## How it connects
|
|
30
|
+
|
|
31
|
+
- A driver `influences` the assessments (risks) it leads to and other drivers
|
|
32
|
+
- A threat driver `triggers` threat or loss events
|
|
33
|
+
- A `MotivationStakeholder` `hasConcern` for it
|
|
34
|
+
MD
|
|
35
|
+
|
|
36
|
+
icon "fire-flame"
|
|
37
|
+
layer "motivation"
|
|
38
|
+
|
|
39
|
+
annotation "driver/type",
|
|
40
|
+
description: "What kind of driver this is (specialization of the driver)",
|
|
41
|
+
enum: %w[threat opportunity regulation market internal],
|
|
42
|
+
filter: :word,
|
|
43
|
+
summary: true
|
|
44
|
+
|
|
45
|
+
relation :influences, :motivationAssessments, :MotivationAssessment
|
|
46
|
+
relation :influences, :motivationDrivers, :MotivationDriver
|
|
47
|
+
relation :triggers, :businessEvents, :BusinessEvent
|
|
48
|
+
relation :triggers, :applicationEvents, :ApplicationEvent
|
|
49
|
+
relation :triggers, :technologyEvents, :TechnologyEvent
|
|
50
|
+
end
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
# MotivationGoal represents a high-level statement of intent, direction, or desired end state
|
|
4
4
|
# for an organization and its stakeholders (ArchiMate Motivation Layer)
|
|
5
5
|
class Archsight::Resources::MotivationGoal < Archsight::Resources::Base
|
|
6
|
-
include_annotations :git, :architecture
|
|
6
|
+
include_annotations :git, :architecture, :risk
|
|
7
7
|
|
|
8
8
|
description <<~MD
|
|
9
9
|
Represents a high-level statement of intent or desired end state for the organization.
|
|
@@ -26,11 +26,23 @@ class Archsight::Resources::MotivationGoal < Archsight::Resources::Base
|
|
|
26
26
|
- Quality goals
|
|
27
27
|
- Compliance objectives
|
|
28
28
|
- Performance targets
|
|
29
|
+
|
|
30
|
+
## Security and risk modelling
|
|
31
|
+
|
|
32
|
+
In the Open Group risk and security overlay a goal with `goal/type` `control-objective` states what a control
|
|
33
|
+
achieves against a risk. The risk (`MotivationAssessment`) is `mitigatedBy` the goal, and the goal `realizes` the
|
|
34
|
+
requirements that are the control measures: risk, then objective, then measure, read top-down.
|
|
29
35
|
MD
|
|
30
36
|
|
|
31
37
|
icon "archery"
|
|
32
38
|
layer "motivation"
|
|
33
39
|
|
|
40
|
+
annotation "goal/type",
|
|
41
|
+
description: "What kind of goal this is (specialization of the goal)",
|
|
42
|
+
enum: %w[business control-objective],
|
|
43
|
+
filter: :word,
|
|
44
|
+
summary: true
|
|
45
|
+
|
|
34
46
|
relation :realizes, :outcomes, :MotivationOutcome
|
|
35
47
|
relation :refinedBy, :goals, :MotivationGoal
|
|
36
48
|
relation :realizes, :motivationRequirements, :MotivationRequirement
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# MotivationPrinciple represents a normative property of all systems in a context, such as a policy
|
|
4
|
+
class Archsight::Resources::MotivationPrinciple < Archsight::Resources::Base
|
|
5
|
+
include_annotations :git, :architecture, :risk
|
|
6
|
+
|
|
7
|
+
description <<~MD
|
|
8
|
+
Represents a statement of intent that defines a general property that applies to any system in a context: a
|
|
9
|
+
principle, and at design level a policy.
|
|
10
|
+
|
|
11
|
+
## ArchiMate Definition
|
|
12
|
+
|
|
13
|
+
**Layer:** Motivation
|
|
14
|
+
**Aspect:** Passive Structure
|
|
15
|
+
|
|
16
|
+
A principle is a qualitative statement of intent that should be met by the architecture. In the risk and
|
|
17
|
+
security overlay of the Open Group paper (*Modeling Enterprise Risk Management and Security with the ArchiMate
|
|
18
|
+
Language*) a policy maps to a principle; risk policy and security policy are specializations. Set
|
|
19
|
+
`principle/type` to say which.
|
|
20
|
+
|
|
21
|
+
## Usage
|
|
22
|
+
|
|
23
|
+
Use MotivationPrinciple to represent:
|
|
24
|
+
|
|
25
|
+
- Security and risk policies (information security policy, access control policy)
|
|
26
|
+
- Guidelines and procedures that state how a rule is applied
|
|
27
|
+
- Architecture principles
|
|
28
|
+
|
|
29
|
+
Rules that only restrict (regulation, an operational policy that is not a design statement) stay
|
|
30
|
+
`MotivationConstraint`. The text of a policy belongs in a `Page`; link it with `[[Page]]` in the description.
|
|
31
|
+
|
|
32
|
+
## How it connects
|
|
33
|
+
|
|
34
|
+
- A principle is `ownedBy` the actor or role that issued it
|
|
35
|
+
- A `MotivationRequirement` (control measure) `realizes` the principle
|
|
36
|
+
MD
|
|
37
|
+
|
|
38
|
+
icon "book"
|
|
39
|
+
layer "motivation"
|
|
40
|
+
|
|
41
|
+
annotation "principle/type",
|
|
42
|
+
description: "What kind of statement this is (specialization of the principle)",
|
|
43
|
+
enum: %w[principle policy security-policy risk-policy guideline procedure],
|
|
44
|
+
filter: :word,
|
|
45
|
+
summary: true
|
|
46
|
+
|
|
47
|
+
annotation "principle/status",
|
|
48
|
+
description: "Whether the statement is in force",
|
|
49
|
+
enum: %w[draft valid retired],
|
|
50
|
+
filter: :word,
|
|
51
|
+
summary: true
|
|
52
|
+
|
|
53
|
+
annotation "principle/classification",
|
|
54
|
+
description: "Confidentiality classification of the statement",
|
|
55
|
+
enum: %w[public internal confidential strictly-confidential],
|
|
56
|
+
filter: :word
|
|
57
|
+
|
|
58
|
+
annotation "principle/valid-from",
|
|
59
|
+
description: "When the statement comes into force (ISO 8601 date or time)",
|
|
60
|
+
title: "Valid from",
|
|
61
|
+
validator: ->(value) { Archsight::Resources::Page.timestamp_error(value) }
|
|
62
|
+
|
|
63
|
+
annotation "principle/valid-until",
|
|
64
|
+
description: "When the statement has to be reviewed or ends (ISO 8601 date or time)",
|
|
65
|
+
title: "Valid until",
|
|
66
|
+
validator: ->(value) { Archsight::Resources::Page.timestamp_error(value) }
|
|
67
|
+
|
|
68
|
+
annotation "principle/framework",
|
|
69
|
+
description: "Standards the statement maps to (comma-separated, e.g. c5-2020, iso27001-2022)",
|
|
70
|
+
title: "Framework mapping",
|
|
71
|
+
filter: :list
|
|
72
|
+
|
|
73
|
+
relation :ownedBy, :businessActors, :BusinessActor
|
|
74
|
+
relation :ownedBy, :businessRoles, :BusinessRole
|
|
75
|
+
end
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
# MotivationRequirement represents functional or non-functional requirements
|
|
4
4
|
class Archsight::Resources::MotivationRequirement < Archsight::Resources::Base
|
|
5
|
-
include_annotations :git, :architecture
|
|
5
|
+
include_annotations :git, :architecture, :risk
|
|
6
6
|
|
|
7
7
|
description <<~MD
|
|
8
8
|
Represents a statement of need that must be realized by the architecture.
|
|
@@ -35,6 +35,21 @@ class Archsight::Resources::MotivationRequirement < Archsight::Resources::Base
|
|
|
35
35
|
which `satisfies` it
|
|
36
36
|
|
|
37
37
|
Both show as incoming relations on the requirement's page.
|
|
38
|
+
|
|
39
|
+
## Where it comes from
|
|
40
|
+
|
|
41
|
+
The source of a requirement is the `MotivationStakeholder` that `hasConcern` for it, directly or through the goal
|
|
42
|
+
the requirement answers. The stakeholder is `representedBy` the actor or role behind it, so the chain reaches the
|
|
43
|
+
actual organisation that asked for the requirement.
|
|
44
|
+
|
|
45
|
+
## Security and risk modelling
|
|
46
|
+
|
|
47
|
+
- **Control measure:** `requirement/type` `control-measure` is a measure that a control objective
|
|
48
|
+
(`MotivationGoal`) `realizes`; the risk is `mitigatedBy` the objective or directly by the measure, and the
|
|
49
|
+
asset or control that implements the measure `realizes` or `satisfies` it.
|
|
50
|
+
- **Control requirement / catalogue control:** a control of a standard (C5, ISO 27001) is a requirement of type
|
|
51
|
+
`compliance`, listed in `requirement/reference`.
|
|
52
|
+
- **Policy:** a requirement can `realize` a `MotivationPrinciple` (the policy it implements).
|
|
38
53
|
MD
|
|
39
54
|
|
|
40
55
|
icon "task-list"
|
|
@@ -42,7 +57,7 @@ class Archsight::Resources::MotivationRequirement < Archsight::Resources::Base
|
|
|
42
57
|
|
|
43
58
|
annotation "requirement/type",
|
|
44
59
|
description: "Type of requirement (business or legal)",
|
|
45
|
-
enum: %w[business legal compliance functional non-functional],
|
|
60
|
+
enum: %w[business legal compliance functional non-functional control-measure],
|
|
46
61
|
summary: true
|
|
47
62
|
|
|
48
63
|
annotation "requirement/reference",
|
|
@@ -64,4 +79,5 @@ class Archsight::Resources::MotivationRequirement < Archsight::Resources::Base
|
|
|
64
79
|
format: :markdown
|
|
65
80
|
|
|
66
81
|
relation :realizes, :outcomes, :MotivationOutcome
|
|
82
|
+
relation :realizes, :motivationPrinciples, :MotivationPrinciple
|
|
67
83
|
end
|
|
@@ -26,6 +26,23 @@ class Archsight::Resources::MotivationStakeholder < Archsight::Resources::Base
|
|
|
26
26
|
- Customer representatives
|
|
27
27
|
- Regulatory bodies
|
|
28
28
|
- Technical leadership
|
|
29
|
+
|
|
30
|
+
## How it connects
|
|
31
|
+
|
|
32
|
+
- It `hasConcern` for the capabilities, goals, drivers, assessments, constraints and requirements it cares about.
|
|
33
|
+
That makes it the **source** of those requirements: the requirement's page shows the stakeholder as incoming.
|
|
34
|
+
- It is `representedBy` the `BusinessActor` (the actual organisation or person, e.g. the customer organisation,
|
|
35
|
+
not "customer") or `BusinessRole` that holds this interest. A stakeholder is a role; the actor is the party
|
|
36
|
+
behind it.
|
|
37
|
+
|
|
38
|
+
In ArchiMate a stakeholder is associated with the business actor or role that plays it; in TOGAF the stakeholder
|
|
39
|
+
map of Phase A links stakeholders and their concerns to organisation units and actors, and the requirements
|
|
40
|
+
repository records each requirement's source.
|
|
41
|
+
|
|
42
|
+
## Security and risk modelling
|
|
43
|
+
|
|
44
|
+
A stakeholder (CISO, risk committee, data protection officer) can `hasConcern` for threats
|
|
45
|
+
(`MotivationDriver`) and risks (`MotivationAssessment`) in addition to goals and requirements.
|
|
29
46
|
MD
|
|
30
47
|
|
|
31
48
|
icon "user-crown"
|
|
@@ -35,4 +52,8 @@ class Archsight::Resources::MotivationStakeholder < Archsight::Resources::Base
|
|
|
35
52
|
relation :hasConcern, :motivationRequirements, :MotivationRequirement
|
|
36
53
|
relation :hasConcern, :motivationConstraints, :MotivationConstraint
|
|
37
54
|
relation :hasConcern, :goals, :MotivationGoal
|
|
55
|
+
relation :hasConcern, :motivationDrivers, :MotivationDriver
|
|
56
|
+
relation :hasConcern, :motivationAssessments, :MotivationAssessment
|
|
57
|
+
relation :representedBy, :businessActors, :BusinessActor
|
|
58
|
+
relation :representedBy, :businessRoles, :BusinessRole
|
|
38
59
|
end
|
|
@@ -6,6 +6,8 @@ require "time"
|
|
|
6
6
|
# Page is a wiki page authored as a markdown file with YAML frontmatter.
|
|
7
7
|
# It is sourced by Archsight::PageLoader and arranged in a tree by PageMenu.
|
|
8
8
|
class Archsight::Resources::Page < Archsight::Resources::Base
|
|
9
|
+
include_annotations :links
|
|
10
|
+
|
|
9
11
|
description <<~MD
|
|
10
12
|
Represents a wiki page authored as a markdown file with YAML frontmatter.
|
|
11
13
|
|
|
@@ -18,8 +20,13 @@ class Archsight::Resources::Page < Archsight::Resources::Base
|
|
|
18
20
|
|
|
19
21
|
## Frontmatter
|
|
20
22
|
|
|
21
|
-
`title`, `author`, `owner`, `status`, `tags` (comma-separated), `toc` (yes/no), `
|
|
22
|
-
|
|
23
|
+
`title`, `author`, `owner`, `status`, `tags` (comma-separated), `toc` (yes/no), `links` (a mapping of
|
|
24
|
+
names to URLs, e.g. `confluence`, `jira`) and an optional `name` (defaults to the file path).
|
|
25
|
+
|
|
26
|
+
## Security and risk modelling
|
|
27
|
+
|
|
28
|
+
The text of a policy, a risk register narrative or an incident report is a `Page`. Link the structured
|
|
29
|
+
resources (`MotivationPrinciple`, `MotivationAssessment`, events) to it with `[[Page]]`.
|
|
23
30
|
MD
|
|
24
31
|
|
|
25
32
|
icon "page"
|
|
@@ -54,11 +61,6 @@ class Archsight::Resources::Page < Archsight::Resources::Base
|
|
|
54
61
|
title: "Table of Contents",
|
|
55
62
|
enum: %w[yes no],
|
|
56
63
|
sidebar: false
|
|
57
|
-
annotation "page/confluence",
|
|
58
|
-
description: "URL of the corresponding Confluence page (used for a later export)",
|
|
59
|
-
title: "Confluence",
|
|
60
|
-
type: URI,
|
|
61
|
-
sidebar: false
|
|
62
64
|
annotation "page/created",
|
|
63
65
|
description: "When the page was created (ISO 8601 date or time)",
|
|
64
66
|
title: "Created",
|
|
@@ -25,6 +25,15 @@ class Archsight::Resources::StrategyCapability < Archsight::Resources::Base
|
|
|
25
25
|
- Organizational abilities
|
|
26
26
|
- Core competencies
|
|
27
27
|
- Value-generating functions
|
|
28
|
+
|
|
29
|
+
## Choosing this kind
|
|
30
|
+
|
|
31
|
+
**Question:** What must the organization be *able* to do?
|
|
32
|
+
**Test:** It survives swapping product, team and technology. It is not a certificate or a quality.
|
|
33
|
+
**Name:** An ability noun phrase ("Payment Processing"), never a product, team or technology.
|
|
34
|
+
|
|
35
|
+
A product `realizes` the capability. Only internal capabilities that no product carries are `servedBy` a service.
|
|
36
|
+
See the modeling guide, "Choosing the Kind".
|
|
28
37
|
MD
|
|
29
38
|
|
|
30
39
|
icon "strategy"
|
|
@@ -27,6 +27,15 @@ class Archsight::Resources::TechnologyArtifact < Archsight::Resources::Base
|
|
|
27
27
|
- Container images
|
|
28
28
|
- Build artifacts
|
|
29
29
|
- Configuration packages
|
|
30
|
+
- Images (OS, VM template, disk or boot image, `artifact/type: image`)
|
|
31
|
+
|
|
32
|
+
## Contents and deployment
|
|
33
|
+
|
|
34
|
+
An artifact that contains other artifacts `aggregates` them (ArchiMate aggregation): an image contains packages,
|
|
35
|
+
a chart references container images. A node or system software that runs an artifact `assignedTo` it (ArchiMate
|
|
36
|
+
assignment, written on the node). The artifact's page shows both as incoming relations ("contained in" and
|
|
37
|
+
"deployed on"). `ApplicationComponent realizedThrough TechnologyArtifact` says what a component is built from,
|
|
38
|
+
not where the artifact runs.
|
|
30
39
|
MD
|
|
31
40
|
|
|
32
41
|
icon "puzzle"
|
|
@@ -36,12 +45,9 @@ class Archsight::Resources::TechnologyArtifact < Archsight::Resources::Base
|
|
|
36
45
|
annotation "artifact/type",
|
|
37
46
|
description: "Type of technology artifact",
|
|
38
47
|
title: "Artifact Type",
|
|
39
|
-
enum: %w[repo container chart deb rpm]
|
|
48
|
+
enum: %w[repo container chart deb rpm image binary archive]
|
|
40
49
|
|
|
41
50
|
# Dynamic annotations (patterns with *)
|
|
42
|
-
annotation "link/*",
|
|
43
|
-
description: "Documentation and resource links",
|
|
44
|
-
sidebar: false
|
|
45
51
|
annotation "scc/language/*/loc",
|
|
46
52
|
description: "Lines of code per programming language",
|
|
47
53
|
sidebar: false
|
|
@@ -240,6 +246,7 @@ class Archsight::Resources::TechnologyArtifact < Archsight::Resources::Base
|
|
|
240
246
|
end
|
|
241
247
|
|
|
242
248
|
relation :servedBy, :technologyComponents, :TechnologyArtifact
|
|
249
|
+
relation :aggregates, :technologyArtifacts, :TechnologyArtifact
|
|
243
250
|
relation :suppliedBy, :technologyComponents, :TechnologyService
|
|
244
251
|
relation :maintainedBy, :businessActors, :BusinessActor
|
|
245
252
|
relation :contributedBy, :businessActors, :BusinessActor
|