Example #1
0
    def pt_update(self, json_data, file_data=None):
        j = PTJson(json_data,
                   obj_name="artifact json",
                   exception_type=SuspiciousOperation)

        try:
            self.description = j.get_str('description',
                                         defval=self.description)
            self.ttl_days = j.get_int('ttl_days', defval=self.ttl_days)
            self.uploaded_dt = timezone.now()
            self.filename = j.get_str('filename',
                                      defval=self.filename,
                                      require=False if self.filename else True)
            self.mime = j.get_str('mime', defval=self.mime)
            self.expires_dt = timezone.now() + timedelta(days=self.ttl_days)
            self.inline = j.get_bool('inline', defval=self.inline)
            self.compression = j.get_bool('compression',
                                          defval=self.compression)
            linked_uuids = j.get_list('linked_uuids', [])
            unlinked_uuids = j.get_list('unlinked_uuids', [])
        except SuspiciousOperation as e:
            return pt_rest_bad_req(str(e))

        if not self.mime:
            self.mime = mimetypes.guess_type(self.filename)[0]
        if not self.mime:
            self.mime = 'application/octet-stream'

        if file_data:
            data = file_data.get('file', None)
            if data is None:
                return pt_rest_bad_req("can't get file data")
            ret = self._pt_save_file(data.read())
            if ret is not None:
                return ret

        for uuid in linked_uuids:
            if not pt_is_valid_uuid(uuid):
                return pt_rest_bad_req(
                    "trying to link resource with invalid UUID format: %s" %
                    uuid)

        for uuid in unlinked_uuids:
            if not pt_is_valid_uuid(uuid):
                return pt_rest_bad_req(
                    "trying to unlink resource with invalid UUID format: %s" %
                    uuid)

        exists = self.id
        self.save()

        for uuid in linked_uuids:
            try:
                al = ArtifactLinkModel.objects.get(artifact=self,
                                                   linked_uuid=uuid)
                if al.deleted:
                    al.deleted = False
                    al.save()
                continue
            except ArtifactLinkModel.DoesNotExist as e:
                al = ArtifactLinkModel(artifact=self, linked_uuid=uuid)
                al.save()

        for uuid in unlinked_uuids:
            try:
                al = ArtifactLinkModel.objects.get(artifact=self,
                                                   linked_uuid=uuid)
            except ArtifactLinkModel.DoesNotExist as e:
                continue
            al.deleted = True
            al.save()

        return pt_rest_ok(message="Artifact has been %s, uuid: %s" %
                          ("updated" if exists else "created", self.uuid),
                          uuid=self.uuid)
Example #2
0
    def pt_update(self, job, json_data, validate_only=False):
        j = PTJson(json_data, obj_name="test json", exception_type=SuspiciousOperation)

        if 'seq_num' in json_data:
            self.seq_num = json_data['seq_num']
        if not self.seq_num:
            self.seq_num = 0

        self.tag = j.get_str('tag', require=True)
        j.obj_name = self.tag

        self.binary = j.get_str('binary')
        self.cmdline = j.get_str('cmdline')
        self.description = j.get_str('description')

        scores = j.get_list('scores', require=True)
        deviations = j.get_list('deviations')

        self.scores = str(scores)
        self.deviations = str(deviations) if deviations else str([0] * len(scores))

        self.category = j.get_str('category')
        self.metrics = j.get_str('metrics', 'loops/sec')
        self.links = json.dumps(j.get_dict('links'))
        self.attribs = json.dumps(j.get_dict('attribs'))
        self.less_better = j.get_bool('less_better')
        self.begin = j.get_datetime('begin')
        self.end = j.get_datetime('end')
        self.status = j.get_str('status', "SUCCESS")
        if self.status not in TEST_STATUSES:
            raise SuspiciousOperation("invalid 'status' value '%s', must be one of: %s" % (self.status, str(TEST_STATUSES)))

        e = j.get('errors', 0)
        if type(e) is int:
            self.errors = e
        else:
            self.errors = len(j.get_list('errors'))

        w = j.get('warnings', 0)
        if type(w) is int:
            self.warnings = w
        else:
            self.warnings = len(j.get_list('warnings'))

        dur_sec = j.get_float('duration_sec', 0)
        self.duration = timedelta(seconds=int(dur_sec)) if dur_sec else self.end - self.begin

        self.job = job
        self.group = j.get_str('group')
        TestGroupModel.pt_get_by_tag(self.group)  # ensure appropriate TestGroupModel object exists

        self.samples = j.get_int('samples', len(scores))

        self.avg_score = numpy.mean(scores)
        self.min_score = min(scores)
        self.max_score = max(scores)

        self.avg_dev = numpy.mean(deviations) if deviations else numpy.std(scores)
        self.min_dev = min(deviations) if deviations else self.avg_dev
        self.max_dev = max(deviations) if deviations else self.avg_dev

        self.avg_plusmin = int(round(100 * abs(self.avg_dev / self.avg_score))) if self.avg_score else 0
        self.min_plusmin = int(round(100 * abs(self.min_dev / self.min_score))) if self.min_score else 0
        self.max_plusmin = int(round(100 * abs(self.max_dev / self.max_score))) if self.max_score else 0

        if self.begin and (self.begin.tzinfo is None or self.begin.tzinfo.utcoffset(self.begin) is None):
            raise SuspiciousOperation("'begin' datetime object must include timezone: %s" % str(self.begin))
        if self.end and (self.end.tzinfo is None or self.end.tzinfo.utcoffset(self.end) is None):
            raise SuspiciousOperation("'end' datetime object must include timezone: %s" % str(self.end))

        if not validate_only:
            try:
                obj = TestModel.objects.get(uuid=self.uuid)
            except TestModel.DoesNotExist:
                obj = None

            if obj is None or not self.pt_is_equal_to(obj):
                self.save()