blob: 32e3fc1384f4ae481bd169dfcf42b8c686d4c31a [file] [log] [blame]
Scott Bakerb2bddd82015-08-06 17:21:34 -07001import os
2import pdb
3import sys
4import tempfile
5sys.path.append("/opt/tosca")
6from translator.toscalib.tosca_template import ToscaTemplate
Scott Baker8d3741e2015-08-31 16:16:41 -07007import pdb
Scott Bakerb2bddd82015-08-06 17:21:34 -07008
Scott Baker97ca9102016-04-13 16:56:39 -07009from core.models import Slice,User,Network,NetworkTemplate,NetworkSlice,Service,Tenant
Scott Bakerb2bddd82015-08-06 17:21:34 -070010
11from xosresource import XOSResource
12
13class XOSNetwork(XOSResource):
Scott Baker2edd4f32015-08-14 12:41:18 -070014 provides = ["tosca.nodes.network.Network", "tosca.nodes.network.Network.XOS"]
Scott Bakerb2bddd82015-08-06 17:21:34 -070015 xos_model = Network
Scott Baker01234ce2015-09-03 15:47:56 -070016 copyin_props = ["ports", "labels"]
Scott Bakerb2bddd82015-08-06 17:21:34 -070017
18 def get_xos_args(self):
Scott Baker01234ce2015-09-03 15:47:56 -070019 args = super(XOSNetwork, self).get_xos_args()
20
21 args["autoconnect"] = False
Scott Bakerb2bddd82015-08-06 17:21:34 -070022
23 slice_name = self.get_requirement("tosca.relationships.MemberOfSlice")
24 if slice_name:
25 args["owner"] = self.get_xos_object(Slice, name=slice_name)
26
27 net_template_name = self.get_requirement("tosca.relationships.UsesNetworkTemplate")
28 if net_template_name:
29 args["template"] = self.get_xos_object(NetworkTemplate, name=net_template_name)
30
Scott Baker8d3741e2015-08-31 16:16:41 -070031 if self.nodetemplate.type == "tosca.nodes.network.Network.XOS":
32 # copy simple string properties from the template into the arguments
33 for prop in ["ports", "labels", "permit_all_slices"]:
34 v = self.get_property(prop)
35 if v:
36 args[prop] = v
37 else:
Scott Baker97ca9102016-04-13 16:56:39 -070038 # tosca.nodes.network.Network is not as rich as an XOS network. So
Scott Baker8d3741e2015-08-31 16:16:41 -070039 # we have to manually fill in some defaults.
40 args["permit_all_slices"] = True
Scott Bakerb2bddd82015-08-06 17:21:34 -070041
Scott Baker2ec8f112016-02-08 16:19:14 -080042 cidr = self.get_property_default("cidr", None)
43 if cidr:
44 args["subnet"] = cidr
45
Scott Bakerb2bddd82015-08-06 17:21:34 -070046 return args
47
48 def postprocess(self, obj):
Scott Bakera7c9efc2015-09-01 11:07:56 -070049 for sliceName in self.get_requirements("tosca.relationships.ConnectsToSlice"):
Scott Baker121d5c32015-09-03 15:33:52 -070050 slice = self.get_xos_object(Slice, name=sliceName)
Scott Bakera7c9efc2015-09-01 11:07:56 -070051 netSlices = NetworkSlice.objects.filter(network=obj, slice = slice)
52 if not netSlices:
53 self.info("Attached Network %s to Slice %s" % (obj, slice))
54 ns = NetworkSlice(network = obj, slice=slice)
55 ns.save()
Scott Bakerb2bddd82015-08-06 17:21:34 -070056
Scott Baker97ca9102016-04-13 16:56:39 -070057 # this is really for vRouter
58 for provider_service_name in self.get_requirements("tosca.relationships.TenantOfService"):
59 provider_service = self.get_xos_object(Service, name=provider_service_name)
60
Scott Baker40a8b8d2016-04-14 17:19:17 -070061 existing_tenancy = Tenant.objects.filter(provider_service = provider_service, subscriber_network = obj)
Scott Baker97ca9102016-04-13 16:56:39 -070062 if existing_tenancy:
63 self.info("Tenancy relationship from %s to %s already exists" % (str(obj), str(provider_service)))
64 else:
65 from services.vrouter.models import VROUTER_KIND, VRouterService
66 if provider_service.kind == VROUTER_KIND:
67 tenancy = VRouterService.objects.get(id=provider_service.id).get_tenant(address_pool_name="addresses_"+obj.name, subscriber_network=obj)
68 tenancy.save()
Scott Baker40a8b8d2016-04-14 17:19:17 -070069 obj.subnet = tenancy.cidr
Scott Baker97ca9102016-04-13 16:56:39 -070070 else:
71 raise Exception("The only network tenancy relationships that are allowed are to vRouter services")
72
73 self.info("Created Tenancy relationship from %s to %s" % (str(obj), str(provider_service)))
74
Scott Baker2edd4f32015-08-14 12:41:18 -070075# v = self.get_property("permitted_slices")
76# if v:
77# for slicename in v.split(","):
78# slice = self.get_xos_object(Slice, name = slicename.strip())
79#
80# if not obj.permitted_slices.filter(id = slice.id).exists():
81# obj.permitted_slices.add(slice)
Scott Bakerb2bddd82015-08-06 17:21:34 -070082
83 def create(self):
84 nodetemplate = self.nodetemplate
85
86 xos_args = self.get_xos_args()
87
88 if not xos_args.get("owner", None):
89 raise Exception("Must specify slice when creating network")
90 if not xos_args.get("template", None):
91 raise Exception("Must specify network template when creating network")
92
Scott Bakerf175e6b2016-04-14 23:41:48 -070093 # XXX TODO: investigate using transaction.atomic instead of setting
94 # no_sync and no_policy
95
Scott Bakerb2bddd82015-08-06 17:21:34 -070096 network = Network(**xos_args)
97 network.caller = self.user
Scott Baker97ca9102016-04-13 16:56:39 -070098 network.no_sync = True # postprocess might set the cidr
Scott Bakerf175e6b2016-04-14 23:41:48 -070099 network.no_policy = True
Scott Bakerb2bddd82015-08-06 17:21:34 -0700100 network.save()
101
102 self.postprocess(network)
103
Scott Baker97ca9102016-04-13 16:56:39 -0700104 network.no_sync = False
Scott Bakerf175e6b2016-04-14 23:41:48 -0700105 network.no_policy = False
Scott Baker97ca9102016-04-13 16:56:39 -0700106 network.save()
107
Scott Bakerb2bddd82015-08-06 17:21:34 -0700108 self.info("Created Network '%s' owned by Slice '%s'" % (str(network), str(network.owner)))
109
110 def delete(self, obj):
111 super(XOSNetwork, self).delete(obj)
112
113
114