fix merge conflict
diff --git a/xos/configurations/acord/ceilometer.yaml b/xos/configurations/acord/ceilometer.yaml
index ff56579..66d5d32 100644
--- a/xos/configurations/acord/ceilometer.yaml
+++ b/xos/configurations/acord/ceilometer.yaml
@@ -164,6 +164,9 @@
ceilometer-trusty-server-multi-nic:
type: tosca.nodes.Image
+ m1.small:
+ type: tosca.nodes.Flavor
+
mysite_ceilometer:
description: Ceilometer Proxy Slice
type: tosca.nodes.Slice
@@ -177,8 +180,10 @@
- default_image:
node: ceilometer-trusty-server-multi-nic
relationship: tosca.relationships.DefaultImage
+ - m1.small:
+ node: m1.small
+ relationship: tosca.relationships.DefaultFlavor
properties:
- default_flavor: m1.small
max_instances: 2
# mysite_sflow:
diff --git a/xos/configurations/common/mydeployment.yaml b/xos/configurations/common/mydeployment.yaml
new file mode 100644
index 0000000..9d2c951
--- /dev/null
+++ b/xos/configurations/common/mydeployment.yaml
@@ -0,0 +1,64 @@
+tosca_definitions_version: tosca_simple_yaml_1_0
+
+description: Some basic fixtures
+
+imports:
+ - custom_types/xos.yaml
+
+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
+ 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
+ properties:
+ display_name: MySite
+ requirements:
+ - deployment:
+ node: MyDeployment
+ relationship: tosca.relationships.SiteDeployment
+
+ # Include the Tenant view so we can make it a default of padmin@vicci.org
+ Tenant:
+ type: tosca.nodes.DashboardView
+ properties:
+ no-create: true
+ no-update: true
+ no-delete: true
+
+ padmin@vicci.org:
+ type: tosca.nodes.User
+ properties:
+ password: letmein
+# encrypted_password: pbkdf2_sha256$12000$Qufx9iqtaYma$xs0YurPOcj9qYQna/Qrb3K+im9Yr2XEVr0J4Kqek7AE=
+ firstname: XOS
+ lastname: admin
+ is_admin: true
+ requirements:
+ - site:
+ node: mysite
+ relationship: tosca.relationships.MemberOfSite
+ - tenant_dashboard:
+ node: Tenant
+ relationship: tosca.relationships.UsesDashboard
+
diff --git a/xos/configurations/cord-deprecated/ceilometer.yaml b/xos/configurations/cord-deprecated/ceilometer.yaml
index 3724265..464b07b 100644
--- a/xos/configurations/cord-deprecated/ceilometer.yaml
+++ b/xos/configurations/cord-deprecated/ceilometer.yaml
@@ -164,6 +164,9 @@
ceilometer-trusty-server-multi-nic:
type: tosca.nodes.Image
+ m1.small:
+ type: tosca.nodes.Flavor
+
mysite_ceilometer:
description: Ceilometer Proxy Slice
type: tosca.nodes.Slice
@@ -177,8 +180,9 @@
- default_image:
node: ceilometer-trusty-server-multi-nic
relationship: tosca.relationships.DefaultImage
- properties:
- default_flavor: m1.small
+ - default_flavor:
+ node: m1.small
+ relationship: tosca.relationships.DefaultFlavor
# mysite_sflow:
# description: Slice for sFlow service
diff --git a/xos/configurations/cord-pod/Makefile b/xos/configurations/cord-pod/Makefile
index 9296f10..f1111b4 100644
--- a/xos/configurations/cord-pod/Makefile
+++ b/xos/configurations/cord-pod/Makefile
@@ -2,6 +2,7 @@
xos: nodes.yaml images.yaml
sudo docker-compose up -d
../common/wait_for_xos_port.sh 80
+ sudo docker-compose run xos python /opt/xos/tosca/run.py none /opt/xos/configurations/common/mydeployment.yaml
sudo docker-compose run xos python /opt/xos/tosca/run.py padmin@vicci.org /root/setup/setup.yaml
sudo docker-compose run xos python /opt/xos/tosca/run.py padmin@vicci.org /root/setup/nodes.yaml
sudo docker-compose run xos python /opt/xos/tosca/run.py padmin@vicci.org /root/setup/images.yaml
diff --git a/xos/configurations/cord-pod/ceilometer.yaml b/xos/configurations/cord-pod/ceilometer.yaml
index 3b32345..d07f2e9 100644
--- a/xos/configurations/cord-pod/ceilometer.yaml
+++ b/xos/configurations/cord-pod/ceilometer.yaml
@@ -171,6 +171,9 @@
ceilometer-trusty-server-multi-nic:
type: tosca.nodes.Image
+ m1.small:
+ type: tosca.nodes.Flavor
+
mysite_ceilometer:
description: Ceilometer Proxy Slice
type: tosca.nodes.Slice
@@ -187,8 +190,9 @@
- management:
node: management
relationship: tosca.relationships.ConnectsToNetwork
- properties:
- default_flavor: m1.small
+ - m1.small:
+ node: m1.small
+ relationship: tosca.relationships.DefaultFlavor
# mysite_sflow:
# description: Slice for sFlow service
diff --git a/xos/configurations/frontend/Makefile b/xos/configurations/frontend/Makefile
index ee2739c..27b0044 100644
--- a/xos/configurations/frontend/Makefile
+++ b/xos/configurations/frontend/Makefile
@@ -4,6 +4,7 @@
sudo make -f ../common/Makefile.prereqs
sudo docker-compose up -d
bash ../common/wait_for_xos.sh
+ sudo docker-compose run xos python /opt/xos/tosca/run.py none /opt/xos/configurations/common/mydeployment.yaml
sudo docker-compose run xos python /opt/xos/tosca/run.py padmin@vicci.org /opt/xos/configurations/frontend/sample.yaml
containers:
diff --git a/xos/core/fixtures/core_initial_data.json b/xos/core/fixtures/core_initial_data.json
index e4f86f9..db5bd10 100644
--- a/xos/core/fixtures/core_initial_data.json
+++ b/xos/core/fixtures/core_initial_data.json
@@ -1,28 +1,6 @@
[
{
"fields": {
- "updated": "2015-02-17T22:06:37.837Z",
- "policed": null,
- "created": "2015-02-17T22:06:37.837Z",
- "deleted": false,
- "site_url": null,
- "enabled": true,
- "longitude": null,
- "name": "MySite",
- "backend_register": "{}",
- "login_base": "mysite",
- "location": "0,0",
- "latitude": null,
- "is_public": true,
- "backend_status": "0 - Provisioning in progress",
- "abbreviated_name": "mysite",
- "enacted": null
- },
- "model": "core.site",
- "pk": 1
-},
-{
- "fields": {
"updated": "2015-02-17T22:06:38.620Z",
"policed": null,
"created": "2015-02-17T22:06:38.620Z",
@@ -64,47 +42,32 @@
"pk": 3
},
{
- "fields": {
- "updated": "2015-02-17T22:06:38.620Z",
- "policed": null,
- "created": "2015-02-17T22:06:38.620Z",
- "deleted": false,
- "backend_register": "{}",
- "role": "admin",
- "backend_status": "0 - Provisioning in progress",
- "enacted": null
- },
- "model": "core.tenantrole",
- "pk": 1
-},
-{
- "fields": {
- "updated": "2015-02-17T22:06:38.620Z",
- "policed": null,
- "created": "2015-02-17T22:06:38.620Z",
- "deleted": false,
- "backend_register": "{}",
- "role": "access",
- "backend_status": "0 - Provisioning in progress",
- "enacted": null
- },
- "model": "core.tenantrole",
- "pk": 2
-},
-{
- "fields": {
- "accessControl": "allow all",
- "updated": "2015-02-17T22:06:37.789Z",
- "policed": null,
- "created": "2015-02-17T22:06:37.789Z",
- "deleted": false,
- "name": "MyDeployment",
- "backend_register": "{}",
- "backend_status": "0 - Provisioning in progress",
- "enacted": null
- },
- "model": "core.deployment",
- "pk": 1
+ "fields": {
+ "updated": "2015-02-17T22:06:38.620Z",
+ "policed": null,
+ "created": "2015-02-17T22:06:38.620Z",
+ "deleted": false,
+ "backend_register": "{}",
+ "role": "admin",
+ "backend_status": "0 - Provisioning in progress",
+ "enacted": null
+ },
+ "model": "core.tenantrole",
+ "pk": 1
+},
+{
+ "fields": {
+ "updated": "2015-02-17T22:06:38.620Z",
+ "policed": null,
+ "created": "2015-02-17T22:06:38.620Z",
+ "deleted": false,
+ "backend_register": "{}",
+ "role": "access",
+ "backend_status": "0 - Provisioning in progress",
+ "enacted": null
+ },
+ "model": "core.tenantrole",
+ "pk": 2
},
{
"fields": {
@@ -122,23 +85,6 @@
},
{
"fields": {
- "updated": "2015-02-17T22:06:37.893Z",
- "policed": null,
- "created": "2015-02-17T22:06:37.893Z",
- "deleted": false,
- "availability_zone": null,
- "site": 1,
- "backend_register": "{}",
- "controller": null,
- "deployment": 1,
- "backend_status": "0 - Provisioning in progress",
- "enacted": null
- },
- "model": "core.sitedeployment",
- "pk": 1
-},
-{
- "fields": {
"updated": "2015-02-17T22:06:38.953Z",
"policed": null,
"created": "2015-02-17T22:06:38.953Z",
@@ -178,7 +124,6 @@
"created": "2015-02-17T22:06:39.069Z",
"deleted": false,
"deployments": [
- 1
],
"enabled": true,
"name": "Tenant",
@@ -209,34 +154,6 @@
},
{
"fields": {
- "policed": null,
- "site": 1,
- "is_staff": true,
- "timezone": "America/New_York",
- "backend_status": "Provisioning in progress",
- "is_registering": false,
- "last_login": "2015-02-17T22:35:17.822Z",
- "email": "padmin@vicci.org",
- "username": "padmin@vicci.org",
- "updated": "2015-02-17T22:06:38.059Z",
- "firstname": "XOS",
- "user_url": null,
- "deleted": false,
- "lastname": "admin",
- "is_active": true,
- "phone": null,
- "is_admin": true,
- "password": "pbkdf2_sha256$12000$Qufx9iqtaYma$xs0YurPOcj9qYQna/Qrb3K+im9Yr2XEVr0J4Kqek7AE=",
- "enacted": null,
- "public_key": null,
- "is_readonly": false,
- "created": "2015-02-17T22:06:38.059Z"
- },
- "model": "core.user",
- "pk": 1
-},
-{
- "fields": {
"updated": "2015-02-17T22:06:39.361Z",
"membershipFee": 0,
"policed": null,
@@ -262,7 +179,6 @@
"created": "2015-02-17T22:06:38.095Z",
"deleted": false,
"deployments": [
- 1
],
"description": null,
"name": "m1.small",
@@ -283,7 +199,6 @@
"created": "2015-02-17T22:06:38.287Z",
"deleted": false,
"deployments": [
- 1
],
"description": null,
"name": "m1.medium",
@@ -304,7 +219,6 @@
"created": "2015-02-17T22:06:38.445Z",
"deleted": false,
"deployments": [
- 1
],
"description": null,
"name": "m1.large",
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
diff --git a/xos/tosca/resources/xosresource.py b/xos/tosca/resources/xosresource.py
index cc4672b..7a6c194 100644
--- a/xos/tosca/resources/xosresource.py
+++ b/xos/tosca/resources/xosresource.py
@@ -186,7 +186,8 @@
def create(self):
xos_args = self.get_xos_args()
xos_obj = self.xos_model(**xos_args)
- xos_obj.caller = self.user
+ if self.user:
+ xos_obj.caller = self.user
xos_obj.save()
self.info("Created %s '%s'" % (self.xos_model.__name__,str(xos_obj)))
diff --git a/xos/tosca/resources/xossite.py b/xos/tosca/resources/xossite.py
index 0db2705..616e397 100644
--- a/xos/tosca/resources/xossite.py
+++ b/xos/tosca/resources/xossite.py
@@ -44,19 +44,20 @@
deployment = self.get_xos_object(Deployment, name=deployment_name)
controller_name = None
- for sd_req in v["requirements"]:
+ for sd_req in v.get("requirements", []):
for (sd_req_k, sd_req_v) in sd_req.items():
if sd_req_v["relationship"] == "tosca.relationships.UsesController":
controller_name = sd_req_v["node"]
- if not controller_name:
- raise Exception("Controller must be specified in SiteDeployment relationship")
-
- controller = self.get_xos_object(Controller, name=controller_name, throw_exception=True)
+ if controller_name:
+ controller = self.get_xos_object(Controller, name=controller_name, throw_exception=True)
+ else:
+ controller = None
+ # raise Exception("Controller must be specified in SiteDeployment relationship")
existing_sitedeps = SiteDeployment.objects.filter(deployment=deployment, site=obj)
if existing_sitedeps:
sd = existing_sitedeps[0]
- if sd.controller != controller:
+ if (sd.controller != controller) and (controller != None):
sd.controller = controller
sd.save()
self.info("SiteDeployment from %s to %s updated controller" % (str(obj), str(deployment)))
diff --git a/xos/tosca/run.py b/xos/tosca/run.py
index 591582b..58dc22b 100644
--- a/xos/tosca/run.py
+++ b/xos/tosca/run.py
@@ -25,7 +25,10 @@
username = sys.argv[1]
template_name = sys.argv[2]
- u = User.objects.get(email=username)
+ if username.lower()=="none":
+ u=None
+ else:
+ u = User.objects.get(email=username)
xt = XOSTosca(file(template_name).read(), parent_dir=currentdir, log_to_console=True)
xt.execute(u)
diff --git a/xos/tosca/samples/slice_default_image.yaml b/xos/tosca/samples/slice_default_image.yaml
index 91b95c7..ff63373 100644
--- a/xos/tosca/samples/slice_default_image.yaml
+++ b/xos/tosca/samples/slice_default_image.yaml
@@ -16,6 +16,9 @@
trusty-server-multi-nic:
type: tosca.nodes.Image
+ m1.small:
+ type: tosca.nodes.Flavor
+
mysite_test1:
type: tosca.nodes.Slice
requirements:
@@ -25,6 +28,6 @@
- default_image:
node: trusty-server-multi-nic
relationship: tosca.relationships.DefaultImage
- properties:
- default_flavor: m1.small
-
+ -default_flavor:
+ node: m1.small
+ relationship: tosca.relationships.DefaultFlavor