def test_active_device_types(self): name = "beaglebone-black" dt = DeviceType(name=name) dt.save() dt.refresh_from_db() device = Device(device_type=dt, hostname='bbb-01', health=Device.HEALTH_GOOD) device.save() device = Device(device_type=dt, hostname='bbb-02', health=Device.HEALTH_RETIRED) device.save() name = "juno-r2" dt = DeviceType(name=name) dt.save() dt.refresh_from_db() device = Device(device_type=dt, hostname='juno-r2-01', health=Device.HEALTH_RETIRED) device.save() name = "juno" dt = DeviceType(name=name) dt.display = False dt.save() dt.refresh_from_db() dt.refresh_from_db() device = Device(device_type=dt, hostname='juno-01', health=Device.HEALTH_UNKNOWN) device.save() name = "qemu" dt = DeviceType(name=name) dt.save() dt.refresh_from_db() device = Device(device_type=dt, hostname='qemu-01', health=Device.HEALTH_GOOD) device.save() self.assertEqual( {'bbb-01', 'bbb-02', 'juno-r2-01', 'qemu-01', 'juno-01'}, set(Device.objects.all().values_list('hostname', flat=True))) self.assertEqual({'beaglebone-black', 'juno', 'juno-r2', 'qemu'}, set(DeviceType.objects.values_list('name', flat=True))) # exclude juno-r2 because all devices of that device-type are retired. # exclude juno because the device_type is set to not be displayed. # include beaglebone-black because not all devices of that type are retired. # include qemu because none of the devices of that type are retired. self.assertEqual({'beaglebone-black', 'qemu'}, set(active_device_types().values_list('name', flat=True)))
def pending_jobs_by_device_type(self, all=False): """ Name ---- `pending_jobs_by_device_type` () Description ----------- Get number of pending jobs in each device type. Private test jobs and hidden device types are excluded, except for authenticated superusers. Arguments --------- `all`: boolean - include retired devices and undisplayed device-types in the listing. Return value ------------ This function returns a dict where the key is the device type and the value is the number of jobs pending in that device type. For example: {'qemu': 0, 'panda': 3} """ pending_jobs_by_device = {} jobs_res = TestJob.objects.filter(state=TestJob.STATE_SUBMITTED) jobs_res = jobs_res.exclude(requested_device_type_id__isnull=True) if not self.user or not self.user.is_superuser: jobs_res = jobs_res.filter(is_public=True) jobs_res = jobs_res.values_list('requested_device_type_id') jobs_res = jobs_res.annotate(pending_jobs=(Count('id'))) jobs = {} jobs_hash = dict(jobs_res) for job in jobs_hash: jobs[job] = jobs_hash[job] pending_jobs_by_device.update(jobs) # Get rest of the devices and put number of pending jobs as 0. if all: device_types = DeviceType.objects.all() else: device_types = active_device_types() if not self.user or not self.user.is_superuser: device_types = device_types.filter(owners_only=False) for device_type in device_types.values_list('name', flat=True): if device_type not in pending_jobs_by_device: pending_jobs_by_device[device_type] = 0 return pending_jobs_by_device