Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Synchronized access to CVM database
Change-Id: Ifd30e0245d30966aa670f670515466c9585de193
Partial-Bug: #1778931
  • Loading branch information
krzysztofg256 committed Jun 28, 2018
1 parent 43b0c64 commit fe78b94
Show file tree
Hide file tree
Showing 3 changed files with 53 additions and 45 deletions.
13 changes: 7 additions & 6 deletions cvm/__main__.py
Expand Up @@ -33,7 +33,7 @@ def load_config(config_file):
return esxi_cfg, vcenter_cfg, vnc_cfg


def build_monitor(config_file, database):
def build_monitor(config_file, lock, database):
esxi_cfg, vcenter_cfg, vnc_cfg = load_config(config_file)

esxi_api_client = ESXiAPIClient(esxi_cfg)
Expand Down Expand Up @@ -73,13 +73,13 @@ def build_monitor(config_file, database):
vm_removed_handler = VmRemovedHandler(vm_service, vmi_service, vrouter_port_service)
handlers = [vm_renamed_handler, vm_reconfigured_handler, vm_removed_handler]
vmware_controller = VmwareController(vm_service, vn_service,
vmi_service, vrouter_port_service, handlers)
vmi_service, vrouter_port_service, handlers, lock)
return VMwareMonitor(esxi_api_client, vmware_controller)


def run_introspect(args, database):
def run_introspect(args, database, lock):
sandesh = Sandesh()
sandesh_handler = SandeshHandler(database)
sandesh_handler = SandeshHandler(database, lock)
sandesh_handler.bind_handlers()
sandesh.init_generator('cvm', socket.gethostname(),
'contrail-vcenter-manager', '0', [],
Expand All @@ -91,9 +91,10 @@ def run_introspect(args, database):

def main(args):
database = Database()
vmware_monitor = build_monitor(args.config_file, database)
lock = gevent.lock.BoundedSemaphore()
vmware_monitor = build_monitor(args.config_file, lock, database)
run_introspect(args, database, lock)
vmware_monitor.sync()
run_introspect(args, database)
greenlets = [
gevent.spawn(vmware_monitor.start()),
]
Expand Down
29 changes: 16 additions & 13 deletions cvm/controllers.py
Expand Up @@ -7,30 +7,33 @@


class VmwareController(object):
def __init__(self, vm_service, vn_service, vmi_service, vrouter_port_service, handlers):
def __init__(self, vm_service, vn_service, vmi_service, vrouter_port_service, handlers, lock):
self._vm_service = vm_service
self._vn_service = vn_service
self._vmi_service = vmi_service
self._vrouter_port_service = vrouter_port_service
self._handlers = handlers
self._lock = lock

def initialize_database(self):
logger.info('Initializing database...')
self._vm_service.get_vms_from_vmware()
self._vn_service.update_vns()
self._vmi_service.sync_vmis()
self._vm_service.delete_unused_vms_in_vnc()
self._vrouter_port_service.sync_ports()
with self._lock:
self._vm_service.get_vms_from_vmware()
self._vn_service.update_vns()
self._vmi_service.sync_vmis()
self._vm_service.delete_unused_vms_in_vnc()
self._vrouter_port_service.sync_ports()

def handle_update(self, update_set):
logger.info('Handling ESXi update.')
for handler in self._handlers:
handler.handle_update(update_set)

for property_filter_update in update_set.filterSet:
for object_update in property_filter_update.objectSet:
for property_change in object_update.changeSet:
self._handle_change(object_update.obj, property_change)
with self._lock:
for handler in self._handlers:
handler.handle_update(update_set)

for property_filter_update in update_set.filterSet:
for object_update in property_filter_update.objectSet:
for property_change in object_update.changeSet:
self._handle_change(object_update.obj, property_change)

def _handle_change(self, obj, property_change):
name = getattr(property_change, 'name', None)
Expand Down
56 changes: 30 additions & 26 deletions cvm/sandesh_handler.py
Expand Up @@ -10,8 +10,9 @@


class SandeshHandler(object):
def __init__(self, database):
def __init__(self, database, lock):
self._database = database
self._lock = lock
self._converter = SandeshConverter(self._database)

def bind_handlers(self):
Expand All @@ -20,39 +21,42 @@ def bind_handlers(self):
VirtualMachineInterfaceRequest.handle_request = self.handle_virtual_machine_interface_request

def handle_virtual_machine_request(self, request):
if request.uuid is not None:
vm_models = [self._database.get_vm_model_by_uuid(request.uuid)]
elif request.name is not None:
vm_models = [self._database.get_vm_model_by_name(request.name)]
else:
vm_models = self._database.get_all_vm_models()
virtual_machines_data = [
self._converter.convert_vm(vm_model) for vm_model in vm_models if vm_model is not None
]
with self._lock:
if request.uuid is not None:
vm_models = [self._database.get_vm_model_by_uuid(request.uuid)]
elif request.name is not None:
vm_models = [self._database.get_vm_model_by_name(request.name)]
else:
vm_models = self._database.get_all_vm_models()
virtual_machines_data = [
self._converter.convert_vm(vm_model) for vm_model in vm_models if vm_model is not None
]
response = VirtualMachineResponse(virtual_machines_data)
response.response(request.context())

def handle_virtual_network_request(self, request):
if request.uuid is not None:
vn_models = [self._database.get_vn_model_by_uuid(request.uuid)]
elif request.key is not None:
vn_models = [self._database.get_vn_model_by_key(request.key)]
else:
vn_models = self._database.get_all_vn_models()
virtual_networks_data = [
self._converter.convert_vn(vn_model) for vn_model in vn_models if vn_model is not None
]
with self._lock:
if request.uuid is not None:
vn_models = [self._database.get_vn_model_by_uuid(request.uuid)]
elif request.key is not None:
vn_models = [self._database.get_vn_model_by_key(request.key)]
else:
vn_models = self._database.get_all_vn_models()
virtual_networks_data = [
self._converter.convert_vn(vn_model) for vn_model in vn_models if vn_model is not None
]
response = VirtualNetworkResponse(virtual_networks_data)
response.response(request.context())

def handle_virtual_machine_interface_request(self, request):
if request.uuid is not None:
vmi_models = [self._database.get_vmi_model_by_uuid(request.uuid)]
else:
vmi_models = self._database.get_all_vmi_models()
virtual_interfaces_data = [
self._converter.convert_vmi(vmi_model) for vmi_model in vmi_models if vmi_model is not None
]
with self._lock:
if request.uuid is not None:
vmi_models = [self._database.get_vmi_model_by_uuid(request.uuid)]
else:
vmi_models = self._database.get_all_vmi_models()
virtual_interfaces_data = [
self._converter.convert_vmi(vmi_model) for vmi_model in vmi_models if vmi_model is not None
]
response = VirtualMachineInterfaceResponse(virtual_interfaces_data)
response.response(request.context())

Expand Down

0 comments on commit fe78b94

Please sign in to comment.