blob: 772416709709df8d9dca2137cccc68890df0ffc3 [file] [log] [blame]
from xosresource import XOSResource
from core.models import Slice,User,Network,NetworkTemplate,NetworkSlice,Service,ServiceInstanceLink
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
print "DEF_RES_CIDR", cidr
start_ip = self.get_property_default("start_ip", None)
if start_ip:
args["start_ip"] = start_ip
print "DEF_RES_IP", start_ip
end_ip = self.get_property_default("end_ip", None)
if end_ip:
args["end_ip"] = end_ip
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_links = ServiceInstanceLink.objects.filter(subscriber_network = obj, provider_service_instance__owner=provider_service)
if existing_links:
self.info("Tenancy relationship from %s to %s already exists" % (str(obj), str(provider_service)))
else:
# TODO: Break hardcoded dependencies
# TODO: Rethink relationship between networks and vrouter tenants
if provider_service.kind == "vROUTER":
from services.vrouter.models import VRouterService
si = VRouterService.objects.get(id=provider_service.id).get_tenant(address_pool_name="addresses_"+obj.name)
si.save()
link = ServiceInstanceLink(provider_service_instance=si, subscriber_network=obj)
link.save()
obj.subnet = si.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)))
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)