allow networks to subscribe to tenants
diff --git a/xos/configurations/cord-pod/cord-vtn-vsg.yaml b/xos/configurations/cord-pod/cord-vtn-vsg.yaml
index d696d98..0fbee13 100644
--- a/xos/configurations/cord-pod/cord-vtn-vsg.yaml
+++ b/xos/configurations/cord-pod/cord-vtn-vsg.yaml
@@ -31,7 +31,7 @@
gateway_ip: 10.168.0.1
gateway_mac: 02:42:0a:a8:00:01
- addresses_service1:
+ addresses_exampleservice-public:
type: tosca.nodes.AddressPool
properties:
addresses: 10.168.1.0/24
@@ -65,7 +65,7 @@
node: addresses_vsg
relationship: tosca.relationships.ProvidesAddresses
- addresses_service1:
- node: addresses_service1
+ node: addresses_exampleservice-public
relationship: tosca.relationships.ProvidesAddresses
Private:
diff --git a/xos/configurations/cord-pod/pod-exampleservice.yaml b/xos/configurations/cord-pod/pod-exampleservice.yaml
index 59a9c8f..622a92f 100644
--- a/xos/configurations/cord-pod/pod-exampleservice.yaml
+++ b/xos/configurations/cord-pod/pod-exampleservice.yaml
@@ -18,6 +18,13 @@
no-delete: true
no-update: true
+ service_vrouter:
+ type: tosca.nodes.Service
+ properties:
+ no-create: true
+ no-delete: true
+ no-update: true
+
exampleservice-public:
type: tosca.nodes.network.Network
properties:
@@ -33,6 +40,9 @@
- connection:
node: mysite_exampleservice
relationship: tosca.relationships.ConnectsToSlice
+ - vrouter_tenant:
+ node: service_vrouter
+ relationship: tosca.relationships.TenantOfService
mysite:
type: tosca.nodes.Site
diff --git a/xos/core/models/service.py b/xos/core/models/service.py
index 96bff36..920bc3b 100644
--- a/xos/core/models/service.py
+++ b/xos/core/models/service.py
@@ -368,10 +368,12 @@
# The next four things are the various type of objects that can be subscribers of this Tenancy
# relationship. One and only one can be used at a time.
+ # XXX these should really be changed to GenericForeignKey
subscriber_service = models.ForeignKey(Service, related_name='subscribed_tenants', blank=True, null=True)
subscriber_tenant = models.ForeignKey("Tenant", related_name='subscribed_tenants', blank=True, null=True)
subscriber_user = models.ForeignKey("User", related_name='subscribed_tenants', blank=True, null=True)
subscriber_root = models.ForeignKey("TenantRoot", related_name="subscribed_tenants", blank=True, null=True)
+ subscriber_network = models.ForeignKey("Network", related_name="subscribed_tenants", blank=True, null=True)
# Service_specific_attribute and service_specific_id are opaque to XOS
service_specific_id = StrippedCharField(max_length=30, blank=True, null=True)
diff --git a/xos/tosca/resources/network.py b/xos/tosca/resources/network.py
index 7b513c3..dda1051 100644
--- a/xos/tosca/resources/network.py
+++ b/xos/tosca/resources/network.py
@@ -6,7 +6,7 @@
from translator.toscalib.tosca_template import ToscaTemplate
import pdb
-from core.models import Slice,User,Network,NetworkTemplate,NetworkSlice
+from core.models import Slice,User,Network,NetworkTemplate,NetworkSlice,Service,Tenant
from xosresource import XOSResource
@@ -35,7 +35,7 @@
if v:
args[prop] = v
else:
- # tosca.nodes.network.Netwrok is not as rich as an XOS network. So
+ # tosca.nodes.network.Network is not as rich as an XOS network. So
# we have to manually fill in some defaults.
args["permit_all_slices"] = True
@@ -54,6 +54,24 @@
ns = NetworkSlice(network = obj, slice=slice)
ns.save()
+ # this is really for vRouter
+ for provider_service_name in self.get_requirements("tosca.relationships.TenantOfService"):
+ provider_service = self.get_xos_object(Service, name=provider_service_name)
+
+ existing_tenancy = Tenant.objects.filter(provider_service = provider_service, subscriber_service = obj)
+ if existing_tenancy:
+ self.info("Tenancy relationship from %s to %s already exists" % (str(obj), str(provider_service)))
+ else:
+ from services.vrouter.models import VROUTER_KIND, VRouterService
+ if provider_service.kind == VROUTER_KIND:
+ tenancy = VRouterService.objects.get(id=provider_service.id).get_tenant(address_pool_name="addresses_"+obj.name, subscriber_network=obj)
+ tenancy.save()
+ self.cidr = tenancy.cidr
+ else:
+ raise Exception("The only network tenancy relationships that are allowed are to vRouter services")
+
+ self.info("Created Tenancy relationship from %s to %s" % (str(obj), str(provider_service)))
+
# v = self.get_property("permitted_slices")
# if v:
# for slicename in v.split(","):
@@ -74,10 +92,14 @@
network = Network(**xos_args)
network.caller = self.user
+ network.no_sync = True # postprocess might set the cidr
network.save()
self.postprocess(network)
+ network.no_sync = False
+ network.save()
+
self.info("Created Network '%s' owned by Slice '%s'" % (str(network), str(network.owner)))
def delete(self, obj):