def _get_fabric_interconnects(self): if self._inventory.load_from == "live": equipment_switch_io_card_list = [] ucs_system_fi_list = [] if "equipmentSwitchIOCard" in self._inventory.sdk_objects.keys(): if self._inventory.sdk_objects[ "equipmentSwitchIOCard"] is not None: # We filter out SDK objects that are not under this Dn for sdk_object in self._inventory.sdk_objects[ "equipmentSwitchIOCard"]: if self.dn + "/" in sdk_object.dn: equipment_switch_io_card_list.append(sdk_object) # We create a list of UcsSystemFi objects from the equipmentSwitchIOCard objects list for equipment_switch_io_card in equipment_switch_io_card_list: # We need to get the networkElement object corresponding to the equipmentSwitchIOCard list_fi = [ network_element for network_element in self._inventory.sdk_objects["networkElement"] if equipment_switch_io_card.serial == network_element.serial ] if len(list_fi) == 1: ucs_system_fi_list.append( UcsSystemFi(parent=self, network_element=list_fi[0])) return ucs_system_fi_list elif self._inventory.load_from == "file" and "fabric_interconnects" in self._ucs_sdk_object: return [ UcsSystemFi(self, fi) for fi in self._ucs_sdk_object["fabric_interconnects"] ] else: return []
def _get_fabric_interconnects(self): if self._inventory.load_from == "live": return self._inventory.get_inventory_objects_under_dn(dn=self.dn, object_class=UcsSystemFi, parent=self) elif self._inventory.load_from == "file" and "fabric_interconnects" in self._ucs_sdk_object: return [UcsSystemFi(self, fi) for fi in self._ucs_sdk_object["fabric_interconnects"]] else: return []
def _fill_inventory_from_json(self, inventory=None, inventory_json=None): """ Fills inventory using parsed JSON inventory file :param inventory: inventory to be filled :param inventory_json: parsed JSON content containing inventory :return: True if successful, False otherwise """ if inventory is None or inventory_json is None: self.logger( level="debug", message="Missing inventory or inventory_json parameter!") return False if "device_connector" in inventory_json: for device_connector in inventory_json["device_connector"]: inventory.device_connector.append( UcsSystemDeviceConnector( parent=inventory, device_connector=device_connector)) if "fabric_interconnects" in inventory_json: for network_element in inventory_json["fabric_interconnects"]: inventory.fabric_interconnects.append( UcsSystemFi(parent=inventory, network_element=network_element)) # Fetch LAN & SAN neighbors inventory.lan_neighbors = inventory._get_lan_neighbors() inventory.san_neighbors = inventory._get_san_neighbors() if "chassis" in inventory_json: for equipment_chassis in inventory_json["chassis"]: inventory.chassis.append( UcsSystemChassis(parent=inventory, equipment_chassis=equipment_chassis)) if "fabric_extenders" in inventory_json: for equipment_fex in inventory_json["fabric_extenders"]: inventory.fabric_extenders.append( UcsSystemFex(parent=inventory, equipment_fex=equipment_fex)) if "rack_enclosures" in inventory_json: for equipment_rack_enclosure in inventory_json["rack_enclosures"]: inventory.rack_enclosures.append( UcsSystemRackEnclosure( parent=inventory, equipment_rack_enclosure=equipment_rack_enclosure)) if "rack_units" in inventory_json: for compute_rack_unit in inventory_json["rack_units"]: inventory.rack_units.append( UcsSystemRack(parent=inventory, compute_rack_unit=compute_rack_unit)) return True
def fetch_inventory(self): self.logger( message= "Fetching inventory from live device (can take several minutes)") inventory = UcsSystemInventory(parent=self) inventory.origin = "live" inventory.load_from = "live" inventory._fetch_sdk_objects() self.logger(level="debug", message="Finished fetching UCS SDK objects for inventory") # add device connector if True: # todo add condition of version? inventory.device_connector.append( UcsSystemDeviceConnector(parent=inventory)) if "networkElement" in inventory.sdk_objects.keys(): for network_element in sorted( inventory.sdk_objects["networkElement"], key=lambda fi: fi.dn): inventory.fabric_interconnects.append( UcsSystemFi(parent=inventory, network_element=network_element)) # Verifying that Info Policy is enabled before trying to fetch neighbors self.logger(level="debug", message="Verifying that Info Policy is enabled") info_policy_state = None try: info_policy = self.parent.handle.query_dn("sys/info-policy") info_policy_state = info_policy.state if info_policy_state == "disabled": self.logger( level="warning", message= "Info Policy is disabled. No neighbors can be found") else: # Fetch LAN & SAN neighbors inventory.lan_neighbors = inventory._get_lan_neighbors() inventory.san_neighbors = inventory._get_san_neighbors() except Exception: self.logger(level="warning", message="Unable to get Info Policy State") if "equipmentChassis" in inventory.sdk_objects.keys(): for equipment_chassis in sorted( inventory.sdk_objects["equipmentChassis"], key=lambda chassis: [ int(t) if t.isdigit() else t.lower() for t in re.split('(\d+)', chassis.id) ]): inventory.chassis.append( UcsSystemChassis(parent=inventory, equipment_chassis=equipment_chassis)) if "equipmentFex" in inventory.sdk_objects.keys(): for equipment_fex in sorted(inventory.sdk_objects["equipmentFex"], key=lambda fex: [ int(t) if t.isdigit() else t.lower() for t in re.split('(\d+)', fex.id) ]): inventory.fabric_extenders.append( UcsSystemFex(parent=inventory, equipment_fex=equipment_fex)) if "equipmentRackEnclosure" in inventory.sdk_objects.keys(): for equipment_rack_enclosure in sorted( inventory.sdk_objects["equipmentRackEnclosure"], key=lambda enclosure: [ int(t) if t.isdigit() else t.lower() for t in re.split('(\d+)', enclosure.id) ]): inventory.rack_enclosures.append( UcsSystemRackEnclosure( parent=inventory, equipment_rack_enclosure=equipment_rack_enclosure)) if "computeRackUnit" in inventory.sdk_objects.keys(): for compute_rack_unit in sorted( inventory.sdk_objects["computeRackUnit"], key=lambda rack: [ int(t) if t.isdigit() else t.lower() for t in re.split('(\d+)', rack.id) ]): # We filter out rack servers that are inside enclosures (e.g. for UCS C4200) if compute_rack_unit.enclosure_id in ["0", None]: inventory.rack_units.append( UcsSystemRack(parent=inventory, compute_rack_unit=compute_rack_unit)) # Removing the list of SDK objects fetched from the live UCS device inventory.sdk_objects = None self.inventory_list.append(inventory) self.logger(message="Finished fetching inventory with UUID " + str(inventory.uuid) + " from live device") return inventory.uuid