Exemplo n.º 1
0
    def _upload_image(
        self,
        component: Component,
        container_image: ContainerImage,
    ):
        metadata = self._metadata(
            container_image=container_image,
            component=component,
            omit_version=False,
        )

        image_data_fh = retrieve_container_image(
            container_image.image_reference(),
            outfileobj=tempfile.NamedTemporaryFile(),
        )

        try:
            # Upload image and update outdated analysis result with the one triggered
            # by the upload.
            scan_result = self._api.upload(
                application_name=self._upload_name(
                    container_image=container_image,
                    component=component).replace('/', '_'),
                group_id=self._group_id,
                data=image_data_fh,
                custom_attribs=metadata,
            )
            return scan_result
        finally:
            image_data_fh.close()
Exemplo n.º 2
0
    def upload_image(
        self,
        container_image: ContainerImage,
        component: Component,
    ) -> UploadResult:
        metadata = self._metadata(
            container_image=container_image,
            component=component,
            omit_version=False,
        )

        upload_result = partial(UploadResult,
                                container_image=container_image,
                                component=component)

        # check if the image has already been uploaded for this component
        scan_result = self.retrieve_scan_result(
            container_image=container_image,
            component=component,
        )
        reference_results = [
            self.retrieve_scan_result(
                container_image=container_image,
                component=component,
                group_id=group_id,
            ) for group_id in self._reference_group_ids
        ]
        reference_results = [r for r in reference_results
                             if r]  # remove None entries
        if scan_result:
            reference_results.insert(0, scan_result)

        # collect old triages in order to "transport" them after new upload (may be None)
        triages = self._existing_triages(analysis_results=reference_results, )

        upload_action = self._determine_upload_action(
            container_image=container_image, scan_result=scan_result)

        if not upload_action.upload and not upload_action.rescan and not upload_action.wait:
            # early exit (nothing to do)
            return upload_result(
                status=UploadStatus.SKIPPED,
                result=scan_result,
            )

        if upload_action.upload:
            info(
                f'uploading to protecode: {container_image.image_reference()}')
            image_data_fh = retrieve_container_image(
                container_image.image_reference(),
                outfileobj=tempfile.NamedTemporaryFile(),
            )
            # keep old product_id (in order to delete after update)
            if scan_result:
                product_id = scan_result.product_id()
            else:
                product_id = None

            try:
                # Upload image and update outdated analysis result with the one triggered
                # by the upload.
                scan_result = self._api.upload(
                    application_name=self._upload_name(
                        container_image=container_image,
                        component=component).replace('/', '_'),
                    group_id=self._group_id,
                    data=image_data_fh,
                    custom_attribs=metadata,
                )
            finally:
                image_data_fh.close()

            for triage in triages:
                if triage.scope() is TriageScope.GROUP:
                    self._api.add_triage(
                        triage=triage,
                        scope=TriageScope.GROUP,
                        group_id=self._group_id,
                    )
                else:
                    # hard-code scope for now
                    self._api.add_triage(
                        triage=triage,
                        scope=TriageScope.RESULT,
                        product_id=scan_result.product_id(),
                    )

            # rm (now outdated) scan result
            if product_id:
                self._api.delete_product(product_id=product_id)

        if upload_action.rescan:
            self._api.rescan(scan_result.product_id())

        if upload_action.wait:
            result = self._api.wait_for_scan_result(
                product_id=scan_result.product_id())
        else:
            result = scan_result

        if result.status() == ProcessingStatus.BUSY:
            upload_status = UploadStatus.PENDING
        else:
            upload_status = UploadStatus.DONE

        return upload_result(status=upload_status, result=result)