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 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) port_provisioned = db_lib.is_port_provisioned(port_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) ) try: orig_host = orig_port['binding:host_id'] if host != orig_host: try: # The port moved to a different host or the VM # connected to the port was deleted. So delete the # old port on the old host. self._delete_port(orig_port, orig_host, tenant_id) except ml2_exc.MechanismDriverError: # If deleting a port fails, then not much can be done # about it. Log a warning and move on. LOG.warn(UNABLE_TO_DELETE_PORT_MSG) if(port_provisioned and net_provisioned and hostname and is_vm_boot): # Plug port into the network only if it exists on a host # and if it has an owner 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()
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 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 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 vnic_type = port['binding:vnic_type'] binding_profile = port['binding:profile'] profile = [] if binding_profile: profile = binding_profile['local_link_information'] port_id = port['id'] port_name = port['name'] network_id = port['network_id'] tenant_id = port['tenant_id'] or INTERNAL_TENANT_ID sg = port['security_groups'] orig_sg = orig_port['security_groups'] pretty_log("update_port_postcommit: new", port) pretty_log("update_port_postcommit: orig", orig_port) with self.eos_sync_lock: hostname = self._host_name(host) segmentation_id = db_lib.get_segmentation_id(tenant_id, network_id) port_host_filter = None if(port['device_owner'] == n_const.DEVICE_OWNER_DVR_INTERFACE): # <port, host> uniquely identifies a DVR port. Other # ports are identified by just the port id port_host_filter = host port_provisioned = db_lib.is_port_provisioned(port_id, port_host_filter) # If network does not exist under this tenant, # it may be a shared network. Get shared network owner Id net_provisioned = self._network_provisioned(tenant_id, network_id, segmentation_id) try: orig_host = context.original_host port_down = False if(port['device_owner'] == n_const.DEVICE_OWNER_DVR_INTERFACE): # We care about port status only for DVR ports port_down = context.status == n_const.PORT_STATUS_DOWN if orig_host and (port_down or host != orig_host): try: LOG.info("Deleting the port %s" % str(orig_port)) # The port moved to a different host or the VM # connected to the port was deleted or its in DOWN # state. So delete the old port on the old host. self._delete_port(orig_port, orig_host, tenant_id) except ml2_exc.MechanismDriverError: # If deleting a port fails, then not much can be done # about it. Log a warning and move on. LOG.warn(UNABLE_TO_DELETE_PORT_MSG) if(port_provisioned and net_provisioned and hostname and is_vm_boot and not port_down): LOG.info(_LI("Port plugged into network")) # Plug port into the network only if it exists in the db # and is bound to a host and the port is up. self.rpc.plug_port_into_network(device_id, hostname, port_id, network_id, tenant_id, port_name, device_owner, sg, orig_sg, vnic_type, profile=profile) else: LOG.info(_LI("Port not plugged into network")) except arista_exc.AristaRpcError as err: LOG.error(_LE('update_port_postcommit: Did not update ' 'port %(port_id)s. Reason: %(err)s'), {'port_id': port_id, 'err': err})