diff --git a/examples/unfurl-technology---boutique---plus-maintenance-automated/scripts/study-001.txt b/examples/unfurl-technology---boutique---plus-maintenance-automated/scripts/study-001.txt deleted file mode 100644 index 8fdd476737..0000000000 --- a/examples/unfurl-technology---boutique---plus-maintenance-automated/scripts/study-001.txt +++ /dev/null @@ -1,107 +0,0 @@ - -The technology rules of our case study. Qualities range from bad (0) to good (1). -┌─────────┬──────────────┬────────────────────────┬─────────────────────────────────────────────┬─────────┐ -│ (index) │ Technology │ Component │ Hosting │ Quality │ -├─────────┼──────────────┼────────────────────────┼─────────────────────────────────────────────┼─────────┤ -│ 0 │ 'ansible' │ 'software.application' │ [ 'software.runtime', 'openstack.machine' ] │ 1 │ -│ 1 │ 'ansible' │ 'software.application' │ [ 'docker.engine' ] │ 0.5 │ -│ 2 │ 'ansible' │ 'software.application' │ [ 'kubernetes' ] │ 0.5 │ -│ 3 │ 'ansible' │ 'software.application' │ [ 'gcp.appengine' ] │ 0 │ -│ 4 │ 'ansible' │ 'software.runtime' │ [ 'openstack.machine' ] │ 1 │ -│ 5 │ 'ansible' │ 'mysql.database' │ [ 'mysql.dbms', 'openstack.machine' ] │ 1 │ -│ 6 │ 'ansible' │ 'mysql.database' │ [ 'mysql.dbms', 'docker.engine' ] │ 1 │ -│ 7 │ 'ansible' │ 'mysql.database' │ [ 'mysql.dbms', 'kubernetes' ] │ 1 │ -│ 8 │ 'ansible' │ 'mysql.database' │ [ 'mysql.dbms', 'gcp.cloudsql' ] │ 1 │ -│ 9 │ 'ansible' │ 'mysql.dbms' │ [ 'openstack.machine' ] │ 1 │ -│ 10 │ 'ansible' │ 'mysql.dbms' │ [ 'docker.engine' ] │ 0.5 │ -│ 11 │ 'ansible' │ 'mysql.dbms' │ [ 'kubernetes' ] │ 0.5 │ -│ 12 │ 'ansible' │ 'mysql.dbms' │ [ 'gcp.cloudsql' ] │ 1 │ -│ 13 │ 'ansible' │ 'ingress' │ [ 'openstack.machine' ] │ 1 │ -│ 14 │ 'ansible' │ 'ingress' │ [ 'kubernetes' ] │ 0.5 │ -│ 15 │ 'ansible' │ 'openstack.machine' │ undefined │ 0.5 │ -│ 16 │ 'ansible' │ 'gcp.service' │ undefined │ 1 │ -│ 17 │ 'terraform' │ 'software.application' │ [ 'software.runtime', 'openstack.machine' ] │ 0 │ -│ 18 │ 'terraform' │ 'software.application' │ [ 'docker.engine' ] │ 0.5 │ -│ 19 │ 'terraform' │ 'software.application' │ [ 'kubernetes' ] │ 0.5 │ -│ 20 │ 'terraform' │ 'software.application' │ [ 'gcp.appengine' ] │ 1 │ -│ 21 │ 'terraform' │ 'software.runtime' │ [ 'openstack.machine' ] │ 0 │ -│ 22 │ 'terraform' │ 'mysql.database' │ [ 'mysql.dbms', 'openstack.machine' ] │ 1 │ -│ 23 │ 'terraform' │ 'mysql.database' │ [ 'mysql.dbms', 'docker.engine' ] │ 1 │ -│ 24 │ 'terraform' │ 'mysql.database' │ [ 'mysql.dbms', 'kubernetes' ] │ 1 │ -│ 25 │ 'terraform' │ 'mysql.database' │ [ 'mysql.dbms', 'gcp.cloudsql' ] │ 1 │ -│ 26 │ 'terraform' │ 'mysql.dbms' │ [ 'openstack.machine' ] │ 0 │ -│ 27 │ 'terraform' │ 'mysql.dbms' │ [ 'docker.engine' ] │ 0.5 │ -│ 28 │ 'terraform' │ 'mysql.dbms' │ [ 'kubernetes' ] │ 0.5 │ -│ 29 │ 'terraform' │ 'mysql.dbms' │ [ 'gcp.cloudsql' ] │ 1 │ -│ 30 │ 'terraform' │ 'ingress' │ [ 'openstack.machine' ] │ 0 │ -│ 31 │ 'terraform' │ 'ingress' │ [ 'kubernetes' ] │ 0.5 │ -│ 32 │ 'terraform' │ 'openstack.machine' │ undefined │ 1 │ -│ 33 │ 'terraform' │ 'gcp.service' │ undefined │ 1 │ -│ 34 │ 'kubernetes' │ 'software.application' │ [ 'kubernetes' ] │ 1 │ -│ 35 │ 'kubernetes' │ 'mysql.database' │ [ 'mysql.dbms', 'kubernetes' ] │ 0 │ -│ 36 │ 'kubernetes' │ 'mysql.dbms' │ [ 'kubernetes' ] │ 1 │ -│ 37 │ 'kubernetes' │ 'ingress' │ [ 'kubernetes' ] │ 1 │ -│ 38 │ 'docker' │ 'software.application' │ [ 'docker.engine' ] │ 1 │ -│ 39 │ 'docker' │ 'mysql.database' │ [ 'mysql.dbms', 'docker.engine' ] │ 0 │ -│ 40 │ 'docker' │ 'mysql.dbms' │ [ 'docker.engine' ] │ 1 │ -└─────────┴──────────────┴────────────────────────┴─────────────────────────────────────────────┴─────────┘ - -Metrics relevant when modeling the different scenarios -┌─────────┬─────────────────────────────────────────────────────────────────────────────────────────────────────┬────────┬──────────┬────────────┬────────────────────────┬───────────────┬──────────────┐ -│ (index) │ scenario │ models │ elements │ conditions │ technology_assignments │ lines_of_code │ short │ -├─────────┼─────────────────────────────────────────────────────────────────────────────────────────────────────┼────────┼──────────┼────────────┼────────────────────────┼───────────────┼──────────────┤ -│ 0 │ 'EDMM Docker Variant' │ 1 │ 49 │ 0 │ 12 │ 187 │ │ -│ 1 │ 'EDMM GCP Variant' │ 1 │ 57 │ 0 │ 12 │ 204 │ │ -│ 2 │ 'EDMM OS Large Variant' │ 1 │ 93 │ 0 │ 18 │ 284 │ │ -│ 3 │ 'EDMM OS Medium Variant' │ 1 │ 93 │ 0 │ 18 │ 284 │ │ -│ 4 │ 'EDMM Total (EDMM Docker Variant, EDMM GCP Variant, EDMM OS Medium Variant, EDMM OS Large Variant)' │ 4 │ 292 │ 0 │ 60 │ 959 │ 'EDMM Total' │ -│ 5 │ 'VDMM Baseline Default' │ 1 │ 192 │ 10 │ 44 │ 557 │ │ -│ 6 │ 'VDMM+ Default Manual' │ 1 │ 130 │ 42 │ 45 │ 461 │ │ -│ 7 │ 'VDMM+ Default Automated Random' │ 1 │ 130 │ 5 │ 0 │ 371 │ │ -│ 8 │ 'VDMM+ Default Automated Counting' │ 1 │ 130 │ 5 │ 0 │ 372 │ │ -│ 9 │ 'VDMM+ Default Automated Quality' │ 1 │ 130 │ 5 │ 0 │ 368 │ │ -└─────────┴─────────────────────────────────────────────────────────────────────────────────────────────────────┴────────┴──────────┴────────────┴────────────────────────┴───────────────┴──────────────┘ - -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 │ -├─────────┼──────────────┼────────┼─────────────┼─────────────┼────────────────┼─────────┤ -│ 0 │ 'docker' │ 1 │ [ 0.46, 1 ] │ [ 0.46, 1 ] │ [ 0.54, 0.92 ] │ 1 │ -│ 1 │ 'gcp' │ 1 │ [ 0.29, 1 ] │ [ 0.29, 1 ] │ [ 0.29, 1 ] │ 1 │ -│ 2 │ 'kubernetes' │ 1 │ [ 0.46, 1 ] │ [ 0.46, 1 ] │ [ 0.54, 0.92 ] │ 1 │ -│ 3 │ 'os-large' │ 1 │ [ 0.08, 1 ] │ [ 0.08, 1 ] │ [ 0.11, 0.97 ] │ 1 │ -│ 4 │ 'os-medium' │ 1 │ [ 0.08, 1 ] │ [ 0.08, 1 ] │ [ 0.11, 0.97 ] │ 1 │ -└─────────┴──────────────┴────────┴─────────────┴─────────────┴────────────────┴─────────┘ - -Metrics relevant when modeling the maintenance scenario of our case study -┌─────────┬──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┬────────┬──────────┬────────────┬────────────────────────┬───────────────┬──────────────────────────┐ -│ (index) │ scenario │ models │ elements │ conditions │ technology_assignments │ lines_of_code │ short │ -├─────────┼──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┼────────┼──────────┼────────────┼────────────────────────┼───────────────┼──────────────────────────┤ -│ 0 │ 'EDMM Kubernetes' │ 1 │ 60 │ 0 │ 12 │ 209 │ │ -│ 1 │ 'EDMM Total Maintenance (EDMM Docker Variant, EDMM GCP Variant, EDMM OS Medium Variant, EDMM OS Large Variant, EDMM Kubernetes)' │ 5 │ 352 │ 0 │ 72 │ 1168 │ 'EDMM Total Maintenance' │ -│ 2 │ 'VDMM Baseline Maintenance' │ 1 │ 262 │ 29 │ 56 │ 752 │ │ -│ 3 │ 'VDMM+ Maintenance Manual' │ 1 │ 157 │ 60 │ 58 │ 554 │ │ -│ 4 │ 'VDMM+ Maintenance Automated Random' │ 1 │ 157 │ 10 │ 0 │ 437 │ │ -│ 5 │ 'VDMM+ Maintenance Automated Counting' │ 1 │ 157 │ 10 │ 0 │ 438 │ │ -│ 6 │ 'VDMM+ Maintenance Automated Quality' │ 1 │ 157 │ 10 │ 0 │ 434 │ │ -└─────────┴──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┴────────┴──────────┴────────────┴────────────────────────┴───────────────┴──────────────────────────┘ - -From Default to Maintained (Absolut to previous) -┌─────────┬─────────────────────────────────────────────────────────────────────────┬──────────────────────┬────────────────────────┬──────────────────────────┬──────────────────────────────────────┬─────────────────────────────┐ -│ (index) │ scenario │ models_absolute_diff │ elements_absolute_diff │ conditions_absolute_diff │ technology_assignments_absolute_diff │ lines_of_code_absolute_diff │ -├─────────┼─────────────────────────────────────────────────────────────────────────┼──────────────────────┼────────────────────────┼──────────────────────────┼──────────────────────────────────────┼─────────────────────────────┤ -│ 0 │ 'EDMM Total Maintenance - EDMM Total' │ 1 │ 60 │ 0 │ 12 │ 209 │ -│ 1 │ 'VDMM Baseline Maintenance - VDMM Baseline Default' │ 0 │ 70 │ 19 │ 12 │ 195 │ -│ 2 │ 'VDMM+ Maintenance Manual - VDMM+ Default Manual' │ 0 │ 27 │ 18 │ 13 │ 93 │ -│ 3 │ 'VDMM+ Maintenance Automated Quality - VDMM+ Default Automated Quality' │ 0 │ 27 │ 5 │ 0 │ 66 │ -└─────────┴─────────────────────────────────────────────────────────────────────────┴──────────────────────┴────────────────────────┴──────────────────────────┴──────────────────────────────────────┴─────────────────────────────┘ - -From Default to Maintained (Relative to change to baseline) -┌─────────┬─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┬────────────────────────┬──────────────────────────┬──────────────────────────────────────┬─────────────────────────────┐ -│ (index) │ scenario │ elements_relative_diff │ conditions_relative_diff │ technology_assignments_relative_diff │ lines_of_code_relative_diff │ -├─────────┼─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┼────────────────────────┼──────────────────────────┼──────────────────────────────────────┼─────────────────────────────┤ -│ 0 │ '(VDMM+ Maintenance Manual - VDMM+ Default Manual) / (VDMM Baseline Maintenance - VDMM Baseline Default)' │ 0.39 │ 0.95 │ 1.08 │ 0.48 │ -│ 1 │ '(VDMM+ Maintenance Automated Quality - VDMM+ Default Automated Quality) / (VDMM Baseline Maintenance - VDMM Baseline Default)' │ 0.39 │ 0.26 │ 0 │ 0.34 │ -└─────────┴─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┴────────────────────────┴──────────────────────────┴──────────────────────────────────────┴─────────────────────────────┘ - -> Original \ No newline at end of file diff --git a/examples/unfurl-technology---boutique---plus-maintenance-automated/scripts/study-002.txt b/examples/unfurl-technology---boutique---plus-maintenance-automated/scripts/study-002.txt deleted file mode 100644 index 70464a2d8a..0000000000 --- a/examples/unfurl-technology---boutique---plus-maintenance-automated/scripts/study-002.txt +++ /dev/null @@ -1,106 +0,0 @@ - -The technology rules of our case study. Qualities range from bad (0) to good (1). -┌─────────┬──────────────┬────────────────────────┬─────────────────────────────────────────────┬─────────┐ -│ (index) │ Technology │ Component │ Hosting │ Quality │ -├─────────┼──────────────┼────────────────────────┼─────────────────────────────────────────────┼─────────┤ -│ 0 │ 'ansible' │ 'software.application' │ [ 'docker.engine' ] │ 0.5 │ -│ 1 │ 'ansible' │ 'software.application' │ [ 'kubernetes' ] │ 0.5 │ -│ 2 │ 'ansible' │ 'software.application' │ [ 'gcp.appengine' ] │ 0 │ -│ 3 │ 'ansible' │ 'software.application' │ [ 'openstack.machine' ] │ 1 │ -│ 4 │ 'ansible' │ 'docker.engine' │ [ 'openstack.machine' ] │ 1 │ -│ 5 │ 'ansible' │ 'mysql.database' │ [ 'mysql.dbms', 'openstack.machine' ] │ 1 │ -│ 6 │ 'ansible' │ 'mysql.database' │ [ 'mysql.dbms', 'docker.engine' ] │ 1 │ -│ 7 │ 'ansible' │ 'mysql.database' │ [ 'mysql.dbms', 'kubernetes' ] │ 1 │ -│ 8 │ 'ansible' │ 'mysql.database' │ [ 'mysql.dbms', 'gcp.cloudsql' ] │ 1 │ -│ 9 │ 'ansible' │ 'mysql.dbms' │ [ 'openstack.machine' ] │ 1 │ -│ 10 │ 'ansible' │ 'mysql.dbms' │ [ 'docker.engine' ] │ 0.5 │ -│ 11 │ 'ansible' │ 'mysql.dbms' │ [ 'kubernetes' ] │ 0.5 │ -│ 12 │ 'ansible' │ 'mysql.dbms' │ [ 'gcp.cloudsql' ] │ 1 │ -│ 13 │ 'ansible' │ 'ingress' │ [ 'openstack.machine' ] │ 1 │ -│ 14 │ 'ansible' │ 'ingress' │ [ 'kubernetes' ] │ 0.5 │ -│ 15 │ 'ansible' │ 'openstack.machine' │ undefined │ 0.5 │ -│ 16 │ 'ansible' │ 'gcp.service' │ undefined │ 1 │ -│ 17 │ 'terraform' │ 'software.application' │ [ 'software.runtime', 'openstack.machine' ] │ 0 │ -│ 18 │ 'terraform' │ 'software.application' │ [ 'docker.engine' ] │ 0.5 │ -│ 19 │ 'terraform' │ 'software.application' │ [ 'kubernetes' ] │ 0.5 │ -│ 20 │ 'terraform' │ 'software.application' │ [ 'gcp.appengine' ] │ 1 │ -│ 21 │ 'terraform' │ 'software.application' │ [ 'openstack.machine' ] │ 0 │ -│ 22 │ 'terraform' │ 'docker.engine' │ [ 'openstack.machine' ] │ 0 │ -│ 23 │ 'terraform' │ 'mysql.database' │ [ 'mysql.dbms', 'openstack.machine' ] │ 1 │ -│ 24 │ 'terraform' │ 'mysql.database' │ [ 'mysql.dbms', 'docker.engine' ] │ 1 │ -│ 25 │ 'terraform' │ 'mysql.database' │ [ 'mysql.dbms', 'kubernetes' ] │ 1 │ -│ 26 │ 'terraform' │ 'mysql.database' │ [ 'mysql.dbms', 'gcp.cloudsql' ] │ 1 │ -│ 27 │ 'terraform' │ 'mysql.dbms' │ [ 'openstack.machine' ] │ 0 │ -│ 28 │ 'terraform' │ 'mysql.dbms' │ [ 'docker.engine' ] │ 0.5 │ -│ 29 │ 'terraform' │ 'mysql.dbms' │ [ 'kubernetes' ] │ 0.5 │ -│ 30 │ 'terraform' │ 'mysql.dbms' │ [ 'gcp.cloudsql' ] │ 1 │ -│ 31 │ 'terraform' │ 'ingress' │ [ 'openstack.machine' ] │ 0 │ -│ 32 │ 'terraform' │ 'ingress' │ [ 'kubernetes' ] │ 0.5 │ -│ 33 │ 'terraform' │ 'openstack.machine' │ undefined │ 1 │ -│ 34 │ 'terraform' │ 'gcp.service' │ undefined │ 1 │ -│ 35 │ 'kubernetes' │ 'software.application' │ [ 'kubernetes' ] │ 1 │ -│ 36 │ 'kubernetes' │ 'mysql.database' │ [ 'mysql.dbms', 'kubernetes' ] │ 0 │ -│ 37 │ 'kubernetes' │ 'mysql.dbms' │ [ 'kubernetes' ] │ 1 │ -│ 38 │ 'kubernetes' │ 'ingress' │ [ 'kubernetes' ] │ 1 │ -│ 39 │ 'docker' │ 'software.application' │ [ 'docker.engine' ] │ 1 │ -│ 40 │ 'docker' │ 'mysql.database' │ [ 'mysql.dbms', 'docker.engine' ] │ 0 │ -│ 41 │ 'docker' │ 'mysql.dbms' │ [ 'docker.engine' ] │ 1 │ -└─────────┴──────────────┴────────────────────────┴─────────────────────────────────────────────┴─────────┘ - -Metrics relevant when modeling the different scenarios -┌─────────┬────────────────────────────────────────────────────────────────────────────────┬────────┬──────────┬────────────┬────────────────────────┬───────────────┬──────────────┐ -│ (index) │ scenario │ models │ elements │ conditions │ technology_assignments │ lines_of_code │ short │ -├─────────┼────────────────────────────────────────────────────────────────────────────────┼────────┼──────────┼────────────┼────────────────────────┼───────────────┼──────────────┤ -│ 0 │ 'EDMM GCP Variant' │ 1 │ 57 │ 0 │ 14 │ 206 │ │ -│ 1 │ 'EDMM OS Large Variant' │ 1 │ 86 │ 0 │ 18 │ 269 │ │ -│ 2 │ 'EDMM OS Medium Variant' │ 1 │ 86 │ 0 │ 18 │ 269 │ │ -│ 3 │ 'EDMM Total (EDMM GCP Variant, EDMM OS Medium Variant, EDMM OS Large Variant)' │ 3 │ 229 │ 0 │ 50 │ 744 │ 'EDMM Total' │ -│ 4 │ 'VDMM Baseline Default' │ 1 │ 138 │ 8 │ 31 │ 424 │ │ -│ 5 │ 'VDMM+ Default Manual' │ 1 │ 109 │ 27 │ 31 │ 389 │ │ -│ 6 │ 'VDMM+ Default Automated Random' │ 1 │ 109 │ 4 │ 0 │ 326 │ │ -│ 7 │ 'VDMM+ Default Automated Counting' │ 1 │ 109 │ 4 │ 0 │ 327 │ │ -│ 8 │ 'VDMM+ Default Automated Quality' │ 1 │ 109 │ 4 │ 0 │ 323 │ │ -└─────────┴────────────────────────────────────────────────────────────────────────────────┴────────┴──────────┴────────────┴────────────────────────┴───────────────┴──────────────┘ - -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 │ -├─────────┼──────────────┼────────┼─────────────┼─────────────┼────────────────┼─────────┤ -│ 0 │ 'gcp' │ 1 │ [ 0.29, 1 ] │ [ 0.29, 1 ] │ [ 0.29, 1 ] │ 1 │ -│ 1 │ 'kubernetes' │ 1 │ [ 0.46, 1 ] │ [ 0.46, 1 ] │ [ 0.54, 0.92 ] │ 1 │ -│ 2 │ 'os-large' │ 1 │ [ 0.33, 1 ] │ [ 0.33, 1 ] │ [ 0.42, 0.67 ] │ 1 │ -│ 3 │ 'os-medium' │ 1 │ [ 0.33, 1 ] │ [ 0.33, 1 ] │ [ 0.42, 0.67 ] │ 1 │ -└─────────┴──────────────┴────────┴─────────────┴─────────────┴────────────────┴─────────┘ - -Metrics relevant when modeling the maintenance scenario of our case study -┌─────────┬─────────────────────────────────────────────────────────────────────────────────────────────────────────────┬────────┬──────────┬────────────┬────────────────────────┬───────────────┬──────────────────────────┐ -│ (index) │ scenario │ models │ elements │ conditions │ technology_assignments │ lines_of_code │ short │ -├─────────┼─────────────────────────────────────────────────────────────────────────────────────────────────────────────┼────────┼──────────┼────────────┼────────────────────────┼───────────────┼──────────────────────────┤ -│ 0 │ 'EDMM Kubernetes' │ 1 │ 60 │ 0 │ 13 │ 210 │ │ -│ 1 │ 'EDMM Total Maintenance (EDMM GCP Variant, EDMM OS Medium Variant, EDMM OS Large Variant, EDMM Kubernetes)' │ 4 │ 289 │ 0 │ 63 │ 954 │ 'EDMM Total Maintenance' │ -│ 2 │ 'VDMM Baseline Maintenance' │ 1 │ 204 │ 23 │ 43 │ 606 │ │ -│ 3 │ 'VDMM+ Maintenance Manual' │ 1 │ 136 │ 44 │ 43 │ 479 │ │ -│ 4 │ 'VDMM+ Maintenance Automated Random' │ 1 │ 136 │ 9 │ 0 │ 394 │ │ -│ 5 │ 'VDMM+ Maintenance Automated Counting' │ 1 │ 136 │ 9 │ 0 │ 395 │ │ -│ 6 │ 'VDMM+ Maintenance Automated Quality' │ 1 │ 136 │ 9 │ 0 │ 391 │ │ -└─────────┴─────────────────────────────────────────────────────────────────────────────────────────────────────────────┴────────┴──────────┴────────────┴────────────────────────┴───────────────┴──────────────────────────┘ - -From Default to Maintained (Absolut to previous) -┌─────────┬─────────────────────────────────────────────────────────────────────────┬──────────────────────┬────────────────────────┬──────────────────────────┬──────────────────────────────────────┬─────────────────────────────┐ -│ (index) │ scenario │ models_absolute_diff │ elements_absolute_diff │ conditions_absolute_diff │ technology_assignments_absolute_diff │ lines_of_code_absolute_diff │ -├─────────┼─────────────────────────────────────────────────────────────────────────┼──────────────────────┼────────────────────────┼──────────────────────────┼──────────────────────────────────────┼─────────────────────────────┤ -│ 0 │ 'EDMM Total Maintenance - EDMM Total' │ 1 │ 60 │ 0 │ 13 │ 210 │ -│ 1 │ 'VDMM Baseline Maintenance - VDMM Baseline Default' │ 0 │ 66 │ 15 │ 12 │ 182 │ -│ 2 │ 'VDMM+ Maintenance Manual - VDMM+ Default Manual' │ 0 │ 27 │ 17 │ 12 │ 90 │ -│ 3 │ 'VDMM+ Maintenance Automated Quality - VDMM+ Default Automated Quality' │ 0 │ 27 │ 5 │ 0 │ 68 │ -└─────────┴─────────────────────────────────────────────────────────────────────────┴──────────────────────┴────────────────────────┴──────────────────────────┴──────────────────────────────────────┴─────────────────────────────┘ - -From Default to Maintained (Relative to change to baseline) -┌─────────┬─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┬────────────────────────┬──────────────────────────┬──────────────────────────────────────┬─────────────────────────────┐ -│ (index) │ scenario │ elements_relative_diff │ conditions_relative_diff │ technology_assignments_relative_diff │ lines_of_code_relative_diff │ -├─────────┼─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┼────────────────────────┼──────────────────────────┼──────────────────────────────────────┼─────────────────────────────┤ -│ 0 │ '(VDMM+ Maintenance Manual - VDMM+ Default Manual) / (VDMM Baseline Maintenance - VDMM Baseline Default)' │ 0.41 │ 1.13 │ 1 │ 0.49 │ -│ 1 │ '(VDMM+ Maintenance Automated Quality - VDMM+ Default Automated Quality) / (VDMM Baseline Maintenance - VDMM Baseline Default)' │ 0.41 │ 0.33 │ 0 │ 0.37 │ -└─────────┴─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┴────────────────────────┴──────────────────────────┴──────────────────────────────────────┴─────────────────────────────┘ - -> Diff: Docker on VM \ No newline at end of file diff --git a/examples/unfurl-technology---boutique---plus-maintenance-automated/scripts/study-003.txt b/examples/unfurl-technology---boutique---plus-maintenance-automated/scripts/study-003.txt deleted file mode 100644 index 09a831f22a..0000000000 --- a/examples/unfurl-technology---boutique---plus-maintenance-automated/scripts/study-003.txt +++ /dev/null @@ -1,106 +0,0 @@ - -The technology rules of our case study. Qualities range from bad (0) to good (1). -┌─────────┬──────────────┬────────────────────────┬─────────────────────────────────────────────┬─────────┐ -│ (index) │ Technology │ Component │ Hosting │ Quality │ -├─────────┼──────────────┼────────────────────────┼─────────────────────────────────────────────┼─────────┤ -│ 0 │ 'ansible' │ 'software.application' │ [ 'docker.engine' ] │ 0.5 │ -│ 1 │ 'ansible' │ 'software.application' │ [ 'kubernetes' ] │ 0.5 │ -│ 2 │ 'ansible' │ 'software.application' │ [ 'gcp.appengine' ] │ 0 │ -│ 3 │ 'ansible' │ 'software.application' │ [ 'openstack.machine' ] │ 1 │ -│ 4 │ 'ansible' │ 'docker.engine' │ [ 'openstack.machine' ] │ 1 │ -│ 5 │ 'ansible' │ 'mysql.database' │ [ 'mysql.dbms', 'openstack.machine' ] │ 1 │ -│ 6 │ 'ansible' │ 'mysql.database' │ [ 'mysql.dbms', 'docker.engine' ] │ 1 │ -│ 7 │ 'ansible' │ 'mysql.database' │ [ 'mysql.dbms', 'kubernetes' ] │ 1 │ -│ 8 │ 'ansible' │ 'mysql.database' │ [ 'mysql.dbms', 'gcp.cloudsql' ] │ 1 │ -│ 9 │ 'ansible' │ 'mysql.dbms' │ [ 'openstack.machine' ] │ 1 │ -│ 10 │ 'ansible' │ 'mysql.dbms' │ [ 'docker.engine' ] │ 0.5 │ -│ 11 │ 'ansible' │ 'mysql.dbms' │ [ 'kubernetes' ] │ 0.5 │ -│ 12 │ 'ansible' │ 'mysql.dbms' │ [ 'gcp.cloudsql' ] │ 1 │ -│ 13 │ 'ansible' │ 'ingress' │ [ 'openstack.machine' ] │ 1 │ -│ 14 │ 'ansible' │ 'ingress' │ [ 'kubernetes' ] │ 0.5 │ -│ 15 │ 'ansible' │ 'openstack.machine' │ undefined │ 0.5 │ -│ 16 │ 'ansible' │ 'gcp.service' │ undefined │ 1 │ -│ 17 │ 'terraform' │ 'software.application' │ [ 'software.runtime', 'openstack.machine' ] │ 0 │ -│ 18 │ 'terraform' │ 'software.application' │ [ 'docker.engine' ] │ 0.5 │ -│ 19 │ 'terraform' │ 'software.application' │ [ 'kubernetes' ] │ 0.5 │ -│ 20 │ 'terraform' │ 'software.application' │ [ 'gcp.appengine' ] │ 1 │ -│ 21 │ 'terraform' │ 'software.application' │ [ 'openstack.machine' ] │ 0 │ -│ 22 │ 'terraform' │ 'docker.engine' │ [ 'openstack.machine' ] │ 0 │ -│ 23 │ 'terraform' │ 'mysql.database' │ [ 'mysql.dbms', 'openstack.machine' ] │ 1 │ -│ 24 │ 'terraform' │ 'mysql.database' │ [ 'mysql.dbms', 'docker.engine' ] │ 1 │ -│ 25 │ 'terraform' │ 'mysql.database' │ [ 'mysql.dbms', 'kubernetes' ] │ 1 │ -│ 26 │ 'terraform' │ 'mysql.database' │ [ 'mysql.dbms', 'gcp.cloudsql' ] │ 1 │ -│ 27 │ 'terraform' │ 'mysql.dbms' │ [ 'openstack.machine' ] │ 0 │ -│ 28 │ 'terraform' │ 'mysql.dbms' │ [ 'docker.engine' ] │ 0.5 │ -│ 29 │ 'terraform' │ 'mysql.dbms' │ [ 'kubernetes' ] │ 0.5 │ -│ 30 │ 'terraform' │ 'mysql.dbms' │ [ 'gcp.cloudsql' ] │ 1 │ -│ 31 │ 'terraform' │ 'ingress' │ [ 'openstack.machine' ] │ 0 │ -│ 32 │ 'terraform' │ 'ingress' │ [ 'kubernetes' ] │ 0.5 │ -│ 33 │ 'terraform' │ 'openstack.machine' │ undefined │ 1 │ -│ 34 │ 'terraform' │ 'gcp.service' │ undefined │ 1 │ -│ 35 │ 'kubernetes' │ 'software.application' │ [ 'kubernetes' ] │ 1 │ -│ 36 │ 'kubernetes' │ 'mysql.database' │ [ 'mysql.dbms', 'kubernetes' ] │ 0 │ -│ 37 │ 'kubernetes' │ 'mysql.dbms' │ [ 'kubernetes' ] │ 1 │ -│ 38 │ 'kubernetes' │ 'ingress' │ [ 'kubernetes' ] │ 1 │ -│ 39 │ 'docker' │ 'software.application' │ [ 'docker.engine' ] │ 1 │ -│ 40 │ 'docker' │ 'mysql.database' │ [ 'mysql.dbms', 'docker.engine' ] │ 0 │ -│ 41 │ 'docker' │ 'mysql.dbms' │ [ 'docker.engine' ] │ 1 │ -└─────────┴──────────────┴────────────────────────┴─────────────────────────────────────────────┴─────────┘ - -Metrics relevant when modeling the different scenarios -┌─────────┬────────────────────────────────────────────────────────────────────────────────┬────────┬──────────┬────────────┬────────────────────────┬───────────────┬──────────────┐ -│ (index) │ scenario │ models │ elements │ conditions │ technology_assignments │ lines_of_code │ short │ -├─────────┼────────────────────────────────────────────────────────────────────────────────┼────────┼──────────┼────────────┼────────────────────────┼───────────────┼──────────────┤ -│ 0 │ 'EDMM GCP Variant' │ 1 │ 74 │ 0 │ 14 │ 227 │ │ -│ 1 │ 'EDMM OS Large Variant' │ 1 │ 104 │ 0 │ 18 │ 292 │ │ -│ 2 │ 'EDMM OS Medium Variant' │ 1 │ 104 │ 0 │ 18 │ 292 │ │ -│ 3 │ 'EDMM Total (EDMM GCP Variant, EDMM OS Medium Variant, EDMM OS Large Variant)' │ 3 │ 282 │ 0 │ 50 │ 811 │ 'EDMM Total' │ -│ 4 │ 'VDMM Baseline Default' │ 1 │ 173 │ 8 │ 31 │ 468 │ │ -│ 5 │ 'VDMM+ Default Manual' │ 1 │ 127 │ 27 │ 31 │ 412 │ │ -│ 6 │ 'VDMM+ Default Automated Random' │ 1 │ 127 │ 4 │ 0 │ 350 │ │ -│ 7 │ 'VDMM+ Default Automated Counting' │ 1 │ 127 │ 4 │ 0 │ 351 │ │ -│ 8 │ 'VDMM+ Default Automated Quality' │ 1 │ 127 │ 4 │ 0 │ 347 │ │ -└─────────┴────────────────────────────────────────────────────────────────────────────────┴────────┴──────────┴────────────┴────────────────────────┴───────────────┴──────────────┘ - -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' │ 1 │ [ 0.29, 1 ] │ [ 0.29, 1 ] │ [ 0.29, 1 ] │ 1 │ 1 │ -│ 1 │ 'kubernetes' │ 1 │ [ 0.46, 1 ] │ [ 0.46, 1 ] │ [ 0.54, 0.92 ] │ 1 │ 1 │ -│ 2 │ 'os-large' │ 1 │ [ 0.33, 1 ] │ [ 0.33, 1 ] │ [ 0.42, 0.67 ] │ 1 │ 1 │ -│ 3 │ 'os-medium' │ 1 │ [ 0.33, 1 ] │ [ 0.33, 1 ] │ [ 0.42, 0.67 ] │ 1 │ 1 │ -└─────────┴──────────────┴────────┴─────────────┴─────────────┴────────────────┴─────────┴──────────────────┘ - -Metrics relevant when modeling the maintenance scenario of our case study -┌─────────┬─────────────────────────────────────────────────────────────────────────────────────────────────────────────┬────────┬──────────┬────────────┬────────────────────────┬───────────────┬──────────────────────────┐ -│ (index) │ scenario │ models │ elements │ conditions │ technology_assignments │ lines_of_code │ short │ -├─────────┼─────────────────────────────────────────────────────────────────────────────────────────────────────────────┼────────┼──────────┼────────────┼────────────────────────┼───────────────┼──────────────────────────┤ -│ 0 │ 'EDMM Kubernetes' │ 1 │ 78 │ 0 │ 13 │ 233 │ │ -│ 1 │ 'EDMM Total Maintenance (EDMM GCP Variant, EDMM OS Medium Variant, EDMM OS Large Variant, EDMM Kubernetes)' │ 4 │ 360 │ 0 │ 63 │ 1044 │ 'EDMM Total Maintenance' │ -│ 2 │ 'VDMM Baseline Maintenance' │ 1 │ 257 │ 23 │ 43 │ 673 │ │ -│ 3 │ 'VDMM+ Maintenance Manual' │ 1 │ 154 │ 44 │ 43 │ 502 │ │ -│ 4 │ 'VDMM+ Maintenance Automated Random' │ 1 │ 154 │ 9 │ 0 │ 418 │ │ -│ 5 │ 'VDMM+ Maintenance Automated Counting' │ 1 │ 154 │ 9 │ 0 │ 419 │ │ -│ 6 │ 'VDMM+ Maintenance Automated Quality' │ 1 │ 154 │ 9 │ 0 │ 415 │ │ -└─────────┴─────────────────────────────────────────────────────────────────────────────────────────────────────────────┴────────┴──────────┴────────────┴────────────────────────┴───────────────┴──────────────────────────┘ - -From Default to Maintained (Absolut to previous) -┌─────────┬─────────────────────────────────────────────────────────────────────────┬──────────────────────┬────────────────────────┬──────────────────────────┬──────────────────────────────────────┬─────────────────────────────┐ -│ (index) │ scenario │ models_absolute_diff │ elements_absolute_diff │ conditions_absolute_diff │ technology_assignments_absolute_diff │ lines_of_code_absolute_diff │ -├─────────┼─────────────────────────────────────────────────────────────────────────┼──────────────────────┼────────────────────────┼──────────────────────────┼──────────────────────────────────────┼─────────────────────────────┤ -│ 0 │ 'EDMM Total Maintenance - EDMM Total' │ 1 │ 78 │ 0 │ 13 │ 233 │ -│ 1 │ 'VDMM Baseline Maintenance - VDMM Baseline Default' │ 0 │ 84 │ 15 │ 12 │ 205 │ -│ 2 │ 'VDMM+ Maintenance Manual - VDMM+ Default Manual' │ 0 │ 27 │ 17 │ 12 │ 90 │ -│ 3 │ 'VDMM+ Maintenance Automated Quality - VDMM+ Default Automated Quality' │ 0 │ 27 │ 5 │ 0 │ 68 │ -└─────────┴─────────────────────────────────────────────────────────────────────────┴──────────────────────┴────────────────────────┴──────────────────────────┴──────────────────────────────────────┴─────────────────────────────┘ - -From Default to Maintained (Relative to change to baseline) -┌─────────┬─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┬────────────────────────┬──────────────────────────┬──────────────────────────────────────┬─────────────────────────────┐ -│ (index) │ scenario │ elements_relative_diff │ conditions_relative_diff │ technology_assignments_relative_diff │ lines_of_code_relative_diff │ -├─────────┼─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┼────────────────────────┼──────────────────────────┼──────────────────────────────────────┼─────────────────────────────┤ -│ 0 │ '(VDMM+ Maintenance Manual - VDMM+ Default Manual) / (VDMM Baseline Maintenance - VDMM Baseline Default)' │ 0.32 │ 1.13 │ 1 │ 0.44 │ -│ 1 │ '(VDMM+ Maintenance Automated Quality - VDMM+ Default Automated Quality) / (VDMM Baseline Maintenance - VDMM Baseline Default)' │ 0.32 │ 0.33 │ 0 │ 0.33 │ -└─────────┴─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┴────────────────────────┴──────────────────────────┴──────────────────────────────────────┴─────────────────────────────┘ - -> Diff: connection properties \ No newline at end of file diff --git a/examples/unfurl-technology---boutique---plus-maintenance-automated/scripts/study-004.txt b/examples/unfurl-technology---boutique---plus-maintenance-automated/scripts/study-004.txt deleted file mode 100644 index 9dff403f4d..0000000000 --- a/examples/unfurl-technology---boutique---plus-maintenance-automated/scripts/study-004.txt +++ /dev/null @@ -1,106 +0,0 @@ - -The technology rules of our case study. Qualities range from bad (0) to good (1). -┌─────────┬──────────────┬────────────────────────┬─────────────────────────────────────────────┬─────────┐ -│ (index) │ Technology │ Component │ Hosting │ Quality │ -├─────────┼──────────────┼────────────────────────┼─────────────────────────────────────────────┼─────────┤ -│ 0 │ 'ansible' │ 'software.application' │ [ 'docker.engine' ] │ 0.5 │ -│ 1 │ 'ansible' │ 'software.application' │ [ 'kubernetes' ] │ 0.5 │ -│ 2 │ 'ansible' │ 'software.application' │ [ 'gcp.appengine' ] │ 0 │ -│ 3 │ 'ansible' │ 'software.application' │ [ 'openstack.machine' ] │ 1 │ -│ 4 │ 'ansible' │ 'docker.engine' │ [ 'openstack.machine' ] │ 1 │ -│ 5 │ 'ansible' │ 'mysql.database' │ [ 'mysql.dbms', 'openstack.machine' ] │ 1 │ -│ 6 │ 'ansible' │ 'mysql.database' │ [ 'mysql.dbms', 'docker.engine' ] │ 1 │ -│ 7 │ 'ansible' │ 'mysql.database' │ [ 'mysql.dbms', 'kubernetes' ] │ 1 │ -│ 8 │ 'ansible' │ 'mysql.database' │ [ 'mysql.dbms', 'gcp.cloudsql' ] │ 1 │ -│ 9 │ 'ansible' │ 'mysql.dbms' │ [ 'openstack.machine' ] │ 1 │ -│ 10 │ 'ansible' │ 'mysql.dbms' │ [ 'docker.engine' ] │ 0.5 │ -│ 11 │ 'ansible' │ 'mysql.dbms' │ [ 'kubernetes' ] │ 0.5 │ -│ 12 │ 'ansible' │ 'mysql.dbms' │ [ 'gcp.cloudsql' ] │ 1 │ -│ 13 │ 'ansible' │ 'ingress' │ [ 'openstack.machine' ] │ 1 │ -│ 14 │ 'ansible' │ 'ingress' │ [ 'kubernetes' ] │ 0.5 │ -│ 15 │ 'ansible' │ 'openstack.machine' │ undefined │ 0.5 │ -│ 16 │ 'ansible' │ 'gcp.service' │ undefined │ 1 │ -│ 17 │ 'terraform' │ 'software.application' │ [ 'software.runtime', 'openstack.machine' ] │ 0 │ -│ 18 │ 'terraform' │ 'software.application' │ [ 'docker.engine' ] │ 0.5 │ -│ 19 │ 'terraform' │ 'software.application' │ [ 'kubernetes' ] │ 0.5 │ -│ 20 │ 'terraform' │ 'software.application' │ [ 'gcp.appengine' ] │ 1 │ -│ 21 │ 'terraform' │ 'software.application' │ [ 'openstack.machine' ] │ 0 │ -│ 22 │ 'terraform' │ 'docker.engine' │ [ 'openstack.machine' ] │ 0 │ -│ 23 │ 'terraform' │ 'mysql.database' │ [ 'mysql.dbms', 'openstack.machine' ] │ 1 │ -│ 24 │ 'terraform' │ 'mysql.database' │ [ 'mysql.dbms', 'docker.engine' ] │ 1 │ -│ 25 │ 'terraform' │ 'mysql.database' │ [ 'mysql.dbms', 'kubernetes' ] │ 1 │ -│ 26 │ 'terraform' │ 'mysql.database' │ [ 'mysql.dbms', 'gcp.cloudsql' ] │ 1 │ -│ 27 │ 'terraform' │ 'mysql.dbms' │ [ 'openstack.machine' ] │ 0 │ -│ 28 │ 'terraform' │ 'mysql.dbms' │ [ 'docker.engine' ] │ 0.5 │ -│ 29 │ 'terraform' │ 'mysql.dbms' │ [ 'kubernetes' ] │ 0.5 │ -│ 30 │ 'terraform' │ 'mysql.dbms' │ [ 'gcp.cloudsql' ] │ 1 │ -│ 31 │ 'terraform' │ 'ingress' │ [ 'openstack.machine' ] │ 0 │ -│ 32 │ 'terraform' │ 'ingress' │ [ 'kubernetes' ] │ 0.5 │ -│ 33 │ 'terraform' │ 'openstack.machine' │ undefined │ 1 │ -│ 34 │ 'terraform' │ 'gcp.service' │ undefined │ 1 │ -│ 35 │ 'kubernetes' │ 'software.application' │ [ 'kubernetes' ] │ 1 │ -│ 36 │ 'kubernetes' │ 'mysql.database' │ [ 'mysql.dbms', 'kubernetes' ] │ 0 │ -│ 37 │ 'kubernetes' │ 'mysql.dbms' │ [ 'kubernetes' ] │ 1 │ -│ 38 │ 'kubernetes' │ 'ingress' │ [ 'kubernetes' ] │ 1 │ -│ 39 │ 'docker' │ 'software.application' │ [ 'docker.engine' ] │ 1 │ -│ 40 │ 'docker' │ 'mysql.database' │ [ 'mysql.dbms', 'docker.engine' ] │ 0 │ -│ 41 │ 'docker' │ 'mysql.dbms' │ [ 'docker.engine' ] │ 1 │ -└─────────┴──────────────┴────────────────────────┴─────────────────────────────────────────────┴─────────┘ - -Metrics relevant when modeling the different scenarios -┌─────────┬────────────────────────────────────────────────────────────────────────────────┬────────┬──────────┬────────────┬────────────────────────┬───────────────┬──────────────┐ -│ (index) │ scenario │ models │ elements │ conditions │ technology_assignments │ lines_of_code │ short │ -├─────────┼────────────────────────────────────────────────────────────────────────────────┼────────┼──────────┼────────────┼────────────────────────┼───────────────┼──────────────┤ -│ 0 │ 'EDMM GCP Variant' │ 1 │ 84 │ 0 │ 14 │ 253 │ │ -│ 1 │ 'EDMM OS Large Variant' │ 1 │ 114 │ 0 │ 18 │ 318 │ │ -│ 2 │ 'EDMM OS Medium Variant' │ 1 │ 114 │ 0 │ 18 │ 318 │ │ -│ 3 │ 'EDMM Total (EDMM GCP Variant, EDMM OS Medium Variant, EDMM OS Large Variant)' │ 3 │ 312 │ 0 │ 50 │ 889 │ 'EDMM Total' │ -│ 4 │ 'VDMM Baseline Default' │ 1 │ 193 │ 8 │ 31 │ 520 │ │ -│ 5 │ 'VDMM+ Default Manual' │ 1 │ 147 │ 47 │ 31 │ 477 │ │ -│ 6 │ 'VDMM+ Default Automated Random' │ 1 │ 147 │ 24 │ 0 │ 415 │ │ -│ 7 │ 'VDMM+ Default Automated Counting' │ 1 │ 147 │ 24 │ 0 │ 416 │ │ -│ 8 │ 'VDMM+ Default Automated Quality' │ 1 │ 147 │ 24 │ 0 │ 412 │ │ -└─────────┴────────────────────────────────────────────────────────────────────────────────┴────────┴──────────┴────────────┴────────────────────────┴───────────────┴──────────────┘ - -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' │ 1 │ [ 0.29, 1 ] │ [ 0.29, 1 ] │ [ 0.29, 1 ] │ 1 │ 1 │ -│ 1 │ 'kubernetes' │ 1 │ [ 0.46, 1 ] │ [ 0.46, 1 ] │ [ 0.54, 0.92 ] │ 1 │ 1 │ -│ 2 │ 'os-large' │ 1 │ [ 0.33, 1 ] │ [ 0.33, 1 ] │ [ 0.42, 0.67 ] │ 1 │ 1 │ -│ 3 │ 'os-medium' │ 1 │ [ 0.33, 1 ] │ [ 0.33, 1 ] │ [ 0.42, 0.67 ] │ 1 │ 1 │ -└─────────┴──────────────┴────────┴─────────────┴─────────────┴────────────────┴─────────┴──────────────────┘ - -Metrics relevant when modeling the maintenance scenario of our case study -┌─────────┬─────────────────────────────────────────────────────────────────────────────────────────────────────────────┬────────┬──────────┬────────────┬────────────────────────┬───────────────┬──────────────────────────┐ -│ (index) │ scenario │ models │ elements │ conditions │ technology_assignments │ lines_of_code │ short │ -├─────────┼─────────────────────────────────────────────────────────────────────────────────────────────────────────────┼────────┼──────────┼────────────┼────────────────────────┼───────────────┼──────────────────────────┤ -│ 0 │ 'EDMM Kubernetes' │ 1 │ 88 │ 0 │ 13 │ 258 │ │ -│ 1 │ 'EDMM Total Maintenance (EDMM GCP Variant, EDMM OS Medium Variant, EDMM OS Large Variant, EDMM Kubernetes)' │ 4 │ 400 │ 0 │ 63 │ 1147 │ 'EDMM Total Maintenance' │ -│ 2 │ 'VDMM Baseline Maintenance' │ 1 │ 287 │ 23 │ 43 │ 751 │ │ -│ 3 │ 'VDMM+ Maintenance Manual' │ 1 │ 174 │ 74 │ 43 │ 568 │ │ -│ 4 │ 'VDMM+ Maintenance Automated Random' │ 1 │ 174 │ 39 │ 0 │ 483 │ │ -│ 5 │ 'VDMM+ Maintenance Automated Counting' │ 1 │ 174 │ 39 │ 0 │ 484 │ │ -│ 6 │ 'VDMM+ Maintenance Automated Quality' │ 1 │ 174 │ 39 │ 0 │ 480 │ │ -└─────────┴─────────────────────────────────────────────────────────────────────────────────────────────────────────────┴────────┴──────────┴────────────┴────────────────────────┴───────────────┴──────────────────────────┘ - -From Default to Maintained (Absolut to previous) -┌─────────┬─────────────────────────────────────────────────────────────────────────┬──────────────────────┬────────────────────────┬──────────────────────────┬──────────────────────────────────────┬─────────────────────────────┐ -│ (index) │ scenario │ models_absolute_diff │ elements_absolute_diff │ conditions_absolute_diff │ technology_assignments_absolute_diff │ lines_of_code_absolute_diff │ -├─────────┼─────────────────────────────────────────────────────────────────────────┼──────────────────────┼────────────────────────┼──────────────────────────┼──────────────────────────────────────┼─────────────────────────────┤ -│ 0 │ 'EDMM Total Maintenance - EDMM Total' │ 1 │ 88 │ 0 │ 13 │ 258 │ -│ 1 │ 'VDMM Baseline Maintenance - VDMM Baseline Default' │ 0 │ 94 │ 15 │ 12 │ 231 │ -│ 2 │ 'VDMM+ Maintenance Manual - VDMM+ Default Manual' │ 0 │ 27 │ 27 │ 12 │ 91 │ -│ 3 │ 'VDMM+ Maintenance Automated Quality - VDMM+ Default Automated Quality' │ 0 │ 27 │ 15 │ 0 │ 68 │ -└─────────┴─────────────────────────────────────────────────────────────────────────┴──────────────────────┴────────────────────────┴──────────────────────────┴──────────────────────────────────────┴─────────────────────────────┘ - -From Default to Maintained (Relative to change to baseline) -┌─────────┬─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┬────────────────────────┬──────────────────────────┬──────────────────────────────────────┬─────────────────────────────┐ -│ (index) │ scenario │ elements_relative_diff │ conditions_relative_diff │ technology_assignments_relative_diff │ lines_of_code_relative_diff │ -├─────────┼─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┼────────────────────────┼──────────────────────────┼──────────────────────────────────────┼─────────────────────────────┤ -│ 0 │ '(VDMM+ Maintenance Manual - VDMM+ Default Manual) / (VDMM Baseline Maintenance - VDMM Baseline Default)' │ 0.29 │ 1.8 │ 1 │ 0.39 │ -│ 1 │ '(VDMM+ Maintenance Automated Quality - VDMM+ Default Automated Quality) / (VDMM Baseline Maintenance - VDMM Baseline Default)' │ 0.29 │ 1 │ 0 │ 0.29 │ -└─────────┴─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┴────────────────────────┴──────────────────────────┴──────────────────────────────────────┴─────────────────────────────┘ - -> Diff: artifacts \ No newline at end of file diff --git a/examples/unfurl-technology---boutique---plus-maintenance-automated/scripts/study-005.txt b/examples/unfurl-technology---boutique---plus-maintenance-automated/scripts/study-005.txt deleted file mode 100644 index f808f636d0..0000000000 --- a/examples/unfurl-technology---boutique---plus-maintenance-automated/scripts/study-005.txt +++ /dev/null @@ -1,107 +0,0 @@ - -The technology rules of our case study. Qualities range from bad (0) to good (1). -┌─────────┬──────────────┬────────────────────────┬─────────────────────────────────────────────┬─────────┐ -│ (index) │ Technology │ Component │ Hosting │ Quality │ -├─────────┼──────────────┼────────────────────────┼─────────────────────────────────────────────┼─────────┤ -│ 0 │ 'ansible' │ 'software.application' │ [ 'docker.engine' ] │ 0.5 │ -│ 1 │ 'ansible' │ 'software.application' │ [ 'kubernetes' ] │ 0.5 │ -│ 2 │ 'ansible' │ 'software.application' │ [ 'gcp.appengine' ] │ 0 │ -│ 3 │ 'ansible' │ 'software.application' │ [ 'openstack.machine' ] │ 1 │ -│ 4 │ 'ansible' │ 'docker.engine' │ [ 'openstack.machine' ] │ 1 │ -│ 5 │ 'ansible' │ 'mysql.database' │ [ 'mysql.dbms', 'openstack.machine' ] │ 1 │ -│ 6 │ 'ansible' │ 'mysql.database' │ [ 'mysql.dbms', 'docker.engine' ] │ 1 │ -│ 7 │ 'ansible' │ 'mysql.database' │ [ 'mysql.dbms', 'kubernetes' ] │ 1 │ -│ 8 │ 'ansible' │ 'mysql.database' │ [ 'mysql.dbms', 'gcp.cloudsql' ] │ 1 │ -│ 9 │ 'ansible' │ 'mysql.dbms' │ [ 'openstack.machine' ] │ 1 │ -│ 10 │ 'ansible' │ 'mysql.dbms' │ [ 'docker.engine' ] │ 0.5 │ -│ 11 │ 'ansible' │ 'mysql.dbms' │ [ 'kubernetes' ] │ 0.5 │ -│ 12 │ 'ansible' │ 'mysql.dbms' │ [ 'gcp.cloudsql' ] │ 1 │ -│ 13 │ 'ansible' │ 'ingress' │ [ 'openstack.machine' ] │ 1 │ -│ 14 │ 'ansible' │ 'ingress' │ [ 'kubernetes' ] │ 0.5 │ -│ 15 │ 'ansible' │ 'openstack.machine' │ undefined │ 0.5 │ -│ 16 │ 'ansible' │ 'gcp.service' │ undefined │ 1 │ -│ 17 │ 'terraform' │ 'software.application' │ [ 'software.runtime', 'openstack.machine' ] │ 0 │ -│ 18 │ 'terraform' │ 'software.application' │ [ 'docker.engine' ] │ 0.5 │ -│ 19 │ 'terraform' │ 'software.application' │ [ 'kubernetes' ] │ 0.5 │ -│ 20 │ 'terraform' │ 'software.application' │ [ 'gcp.appengine' ] │ 1 │ -│ 21 │ 'terraform' │ 'software.application' │ [ 'openstack.machine' ] │ 0 │ -│ 22 │ 'terraform' │ 'docker.engine' │ [ 'openstack.machine' ] │ 0 │ -│ 23 │ 'terraform' │ 'mysql.database' │ [ 'mysql.dbms', 'openstack.machine' ] │ 1 │ -│ 24 │ 'terraform' │ 'mysql.database' │ [ 'mysql.dbms', 'docker.engine' ] │ 1 │ -│ 25 │ 'terraform' │ 'mysql.database' │ [ 'mysql.dbms', 'kubernetes' ] │ 1 │ -│ 26 │ 'terraform' │ 'mysql.database' │ [ 'mysql.dbms', 'gcp.cloudsql' ] │ 1 │ -│ 27 │ 'terraform' │ 'mysql.dbms' │ [ 'openstack.machine' ] │ 0 │ -│ 28 │ 'terraform' │ 'mysql.dbms' │ [ 'docker.engine' ] │ 0.5 │ -│ 29 │ 'terraform' │ 'mysql.dbms' │ [ 'kubernetes' ] │ 0.5 │ -│ 30 │ 'terraform' │ 'mysql.dbms' │ [ 'gcp.cloudsql' ] │ 1 │ -│ 31 │ 'terraform' │ 'ingress' │ [ 'openstack.machine' ] │ 0 │ -│ 32 │ 'terraform' │ 'ingress' │ [ 'kubernetes' ] │ 0.5 │ -│ 33 │ 'terraform' │ 'openstack.machine' │ undefined │ 1 │ -│ 34 │ 'terraform' │ 'gcp.service' │ undefined │ 1 │ -│ 35 │ 'kubernetes' │ 'software.application' │ [ 'kubernetes' ] │ 1 │ -│ 36 │ 'kubernetes' │ 'mysql.database' │ [ 'mysql.dbms', 'kubernetes' ] │ 0 │ -│ 37 │ 'kubernetes' │ 'mysql.dbms' │ [ 'kubernetes' ] │ 1 │ -│ 38 │ 'kubernetes' │ 'ingress' │ [ 'kubernetes' ] │ 1 │ -│ 39 │ 'docker' │ 'software.application' │ [ 'docker.engine' ] │ 1 │ -│ 40 │ 'docker' │ 'mysql.database' │ [ 'mysql.dbms', 'docker.engine' ] │ 0 │ -│ 41 │ 'docker' │ 'mysql.dbms' │ [ 'docker.engine' ] │ 1 │ -└─────────┴──────────────┴────────────────────────┴─────────────────────────────────────────────┴─────────┘ - -Metrics relevant when modeling the different scenarios -┌─────────┬────────────────────────────────────────────────────────────────────────────────┬────────┬──────────┬────────────┬────────────────────────┬───────────────┬──────────────┐ -│ (index) │ scenario │ models │ elements │ conditions │ technology_assignments │ lines_of_code │ short │ -├─────────┼────────────────────────────────────────────────────────────────────────────────┼────────┼──────────┼────────────┼────────────────────────┼───────────────┼──────────────┤ -│ 0 │ 'EDMM GCP Variant' │ 1 │ 59 │ 0 │ 14 │ 205 │ │ -│ 1 │ 'EDMM OS Large Variant' │ 1 │ 88 │ 0 │ 18 │ 267 │ │ -│ 2 │ 'EDMM OS Medium Variant' │ 1 │ 88 │ 0 │ 18 │ 267 │ │ -│ 3 │ 'EDMM Total (EDMM GCP Variant, EDMM OS Medium Variant, EDMM OS Large Variant)' │ 3 │ 235 │ 0 │ 50 │ 739 │ 'EDMM Total' │ -│ 4 │ 'VDMM Baseline Default' │ 1 │ 146 │ 16 │ 31 │ 450 │ │ -│ 5 │ 'VDMM+ Default Manual' │ 1 │ 113 │ 31 │ 31 │ 406 │ │ -│ 6 │ 'VDMM+ Default Automated Random' │ 1 │ 113 │ 8 │ 0 │ 344 │ │ -│ 7 │ 'VDMM+ Default Automated Counting' │ 1 │ 113 │ 8 │ 0 │ 345 │ │ -│ 8 │ 'VDMM+ Default Automated Quality' │ 1 │ 113 │ 8 │ 0 │ 341 │ │ -└─────────┴────────────────────────────────────────────────────────────────────────────────┴────────┴──────────┴────────────┴────────────────────────┴───────────────┴──────────────┘ - -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' │ 1 │ [ 0.27, 1 ] │ [ 0.27, 1 ] │ [ 0.27, 1 ] │ 1 │ 1 │ -│ 1 │ 'kubernetes' │ 1 │ [ 0.46, 1 ] │ [ 0.46, 1 ] │ [ 0.54, 0.93 ] │ 1 │ 1 │ -│ 2 │ 'os-large' │ 1 │ [ 0.34, 1 ] │ [ 0.34, 1 ] │ [ 0.42, 0.66 ] │ 1 │ 1 │ -│ 3 │ 'os-medium' │ 1 │ [ 0.34, 1 ] │ [ 0.34, 1 ] │ [ 0.42, 0.66 ] │ 1 │ 1 │ -└─────────┴──────────────┴────────┴─────────────┴─────────────┴────────────────┴─────────┴──────────────────┘ - -Metrics relevant when modeling the maintenance scenario of our case study -┌─────────┬─────────────────────────────────────────────────────────────────────────────────────────────────────────────┬────────┬──────────┬────────────┬────────────────────────┬───────────────┬──────────────────────────┐ -│ (index) │ scenario │ models │ elements │ conditions │ technology_assignments │ lines_of_code │ short │ -├─────────┼─────────────────────────────────────────────────────────────────────────────────────────────────────────────┼────────┼──────────┼────────────┼────────────────────────┼───────────────┼──────────────────────────┤ -│ 0 │ 'EDMM Kubernetes' │ 1 │ 68 │ 0 │ 13 │ 224 │ │ -│ 1 │ 'EDMM Total Maintenance (EDMM GCP Variant, EDMM OS Medium Variant, EDMM OS Large Variant, EDMM Kubernetes)' │ 4 │ 303 │ 0 │ 63 │ 963 │ 'EDMM Total Maintenance' │ -│ 2 │ 'VDMM Baseline Maintenance' │ 1 │ 228 │ 35 │ 46 │ 671 │ │ -│ 3 │ 'VDMM+ Maintenance Manual' │ 1 │ 146 │ 51 │ 46 │ 519 │ │ -│ 4 │ 'VDMM+ Maintenance Automated Random' │ 1 │ 146 │ 13 │ 0 │ 428 │ │ -│ 5 │ 'VDMM+ Maintenance Automated Counting' │ 1 │ 146 │ 13 │ 0 │ 429 │ │ -│ 6 │ 'VDMM+ Maintenance Automated Quality' │ 1 │ 146 │ 13 │ 0 │ 425 │ │ -└─────────┴─────────────────────────────────────────────────────────────────────────────────────────────────────────────┴────────┴──────────┴────────────┴────────────────────────┴───────────────┴──────────────────────────┘ - -From Default to Maintained (Absolut to previous) -┌─────────┬─────────────────────────────────────────────────────────────────────────┬──────────────────────┬────────────────────────┬──────────────────────────┬──────────────────────────────────────┬─────────────────────────────┐ -│ (index) │ scenario │ models_absolute_diff │ elements_absolute_diff │ conditions_absolute_diff │ technology_assignments_absolute_diff │ lines_of_code_absolute_diff │ -├─────────┼─────────────────────────────────────────────────────────────────────────┼──────────────────────┼────────────────────────┼──────────────────────────┼──────────────────────────────────────┼─────────────────────────────┤ -│ 0 │ 'EDMM Total Maintenance - EDMM Total' │ 1 │ 68 │ 0 │ 13 │ 224 │ -│ 1 │ 'VDMM Baseline Maintenance - VDMM Baseline Default' │ 0 │ 82 │ 19 │ 15 │ 221 │ -│ 2 │ 'VDMM+ Maintenance Manual - VDMM+ Default Manual' │ 0 │ 33 │ 20 │ 15 │ 113 │ -│ 3 │ 'VDMM+ Maintenance Automated Quality - VDMM+ Default Automated Quality' │ 0 │ 33 │ 5 │ 0 │ 84 │ -└─────────┴─────────────────────────────────────────────────────────────────────────┴──────────────────────┴────────────────────────┴──────────────────────────┴──────────────────────────────────────┴─────────────────────────────┘ - -From Default to Maintained (Relative to change to baseline) -┌─────────┬─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┬────────────────────────┬──────────────────────────┬──────────────────────────────────────┬─────────────────────────────┐ -│ (index) │ scenario │ elements_relative_diff │ conditions_relative_diff │ technology_assignments_relative_diff │ lines_of_code_relative_diff │ -├─────────┼─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┼────────────────────────┼──────────────────────────┼──────────────────────────────────────┼─────────────────────────────┤ -│ 0 │ '(VDMM+ Maintenance Manual - VDMM+ Default Manual) / (VDMM Baseline Maintenance - VDMM Baseline Default)' │ 0.4 │ 1.05 │ 1 │ 0.51 │ -│ 1 │ '(VDMM+ Maintenance Automated Quality - VDMM+ Default Automated Quality) / (VDMM Baseline Maintenance - VDMM Baseline Default)' │ 0.4 │ 0.26 │ 0 │ 0.38 │ -└─────────┴─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┴────────────────────────┴──────────────────────────┴──────────────────────────────────────┴─────────────────────────────┘ - -> Starting Point: Docker on VM; Diff: payment properties already in default and new analytical component with analytical properties in maintenance -> CURRENTLY SELECTED \ No newline at end of file diff --git a/examples/unfurl-technology---boutique---plus-maintenance-automated/scripts/study-006.txt b/examples/unfurl-technology---boutique---plus-maintenance-automated/scripts/study-006.txt deleted file mode 100644 index 1d00aa1024..0000000000 --- a/examples/unfurl-technology---boutique---plus-maintenance-automated/scripts/study-006.txt +++ /dev/null @@ -1,107 +0,0 @@ - -The technology rules of our case study. Qualities range from bad (0) to good (1). -┌─────────┬──────────────┬────────────────────────┬─────────────────────────────────────────────┬─────────┐ -│ (index) │ Technology │ Component │ Hosting │ Quality │ -├─────────┼──────────────┼────────────────────────┼─────────────────────────────────────────────┼─────────┤ -│ 0 │ 'ansible' │ 'software.application' │ [ 'docker.engine' ] │ 0.5 │ -│ 1 │ 'ansible' │ 'software.application' │ [ 'kubernetes' ] │ 0.5 │ -│ 2 │ 'ansible' │ 'software.application' │ [ 'gcp.appengine' ] │ 0 │ -│ 3 │ 'ansible' │ 'software.application' │ [ 'openstack.machine' ] │ 1 │ -│ 4 │ 'ansible' │ 'docker.engine' │ [ 'openstack.machine' ] │ 1 │ -│ 5 │ 'ansible' │ 'mysql.database' │ [ 'mysql.dbms', 'openstack.machine' ] │ 1 │ -│ 6 │ 'ansible' │ 'mysql.database' │ [ 'mysql.dbms', 'docker.engine' ] │ 1 │ -│ 7 │ 'ansible' │ 'mysql.database' │ [ 'mysql.dbms', 'kubernetes' ] │ 1 │ -│ 8 │ 'ansible' │ 'mysql.database' │ [ 'mysql.dbms', 'gcp.cloudsql' ] │ 1 │ -│ 9 │ 'ansible' │ 'mysql.dbms' │ [ 'openstack.machine' ] │ 1 │ -│ 10 │ 'ansible' │ 'mysql.dbms' │ [ 'docker.engine' ] │ 0.5 │ -│ 11 │ 'ansible' │ 'mysql.dbms' │ [ 'kubernetes' ] │ 0.5 │ -│ 12 │ 'ansible' │ 'mysql.dbms' │ [ 'gcp.cloudsql' ] │ 1 │ -│ 13 │ 'ansible' │ 'ingress' │ [ 'openstack.machine' ] │ 1 │ -│ 14 │ 'ansible' │ 'ingress' │ [ 'kubernetes' ] │ 0.5 │ -│ 15 │ 'ansible' │ 'openstack.machine' │ undefined │ 0.5 │ -│ 16 │ 'ansible' │ 'gcp.service' │ undefined │ 1 │ -│ 17 │ 'terraform' │ 'software.application' │ [ 'software.runtime', 'openstack.machine' ] │ 0 │ -│ 18 │ 'terraform' │ 'software.application' │ [ 'docker.engine' ] │ 0.5 │ -│ 19 │ 'terraform' │ 'software.application' │ [ 'kubernetes' ] │ 0.5 │ -│ 20 │ 'terraform' │ 'software.application' │ [ 'gcp.appengine' ] │ 1 │ -│ 21 │ 'terraform' │ 'software.application' │ [ 'openstack.machine' ] │ 0 │ -│ 22 │ 'terraform' │ 'docker.engine' │ [ 'openstack.machine' ] │ 0 │ -│ 23 │ 'terraform' │ 'mysql.database' │ [ 'mysql.dbms', 'openstack.machine' ] │ 1 │ -│ 24 │ 'terraform' │ 'mysql.database' │ [ 'mysql.dbms', 'docker.engine' ] │ 1 │ -│ 25 │ 'terraform' │ 'mysql.database' │ [ 'mysql.dbms', 'kubernetes' ] │ 1 │ -│ 26 │ 'terraform' │ 'mysql.database' │ [ 'mysql.dbms', 'gcp.cloudsql' ] │ 1 │ -│ 27 │ 'terraform' │ 'mysql.dbms' │ [ 'openstack.machine' ] │ 0 │ -│ 28 │ 'terraform' │ 'mysql.dbms' │ [ 'docker.engine' ] │ 0.5 │ -│ 29 │ 'terraform' │ 'mysql.dbms' │ [ 'kubernetes' ] │ 0.5 │ -│ 30 │ 'terraform' │ 'mysql.dbms' │ [ 'gcp.cloudsql' ] │ 1 │ -│ 31 │ 'terraform' │ 'ingress' │ [ 'openstack.machine' ] │ 0 │ -│ 32 │ 'terraform' │ 'ingress' │ [ 'kubernetes' ] │ 0.5 │ -│ 33 │ 'terraform' │ 'openstack.machine' │ undefined │ 1 │ -│ 34 │ 'terraform' │ 'gcp.service' │ undefined │ 1 │ -│ 35 │ 'kubernetes' │ 'software.application' │ [ 'kubernetes' ] │ 1 │ -│ 36 │ 'kubernetes' │ 'mysql.database' │ [ 'mysql.dbms', 'kubernetes' ] │ 0 │ -│ 37 │ 'kubernetes' │ 'mysql.dbms' │ [ 'kubernetes' ] │ 1 │ -│ 38 │ 'kubernetes' │ 'ingress' │ [ 'kubernetes' ] │ 1 │ -│ 39 │ 'docker' │ 'software.application' │ [ 'docker.engine' ] │ 1 │ -│ 40 │ 'docker' │ 'mysql.database' │ [ 'mysql.dbms', 'docker.engine' ] │ 0 │ -│ 41 │ 'docker' │ 'mysql.dbms' │ [ 'docker.engine' ] │ 1 │ -└─────────┴──────────────┴────────────────────────┴─────────────────────────────────────────────┴─────────┘ - -Metrics relevant when modeling the different scenarios -┌─────────┬────────────────────────────────────────────────────────────────────────────────┬────────┬──────────┬────────────┬────────────────────────┬───────────────┬──────────────┐ -│ (index) │ scenario │ models │ elements │ conditions │ technology_assignments │ lines_of_code │ short │ -├─────────┼────────────────────────────────────────────────────────────────────────────────┼────────┼──────────┼────────────┼────────────────────────┼───────────────┼──────────────┤ -│ 0 │ 'EDMM GCP Variant' │ 1 │ 63 │ 0 │ 14 │ 211 │ │ -│ 1 │ 'EDMM OS Large Variant' │ 1 │ 92 │ 0 │ 18 │ 273 │ │ -│ 2 │ 'EDMM OS Medium Variant' │ 1 │ 92 │ 0 │ 18 │ 273 │ │ -│ 3 │ 'EDMM Total (EDMM GCP Variant, EDMM OS Medium Variant, EDMM OS Large Variant)' │ 3 │ 247 │ 0 │ 50 │ 757 │ 'EDMM Total' │ -│ 4 │ 'VDMM Baseline Default' │ 1 │ 154 │ 16 │ 31 │ 462 │ │ -│ 5 │ 'VDMM+ Default Manual' │ 1 │ 117 │ 31 │ 31 │ 412 │ │ -│ 6 │ 'VDMM+ Default Automated Random' │ 1 │ 117 │ 8 │ 0 │ 350 │ │ -│ 7 │ 'VDMM+ Default Automated Counting' │ 1 │ 117 │ 8 │ 0 │ 351 │ │ -│ 8 │ 'VDMM+ Default Automated Quality' │ 1 │ 117 │ 8 │ 0 │ 347 │ │ -└─────────┴────────────────────────────────────────────────────────────────────────────────┴────────┴──────────┴────────────┴────────────────────────┴───────────────┴──────────────┘ - -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' │ 1 │ [ 0.27, 1 ] │ [ 0.27, 1 ] │ [ 0.27, 1 ] │ 1 │ 1 │ -│ 1 │ 'kubernetes' │ 1 │ [ 0.46, 1 ] │ [ 0.46, 1 ] │ [ 0.54, 0.93 ] │ 1 │ 1 │ -│ 2 │ 'os-large' │ 1 │ [ 0.34, 1 ] │ [ 0.34, 1 ] │ [ 0.42, 0.66 ] │ 1 │ 1 │ -│ 3 │ 'os-medium' │ 1 │ [ 0.34, 1 ] │ [ 0.34, 1 ] │ [ 0.42, 0.66 ] │ 1 │ 1 │ -└─────────┴──────────────┴────────┴─────────────┴─────────────┴────────────────┴─────────┴──────────────────┘ - -Metrics relevant when modeling the maintenance scenario of our case study -┌─────────┬─────────────────────────────────────────────────────────────────────────────────────────────────────────────┬────────┬──────────┬────────────┬────────────────────────┬───────────────┬──────────────────────────┐ -│ (index) │ scenario │ models │ elements │ conditions │ technology_assignments │ lines_of_code │ short │ -├─────────┼─────────────────────────────────────────────────────────────────────────────────────────────────────────────┼────────┼──────────┼────────────┼────────────────────────┼───────────────┼──────────────────────────┤ -│ 0 │ 'EDMM Kubernetes' │ 1 │ 72 │ 0 │ 13 │ 230 │ │ -│ 1 │ 'EDMM Total Maintenance (EDMM GCP Variant, EDMM OS Medium Variant, EDMM OS Large Variant, EDMM Kubernetes)' │ 4 │ 319 │ 0 │ 63 │ 987 │ 'EDMM Total Maintenance' │ -│ 2 │ 'VDMM Baseline Maintenance' │ 1 │ 240 │ 35 │ 46 │ 689 │ │ -│ 3 │ 'VDMM+ Maintenance Manual' │ 1 │ 150 │ 51 │ 46 │ 525 │ │ -│ 4 │ 'VDMM+ Maintenance Automated Random' │ 1 │ 150 │ 13 │ 0 │ 434 │ │ -│ 5 │ 'VDMM+ Maintenance Automated Counting' │ 1 │ 150 │ 13 │ 0 │ 435 │ │ -│ 6 │ 'VDMM+ Maintenance Automated Quality' │ 1 │ 150 │ 13 │ 0 │ 431 │ │ -└─────────┴─────────────────────────────────────────────────────────────────────────────────────────────────────────────┴────────┴──────────┴────────────┴────────────────────────┴───────────────┴──────────────────────────┘ - -From Default to Maintained (Absolut to previous) -┌─────────┬─────────────────────────────────────────────────────────────────────────┬──────────────────────┬────────────────────────┬──────────────────────────┬──────────────────────────────────────┬─────────────────────────────┐ -│ (index) │ scenario │ models_absolute_diff │ elements_absolute_diff │ conditions_absolute_diff │ technology_assignments_absolute_diff │ lines_of_code_absolute_diff │ -├─────────┼─────────────────────────────────────────────────────────────────────────┼──────────────────────┼────────────────────────┼──────────────────────────┼──────────────────────────────────────┼─────────────────────────────┤ -│ 0 │ 'EDMM Total Maintenance - EDMM Total' │ 1 │ 72 │ 0 │ 13 │ 230 │ -│ 1 │ 'VDMM Baseline Maintenance - VDMM Baseline Default' │ 0 │ 86 │ 19 │ 15 │ 227 │ -│ 2 │ 'VDMM+ Maintenance Manual - VDMM+ Default Manual' │ 0 │ 33 │ 20 │ 15 │ 113 │ -│ 3 │ 'VDMM+ Maintenance Automated Quality - VDMM+ Default Automated Quality' │ 0 │ 33 │ 5 │ 0 │ 84 │ -└─────────┴─────────────────────────────────────────────────────────────────────────┴──────────────────────┴────────────────────────┴──────────────────────────┴──────────────────────────────────────┴─────────────────────────────┘ - -From Default to Maintained (Relative to change to baseline) -┌─────────┬─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┬────────────────────────┬──────────────────────────┬──────────────────────────────────────┬─────────────────────────────┐ -│ (index) │ scenario │ elements_relative_diff │ conditions_relative_diff │ technology_assignments_relative_diff │ lines_of_code_relative_diff │ -├─────────┼─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┼────────────────────────┼──────────────────────────┼──────────────────────────────────────┼─────────────────────────────┤ -│ 0 │ '(VDMM+ Maintenance Manual - VDMM+ Default Manual) / (VDMM Baseline Maintenance - VDMM Baseline Default)' │ 0.38 │ 1.05 │ 1 │ 0.5 │ -│ 1 │ '(VDMM+ Maintenance Automated Quality - VDMM+ Default Automated Quality) / (VDMM Baseline Maintenance - VDMM Baseline Default)' │ 0.38 │ 0.26 │ 0 │ 0.37 │ -└─────────┴─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┴────────────────────────┴──────────────────────────┴──────────────────────────────────────┴─────────────────────────────┘ - -> Starting Point: 005; Diff: payment properties also at frontend and checkout -> Comment: little value, configuration should happen automatically due to specialized tosca node types \ No newline at end of file diff --git a/examples/unfurl-technology---boutique---plus-maintenance-automated/scripts/study-007.txt b/examples/unfurl-technology---boutique---plus-maintenance-automated/scripts/study-007.txt deleted file mode 100644 index c9a4a01dcf..0000000000 --- a/examples/unfurl-technology---boutique---plus-maintenance-automated/scripts/study-007.txt +++ /dev/null @@ -1,116 +0,0 @@ - -The technology rules of our case study. Qualities range from bad (0) to good (1). -┌─────────┬──────────────┬────────────────────────┬───────────────────────────────────────┬─────────┬──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ -│ (index) │ Technology │ Component │ Hosting │ Quality │ Comment │ -├─────────┼──────────────┼────────────────────────┼───────────────────────────────────────┼─────────┼──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤ -│ 0 │ 'ansible' │ 'software.application' │ [ 'docker.engine' ] │ 0.5 │ 'Docker is more specialized.' │ -│ 1 │ 'ansible' │ 'software.application' │ [ 'kubernetes' ] │ 0.5 │ 'Kubernetes is more specialized.' │ -│ 2 │ 'ansible' │ 'software.application' │ [ 'gcp.cloudrun' ] │ 0 │ 'Custom module with imperative parts, while Terraform provides a declarative module.' │ -│ 3 │ 'ansible' │ 'software.application' │ [ 'openstack.machine' ] │ 1 │ 'Primary use case due to the specialization of Ansible.' │ -│ 4 │ 'ansible' │ 'docker.engine' │ [ 'openstack.machine' ] │ 1 │ 'Primary use case due to the specialization of Ansible.' │ -│ 5 │ 'ansible' │ 'mysql.database' │ [ 'mysql.dbms', 'openstack.machine' ] │ 1 │ 'Primary use case due to the specialization of Ansible.' │ -│ 6 │ 'ansible' │ 'mysql.database' │ [ 'mysql.dbms', 'docker.engine' ] │ 1 │ 'Primary use case due to the specialization of Ansible.' │ -│ 7 │ 'ansible' │ 'mysql.database' │ [ 'mysql.dbms', 'kubernetes' ] │ 1 │ 'Primary use case due to the specialization of Ansible.' │ -│ 8 │ 'ansible' │ 'mysql.database' │ [ 'mysql.dbms', 'gcp.cloudsql' ] │ 1 │ undefined │ -│ 9 │ 'ansible' │ 'mysql.dbms' │ [ 'openstack.machine' ] │ 1 │ 'Primary use case due to the specialization of Ansible.' │ -│ 10 │ 'ansible' │ 'mysql.dbms' │ [ 'docker.engine' ] │ 0.5 │ 'Docker is more specialized.' │ -│ 11 │ 'ansible' │ 'mysql.dbms' │ [ 'kubernetes' ] │ 0.5 │ 'Kubernetes is more specialized.' │ -│ 12 │ 'ansible' │ 'mysql.dbms' │ [ 'gcp.cloudsql' ] │ 1 │ undefined │ -│ 13 │ 'ansible' │ 'ingress' │ [ 'openstack.machine' ] │ 1 │ 'Primary use case due to the specialization of Ansible.' │ -│ 14 │ 'ansible' │ 'ingress' │ [ 'kubernetes' ] │ 0.5 │ 'Kubernetes is more specialized.' │ -│ 15 │ 'ansible' │ 'openstack.machine' │ undefined │ 0.5 │ 'Terraform is more specialized.' │ -│ 16 │ 'ansible' │ 'gcp.service' │ undefined │ 1 │ undefined │ -│ 17 │ 'terraform' │ 'software.application' │ [ 'docker.engine' ] │ 0.5 │ 'Docker is more specialized.' │ -│ 18 │ 'terraform' │ 'software.application' │ [ 'kubernetes' ] │ 0.5 │ 'Kubernetes is more specialized.' │ -│ 19 │ 'terraform' │ 'software.application' │ [ 'gcp.cloudrun' ] │ 1 │ 'Terraform provides a declarative module.' │ -│ 20 │ 'terraform' │ 'software.application' │ [ 'openstack.machine' ] │ 0 │ 'Ansible is more specialized. Also using Remote-Exec Executor is a "last resort".' │ -│ 21 │ 'terraform' │ 'docker.engine' │ [ 'openstack.machine' ] │ 0 │ 'Ansible is more specialized. Also using Remote-Exec Executor is a "last resort".' │ -│ 22 │ 'terraform' │ 'mysql.database' │ [ 'mysql.dbms', 'openstack.machine' ] │ 1 │ 'Terraform provides a declarative module.' │ -│ 23 │ 'terraform' │ 'mysql.database' │ [ 'mysql.dbms', 'docker.engine' ] │ 1 │ 'Terraform provides a declarative module.' │ -│ 24 │ 'terraform' │ 'mysql.database' │ [ 'mysql.dbms', 'kubernetes' ] │ 1 │ 'Terraform provides a declarative module.' │ -│ 25 │ 'terraform' │ 'mysql.database' │ [ 'mysql.dbms', 'gcp.cloudsql' ] │ 1 │ 'Terraform provides a declarative module.' │ -│ 26 │ 'terraform' │ 'mysql.dbms' │ [ 'openstack.machine' ] │ 0 │ 'Ansible is more specialized. Also using Remote-Exec Executor is a "last resort".' │ -│ 27 │ 'terraform' │ 'mysql.dbms' │ [ 'docker.engine' ] │ 0.5 │ 'Docker is more specialized.' │ -│ 28 │ 'terraform' │ 'mysql.dbms' │ [ 'kubernetes' ] │ 0.5 │ 'Kubernetes is more specialized.' │ -│ 29 │ 'terraform' │ 'mysql.dbms' │ [ 'gcp.cloudsql' ] │ 1 │ 'Terraform provides a declarative module.' │ -│ 30 │ 'terraform' │ 'ingress' │ [ 'openstack.machine' ] │ 0 │ 'Ansible is more specialized. Also using Remote-Exec Executor is a "last resort".' │ -│ 31 │ 'terraform' │ 'ingress' │ [ 'kubernetes' ] │ 0.5 │ 'Kubernetes is more specialized.' │ -│ 32 │ 'terraform' │ 'openstack.machine' │ undefined │ 1 │ 'Terraform provides a declarative module.' │ -│ 33 │ 'terraform' │ 'gcp.service' │ undefined │ 1 │ 'Terraform provides a declarative module.' │ -│ 34 │ 'kubernetes' │ 'software.application' │ [ 'kubernetes' ] │ 1 │ 'Kubernetes is the underlying technology.' │ -│ 35 │ 'kubernetes' │ 'mysql.database' │ [ 'mysql.dbms', 'kubernetes' ] │ 0 │ 'Kubernetes Job with imperative parts, while declarative other technologies provide declarative modules.' │ -│ 36 │ 'kubernetes' │ 'mysql.dbms' │ [ 'kubernetes' ] │ 1 │ 'Kubernetes is the underlying technology.' │ -│ 37 │ 'kubernetes' │ 'ingress' │ [ 'kubernetes' ] │ 1 │ 'Kubernetes is the underlying technology.' │ -│ 38 │ 'docker' │ 'software.application' │ [ 'docker.engine' ] │ 1 │ 'Docker is the underlying technology.' │ -│ 39 │ 'docker' │ 'mysql.database' │ [ 'mysql.dbms', 'docker.engine' ] │ 0 │ 'One-time use docker container ("fake Kubernetes job") with imperative parts, while declarative other technologies provide declarative modules.' │ -│ 40 │ 'docker' │ 'mysql.dbms' │ [ 'docker.engine' ] │ 1 │ 'Docker is the underlying technology.' │ -└─────────┴──────────────┴────────────────────────┴───────────────────────────────────────┴─────────┴──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ - -Metrics relevant when modeling the different scenarios -┌─────────┬────────────────────────────────────────────────────────────────────────────────┬────────┬──────────┬────────────┬────────────────────────┬───────────────┬──────────────┐ -│ (index) │ scenario │ models │ elements │ conditions │ technology_assignments │ lines_of_code │ short │ -├─────────┼────────────────────────────────────────────────────────────────────────────────┼────────┼──────────┼────────────┼────────────────────────┼───────────────┼──────────────┤ -│ 0 │ 'EDMM GCP Variant' │ 1 │ 59 │ 0 │ 14 │ 205 │ │ -│ 1 │ 'EDMM OS Large Variant' │ 1 │ 88 │ 0 │ 18 │ 267 │ │ -│ 2 │ 'EDMM OS Medium Variant' │ 1 │ 88 │ 0 │ 18 │ 267 │ │ -│ 3 │ 'EDMM Total (EDMM GCP Variant, EDMM OS Medium Variant, EDMM OS Large Variant)' │ 3 │ 235 │ 0 │ 50 │ 739 │ 'EDMM Total' │ -│ 4 │ 'VDMM Baseline Original' │ 1 │ 146 │ 16 │ 31 │ 450 │ │ -│ 5 │ 'VDMM+ Original Manual' │ 1 │ 113 │ 31 │ 31 │ 406 │ │ -│ 6 │ 'VDMM+ Original Automated Random' │ 1 │ 113 │ 8 │ 0 │ 344 │ │ -│ 7 │ 'VDMM+ Original Automated Counting' │ 1 │ 113 │ 8 │ 0 │ 345 │ │ -│ 8 │ 'VDMM+ Original Automated Quality' │ 1 │ 113 │ 8 │ 0 │ 341 │ │ -└─────────┴────────────────────────────────────────────────────────────────────────────────┴────────┴──────────┴────────────┴────────────────────────┴───────────────┴──────────────┘ - -Diff when modeling the different original scenarios -┌─────────┬──────────────────────────────────────────────────────────────┬─────────────────┬─────────────────┬───────────────────┬───────────────────┬─────────────────────┬─────────────────────┬─────────────────────────────────┬─────────────────────────────────┬────────────────────────┬────────────────────────┐ -│ (index) │ scenario │ models_abs_diff │ models_rel_diff │ elements_abs_diff │ elements_rel_diff │ conditions_abs_diff │ conditions_rel_diff │ technology_assignments_abs_diff │ technology_assignments_rel_diff │ lines_of_code_abs_diff │ lines_of_code_rel_diff │ -├─────────┼──────────────────────────────────────────────────────────────┼─────────────────┼─────────────────┼───────────────────┼───────────────────┼─────────────────────┼─────────────────────┼─────────────────────────────────┼─────────────────────────────────┼────────────────────────┼────────────────────────┤ -│ 0 │ 'VDMM Baseline Original - EDMM Total' │ -2 │ 0.33 │ -89 │ 0.62 │ 16 │ Infinity │ -19 │ 0.62 │ -289 │ 0.61 │ -│ 1 │ 'VDMM+ Original Manual - VDMM Baseline Original' │ 0 │ 1 │ -33 │ 0.77 │ 15 │ 1.94 │ 0 │ 1 │ -44 │ 0.9 │ -│ 2 │ 'VDMM+ Original Automated Random - VDMM Baseline Original' │ 0 │ 1 │ -33 │ 0.77 │ -8 │ 0.5 │ -31 │ 0 │ -106 │ 0.76 │ -│ 3 │ 'VDMM+ Original Automated Counting - VDMM Baseline Original' │ 0 │ 1 │ -33 │ 0.77 │ -8 │ 0.5 │ -31 │ 0 │ -105 │ 0.77 │ -│ 4 │ 'VDMM+ Original Automated Quality - VDMM Baseline Original' │ 0 │ 1 │ -33 │ 0.77 │ -8 │ 0.5 │ -31 │ 0 │ -109 │ 0.76 │ -└─────────┴──────────────────────────────────────────────────────────────┴─────────────────┴─────────────────┴───────────────────┴───────────────────┴─────────────────────┴─────────────────────┴─────────────────────────────────┴─────────────────────────────────┴────────────────────────┴────────────────────────┘ - -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' │ 1 │ [ 0.27, 1 ] │ [ 0.27, 1 ] │ [ 0.27, 1 ] │ 1 │ 1 │ -│ 1 │ 'kubernetes' │ 1 │ [ 0.46, 1 ] │ [ 0.46, 1 ] │ [ 0.54, 0.93 ] │ 1 │ 1 │ -│ 2 │ 'os-large' │ 1 │ [ 0.34, 1 ] │ [ 0.34, 1 ] │ [ 0.42, 0.66 ] │ 1 │ 1 │ -│ 3 │ 'os-medium' │ 1 │ [ 0.34, 1 ] │ [ 0.34, 1 ] │ [ 0.42, 0.66 ] │ 1 │ 1 │ -└─────────┴──────────────┴────────┴─────────────┴─────────────┴────────────────┴─────────┴──────────────────┘ - -Metrics relevant when modeling the maintenance scenario of our case study -┌─────────┬─────────────────────────────────────────────────────────────────────────────────────────────────────────────┬────────┬──────────┬────────────┬────────────────────────┬───────────────┬──────────────────────────┐ -│ (index) │ scenario │ models │ elements │ conditions │ technology_assignments │ lines_of_code │ short │ -├─────────┼─────────────────────────────────────────────────────────────────────────────────────────────────────────────┼────────┼──────────┼────────────┼────────────────────────┼───────────────┼──────────────────────────┤ -│ 0 │ 'EDMM Kubernetes' │ 1 │ 68 │ 0 │ 13 │ 224 │ │ -│ 1 │ 'EDMM Total Maintenance (EDMM GCP Variant, EDMM OS Medium Variant, EDMM OS Large Variant, EDMM Kubernetes)' │ 4 │ 303 │ 0 │ 63 │ 963 │ 'EDMM Total Maintenance' │ -│ 2 │ 'VDMM Baseline Maintenance' │ 1 │ 228 │ 35 │ 46 │ 671 │ │ -│ 3 │ 'VDMM+ Maintenance Manual' │ 1 │ 146 │ 51 │ 46 │ 519 │ │ -│ 4 │ 'VDMM+ Maintenance Automated Random' │ 1 │ 146 │ 13 │ 0 │ 428 │ │ -│ 5 │ 'VDMM+ Maintenance Automated Counting' │ 1 │ 146 │ 13 │ 0 │ 429 │ │ -│ 6 │ 'VDMM+ Maintenance Automated Quality' │ 1 │ 146 │ 13 │ 0 │ 425 │ │ -└─────────┴─────────────────────────────────────────────────────────────────────────────────────────────────────────────┴────────┴──────────┴────────────┴────────────────────────┴───────────────┴──────────────────────────┘ - -From Original to Maintained (Absolut to previous) (Absolute) -┌─────────┬──────────────────────────────────────────────────────────────────────────┬─────────────────┬───────────────────┬─────────────────────┬─────────────────────────────────┬────────────────────────┐ -│ (index) │ scenario │ models_abs_diff │ elements_abs_diff │ conditions_abs_diff │ technology_assignments_abs_diff │ lines_of_code_abs_diff │ -├─────────┼──────────────────────────────────────────────────────────────────────────┼─────────────────┼───────────────────┼─────────────────────┼─────────────────────────────────┼────────────────────────┤ -│ 0 │ 'EDMM Total Maintenance - EDMM Total' │ 1 │ 68 │ 0 │ 13 │ 224 │ -│ 1 │ 'VDMM Baseline Maintenance - VDMM Baseline Original' │ 0 │ 82 │ 19 │ 15 │ 221 │ -│ 2 │ 'VDMM+ Maintenance Manual - VDMM+ Original Manual' │ 0 │ 33 │ 20 │ 15 │ 113 │ -│ 3 │ 'VDMM+ Maintenance Automated Quality - VDMM+ Original Automated Quality' │ 0 │ 33 │ 5 │ 0 │ 84 │ -└─────────┴──────────────────────────────────────────────────────────────────────────┴─────────────────┴───────────────────┴─────────────────────┴─────────────────────────────────┴────────────────────────┘ - -From Original to Maintained (Relative to change to baseline) -┌─────────┬───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┬───────────────────┬─────────────────────┬─────────────────────────────────┬────────────────────────┐ -│ (index) │ scenario │ 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)' │ 0.4 │ 1.05 │ 1 │ 0.51 │ -│ 1 │ '(VDMM+ Maintenance Automated Quality - VDMM+ Original Automated Quality) / (VDMM Baseline Maintenance - VDMM Baseline Original)' │ 0.4 │ 0.26 │ 0 │ 0.38 │ -└─────────┴───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┴───────────────────┴─────────────────────┴─────────────────────────────────┴────────────────────────┘ - -> 006 but with enriched data diff --git a/examples/unfurl-technology---boutique---plus-maintenance-automated/scripts/study-008.txt b/examples/unfurl-technology---boutique---plus-maintenance-automated/scripts/study-008.txt deleted file mode 100644 index d196d025cd..0000000000 --- a/examples/unfurl-technology---boutique---plus-maintenance-automated/scripts/study-008.txt +++ /dev/null @@ -1,177 +0,0 @@ - -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 │ [] │ 1 │ '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.5 │ '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.5 │ '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 │ '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' ] │ 1 │ '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' ] │ 1 │ '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.5 │ '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 │ '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' ] │ 1 │ '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' ] │ 0.5 │ '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' ] │ 0.5 │ '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' ] │ 0.5 │ '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' ] │ 0.5 │ '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 "kubernetes"' │ 1 │ 151 │ 0 │ 14 │ 355 │ -│ 2 │ 'EDMM "os-medium"' │ 1 │ 181 │ 0 │ 18 │ 421 │ -│ 3 │ 'EDMM "os-large"' │ 1 │ 181 │ 0 │ 18 │ 421 │ -│ 4 │ 'EDMM Total' │ 4 │ 649 │ 0 │ 64 │ 1522 │ -│ 5 │ 'VDMM Baseline Original' │ 1 │ 328 │ 34 │ 32 │ 768 │ -│ 6 │ 'VDMM+ Original Manual' │ 1 │ 210 │ 46 │ 32 │ 588 │ -│ 7 │ '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' │ -3 │ -321 │ 34 │ -32 │ -754 │ -│ 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.25 │ 0.51 │ Infinity │ 0.5 │ 0.5 │ -│ 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' │ 1 │ [ 0.23, 1 ] │ [ 0.23, 1 ] │ [ 0.23, 1 ] │ 1 │ 1 │ -│ 1 │ 'kubernetes' │ 1 │ [ 0.46, 1 ] │ [ 0.46, 1 ] │ [ 0.46, 0.93 ] │ 1 │ 1 │ -│ 2 │ 'os-medium' │ 1 │ [ 0.34, 1 ] │ [ 0.34, 1 ] │ [ 0.39, 0.66 ] │ 1 │ 1 │ -│ 3 │ 'os-large' │ 1 │ [ 0.34, 1 ] │ [ 0.34, 1 ] │ [ 0.39, 0.66 ] │ 1 │ 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? - diff --git a/examples/unfurl-technology---boutique---plus-maintenance-automated/scripts/study-009.txt b/examples/unfurl-technology---boutique---plus-maintenance-automated/scripts/study-009.txt deleted file mode 100644 index ed8cf73c93..0000000000 --- a/examples/unfurl-technology---boutique---plus-maintenance-automated/scripts/study-009.txt +++ /dev/null @@ -1,355 +0,0 @@ - -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' ] │ 0.5 │ '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' ] │ 0.5 │ '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' ] │ 0.5 │ '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' ] │ 0.5 │ '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' │ 1 │ [ 0, 1 ] │ [ 0, 1 ] │ [ 0, 1 ] │ 1 │ 1 │ -│ 1 │ 'kubernetes' │ 1 │ [ 0.46, 1 ] │ [ 0.46, 1 ] │ [ 0.48, 0.93 ] │ 1 │ 1 │ -│ 2 │ 'os-medium' │ 1 │ [ 0.34, 1 ] │ [ 0.34, 1 ] │ [ 0.41, 0.66 ] │ 1 │ 1 │ -│ 3 │ 'os-large' │ 1 │ [ 0.34, 1 ] │ [ 0.34, 1 ] │ [ 0.41, 0.66 ] │ 1 │ 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? - -COMMENT: using proposed qualities after questionnaires -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)' │ [ 'caution (0.46)', 'good (1)' ] │ [ 'caution (0.46)', 'good (1)' ] │ [ 'caution (0.48)', 'good (0.93)' ] │ 'good (1)' │ 'good (1)' │ -│ 2 │ 'os-medium' │ 'good (1)' │ [ 'poor (0.34)', 'good (1)' ] │ [ 'poor (0.34)', 'good (1)' ] │ [ 'caution (0.41)', 'moderate (0.66)' ] │ 'good (1)' │ 'good (1)' │ -│ 3 │ 'os-large' │ 'good (1)' │ [ 'poor (0.34)', 'good (1)' ] │ [ 'poor (0.34)', 'good (1)' ] │ [ 'caution (0.41)', 'moderate (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? - -COMMENT: added labels \ No newline at end of file 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 deleted file mode 100644 index 2b5cf313b8..0000000000 --- a/examples/unfurl-technology---boutique---plus-maintenance-automated/scripts/study-010.txt +++ /dev/null @@ -1,176 +0,0 @@ - -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 deleted file mode 100644 index 2d5d31f664..0000000000 --- a/examples/unfurl-technology---boutique---plus-maintenance-automated/scripts/sutdy-011.txt +++ /dev/null @@ -1,176 +0,0 @@ - -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 deleted file mode 100644 index 7137623f84..0000000000 --- a/examples/unfurl-technology---boutique---plus-maintenance-automated/scripts/sutdy-012.txt +++ /dev/null @@ -1,176 +0,0 @@ - -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 deleted file mode 100644 index fa9491962e..0000000000 --- a/examples/unfurl-technology---boutique---plus-maintenance-automated/scripts/sutdy-013.txt +++ /dev/null @@ -1,178 +0,0 @@ - -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-manual/.gitignore b/examples/unfurl-technology---boutique---plus-maintenance-manual/.gitignore deleted file mode 100644 index 7951405f85..0000000000 --- a/examples/unfurl-technology---boutique---plus-maintenance-manual/.gitignore +++ /dev/null @@ -1 +0,0 @@ -lib \ No newline at end of file diff --git a/examples/unfurl-technology---boutique---plus-maintenance-manual/config.yaml b/examples/unfurl-technology---boutique---plus-maintenance-manual/config.yaml deleted file mode 100644 index d76f5c5ca3..0000000000 --- a/examples/unfurl-technology---boutique---plus-maintenance-manual/config.yaml +++ /dev/null @@ -1,2 +0,0 @@ -dependencies: - - source: ../unfurl-technology---boutique---plus-maintenance-automated/lib diff --git a/examples/unfurl-technology---boutique---plus-maintenance-manual/tests/gcp/test.yaml b/examples/unfurl-technology---boutique---plus-maintenance-manual/tests/gcp/test.yaml deleted file mode 100644 index 8488c1275d..0000000000 --- a/examples/unfurl-technology---boutique---plus-maintenance-manual/tests/gcp/test.yaml +++ /dev/null @@ -1,23 +0,0 @@ -expected: ../../../unfurl-technology---boutique---plus-maintenance-automated/tests/gcp/expected.yaml -inputs: ../../../unfurl-technology---boutique---plus-maintenance-automated/tests/gcp/inputs.yaml -merge: - topology_template: - node_templates: - analytics_component: - type: analytics.component~service.application#docker.image::terraform@gcp.cloudrun - properties: - application_name: analytics - application_port: 7001 - application_protocol: grpc - CHECKOUT_SERVICE_ADDR: {eval: '.::.requirements::[.name=checkout]::.target::application_endpoint'} - RECOMMENDATION_SERVICE_ADDR: {eval: '.::.requirements::[.name=recommendation]::.target::application_endpoint'} - optional_analytical_feature: 'false' - premium_analytical_feature: 'false' - requirements: - - checkout: checkout_component - - recommendation: recommendation_component - - host: gcp_cloudrun - artifacts: - docker_image: - type: docker.image - file: milesstoetzner/opentosca-vintner-boutique-demo:analytics-v10 diff --git a/examples/unfurl-technology---boutique---plus-maintenance-manual/tests/kubernetes/test.yaml b/examples/unfurl-technology---boutique---plus-maintenance-manual/tests/kubernetes/test.yaml deleted file mode 100644 index 62cfc9dcb9..0000000000 --- a/examples/unfurl-technology---boutique---plus-maintenance-manual/tests/kubernetes/test.yaml +++ /dev/null @@ -1,2 +0,0 @@ -expected: ../../../unfurl-technology---boutique---plus-maintenance-automated/tests/kubernetes/expected.yaml -inputs: ../../../unfurl-technology---boutique---plus-maintenance-automated/tests/kubernetes/inputs.yaml diff --git a/examples/unfurl-technology---boutique---plus-maintenance-manual/tests/os-large/test.yaml b/examples/unfurl-technology---boutique---plus-maintenance-manual/tests/os-large/test.yaml deleted file mode 100644 index d4d2856d4a..0000000000 --- a/examples/unfurl-technology---boutique---plus-maintenance-manual/tests/os-large/test.yaml +++ /dev/null @@ -1,24 +0,0 @@ -expected: ../../../unfurl-technology---boutique---plus-maintenance-automated/tests/os-large/expected.yaml -inputs: ../../../unfurl-technology---boutique---plus-maintenance-automated/tests/os-large/inputs.yaml - -merge: - topology_template: - node_templates: - analytics_component: - type: analytics.component~service.application#docker.image::compose@docker.engine->remote.machine - properties: - application_name: analytics - application_port: 7001 - application_protocol: grpc - CHECKOUT_SERVICE_ADDR: {eval: '.::.requirements::[.name=checkout]::.target::application_endpoint'} - RECOMMENDATION_SERVICE_ADDR: {eval: '.::.requirements::[.name=recommendation]::.target::application_endpoint'} - optional_analytical_feature: 'false' - premium_analytical_feature: 'false' - requirements: - - checkout: checkout_component - - recommendation: recommendation_component - - host: docker_engine - artifacts: - docker_image: - type: docker.image - file: milesstoetzner/opentosca-vintner-boutique-demo:analytics-v10 diff --git a/examples/unfurl-technology---boutique---plus-maintenance-manual/tests/os-medium/test.yaml b/examples/unfurl-technology---boutique---plus-maintenance-manual/tests/os-medium/test.yaml deleted file mode 100644 index c16a60eb92..0000000000 --- a/examples/unfurl-technology---boutique---plus-maintenance-manual/tests/os-medium/test.yaml +++ /dev/null @@ -1,24 +0,0 @@ -expected: ../../../unfurl-technology---boutique---plus-maintenance-automated/tests/os-medium/expected.yaml -inputs: ../../../unfurl-technology---boutique---plus-maintenance-automated/tests/os-medium/inputs.yaml - -merge: - topology_template: - node_templates: - analytics_component: - type: analytics.component~service.application#docker.image::compose@docker.engine->remote.machine - properties: - application_name: analytics - application_port: 7001 - application_protocol: grpc - CHECKOUT_SERVICE_ADDR: {eval: '.::.requirements::[.name=checkout]::.target::application_endpoint'} - RECOMMENDATION_SERVICE_ADDR: {eval: '.::.requirements::[.name=recommendation]::.target::application_endpoint'} - optional_analytical_feature: 'false' - premium_analytical_feature: 'false' - requirements: - - checkout: checkout_component - - recommendation: recommendation_component - - host: docker_engine - artifacts: - docker_image: - type: docker.image - file: milesstoetzner/opentosca-vintner-boutique-demo:analytics-v10 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 deleted file mode 100644 index 66dd79d81a..0000000000 --- a/examples/unfurl-technology---boutique---plus-maintenance-manual/variable-service-template.yaml +++ /dev/null @@ -1,699 +0,0 @@ -tosca_definitions_version: tosca_variability_1_0_rc_3 - -imports: - - lib/types.yaml - -topology_template: - inputs: - database_password: - type: string - - dbms_password: - type: string - - os_network: - type: string - - os_ssh_key_name: - type: string - - os_ssh_user: - type: string - - os_ssh_key_file: - type: string - - os_region_name: - type: string - - os_auth_type: - type: string - - os_auth_url: - type: string - - os_identity_api_version: - type: string - - os_interface: - type: string - - os_application_credential_id: - type: string - - os_application_credential_secret: - type: string - - gcp_region: - type: string - - gcp_service_account_file: - type: string - - 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]} - has_optional_analytical_feature: {equal: [{variability_input: optional_analytical_feature}, true]} - has_premium_analytical_feature: {equal: [{variability_input: premium_analytical_feature}, true]} - inputs: - env: - type: string - default: OPENSTACK - - tier: - type: string - default: MEDIUM - - optional_payment_feature: - type: boolean - default: false - - premium_payment_feature: - type: boolean - default: false - - optional_analytical_feature: - type: boolean - default: false - - premium_analytical_feature: - type: boolean - default: false - - node_templates: - ################################################### - # - # Frontend - # - ################################################### - - frontend_component: - type: frontend.component - persistent: true - technology: - - compose: - conditions: {logic_expression: is_openstack} - - kubernetes: - conditions: {logic_expression: is_kubernetes} - - terraform: - conditions: {logic_expression: is_gcp} - properties: - - application_name: frontend - - application_port: 8080 - - application_protocol: http - - disable_profiler: '1' - - CHECKOUT_SERVICE_ADDR: {eval: '.::.requirements::[.name=checkout]::.target::application_endpoint'} - - CURRENCY_SERVICE_ADDR: {eval: '.::.requirements::[.name=currency]::.target::application_endpoint'} - - SHIPPING_SERVICE_ADDR: {eval: '.::.requirements::[.name=shipping]::.target::application_endpoint'} - - CART_SERVICE_ADDR: {eval: '.::.requirements::[.name=cart]::.target::application_endpoint'} - - PRODUCT_CATALOG_SERVICE_ADDR: {eval: '.::.requirements::[.name=product]::.target::application_endpoint'} - - RECOMMENDATION_SERVICE_ADDR: {eval: '.::.requirements::[.name=recommendation]::.target::application_endpoint'} - - AD_SERVICE_ADDR: {eval: '.::.requirements::[.name=advertisement]::.target::application_endpoint'} - - optional_payment_feature: - value: 'true' - conditions: {logic_expression: has_optional_payment_feature} - - optional_payment_feature: - value: 'false' - conditions: {not: {logic_expression: has_optional_payment_feature}} - - premium_payment_feature: - value: 'true' - conditions: {logic_expression: has_premium_payment_feature} - - premium_payment_feature: - value: 'false' - conditions: {not: {logic_expression: has_premium_payment_feature}} - - SHOPPING_ASSISTANT_SERVICE_ADDR: 'required-but-not-used' - requirements: - - checkout: checkout_component - - currency: currency_component - - shipping: shipping_component - - cart: cart_component - - product: product_component - - recommendation: recommendation_component - - advertisement: advertisement_component - - host: docker_engine - - host: kubernetes_cluster - - host: gcp_cloudrun - artifacts: - - docker_image: - type: docker.image - file: milesstoetzner/opentosca-vintner-boutique-demo:frontend-v10 - - frontend_ingress: - type: ingress - technology: - - ansible: - conditions: {logic_expression: is_openstack} - - kubernetes: - conditions: {logic_expression: is_kubernetes} - requirements: - - application: frontend_component - - host: kubernetes_cluster - - host: virtual_machine - - ################################################### - # - # Checkout - # - ################################################### - - checkout_component: - type: checkout.component - technology: - - compose: - conditions: {logic_expression: is_openstack} - - kubernetes: - conditions: {logic_expression: is_kubernetes} - - terraform: - conditions: {logic_expression: is_gcp} - properties: - - application_name: checkout - - application_port: 7003 - - application_protocol: grpc - - disable_profiler: '1' - - PRODUCT_CATALOG_SERVICE_ADDR: {eval: '.::.requirements::[.name=product]::.target::application_endpoint'} - - SHIPPING_SERVICE_ADDR: {eval: '.::.requirements::[.name=shipping]::.target::application_endpoint'} - - PAYMENT_SERVICE_ADDR: {eval: '.::.requirements::[.name=payment]::.target::application_endpoint'} - - EMAIL_SERVICE_ADDR: {eval: '.::.requirements::[.name=email]::.target::application_endpoint'} - - CURRENCY_SERVICE_ADDR: {eval: '.::.requirements::[.name=currency]::.target::application_endpoint'} - - CART_SERVICE_ADDR: {eval: '.::.requirements::[.name=cart]::.target::application_endpoint'} - - optional_payment_feature: - value: 'true' - conditions: {logic_expression: has_optional_payment_feature} - - optional_payment_feature: - value: 'false' - conditions: {not: {logic_expression: has_optional_payment_feature}} - - premium_payment_feature: - value: 'true' - conditions: {logic_expression: has_premium_payment_feature} - - premium_payment_feature: - value: 'false' - conditions: {not: {logic_expression: has_premium_payment_feature}} - requirements: - - email: email_component - - payment: payment_component - - currency: currency_component - - shipping: shipping_component - - cart: cart_component - - product: product_component - - host: docker_engine - - host: kubernetes_cluster - - host: gcp_cloudrun - artifacts: - - docker_image: - type: docker.image - file: milesstoetzner/opentosca-vintner-boutique-demo:checkout-v10 - - ################################################### - # - # Email - # - ################################################### - - email_component: - type: email.component - technology: - - compose: - conditions: {logic_expression: is_openstack} - - kubernetes: - conditions: {logic_expression: is_kubernetes} - - terraform: - conditions: {logic_expression: is_gcp} - properties: - - application_name: email - - application_port: 7005 - - application_protocol: grpc - - disable_profiler: '1' - requirements: - - host: docker_engine - - host: kubernetes_cluster - - host: gcp_cloudrun - artifacts: - - docker_image: - type: docker.image - file: milesstoetzner/opentosca-vintner-boutique-demo:email-v10 - - ################################################### - # - # Payment - # - ################################################### - - payment_component: - type: payment.component - technology: - - compose: - conditions: {logic_expression: is_openstack} - - kubernetes: - conditions: {logic_expression: is_kubernetes} - - terraform: - conditions: {logic_expression: is_gcp} - properties: - - application_name: payment - - application_port: 7006 - - application_protocol: grpc - - disable_profiler: '1' - - optional_payment_feature: - value: 'true' - conditions: {logic_expression: has_optional_payment_feature} - - optional_payment_feature: - value: 'false' - conditions: {not: {logic_expression: has_optional_payment_feature}} - - premium_payment_feature: - value: 'true' - conditions: {logic_expression: has_premium_payment_feature} - - premium_payment_feature: - value: 'false' - conditions: {not: {logic_expression: has_premium_payment_feature}} - requirements: - - host: docker_engine - - host: kubernetes_cluster - - host: gcp_cloudrun - artifacts: - - docker_image: - type: docker.image - file: milesstoetzner/opentosca-vintner-boutique-demo:payment-v10 - - ################################################### - # - # Currency - # - ################################################### - - currency_component: - type: currency.component - technology: - - compose: - conditions: {logic_expression: is_openstack} - - kubernetes: - conditions: {logic_expression: is_kubernetes} - - terraform: - conditions: {logic_expression: is_gcp} - properties: - - application_name: currency - - application_port: 7004 - - application_protocol: grpc - - disable_profiler: '1' - requirements: - - host: docker_engine - - host: kubernetes_cluster - - host: gcp_cloudrun - artifacts: - - docker_image: - type: docker.image - file: milesstoetzner/opentosca-vintner-boutique-demo:currency-v10 - - ################################################### - # - # Shipping - # - ################################################### - - shipping_component: - type: shipping.component - technology: - - compose: - conditions: {logic_expression: is_openstack} - - kubernetes: - conditions: {logic_expression: is_kubernetes} - - terraform: - conditions: {logic_expression: is_gcp} - properties: - - application_name: shipping - - application_port: 7009 - - application_protocol: grpc - - disable_profiler: '1' - requirements: - - host: docker_engine - - host: kubernetes_cluster - - host: gcp_cloudrun - artifacts: - - docker_image: - type: docker.image - file: milesstoetzner/opentosca-vintner-boutique-demo:shipping-v10 - - ################################################### - # - # Cart - # - ################################################### - - cart_component: - type: cart.component - technology: - - compose: - conditions: {logic_expression: is_openstack} - - kubernetes: - conditions: {logic_expression: is_kubernetes} - - terraform: - conditions: {logic_expression: is_gcp} - properties: - - application_name: cart - - application_port: 7070 - - application_protocol: grpc - - disable_profiler: '1' - - mysql_host: {eval: '.::.requirements::[.name=database]::.target::application_address'} - - mysql_port: {eval: '.::.requirements::[.name=database]::.target::application_port'} - - mysql_database: {eval: '.::.requirements::[.name=database]::.target::database_name'} - - mysql_user: {eval: '.::.requirements::[.name=database]::.target::database_user'} - - mysql_password: {eval: '.::.requirements::[.name=database]::.target::database_password'} - - mysql_table: 'cart' - - mysql_ssl_mode: {eval: '.::.requirements::[.name=database]::.target::.requirements::[.name=host]::.target::dbms_ssl_mode'} - requirements: - - database: cart_database - - host: docker_engine - - host: kubernetes_cluster - - host: gcp_cloudrun - artifacts: - - docker_image: - type: docker.image - file: milesstoetzner/opentosca-vintner-boutique-demo:cart-v10 - - cart_database: - type: mysql.database - technology: - - ansible: - conditions: {or: [{logic_expression: is_openstack}, {logic_expression: is_kubernetes}]} - - terraform: - conditions: {logic_expression: is_gcp} - properties: - - database_name: cart - - database_user: cart - - database_password: {get_input: database_password} - requirements: - - host: cart_dbms - - cart_dbms: - type: mysql.dbms - technology: - - compose: - conditions: {logic_expression: is_openstack} - - kubernetes: - conditions: {logic_expression: is_kubernetes} - - terraform: - conditions: {logic_expression: is_gcp} - properties: - - dbms_name: unfurl-technology-boutique-cart-dbms - - dbms_password: {get_input: dbms_password} - requirements: - - host: docker_engine - - host: kubernetes_cluster - - host: gcp_cloudsql - artifacts: - - dbms_image: - type: dbms.image - file: 5.7 - - ################################################### - # - # Product - # - ################################################### - - product_component: - type: product.component - technology: - - compose: - conditions: {logic_expression: is_openstack} - - kubernetes: - conditions: {logic_expression: is_kubernetes} - - terraform: - conditions: {logic_expression: is_gcp} - properties: - - application_name: product - - application_port: 7007 - - application_protocol: grpc - - disable_profiler: '1' - requirements: - - host: docker_engine - - host: kubernetes_cluster - - host: gcp_cloudrun - artifacts: - - docker_image: - type: docker.image - file: milesstoetzner/opentosca-vintner-boutique-demo:product-v10 - - ################################################### - # - # Recommendation - # - ################################################### - - recommendation_component: - type: recommendation.component - technology: - - compose: - conditions: {logic_expression: is_openstack} - - kubernetes: - conditions: {logic_expression: is_kubernetes} - - terraform: - conditions: {logic_expression: is_gcp} - properties: - - application_name: recommendation - - application_port: 7008 - - application_protocol: grpc - - disable_profiler: '1' - - PRODUCT_CATALOG_SERVICE_ADDR: {eval: '.::.requirements::[.name=product]::.target::application_endpoint'} - requirements: - - product: product_component - - host: docker_engine - - host: kubernetes_cluster - - host: gcp_cloudrun - artifacts: - - docker_image: - type: docker.image - file: milesstoetzner/opentosca-vintner-boutique-demo:recommendation-v10 - - ################################################### - # - # Advertisement - # - ################################################### - - advertisement_component: - type: advertisement.component - technology: - - compose: - conditions: {logic_expression: is_openstack} - - kubernetes: - conditions: {logic_expression: is_kubernetes} - - terraform: - conditions: {logic_expression: is_gcp} - properties: - - application_name: advertisement - - application_port: 7000 - - application_protocol: grpc - - disable_profiler: '1' - requirements: - - host: docker_engine - - host: kubernetes_cluster - - host: gcp_cloudrun - artifacts: - - docker_image: - type: docker.image - file: milesstoetzner/opentosca-vintner-boutique-demo:advertisement-v10 - - ################################################### - # - # Analytical - # - ################################################### - - analytics_component: - type: analytics.component - technology: - - compose: - conditions: {logic_expression: is_openstack} - - kubernetes: - conditions: {logic_expression: is_kubernetes} - - terraform: - conditions: {logic_expression: is_gcp} - properties: - - application_name: analytics - - application_port: 7001 - - application_protocol: grpc - - CHECKOUT_SERVICE_ADDR: {eval: '.::.requirements::[.name=checkout]::.target::application_endpoint'} - - RECOMMENDATION_SERVICE_ADDR: {eval: '.::.requirements::[.name=recommendation]::.target::application_endpoint'} - - optional_analytical_feature: - value: 'true' - conditions: {logic_expression: has_optional_analytical_feature} - - optional_analytical_feature: - value: 'false' - conditions: {not: {logic_expression: has_optional_analytical_feature}} - - premium_analytical_feature: - value: 'true' - conditions: {logic_expression: has_premium_analytical_feature} - - premium_analytical_feature: - value: 'false' - conditions: {not: {logic_expression: has_premium_analytical_feature}} - requirements: - - checkout: checkout_component - - recommendation: recommendation_component - - host: docker_engine - - host: kubernetes_cluster - - host: gcp_cloudrun - artifacts: - - docker_image: - type: docker.image - file: milesstoetzner/opentosca-vintner-boutique-demo:analytics-v10 - - ################################################### - # - # Virtual Machine - # - ################################################### - - docker_engine: - type: docker.engine - technology: ansible - requirements: - - host: virtual_machine - - node_agent: - type: node.agent - technology: ansible - properties: - - application_name: node_exporter - - application_port: 9100 - - application_protocol: http - requirements: - - host: virtual_machine - artifacts: - - tar_archive: - type: tar.archive - file: https://github.com/prometheus/node_exporter/releases/download/v1.6.0/node_exporter-1.6.0.linux-amd64.tar.gz - properties: - extra_opts: - - '--strip-components=1' - - promtail_agent: - type: promtail.agent - technology: ansible - properties: - - application_name: promtail - requirements: - - host: virtual_machine - artifacts: - - apt_package: - type: apt.package - file: promtail - properties: - repository: grafana - key: https://apt.grafana.com/gpg.key - source: https://apt.grafana.com stable main - - falco_agent: - type: falco.agent - technology: ansible - properties: - - application_name: falco - requirements: - - host: virtual_machine - artifacts: - - apt_package: - type: apt.package - file: falco - properties: - repository: falco - key: https://falco.org/repo/falcosecurity-packages.asc - source: https://download.falco.org/packages/deb stable main - env: FALCO_FRONTEND=noninteractive - - virtual_machine: - type: virtual.machine - technology: terraform - properties: - - machine_name: unfurl-technology-boutique - - ports: ['80', '9100'] - - flavor: - value: m1.medium - conditions: {equal: [{variability_input: tier}, MEDIUM]} - - flavor: - value: m1.large - conditions: {equal: [{variability_input: tier}, LARGE]} - - network: {get_input: os_network} - - ssh_user: {get_input: os_ssh_user} - - ssh_key_name: {get_input: os_ssh_key_name} - - ssh_key_file: {get_input: os_ssh_key_file} - requirements: - - host: openstack_provider - artifacts: - - machine_image: - type: machine.image - file: Ubuntu 22.04 - - openstack_provider: - type: openstack.provider - conditions: {logic_expression: is_openstack} - properties: - - os_region_name: {get_input: os_region_name} - - os_auth_type: {get_input: os_auth_type} - - os_auth_url: {get_input: os_auth_url} - - os_identity_api_version: {get_input: os_identity_api_version} - - os_interface: {get_input: os_interface} - - os_application_credential_id: {get_input: os_application_credential_id} - - os_application_credential_secret: {get_input: os_application_credential_secret} - - ################################################### - # - # GCP - # - ################################################### - - gcp_cloudrun: - type: gcp.cloudrun - technology: terraform - requirements: - - host: gcp_provider - - gcp_cloudsql: - type: gcp.cloudsql - technology: terraform - requirements: - - host: gcp_provider - - gcp_provider: - type: gcp.provider - conditions: {logic_expression: is_gcp} - properties: - - 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/.gitignore b/examples/unfurl-technology---boutique---plus-original-manual/.gitignore deleted file mode 100644 index 7951405f85..0000000000 --- a/examples/unfurl-technology---boutique---plus-original-manual/.gitignore +++ /dev/null @@ -1 +0,0 @@ -lib \ No newline at end of file diff --git a/examples/unfurl-technology---boutique---plus-original-manual/config.yaml b/examples/unfurl-technology---boutique---plus-original-manual/config.yaml deleted file mode 100644 index d76f5c5ca3..0000000000 --- a/examples/unfurl-technology---boutique---plus-original-manual/config.yaml +++ /dev/null @@ -1,2 +0,0 @@ -dependencies: - - source: ../unfurl-technology---boutique---plus-maintenance-automated/lib diff --git a/examples/unfurl-technology---boutique---plus-original-manual/tests/gcp/test.yaml b/examples/unfurl-technology---boutique---plus-original-manual/tests/gcp/test.yaml deleted file mode 100644 index 49712359e5..0000000000 --- a/examples/unfurl-technology---boutique---plus-original-manual/tests/gcp/test.yaml +++ /dev/null @@ -1,2 +0,0 @@ -expected: ../../../unfurl-technology---boutique---plus-maintenance-automated/tests/gcp/expected.yaml -inputs: ../../../unfurl-technology---boutique---plus-maintenance-automated/tests/gcp/inputs.yaml diff --git a/examples/unfurl-technology---boutique---plus-original-manual/tests/os-large/test.yaml b/examples/unfurl-technology---boutique---plus-original-manual/tests/os-large/test.yaml deleted file mode 100644 index 6960fb63eb..0000000000 --- a/examples/unfurl-technology---boutique---plus-original-manual/tests/os-large/test.yaml +++ /dev/null @@ -1,2 +0,0 @@ -expected: ../../../unfurl-technology---boutique---plus-maintenance-automated/tests/os-large/expected.yaml -inputs: ../../../unfurl-technology---boutique---plus-maintenance-automated/tests/os-large/inputs.yaml diff --git a/examples/unfurl-technology---boutique---plus-original-manual/tests/os-medium/test.yaml b/examples/unfurl-technology---boutique---plus-original-manual/tests/os-medium/test.yaml deleted file mode 100644 index 61e578fd29..0000000000 --- a/examples/unfurl-technology---boutique---plus-original-manual/tests/os-medium/test.yaml +++ /dev/null @@ -1,2 +0,0 @@ -expected: ../../../unfurl-technology---boutique---plus-maintenance-automated/tests/os-medium/expected.yaml -inputs: ../../../unfurl-technology---boutique---plus-maintenance-automated/tests/os-medium/inputs.yaml 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 deleted file mode 100644 index 9e7157c3d6..0000000000 --- a/examples/unfurl-technology---boutique---plus-original-manual/variable-service-template.yaml +++ /dev/null @@ -1,584 +0,0 @@ -tosca_definitions_version: tosca_variability_1_0_rc_3 - -imports: - - lib/types.yaml - -topology_template: - inputs: - database_password: - type: string - - dbms_password: - type: string - - os_network: - type: string - - os_ssh_key_name: - type: string - - os_ssh_user: - type: string - - os_ssh_key_file: - type: string - - os_region_name: - type: string - - os_auth_type: - type: string - - os_auth_url: - type: string - - os_identity_api_version: - type: string - - os_interface: - type: string - - os_application_credential_id: - type: string - - os_application_credential_secret: - type: string - - gcp_region: - type: string - - gcp_service_account_file: - type: string - - gcp_project: - type: string - - variability: - expressions: - is_gcp: {equal: [{variability_input: env}, GCP]} - 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]} - has_optional_analytical_feature: {equal: [{variability_input: optional_analytical_feature}, true]} - has_premium_analytical_feature: {equal: [{variability_input: premium_analytical_feature}, true]} - inputs: - env: - type: string - default: OPENSTACK - - tier: - type: string - default: MEDIUM - - optional_payment_feature: - type: boolean - default: false - - premium_payment_feature: - type: boolean - default: false - - optional_analytical_feature: - type: boolean - default: false - - premium_analytical_feature: - type: boolean - default: false - - node_templates: - ################################################### - # - # Frontend - # - ################################################### - - frontend_component: - type: frontend.component - persistent: true - technology: - - compose: - conditions: {logic_expression: is_openstack} - - terraform: - conditions: {logic_expression: is_gcp} - properties: - - application_name: frontend - - application_port: 8080 - - application_protocol: http - - disable_profiler: '1' - - CHECKOUT_SERVICE_ADDR: {eval: '.::.requirements::[.name=checkout]::.target::application_endpoint'} - - CURRENCY_SERVICE_ADDR: {eval: '.::.requirements::[.name=currency]::.target::application_endpoint'} - - SHIPPING_SERVICE_ADDR: {eval: '.::.requirements::[.name=shipping]::.target::application_endpoint'} - - CART_SERVICE_ADDR: {eval: '.::.requirements::[.name=cart]::.target::application_endpoint'} - - PRODUCT_CATALOG_SERVICE_ADDR: {eval: '.::.requirements::[.name=product]::.target::application_endpoint'} - - RECOMMENDATION_SERVICE_ADDR: {eval: '.::.requirements::[.name=recommendation]::.target::application_endpoint'} - - AD_SERVICE_ADDR: {eval: '.::.requirements::[.name=advertisement]::.target::application_endpoint'} - - optional_payment_feature: - value: 'true' - conditions: {logic_expression: has_optional_payment_feature} - - optional_payment_feature: - value: 'false' - conditions: {not: {logic_expression: has_optional_payment_feature}} - - premium_payment_feature: - value: 'true' - conditions: {logic_expression: has_premium_payment_feature} - - premium_payment_feature: - value: 'false' - conditions: {not: {logic_expression: has_premium_payment_feature}} - - SHOPPING_ASSISTANT_SERVICE_ADDR: 'required-but-not-used' - requirements: - - checkout: checkout_component - - currency: currency_component - - shipping: shipping_component - - cart: cart_component - - product: product_component - - recommendation: recommendation_component - - advertisement: advertisement_component - - host: docker_engine - - host: gcp_cloudrun - artifacts: - - docker_image: - type: docker.image - file: milesstoetzner/opentosca-vintner-boutique-demo:frontend-v10 - - frontend_ingress: - type: ingress - technology: ansible - requirements: - - application: frontend_component - - host: virtual_machine - - ################################################### - # - # Checkout - # - ################################################### - - checkout_component: - type: checkout.component - technology: - - compose: - conditions: {logic_expression: is_openstack} - - terraform: - conditions: {logic_expression: is_gcp} - properties: - - application_name: checkout - - application_port: 7003 - - application_protocol: grpc - - disable_profiler: '1' - - PRODUCT_CATALOG_SERVICE_ADDR: {eval: '.::.requirements::[.name=product]::.target::application_endpoint'} - - SHIPPING_SERVICE_ADDR: {eval: '.::.requirements::[.name=shipping]::.target::application_endpoint'} - - PAYMENT_SERVICE_ADDR: {eval: '.::.requirements::[.name=payment]::.target::application_endpoint'} - - EMAIL_SERVICE_ADDR: {eval: '.::.requirements::[.name=email]::.target::application_endpoint'} - - CURRENCY_SERVICE_ADDR: {eval: '.::.requirements::[.name=currency]::.target::application_endpoint'} - - CART_SERVICE_ADDR: {eval: '.::.requirements::[.name=cart]::.target::application_endpoint'} - - optional_payment_feature: - value: 'true' - conditions: {logic_expression: has_optional_payment_feature} - - optional_payment_feature: - value: 'false' - conditions: {not: {logic_expression: has_optional_payment_feature}} - - premium_payment_feature: - value: 'true' - conditions: {logic_expression: has_premium_payment_feature} - - premium_payment_feature: - value: 'false' - conditions: {not: {logic_expression: has_premium_payment_feature}} - requirements: - - email: email_component - - payment: payment_component - - currency: currency_component - - shipping: shipping_component - - cart: cart_component - - product: product_component - - host: docker_engine - - host: gcp_cloudrun - artifacts: - - docker_image: - type: docker.image - file: milesstoetzner/opentosca-vintner-boutique-demo:checkout-v10 - - ################################################### - # - # Email - # - ################################################### - - email_component: - type: email.component - technology: - - compose: - conditions: {logic_expression: is_openstack} - - terraform: - conditions: {logic_expression: is_gcp} - properties: - - application_name: email - - application_port: 7005 - - application_protocol: grpc - - disable_profiler: '1' - requirements: - - host: docker_engine - - host: gcp_cloudrun - artifacts: - - docker_image: - type: docker.image - file: milesstoetzner/opentosca-vintner-boutique-demo:email-v10 - - ################################################### - # - # Payment - # - ################################################### - - payment_component: - type: payment.component - technology: - - compose: - conditions: {logic_expression: is_openstack} - - terraform: - conditions: {logic_expression: is_gcp} - properties: - - application_name: payment - - application_port: 7006 - - application_protocol: grpc - - disable_profiler: '1' - - optional_payment_feature: - value: 'true' - conditions: {logic_expression: has_optional_payment_feature} - - optional_payment_feature: - value: 'false' - conditions: {not: {logic_expression: has_optional_payment_feature}} - - premium_payment_feature: - value: 'true' - conditions: {logic_expression: has_premium_payment_feature} - - premium_payment_feature: - value: 'false' - conditions: {not: {logic_expression: has_premium_payment_feature}} - requirements: - - host: docker_engine - - host: gcp_cloudrun - artifacts: - - docker_image: - type: docker.image - file: milesstoetzner/opentosca-vintner-boutique-demo:payment-v10 - - ################################################### - # - # Currency - # - ################################################### - - currency_component: - type: currency.component - technology: - - compose: - conditions: {logic_expression: is_openstack} - - terraform: - conditions: {logic_expression: is_gcp} - properties: - - application_name: currency - - application_port: 7004 - - application_protocol: grpc - - disable_profiler: '1' - requirements: - - host: docker_engine - - host: gcp_cloudrun - artifacts: - - docker_image: - type: docker.image - file: milesstoetzner/opentosca-vintner-boutique-demo:currency-v10 - - ################################################### - # - # Shipping - # - ################################################### - - shipping_component: - type: shipping.component - technology: - - compose: - conditions: {logic_expression: is_openstack} - - terraform: - conditions: {logic_expression: is_gcp} - properties: - - application_name: shipping - - application_port: 7009 - - application_protocol: grpc - - disable_profiler: '1' - requirements: - - host: docker_engine - - host: gcp_cloudrun - artifacts: - - docker_image: - type: docker.image - file: milesstoetzner/opentosca-vintner-boutique-demo:shipping-v10 - - ################################################### - # - # Cart - # - ################################################### - - cart_component: - type: cart.component - technology: - - compose: - conditions: {logic_expression: is_openstack} - - terraform: - conditions: {logic_expression: is_gcp} - properties: - - application_name: cart - - application_port: 7070 - - application_protocol: grpc - - disable_profiler: '1' - - mysql_host: {eval: '.::.requirements::[.name=database]::.target::application_address'} - - mysql_port: {eval: '.::.requirements::[.name=database]::.target::application_port'} - - mysql_database: {eval: '.::.requirements::[.name=database]::.target::database_name'} - - mysql_user: {eval: '.::.requirements::[.name=database]::.target::database_user'} - - mysql_password: {eval: '.::.requirements::[.name=database]::.target::database_password'} - - mysql_table: 'cart' - - mysql_ssl_mode: {eval: '.::.requirements::[.name=database]::.target::.requirements::[.name=host]::.target::dbms_ssl_mode'} - requirements: - - database: cart_database - - host: docker_engine - - host: gcp_cloudrun - artifacts: - - docker_image: - type: docker.image - file: milesstoetzner/opentosca-vintner-boutique-demo:cart-v10 - - cart_database: - type: mysql.database - technology: - - ansible: - conditions: {logic_expression: is_openstack} - - terraform: - conditions: {logic_expression: is_gcp} - properties: - - database_name: cart - - database_user: cart - - database_password: {get_input: database_password} - requirements: - - host: cart_dbms - - cart_dbms: - type: mysql.dbms - technology: - - compose: - conditions: {logic_expression: is_openstack} - - terraform: - conditions: {logic_expression: is_gcp} - properties: - - dbms_name: unfurl-technology-boutique-cart-dbms - - dbms_password: {get_input: dbms_password} - requirements: - - host: docker_engine - - host: gcp_cloudsql - artifacts: - - dbms_image: - type: dbms.image - file: 5.7 - - ################################################### - # - # Product - # - ################################################### - - product_component: - type: product.component - technology: - - compose: - conditions: {logic_expression: is_openstack} - - terraform: - conditions: {logic_expression: is_gcp} - properties: - - application_name: product - - application_port: 7007 - - application_protocol: grpc - - disable_profiler: '1' - requirements: - - host: docker_engine - - host: gcp_cloudrun - artifacts: - - docker_image: - type: docker.image - file: milesstoetzner/opentosca-vintner-boutique-demo:product-v10 - - ################################################### - # - # Recommendation - # - ################################################### - - recommendation_component: - type: recommendation.component - technology: - - compose: - conditions: {logic_expression: is_openstack} - - terraform: - conditions: {logic_expression: is_gcp} - properties: - - application_name: recommendation - - application_port: 7008 - - application_protocol: grpc - - disable_profiler: '1' - - PRODUCT_CATALOG_SERVICE_ADDR: {eval: '.::.requirements::[.name=product]::.target::application_endpoint'} - requirements: - - product: product_component - - host: docker_engine - - host: gcp_cloudrun - artifacts: - - docker_image: - type: docker.image - file: milesstoetzner/opentosca-vintner-boutique-demo:recommendation-v10 - - ################################################### - # - # Advertisement - # - ################################################### - - advertisement_component: - type: advertisement.component - technology: - - compose: - conditions: {logic_expression: is_openstack} - - terraform: - conditions: {logic_expression: is_gcp} - properties: - - application_name: advertisement - - application_port: 7000 - - application_protocol: grpc - - disable_profiler: '1' - requirements: - - host: docker_engine - - host: gcp_cloudrun - artifacts: - - docker_image: - type: docker.image - file: milesstoetzner/opentosca-vintner-boutique-demo:advertisement-v10 - - ################################################### - # - # Virtual Machine - # - ################################################### - - docker_engine: - type: docker.engine - technology: ansible - requirements: - - host: virtual_machine - - node_agent: - type: node.agent - technology: ansible - properties: - - application_name: node_exporter - - application_port: 9100 - - application_protocol: http - requirements: - - host: virtual_machine - artifacts: - - tar_archive: - type: tar.archive - file: https://github.com/prometheus/node_exporter/releases/download/v1.6.0/node_exporter-1.6.0.linux-amd64.tar.gz - properties: - extra_opts: - - '--strip-components=1' - - promtail_agent: - type: promtail.agent - technology: ansible - properties: - - application_name: promtail - requirements: - - host: virtual_machine - artifacts: - - apt_package: - type: apt.package - file: promtail - properties: - repository: grafana - key: https://apt.grafana.com/gpg.key - source: https://apt.grafana.com stable main - - falco_agent: - type: falco.agent - technology: ansible - properties: - - application_name: falco - requirements: - - host: virtual_machine - artifacts: - - apt_package: - type: apt.package - file: falco - properties: - repository: falco - key: https://falco.org/repo/falcosecurity-packages.asc - source: https://download.falco.org/packages/deb stable main - env: FALCO_FRONTEND=noninteractive - - virtual_machine: - type: virtual.machine - technology: terraform - properties: - - machine_name: unfurl-technology-boutique - - ports: ['80', '9100'] - - flavor: - value: m1.medium - conditions: {equal: [{variability_input: tier}, MEDIUM]} - - flavor: - value: m1.large - conditions: {equal: [{variability_input: tier}, LARGE]} - - network: {get_input: os_network} - - ssh_user: {get_input: os_ssh_user} - - ssh_key_name: {get_input: os_ssh_key_name} - - ssh_key_file: {get_input: os_ssh_key_file} - requirements: - - host: openstack_provider - artifacts: - - machine_image: - type: machine.image - file: Ubuntu 22.04 - - openstack_provider: - type: openstack.provider - conditions: {logic_expression: is_openstack} - properties: - - os_region_name: {get_input: os_region_name} - - os_auth_type: {get_input: os_auth_type} - - os_auth_url: {get_input: os_auth_url} - - os_identity_api_version: {get_input: os_identity_api_version} - - os_interface: {get_input: os_interface} - - os_application_credential_id: {get_input: os_application_credential_id} - - os_application_credential_secret: {get_input: os_application_credential_secret} - - ################################################### - # - # GCP - # - ################################################### - - gcp_cloudrun: - type: gcp.cloudrun - technology: terraform - requirements: - - host: gcp_provider - - gcp_cloudsql: - type: gcp.cloudsql - technology: terraform - requirements: - - host: gcp_provider - - gcp_provider: - type: gcp.provider - conditions: {logic_expression: is_gcp} - properties: - - gcp_region: {get_input: gcp_region} - - gcp_service_account_file: {get_input: gcp_service_account_file} - - gcp_project: {get_input: gcp_project} diff --git a/examples/unfurl-technology---industry---plus-maintenance-automated/scripts/study-001.txt b/examples/unfurl-technology---industry---plus-maintenance-automated/scripts/study-001.txt deleted file mode 100644 index 0af828b284..0000000000 --- a/examples/unfurl-technology---industry---plus-maintenance-automated/scripts/study-001.txt +++ /dev/null @@ -1,175 +0,0 @@ - -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 │ [] │ 1 │ '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.5 │ '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.5 │ '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 │ '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' ] │ 1 │ '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' ] │ 1 │ '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.5 │ '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 │ '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' ] │ 1 │ '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' ] │ 0.5 │ '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' ] │ 0.5 │ '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' ] │ 0.5 │ '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' ] │ 0.5 │ '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 │ 407 │ 0 │ 39 │ 851 │ -│ 1 │ 'EDMM "development"' │ 1 │ 427 │ 0 │ 41 │ 894 │ -│ 2 │ 'EDMM "local"' │ 1 │ 384 │ 0 │ 35 │ 800 │ -│ 3 │ 'EDMM Total' │ 3 │ 1218 │ 0 │ 115 │ 2545 │ -│ 4 │ 'VDMM Baseline Original' │ 1 │ 863 │ 145 │ 69 │ 2061 │ -│ 5 │ 'VDMM+ Original Manual' │ 1 │ 524 │ 117 │ 69 │ 1408 │ -│ 6 │ 'VDMM+ Original Automated' │ 1 │ 524 │ 63 │ 0 │ 1257 │ -└─────────┴────────────────────────────┴────────┴──────────┴────────────┴────────────────────────┴───────────────┘ - -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 │ -355 │ 145 │ -46 │ -484 │ -│ 1 │ 'VDMM+ Original Manual - VDMM Baseline Original' │ 0 │ -339 │ -28 │ 0 │ -653 │ -│ 2 │ 'VDMM+ Original Automated - VDMM Baseline Original' │ 0 │ -339 │ -82 │ -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.81 │ 1 │ 0.68 │ -│ 2 │ 'VDMM+ Original Automated / VDMM Baseline Original' │ 1 │ 0.61 │ 0.43 │ 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' │ 1 │ [ 0.35, 1 ] │ [ 0.35, 1 ] │ [ 0.35, 0.69 ] │ 1 │ 1 │ -│ 1 │ 'development' │ 1 │ [ 0.28, 1 ] │ [ 0.28, 1 ] │ [ 0.44, 0.72 ] │ 1 │ 1 │ -│ 2 │ 'local' │ 1 │ [ 0.31, 1 ] │ [ 0.31, 1 ] │ [ 0.66, 0.69 ] │ 1 │ 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 │ 986 │ 200 │ 90 │ 2433 │ -│ 1 │ 'VDMM+ Maintenance Manual' │ 1 │ 550 │ 152 │ 90 │ 1538 │ -│ 2 │ 'VDMM+ Maintenance Automated' │ 1 │ 550 │ 68 │ 0 │ 1323 │ -└─────────┴───────────────────────────────┴────────┴──────────┴────────────┴────────────────────────┴───────────────┘ - -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 │ 55 │ 21 │ 372 │ -│ 1 │ 'VDMM+ Maintenance Manual - VDMM+ Original Manual' │ 0 │ 26 │ 35 │ 21 │ 130 │ -│ 2 │ 'VDMM+ Maintenance Automated - VDMM+ Original Automated' │ 0 │ 26 │ 5 │ 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.09 │ 0 │ 0.18 │ -└─────────┴───────────────────────────────────────────────────────────────────────────────────────────────────────────────────┴─────────────────┴───────────────────┴─────────────────────┴─────────────────────────────────┴────────────────────────┘ - -CAUTION: Is this case study running with the latest implementation? - diff --git a/examples/unfurl-technology---industry---plus-maintenance-automated/scripts/study-002.txt b/examples/unfurl-technology---industry---plus-maintenance-automated/scripts/study-002.txt deleted file mode 100644 index 28822e5e18..0000000000 --- a/examples/unfurl-technology---industry---plus-maintenance-automated/scripts/study-002.txt +++ /dev/null @@ -1,175 +0,0 @@ - -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 │ [] │ 1 │ '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.5 │ '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.5 │ '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 │ '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' ] │ 1 │ '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' ] │ 1 │ '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.5 │ '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 │ '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' ] │ 1 │ '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' ] │ 0.5 │ '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' ] │ 0.5 │ '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' ] │ 0.5 │ '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' ] │ 0.5 │ '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 │ 407 │ 0 │ 39 │ 851 │ -│ 1 │ 'EDMM "development"' │ 1 │ 427 │ 0 │ 41 │ 894 │ -│ 2 │ 'EDMM "local"' │ 1 │ 384 │ 0 │ 35 │ 800 │ -│ 3 │ 'EDMM Total' │ 3 │ 1218 │ 0 │ 115 │ 2545 │ -│ 4 │ 'VDMM Baseline Original' │ 1 │ 863 │ 163 │ 69 │ 2061 │ -│ 5 │ 'VDMM+ Original Manual' │ 1 │ 524 │ 135 │ 69 │ 1408 │ -│ 6 │ 'VDMM+ Original Automated' │ 1 │ 524 │ 79 │ 0 │ 1257 │ -└─────────┴────────────────────────────┴────────┴──────────┴────────────┴────────────────────────┴───────────────┘ - -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 │ -355 │ 163 │ -46 │ -484 │ -│ 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' │ 1 │ [ 0.35, 1 ] │ [ 0.35, 1 ] │ [ 0.35, 0.69 ] │ 1 │ 1 │ -│ 1 │ 'development' │ 1 │ [ 0.28, 1 ] │ [ 0.28, 1 ] │ [ 0.44, 0.72 ] │ 1 │ 1 │ -│ 2 │ 'local' │ 1 │ [ 0.31, 1 ] │ [ 0.31, 1 ] │ [ 0.66, 0.69 ] │ 1 │ 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 │ 986 │ 224 │ 90 │ 2433 │ -│ 1 │ 'VDMM+ Maintenance Manual' │ 1 │ 550 │ 174 │ 90 │ 1538 │ -│ 2 │ 'VDMM+ Maintenance Automated' │ 1 │ 550 │ 85 │ 0 │ 1323 │ -└─────────┴───────────────────────────────┴────────┴──────────┴────────────┴────────────────────────┴───────────────┘ - -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? - diff --git a/examples/unfurl-technology---industry---plus-maintenance-automated/scripts/study-003.txt b/examples/unfurl-technology---industry---plus-maintenance-automated/scripts/study-003.txt deleted file mode 100644 index 8f64b62a3c..0000000000 --- a/examples/unfurl-technology---industry---plus-maintenance-automated/scripts/study-003.txt +++ /dev/null @@ -1,176 +0,0 @@ - -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' ] │ 0.5 │ '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' ] │ 0.5 │ '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' ] │ 0.5 │ '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' ] │ 0.5 │ '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 │ 650 │ 242 │ 39 │ 854 │ -│ 1 │ 'EDMM "development"' │ 1 │ 680 │ 252 │ 41 │ 897 │ -│ 2 │ 'EDMM "local"' │ 1 │ 623 │ 238 │ 35 │ 803 │ -│ 3 │ 'EDMM Total' │ 3 │ 1953 │ 732 │ 115 │ 2554 │ -│ 4 │ 'VDMM Baseline Original' │ 1 │ 1330 │ 629 │ 69 │ 2064 │ -│ 5 │ 'VDMM+ Original Manual' │ 1 │ 785 │ 395 │ 69 │ 1411 │ -│ 6 │ 'VDMM+ Original Automated' │ 1 │ 785 │ 339 │ 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 │ -623 │ -103 │ -46 │ -490 │ -│ 1 │ 'VDMM+ Original Manual - VDMM Baseline Original' │ 0 │ -545 │ -234 │ 0 │ -653 │ -│ 2 │ 'VDMM+ Original Automated - VDMM Baseline Original' │ 0 │ -545 │ -290 │ -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.68 │ 0.86 │ 0.6 │ 0.81 │ -│ 1 │ 'VDMM+ Original Manual / VDMM Baseline Original' │ 1 │ 0.59 │ 0.63 │ 1 │ 0.68 │ -│ 2 │ 'VDMM+ Original Automated / VDMM Baseline Original' │ 1 │ 0.59 │ 0.54 │ 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' │ 1 │ [ 0.35, 1 ] │ [ 0.35, 1 ] │ [ 0.42, 0.69 ] │ 1 │ 1 │ -│ 1 │ 'development' │ 1 │ [ 0.28, 1 ] │ [ 0.28, 1 ] │ [ 0.51, 0.72 ] │ 1 │ 1 │ -│ 2 │ 'local' │ 1 │ [ 0.31, 1 ] │ [ 0.31, 1 ] │ [ 0.66, 0.69 ] │ 1 │ 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 │ 1500 │ 737 │ 90 │ 2436 │ -│ 1 │ 'VDMM+ Maintenance Manual' │ 1 │ 814 │ 437 │ 90 │ 1541 │ -│ 2 │ 'VDMM+ Maintenance Automated' │ 1 │ 814 │ 348 │ 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 │ 170 │ 108 │ 21 │ 372 │ -│ 1 │ 'VDMM+ Maintenance Manual - VDMM+ Original Manual' │ 0 │ 29 │ 42 │ 21 │ 130 │ -│ 2 │ 'VDMM+ Maintenance Automated - VDMM+ Original Automated' │ 0 │ 29 │ 9 │ 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.17 │ 0.39 │ 1 │ 0.35 │ -│ 1 │ '(VDMM+ Maintenance Automated - VDMM+ Original Automated) / (VDMM Baseline Maintenance - VDMM Baseline Original)' │ 1 │ 0.17 │ 0.08 │ 0 │ 0.18 │ -└─────────┴───────────────────────────────────────────────────────────────────────────────────────────────────────────────────┴─────────────────┴───────────────────┴─────────────────────┴─────────────────────────────────┴────────────────────────┘ - -CAUTION: Is this case study running with the latest implementation? - -COMMENT: using proposed qualities after questionnaires \ No newline at end of file diff --git a/examples/unfurl-technology---industry---plus-maintenance-automated/scripts/study-004.txt b/examples/unfurl-technology---industry---plus-maintenance-automated/scripts/study-004.txt deleted file mode 100644 index 750d5b4351..0000000000 --- a/examples/unfurl-technology---industry---plus-maintenance-automated/scripts/study-004.txt +++ /dev/null @@ -1,176 +0,0 @@ - -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 │ 650 │ 242 │ 39 │ 854 │ -│ 1 │ 'EDMM "development"' │ 1 │ 680 │ 252 │ 41 │ 897 │ -│ 2 │ 'EDMM "local"' │ 1 │ 623 │ 238 │ 35 │ 803 │ -│ 3 │ 'EDMM Total' │ 3 │ 1953 │ 732 │ 115 │ 2554 │ -│ 4 │ 'VDMM Baseline Original' │ 1 │ 1330 │ 629 │ 69 │ 2064 │ -│ 5 │ 'VDMM+ Original Manual' │ 1 │ 785 │ 395 │ 69 │ 1411 │ -│ 6 │ 'VDMM+ Original Automated' │ 1 │ 785 │ 339 │ 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 │ -623 │ -103 │ -46 │ -490 │ -│ 1 │ 'VDMM+ Original Manual - VDMM Baseline Original' │ 0 │ -545 │ -234 │ 0 │ -653 │ -│ 2 │ 'VDMM+ Original Automated - VDMM Baseline Original' │ 0 │ -545 │ -290 │ -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.68 │ 0.86 │ 0.6 │ 0.81 │ -│ 1 │ 'VDMM+ Original Manual / VDMM Baseline Original' │ 1 │ 0.59 │ 0.63 │ 1 │ 0.68 │ -│ 2 │ 'VDMM+ Original Automated / VDMM Baseline Original' │ 1 │ 0.59 │ 0.54 │ 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)' ] │ [ 'caution (0.42)', 'moderate (0.69)' ] │ 'good (1)' │ 'good (1)' │ -│ 1 │ 'development' │ 'good (1)' │ [ 'poor (0.28)', 'good (1)' ] │ [ 'poor (0.28)', 'good (1)' ] │ [ 'caution (0.51)', 'moderate (0.72)' ] │ 'good (1)' │ 'good (1)' │ -│ 2 │ 'local' │ 'good (1)' │ [ 'poor (0.31)', 'good (1)' ] │ [ 'poor (0.31)', 'good (1)' ] │ [ 'moderate (0.66)', 'moderate (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 │ 1500 │ 737 │ 90 │ 2436 │ -│ 1 │ 'VDMM+ Maintenance Manual' │ 1 │ 814 │ 437 │ 90 │ 1541 │ -│ 2 │ 'VDMM+ Maintenance Automated' │ 1 │ 814 │ 348 │ 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 │ 170 │ 108 │ 21 │ 372 │ -│ 1 │ 'VDMM+ Maintenance Manual - VDMM+ Original Manual' │ 0 │ 29 │ 42 │ 21 │ 130 │ -│ 2 │ 'VDMM+ Maintenance Automated - VDMM+ Original Automated' │ 0 │ 29 │ 9 │ 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.17 │ 0.39 │ 1 │ 0.35 │ -│ 1 │ '(VDMM+ Maintenance Automated - VDMM+ Original Automated) / (VDMM Baseline Maintenance - VDMM Baseline Original)' │ 1 │ 0.17 │ 0.08 │ 0 │ 0.18 │ -└─────────┴───────────────────────────────────────────────────────────────────────────────────────────────────────────────────┴─────────────────┴───────────────────┴─────────────────────┴─────────────────────────────────┴────────────────────────┘ - -CAUTION: Is this case study running with the latest implementation? - -COMMENT: added labels 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 deleted file mode 100644 index d2f290ac7b..0000000000 --- a/examples/unfurl-technology---industry---plus-maintenance-automated/scripts/study-005.txt +++ /dev/null @@ -1,178 +0,0 @@ - -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---industry---plus-maintenance-manual/.gitignore b/examples/unfurl-technology---industry---plus-maintenance-manual/.gitignore deleted file mode 100644 index 4fe5ca855c..0000000000 --- a/examples/unfurl-technology---industry---plus-maintenance-manual/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -files -lib diff --git a/examples/unfurl-technology---industry---plus-maintenance-manual/config.yaml b/examples/unfurl-technology---industry---plus-maintenance-manual/config.yaml deleted file mode 100644 index 4eff940c34..0000000000 --- a/examples/unfurl-technology---industry---plus-maintenance-manual/config.yaml +++ /dev/null @@ -1,2 +0,0 @@ -dependencies: - - source: ../unfurl-technology---industry---plus-maintenance-automated/lib diff --git a/examples/unfurl-technology---industry---plus-maintenance-manual/tests/customer/test.yaml b/examples/unfurl-technology---industry---plus-maintenance-manual/tests/customer/test.yaml deleted file mode 100644 index e74cb52183..0000000000 --- a/examples/unfurl-technology---industry---plus-maintenance-manual/tests/customer/test.yaml +++ /dev/null @@ -1,2 +0,0 @@ -expected: ../../../unfurl-technology---industry---plus-maintenance-automated/tests/customer/expected.yaml -inputs: ../../../unfurl-technology---industry---plus-maintenance-automated/tests/customer/inputs.yaml diff --git a/examples/unfurl-technology---industry---plus-maintenance-manual/tests/development/test.yaml b/examples/unfurl-technology---industry---plus-maintenance-manual/tests/development/test.yaml deleted file mode 100644 index 4469a6a219..0000000000 --- a/examples/unfurl-technology---industry---plus-maintenance-manual/tests/development/test.yaml +++ /dev/null @@ -1,2 +0,0 @@ -expected: ../../../unfurl-technology---industry---plus-maintenance-automated/tests/development/expected.yaml -inputs: ../../../unfurl-technology---industry---plus-maintenance-automated/tests/development/inputs.yaml diff --git a/examples/unfurl-technology---industry---plus-maintenance-manual/tests/hyperscaler/test.yaml b/examples/unfurl-technology---industry---plus-maintenance-manual/tests/hyperscaler/test.yaml deleted file mode 100644 index 9d19fc6f1e..0000000000 --- a/examples/unfurl-technology---industry---plus-maintenance-manual/tests/hyperscaler/test.yaml +++ /dev/null @@ -1,2 +0,0 @@ -expected: ../../../unfurl-technology---industry---plus-maintenance-automated/tests/hyperscaler/expected.yaml -inputs: ../../../unfurl-technology---industry---plus-maintenance-automated/tests/hyperscaler/inputs.yaml diff --git a/examples/unfurl-technology---industry---plus-maintenance-manual/tests/local/test.yaml b/examples/unfurl-technology---industry---plus-maintenance-manual/tests/local/test.yaml deleted file mode 100644 index 16e9c6b58e..0000000000 --- a/examples/unfurl-technology---industry---plus-maintenance-manual/tests/local/test.yaml +++ /dev/null @@ -1,2 +0,0 @@ -expected: ../../../unfurl-technology---industry---plus-maintenance-automated/tests/local/expected.yaml -inputs: ../../../unfurl-technology---industry---plus-maintenance-automated/tests/local/inputs.yaml diff --git a/examples/unfurl-technology---industry---plus-maintenance-manual/variable-service-template.yaml b/examples/unfurl-technology---industry---plus-maintenance-manual/variable-service-template.yaml deleted file mode 100644 index 496f79983e..0000000000 --- a/examples/unfurl-technology---industry---plus-maintenance-manual/variable-service-template.yaml +++ /dev/null @@ -1,1540 +0,0 @@ -tosca_definitions_version: tosca_variability_1_0_rc_3 - -imports: - - lib/types.yaml - -topology_template: - inputs: - domain: - type: string - - dbms_password: - type: string - - retailer_name: - type: string - - database_password: - type: string - - storage_password: - type: string - - minio_user: - type: string - - minio_secret: - type: string - - global_service_gateway_endpoint: - type: string - - global_service_gateway_token: - type: string - - payment_provider_endpoint: - type: string - - payment_provider_token: - type: string - - email_provider_endpoint: - type: string - - email_provider_token: - type: string - - sms_provider_endpoint: - type: string - - sms_provider_token: - type: string - - coffee_provider_type: - type: string - conditions: {logic_expression: has_coffee} - - coffee_provider_endpoint: - type: string - conditions: {logic_expression: has_coffee} - - coffee_provider_token: - type: string - conditions: {logic_expression: has_coffee} - - os_network: - type: string - - os_ssh_key_name: - type: string - - os_ssh_user: - type: string - - os_ssh_key_file: - type: string - - os_region_name: - type: string - - os_auth_type: - type: string - - os_auth_url: - type: string - - os_identity_api_version: - type: string - - os_interface: - type: string - - os_application_credential_id: - type: string - - os_application_credential_secret: - type: string - - gcp_region: - type: string - - gcp_service_account_file: - type: string - - 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: - has_info_logging: {equal: [{variability_input: logging}, INFO]} - has_debug_logging: {equal: [{variability_input: logging}, DEBUG]} - has_error_masking: {equal: [{variability_input: errors}, true]} - - has_coffee: {equal: [{variability_input: coffee}, true]} - - has_introspection: {equal: [{variability_input: introspection}, true]} - has_playground: {equal: [{variability_input: playground}, true]} - - has_import: {equal: [{variability_input: import}, true]} - has_import_schema_a: {and: [{logic_expression: has_import}, {equal: [{variability_input: import_schema}, A]}]} - has_import_schema_b: {and: [{logic_expression: has_import}, {equal: [{variability_input: import_schema}, B]}]} - - has_payment_merchant_a: {equal: [{variability_input: payment_merchant_a}, true]} - has_payment_merchant_b: {equal: [{variability_input: payment_merchant_b}, true]} - - is_hyperscaler: {equal: [{variability_input: env}, HYPERSCALER]} - is_local: {equal: [{variability_input: env}, LOCAL]} - is_customer: {equal: [{variability_input: env}, CUSTOMER]} - is_development: {equal: [{variability_input: env}, DEVELOPMENT]} - is_local_or_development: {or: [{logic_expression: is_local}, {logic_expression: is_development}]} - is_local_or_development_or_kubernetes: {or: [{logic_expression: is_local}, {logic_expression: is_development}, {node_presence: kubernetes_cluster}]} - - inputs: - env: - type: string - default: DEVELOPMENT - - errors: - type: boolean - default: true - - logging: - type: string - default: INFO - - coffee: - type: boolean - default: false - - introspection: - type: boolean - default: false - - playground: - type: boolean - default: false - - import: - type: boolean - default: false - - import_schema: - type: string - default: A - - payment_merchant_a: - type: boolean - default: false - - payment_merchant_b: - type: boolean - default: false - - node_templates: - ################################################### - # - # Global Dashboard - # - ################################################### - - global_frontend_dashboard: - type: global.frontend.dashboard - persistent: true - technology: - - compose: - conditions: {logic_expression: is_local_or_development} - - kubernetes: - conditions: {node_presence: kubernetes_cluster} - properties: - - application_name: global-frontend-dashboard - - application_port: 3000 - - application_protocol: http - - logging_level: - value: info - conditions: {logic_expression: has_info_logging} - - - logging_level: - value: debug - conditions: {logic_expression: has_debug_logging} - - - global_service_gateway_endpoint: {eval: '.::.requirements::[.name=global_service_gateway]::.target::application_endpoint'} - requirements: - - global_service_gateway: global_service_gateway - - host: local_docker_engine - - host: remote_docker_engine - - host: kubernetes_cluster - artifacts: - - docker_image: - type: docker.image - file: global.frontend.dashboard:vX.Y.Z - - global_ingress_dashboard: - type: ingress - technology: - - ansible: - conditions: {node_presence: virtual_machine} - - kubernetes: - conditions: {node_presence: kubernetes_cluster} - requirements: - - application: global_frontend_dashboard - - host: virtual_machine - - host: kubernetes_cluster - - ################################################### - # - # Global Gateway - # - ################################################### - - global_service_gateway: - type: global.service.gateway - technology: - - compose: - conditions: {logic_expression: is_local_or_development} - - kubernetes: - conditions: {node_presence: kubernetes_cluster} - properties: - - application_name: global-service-gateway - - application_port: 4000 - - application_protocol: graphql - - - logging_level: - value: info - conditions: {logic_expression: has_info_logging} - - - logging_level: - value: debug - conditions: {logic_expression: has_debug_logging} - - - domain: {get_input: retailer_name} - - - graphql_introspection: - value: true - conditions: {logic_expression: has_introspection} - - - graphql_introspection: - value: false - conditions: {not: {logic_expression: has_introspection}} - - - graphql_playground: - value: true - conditions: {logic_expression: has_playground} - - - graphql_playground: - value: false - conditions: {not: {logic_expression: has_playground}} - - - has_error_masking: - value: true - conditions: {logic_expression: has_error_masking} - - - has_error_masking: - value: false - conditions: {not: {logic_expression: has_error_masking}} - - - global_cache_redis_endpoint: {eval: '.::.requirements::[.name=cache]::.target::application_endpoint'} - - global_service_retailers_endpoint: {eval: '.::.requirements::[.name=global_service_retailers]::.target::application_endpoint'} - - global_service_products_endpoint: {eval: '.::.requirements::[.name=global_service_products]::.target::application_endpoint'} - - global_service_calibrations_endpoint: {eval: '.::.requirements::[.name=global_service_calibrations]::.target::application_endpoint'} - - global_service_account_endpoint: {eval: '.::.requirements::[.name=global_service_accounts]::.target::application_endpoint'} - requirements: - - cache: global_cache_redis - - global_service_retailers: global_service_retailers - - global_service_products: global_service_products - - global_service_calibrations: global_service_calibrations - - global_service_accounts: global_service_accounts - - host: local_docker_engine - - host: remote_docker_engine - - host: kubernetes_cluster - artifacts: - - docker_image: - type: docker.image - file: retailer.service.gateway:vX.Y.Z - - global_ingress_gateway: - type: ingress - technology: - - ansible: - conditions: {node_presence: virtual_machine} - - kubernetes: - conditions: {node_presence: kubernetes_cluster} - requirements: - - application: global_service_gateway - - host: virtual_machine - - host: kubernetes_cluster - - ################################################### - # - # Global Retailers - # - ################################################### - - global_service_retailers: - type: global.service.retailers - technology: - - compose: - conditions: {logic_expression: is_local_or_development} - - kubernetes: - conditions: {node_presence: kubernetes_cluster} - properties: - - application_name: global-service-retailers - - application_port: 4000 - - application_protocol: graphql - - logging_level: - value: info - conditions: {logic_expression: has_info_logging} - - - logging_level: - value: debug - conditions: {logic_expression: has_debug_logging} - - - global_cache_redis_endpoint: {eval: '.::.requirements::[.name=cache]::.target::application_endpoint'} - - - mysql_host: {eval: '.::.requirements::[.name=database]::.target::application_address'} - - mysql_port: {eval: '.::.requirements::[.name=database]::.target::application_port'} - - mysql_database: {eval: '.::.requirements::[.name=database]::.target::database_name'} - - mysql_user: {eval: '.::.requirements::[.name=database]::.target::database_user'} - - mysql_password: {eval: '.::.requirements::[.name=database]::.target::database_password'} - - mysql_table: 'stores' - - mysql_ssl_mode: {eval: '.::.requirements::[.name=database]::.target::.requirements::[.name=host]::.target::dbms_ssl_mode'} - - requirements: - - database: global_database_retailers - - cache: global_cache_redis - - host: local_docker_engine - - host: remote_docker_engine - - host: kubernetes_cluster - artifacts: - - docker_image: - type: docker.image - file: global.service.retailers:vX.Y.Z - - global_database_retailers: - type: mysql.database - technology: - - ansible: - conditions: {logic_expression: is_local_or_development_or_kubernetes} - - terraform: - conditions: {node_presence: gcp_cloudsql} - properties: - - database_name: retailers - - database_user: retailers - - database_password: {get_input: database_password} - requirements: - - host: global_dbms - - ################################################### - # - # Global Products - # - ################################################### - - global_service_products: - type: global.service.products - technology: - - compose: - conditions: {logic_expression: is_local_or_development} - - kubernetes: - conditions: {node_presence: kubernetes_cluster} - properties: - - application_name: global-service-products - - application_port: 4000 - - application_protocol: graphql - - logging_level: - value: info - conditions: {logic_expression: has_info_logging} - - - logging_level: - value: debug - conditions: {logic_expression: has_debug_logging} - - - global_cache_redis_endpoint: {eval: '.::.requirements::[.name=cache]::.target::application_endpoint'} - - - mysql_host: {eval: '.::.requirements::[.name=database]::.target::application_address'} - - mysql_port: {eval: '.::.requirements::[.name=database]::.target::application_port'} - - mysql_database: {eval: '.::.requirements::[.name=database]::.target::database_name'} - - mysql_user: {eval: '.::.requirements::[.name=database]::.target::database_user'} - - mysql_password: {eval: '.::.requirements::[.name=database]::.target::database_password'} - - mysql_table: 'stores' - - mysql_ssl_mode: {eval: '.::.requirements::[.name=database]::.target::.requirements::[.name=host]::.target::dbms_ssl_mode'} - - - storage_name: {eval: '.::.requirements::[.name=storage]::.target::storage_name'} - - storage_endpoint: {eval: '.::.requirements::[.name=storage]::.target::storage_endpoint'} - - storage_token: {eval: '.::.requirements::[.name=storage]::.target::storage_token'} - - storage_dialect: {eval: '.::.requirements::[.name=storage]::.target::storage_dialect'} - - requirements: - - database: global_database_products - - cache: global_cache_redis - - storage: global_storage_products - - host: local_docker_engine - - host: remote_docker_engine - - host: kubernetes_cluster - artifacts: - - docker_image: - type: docker.image - file: global.service.products:vX.Y.Z - - global_database_products: - type: mysql.database - technology: - - ansible: - conditions: {logic_expression: is_local_or_development_or_kubernetes} - - terraform: - conditions: {logic_expression: is_hyperscaler} - properties: - - database_name: products - - database_user: products - - database_password: {get_input: database_password} - requirements: - - host: global_dbms - - global_storage_products: - type: object.storage - technology: - - ansible: - conditions: {logic_expression: is_local_or_development_or_kubernetes} - - terraform: - conditions: {node_presence: gcp_cloudstorage} - properties: - - storage_name: products - - storage_token: {get_input: storage_password} - - storage_dialect: {eval: '.::.requirements::[.name=host]::.target::storage_dialect'} - requirements: - - host: global_minio - - host: gcp_cloudstorage - - ################################################### - # - # Global Calibrations - # - ################################################### - - global_service_calibrations: - type: global.service.calibrations - technology: - - compose: - conditions: {logic_expression: is_local_or_development} - - kubernetes: - conditions: {node_presence: kubernetes_cluster} - properties: - - application_name: global-service-calibrations - - application_port: 4000 - - application_protocol: graphql - - logging_level: - value: info - conditions: {logic_expression: has_info_logging} - - - logging_level: - value: debug - conditions: {logic_expression: has_debug_logging} - - - global_cache_redis_endpoint: {eval: '.::.requirements::[.name=cache]::.target::application_endpoint'} - - - mysql_host: {eval: '.::.requirements::[.name=database]::.target::application_address'} - - mysql_port: {eval: '.::.requirements::[.name=database]::.target::application_port'} - - mysql_database: {eval: '.::.requirements::[.name=database]::.target::database_name'} - - mysql_user: {eval: '.::.requirements::[.name=database]::.target::database_user'} - - mysql_password: {eval: '.::.requirements::[.name=database]::.target::database_password'} - - mysql_table: 'stores' - - mysql_ssl_mode: {eval: '.::.requirements::[.name=database]::.target::.requirements::[.name=host]::.target::dbms_ssl_mode'} - - - storage_name: {eval: '.::.requirements::[.name=storage]::.target::storage_name'} - - storage_endpoint: {eval: '.::.requirements::[.name=storage]::.target::storage_endpoint'} - - storage_token: {eval: '.::.requirements::[.name=storage]::.target::storage_token'} - - storage_dialect: {eval: '.::.requirements::[.name=storage]::.target::storage_dialect'} - - requirements: - - database: global_database_calibrations - - cache: global_cache_redis - - storage: global_storage_calibrations - - host: local_docker_engine - - host: remote_docker_engine - - host: kubernetes_cluster - artifacts: - - docker_image: - type: docker.image - file: global.service.calibrations:vX.Y.Z - - global_database_calibrations: - type: mysql.database - technology: - - ansible: - conditions: {logic_expression: is_local_or_development_or_kubernetes} - - terraform: - conditions: {node_presence: gcp_cloudsql} - properties: - - database_name: calibrations - - database_user: calibrations - - database_password: {get_input: database_password} - requirements: - - host: global_dbms - - global_storage_calibrations: - type: object.storage - technology: - - ansible: - conditions: {logic_expression: is_local_or_development_or_kubernetes} - - terraform: - conditions: {node_presence: gcp_cloudstorage} - properties: - - storage_name: calibrations - - storage_token: {get_input: storage_password} - - storage_dialect: {eval: '.::.requirements::[.name=host]::.target::storage_dialect'} - requirements: - - host: global_minio - - host: gcp_cloudstorage - - ################################################### - # - # Global Accounts - # - ################################################### - - global_service_accounts: - type: global.service.accounts - technology: - - compose: - conditions: {logic_expression: is_local_or_development} - - kubernetes: - conditions: {node_presence: kubernetes_cluster} - properties: - - application_name: global-service-accounts - - application_port: 4000 - - application_protocol: graphql - - logging_level: - value: info - conditions: {logic_expression: has_info_logging} - - - logging_level: - value: debug - conditions: {logic_expression: has_debug_logging} - - - global_cache_redis_endpoint: {eval: '.::.requirements::[.name=cache]::.target::application_endpoint'} - - - mysql_host: {eval: '.::.requirements::[.name=database]::.target::application_address'} - - mysql_port: {eval: '.::.requirements::[.name=database]::.target::application_port'} - - mysql_database: {eval: '.::.requirements::[.name=database]::.target::database_name'} - - mysql_user: {eval: '.::.requirements::[.name=database]::.target::database_user'} - - mysql_password: {eval: '.::.requirements::[.name=database]::.target::database_password'} - - mysql_table: 'stores' - - mysql_ssl_mode: {eval: '.::.requirements::[.name=database]::.target::.requirements::[.name=host]::.target::dbms_ssl_mode'} - - - email_provider_endpoint: {get_input: email_provider_endpoint} - - email_provider_token: {get_input: email_provider_token} - - - sms_provider_endpoint: {get_input: sms_provider_endpoint} - - sms_provider_token: {get_input: sms_provider_token} - requirements: - - database: global_database_accounts - - cache: global_cache_redis - - host: local_docker_engine - - host: remote_docker_engine - - host: kubernetes_cluster - artifacts: - - docker_image: - type: docker.image - file: global.service.accounts:vX.Y.Z - - global_database_accounts: - type: mysql.database - technology: - - ansible: - conditions: {logic_expression: is_local_or_development_or_kubernetes} - - terraform: - conditions: {node_presence: gcp_cloudsql} - properties: - - database_name: accounts - - database_user: accounts - - database_password: {get_input: database_password} - requirements: - - host: global_dbms - - ################################################### - # - # Global DBMS - # - ################################################### - - global_dbms: - type: mysql.dbms - technology: - - compose: - conditions: {logic_expression: is_local_or_development} - - kubernetes: - conditions: {node_presence: kubernetes_cluster} - - terraform: - conditions: {node_presence: gcp_cloudsql} - properties: - - dbms_name: unfurl-technology-industry-global-dbms - - dbms_password: {get_input: dbms_password} - requirements: - - host: local_docker_engine - - host: remote_docker_engine - - host: gcp_cloudsql - - host: - node: kubernetes_cluster - conditions: {logic_expression: is_customer} - artifacts: - - dbms_image: - type: dbms.image - file: 5.7 - - ################################################### - # - # Global Cache - # - ################################################### - - global_cache_redis: - type: redis.server - technology: - - compose: - conditions: {logic_expression: is_local_or_development} - - kubernetes: - conditions: {node_presence: kubernetes_cluster} - - terraform: - conditions: {node_presence: gcp_memorystore} - properties: - - cache_name: global-cache-redis - - cache_port: 6379 - requirements: - - host: local_docker_engine - - host: remote_docker_engine - - host: gcp_memorystore - - host: - node: kubernetes_cluster - conditions: {logic_expression: is_customer} - artifacts: - - cache_image: - type: cache.image - file: 7.4.0 - - ################################################### - # - # Global MinIO - # - ################################################### - - global_minio: - type: minio.server - conditions: {not: {logic_expression: is_hyperscaler}} - technology: - - compose: - conditions: {logic_expression: is_local_or_development} - - kubernetes: - conditions: {node_presence: kubernetes_cluster} - properties: - - application_name: global-minio-server - - application_port: 9000 - - application_protocol: http - - access_key: {get_input: minio_user} - - secret_key: {get_input: minio_secret} - requirements: - - host: local_docker_engine - - host: remote_docker_engine - - host: kubernetes_cluster - artifacts: - - docker_image: - type: docker.image - file: minio/minio:RELEASE.2024-08-29T01-40-52Z - - ################################################### - # - # Retailer Dashboard - # - ################################################### - - retailer_frontend_dashboard: - type: retailer.frontend.dashboard - persistent: true - technology: - - compose: - conditions: {logic_expression: is_local_or_development} - - kubernetes: - conditions: {node_presence: kubernetes_cluster} - properties: - - application_name: retailer-frontend-dashboard - - application_port: 3000 - - application_protocol: http - - logging_level: - value: info - conditions: {logic_expression: has_info_logging} - - - logging_level: - value: debug - conditions: {logic_expression: has_debug_logging} - - - retailer_service_gateway_endpoint: {eval: '.::.requirements::[.name=retailer_service_gateway]::.target::application_endpoint'} - requirements: - - retailer_service_gateway: retailer_service_gateway - - host: local_docker_engine - - host: remote_docker_engine - - host: kubernetes_cluster - artifacts: - - docker_image: - type: docker.image - file: retailer.frontend.dashboard:vX.Y.Z - - retailer_ingress_dashboard: - type: ingress - technology: - - ansible: - conditions: {node_presence: virtual_machine} - - kubernetes: - conditions: {node_presence: kubernetes_cluster} - requirements: - - application: retailer_frontend_dashboard - - host: virtual_machine - - host: kubernetes_cluster - - ################################################### - # - # Retailer Terminal - # - ################################################### - - retailer_frontend_terminal: - type: retailer.frontend.terminal - persistent: true - technology: - - compose: - conditions: {logic_expression: is_local_or_development} - - kubernetes: - conditions: {node_presence: kubernetes_cluster} - properties: - - application_name: retailer-frontend-terminal - - application_port: 3000 - - application_protocol: http - - logging_level: - value: info - conditions: {logic_expression: has_info_logging} - - - logging_level: - value: debug - conditions: {logic_expression: has_debug_logging} - - - retailer_service_gateway_endpoint: {eval: '.::.requirements::[.name=retailer_service_gateway]::.target::application_endpoint'} - requirements: - - retailer_service_gateway: retailer_service_gateway - - host: local_docker_engine - - host: remote_docker_engine - - host: kubernetes_cluster - artifacts: - - docker_image: - type: docker.image - file: retailer.frontend.dashboard:vX.Y.Z - - retailer_ingress_terminal: - type: ingress - technology: - - ansible: - conditions: {node_presence: virtual_machine} - - kubernetes: - conditions: {node_presence: kubernetes_cluster} - requirements: - - application: retailer_frontend_terminal - - host: virtual_machine - - host: kubernetes_cluster - - ################################################### - # - # Retailer Gateway - # - ################################################### - - retailer_service_gateway: - type: retailer.service.gateway - technology: - - compose: - conditions: {logic_expression: is_local_or_development} - - kubernetes: - conditions: {node_presence: kubernetes_cluster} - properties: - - application_name: retailer-service-gateway - - application_port: 4000 - - application_protocol: graphql - - - logging_level: - value: info - conditions: {logic_expression: has_info_logging} - - - logging_level: - value: debug - conditions: {logic_expression: has_debug_logging} - - - retailer_name: {get_input: retailer_name} - - domain: {get_input: domain} - - - graphql_introspection: - value: true - conditions: {logic_expression: has_introspection} - - - graphql_introspection: - value: false - conditions: {not: {logic_expression: has_introspection}} - - - graphql_playground: - value: true - conditions: {logic_expression: has_playground} - - - graphql_playground: - value: false - conditions: {not: {logic_expression: has_playground}} - - - has_error_masking: - value: true - conditions: {logic_expression: has_error_masking} - - - has_error_masking: - value: false - conditions: {not: {logic_expression: has_error_masking}} - - - retailer_cache_redis_endpoint: {eval: '.::.requirements::[.name=cache]::.target::application_endpoint'} - - retailer_service_core_endpoint: {eval: '.::.requirements::[.name=retailer_service_core]::.target::application_endpoint'} - - retailer_service_jobs_endpoint: {eval: '.::.requirements::[.name=retailer_service_jobs]::.target::application_endpoint'} - - retailer_service_stores_endpoint: {eval: '.::.requirements::[.name=retailer_service_stores]::.target::application_endpoint'} - - retailer_service_products_endpoint: {eval: '.::.requirements::[.name=retailer_service_products]::.target::application_endpoint'} - - retailer_service_stocks_endpoint: {eval: '.::.requirements::[.name=retailer_service_stocks]::.target::application_endpoint'} - - retailer_service_orders_endpoint: {eval: '.::.requirements::[.name=retailer_service_orders]::.target::application_endpoint'} - - retailer_service_global_endpoint: {eval: '.::.requirements::[.name=retailer_service_global]::.target::application_endpoint'} - requirements: - - cache: retailer_cache_redis - - retailer_service_core: retailer_service_core - - retailer_service_jobs: retailer_service_jobs - - retailer_service_stores: retailer_service_stores - - retailer_service_products: retailer_service_products - - retailer_service_stocks: retailer_service_stocks - - retailer_service_orders: retailer_service_orders - - retailer_service_global: retailer_service_global - - host: local_docker_engine - - host: remote_docker_engine - - host: kubernetes_cluster - artifacts: - - docker_image: - type: docker.image - file: retailer.service.gateway:vX.Y.Z - - retailer_ingress_gateway: - type: ingress - technology: - - ansible: - conditions: {node_presence: virtual_machine} - - kubernetes: - conditions: {node_presence: kubernetes_cluster} - requirements: - - application: retailer_service_gateway - - host: virtual_machine - - host: kubernetes_cluster - - ################################################### - # - # Retailer Core - # - ################################################### - - retailer_service_core: - type: retailer.service.core - technology: - - compose: - conditions: {logic_expression: is_local_or_development} - - kubernetes: - conditions: {node_presence: kubernetes_cluster} - properties: - - application_name: retailer-service-core - - application_port: 4000 - - application_protocol: graphql - - logging_level: - value: info - conditions: {logic_expression: has_info_logging} - - - logging_level: - value: debug - conditions: {logic_expression: has_debug_logging} - - - retailer_cache_redis_endpoint: {eval: '.::.requirements::[.name=cache]::.target::application_endpoint'} - - - coffee_enabled: - value: true - conditions: {logic_expression: has_coffee} - - - coffee_enabled: - value: false - conditions: {not: {logic_expression: has_coffee}} - - - coffee_provider_type: - value: {get_input: coffee_provider_type} - conditions: {logic_expression: has_coffee} - - - coffee_provider_endpoint: - value: {get_input: coffee_provider_endpoint} - conditions: {logic_expression: has_coffee} - - - coffee_provider_token: - value: {get_input: coffee_provider_token} - conditions: {logic_expression: has_coffee} - - - payment_provider_endpoint: {get_input: payment_provider_endpoint} - - payment_provider_token: {get_input: payment_provider_token} - - - payment_merchant_a_enabled: - value: true - conditions: {logic_expression: has_payment_merchant_a} - - - payment_merchant_a_enabled: - value: false - conditions: {not: {logic_expression: has_payment_merchant_a}} - - - payment_merchant_b_enabled: - value: true - conditions: {logic_expression: has_payment_merchant_b} - - - payment_merchant_b_enabled: - value: false - conditions: {not: {logic_expression: has_payment_merchant_b}} - - requirements: - - cache: retailer_cache_redis - - host: local_docker_engine - - host: remote_docker_engine - - host: kubernetes_cluster - artifacts: - - docker_image: - type: docker.image - file: retailer.service.core:vX.Y.Z - - ################################################### - # - # Retailer Jobs - # - ################################################### - - retailer_service_jobs: - type: retailer.service.jobs - technology: - - compose: - conditions: {logic_expression: is_local_or_development} - - kubernetes: - conditions: {node_presence: kubernetes_cluster} - properties: - - application_name: retailer-service-core - - application_port: 4000 - - application_protocol: graphql - - logging_level: - value: info - conditions: {logic_expression: has_info_logging} - - - logging_level: - value: debug - conditions: {logic_expression: has_debug_logging} - - - retailer_cache_redis_endpoint: {eval: '.::.requirements::[.name=cache]::.target::application_endpoint'} - - requirements: - - cache: retailer_cache_redis - - host: local_docker_engine - - host: remote_docker_engine - - host: kubernetes_cluster - artifacts: - - docker_image: - type: docker.image - file: retailer.service.jobs:vX.Y.Z - - ################################################### - # - # Retailer Stores - # - ################################################### - - retailer_service_stores: - type: retailer.service.stores - technology: - - compose: - conditions: {logic_expression: is_local_or_development} - - kubernetes: - conditions: {node_presence: kubernetes_cluster} - properties: - - application_name: retailer-service-stores - - application_port: 4000 - - application_protocol: graphql - - logging_level: - value: info - conditions: {logic_expression: has_info_logging} - - - logging_level: - value: debug - conditions: {logic_expression: has_debug_logging} - - - retailer_cache_redis_endpoint: {eval: '.::.requirements::[.name=cache]::.target::application_endpoint'} - - - mysql_host: {eval: '.::.requirements::[.name=database]::.target::application_address'} - - mysql_port: {eval: '.::.requirements::[.name=database]::.target::application_port'} - - mysql_database: {eval: '.::.requirements::[.name=database]::.target::database_name'} - - mysql_user: {eval: '.::.requirements::[.name=database]::.target::database_user'} - - mysql_password: {eval: '.::.requirements::[.name=database]::.target::database_password'} - - mysql_table: 'stores' - - mysql_ssl_mode: {eval: '.::.requirements::[.name=database]::.target::.requirements::[.name=host]::.target::dbms_ssl_mode'} - - - storage_name: {eval: '.::.requirements::[.name=storage]::.target::storage_name'} - - storage_endpoint: {eval: '.::.requirements::[.name=storage]::.target::storage_endpoint'} - - storage_token: {eval: '.::.requirements::[.name=storage]::.target::storage_token'} - - storage_dialect: {eval: '.::.requirements::[.name=storage]::.target::storage_dialect'} - - requirements: - - database: retailer_database_stores - - cache: retailer_cache_redis - - storage: retailer_storage_stores - - host: local_docker_engine - - host: remote_docker_engine - - host: kubernetes_cluster - artifacts: - - docker_image: - type: docker.image - file: retailer.service.stores:vX.Y.Z - - retailer_database_stores: - type: mysql.database - technology: - - ansible: - conditions: {logic_expression: is_local_or_development_or_kubernetes} - - terraform: - conditions: {node_presence: gcp_cloudsql} - properties: - - database_name: stores - - database_user: stores - - database_password: {get_input: database_password} - requirements: - - host: retailer_dbms - - retailer_storage_stores: - type: object.storage - technology: - - ansible: - conditions: {logic_expression: is_local_or_development_or_kubernetes} - - terraform: - conditions: {node_presence: gcp_cloudstorage} - properties: - - storage_name: stores - - storage_token: {get_input: storage_password} - - storage_dialect: {eval: '.::.requirements::[.name=host]::.target::storage_dialect'} - requirements: - - host: retailer_minio - - host: gcp_cloudstorage - - ################################################### - # - # Retailer Products - # - ################################################### - - retailer_service_products: - type: retailer.service.products - technology: - - compose: - conditions: {logic_expression: is_local_or_development} - - kubernetes: - conditions: {node_presence: kubernetes_cluster} - properties: - - application_name: retailer-service-products - - application_port: 4000 - - application_protocol: graphql - - logging_level: - value: info - conditions: {logic_expression: has_info_logging} - - - logging_level: - value: debug - conditions: {logic_expression: has_debug_logging} - - - retailer_cache_redis_endpoint: {eval: '.::.requirements::[.name=cache]::.target::application_endpoint'} - - - import_enabled: - value: true - conditions: {logic_expression: has_import} - - - import_enabled: - value: false - conditions: {not: {logic_expression: has_import}} - - - import_schema: - value: a - conditions: {logic_expression: has_import_schema_a} - - - import_schema: - value: b - conditions: {logic_expression: has_import_schema_b} - - - mysql_host: {eval: '.::.requirements::[.name=database]::.target::application_address'} - - mysql_port: {eval: '.::.requirements::[.name=database]::.target::application_port'} - - mysql_database: {eval: '.::.requirements::[.name=database]::.target::database_name'} - - mysql_user: {eval: '.::.requirements::[.name=database]::.target::database_user'} - - mysql_password: {eval: '.::.requirements::[.name=database]::.target::database_password'} - - mysql_table: 'stores' - - mysql_ssl_mode: {eval: '.::.requirements::[.name=database]::.target::.requirements::[.name=host]::.target::dbms_ssl_mode'} - - - storage_name: {eval: '.::.requirements::[.name=storage]::.target::storage_name'} - - storage_endpoint: {eval: '.::.requirements::[.name=storage]::.target::storage_endpoint'} - - storage_token: {eval: '.::.requirements::[.name=storage]::.target::storage_token'} - - storage_dialect: {eval: '.::.requirements::[.name=storage]::.target::storage_dialect'} - - requirements: - - database: retailer_database_products - - cache: retailer_cache_redis - - storage: retailer_storage_products - - host: local_docker_engine - - host: remote_docker_engine - - host: kubernetes_cluster - artifacts: - - docker_image: - type: docker.image - file: retailer.service.products:vX.Y.Z - - retailer_database_products: - type: mysql.database - technology: - - ansible: - conditions: {logic_expression: is_local_or_development_or_kubernetes} - - terraform: - conditions: {node_presence: gcp_cloudsql} - properties: - - database_name: products - - database_user: products - - database_password: {get_input: database_password} - requirements: - - host: retailer_dbms - - retailer_storage_products: - type: object.storage - technology: - - ansible: - conditions: {logic_expression: is_local_or_development_or_kubernetes} - - terraform: - conditions: {node_presence: gcp_cloudstorage} - properties: - - storage_name: products - - storage_token: {get_input: storage_password} - - storage_dialect: {eval: '.::.requirements::[.name=host]::.target::storage_dialect'} - requirements: - - host: retailer_minio - - host: gcp_cloudstorage - - ################################################### - # - # Retailer Stocks - # - ################################################### - - retailer_service_stocks: - type: retailer.service.stocks - technology: - - compose: - conditions: {logic_expression: is_local_or_development} - - kubernetes: - conditions: {node_presence: kubernetes_cluster} - properties: - - application_name: retailer-service-stocks - - application_port: 4000 - - application_protocol: graphql - - logging_level: - value: info - conditions: {logic_expression: has_info_logging} - - - logging_level: - value: debug - conditions: {logic_expression: has_debug_logging} - - - retailer_cache_redis_endpoint: {eval: '.::.requirements::[.name=cache]::.target::application_endpoint'} - - - mysql_host: {eval: '.::.requirements::[.name=database]::.target::application_address'} - - mysql_port: {eval: '.::.requirements::[.name=database]::.target::application_port'} - - mysql_database: {eval: '.::.requirements::[.name=database]::.target::database_name'} - - mysql_user: {eval: '.::.requirements::[.name=database]::.target::database_user'} - - mysql_password: {eval: '.::.requirements::[.name=database]::.target::database_password'} - - mysql_table: 'stores' - - mysql_ssl_mode: {eval: '.::.requirements::[.name=database]::.target::.requirements::[.name=host]::.target::dbms_ssl_mode'} - requirements: - - database: retailer_database_stocks - - cache: retailer_cache_redis - - host: local_docker_engine - - host: remote_docker_engine - - host: kubernetes_cluster - artifacts: - - docker_image: - type: docker.image - file: retailer.service.stocks:vX.Y.Z - - retailer_database_stocks: - type: mysql.database - technology: - - ansible: - conditions: {logic_expression: is_local_or_development_or_kubernetes} - - terraform: - conditions: {node_presence: gcp_cloudsql} - properties: - - database_name: stocks - - database_user: stocks - - database_password: {get_input: database_password} - requirements: - - host: retailer_dbms - - ################################################### - # - # Retailer Orders - # - ################################################### - - retailer_service_orders: - type: retailer.service.orders - technology: - - compose: - conditions: {logic_expression: is_local_or_development} - - kubernetes: - conditions: {node_presence: kubernetes_cluster} - properties: - - application_name: retailer-service-orders - - application_port: 4000 - - application_protocol: graphql - - logging_level: - value: info - conditions: {logic_expression: has_info_logging} - - - logging_level: - value: debug - conditions: {logic_expression: has_debug_logging} - - - retailer_cache_redis_endpoint: {eval: '.::.requirements::[.name=cache]::.target::application_endpoint'} - - - mysql_host: {eval: '.::.requirements::[.name=database]::.target::application_address'} - - mysql_port: {eval: '.::.requirements::[.name=database]::.target::application_port'} - - mysql_database: {eval: '.::.requirements::[.name=database]::.target::database_name'} - - mysql_user: {eval: '.::.requirements::[.name=database]::.target::database_user'} - - mysql_password: {eval: '.::.requirements::[.name=database]::.target::database_password'} - - mysql_table: 'stores' - - mysql_ssl_mode: {eval: '.::.requirements::[.name=database]::.target::.requirements::[.name=host]::.target::dbms_ssl_mode'} - requirements: - - database: retailer_database_orders - - cache: retailer_cache_redis - - host: local_docker_engine - - host: remote_docker_engine - - host: kubernetes_cluster - artifacts: - - docker_image: - type: docker.image - file: retailer.service.stocks:vX.Y.Z - - retailer_database_orders: - type: mysql.database - technology: - - ansible: - conditions: {logic_expression: is_local_or_development_or_kubernetes} - - terraform: - conditions: {node_presence: gcp_cloudsql} - properties: - - database_name: orders - - database_user: orders - - database_password: {get_input: database_password} - requirements: - - host: retailer_dbms - - ################################################### - # - # Retailer Global - # - ################################################### - - retailer_service_global: - type: retailer.service.global - technology: - - compose: - conditions: {logic_expression: is_local_or_development} - - kubernetes: - conditions: {node_presence: kubernetes_cluster} - properties: - - application_name: retailer-service-global - - application_port: 4000 - - application_protocol: graphql - - logging_level: - value: info - conditions: {logic_expression: has_info_logging} - - - logging_level: - value: debug - conditions: {logic_expression: has_debug_logging} - - - retailer_cache_redis_endpoint: {eval: '.::.requirements::[.name=cache]::.target::application_endpoint'} - - - global_service_gateway_endpoint: {get_input: global_service_gateway_endpoint} - - global_service_gateway_token: {get_input: global_service_gateway_token} - requirements: - - cache: retailer_cache_redis - - host: local_docker_engine - - host: remote_docker_engine - - host: kubernetes_cluster - artifacts: - - docker_image: - type: docker.image - file: retailer.service.stocks:vX.Y.Z - - ################################################### - # - # Retailer DBMS - # - ################################################### - - retailer_dbms: - type: mysql.dbms - technology: - - compose: - conditions: {logic_expression: is_local_or_development} - - kubernetes: - conditions: {node_presence: kubernetes_cluster} - - terraform: - conditions: {node_presence: gcp_cloudsql} - properties: - - dbms_name: unfurl-technology-industry-retailer-dbms - - dbms_password: {get_input: dbms_password} - requirements: - - host: local_docker_engine - - host: remote_docker_engine - - host: gcp_cloudsql - - host: - node: kubernetes_cluster - conditions: {logic_expression: is_customer} - artifacts: - - dbms_image: - type: dbms.image - file: 5.7 - - ################################################### - # - # Retailer Cache - # - ################################################### - - retailer_cache_redis: - type: redis.server - technology: - - compose: - conditions: {logic_expression: is_local_or_development} - - kubernetes: - conditions: {node_presence: kubernetes_cluster} - - terraform: - conditions: {node_presence: gcp_memorystore} - properties: - - cache_name: retailer-cache-redis - - cache_port: 6379 - requirements: - - host: local_docker_engine - - host: remote_docker_engine - - host: gcp_memorystore - - host: - node: kubernetes_cluster - conditions: {logic_expression: is_customer} - artifacts: - - cache_image: - type: cache.image - file: 7.4.0 - - ################################################### - # - # Retailer MinIO - # - ################################################### - - retailer_minio: - type: minio.server - conditions: {not: {logic_expression: is_hyperscaler}} - technology: - - compose: - conditions: {logic_expression: is_local_or_development} - - kubernetes: - conditions: {node_presence: kubernetes_cluster} - properties: - - application_name: retailer-minio-server - - application_port: 9000 - - application_protocol: http - - access_key: {get_input: minio_user} - - secret_key: {get_input: minio_secret} - requirements: - - host: local_docker_engine - - host: remote_docker_engine - - host: kubernetes_cluster - artifacts: - - docker_image: - type: docker.image - file: minio/minio:RELEASE.2024-08-29T01-40-52Z - - ################################################### - # - # Local Machine - # - ################################################### - - local_docker_engine: - type: docker.engine - technology: ansible - requirements: - - host: local_machine - - local_machine: - type: local.machine - conditions: {logic_expression: is_local} - - ################################################### - # - # Virtual Machine - # - ################################################### - - remote_docker_engine: - type: docker.engine - technology: ansible - requirements: - - host: virtual_machine - - virtual_machine: - type: virtual.machine - technology: terraform - properties: - - machine_name: unfurl-technology-boutique - - ports: ['80', '9100'] - - flavor: m1.medium - - network: {get_input: os_network} - - ssh_user: {get_input: os_ssh_user} - - ssh_key_name: {get_input: os_ssh_key_name} - - ssh_key_file: {get_input: os_ssh_key_file} - requirements: - - host: openstack_provider - artifacts: - - machine_image: - type: machine.image - file: Ubuntu 22.04 - - openstack_provider: - type: openstack.provider - conditions: {logic_expression: is_development} - properties: - - os_region_name: {get_input: os_region_name} - - os_auth_type: {get_input: os_auth_type} - - os_auth_url: {get_input: os_auth_url} - - os_identity_api_version: {get_input: os_identity_api_version} - - os_interface: {get_input: os_interface} - - os_application_credential_id: {get_input: os_application_credential_id} - - os_application_credential_secret: {get_input: os_application_credential_secret} - - ################################################### - # - # GCP - # - ################################################### - - gcp_memorystore: - type: gcp.memorystore - technology: terraform - requirements: - - host: gcp_provider - - gcp_kubernetesengine: - type: gcp.kubernetesengine - technology: terraform - requirements: - - host: gcp_provider - - gcp_cloudstorage: - type: gcp.cloudstorage - technology: terraform - requirements: - - host: gcp_provider - - gcp_cloudrun: - type: gcp.cloudrun - technology: terraform - requirements: - - host: gcp_provider - - gcp_cloudsql: - type: gcp.cloudsql - technology: terraform - requirements: - - host: gcp_provider - - gcp_provider: - type: gcp.provider - conditions: {logic_expression: is_hyperscaler} - properties: - - 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 - 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 - - host: gcp_kubernetesengine - - kubernetes_provider: - type: cloud.provider - conditions: {logic_expression: is_customer} diff --git a/examples/unfurl-technology---industry---plus-original-manual/.gitignore b/examples/unfurl-technology---industry---plus-original-manual/.gitignore deleted file mode 100644 index 4fe5ca855c..0000000000 --- a/examples/unfurl-technology---industry---plus-original-manual/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -files -lib diff --git a/examples/unfurl-technology---industry---plus-original-manual/config.yaml b/examples/unfurl-technology---industry---plus-original-manual/config.yaml deleted file mode 100644 index 4eff940c34..0000000000 --- a/examples/unfurl-technology---industry---plus-original-manual/config.yaml +++ /dev/null @@ -1,2 +0,0 @@ -dependencies: - - source: ../unfurl-technology---industry---plus-maintenance-automated/lib diff --git a/examples/unfurl-technology---industry---plus-original-manual/tests/customer/test.yaml b/examples/unfurl-technology---industry---plus-original-manual/tests/customer/test.yaml deleted file mode 100644 index e74cb52183..0000000000 --- a/examples/unfurl-technology---industry---plus-original-manual/tests/customer/test.yaml +++ /dev/null @@ -1,2 +0,0 @@ -expected: ../../../unfurl-technology---industry---plus-maintenance-automated/tests/customer/expected.yaml -inputs: ../../../unfurl-technology---industry---plus-maintenance-automated/tests/customer/inputs.yaml diff --git a/examples/unfurl-technology---industry---plus-original-manual/tests/development/test.yaml b/examples/unfurl-technology---industry---plus-original-manual/tests/development/test.yaml deleted file mode 100644 index 4469a6a219..0000000000 --- a/examples/unfurl-technology---industry---plus-original-manual/tests/development/test.yaml +++ /dev/null @@ -1,2 +0,0 @@ -expected: ../../../unfurl-technology---industry---plus-maintenance-automated/tests/development/expected.yaml -inputs: ../../../unfurl-technology---industry---plus-maintenance-automated/tests/development/inputs.yaml diff --git a/examples/unfurl-technology---industry---plus-original-manual/tests/local/test.yaml b/examples/unfurl-technology---industry---plus-original-manual/tests/local/test.yaml deleted file mode 100644 index 16e9c6b58e..0000000000 --- a/examples/unfurl-technology---industry---plus-original-manual/tests/local/test.yaml +++ /dev/null @@ -1,2 +0,0 @@ -expected: ../../../unfurl-technology---industry---plus-maintenance-automated/tests/local/expected.yaml -inputs: ../../../unfurl-technology---industry---plus-maintenance-automated/tests/local/inputs.yaml diff --git a/examples/unfurl-technology---industry---plus-original-manual/variable-service-template.yaml b/examples/unfurl-technology---industry---plus-original-manual/variable-service-template.yaml deleted file mode 100644 index e0783b3440..0000000000 --- a/examples/unfurl-technology---industry---plus-original-manual/variable-service-template.yaml +++ /dev/null @@ -1,1410 +0,0 @@ -tosca_definitions_version: tosca_variability_1_0_rc_3 - -imports: - - lib/types.yaml - -topology_template: - inputs: - domain: - type: string - - dbms_password: - type: string - - retailer_name: - type: string - - database_password: - type: string - - storage_password: - type: string - - minio_user: - type: string - - minio_secret: - type: string - - global_service_gateway_endpoint: - type: string - - global_service_gateway_token: - type: string - - payment_provider_endpoint: - type: string - - payment_provider_token: - type: string - - email_provider_endpoint: - type: string - - email_provider_token: - type: string - - sms_provider_endpoint: - type: string - - sms_provider_token: - type: string - - coffee_provider_type: - type: string - conditions: {logic_expression: has_coffee} - - coffee_provider_endpoint: - type: string - conditions: {logic_expression: has_coffee} - - coffee_provider_token: - type: string - conditions: {logic_expression: has_coffee} - - os_network: - type: string - - os_ssh_key_name: - type: string - - os_ssh_user: - type: string - - os_ssh_key_file: - type: string - - os_region_name: - type: string - - os_auth_type: - type: string - - os_auth_url: - type: string - - os_identity_api_version: - type: string - - os_interface: - type: string - - os_application_credential_id: - type: string - - os_application_credential_secret: - 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: - has_info_logging: {equal: [{variability_input: logging}, INFO]} - has_debug_logging: {equal: [{variability_input: logging}, DEBUG]} - has_error_masking: {equal: [{variability_input: errors}, true]} - - has_coffee: {equal: [{variability_input: coffee}, true]} - - has_introspection: {equal: [{variability_input: introspection}, true]} - has_playground: {equal: [{variability_input: playground}, true]} - - has_import: {equal: [{variability_input: import}, true]} - has_import_schema_a: {and: [{logic_expression: has_import}, {equal: [{variability_input: import_schema}, A]}]} - has_import_schema_b: {and: [{logic_expression: has_import}, {equal: [{variability_input: import_schema}, B]}]} - - has_payment_merchant_a: {equal: [{variability_input: payment_merchant_a}, true]} - has_payment_merchant_b: {equal: [{variability_input: payment_merchant_b}, true]} - - is_local: {equal: [{variability_input: env}, LOCAL]} - is_customer: {equal: [{variability_input: env}, CUSTOMER]} - is_development: {equal: [{variability_input: env}, DEVELOPMENT]} - is_local_or_development: {or: [{logic_expression: is_local}, {logic_expression: is_development}]} - - inputs: - env: - type: string - default: DEVELOPMENT - - errors: - type: boolean - default: true - - logging: - type: string - default: INFO - - coffee: - type: boolean - default: false - - introspection: - type: boolean - default: false - - playground: - type: boolean - default: false - - import: - type: boolean - default: false - - import_schema: - type: string - default: A - - payment_merchant_a: - type: boolean - default: false - - payment_merchant_b: - type: boolean - default: false - - node_templates: - ################################################### - # - # Global Dashboard - # - ################################################### - - global_frontend_dashboard: - type: global.frontend.dashboard - persistent: true - technology: - - compose: - conditions: {logic_expression: is_local_or_development} - - kubernetes: - conditions: {node_presence: kubernetes_cluster} - properties: - - application_name: global-frontend-dashboard - - application_port: 3000 - - application_protocol: http - - logging_level: - value: info - conditions: {logic_expression: has_info_logging} - - - logging_level: - value: debug - conditions: {logic_expression: has_debug_logging} - - - global_service_gateway_endpoint: {eval: '.::.requirements::[.name=global_service_gateway]::.target::application_endpoint'} - requirements: - - global_service_gateway: global_service_gateway - - host: local_docker_engine - - host: remote_docker_engine - - host: kubernetes_cluster - artifacts: - - docker_image: - type: docker.image - file: global.frontend.dashboard:vX.Y.Z - - global_ingress_dashboard: - type: ingress - technology: - - ansible: - conditions: {node_presence: virtual_machine} - - kubernetes: - conditions: {node_presence: kubernetes_cluster} - requirements: - - application: global_frontend_dashboard - - host: virtual_machine - - host: kubernetes_cluster - - ################################################### - # - # Global Gateway - # - ################################################### - - global_service_gateway: - type: global.service.gateway - technology: - - compose: - conditions: {logic_expression: is_local_or_development} - - kubernetes: - conditions: {node_presence: kubernetes_cluster} - properties: - - application_name: global-service-gateway - - application_port: 4000 - - application_protocol: graphql - - - logging_level: - value: info - conditions: {logic_expression: has_info_logging} - - - logging_level: - value: debug - conditions: {logic_expression: has_debug_logging} - - - domain: {get_input: retailer_name} - - - graphql_introspection: - value: true - conditions: {logic_expression: has_introspection} - - - graphql_introspection: - value: false - conditions: {not: {logic_expression: has_introspection}} - - - graphql_playground: - value: true - conditions: {logic_expression: has_playground} - - - graphql_playground: - value: false - conditions: {not: {logic_expression: has_playground}} - - - has_error_masking: - value: true - conditions: {logic_expression: has_error_masking} - - - has_error_masking: - value: false - conditions: {not: {logic_expression: has_error_masking}} - - - global_cache_redis_endpoint: {eval: '.::.requirements::[.name=cache]::.target::application_endpoint'} - - global_service_retailers_endpoint: {eval: '.::.requirements::[.name=global_service_retailers]::.target::application_endpoint'} - - global_service_products_endpoint: {eval: '.::.requirements::[.name=global_service_products]::.target::application_endpoint'} - - global_service_calibrations_endpoint: {eval: '.::.requirements::[.name=global_service_calibrations]::.target::application_endpoint'} - - global_service_account_endpoint: {eval: '.::.requirements::[.name=global_service_accounts]::.target::application_endpoint'} - requirements: - - cache: global_cache_redis - - global_service_retailers: global_service_retailers - - global_service_products: global_service_products - - global_service_calibrations: global_service_calibrations - - global_service_accounts: global_service_accounts - - host: local_docker_engine - - host: remote_docker_engine - - host: kubernetes_cluster - artifacts: - - docker_image: - type: docker.image - file: retailer.service.gateway:vX.Y.Z - - global_ingress_gateway: - type: ingress - technology: - - ansible: - conditions: {node_presence: virtual_machine} - - kubernetes: - conditions: {node_presence: kubernetes_cluster} - requirements: - - application: global_service_gateway - - host: virtual_machine - - host: kubernetes_cluster - - ################################################### - # - # Global Retailers - # - ################################################### - - global_service_retailers: - type: global.service.retailers - technology: - - compose: - conditions: {logic_expression: is_local_or_development} - - kubernetes: - conditions: {node_presence: kubernetes_cluster} - properties: - - application_name: global-service-retailers - - application_port: 4000 - - application_protocol: graphql - - logging_level: - value: info - conditions: {logic_expression: has_info_logging} - - - logging_level: - value: debug - conditions: {logic_expression: has_debug_logging} - - - global_cache_redis_endpoint: {eval: '.::.requirements::[.name=cache]::.target::application_endpoint'} - - - mysql_host: {eval: '.::.requirements::[.name=database]::.target::application_address'} - - mysql_port: {eval: '.::.requirements::[.name=database]::.target::application_port'} - - mysql_database: {eval: '.::.requirements::[.name=database]::.target::database_name'} - - mysql_user: {eval: '.::.requirements::[.name=database]::.target::database_user'} - - mysql_password: {eval: '.::.requirements::[.name=database]::.target::database_password'} - - mysql_table: 'stores' - - mysql_ssl_mode: {eval: '.::.requirements::[.name=database]::.target::.requirements::[.name=host]::.target::dbms_ssl_mode'} - - requirements: - - database: global_database_retailers - - cache: global_cache_redis - - host: local_docker_engine - - host: remote_docker_engine - - host: kubernetes_cluster - artifacts: - - docker_image: - type: docker.image - file: global.service.retailers:vX.Y.Z - - global_database_retailers: - type: mysql.database - technology: ansible - properties: - - database_name: retailers - - database_user: retailers - - database_password: {get_input: database_password} - requirements: - - host: global_dbms - - ################################################### - # - # Global Products - # - ################################################### - - global_service_products: - type: global.service.products - technology: - - compose: - conditions: {logic_expression: is_local_or_development} - - kubernetes: - conditions: {node_presence: kubernetes_cluster} - properties: - - application_name: global-service-products - - application_port: 4000 - - application_protocol: graphql - - logging_level: - value: info - conditions: {logic_expression: has_info_logging} - - - logging_level: - value: debug - conditions: {logic_expression: has_debug_logging} - - - global_cache_redis_endpoint: {eval: '.::.requirements::[.name=cache]::.target::application_endpoint'} - - - mysql_host: {eval: '.::.requirements::[.name=database]::.target::application_address'} - - mysql_port: {eval: '.::.requirements::[.name=database]::.target::application_port'} - - mysql_database: {eval: '.::.requirements::[.name=database]::.target::database_name'} - - mysql_user: {eval: '.::.requirements::[.name=database]::.target::database_user'} - - mysql_password: {eval: '.::.requirements::[.name=database]::.target::database_password'} - - mysql_table: 'stores' - - mysql_ssl_mode: {eval: '.::.requirements::[.name=database]::.target::.requirements::[.name=host]::.target::dbms_ssl_mode'} - - - storage_name: {eval: '.::.requirements::[.name=storage]::.target::storage_name'} - - storage_endpoint: {eval: '.::.requirements::[.name=storage]::.target::storage_endpoint'} - - storage_token: {eval: '.::.requirements::[.name=storage]::.target::storage_token'} - - storage_dialect: {eval: '.::.requirements::[.name=storage]::.target::storage_dialect'} - - requirements: - - database: global_database_products - - cache: global_cache_redis - - storage: global_storage_products - - host: local_docker_engine - - host: remote_docker_engine - - host: kubernetes_cluster - artifacts: - - docker_image: - type: docker.image - file: global.service.products:vX.Y.Z - - global_database_products: - type: mysql.database - technology: ansible - properties: - - database_name: products - - database_user: products - - database_password: {get_input: database_password} - requirements: - - host: global_dbms - - global_storage_products: - type: object.storage - technology: ansible - properties: - - storage_name: products - - storage_token: {get_input: storage_password} - - storage_dialect: {eval: '.::.requirements::[.name=host]::.target::storage_dialect'} - requirements: - - host: global_minio - - ################################################### - # - # Global Calibrations - # - ################################################### - - global_service_calibrations: - type: global.service.calibrations - technology: - - compose: - conditions: {logic_expression: is_local_or_development} - - kubernetes: - conditions: {node_presence: kubernetes_cluster} - properties: - - application_name: global-service-calibrations - - application_port: 4000 - - application_protocol: graphql - - logging_level: - value: info - conditions: {logic_expression: has_info_logging} - - - logging_level: - value: debug - conditions: {logic_expression: has_debug_logging} - - - global_cache_redis_endpoint: {eval: '.::.requirements::[.name=cache]::.target::application_endpoint'} - - - mysql_host: {eval: '.::.requirements::[.name=database]::.target::application_address'} - - mysql_port: {eval: '.::.requirements::[.name=database]::.target::application_port'} - - mysql_database: {eval: '.::.requirements::[.name=database]::.target::database_name'} - - mysql_user: {eval: '.::.requirements::[.name=database]::.target::database_user'} - - mysql_password: {eval: '.::.requirements::[.name=database]::.target::database_password'} - - mysql_table: 'stores' - - mysql_ssl_mode: {eval: '.::.requirements::[.name=database]::.target::.requirements::[.name=host]::.target::dbms_ssl_mode'} - - - storage_name: {eval: '.::.requirements::[.name=storage]::.target::storage_name'} - - storage_endpoint: {eval: '.::.requirements::[.name=storage]::.target::storage_endpoint'} - - storage_token: {eval: '.::.requirements::[.name=storage]::.target::storage_token'} - - storage_dialect: {eval: '.::.requirements::[.name=storage]::.target::storage_dialect'} - - requirements: - - database: global_database_calibrations - - cache: global_cache_redis - - storage: global_storage_calibrations - - host: local_docker_engine - - host: remote_docker_engine - - host: kubernetes_cluster - artifacts: - - docker_image: - type: docker.image - file: global.service.calibrations:vX.Y.Z - - global_database_calibrations: - type: mysql.database - technology: ansible - properties: - - database_name: calibrations - - database_user: calibrations - - database_password: {get_input: database_password} - requirements: - - host: global_dbms - - global_storage_calibrations: - type: object.storage - technology: ansible - properties: - - storage_name: calibrations - - storage_token: {get_input: storage_password} - - storage_dialect: {eval: '.::.requirements::[.name=host]::.target::storage_dialect'} - requirements: - - host: global_minio - - ################################################### - # - # Global Accounts - # - ################################################### - - global_service_accounts: - type: global.service.accounts - technology: - - compose: - conditions: {logic_expression: is_local_or_development} - - kubernetes: - conditions: {node_presence: kubernetes_cluster} - properties: - - application_name: global-service-accounts - - application_port: 4000 - - application_protocol: graphql - - logging_level: - value: info - conditions: {logic_expression: has_info_logging} - - - logging_level: - value: debug - conditions: {logic_expression: has_debug_logging} - - - global_cache_redis_endpoint: {eval: '.::.requirements::[.name=cache]::.target::application_endpoint'} - - - mysql_host: {eval: '.::.requirements::[.name=database]::.target::application_address'} - - mysql_port: {eval: '.::.requirements::[.name=database]::.target::application_port'} - - mysql_database: {eval: '.::.requirements::[.name=database]::.target::database_name'} - - mysql_user: {eval: '.::.requirements::[.name=database]::.target::database_user'} - - mysql_password: {eval: '.::.requirements::[.name=database]::.target::database_password'} - - mysql_table: 'stores' - - mysql_ssl_mode: {eval: '.::.requirements::[.name=database]::.target::.requirements::[.name=host]::.target::dbms_ssl_mode'} - - - email_provider_endpoint: {get_input: email_provider_endpoint} - - email_provider_token: {get_input: email_provider_token} - - - sms_provider_endpoint: {get_input: sms_provider_endpoint} - - sms_provider_token: {get_input: sms_provider_token} - requirements: - - database: global_database_accounts - - cache: global_cache_redis - - host: local_docker_engine - - host: remote_docker_engine - - host: kubernetes_cluster - artifacts: - - docker_image: - type: docker.image - file: global.service.accounts:vX.Y.Z - - global_database_accounts: - type: mysql.database - technology: ansible - properties: - - database_name: accounts - - database_user: accounts - - database_password: {get_input: database_password} - requirements: - - host: global_dbms - - ################################################### - # - # Global DBMS - # - ################################################### - - global_dbms: - type: mysql.dbms - technology: - - compose: - conditions: {logic_expression: is_local_or_development} - - kubernetes: - conditions: {node_presence: kubernetes_cluster} - properties: - - dbms_name: unfurl-technology-industry-global-dbms - - dbms_password: {get_input: dbms_password} - requirements: - - host: local_docker_engine - - host: remote_docker_engine - - host: kubernetes_cluster - artifacts: - - dbms_image: - type: dbms.image - file: 5.7 - - ################################################### - # - # Global Cache - # - ################################################### - - global_cache_redis: - type: redis.server - technology: - - compose: - conditions: {logic_expression: is_local_or_development} - - kubernetes: - conditions: {node_presence: kubernetes_cluster} - properties: - - cache_name: global-cache-redis - - cache_port: 6379 - requirements: - - host: local_docker_engine - - host: remote_docker_engine - - host: kubernetes_cluster - artifacts: - - cache_image: - type: cache.image - file: 7.4.0 - - ################################################### - # - # Global MinIO - # - ################################################### - - global_minio: - type: minio.server - technology: - - compose: - conditions: {logic_expression: is_local_or_development} - - kubernetes: - conditions: {node_presence: kubernetes_cluster} - properties: - - application_name: global-minio-server - - application_port: 9000 - - application_protocol: http - - access_key: {get_input: minio_user} - - secret_key: {get_input: minio_secret} - requirements: - - host: local_docker_engine - - host: remote_docker_engine - - host: kubernetes_cluster - artifacts: - - docker_image: - type: docker.image - file: minio/minio:RELEASE.2024-08-29T01-40-52Z - - ################################################### - # - # Retailer Dashboard - # - ################################################### - - retailer_frontend_dashboard: - type: retailer.frontend.dashboard - persistent: true - technology: - - compose: - conditions: {logic_expression: is_local_or_development} - - kubernetes: - conditions: {node_presence: kubernetes_cluster} - properties: - - application_name: retailer-frontend-dashboard - - application_port: 3000 - - application_protocol: http - - logging_level: - value: info - conditions: {logic_expression: has_info_logging} - - - logging_level: - value: debug - conditions: {logic_expression: has_debug_logging} - - - retailer_service_gateway_endpoint: {eval: '.::.requirements::[.name=retailer_service_gateway]::.target::application_endpoint'} - requirements: - - retailer_service_gateway: retailer_service_gateway - - host: local_docker_engine - - host: remote_docker_engine - - host: kubernetes_cluster - artifacts: - - docker_image: - type: docker.image - file: retailer.frontend.dashboard:vX.Y.Z - - retailer_ingress_dashboard: - type: ingress - technology: - - ansible: - conditions: {node_presence: virtual_machine} - - kubernetes: - conditions: {node_presence: kubernetes_cluster} - requirements: - - application: retailer_frontend_dashboard - - host: virtual_machine - - host: kubernetes_cluster - - ################################################### - # - # Retailer Terminal - # - ################################################### - - retailer_frontend_terminal: - type: retailer.frontend.terminal - persistent: true - technology: - - compose: - conditions: {logic_expression: is_local_or_development} - - kubernetes: - conditions: {node_presence: kubernetes_cluster} - properties: - - application_name: retailer-frontend-terminal - - application_port: 3000 - - application_protocol: http - - logging_level: - value: info - conditions: {logic_expression: has_info_logging} - - - logging_level: - value: debug - conditions: {logic_expression: has_debug_logging} - - - retailer_service_gateway_endpoint: {eval: '.::.requirements::[.name=retailer_service_gateway]::.target::application_endpoint'} - requirements: - - retailer_service_gateway: retailer_service_gateway - - host: local_docker_engine - - host: remote_docker_engine - - host: kubernetes_cluster - artifacts: - - docker_image: - type: docker.image - file: retailer.frontend.dashboard:vX.Y.Z - - retailer_ingress_terminal: - type: ingress - technology: - - ansible: - conditions: {node_presence: virtual_machine} - - kubernetes: - conditions: {node_presence: kubernetes_cluster} - requirements: - - application: retailer_frontend_terminal - - host: virtual_machine - - host: kubernetes_cluster - - ################################################### - # - # Retailer Gateway - # - ################################################### - - retailer_service_gateway: - type: retailer.service.gateway - technology: - - compose: - conditions: {logic_expression: is_local_or_development} - - kubernetes: - conditions: {node_presence: kubernetes_cluster} - properties: - - application_name: retailer-service-gateway - - application_port: 4000 - - application_protocol: graphql - - - logging_level: - value: info - conditions: {logic_expression: has_info_logging} - - - logging_level: - value: debug - conditions: {logic_expression: has_debug_logging} - - - retailer_name: {get_input: retailer_name} - - domain: {get_input: domain} - - - graphql_introspection: - value: true - conditions: {logic_expression: has_introspection} - - - graphql_introspection: - value: false - conditions: {not: {logic_expression: has_introspection}} - - - graphql_playground: - value: true - conditions: {logic_expression: has_playground} - - - graphql_playground: - value: false - conditions: {not: {logic_expression: has_playground}} - - - has_error_masking: - value: true - conditions: {logic_expression: has_error_masking} - - - has_error_masking: - value: false - conditions: {not: {logic_expression: has_error_masking}} - - - retailer_cache_redis_endpoint: {eval: '.::.requirements::[.name=cache]::.target::application_endpoint'} - - retailer_service_core_endpoint: {eval: '.::.requirements::[.name=retailer_service_core]::.target::application_endpoint'} - - retailer_service_jobs_endpoint: {eval: '.::.requirements::[.name=retailer_service_jobs]::.target::application_endpoint'} - - retailer_service_stores_endpoint: {eval: '.::.requirements::[.name=retailer_service_stores]::.target::application_endpoint'} - - retailer_service_products_endpoint: {eval: '.::.requirements::[.name=retailer_service_products]::.target::application_endpoint'} - - retailer_service_stocks_endpoint: {eval: '.::.requirements::[.name=retailer_service_stocks]::.target::application_endpoint'} - - retailer_service_orders_endpoint: {eval: '.::.requirements::[.name=retailer_service_orders]::.target::application_endpoint'} - - retailer_service_global_endpoint: {eval: '.::.requirements::[.name=retailer_service_global]::.target::application_endpoint'} - requirements: - - cache: retailer_cache_redis - - retailer_service_core: retailer_service_core - - retailer_service_jobs: retailer_service_jobs - - retailer_service_stores: retailer_service_stores - - retailer_service_products: retailer_service_products - - retailer_service_stocks: retailer_service_stocks - - retailer_service_orders: retailer_service_orders - - retailer_service_global: retailer_service_global - - host: local_docker_engine - - host: remote_docker_engine - - host: kubernetes_cluster - artifacts: - - docker_image: - type: docker.image - file: retailer.service.gateway:vX.Y.Z - - retailer_ingress_gateway: - type: ingress - technology: - - ansible: - conditions: {node_presence: virtual_machine} - - kubernetes: - conditions: {node_presence: kubernetes_cluster} - requirements: - - application: retailer_service_gateway - - host: virtual_machine - - host: kubernetes_cluster - - ################################################### - # - # Retailer Core - # - ################################################### - - retailer_service_core: - type: retailer.service.core - technology: - - compose: - conditions: {logic_expression: is_local_or_development} - - kubernetes: - conditions: {node_presence: kubernetes_cluster} - properties: - - application_name: retailer-service-core - - application_port: 4000 - - application_protocol: graphql - - logging_level: - value: info - conditions: {logic_expression: has_info_logging} - - - logging_level: - value: debug - conditions: {logic_expression: has_debug_logging} - - - retailer_cache_redis_endpoint: {eval: '.::.requirements::[.name=cache]::.target::application_endpoint'} - - - coffee_enabled: - value: true - conditions: {logic_expression: has_coffee} - - - coffee_enabled: - value: false - conditions: {not: {logic_expression: has_coffee}} - - - coffee_provider_type: - value: {get_input: coffee_provider_type} - conditions: {logic_expression: has_coffee} - - - coffee_provider_endpoint: - value: {get_input: coffee_provider_endpoint} - conditions: {logic_expression: has_coffee} - - - coffee_provider_token: - value: {get_input: coffee_provider_token} - conditions: {logic_expression: has_coffee} - - - payment_provider_endpoint: {get_input: payment_provider_endpoint} - - payment_provider_token: {get_input: payment_provider_token} - - - payment_merchant_a_enabled: - value: true - conditions: {logic_expression: has_payment_merchant_a} - - - payment_merchant_a_enabled: - value: false - conditions: {not: {logic_expression: has_payment_merchant_a}} - - - payment_merchant_b_enabled: - value: true - conditions: {logic_expression: has_payment_merchant_b} - - - payment_merchant_b_enabled: - value: false - conditions: {not: {logic_expression: has_payment_merchant_b}} - - requirements: - - cache: retailer_cache_redis - - host: local_docker_engine - - host: remote_docker_engine - - host: kubernetes_cluster - artifacts: - - docker_image: - type: docker.image - file: retailer.service.core:vX.Y.Z - - ################################################### - # - # Retailer Jobs - # - ################################################### - - retailer_service_jobs: - type: retailer.service.jobs - technology: - - compose: - conditions: {logic_expression: is_local_or_development} - - kubernetes: - conditions: {node_presence: kubernetes_cluster} - properties: - - application_name: retailer-service-core - - application_port: 4000 - - application_protocol: graphql - - logging_level: - value: info - conditions: {logic_expression: has_info_logging} - - - logging_level: - value: debug - conditions: {logic_expression: has_debug_logging} - - - retailer_cache_redis_endpoint: {eval: '.::.requirements::[.name=cache]::.target::application_endpoint'} - - requirements: - - cache: retailer_cache_redis - - host: local_docker_engine - - host: remote_docker_engine - - host: kubernetes_cluster - artifacts: - - docker_image: - type: docker.image - file: retailer.service.jobs:vX.Y.Z - - ################################################### - # - # Retailer Stores - # - ################################################### - - retailer_service_stores: - type: retailer.service.stores - technology: - - compose: - conditions: {logic_expression: is_local_or_development} - - kubernetes: - conditions: {node_presence: kubernetes_cluster} - properties: - - application_name: retailer-service-stores - - application_port: 4000 - - application_protocol: graphql - - logging_level: - value: info - conditions: {logic_expression: has_info_logging} - - - logging_level: - value: debug - conditions: {logic_expression: has_debug_logging} - - - retailer_cache_redis_endpoint: {eval: '.::.requirements::[.name=cache]::.target::application_endpoint'} - - - mysql_host: {eval: '.::.requirements::[.name=database]::.target::application_address'} - - mysql_port: {eval: '.::.requirements::[.name=database]::.target::application_port'} - - mysql_database: {eval: '.::.requirements::[.name=database]::.target::database_name'} - - mysql_user: {eval: '.::.requirements::[.name=database]::.target::database_user'} - - mysql_password: {eval: '.::.requirements::[.name=database]::.target::database_password'} - - mysql_table: 'stores' - - mysql_ssl_mode: {eval: '.::.requirements::[.name=database]::.target::.requirements::[.name=host]::.target::dbms_ssl_mode'} - - - storage_name: {eval: '.::.requirements::[.name=storage]::.target::storage_name'} - - storage_endpoint: {eval: '.::.requirements::[.name=storage]::.target::storage_endpoint'} - - storage_token: {eval: '.::.requirements::[.name=storage]::.target::storage_token'} - - storage_dialect: {eval: '.::.requirements::[.name=storage]::.target::storage_dialect'} - - requirements: - - database: retailer_database_stores - - cache: retailer_cache_redis - - storage: retailer_storage_stores - - host: local_docker_engine - - host: remote_docker_engine - - host: kubernetes_cluster - artifacts: - - docker_image: - type: docker.image - file: retailer.service.stores:vX.Y.Z - - retailer_database_stores: - type: mysql.database - technology: ansible - properties: - - database_name: stores - - database_user: stores - - database_password: {get_input: database_password} - requirements: - - host: retailer_dbms - - retailer_storage_stores: - type: object.storage - technology: ansible - properties: - - storage_name: stores - - storage_token: {get_input: storage_password} - - storage_dialect: {eval: '.::.requirements::[.name=host]::.target::storage_dialect'} - requirements: - - host: retailer_minio - - ################################################### - # - # Retailer Products - # - ################################################### - - retailer_service_products: - type: retailer.service.products - technology: - - compose: - conditions: {logic_expression: is_local_or_development} - - kubernetes: - conditions: {node_presence: kubernetes_cluster} - properties: - - application_name: retailer-service-products - - application_port: 4000 - - application_protocol: graphql - - logging_level: - value: info - conditions: {logic_expression: has_info_logging} - - - logging_level: - value: debug - conditions: {logic_expression: has_debug_logging} - - - retailer_cache_redis_endpoint: {eval: '.::.requirements::[.name=cache]::.target::application_endpoint'} - - - import_enabled: - value: true - conditions: {logic_expression: has_import} - - - import_enabled: - value: false - conditions: {not: {logic_expression: has_import}} - - - import_schema: - value: a - conditions: {logic_expression: has_import_schema_a} - - - import_schema: - value: b - conditions: {logic_expression: has_import_schema_b} - - - mysql_host: {eval: '.::.requirements::[.name=database]::.target::application_address'} - - mysql_port: {eval: '.::.requirements::[.name=database]::.target::application_port'} - - mysql_database: {eval: '.::.requirements::[.name=database]::.target::database_name'} - - mysql_user: {eval: '.::.requirements::[.name=database]::.target::database_user'} - - mysql_password: {eval: '.::.requirements::[.name=database]::.target::database_password'} - - mysql_table: 'stores' - - mysql_ssl_mode: {eval: '.::.requirements::[.name=database]::.target::.requirements::[.name=host]::.target::dbms_ssl_mode'} - - - storage_name: {eval: '.::.requirements::[.name=storage]::.target::storage_name'} - - storage_endpoint: {eval: '.::.requirements::[.name=storage]::.target::storage_endpoint'} - - storage_token: {eval: '.::.requirements::[.name=storage]::.target::storage_token'} - - storage_dialect: {eval: '.::.requirements::[.name=storage]::.target::storage_dialect'} - - requirements: - - database: retailer_database_products - - cache: retailer_cache_redis - - storage: retailer_storage_products - - host: local_docker_engine - - host: remote_docker_engine - - host: kubernetes_cluster - artifacts: - - docker_image: - type: docker.image - file: retailer.service.products:vX.Y.Z - - retailer_database_products: - type: mysql.database - technology: ansible - properties: - - database_name: products - - database_user: products - - database_password: {get_input: database_password} - requirements: - - host: retailer_dbms - - retailer_storage_products: - type: object.storage - technology: ansible - properties: - - storage_name: products - - storage_token: {get_input: storage_password} - - storage_dialect: {eval: '.::.requirements::[.name=host]::.target::storage_dialect'} - requirements: - - host: retailer_minio - - ################################################### - # - # Retailer Stocks - # - ################################################### - - retailer_service_stocks: - type: retailer.service.stocks - technology: - - compose: - conditions: {logic_expression: is_local_or_development} - - kubernetes: - conditions: {node_presence: kubernetes_cluster} - properties: - - application_name: retailer-service-stocks - - application_port: 4000 - - application_protocol: graphql - - logging_level: - value: info - conditions: {logic_expression: has_info_logging} - - - logging_level: - value: debug - conditions: {logic_expression: has_debug_logging} - - - retailer_cache_redis_endpoint: {eval: '.::.requirements::[.name=cache]::.target::application_endpoint'} - - - mysql_host: {eval: '.::.requirements::[.name=database]::.target::application_address'} - - mysql_port: {eval: '.::.requirements::[.name=database]::.target::application_port'} - - mysql_database: {eval: '.::.requirements::[.name=database]::.target::database_name'} - - mysql_user: {eval: '.::.requirements::[.name=database]::.target::database_user'} - - mysql_password: {eval: '.::.requirements::[.name=database]::.target::database_password'} - - mysql_table: 'stores' - - mysql_ssl_mode: {eval: '.::.requirements::[.name=database]::.target::.requirements::[.name=host]::.target::dbms_ssl_mode'} - requirements: - - database: retailer_database_stocks - - cache: retailer_cache_redis - - host: local_docker_engine - - host: remote_docker_engine - - host: kubernetes_cluster - artifacts: - - docker_image: - type: docker.image - file: retailer.service.stocks:vX.Y.Z - - retailer_database_stocks: - type: mysql.database - technology: ansible - properties: - - database_name: stocks - - database_user: stocks - - database_password: {get_input: database_password} - requirements: - - host: retailer_dbms - - ################################################### - # - # Retailer Orders - # - ################################################### - - retailer_service_orders: - type: retailer.service.orders - technology: - - compose: - conditions: {logic_expression: is_local_or_development} - - kubernetes: - conditions: {node_presence: kubernetes_cluster} - properties: - - application_name: retailer-service-orders - - application_port: 4000 - - application_protocol: graphql - - logging_level: - value: info - conditions: {logic_expression: has_info_logging} - - - logging_level: - value: debug - conditions: {logic_expression: has_debug_logging} - - - retailer_cache_redis_endpoint: {eval: '.::.requirements::[.name=cache]::.target::application_endpoint'} - - - mysql_host: {eval: '.::.requirements::[.name=database]::.target::application_address'} - - mysql_port: {eval: '.::.requirements::[.name=database]::.target::application_port'} - - mysql_database: {eval: '.::.requirements::[.name=database]::.target::database_name'} - - mysql_user: {eval: '.::.requirements::[.name=database]::.target::database_user'} - - mysql_password: {eval: '.::.requirements::[.name=database]::.target::database_password'} - - mysql_table: 'stores' - - mysql_ssl_mode: {eval: '.::.requirements::[.name=database]::.target::.requirements::[.name=host]::.target::dbms_ssl_mode'} - requirements: - - database: retailer_database_orders - - cache: retailer_cache_redis - - host: local_docker_engine - - host: remote_docker_engine - - host: kubernetes_cluster - artifacts: - - docker_image: - type: docker.image - file: retailer.service.stocks:vX.Y.Z - - retailer_database_orders: - type: mysql.database - technology: ansible - properties: - - database_name: orders - - database_user: orders - - database_password: {get_input: database_password} - requirements: - - host: retailer_dbms - - ################################################### - # - # Retailer Global - # - ################################################### - - retailer_service_global: - type: retailer.service.global - technology: - - compose: - conditions: {logic_expression: is_local_or_development} - - kubernetes: - conditions: {node_presence: kubernetes_cluster} - properties: - - application_name: retailer-service-global - - application_port: 4000 - - application_protocol: graphql - - logging_level: - value: info - conditions: {logic_expression: has_info_logging} - - - logging_level: - value: debug - conditions: {logic_expression: has_debug_logging} - - - retailer_cache_redis_endpoint: {eval: '.::.requirements::[.name=cache]::.target::application_endpoint'} - - - global_service_gateway_endpoint: {get_input: global_service_gateway_endpoint} - - global_service_gateway_token: {get_input: global_service_gateway_token} - requirements: - - cache: retailer_cache_redis - - host: local_docker_engine - - host: remote_docker_engine - - host: kubernetes_cluster - artifacts: - - docker_image: - type: docker.image - file: retailer.service.stocks:vX.Y.Z - - ################################################### - # - # Retailer DBMS - # - ################################################### - - retailer_dbms: - type: mysql.dbms - technology: - - compose: - conditions: {logic_expression: is_local_or_development} - - kubernetes: - conditions: {node_presence: kubernetes_cluster} - properties: - - dbms_name: unfurl-technology-industry-retailer-dbms - - dbms_password: {get_input: dbms_password} - requirements: - - host: local_docker_engine - - host: remote_docker_engine - - host: kubernetes_cluster - artifacts: - - dbms_image: - type: dbms.image - file: 5.7 - - ################################################### - # - # Retailer Cache - # - ################################################### - - retailer_cache_redis: - type: redis.server - technology: - - compose: - conditions: {logic_expression: is_local_or_development} - - kubernetes: - conditions: {node_presence: kubernetes_cluster} - properties: - - cache_name: retailer-cache-redis - - cache_port: 6379 - requirements: - - host: local_docker_engine - - host: remote_docker_engine - - host: kubernetes_cluster - artifacts: - - cache_image: - type: cache.image - file: 7.4.0 - - ################################################### - # - # Retailer MinIO - # - ################################################### - - retailer_minio: - type: minio.server - technology: - - compose: - conditions: {logic_expression: is_local_or_development} - - kubernetes: - conditions: {node_presence: kubernetes_cluster} - properties: - - application_name: retailer-minio-server - - application_port: 9000 - - application_protocol: http - - access_key: {get_input: minio_user} - - secret_key: {get_input: minio_secret} - requirements: - - host: local_docker_engine - - host: remote_docker_engine - - host: kubernetes_cluster - artifacts: - - docker_image: - type: docker.image - file: minio/minio:RELEASE.2024-08-29T01-40-52Z - - ################################################### - # - # Local Machine - # - ################################################### - - local_docker_engine: - type: docker.engine - technology: ansible - requirements: - - host: local_machine - - local_machine: - type: local.machine - conditions: {logic_expression: is_local} - - ################################################### - # - # Virtual Machine - # - ################################################### - - remote_docker_engine: - type: docker.engine - technology: ansible - requirements: - - host: virtual_machine - - virtual_machine: - type: virtual.machine - technology: terraform - properties: - - machine_name: unfurl-technology-boutique - - ports: ['80', '9100'] - - flavor: m1.medium - - network: {get_input: os_network} - - ssh_user: {get_input: os_ssh_user} - - ssh_key_name: {get_input: os_ssh_key_name} - - ssh_key_file: {get_input: os_ssh_key_file} - requirements: - - host: openstack_provider - artifacts: - - machine_image: - type: machine.image - file: Ubuntu 22.04 - - openstack_provider: - type: openstack.provider - conditions: {logic_expression: is_development} - properties: - - os_region_name: {get_input: os_region_name} - - os_auth_type: {get_input: os_auth_type} - - os_auth_url: {get_input: os_auth_url} - - os_identity_api_version: {get_input: os_identity_api_version} - - os_interface: {get_input: os_interface} - - os_application_credential_id: {get_input: os_application_credential_id} - - os_application_credential_secret: {get_input: os_application_credential_secret} - - ################################################### - # - # Kubernetes - # - ################################################### - - kubernetes_cluster: - type: kubernetes.cluster - 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 - conditions: {logic_expression: is_customer} diff --git a/examples/unfurl-technology---shop---plus-maintenance-automated/scripts/study-001.txt b/examples/unfurl-technology---shop---plus-maintenance-automated/scripts/study-001.txt deleted file mode 100644 index 0e06ef1010..0000000000 --- a/examples/unfurl-technology---shop---plus-maintenance-automated/scripts/study-001.txt +++ /dev/null @@ -1,177 +0,0 @@ - -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 │ [] │ 1 │ '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.5 │ '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.5 │ '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 │ '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' ] │ 1 │ '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' ] │ 1 │ '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.5 │ '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 │ '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' ] │ 1 │ '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' ] │ 0.5 │ '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' ] │ 0.5 │ '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' ] │ 0.5 │ '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' ] │ 0.5 │ '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 "kubernetes"' │ 1 │ 39 │ 0 │ 4 │ 108 │ -│ 2 │ 'EDMM "static"' │ 1 │ 60 │ 0 │ 6 │ 152 │ -│ 3 │ 'EDMM "static-large"' │ 1 │ 60 │ 0 │ 6 │ 152 │ -│ 4 │ 'EDMM Total' │ 4 │ 201 │ 0 │ 23 │ 530 │ -│ 5 │ 'VDMM Baseline Original' │ 1 │ 101 │ 20 │ 13 │ 279 │ -│ 6 │ 'VDMM+ Original Manual' │ 1 │ 80 │ 12 │ 13 │ 236 │ -│ 7 │ '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' │ -3 │ -100 │ 20 │ -10 │ -251 │ -│ 1 │ 'VDMM+ Original Manual - VDMM Baseline Original' │ 0 │ -21 │ -8 │ 0 │ -43 │ -│ 2 │ 'VDMM+ Original Automated - VDMM Baseline Original' │ 0 │ -21 │ -14 │ -13 │ -66 │ -└─────────┴─────────────────────────────────────────────────────┴─────────────────┴───────────────────┴─────────────────────┴─────────────────────────────────┴────────────────────────┘ - -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 │ Infinity │ 0.57 │ 0.53 │ -│ 1 │ 'VDMM+ Original Manual / VDMM Baseline Original' │ 1 │ 0.79 │ 0.6 │ 1 │ 0.85 │ -│ 2 │ 'VDMM+ Original Automated / VDMM Baseline Original' │ 1 │ 0.79 │ 0.3 │ 0 │ 0.76 │ -└─────────┴─────────────────────────────────────────────────────┴─────────────────┴───────────────────┴─────────────────────┴─────────────────────────────────┴────────────────────────┘ - -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' │ 1 │ [ 0.79, 1 ] │ [ 0.79, 1 ] │ [ 0.79, 1 ] │ 1 │ 1 │ -│ 1 │ 'kubernetes' │ 1 │ [ 0.38, 1 ] │ [ 0.38, 1 ] │ [ 0.38, 0.75 ] │ 1 │ 1 │ -│ 2 │ 'static' │ 1 │ [ 0.17, 1 ] │ [ 0.17, 1 ] │ [ 0.25, 0.92 ] │ 1 │ 1 │ -│ 3 │ 'static-large' │ 1 │ [ 0.17, 1 ] │ [ 0.17, 1 ] │ [ 0.25, 0.92 ] │ 1 │ 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 │ 38 │ 16 │ 398 │ -│ 1 │ 'VDMM+ Maintenance Manual' │ 1 │ 99 │ 23 │ 16 │ 296 │ -│ 2 │ 'VDMM+ Maintenance Automated' │ 1 │ 99 │ 9 │ 0 │ 261 │ -└─────────┴───────────────────────────────┴────────┴──────────┴────────────┴────────────────────────┴───────────────┘ - -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 │ 18 │ 3 │ 119 │ -│ 1 │ 'VDMM+ Maintenance Manual - VDMM+ Original Manual' │ 0 │ 19 │ 11 │ 3 │ 60 │ -│ 2 │ 'VDMM+ Maintenance Automated - VDMM+ Original Automated' │ 0 │ 19 │ 3 │ 0 │ 48 │ -└─────────┴──────────────────────────────────────────────────────────┴─────────────────┴───────────────────┴─────────────────────┴─────────────────────────────────┴────────────────────────┘ - -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.61 │ 1 │ 0.5 │ -│ 1 │ '(VDMM+ Maintenance Automated - VDMM+ Original Automated) / (VDMM Baseline Maintenance - VDMM Baseline Original)' │ 1 │ 0.42 │ 0.17 │ 0 │ 0.4 │ -└─────────┴───────────────────────────────────────────────────────────────────────────────────────────────────────────────────┴─────────────────┴───────────────────┴─────────────────────┴─────────────────────────────────┴────────────────────────┘ - -CAUTION: Is this case study running with the latest implementation? - diff --git a/examples/unfurl-technology---shop---plus-maintenance-automated/scripts/study-002.txt b/examples/unfurl-technology---shop---plus-maintenance-automated/scripts/study-002.txt deleted file mode 100644 index 787349b24d..0000000000 --- a/examples/unfurl-technology---shop---plus-maintenance-automated/scripts/study-002.txt +++ /dev/null @@ -1,177 +0,0 @@ - -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 │ [] │ 1 │ '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.5 │ '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.5 │ '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 │ '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' ] │ 1 │ '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' ] │ 1 │ '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.5 │ '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 │ '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' ] │ 1 │ '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' ] │ 0.5 │ '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' ] │ 0.5 │ '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' ] │ 0.5 │ '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' ] │ 0.5 │ '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 "kubernetes"' │ 1 │ 39 │ 0 │ 4 │ 108 │ -│ 2 │ 'EDMM "static"' │ 1 │ 60 │ 0 │ 6 │ 152 │ -│ 3 │ 'EDMM "static-large"' │ 1 │ 60 │ 0 │ 6 │ 152 │ -│ 4 │ 'EDMM Total' │ 4 │ 201 │ 0 │ 23 │ 530 │ -│ 5 │ 'VDMM Baseline Original' │ 1 │ 101 │ 6 │ 13 │ 265 │ -│ 6 │ 'VDMM+ Original Manual' │ 1 │ 80 │ 12 │ 13 │ 236 │ -│ 7 │ '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' │ -3 │ -100 │ 6 │ -10 │ -265 │ -│ 1 │ 'VDMM+ Original Manual - VDMM Baseline Original' │ 0 │ -21 │ 6 │ 0 │ -29 │ -│ 2 │ 'VDMM+ Original Automated - VDMM Baseline Original' │ 0 │ -21 │ 0 │ -13 │ -52 │ -└─────────┴─────────────────────────────────────────────────────┴─────────────────┴───────────────────┴─────────────────────┴─────────────────────────────────┴────────────────────────┘ - -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 │ Infinity │ 0.57 │ 0.5 │ -│ 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.8 │ -└─────────┴─────────────────────────────────────────────────────┴─────────────────┴───────────────────┴─────────────────────┴─────────────────────────────────┴────────────────────────┘ - -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' │ 1 │ [ 0.79, 1 ] │ [ 0.79, 1 ] │ [ 0.79, 1 ] │ 1 │ 1 │ -│ 1 │ 'kubernetes' │ 1 │ [ 0.38, 1 ] │ [ 0.38, 1 ] │ [ 0.38, 0.75 ] │ 1 │ 1 │ -│ 2 │ 'static' │ 1 │ [ 0.17, 1 ] │ [ 0.17, 1 ] │ [ 0.25, 0.92 ] │ 1 │ 1 │ -│ 3 │ 'static-large' │ 1 │ [ 0.17, 1 ] │ [ 0.17, 1 ] │ [ 0.25, 0.92 ] │ 1 │ 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 │ 296 │ -│ 2 │ 'VDMM+ Maintenance Automated' │ 1 │ 99 │ 9 │ 0 │ 261 │ -└─────────┴───────────────────────────────┴────────┴──────────┴────────────┴────────────────────────┴───────────────┘ - -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 │ 115 │ -│ 1 │ 'VDMM+ Maintenance Manual - VDMM+ Original Manual' │ 0 │ 19 │ 11 │ 3 │ 60 │ -│ 2 │ 'VDMM+ Maintenance Automated - VDMM+ Original Automated' │ 0 │ 19 │ 3 │ 0 │ 48 │ -└─────────┴──────────────────────────────────────────────────────────┴─────────────────┴───────────────────┴─────────────────────┴─────────────────────────────────┴────────────────────────┘ - -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.52 │ -│ 1 │ '(VDMM+ Maintenance Automated - VDMM+ Original Automated) / (VDMM Baseline Maintenance - VDMM Baseline Original)' │ 1 │ 0.42 │ 0.21 │ 0 │ 0.42 │ -└─────────┴───────────────────────────────────────────────────────────────────────────────────────────────────────────────────┴─────────────────┴───────────────────┴─────────────────────┴─────────────────────────────────┴────────────────────────┘ - -CAUTION: Is this case study running with the latest implementation? - diff --git a/examples/unfurl-technology---shop---plus-maintenance-automated/scripts/study-003.txt b/examples/unfurl-technology---shop---plus-maintenance-automated/scripts/study-003.txt deleted file mode 100644 index 7fc645a953..0000000000 --- a/examples/unfurl-technology---shop---plus-maintenance-automated/scripts/study-003.txt +++ /dev/null @@ -1,177 +0,0 @@ - -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 │ [] │ 1 │ '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.5 │ '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.5 │ '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 │ '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' ] │ 1 │ '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' ] │ 1 │ '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.5 │ '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 │ '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' ] │ 1 │ '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' ] │ 0.5 │ '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' ] │ 0.5 │ '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' ] │ 0.5 │ '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' ] │ 0.5 │ '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 "kubernetes"' │ 1 │ 39 │ 0 │ 4 │ 108 │ -│ 2 │ 'EDMM "static"' │ 1 │ 60 │ 0 │ 6 │ 152 │ -│ 3 │ 'EDMM "static-large"' │ 1 │ 60 │ 0 │ 6 │ 152 │ -│ 4 │ 'EDMM Total' │ 4 │ 201 │ 0 │ 23 │ 530 │ -│ 5 │ 'VDMM Baseline Original' │ 1 │ 101 │ 6 │ 13 │ 264 │ -│ 6 │ 'VDMM+ Original Manual' │ 1 │ 80 │ 12 │ 13 │ 236 │ -│ 7 │ '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' │ -3 │ -100 │ 6 │ -10 │ -266 │ -│ 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.25 │ 0.5 │ Infinity │ 0.57 │ 0.5 │ -│ 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' │ 1 │ [ 0.79, 1 ] │ [ 0.79, 1 ] │ [ 0.79, 1 ] │ 1 │ 1 │ -│ 1 │ 'kubernetes' │ 1 │ [ 0.38, 1 ] │ [ 0.38, 1 ] │ [ 0.38, 0.75 ] │ 1 │ 1 │ -│ 2 │ 'static' │ 1 │ [ 0.17, 1 ] │ [ 0.17, 1 ] │ [ 0.25, 0.92 ] │ 1 │ 1 │ -│ 3 │ 'static-large' │ 1 │ [ 0.17, 1 ] │ [ 0.17, 1 ] │ [ 0.25, 0.92 ] │ 1 │ 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? - diff --git a/examples/unfurl-technology---shop---plus-maintenance-automated/scripts/study-004.txt b/examples/unfurl-technology---shop---plus-maintenance-automated/scripts/study-004.txt deleted file mode 100644 index 68f301443c..0000000000 --- a/examples/unfurl-technology---shop---plus-maintenance-automated/scripts/study-004.txt +++ /dev/null @@ -1,178 +0,0 @@ - -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' ] │ 0.5 │ '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' ] │ 0.5 │ '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' ] │ 0.5 │ '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' ] │ 0.5 │ '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 │ 59 │ 17 │ 7 │ 118 │ -│ 1 │ 'EDMM "kubernetes"' │ 1 │ 57 │ 18 │ 4 │ 108 │ -│ 2 │ 'EDMM "static"' │ 1 │ 89 │ 29 │ 6 │ 152 │ -│ 3 │ 'EDMM "static-large"' │ 1 │ 89 │ 29 │ 6 │ 152 │ -│ 4 │ 'EDMM Total' │ 4 │ 294 │ 93 │ 23 │ 530 │ -│ 5 │ 'VDMM Baseline Original' │ 1 │ 147 │ 52 │ 13 │ 264 │ -│ 6 │ 'VDMM+ Original Manual' │ 1 │ 112 │ 44 │ 13 │ 236 │ -│ 7 │ 'VDMM+ Original Automated' │ 1 │ 112 │ 38 │ 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' │ -3 │ -147 │ -41 │ -10 │ -266 │ -│ 1 │ 'VDMM+ Original Manual - VDMM Baseline Original' │ 0 │ -35 │ -8 │ 0 │ -28 │ -│ 2 │ 'VDMM+ Original Automated - VDMM Baseline Original' │ 0 │ -35 │ -14 │ -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.25 │ 0.5 │ 0.56 │ 0.57 │ 0.5 │ -│ 1 │ 'VDMM+ Original Manual / VDMM Baseline Original' │ 1 │ 0.76 │ 0.85 │ 1 │ 0.89 │ -│ 2 │ 'VDMM+ Original Automated / VDMM Baseline Original' │ 1 │ 0.76 │ 0.73 │ 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' │ 1 │ [ 0, 1 ] │ [ 0, 1 ] │ [ 0, 1 ] │ 1 │ 1 │ -│ 1 │ 'kubernetes' │ 1 │ [ 0.38, 1 ] │ [ 0.38, 1 ] │ [ 0.44, 0.75 ] │ 1 │ 1 │ -│ 2 │ 'static' │ 1 │ [ 0.17, 1 ] │ [ 0.17, 1 ] │ [ 0.25, 0.92 ] │ 1 │ 1 │ -│ 3 │ 'static-large' │ 1 │ [ 0.17, 1 ] │ [ 0.17, 1 ] │ [ 0.25, 0.92 ] │ 1 │ 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 │ 213 │ 87 │ 16 │ 380 │ -│ 1 │ 'VDMM+ Maintenance Manual' │ 1 │ 137 │ 61 │ 16 │ 295 │ -│ 2 │ 'VDMM+ Maintenance Automated' │ 1 │ 137 │ 50 │ 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 │ 66 │ 35 │ 3 │ 116 │ -│ 1 │ 'VDMM+ Maintenance Manual - VDMM+ Original Manual' │ 0 │ 25 │ 17 │ 3 │ 59 │ -│ 2 │ 'VDMM+ Maintenance Automated - VDMM+ Original Automated' │ 0 │ 25 │ 12 │ 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.38 │ 0.49 │ 1 │ 0.51 │ -│ 1 │ '(VDMM+ Maintenance Automated - VDMM+ Original Automated) / (VDMM Baseline Maintenance - VDMM Baseline Original)' │ 1 │ 0.38 │ 0.34 │ 0 │ 0.43 │ -└─────────┴───────────────────────────────────────────────────────────────────────────────────────────────────────────────────┴─────────────────┴───────────────────┴─────────────────────┴─────────────────────────────────┴────────────────────────┘ - -CAUTION: Is this case study running with the latest implementation? - -COMMENT: using proposed qualities after questionnaires \ No newline at end of file diff --git a/examples/unfurl-technology---shop---plus-maintenance-automated/scripts/study-005.txt b/examples/unfurl-technology---shop---plus-maintenance-automated/scripts/study-005.txt deleted file mode 100644 index 9e60ba76fd..0000000000 --- a/examples/unfurl-technology---shop---plus-maintenance-automated/scripts/study-005.txt +++ /dev/null @@ -1,178 +0,0 @@ - -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 │ 59 │ 17 │ 7 │ 118 │ -│ 1 │ 'EDMM "kubernetes"' │ 1 │ 57 │ 18 │ 4 │ 108 │ -│ 2 │ 'EDMM "static"' │ 1 │ 89 │ 29 │ 6 │ 152 │ -│ 3 │ 'EDMM "static-large"' │ 1 │ 89 │ 29 │ 6 │ 152 │ -│ 4 │ 'EDMM Total' │ 4 │ 294 │ 93 │ 23 │ 530 │ -│ 5 │ 'VDMM Baseline Original' │ 1 │ 147 │ 52 │ 13 │ 264 │ -│ 6 │ 'VDMM+ Original Manual' │ 1 │ 112 │ 44 │ 13 │ 236 │ -│ 7 │ 'VDMM+ Original Automated' │ 1 │ 112 │ 38 │ 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' │ -3 │ -147 │ -41 │ -10 │ -266 │ -│ 1 │ 'VDMM+ Original Manual - VDMM Baseline Original' │ 0 │ -35 │ -8 │ 0 │ -28 │ -│ 2 │ 'VDMM+ Original Automated - VDMM Baseline Original' │ 0 │ -35 │ -14 │ -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.25 │ 0.5 │ 0.56 │ 0.57 │ 0.5 │ -│ 1 │ 'VDMM+ Original Manual / VDMM Baseline Original' │ 1 │ 0.76 │ 0.85 │ 1 │ 0.89 │ -│ 2 │ 'VDMM+ Original Automated / VDMM Baseline Original' │ 1 │ 0.76 │ 0.73 │ 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 │ 'kubernetes' │ 'good (1)' │ [ 'caution (0.38)', 'good (1)' ] │ [ 'caution (0.38)', 'good (1)' ] │ [ 'caution (0.44)', 'moderate (0.75)' ] │ 'good (1)' │ 'good (1)' │ -│ 2 │ 'static' │ 'good (1)' │ [ 'poor (0.17)', 'good (1)' ] │ [ 'poor (0.17)', 'good (1)' ] │ [ 'poor (0.25)', 'good (0.92)' ] │ 'good (1)' │ 'good (1)' │ -│ 3 │ '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 │ 213 │ 87 │ 16 │ 380 │ -│ 1 │ 'VDMM+ Maintenance Manual' │ 1 │ 137 │ 61 │ 16 │ 295 │ -│ 2 │ 'VDMM+ Maintenance Automated' │ 1 │ 137 │ 50 │ 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 │ 66 │ 35 │ 3 │ 116 │ -│ 1 │ 'VDMM+ Maintenance Manual - VDMM+ Original Manual' │ 0 │ 25 │ 17 │ 3 │ 59 │ -│ 2 │ 'VDMM+ Maintenance Automated - VDMM+ Original Automated' │ 0 │ 25 │ 12 │ 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.38 │ 0.49 │ 1 │ 0.51 │ -│ 1 │ '(VDMM+ Maintenance Automated - VDMM+ Original Automated) / (VDMM Baseline Maintenance - VDMM Baseline Original)' │ 1 │ 0.38 │ 0.34 │ 0 │ 0.43 │ -└─────────┴───────────────────────────────────────────────────────────────────────────────────────────────────────────────────┴─────────────────┴───────────────────┴─────────────────────┴─────────────────────────────────┴────────────────────────┘ - -CAUTION: Is this case study running with the latest implementation? - -COMMENT: added labels \ No newline at end of file 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 deleted file mode 100644 index 3a81589729..0000000000 --- a/examples/unfurl-technology---shop---plus-maintenance-automated/scripts/study-006.txt +++ /dev/null @@ -1,176 +0,0 @@ - -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-manual/.gitignore b/examples/unfurl-technology---shop---plus-maintenance-manual/.gitignore deleted file mode 100644 index 4fe5ca855c..0000000000 --- a/examples/unfurl-technology---shop---plus-maintenance-manual/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -files -lib diff --git a/examples/unfurl-technology---shop---plus-maintenance-manual/config.yaml b/examples/unfurl-technology---shop---plus-maintenance-manual/config.yaml deleted file mode 100644 index 7d1908ff1b..0000000000 --- a/examples/unfurl-technology---shop---plus-maintenance-manual/config.yaml +++ /dev/null @@ -1,3 +0,0 @@ -dependencies: - - source: ../unfurl-technology---shop---plus-maintenance-automated/lib - - source: ../unfurl-technology---shop---plus-maintenance-automated/files diff --git a/examples/unfurl-technology---shop---plus-maintenance-manual/tests/elastic/inputs.yaml b/examples/unfurl-technology---shop---plus-maintenance-manual/tests/elastic/inputs.yaml deleted file mode 100644 index bec3b0c2d5..0000000000 --- a/examples/unfurl-technology---shop---plus-maintenance-manual/tests/elastic/inputs.yaml +++ /dev/null @@ -1,4 +0,0 @@ -env: ELASTIC -tier: LARGE -optional_feature: true -premium_feature: true diff --git a/examples/unfurl-technology---shop---plus-maintenance-manual/tests/elastic/test.yaml b/examples/unfurl-technology---shop---plus-maintenance-manual/tests/elastic/test.yaml deleted file mode 100644 index 5fd8c2982d..0000000000 --- a/examples/unfurl-technology---shop---plus-maintenance-manual/tests/elastic/test.yaml +++ /dev/null @@ -1,9 +0,0 @@ -expected: ../../../unfurl-technology---shop---plus-maintenance-automated/tests/elastic/expected.yaml - -merge: - topology_template: - node_templates: - shop: - properties: - optional_feature: 'true' - premium_feature: 'true' diff --git a/examples/unfurl-technology---shop---plus-maintenance-manual/tests/kubernetes/inputs.yaml b/examples/unfurl-technology---shop---plus-maintenance-manual/tests/kubernetes/inputs.yaml deleted file mode 100644 index e23ed5dc6e..0000000000 --- a/examples/unfurl-technology---shop---plus-maintenance-manual/tests/kubernetes/inputs.yaml +++ /dev/null @@ -1,4 +0,0 @@ -env: KUBERNETES -tier: LARGE -optional_feature: true -premium_feature: true diff --git a/examples/unfurl-technology---shop---plus-maintenance-manual/tests/kubernetes/test.yaml b/examples/unfurl-technology---shop---plus-maintenance-manual/tests/kubernetes/test.yaml deleted file mode 100644 index f34d1abbc5..0000000000 --- a/examples/unfurl-technology---shop---plus-maintenance-manual/tests/kubernetes/test.yaml +++ /dev/null @@ -1,9 +0,0 @@ -expected: ../../../unfurl-technology---shop---plus-maintenance-automated/tests/kubernetes/expected.yaml - -merge: - topology_template: - node_templates: - shop: - properties: - optional_feature: 'true' - premium_feature: 'true' diff --git a/examples/unfurl-technology---shop---plus-maintenance-manual/tests/static-large/inputs.yaml b/examples/unfurl-technology---shop---plus-maintenance-manual/tests/static-large/inputs.yaml deleted file mode 100644 index 529d92201d..0000000000 --- a/examples/unfurl-technology---shop---plus-maintenance-manual/tests/static-large/inputs.yaml +++ /dev/null @@ -1,4 +0,0 @@ -env: STATIC -tier: LARGE -optional_feature: true -premium_feature: true diff --git a/examples/unfurl-technology---shop---plus-maintenance-manual/tests/static-large/test.yaml b/examples/unfurl-technology---shop---plus-maintenance-manual/tests/static-large/test.yaml deleted file mode 100644 index 9936b2942a..0000000000 --- a/examples/unfurl-technology---shop---plus-maintenance-manual/tests/static-large/test.yaml +++ /dev/null @@ -1,9 +0,0 @@ -expected: ../../../unfurl-technology---shop---plus-maintenance-automated/tests/static-large/expected.yaml - -merge: - topology_template: - node_templates: - shop: - properties: - optional_feature: 'true' - premium_feature: 'true' diff --git a/examples/unfurl-technology---shop---plus-maintenance-manual/tests/static/inputs.yaml b/examples/unfurl-technology---shop---plus-maintenance-manual/tests/static/inputs.yaml deleted file mode 100644 index 88a1a39968..0000000000 --- a/examples/unfurl-technology---shop---plus-maintenance-manual/tests/static/inputs.yaml +++ /dev/null @@ -1,4 +0,0 @@ -env: STATIC -tier: MEDIUM -optional_feature: true -premium_feature: true diff --git a/examples/unfurl-technology---shop---plus-maintenance-manual/tests/static/test.yaml b/examples/unfurl-technology---shop---plus-maintenance-manual/tests/static/test.yaml deleted file mode 100644 index e0ad68b573..0000000000 --- a/examples/unfurl-technology---shop---plus-maintenance-manual/tests/static/test.yaml +++ /dev/null @@ -1,9 +0,0 @@ -expected: ../../../unfurl-technology---shop---plus-maintenance-automated/tests/static/expected.yaml - -merge: - topology_template: - node_templates: - shop: - properties: - optional_feature: 'true' - premium_feature: 'true' 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 deleted file mode 100644 index b67a41327f..0000000000 --- a/examples/unfurl-technology---shop---plus-maintenance-manual/variable-service-template.yaml +++ /dev/null @@ -1,292 +0,0 @@ -tosca_definitions_version: tosca_variability_1_0_rc_3 - -imports: - - lib/types.yaml - -topology_template: - inputs: - database_password: - type: string - - dbms_password: - type: string - - os_network: - type: string - - os_ssh_key_name: - type: string - - os_ssh_user: - type: string - - os_ssh_key_file: - type: string - - os_region_name: - type: string - - os_auth_type: - type: string - - os_auth_url: - type: string - - os_identity_api_version: - type: string - - os_interface: - type: string - - os_application_credential_id: - type: string - - os_application_credential_secret: - type: string - - gcp_region: - type: string - - gcp_service_account_file: - type: string - - 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: - inputs: - env: - type: string - tier: - type: string - premium_feature: - type: boolean - optional_feature: - type: boolean - - node_templates: - ################################################### - # - # Shop - # - ################################################### - - shop: - type: shop.component - persistent: true - technology: - - ansible: - conditions: {equal: [{variability_input: env}, STATIC]} - - terraform: - conditions: {equal: [{variability_input: env}, ELASTIC]} - - kubernetes: - conditions: {equal: [{variability_input: env}, KUBERNETES]} - properties: - - application_name: unfurl-technology-shop - - application_protocol: http - - application_port: 3000 - - DB_NAME: shop - - DB_USERNAME: shop - - DB_PASSWORD: {get_input: database_password} - - DB_DIALECT: mysql - - DB_ADDRESS: {eval: '.::.requirements[.name=database]::.target::application_address'} - - DB_PORT: {eval: '.::.requirements[.name=database]::.target::application_port'} - - premium_feature: - value: 'true' - conditions: {equal: [{variability_input: premium_feature}, true]} - - premium_feature: - value: 'false' - conditions: {not: {equal: [{variability_input: premium_feature}, true]}} - - optional_feature: - value: 'true' - conditions: {equal: [{variability_input: optional_feature}, true]} - - optional_feature: - value: 'false' - conditions: {not: {equal: [{variability_input: optional_feature}, true]}} - requirements: - - database: database - - host: nodejs_runtime - - host: gcp_appengine - - host: kubernetes_cluster - artifacts: - - docker_image: - type: docker.image - file: ghcr.io/opentosca/opentosca-vintner-shop-demo@sha256:c6848d02b58bc8a70aa0f7ea4aa3f719951e0216468d9898b0eb47381098ef88 - conditions: {node_presence: kubernetes_cluster} - - zip_archive: - type: zip.archive - file: files/shop.source.zip - conditions: {or: [{node_presence: nodejs_runtime}, {node_presence: gcp_appengine}]} - - shop_ingress: - type: ingress - technology: - - ansible: - conditions: {equal: [{variability_input: env}, STATIC]} - - kubernetes: - conditions: {equal: [{variability_input: env}, KUBERNETES]} - requirements: - - application: shop - - host: kubernetes_cluster - - host: virtual_machine - - ################################################### - # - # Database - # - ################################################### - - database: - type: mysql.database - technology: - - ansible: - conditions: {or: [{equal: [{variability_input: env}, STATIC]}, {equal: [{variability_input: env}, KUBERNETES]}]} - - terraform: - conditions: {equal: [{variability_input: env}, ELASTIC]} - properties: - - database_name: shop - - database_user: shop - - database_password: {get_input: database_password} - requirements: - - host: mysql_dbms - - mysql_dbms: - type: mysql.dbms - technology: - - ansible: - conditions: {equal: [{variability_input: env}, STATIC]} - - terraform: - conditions: {equal: [{variability_input: env}, ELASTIC]} - - kubernetes: - conditions: {equal: [{variability_input: env}, KUBERNETES]} - properties: - - dbms_name: unfurl-technology-shop-dbms - - dbms_password: {get_input: dbms_password} - requirements: - - host: virtual_machine - - host: kubernetes_cluster - - host: gcp_cloudsql - artifacts: - - dbms_image: - type: dbms.image - file: 5.7 - - ################################################### - # - # Virtual Machine - # - ################################################### - - nodejs_runtime: - type: nodejs.runtime - technology: ansible - requirements: - - host: virtual_machine - - virtual_machine: - type: virtual.machine - technology: terraform - properties: - - machine_name: unfurl-technology-shop-vm - - image: Ubuntu 22.04 - - ports: ['80'] - - flavor: - value: m1.medium - conditions: {equal: [{variability_input: tier}, MEDIUM]} - - flavor: - value: m1.large - conditions: {equal: [{variability_input: tier}, LARGE]} - - network: {get_input: os_network} - - ssh_user: {get_input: os_ssh_user} - - ssh_key_name: {get_input: os_ssh_key_name} - - ssh_key_file: {get_input: os_ssh_key_file} - requirements: - - host: openstack_provider - artifacts: - - machine_image: - type: machine.image - file: Ubuntu 22.04 - - openstack_provider: - type: openstack.provider - conditions: {equal: [{variability_input: env}, STATIC]} - properties: - - os_region_name: {get_input: os_region_name} - - os_auth_type: {get_input: os_auth_type} - - os_auth_url: {get_input: os_auth_url} - - os_identity_api_version: {get_input: os_identity_api_version} - - os_interface: {get_input: os_interface} - - os_application_credential_id: {get_input: os_application_credential_id} - - os_application_credential_secret: {get_input: os_application_credential_secret} - - ################################################### - # - # GCP - # - ################################################### - - gcp_appengine: - type: gcp.appengine - technology: terraform - requirements: - - host: gcp_provider - - build: gcp_cloudbuild - - reporting: gcp_appenginereporting - - gcp_appenginereporting: - type: gcp.appenginereporting - technology: terraform - requirements: - - host: gcp_provider - - gcp_cloudbuild: - type: gcp.cloudbuild - technology: terraform - requirements: - - host: gcp_provider - - gcp_cloudsql: - type: gcp.cloudsql - technology: terraform - requirements: - - host: gcp_provider - - gcp_provider: - type: gcp.provider - conditions: {equal: [{variability_input: env}, ELASTIC]} - properties: - - 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: {equal: [{variability_input: env}, 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---shop---plus-original-manual/.gitignore b/examples/unfurl-technology---shop---plus-original-manual/.gitignore deleted file mode 100644 index 4fe5ca855c..0000000000 --- a/examples/unfurl-technology---shop---plus-original-manual/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -files -lib diff --git a/examples/unfurl-technology---shop---plus-original-manual/config.yaml b/examples/unfurl-technology---shop---plus-original-manual/config.yaml deleted file mode 100644 index 7d1908ff1b..0000000000 --- a/examples/unfurl-technology---shop---plus-original-manual/config.yaml +++ /dev/null @@ -1,3 +0,0 @@ -dependencies: - - source: ../unfurl-technology---shop---plus-maintenance-automated/lib - - source: ../unfurl-technology---shop---plus-maintenance-automated/files diff --git a/examples/unfurl-technology---shop---plus-original-manual/tests/elastic/inputs.yaml b/examples/unfurl-technology---shop---plus-original-manual/tests/elastic/inputs.yaml deleted file mode 100644 index ef567d7809..0000000000 --- a/examples/unfurl-technology---shop---plus-original-manual/tests/elastic/inputs.yaml +++ /dev/null @@ -1,2 +0,0 @@ -env: ELASTIC -tier: LARGE diff --git a/examples/unfurl-technology---shop---plus-original-manual/tests/elastic/test.yaml b/examples/unfurl-technology---shop---plus-original-manual/tests/elastic/test.yaml deleted file mode 100644 index 0809b1f242..0000000000 --- a/examples/unfurl-technology---shop---plus-original-manual/tests/elastic/test.yaml +++ /dev/null @@ -1 +0,0 @@ -expected: ../../../unfurl-technology---shop---plus-maintenance-automated/tests/elastic/expected.yaml diff --git a/examples/unfurl-technology---shop---plus-original-manual/tests/static-large/inputs.yaml b/examples/unfurl-technology---shop---plus-original-manual/tests/static-large/inputs.yaml deleted file mode 100644 index 1b4a81428d..0000000000 --- a/examples/unfurl-technology---shop---plus-original-manual/tests/static-large/inputs.yaml +++ /dev/null @@ -1,2 +0,0 @@ -env: STATIC -tier: LARGE diff --git a/examples/unfurl-technology---shop---plus-original-manual/tests/static-large/test.yaml b/examples/unfurl-technology---shop---plus-original-manual/tests/static-large/test.yaml deleted file mode 100644 index 6e2fed3084..0000000000 --- a/examples/unfurl-technology---shop---plus-original-manual/tests/static-large/test.yaml +++ /dev/null @@ -1 +0,0 @@ -expected: ../../../unfurl-technology---shop---plus-maintenance-automated/tests/static-large/expected.yaml diff --git a/examples/unfurl-technology---shop---plus-original-manual/tests/static/inputs.yaml b/examples/unfurl-technology---shop---plus-original-manual/tests/static/inputs.yaml deleted file mode 100644 index 62605e4eec..0000000000 --- a/examples/unfurl-technology---shop---plus-original-manual/tests/static/inputs.yaml +++ /dev/null @@ -1,2 +0,0 @@ -env: STATIC -tier: MEDIUM diff --git a/examples/unfurl-technology---shop---plus-original-manual/tests/static/test.yaml b/examples/unfurl-technology---shop---plus-original-manual/tests/static/test.yaml deleted file mode 100644 index d375ac2028..0000000000 --- a/examples/unfurl-technology---shop---plus-original-manual/tests/static/test.yaml +++ /dev/null @@ -1 +0,0 @@ -expected: ../../../unfurl-technology---shop---plus-maintenance-automated/tests/static/expected.yaml 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 deleted file mode 100644 index 813cac10e5..0000000000 --- a/examples/unfurl-technology---shop---plus-original-manual/variable-service-template.yaml +++ /dev/null @@ -1,232 +0,0 @@ -tosca_definitions_version: tosca_variability_1_0_rc_3 - -imports: - - lib/types.yaml - -topology_template: - inputs: - database_password: - type: string - - dbms_password: - type: string - - os_network: - type: string - - os_ssh_key_name: - type: string - - os_ssh_user: - type: string - - os_ssh_key_file: - type: string - - os_region_name: - type: string - - os_auth_type: - type: string - - os_auth_url: - type: string - - os_identity_api_version: - type: string - - os_interface: - type: string - - os_application_credential_id: - type: string - - os_application_credential_secret: - type: string - - gcp_region: - type: string - - gcp_service_account_file: - type: string - - gcp_project: - type: string - - variability: - inputs: - env: - type: string - tier: - type: string - - node_templates: - ################################################### - # - # Shop - # - ################################################### - - shop: - type: shop.component - persistent: true - technology: - - ansible: - conditions: {equal: [{variability_input: env}, STATIC]} - - terraform: - conditions: {equal: [{variability_input: env}, ELASTIC]} - properties: - - application_name: unfurl-technology-shop - - application_port: 3000 - - application_protocol: http - - DB_NAME: shop - - DB_USERNAME: shop - - DB_PASSWORD: {get_input: database_password} - - DB_DIALECT: mysql - - DB_ADDRESS: {eval: '.::.requirements[.name=database]::.target::application_address'} - - DB_PORT: {eval: '.::.requirements[.name=database]::.target::application_port'} - requirements: - - database: database - - host: - node: nodejs_runtime - conditions: {equal: [{variability_input: env}, STATIC]} - - host: - node: gcp_appengine - conditions: {equal: [{variability_input: env}, ELASTIC]} - artifacts: - - zip_archive: - type: zip.archive - file: files/shop.source.zip - - shop_ingress: - type: ingress - technology: ansible - requirements: - - application: shop - - host: virtual_machine - - ################################################### - # - # Database - # - ################################################### - - database: - type: mysql.database - technology: - - ansible: - conditions: {equal: [{variability_input: env}, STATIC]} - - terraform: - conditions: {equal: [{variability_input: env}, ELASTIC]} - properties: - - database_name: shop - - database_user: shop - - database_password: {get_input: database_password} - requirements: - - host: mysql_dbms - - mysql_dbms: - type: mysql.dbms - technology: - - ansible: - conditions: {equal: [{variability_input: env}, STATIC]} - - terraform: - conditions: {equal: [{variability_input: env}, ELASTIC]} - properties: - - dbms_name: unfurl-technology-shop-dbms - - dbms_password: {get_input: dbms_password} - requirements: - - host: virtual_machine - - host: gcp_cloudsql - artifacts: - - dbms_image: - type: dbms.image - file: 5.7 - - ################################################### - # - # Virtual Machine - # - ################################################### - - nodejs_runtime: - type: nodejs.runtime - technology: ansible - requirements: - - host: virtual_machine - - virtual_machine: - type: virtual.machine - technology: terraform - properties: - - machine_name: unfurl-technology-shop-vm - - image: Ubuntu 22.04 - - ports: ['80'] - - flavor: - value: m1.medium - conditions: {equal: [{variability_input: tier}, MEDIUM]} - - flavor: - value: m1.large - conditions: {equal: [{variability_input: tier}, LARGE]} - - network: {get_input: os_network} - - ssh_user: {get_input: os_ssh_user} - - ssh_key_name: {get_input: os_ssh_key_name} - - ssh_key_file: {get_input: os_ssh_key_file} - requirements: - - host: openstack_provider - artifacts: - - machine_image: - type: machine.image - file: Ubuntu 22.04 - - openstack_provider: - type: openstack.provider - conditions: {equal: [{variability_input: env}, STATIC]} - properties: - - os_region_name: {get_input: os_region_name} - - os_auth_type: {get_input: os_auth_type} - - os_auth_url: {get_input: os_auth_url} - - os_identity_api_version: {get_input: os_identity_api_version} - - os_interface: {get_input: os_interface} - - os_application_credential_id: {get_input: os_application_credential_id} - - os_application_credential_secret: {get_input: os_application_credential_secret} - - ################################################### - # - # GCP - # - ################################################### - - gcp_appengine: - type: gcp.appengine - technology: terraform - requirements: - - host: gcp_provider - - build: gcp_cloudbuild - - reporting: gcp_appenginereporting - - gcp_appenginereporting: - type: gcp.appenginereporting - technology: terraform - requirements: - - host: gcp_provider - - gcp_cloudbuild: - type: gcp.cloudbuild - technology: terraform - requirements: - - host: gcp_provider - - gcp_cloudsql: - type: gcp.cloudsql - technology: terraform - requirements: - - host: gcp_provider - - gcp_provider: - type: gcp.provider - conditions: {equal: [{variability_input: env}, ELASTIC]} - properties: - - gcp_region: {get_input: gcp_region} - - gcp_service_account_file: {get_input: gcp_service_account_file} - - gcp_project: {get_input: gcp_project} diff --git a/src/controller/study/technology.ts b/src/controller/study/technology.ts index 9baceb2430..5e756847ca 100644 --- a/src/controller/study/technology.ts +++ b/src/controller/study/technology.ts @@ -54,14 +54,9 @@ export type StudyTechnologyOptions = { * - study.yaml * - variable-service-template.yaml * - * - unfurl-technology---${options.application}---plus-maintenance-manual/ - * - variable-service-template.yaml - * * - unfurl-technology---${options.application}---plus-original-automated/ * - variable-service-template.yaml * - * - unfurl-technology---${options.application}---plus-original-manual/ - * - variable-service-template.yaml */ /** @@ -146,18 +141,6 @@ export default async function (options: StudyTechnologyOptions) { ) ) - /** - * VDMM+ Original Manual - */ - const vdmm_plus_original_manual = await stats( - 'VDMM+ Original Manual', - path.join( - examplesDir, - `unfurl-technology---${options.application}---plus-original-manual`, - 'variable-service-template.yaml' - ) - ) - /** * VDMM+ Original Automated */ @@ -174,7 +157,6 @@ export default async function (options: StudyTechnologyOptions) { ...edmm_variants_original, edmm_total_original, vdmm_baseline_original, - vdmm_plus_original_manual, vdmm_plus_original_automated, ]) @@ -190,11 +172,6 @@ export default async function (options: StudyTechnologyOptions) { */ absoluteOriginalDiff(vdmm_baseline_original, edmm_total_original), - /** - * Absolute diff of VDMM+ Original Manual to VDMM Baseline Original - */ - absoluteOriginalDiff(vdmm_plus_original_manual, vdmm_baseline_original), - /** * Absolute diff of VDMM+ Original Automated to VDMM Baseline Original */ @@ -213,11 +190,6 @@ export default async function (options: StudyTechnologyOptions) { */ relativeOriginalDiff(vdmm_baseline_original, edmm_total_original), - /** - * Relative diff of VDMM+ Original Manual to VDMM Baseline Original - */ - relativeOriginalDiff(vdmm_plus_original_manual, vdmm_baseline_original), - /** * Relative diff of VDMM+ Original Automated to VDMM Baseline Original */ @@ -283,18 +255,6 @@ export default async function (options: StudyTechnologyOptions) { ) ) - /** - * VDMM+ Maintenance Manual - */ - const vdmm_plus_maintenance_manual = await stats( - 'VDMM+ Maintenance Manual', - path.join( - examplesDir, - `unfurl-technology---${options.application}---plus-maintenance-manual`, - 'variable-service-template.yaml' - ) - ) - /** * VDMM+ Maintenance Automated */ @@ -302,7 +262,6 @@ export default async function (options: StudyTechnologyOptions) { printTable('Metrics relevant when modeling the maintenance scenario of our case study', [ vdmm_baseline_maintenance, - vdmm_plus_maintenance_manual, vdmm_plus_maintenance_automated, ]) @@ -317,11 +276,6 @@ export default async function (options: StudyTechnologyOptions) { */ const vdmm_baseline_diff = absoluteMaintenanceDiff(vdmm_baseline_maintenance, vdmm_baseline_original) - /** - * VDMM+ Manual Diff - */ - const vdmm_plus_manual_diff = absoluteMaintenanceDiff(vdmm_plus_maintenance_manual, vdmm_plus_original_manual) - /** * VDMM+ Automated Diff */ @@ -332,7 +286,6 @@ export default async function (options: StudyTechnologyOptions) { printTable('Absolute diff from original to maintained', [ vdmm_baseline_diff, - vdmm_plus_manual_diff, vdmm_plus_automated_diff, ]) @@ -342,11 +295,6 @@ export default async function (options: StudyTechnologyOptions) { * ******************************************************************************************************************/ printTable('Relative diff from the absolute diff from original to maintained', [ - /** - * Relative Diff of "VDMM+ Maintenance Manual - VDMM+ Original Manual" in contrast to "VDMM Baseline Maintenance - VDMM Baseline Original" - */ - relativeMaintenanceDiff(vdmm_plus_manual_diff, vdmm_baseline_diff), - /** * Relative Diff of "VDMM+ Maintenance Automated - VDMM+ Original Automated" in contrast to "VDMM Baseline Maintenance - VDMM Baseline Original" */