Fix vPGWC synchronizer issues and proxy model display
Change-Id: Ie0b8a36b9ab8a1480c8a582bc3a7d5c5aa65c4bc
diff --git a/xos/header.py b/xos/header.py
new file mode 100644
index 0000000..ba07ed8
--- /dev/null
+++ b/xos/header.py
@@ -0,0 +1,21 @@
+from django.db import models
+from core.models import Service, PlCoreBase, Slice, Instance, Tenant, TenantWithContainer, Node, Image, User, Flavor, 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 *
+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
+from django.contrib.contenttypes.models import ContentType
+from django.contrib.contenttypes.fields import GenericForeignKey
+
+MCORD_KIND = "vEPC"
+SERVICE_NAME_VERBOSE = 'Virtual Packet Gateway -- Control Service'
+SERVICE_NAME_VERBOSE_PLURAL = 'Virtual Packet Gateway -- Control Services'
+TENANT_NAME_VERBOSE = 'Virtual Packet Gateway -- Control Tenant'
+TENANT_NAME_VERBOSE_PLURAL = 'Virtual Packet Gateway -- Control Tenants'
diff --git a/xos/models.py b/xos/models.py
deleted file mode 100644
index 7799183..0000000
--- a/xos/models.py
+++ /dev/null
@@ -1,186 +0,0 @@
-from core.models import Service, PlCoreBase, Slice, Instance, Tenant, TenantWithContainer, Node, Image, User, Flavor, NetworkParameter, NetworkParameterType, AddressPool, Port
-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 core.models import SlicePrivilege, SitePrivilege
-from sets import Set
-from xos.config import Config
-from models_decl import *
-
-class VPGWCService (VPGWCService_decl):
- class Meta:
- proxy = True
-
-class VPGWCTenant (VPGWCTenant_decl):
- class Meta:
- proxy = True
-
- def __init__(self, *args, **kwargs):
- pgwc_services = VPGWCService.get_service_objects().all()
- # When the tenant is created the default service in the form is set
- # to be the first created HelloWorldServiceComplete
- if pgwc_services:
- self._meta.get_field(
- "provider_service").default = pgwc_services[0].id
- super(VPGWCTenant, self).__init__(*args, **kwargs)
-
- def can_update(self, user):
- #Allow creation of this model instances for non-admin users also
- return True
-
- def save(self, *args, **kwargs):
- '''
- if not self.creator:
- if not getattr(self, "caller", None):
- # caller must be set when creating a monitoring channel since it creates a slice
- raise XOSProgrammingError("ServiceComponents's self.caller was not set")
- self.creator = self.caller
- if not self.creator:
- raise XOSProgrammingError("ServiceComponents's self.creator was not set")
- '''
- super(VPGWCTenant, self).save(*args, **kwargs)
- # This call needs to happen so that an instance is created for this
- # tenant is created in the slice. One instance is created per tenant.
- model_policy_mcord_servicecomponent(self.pk)
-# def save_instance(self, instance):
-# with transaction.atomic():
-# super(VPGWCTenant, self).save_instance(instance)
-# if instance.isolation in ["vm"]:
-# for ntype in vpgwc_net_types:
-# lan_network = self.get_lan_network(instance, ntype)
-# port = self.find_or_make_port(instance,lan_network)
-# if (ntype == "s5s8"):
-# port.set_parameter("s_tag", self.s5s8_pgw_tag)
-# port.set_parameter("neutron_port_name", "stag-%s" % self.s5s8_pgw_tag)
-# port.save()
-# else:
-# return True
-
- def save_instance(self, instance):
- with transaction.atomic():
- super(VPGWCTenant, self).save_instance(instance)
- #if instance.isolation in ["vm"]:
- # if self.image_name == 'pgwu':
- # lan_network = self.get_lan_network(instance, "wan_network")
- # port = self.find_or_make_port(instance,lan_network)
- # port.set_parameter("neutron_port_ip", "102.0.0.8")
- # port.save()
-
- def delete(self, *args, **kwargs):
- # Delete the instance that was created for this tenant
- self.cleanup_container()
- super(VPGWCTenant, self).delete(*args, **kwargs)
-
- def find_or_make_port(self, instance, network, **kwargs):
- port = Port.objects.filter(instance=instance, network=network)
- if port:
- port = port[0]
- print "port already exist", port[0]
- else:
- port = Port(instance=instance, network=network, **kwargs)
- print "NETWORK", network, "MAKE_PORT", port
- port.save()
- return port
-
- def get_lan_network(self, instance, ntype):
- slice = self.provider_service.slices.all()[0]
- lan_networks = [x for x in slice.networks.all() if ntype in x.name]
- if not lan_networks:
- raise XOSProgrammingError("No lan_network")
- return lan_networks[0]
-
- def manage_container(self):
- from core.models import Instance, Flavor
- if self.deleted:
- return
- # For container or container_vm isolation, use what TenantWithCotnainer
- # provides us
- slice = self.get_slice()
- if slice.default_isolation in ["container_vm", "container"]:
- super(VPGWCTenant,self).manage_container()
- return
- if not self.s5s8_pgw_tag:
- raise XOSConfigurationError("S5S8_PGW_TAG is missed")
- if self.instance:
- # We're good.
- return
- instance = self.make_instance()
- self.instance = instance
- super(TenantWithContainer, self).save()
-
- def get_slice(self):
- if not self.provider_service.slices.count():
- raise XOSConfigurationError("The service has no slices")
- slice = self.provider_service.slices.all()[0]
- return slice
-
- def make_instance(self):
- slice = self.provider_service.slices.all()[0]
- flavors = Flavor.objects.filter(name=slice.default_flavor)
-# flavors = Flavor.objects.filter(name="m1.xlarge")
- if not flavors:
- raise XOSConfigurationError("No default flavor")
- default_flavor = slice.default_flavor
- slice = self.provider_service.slices.all()[0]
- if slice.default_isolation == "container_vm":
- (node, parent) = ContainerVmScheduler(slice).pick()
- else:
- (node, parent) = LeastLoadedNodeScheduler(slice).pick()
- instance = Instance(slice = slice,
- node = node,
- image = self.image,
- creator = self.creator,
- deployment = node.site_deployment.deployment,
- flavor = flavors[0],
- isolation = slice.default_isolation,
- parent = parent)
- self.save_instance(instance)
- return instance
-
- def ip_to_mac(self, ip):
- (a, b, c, d) = ip.split('.')
- return "02:42:%02x:%02x:%02x:%02x" % (int(a), int(b), int(c), int(d))
-
- @property
- def image(self):
- img = self.image_name.strip()
- if img.lower() != "default":
- return Image.objects.get(name=img)
- else:
- return super(VPGWCTenant, self).image
-
- @property
- def addresses(self):
- if (not self.id) or (not self.instance):
- return {}
- addresses = {}
- for ns in self.instance.ports.all():
- if "s5s8_pgw" in ns.network.name.lower():
- addresses["s5s8_pgw"] = (ns.ip, ns.mac)
- return addresses
-
- @property
- def s5s8_pgw_ip(self):
- return self.addresses.get("s5s8_pgw", (None, None))[0]
-
- @property
- def s5s8_pgw_mac(self):
- return self.addresses.get("s5s8_pgw", (None, None))[1]
-
-def model_policy_mcord_servicecomponent(pk):
- # This section of code is atomic to prevent race conditions
- with transaction.atomic():
- # We find all of the tenants that are waiting to update
- tenant = VPGWCTenant.objects.select_for_update().filter(pk=pk)
- if not tenant:
- return
- # Since this code is atomic it is safe to always use the first tenant
- tenant = tenant[0]
- tenant.manage_container()
diff --git a/xos/synchronizer/steps/sync_vpgwctenant.py b/xos/synchronizer/steps/sync_vpgwctenant.py
index a8b9e22..fde029d 100644
--- a/xos/synchronizer/steps/sync_vpgwctenant.py
+++ b/xos/synchronizer/steps/sync_vpgwctenant.py
@@ -1,8 +1,6 @@
import os
import sys
-#from django.db.models import Q, F
-#from services.vpgwc.models import VPGWCService, VPGWCTenant
-#from synchronizers.base.SyncInstanceUsingAnsible import SyncInstanceUsingAnsible
+from django.db.models import Q, F
from synchronizers.new_base.SyncInstanceUsingAnsible import SyncInstanceUsingAnsible
from synchronizers.new_base.modelaccessor import *
@@ -24,38 +22,37 @@
def __init__(self, *args, **kwargs):
super(SyncVPGWCTenant, self).__init__(*args, **kwargs)
-# def fetch_pending(self, deleted):
-#
-# if (not deleted):
-# objs = VPGWCTenant.get_tenant_objects().filter(
-# Q(enacted__lt=F('updated')) | Q(enacted=None), Q(lazy_blocked=False))
-# else:
-#
-# objs = VPGWCTenant.get_deleted_tenant_objects()
-#
-# return objs
+ def fetch_pending(self, deleted):
- def get_vpgwc(self, o):
- if not o.provider_service:
- return None
+ if (not deleted):
+ objs = VPGWCTenant.get_tenant_objects().filter(
+ Q(enacted__lt=F('updated')) | Q(enacted=None), Q(lazy_blocked=False))
+ else:
- vpgwc = VPGWCService.objects.filter(id=o.provider_service.id)
+ objs = VPGWCTenant.get_deleted_tenant_objects()
- if not vpgwc:
- return None
+ return objs
- return vpgwc[0]
+ #def get_vpgwc(self, o):
+ # if not o.provider_service:
+ # return None
+ # vpgwc = VPGWCService.objects.filter(id=o.provider_service.id)
+
+ # if not vpgwc:
+ # return None
+
+ # return vpgwc[0]
# Gets the attributes that are used by the Ansible template but are not
# part of the set of default attributes.
+
def get_extra_attributes(self, o):
fields = {}
- fields['tenant_message'] = o.tenant_message
- vpgwc = self.get_vpgwc(o)
- fields['service_message'] = vpgwc.service_message
+ fields['display_message'] = o.display_message
+ fields['s5s8_pgw_tag'] = o.s5s8_pgw_tag
+ fields['image_name'] = o.image_name
return fields
- # return {"display_message": o.display_message,
- # "s5s8_pgw_tag": o.s5s8_pgw_tag,
- # "image_name": o.image_name,
- # }
\ No newline at end of file
+
+ def delete_record(self, port):
+ pass
diff --git a/xos/synchronizer/vpgwc_from_api_config b/xos/synchronizer/vpgwc_from_api_config
index 811b011..b706488 100755
--- a/xos/synchronizer/vpgwc_from_api_config
+++ b/xos/synchronizer/vpgwc_from_api_config
@@ -1,4 +1,4 @@
-Sets options for the syncrhonizer
+# Sets options for the synchronizer
[observer]
name=vpgwc
dependency_graph=/opt/xos/synchronizers/vpgwc/model-deps
diff --git a/xos/templates/vpgwcadmin.html b/xos/templates/vpgwcadmin.html
new file mode 100644
index 0000000..099ceea
--- /dev/null
+++ b/xos/templates/vpgwcadmin.html
@@ -0,0 +1,9 @@
+<div class = "left-nav">
+ <ul>
+ <li>
+ <a href="/admin/mcordservice/vpgwccomponent/">
+ vPGWC Service Components
+ </a>
+ </li>
+ </ul>
+</div>
diff --git a/xos/tosca/resources/vpgwctenant.py b/xos/tosca/resources/vpgwctenant.py
index 9b47e3b..4b73116 100644
--- a/xos/tosca/resources/vpgwctenant.py
+++ b/xos/tosca/resources/vpgwctenant.py
@@ -11,7 +11,6 @@
def get_xos_args(self, throw_exception=True):
args = super(XOSVPGWCTenant, self).get_xos_args()
- # ExampleTenant must always have a provider_service
provider_name = self.get_requirement("tosca.relationships.TenantOfService", throw_exception=True)
if provider_name:
args["provider_service"] = self.get_xos_object(Service, throw_exception=True, name=provider_name)
diff --git a/xos/vpgwc-onboard.yaml b/xos/vpgwc-onboard.yaml
index c1a3145..69db0ca 100644
--- a/xos/vpgwc-onboard.yaml
+++ b/xos/vpgwc-onboard.yaml
@@ -7,7 +7,7 @@
topology_template:
node_templates:
- vpgwc:
+ servicecontroller#vpgwc:
type: tosca.nodes.ServiceController
properties:
base_url: file:///opt/xos_services/vpgwc/xos/
@@ -15,7 +15,9 @@
# base_url is non-null.
xproto: ./
admin: admin.py
-# models: models.py
+ admin_template: templates/vpgwcadmin.html
+ #synchronizer: synchronizer/manifest
+ #synchronizer_run: vpgwc-synchronizer.py
tosca_custom_types: tosca/custom_types/vpgwc.yaml
tosca_resource: tosca/resources/vpgwcservice.py, tosca/resources/vpgwctenant.py
private_key: file:///opt/xos/key_import/mcord_rsa
diff --git a/xos/vpgwc.xproto b/xos/vpgwc.xproto
index 4ae865c..fbe6d24 100644
--- a/xos/vpgwc.xproto
+++ b/xos/vpgwc.xproto
@@ -1,16 +1,15 @@
option name = "vPGWC";
-option verbose_name = "VPGWCService";
-option legacy = "True";
+option verbose_name = "Virtual Packet Gateway -- Control";
message VPGWCService (Service) {
option name = "VPGWCService";
- option verbose_name = "Virtual Packet Gateway Control Service";
+ option verbose_name = "Virtual Packet Gateway -- Control Service";
}
message VPGWCTenant (TenantWithContainer) {
option name = "VPGWCTenant";
- option verbose_name = "Virtual Packet Gateway Control Tenant";
- optional string display_message = 1 [db_index = False, max_length = 1024, null = True, blank = False, default = "New vpgwc Component"];
+ option verbose_name = "Virtual Packet Gateway -- Control Tenant";
+ optional string display_message = 1 [db_index = False, max_length = 1024, null = True, blank = False, default = "New vPGWC Component"];
optional string s5s8_pgw_tag = 2 [db_index = False, max_length = 1024, null = True, content = "stripped", blank = False, default = "300"];
optional string image_name = 3 [db_index = False, max_length = 1024, null = True, content = "stripped", blank = False, default = "default"];
}