def _find_orphaned_veas(self, vios, virt_eths, veas_attached_to_seas, dom_factory=model.No_DB_DOM_Factory()): """ Connect to the IVM endpoint and find any VEAs that are not associated with an SEA, and thus are "orphans." Results are not returned from this method, but are set into this objects member attributes. :param vios: The VioServer DOM object that represents this IVM :param virt_eths: Dictionary of physical adapter info from IVM :param veas_attached_to_seas: List of device names of VEAs that are attached to SEAs, and thus are not orphans :param dom_factory: Factory used to create the DOM objects, optional. :returns List: A list of VirtualEthernetAdapter DOM objects """ # Loop back through the list of virtual devices. We need to find # the VEAs that are not attached to any SEA. They may have VLANs # attached to them that we do not wish to override orphan_veas = [] for vea in virt_eths: if not (virt_eths[vea][0].strip().startswith("Virtual I/O Ethernet Adapter")): # this is not a VEA device. continue # Check to see if this VEA is part of the existing SEA list if vea in veas_attached_to_seas: continue # Get the slot number for this adapter vea_slot_num = utils.parse_slot_num(virt_eths, vea) # As an 'orphan' VEA (one not backed by a SEA), we need to get # the VLANs off of it and add it to a list of elements we do # not provision vea_dev = self._get_vea_for_slot(vios, vea, vea_slot_num, None, dom_factory) # No SEA to check # The VEA in vea_slot_num may have been unavailable (ie, "Defined" # status), which returns None. Don't include those. if vea_dev: orphan_veas.append(vea_dev) return orphan_veas
def _get_sea_from_ivm(self, vios, sea_devname, virt_eths, dom_factory=model.No_DB_DOM_Factory()): """ Connect to an IVM endpoint and retrieve all of the configuration for a SEA and the VEAs associated with it. :param vios: The VioServer DOM object that represents this IVM :param sea_devname: The device name for the SEA to query :param virt_eths: Dictionary of physical adapter info from IVM :param dom_factory: Factory used to create the DOM objects, optional. :returns SharedEthernetAdapter: An SEA DOM object """ # Got the SEA logical device name on VIOS. # Need to find out its pvid_adapter and virt_adapters and pvid cmd = utils.get_sea_attribute_cmd(sea_devname) output = self._pvmops.run_vios_command(cmd) # Output example: # ['value', '', '100', 'ent4', 'ent4,ent13,ent14', # 'ent24 Available Shared Ethernet Adapter'] if len(output) == 0 or output[0] != "value": ras.trace(LOG, __name__, ras.TRACE_ERROR, ras.vif_get_msg("error", "VIOS_CMDFAIL") % {"cmd": cmd}) return None # Get rid of 'value','' from the list output[0:2] = [] # Find out pvid adapter and all the virt_adapters for # the give SEA and create SeaDevices object based # on the information retrieved from HMC/IVM. sea_pvid = int(output[0].strip()) sea_pvid_adpt = output[1].strip() sea_virt_adpts = output[2].strip().split(",") sea_state = output[3].split()[1] # virt_adpts has at least pvid_adpt if sea_pvid_adpt not in sea_virt_adpts: msg = ras.vif_get_msg("error", "SEA_INVALIDSTATE") ras.function_tracepoint(LOG, __name__, ras.TRACE_ERROR, msg) return None # Get the full virt_adapters list without the pvid_adapter sea_virt_adpts.remove(sea_pvid_adpt) # Get the slot number for this adapter vea_slot_num = utils.parse_slot_num(virt_eths, sea_pvid_adpt) # Create the VEA and SEA dom objects vea_dev = self._get_vea_for_slot(vios, sea_pvid_adpt, vea_slot_num, sea_pvid, dom_factory) sea_dev = dom_factory.create_sea( name=sea_devname, vio_server=vios, slot=vea_slot_num, state=sea_state, primary_vea=vea_dev, control_channel=None, additional_veas=None, ) ras.trace(LOG, __name__, ras.TRACE_DEBUG, ("SEA %(devname)s is discovered" % {"devname": sea_devname})) # Find all the virt_adapters if there are any in sea_virt_adpts # list for devname in sea_virt_adpts: # Get the slot number for this adapter vea_slot_num = utils.parse_slot_num(virt_eths, devname) vea_dev = self._get_vea_for_slot(vios, devname, vea_slot_num, sea_pvid, dom_factory) try: sea_dev.add_vea_to_sea(vea_dev) except excp.IBMPowerVMInvalidSEAConfig: msg = ras.vif_get_msg("error", "SEA_FAILTOADDVEA") % {"veaname": vea_dev.name, "seaname": sea_dev.name} ras.trace(LOG, __name__, ras.TRACE_EXCEPTION, msg) return None # End of for loop to discovery all the virtual adapters # for the SEA. It is the end of the inner for loop return sea_dev