TOSCA support for containers, allow specific image to be selected for compute
diff --git a/xos/tosca/custom_types/xos.m4 b/xos/tosca/custom_types/xos.m4
index aca3e3e..25605a4 100644
--- a/xos/tosca/custom_types/xos.m4
+++ b/xos/tosca/custom_types/xos.m4
@@ -447,6 +447,10 @@
image:
type: tosca.capabilities.xos.Image
properties:
+ kind:
+ type: string
+ required: false
+ description: Type of image (container | VM)
disk_format:
type: string
required: false
@@ -598,6 +602,31 @@
required: false
description: URL to the dashboard
+ tosca.nodes.Compute.Container:
+ derived_from: tosca.nodes.Compute
+ description: >
+ The TOSCA Compute node represents a container on bare metal.
+ attributes:
+ private_address:
+ type: string
+ public_address:
+ type: string
+ capabilities:
+ host:
+ type: tosca.capabilities.Container
+ binding:
+ type: tosca.capabilities.network.Bindable
+ os:
+ type: tosca.capabilities.OperatingSystem
+ scalable:
+ type: tosca.capabilities.Scalable
+ requirements:
+ - local_storage:
+ capability: tosca.capabilities.Attachment
+ node: tosca.nodes.BlockStorage
+ relationship: tosca.relationships.AttachesTo
+ occurrences: [0, UNBOUNDED]
+
tosca.relationships.MemberOfSlice:
derived_from: tosca.relationships.Root
valid_target_types: [ tosca.capabilities.xos.Slice ]
@@ -638,6 +667,10 @@
derived_from: tosca.relationships.Root
valid_target_types: [ tosca.capabilities.xos.Network ]
+ tosca.relationships.UsesImage:
+ derived_from: tosca.relationships.Root
+ valid_target_types: [ tosca.capabilities.xos.Image ]
+
tosca.relationships.SupportsImage:
derived_from: tosca.relationships.Root
valid_target_types: [ tosca.capabilities.xos.Image ]
diff --git a/xos/tosca/custom_types/xos.yaml b/xos/tosca/custom_types/xos.yaml
index 63b4e0c..e470547 100644
--- a/xos/tosca/custom_types/xos.yaml
+++ b/xos/tosca/custom_types/xos.yaml
@@ -586,6 +586,10 @@
image:
type: tosca.capabilities.xos.Image
properties:
+ kind:
+ type: string
+ required: false
+ description: Type of image (container | VM)
disk_format:
type: string
required: false
@@ -792,6 +796,31 @@
required: false
description: URL to the dashboard
+ tosca.nodes.Compute.Container:
+ derived_from: tosca.nodes.Compute
+ description: >
+ The TOSCA Compute node represents a container on bare metal.
+ attributes:
+ private_address:
+ type: string
+ public_address:
+ type: string
+ capabilities:
+ host:
+ type: tosca.capabilities.Container
+ binding:
+ type: tosca.capabilities.network.Bindable
+ os:
+ type: tosca.capabilities.OperatingSystem
+ scalable:
+ type: tosca.capabilities.Scalable
+ requirements:
+ - local_storage:
+ capability: tosca.capabilities.Attachment
+ node: tosca.nodes.BlockStorage
+ relationship: tosca.relationships.AttachesTo
+ occurrences: [0, UNBOUNDED]
+
tosca.relationships.MemberOfSlice:
derived_from: tosca.relationships.Root
valid_target_types: [ tosca.capabilities.xos.Slice ]
@@ -832,6 +861,10 @@
derived_from: tosca.relationships.Root
valid_target_types: [ tosca.capabilities.xos.Network ]
+ tosca.relationships.UsesImage:
+ derived_from: tosca.relationships.Root
+ valid_target_types: [ tosca.capabilities.xos.Image ]
+
tosca.relationships.SupportsImage:
derived_from: tosca.relationships.Root
valid_target_types: [ tosca.capabilities.xos.Image ]
diff --git a/xos/tosca/resources/compute.py b/xos/tosca/resources/compute.py
index f01a401..1d3e0ad 100644
--- a/xos/tosca/resources/compute.py
+++ b/xos/tosca/resources/compute.py
@@ -13,7 +13,7 @@
from xosresource import XOSResource
class XOSCompute(XOSResource):
- provides = "tosca.nodes.Compute"
+ provides = ["tosca.nodes.Compute", "tosca.nodes.Compute.Container"]
xos_model = Instance
def select_compute_node(self, user, v, hostname=None):
@@ -60,11 +60,14 @@
colocate_host = colocate_instances[0].node.name
self.info("colocating on %s" % colocate_host)
+ imageName = self.get_requirement("tosca.relationships.UsesImage", throw_exception=False)
+ image = self.get_xos_object(Image, name=imageName)
+
capabilities = nodetemplate.get_capabilities()
for (k,v) in capabilities.items():
- if (k=="host"):
+ if (k=="host") and (not host):
(compute_node, flavor) = self.select_compute_node(self.user, v, hostname=colocate_host)
- elif (k=="os"):
+ elif (k=="os") and (not image):
image = self.select_image(self.user, v)
if not compute_node:
@@ -80,6 +83,9 @@
args["node"] = compute_node
args["deployment"] = compute_node.site_deployment.deployment
+ if nodetemplate.type == "tosca.nodes.Compute.Container":
+ args["isolation"] = "container"
+
return args
def create(self, name = None, index = None):
@@ -120,3 +126,4 @@
else:
return super(XOSCompute,self).get_existing_objs()
+
diff --git a/xos/tosca/resources/image.py b/xos/tosca/resources/image.py
index bdc66b6..938c5cd 100644
--- a/xos/tosca/resources/image.py
+++ b/xos/tosca/resources/image.py
@@ -15,7 +15,7 @@
class XOSImage(XOSResource):
provides = "tosca.nodes.Image"
xos_model = Image
- copyin_props = ["disk_format", "container_format", "path"]
+ copyin_props = ["disk_format", "container_format", "path", "kind"]
def get_xos_args(self):
args = super(XOSImage, self).get_xos_args()
diff --git a/xos/tosca/resources/xosresource.py b/xos/tosca/resources/xosresource.py
index 3553ab1..9c4f479 100644
--- a/xos/tosca/resources/xosresource.py
+++ b/xos/tosca/resources/xosresource.py
@@ -77,9 +77,6 @@
def get_existing_objs(self):
return self.xos_model.objects.filter(**{self.name_field: self.nodetemplate.name})
- def get_xos_args(self):
- return {}
-
def get_model_class_name(self):
return self.xos_model.__name__
diff --git a/xos/tosca/samples/container.yaml b/xos/tosca/samples/container.yaml
new file mode 100644
index 0000000..bd69fbe
--- /dev/null
+++ b/xos/tosca/samples/container.yaml
@@ -0,0 +1,42 @@
+tosca_definitions_version: tosca_simple_yaml_1_0
+
+description: Template for deploying a single server with predefined properties.
+
+imports:
+ - custom_types/xos.yaml
+
+topology_template:
+ node_templates:
+ mysite:
+ type: tosca.nodes.Site
+
+ mysite_contest:
+ type: tosca.nodes.Slice
+ requirements:
+ - slice:
+ node: mysite
+ relationship: tosca.relationships.MemberOfSite
+
+ andybavier/docker-vcpe:
+ type: tosca.nodes.Image
+ properties:
+ kind: container
+ container_format: na
+ disk_format: na
+
+ my_container:
+ type: tosca.nodes.Compute.Container
+ capabilities:
+ # Host container properties
+ host:
+ properties:
+ num_cpus: 1
+ disk_size: 10 GB
+ mem_size: 4 MB
+ requirements:
+ - slice:
+ node: mysite_contest
+ relationship: tosca.relationships.MemberOfSlice
+ - image:
+ node: andybavier/docker-vcpe
+ relationship: tosca.relationships.UsesImage