def test_disk_shares_and_exports(self): model = ComponentModel( type=ComponentType.share, name="3par share", ) model.save() share = DiskShare( device=self.device, model=model, label="pr0n", size="2048", wwn="deadbeefcafe1234", ) share.save() address = IPAddress(address='127.0.0.1') address.save() DiskShareMount( device=self.device, share=share, address=address, ).save() data = get_device_data(Device.objects.get(sn='123456789')) exports = data['disk_exports'] mounts = data['disk_shares'] self.assertEqual(len(exports), 1) self.assertEqual(len(mounts), 1) self.assertEqual(mounts[0]['serial_number'], "deadbeefcafe1234")
def test_connections(self): model = DeviceModel.objects.create(type=DeviceType.rack_server, name="DevModel F1") master_device = Device.objects.create(model=model, sn="sn_1", name="dev1.dc1") connected_device_1 = Device.objects.create(model=model, sn="sn_2", name="dev2.dc1") IPAddress.objects.create(address="10.0.22.1", device=connected_device_1) connection = Connection.objects.create( connection_type=ConnectionType.network, outbound=master_device, inbound=connected_device_1 ) connected_device_2 = Device.objects.create(model=model, sn="sn_3", name="dev3.dc1") IPAddress.objects.create(address="10.0.22.2", device=connected_device_2) IPAddress.objects.create(address="10.0.22.3", device=connected_device_2) connection = Connection.objects.create( connection_type=ConnectionType.network, outbound=master_device, inbound=connected_device_2 ) NetworkConnection.objects.create(connection=connection, outbound_port="eth0", inbound_port="eth1") data = get_device_data(Device.objects.get(sn="sn_1")) self.assertEqual( data["connections"], [ { "connected_device_ip_addresses": "10.0.22.1", "connected_device_mac_addresses": "", "connected_device_serial_number": "sn_2", "connection_details": {}, "connection_type": "network", }, { "connected_device_ip_addresses": "10.0.22.2,10.0.22.3", "connected_device_mac_addresses": "", "connected_device_serial_number": "sn_3", "connection_details": {"inbound_port": "eth1", "outbound_port": "eth0"}, "connection_type": "network", }, ], )
def test_subdevices(self): Device(parent=self.device, model=self.device_model, sn="1", name="ziew1").save() Device(parent=self.device, model=self.device_model, sn="2", name="ziew2").save() Device(parent=self.device, model=self.device_model, sn="3", name="ziew3").save() data = get_device_data(Device.objects.get(sn="123456789")) sub = data["subdevices"] self.assertEqual(len(sub), 3)
def test_position(self): self.device.chassis_position = 3 self.device.dc = 'dc3' self.device.rack = '232' self.device.save() data = get_device_data(Device.objects.get(sn='123456789')) self.assertEqual(data['chassis_position'], 3) self.assertEqual(data['data_center'], 'dc3') self.assertEqual(data['rack'], '232')
def test_fc(self): model = ComponentModel(type=ComponentType.fibre, name="FC-336") model.save() FibreChannel(physical_id="deadbeefcafe", label="ziew", device=self.device, model=model).save() data = get_device_data(Device.objects.get(sn="123456789")) fc = data["fibrechannel_cards"] self.assertEqual(len(fc), 1) self.assertEqual(fc[0]["physical_id"], "deadbeefcafe") self.assertEqual(fc[0]["model_name"], "FC-336")
def test_parts(self): model = ComponentModel(type=ComponentType.management, name="weapons of mass destruction") model.save() GenericComponent(label="ziew", device=self.device, model=model).save() data = get_device_data(Device.objects.get(sn="123456789")) parts = data["parts"] self.assertEqual(parts[0]["type"], "management") self.assertEqual(parts[0]["model_name"], "weapons of mass destruction") self.assertEqual(len(parts), 1)
def test_position(self): self.device.chassis_position = 3 self.device.dc = "dc3" self.device.rack = "232" self.device.save() data = get_device_data(Device.objects.get(sn="123456789")) self.assertEqual(data["chassis_position"], 3) self.assertEqual(data["data_center"], "dc3") self.assertEqual(data["rack"], "232")
def test_system(self): OperatingSystem.create( self.device, "Haiku", 0, version="1.0.0", memory="512", storage="2048", cores_count="4", family="BeOS" ) data = get_device_data(Device.objects.get(sn="123456789")) self.assertEqual(data["system_memory"], 512) self.assertEqual(data["system_storage"], 2048) self.assertEqual(data["system_cores_count"], 4) self.assertEqual(data["system_family"], "BeOS") self.assertEqual(data["system_label"], "Haiku 1.0.0")
def test_memory(self): for i in xrange(8): m = Memory(label="ziew", size=128, device=self.device, index=i) m.save() data = get_device_data(Device.objects.get(sn="123456789")) memory = data["memory"] self.assertEqual(len(memory), 8) self.assertEqual(memory[0]["label"], "ziew") self.assertEqual(memory[0]["size"], 128) self.assertEqual(memory[3]["index"], 3)
def test_disks(self): model = ComponentModel(type=ComponentType.disk, name="HP DG0300BALVP SAS 307200MiB, 10000RPM") model.save() Storage(sn="abc3", device=self.device, label="ziew", mount_point="/dev/hda", model=model, size=307200).save() data = get_device_data(Device.objects.get(sn="123456789")) disks = data["disks"] self.assertEqual(len(disks), 1) self.assertEqual(disks[0]["size"], 307200) self.assertEqual(disks[0]["serial_number"], "abc3") self.assertEqual(disks[0]["mount_point"], "/dev/hda")
def test_software(self): model = ComponentModel(type=ComponentType.software, name="cobol") model.save() Software( label="cobol", device=self.device, model=model, version="1.0.0", path="/usr/bin/cobol", sn="0000001" ).save() data = get_device_data(Device.objects.get(sn="123456789")) soft = data["installed_software"] self.assertEqual(soft[0]["version"], "1.0.0") self.assertEqual(soft[0]["model_name"], "cobol") self.assertEqual(len(soft), 1)
def _append_shares_to_device(ip, device, data, external_priorities={}): device_data = get_device_data(device) full_data = merge_data( data, { 'database': {'device': device_data}, }, only_multiple=True, ) append_merged_proposition(full_data, device, external_priorities) selected_data = select_data(full_data, external_priorities) for share_mount in selected_data.get('disk_shares', []): _create_or_update_share_mount(ip, device, share_mount)
def test_processors(self): model = ComponentModel(type=ComponentType.processor, name="CPU Xeon 2533MHz, 4-core") model.save() for i in xrange(4): p = Processor(label="ziew", model=model, device=self.device, index=i) p.save() data = get_device_data(Device.objects.get(sn="123456789")) processors = data["processors"] self.assertEqual(len(processors), 4) self.assertEqual(processors[0]["label"], "ziew") self.assertEqual(processors[0]["model_name"], "CPU Xeon 2533MHz, 4-core") self.assertEqual(processors[0]["cores"], 4) self.assertEqual(processors[3]["index"], 3)
def test_memory(self): for i in xrange(8): m = Memory( label="ziew", size=128, device=self.device, index=i, ) m.save() data = get_device_data(Device.objects.get(sn='123456789')) memory = data['memory'] self.assertEqual(len(memory), 8) self.assertEqual(memory[0]['label'], "ziew") self.assertEqual(memory[0]['size'], 128) self.assertEqual(memory[3]['index'], 3)
def test_parts(self): model = ComponentModel( type=ComponentType.management, name="weapons of mass destruction", ) model.save() GenericComponent( label='ziew', device=self.device, model=model, ).save() data = get_device_data(Device.objects.get(sn='123456789')) parts = data['parts'] self.assertEqual(parts[0]['type'], "management") self.assertEqual(parts[0]['model_name'], "weapons of mass destruction") self.assertEqual(len(parts), 1)
def test_connections(self): model = DeviceModel.objects.create(type=DeviceType.rack_server, name="DevModel F1") master_device = Device.objects.create(model=model, sn='sn_1', name='dev1.dc1') connected_device_1 = Device.objects.create(model=model, sn='sn_2', name='dev2.dc1') IPAddress.objects.create(address="10.0.22.1", device=connected_device_1) connection = Connection.objects.create( connection_type=ConnectionType.network, outbound=master_device, inbound=connected_device_1) connected_device_2 = Device.objects.create(model=model, sn='sn_3', name='dev3.dc1') IPAddress.objects.create(address="10.0.22.2", device=connected_device_2) IPAddress.objects.create(address="10.0.22.3", device=connected_device_2) connection = Connection.objects.create( connection_type=ConnectionType.network, outbound=master_device, inbound=connected_device_2) NetworkConnection.objects.create(connection=connection, outbound_port="eth0", inbound_port="eth1") data = get_device_data(Device.objects.get(sn='sn_1')) self.assertEqual( data['connections'], [{ 'connected_device_ip_addresses': '10.0.22.1', 'connected_device_mac_addresses': '', 'connected_device_serial_number': 'sn_2', 'connection_details': {}, 'connection_type': 'network' }, { 'connected_device_ip_addresses': '10.0.22.2,10.0.22.3', 'connected_device_mac_addresses': '', 'connected_device_serial_number': 'sn_3', 'connection_details': { 'inbound_port': 'eth1', 'outbound_port': 'eth0' }, 'connection_type': 'network' }])
def test_fc(self): model = ComponentModel( type=ComponentType.fibre, name="FC-336", ) model.save() FibreChannel( physical_id='deadbeefcafe', label='ziew', device=self.device, model=model, ).save() data = get_device_data(Device.objects.get(sn='123456789')) fc = data['fibrechannel_cards'] self.assertEqual(len(fc), 1) self.assertEqual(fc[0]['physical_id'], 'deadbeefcafe') self.assertEqual(fc[0]['model_name'], 'FC-336')
def test_system(self): OperatingSystem.create( self.device, "Haiku", 0, version="1.0.0", memory='512', storage='2048', cores_count='4', family="BeOS", ) data = get_device_data(Device.objects.get(sn='123456789')) self.assertEqual(data['system_memory'], 512) self.assertEqual(data['system_storage'], 2048) self.assertEqual(data['system_cores_count'], 4) self.assertEqual(data['system_family'], "BeOS") self.assertEqual(data['system_label'], "Haiku 1.0.0")
def _append_shares_to_device(ip, device, data, external_priorities={}): device_data = get_device_data(device) full_data = merge_data( data, { 'database': {'device': device_data}, }, only_multiple=True, ) append_merged_proposition(full_data, device, external_priorities) selected_data = select_data(full_data, external_priorities) parsed_mounts = set() for share_mount in selected_data.get('disk_shares', []): status, mount = _create_or_update_share_mount(ip, device, share_mount) if mount: parsed_mounts.add(mount.pk) device.disksharemount_set.exclude(pk__in=parsed_mounts).delete()
def test_software(self): model = ComponentModel( type=ComponentType.software, name="cobol", ) model.save() Software( label='cobol', device=self.device, model=model, version='1.0.0', path='/usr/bin/cobol', sn='0000001', ).save() data = get_device_data(Device.objects.get(sn='123456789')) soft = data['installed_software'] self.assertEqual(soft[0]['version'], "1.0.0") self.assertEqual(soft[0]['model_name'], "cobol") self.assertEqual(len(soft), 1)
def _append_shares_to_device(ip, device, data, external_priorities={}): device_data = get_device_data(device) full_data = merge_data( data, { 'database': { 'device': device_data }, }, only_multiple=True, ) append_merged_proposition(full_data, device, external_priorities) selected_data = select_data(full_data, external_priorities) parsed_mounts = set() for share_mount in selected_data.get('disk_shares', []): status, mount = _create_or_update_share_mount(ip, device, share_mount) if mount: parsed_mounts.add(mount.pk) device.disksharemount_set.exclude(pk__in=parsed_mounts).delete()
def test_disks(self): model = ComponentModel( type=ComponentType.disk, name="HP DG0300BALVP SAS 307200MiB, 10000RPM", ) model.save() Storage( sn="abc3", device=self.device, label="ziew", mount_point="/dev/hda", model=model, size=307200, ).save() data = get_device_data(Device.objects.get(sn='123456789')) disks = data['disks'] self.assertEqual(len(disks), 1) self.assertEqual(disks[0]['size'], 307200) self.assertEqual(disks[0]['serial_number'], "abc3") self.assertEqual(disks[0]['mount_point'], "/dev/hda")
def _append_connections_to_device(device, data, external_priorities): device_data = get_device_data(device) full_data = merge_data( data, { 'database': {'device': device_data}, }, only_multiple=True, ) append_merged_proposition(full_data, device, external_priorities) selected_data = select_data(full_data, external_priorities) parsed_connections = set() for conn_data in selected_data.get('connections', []): conn = _create_or_update_connection(device, conn_data) if conn: parsed_connections.add(conn.pk) Connection.objects.filter( Q(outbound=device), Q(connection_type=ConnectionType.network), ~Q(pk__in=parsed_connections), ).delete()
def test_processors(self): model = ComponentModel( type=ComponentType.processor, name="CPU Xeon 2533MHz, 4-core", ) model.save() for i in xrange(4): p = Processor( label="ziew", model=model, device=self.device, index=i, ) p.save() data = get_device_data(Device.objects.get(sn='123456789')) processors = data['processors'] self.assertEqual(len(processors), 4) self.assertEqual(processors[0]['label'], "ziew") self.assertEqual(processors[0]['model_name'], "CPU Xeon 2533MHz, 4-core") self.assertEqual(processors[0]['cores'], 4) self.assertEqual(processors[3]['index'], 3)
def test_subdevices(self): Device( parent=self.device, model=self.device_model, sn='1', name='ziew1', ).save() Device( parent=self.device, model=self.device_model, sn='2', name='ziew2', ).save() Device( parent=self.device, model=self.device_model, sn='3', name='ziew3', ).save() data = get_device_data(Device.objects.get(sn='123456789')) sub = data['subdevices'] self.assertEqual(len(sub), 3)
def test_basic_data(self): data = get_device_data(Device.objects.get(sn='123456789')) self.assertEqual(data['serial_number'], '123456789') self.assertEqual(data['hostname'], 'ziew') self.assertEqual(data['type'], 'rack server') self.assertEqual(data['model_name'], 'ziew-X')
def test_management(self): self.device.management = IPAddress.objects.create(address='10.10.10.1') self.device.save() data = get_device_data(Device.objects.get(sn='123456789')) self.assertEqual(data['management'], '10.10.10.1')
def test_connections(self): model = DeviceModel.objects.create( type=DeviceType.rack_server, name="DevModel F1" ) master_device = Device.objects.create( model=model, sn='sn_1', name='dev1.dc1' ) connected_device_1 = Device.objects.create( model=model, sn='sn_2', name='dev2.dc1' ) IPAddress.objects.create( address="10.0.22.1", device=connected_device_1 ) connection = Connection.objects.create( connection_type=ConnectionType.network, outbound=master_device, inbound=connected_device_1 ) connected_device_2 = Device.objects.create( model=model, sn='sn_3', name='dev3.dc1' ) IPAddress.objects.create( address="10.0.22.2", device=connected_device_2 ) IPAddress.objects.create( address="10.0.22.3", device=connected_device_2 ) connection = Connection.objects.create( connection_type=ConnectionType.network, outbound=master_device, inbound=connected_device_2 ) NetworkConnection.objects.create( connection=connection, outbound_port="eth0", inbound_port="eth1" ) data = get_device_data(Device.objects.get(sn='sn_1')) self.assertEqual( data['connections'], [ { 'connected_device_ip_addresses': '10.0.22.1', 'connected_device_mac_addresses': '', 'connected_device_serial_number': 'sn_2', 'connection_details': {}, 'connection_type': 'network' }, { 'connected_device_ip_addresses': '10.0.22.2,10.0.22.3', 'connected_device_mac_addresses': '', 'connected_device_serial_number': 'sn_3', 'connection_details': { 'inbound_port': 'eth1', 'outbound_port': 'eth0' }, 'connection_type': 'network' } ] )
def test_basic_data(self): data = get_device_data(Device.objects.get(sn="123456789")) self.assertEqual(data["serial_number"], "123456789") self.assertEqual(data["hostname"], "ziew") self.assertEqual(data["type"], "rack server") self.assertEqual(data["model_name"], "ziew-X")
def test_management(self): self.device.management = IPAddress.objects.create(address="10.10.10.1") self.device.save() data = get_device_data(Device.objects.get(sn="123456789")) self.assertEqual(data["management"], "10.10.10.1")
def _save_job_results(job_id, start_ts): if (int(time.time()) - start_ts) > 86100: # 24h - 5min return try: job = rq.job.Job.fetch(job_id, django_rq.get_connection()) except rq.exceptions.NoSuchJobError: return # job with this id does not exist... if job.result is None and not job.is_failed: # we must wait... _enqueue_save_job_results(job_id) return elif job.is_failed: # nothing to do... return external_priorities = get_external_results_priorities(job.result) # management? is_management = False if job.args: try: is_management = IPAddress.objects.filter( address=job.args[0]).values_list('is_management', flat=True)[0] except IndexError: pass # first... update device devices, ids_lookup, sn_lookup, macs_lookup = _find_devices(job.result) if len(devices) > 1: raise AutomergerError( 'Many devices found for: ids=%s, sn=%s, macs=%s' % (ids_lookup, sn_lookup, macs_lookup)) used_serial_numbers = set() used_mac_addresses = set() for device in devices: device_data = get_device_data(device) if 'serial_number' in device_data: used_serial_numbers |= set([device_data['serial_number']]) if 'mac_addresses' in device_data: used_mac_addresses |= set(device_data['mac_addresses']) data = merge_data( job.result, { 'database': { 'device': device_data }, }, only_multiple=True, ) append_merged_proposition(data, device, external_priorities) selected_data = _select_data(data, external_priorities, is_management) set_device_data(device, selected_data, save_priority=SAVE_PRIORITY) device.save(priority=SAVE_PRIORITY) # now... we create new devices from `garbage` if not devices: garbage = {} for plugin_name, plugin_result in job.result.items(): if 'device' not in plugin_result: continue if 'serial_number' in plugin_result['device']: if plugin_result['device'][ 'serial_number'] in used_serial_numbers: continue if 'mac_addresses' in plugin_result['device']: if set(plugin_result['device']['mac_addresses'], ) != set( plugin_result['device']['mac_addresses'], ) - used_mac_addresses: continue if any(( plugin_result['device'].get('serial_number'), plugin_result['device'].get('mac_addresses'), )): garbage[plugin_name] = plugin_result if garbage: data = merge_data(garbage) selected_data = _select_data(data, external_priorities) if all(( any(( selected_data.get('serial_number'), selected_data.get('mac_addresses', []), )), any(( selected_data.get('model_name'), selected_data.get('type'), )), )): device_from_data(selected_data, save_priority=SAVE_PRIORITY) # mark this scan results update_scan_summary(job)
def _save_job_results(job_id, start_ts): if (int(time.time()) - start_ts) > 86100: # 24h - 5min return try: job = rq.job.Job.fetch(job_id, django_rq.get_connection()) except rq.exceptions.NoSuchJobError: return # job with this id does not exist... if job.result is None and not job.is_failed: # we must wait... _enqueue_save_job_results(job_id) return elif job.is_failed: # nothing to do... return external_priorities = get_external_results_priorities(job.result) # management? is_management = False if job.args: try: is_management = IPAddress.objects.filter( address=job.args[0] ).values_list( 'is_management', flat=True )[0] except IndexError: pass # first... update device devices, ids_lookup, sn_lookup, macs_lookup = _find_devices(job.result) if len(devices) > 1: raise AutomergerError( 'Many devices found for: ids=%s, sn=%s, macs=%s' % ( ids_lookup, sn_lookup, macs_lookup ) ) used_serial_numbers = set() used_mac_addresses = set() for device in devices: device_data = get_device_data(device) if 'serial_number' in device_data: used_serial_numbers |= set([device_data['serial_number']]) if 'mac_addresses' in device_data: used_mac_addresses |= set(device_data['mac_addresses']) data = merge_data( job.result, { 'database': {'device': device_data}, }, only_multiple=True, ) append_merged_proposition(data, device, external_priorities) selected_data = select_data(data, external_priorities, is_management) set_device_data(device, selected_data, save_priority=SAVE_PRIORITY) device.save(priority=SAVE_PRIORITY) # now... we create new devices from `garbage` if not devices: garbage = {} for plugin_name, plugin_result in job.result.items(): if 'device' not in plugin_result: continue if 'serial_number' in plugin_result['device']: if plugin_result['device'][ 'serial_number' ] in used_serial_numbers: continue if 'mac_addresses' in plugin_result['device']: if set( plugin_result['device']['mac_addresses'], ) != set( plugin_result['device']['mac_addresses'], ) - used_mac_addresses: continue if any(( plugin_result['device'].get('serial_number'), plugin_result['device'].get('mac_addresses'), )): garbage[plugin_name] = plugin_result if garbage: data = merge_data(garbage) selected_data = select_data(data, external_priorities) if all(( any( ( selected_data.get('serial_number'), selected_data.get('mac_addresses', []), ) ), any( ( selected_data.get('model_name'), selected_data.get('type'), ) ), )): device_from_data(selected_data, save_priority=SAVE_PRIORITY) # mark this scan results update_scan_summary(job)