X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;ds=sidebyside;f=planetstack%2Fcore%2Fmodels%2Fnetwork.py;h=0b3400a5136d62f8814e2c95d5c7ba18284aaa88;hb=5c83974103b8829d1a1636f40eef34950fecf610;hp=51cc0c8708de57ec6630c1e0eff8aa3d77d31b3c;hpb=4df786ffd7b10707a21667dfb4494b1d05ff4eae;p=plstackapi.git diff --git a/planetstack/core/models/network.py b/planetstack/core/models/network.py index 51cc0c8..0b3400a 100644 --- a/planetstack/core/models/network.py +++ b/planetstack/core/models/network.py @@ -5,14 +5,68 @@ from core.models import PlCoreBase, Site, Slice, Sliver, Deployment from core.models import DeploymentLinkManager,DeploymentLinkDeletionManager from django.contrib.contenttypes.models import ContentType from django.contrib.contenttypes import generic +from django.core.exceptions import ValidationError # If true, then IP addresses will be allocated by the model. If false, then # we will assume the observer handles it. NO_OBSERVER=False +def ParseNatList(ports): + """ Support a list of ports in the format "protocol:port, protocol:port, ..." + examples: + tcp 123 + tcp 123:133 + tcp 123, tcp 124, tcp 125, udp 201, udp 202 + + User can put either a "/" or a " " between protocol and ports + Port ranges can be specified with "-" or ":" + """ + nats = [] + if ports: + parts = ports.split(",") + for part in parts: + part = part.strip() + if "/" in part: + (protocol, ports) = part.split("/",1) + elif " " in part: + (protocol, ports) = part.split(None,1) + else: + raise TypeError('malformed port specifier %s, format example: "tcp 123, tcp 201:206, udp 333"' % part) + + protocol = protocol.strip() + ports = ports.strip() + + if not (protocol in ["udp", "tcp"]): + raise ValueError('unknown protocol %s' % protocol) + + if "-" in ports: + (first, last) = ports.split("-") + first = int(first.strip()) + last = int(last.strip()) + portStr = "%d:%d" % (first, last) + elif ":" in ports: + (first, last) = ports.split(":") + first = int(first.strip()) + last = int(last.strip()) + portStr = "%d:%d" % (first, last) + else: + portStr = "%d" % int(ports) + + nats.append( {"l4_protocol": protocol, "l4_port": portStr} ) + + return nats + +def ValidateNatList(ports): + try: + ParseNatList(ports) + except Exception,e: + raise ValidationError(str(e)) + class NetworkTemplate(PlCoreBase): VISIBILITY_CHOICES = (('public', 'public'), ('private', 'private')) TRANSLATION_CHOICES = (('none', 'none'), ('NAT', 'NAT')) + TOPOLOGY_CHOICES = (('bigswitch', 'BigSwitch'), ('physical', 'Physical'), ('custom', 'Custom')) + CONTROLLER_CHOICES = ((None, 'None'), ('onos', 'ONOS'), ('custom', 'Custom')) name = models.CharField(max_length=32) description = models.CharField(max_length=1024, blank=True, null=True) @@ -21,6 +75,8 @@ class NetworkTemplate(PlCoreBase): translation = models.CharField(max_length=30, choices=TRANSLATION_CHOICES, default="none") sharedNetworkName = models.CharField(max_length=30, blank=True, null=True) sharedNetworkId = models.CharField(null=True, blank=True, max_length=256, help_text="Quantum network") + topologyKind = models.CharField(null=False, blank=False, max_length=30, choices=TOPOLOGY_CHOICES, default="BigSwitch") + controllerKind = models.CharField(null=True, blank=True, max_length=30, choices=CONTROLLER_CHOICES, default=None) def __unicode__(self): return u'%s' % (self.name) @@ -28,7 +84,7 @@ class Network(PlCoreBase): name = models.CharField(max_length=32) template = models.ForeignKey(NetworkTemplate) subnet = models.CharField(max_length=32, blank=True) - ports = models.CharField(max_length=1024, blank=True, null=True) + ports = models.CharField(max_length=1024, blank=True, null=True, validators=[ValidateNatList]) labels = models.CharField(max_length=1024, blank=True, null=True) owner = models.ForeignKey(Slice, related_name="ownedNetworks", help_text="Slice that owns control of this Network") @@ -38,6 +94,10 @@ class Network(PlCoreBase): slices = models.ManyToManyField(Slice, blank=True, related_name="networks", through="NetworkSlice") slivers = models.ManyToManyField(Sliver, blank=True, related_name="networks", through="NetworkSliver") + topologyParameters = models.TextField(null=True, blank=True) + controllerUrl = models.CharField(null=True, blank=True, max_length=1024) + controllerParameters = models.TextField(null=True, blank=True) + # for observer/manager network_id = models.CharField(null=True, blank=True, max_length=256, help_text="Quantum network") router_id = models.CharField(null=True, blank=True, max_length=256, help_text="Quantum router id") @@ -56,49 +116,7 @@ class Network(PlCoreBase): @property def nat_list(self): - """ Support a list of ports in the format "protocol:port, protocol:port, ..." - examples: - tcp 123 - tcp 123:133 - tcp 123, tcp 124, tcp 125, udp 201, udp 202 - - User can put either a "/" or a " " between protocol and ports - Port ranges can be specified with "-" or ":" - """ - nats = [] - if self.ports: - parts = self.ports.split(",") - for part in parts: - part = part.strip() - if "/" in part: - (protocol, ports) = part.split("/",1) - elif " " in part: - (protocol, ports) = part.split(None,1) - else: - raise TypeError('malformed port specifier %s, format example: "tcp 123, tcp 201:206, udp 333"' % part) - - protocol = protocol.strip() - ports = ports.strip() - - if not (protocol in ["udp", "tcp"]): - raise TypeError('unknown protocol %s' % protocol) - - if "-" in ports: - (first, last) = ports.split("-") - first = int(first.strip()) - last = int(last.strip()) - portStr = "%d:%d" % (first, last) - elif ":" in ports: - (first, last) = ports.split(":") - first = int(first.strip()) - last = int(last.strip()) - portStr = "%d:%d" % (first, last) - else: - portStr = "%d" % int(ports) - - nats.append( {"l4_protocol": protocol, "l4_port": portStr} ) - - return nats + return ParseNatList(self.ports) @staticmethod def select_by_user(user): @@ -115,8 +133,8 @@ class NetworkDeployments(PlCoreBase): deleted_objects = DeploymentLinkDeletionManager() # Stores the openstack ids at various deployments - network = models.ForeignKey(Network) - deployment = models.ForeignKey(Deployment) + network = models.ForeignKey(Network, related_name='networkdeployments') + deployment = models.ForeignKey(Deployment, related_name='networkdeployments') net_id = models.CharField(null=True, blank=True, max_length=256, help_text="Quantum network") router_id = models.CharField(null=True, blank=True, max_length=256, help_text="Quantum router id") subnet_id = models.CharField(null=True, blank=True, max_length=256, help_text="Quantum subnet id") @@ -139,8 +157,8 @@ class NetworkSlice(PlCoreBase): # This object exists solely so we can implement the permission check when # adding slices to networks. It adds no additional fields to the relation. - network = models.ForeignKey(Network) - slice = models.ForeignKey(Slice) + network = models.ForeignKey(Network,related_name='networkslices') + slice = models.ForeignKey(Slice,related_name='networkslices') def save(self, *args, **kwds): slice = self.slice @@ -168,8 +186,8 @@ class NetworkSlice(PlCoreBase): return qs class NetworkSliver(PlCoreBase): - network = models.ForeignKey(Network) - sliver = models.ForeignKey(Sliver) + network = models.ForeignKey(Network,related_name='networkslivers') + sliver = models.ForeignKey(Sliver,related_name='networkslivers') ip = models.GenericIPAddressField(help_text="Sliver ip address", blank=True, null=True) port_id = models.CharField(null=True, blank=True, max_length=256, help_text="Quantum port id") @@ -217,7 +235,7 @@ class NetworkParameterType(PlCoreBase): def __unicode__(self): return u'%s' % (self.name) class NetworkParameter(PlCoreBase): - parameter = models.ForeignKey(NetworkParameterType, related_name="parameters", help_text="The type of the parameter") + parameter = models.ForeignKey(NetworkParameterType, related_name="networkparameters", help_text="The type of the parameter") value = models.CharField(help_text="The value of this parameter", max_length=1024) # The required fields to do a ObjectType lookup, and object_id assignment