from django.db import models
from core.models import Service, PlCoreBase, Slice, Instance, Tenant, TenantWithContainer, Node, Image, User, Flavor, Subscriber, NetworkParameter, NetworkParameterType, Port, AddressPool
from core.models.plcorebase import StrippedCharField
import os
from django.db import models, transaction
from django.forms.models import model_to_dict
from django.db.models import Q
from operator import itemgetter, attrgetter, methodcaller
from core.models import Tag
from core.models.service import LeastLoadedNodeScheduler
import traceback
from xos.exceptions import *
from xos.config import Config


class ConfigurationError(Exception):
    pass


PROGRAN_KIND = "Progran"
APP_LABEL = "progran"



class VProgranService(Service):
    KIND = PROGRAN_KIND

    class Meta:
        app_label = APP_LABEL
        verbose_name = "Progran Service"
        proxy = True

    default_attributes = {
        "rest_hostname": "10.6.0.1",
        "rest_port": "8183",
        "rest_user": "onos",
        "rest_pass": "rocks"
    }

    @property
    def rest_hostname(self):
        return self.get_attribute("rest_hostname", self.default_attributes["rest_hostname"])

    @rest_hostname.setter
    def rest_hostname(self, value):
        self.set_attribute("rest_hostname", value)

    @property
    def rest_port(self):
        return self.get_attribute("rest_port", self.default_attributes["rest_port"])

    @rest_port.setter
    def rest_port(self, value):
        self.set_attribute("rest_port", value)

    @property
    def rest_user(self):
        return self.get_attribute("rest_user", self.default_attributes["rest_user"])

    @rest_user.setter
    def rest_user(self, value):
        self.set_attribute("rest_user", value)

    @property
    def rest_pass(self):
        return self.get_attribute("rest_pass", self.default_attributes["rest_pass"])




class VProgranImsi(PlCoreBase):
    class Meta:
        app_label = APP_LABEL
        verbose_name = "vProgran Imsi"

    uiid = models.IntegerField( help_text="uiid ", null=False, blank=False)
    imsi = models.CharField(max_length=20, help_text="imsi ", null=False, blank=False)
    profile = models.CharField(max_length=20, help_text="profile name", null=True, blank=True)


class VProgranProfile(PlCoreBase):

    class Meta:
        app_label = APP_LABEL
        verbose_name = "vProgran Profile"

    uiid = models.IntegerField( help_text="uiid ", null=False, blank=False)
    profile = models.CharField(max_length=20, help_text="profile name", null=False, blank=False)
    dlrate = models.IntegerField( help_text="device download rate", null=False, blank=False)
    ulrate = models.IntegerField( help_text="device upload rate", null=False, blank=False )

