def handle_facts_ip_addresses(facts): ip_addresses = set() for interface in facts['interfaces'].split(','): try: ip = network.validate_ip(facts['ipaddress_{}'.format(interface)]) ip_addresses.add(ip) except (ValueError, KeyError): pass return list(ip_addresses)
def handle_facts_ethernets(facts): ethernets = [] ip_addresses = [] for interface in facts['interfaces'].split(','): try: ip = network.validate_ip(facts['ipaddress_{}'.format(interface)]) ip_addresses.append(ip) except (ValueError, KeyError): pass mac = facts.get('macaddress_{}'.format(interface)) if not mac: continue label = 'Ethernet {}'.format(interface) ethernets.append(Eth(label, mac, speed=None)) return ip_addresses, ethernets
def _add_hp_oa_devices(devices, device_type, parent=None): if devices and not isinstance(devices, list): devices = [devices] for i, device in enumerate(devices): bay = device['BAY']['CONNECTION2']['BLADESYMBOLICNUMBER'] or str(device['BAY']['CONNECTION']) name = device['PN'].strip() or device['SPN'].strip() if not name.startswith('HP'): name = 'HP ' + name firmware = str(device.get('FWRI', '')) sn = device['SN'].strip() if sn in SERIAL_BLACKLIST: sn = None if not sn: sn = device['BSN'].strip() if sn in SERIAL_BLACKLIST: sn = None try: ip = network.validate_ip(device['MGMTIPADDR']) except ValueError: continue ip_address, created = IPAddress.concurrent_get_or_create(address=str(ip)) if created: ip_address.hostname = network.hostname(ip_address.address) ip_address.snmp_name = name ip_address.save(update_last_seen=True) # no priorities for IP addresses if device_type == DeviceType.management: ip_address.is_management = True if parent and not parent.management: parent.management = ip_address parent.save(priority=SAVE_PRIORITY) extra = name model, mcreated = ComponentModel.concurrent_get_or_create( type=ComponentType.management.id, extra_hash=hashlib.md5(extra).hexdigest(), extra=extra) model.name = name model.save(priority=SAVE_PRIORITY) component, created = GenericComponent.concurrent_get_or_create( device=parent, sn=sn) component.model = model component.label = name component.save(priority=SAVE_PRIORITY) if ip: ip_address.is_management = True ip_address.device = parent ip_address.save() # no priorities for IP addresses continue if device_type == DeviceType.switch and 'SAN' in name: device_type = DeviceType.fibre_channel_switch ethernets = list(_get_ethernets(device)) if not (ip and name and (sn or ethernets)): continue dev = None if ip and device_type in (DeviceType.switch, DeviceType.fibre_channel_switch): ip_addr, ip_created = IPAddress.concurrent_get_or_create(address=ip) if ip_addr.device: dev = ip_addr.device dev.parent = parent if dev is None: dev = Device.create(sn=sn, model_name=name, model_type=device_type, ethernets=ethernets, parent=parent, priority=SAVE_PRIORITY) if firmware: dev.hard_firmware = firmware if bay: name = '%s [%s]' % (name, bay) if bay: if 'A' in bay or 'B' in bay: dev.chassis_position = int(bay[:-1]) if bay[-1] == 'A': dev.chassis_position += 1000 elif bay[-1] == 'B': dev.chassis_position += 2000 else: dev.chassis_position = int(bay) dev.position = bay else: dev.chassis_position = i + 1 dev.save(update_last_seen=True, priority=SAVE_PRIORITY) ip_address.device = dev ip_address.save(update_last_seen=True) # no priorities for IP addresses
def _handle_subdevices(device_info, data): for devices_data, devices_type in ( (data['INFRA2']['MANAGERS']['MANAGER'], DeviceType.management), (data['INFRA2']['SWITCHES']['SWITCH'], DeviceType.switch), (data['INFRA2']['BLADES']['BLADE'], DeviceType.blade_server), ): if devices_data and not isinstance(devices_data, list): devices_data = [devices_data] for i, device in enumerate(devices_data): bay = device['BAY']['CONNECTION2']['BLADESYMBOLICNUMBER', ] or str( device['BAY']['CONNECTION']) name = device['PN'].strip() or device['SPN'].strip() if not name.startswith('HP'): name = 'HP ' + name sn = device['SN'].strip() if sn in SERIAL_BLACKLIST: sn = None if not sn: sn = device['BSN'].strip() if sn in SERIAL_BLACKLIST: sn = None try: ip = network.validate_ip(device['MGMTIPADDR']) except ValueError: continue if devices_type == DeviceType.management: management_ip_addresses = set( device_info.get( 'management_ip_addresses', [], ), ) management_ip_addresses.add(ip) device_info.update( management_ip_addresses=list(management_ip_addresses), ) if 'parts' not in device_info: device_info['parts'] = [] device_info['parts'].append({ 'type': devices_type.raw, 'model_name': name, 'serial_number': sn, 'label': name, }) continue current_device_type = devices_type if devices_type == DeviceType.switch and 'SAN' in name: current_device_type = DeviceType.fibre_channel_switch mac_addresses = _get_mac_addresses(device) if not (ip and name and (sn or mac_addresses)): continue subdevice = { 'type': current_device_type.raw, 'model_name': name, } if sn: subdevice['serial_number'] = sn if mac_addresses: subdevice['mac_addresses'] = mac_addresses if bay: if 'A' in bay or 'B' in bay: subdevice['chassis_position'] = int(bay[:-1]) if bay[-1] == 'A': subdevice['chassis_position'] += 1000 elif bay[-1] == 'B': subdevice['chassis_position'] += 2000 else: subdevice['chassis_position'] = int(bay) subdevice['position'] = bay else: subdevice['chassis_position'] = i + 1 subdevices = device_info.get('subdevices', []) subdevices.append(subdevice) device_info['subdevices'] = subdevices
def _handle_subdevices(device_info, data): for devices_data, devices_type in ( (data['INFRA2']['MANAGERS']['MANAGER'], DeviceType.management), (data['INFRA2']['SWITCHES']['SWITCH'], DeviceType.switch), (data['INFRA2']['BLADES']['BLADE'], DeviceType.blade_server), ): if devices_data and not isinstance(devices_data, list): devices_data = [devices_data] for i, device in enumerate(devices_data): bay = device['BAY']['CONNECTION2'][ 'BLADESYMBOLICNUMBER', ] or str(device['BAY']['CONNECTION']) name = device['PN'].strip() or device['SPN'].strip() if not name.startswith('HP'): name = 'HP ' + name sn = device['SN'].strip() if sn in SERIAL_BLACKLIST: sn = None if not sn: sn = device['BSN'].strip() if sn in SERIAL_BLACKLIST: sn = None try: ip = network.validate_ip(device['MGMTIPADDR']) except ValueError: continue if devices_type == DeviceType.management: management_ip_addresses = set( device_info.get( 'management_ip_addresses', [], ), ) management_ip_addresses.add(ip) device_info.update( management_ip_addresses=list(management_ip_addresses), ) if 'parts' not in device_info: device_info['parts'] = [] device_info['parts'].append({ 'type': devices_type.raw, 'model_name': name, 'serial_number': sn, 'label': name, }) continue current_device_type = devices_type if devices_type == DeviceType.switch and 'SAN' in name: current_device_type = DeviceType.fibre_channel_switch mac_addresses = _get_mac_addresses(device) if not (ip and name and (sn or mac_addresses)): continue subdevice = { 'type': current_device_type.raw, 'model_name': name, } if sn: subdevice['serial_number'] = sn if mac_addresses: subdevice['mac_addresses'] = mac_addresses if bay: if 'A' in bay or 'B' in bay: subdevice['chassis_position'] = int(bay[:-1]) if bay[-1] == 'A': subdevice['chassis_position'] += 1000 elif bay[-1] == 'B': subdevice['chassis_position'] += 2000 else: subdevice['chassis_position'] = int(bay) subdevice['position'] = bay else: subdevice['chassis_position'] = i + 1 subdevices = device_info.get('subdevices', []) subdevices.append(subdevice) device_info['subdevices'] = subdevices