diff --git a/docs/docs/variability4tosca/quality/index.md b/docs/docs/variability4tosca/quality/index.md
index 79e2d1395c..ab7ed25a14 100644
--- a/docs/docs/variability4tosca/quality/index.md
+++ b/docs/docs/variability4tosca/quality/index.md
@@ -62,10 +62,10 @@ The node template is hosted on the node template "host 1" of node type [local.ma
-!!! success "Ansible has good quality for this scenario!"
+!!! success "Ansible has good quality for this scenario"
Primary use case due to the specialization of Ansible.
-!!! danger "Terraform has bad quality for this scenario!"
+!!! failure "Terraform has bad quality for this scenario"
Ansible is more specialized. Also using provisioners is a "last resort".
@@ -78,10 +78,10 @@ The node template is hosted on the node template "host 1" of node type [remote.m
-!!! success "Ansible has good quality for this scenario!"
+!!! success "Ansible has good quality for this scenario"
Primary use case due to the specialization of Ansible.
-!!! danger "Terraform has bad quality for this scenario!"
+!!! failure "Terraform has bad quality for this scenario"
Ansible is more specialized. Also using provisioners is a "last resort".
@@ -99,10 +99,10 @@ The scenario does not require a specific hosting.
-!!! danger "Ansible has bad quality for this scenario!"
+!!! failure "Ansible has bad quality for this scenario"
Ansible provides a declarative module
-!!! success "Terraform has good quality for this scenario!"
+!!! success "Terraform has good quality for this scenario"
Terraform provides a declarative module.
@@ -120,13 +120,13 @@ The node template is hosted on the node template "host 1" of node type [kubernet
-!!! warning "Ansible has cautious quality for this scenario!"
+!!! question "Ansible has moderate quality for this scenario"
Kubernetes is more specialized.
-!!! success "Kubernetes has good quality for this scenario!"
+!!! success "Kubernetes has good quality for this scenario"
Kubernetes is the underlying technology.
-!!! warning "Terraform has cautious quality for this scenario!"
+!!! question "Terraform has moderate quality for this scenario"
Kubernetes is more specialized.
@@ -139,10 +139,10 @@ The node template is hosted on the node template "host 1" of node type [local.ma
-!!! success "Ansible has good quality for this scenario!"
+!!! success "Ansible has good quality for this scenario"
Primary use case due to the specialization of Ansible.
-!!! danger "Terraform has bad quality for this scenario!"
+!!! failure "Terraform has bad quality for this scenario"
Ansible is more specialized. Also using provisioners is a "last resort".
@@ -155,10 +155,10 @@ The node template is hosted on the node template "host 1" of node type [remote.m
-!!! success "Ansible has good quality for this scenario!"
+!!! success "Ansible has good quality for this scenario"
Primary use case due to the specialization of Ansible.
-!!! danger "Terraform has bad quality for this scenario!"
+!!! failure "Terraform has bad quality for this scenario"
Ansible is more specialized. Also using provisioners is a "last resort".
@@ -176,13 +176,13 @@ The node template is hosted on the node template "host 1" of node type [mysql.db
-!!! success "Ansible has good quality for this scenario!"
+!!! success "Ansible has good quality for this scenario"
Primary use case due to the specialization of Ansible.
-!!! danger "Docker Compose has bad quality for this scenario!"
+!!! failure "Docker Compose has bad quality for this scenario"
One-time use docker container ("fake Kubernetes job") with imperative parts, while other technologies provide declarative modules.
-!!! success "Terraform has good quality for this scenario!"
+!!! success "Terraform has good quality for this scenario"
Terraform provides a declarative module.
@@ -195,13 +195,13 @@ The node template is hosted on the node template "host 1" of node type [mysql.db
-!!! success "Ansible has good quality for this scenario!"
+!!! success "Ansible has good quality for this scenario"
Primary use case due to the specialization of Ansible.
-!!! danger "Docker Compose has bad quality for this scenario!"
+!!! failure "Docker Compose has bad quality for this scenario"
One-time use docker container ("fake Kubernetes job") with imperative parts, while other technologies provide declarative modules.
-!!! warning "Terraform has moderate quality for this scenario!"
+!!! info "Terraform has fair quality for this scenario"
Terraform provides a declarative module. However, Terraform requires an SSH workaround. Ansible is more specialized.
@@ -214,10 +214,10 @@ The node template is hosted on the node template "host 1" of node type [mysql.db
-!!! danger "Ansible has bad quality for this scenario!"
+!!! failure "Ansible has bad quality for this scenario"
Primary use case due to the specialization of Ansible. However, need to install and handle GCP CloudSQL Proxy, while the corresponding Terraform module already provides this.
-!!! success "Terraform has good quality for this scenario!"
+!!! success "Terraform has good quality for this scenario"
Terraform provides a declarative module.
@@ -230,13 +230,13 @@ The node template is hosted on the node template "host 1" of node type [mysql.db
-!!! success "Ansible has good quality for this scenario!"
+!!! success "Ansible has good quality for this scenario"
Primary use case due to the specialization of Ansible.
-!!! danger "Kubernetes has bad quality for this scenario!"
+!!! failure "Kubernetes has bad quality for this scenario"
Kubernetes Job with imperative parts, while declarative other technologies provide declarative modules.
-!!! failure "Terraform has poor quality for this scenario!"
+!!! warning "Terraform has poor quality for this scenario"
Ansible is more specialized.
@@ -249,10 +249,10 @@ The node template is hosted on the node template "host 1" of node type [mysql.db
-!!! success "Ansible has good quality for this scenario!"
+!!! success "Ansible has good quality for this scenario"
Primary use case due to the specialization of Ansible.
-!!! success "Terraform has good quality for this scenario!"
+!!! success "Terraform has good quality for this scenario"
Terraform provides a declarative module.
@@ -265,10 +265,10 @@ The node template is hosted on the node template "host 1" of node type [mysql.db
-!!! success "Ansible has good quality for this scenario!"
+!!! success "Ansible has good quality for this scenario"
Primary use case due to the specialization of Ansible.
-!!! warning "Terraform has cautious quality for this scenario!"
+!!! question "Terraform has moderate quality for this scenario"
Terraform provides a declarative module. However, Terraform requires an SSH workaround. Ansible is more specialized.
@@ -287,13 +287,13 @@ The node template is hosted on the node template "host 1" of node type [docker.e
-!!! warning "Ansible has cautious quality for this scenario!"
+!!! question "Ansible has moderate quality for this scenario"
Docker Compose is more specialized
-!!! success "Docker Compose has good quality for this scenario!"
+!!! success "Docker Compose has good quality for this scenario"
Docker is the underlying technology.
-!!! warning "Terraform has cautious quality for this scenario!"
+!!! question "Terraform has moderate quality for this scenario"
Docker Compose is more specialized.
@@ -307,13 +307,13 @@ The node template is hosted on the node template "host 1" of node type [docker.e
-!!! warning "Ansible has cautious quality for this scenario!"
+!!! question "Ansible has moderate quality for this scenario"
Docker Compose is more specialized
-!!! success "Docker Compose has good quality for this scenario!"
+!!! success "Docker Compose has good quality for this scenario"
Docker is the underlying technology.
-!!! warning "Terraform has cautious quality for this scenario!"
+!!! question "Terraform has moderate quality for this scenario"
Docker Compose is more specialized.
@@ -327,10 +327,10 @@ The node template is hosted on the node template "host 1" of node type [gcp.clou
-!!! danger "Ansible has bad quality for this scenario!"
+!!! failure "Ansible has bad quality for this scenario"
Primary use case due to the specialization of Ansible.
-!!! success "Terraform has good quality for this scenario!"
+!!! success "Terraform has good quality for this scenario"
Terraform provides a declarative module.
@@ -344,13 +344,13 @@ The node template is hosted on the node template "host 1" of node type [kubernet
-!!! warning "Ansible has cautious quality for this scenario!"
+!!! question "Ansible has moderate quality for this scenario"
Kubernetes is more specialized.
-!!! success "Kubernetes has good quality for this scenario!"
+!!! success "Kubernetes has good quality for this scenario"
Kubernetes is the underlying technology.
-!!! warning "Terraform has cautious quality for this scenario!"
+!!! question "Terraform has moderate quality for this scenario"
Kubernetes is more specialized.
@@ -364,10 +364,10 @@ The node template is hosted on the node template "host 1" of node type [local.ma
-!!! success "Ansible has good quality for this scenario!"
+!!! success "Ansible has good quality for this scenario"
Primary use case due to the specialization of Ansible.
-!!! danger "Terraform has bad quality for this scenario!"
+!!! failure "Terraform has bad quality for this scenario"
Ansible is more specialized. Also using provisioners is a "last resort".
@@ -381,10 +381,10 @@ The node template is hosted on the node template "host 1" of node type [remote.m
-!!! success "Ansible has good quality for this scenario!"
+!!! success "Ansible has good quality for this scenario"
Primary use case due to the specialization of Ansible.
-!!! danger "Terraform has bad quality for this scenario!"
+!!! failure "Terraform has bad quality for this scenario"
Ansible is more specialized. Also using provisioners is a "last resort".
@@ -402,10 +402,10 @@ The node template is hosted on the node template "host 1" of node type [gcp.clou
-!!! danger "Ansible has bad quality for this scenario!"
+!!! failure "Ansible has bad quality for this scenario"
Primary use case due to the specialization of Ansible.
-!!! success "Terraform has good quality for this scenario!"
+!!! success "Terraform has good quality for this scenario"
Terraform provides a declarative module.
@@ -418,13 +418,13 @@ The node template is hosted on the node template "host 1" of node type [minio.se
-!!! success "Ansible has good quality for this scenario!"
+!!! success "Ansible has good quality for this scenario"
Primary use case due to the specialization of Ansible.
-!!! danger "Docker Compose has bad quality for this scenario!"
+!!! failure "Docker Compose has bad quality for this scenario"
One-time use docker container ("fake Kubernetes job") with imperative parts, while other technologies provide declarative modules.
-!!! success "Terraform has good quality for this scenario!"
+!!! success "Terraform has good quality for this scenario"
Terraform provides a declarative module.
@@ -437,13 +437,13 @@ The node template is hosted on the node template "host 1" of node type [minio.se
-!!! success "Ansible has good quality for this scenario!"
+!!! success "Ansible has good quality for this scenario"
Primary use case due to the specialization of Ansible.
-!!! danger "Docker Compose has bad quality for this scenario!"
+!!! failure "Docker Compose has bad quality for this scenario"
One-time use docker container ("fake Kubernetes job") with imperative parts, while other technologies provide declarative modules.
-!!! warning "Terraform has moderate quality for this scenario!"
+!!! info "Terraform has fair quality for this scenario"
Terraform provides a declarative module. However, Terraform requires an SSH workaround. Ansible is more specialized.
@@ -456,13 +456,13 @@ The node template is hosted on the node template "host 1" of node type [minio.se
-!!! success "Ansible has good quality for this scenario!"
+!!! success "Ansible has good quality for this scenario"
Primary use case due to the specialization of Ansible.
-!!! danger "Kubernetes has bad quality for this scenario!"
+!!! failure "Kubernetes has bad quality for this scenario"
Kubernetes Job with imperative parts, while declarative other technologies provide declarative modules.
-!!! failure "Terraform has poor quality for this scenario!"
+!!! warning "Terraform has poor quality for this scenario"
Ansible is more specialized.
@@ -481,13 +481,13 @@ The node template is hosted on the node template "host 1" of node type [docker.e
-!!! warning "Ansible has cautious quality for this scenario!"
+!!! question "Ansible has moderate quality for this scenario"
Docker Compose is more specialized.
-!!! success "Docker Compose has good quality for this scenario!"
+!!! success "Docker Compose has good quality for this scenario"
Docker is the underlying technology.
-!!! warning "Terraform has cautious quality for this scenario!"
+!!! question "Terraform has moderate quality for this scenario"
Docker Compose is more specialized.
@@ -501,13 +501,13 @@ The node template is hosted on the node template "host 1" of node type [docker.e
-!!! warning "Ansible has cautious quality for this scenario!"
+!!! question "Ansible has moderate quality for this scenario"
Docker Compose is more specialized.
-!!! success "Docker Compose has good quality for this scenario!"
+!!! success "Docker Compose has good quality for this scenario"
Docker is the underlying technology.
-!!! warning "Terraform has cautious quality for this scenario!"
+!!! question "Terraform has moderate quality for this scenario"
Docker Compose is more specialized.
@@ -521,10 +521,10 @@ The node template is hosted on the node template "host 1" of node type [gcp.memo
-!!! danger "Ansible has bad quality for this scenario!"
+!!! failure "Ansible has bad quality for this scenario"
Primary use case due to the specialization of Ansible.
-!!! success "Terraform has good quality for this scenario!"
+!!! success "Terraform has good quality for this scenario"
Terraform provides a declarative module.
@@ -538,13 +538,13 @@ The node template is hosted on the node template "host 1" of node type [kubernet
-!!! warning "Ansible has cautious quality for this scenario!"
+!!! question "Ansible has moderate quality for this scenario"
Kubernetes is more specialized.
-!!! success "Kubernetes has good quality for this scenario!"
+!!! success "Kubernetes has good quality for this scenario"
Kubernetes is the underlying technology.
-!!! warning "Terraform has cautious quality for this scenario!"
+!!! question "Terraform has moderate quality for this scenario"
Kubernetes is more specialized.
@@ -563,13 +563,13 @@ The node template is hosted on the node template "host 1" of node type [docker.e
-!!! warning "Ansible has cautious quality for this scenario!"
+!!! question "Ansible has moderate quality for this scenario"
Docker Compose is more specialized.
-!!! success "Docker Compose has good quality for this scenario!"
+!!! success "Docker Compose has good quality for this scenario"
Docker is the underlying technology.
-!!! warning "Terraform has cautious quality for this scenario!"
+!!! question "Terraform has moderate quality for this scenario"
Docker Compose is more specialized.
@@ -583,13 +583,13 @@ The node template is hosted on the node template "host 1" of node type [docker.e
-!!! warning "Ansible has cautious quality for this scenario!"
+!!! question "Ansible has moderate quality for this scenario"
Docker Compose is more specialized.
-!!! success "Docker Compose has good quality for this scenario!"
+!!! success "Docker Compose has good quality for this scenario"
Docker is the underlying technology.
-!!! warning "Terraform has cautious quality for this scenario!"
+!!! question "Terraform has moderate quality for this scenario"
Docker Compose is more specialized.
@@ -603,10 +603,10 @@ The node template is hosted on the node template "host 1" of node type [gcp.clou
-!!! danger "Ansible has bad quality for this scenario!"
+!!! failure "Ansible has bad quality for this scenario"
Custom module with imperative parts, while Terraform provides a declarative module.
-!!! success "Terraform has good quality for this scenario!"
+!!! success "Terraform has good quality for this scenario"
Terraform provides a declarative module.
@@ -620,13 +620,13 @@ The node template is hosted on the node template "host 1" of node type [kubernet
-!!! warning "Ansible has cautious quality for this scenario!"
+!!! question "Ansible has moderate quality for this scenario"
Kubernetes is more specialized.
-!!! success "Kubernetes has good quality for this scenario!"
+!!! success "Kubernetes has good quality for this scenario"
Kubernetes is the underlying technology.
-!!! warning "Terraform has cautious quality for this scenario!"
+!!! question "Terraform has moderate quality for this scenario"
Kubernetes is more specialized.
@@ -640,10 +640,10 @@ The node template is hosted on an arbitrary hosting stack of arbitrary length, w
-!!! success "Ansible has good quality for this scenario!"
+!!! success "Ansible has good quality for this scenario"
Primary use case due to the specialization of Ansible. Special integration for systemd.
-!!! danger "Terraform has bad quality for this scenario!"
+!!! failure "Terraform has bad quality for this scenario"
Ansible is more specialized. Also using provisioners is a "last resort".
@@ -657,10 +657,10 @@ The node template is hosted on an arbitrary hosting stack of arbitrary length, w
-!!! success "Ansible has good quality for this scenario!"
+!!! success "Ansible has good quality for this scenario"
Primary use case due to the specialization of Ansible. Special integration for systemd.
-!!! danger "Terraform has bad quality for this scenario!"
+!!! failure "Terraform has bad quality for this scenario"
Ansible is more specialized. Also using provisioners is a "last resort".
@@ -674,10 +674,10 @@ The node template is hosted on an arbitrary hosting stack of arbitrary length, w
-!!! success "Ansible has good quality for this scenario!"
+!!! success "Ansible has good quality for this scenario"
Primary use case due to the specialization of Ansible. Special integration for systemd.
-!!! danger "Terraform has bad quality for this scenario!"
+!!! failure "Terraform has bad quality for this scenario"
Ansible is more specialized. Also using provisioners is a "last resort".
@@ -691,10 +691,10 @@ The node template is hosted on an arbitrary hosting stack of arbitrary length, w
-!!! success "Ansible has good quality for this scenario!"
+!!! success "Ansible has good quality for this scenario"
Primary use case due to the specialization of Ansible. Special integration for systemd.
-!!! danger "Terraform has bad quality for this scenario!"
+!!! failure "Terraform has bad quality for this scenario"
Ansible is more specialized. Also using provisioners is a "last resort".
@@ -708,10 +708,10 @@ The node template is hosted on the node template "host 1" of node type [gcp.appe
-!!! danger "Ansible has bad quality for this scenario!"
+!!! failure "Ansible has bad quality for this scenario"
Custom module with imperative parts, while Terraform provides a declarative module.
-!!! success "Terraform has good quality for this scenario!"
+!!! success "Terraform has good quality for this scenario"
Terraform provides a declarative module.
@@ -730,10 +730,10 @@ The node template is hosted on an arbitrary hosting stack of arbitrary length, w
-!!! success "Ansible has good quality for this scenario!"
+!!! success "Ansible has good quality for this scenario"
Primary use case due to the specialization of Ansible.
-!!! danger "Terraform has bad quality for this scenario!"
+!!! failure "Terraform has bad quality for this scenario"
Ansible is more specialized. Also using provisioners is a "last resort".
@@ -747,10 +747,10 @@ The node template is hosted on an arbitrary hosting stack of arbitrary length, w
-!!! success "Ansible has good quality for this scenario!"
+!!! success "Ansible has good quality for this scenario"
Primary use case due to the specialization of Ansible.
-!!! danger "Terraform has bad quality for this scenario!"
+!!! failure "Terraform has bad quality for this scenario"
Ansible is more specialized. Also using provisioners is a "last resort".
@@ -764,10 +764,10 @@ The node template is hosted on an arbitrary hosting stack of arbitrary length, w
-!!! success "Ansible has good quality for this scenario!"
+!!! success "Ansible has good quality for this scenario"
While this is a primary use case due to the specialization of Ansible, we must rely on scripts. More specialized types should be used, e.g., service.application.
-!!! danger "Terraform has bad quality for this scenario!"
+!!! failure "Terraform has bad quality for this scenario"
Ansible is more specialized. Also using provisioners is a "last resort".
@@ -781,10 +781,10 @@ The node template is hosted on an arbitrary hosting stack of arbitrary length, w
-!!! success "Ansible has good quality for this scenario!"
+!!! success "Ansible has good quality for this scenario"
While this is a primary use case due to the specialization of Ansible, we must rely on scripts. More specialized types should be used, e.g., "service.application".
-!!! danger "Terraform has bad quality for this scenario!"
+!!! failure "Terraform has bad quality for this scenario"
Ansible is more specialized. Also using provisioners is a "last resort".
@@ -798,10 +798,10 @@ The node template is hosted on an arbitrary hosting stack of arbitrary length, w
-!!! success "Ansible has good quality for this scenario!"
+!!! success "Ansible has good quality for this scenario"
While this is a primary use case due to the specialization of Ansible, we must rely on scripts. More specialized types should be used, e.g., service.application.
-!!! danger "Terraform has bad quality for this scenario!"
+!!! failure "Terraform has bad quality for this scenario"
Ansible is more specialized. Also using provisioners is a "last resort".
@@ -815,10 +815,10 @@ The node template is hosted on an arbitrary hosting stack of arbitrary length, w
-!!! success "Ansible has good quality for this scenario!"
+!!! success "Ansible has good quality for this scenario"
While this is a primary use case due to the specialization of Ansible, we must rely on scripts. More specialized types should be used, e.g., service.application.
-!!! danger "Terraform has bad quality for this scenario!"
+!!! failure "Terraform has bad quality for this scenario"
Ansible is more specialized. Also using provisioners is a "last resort".
@@ -837,10 +837,10 @@ The node template is hosted on the node template "host 1" of node type [openstac
-!!! warning "Ansible has cautious quality for this scenario!"
+!!! question "Ansible has moderate quality for this scenario"
Terraform is more specialized.
-!!! success "Terraform has good quality for this scenario!"
+!!! success "Terraform has good quality for this scenario"
Terraform provides a declarative module.
@@ -935,7 +935,7 @@ This appendix contains the deployment quality cards.
| Technology | ansible |
| Hosting | [kubernetes.cluster](/normative#kubernetescluster){target=_blank} |
| Quality | 0.5 |
-| Label | cautious |
+| Label | moderate |
| Reason | Kubernetes is more specialized. |
| Graph ||
@@ -961,7 +961,7 @@ This appendix contains the deployment quality cards.
| Technology | terraform |
| Hosting | [kubernetes.cluster](/normative#kubernetescluster){target=_blank} |
| Quality | 0.5 |
-| Label | cautious |
+| Label | moderate |
| Reason | Kubernetes is more specialized. |
| Graph ||
@@ -1091,7 +1091,7 @@ This appendix contains the deployment quality cards.
| Technology | terraform |
| Hosting | [mysql.dbms](/normative#mysqldbms){target=_blank} -> [docker.engine](/normative#dockerengine){target=_blank} -> [remote.machine](/normative#remotemachine){target=_blank} |
| Quality | 0.75 |
-| Label | moderate |
+| Label | fair |
| Reason | Terraform provides a declarative module. However, Terraform requires an SSH workaround. Ansible is more specialized. |
| Graph ||
@@ -1208,7 +1208,7 @@ This appendix contains the deployment quality cards.
| Technology | terraform |
| Hosting | [mysql.dbms](/normative#mysqldbms){target=_blank} -> [remote.machine](/normative#remotemachine){target=_blank} |
| Quality | 0.5 |
-| Label | cautious |
+| Label | moderate |
| Reason | Terraform provides a declarative module. However, Terraform requires an SSH workaround. Ansible is more specialized. |
| Graph ||
@@ -1222,7 +1222,7 @@ This appendix contains the deployment quality cards.
| Technology | ansible |
| Hosting | [docker.engine](/normative#dockerengine){target=_blank} -> [local.machine](/normative#localmachine){target=_blank} |
| Quality | 0.5 |
-| Label | cautious |
+| Label | moderate |
| Reason | Docker Compose is more specialized |
| Graph ||
@@ -1250,7 +1250,7 @@ This appendix contains the deployment quality cards.
| Technology | terraform |
| Hosting | [docker.engine](/normative#dockerengine){target=_blank} -> [local.machine](/normative#localmachine){target=_blank} |
| Quality | 0.5 |
-| Label | cautious |
+| Label | moderate |
| Reason | Docker Compose is more specialized. |
| Graph ||
@@ -1264,7 +1264,7 @@ This appendix contains the deployment quality cards.
| Technology | ansible |
| Hosting | [docker.engine](/normative#dockerengine){target=_blank} -> [remote.machine](/normative#remotemachine){target=_blank} |
| Quality | 0.5 |
-| Label | cautious |
+| Label | moderate |
| Reason | Docker Compose is more specialized |
| Graph ||
@@ -1292,7 +1292,7 @@ This appendix contains the deployment quality cards.
| Technology | terraform |
| Hosting | [docker.engine](/normative#dockerengine){target=_blank} -> [remote.machine](/normative#remotemachine){target=_blank} |
| Quality | 0.5 |
-| Label | cautious |
+| Label | moderate |
| Reason | Docker Compose is more specialized. |
| Graph ||
@@ -1334,7 +1334,7 @@ This appendix contains the deployment quality cards.
| Technology | ansible |
| Hosting | [kubernetes.cluster](/normative#kubernetescluster){target=_blank} |
| Quality | 0.5 |
-| Label | cautious |
+| Label | moderate |
| Reason | Kubernetes is more specialized. |
| Graph ||
@@ -1362,7 +1362,7 @@ This appendix contains the deployment quality cards.
| Technology | terraform |
| Hosting | [kubernetes.cluster](/normative#kubernetescluster){target=_blank} |
| Quality | 0.5 |
-| Label | cautious |
+| Label | moderate |
| Reason | Kubernetes is more specialized. |
| Graph ||
@@ -1522,7 +1522,7 @@ This appendix contains the deployment quality cards.
| Technology | terraform |
| Hosting | [minio.server](/normative#minioserver){target=_blank} -> [docker.engine](/normative#dockerengine){target=_blank} -> [remote.machine](/normative#remotemachine){target=_blank} |
| Quality | 0.75 |
-| Label | moderate |
+| Label | fair |
| Reason | Terraform provides a declarative module. However, Terraform requires an SSH workaround. Ansible is more specialized. |
| Graph ||
@@ -1575,7 +1575,7 @@ This appendix contains the deployment quality cards.
| Technology | ansible |
| Hosting | [docker.engine](/normative#dockerengine){target=_blank} -> [local.machine](/normative#localmachine){target=_blank} |
| Quality | 0.5 |
-| Label | cautious |
+| Label | moderate |
| Reason | Docker Compose is more specialized. |
| Graph ||
@@ -1603,7 +1603,7 @@ This appendix contains the deployment quality cards.
| Technology | terraform |
| Hosting | [docker.engine](/normative#dockerengine){target=_blank} -> [local.machine](/normative#localmachine){target=_blank} |
| Quality | 0.5 |
-| Label | cautious |
+| Label | moderate |
| Reason | Docker Compose is more specialized. |
| Graph ||
@@ -1617,7 +1617,7 @@ This appendix contains the deployment quality cards.
| Technology | ansible |
| Hosting | [docker.engine](/normative#dockerengine){target=_blank} -> [remote.machine](/normative#remotemachine){target=_blank} |
| Quality | 0.5 |
-| Label | cautious |
+| Label | moderate |
| Reason | Docker Compose is more specialized. |
| Graph ||
@@ -1645,7 +1645,7 @@ This appendix contains the deployment quality cards.
| Technology | terraform |
| Hosting | [docker.engine](/normative#dockerengine){target=_blank} -> [remote.machine](/normative#remotemachine){target=_blank} |
| Quality | 0.5 |
-| Label | cautious |
+| Label | moderate |
| Reason | Docker Compose is more specialized. |
| Graph ||
@@ -1687,7 +1687,7 @@ This appendix contains the deployment quality cards.
| Technology | ansible |
| Hosting | [kubernetes.cluster](/normative#kubernetescluster){target=_blank} |
| Quality | 0.5 |
-| Label | cautious |
+| Label | moderate |
| Reason | Kubernetes is more specialized. |
| Graph ||
@@ -1715,7 +1715,7 @@ This appendix contains the deployment quality cards.
| Technology | terraform |
| Hosting | [kubernetes.cluster](/normative#kubernetescluster){target=_blank} |
| Quality | 0.5 |
-| Label | cautious |
+| Label | moderate |
| Reason | Kubernetes is more specialized. |
| Graph ||
@@ -1729,7 +1729,7 @@ This appendix contains the deployment quality cards.
| Technology | ansible |
| Hosting | [docker.engine](/normative#dockerengine){target=_blank} -> [local.machine](/normative#localmachine){target=_blank} |
| Quality | 0.5 |
-| Label | cautious |
+| Label | moderate |
| Reason | Docker Compose is more specialized. |
| Graph ||
@@ -1757,7 +1757,7 @@ This appendix contains the deployment quality cards.
| Technology | terraform |
| Hosting | [docker.engine](/normative#dockerengine){target=_blank} -> [local.machine](/normative#localmachine){target=_blank} |
| Quality | 0.5 |
-| Label | cautious |
+| Label | moderate |
| Reason | Docker Compose is more specialized. |
| Graph ||
@@ -1771,7 +1771,7 @@ This appendix contains the deployment quality cards.
| Technology | ansible |
| Hosting | [docker.engine](/normative#dockerengine){target=_blank} -> [remote.machine](/normative#remotemachine){target=_blank} |
| Quality | 0.5 |
-| Label | cautious |
+| Label | moderate |
| Reason | Docker Compose is more specialized. |
| Graph ||
@@ -1799,7 +1799,7 @@ This appendix contains the deployment quality cards.
| Technology | terraform |
| Hosting | [docker.engine](/normative#dockerengine){target=_blank} -> [remote.machine](/normative#remotemachine){target=_blank} |
| Quality | 0.5 |
-| Label | cautious |
+| Label | moderate |
| Reason | Docker Compose is more specialized. |
| Graph ||
@@ -1841,7 +1841,7 @@ This appendix contains the deployment quality cards.
| Technology | ansible |
| Hosting | [kubernetes.cluster](/normative#kubernetescluster){target=_blank} |
| Quality | 0.5 |
-| Label | cautious |
+| Label | moderate |
| Reason | Kubernetes is more specialized. |
| Graph ||
@@ -1869,7 +1869,7 @@ This appendix contains the deployment quality cards.
| Technology | terraform |
| Hosting | [kubernetes.cluster](/normative#kubernetescluster){target=_blank} |
| Quality | 0.5 |
-| Label | cautious |
+| Label | moderate |
| Reason | Kubernetes is more specialized. |
| Graph ||
@@ -2191,7 +2191,7 @@ This appendix contains the deployment quality cards.
| Technology | ansible |
| Hosting | [openstack.provider](/normative#openstackprovider){target=_blank} |
| Quality | 0.5 |
-| Label | cautious |
+| Label | moderate |
| Reason | Terraform is more specialized. |
| Graph ||
diff --git a/examples/unfurl-technology---boutique---plus-maintenance-automated/scripts/study-010.txt b/examples/unfurl-technology---boutique---plus-maintenance-automated/scripts/study-010.txt
new file mode 100644
index 0000000000..2b5cf313b8
--- /dev/null
+++ b/examples/unfurl-technology---boutique---plus-maintenance-automated/scripts/study-010.txt
@@ -0,0 +1,176 @@
+
+The technology rules of our case study. Qualities range from bad (0) to good (1).
+┌─────────┬──────────────┬────────────────────────┬─────────────────┬───────────────────────────────────────────────────────┬─────────┬──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
+│ (index) │ Technology │ Component │ Artifact │ Hosting │ Quality │ Reason │
+├─────────┼──────────────┼────────────────────────┼─────────────────┼───────────────────────────────────────────────────────┼─────────┼──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤
+│ 0 │ 'ansible' │ 'docker.engine' │ undefined │ [ 'local.machine' ] │ 1 │ 'Primary use case due to the specialization of Ansible.' │
+│ 1 │ 'terraform' │ 'docker.engine' │ undefined │ [ 'local.machine' ] │ 0 │ 'Ansible is more specialized. Also using provisioners is a "last resort".' │
+│ 2 │ 'ansible' │ 'docker.engine' │ undefined │ [ 'remote.machine' ] │ 1 │ 'Primary use case due to the specialization of Ansible.' │
+│ 3 │ 'terraform' │ 'docker.engine' │ undefined │ [ 'remote.machine' ] │ 0 │ 'Ansible is more specialized. Also using provisioners is a "last resort".' │
+│ 4 │ 'ansible' │ 'gcp.service' │ undefined │ [] │ 0 │ 'Ansible provides a declarative module' │
+│ 5 │ 'terraform' │ 'gcp.service' │ undefined │ [] │ 1 │ 'Terraform provides a declarative module.' │
+│ 6 │ 'ansible' │ 'ingress' │ undefined │ [ 'kubernetes.cluster' ] │ 0.5 │ 'Kubernetes is more specialized.' │
+│ 7 │ 'kubernetes' │ 'ingress' │ undefined │ [ 'kubernetes.cluster' ] │ 1 │ 'Kubernetes is the underlying technology.' │
+│ 8 │ 'terraform' │ 'ingress' │ undefined │ [ 'kubernetes.cluster' ] │ 0.5 │ 'Kubernetes is more specialized.' │
+│ 9 │ 'ansible' │ 'ingress' │ undefined │ [ 'local.machine' ] │ 1 │ 'Primary use case due to the specialization of Ansible.' │
+│ 10 │ 'terraform' │ 'ingress' │ undefined │ [ 'local.machine' ] │ 0 │ 'Ansible is more specialized. Also using provisioners is a "last resort".' │
+│ 11 │ 'ansible' │ 'ingress' │ undefined │ [ 'remote.machine' ] │ 1 │ 'Primary use case due to the specialization of Ansible.' │
+│ 12 │ 'terraform' │ 'ingress' │ undefined │ [ 'remote.machine' ] │ 0 │ 'Ansible is more specialized. Also using provisioners is a "last resort".' │
+│ 13 │ 'ansible' │ 'mysql.database' │ undefined │ [ 'mysql.dbms', 'docker.engine', 'local.machine' ] │ 1 │ 'Primary use case due to the specialization of Ansible.' │
+│ 14 │ 'compose' │ 'mysql.database' │ undefined │ [ 'mysql.dbms', 'docker.engine', 'local.machine' ] │ 0 │ 'One-time use docker container ("fake Kubernetes job") with imperative parts, while other technologies provide declarative modules.' │
+│ 15 │ 'terraform' │ 'mysql.database' │ undefined │ [ 'mysql.dbms', 'docker.engine', 'local.machine' ] │ 1 │ 'Terraform provides a declarative module.' │
+│ 16 │ 'ansible' │ 'mysql.database' │ undefined │ [ 'mysql.dbms', 'docker.engine', 'remote.machine' ] │ 1 │ 'Primary use case due to the specialization of Ansible.' │
+│ 17 │ 'compose' │ 'mysql.database' │ undefined │ [ 'mysql.dbms', 'docker.engine', 'remote.machine' ] │ 0 │ 'One-time use docker container ("fake Kubernetes job") with imperative parts, while other technologies provide declarative modules.' │
+│ 18 │ 'terraform' │ 'mysql.database' │ undefined │ [ 'mysql.dbms', 'docker.engine', 'remote.machine' ] │ 0.75 │ 'Terraform provides a declarative module. However, Terraform requires an SSH workaround. Ansible is more specialized.' │
+│ 19 │ 'ansible' │ 'mysql.database' │ undefined │ [ 'mysql.dbms', 'gcp.cloudsql' ] │ 0 │ 'Primary use case due to the specialization of Ansible. However, need to install and handle GCP CloudSQL Proxy, while the corresponding Terraform module already provides this.' │
+│ 20 │ 'terraform' │ 'mysql.database' │ undefined │ [ 'mysql.dbms', 'gcp.cloudsql' ] │ 1 │ 'Terraform provides a declarative module.' │
+│ 21 │ 'ansible' │ 'mysql.database' │ undefined │ [ 'mysql.dbms', 'kubernetes.cluster' ] │ 1 │ 'Primary use case due to the specialization of Ansible.' │
+│ 22 │ 'kubernetes' │ 'mysql.database' │ undefined │ [ 'mysql.dbms', 'kubernetes.cluster' ] │ 0 │ 'Kubernetes Job with imperative parts, while declarative other technologies provide declarative modules.' │
+│ 23 │ 'terraform' │ 'mysql.database' │ undefined │ [ 'mysql.dbms', 'kubernetes.cluster' ] │ 0.25 │ 'Ansible is more specialized.' │
+│ 24 │ 'ansible' │ 'mysql.database' │ undefined │ [ 'mysql.dbms', 'local.machine' ] │ 1 │ 'Primary use case due to the specialization of Ansible.' │
+│ 25 │ 'terraform' │ 'mysql.database' │ undefined │ [ 'mysql.dbms', 'local.machine' ] │ 1 │ 'Terraform provides a declarative module.' │
+│ 26 │ 'ansible' │ 'mysql.database' │ undefined │ [ 'mysql.dbms', 'remote.machine' ] │ 1 │ 'Primary use case due to the specialization of Ansible.' │
+│ 27 │ 'terraform' │ 'mysql.database' │ undefined │ [ 'mysql.dbms', 'remote.machine' ] │ 0.5 │ 'Terraform provides a declarative module. However, Terraform requires an SSH workaround. Ansible is more specialized.' │
+│ 28 │ 'ansible' │ 'mysql.dbms' │ 'dbms.image' │ [ 'docker.engine', 'local.machine' ] │ 0.5 │ 'Docker Compose is more specialized' │
+│ 29 │ 'compose' │ 'mysql.dbms' │ 'dbms.image' │ [ 'docker.engine', 'local.machine' ] │ 1 │ 'Docker is the underlying technology.' │
+│ 30 │ 'terraform' │ 'mysql.dbms' │ 'dbms.image' │ [ 'docker.engine', 'local.machine' ] │ 0.5 │ 'Docker Compose is more specialized.' │
+│ 31 │ 'ansible' │ 'mysql.dbms' │ 'dbms.image' │ [ 'docker.engine', 'remote.machine' ] │ 0.5 │ 'Docker Compose is more specialized' │
+│ 32 │ 'compose' │ 'mysql.dbms' │ 'dbms.image' │ [ 'docker.engine', 'remote.machine' ] │ 1 │ 'Docker is the underlying technology.' │
+│ 33 │ 'terraform' │ 'mysql.dbms' │ 'dbms.image' │ [ 'docker.engine', 'remote.machine' ] │ 0.5 │ 'Docker Compose is more specialized.' │
+│ 34 │ 'ansible' │ 'mysql.dbms' │ 'dbms.image' │ [ 'gcp.cloudsql' ] │ 0 │ 'Primary use case due to the specialization of Ansible.' │
+│ 35 │ 'terraform' │ 'mysql.dbms' │ 'dbms.image' │ [ 'gcp.cloudsql' ] │ 1 │ 'Terraform provides a declarative module.' │
+│ 36 │ 'ansible' │ 'mysql.dbms' │ 'dbms.image' │ [ 'kubernetes.cluster' ] │ 0.5 │ 'Kubernetes is more specialized.' │
+│ 37 │ 'kubernetes' │ 'mysql.dbms' │ 'dbms.image' │ [ 'kubernetes.cluster' ] │ 1 │ 'Kubernetes is the underlying technology.' │
+│ 38 │ 'terraform' │ 'mysql.dbms' │ 'dbms.image' │ [ 'kubernetes.cluster' ] │ 0.5 │ 'Kubernetes is more specialized.' │
+│ 39 │ 'ansible' │ 'mysql.dbms' │ 'dbms.image' │ [ 'local.machine' ] │ 1 │ 'Primary use case due to the specialization of Ansible.' │
+│ 40 │ 'terraform' │ 'mysql.dbms' │ 'dbms.image' │ [ 'local.machine' ] │ 0 │ 'Ansible is more specialized. Also using provisioners is a "last resort".' │
+│ 41 │ 'ansible' │ 'mysql.dbms' │ 'dbms.image' │ [ 'remote.machine' ] │ 1 │ 'Primary use case due to the specialization of Ansible.' │
+│ 42 │ 'terraform' │ 'mysql.dbms' │ 'dbms.image' │ [ 'remote.machine' ] │ 0 │ 'Ansible is more specialized. Also using provisioners is a "last resort".' │
+│ 43 │ 'ansible' │ 'object.storage' │ undefined │ [ 'gcp.cloudstorage' ] │ 0 │ 'Primary use case due to the specialization of Ansible.' │
+│ 44 │ 'terraform' │ 'object.storage' │ undefined │ [ 'gcp.cloudstorage' ] │ 1 │ 'Terraform provides a declarative module.' │
+│ 45 │ 'ansible' │ 'object.storage' │ undefined │ [ 'minio.server', 'docker.engine', 'local.machine' ] │ 1 │ 'Primary use case due to the specialization of Ansible.' │
+│ 46 │ 'compose' │ 'object.storage' │ undefined │ [ 'minio.server', 'docker.engine', 'local.machine' ] │ 0 │ 'One-time use docker container ("fake Kubernetes job") with imperative parts, while other technologies provide declarative modules.' │
+│ 47 │ 'terraform' │ 'object.storage' │ undefined │ [ 'minio.server', 'docker.engine', 'local.machine' ] │ 1 │ 'Terraform provides a declarative module.' │
+│ 48 │ 'ansible' │ 'object.storage' │ undefined │ [ 'minio.server', 'docker.engine', 'remote.machine' ] │ 1 │ 'Primary use case due to the specialization of Ansible.' │
+│ 49 │ 'compose' │ 'object.storage' │ undefined │ [ 'minio.server', 'docker.engine', 'remote.machine' ] │ 0 │ 'One-time use docker container ("fake Kubernetes job") with imperative parts, while other technologies provide declarative modules.' │
+│ 50 │ 'terraform' │ 'object.storage' │ undefined │ [ 'minio.server', 'docker.engine', 'remote.machine' ] │ 0.75 │ 'Terraform provides a declarative module. However, Terraform requires an SSH workaround. Ansible is more specialized.' │
+│ 51 │ 'ansible' │ 'object.storage' │ undefined │ [ 'minio.server', 'kubernetes.cluster' ] │ 1 │ 'Primary use case due to the specialization of Ansible.' │
+│ 52 │ 'kubernetes' │ 'object.storage' │ undefined │ [ 'minio.server', 'kubernetes.cluster' ] │ 0 │ 'Kubernetes Job with imperative parts, while declarative other technologies provide declarative modules.' │
+│ 53 │ 'terraform' │ 'object.storage' │ undefined │ [ 'minio.server', 'kubernetes.cluster' ] │ 0.25 │ 'Ansible is more specialized.' │
+│ 54 │ 'ansible' │ 'redis.server' │ 'cache.image' │ [ 'docker.engine', 'local.machine' ] │ 0.5 │ 'Docker Compose is more specialized.' │
+│ 55 │ 'compose' │ 'redis.server' │ 'cache.image' │ [ 'docker.engine', 'local.machine' ] │ 1 │ 'Docker is the underlying technology.' │
+│ 56 │ 'terraform' │ 'redis.server' │ 'cache.image' │ [ 'docker.engine', 'local.machine' ] │ 0.5 │ 'Docker Compose is more specialized.' │
+│ 57 │ 'ansible' │ 'redis.server' │ 'cache.image' │ [ 'docker.engine', 'remote.machine' ] │ 0.5 │ 'Docker Compose is more specialized.' │
+│ 58 │ 'compose' │ 'redis.server' │ 'cache.image' │ [ 'docker.engine', 'remote.machine' ] │ 1 │ 'Docker is the underlying technology.' │
+│ 59 │ 'terraform' │ 'redis.server' │ 'cache.image' │ [ 'docker.engine', 'remote.machine' ] │ 0.5 │ 'Docker Compose is more specialized.' │
+│ 60 │ 'ansible' │ 'redis.server' │ 'cache.image' │ [ 'gcp.memorystore' ] │ 0 │ 'Primary use case due to the specialization of Ansible.' │
+│ 61 │ 'terraform' │ 'redis.server' │ 'cache.image' │ [ 'gcp.memorystore' ] │ 1 │ 'Terraform provides a declarative module.' │
+│ 62 │ 'ansible' │ 'redis.server' │ 'cache.image' │ [ 'kubernetes.cluster' ] │ 0.5 │ 'Kubernetes is more specialized.' │
+│ 63 │ 'kubernetes' │ 'redis.server' │ 'cache.image' │ [ 'kubernetes.cluster' ] │ 1 │ 'Kubernetes is the underlying technology.' │
+│ 64 │ 'terraform' │ 'redis.server' │ 'cache.image' │ [ 'kubernetes.cluster' ] │ 0.5 │ 'Kubernetes is more specialized.' │
+│ 65 │ 'ansible' │ 'service.application' │ 'docker.image' │ [ 'docker.engine', 'local.machine' ] │ 0.5 │ 'Docker Compose is more specialized.' │
+│ 66 │ 'compose' │ 'service.application' │ 'docker.image' │ [ 'docker.engine', 'local.machine' ] │ 1 │ 'Docker is the underlying technology.' │
+│ 67 │ 'terraform' │ 'service.application' │ 'docker.image' │ [ 'docker.engine', 'local.machine' ] │ 0.5 │ 'Docker Compose is more specialized.' │
+│ 68 │ 'ansible' │ 'service.application' │ 'docker.image' │ [ 'docker.engine', 'remote.machine' ] │ 0.5 │ 'Docker Compose is more specialized.' │
+│ 69 │ 'compose' │ 'service.application' │ 'docker.image' │ [ 'docker.engine', 'remote.machine' ] │ 1 │ 'Docker is the underlying technology.' │
+│ 70 │ 'terraform' │ 'service.application' │ 'docker.image' │ [ 'docker.engine', 'remote.machine' ] │ 0.5 │ 'Docker Compose is more specialized.' │
+│ 71 │ 'ansible' │ 'service.application' │ 'docker.image' │ [ 'gcp.cloudrun' ] │ 0 │ 'Custom module with imperative parts, while Terraform provides a declarative module.' │
+│ 72 │ 'terraform' │ 'service.application' │ 'docker.image' │ [ 'gcp.cloudrun' ] │ 1 │ 'Terraform provides a declarative module.' │
+│ 73 │ 'ansible' │ 'service.application' │ 'docker.image' │ [ 'kubernetes.cluster' ] │ 0.5 │ 'Kubernetes is more specialized.' │
+│ 74 │ 'kubernetes' │ 'service.application' │ 'docker.image' │ [ 'kubernetes.cluster' ] │ 1 │ 'Kubernetes is the underlying technology.' │
+│ 75 │ 'terraform' │ 'service.application' │ 'docker.image' │ [ 'kubernetes.cluster' ] │ 0.5 │ 'Kubernetes is more specialized.' │
+│ 76 │ 'ansible' │ 'service.application' │ 'tar.archive' │ [ '*', 'local.machine' ] │ 1 │ 'Primary use case due to the specialization of Ansible. Special integration for systemd.' │
+│ 77 │ 'terraform' │ 'service.application' │ 'tar.archive' │ [ '*', 'local.machine' ] │ 0 │ 'Ansible is more specialized. Also using provisioners is a "last resort".' │
+│ 78 │ 'ansible' │ 'service.application' │ 'tar.archive' │ [ '*', 'remote.machine' ] │ 1 │ 'Primary use case due to the specialization of Ansible. Special integration for systemd.' │
+│ 79 │ 'terraform' │ 'service.application' │ 'tar.archive' │ [ '*', 'remote.machine' ] │ 0 │ 'Ansible is more specialized. Also using provisioners is a "last resort".' │
+│ 80 │ 'ansible' │ 'service.application' │ 'zip.archive' │ [ '*', 'local.machine' ] │ 1 │ 'Primary use case due to the specialization of Ansible. Special integration for systemd.' │
+│ 81 │ 'terraform' │ 'service.application' │ 'zip.archive' │ [ '*', 'local.machine' ] │ 0 │ 'Ansible is more specialized. Also using provisioners is a "last resort".' │
+│ 82 │ 'ansible' │ 'service.application' │ 'zip.archive' │ [ '*', 'remote.machine' ] │ 1 │ 'Primary use case due to the specialization of Ansible. Special integration for systemd.' │
+│ 83 │ 'terraform' │ 'service.application' │ 'zip.archive' │ [ '*', 'remote.machine' ] │ 0 │ 'Ansible is more specialized. Also using provisioners is a "last resort".' │
+│ 84 │ 'ansible' │ 'service.application' │ 'zip.archive' │ [ 'gcp.appengine' ] │ 0 │ 'Custom module with imperative parts, while Terraform provides a declarative module.' │
+│ 85 │ 'terraform' │ 'service.application' │ 'zip.archive' │ [ 'gcp.appengine' ] │ 1 │ 'Terraform provides a declarative module.' │
+│ 86 │ 'ansible' │ 'software.application' │ 'apt.package' │ [ '*', 'local.machine' ] │ 1 │ 'Primary use case due to the specialization of Ansible.' │
+│ 87 │ 'terraform' │ 'software.application' │ 'apt.package' │ [ '*', 'local.machine' ] │ 0 │ 'Ansible is more specialized. Also using provisioners is a "last resort".' │
+│ 88 │ 'ansible' │ 'software.application' │ 'apt.package' │ [ '*', 'remote.machine' ] │ 1 │ 'Primary use case due to the specialization of Ansible.' │
+│ 89 │ 'terraform' │ 'software.application' │ 'apt.package' │ [ '*', 'remote.machine' ] │ 0 │ 'Ansible is more specialized. Also using provisioners is a "last resort".' │
+│ 90 │ 'ansible' │ 'software.application' │ 'tar.archive' │ [ '*', 'local.machine' ] │ 1 │ 'While this is a primary use case due to the specialization of Ansible, we must rely on scripts. More specialized types should be used, e.g., service.application.' │
+│ 91 │ 'terraform' │ 'software.application' │ 'tar.archive' │ [ '*', 'local.machine' ] │ 0 │ 'Ansible is more specialized. Also using provisioners is a "last resort".' │
+│ 92 │ 'ansible' │ 'software.application' │ 'tar.archive' │ [ '*', 'remote.machine' ] │ 1 │ 'While this is a primary use case due to the specialization of Ansible, we must rely on scripts. More specialized types should be used, e.g., "service.application".' │
+│ 93 │ 'terraform' │ 'software.application' │ 'tar.archive' │ [ '*', 'remote.machine' ] │ 0 │ 'Ansible is more specialized. Also using provisioners is a "last resort".' │
+│ 94 │ 'ansible' │ 'software.application' │ 'zip.archive' │ [ '*', 'local.machine' ] │ 1 │ 'While this is a primary use case due to the specialization of Ansible, we must rely on scripts. More specialized types should be used, e.g., service.application.' │
+│ 95 │ 'terraform' │ 'software.application' │ 'zip.archive' │ [ '*', 'local.machine' ] │ 0 │ 'Ansible is more specialized. Also using provisioners is a "last resort".' │
+│ 96 │ 'ansible' │ 'software.application' │ 'zip.archive' │ [ '*', 'remote.machine' ] │ 1 │ 'While this is a primary use case due to the specialization of Ansible, we must rely on scripts. More specialized types should be used, e.g., service.application.' │
+│ 97 │ 'terraform' │ 'software.application' │ 'zip.archive' │ [ '*', 'remote.machine' ] │ 0 │ 'Ansible is more specialized. Also using provisioners is a "last resort".' │
+│ 98 │ 'ansible' │ 'virtual.machine' │ 'machine.image' │ [ 'openstack.provider' ] │ 0.5 │ 'Terraform is more specialized.' │
+│ 99 │ 'terraform' │ 'virtual.machine' │ 'machine.image' │ [ 'openstack.provider' ] │ 1 │ 'Terraform provides a declarative module.' │
+└─────────┴──────────────┴────────────────────────┴─────────────────┴───────────────────────────────────────────────────────┴─────────┴──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
+
+Metrics relevant when modeling the different scenarios
+┌─────────┬────────────────────────────┬────────┬──────────┬────────────┬────────────────────────┬───────────────┐
+│ (index) │ scenario │ models │ elements │ conditions │ technology_assignments │ lines_of_code │
+├─────────┼────────────────────────────┼────────┼──────────┼────────────┼────────────────────────┼───────────────┤
+│ 0 │ 'EDMM "gcp"' │ 1 │ 212 │ 76 │ 14 │ 325 │
+│ 1 │ 'EDMM "kubernetes"' │ 1 │ 235 │ 84 │ 14 │ 355 │
+│ 2 │ 'EDMM "os-medium"' │ 1 │ 281 │ 100 │ 18 │ 421 │
+│ 3 │ 'EDMM "os-large"' │ 1 │ 281 │ 100 │ 18 │ 421 │
+│ 4 │ 'EDMM Total' │ 4 │ 1009 │ 360 │ 64 │ 1522 │
+│ 5 │ 'VDMM Baseline Original' │ 1 │ 504 │ 210 │ 32 │ 768 │
+│ 6 │ 'VDMM+ Original Manual' │ 1 │ 313 │ 149 │ 32 │ 588 │
+│ 7 │ 'VDMM+ Original Automated' │ 1 │ 340 │ 131 │ 0 │ 562 │
+└─────────┴────────────────────────────┴────────┴──────────┴────────────┴────────────────────────┴───────────────┘
+
+Absolute diff when modeling the different original scenarios
+┌─────────┬─────────────────────────────────────────────────────┬─────────────────┬───────────────────┬─────────────────────┬─────────────────────────────────┬────────────────────────┐
+│ (index) │ scenario │ models_abs_diff │ elements_abs_diff │ conditions_abs_diff │ technology_assignments_abs_diff │ lines_of_code_abs_diff │
+├─────────┼─────────────────────────────────────────────────────┼─────────────────┼───────────────────┼─────────────────────┼─────────────────────────────────┼────────────────────────┤
+│ 0 │ 'VDMM Baseline Original - EDMM Total' │ -3 │ -505 │ -150 │ -32 │ -754 │
+│ 1 │ 'VDMM+ Original Manual - VDMM Baseline Original' │ 0 │ -191 │ -61 │ 0 │ -180 │
+│ 2 │ 'VDMM+ Original Automated - VDMM Baseline Original' │ 0 │ -164 │ -79 │ -32 │ -206 │
+└─────────┴─────────────────────────────────────────────────────┴─────────────────┴───────────────────┴─────────────────────┴─────────────────────────────────┴────────────────────────┘
+
+Relative diff when modeling the different original scenarios
+┌─────────┬─────────────────────────────────────────────────────┬─────────────────┬───────────────────┬─────────────────────┬─────────────────────────────────┬────────────────────────┐
+│ (index) │ scenario │ models_rel_diff │ elements_rel_diff │ conditions_rel_diff │ technology_assignments_rel_diff │ lines_of_code_rel_diff │
+├─────────┼─────────────────────────────────────────────────────┼─────────────────┼───────────────────┼─────────────────────┼─────────────────────────────────┼────────────────────────┤
+│ 0 │ 'VDMM Baseline Original / EDMM Total' │ 0.25 │ 0.5 │ 0.58 │ 0.5 │ 0.5 │
+│ 1 │ 'VDMM+ Original Manual / VDMM Baseline Original' │ 1 │ 0.62 │ 0.71 │ 1 │ 0.77 │
+│ 2 │ 'VDMM+ Original Automated / VDMM Baseline Original' │ 1 │ 0.67 │ 0.62 │ 0 │ 0.73 │
+└─────────┴─────────────────────────────────────────────────────┴─────────────────┴───────────────────┴─────────────────────┴─────────────────────────────────┴────────────────────────┘
+
+Qualities of the derived deployment models, i.e., the deployment variants, of the different scenarios ranging from bad (0) to good (1).
+┌─────────┬──────────────┬────────────┬───────────────────────────────────┬───────────────────────────────────┬──────────────────────────────────────┬────────────┬──────────────────┐
+│ (index) │ scenario │ expert │ non_expert │ random │ counting │ quality │ quality_counting │
+├─────────┼──────────────┼────────────┼───────────────────────────────────┼───────────────────────────────────┼──────────────────────────────────────┼────────────┼──────────────────┤
+│ 0 │ 'gcp' │ 'good (1)' │ [ 'bad (0)', 'good (1)' ] │ [ 'bad (0)', 'good (1)' ] │ [ 'bad (0)', 'good (1)' ] │ 'good (1)' │ 'good (1)' │
+│ 1 │ 'kubernetes' │ 'good (1)' │ [ 'moderate (0.46)', 'good (1)' ] │ [ 'moderate (0.46)', 'good (1)' ] │ [ 'moderate (0.48)', 'good (0.93)' ] │ 'good (1)' │ 'good (1)' │
+│ 2 │ 'os-medium' │ 'good (1)' │ [ 'poor (0.34)', 'good (1)' ] │ [ 'poor (0.34)', 'good (1)' ] │ [ 'moderate (0.41)', 'fair (0.66)' ] │ 'good (1)' │ 'good (1)' │
+│ 3 │ 'os-large' │ 'good (1)' │ [ 'poor (0.34)', 'good (1)' ] │ [ 'poor (0.34)', 'good (1)' ] │ [ 'moderate (0.41)', 'fair (0.66)' ] │ 'good (1)' │ 'good (1)' │
+└─────────┴──────────────┴────────────┴───────────────────────────────────┴───────────────────────────────────┴──────────────────────────────────────┴────────────┴──────────────────┘
+
+Metrics relevant when modeling the maintenance scenario of our case study
+┌─────────┬───────────────────────────────┬────────┬──────────┬────────────┬────────────────────────┬───────────────┐
+│ (index) │ scenario │ models │ elements │ conditions │ technology_assignments │ lines_of_code │
+├─────────┼───────────────────────────────┼────────┼──────────┼────────────┼────────────────────────┼───────────────┤
+│ 0 │ 'VDMM Baseline Maintenance' │ 1 │ 780 │ 336 │ 47 │ 1162 │
+│ 1 │ 'VDMM+ Maintenance Manual' │ 1 │ 363 │ 183 │ 47 │ 703 │
+│ 2 │ 'VDMM+ Maintenance Automated' │ 1 │ 363 │ 142 │ 0 │ 599 │
+└─────────┴───────────────────────────────┴────────┴──────────┴────────────┴────────────────────────┴───────────────┘
+
+Absolute diff from original to maintained
+┌─────────┬──────────────────────────────────────────────────────────┬─────────────────┬───────────────────┬─────────────────────┬─────────────────────────────────┬────────────────────────┐
+│ (index) │ scenario │ models_abs_diff │ elements_abs_diff │ conditions_abs_diff │ technology_assignments_abs_diff │ lines_of_code_abs_diff │
+├─────────┼──────────────────────────────────────────────────────────┼─────────────────┼───────────────────┼─────────────────────┼─────────────────────────────────┼────────────────────────┤
+│ 0 │ 'VDMM Baseline Maintenance - VDMM Baseline Original' │ 0 │ 276 │ 126 │ 15 │ 394 │
+│ 1 │ 'VDMM+ Maintenance Manual - VDMM+ Original Manual' │ 0 │ 50 │ 34 │ 15 │ 115 │
+│ 2 │ 'VDMM+ Maintenance Automated - VDMM+ Original Automated' │ 0 │ 23 │ 11 │ 0 │ 37 │
+└─────────┴──────────────────────────────────────────────────────────┴─────────────────┴───────────────────┴─────────────────────┴─────────────────────────────────┴────────────────────────┘
+
+Relative diff from the absolute diff from original to maintained
+┌─────────┬───────────────────────────────────────────────────────────────────────────────────────────────────────────────────┬─────────────────┬───────────────────┬─────────────────────┬─────────────────────────────────┬────────────────────────┐
+│ (index) │ scenario │ models_rel_diff │ elements_rel_diff │ conditions_rel_diff │ technology_assignments_rel_diff │ lines_of_code_rel_diff │
+├─────────┼───────────────────────────────────────────────────────────────────────────────────────────────────────────────────┼─────────────────┼───────────────────┼─────────────────────┼─────────────────────────────────┼────────────────────────┤
+│ 0 │ '(VDMM+ Maintenance Manual - VDMM+ Original Manual) / (VDMM Baseline Maintenance - VDMM Baseline Original)' │ 1 │ 0.18 │ 0.27 │ 1 │ 0.29 │
+│ 1 │ '(VDMM+ Maintenance Automated - VDMM+ Original Automated) / (VDMM Baseline Maintenance - VDMM Baseline Original)' │ 1 │ 0.08 │ 0.09 │ 0 │ 0.09 │
+└─────────┴───────────────────────────────────────────────────────────────────────────────────────────────────────────────────┴─────────────────┴───────────────────┴─────────────────────┴─────────────────────────────────┴────────────────────────┘
+
+CAUTION: Is this case study running with the latest implementation?
diff --git a/examples/unfurl-technology---boutique---plus-maintenance-automated/scripts/sutdy-011.txt b/examples/unfurl-technology---boutique---plus-maintenance-automated/scripts/sutdy-011.txt
new file mode 100644
index 0000000000..2d5d31f664
--- /dev/null
+++ b/examples/unfurl-technology---boutique---plus-maintenance-automated/scripts/sutdy-011.txt
@@ -0,0 +1,176 @@
+
+The technology rules of our case study. Qualities range from bad (0) to good (1).
+┌─────────┬──────────────┬────────────────────────┬─────────────────┬───────────────────────────────────────────────────────┬─────────┬──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
+│ (index) │ Technology │ Component │ Artifact │ Hosting │ Quality │ Reason │
+├─────────┼──────────────┼────────────────────────┼─────────────────┼───────────────────────────────────────────────────────┼─────────┼──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤
+│ 0 │ 'ansible' │ 'docker.engine' │ undefined │ [ 'local.machine' ] │ 1 │ 'Primary use case due to the specialization of Ansible.' │
+│ 1 │ 'terraform' │ 'docker.engine' │ undefined │ [ 'local.machine' ] │ 0 │ 'Ansible is more specialized. Also using provisioners is a "last resort".' │
+│ 2 │ 'ansible' │ 'docker.engine' │ undefined │ [ 'remote.machine' ] │ 1 │ 'Primary use case due to the specialization of Ansible.' │
+│ 3 │ 'terraform' │ 'docker.engine' │ undefined │ [ 'remote.machine' ] │ 0 │ 'Ansible is more specialized. Also using provisioners is a "last resort".' │
+│ 4 │ 'ansible' │ 'gcp.service' │ undefined │ [] │ 0 │ 'Ansible provides a declarative module' │
+│ 5 │ 'terraform' │ 'gcp.service' │ undefined │ [] │ 1 │ 'Terraform provides a declarative module.' │
+│ 6 │ 'ansible' │ 'ingress' │ undefined │ [ 'kubernetes.cluster' ] │ 0.5 │ 'Kubernetes is more specialized.' │
+│ 7 │ 'kubernetes' │ 'ingress' │ undefined │ [ 'kubernetes.cluster' ] │ 1 │ 'Kubernetes is the underlying technology.' │
+│ 8 │ 'terraform' │ 'ingress' │ undefined │ [ 'kubernetes.cluster' ] │ 0.5 │ 'Kubernetes is more specialized.' │
+│ 9 │ 'ansible' │ 'ingress' │ undefined │ [ 'local.machine' ] │ 1 │ 'Primary use case due to the specialization of Ansible.' │
+│ 10 │ 'terraform' │ 'ingress' │ undefined │ [ 'local.machine' ] │ 0 │ 'Ansible is more specialized. Also using provisioners is a "last resort".' │
+│ 11 │ 'ansible' │ 'ingress' │ undefined │ [ 'remote.machine' ] │ 1 │ 'Primary use case due to the specialization of Ansible.' │
+│ 12 │ 'terraform' │ 'ingress' │ undefined │ [ 'remote.machine' ] │ 0 │ 'Ansible is more specialized. Also using provisioners is a "last resort".' │
+│ 13 │ 'ansible' │ 'mysql.database' │ undefined │ [ 'mysql.dbms', 'docker.engine', 'local.machine' ] │ 1 │ 'Primary use case due to the specialization of Ansible.' │
+│ 14 │ 'compose' │ 'mysql.database' │ undefined │ [ 'mysql.dbms', 'docker.engine', 'local.machine' ] │ 0 │ 'One-time use docker container ("fake Kubernetes job") with imperative parts, while other technologies provide declarative modules.' │
+│ 15 │ 'terraform' │ 'mysql.database' │ undefined │ [ 'mysql.dbms', 'docker.engine', 'local.machine' ] │ 1 │ 'Terraform provides a declarative module.' │
+│ 16 │ 'ansible' │ 'mysql.database' │ undefined │ [ 'mysql.dbms', 'docker.engine', 'remote.machine' ] │ 1 │ 'Primary use case due to the specialization of Ansible.' │
+│ 17 │ 'compose' │ 'mysql.database' │ undefined │ [ 'mysql.dbms', 'docker.engine', 'remote.machine' ] │ 0 │ 'One-time use docker container ("fake Kubernetes job") with imperative parts, while other technologies provide declarative modules.' │
+│ 18 │ 'terraform' │ 'mysql.database' │ undefined │ [ 'mysql.dbms', 'docker.engine', 'remote.machine' ] │ 0.75 │ 'Terraform provides a declarative module. However, Terraform requires an SSH workaround. Ansible is more specialized.' │
+│ 19 │ 'ansible' │ 'mysql.database' │ undefined │ [ 'mysql.dbms', 'gcp.cloudsql' ] │ 0 │ 'Primary use case due to the specialization of Ansible. However, need to install and handle GCP CloudSQL Proxy, while the corresponding Terraform module already provides this.' │
+│ 20 │ 'terraform' │ 'mysql.database' │ undefined │ [ 'mysql.dbms', 'gcp.cloudsql' ] │ 1 │ 'Terraform provides a declarative module.' │
+│ 21 │ 'ansible' │ 'mysql.database' │ undefined │ [ 'mysql.dbms', 'kubernetes.cluster' ] │ 1 │ 'Primary use case due to the specialization of Ansible.' │
+│ 22 │ 'kubernetes' │ 'mysql.database' │ undefined │ [ 'mysql.dbms', 'kubernetes.cluster' ] │ 0 │ 'Kubernetes Job with imperative parts, while declarative other technologies provide declarative modules.' │
+│ 23 │ 'terraform' │ 'mysql.database' │ undefined │ [ 'mysql.dbms', 'kubernetes.cluster' ] │ 0.25 │ 'Ansible is more specialized.' │
+│ 24 │ 'ansible' │ 'mysql.database' │ undefined │ [ 'mysql.dbms', 'local.machine' ] │ 1 │ 'Primary use case due to the specialization of Ansible.' │
+│ 25 │ 'terraform' │ 'mysql.database' │ undefined │ [ 'mysql.dbms', 'local.machine' ] │ 1 │ 'Terraform provides a declarative module.' │
+│ 26 │ 'ansible' │ 'mysql.database' │ undefined │ [ 'mysql.dbms', 'remote.machine' ] │ 1 │ 'Primary use case due to the specialization of Ansible.' │
+│ 27 │ 'terraform' │ 'mysql.database' │ undefined │ [ 'mysql.dbms', 'remote.machine' ] │ 0.5 │ 'Terraform provides a declarative module. However, Terraform requires an SSH workaround. Ansible is more specialized.' │
+│ 28 │ 'ansible' │ 'mysql.dbms' │ 'dbms.image' │ [ 'docker.engine', 'local.machine' ] │ 0.5 │ 'Docker Compose is more specialized' │
+│ 29 │ 'compose' │ 'mysql.dbms' │ 'dbms.image' │ [ 'docker.engine', 'local.machine' ] │ 1 │ 'Docker is the underlying technology.' │
+│ 30 │ 'terraform' │ 'mysql.dbms' │ 'dbms.image' │ [ 'docker.engine', 'local.machine' ] │ 0.5 │ 'Docker Compose is more specialized.' │
+│ 31 │ 'ansible' │ 'mysql.dbms' │ 'dbms.image' │ [ 'docker.engine', 'remote.machine' ] │ 0.5 │ 'Docker Compose is more specialized' │
+│ 32 │ 'compose' │ 'mysql.dbms' │ 'dbms.image' │ [ 'docker.engine', 'remote.machine' ] │ 1 │ 'Docker is the underlying technology.' │
+│ 33 │ 'terraform' │ 'mysql.dbms' │ 'dbms.image' │ [ 'docker.engine', 'remote.machine' ] │ 0.5 │ 'Docker Compose is more specialized.' │
+│ 34 │ 'ansible' │ 'mysql.dbms' │ 'dbms.image' │ [ 'gcp.cloudsql' ] │ 0 │ 'Primary use case due to the specialization of Ansible.' │
+│ 35 │ 'terraform' │ 'mysql.dbms' │ 'dbms.image' │ [ 'gcp.cloudsql' ] │ 1 │ 'Terraform provides a declarative module.' │
+│ 36 │ 'ansible' │ 'mysql.dbms' │ 'dbms.image' │ [ 'kubernetes.cluster' ] │ 0.5 │ 'Kubernetes is more specialized.' │
+│ 37 │ 'kubernetes' │ 'mysql.dbms' │ 'dbms.image' │ [ 'kubernetes.cluster' ] │ 1 │ 'Kubernetes is the underlying technology.' │
+│ 38 │ 'terraform' │ 'mysql.dbms' │ 'dbms.image' │ [ 'kubernetes.cluster' ] │ 0.5 │ 'Kubernetes is more specialized.' │
+│ 39 │ 'ansible' │ 'mysql.dbms' │ 'dbms.image' │ [ 'local.machine' ] │ 1 │ 'Primary use case due to the specialization of Ansible.' │
+│ 40 │ 'terraform' │ 'mysql.dbms' │ 'dbms.image' │ [ 'local.machine' ] │ 0 │ 'Ansible is more specialized. Also using provisioners is a "last resort".' │
+│ 41 │ 'ansible' │ 'mysql.dbms' │ 'dbms.image' │ [ 'remote.machine' ] │ 1 │ 'Primary use case due to the specialization of Ansible.' │
+│ 42 │ 'terraform' │ 'mysql.dbms' │ 'dbms.image' │ [ 'remote.machine' ] │ 0 │ 'Ansible is more specialized. Also using provisioners is a "last resort".' │
+│ 43 │ 'ansible' │ 'object.storage' │ undefined │ [ 'gcp.cloudstorage' ] │ 0 │ 'Primary use case due to the specialization of Ansible.' │
+│ 44 │ 'terraform' │ 'object.storage' │ undefined │ [ 'gcp.cloudstorage' ] │ 1 │ 'Terraform provides a declarative module.' │
+│ 45 │ 'ansible' │ 'object.storage' │ undefined │ [ 'minio.server', 'docker.engine', 'local.machine' ] │ 1 │ 'Primary use case due to the specialization of Ansible.' │
+│ 46 │ 'compose' │ 'object.storage' │ undefined │ [ 'minio.server', 'docker.engine', 'local.machine' ] │ 0 │ 'One-time use docker container ("fake Kubernetes job") with imperative parts, while other technologies provide declarative modules.' │
+│ 47 │ 'terraform' │ 'object.storage' │ undefined │ [ 'minio.server', 'docker.engine', 'local.machine' ] │ 1 │ 'Terraform provides a declarative module.' │
+│ 48 │ 'ansible' │ 'object.storage' │ undefined │ [ 'minio.server', 'docker.engine', 'remote.machine' ] │ 1 │ 'Primary use case due to the specialization of Ansible.' │
+│ 49 │ 'compose' │ 'object.storage' │ undefined │ [ 'minio.server', 'docker.engine', 'remote.machine' ] │ 0 │ 'One-time use docker container ("fake Kubernetes job") with imperative parts, while other technologies provide declarative modules.' │
+│ 50 │ 'terraform' │ 'object.storage' │ undefined │ [ 'minio.server', 'docker.engine', 'remote.machine' ] │ 0.75 │ 'Terraform provides a declarative module. However, Terraform requires an SSH workaround. Ansible is more specialized.' │
+│ 51 │ 'ansible' │ 'object.storage' │ undefined │ [ 'minio.server', 'kubernetes.cluster' ] │ 1 │ 'Primary use case due to the specialization of Ansible.' │
+│ 52 │ 'kubernetes' │ 'object.storage' │ undefined │ [ 'minio.server', 'kubernetes.cluster' ] │ 0 │ 'Kubernetes Job with imperative parts, while declarative other technologies provide declarative modules.' │
+│ 53 │ 'terraform' │ 'object.storage' │ undefined │ [ 'minio.server', 'kubernetes.cluster' ] │ 0.25 │ 'Ansible is more specialized.' │
+│ 54 │ 'ansible' │ 'redis.server' │ 'cache.image' │ [ 'docker.engine', 'local.machine' ] │ 0.5 │ 'Docker Compose is more specialized.' │
+│ 55 │ 'compose' │ 'redis.server' │ 'cache.image' │ [ 'docker.engine', 'local.machine' ] │ 1 │ 'Docker is the underlying technology.' │
+│ 56 │ 'terraform' │ 'redis.server' │ 'cache.image' │ [ 'docker.engine', 'local.machine' ] │ 0.5 │ 'Docker Compose is more specialized.' │
+│ 57 │ 'ansible' │ 'redis.server' │ 'cache.image' │ [ 'docker.engine', 'remote.machine' ] │ 0.5 │ 'Docker Compose is more specialized.' │
+│ 58 │ 'compose' │ 'redis.server' │ 'cache.image' │ [ 'docker.engine', 'remote.machine' ] │ 1 │ 'Docker is the underlying technology.' │
+│ 59 │ 'terraform' │ 'redis.server' │ 'cache.image' │ [ 'docker.engine', 'remote.machine' ] │ 0.5 │ 'Docker Compose is more specialized.' │
+│ 60 │ 'ansible' │ 'redis.server' │ 'cache.image' │ [ 'gcp.memorystore' ] │ 0 │ 'Primary use case due to the specialization of Ansible.' │
+│ 61 │ 'terraform' │ 'redis.server' │ 'cache.image' │ [ 'gcp.memorystore' ] │ 1 │ 'Terraform provides a declarative module.' │
+│ 62 │ 'ansible' │ 'redis.server' │ 'cache.image' │ [ 'kubernetes.cluster' ] │ 0.5 │ 'Kubernetes is more specialized.' │
+│ 63 │ 'kubernetes' │ 'redis.server' │ 'cache.image' │ [ 'kubernetes.cluster' ] │ 1 │ 'Kubernetes is the underlying technology.' │
+│ 64 │ 'terraform' │ 'redis.server' │ 'cache.image' │ [ 'kubernetes.cluster' ] │ 0.5 │ 'Kubernetes is more specialized.' │
+│ 65 │ 'ansible' │ 'service.application' │ 'docker.image' │ [ 'docker.engine', 'local.machine' ] │ 0.5 │ 'Docker Compose is more specialized.' │
+│ 66 │ 'compose' │ 'service.application' │ 'docker.image' │ [ 'docker.engine', 'local.machine' ] │ 1 │ 'Docker is the underlying technology.' │
+│ 67 │ 'terraform' │ 'service.application' │ 'docker.image' │ [ 'docker.engine', 'local.machine' ] │ 0.5 │ 'Docker Compose is more specialized.' │
+│ 68 │ 'ansible' │ 'service.application' │ 'docker.image' │ [ 'docker.engine', 'remote.machine' ] │ 0.5 │ 'Docker Compose is more specialized.' │
+│ 69 │ 'compose' │ 'service.application' │ 'docker.image' │ [ 'docker.engine', 'remote.machine' ] │ 1 │ 'Docker is the underlying technology.' │
+│ 70 │ 'terraform' │ 'service.application' │ 'docker.image' │ [ 'docker.engine', 'remote.machine' ] │ 0.5 │ 'Docker Compose is more specialized.' │
+│ 71 │ 'ansible' │ 'service.application' │ 'docker.image' │ [ 'gcp.cloudrun' ] │ 0 │ 'Custom module with imperative parts, while Terraform provides a declarative module.' │
+│ 72 │ 'terraform' │ 'service.application' │ 'docker.image' │ [ 'gcp.cloudrun' ] │ 1 │ 'Terraform provides a declarative module.' │
+│ 73 │ 'ansible' │ 'service.application' │ 'docker.image' │ [ 'kubernetes.cluster' ] │ 0.5 │ 'Kubernetes is more specialized.' │
+│ 74 │ 'kubernetes' │ 'service.application' │ 'docker.image' │ [ 'kubernetes.cluster' ] │ 1 │ 'Kubernetes is the underlying technology.' │
+│ 75 │ 'terraform' │ 'service.application' │ 'docker.image' │ [ 'kubernetes.cluster' ] │ 0.5 │ 'Kubernetes is more specialized.' │
+│ 76 │ 'ansible' │ 'service.application' │ 'tar.archive' │ [ '*', 'local.machine' ] │ 1 │ 'Primary use case due to the specialization of Ansible. Special integration for systemd.' │
+│ 77 │ 'terraform' │ 'service.application' │ 'tar.archive' │ [ '*', 'local.machine' ] │ 0 │ 'Ansible is more specialized. Also using provisioners is a "last resort".' │
+│ 78 │ 'ansible' │ 'service.application' │ 'tar.archive' │ [ '*', 'remote.machine' ] │ 1 │ 'Primary use case due to the specialization of Ansible. Special integration for systemd.' │
+│ 79 │ 'terraform' │ 'service.application' │ 'tar.archive' │ [ '*', 'remote.machine' ] │ 0 │ 'Ansible is more specialized. Also using provisioners is a "last resort".' │
+│ 80 │ 'ansible' │ 'service.application' │ 'zip.archive' │ [ '*', 'local.machine' ] │ 1 │ 'Primary use case due to the specialization of Ansible. Special integration for systemd.' │
+│ 81 │ 'terraform' │ 'service.application' │ 'zip.archive' │ [ '*', 'local.machine' ] │ 0 │ 'Ansible is more specialized. Also using provisioners is a "last resort".' │
+│ 82 │ 'ansible' │ 'service.application' │ 'zip.archive' │ [ '*', 'remote.machine' ] │ 1 │ 'Primary use case due to the specialization of Ansible. Special integration for systemd.' │
+│ 83 │ 'terraform' │ 'service.application' │ 'zip.archive' │ [ '*', 'remote.machine' ] │ 0 │ 'Ansible is more specialized. Also using provisioners is a "last resort".' │
+│ 84 │ 'ansible' │ 'service.application' │ 'zip.archive' │ [ 'gcp.appengine' ] │ 0 │ 'Custom module with imperative parts, while Terraform provides a declarative module.' │
+│ 85 │ 'terraform' │ 'service.application' │ 'zip.archive' │ [ 'gcp.appengine' ] │ 1 │ 'Terraform provides a declarative module.' │
+│ 86 │ 'ansible' │ 'software.application' │ 'apt.package' │ [ '*', 'local.machine' ] │ 1 │ 'Primary use case due to the specialization of Ansible.' │
+│ 87 │ 'terraform' │ 'software.application' │ 'apt.package' │ [ '*', 'local.machine' ] │ 0 │ 'Ansible is more specialized. Also using provisioners is a "last resort".' │
+│ 88 │ 'ansible' │ 'software.application' │ 'apt.package' │ [ '*', 'remote.machine' ] │ 1 │ 'Primary use case due to the specialization of Ansible.' │
+│ 89 │ 'terraform' │ 'software.application' │ 'apt.package' │ [ '*', 'remote.machine' ] │ 0 │ 'Ansible is more specialized. Also using provisioners is a "last resort".' │
+│ 90 │ 'ansible' │ 'software.application' │ 'tar.archive' │ [ '*', 'local.machine' ] │ 1 │ 'While this is a primary use case due to the specialization of Ansible, we must rely on scripts. More specialized types should be used, e.g., service.application.' │
+│ 91 │ 'terraform' │ 'software.application' │ 'tar.archive' │ [ '*', 'local.machine' ] │ 0 │ 'Ansible is more specialized. Also using provisioners is a "last resort".' │
+│ 92 │ 'ansible' │ 'software.application' │ 'tar.archive' │ [ '*', 'remote.machine' ] │ 1 │ 'While this is a primary use case due to the specialization of Ansible, we must rely on scripts. More specialized types should be used, e.g., "service.application".' │
+│ 93 │ 'terraform' │ 'software.application' │ 'tar.archive' │ [ '*', 'remote.machine' ] │ 0 │ 'Ansible is more specialized. Also using provisioners is a "last resort".' │
+│ 94 │ 'ansible' │ 'software.application' │ 'zip.archive' │ [ '*', 'local.machine' ] │ 1 │ 'While this is a primary use case due to the specialization of Ansible, we must rely on scripts. More specialized types should be used, e.g., service.application.' │
+│ 95 │ 'terraform' │ 'software.application' │ 'zip.archive' │ [ '*', 'local.machine' ] │ 0 │ 'Ansible is more specialized. Also using provisioners is a "last resort".' │
+│ 96 │ 'ansible' │ 'software.application' │ 'zip.archive' │ [ '*', 'remote.machine' ] │ 1 │ 'While this is a primary use case due to the specialization of Ansible, we must rely on scripts. More specialized types should be used, e.g., service.application.' │
+│ 97 │ 'terraform' │ 'software.application' │ 'zip.archive' │ [ '*', 'remote.machine' ] │ 0 │ 'Ansible is more specialized. Also using provisioners is a "last resort".' │
+│ 98 │ 'ansible' │ 'virtual.machine' │ 'machine.image' │ [ 'openstack.provider' ] │ 0.5 │ 'Terraform is more specialized.' │
+│ 99 │ 'terraform' │ 'virtual.machine' │ 'machine.image' │ [ 'openstack.provider' ] │ 1 │ 'Terraform provides a declarative module.' │
+└─────────┴──────────────┴────────────────────────┴─────────────────┴───────────────────────────────────────────────────────┴─────────┴──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
+
+Metrics relevant when modeling the different scenarios
+┌─────────┬────────────────────────────┬────────┬──────────┬────────────┬────────────────────────┬───────────────┐
+│ (index) │ scenario │ models │ elements │ conditions │ technology_assignments │ lines_of_code │
+├─────────┼────────────────────────────┼────────┼──────────┼────────────┼────────────────────────┼───────────────┤
+│ 0 │ 'EDMM "gcp"' │ 1 │ 136 │ 0 │ 14 │ 325 │
+│ 1 │ 'EDMM "os-medium"' │ 1 │ 181 │ 0 │ 18 │ 421 │
+│ 2 │ 'EDMM "os-large"' │ 1 │ 181 │ 0 │ 18 │ 421 │
+│ 3 │ 'EDMM Total' │ 3 │ 498 │ 0 │ 50 │ 1167 │
+│ 4 │ 'VDMM Baseline Original' │ 1 │ 328 │ 34 │ 32 │ 768 │
+│ 5 │ 'VDMM+ Original Manual' │ 1 │ 210 │ 46 │ 32 │ 588 │
+│ 6 │ 'VDMM+ Original Automated' │ 1 │ 233 │ 24 │ 0 │ 562 │
+└─────────┴────────────────────────────┴────────┴──────────┴────────────┴────────────────────────┴───────────────┘
+
+Absolute diff when modeling the different original scenarios
+┌─────────┬─────────────────────────────────────────────────────┬─────────────────┬───────────────────┬─────────────────────┬─────────────────────────────────┬────────────────────────┐
+│ (index) │ scenario │ models_abs_diff │ elements_abs_diff │ conditions_abs_diff │ technology_assignments_abs_diff │ lines_of_code_abs_diff │
+├─────────┼─────────────────────────────────────────────────────┼─────────────────┼───────────────────┼─────────────────────┼─────────────────────────────────┼────────────────────────┤
+│ 0 │ 'VDMM Baseline Original - EDMM Total' │ -2 │ -170 │ 34 │ -18 │ -399 │
+│ 1 │ 'VDMM+ Original Manual - VDMM Baseline Original' │ 0 │ -118 │ 12 │ 0 │ -180 │
+│ 2 │ 'VDMM+ Original Automated - VDMM Baseline Original' │ 0 │ -95 │ -10 │ -32 │ -206 │
+└─────────┴─────────────────────────────────────────────────────┴─────────────────┴───────────────────┴─────────────────────┴─────────────────────────────────┴────────────────────────┘
+
+Relative diff when modeling the different original scenarios
+┌─────────┬─────────────────────────────────────────────────────┬─────────────────┬───────────────────┬─────────────────────┬─────────────────────────────────┬────────────────────────┐
+│ (index) │ scenario │ models_rel_diff │ elements_rel_diff │ conditions_rel_diff │ technology_assignments_rel_diff │ lines_of_code_rel_diff │
+├─────────┼─────────────────────────────────────────────────────┼─────────────────┼───────────────────┼─────────────────────┼─────────────────────────────────┼────────────────────────┤
+│ 0 │ 'VDMM Baseline Original / EDMM Total' │ 0.33 │ 0.66 │ Infinity │ 0.64 │ 0.66 │
+│ 1 │ 'VDMM+ Original Manual / VDMM Baseline Original' │ 1 │ 0.64 │ 1.35 │ 1 │ 0.77 │
+│ 2 │ 'VDMM+ Original Automated / VDMM Baseline Original' │ 1 │ 0.71 │ 0.71 │ 0 │ 0.73 │
+└─────────┴─────────────────────────────────────────────────────┴─────────────────┴───────────────────┴─────────────────────┴─────────────────────────────────┴────────────────────────┘
+
+Qualities of the derived deployment models, i.e., the deployment variants, of the different scenarios ranging from bad (0) to good (1).
+┌─────────┬─────────────┬────────────┬───────────────────────────────┬───────────────────────────────┬──────────────────────────────────────┬────────────┬──────────────────┐
+│ (index) │ scenario │ expert │ non_expert │ random │ counting │ quality │ quality_counting │
+├─────────┼─────────────┼────────────┼───────────────────────────────┼───────────────────────────────┼──────────────────────────────────────┼────────────┼──────────────────┤
+│ 0 │ 'gcp' │ 'good (1)' │ [ 'bad (0)', 'good (1)' ] │ [ 'bad (0)', 'good (1)' ] │ [ 'bad (0)', 'good (1)' ] │ 'good (1)' │ 'good (1)' │
+│ 1 │ 'os-medium' │ 'good (1)' │ [ 'poor (0.34)', 'good (1)' ] │ [ 'poor (0.34)', 'good (1)' ] │ [ 'moderate (0.41)', 'fair (0.66)' ] │ 'good (1)' │ 'good (1)' │
+│ 2 │ 'os-large' │ 'good (1)' │ [ 'poor (0.34)', 'good (1)' ] │ [ 'poor (0.34)', 'good (1)' ] │ [ 'moderate (0.41)', 'fair (0.66)' ] │ 'good (1)' │ 'good (1)' │
+└─────────┴─────────────┴────────────┴───────────────────────────────┴───────────────────────────────┴──────────────────────────────────────┴────────────┴──────────────────┘
+
+Metrics relevant when modeling the maintenance scenario of our case study
+┌─────────┬───────────────────────────────┬────────┬──────────┬────────────┬────────────────────────┬───────────────┐
+│ (index) │ scenario │ models │ elements │ conditions │ technology_assignments │ lines_of_code │
+├─────────┼───────────────────────────────┼────────┼──────────┼────────────┼────────────────────────┼───────────────┤
+│ 0 │ 'VDMM Baseline Maintenance' │ 1 │ 509 │ 65 │ 47 │ 1162 │
+│ 1 │ 'VDMM+ Maintenance Manual' │ 1 │ 249 │ 69 │ 47 │ 703 │
+│ 2 │ 'VDMM+ Maintenance Automated' │ 1 │ 249 │ 28 │ 0 │ 599 │
+└─────────┴───────────────────────────────┴────────┴──────────┴────────────┴────────────────────────┴───────────────┘
+
+Absolute diff from original to maintained
+┌─────────┬──────────────────────────────────────────────────────────┬─────────────────┬───────────────────┬─────────────────────┬─────────────────────────────────┬────────────────────────┐
+│ (index) │ scenario │ models_abs_diff │ elements_abs_diff │ conditions_abs_diff │ technology_assignments_abs_diff │ lines_of_code_abs_diff │
+├─────────┼──────────────────────────────────────────────────────────┼─────────────────┼───────────────────┼─────────────────────┼─────────────────────────────────┼────────────────────────┤
+│ 0 │ 'VDMM Baseline Maintenance - VDMM Baseline Original' │ 0 │ 181 │ 31 │ 15 │ 394 │
+│ 1 │ 'VDMM+ Maintenance Manual - VDMM+ Original Manual' │ 0 │ 39 │ 23 │ 15 │ 115 │
+│ 2 │ 'VDMM+ Maintenance Automated - VDMM+ Original Automated' │ 0 │ 16 │ 4 │ 0 │ 37 │
+└─────────┴──────────────────────────────────────────────────────────┴─────────────────┴───────────────────┴─────────────────────┴─────────────────────────────────┴────────────────────────┘
+
+Relative diff from the absolute diff from original to maintained
+┌─────────┬───────────────────────────────────────────────────────────────────────────────────────────────────────────────────┬─────────────────┬───────────────────┬─────────────────────┬─────────────────────────────────┬────────────────────────┐
+│ (index) │ scenario │ models_rel_diff │ elements_rel_diff │ conditions_rel_diff │ technology_assignments_rel_diff │ lines_of_code_rel_diff │
+├─────────┼───────────────────────────────────────────────────────────────────────────────────────────────────────────────────┼─────────────────┼───────────────────┼─────────────────────┼─────────────────────────────────┼────────────────────────┤
+│ 0 │ '(VDMM+ Maintenance Manual - VDMM+ Original Manual) / (VDMM Baseline Maintenance - VDMM Baseline Original)' │ 1 │ 0.22 │ 0.74 │ 1 │ 0.29 │
+│ 1 │ '(VDMM+ Maintenance Automated - VDMM+ Original Automated) / (VDMM Baseline Maintenance - VDMM Baseline Original)' │ 1 │ 0.09 │ 0.13 │ 0 │ 0.09 │
+└─────────┴───────────────────────────────────────────────────────────────────────────────────────────────────────────────────┴─────────────────┴───────────────────┴─────────────────────┴─────────────────────────────────┴────────────────────────┘
+
+CAUTION: Is this case study running with the latest implementation?
+
+COMMENT: fixed that UNDEFINED DEFAULT ALTERNATIVE is counted and also k8s should not be counted
diff --git a/examples/unfurl-technology---boutique---plus-maintenance-automated/scripts/sutdy-012.txt b/examples/unfurl-technology---boutique---plus-maintenance-automated/scripts/sutdy-012.txt
new file mode 100644
index 0000000000..7137623f84
--- /dev/null
+++ b/examples/unfurl-technology---boutique---plus-maintenance-automated/scripts/sutdy-012.txt
@@ -0,0 +1,176 @@
+
+The technology rules of our case study. Qualities range from bad (0) to good (1).
+┌─────────┬──────────────┬────────────────────────┬─────────────────┬───────────────────────────────────────────────────────┬─────────┬──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
+│ (index) │ Technology │ Component │ Artifact │ Hosting │ Quality │ Reason │
+├─────────┼──────────────┼────────────────────────┼─────────────────┼───────────────────────────────────────────────────────┼─────────┼──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤
+│ 0 │ 'ansible' │ 'docker.engine' │ undefined │ [ 'local.machine' ] │ 1 │ 'Primary use case due to the specialization of Ansible.' │
+│ 1 │ 'terraform' │ 'docker.engine' │ undefined │ [ 'local.machine' ] │ 0 │ 'Ansible is more specialized. Also using provisioners is a "last resort".' │
+│ 2 │ 'ansible' │ 'docker.engine' │ undefined │ [ 'remote.machine' ] │ 1 │ 'Primary use case due to the specialization of Ansible.' │
+│ 3 │ 'terraform' │ 'docker.engine' │ undefined │ [ 'remote.machine' ] │ 0 │ 'Ansible is more specialized. Also using provisioners is a "last resort".' │
+│ 4 │ 'ansible' │ 'gcp.service' │ undefined │ [] │ 0 │ 'Ansible provides a declarative module' │
+│ 5 │ 'terraform' │ 'gcp.service' │ undefined │ [] │ 1 │ 'Terraform provides a declarative module.' │
+│ 6 │ 'ansible' │ 'ingress' │ undefined │ [ 'kubernetes.cluster' ] │ 0.5 │ 'Kubernetes is more specialized.' │
+│ 7 │ 'kubernetes' │ 'ingress' │ undefined │ [ 'kubernetes.cluster' ] │ 1 │ 'Kubernetes is the underlying technology.' │
+│ 8 │ 'terraform' │ 'ingress' │ undefined │ [ 'kubernetes.cluster' ] │ 0.5 │ 'Kubernetes is more specialized.' │
+│ 9 │ 'ansible' │ 'ingress' │ undefined │ [ 'local.machine' ] │ 1 │ 'Primary use case due to the specialization of Ansible.' │
+│ 10 │ 'terraform' │ 'ingress' │ undefined │ [ 'local.machine' ] │ 0 │ 'Ansible is more specialized. Also using provisioners is a "last resort".' │
+│ 11 │ 'ansible' │ 'ingress' │ undefined │ [ 'remote.machine' ] │ 1 │ 'Primary use case due to the specialization of Ansible.' │
+│ 12 │ 'terraform' │ 'ingress' │ undefined │ [ 'remote.machine' ] │ 0 │ 'Ansible is more specialized. Also using provisioners is a "last resort".' │
+│ 13 │ 'ansible' │ 'mysql.database' │ undefined │ [ 'mysql.dbms', 'docker.engine', 'local.machine' ] │ 1 │ 'Primary use case due to the specialization of Ansible.' │
+│ 14 │ 'compose' │ 'mysql.database' │ undefined │ [ 'mysql.dbms', 'docker.engine', 'local.machine' ] │ 0 │ 'One-time use docker container ("fake Kubernetes job") with imperative parts, while other technologies provide declarative modules.' │
+│ 15 │ 'terraform' │ 'mysql.database' │ undefined │ [ 'mysql.dbms', 'docker.engine', 'local.machine' ] │ 1 │ 'Terraform provides a declarative module.' │
+│ 16 │ 'ansible' │ 'mysql.database' │ undefined │ [ 'mysql.dbms', 'docker.engine', 'remote.machine' ] │ 1 │ 'Primary use case due to the specialization of Ansible.' │
+│ 17 │ 'compose' │ 'mysql.database' │ undefined │ [ 'mysql.dbms', 'docker.engine', 'remote.machine' ] │ 0 │ 'One-time use docker container ("fake Kubernetes job") with imperative parts, while other technologies provide declarative modules.' │
+│ 18 │ 'terraform' │ 'mysql.database' │ undefined │ [ 'mysql.dbms', 'docker.engine', 'remote.machine' ] │ 0.75 │ 'Terraform provides a declarative module. However, Terraform requires an SSH workaround. Ansible is more specialized.' │
+│ 19 │ 'ansible' │ 'mysql.database' │ undefined │ [ 'mysql.dbms', 'gcp.cloudsql' ] │ 0 │ 'Primary use case due to the specialization of Ansible. However, need to install and handle GCP CloudSQL Proxy, while the corresponding Terraform module already provides this.' │
+│ 20 │ 'terraform' │ 'mysql.database' │ undefined │ [ 'mysql.dbms', 'gcp.cloudsql' ] │ 1 │ 'Terraform provides a declarative module.' │
+│ 21 │ 'ansible' │ 'mysql.database' │ undefined │ [ 'mysql.dbms', 'kubernetes.cluster' ] │ 1 │ 'Primary use case due to the specialization of Ansible.' │
+│ 22 │ 'kubernetes' │ 'mysql.database' │ undefined │ [ 'mysql.dbms', 'kubernetes.cluster' ] │ 0 │ 'Kubernetes Job with imperative parts, while declarative other technologies provide declarative modules.' │
+│ 23 │ 'terraform' │ 'mysql.database' │ undefined │ [ 'mysql.dbms', 'kubernetes.cluster' ] │ 0.25 │ 'Ansible is more specialized.' │
+│ 24 │ 'ansible' │ 'mysql.database' │ undefined │ [ 'mysql.dbms', 'local.machine' ] │ 1 │ 'Primary use case due to the specialization of Ansible.' │
+│ 25 │ 'terraform' │ 'mysql.database' │ undefined │ [ 'mysql.dbms', 'local.machine' ] │ 1 │ 'Terraform provides a declarative module.' │
+│ 26 │ 'ansible' │ 'mysql.database' │ undefined │ [ 'mysql.dbms', 'remote.machine' ] │ 1 │ 'Primary use case due to the specialization of Ansible.' │
+│ 27 │ 'terraform' │ 'mysql.database' │ undefined │ [ 'mysql.dbms', 'remote.machine' ] │ 0.5 │ 'Terraform provides a declarative module. However, Terraform requires an SSH workaround. Ansible is more specialized.' │
+│ 28 │ 'ansible' │ 'mysql.dbms' │ 'dbms.image' │ [ 'docker.engine', 'local.machine' ] │ 0.5 │ 'Docker Compose is more specialized' │
+│ 29 │ 'compose' │ 'mysql.dbms' │ 'dbms.image' │ [ 'docker.engine', 'local.machine' ] │ 1 │ 'Docker is the underlying technology.' │
+│ 30 │ 'terraform' │ 'mysql.dbms' │ 'dbms.image' │ [ 'docker.engine', 'local.machine' ] │ 0.5 │ 'Docker Compose is more specialized.' │
+│ 31 │ 'ansible' │ 'mysql.dbms' │ 'dbms.image' │ [ 'docker.engine', 'remote.machine' ] │ 0.5 │ 'Docker Compose is more specialized' │
+│ 32 │ 'compose' │ 'mysql.dbms' │ 'dbms.image' │ [ 'docker.engine', 'remote.machine' ] │ 1 │ 'Docker is the underlying technology.' │
+│ 33 │ 'terraform' │ 'mysql.dbms' │ 'dbms.image' │ [ 'docker.engine', 'remote.machine' ] │ 0.5 │ 'Docker Compose is more specialized.' │
+│ 34 │ 'ansible' │ 'mysql.dbms' │ 'dbms.image' │ [ 'gcp.cloudsql' ] │ 0 │ 'Primary use case due to the specialization of Ansible.' │
+│ 35 │ 'terraform' │ 'mysql.dbms' │ 'dbms.image' │ [ 'gcp.cloudsql' ] │ 1 │ 'Terraform provides a declarative module.' │
+│ 36 │ 'ansible' │ 'mysql.dbms' │ 'dbms.image' │ [ 'kubernetes.cluster' ] │ 0.5 │ 'Kubernetes is more specialized.' │
+│ 37 │ 'kubernetes' │ 'mysql.dbms' │ 'dbms.image' │ [ 'kubernetes.cluster' ] │ 1 │ 'Kubernetes is the underlying technology.' │
+│ 38 │ 'terraform' │ 'mysql.dbms' │ 'dbms.image' │ [ 'kubernetes.cluster' ] │ 0.5 │ 'Kubernetes is more specialized.' │
+│ 39 │ 'ansible' │ 'mysql.dbms' │ 'dbms.image' │ [ 'local.machine' ] │ 1 │ 'Primary use case due to the specialization of Ansible.' │
+│ 40 │ 'terraform' │ 'mysql.dbms' │ 'dbms.image' │ [ 'local.machine' ] │ 0 │ 'Ansible is more specialized. Also using provisioners is a "last resort".' │
+│ 41 │ 'ansible' │ 'mysql.dbms' │ 'dbms.image' │ [ 'remote.machine' ] │ 1 │ 'Primary use case due to the specialization of Ansible.' │
+│ 42 │ 'terraform' │ 'mysql.dbms' │ 'dbms.image' │ [ 'remote.machine' ] │ 0 │ 'Ansible is more specialized. Also using provisioners is a "last resort".' │
+│ 43 │ 'ansible' │ 'object.storage' │ undefined │ [ 'gcp.cloudstorage' ] │ 0 │ 'Primary use case due to the specialization of Ansible.' │
+│ 44 │ 'terraform' │ 'object.storage' │ undefined │ [ 'gcp.cloudstorage' ] │ 1 │ 'Terraform provides a declarative module.' │
+│ 45 │ 'ansible' │ 'object.storage' │ undefined │ [ 'minio.server', 'docker.engine', 'local.machine' ] │ 1 │ 'Primary use case due to the specialization of Ansible.' │
+│ 46 │ 'compose' │ 'object.storage' │ undefined │ [ 'minio.server', 'docker.engine', 'local.machine' ] │ 0 │ 'One-time use docker container ("fake Kubernetes job") with imperative parts, while other technologies provide declarative modules.' │
+│ 47 │ 'terraform' │ 'object.storage' │ undefined │ [ 'minio.server', 'docker.engine', 'local.machine' ] │ 1 │ 'Terraform provides a declarative module.' │
+│ 48 │ 'ansible' │ 'object.storage' │ undefined │ [ 'minio.server', 'docker.engine', 'remote.machine' ] │ 1 │ 'Primary use case due to the specialization of Ansible.' │
+│ 49 │ 'compose' │ 'object.storage' │ undefined │ [ 'minio.server', 'docker.engine', 'remote.machine' ] │ 0 │ 'One-time use docker container ("fake Kubernetes job") with imperative parts, while other technologies provide declarative modules.' │
+│ 50 │ 'terraform' │ 'object.storage' │ undefined │ [ 'minio.server', 'docker.engine', 'remote.machine' ] │ 0.75 │ 'Terraform provides a declarative module. However, Terraform requires an SSH workaround. Ansible is more specialized.' │
+│ 51 │ 'ansible' │ 'object.storage' │ undefined │ [ 'minio.server', 'kubernetes.cluster' ] │ 1 │ 'Primary use case due to the specialization of Ansible.' │
+│ 52 │ 'kubernetes' │ 'object.storage' │ undefined │ [ 'minio.server', 'kubernetes.cluster' ] │ 0 │ 'Kubernetes Job with imperative parts, while declarative other technologies provide declarative modules.' │
+│ 53 │ 'terraform' │ 'object.storage' │ undefined │ [ 'minio.server', 'kubernetes.cluster' ] │ 0.25 │ 'Ansible is more specialized.' │
+│ 54 │ 'ansible' │ 'redis.server' │ 'cache.image' │ [ 'docker.engine', 'local.machine' ] │ 0.5 │ 'Docker Compose is more specialized.' │
+│ 55 │ 'compose' │ 'redis.server' │ 'cache.image' │ [ 'docker.engine', 'local.machine' ] │ 1 │ 'Docker is the underlying technology.' │
+│ 56 │ 'terraform' │ 'redis.server' │ 'cache.image' │ [ 'docker.engine', 'local.machine' ] │ 0.5 │ 'Docker Compose is more specialized.' │
+│ 57 │ 'ansible' │ 'redis.server' │ 'cache.image' │ [ 'docker.engine', 'remote.machine' ] │ 0.5 │ 'Docker Compose is more specialized.' │
+│ 58 │ 'compose' │ 'redis.server' │ 'cache.image' │ [ 'docker.engine', 'remote.machine' ] │ 1 │ 'Docker is the underlying technology.' │
+│ 59 │ 'terraform' │ 'redis.server' │ 'cache.image' │ [ 'docker.engine', 'remote.machine' ] │ 0.5 │ 'Docker Compose is more specialized.' │
+│ 60 │ 'ansible' │ 'redis.server' │ 'cache.image' │ [ 'gcp.memorystore' ] │ 0 │ 'Primary use case due to the specialization of Ansible.' │
+│ 61 │ 'terraform' │ 'redis.server' │ 'cache.image' │ [ 'gcp.memorystore' ] │ 1 │ 'Terraform provides a declarative module.' │
+│ 62 │ 'ansible' │ 'redis.server' │ 'cache.image' │ [ 'kubernetes.cluster' ] │ 0.5 │ 'Kubernetes is more specialized.' │
+│ 63 │ 'kubernetes' │ 'redis.server' │ 'cache.image' │ [ 'kubernetes.cluster' ] │ 1 │ 'Kubernetes is the underlying technology.' │
+│ 64 │ 'terraform' │ 'redis.server' │ 'cache.image' │ [ 'kubernetes.cluster' ] │ 0.5 │ 'Kubernetes is more specialized.' │
+│ 65 │ 'ansible' │ 'service.application' │ 'docker.image' │ [ 'docker.engine', 'local.machine' ] │ 0.5 │ 'Docker Compose is more specialized.' │
+│ 66 │ 'compose' │ 'service.application' │ 'docker.image' │ [ 'docker.engine', 'local.machine' ] │ 1 │ 'Docker is the underlying technology.' │
+│ 67 │ 'terraform' │ 'service.application' │ 'docker.image' │ [ 'docker.engine', 'local.machine' ] │ 0.5 │ 'Docker Compose is more specialized.' │
+│ 68 │ 'ansible' │ 'service.application' │ 'docker.image' │ [ 'docker.engine', 'remote.machine' ] │ 0.5 │ 'Docker Compose is more specialized.' │
+│ 69 │ 'compose' │ 'service.application' │ 'docker.image' │ [ 'docker.engine', 'remote.machine' ] │ 1 │ 'Docker is the underlying technology.' │
+│ 70 │ 'terraform' │ 'service.application' │ 'docker.image' │ [ 'docker.engine', 'remote.machine' ] │ 0.5 │ 'Docker Compose is more specialized.' │
+│ 71 │ 'ansible' │ 'service.application' │ 'docker.image' │ [ 'gcp.cloudrun' ] │ 0 │ 'Custom module with imperative parts, while Terraform provides a declarative module.' │
+│ 72 │ 'terraform' │ 'service.application' │ 'docker.image' │ [ 'gcp.cloudrun' ] │ 1 │ 'Terraform provides a declarative module.' │
+│ 73 │ 'ansible' │ 'service.application' │ 'docker.image' │ [ 'kubernetes.cluster' ] │ 0.5 │ 'Kubernetes is more specialized.' │
+│ 74 │ 'kubernetes' │ 'service.application' │ 'docker.image' │ [ 'kubernetes.cluster' ] │ 1 │ 'Kubernetes is the underlying technology.' │
+│ 75 │ 'terraform' │ 'service.application' │ 'docker.image' │ [ 'kubernetes.cluster' ] │ 0.5 │ 'Kubernetes is more specialized.' │
+│ 76 │ 'ansible' │ 'service.application' │ 'tar.archive' │ [ '*', 'local.machine' ] │ 1 │ 'Primary use case due to the specialization of Ansible. Special integration for systemd.' │
+│ 77 │ 'terraform' │ 'service.application' │ 'tar.archive' │ [ '*', 'local.machine' ] │ 0 │ 'Ansible is more specialized. Also using provisioners is a "last resort".' │
+│ 78 │ 'ansible' │ 'service.application' │ 'tar.archive' │ [ '*', 'remote.machine' ] │ 1 │ 'Primary use case due to the specialization of Ansible. Special integration for systemd.' │
+│ 79 │ 'terraform' │ 'service.application' │ 'tar.archive' │ [ '*', 'remote.machine' ] │ 0 │ 'Ansible is more specialized. Also using provisioners is a "last resort".' │
+│ 80 │ 'ansible' │ 'service.application' │ 'zip.archive' │ [ '*', 'local.machine' ] │ 1 │ 'Primary use case due to the specialization of Ansible. Special integration for systemd.' │
+│ 81 │ 'terraform' │ 'service.application' │ 'zip.archive' │ [ '*', 'local.machine' ] │ 0 │ 'Ansible is more specialized. Also using provisioners is a "last resort".' │
+│ 82 │ 'ansible' │ 'service.application' │ 'zip.archive' │ [ '*', 'remote.machine' ] │ 1 │ 'Primary use case due to the specialization of Ansible. Special integration for systemd.' │
+│ 83 │ 'terraform' │ 'service.application' │ 'zip.archive' │ [ '*', 'remote.machine' ] │ 0 │ 'Ansible is more specialized. Also using provisioners is a "last resort".' │
+│ 84 │ 'ansible' │ 'service.application' │ 'zip.archive' │ [ 'gcp.appengine' ] │ 0 │ 'Custom module with imperative parts, while Terraform provides a declarative module.' │
+│ 85 │ 'terraform' │ 'service.application' │ 'zip.archive' │ [ 'gcp.appengine' ] │ 1 │ 'Terraform provides a declarative module.' │
+│ 86 │ 'ansible' │ 'software.application' │ 'apt.package' │ [ '*', 'local.machine' ] │ 1 │ 'Primary use case due to the specialization of Ansible.' │
+│ 87 │ 'terraform' │ 'software.application' │ 'apt.package' │ [ '*', 'local.machine' ] │ 0 │ 'Ansible is more specialized. Also using provisioners is a "last resort".' │
+│ 88 │ 'ansible' │ 'software.application' │ 'apt.package' │ [ '*', 'remote.machine' ] │ 1 │ 'Primary use case due to the specialization of Ansible.' │
+│ 89 │ 'terraform' │ 'software.application' │ 'apt.package' │ [ '*', 'remote.machine' ] │ 0 │ 'Ansible is more specialized. Also using provisioners is a "last resort".' │
+│ 90 │ 'ansible' │ 'software.application' │ 'tar.archive' │ [ '*', 'local.machine' ] │ 1 │ 'While this is a primary use case due to the specialization of Ansible, we must rely on scripts. More specialized types should be used, e.g., service.application.' │
+│ 91 │ 'terraform' │ 'software.application' │ 'tar.archive' │ [ '*', 'local.machine' ] │ 0 │ 'Ansible is more specialized. Also using provisioners is a "last resort".' │
+│ 92 │ 'ansible' │ 'software.application' │ 'tar.archive' │ [ '*', 'remote.machine' ] │ 1 │ 'While this is a primary use case due to the specialization of Ansible, we must rely on scripts. More specialized types should be used, e.g., "service.application".' │
+│ 93 │ 'terraform' │ 'software.application' │ 'tar.archive' │ [ '*', 'remote.machine' ] │ 0 │ 'Ansible is more specialized. Also using provisioners is a "last resort".' │
+│ 94 │ 'ansible' │ 'software.application' │ 'zip.archive' │ [ '*', 'local.machine' ] │ 1 │ 'While this is a primary use case due to the specialization of Ansible, we must rely on scripts. More specialized types should be used, e.g., service.application.' │
+│ 95 │ 'terraform' │ 'software.application' │ 'zip.archive' │ [ '*', 'local.machine' ] │ 0 │ 'Ansible is more specialized. Also using provisioners is a "last resort".' │
+│ 96 │ 'ansible' │ 'software.application' │ 'zip.archive' │ [ '*', 'remote.machine' ] │ 1 │ 'While this is a primary use case due to the specialization of Ansible, we must rely on scripts. More specialized types should be used, e.g., service.application.' │
+│ 97 │ 'terraform' │ 'software.application' │ 'zip.archive' │ [ '*', 'remote.machine' ] │ 0 │ 'Ansible is more specialized. Also using provisioners is a "last resort".' │
+│ 98 │ 'ansible' │ 'virtual.machine' │ 'machine.image' │ [ 'openstack.provider' ] │ 0.5 │ 'Terraform is more specialized.' │
+│ 99 │ 'terraform' │ 'virtual.machine' │ 'machine.image' │ [ 'openstack.provider' ] │ 1 │ 'Terraform provides a declarative module.' │
+└─────────┴──────────────┴────────────────────────┴─────────────────┴───────────────────────────────────────────────────────┴─────────┴──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
+
+Metrics relevant when modeling the different scenarios
+┌─────────┬────────────────────────────┬────────┬──────────┬────────────┬────────────────────────┬───────────────┐
+│ (index) │ scenario │ models │ elements │ conditions │ technology_assignments │ lines_of_code │
+├─────────┼────────────────────────────┼────────┼──────────┼────────────┼────────────────────────┼───────────────┤
+│ 0 │ 'EDMM "gcp"' │ 1 │ 136 │ 0 │ 14 │ 325 │
+│ 1 │ 'EDMM "os-medium"' │ 1 │ 181 │ 0 │ 18 │ 421 │
+│ 2 │ 'EDMM "os-large"' │ 1 │ 181 │ 0 │ 18 │ 421 │
+│ 3 │ 'EDMM Total' │ 3 │ 498 │ 0 │ 50 │ 1167 │
+│ 4 │ 'VDMM Baseline Original' │ 1 │ 328 │ 34 │ 32 │ 768 │
+│ 5 │ 'VDMM+ Original Manual' │ 1 │ 210 │ 46 │ 32 │ 588 │
+│ 6 │ 'VDMM+ Original Automated' │ 1 │ 210 │ 22 │ 0 │ 517 │
+└─────────┴────────────────────────────┴────────┴──────────┴────────────┴────────────────────────┴───────────────┘
+
+Absolute diff when modeling the different original scenarios
+┌─────────┬─────────────────────────────────────────────────────┬─────────────────┬───────────────────┬─────────────────────┬─────────────────────────────────┬────────────────────────┐
+│ (index) │ scenario │ models_abs_diff │ elements_abs_diff │ conditions_abs_diff │ technology_assignments_abs_diff │ lines_of_code_abs_diff │
+├─────────┼─────────────────────────────────────────────────────┼─────────────────┼───────────────────┼─────────────────────┼─────────────────────────────────┼────────────────────────┤
+│ 0 │ 'VDMM Baseline Original - EDMM Total' │ -2 │ -170 │ 34 │ -18 │ -399 │
+│ 1 │ 'VDMM+ Original Manual - VDMM Baseline Original' │ 0 │ -118 │ 12 │ 0 │ -180 │
+│ 2 │ 'VDMM+ Original Automated - VDMM Baseline Original' │ 0 │ -118 │ -12 │ -32 │ -251 │
+└─────────┴─────────────────────────────────────────────────────┴─────────────────┴───────────────────┴─────────────────────┴─────────────────────────────────┴────────────────────────┘
+
+Relative diff when modeling the different original scenarios
+┌─────────┬─────────────────────────────────────────────────────┬─────────────────┬───────────────────┬─────────────────────┬─────────────────────────────────┬────────────────────────┐
+│ (index) │ scenario │ models_rel_diff │ elements_rel_diff │ conditions_rel_diff │ technology_assignments_rel_diff │ lines_of_code_rel_diff │
+├─────────┼─────────────────────────────────────────────────────┼─────────────────┼───────────────────┼─────────────────────┼─────────────────────────────────┼────────────────────────┤
+│ 0 │ 'VDMM Baseline Original / EDMM Total' │ 0.33 │ 0.66 │ Infinity │ 0.64 │ 0.66 │
+│ 1 │ 'VDMM+ Original Manual / VDMM Baseline Original' │ 1 │ 0.64 │ 1.35 │ 1 │ 0.77 │
+│ 2 │ 'VDMM+ Original Automated / VDMM Baseline Original' │ 1 │ 0.64 │ 0.65 │ 0 │ 0.67 │
+└─────────┴─────────────────────────────────────────────────────┴─────────────────┴───────────────────┴─────────────────────┴─────────────────────────────────┴────────────────────────┘
+
+Qualities of the derived deployment models, i.e., the deployment variants, of the different scenarios ranging from bad (0) to good (1).
+┌─────────┬─────────────┬────────────┬───────────────────────────────┬───────────────────────────────┬──────────────────────────────────────┬────────────┬──────────────────┐
+│ (index) │ scenario │ expert │ non_expert │ random │ counting │ quality │ quality_counting │
+├─────────┼─────────────┼────────────┼───────────────────────────────┼───────────────────────────────┼──────────────────────────────────────┼────────────┼──────────────────┤
+│ 0 │ 'gcp' │ 'good (1)' │ [ 'bad (0)', 'good (1)' ] │ [ 'bad (0)', 'good (1)' ] │ [ 'bad (0)', 'good (1)' ] │ 'good (1)' │ 'good (1)' │
+│ 1 │ 'os-medium' │ 'good (1)' │ [ 'poor (0.34)', 'good (1)' ] │ [ 'poor (0.34)', 'good (1)' ] │ [ 'moderate (0.41)', 'fair (0.66)' ] │ 'good (1)' │ 'good (1)' │
+│ 2 │ 'os-large' │ 'good (1)' │ [ 'poor (0.34)', 'good (1)' ] │ [ 'poor (0.34)', 'good (1)' ] │ [ 'moderate (0.41)', 'fair (0.66)' ] │ 'good (1)' │ 'good (1)' │
+└─────────┴─────────────┴────────────┴───────────────────────────────┴───────────────────────────────┴──────────────────────────────────────┴────────────┴──────────────────┘
+
+Metrics relevant when modeling the maintenance scenario of our case study
+┌─────────┬───────────────────────────────┬────────┬──────────┬────────────┬────────────────────────┬───────────────┐
+│ (index) │ scenario │ models │ elements │ conditions │ technology_assignments │ lines_of_code │
+├─────────┼───────────────────────────────┼────────┼──────────┼────────────┼────────────────────────┼───────────────┤
+│ 0 │ 'VDMM Baseline Maintenance' │ 1 │ 509 │ 65 │ 47 │ 1162 │
+│ 1 │ 'VDMM+ Maintenance Manual' │ 1 │ 249 │ 69 │ 47 │ 703 │
+│ 2 │ 'VDMM+ Maintenance Automated' │ 1 │ 249 │ 28 │ 0 │ 599 │
+└─────────┴───────────────────────────────┴────────┴──────────┴────────────┴────────────────────────┴───────────────┘
+
+Absolute diff from original to maintained
+┌─────────┬──────────────────────────────────────────────────────────┬─────────────────┬───────────────────┬─────────────────────┬─────────────────────────────────┬────────────────────────┐
+│ (index) │ scenario │ models_abs_diff │ elements_abs_diff │ conditions_abs_diff │ technology_assignments_abs_diff │ lines_of_code_abs_diff │
+├─────────┼──────────────────────────────────────────────────────────┼─────────────────┼───────────────────┼─────────────────────┼─────────────────────────────────┼────────────────────────┤
+│ 0 │ 'VDMM Baseline Maintenance - VDMM Baseline Original' │ 0 │ 181 │ 31 │ 15 │ 394 │
+│ 1 │ 'VDMM+ Maintenance Manual - VDMM+ Original Manual' │ 0 │ 39 │ 23 │ 15 │ 115 │
+│ 2 │ 'VDMM+ Maintenance Automated - VDMM+ Original Automated' │ 0 │ 39 │ 6 │ 0 │ 82 │
+└─────────┴──────────────────────────────────────────────────────────┴─────────────────┴───────────────────┴─────────────────────┴─────────────────────────────────┴────────────────────────┘
+
+Relative diff from the absolute diff from original to maintained
+┌─────────┬───────────────────────────────────────────────────────────────────────────────────────────────────────────────────┬─────────────────┬───────────────────┬─────────────────────┬─────────────────────────────────┬────────────────────────┐
+│ (index) │ scenario │ models_rel_diff │ elements_rel_diff │ conditions_rel_diff │ technology_assignments_rel_diff │ lines_of_code_rel_diff │
+├─────────┼───────────────────────────────────────────────────────────────────────────────────────────────────────────────────┼─────────────────┼───────────────────┼─────────────────────┼─────────────────────────────────┼────────────────────────┤
+│ 0 │ '(VDMM+ Maintenance Manual - VDMM+ Original Manual) / (VDMM Baseline Maintenance - VDMM Baseline Original)' │ 1 │ 0.22 │ 0.74 │ 1 │ 0.29 │
+│ 1 │ '(VDMM+ Maintenance Automated - VDMM+ Original Automated) / (VDMM Baseline Maintenance - VDMM Baseline Original)' │ 1 │ 0.22 │ 0.19 │ 0 │ 0.21 │
+└─────────┴───────────────────────────────────────────────────────────────────────────────────────────────────────────────────┴─────────────────┴───────────────────┴─────────────────────┴─────────────────────────────────┴────────────────────────┘
+
+CAUTION: Is this case study running with the latest implementation?
+
+COMMENT: dropped k8s in VDMM+ original automated
diff --git a/examples/unfurl-technology---boutique---plus-maintenance-automated/scripts/sutdy-013.txt b/examples/unfurl-technology---boutique---plus-maintenance-automated/scripts/sutdy-013.txt
new file mode 100644
index 0000000000..fa9491962e
--- /dev/null
+++ b/examples/unfurl-technology---boutique---plus-maintenance-automated/scripts/sutdy-013.txt
@@ -0,0 +1,178 @@
+
+The technology rules of our case study. Qualities range from bad (0) to good (1).
+┌─────────┬──────────────┬────────────────────────┬─────────────────┬───────────────────────────────────────────────────────┬─────────┬──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
+│ (index) │ Technology │ Component │ Artifact │ Hosting │ Quality │ Reason │
+├─────────┼──────────────┼────────────────────────┼─────────────────┼───────────────────────────────────────────────────────┼─────────┼──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤
+│ 0 │ 'ansible' │ 'docker.engine' │ undefined │ [ 'local.machine' ] │ 1 │ 'Primary use case due to the specialization of Ansible.' │
+│ 1 │ 'terraform' │ 'docker.engine' │ undefined │ [ 'local.machine' ] │ 0 │ 'Ansible is more specialized. Also using provisioners is a "last resort".' │
+│ 2 │ 'ansible' │ 'docker.engine' │ undefined │ [ 'remote.machine' ] │ 1 │ 'Primary use case due to the specialization of Ansible.' │
+│ 3 │ 'terraform' │ 'docker.engine' │ undefined │ [ 'remote.machine' ] │ 0 │ 'Ansible is more specialized. Also using provisioners is a "last resort".' │
+│ 4 │ 'ansible' │ 'gcp.service' │ undefined │ [] │ 0 │ 'Ansible provides a declarative module' │
+│ 5 │ 'terraform' │ 'gcp.service' │ undefined │ [] │ 1 │ 'Terraform provides a declarative module.' │
+│ 6 │ 'ansible' │ 'ingress' │ undefined │ [ 'kubernetes.cluster' ] │ 0.5 │ 'Kubernetes is more specialized.' │
+│ 7 │ 'kubernetes' │ 'ingress' │ undefined │ [ 'kubernetes.cluster' ] │ 1 │ 'Kubernetes is the underlying technology.' │
+│ 8 │ 'terraform' │ 'ingress' │ undefined │ [ 'kubernetes.cluster' ] │ 0.5 │ 'Kubernetes is more specialized.' │
+│ 9 │ 'ansible' │ 'ingress' │ undefined │ [ 'local.machine' ] │ 1 │ 'Primary use case due to the specialization of Ansible.' │
+│ 10 │ 'terraform' │ 'ingress' │ undefined │ [ 'local.machine' ] │ 0 │ 'Ansible is more specialized. Also using provisioners is a "last resort".' │
+│ 11 │ 'ansible' │ 'ingress' │ undefined │ [ 'remote.machine' ] │ 1 │ 'Primary use case due to the specialization of Ansible.' │
+│ 12 │ 'terraform' │ 'ingress' │ undefined │ [ 'remote.machine' ] │ 0 │ 'Ansible is more specialized. Also using provisioners is a "last resort".' │
+│ 13 │ 'ansible' │ 'mysql.database' │ undefined │ [ 'mysql.dbms', 'docker.engine', 'local.machine' ] │ 1 │ 'Primary use case due to the specialization of Ansible.' │
+│ 14 │ 'compose' │ 'mysql.database' │ undefined │ [ 'mysql.dbms', 'docker.engine', 'local.machine' ] │ 0 │ 'One-time use docker container ("fake Kubernetes job") with imperative parts, while other technologies provide declarative modules.' │
+│ 15 │ 'terraform' │ 'mysql.database' │ undefined │ [ 'mysql.dbms', 'docker.engine', 'local.machine' ] │ 1 │ 'Terraform provides a declarative module.' │
+│ 16 │ 'ansible' │ 'mysql.database' │ undefined │ [ 'mysql.dbms', 'docker.engine', 'remote.machine' ] │ 1 │ 'Primary use case due to the specialization of Ansible.' │
+│ 17 │ 'compose' │ 'mysql.database' │ undefined │ [ 'mysql.dbms', 'docker.engine', 'remote.machine' ] │ 0 │ 'One-time use docker container ("fake Kubernetes job") with imperative parts, while other technologies provide declarative modules.' │
+│ 18 │ 'terraform' │ 'mysql.database' │ undefined │ [ 'mysql.dbms', 'docker.engine', 'remote.machine' ] │ 0.75 │ 'Terraform provides a declarative module. However, Terraform requires an SSH workaround. Ansible is more specialized.' │
+│ 19 │ 'ansible' │ 'mysql.database' │ undefined │ [ 'mysql.dbms', 'gcp.cloudsql' ] │ 0 │ 'Primary use case due to the specialization of Ansible. However, need to install and handle GCP CloudSQL Proxy, while the corresponding Terraform module already provides this.' │
+│ 20 │ 'terraform' │ 'mysql.database' │ undefined │ [ 'mysql.dbms', 'gcp.cloudsql' ] │ 1 │ 'Terraform provides a declarative module.' │
+│ 21 │ 'ansible' │ 'mysql.database' │ undefined │ [ 'mysql.dbms', 'kubernetes.cluster' ] │ 1 │ 'Primary use case due to the specialization of Ansible.' │
+│ 22 │ 'kubernetes' │ 'mysql.database' │ undefined │ [ 'mysql.dbms', 'kubernetes.cluster' ] │ 0 │ 'Kubernetes Job with imperative parts, while declarative other technologies provide declarative modules.' │
+│ 23 │ 'terraform' │ 'mysql.database' │ undefined │ [ 'mysql.dbms', 'kubernetes.cluster' ] │ 0.25 │ 'Ansible is more specialized.' │
+│ 24 │ 'ansible' │ 'mysql.database' │ undefined │ [ 'mysql.dbms', 'local.machine' ] │ 1 │ 'Primary use case due to the specialization of Ansible.' │
+│ 25 │ 'terraform' │ 'mysql.database' │ undefined │ [ 'mysql.dbms', 'local.machine' ] │ 1 │ 'Terraform provides a declarative module.' │
+│ 26 │ 'ansible' │ 'mysql.database' │ undefined │ [ 'mysql.dbms', 'remote.machine' ] │ 1 │ 'Primary use case due to the specialization of Ansible.' │
+│ 27 │ 'terraform' │ 'mysql.database' │ undefined │ [ 'mysql.dbms', 'remote.machine' ] │ 0.5 │ 'Terraform provides a declarative module. However, Terraform requires an SSH workaround. Ansible is more specialized.' │
+│ 28 │ 'ansible' │ 'mysql.dbms' │ 'dbms.image' │ [ 'docker.engine', 'local.machine' ] │ 0.5 │ 'Docker Compose is more specialized' │
+│ 29 │ 'compose' │ 'mysql.dbms' │ 'dbms.image' │ [ 'docker.engine', 'local.machine' ] │ 1 │ 'Docker is the underlying technology.' │
+│ 30 │ 'terraform' │ 'mysql.dbms' │ 'dbms.image' │ [ 'docker.engine', 'local.machine' ] │ 0.5 │ 'Docker Compose is more specialized.' │
+│ 31 │ 'ansible' │ 'mysql.dbms' │ 'dbms.image' │ [ 'docker.engine', 'remote.machine' ] │ 0.5 │ 'Docker Compose is more specialized' │
+│ 32 │ 'compose' │ 'mysql.dbms' │ 'dbms.image' │ [ 'docker.engine', 'remote.machine' ] │ 1 │ 'Docker is the underlying technology.' │
+│ 33 │ 'terraform' │ 'mysql.dbms' │ 'dbms.image' │ [ 'docker.engine', 'remote.machine' ] │ 0.5 │ 'Docker Compose is more specialized.' │
+│ 34 │ 'ansible' │ 'mysql.dbms' │ 'dbms.image' │ [ 'gcp.cloudsql' ] │ 0 │ 'Primary use case due to the specialization of Ansible.' │
+│ 35 │ 'terraform' │ 'mysql.dbms' │ 'dbms.image' │ [ 'gcp.cloudsql' ] │ 1 │ 'Terraform provides a declarative module.' │
+│ 36 │ 'ansible' │ 'mysql.dbms' │ 'dbms.image' │ [ 'kubernetes.cluster' ] │ 0.5 │ 'Kubernetes is more specialized.' │
+│ 37 │ 'kubernetes' │ 'mysql.dbms' │ 'dbms.image' │ [ 'kubernetes.cluster' ] │ 1 │ 'Kubernetes is the underlying technology.' │
+│ 38 │ 'terraform' │ 'mysql.dbms' │ 'dbms.image' │ [ 'kubernetes.cluster' ] │ 0.5 │ 'Kubernetes is more specialized.' │
+│ 39 │ 'ansible' │ 'mysql.dbms' │ 'dbms.image' │ [ 'local.machine' ] │ 1 │ 'Primary use case due to the specialization of Ansible.' │
+│ 40 │ 'terraform' │ 'mysql.dbms' │ 'dbms.image' │ [ 'local.machine' ] │ 0 │ 'Ansible is more specialized. Also using provisioners is a "last resort".' │
+│ 41 │ 'ansible' │ 'mysql.dbms' │ 'dbms.image' │ [ 'remote.machine' ] │ 1 │ 'Primary use case due to the specialization of Ansible.' │
+│ 42 │ 'terraform' │ 'mysql.dbms' │ 'dbms.image' │ [ 'remote.machine' ] │ 0 │ 'Ansible is more specialized. Also using provisioners is a "last resort".' │
+│ 43 │ 'ansible' │ 'object.storage' │ undefined │ [ 'gcp.cloudstorage' ] │ 0 │ 'Primary use case due to the specialization of Ansible.' │
+│ 44 │ 'terraform' │ 'object.storage' │ undefined │ [ 'gcp.cloudstorage' ] │ 1 │ 'Terraform provides a declarative module.' │
+│ 45 │ 'ansible' │ 'object.storage' │ undefined │ [ 'minio.server', 'docker.engine', 'local.machine' ] │ 1 │ 'Primary use case due to the specialization of Ansible.' │
+│ 46 │ 'compose' │ 'object.storage' │ undefined │ [ 'minio.server', 'docker.engine', 'local.machine' ] │ 0 │ 'One-time use docker container ("fake Kubernetes job") with imperative parts, while other technologies provide declarative modules.' │
+│ 47 │ 'terraform' │ 'object.storage' │ undefined │ [ 'minio.server', 'docker.engine', 'local.machine' ] │ 1 │ 'Terraform provides a declarative module.' │
+│ 48 │ 'ansible' │ 'object.storage' │ undefined │ [ 'minio.server', 'docker.engine', 'remote.machine' ] │ 1 │ 'Primary use case due to the specialization of Ansible.' │
+│ 49 │ 'compose' │ 'object.storage' │ undefined │ [ 'minio.server', 'docker.engine', 'remote.machine' ] │ 0 │ 'One-time use docker container ("fake Kubernetes job") with imperative parts, while other technologies provide declarative modules.' │
+│ 50 │ 'terraform' │ 'object.storage' │ undefined │ [ 'minio.server', 'docker.engine', 'remote.machine' ] │ 0.75 │ 'Terraform provides a declarative module. However, Terraform requires an SSH workaround. Ansible is more specialized.' │
+│ 51 │ 'ansible' │ 'object.storage' │ undefined │ [ 'minio.server', 'kubernetes.cluster' ] │ 1 │ 'Primary use case due to the specialization of Ansible.' │
+│ 52 │ 'kubernetes' │ 'object.storage' │ undefined │ [ 'minio.server', 'kubernetes.cluster' ] │ 0 │ 'Kubernetes Job with imperative parts, while declarative other technologies provide declarative modules.' │
+│ 53 │ 'terraform' │ 'object.storage' │ undefined │ [ 'minio.server', 'kubernetes.cluster' ] │ 0.25 │ 'Ansible is more specialized.' │
+│ 54 │ 'ansible' │ 'redis.server' │ 'cache.image' │ [ 'docker.engine', 'local.machine' ] │ 0.5 │ 'Docker Compose is more specialized.' │
+│ 55 │ 'compose' │ 'redis.server' │ 'cache.image' │ [ 'docker.engine', 'local.machine' ] │ 1 │ 'Docker is the underlying technology.' │
+│ 56 │ 'terraform' │ 'redis.server' │ 'cache.image' │ [ 'docker.engine', 'local.machine' ] │ 0.5 │ 'Docker Compose is more specialized.' │
+│ 57 │ 'ansible' │ 'redis.server' │ 'cache.image' │ [ 'docker.engine', 'remote.machine' ] │ 0.5 │ 'Docker Compose is more specialized.' │
+│ 58 │ 'compose' │ 'redis.server' │ 'cache.image' │ [ 'docker.engine', 'remote.machine' ] │ 1 │ 'Docker is the underlying technology.' │
+│ 59 │ 'terraform' │ 'redis.server' │ 'cache.image' │ [ 'docker.engine', 'remote.machine' ] │ 0.5 │ 'Docker Compose is more specialized.' │
+│ 60 │ 'ansible' │ 'redis.server' │ 'cache.image' │ [ 'gcp.memorystore' ] │ 0 │ 'Primary use case due to the specialization of Ansible.' │
+│ 61 │ 'terraform' │ 'redis.server' │ 'cache.image' │ [ 'gcp.memorystore' ] │ 1 │ 'Terraform provides a declarative module.' │
+│ 62 │ 'ansible' │ 'redis.server' │ 'cache.image' │ [ 'kubernetes.cluster' ] │ 0.5 │ 'Kubernetes is more specialized.' │
+│ 63 │ 'kubernetes' │ 'redis.server' │ 'cache.image' │ [ 'kubernetes.cluster' ] │ 1 │ 'Kubernetes is the underlying technology.' │
+│ 64 │ 'terraform' │ 'redis.server' │ 'cache.image' │ [ 'kubernetes.cluster' ] │ 0.5 │ 'Kubernetes is more specialized.' │
+│ 65 │ 'ansible' │ 'service.application' │ 'docker.image' │ [ 'docker.engine', 'local.machine' ] │ 0.5 │ 'Docker Compose is more specialized.' │
+│ 66 │ 'compose' │ 'service.application' │ 'docker.image' │ [ 'docker.engine', 'local.machine' ] │ 1 │ 'Docker is the underlying technology.' │
+│ 67 │ 'terraform' │ 'service.application' │ 'docker.image' │ [ 'docker.engine', 'local.machine' ] │ 0.5 │ 'Docker Compose is more specialized.' │
+│ 68 │ 'ansible' │ 'service.application' │ 'docker.image' │ [ 'docker.engine', 'remote.machine' ] │ 0.5 │ 'Docker Compose is more specialized.' │
+│ 69 │ 'compose' │ 'service.application' │ 'docker.image' │ [ 'docker.engine', 'remote.machine' ] │ 1 │ 'Docker is the underlying technology.' │
+│ 70 │ 'terraform' │ 'service.application' │ 'docker.image' │ [ 'docker.engine', 'remote.machine' ] │ 0.5 │ 'Docker Compose is more specialized.' │
+│ 71 │ 'ansible' │ 'service.application' │ 'docker.image' │ [ 'gcp.cloudrun' ] │ 0 │ 'Custom module with imperative parts, while Terraform provides a declarative module.' │
+│ 72 │ 'terraform' │ 'service.application' │ 'docker.image' │ [ 'gcp.cloudrun' ] │ 1 │ 'Terraform provides a declarative module.' │
+│ 73 │ 'ansible' │ 'service.application' │ 'docker.image' │ [ 'kubernetes.cluster' ] │ 0.5 │ 'Kubernetes is more specialized.' │
+│ 74 │ 'kubernetes' │ 'service.application' │ 'docker.image' │ [ 'kubernetes.cluster' ] │ 1 │ 'Kubernetes is the underlying technology.' │
+│ 75 │ 'terraform' │ 'service.application' │ 'docker.image' │ [ 'kubernetes.cluster' ] │ 0.5 │ 'Kubernetes is more specialized.' │
+│ 76 │ 'ansible' │ 'service.application' │ 'tar.archive' │ [ '*', 'local.machine' ] │ 1 │ 'Primary use case due to the specialization of Ansible. Special integration for systemd.' │
+│ 77 │ 'terraform' │ 'service.application' │ 'tar.archive' │ [ '*', 'local.machine' ] │ 0 │ 'Ansible is more specialized. Also using provisioners is a "last resort".' │
+│ 78 │ 'ansible' │ 'service.application' │ 'tar.archive' │ [ '*', 'remote.machine' ] │ 1 │ 'Primary use case due to the specialization of Ansible. Special integration for systemd.' │
+│ 79 │ 'terraform' │ 'service.application' │ 'tar.archive' │ [ '*', 'remote.machine' ] │ 0 │ 'Ansible is more specialized. Also using provisioners is a "last resort".' │
+│ 80 │ 'ansible' │ 'service.application' │ 'zip.archive' │ [ '*', 'local.machine' ] │ 1 │ 'Primary use case due to the specialization of Ansible. Special integration for systemd.' │
+│ 81 │ 'terraform' │ 'service.application' │ 'zip.archive' │ [ '*', 'local.machine' ] │ 0 │ 'Ansible is more specialized. Also using provisioners is a "last resort".' │
+│ 82 │ 'ansible' │ 'service.application' │ 'zip.archive' │ [ '*', 'remote.machine' ] │ 1 │ 'Primary use case due to the specialization of Ansible. Special integration for systemd.' │
+│ 83 │ 'terraform' │ 'service.application' │ 'zip.archive' │ [ '*', 'remote.machine' ] │ 0 │ 'Ansible is more specialized. Also using provisioners is a "last resort".' │
+│ 84 │ 'ansible' │ 'service.application' │ 'zip.archive' │ [ 'gcp.appengine' ] │ 0 │ 'Custom module with imperative parts, while Terraform provides a declarative module.' │
+│ 85 │ 'terraform' │ 'service.application' │ 'zip.archive' │ [ 'gcp.appengine' ] │ 1 │ 'Terraform provides a declarative module.' │
+│ 86 │ 'ansible' │ 'software.application' │ 'apt.package' │ [ '*', 'local.machine' ] │ 1 │ 'Primary use case due to the specialization of Ansible.' │
+│ 87 │ 'terraform' │ 'software.application' │ 'apt.package' │ [ '*', 'local.machine' ] │ 0 │ 'Ansible is more specialized. Also using provisioners is a "last resort".' │
+│ 88 │ 'ansible' │ 'software.application' │ 'apt.package' │ [ '*', 'remote.machine' ] │ 1 │ 'Primary use case due to the specialization of Ansible.' │
+│ 89 │ 'terraform' │ 'software.application' │ 'apt.package' │ [ '*', 'remote.machine' ] │ 0 │ 'Ansible is more specialized. Also using provisioners is a "last resort".' │
+│ 90 │ 'ansible' │ 'software.application' │ 'tar.archive' │ [ '*', 'local.machine' ] │ 1 │ 'While this is a primary use case due to the specialization of Ansible, we must rely on scripts. More specialized types should be used, e.g., service.application.' │
+│ 91 │ 'terraform' │ 'software.application' │ 'tar.archive' │ [ '*', 'local.machine' ] │ 0 │ 'Ansible is more specialized. Also using provisioners is a "last resort".' │
+│ 92 │ 'ansible' │ 'software.application' │ 'tar.archive' │ [ '*', 'remote.machine' ] │ 1 │ 'While this is a primary use case due to the specialization of Ansible, we must rely on scripts. More specialized types should be used, e.g., "service.application".' │
+│ 93 │ 'terraform' │ 'software.application' │ 'tar.archive' │ [ '*', 'remote.machine' ] │ 0 │ 'Ansible is more specialized. Also using provisioners is a "last resort".' │
+│ 94 │ 'ansible' │ 'software.application' │ 'zip.archive' │ [ '*', 'local.machine' ] │ 1 │ 'While this is a primary use case due to the specialization of Ansible, we must rely on scripts. More specialized types should be used, e.g., service.application.' │
+│ 95 │ 'terraform' │ 'software.application' │ 'zip.archive' │ [ '*', 'local.machine' ] │ 0 │ 'Ansible is more specialized. Also using provisioners is a "last resort".' │
+│ 96 │ 'ansible' │ 'software.application' │ 'zip.archive' │ [ '*', 'remote.machine' ] │ 1 │ 'While this is a primary use case due to the specialization of Ansible, we must rely on scripts. More specialized types should be used, e.g., service.application.' │
+│ 97 │ 'terraform' │ 'software.application' │ 'zip.archive' │ [ '*', 'remote.machine' ] │ 0 │ 'Ansible is more specialized. Also using provisioners is a "last resort".' │
+│ 98 │ 'ansible' │ 'virtual.machine' │ 'machine.image' │ [ 'openstack.provider' ] │ 0.5 │ 'Terraform is more specialized.' │
+│ 99 │ 'terraform' │ 'virtual.machine' │ 'machine.image' │ [ 'openstack.provider' ] │ 1 │ 'Terraform provides a declarative module.' │
+└─────────┴──────────────┴────────────────────────┴─────────────────┴───────────────────────────────────────────────────────┴─────────┴──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
+
+Metrics relevant when modeling the different scenarios
+┌─────────┬────────────────────────────┬────────┬──────────┬────────────┬────────────────────────┬───────────────┐
+│ (index) │ scenario │ models │ elements │ conditions │ technology_assignments │ lines_of_code │
+├─────────┼────────────────────────────┼────────┼──────────┼────────────┼────────────────────────┼───────────────┤
+│ 0 │ 'EDMM "gcp"' │ 1 │ 136 │ 0 │ 14 │ 325 │
+│ 1 │ 'EDMM "os-medium"' │ 1 │ 181 │ 0 │ 18 │ 421 │
+│ 2 │ 'EDMM "os-large"' │ 1 │ 181 │ 0 │ 18 │ 421 │
+│ 3 │ 'EDMM Total' │ 3 │ 498 │ 0 │ 50 │ 1167 │
+│ 4 │ 'VDMM Baseline Original' │ 1 │ 328 │ 34 │ 32 │ 768 │
+│ 5 │ 'VDMM+ Original Manual' │ 1 │ 210 │ 46 │ 32 │ 585 │
+│ 6 │ 'VDMM+ Original Automated' │ 1 │ 210 │ 22 │ 0 │ 517 │
+└─────────┴────────────────────────────┴────────┴──────────┴────────────┴────────────────────────┴───────────────┘
+
+Absolute diff when modeling the different original scenarios
+┌─────────┬─────────────────────────────────────────────────────┬─────────────────┬───────────────────┬─────────────────────┬─────────────────────────────────┬────────────────────────┐
+│ (index) │ scenario │ models_abs_diff │ elements_abs_diff │ conditions_abs_diff │ technology_assignments_abs_diff │ lines_of_code_abs_diff │
+├─────────┼─────────────────────────────────────────────────────┼─────────────────┼───────────────────┼─────────────────────┼─────────────────────────────────┼────────────────────────┤
+│ 0 │ 'VDMM Baseline Original - EDMM Total' │ -2 │ -170 │ 34 │ -18 │ -399 │
+│ 1 │ 'VDMM+ Original Manual - VDMM Baseline Original' │ 0 │ -118 │ 12 │ 0 │ -183 │
+│ 2 │ 'VDMM+ Original Automated - VDMM Baseline Original' │ 0 │ -118 │ -12 │ -32 │ -251 │
+└─────────┴─────────────────────────────────────────────────────┴─────────────────┴───────────────────┴─────────────────────┴─────────────────────────────────┴────────────────────────┘
+
+Relative diff when modeling the different original scenarios
+┌─────────┬─────────────────────────────────────────────────────┬─────────────────┬───────────────────┬─────────────────────┬─────────────────────────────────┬────────────────────────┐
+│ (index) │ scenario │ models_rel_diff │ elements_rel_diff │ conditions_rel_diff │ technology_assignments_rel_diff │ lines_of_code_rel_diff │
+├─────────┼─────────────────────────────────────────────────────┼─────────────────┼───────────────────┼─────────────────────┼─────────────────────────────────┼────────────────────────┤
+│ 0 │ 'VDMM Baseline Original / EDMM Total' │ 0.33 │ 0.66 │ Infinity │ 0.64 │ 0.66 │
+│ 1 │ 'VDMM+ Original Manual / VDMM Baseline Original' │ 1 │ 0.64 │ 1.35 │ 1 │ 0.76 │
+│ 2 │ 'VDMM+ Original Automated / VDMM Baseline Original' │ 1 │ 0.64 │ 0.65 │ 0 │ 0.67 │
+└─────────┴─────────────────────────────────────────────────────┴─────────────────┴───────────────────┴─────────────────────┴─────────────────────────────────┴────────────────────────┘
+
+Qualities of the derived deployment models, i.e., the deployment variants, of the different scenarios ranging from bad (0) to good (1).
+┌─────────┬─────────────┬────────────┬───────────────────────────────┬───────────────────────────────┬──────────────────────────────────────┬────────────┬──────────────────┐
+│ (index) │ scenario │ expert │ non_expert │ random │ counting │ quality │ quality_counting │
+├─────────┼─────────────┼────────────┼───────────────────────────────┼───────────────────────────────┼──────────────────────────────────────┼────────────┼──────────────────┤
+│ 0 │ 'gcp' │ 'good (1)' │ [ 'bad (0)', 'good (1)' ] │ [ 'bad (0)', 'good (1)' ] │ [ 'bad (0)', 'good (1)' ] │ 'good (1)' │ 'good (1)' │
+│ 1 │ 'os-medium' │ 'good (1)' │ [ 'poor (0.34)', 'good (1)' ] │ [ 'poor (0.34)', 'good (1)' ] │ [ 'moderate (0.41)', 'fair (0.66)' ] │ 'good (1)' │ 'good (1)' │
+│ 2 │ 'os-large' │ 'good (1)' │ [ 'poor (0.34)', 'good (1)' ] │ [ 'poor (0.34)', 'good (1)' ] │ [ 'moderate (0.41)', 'fair (0.66)' ] │ 'good (1)' │ 'good (1)' │
+└─────────┴─────────────┴────────────┴───────────────────────────────┴───────────────────────────────┴──────────────────────────────────────┴────────────┴──────────────────┘
+
+Metrics relevant when modeling the maintenance scenario of our case study
+┌─────────┬───────────────────────────────┬────────┬──────────┬────────────┬────────────────────────┬───────────────┐
+│ (index) │ scenario │ models │ elements │ conditions │ technology_assignments │ lines_of_code │
+├─────────┼───────────────────────────────┼────────┼──────────┼────────────┼────────────────────────┼───────────────┤
+│ 0 │ 'VDMM Baseline Maintenance' │ 1 │ 509 │ 65 │ 47 │ 1162 │
+│ 1 │ 'VDMM+ Maintenance Manual' │ 1 │ 249 │ 69 │ 47 │ 700 │
+│ 2 │ 'VDMM+ Maintenance Automated' │ 1 │ 249 │ 28 │ 0 │ 599 │
+└─────────┴───────────────────────────────┴────────┴──────────┴────────────┴────────────────────────┴───────────────┘
+
+Absolute diff from original to maintained
+┌─────────┬──────────────────────────────────────────────────────────┬─────────────────┬───────────────────┬─────────────────────┬─────────────────────────────────┬────────────────────────┐
+│ (index) │ scenario │ models_abs_diff │ elements_abs_diff │ conditions_abs_diff │ technology_assignments_abs_diff │ lines_of_code_abs_diff │
+├─────────┼──────────────────────────────────────────────────────────┼─────────────────┼───────────────────┼─────────────────────┼─────────────────────────────────┼────────────────────────┤
+│ 0 │ 'VDMM Baseline Maintenance - VDMM Baseline Original' │ 0 │ 181 │ 31 │ 15 │ 394 │
+│ 1 │ 'VDMM+ Maintenance Manual - VDMM+ Original Manual' │ 0 │ 39 │ 23 │ 15 │ 115 │
+│ 2 │ 'VDMM+ Maintenance Automated - VDMM+ Original Automated' │ 0 │ 39 │ 6 │ 0 │ 82 │
+└─────────┴──────────────────────────────────────────────────────────┴─────────────────┴───────────────────┴─────────────────────┴─────────────────────────────────┴────────────────────────┘
+
+Relative diff from the absolute diff from original to maintained
+┌─────────┬───────────────────────────────────────────────────────────────────────────────────────────────────────────────────┬─────────────────┬───────────────────┬─────────────────────┬─────────────────────────────────┬────────────────────────┐
+│ (index) │ scenario │ models_rel_diff │ elements_rel_diff │ conditions_rel_diff │ technology_assignments_rel_diff │ lines_of_code_rel_diff │
+├─────────┼───────────────────────────────────────────────────────────────────────────────────────────────────────────────────┼─────────────────┼───────────────────┼─────────────────────┼─────────────────────────────────┼────────────────────────┤
+│ 0 │ '(VDMM+ Maintenance Manual - VDMM+ Original Manual) / (VDMM Baseline Maintenance - VDMM Baseline Original)' │ 1 │ 0.22 │ 0.74 │ 1 │ 0.29 │
+│ 1 │ '(VDMM+ Maintenance Automated - VDMM+ Original Automated) / (VDMM Baseline Maintenance - VDMM Baseline Original)' │ 1 │ 0.22 │ 0.19 │ 0 │ 0.21 │
+└─────────┴───────────────────────────────────────────────────────────────────────────────────────────────────────────────────┴─────────────────┴───────────────────┴─────────────────────┴─────────────────────────────────┴────────────────────────┘
+
+CAUTION: Is this case study running with the latest implementation?
+
+COMMENT: drop some not required variability options
+
+COMMENT: used in SPE publication
diff --git a/examples/unfurl-technology---boutique---plus-maintenance-automated/study.yaml b/examples/unfurl-technology---boutique---plus-maintenance-automated/study.yaml
index 4b4ad8fb49..a23c2f4bde 100644
--- a/examples/unfurl-technology---boutique---plus-maintenance-automated/study.yaml
+++ b/examples/unfurl-technology---boutique---plus-maintenance-automated/study.yaml
@@ -1,6 +1,5 @@
study: technology
originals:
- gcp
- - kubernetes
- os-medium
- os-large
diff --git a/examples/unfurl-technology---boutique---plus-maintenance-manual/variable-service-template.yaml b/examples/unfurl-technology---boutique---plus-maintenance-manual/variable-service-template.yaml
index 4892e0e876..66dd79d81a 100644
--- a/examples/unfurl-technology---boutique---plus-maintenance-manual/variable-service-template.yaml
+++ b/examples/unfurl-technology---boutique---plus-maintenance-manual/variable-service-template.yaml
@@ -99,9 +99,6 @@ topology_template:
type: boolean
default: false
- options:
- enrich_technologies: false
-
node_templates:
###################################################
#
diff --git a/examples/unfurl-technology---boutique---plus-original-automated/variable-service-template.yaml b/examples/unfurl-technology---boutique---plus-original-automated/variable-service-template.yaml
index 7b047b5bfb..87b630f3dd 100644
--- a/examples/unfurl-technology---boutique---plus-original-automated/variable-service-template.yaml
+++ b/examples/unfurl-technology---boutique---plus-original-automated/variable-service-template.yaml
@@ -53,22 +53,9 @@ topology_template:
gcp_project:
type: string
- k8s_host:
- type: string
-
- k8s_ca_cert_file:
- type: string
-
- k8s_client_cert_file:
- type: string
-
- k8s_client_key_file:
- type: string
-
variability:
expressions:
is_gcp: {equal: [{variability_input: env}, GCP]}
- is_kubernetes: {equal: [{variability_input: env}, KUBERNETES]}
is_openstack: {equal: [{variability_input: env}, OPENSTACK]}
has_optional_payment_feature: {equal: [{variability_input: optional_payment_feature}, true]}
has_premium_payment_feature: {equal: [{variability_input: premium_payment_feature}, true]}
@@ -143,7 +130,6 @@ topology_template:
- recommendation: recommendation_component
- advertisement: advertisement_component
- host: docker_engine
- - host: kubernetes_cluster
- host: gcp_cloudrun
artifacts:
- docker_image:
@@ -154,7 +140,6 @@ topology_template:
type: ingress
requirements:
- application: frontend_component
- - host: kubernetes_cluster
- host: virtual_machine
###################################################
@@ -196,7 +181,6 @@ topology_template:
- cart: cart_component
- product: product_component
- host: docker_engine
- - host: kubernetes_cluster
- host: gcp_cloudrun
artifacts:
- docker_image:
@@ -218,7 +202,6 @@ topology_template:
- disable_profiler: '1'
requirements:
- host: docker_engine
- - host: kubernetes_cluster
- host: gcp_cloudrun
artifacts:
- docker_image:
@@ -252,7 +235,6 @@ topology_template:
conditions: {not: {logic_expression: has_premium_payment_feature}}
requirements:
- host: docker_engine
- - host: kubernetes_cluster
- host: gcp_cloudrun
artifacts:
- docker_image:
@@ -274,7 +256,6 @@ topology_template:
- disable_profiler: '1'
requirements:
- host: docker_engine
- - host: kubernetes_cluster
- host: gcp_cloudrun
artifacts:
- docker_image:
@@ -296,7 +277,6 @@ topology_template:
- disable_profiler: '1'
requirements:
- host: docker_engine
- - host: kubernetes_cluster
- host: gcp_cloudrun
artifacts:
- docker_image:
@@ -326,7 +306,6 @@ topology_template:
requirements:
- database: cart_database
- host: docker_engine
- - host: kubernetes_cluster
- host: gcp_cloudrun
artifacts:
- docker_image:
@@ -349,7 +328,6 @@ topology_template:
- dbms_password: {get_input: dbms_password}
requirements:
- host: docker_engine
- - host: kubernetes_cluster
- host: gcp_cloudsql
artifacts:
- dbms_image:
@@ -371,7 +349,6 @@ topology_template:
- disable_profiler: '1'
requirements:
- host: docker_engine
- - host: kubernetes_cluster
- host: gcp_cloudrun
artifacts:
- docker_image:
@@ -395,7 +372,6 @@ topology_template:
requirements:
- product: product_component
- host: docker_engine
- - host: kubernetes_cluster
- host: gcp_cloudrun
artifacts:
- docker_image:
@@ -417,7 +393,6 @@ topology_template:
- disable_profiler: '1'
requirements:
- host: docker_engine
- - host: kubernetes_cluster
- host: gcp_cloudrun
artifacts:
- docker_image:
@@ -539,23 +514,3 @@ topology_template:
- gcp_region: {get_input: gcp_region}
- gcp_service_account_file: {get_input: gcp_service_account_file}
- gcp_project: {get_input: gcp_project}
-
- ###################################################
- #
- # Kubernetes
- #
- ###################################################
-
- kubernetes_cluster:
- type: kubernetes.cluster
- conditions: {logic_expression: is_kubernetes}
- properties:
- - k8s_host: {get_input: k8s_host}
- - k8s_ca_cert_file: {get_input: k8s_ca_cert_file}
- - k8s_client_cert_file: {get_input: k8s_client_cert_file}
- - k8s_client_key_file: {get_input: k8s_client_key_file}
- requirements:
- - host: kubernetes_provider
-
- kubernetes_provider:
- type: cloud.provider
diff --git a/examples/unfurl-technology---boutique---plus-original-manual/variable-service-template.yaml b/examples/unfurl-technology---boutique---plus-original-manual/variable-service-template.yaml
index 9b0efb263d..9e7157c3d6 100644
--- a/examples/unfurl-technology---boutique---plus-original-manual/variable-service-template.yaml
+++ b/examples/unfurl-technology---boutique---plus-original-manual/variable-service-template.yaml
@@ -86,9 +86,6 @@ topology_template:
type: boolean
default: false
- options:
- enrich_technologies: false
-
node_templates:
###################################################
#
diff --git a/examples/unfurl-technology---industry---plus-maintenance-automated/scripts/study-005.txt b/examples/unfurl-technology---industry---plus-maintenance-automated/scripts/study-005.txt
new file mode 100644
index 0000000000..d2f290ac7b
--- /dev/null
+++ b/examples/unfurl-technology---industry---plus-maintenance-automated/scripts/study-005.txt
@@ -0,0 +1,178 @@
+
+The technology rules of our case study. Qualities range from bad (0) to good (1).
+┌─────────┬──────────────┬────────────────────────┬─────────────────┬───────────────────────────────────────────────────────┬─────────┬──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
+│ (index) │ Technology │ Component │ Artifact │ Hosting │ Quality │ Reason │
+├─────────┼──────────────┼────────────────────────┼─────────────────┼───────────────────────────────────────────────────────┼─────────┼──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤
+│ 0 │ 'ansible' │ 'docker.engine' │ undefined │ [ 'local.machine' ] │ 1 │ 'Primary use case due to the specialization of Ansible.' │
+│ 1 │ 'terraform' │ 'docker.engine' │ undefined │ [ 'local.machine' ] │ 0 │ 'Ansible is more specialized. Also using provisioners is a "last resort".' │
+│ 2 │ 'ansible' │ 'docker.engine' │ undefined │ [ 'remote.machine' ] │ 1 │ 'Primary use case due to the specialization of Ansible.' │
+│ 3 │ 'terraform' │ 'docker.engine' │ undefined │ [ 'remote.machine' ] │ 0 │ 'Ansible is more specialized. Also using provisioners is a "last resort".' │
+│ 4 │ 'ansible' │ 'gcp.service' │ undefined │ [] │ 0 │ 'Ansible provides a declarative module' │
+│ 5 │ 'terraform' │ 'gcp.service' │ undefined │ [] │ 1 │ 'Terraform provides a declarative module.' │
+│ 6 │ 'ansible' │ 'ingress' │ undefined │ [ 'kubernetes.cluster' ] │ 0.5 │ 'Kubernetes is more specialized.' │
+│ 7 │ 'kubernetes' │ 'ingress' │ undefined │ [ 'kubernetes.cluster' ] │ 1 │ 'Kubernetes is the underlying technology.' │
+│ 8 │ 'terraform' │ 'ingress' │ undefined │ [ 'kubernetes.cluster' ] │ 0.5 │ 'Kubernetes is more specialized.' │
+│ 9 │ 'ansible' │ 'ingress' │ undefined │ [ 'local.machine' ] │ 1 │ 'Primary use case due to the specialization of Ansible.' │
+│ 10 │ 'terraform' │ 'ingress' │ undefined │ [ 'local.machine' ] │ 0 │ 'Ansible is more specialized. Also using provisioners is a "last resort".' │
+│ 11 │ 'ansible' │ 'ingress' │ undefined │ [ 'remote.machine' ] │ 1 │ 'Primary use case due to the specialization of Ansible.' │
+│ 12 │ 'terraform' │ 'ingress' │ undefined │ [ 'remote.machine' ] │ 0 │ 'Ansible is more specialized. Also using provisioners is a "last resort".' │
+│ 13 │ 'ansible' │ 'mysql.database' │ undefined │ [ 'mysql.dbms', 'docker.engine', 'local.machine' ] │ 1 │ 'Primary use case due to the specialization of Ansible.' │
+│ 14 │ 'compose' │ 'mysql.database' │ undefined │ [ 'mysql.dbms', 'docker.engine', 'local.machine' ] │ 0 │ 'One-time use docker container ("fake Kubernetes job") with imperative parts, while other technologies provide declarative modules.' │
+│ 15 │ 'terraform' │ 'mysql.database' │ undefined │ [ 'mysql.dbms', 'docker.engine', 'local.machine' ] │ 1 │ 'Terraform provides a declarative module.' │
+│ 16 │ 'ansible' │ 'mysql.database' │ undefined │ [ 'mysql.dbms', 'docker.engine', 'remote.machine' ] │ 1 │ 'Primary use case due to the specialization of Ansible.' │
+│ 17 │ 'compose' │ 'mysql.database' │ undefined │ [ 'mysql.dbms', 'docker.engine', 'remote.machine' ] │ 0 │ 'One-time use docker container ("fake Kubernetes job") with imperative parts, while other technologies provide declarative modules.' │
+│ 18 │ 'terraform' │ 'mysql.database' │ undefined │ [ 'mysql.dbms', 'docker.engine', 'remote.machine' ] │ 0.75 │ 'Terraform provides a declarative module. However, Terraform requires an SSH workaround. Ansible is more specialized.' │
+│ 19 │ 'ansible' │ 'mysql.database' │ undefined │ [ 'mysql.dbms', 'gcp.cloudsql' ] │ 0 │ 'Primary use case due to the specialization of Ansible. However, need to install and handle GCP CloudSQL Proxy, while the corresponding Terraform module already provides this.' │
+│ 20 │ 'terraform' │ 'mysql.database' │ undefined │ [ 'mysql.dbms', 'gcp.cloudsql' ] │ 1 │ 'Terraform provides a declarative module.' │
+│ 21 │ 'ansible' │ 'mysql.database' │ undefined │ [ 'mysql.dbms', 'kubernetes.cluster' ] │ 1 │ 'Primary use case due to the specialization of Ansible.' │
+│ 22 │ 'kubernetes' │ 'mysql.database' │ undefined │ [ 'mysql.dbms', 'kubernetes.cluster' ] │ 0 │ 'Kubernetes Job with imperative parts, while declarative other technologies provide declarative modules.' │
+│ 23 │ 'terraform' │ 'mysql.database' │ undefined │ [ 'mysql.dbms', 'kubernetes.cluster' ] │ 0.25 │ 'Ansible is more specialized.' │
+│ 24 │ 'ansible' │ 'mysql.database' │ undefined │ [ 'mysql.dbms', 'local.machine' ] │ 1 │ 'Primary use case due to the specialization of Ansible.' │
+│ 25 │ 'terraform' │ 'mysql.database' │ undefined │ [ 'mysql.dbms', 'local.machine' ] │ 1 │ 'Terraform provides a declarative module.' │
+│ 26 │ 'ansible' │ 'mysql.database' │ undefined │ [ 'mysql.dbms', 'remote.machine' ] │ 1 │ 'Primary use case due to the specialization of Ansible.' │
+│ 27 │ 'terraform' │ 'mysql.database' │ undefined │ [ 'mysql.dbms', 'remote.machine' ] │ 0.5 │ 'Terraform provides a declarative module. However, Terraform requires an SSH workaround. Ansible is more specialized.' │
+│ 28 │ 'ansible' │ 'mysql.dbms' │ 'dbms.image' │ [ 'docker.engine', 'local.machine' ] │ 0.5 │ 'Docker Compose is more specialized' │
+│ 29 │ 'compose' │ 'mysql.dbms' │ 'dbms.image' │ [ 'docker.engine', 'local.machine' ] │ 1 │ 'Docker is the underlying technology.' │
+│ 30 │ 'terraform' │ 'mysql.dbms' │ 'dbms.image' │ [ 'docker.engine', 'local.machine' ] │ 0.5 │ 'Docker Compose is more specialized.' │
+│ 31 │ 'ansible' │ 'mysql.dbms' │ 'dbms.image' │ [ 'docker.engine', 'remote.machine' ] │ 0.5 │ 'Docker Compose is more specialized' │
+│ 32 │ 'compose' │ 'mysql.dbms' │ 'dbms.image' │ [ 'docker.engine', 'remote.machine' ] │ 1 │ 'Docker is the underlying technology.' │
+│ 33 │ 'terraform' │ 'mysql.dbms' │ 'dbms.image' │ [ 'docker.engine', 'remote.machine' ] │ 0.5 │ 'Docker Compose is more specialized.' │
+│ 34 │ 'ansible' │ 'mysql.dbms' │ 'dbms.image' │ [ 'gcp.cloudsql' ] │ 0 │ 'Primary use case due to the specialization of Ansible.' │
+│ 35 │ 'terraform' │ 'mysql.dbms' │ 'dbms.image' │ [ 'gcp.cloudsql' ] │ 1 │ 'Terraform provides a declarative module.' │
+│ 36 │ 'ansible' │ 'mysql.dbms' │ 'dbms.image' │ [ 'kubernetes.cluster' ] │ 0.5 │ 'Kubernetes is more specialized.' │
+│ 37 │ 'kubernetes' │ 'mysql.dbms' │ 'dbms.image' │ [ 'kubernetes.cluster' ] │ 1 │ 'Kubernetes is the underlying technology.' │
+│ 38 │ 'terraform' │ 'mysql.dbms' │ 'dbms.image' │ [ 'kubernetes.cluster' ] │ 0.5 │ 'Kubernetes is more specialized.' │
+│ 39 │ 'ansible' │ 'mysql.dbms' │ 'dbms.image' │ [ 'local.machine' ] │ 1 │ 'Primary use case due to the specialization of Ansible.' │
+│ 40 │ 'terraform' │ 'mysql.dbms' │ 'dbms.image' │ [ 'local.machine' ] │ 0 │ 'Ansible is more specialized. Also using provisioners is a "last resort".' │
+│ 41 │ 'ansible' │ 'mysql.dbms' │ 'dbms.image' │ [ 'remote.machine' ] │ 1 │ 'Primary use case due to the specialization of Ansible.' │
+│ 42 │ 'terraform' │ 'mysql.dbms' │ 'dbms.image' │ [ 'remote.machine' ] │ 0 │ 'Ansible is more specialized. Also using provisioners is a "last resort".' │
+│ 43 │ 'ansible' │ 'object.storage' │ undefined │ [ 'gcp.cloudstorage' ] │ 0 │ 'Primary use case due to the specialization of Ansible.' │
+│ 44 │ 'terraform' │ 'object.storage' │ undefined │ [ 'gcp.cloudstorage' ] │ 1 │ 'Terraform provides a declarative module.' │
+│ 45 │ 'ansible' │ 'object.storage' │ undefined │ [ 'minio.server', 'docker.engine', 'local.machine' ] │ 1 │ 'Primary use case due to the specialization of Ansible.' │
+│ 46 │ 'compose' │ 'object.storage' │ undefined │ [ 'minio.server', 'docker.engine', 'local.machine' ] │ 0 │ 'One-time use docker container ("fake Kubernetes job") with imperative parts, while other technologies provide declarative modules.' │
+│ 47 │ 'terraform' │ 'object.storage' │ undefined │ [ 'minio.server', 'docker.engine', 'local.machine' ] │ 1 │ 'Terraform provides a declarative module.' │
+│ 48 │ 'ansible' │ 'object.storage' │ undefined │ [ 'minio.server', 'docker.engine', 'remote.machine' ] │ 1 │ 'Primary use case due to the specialization of Ansible.' │
+│ 49 │ 'compose' │ 'object.storage' │ undefined │ [ 'minio.server', 'docker.engine', 'remote.machine' ] │ 0 │ 'One-time use docker container ("fake Kubernetes job") with imperative parts, while other technologies provide declarative modules.' │
+│ 50 │ 'terraform' │ 'object.storage' │ undefined │ [ 'minio.server', 'docker.engine', 'remote.machine' ] │ 0.75 │ 'Terraform provides a declarative module. However, Terraform requires an SSH workaround. Ansible is more specialized.' │
+│ 51 │ 'ansible' │ 'object.storage' │ undefined │ [ 'minio.server', 'kubernetes.cluster' ] │ 1 │ 'Primary use case due to the specialization of Ansible.' │
+│ 52 │ 'kubernetes' │ 'object.storage' │ undefined │ [ 'minio.server', 'kubernetes.cluster' ] │ 0 │ 'Kubernetes Job with imperative parts, while declarative other technologies provide declarative modules.' │
+│ 53 │ 'terraform' │ 'object.storage' │ undefined │ [ 'minio.server', 'kubernetes.cluster' ] │ 0.25 │ 'Ansible is more specialized.' │
+│ 54 │ 'ansible' │ 'redis.server' │ 'cache.image' │ [ 'docker.engine', 'local.machine' ] │ 0.5 │ 'Docker Compose is more specialized.' │
+│ 55 │ 'compose' │ 'redis.server' │ 'cache.image' │ [ 'docker.engine', 'local.machine' ] │ 1 │ 'Docker is the underlying technology.' │
+│ 56 │ 'terraform' │ 'redis.server' │ 'cache.image' │ [ 'docker.engine', 'local.machine' ] │ 0.5 │ 'Docker Compose is more specialized.' │
+│ 57 │ 'ansible' │ 'redis.server' │ 'cache.image' │ [ 'docker.engine', 'remote.machine' ] │ 0.5 │ 'Docker Compose is more specialized.' │
+│ 58 │ 'compose' │ 'redis.server' │ 'cache.image' │ [ 'docker.engine', 'remote.machine' ] │ 1 │ 'Docker is the underlying technology.' │
+│ 59 │ 'terraform' │ 'redis.server' │ 'cache.image' │ [ 'docker.engine', 'remote.machine' ] │ 0.5 │ 'Docker Compose is more specialized.' │
+│ 60 │ 'ansible' │ 'redis.server' │ 'cache.image' │ [ 'gcp.memorystore' ] │ 0 │ 'Primary use case due to the specialization of Ansible.' │
+│ 61 │ 'terraform' │ 'redis.server' │ 'cache.image' │ [ 'gcp.memorystore' ] │ 1 │ 'Terraform provides a declarative module.' │
+│ 62 │ 'ansible' │ 'redis.server' │ 'cache.image' │ [ 'kubernetes.cluster' ] │ 0.5 │ 'Kubernetes is more specialized.' │
+│ 63 │ 'kubernetes' │ 'redis.server' │ 'cache.image' │ [ 'kubernetes.cluster' ] │ 1 │ 'Kubernetes is the underlying technology.' │
+│ 64 │ 'terraform' │ 'redis.server' │ 'cache.image' │ [ 'kubernetes.cluster' ] │ 0.5 │ 'Kubernetes is more specialized.' │
+│ 65 │ 'ansible' │ 'service.application' │ 'docker.image' │ [ 'docker.engine', 'local.machine' ] │ 0.5 │ 'Docker Compose is more specialized.' │
+│ 66 │ 'compose' │ 'service.application' │ 'docker.image' │ [ 'docker.engine', 'local.machine' ] │ 1 │ 'Docker is the underlying technology.' │
+│ 67 │ 'terraform' │ 'service.application' │ 'docker.image' │ [ 'docker.engine', 'local.machine' ] │ 0.5 │ 'Docker Compose is more specialized.' │
+│ 68 │ 'ansible' │ 'service.application' │ 'docker.image' │ [ 'docker.engine', 'remote.machine' ] │ 0.5 │ 'Docker Compose is more specialized.' │
+│ 69 │ 'compose' │ 'service.application' │ 'docker.image' │ [ 'docker.engine', 'remote.machine' ] │ 1 │ 'Docker is the underlying technology.' │
+│ 70 │ 'terraform' │ 'service.application' │ 'docker.image' │ [ 'docker.engine', 'remote.machine' ] │ 0.5 │ 'Docker Compose is more specialized.' │
+│ 71 │ 'ansible' │ 'service.application' │ 'docker.image' │ [ 'gcp.cloudrun' ] │ 0 │ 'Custom module with imperative parts, while Terraform provides a declarative module.' │
+│ 72 │ 'terraform' │ 'service.application' │ 'docker.image' │ [ 'gcp.cloudrun' ] │ 1 │ 'Terraform provides a declarative module.' │
+│ 73 │ 'ansible' │ 'service.application' │ 'docker.image' │ [ 'kubernetes.cluster' ] │ 0.5 │ 'Kubernetes is more specialized.' │
+│ 74 │ 'kubernetes' │ 'service.application' │ 'docker.image' │ [ 'kubernetes.cluster' ] │ 1 │ 'Kubernetes is the underlying technology.' │
+│ 75 │ 'terraform' │ 'service.application' │ 'docker.image' │ [ 'kubernetes.cluster' ] │ 0.5 │ 'Kubernetes is more specialized.' │
+│ 76 │ 'ansible' │ 'service.application' │ 'tar.archive' │ [ '*', 'local.machine' ] │ 1 │ 'Primary use case due to the specialization of Ansible. Special integration for systemd.' │
+│ 77 │ 'terraform' │ 'service.application' │ 'tar.archive' │ [ '*', 'local.machine' ] │ 0 │ 'Ansible is more specialized. Also using provisioners is a "last resort".' │
+│ 78 │ 'ansible' │ 'service.application' │ 'tar.archive' │ [ '*', 'remote.machine' ] │ 1 │ 'Primary use case due to the specialization of Ansible. Special integration for systemd.' │
+│ 79 │ 'terraform' │ 'service.application' │ 'tar.archive' │ [ '*', 'remote.machine' ] │ 0 │ 'Ansible is more specialized. Also using provisioners is a "last resort".' │
+│ 80 │ 'ansible' │ 'service.application' │ 'zip.archive' │ [ '*', 'local.machine' ] │ 1 │ 'Primary use case due to the specialization of Ansible. Special integration for systemd.' │
+│ 81 │ 'terraform' │ 'service.application' │ 'zip.archive' │ [ '*', 'local.machine' ] │ 0 │ 'Ansible is more specialized. Also using provisioners is a "last resort".' │
+│ 82 │ 'ansible' │ 'service.application' │ 'zip.archive' │ [ '*', 'remote.machine' ] │ 1 │ 'Primary use case due to the specialization of Ansible. Special integration for systemd.' │
+│ 83 │ 'terraform' │ 'service.application' │ 'zip.archive' │ [ '*', 'remote.machine' ] │ 0 │ 'Ansible is more specialized. Also using provisioners is a "last resort".' │
+│ 84 │ 'ansible' │ 'service.application' │ 'zip.archive' │ [ 'gcp.appengine' ] │ 0 │ 'Custom module with imperative parts, while Terraform provides a declarative module.' │
+│ 85 │ 'terraform' │ 'service.application' │ 'zip.archive' │ [ 'gcp.appengine' ] │ 1 │ 'Terraform provides a declarative module.' │
+│ 86 │ 'ansible' │ 'software.application' │ 'apt.package' │ [ '*', 'local.machine' ] │ 1 │ 'Primary use case due to the specialization of Ansible.' │
+│ 87 │ 'terraform' │ 'software.application' │ 'apt.package' │ [ '*', 'local.machine' ] │ 0 │ 'Ansible is more specialized. Also using provisioners is a "last resort".' │
+│ 88 │ 'ansible' │ 'software.application' │ 'apt.package' │ [ '*', 'remote.machine' ] │ 1 │ 'Primary use case due to the specialization of Ansible.' │
+│ 89 │ 'terraform' │ 'software.application' │ 'apt.package' │ [ '*', 'remote.machine' ] │ 0 │ 'Ansible is more specialized. Also using provisioners is a "last resort".' │
+│ 90 │ 'ansible' │ 'software.application' │ 'tar.archive' │ [ '*', 'local.machine' ] │ 1 │ 'While this is a primary use case due to the specialization of Ansible, we must rely on scripts. More specialized types should be used, e.g., service.application.' │
+│ 91 │ 'terraform' │ 'software.application' │ 'tar.archive' │ [ '*', 'local.machine' ] │ 0 │ 'Ansible is more specialized. Also using provisioners is a "last resort".' │
+│ 92 │ 'ansible' │ 'software.application' │ 'tar.archive' │ [ '*', 'remote.machine' ] │ 1 │ 'While this is a primary use case due to the specialization of Ansible, we must rely on scripts. More specialized types should be used, e.g., "service.application".' │
+│ 93 │ 'terraform' │ 'software.application' │ 'tar.archive' │ [ '*', 'remote.machine' ] │ 0 │ 'Ansible is more specialized. Also using provisioners is a "last resort".' │
+│ 94 │ 'ansible' │ 'software.application' │ 'zip.archive' │ [ '*', 'local.machine' ] │ 1 │ 'While this is a primary use case due to the specialization of Ansible, we must rely on scripts. More specialized types should be used, e.g., service.application.' │
+│ 95 │ 'terraform' │ 'software.application' │ 'zip.archive' │ [ '*', 'local.machine' ] │ 0 │ 'Ansible is more specialized. Also using provisioners is a "last resort".' │
+│ 96 │ 'ansible' │ 'software.application' │ 'zip.archive' │ [ '*', 'remote.machine' ] │ 1 │ 'While this is a primary use case due to the specialization of Ansible, we must rely on scripts. More specialized types should be used, e.g., service.application.' │
+│ 97 │ 'terraform' │ 'software.application' │ 'zip.archive' │ [ '*', 'remote.machine' ] │ 0 │ 'Ansible is more specialized. Also using provisioners is a "last resort".' │
+│ 98 │ 'ansible' │ 'virtual.machine' │ 'machine.image' │ [ 'openstack.provider' ] │ 0.5 │ 'Terraform is more specialized.' │
+│ 99 │ 'terraform' │ 'virtual.machine' │ 'machine.image' │ [ 'openstack.provider' ] │ 1 │ 'Terraform provides a declarative module.' │
+└─────────┴──────────────┴────────────────────────┴─────────────────┴───────────────────────────────────────────────────────┴─────────┴──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
+
+Metrics relevant when modeling the different scenarios
+┌─────────┬────────────────────────────┬────────┬──────────┬────────────┬────────────────────────┬───────────────┐
+│ (index) │ scenario │ models │ elements │ conditions │ technology_assignments │ lines_of_code │
+├─────────┼────────────────────────────┼────────┼──────────┼────────────┼────────────────────────┼───────────────┤
+│ 0 │ 'EDMM "customer"' │ 1 │ 408 │ 0 │ 39 │ 854 │
+│ 1 │ 'EDMM "development"' │ 1 │ 428 │ 0 │ 41 │ 897 │
+│ 2 │ 'EDMM "local"' │ 1 │ 385 │ 0 │ 35 │ 803 │
+│ 3 │ 'EDMM Total' │ 3 │ 1221 │ 0 │ 115 │ 2554 │
+│ 4 │ 'VDMM Baseline Original' │ 1 │ 864 │ 163 │ 69 │ 2064 │
+│ 5 │ 'VDMM+ Original Manual' │ 1 │ 525 │ 135 │ 69 │ 1411 │
+│ 6 │ 'VDMM+ Original Automated' │ 1 │ 525 │ 79 │ 0 │ 1260 │
+└─────────┴────────────────────────────┴────────┴──────────┴────────────┴────────────────────────┴───────────────┘
+
+Absolute diff when modeling the different original scenarios
+┌─────────┬─────────────────────────────────────────────────────┬─────────────────┬───────────────────┬─────────────────────┬─────────────────────────────────┬────────────────────────┐
+│ (index) │ scenario │ models_abs_diff │ elements_abs_diff │ conditions_abs_diff │ technology_assignments_abs_diff │ lines_of_code_abs_diff │
+├─────────┼─────────────────────────────────────────────────────┼─────────────────┼───────────────────┼─────────────────────┼─────────────────────────────────┼────────────────────────┤
+│ 0 │ 'VDMM Baseline Original - EDMM Total' │ -2 │ -357 │ 163 │ -46 │ -490 │
+│ 1 │ 'VDMM+ Original Manual - VDMM Baseline Original' │ 0 │ -339 │ -28 │ 0 │ -653 │
+│ 2 │ 'VDMM+ Original Automated - VDMM Baseline Original' │ 0 │ -339 │ -84 │ -69 │ -804 │
+└─────────┴─────────────────────────────────────────────────────┴─────────────────┴───────────────────┴─────────────────────┴─────────────────────────────────┴────────────────────────┘
+
+Relative diff when modeling the different original scenarios
+┌─────────┬─────────────────────────────────────────────────────┬─────────────────┬───────────────────┬─────────────────────┬─────────────────────────────────┬────────────────────────┐
+│ (index) │ scenario │ models_rel_diff │ elements_rel_diff │ conditions_rel_diff │ technology_assignments_rel_diff │ lines_of_code_rel_diff │
+├─────────┼─────────────────────────────────────────────────────┼─────────────────┼───────────────────┼─────────────────────┼─────────────────────────────────┼────────────────────────┤
+│ 0 │ 'VDMM Baseline Original / EDMM Total' │ 0.33 │ 0.71 │ Infinity │ 0.6 │ 0.81 │
+│ 1 │ 'VDMM+ Original Manual / VDMM Baseline Original' │ 1 │ 0.61 │ 0.83 │ 1 │ 0.68 │
+│ 2 │ 'VDMM+ Original Automated / VDMM Baseline Original' │ 1 │ 0.61 │ 0.48 │ 0 │ 0.61 │
+└─────────┴─────────────────────────────────────────────────────┴─────────────────┴───────────────────┴─────────────────────┴─────────────────────────────────┴────────────────────────┘
+
+Qualities of the derived deployment models, i.e., the deployment variants, of the different scenarios ranging from bad (0) to good (1).
+┌─────────┬───────────────┬────────────┬───────────────────────────────┬───────────────────────────────┬──────────────────────────────────────┬────────────┬──────────────────┐
+│ (index) │ scenario │ expert │ non_expert │ random │ counting │ quality │ quality_counting │
+├─────────┼───────────────┼────────────┼───────────────────────────────┼───────────────────────────────┼──────────────────────────────────────┼────────────┼──────────────────┤
+│ 0 │ 'customer' │ 'good (1)' │ [ 'poor (0.35)', 'good (1)' ] │ [ 'poor (0.35)', 'good (1)' ] │ [ 'moderate (0.42)', 'fair (0.69)' ] │ 'good (1)' │ 'good (1)' │
+│ 1 │ 'development' │ 'good (1)' │ [ 'poor (0.28)', 'good (1)' ] │ [ 'poor (0.28)', 'good (1)' ] │ [ 'moderate (0.51)', 'fair (0.72)' ] │ 'good (1)' │ 'good (1)' │
+│ 2 │ 'local' │ 'good (1)' │ [ 'poor (0.31)', 'good (1)' ] │ [ 'poor (0.31)', 'good (1)' ] │ [ 'fair (0.66)', 'fair (0.69)' ] │ 'good (1)' │ 'good (1)' │
+└─────────┴───────────────┴────────────┴───────────────────────────────┴───────────────────────────────┴──────────────────────────────────────┴────────────┴──────────────────┘
+
+Metrics relevant when modeling the maintenance scenario of our case study
+┌─────────┬───────────────────────────────┬────────┬──────────┬────────────┬────────────────────────┬───────────────┐
+│ (index) │ scenario │ models │ elements │ conditions │ technology_assignments │ lines_of_code │
+├─────────┼───────────────────────────────┼────────┼──────────┼────────────┼────────────────────────┼───────────────┤
+│ 0 │ 'VDMM Baseline Maintenance' │ 1 │ 987 │ 224 │ 90 │ 2436 │
+│ 1 │ 'VDMM+ Maintenance Manual' │ 1 │ 551 │ 174 │ 90 │ 1541 │
+│ 2 │ 'VDMM+ Maintenance Automated' │ 1 │ 551 │ 85 │ 0 │ 1326 │
+└─────────┴───────────────────────────────┴────────┴──────────┴────────────┴────────────────────────┴───────────────┘
+
+Absolute diff from original to maintained
+┌─────────┬──────────────────────────────────────────────────────────┬─────────────────┬───────────────────┬─────────────────────┬─────────────────────────────────┬────────────────────────┐
+│ (index) │ scenario │ models_abs_diff │ elements_abs_diff │ conditions_abs_diff │ technology_assignments_abs_diff │ lines_of_code_abs_diff │
+├─────────┼──────────────────────────────────────────────────────────┼─────────────────┼───────────────────┼─────────────────────┼─────────────────────────────────┼────────────────────────┤
+│ 0 │ 'VDMM Baseline Maintenance - VDMM Baseline Original' │ 0 │ 123 │ 61 │ 21 │ 372 │
+│ 1 │ 'VDMM+ Maintenance Manual - VDMM+ Original Manual' │ 0 │ 26 │ 39 │ 21 │ 130 │
+│ 2 │ 'VDMM+ Maintenance Automated - VDMM+ Original Automated' │ 0 │ 26 │ 6 │ 0 │ 66 │
+└─────────┴──────────────────────────────────────────────────────────┴─────────────────┴───────────────────┴─────────────────────┴─────────────────────────────────┴────────────────────────┘
+
+Relative diff from the absolute diff from original to maintained
+┌─────────┬───────────────────────────────────────────────────────────────────────────────────────────────────────────────────┬─────────────────┬───────────────────┬─────────────────────┬─────────────────────────────────┬────────────────────────┐
+│ (index) │ scenario │ models_rel_diff │ elements_rel_diff │ conditions_rel_diff │ technology_assignments_rel_diff │ lines_of_code_rel_diff │
+├─────────┼───────────────────────────────────────────────────────────────────────────────────────────────────────────────────┼─────────────────┼───────────────────┼─────────────────────┼─────────────────────────────────┼────────────────────────┤
+│ 0 │ '(VDMM+ Maintenance Manual - VDMM+ Original Manual) / (VDMM Baseline Maintenance - VDMM Baseline Original)' │ 1 │ 0.21 │ 0.64 │ 1 │ 0.35 │
+│ 1 │ '(VDMM+ Maintenance Automated - VDMM+ Original Automated) / (VDMM Baseline Maintenance - VDMM Baseline Original)' │ 1 │ 0.21 │ 0.1 │ 0 │ 0.18 │
+└─────────┴───────────────────────────────────────────────────────────────────────────────────────────────────────────────────┴─────────────────┴───────────────────┴─────────────────────┴─────────────────────────────────┴────────────────────────┘
+
+CAUTION: Is this case study running with the latest implementation?
+
+COMMENT: fixed that UNDEFINED DEFAULT ALTERNATIVE is counted and also k8s should not be counted
+
+COMMENT: used in SPE publication
diff --git a/examples/unfurl-technology---shop---plus-maintenance-automated/scripts/study-006.txt b/examples/unfurl-technology---shop---plus-maintenance-automated/scripts/study-006.txt
new file mode 100644
index 0000000000..3a81589729
--- /dev/null
+++ b/examples/unfurl-technology---shop---plus-maintenance-automated/scripts/study-006.txt
@@ -0,0 +1,176 @@
+
+The technology rules of our case study. Qualities range from bad (0) to good (1).
+┌─────────┬──────────────┬────────────────────────┬─────────────────┬───────────────────────────────────────────────────────┬─────────┬──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
+│ (index) │ Technology │ Component │ Artifact │ Hosting │ Quality │ Reason │
+├─────────┼──────────────┼────────────────────────┼─────────────────┼───────────────────────────────────────────────────────┼─────────┼──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤
+│ 0 │ 'ansible' │ 'docker.engine' │ undefined │ [ 'local.machine' ] │ 1 │ 'Primary use case due to the specialization of Ansible.' │
+│ 1 │ 'terraform' │ 'docker.engine' │ undefined │ [ 'local.machine' ] │ 0 │ 'Ansible is more specialized. Also using provisioners is a "last resort".' │
+│ 2 │ 'ansible' │ 'docker.engine' │ undefined │ [ 'remote.machine' ] │ 1 │ 'Primary use case due to the specialization of Ansible.' │
+│ 3 │ 'terraform' │ 'docker.engine' │ undefined │ [ 'remote.machine' ] │ 0 │ 'Ansible is more specialized. Also using provisioners is a "last resort".' │
+│ 4 │ 'ansible' │ 'gcp.service' │ undefined │ [] │ 0 │ 'Ansible provides a declarative module' │
+│ 5 │ 'terraform' │ 'gcp.service' │ undefined │ [] │ 1 │ 'Terraform provides a declarative module.' │
+│ 6 │ 'ansible' │ 'ingress' │ undefined │ [ 'kubernetes.cluster' ] │ 0.5 │ 'Kubernetes is more specialized.' │
+│ 7 │ 'kubernetes' │ 'ingress' │ undefined │ [ 'kubernetes.cluster' ] │ 1 │ 'Kubernetes is the underlying technology.' │
+│ 8 │ 'terraform' │ 'ingress' │ undefined │ [ 'kubernetes.cluster' ] │ 0.5 │ 'Kubernetes is more specialized.' │
+│ 9 │ 'ansible' │ 'ingress' │ undefined │ [ 'local.machine' ] │ 1 │ 'Primary use case due to the specialization of Ansible.' │
+│ 10 │ 'terraform' │ 'ingress' │ undefined │ [ 'local.machine' ] │ 0 │ 'Ansible is more specialized. Also using provisioners is a "last resort".' │
+│ 11 │ 'ansible' │ 'ingress' │ undefined │ [ 'remote.machine' ] │ 1 │ 'Primary use case due to the specialization of Ansible.' │
+│ 12 │ 'terraform' │ 'ingress' │ undefined │ [ 'remote.machine' ] │ 0 │ 'Ansible is more specialized. Also using provisioners is a "last resort".' │
+│ 13 │ 'ansible' │ 'mysql.database' │ undefined │ [ 'mysql.dbms', 'docker.engine', 'local.machine' ] │ 1 │ 'Primary use case due to the specialization of Ansible.' │
+│ 14 │ 'compose' │ 'mysql.database' │ undefined │ [ 'mysql.dbms', 'docker.engine', 'local.machine' ] │ 0 │ 'One-time use docker container ("fake Kubernetes job") with imperative parts, while other technologies provide declarative modules.' │
+│ 15 │ 'terraform' │ 'mysql.database' │ undefined │ [ 'mysql.dbms', 'docker.engine', 'local.machine' ] │ 1 │ 'Terraform provides a declarative module.' │
+│ 16 │ 'ansible' │ 'mysql.database' │ undefined │ [ 'mysql.dbms', 'docker.engine', 'remote.machine' ] │ 1 │ 'Primary use case due to the specialization of Ansible.' │
+│ 17 │ 'compose' │ 'mysql.database' │ undefined │ [ 'mysql.dbms', 'docker.engine', 'remote.machine' ] │ 0 │ 'One-time use docker container ("fake Kubernetes job") with imperative parts, while other technologies provide declarative modules.' │
+│ 18 │ 'terraform' │ 'mysql.database' │ undefined │ [ 'mysql.dbms', 'docker.engine', 'remote.machine' ] │ 0.75 │ 'Terraform provides a declarative module. However, Terraform requires an SSH workaround. Ansible is more specialized.' │
+│ 19 │ 'ansible' │ 'mysql.database' │ undefined │ [ 'mysql.dbms', 'gcp.cloudsql' ] │ 0 │ 'Primary use case due to the specialization of Ansible. However, need to install and handle GCP CloudSQL Proxy, while the corresponding Terraform module already provides this.' │
+│ 20 │ 'terraform' │ 'mysql.database' │ undefined │ [ 'mysql.dbms', 'gcp.cloudsql' ] │ 1 │ 'Terraform provides a declarative module.' │
+│ 21 │ 'ansible' │ 'mysql.database' │ undefined │ [ 'mysql.dbms', 'kubernetes.cluster' ] │ 1 │ 'Primary use case due to the specialization of Ansible.' │
+│ 22 │ 'kubernetes' │ 'mysql.database' │ undefined │ [ 'mysql.dbms', 'kubernetes.cluster' ] │ 0 │ 'Kubernetes Job with imperative parts, while declarative other technologies provide declarative modules.' │
+│ 23 │ 'terraform' │ 'mysql.database' │ undefined │ [ 'mysql.dbms', 'kubernetes.cluster' ] │ 0.25 │ 'Ansible is more specialized.' │
+│ 24 │ 'ansible' │ 'mysql.database' │ undefined │ [ 'mysql.dbms', 'local.machine' ] │ 1 │ 'Primary use case due to the specialization of Ansible.' │
+│ 25 │ 'terraform' │ 'mysql.database' │ undefined │ [ 'mysql.dbms', 'local.machine' ] │ 1 │ 'Terraform provides a declarative module.' │
+│ 26 │ 'ansible' │ 'mysql.database' │ undefined │ [ 'mysql.dbms', 'remote.machine' ] │ 1 │ 'Primary use case due to the specialization of Ansible.' │
+│ 27 │ 'terraform' │ 'mysql.database' │ undefined │ [ 'mysql.dbms', 'remote.machine' ] │ 0.5 │ 'Terraform provides a declarative module. However, Terraform requires an SSH workaround. Ansible is more specialized.' │
+│ 28 │ 'ansible' │ 'mysql.dbms' │ 'dbms.image' │ [ 'docker.engine', 'local.machine' ] │ 0.5 │ 'Docker Compose is more specialized' │
+│ 29 │ 'compose' │ 'mysql.dbms' │ 'dbms.image' │ [ 'docker.engine', 'local.machine' ] │ 1 │ 'Docker is the underlying technology.' │
+│ 30 │ 'terraform' │ 'mysql.dbms' │ 'dbms.image' │ [ 'docker.engine', 'local.machine' ] │ 0.5 │ 'Docker Compose is more specialized.' │
+│ 31 │ 'ansible' │ 'mysql.dbms' │ 'dbms.image' │ [ 'docker.engine', 'remote.machine' ] │ 0.5 │ 'Docker Compose is more specialized' │
+│ 32 │ 'compose' │ 'mysql.dbms' │ 'dbms.image' │ [ 'docker.engine', 'remote.machine' ] │ 1 │ 'Docker is the underlying technology.' │
+│ 33 │ 'terraform' │ 'mysql.dbms' │ 'dbms.image' │ [ 'docker.engine', 'remote.machine' ] │ 0.5 │ 'Docker Compose is more specialized.' │
+│ 34 │ 'ansible' │ 'mysql.dbms' │ 'dbms.image' │ [ 'gcp.cloudsql' ] │ 0 │ 'Primary use case due to the specialization of Ansible.' │
+│ 35 │ 'terraform' │ 'mysql.dbms' │ 'dbms.image' │ [ 'gcp.cloudsql' ] │ 1 │ 'Terraform provides a declarative module.' │
+│ 36 │ 'ansible' │ 'mysql.dbms' │ 'dbms.image' │ [ 'kubernetes.cluster' ] │ 0.5 │ 'Kubernetes is more specialized.' │
+│ 37 │ 'kubernetes' │ 'mysql.dbms' │ 'dbms.image' │ [ 'kubernetes.cluster' ] │ 1 │ 'Kubernetes is the underlying technology.' │
+│ 38 │ 'terraform' │ 'mysql.dbms' │ 'dbms.image' │ [ 'kubernetes.cluster' ] │ 0.5 │ 'Kubernetes is more specialized.' │
+│ 39 │ 'ansible' │ 'mysql.dbms' │ 'dbms.image' │ [ 'local.machine' ] │ 1 │ 'Primary use case due to the specialization of Ansible.' │
+│ 40 │ 'terraform' │ 'mysql.dbms' │ 'dbms.image' │ [ 'local.machine' ] │ 0 │ 'Ansible is more specialized. Also using provisioners is a "last resort".' │
+│ 41 │ 'ansible' │ 'mysql.dbms' │ 'dbms.image' │ [ 'remote.machine' ] │ 1 │ 'Primary use case due to the specialization of Ansible.' │
+│ 42 │ 'terraform' │ 'mysql.dbms' │ 'dbms.image' │ [ 'remote.machine' ] │ 0 │ 'Ansible is more specialized. Also using provisioners is a "last resort".' │
+│ 43 │ 'ansible' │ 'object.storage' │ undefined │ [ 'gcp.cloudstorage' ] │ 0 │ 'Primary use case due to the specialization of Ansible.' │
+│ 44 │ 'terraform' │ 'object.storage' │ undefined │ [ 'gcp.cloudstorage' ] │ 1 │ 'Terraform provides a declarative module.' │
+│ 45 │ 'ansible' │ 'object.storage' │ undefined │ [ 'minio.server', 'docker.engine', 'local.machine' ] │ 1 │ 'Primary use case due to the specialization of Ansible.' │
+│ 46 │ 'compose' │ 'object.storage' │ undefined │ [ 'minio.server', 'docker.engine', 'local.machine' ] │ 0 │ 'One-time use docker container ("fake Kubernetes job") with imperative parts, while other technologies provide declarative modules.' │
+│ 47 │ 'terraform' │ 'object.storage' │ undefined │ [ 'minio.server', 'docker.engine', 'local.machine' ] │ 1 │ 'Terraform provides a declarative module.' │
+│ 48 │ 'ansible' │ 'object.storage' │ undefined │ [ 'minio.server', 'docker.engine', 'remote.machine' ] │ 1 │ 'Primary use case due to the specialization of Ansible.' │
+│ 49 │ 'compose' │ 'object.storage' │ undefined │ [ 'minio.server', 'docker.engine', 'remote.machine' ] │ 0 │ 'One-time use docker container ("fake Kubernetes job") with imperative parts, while other technologies provide declarative modules.' │
+│ 50 │ 'terraform' │ 'object.storage' │ undefined │ [ 'minio.server', 'docker.engine', 'remote.machine' ] │ 0.75 │ 'Terraform provides a declarative module. However, Terraform requires an SSH workaround. Ansible is more specialized.' │
+│ 51 │ 'ansible' │ 'object.storage' │ undefined │ [ 'minio.server', 'kubernetes.cluster' ] │ 1 │ 'Primary use case due to the specialization of Ansible.' │
+│ 52 │ 'kubernetes' │ 'object.storage' │ undefined │ [ 'minio.server', 'kubernetes.cluster' ] │ 0 │ 'Kubernetes Job with imperative parts, while declarative other technologies provide declarative modules.' │
+│ 53 │ 'terraform' │ 'object.storage' │ undefined │ [ 'minio.server', 'kubernetes.cluster' ] │ 0.25 │ 'Ansible is more specialized.' │
+│ 54 │ 'ansible' │ 'redis.server' │ 'cache.image' │ [ 'docker.engine', 'local.machine' ] │ 0.5 │ 'Docker Compose is more specialized.' │
+│ 55 │ 'compose' │ 'redis.server' │ 'cache.image' │ [ 'docker.engine', 'local.machine' ] │ 1 │ 'Docker is the underlying technology.' │
+│ 56 │ 'terraform' │ 'redis.server' │ 'cache.image' │ [ 'docker.engine', 'local.machine' ] │ 0.5 │ 'Docker Compose is more specialized.' │
+│ 57 │ 'ansible' │ 'redis.server' │ 'cache.image' │ [ 'docker.engine', 'remote.machine' ] │ 0.5 │ 'Docker Compose is more specialized.' │
+│ 58 │ 'compose' │ 'redis.server' │ 'cache.image' │ [ 'docker.engine', 'remote.machine' ] │ 1 │ 'Docker is the underlying technology.' │
+│ 59 │ 'terraform' │ 'redis.server' │ 'cache.image' │ [ 'docker.engine', 'remote.machine' ] │ 0.5 │ 'Docker Compose is more specialized.' │
+│ 60 │ 'ansible' │ 'redis.server' │ 'cache.image' │ [ 'gcp.memorystore' ] │ 0 │ 'Primary use case due to the specialization of Ansible.' │
+│ 61 │ 'terraform' │ 'redis.server' │ 'cache.image' │ [ 'gcp.memorystore' ] │ 1 │ 'Terraform provides a declarative module.' │
+│ 62 │ 'ansible' │ 'redis.server' │ 'cache.image' │ [ 'kubernetes.cluster' ] │ 0.5 │ 'Kubernetes is more specialized.' │
+│ 63 │ 'kubernetes' │ 'redis.server' │ 'cache.image' │ [ 'kubernetes.cluster' ] │ 1 │ 'Kubernetes is the underlying technology.' │
+│ 64 │ 'terraform' │ 'redis.server' │ 'cache.image' │ [ 'kubernetes.cluster' ] │ 0.5 │ 'Kubernetes is more specialized.' │
+│ 65 │ 'ansible' │ 'service.application' │ 'docker.image' │ [ 'docker.engine', 'local.machine' ] │ 0.5 │ 'Docker Compose is more specialized.' │
+│ 66 │ 'compose' │ 'service.application' │ 'docker.image' │ [ 'docker.engine', 'local.machine' ] │ 1 │ 'Docker is the underlying technology.' │
+│ 67 │ 'terraform' │ 'service.application' │ 'docker.image' │ [ 'docker.engine', 'local.machine' ] │ 0.5 │ 'Docker Compose is more specialized.' │
+│ 68 │ 'ansible' │ 'service.application' │ 'docker.image' │ [ 'docker.engine', 'remote.machine' ] │ 0.5 │ 'Docker Compose is more specialized.' │
+│ 69 │ 'compose' │ 'service.application' │ 'docker.image' │ [ 'docker.engine', 'remote.machine' ] │ 1 │ 'Docker is the underlying technology.' │
+│ 70 │ 'terraform' │ 'service.application' │ 'docker.image' │ [ 'docker.engine', 'remote.machine' ] │ 0.5 │ 'Docker Compose is more specialized.' │
+│ 71 │ 'ansible' │ 'service.application' │ 'docker.image' │ [ 'gcp.cloudrun' ] │ 0 │ 'Custom module with imperative parts, while Terraform provides a declarative module.' │
+│ 72 │ 'terraform' │ 'service.application' │ 'docker.image' │ [ 'gcp.cloudrun' ] │ 1 │ 'Terraform provides a declarative module.' │
+│ 73 │ 'ansible' │ 'service.application' │ 'docker.image' │ [ 'kubernetes.cluster' ] │ 0.5 │ 'Kubernetes is more specialized.' │
+│ 74 │ 'kubernetes' │ 'service.application' │ 'docker.image' │ [ 'kubernetes.cluster' ] │ 1 │ 'Kubernetes is the underlying technology.' │
+│ 75 │ 'terraform' │ 'service.application' │ 'docker.image' │ [ 'kubernetes.cluster' ] │ 0.5 │ 'Kubernetes is more specialized.' │
+│ 76 │ 'ansible' │ 'service.application' │ 'tar.archive' │ [ '*', 'local.machine' ] │ 1 │ 'Primary use case due to the specialization of Ansible. Special integration for systemd.' │
+│ 77 │ 'terraform' │ 'service.application' │ 'tar.archive' │ [ '*', 'local.machine' ] │ 0 │ 'Ansible is more specialized. Also using provisioners is a "last resort".' │
+│ 78 │ 'ansible' │ 'service.application' │ 'tar.archive' │ [ '*', 'remote.machine' ] │ 1 │ 'Primary use case due to the specialization of Ansible. Special integration for systemd.' │
+│ 79 │ 'terraform' │ 'service.application' │ 'tar.archive' │ [ '*', 'remote.machine' ] │ 0 │ 'Ansible is more specialized. Also using provisioners is a "last resort".' │
+│ 80 │ 'ansible' │ 'service.application' │ 'zip.archive' │ [ '*', 'local.machine' ] │ 1 │ 'Primary use case due to the specialization of Ansible. Special integration for systemd.' │
+│ 81 │ 'terraform' │ 'service.application' │ 'zip.archive' │ [ '*', 'local.machine' ] │ 0 │ 'Ansible is more specialized. Also using provisioners is a "last resort".' │
+│ 82 │ 'ansible' │ 'service.application' │ 'zip.archive' │ [ '*', 'remote.machine' ] │ 1 │ 'Primary use case due to the specialization of Ansible. Special integration for systemd.' │
+│ 83 │ 'terraform' │ 'service.application' │ 'zip.archive' │ [ '*', 'remote.machine' ] │ 0 │ 'Ansible is more specialized. Also using provisioners is a "last resort".' │
+│ 84 │ 'ansible' │ 'service.application' │ 'zip.archive' │ [ 'gcp.appengine' ] │ 0 │ 'Custom module with imperative parts, while Terraform provides a declarative module.' │
+│ 85 │ 'terraform' │ 'service.application' │ 'zip.archive' │ [ 'gcp.appengine' ] │ 1 │ 'Terraform provides a declarative module.' │
+│ 86 │ 'ansible' │ 'software.application' │ 'apt.package' │ [ '*', 'local.machine' ] │ 1 │ 'Primary use case due to the specialization of Ansible.' │
+│ 87 │ 'terraform' │ 'software.application' │ 'apt.package' │ [ '*', 'local.machine' ] │ 0 │ 'Ansible is more specialized. Also using provisioners is a "last resort".' │
+│ 88 │ 'ansible' │ 'software.application' │ 'apt.package' │ [ '*', 'remote.machine' ] │ 1 │ 'Primary use case due to the specialization of Ansible.' │
+│ 89 │ 'terraform' │ 'software.application' │ 'apt.package' │ [ '*', 'remote.machine' ] │ 0 │ 'Ansible is more specialized. Also using provisioners is a "last resort".' │
+│ 90 │ 'ansible' │ 'software.application' │ 'tar.archive' │ [ '*', 'local.machine' ] │ 1 │ 'While this is a primary use case due to the specialization of Ansible, we must rely on scripts. More specialized types should be used, e.g., service.application.' │
+│ 91 │ 'terraform' │ 'software.application' │ 'tar.archive' │ [ '*', 'local.machine' ] │ 0 │ 'Ansible is more specialized. Also using provisioners is a "last resort".' │
+│ 92 │ 'ansible' │ 'software.application' │ 'tar.archive' │ [ '*', 'remote.machine' ] │ 1 │ 'While this is a primary use case due to the specialization of Ansible, we must rely on scripts. More specialized types should be used, e.g., "service.application".' │
+│ 93 │ 'terraform' │ 'software.application' │ 'tar.archive' │ [ '*', 'remote.machine' ] │ 0 │ 'Ansible is more specialized. Also using provisioners is a "last resort".' │
+│ 94 │ 'ansible' │ 'software.application' │ 'zip.archive' │ [ '*', 'local.machine' ] │ 1 │ 'While this is a primary use case due to the specialization of Ansible, we must rely on scripts. More specialized types should be used, e.g., service.application.' │
+│ 95 │ 'terraform' │ 'software.application' │ 'zip.archive' │ [ '*', 'local.machine' ] │ 0 │ 'Ansible is more specialized. Also using provisioners is a "last resort".' │
+│ 96 │ 'ansible' │ 'software.application' │ 'zip.archive' │ [ '*', 'remote.machine' ] │ 1 │ 'While this is a primary use case due to the specialization of Ansible, we must rely on scripts. More specialized types should be used, e.g., service.application.' │
+│ 97 │ 'terraform' │ 'software.application' │ 'zip.archive' │ [ '*', 'remote.machine' ] │ 0 │ 'Ansible is more specialized. Also using provisioners is a "last resort".' │
+│ 98 │ 'ansible' │ 'virtual.machine' │ 'machine.image' │ [ 'openstack.provider' ] │ 0.5 │ 'Terraform is more specialized.' │
+│ 99 │ 'terraform' │ 'virtual.machine' │ 'machine.image' │ [ 'openstack.provider' ] │ 1 │ 'Terraform provides a declarative module.' │
+└─────────┴──────────────┴────────────────────────┴─────────────────┴───────────────────────────────────────────────────────┴─────────┴──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
+
+Metrics relevant when modeling the different scenarios
+┌─────────┬────────────────────────────┬────────┬──────────┬────────────┬────────────────────────┬───────────────┐
+│ (index) │ scenario │ models │ elements │ conditions │ technology_assignments │ lines_of_code │
+├─────────┼────────────────────────────┼────────┼──────────┼────────────┼────────────────────────┼───────────────┤
+│ 0 │ 'EDMM "elastic"' │ 1 │ 42 │ 0 │ 7 │ 118 │
+│ 1 │ 'EDMM "static"' │ 1 │ 60 │ 0 │ 6 │ 152 │
+│ 2 │ 'EDMM "static-large"' │ 1 │ 60 │ 0 │ 6 │ 152 │
+│ 3 │ 'EDMM Total' │ 3 │ 162 │ 0 │ 19 │ 422 │
+│ 4 │ 'VDMM Baseline Original' │ 1 │ 101 │ 6 │ 13 │ 264 │
+│ 5 │ 'VDMM+ Original Manual' │ 1 │ 80 │ 12 │ 13 │ 236 │
+│ 6 │ 'VDMM+ Original Automated' │ 1 │ 80 │ 6 │ 0 │ 213 │
+└─────────┴────────────────────────────┴────────┴──────────┴────────────┴────────────────────────┴───────────────┘
+
+Absolute diff when modeling the different original scenarios
+┌─────────┬─────────────────────────────────────────────────────┬─────────────────┬───────────────────┬─────────────────────┬─────────────────────────────────┬────────────────────────┐
+│ (index) │ scenario │ models_abs_diff │ elements_abs_diff │ conditions_abs_diff │ technology_assignments_abs_diff │ lines_of_code_abs_diff │
+├─────────┼─────────────────────────────────────────────────────┼─────────────────┼───────────────────┼─────────────────────┼─────────────────────────────────┼────────────────────────┤
+│ 0 │ 'VDMM Baseline Original - EDMM Total' │ -2 │ -61 │ 6 │ -6 │ -158 │
+│ 1 │ 'VDMM+ Original Manual - VDMM Baseline Original' │ 0 │ -21 │ 6 │ 0 │ -28 │
+│ 2 │ 'VDMM+ Original Automated - VDMM Baseline Original' │ 0 │ -21 │ 0 │ -13 │ -51 │
+└─────────┴─────────────────────────────────────────────────────┴─────────────────┴───────────────────┴─────────────────────┴─────────────────────────────────┴────────────────────────┘
+
+Relative diff when modeling the different original scenarios
+┌─────────┬─────────────────────────────────────────────────────┬─────────────────┬───────────────────┬─────────────────────┬─────────────────────────────────┬────────────────────────┐
+│ (index) │ scenario │ models_rel_diff │ elements_rel_diff │ conditions_rel_diff │ technology_assignments_rel_diff │ lines_of_code_rel_diff │
+├─────────┼─────────────────────────────────────────────────────┼─────────────────┼───────────────────┼─────────────────────┼─────────────────────────────────┼────────────────────────┤
+│ 0 │ 'VDMM Baseline Original / EDMM Total' │ 0.33 │ 0.62 │ Infinity │ 0.68 │ 0.63 │
+│ 1 │ 'VDMM+ Original Manual / VDMM Baseline Original' │ 1 │ 0.79 │ 2 │ 1 │ 0.89 │
+│ 2 │ 'VDMM+ Original Automated / VDMM Baseline Original' │ 1 │ 0.79 │ 1 │ 0 │ 0.81 │
+└─────────┴─────────────────────────────────────────────────────┴─────────────────┴───────────────────┴─────────────────────┴─────────────────────────────────┴────────────────────────┘
+
+Qualities of the derived deployment models, i.e., the deployment variants, of the different scenarios ranging from bad (0) to good (1).
+┌─────────┬────────────────┬────────────┬───────────────────────────────┬───────────────────────────────┬──────────────────────────────────┬────────────┬──────────────────┐
+│ (index) │ scenario │ expert │ non_expert │ random │ counting │ quality │ quality_counting │
+├─────────┼────────────────┼────────────┼───────────────────────────────┼───────────────────────────────┼──────────────────────────────────┼────────────┼──────────────────┤
+│ 0 │ 'elastic' │ 'good (1)' │ [ 'bad (0)', 'good (1)' ] │ [ 'bad (0)', 'good (1)' ] │ [ 'bad (0)', 'good (1)' ] │ 'good (1)' │ 'good (1)' │
+│ 1 │ 'static' │ 'good (1)' │ [ 'poor (0.17)', 'good (1)' ] │ [ 'poor (0.17)', 'good (1)' ] │ [ 'poor (0.25)', 'good (0.92)' ] │ 'good (1)' │ 'good (1)' │
+│ 2 │ 'static-large' │ 'good (1)' │ [ 'poor (0.17)', 'good (1)' ] │ [ 'poor (0.17)', 'good (1)' ] │ [ 'poor (0.25)', 'good (0.92)' ] │ 'good (1)' │ 'good (1)' │
+└─────────┴────────────────┴────────────┴───────────────────────────────┴───────────────────────────────┴──────────────────────────────────┴────────────┴──────────────────┘
+
+Metrics relevant when modeling the maintenance scenario of our case study
+┌─────────┬───────────────────────────────┬────────┬──────────┬────────────┬────────────────────────┬───────────────┐
+│ (index) │ scenario │ models │ elements │ conditions │ technology_assignments │ lines_of_code │
+├─────────┼───────────────────────────────┼────────┼──────────┼────────────┼────────────────────────┼───────────────┤
+│ 0 │ 'VDMM Baseline Maintenance' │ 1 │ 146 │ 20 │ 16 │ 380 │
+│ 1 │ 'VDMM+ Maintenance Manual' │ 1 │ 99 │ 23 │ 16 │ 295 │
+│ 2 │ 'VDMM+ Maintenance Automated' │ 1 │ 99 │ 12 │ 0 │ 263 │
+└─────────┴───────────────────────────────┴────────┴──────────┴────────────┴────────────────────────┴───────────────┘
+
+Absolute diff from original to maintained
+┌─────────┬──────────────────────────────────────────────────────────┬─────────────────┬───────────────────┬─────────────────────┬─────────────────────────────────┬────────────────────────┐
+│ (index) │ scenario │ models_abs_diff │ elements_abs_diff │ conditions_abs_diff │ technology_assignments_abs_diff │ lines_of_code_abs_diff │
+├─────────┼──────────────────────────────────────────────────────────┼─────────────────┼───────────────────┼─────────────────────┼─────────────────────────────────┼────────────────────────┤
+│ 0 │ 'VDMM Baseline Maintenance - VDMM Baseline Original' │ 0 │ 45 │ 14 │ 3 │ 116 │
+│ 1 │ 'VDMM+ Maintenance Manual - VDMM+ Original Manual' │ 0 │ 19 │ 11 │ 3 │ 59 │
+│ 2 │ 'VDMM+ Maintenance Automated - VDMM+ Original Automated' │ 0 │ 19 │ 6 │ 0 │ 50 │
+└─────────┴──────────────────────────────────────────────────────────┴─────────────────┴───────────────────┴─────────────────────┴─────────────────────────────────┴────────────────────────┘
+
+Relative diff from the absolute diff from original to maintained
+┌─────────┬───────────────────────────────────────────────────────────────────────────────────────────────────────────────────┬─────────────────┬───────────────────┬─────────────────────┬─────────────────────────────────┬────────────────────────┐
+│ (index) │ scenario │ models_rel_diff │ elements_rel_diff │ conditions_rel_diff │ technology_assignments_rel_diff │ lines_of_code_rel_diff │
+├─────────┼───────────────────────────────────────────────────────────────────────────────────────────────────────────────────┼─────────────────┼───────────────────┼─────────────────────┼─────────────────────────────────┼────────────────────────┤
+│ 0 │ '(VDMM+ Maintenance Manual - VDMM+ Original Manual) / (VDMM Baseline Maintenance - VDMM Baseline Original)' │ 1 │ 0.42 │ 0.79 │ 1 │ 0.51 │
+│ 1 │ '(VDMM+ Maintenance Automated - VDMM+ Original Automated) / (VDMM Baseline Maintenance - VDMM Baseline Original)' │ 1 │ 0.42 │ 0.43 │ 0 │ 0.43 │
+└─────────┴───────────────────────────────────────────────────────────────────────────────────────────────────────────────────┴─────────────────┴───────────────────┴─────────────────────┴─────────────────────────────────┴────────────────────────┘
+
+CAUTION: Is this case study running with the latest implementation?
+
+COMMENT: fixed that UNDEFINED DEFAULT ALTERNATIVE is counted and also k8s should not be counted
diff --git a/examples/unfurl-technology---shop---plus-maintenance-automated/study.yaml b/examples/unfurl-technology---shop---plus-maintenance-automated/study.yaml
index 0da9fee916..0666204217 100644
--- a/examples/unfurl-technology---shop---plus-maintenance-automated/study.yaml
+++ b/examples/unfurl-technology---shop---plus-maintenance-automated/study.yaml
@@ -1,6 +1,5 @@
study: technology
originals:
- elastic
- - kubernetes
- static
- static-large
diff --git a/examples/unfurl-technology---shop---plus-maintenance-manual/variable-service-template.yaml b/examples/unfurl-technology---shop---plus-maintenance-manual/variable-service-template.yaml
index 2f494c7742..b67a41327f 100644
--- a/examples/unfurl-technology---shop---plus-maintenance-manual/variable-service-template.yaml
+++ b/examples/unfurl-technology---shop---plus-maintenance-manual/variable-service-template.yaml
@@ -75,8 +75,6 @@ topology_template:
type: boolean
optional_feature:
type: boolean
- options:
- enrich_technologies: false
node_templates:
###################################################
diff --git a/examples/unfurl-technology---shop---plus-original-manual/variable-service-template.yaml b/examples/unfurl-technology---shop---plus-original-manual/variable-service-template.yaml
index 12857dcf76..813cac10e5 100644
--- a/examples/unfurl-technology---shop---plus-original-manual/variable-service-template.yaml
+++ b/examples/unfurl-technology---shop---plus-original-manual/variable-service-template.yaml
@@ -59,9 +59,6 @@ topology_template:
type: string
tier:
type: string
- options:
- checks: false
- enrich_technologies: false
node_templates:
###################################################
diff --git a/src/controller/study/technology.ts b/src/controller/study/technology.ts
index 0ec4e65367..9baceb2430 100644
--- a/src/controller/study/technology.ts
+++ b/src/controller/study/technology.ts
@@ -31,7 +31,7 @@ export type StudyTechnologyOptions = {
* Available applications
*
* - boutique
- * - industry (coming soon)
+ * - industry
* - shop
*/
diff --git a/src/controller/template/stats.ts b/src/controller/template/stats.ts
index 2b13ac4fc6..6768264ce9 100644
--- a/src/controller/template/stats.ts
+++ b/src/controller/template/stats.ts
@@ -4,6 +4,7 @@ import * as files from '#files'
import Element from '#graph/element'
import Graph from '#graph/graph'
import Loader from '#graph/loader'
+import {hotfixBratans} from '#resolver'
import {ServiceTemplate} from '#spec/service-template'
import {IMPLEMENTATION_NAME_REGEX, isImplementation} from '#technologies/utils'
import * as utils from '#utils'
@@ -45,6 +46,8 @@ export default async function (options: TemplateStatsOptions) {
await Promise.all(
options.template.map(async file => {
const template = await new Loader(file).load()
+ hotfixBratans(template)
+
const graph = new Graph(template)
const stats: TemplateStats = {
diff --git a/src/technologies/utils.ts b/src/technologies/utils.ts
index 3ff5dead4e..04558e8774 100644
--- a/src/technologies/utils.ts
+++ b/src/technologies/utils.ts
@@ -99,8 +99,8 @@ export function isIgnore(type: NodeType) {
export enum QUALITY_LABEL {
GOOD = 'good',
+ FAIR = 'fair',
MODERATE = 'moderate',
- CAUTIOUS = 'cautious',
POOR = 'poor',
BAD = 'bad',
}
@@ -110,8 +110,8 @@ export function toLabel(weight: number): QUALITY_LABEL {
if (weight <= 0.125) return QUALITY_LABEL.BAD
if (weight <= 0.375) return QUALITY_LABEL.POOR
- if (weight <= 0.625) return QUALITY_LABEL.CAUTIOUS
- if (weight <= 0.875) return QUALITY_LABEL.MODERATE
+ if (weight <= 0.625) return QUALITY_LABEL.MODERATE
+ if (weight <= 0.875) return QUALITY_LABEL.FAIR
if (weight <= 1) return QUALITY_LABEL.GOOD
throw new Error(`Unknown quality weight "${weight}"`)
@@ -123,8 +123,8 @@ export function toString(weight: number): string {
export function toWeight(label: QUALITY_LABEL) {
if (label === QUALITY_LABEL.GOOD) return 1
- if (label === QUALITY_LABEL.MODERATE) return 0.75
- if (label === QUALITY_LABEL.CAUTIOUS) return 0.5
+ if (label === QUALITY_LABEL.FAIR) return 0.75
+ if (label === QUALITY_LABEL.MODERATE) return 0.5
if (label === QUALITY_LABEL.POOR) return 0.25
if (label === QUALITY_LABEL.BAD) return 0
diff --git a/tasks/docs/generate/quality/template.ejs b/tasks/docs/generate/quality/template.ejs
index 029dac8685..e45eae6848 100644
--- a/tasks/docs/generate/quality/template.ejs
+++ b/tasks/docs/generate/quality/template.ejs
@@ -58,7 +58,7 @@ The scenario does not require a specific hosting.
<% scenario.technologies.forEach(technology => { %>
-!!! <% if (technology.quality > 0.875) { -%>success<% } else if (technology.quality > 625) { -%>question<% } else if (technology.quality > 0.375) { -%>warning<% } else if (technology.quality > 0.125) { -%>failure<% }else { -%>danger<% } -%> "<%= technology.name %> has <%= toLabel(technology.quality) %> quality for this scenario!"
+!!! <% if (technology.quality > 0.875) { -%>success<% } else if (technology.quality > 0.625) { -%>info<% } else if (technology.quality > 0.375) { -%>question<% } else if (technology.quality > 0.125) { -%>warning<% }else { -%>failure<% } -%> "<%= technology.name %> has <%= toLabel(technology.quality) %> quality for this scenario"
<%= technology.reason %>
<% }) %>