blob: fe0a7f66806148d00464e6c2c5b27e4c28427d38 [file] [log] [blame]
from __future__ import absolute_import
import sys
import json
import operator
from operator import attrgetter
from core.models.plcorebase import *
from django.contrib.contenttypes.fields import GenericForeignKey, GenericRelation
from django.contrib.contenttypes.models import ContentType
from django.utils.timezone import now
from core.acl import AccessControlList
from django.core.exceptions import ValidationError,PermissionDenied
from distutils.version import LooseVersion
from django.db import models,transaction
from django.db.models import *
from django.core.validators import URLValidator
from xos.exceptions import *
import urlparse
from xos.config import Config
config = Config()
# 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))
def get_default_flavor(controller = None):
# Find a default flavor that can be used for a instance. This is particularly
# useful in evolution. It's also intended this helper function can be used
# for admin.py when users
if controller:
flavors = controller.flavors.all()
else:
from core.models.flavor import Flavor
flavors = Flavor.objects.all()
if not flavors:
return None
for flavor in flavors:
if flavor.default:
return flavor
return flavors[0]
class InstanceDeletionManager(PlCoreBaseDeletionManager):
def get_queryset(self):
parent=super(InstanceDeletionManager, self)
try:
backend_type = config.observer_backend_type
except AttributeError:
backend_type = None
parent_queryset = parent.get_queryset() if hasattr(parent, "get_queryset") else parent.get_query_set()
if (backend_type):
return parent_queryset.filter(Q(node__controller__backend_type=backend_type))
else:
return parent_queryset
# deprecated in django 1.7 in favor of get_queryset().
def get_query_set(self):
return self.get_queryset()
class InstanceManager(PlCoreBaseManager):
def get_queryset(self):
parent=super(InstanceManager, self)
try:
backend_type = config.observer_backend_type
except AttributeError:
backend_type = None
parent_queryset = parent.get_queryset() if hasattr(parent, "get_queryset") else parent.get_query_set()
if backend_type:
return parent_queryset.filter(Q(node__controller__backend_type=backend_type))
else:
return parent_queryset
# deprecated in django 1.7 in favor of get_queryset().
def get_query_set(self):
return self.get_queryset()
def get_default_serviceclass():
from core.models.serviceclass import ServiceClass
try:
return ServiceClass.objects.get(name="Best Effort")
except ServiceClass.DoesNotExist:
return None
class ControllerLinkDeletionManager(PlCoreBaseDeletionManager):
def get_queryset(self):
parent=super(ControllerLinkDeletionManager, self)
try:
backend_type = config.observer_backend_type
except AttributeError:
backend_type = None
parent_queryset = parent.get_queryset() if hasattr(parent, "get_queryset") else parent.get_query_set()
if (backend_type):
return parent_queryset.filter(Q(controller__backend_type=backend_type))
else:
return parent_queryset
# deprecated in django 1.7 in favor of get_queryset().
def get_query_set(self):
return self.get_queryset()
class ControllerDeletionManager(PlCoreBaseDeletionManager):
def get_queryset(self):
parent=super(ControllerDeletionManager, self)
try:
backend_type = config.observer_backend_type
except AttributeError:
backend_type = None
parent_queryset = parent.get_queryset() if hasattr(parent, "get_queryset") else parent.get_query_set()
if backend_type:
return parent_queryset.filter(Q(backend_type=backend_type))
else:
return parent_queryset
# deprecated in django 1.7 in favor of get_queryset().
def get_query_set(self):
return self.get_queryset()
class ControllerLinkManager(PlCoreBaseManager):
def get_queryset(self):
parent=super(ControllerLinkManager, self)
try:
backend_type = config.observer_backend_type
except AttributeError:
backend_type = None
parent_queryset = parent.get_queryset() if hasattr(parent, "get_queryset") else parent.get_query_set()
if backend_type:
return parent_queryset.filter(Q(controller__backend_type=backend_type))
else:
return parent_queryset
# deprecated in django 1.7 in favor of get_queryset().
def get_query_set(self):
return self.get_queryset()
class ControllerManager(PlCoreBaseManager):
def get_queryset(self):
parent=super(ControllerManager, self)
try:
backend_type = config.observer_backend_type
except AttributeError:
backend_type = None
parent_queryset = parent.get_queryset() if hasattr(parent, "get_queryset") else parent.get_query_set()
if backend_type:
return parent_queryset.filter(Q(backend_type=backend_type))
else:
return parent_queryset
# deprecated in django 1.7 in favor of get_queryset().
def get_query_set(self):
return self.get_queryset()