def update_port_postcommit(self, context): """Update the name of a given port in EOS. At the moment we only support port name change Any other change to port is not supported at this time. """ port = context.current orig_port = context.original device_id = port['device_id'] device_owner = port['device_owner'] host = context.host is_vm_boot = device_id and device_owner if host and is_vm_boot: port_id = port['id'] port_name = port['name'] network_id = port['network_id'] tenant_id = port['tenant_id'] if not tenant_id: tenant_id = context._plugin_context.tenant_id with self.eos_sync_lock: hostname = self._host_name(host) segmentation_id = db_lib.get_segmentation_id(tenant_id, network_id) vm_provisioned = db_lib.is_vm_provisioned(device_id, host, port_id, network_id, tenant_id) # If network does not exist under this tenant, # it may be a shared network. Get shared network owner Id net_provisioned = ( db_lib.is_network_provisioned(tenant_id, network_id, segmentation_id) or self.ndb.get_shared_network_owner_id(network_id) ) if vm_provisioned and net_provisioned: try: orig_host = orig_port['binding:host_id'] if host != orig_host: # The port moved to a different host. So delete the # old port on the old host before creating a new # port on the new host. self._delete_port(port, orig_host, tenant_id) self.rpc.plug_port_into_network(device_id, hostname, port_id, network_id, tenant_id, port_name, device_owner) except arista_exc.AristaRpcError: LOG.info(EOS_UNREACHABLE_MSG) raise ml2_exc.MechanismDriverError() else: LOG.info(_LI('VM %s is not updated as it is not found in ' 'Arista DB'), device_id)
def update_port_postcommit(self, context): """Update the name of a given port in EOS. At the moment we only support port name change Any other change to port is not supported at this time. """ port = context.current orig_port = context.original device_id = port['device_id'] device_owner = port['device_owner'] host = context.host is_vm_boot = device_id and device_owner if host and is_vm_boot: port_id = port['id'] port_name = port['name'] network_id = port['network_id'] tenant_id = port['tenant_id'] or INTERNAL_TENANT_ID with self.eos_sync_lock: hostname = self._host_name(host) segmentation_id = db_lib.get_segmentation_id(tenant_id, network_id) vm_provisioned = db_lib.is_vm_provisioned(device_id, host, port_id, network_id, tenant_id) # If network does not exist under this tenant, # it may be a shared network. Get shared network owner Id net_provisioned = ( db_lib.is_network_provisioned(tenant_id, network_id, segmentation_id) or self.ndb.get_shared_network_owner_id(network_id) ) if vm_provisioned and net_provisioned: try: orig_host = orig_port['binding:host_id'] if host != orig_host: # The port moved to a different host. So delete the # old port on the old host before creating a new # port on the new host. self._delete_port(port, orig_host, tenant_id) self.rpc.plug_port_into_network(device_id, hostname, port_id, network_id, tenant_id, port_name, device_owner) except arista_exc.AristaRpcError: LOG.info(EOS_UNREACHABLE_MSG) raise ml2_exc.MechanismDriverError() else: LOG.info(_LI('VM %s is not updated as it is not found in ' 'Arista DB'), device_id)
def test_vm_is_remembered(self): vm_id = 'VM-1' tenant_id = 'test' network_id = '123' port_id = 456 host_id = 'ubuntu1' db_lib.remember_vm(vm_id, host_id, port_id, network_id, tenant_id) vm_provisioned = db_lib.is_vm_provisioned(vm_id, host_id, port_id, network_id, tenant_id) self.assertTrue(vm_provisioned, 'VM must be provisioned')
def test_vm_is_removed(self): vm_id = 'VM-1' tenant_id = 'test' network_id = '123' port_id = 456 host_id = 'ubuntu1' db_lib.remember_vm(vm_id, host_id, port_id, network_id, tenant_id) db_lib.forget_vm(vm_id, host_id, port_id, network_id, tenant_id) vm_provisioned = db_lib.is_vm_provisioned(vm_id, host_id, port_id, network_id, tenant_id) self.assertFalse(vm_provisioned, 'The vm should be deleted')
def delete_port_precommit(self, context): """Delete information about a VM and host from the DB.""" port = context.current host_id = context.host device_id = port["device_id"] tenant_id = port["tenant_id"] if not tenant_id: tenant_id = context._plugin_context.tenant_id network_id = port["network_id"] port_id = port["id"] with self.eos_sync_lock: if db_lib.is_vm_provisioned(device_id, host_id, port_id, network_id, tenant_id): db_lib.forget_vm(device_id, host_id, port_id, network_id, tenant_id)
def delete_port_precommit(self, context): """Delete information about a VM and host from the DB.""" port = context.current host_id = context.host device_id = port['device_id'] tenant_id = port['tenant_id'] or INTERNAL_TENANT_ID network_id = port['network_id'] port_id = port['id'] with self.eos_sync_lock: if db_lib.is_vm_provisioned(device_id, host_id, port_id, network_id, tenant_id): db_lib.forget_vm(device_id, host_id, port_id, network_id, tenant_id)
def create_port_postcommit(self, context): """Plug a physical host into a network. Send provisioning request to Arista Hardware to plug a host into appropriate network. """ port = context.current device_id = port['device_id'] device_owner = port['device_owner'] host = context.host # device_id and device_owner are set on VM boot is_vm_boot = device_id and device_owner if host and is_vm_boot: port_id = port['id'] port_name = port['name'] network_id = port['network_id'] tenant_id = port['tenant_id'] if not tenant_id: tenant_id = context._plugin_context.tenant_id with self.eos_sync_lock: hostname = self._host_name(host) vm_provisioned = db_lib.is_vm_provisioned(device_id, host, port_id, network_id, tenant_id) # If network does not exist under this tenant, # it may be a shared network. Get shared network owner Id net_provisioned = ( db_lib.is_network_provisioned(tenant_id, network_id) or self.ndb.get_shared_network_owner_id(network_id) ) if vm_provisioned and net_provisioned: try: self.rpc.plug_port_into_network(device_id, hostname, port_id, network_id, tenant_id, port_name, device_owner) except arista_exc.AristaRpcError: LOG.info(EOS_UNREACHABLE_MSG) raise ml2_exc.MechanismDriverError() else: LOG.info(_LI('VM %s is not created as it is not found in ' 'Arista DB'), device_id)
def update_port_postcommit(self, context): """Update the name of a given port in EOS. At the moment we only support port name change Any other change to port is not supported at this time. """ port = context.current orig_port = context.original if port['name'] == orig_port['name']: # nothing to do return device_id = port['device_id'] device_owner = port['device_owner'] host = context.host is_vm_boot = device_id and device_owner if host and is_vm_boot: port_id = port['id'] port_name = port['name'] network_id = port['network_id'] tenant_id = port['tenant_id'] if not tenant_id: tenant_id = context._plugin_context.tenant_id with self.eos_sync_lock: hostname = self._host_name(host) segmentation_id = db_lib.get_segmentation_id( tenant_id, network_id) vm_provisioned = db_lib.is_vm_provisioned( device_id, host, port_id, network_id, tenant_id) # If network does not exist under this tenant, # it may be a shared network. Get shared network owner Id net_provisioned = ( db_lib.is_network_provisioned(tenant_id, network_id, segmentation_id) or self.ndb.get_shared_network_owner_id(network_id)) if vm_provisioned and net_provisioned: try: self.rpc.plug_port_into_network( device_id, hostname, port_id, network_id, tenant_id, port_name, device_owner) except arista_exc.AristaRpcError: LOG.info(EOS_UNREACHABLE_MSG) raise ml2_exc.MechanismDriverError() else: LOG.info( _LI('VM %s is not updated as it is not found in ' 'Arista DB'), device_id)
def delete_port_precommit(self, context): """Delete information about a VM and host from the DB.""" port = context.current host_id = context.host device_id = port['device_id'] tenant_id = port['tenant_id'] network_id = port['network_id'] port_id = port['id'] with self.eos_sync_lock: if db_lib.is_vm_provisioned(device_id, host_id, port_id, network_id, tenant_id): db_lib.forget_vm(device_id, host_id, port_id, network_id, tenant_id) # if necessary, delete tenant as well. self.delete_tenant(tenant_id)
def create_port_postcommit(self, context): """Plug a physical host into a network. Send provisioning request to Arista Hardware to plug a host into appropriate network. """ port = context.current device_id = port['device_id'] device_owner = port['device_owner'] host = context.host # device_id and device_owner are set on VM boot is_vm_boot = device_id and device_owner if host and is_vm_boot: port_id = port['id'] port_name = port['name'] network_id = port['network_id'] tenant_id = port['tenant_id'] or INTERNAL_TENANT_ID with self.eos_sync_lock: hostname = self._host_name(host) vm_provisioned = db_lib.is_vm_provisioned(device_id, host, port_id, network_id, tenant_id) # If network does not exist under this tenant, # it may be a shared network. Get shared network owner Id net_provisioned = ( db_lib.is_network_provisioned(tenant_id, network_id) or self.ndb.get_shared_network_owner_id(network_id) ) if vm_provisioned and net_provisioned: try: self.rpc.plug_port_into_network(device_id, hostname, port_id, network_id, tenant_id, port_name, device_owner) except arista_exc.AristaRpcError: LOG.info(EOS_UNREACHABLE_MSG) raise ml2_exc.MechanismDriverError() else: LOG.info(_LI('VM %s is not created as it is not found in ' 'Arista DB'), device_id)