Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
C
CONF
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
UvA
CONF
Commits
acd049d1
Commit
acd049d1
authored
May 14, 2020
by
Spiros Koulouzis
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
renames
parent
ef7d6bba
Changes
32
Show whitespace changes
Inline
Side-by-side
Showing
32 changed files
with
327 additions
and
335 deletions
+327
-335
application_example_2_topologies.yaml
TOSCA/application_example_2_topologies.yaml
+10
-10
application_example_outputs.yaml
TOSCA/application_example_outputs.yaml
+10
-10
application_example_planed.yaml
TOSCA/application_example_planed.yaml
+9
-9
application_example_provisioned.yaml
TOSCA/application_example_provisioned.yaml
+10
-10
application_example_updated.yaml
TOSCA/application_example_updated.yaml
+3
-3
compute.yaml
TOSCA/compute.yaml
+1
-1
kubernetes.yaml
TOSCA/kubernetes.yaml
+1
-1
lifeWatch_vre1.yaml
TOSCA/lifeWatch_vre1.yaml
+2
-2
topology.yaml
TOSCA/topology.yaml
+1
-1
artifacts.yaml
TOSCA/types/artifacts.yaml
+1
-1
capabilities.yaml
TOSCA/types/capabilities.yaml
+4
-4
data.yml
TOSCA/types/data.yml
+2
-2
interfaces.yml
TOSCA/types/interfaces.yml
+4
-4
nodes.yaml
TOSCA/types/nodes.yaml
+31
-31
policies.yaml
TOSCA/types/policies.yaml
+6
-6
Constants.java
...rc/main/java/nl/uva/sne/drip/commons/utils/Constants.java
+6
-6
__main__.py
deployer/__main__.py
+56
-78
properties.ini
deployer/properties.ini
+11
-0
ansible_service.py
deployer/service/ansible_service.py
+13
-14
tosca_helper.py
deployer/service/tosca_helper.py
+3
-4
docker-compose-test.yml
docker-compose/docker-compose-test.yml
+1
-1
docker-compose.yml
docker-compose/docker-compose.yml
+47
-48
nginx.conf
docker-compose/nginx.conf
+33
-27
message_delete_request.json
example_messages/message_delete_request.json
+10
-10
message_delete_response.json
example_messages/message_delete_response.json
+10
-10
message_deploy_request.json
example_messages/message_deploy_request.json
+10
-10
message_example_provisioned.json
example_messages/message_example_provisioned.json
+9
-9
message_plan_request.json
example_messages/message_plan_request.json
+1
-1
message_plan_response.json
example_messages/message_plan_response.json
+9
-9
message_provision_request.json
example_messages/message_provision_request.json
+9
-9
vre_demo.ipynb
jupyter_notebooks/vre_demo.ipynb
+3
-3
test_default_api.py
sure_tosca-client_python_stubs/test/test_default_api.py
+1
-1
No files found.
TOSCA/application_example_2_topologies.yaml
View file @
acd049d1
...
...
@@ -12,7 +12,7 @@ topology_template:
interfaces
:
Standard
:
create
:
"
dumy.yaml"
type
:
"
tosca.nodes.
ARTICONF
.VM.Compute"
type
:
"
tosca.nodes.
QC
.VM.Compute"
compute_1
:
properties
:
disk_size
:
"
10000
MB"
...
...
@@ -23,11 +23,11 @@ topology_template:
interfaces
:
Standard
:
create
:
"
dumy.yaml"
type
:
"
tosca.nodes.
ARTICONF
.VM.Compute"
type
:
"
tosca.nodes.
QC
.VM.Compute"
kubernetes
:
requirements
:
-
host
:
capability
:
"
tosca.capabilities.
ARTICONF
.VM.topology"
capability
:
"
tosca.capabilities.
QC
.VM.topology"
node
:
"
topology"
relationship
:
"
tosca.relationships.HostedOn"
interfaces
:
...
...
@@ -41,14 +41,14 @@ topology_template:
delete
:
inputs
:
playbook
:
"
https://raw.githubusercontent.com/skoulouzis/CONF/develop/ansible_playbooks/k8s_delete.yaml"
type
:
"
tosca.nodes.
ARTICONF
.docker.Orchestrator.Kubernetes"
type
:
"
tosca.nodes.
QC
.docker.Orchestrator.Kubernetes"
topology
:
properties
:
domain
:
"
Frankfurt"
provider
:
"
EC2"
requirements
:
-
vm
:
capability
:
"
tosca.capabilities.
ARTICONF
.VM"
capability
:
"
tosca.capabilities.
QC
.VM"
node
:
"
compute_1"
relationship
:
"
tosca.relationships.DependsOn"
interfaces
:
...
...
@@ -73,14 +73,14 @@ topology_template:
inputs
:
code_type
:
"
SEQ"
object_type
:
"
SubTopology"
type
:
"
tosca.nodes.
ARTICONF
.VM.topology"
type
:
"
tosca.nodes.
QC
.VM.topology"
topology_1
:
properties
:
domain
:
"
Frankfurt"
provider
:
"
EC2"
requirements
:
-
vm
:
capability
:
"
tosca.capabilities.
ARTICONF
.VM"
capability
:
"
tosca.capabilities.
QC
.VM"
node
:
"
compute_1"
relationship
:
"
tosca.relationships.DependsOn"
interfaces
:
...
...
@@ -105,7 +105,7 @@ topology_template:
inputs
:
code_type
:
"
SEQ"
object_type
:
"
SubTopology"
type
:
"
tosca.nodes.
ARTICONF
.VM.topology"
type
:
"
tosca.nodes.
QC
.VM.topology"
artifacts
:
provisioned_files
:
required
:
false
...
...
@@ -116,10 +116,10 @@ topology_template:
-
"
30001:8080"
requirements
:
-
host
:
capability
:
"
tosca.capabilities.
ARTICONF
.docker.Orchestrator"
capability
:
"
tosca.capabilities.
QC
.docker.Orchestrator"
node
:
"
kubernetes"
relationship
:
"
tosca.relationships.HostedOn"
type
:
"
tosca.nodes.
ARTICONF
.Container.Application.Docker"
type
:
"
tosca.nodes.
QC
.Container.Application.Docker"
artifacts
:
image
:
file
:
"
alogo53/ws-pema-lifewatch"
...
...
TOSCA/application_example_outputs.yaml
View file @
acd049d1
...
...
@@ -11,7 +11,7 @@ topology_template:
interfaces
:
Standard
:
create
:
"
dumy.yaml"
type
:
"
tosca.nodes.
ARTICONF
.VM.Compute"
type
:
"
tosca.nodes.
QC
.VM.Compute"
compute_1
:
properties
:
disk_size
:
"
10000
MB"
...
...
@@ -22,11 +22,11 @@ topology_template:
interfaces
:
Standard
:
create
:
"
dumy.yaml"
type
:
"
tosca.nodes.
ARTICONF
.VM.Compute"
type
:
"
tosca.nodes.
QC
.VM.Compute"
kubernetes
:
requirements
:
-
host
:
capability
:
"
tosca.capabilities.
ARTICONF
.VM.topology"
capability
:
"
tosca.capabilities.
QC
.VM.topology"
node
:
"
topology"
relationship
:
"
tosca.relationships.HostedOn"
interfaces
:
...
...
@@ -40,14 +40,14 @@ topology_template:
delete
:
inputs
:
playbook
:
"
https://raw.githubusercontent.com/skoulouzis/CONF/develop/ansible_playbooks/k8s_delete.yaml"
type
:
"
tosca.nodes.
ARTICONF
.docker.Orchestrator.Kubernetes"
type
:
"
tosca.nodes.
QC
.docker.Orchestrator.Kubernetes"
topology
:
properties
:
domain
:
"
Frankfurt"
provider
:
"
EC2"
requirements
:
-
vm
:
capability
:
"
tosca.capabilities.
ARTICONF
.VM"
capability
:
"
tosca.capabilities.
QC
.VM"
node
:
"
compute_1"
relationship
:
"
tosca.relationships.DependsOn"
interfaces
:
...
...
@@ -72,14 +72,14 @@ topology_template:
inputs
:
code_type
:
"
SEQ"
object_type
:
"
SubTopology"
type
:
"
tosca.nodes.
ARTICONF
.VM.topology"
type
:
"
tosca.nodes.
QC
.VM.topology"
topology_1
:
properties
:
domain
:
"
Frankfurt"
provider
:
"
EC2"
requirements
:
-
vm
:
capability
:
"
tosca.capabilities.
ARTICONF
.VM"
capability
:
"
tosca.capabilities.
QC
.VM"
node
:
"
compute_1"
relationship
:
"
tosca.relationships.DependsOn"
interfaces
:
...
...
@@ -104,7 +104,7 @@ topology_template:
inputs
:
code_type
:
"
SEQ"
object_type
:
"
SubTopology"
type
:
"
tosca.nodes.
ARTICONF
.VM.topology"
type
:
"
tosca.nodes.
QC
.VM.topology"
artifacts
:
provisioned_files
:
required
:
false
...
...
@@ -115,10 +115,10 @@ topology_template:
-
"
30001:8080"
requirements
:
-
host
:
capability
:
"
tosca.capabilities.
ARTICONF
.docker.Orchestrator"
capability
:
"
tosca.capabilities.
QC
.docker.Orchestrator"
node
:
"
kubernetes"
relationship
:
"
tosca.relationships.HostedOn"
type
:
"
tosca.nodes.
ARTICONF
.Container.Application.Docker"
type
:
"
tosca.nodes.
QC
.Container.Application.Docker"
artifacts
:
image
:
file
:
"
alogo53/ws-pema-lifewatch"
...
...
TOSCA/application_example_planed.yaml
View file @
acd049d1
...
...
@@ -11,7 +11,7 @@ topology_template:
interfaces
:
Standard
:
create
:
"
dumy.yaml"
type
:
"
tosca.nodes.
ARTICONF
.VM.Compute"
type
:
"
tosca.nodes.
QC
.VM.Compute"
compute_1
:
properties
:
disk_size
:
"
10000
MB"
...
...
@@ -22,11 +22,11 @@ topology_template:
interfaces
:
Standard
:
create
:
"
dumy.yaml"
type
:
"
tosca.nodes.
ARTICONF
.VM.Compute"
type
:
"
tosca.nodes.
QC
.VM.Compute"
kubernetes
:
requirements
:
-
host
:
capability
:
"
tosca.capabilities.
ARTICONF
.VM.topology"
capability
:
"
tosca.capabilities.
QC
.VM.topology"
node
:
"
topology"
relationship
:
"
tosca.relationships.HostedOn"
interfaces
:
...
...
@@ -40,18 +40,18 @@ topology_template:
delete
:
inputs
:
playbook
:
"
https://raw.githubusercontent.com/skoulouzis/CONF/develop/ansible_playbooks/k8s_delete.yaml"
type
:
"
tosca.nodes.
ARTICONF
.docker.Orchestrator.Kubernetes"
type
:
"
tosca.nodes.
QC
.docker.Orchestrator.Kubernetes"
topology
:
properties
:
domain
:
"
Frankfurt"
provider
:
"
EC2"
requirements
:
-
vm
:
capability
:
"
tosca.capabilities.
ARTICONF
.VM"
capability
:
"
tosca.capabilities.
QC
.VM"
node
:
"
compute"
relationship
:
"
tosca.relationships.DependsOn"
-
vm
:
capability
:
"
tosca.capabilities.
ARTICONF
.VM"
capability
:
"
tosca.capabilities.
QC
.VM"
node
:
"
compute_1"
relationship
:
"
tosca.relationships.DependsOn"
interfaces
:
...
...
@@ -76,7 +76,7 @@ topology_template:
inputs
:
code_type
:
"
SEQ"
object_type
:
"
SubTopology"
type
:
"
tosca.nodes.
ARTICONF
.VM.topology"
type
:
"
tosca.nodes.
QC
.VM.topology"
artifacts
:
provisioned_files
:
required
:
false
...
...
@@ -87,10 +87,10 @@ topology_template:
-
"
30001:8080"
requirements
:
-
host
:
capability
:
"
tosca.capabilities.
ARTICONF
.docker.Orchestrator"
capability
:
"
tosca.capabilities.
QC
.docker.Orchestrator"
node
:
"
kubernetes"
relationship
:
"
tosca.relationships.HostedOn"
type
:
"
tosca.nodes.
ARTICONF
.Container.Application.Docker"
type
:
"
tosca.nodes.
QC
.Container.Application.Docker"
artifacts
:
image
:
file
:
"
alogo53/ws-pema-lifewatch"
...
...
TOSCA/application_example_provisioned.yaml
View file @
acd049d1
...
...
@@ -11,7 +11,7 @@ topology_template:
interfaces
:
Standard
:
create
:
"
dumy.yaml"
type
:
"
tosca.nodes.
ARTICONF
.VM.Compute"
type
:
"
tosca.nodes.
QC
.VM.Compute"
attributes
:
user_key_pair
:
protocol
:
"
ssh"
...
...
@@ -37,7 +37,7 @@ topology_template:
interfaces
:
Standard
:
create
:
"
dumy.yaml"
type
:
"
tosca.nodes.
ARTICONF
.VM.Compute"
type
:
"
tosca.nodes.
QC
.VM.Compute"
attributes
:
user_key_pair
:
protocol
:
"
ssh"
...
...
@@ -56,7 +56,7 @@ topology_template:
kubernetes
:
requirements
:
-
host
:
capability
:
"
tosca.capabilities.
ARTICONF
.VM.topology"
capability
:
"
tosca.capabilities.
QC
.VM.topology"
node
:
"
topology"
relationship
:
"
tosca.relationships.HostedOn"
interfaces
:
...
...
@@ -73,18 +73,18 @@ topology_template:
inputs
:
playbook
:
"
k8s_delete.yaml"
repository
:
https://github.com/QCAPI-DRIP/playbooks.git
type
:
"
tosca.nodes.
ARTICONF
.docker.Orchestrator.Kubernetes"
type
:
"
tosca.nodes.
QC
.docker.Orchestrator.Kubernetes"
topology
:
properties
:
domain
:
"
Frankfurt"
provider
:
"
EC2"
requirements
:
-
vm
:
capability
:
"
tosca.capabilities.
ARTICONF
.VM"
capability
:
"
tosca.capabilities.
QC
.VM"
node
:
"
compute"
relationship
:
"
tosca.relationships.DependsOn"
-
vm
:
capability
:
"
tosca.capabilities.
ARTICONF
.VM"
capability
:
"
tosca.capabilities.
QC
.VM"
node
:
"
compute_1"
relationship
:
"
tosca.relationships.DependsOn"
interfaces
:
...
...
@@ -109,7 +109,7 @@ topology_template:
inputs
:
code_type
:
"
SEQ"
object_type
:
"
SubTopology"
type
:
"
tosca.nodes.
ARTICONF
.VM.topology"
type
:
"
tosca.nodes.
QC
.VM.topology"
attributes
:
credential
:
cloud_provider_name
:
"
EC2"
...
...
@@ -123,7 +123,7 @@ topology_template:
provisioned_files
:
file_ext
:
"
zip"
file_contents
:
"
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"
type
:
"
tosca.datatypes.
ARTICONF
.encodedFile"
type
:
"
tosca.datatypes.
QC
.encodedFile"
encoding
:
"
base64"
ws-pema
:
properties
:
...
...
@@ -131,10 +131,10 @@ topology_template:
-
"
30001:8080"
requirements
:
-
host
:
capability
:
"
tosca.capabilities.
ARTICONF
.docker.Orchestrator"
capability
:
"
tosca.capabilities.
QC
.docker.Orchestrator"
node
:
"
kubernetes"
relationship
:
"
tosca.relationships.HostedOn"
type
:
"
tosca.nodes.
ARTICONF
.Container.Application.Docker"
type
:
"
tosca.nodes.
QC
.Container.Application.Docker"
artifacts
:
image
:
file
:
"
alogo53/ws-pema-lifewatch"
...
...
TOSCA/application_example_updated.yaml
View file @
acd049d1
...
...
@@ -18,7 +18,7 @@ topology_template:
node_templates
:
mongo
:
type
:
tosca.nodes.
ARTICONF
.Container.Application.Docker
type
:
tosca.nodes.
QC
.Container.Application.Docker
properties
:
ports
:
-
"
30001:27017"
...
...
@@ -67,13 +67,13 @@ topology_template:
policies
:
-
scalability
:
type
:
tosca.policies.
ARTICONF
.Performance.CPU
type
:
tosca.policies.
QC
.Performance.CPU
targets
:
[
mongo
]
properties
:
constraint_name
:
cpu_load
max_value
:
90
-
faultTolerance
:
type
:
tosca.policies.
ARTICONF
.FaultTolerance
type
:
tosca.policies.
QC
.FaultTolerance
targets
:
[
mongo
]
properties
:
level
:
1
TOSCA/compute.yaml
View file @
acd049d1
...
...
@@ -17,7 +17,7 @@ topology_template:
num_cores
:
2
os
:
Ubuntu 18.04
user_name
:
vm_user
type
:
tosca.nodes.
ARTICONF
.VM.Compute
type
:
tosca.nodes.
QC
.VM.Compute
...
...
TOSCA/kubernetes.yaml
View file @
acd049d1
...
...
@@ -13,7 +13,7 @@ topology_template:
delete
:
inputs
:
playbook
:
"
https://raw.githubusercontent.com/skoulouzis/CONF/develop/ansible_playbooks/k8s_delete.yaml"
type
:
"
tosca.nodes.
ARTICONF
.docker.Orchestrator.Kubernetes"
type
:
"
tosca.nodes.
QC
.docker.Orchestrator.Kubernetes"
description
:
"
TOSCA
example"
imports
:
-
nodes
:
"
https://raw.githubusercontent.com/skoulouzis/DRIP/develop/TOSCA/types/nodes.yaml"
...
...
TOSCA/lifeWatch_vre1.yaml
View file @
acd049d1
...
...
@@ -18,7 +18,7 @@ topology_template:
node_templates
:
ws-pema
:
type
:
tosca.nodes.
ARTICONF
.Container.Application.Docker
type
:
tosca.nodes.
QC
.Container.Application.Docker
properties
:
ports
:
-
"
30001:8080"
...
...
@@ -59,7 +59,7 @@ topology_template:
topology
:
type
:
tosca.nodes.
ARTICONF
.VM.topology
type
:
tosca.nodes.
QC
.VM.topology
interfaces
:
CloudsStorm
:
provision
:
...
...
TOSCA/topology.yaml
View file @
acd049d1
...
...
@@ -17,5 +17,5 @@ topology_template:
properties
:
domain
:
Frankfurt
provider
:
EC2
type
:
tosca.nodes.
ARTICONF
.VM.topology
type
:
tosca.nodes.
QC
.VM.topology
tosca_definitions_version
:
tosca_simple_yaml_1_0
TOSCA/types/artifacts.yaml
View file @
acd049d1
...
...
@@ -3,7 +3,7 @@ tosca_definitions_version: tosca_simple_yaml_1_0
artifacts
:
tosca.datatypes.
ARTICONF
.CloudStorm.Deployment
:
tosca.datatypes.
QC
.CloudStorm.Deployment
:
derived_from
:
tosca.artifacts.Deployment
file_contents
:
type
:
string
...
...
TOSCA/types/capabilities.yaml
View file @
acd049d1
...
...
@@ -2,28 +2,28 @@ tosca_definitions_version: tosca_simple_yaml_1_0
capability_types
:
tosca.capabilities.
ARTICONF
.docker.Orchestrator
:
tosca.capabilities.
QC
.docker.Orchestrator
:
derived_from
:
tosca.capabilities.Container
properties
:
some_properties
:
type
:
string
required
:
no
tosca.capabilities.
ARTICONF
.VM
:
tosca.capabilities.
QC
.VM
:
derived_from
:
tosca.capabilities.Compute
properties
:
some_properties
:
type
:
string
required
:
no
tosca.capabilities.
ARTICONF
.VM.topology
:
tosca.capabilities.
QC
.VM.topology
:
derived_from
:
tosca.capabilities.Compute
properties
:
some_properties
:
type
:
string
required
:
no
tosca.capabilities.
ARTICONF
.Useless
:
tosca.capabilities.
QC
.Useless
:
properties
:
some_properties
:
type
:
string
...
...
TOSCA/types/data.yml
View file @
acd049d1
...
...
@@ -3,7 +3,7 @@ tosca_definitions_version: tosca_simple_yaml_1_0
data_types
:
tosca.datatypes.
ARTICONF
.Credential
:
tosca.datatypes.
QC
.Credential
:
derived_from
:
tosca.datatypes.Credential
properties
:
cloud_provider_name
:
...
...
@@ -11,7 +11,7 @@ data_types:
required
:
true
tosca.datatypes.
ARTICONF
.coordinates
:
tosca.datatypes.
QC
.coordinates
:
derived_from
:
tosca.datatypes.Root
properties
:
longitude
:
...
...
TOSCA/types/interfaces.yml
View file @
acd049d1
tosca_definitions_version
:
tosca_simple_yaml_1_0
interface_types
:
tosca.interfaces.
ARTICONF
.CloudsStorm
:
tosca.interfaces.
QC
.CloudsStorm
:
description
:
Interface for VM topology management with CloudsStorm. More at https://cloudsstorm.github.io/
derived_from
:
tosca.interfaces.node.lifecycle.Standard
inputs
:
...
...
@@ -62,7 +62,7 @@ interface_types:
description
:
Provision the defined objects (resources). ObjectType can be SubTopology or VM.
tosca.interfaces.
ARTICONF
.Standard
:
tosca.interfaces.
QC
.Standard
:
derived_from
:
tosca.interfaces.node.lifecycle.Standard
inputs
:
inventory_file
:
...
...
@@ -75,8 +75,8 @@ interface_types:
type
:
string
required
:
false
tosca.interfaces.
ARTICONF
.Kubernetes
:
derived_from
:
tosca.interfaces.
ARTICONF
.Standard
tosca.interfaces.
QC
.Kubernetes
:
derived_from
:
tosca.interfaces.
QC
.Standard
inputs
:
replicas
:
type
:
integer
...
...
TOSCA/types/nodes.yaml
View file @
acd049d1
...
...
@@ -2,7 +2,7 @@ tosca_definitions_version: tosca_simple_yaml_1_0
node_types
:
tosca.nodes.
ARTICONF
.Root
:
tosca.nodes.
QC
.Root
:
description
:
root ARTICONF node
attributes
:
current_state
:
...
...
@@ -15,8 +15,8 @@ node_types:
description
:
the current state of the node
tosca.nodes.
ARTICONF
.Container.Application.Docker
:
derived_from
:
tosca.nodes.
ARTICONF
.Application
tosca.nodes.
QC
.Container.Application.Docker
:
derived_from
:
tosca.nodes.
QC
.Application
description
:
description of container
properties
:
ports
:
...
...
@@ -41,8 +41,8 @@ node_types:
required
:
false
requirements
:
-
host
:
capability
:
tosca.capabilities.
ARTICONF
.docker.Orchestrator
node
:
tosca.nodes.
ARTICONF
.docker.Orchestrator
capability
:
tosca.capabilities.
QC
.docker.Orchestrator
node
:
tosca.nodes.
QC
.docker.Orchestrator
relationship
:
tosca.relationships.HostedOn
attributes
:
service_url
:
...
...
@@ -51,7 +51,7 @@ node_types:
description
:
url of the service
interfaces
:
Kubernetes
:
type
:
tosca.interfaces.
ARTICONF
.Kubernetes
type
:
tosca.interfaces.
QC
.Kubernetes
delete
:
inputs
:
repository
:
https://github.com/skoulouzis/playbooks.git
...
...
@@ -83,17 +83,17 @@ node_types:
tosca.nodes.
ARTICONF
.docker.Orchestrator
:
derived_from
:
tosca.nodes.
ARTICONF
.Application
tosca.nodes.
QC
.docker.Orchestrator
:
derived_from
:
tosca.nodes.
QC
.Application
description
:
a container orchestrator
requirements
:
-
host
:
capability
:
tosca.capabilities.
ARTICONF
.VM.topology
node
:
tosca.nodes.
ARTICONF
.VM.topology
capability
:
tosca.capabilities.
QC
.VM.topology
node
:
tosca.nodes.
QC
.VM.topology
relationship
:
tosca.relationships.HostedOn
capabilities
:
orchestrator
:
type
:
tosca.capabilities.
ARTICONF
.docker.Orchestrator
type
:
tosca.capabilities.
QC
.docker.Orchestrator
host
:
type
:
tosca.capabilities.Container.Docker
container
:
...
...
@@ -113,8 +113,8 @@ node_types:
-
greater_or_equal
:
1
tosca.nodes.
ARTICONF
.docker.Orchestrator.Kubernetes
:
derived_from
:
tosca.nodes.
ARTICONF
.docker.Orchestrator
tosca.nodes.
QC
.docker.Orchestrator.Kubernetes
:
derived_from
:
tosca.nodes.
QC
.docker.Orchestrator
description
:
Kubernetes orchestrator
attributes
:
tokens
:
...
...
@@ -129,7 +129,7 @@ node_types:
description
:
the dashboard access url
interfaces
:
Standard
:
type
:
tosca.interfaces.
ARTICONF
.Standard
type
:
tosca.interfaces.
QC
.Standard
create
:
inputs
:
repository
:
https://github.com/skoulouzis/playbooks.git
...
...
@@ -151,19 +151,19 @@ node_types:
-
k8s_delete.yaml
tosca.nodes.
ARTICONF
.VM.topology
:
derived_from
:
tosca.nodes.
ARTICONF
.Infrastructure
tosca.nodes.
QC
.VM.topology
:
derived_from
:
tosca.nodes.
QC
.Infrastructure
description
:
topology of VMs
requirements
:
-
vm
:
capability
:
tosca.capabilities.
ARTICONF
.VM
node
:
tosca.nodes.
ARTICONF
.Infrastructure
capability
:
tosca.capabilities.
QC
.VM
node
:
tosca.nodes.
QC
.Infrastructure
relationship
:
tosca.relationships.DependsOn
capabilities
:
scalable
:
type
:
tosca.capabilities.Scalable
topology
:
type
:
tosca.capabilities.
ARTICONF
.VM.topology
type
:
tosca.capabilities.
QC
.VM.topology
properties
:
name
:
type
:
string
...
...
@@ -184,12 +184,12 @@ node_types:
default
:
"
EC2"
description
:
The name of the provider e.g. EC2, ExoGENI etc.
coordinates
:
type
:
tosca.datatypes.
ARTICONF
.coordinates
type
:
tosca.datatypes.
QC
.coordinates
required
:
false
description
:
The coordinates of the domain
attributes
:
ssh_keys
:
type
:
tosca.datatypes.
ARTICONF
.Credential
type
:
tosca.datatypes.
QC
.Credential
required
:
false
artifacts
:
provisioned_files
:
...
...
@@ -197,7 +197,7 @@ node_types:
required
:
false
interfaces
:
CloudsStorm
:
type
:
tosca.interfaces.
ARTICONF
.CloudsStorm
type
:
tosca.interfaces.
QC
.CloudsStorm
provision
:
inputs
:
code_type
:
SEQ
...
...
@@ -219,12 +219,12 @@ node_types:
code_type
:
SEQ
object_type
:
SubTopology
tosca.nodes.
ARTICONF
.VM.Compute
:
derived_from
:
tosca.nodes.
ARTICONF
.Infrastructure
tosca.nodes.
QC
.VM.Compute
:
derived_from
:
tosca.nodes.
QC
.Infrastructure
description
:
vm
capabilities
:
compute
:
type
:
tosca.capabilities.
ARTICONF
.VM
type
:
tosca.capabilities.
QC
.VM
properties
:
num_cores
:
type
:
integer
...
...
@@ -283,17 +283,17 @@ node_types:
required
:
true
default
:
"
vm"
root_key_pair
:
type
:
tosca.datatypes.
ARTICONF
.Credential
type
:
tosca.datatypes.
QC
.Credential
required
:
false
user_key_pair
:
type
:
tosca.datatypes.
ARTICONF
.Credential
type
:
tosca.datatypes.
QC
.Credential
required
:
false
interfaces
:
Standard
:
create
:
dumy.yaml
tosca.nodes.
ARTICONF
.Infrastructure
:
derived_from
:
tosca.nodes.
ARTICONF
.Root
tosca.nodes.
QC
.Infrastructure
:
derived_from
:
tosca.nodes.
QC
.Root
description
:
Base infrastructure node
capabilities
:
compute
:
...
...
@@ -301,6 +301,6 @@ node_types:
node
:
type
:
tosca.capabilities.Node
tosca.nodes.
ARTICONF
.Application
:
derived_from
:
tosca.nodes.
ARTICONF
.Root
tosca.nodes.
QC
.Application
:
derived_from
:
tosca.nodes.
QC
.Root
description
:
Base application node
TOSCA/types/policies.yaml
View file @
acd049d1
...
...
@@ -2,7 +2,7 @@ tosca_definitions_version: tosca_simple_yaml_1_0
policy_types
:
tosca.policies.
ARTICONF
.Performance
:
tosca.policies.
QC
.Performance
:
derived_from
:
tosca.policies.Performance
description
:
QoS constraint
properties
:
...
...
@@ -19,19 +19,19 @@ policy_types:
required
:
false
description
:
the maximum acceptable value
tosca.policies.
ARTICONF
.Performance.CPU
:
derived_from
:
tosca.policies.
ARTICONF
.Performance
tosca.policies.
QC
.Performance.CPU
:
derived_from
:
tosca.policies.
QC
.Performance
description
:
CPU load constraint as percentage
tosca.policies.
ARTICONF
.Performance.Mem
:
tosca.policies.
QC
.Performance.Mem
:
derived_from
:
tosca.policies.Performance
description
:
Memory load constraint as percentage
tosca.policies.
ARTICONF
.Performance.Disk
:
tosca.policies.
QC
.Performance.Disk
:
derived_from
:
tosca.policies.Performance
description
:
Disk size as MB
tosca.policies.
ARTICONF
.FaultTolerance
:
tosca.policies.
QC
.FaultTolerance
:
derived_from
:
tosca.policies.Root
description
:
the level of acceptable faults
properties
:
...
...
commons/src/main/java/nl/uva/sne/drip/commons/utils/Constants.java
View file @
acd049d1
...
...
@@ -21,16 +21,16 @@ package nl.uva.sne.drip.commons.utils;
*/
public
class
Constants
{
public
static
final
String
VM_CAPABILITY
=
"tosca.capabilities.
ARTICONF
.VM"
;
public
static
final
String
VM_TYPE
=
"tosca.nodes.
ARTICONF
.VM.Compute"
;
public
static
final
String
VM_CAPABILITY
=
"tosca.capabilities.
QC
.VM"
;
public
static
final
String
VM_TYPE
=
"tosca.nodes.
QC
.VM.Compute"
;
public
static
final
String
VM_NUM_OF_CORES
=
"num_cores"
;
public
static
final
String
MEM_SIZE
=
"mem_size"
;
public
static
final
String
DISK_SIZE
=
"disk_size"
;
public
static
final
String
VM_OS
=
"os"
;
public
static
final
String
VM_TOPOLOGY
=
"tosca.nodes.
ARTICONF
.VM.topology"
;
public
static
final
String
APPLICATION_TYPE
=
"tosca.nodes.
ARTICONF
.Application"
;
public
static
final
String
CLOUD_STORM_INTERFACE
=
"tosca.interfaces.
ARTICONF
.CloudsStorm"
;
public
static
final
String
ENCODED_FILE_DATATYPE
=
"tosca.datatypes.
ARTICONF
.encodedFile"
;
public
static
final
String
VM_TOPOLOGY
=
"tosca.nodes.
QC
.VM.topology"
;
public
static
final
String
APPLICATION_TYPE
=
"tosca.nodes.
QC
.Application"
;
public
static
final
String
CLOUD_STORM_INTERFACE
=
"tosca.interfaces.
QC
.CloudsStorm"
;
public
static
final
String
ENCODED_FILE_DATATYPE
=
"tosca.datatypes.
QC
.encodedFile"
;
public
static
final
String
CLOUD_STORM_FILES_ZIP_SUFIX
=
"cloudStromFiles.zip"
;
public
static
enum
NODE_STATES
{
...
...
deployer/__main__.py
View file @
acd049d1
# To change this license header, choose License Headers in Project Properties.
# To change this template file, choose Tools | Templates
# and open the template in the editor.
import
configparser
import
json
import
logging
import
os
import
os.path
import
sys
import
tempfile
import
time
import
logging
import
pika
import
yaml
import
sys
from
time
import
sleep
from
concurrent.futures
import
thread
from
threading
import
Thread
from
service
import
ansible_service
from
time
import
sleep
from
service.deploy_service
import
DeployService
from
service.tosca_helper
import
ToscaHelper
import
pika
import
sure_tosca_client
import
yaml
logger
=
logging
.
getLogger
(
__name__
)
...
...
@@ -31,14 +30,7 @@ done = False
# logger.handler_set = True
def
init_chanel
(
args
):
global
rabbitmq_host
if
len
(
args
)
>
1
:
rabbitmq_host
=
args
[
1
]
queue_name
=
args
[
2
]
# deployer
else
:
rabbitmq_host
=
'127.0.0.1'
def
init_chanel
(
rabbitmq_host
,
queue_name
):
connection
=
pika
.
BlockingConnection
(
pika
.
ConnectionParameters
(
host
=
rabbitmq_host
))
channel
=
connection
.
channel
()
channel
.
queue_declare
(
queue
=
queue_name
)
...
...
@@ -66,12 +58,13 @@ def on_request(ch, method, props, body):
ch
.
basic_ack
(
delivery_tag
=
method
.
delivery_tag
)
def
init_sure_tosca_client
(
sure_tosca_base_path
):
configuration
=
sure_tosca_client
.
Configuration
()
sure_tosca_client
.
configuration
.
host
=
sure_tosca_base_path
api_client
=
sure_tosca_client
.
ApiClient
(
configuration
=
configuration
)
sure_tosca_client_api
=
sure_tosca_client
.
api
.
default_api
.
DefaultApi
(
api_client
=
api_client
)
# noqa: E501
return
sure_tosca_client_api
def
save_tosca_template
(
tosca_template_dict
):
tmp_path
=
tempfile
.
mkdtemp
()
tosca_template_path
=
tmp_path
+
os
.
path
.
sep
+
'toscaTemplate.yml'
with
open
(
tosca_template_path
,
'w'
)
as
outfile
:
yaml
.
dump
(
tosca_template_dict
,
outfile
,
default_flow_style
=
False
)
return
tosca_template_path
def
handle_delivery
(
message
):
...
...
@@ -85,35 +78,16 @@ def handle_delivery(message):
tosca_file_name
=
'tosca_template'
tosca_template_dict
=
parsed_json_message
[
'toscaTemplate'
]
print
(
yaml
.
dump
(
tosca_template_dict
))
sure_tosca_client
.
upload_tosca_template
()
# tosca_interfaces = tosca.get_interfaces(tosca_template_dict)
# tmp_path = tempfile.mkdtemp()
# vms = tosca.get_vms(tosca_template_dict)
# inventory_path = ansible_service.write_inventory_file(tmp_path, vms)
# paths = ansible_service.write_playbooks_from_tosca_interface(tosca_interfaces, tmp_path)
# tokens = {}
# for playbook_path in paths:
# out, err = ansible_service.run(inventory_path, playbook_path)
# api_key, join_token, discovery_token_ca_cert_hash = ansible_service.parse_api_tokens(out.decode("utf-8"))
# if api_key:
# tokens['api_key'] = api_key
# if join_token:
# tokens['join_token'] = join_token
# if discovery_token_ca_cert_hash:
# tokens['discovery_token_ca_cert_hash'] = discovery_token_ca_cert_hash
#
# ansible_playbook_path = k8s_service.write_ansible_k8s_files(tosca_template_dict, tmp_path)
# out, err = ansible_service.run(inventory_path, ansible_playbook_path)
# dashboard_token = ansible_service.parse_dashboard_tokens(out.decode("utf-8"))
# tokens['dashboard_token'] = dashboard_token
#
# tosca_template_dict = tosca.add_tokens(tokens, tosca_template_dict)
# tosca_template_dict = tosca.add_dashboard_url(k8s_service.get_dashboard_url(vms), tosca_template_dict)
# tosca_template_dict = tosca.add_service_url(k8s_service.get_service_urls(vms, tosca_template_dict),
# tosca_template_dict)
tosca_template_path
=
save_tosca_template
(
tosca_template_dict
)
tosca_helper
=
ToscaHelper
(
sure_tosca_base_url
,
tosca_template_path
)
# nodes_to_deploy = tosca_helper.get_application_nodes()
nodes_pairs
=
tosca_helper
.
get_deployment_node_pairs
()
deployService
=
DeployService
(
semaphore_base_url
=
semaphore_base_url
,
semaphore_username
=
semaphore_username
,
semaphore_password
=
semaphore_password
)
for
node_pair
in
nodes_pairs
:
deployService
.
deploy
(
node_pair
)
response
=
{
'toscaTemplate'
:
tosca_template_dict
}
output_current_milli_time
=
int
(
round
(
time
.
time
()
*
1000
))
...
...
@@ -131,21 +105,25 @@ def threaded_function(args):
if
__name__
==
"__main__"
:
logging
.
basicConfig
(
level
=
logging
.
INFO
)
if
sys
.
argv
[
1
]
==
"test_local"
:
tosca_path
=
"../TOSCA/"
input_tosca_file_path
=
tosca_path
+
'/application_example_provisioned.yaml'
with
open
(
input_tosca_file_path
)
as
f
:
# use safe_load instead load
tosca_template_json
=
yaml
.
safe_load
(
f
)
else
:
logger
.
info
(
"Input args: "
+
sys
.
argv
[
0
]
+
' '
+
sys
.
argv
[
1
]
+
' '
+
sys
.
argv
[
2
])
global
channel
,
queue_name
,
connection
,
sure_tosca_client
channel
,
connection
=
init_chanel
(
sys
.
argv
)
queue_name
=
sys
.
argv
[
2
]
sure_tosca_base_url
=
sys
.
argv
[
3
]
# "http://localhost:8081/tosca-sure/1.0.0/"
sure_tosca_client
=
init_sure_tosca_client
(
sure_tosca_base_url
)
global
channel
,
queue_name
,
connection
,
rabbitmq_host
,
sure_tosca_base_url
,
semaphore_base_url
,
semaphore_username
,
\
semaphore_password
config
=
configparser
.
ConfigParser
()
config
.
read
(
'properties.ini'
)
sure_tosca_base_url
=
config
[
'tosca-sure'
][
'base_url'
]
semaphore_base_url
=
config
[
'semaphore'
][
'base_url'
]
semaphore_username
=
config
[
'semaphore'
][
'username'
]
semaphore_password
=
config
[
'semaphore'
][
'password'
]
rabbitmq_host
=
config
[
'message_broker'
][
'host'
]
queue_name
=
config
[
'message_broker'
][
'queue_name'
]
logger
.
info
(
'Properties sure_tosca_base_url: '
+
sure_tosca_base_url
+
', semaphore_base_url: '
+
semaphore_base_url
+
', rabbitmq_host: '
+
rabbitmq_host
+
', queue_name: '
+
queue_name
)
channel
,
connection
=
init_chanel
(
rabbitmq_host
,
queue_name
)
logger
.
info
(
"Awaiting RPC requests"
)
try
:
thread
=
Thread
(
target
=
threaded_function
,
args
=
(
1
,))
...
...
deployer/properties.ini
0 → 100644
View file @
acd049d1
[tosca-sure]
base_url
=
http://localhost:8081/tosca-sure/1.0.0
[semaphore]
username
=
admin
password
=
password
base_url
=
http://localhost:3000/api
[message_broker]
host
=
localhost
queue_name
=
deployer
\ No newline at end of file
deployer/service/ansible_service.py
View file @
acd049d1
...
...
@@ -31,27 +31,27 @@ class AnsibleService:
def
execute
(
self
,
nodes_pair
):
vms
=
nodes_pair
[
0
]
orchestrator
=
nodes_pair
[
1
]
name
=
orchestrator
.
name
application
=
nodes_pair
[
1
]
name
=
application
.
name
desired_state
=
None
interfaces
=
orchestrator
.
node_template
.
interfaces
if
'current_state'
in
orchestrator
.
node_template
.
attributes
:
current_state
=
orchestrator
.
node_template
.
attributes
[
'current_state'
]
if
'desired_state'
in
orchestrator
.
node_template
.
attributes
:
desired_state
=
orchestrator
.
node_template
.
attributes
[
'desired_state'
]
interfaces
=
application
.
node_template
.
interfaces
if
'current_state'
in
application
.
node_template
.
attributes
:
current_state
=
application
.
node_template
.
attributes
[
'current_state'
]
if
'desired_state'
in
application
.
node_template
.
attributes
:
desired_state
=
application
.
node_template
.
attributes
[
'desired_state'
]
if
desired_state
:
project_id
=
self
.
semaphore_helper
.
create_project
(
orchestrator
.
name
)
project_id
=
self
.
semaphore_helper
.
create_project
(
application
.
name
)
inventory_contents
=
yaml
.
dump
(
self
.
build_yml_inventory
(
vms
),
default_flow_style
=
False
)
private_key
=
self
.
get_private_key
(
vms
)
key_id
=
self
.
semaphore_helper
.
create_ssh_key
(
orchestrator
.
name
,
project_id
,
private_key
)
inventory_id
=
self
.
semaphore_helper
.
create_inventory
(
orchestrator
.
name
,
project_id
,
key_id
,
inventory_contents
)
key_id
=
self
.
semaphore_helper
.
create_ssh_key
(
application
.
name
,
project_id
,
private_key
)
inventory_id
=
self
.
semaphore_helper
.
create_inventory
(
application
.
name
,
project_id
,
key_id
,
inventory_contents
)
if
'RUNNING'
==
desired_state
:
standard
=
interfaces
[
'Standard'
]
create
=
standard
[
'create'
]
inputs
=
create
[
'inputs'
]
git_url
=
inputs
[
'repository'
]
playbook_names
=
inputs
[
'
playbook
s'
]
playbook_names
=
inputs
[
'
resource
s'
]
for
playbook_name
in
playbook_names
:
task_id
=
self
.
run_task
(
name
,
project_id
,
key_id
,
git_url
,
inventory_id
,
playbook_name
)
if
self
.
semaphore_helper
.
get_task
(
project_id
,
task_id
)
.
status
!=
'success'
:
...
...
@@ -61,7 +61,7 @@ class AnsibleService:
configure
=
standard
[
'configure'
]
inputs
=
configure
[
'inputs'
]
git_url
=
inputs
[
'repository'
]
playbook_names
=
inputs
[
'
playbook
s'
]
playbook_names
=
inputs
[
'
resource
s'
]
for
playbook_name
in
playbook_names
:
task_id
=
self
.
run_task
(
name
,
project_id
,
key_id
,
git_url
,
inventory_id
,
playbook_name
)
if
self
.
semaphore_helper
.
get_task
(
project_id
,
task_id
)
.
status
!=
'success'
:
...
...
@@ -100,7 +100,6 @@ class AnsibleService:
def
run_task
(
self
,
name
,
project_id
,
key_id
,
git_url
,
inventory_id
,
playbook_name
):
logger
.
info
(
'project_id: '
+
str
(
project_id
)
+
' task name: '
+
str
(
name
)
+
' git url: '
+
git_url
+
' playbook: '
+
playbook_name
)
if
not
self
.
repository_id
:
self
.
repository_id
=
self
.
semaphore_helper
.
create_repository
(
name
,
project_id
,
key_id
,
git_url
)
template_id
=
self
.
semaphore_helper
.
create_template
(
project_id
,
key_id
,
inventory_id
,
self
.
repository_id
,
playbook_name
)
...
...
deployer/service/tosca_helper.py
View file @
acd049d1
...
...
@@ -36,7 +36,7 @@ class ToscaHelper:
return
interface_types
def
get_application_nodes
(
self
):
return
self
.
tosca_client
.
get_node_templates
(
self
.
doc_id
,
type_name
=
'tosca.nodes.
ARTICONF
.Application'
)
return
self
.
tosca_client
.
get_node_templates
(
self
.
doc_id
,
type_name
=
'tosca.nodes.
QC
.Application'
)
def
get_deployment_node_pairs
(
self
):
nodes_to_deploy
=
self
.
get_application_nodes
()
...
...
@@ -48,12 +48,11 @@ class ToscaHelper:
# But the topology is directly connected to the orchestrator not the VMs.
# So we explicitly get the VMs
# I don't like this solution but I can't think of something better.
if
related_node
.
node_template
.
type
==
'tosca.nodes.
ARTICONF
.VM.topology'
:
vms
=
self
.
tosca_client
.
get_node_templates
(
self
.
doc_id
,
type_name
=
'tosca.nodes.
ARTICONF
.VM.Compute'
)
if
related_node
.
node_template
.
type
==
'tosca.nodes.
QC
.VM.topology'
:
vms
=
self
.
tosca_client
.
get_node_templates
(
self
.
doc_id
,
type_name
=
'tosca.nodes.
QC
.VM.Compute'
)
related_node
=
vms
pair
=
(
related_node
,
node
)
nodes_pairs
.
append
(
pair
)
return
nodes_pairs
@
classmethod
...
...
docker-compose/docker-compose-test.yml
View file @
acd049d1
...
...
@@ -25,7 +25,7 @@ services:
-
"
3306:3306"
semaphore
:
image
:
semaphore
image
:
qcdis/docker_ansible_
semaphore
environment
:
SEMAPHORE_DB_USER
:
semaphore
SEMAPHORE_DB_PASS
:
semaphore
...
...
docker-compose/docker-compose.yml
View file @
acd049d1
version
:
'
3'
services
:
nginx
:
image
:
nginx
volumes
:
-
./nginx.conf:/etc/nginx/nginx.conf
-
./cert.pem:/etc/nginx/cert
/cert.pem
-
./privkey.pem:/etc/nginx/cert
/privkey.pem
#- ./www:/data/www
ports
:
-
"
3000
0:80"
-
"
30001
:443"
#
nginx:
#
image: nginx
#
volumes:
#
- ./nginx.conf:/etc/nginx/nginx.conf
#- ./cert.pem:/etc/nginx
/cert.pem
#- ./privkey.pem:/etc/nginx
/privkey.pem
#
#
- ./www:/data/www
#
ports:
#- "8
0:80"
#- "443
:443"
rabbit
:
image
:
rabbitmq:3.8-management
#
ports:
#
- "5671-5672:5671-5672"
#
- "15672:15672"
#
- "4369:4369"
#
- "15671:15671"
ports
:
-
"
5671-5672:5671-5672"
-
"
15672:15672"
-
"
4369:4369"
-
"
15671:15671"
mysql
:
image
:
mysql:5.6
...
...
@@ -31,7 +31,7 @@ services:
#- "3306:3306"
semaphore
:
image
:
semaphore
image
:
qcdis/docker_ansible_
semaphore
environment
:
SEMAPHORE_DB_USER
:
semaphore
SEMAPHORE_DB_PASS
:
semaphore
...
...
@@ -45,29 +45,28 @@ services:
SEMAPHORE_ADMIN
:
admin
SEMAPHORE_WEB_ROOT
:
http://0.0.0.0:3000
ports
:
-
"
3000
2
:3000"
-
"
3000:3000"
depends_on
:
-
mysql
mongo
:
image
:
mongo:4
#ports:
#- "27017:27017"
ports
:
-
"
27017:27017"
manager
:
depends_on
:
-
rabbit
-
mongo
-
sure-tosca
image
:
qcdis/manager:3.0.0
environment
:
RABBITMQ_HOST
:
rabbit
MONGO_HOST
:
mongo
SURE_TOSCA_BASE_PATH
:
http://sure-tosca:8081/tosca-sure/1.0.0
ports
:
-
"
8080:8080"
#
manager:
#
depends_on:
#
- rabbit
#
- mongo
#
- sure-tosca
#
image: qcdis/manager:3.0.0
#
environment:
#
RABBITMQ_HOST: rabbit
#
MONGO_HOST: mongo
#
SURE_TOSCA_BASE_PATH: http://sure-tosca:8081/tosca-sure/1.0.0
#
ports:
#
- "8080:8080"
sure-tosca
:
image
:
qcdis/sure-tosca:3.0.0
...
...
@@ -82,23 +81,23 @@ services:
environment
:
RABBITMQ_HOST
:
rabbit
provisioner
:
depends_on
:
-
rabbit
-
sure-tosca
image
:
qcdis/provisioner:3.0.0
environment
:
RABBITMQ_HOST
:
rabbit
SURE_TOSCA_BASE_PATH
:
http://sure-tosca:8081/tosca-sure/1.0.0
#
provisioner:
#
depends_on:
#
- rabbit
#
- sure-tosca
#
image: qcdis/provisioner:3.0.0
#
environment:
#
RABBITMQ_HOST: rabbit
#
SURE_TOSCA_BASE_PATH: http://sure-tosca:8081/tosca-sure/1.0.0
deployer
:
depends_on
:
-
rabbit
-
sure-tosca
image
:
qcdis/deployer:3.0.0
environment
:
RABBITMQ_HOST
:
rabbit
SURE_TOSCA_BASE_PATH
:
http://sure-tosca:8081/tosca-sure/1.0.0
#
deployer:
#
depends_on:
#
- rabbit
#
- sure-tosca
#
image: qcdis/deployer:3.0.0
#
environment:
#
RABBITMQ_HOST: rabbit
#
SURE_TOSCA_BASE_PATH: http://sure-tosca:8081/tosca-sure/1.0.0
docker-compose/nginx.conf
View file @
acd049d1
...
...
@@ -12,12 +12,12 @@ http {
# this is necessary for us to be able to disable request buffering in all cases
proxy_http_version
1
.1
;
upstream
semaphore
{
server
semaphore
:
3000
;
}
#
upstream semaphore {
#
server semaphore:3000;
#
}
# upstream
sure-tosca
{
# server
sure-tosca:8081
;
# upstream
manager
{
# server
manager:8080
;
# }
server
{
...
...
@@ -27,9 +27,6 @@ http {
}
server
{
# auth_basic "User's Area";
# auth_basic_user_file /etc/nginx/htpasswd;
listen
443
ssl
;
server_name
_
;
...
...
@@ -37,8 +34,8 @@ http {
add_header
Strict-Transport-Security
"max-age=31536000"
always
;
# SSL
# ssl_certificate /etc/nginx/cert
/cert.pem;
# ssl_certificate_key /etc/nginx/cert
/privkey.pem;
ssl_certificate
/etc/nginx
/cert.pem
;
ssl_certificate_key
/etc/nginx
/privkey.pem
;
# Recommendations from https://raymii.org/s/tutorials/Strong_SSL_Security_On_nginx.html
ssl_protocols
TLSv1.1
TLSv1.2
;
...
...
@@ -53,7 +50,7 @@ http {
chunked_transfer_encoding
on
;
location
/
{
proxy_pass
http://semaphore/
;
proxy_pass
http://semaphore
:3000
/
;
proxy_set_header
Host
$http_host
;
proxy_set_header
X-Real-IP
$remote_addr
;
proxy_set_header
X-Forwarded-For
$proxy_add_x_forwarded_for
;
...
...
@@ -64,17 +61,16 @@ http {
proxy_request_buffering
off
;
}
location
/api/ws
{
proxy_pass
http://semaphore/api/ws
;
proxy_http_version
1
.1
;
proxy_set_header
Upgrade
$http_upgrade
;
proxy_set_header
Connection
"upgrade"
;
proxy_set_header
Origin
""
;
}
# location /api/ws {
# proxy_pass http://semaphore:3000/api/ws;
# proxy_http_version 1.1;
# proxy_set_header Upgrade $http_upgrade;
# proxy_set_header Connection "upgrade";
# proxy_set_header Origin "";
# }
location
/
tosca-sure/1.0.0
/
{
proxy_pass
http://
sure-tosca:8081/tosca-sure/1.0.0
/
;
location
/
manger
/
{
proxy_pass
http://
manager:8080/manger
/
;
proxy_set_header
Host
$http_host
;
proxy_set_header
X-Real-IP
$remote_addr
;
proxy_set_header
X-Forwarded-For
$proxy_add_x_forwarded_for
;
...
...
@@ -85,8 +81,8 @@ http {
proxy_request_buffering
off
;
}
location
/man
ager/
{
proxy_pass
http://
/manager:8080/manager
;
location
/man
ger/swagger-ui.html
{
proxy_pass
http://
manager:8080/swagger-ui.html/
;
proxy_set_header
Host
$http_host
;
proxy_set_header
X-Real-IP
$remote_addr
;
proxy_set_header
X-Forwarded-For
$proxy_add_x_forwarded_for
;
...
...
@@ -96,7 +92,17 @@ http {
proxy_buffering
off
;
proxy_request_buffering
off
;
}
}
location
/tosca-sure/1.0.0/
{
proxy_pass
http://sure-tosca:8081/tosca-sure/1.0.0/
;
proxy_set_header
Host
$http_host
;
proxy_set_header
X-Real-IP
$remote_addr
;
proxy_set_header
X-Forwarded-For
$proxy_add_x_forwarded_for
;
proxy_set_header
X-Forwarded-Proto
$scheme
;
proxy_buffering
off
;
proxy_request_buffering
off
;
}
}
}
example_messages/message_delete_request.json
View file @
acd049d1
...
...
@@ -22,7 +22,7 @@
"create"
:
"dumy.yaml"
}
},
"type"
:
"tosca.nodes.
ARTICONF
.VM.Compute"
,
"type"
:
"tosca.nodes.
QC
.VM.Compute"
,
"attributes"
:
{
"user_key_pair"
:
{
"protocol"
:
"ssh"
,
...
...
@@ -57,7 +57,7 @@
"create"
:
"dumy.yaml"
}
},
"type"
:
"tosca.nodes.
ARTICONF
.VM.Compute"
,
"type"
:
"tosca.nodes.
QC
.VM.Compute"
,
"attributes"
:
{
"user_key_pair"
:
{
"protocol"
:
"ssh"
,
...
...
@@ -83,7 +83,7 @@
"requirements"
:
[
{
"host"
:
{
"capability"
:
"tosca.capabilities.
ARTICONF
.VM.topology"
,
"capability"
:
"tosca.capabilities.
QC
.VM.topology"
,
"node"
:
"topology"
,
"relationship"
:
"tosca.relationships.HostedOn"
}
...
...
@@ -111,7 +111,7 @@
}
}
},
"type"
:
"tosca.nodes.
ARTICONF
.docker.Orchestrator.Kubernetes"
"type"
:
"tosca.nodes.
QC
.docker.Orchestrator.Kubernetes"
},
"topology"
:
{
"properties"
:
{
...
...
@@ -121,14 +121,14 @@
"requirements"
:
[
{
"vm"
:
{
"capability"
:
"tosca.capabilities.
ARTICONF
.VM"
,
"capability"
:
"tosca.capabilities.
QC
.VM"
,
"node"
:
"compute"
,
"relationship"
:
"tosca.relationships.DependsOn"
}
},
{
"vm"
:
{
"capability"
:
"tosca.capabilities.
ARTICONF
.VM"
,
"capability"
:
"tosca.capabilities.
QC
.VM"
,
"node"
:
"compute_1"
,
"relationship"
:
"tosca.relationships.DependsOn"
}
...
...
@@ -168,7 +168,7 @@
}
}
},
"type"
:
"tosca.nodes.
ARTICONF
.VM.topology"
,
"type"
:
"tosca.nodes.
QC
.VM.topology"
,
"attributes"
:
{
"credential"
:
{
"cloud_provider_name"
:
"EC2"
,
...
...
@@ -186,7 +186,7 @@
"encoding"
:
"base64"
,
"file_contents"
:
"XXXXXXXXXXXXXXXXXx"
,
"file_ext"
:
"zip"
,
"type"
:
"tosca.datatypes.
ARTICONF
.encodedFile"
"type"
:
"tosca.datatypes.
QC
.encodedFile"
}
}
},
...
...
@@ -199,13 +199,13 @@
"requirements"
:
[
{
"host"
:
{
"capability"
:
"tosca.capabilities.
ARTICONF
.docker.Orchestrator"
,
"capability"
:
"tosca.capabilities.
QC
.docker.Orchestrator"
,
"node"
:
"kubernetes"
,
"relationship"
:
"tosca.relationships.HostedOn"
}
}
],
"type"
:
"tosca.nodes.
ARTICONF
.Container.Application.Docker"
,
"type"
:
"tosca.nodes.
QC
.Container.Application.Docker"
,
"artifacts"
:
{
"image"
:
{
"file"
:
"alogo53/ws-pema-lifewatch"
,
...
...
example_messages/message_delete_response.json
View file @
acd049d1
...
...
@@ -17,7 +17,7 @@
"create"
:
"dumy.yaml"
}
},
"type"
:
"tosca.nodes.
ARTICONF
.VM.Compute"
,
"type"
:
"tosca.nodes.
QC
.VM.Compute"
,
"attributes"
:
{
"host_name"
:
"vm0"
,
"node_type"
:
"t2.micro"
,
...
...
@@ -51,7 +51,7 @@
"create"
:
"dumy.yaml"
}
},
"type"
:
"tosca.nodes.
ARTICONF
.VM.Compute"
,
"type"
:
"tosca.nodes.
QC
.VM.Compute"
,
"attributes"
:
{
"host_name"
:
"vm1"
,
"node_type"
:
"t2.micro"
,
...
...
@@ -76,7 +76,7 @@
"requirements"
:
[
{
"host"
:
{
"capability"
:
"tosca.capabilities.
ARTICONF
.VM.topology"
,
"capability"
:
"tosca.capabilities.
QC
.VM.topology"
,
"node"
:
"topology"
,
"relationship"
:
"tosca.relationships.HostedOn"
}
...
...
@@ -104,7 +104,7 @@
}
}
},
"type"
:
"tosca.nodes.
ARTICONF
.docker.Orchestrator.Kubernetes"
"type"
:
"tosca.nodes.
QC
.docker.Orchestrator.Kubernetes"
},
"topology"
:
{
"properties"
:
{
...
...
@@ -114,14 +114,14 @@
"requirements"
:
[
{
"vm"
:
{
"capability"
:
"tosca.capabilities.
ARTICONF
.VM"
,
"capability"
:
"tosca.capabilities.
QC
.VM"
,
"node"
:
"compute"
,
"relationship"
:
"tosca.relationships.DependsOn"
}
},
{
"vm"
:
{
"capability"
:
"tosca.capabilities.
ARTICONF
.VM"
,
"capability"
:
"tosca.capabilities.
QC
.VM"
,
"node"
:
"compute_1"
,
"relationship"
:
"tosca.relationships.DependsOn"
}
...
...
@@ -161,7 +161,7 @@
}
}
},
"type"
:
"tosca.nodes.
ARTICONF
.VM.topology"
,
"type"
:
"tosca.nodes.
QC
.VM.topology"
,
"attributes"
:
{
"credential"
:
{
"cloud_provider_name"
:
"EC2"
,
...
...
@@ -178,7 +178,7 @@
"provisioned_files"
:
{
"file_ext"
:
"zip"
,
"file_contents"
:
"XXXXXXXXXXXXXXXXXXXx"
,
"type"
:
"tosca.datatypes.
ARTICONF
.encodedFile"
,
"type"
:
"tosca.datatypes.
QC
.encodedFile"
,
"encoding"
:
"base64"
}
}
...
...
@@ -192,13 +192,13 @@
"requirements"
:
[
{
"host"
:
{
"capability"
:
"tosca.capabilities.
ARTICONF
.docker.Orchestrator"
,
"capability"
:
"tosca.capabilities.
QC
.docker.Orchestrator"
,
"node"
:
"kubernetes"
,
"relationship"
:
"tosca.relationships.HostedOn"
}
}
],
"type"
:
"tosca.nodes.
ARTICONF
.Container.Application.Docker"
,
"type"
:
"tosca.nodes.
QC
.Container.Application.Docker"
,
"artifacts"
:
{
"image"
:
{
"file"
:
"alogo53/ws-pema-lifewatch"
,
...
...
example_messages/message_deploy_request.json
View file @
acd049d1
...
...
@@ -22,7 +22,7 @@
"create"
:
"dumy.yaml"
}
},
"type"
:
"tosca.nodes.
ARTICONF
.VM.Compute"
,
"type"
:
"tosca.nodes.
QC
.VM.Compute"
,
"attributes"
:
{
"user_key_pair"
:
{
"protocol"
:
"ssh"
,
...
...
@@ -57,7 +57,7 @@
"create"
:
"dumy.yaml"
}
},
"type"
:
"tosca.nodes.
ARTICONF
.VM.Compute"
,
"type"
:
"tosca.nodes.
QC
.VM.Compute"
,
"attributes"
:
{
"user_key_pair"
:
{
"protocol"
:
"ssh"
,
...
...
@@ -83,7 +83,7 @@
"requirements"
:
[
{
"host"
:
{
"capability"
:
"tosca.capabilities.
ARTICONF
.VM.topology"
,
"capability"
:
"tosca.capabilities.
QC
.VM.topology"
,
"node"
:
"topology"
,
"relationship"
:
"tosca.relationships.HostedOn"
}
...
...
@@ -121,7 +121,7 @@
}
}
},
"type"
:
"tosca.nodes.
ARTICONF
.docker.Orchestrator.Kubernetes"
,
"type"
:
"tosca.nodes.
QC
.docker.Orchestrator.Kubernetes"
,
"attributes"
:
{
"desired_state"
:
"RUNNING"
}
...
...
@@ -134,14 +134,14 @@
"requirements"
:
[
{
"vm"
:
{
"capability"
:
"tosca.capabilities.
ARTICONF
.VM"
,
"capability"
:
"tosca.capabilities.
QC
.VM"
,
"node"
:
"compute"
,
"relationship"
:
"tosca.relationships.DependsOn"
}
},
{
"vm"
:
{
"capability"
:
"tosca.capabilities.
ARTICONF
.VM"
,
"capability"
:
"tosca.capabilities.
QC
.VM"
,
"node"
:
"compute_1"
,
"relationship"
:
"tosca.relationships.DependsOn"
}
...
...
@@ -157,7 +157,7 @@
}
}
},
"type"
:
"tosca.nodes.
ARTICONF
.VM.topology"
,
"type"
:
"tosca.nodes.
QC
.VM.topology"
,
"attributes"
:
{
"credential"
:
{
"cloud_provider_name"
:
"ExoGENI"
,
...
...
@@ -175,7 +175,7 @@
"provisioned_files"
:
{
"file_ext"
:
"zip"
,
"file_contents"
:
"XXXXXXXX"
,
"type"
:
"tosca.datatypes.
ARTICONF
.encodedFile"
,
"type"
:
"tosca.datatypes.
QC
.encodedFile"
,
"encoding"
:
"base64"
}
}
...
...
@@ -189,13 +189,13 @@
"requirements"
:
[
{
"host"
:
{
"capability"
:
"tosca.capabilities.
ARTICONF
.docker.Orchestrator"
,
"capability"
:
"tosca.capabilities.
QC
.docker.Orchestrator"
,
"node"
:
"kubernetes"
,
"relationship"
:
"tosca.relationships.HostedOn"
}
}
],
"type"
:
"tosca.nodes.
ARTICONF
.Container.Application.Docker"
,
"type"
:
"tosca.nodes.
QC
.Container.Application.Docker"
,
"attributes"
:
{
"desired_state"
:
"RUNNING"
},
...
...
example_messages/message_example_provisioned.json
View file @
acd049d1
...
...
@@ -17,7 +17,7 @@
"create"
:
"dumy.yaml"
}
},
"type"
:
"tosca.nodes.
ARTICONF
.VM.Compute"
,
"type"
:
"tosca.nodes.
QC
.VM.Compute"
,
"attributes"
:
{
"user_key_pair"
:
{
"protocol"
:
"ssh"
,
...
...
@@ -52,7 +52,7 @@
"create"
:
"dumy.yaml"
}
},
"type"
:
"tosca.nodes.
ARTICONF
.VM.Compute"
,
"type"
:
"tosca.nodes.
QC
.VM.Compute"
,
"attributes"
:
{
"user_key_pair"
:
{
"protocol"
:
"ssh"
,
...
...
@@ -78,7 +78,7 @@
"requirements"
:
[
{
"host"
:
{
"capability"
:
"tosca.capabilities.
ARTICONF
.VM.topology"
,
"capability"
:
"tosca.capabilities.
QC
.VM.topology"
,
"node"
:
"topology"
,
"relationship"
:
"tosca.relationships.HostedOn"
}
...
...
@@ -103,7 +103,7 @@
}
}
},
"type"
:
"tosca.nodes.
ARTICONF
.docker.Orchestrator.Kubernetes"
"type"
:
"tosca.nodes.
QC
.docker.Orchestrator.Kubernetes"
},
"topology"
:
{
"properties"
:
{
...
...
@@ -113,14 +113,14 @@
"requirements"
:
[
{
"vm"
:
{
"capability"
:
"tosca.capabilities.
ARTICONF
.VM"
,
"capability"
:
"tosca.capabilities.
QC
.VM"
,
"node"
:
"compute"
,
"relationship"
:
"tosca.relationships.DependsOn"
}
},
{
"vm"
:
{
"capability"
:
"tosca.capabilities.
ARTICONF
.VM"
,
"capability"
:
"tosca.capabilities.
QC
.VM"
,
"node"
:
"compute_1"
,
"relationship"
:
"tosca.relationships.DependsOn"
}
...
...
@@ -160,7 +160,7 @@
}
}
},
"type"
:
"tosca.nodes.
ARTICONF
.VM.topology"
,
"type"
:
"tosca.nodes.
QC
.VM.topology"
,
"attributes"
:
{
"credential"
:
{
"cloud_provider_name"
:
"EC2"
,
...
...
@@ -183,13 +183,13 @@
"requirements"
:
[
{
"host"
:
{
"capability"
:
"tosca.capabilities.
ARTICONF
.docker.Orchestrator"
,
"capability"
:
"tosca.capabilities.
QC
.docker.Orchestrator"
,
"node"
:
"kubernetes"
,
"relationship"
:
"tosca.relationships.HostedOn"
}
}
],
"type"
:
"tosca.nodes.
ARTICONF
.Container.Application.Docker"
,
"type"
:
"tosca.nodes.
QC
.Container.Application.Docker"
,
"artifacts"
:
{
"image"
:
{
"file"
:
"alogo53/ws-pema-lifewatch"
,
...
...
example_messages/message_plan_request.json
View file @
acd049d1
...
...
@@ -15,7 +15,7 @@
"30001:8080"
]
},
"type"
:
"tosca.nodes.
ARTICONF
.Container.Application.Docker"
,
"type"
:
"tosca.nodes.
QC
.Container.Application.Docker"
,
"artifacts"
:
{
"image"
:
{
"type"
:
"tosca.artifacts.Deployment.Image.Container.Docker"
,
...
...
example_messages/message_plan_response.json
View file @
acd049d1
...
...
@@ -34,7 +34,7 @@
"os"
:
"Ubuntu 18.04"
,
"user_name"
:
"vm_user"
},
"type"
:
"tosca.nodes.
ARTICONF
.VM.Compute"
"type"
:
"tosca.nodes.
QC
.VM.Compute"
},
"compute_1"
:
{
"interfaces"
:
{
...
...
@@ -49,7 +49,7 @@
"os"
:
"Ubuntu 18.04"
,
"user_name"
:
"vm_user"
},
"type"
:
"tosca.nodes.
ARTICONF
.VM.Compute"
"type"
:
"tosca.nodes.
QC
.VM.Compute"
},
"kubernetes"
:
{
"interfaces"
:
{
...
...
@@ -77,13 +77,13 @@
"requirements"
:
[
{
"host"
:
{
"capability"
:
"tosca.capabilities.
ARTICONF
.VM.topology"
,
"capability"
:
"tosca.capabilities.
QC
.VM.topology"
,
"node"
:
"topology"
,
"relationship"
:
"tosca.relationships.HostedOn"
}
}
],
"type"
:
"tosca.nodes.
ARTICONF
.docker.Orchestrator.Kubernetes"
"type"
:
"tosca.nodes.
QC
.docker.Orchestrator.Kubernetes"
},
"topology"
:
{
"artifacts"
:
{
...
...
@@ -133,20 +133,20 @@
"requirements"
:
[
{
"vm"
:
{
"capability"
:
"tosca.capabilities.
ARTICONF
.VM"
,
"capability"
:
"tosca.capabilities.
QC
.VM"
,
"node"
:
"compute"
,
"relationship"
:
"tosca.relationships.DependsOn"
}
},
{
"vm"
:
{
"capability"
:
"tosca.capabilities.
ARTICONF
.VM"
,
"capability"
:
"tosca.capabilities.
QC
.VM"
,
"node"
:
"compute_1"
,
"relationship"
:
"tosca.relationships.DependsOn"
}
}
],
"type"
:
"tosca.nodes.
ARTICONF
.VM.topology"
"type"
:
"tosca.nodes.
QC
.VM.topology"
},
"ws-pema"
:
{
"artifacts"
:
{
...
...
@@ -164,13 +164,13 @@
"requirements"
:
[
{
"host"
:
{
"capability"
:
"tosca.capabilities.
ARTICONF
.docker.Orchestrator"
,
"capability"
:
"tosca.capabilities.
QC
.docker.Orchestrator"
,
"node"
:
"kubernetes"
,
"relationship"
:
"tosca.relationships.HostedOn"
}
}
],
"type"
:
"tosca.nodes.
ARTICONF
.Container.Application.Docker"
"type"
:
"tosca.nodes.
QC
.Container.Application.Docker"
}
}
}
...
...
example_messages/message_provision_request.json
View file @
acd049d1
...
...
@@ -22,7 +22,7 @@
"create"
:
"dumy.yaml"
}
},
"type"
:
"tosca.nodes.
ARTICONF
.VM.Compute"
"type"
:
"tosca.nodes.
QC
.VM.Compute"
},
"compute_1"
:
{
"properties"
:
{
...
...
@@ -37,13 +37,13 @@
"create"
:
"dumy.yaml"
}
},
"type"
:
"tosca.nodes.
ARTICONF
.VM.Compute"
"type"
:
"tosca.nodes.
QC
.VM.Compute"
},
"kubernetes"
:
{
"requirements"
:
[
{
"host"
:
{
"capability"
:
"tosca.capabilities.
ARTICONF
.VM.topology"
,
"capability"
:
"tosca.capabilities.
QC
.VM.topology"
,
"node"
:
"topology"
,
"relationship"
:
"tosca.relationships.HostedOn"
}
...
...
@@ -71,7 +71,7 @@
}
}
},
"type"
:
"tosca.nodes.
ARTICONF
.docker.Orchestrator.Kubernetes"
"type"
:
"tosca.nodes.
QC
.docker.Orchestrator.Kubernetes"
},
"topology"
:
{
"properties"
:
{
...
...
@@ -81,14 +81,14 @@
"requirements"
:
[
{
"vm"
:
{
"capability"
:
"tosca.capabilities.
ARTICONF
.VM"
,
"capability"
:
"tosca.capabilities.
QC
.VM"
,
"node"
:
"compute"
,
"relationship"
:
"tosca.relationships.DependsOn"
}
},
{
"vm"
:
{
"capability"
:
"tosca.capabilities.
ARTICONF
.VM"
,
"capability"
:
"tosca.capabilities.
QC
.VM"
,
"node"
:
"compute_1"
,
"relationship"
:
"tosca.relationships.DependsOn"
}
...
...
@@ -128,7 +128,7 @@
}
}
},
"type"
:
"tosca.nodes.
ARTICONF
.VM.topology"
,
"type"
:
"tosca.nodes.
QC
.VM.topology"
,
"attributes"
:
{
"credential"
:
{
"cloud_provider_name"
:
"EC2"
,
...
...
@@ -156,13 +156,13 @@
"requirements"
:
[
{
"host"
:
{
"capability"
:
"tosca.capabilities.
ARTICONF
.docker.Orchestrator"
,
"capability"
:
"tosca.capabilities.
QC
.docker.Orchestrator"
,
"node"
:
"kubernetes"
,
"relationship"
:
"tosca.relationships.HostedOn"
}
}
],
"type"
:
"tosca.nodes.
ARTICONF
.Container.Application.Docker"
,
"type"
:
"tosca.nodes.
QC
.Container.Application.Docker"
,
"artifacts"
:
{
"image"
:
{
"file"
:
"alogo53/ws-pema-lifewatch"
,
...
...
jupyter_notebooks/vre_demo.ipynb
View file @
acd049d1
...
...
@@ -311,7 +311,7 @@
"\n",
"\n",
"for node_name in tosca_dict['topology_template']['node_templates']:\n",
" if tosca_dict['topology_template']['node_templates'][node_name]['type'] == 'tosca.nodes.
ARTICONF
.VM.Compute':\n",
" if tosca_dict['topology_template']['node_templates'][node_name]['type'] == 'tosca.nodes.
QC
.VM.Compute':\n",
" print(node_name+': '+tosca_dict['topology_template']['node_templates'][node_name]['attributes']['public_ip'])"
]
},
...
...
@@ -349,12 +349,12 @@
"nx.draw(graph, with_labels=True)\n",
"\n",
"for node_name in tosca_dict['topology_template']['node_templates']:\n",
" if tosca_dict['topology_template']['node_templates'][node_name]['type'] == 'tosca.nodes.
ARTICONF
.docker.Orchestrator.Kubernetes':\n",
" if tosca_dict['topology_template']['node_templates'][node_name]['type'] == 'tosca.nodes.
QC
.docker.Orchestrator.Kubernetes':\n",
" for token in tosca_dict['topology_template']['node_templates'][node_name]['attributes']['tokens']:\n",
" if token['user'] == 'dashboard_token':\n",
" print(node_name+': '+' dashboard_token: '+token['token'])\n",
" print(node_name+': '+str(tosca_dict['topology_template']['node_templates'][node_name]['attributes']['dashboard_url']))\n",
" if tosca_dict['topology_template']['node_templates'][node_name]['type'] == 'tosca.nodes.
ARTICONF
.Container.Application.Docker':\n",
" if tosca_dict['topology_template']['node_templates'][node_name]['type'] == 'tosca.nodes.
QC
.Container.Application.Docker':\n",
" print(node_name+': '+str(tosca_dict['topology_template']['node_templates'][node_name]['attributes']['service_url']))\n",
" "
]
...
...
sure_tosca-client_python_stubs/test/test_default_api.py
View file @
acd049d1
...
...
@@ -104,7 +104,7 @@ class TestDefaultApi(unittest.TestCase):
file_id
=
self
.
upload_tosca_template
(
'application_example_provisioned.yaml'
)
node_templates
=
self
.
api
.
get_node_templates
(
file_id
)
self
.
assertIsNotNone
(
node_templates
)
nodes_to_deploy
=
self
.
api
.
get_node_templates
(
file_id
,
type_name
=
'tosca.nodes.
ARTICONF
.Application'
)
nodes_to_deploy
=
self
.
api
.
get_node_templates
(
file_id
,
type_name
=
'tosca.nodes.
QC
.Application'
)
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment