blob: 32e3fc1384f4ae481bd169dfcf42b8c686d4c31a [file] [log] [blame]
import os
import pdb
import sys
import tempfile
sys.path.append("/opt/tosca")
from translator.toscalib.tosca_template import ToscaTemplate
import pdb
from core.models import Slice,User,Network,NetworkTemplate,NetworkSlice,Service,Tenant
from xosresource import XOSResource
class XOSNetwork(XOSResource):
provides = ["tosca.nodes.network.Network", "tosca.nodes.network.Network.XOS"]
xos_model = Network
copyin_props = ["ports", "labels"]
def get_xos_args(self):
args = super(XOSNetwork, self).get_xos_args()
args["autoconnect"] = False
slice_name = self.get_requirement("tosca.relationships.MemberOfSlice")
if slice_name:
args["owner"] = self.get_xos_object(Slice, name=slice_name)
net_template_name = self.get_requirement("tosca.relationships.UsesNetworkTemplate")
if net_template_name:
args["template"] = self.get_xos_object(NetworkTemplate, name=net_template_name)
if self.nodetemplate.type == "tosca.nodes.network.Network.XOS":
# copy simple string properties from the template into the arguments
for prop in ["ports", "labels", "permit_all_slices"]:
v = self.get_property(prop)
if v:
args[prop] = v
else:
# 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
cidr = self.get_property_default("cidr", None)
if cidr:
args["subnet"] = cidr
return args
def postprocess(self, obj):
for sliceName in self.get_requirements("tosca.relationships.ConnectsToSlice"):
slice = self.get_xos_object(Slice, name=sliceName)
netSlices = NetworkSlice.objects.filter(network=obj, slice = slice)
if not netSlices:
self.info("Attached Network %s to Slice %s" % (obj, slice))
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_network = 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()
obj.subnet = 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(","):
# slice = self.get_xos_object(Slice, name = slicename.strip())
#
# if not obj.permitted_slices.filter(id = slice.id).exists():
# obj.permitted_slices.add(slice)
def create(self):
nodetemplate = self.nodetemplate
xos_args = self.get_xos_args()
if not xos_args.get("owner", None):
raise Exception("Must specify slice when creating network")
if not xos_args.get("template", None):
raise Exception("Must specify network template when creating network")
# XXX TODO: investigate using transaction.atomic instead of setting
# no_sync and no_policy
network = Network(**xos_args)
network.caller = self.user
network.no_sync = True # postprocess might set the cidr
network.no_policy = True
network.save()
self.postprocess(network)
network.no_sync = False
network.no_policy = False
network.save()
self.info("Created Network '%s' owned by Slice '%s'" % (str(network), str(network.owner)))
def delete(self, obj):
super(XOSNetwork, self).delete(obj)