Пример #1
0
    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)))
Пример #2
0
    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