add tosca support for flavor
diff --git a/xos/configurations/common/mydeployment.yaml b/xos/configurations/common/mydeployment.yaml
index ab7d3c2..a0fd8ed 100644
--- a/xos/configurations/common/mydeployment.yaml
+++ b/xos/configurations/common/mydeployment.yaml
@@ -7,10 +7,27 @@
topology_template:
node_templates:
+ m1.large:
+ type: tosca.nodes.flavor
+
+ m1.medium:
+ type: tosca.nodes.flavor
+
+ m1.small:
+ type: tosca.nodes.flavor
+
MyDeployment:
type: tosca.nodes.Deployment
- properties:
- flavors: m1.large, m1.medium, m1.small
+ requirements:
+ m1.large:
+ node: m1.large
+ relationship: tosca.relationships.SupportsFlavor
+ m1.medium:
+ node: m1.medium
+ relationship: tosca.relationships.SupportsFlavor
+ m1.small:
+ node: m1.small
+ relationship: tosca.relationships.SupportsFlavor
mysite:
type: tosca.nodes.Site
diff --git a/xos/tosca/custom_types/xos.m4 b/xos/tosca/custom_types/xos.m4
index 9bd504a..c114652 100644
--- a/xos/tosca/custom_types/xos.m4
+++ b/xos/tosca/custom_types/xos.m4
@@ -748,13 +748,6 @@
type: string
required: false
description: default isolation to use when bringing up instances (default to 'vm')
- default_flavor:
- # Note: we should probably formally introduce flavors to Tosca
- # at some point, and use a requirement/relationship instead of
- # a text string.
- type: string
- required: false
- description: default flavor to use for slice
network:
type: string
required: false
@@ -785,6 +778,20 @@
node:
type: tosca.capabilities.xos.NodeLabel
+ tosca.nodes.Flavor:
+ derived_from: tosca.nodes.Root
+ description: >
+ An XOS Flavor.
+ properties:
+ xos_base_props
+ flavor:
+ type: string
+ required: false
+ description: openstack flavor name
+ capabilities:
+ flavor:
+ type: tosca.capabilities.xos.Flavor
+
tosca.nodes.DashboardView:
derived_from: tosca.nodes.Root
description: >
@@ -923,6 +930,14 @@
derived_from: tosca.relationships.Root
valid_target_types: [ tosca.capabilities.xos.NodeLabel ]
+ tosca.relationships.SupportsFlavor:
+ derived_from: tosca.relationships.Root
+ valid_target_types: [ tosca.capabilities.xos.Flavor ]
+
+ tosca.relationships.DefaultFlavor:
+ derived_from: tosca.relationships.Root
+ valid_target_types: [ tosca.capabilities.xos.Flavor ]
+
tosca.relationships.ProvidesAddresses:
derived_from: tosca.relationships.Root
valid_target_types: [ tosca.capabilities.xos.AddressPool ]
@@ -978,6 +993,10 @@
derived_from: tosca.capabilities.Root
description: An XOS NodeLabel
+ tosca.capabilities.xos.Flavor:
+ derived_from: tosca.capabilities.Root
+ description: An XOS Flavor
+
tosca.capabilities.xos.Image:
derived_from: tosca.capabilities.Root
description: An XOS Image
diff --git a/xos/tosca/custom_types/xos.yaml b/xos/tosca/custom_types/xos.yaml
index f790cc5..a89641c 100644
--- a/xos/tosca/custom_types/xos.yaml
+++ b/xos/tosca/custom_types/xos.yaml
@@ -1159,13 +1159,6 @@
type: string
required: false
description: default isolation to use when bringing up instances (default to 'vm')
- default_flavor:
- # Note: we should probably formally introduce flavors to Tosca
- # at some point, and use a requirement/relationship instead of
- # a text string.
- type: string
- required: false
- description: default flavor to use for slice
network:
type: string
required: false
@@ -1218,6 +1211,31 @@
node:
type: tosca.capabilities.xos.NodeLabel
+ tosca.nodes.Flavor:
+ derived_from: tosca.nodes.Root
+ description: >
+ An XOS Flavor.
+ properties:
+ no-delete:
+ type: boolean
+ default: false
+ description: Do not allow Tosca to delete this object
+ no-create:
+ type: boolean
+ default: false
+ description: Do not allow Tosca to create this object
+ no-update:
+ type: boolean
+ default: false
+ description: Do not allow Tosca to update this object
+ flavor:
+ type: string
+ required: false
+ description: openstack flavor name
+ capabilities:
+ flavor:
+ type: tosca.capabilities.xos.Flavor
+
tosca.nodes.DashboardView:
derived_from: tosca.nodes.Root
description: >
@@ -1367,6 +1385,14 @@
derived_from: tosca.relationships.Root
valid_target_types: [ tosca.capabilities.xos.NodeLabel ]
+ tosca.relationships.SupportsFlavor:
+ derived_from: tosca.relationships.Root
+ valid_target_types: [ tosca.capabilities.xos.Flavor ]
+
+ tosca.relationships.DefaultFlavor:
+ derived_from: tosca.relationships.Root
+ valid_target_types: [ tosca.capabilities.xos.Flavor ]
+
tosca.relationships.ProvidesAddresses:
derived_from: tosca.relationships.Root
valid_target_types: [ tosca.capabilities.xos.AddressPool ]
@@ -1422,6 +1448,10 @@
derived_from: tosca.capabilities.Root
description: An XOS NodeLabel
+ tosca.capabilities.xos.Flavor:
+ derived_from: tosca.capabilities.Root
+ description: An XOS Flavor
+
tosca.capabilities.xos.Image:
derived_from: tosca.capabilities.Root
description: An XOS Image
diff --git a/xos/tosca/resources/deployment.py b/xos/tosca/resources/deployment.py
index ed6734c..e5ab4b1 100644
--- a/xos/tosca/resources/deployment.py
+++ b/xos/tosca/resources/deployment.py
@@ -31,9 +31,8 @@
imageDep = ImageDeployments(deployment=obj, image=image)
imageDep.save()
- # Be a little more lightweight with 'flavors'. Since we install flavors
- # as a fixture rather than using TOSCA, we can just let the user
- # use a comma-separated list.
+ # DEPRECATED - should switch to using a requirement, so tosca can do
+ # the topsort properly
flavors = self.get_property("flavors")
if flavors:
@@ -47,6 +46,15 @@
flavor.deployments.add(obj)
flavor.save()
+ # The new, right way
+ for flavor in self.get_requirements("tosca.relationships.SupportsFlavor"):
+ flavor = self.get_xos_object(Flavor, name=flavor)
+ if not flavor.deployments.filter(id=obj.id).exists():
+ self.info("Attached flavor %s to deployment %s" % (flavor, obj))
+ flavor.deployments.add(obj)
+ flavor.save()
+
+
rolemap = ( ("tosca.relationships.AdminPrivilege", "admin"), )
self.postprocess_privileges(DeploymentRole, DeploymentPrivilege, rolemap, obj, "deployment")
diff --git a/xos/tosca/resources/flavor.py b/xos/tosca/resources/flavor.py
new file mode 100644
index 0000000..f61ccad
--- /dev/null
+++ b/xos/tosca/resources/flavor.py
@@ -0,0 +1,37 @@
+# note: this module named xossite.py instead of site.py due to conflict with
+# /usr/lib/python2.7/site.py
+
+import os
+import pdb
+import sys
+import tempfile
+sys.path.append("/opt/tosca")
+from translator.toscalib.tosca_template import ToscaTemplate
+
+from core.models import User, Deployment, Flavor
+
+from xosresource import XOSResource
+
+class XOSFlavor(XOSResource):
+ provides = "tosca.nodes.Flavor"
+ xos_model = Flavor
+ copyin_props = ["flavor"]
+
+ def get_xos_args(self):
+ args = super(XOSFlavor, self).get_xos_args()
+
+ # Support the default where the OpenStack flavor is the same as the
+ # flavor name
+ if "flavor" not in args:
+ args["flavor"] = args["name"]
+
+ return args
+
+ def delete(self, obj):
+ if obj.instance_set.exists():
+ self.info("Flavor %s has active instances; skipping delete" % obj.name)
+ return
+ super(XOSFlavor, self).delete(obj)
+
+
+
diff --git a/xos/tosca/resources/slice.py b/xos/tosca/resources/slice.py
index 48e5eb0..22978a2 100644
--- a/xos/tosca/resources/slice.py
+++ b/xos/tosca/resources/slice.py
@@ -31,7 +31,7 @@
default_image = self.get_xos_object(Image, name=default_image_name, throw_exception=True)
args["default_image"] = default_image
- default_flavor_name = self.get_property_default("default_flavor", None)
+ default_flavor_name = self.get_requirement("tosca.relationships.DefaultFlavor", throw_exception=False)
if default_flavor_name:
default_flavor = self.get_xos_object(Flavor, name=default_flavor_name, throw_exception=True)
args["default_flavor"] = default_flavor