← Back to team overview

launchpad-reviewers team mailing list archive

Re: [Merge] ~enriqueesanchz/launchpad:add-vulnerabilityjob-model into launchpad:master

 


Diff comments:

> diff --git a/lib/lp/bugs/model/vulnerabilityjob.py b/lib/lp/bugs/model/vulnerabilityjob.py
> new file mode 100644
> index 0000000..80a0753
> --- /dev/null
> +++ b/lib/lp/bugs/model/vulnerabilityjob.py
> @@ -0,0 +1,102 @@
> +# Copyright 2025 Canonical Ltd.  This software is licensed under the
> +# GNU Affero General Public License version 3 (see the file LICENSE).
> +
> +__all__ = [
> +    "VulnerabilityJob",
> +    "VulnerabilityJobDerived",
> +]
> +
> +from lazr.delegates import delegate_to
> +from storm.databases.postgres import JSON
> +from storm.locals import And, Int, Reference
> +from zope.interface import implementer
> +
> +from lp.app.errors import NotFoundError
> +from lp.bugs.enums import VulnerabilityHandlerEnum
> +from lp.bugs.interfaces.vulnerabilityjob import (
> +    IVulnerabilityJob,
> +    VulnerabilityJobType,
> +)
> +from lp.services.database.enumcol import DBEnum
> +from lp.services.database.interfaces import IStore
> +from lp.services.database.stormbase import StormBase
> +from lp.services.job.model.job import EnumeratedSubclass, Job
> +from lp.services.job.runner import BaseRunnableJob
> +
> +
> +@implementer(IVulnerabilityJob)
> +class VulnerabilityJob(StormBase):
> +    """Base class for jobs related to Vulnerabilities."""
> +
> +    __storm_table__ = "VulnerabilityJob"
> +
> +    id = Int(primary=True)
> +
> +    handler = DBEnum(enum=VulnerabilityHandlerEnum, allow_none=False)
> +
> +    job_type = DBEnum(enum=VulnerabilityJobType, allow_none=False)
> +
> +    job_id = Int(name="job")
> +    job = Reference(job_id, Job.id)
> +
> +    metadata = JSON("json_data", allow_none=False)
> +
> +    def __init__(self, handler, job_type, metadata):
> +        super().__init__()
> +        self.job = Job()
> +        self.handler = handler
> +        self.job_type = job_type
> +        self.metadata = metadata
> +
> +    def makeDerived(self):
> +        return VulnerabilityJobDerived.makeSubclass(self)
> +
> +
> +@delegate_to(IVulnerabilityJob)
> +class VulnerabilityJobDerived(BaseRunnableJob, metaclass=EnumeratedSubclass):
> +    """Abstract class for deriving from VulnerabilityJob."""
> +
> +    def __init__(self, job):
> +        self.context = job
> +
> +    @classmethod
> +    def get(cls, job_id):
> +        """Get a job by id.
> +
> +        :return: the VulnerabilityJob with the specified id, as
> +                 the current VulnerabilityJobDerived subclass.
> +        :raises: NotFoundError if there is no job with the specified id,
> +                 or its job_type does not match the desired subclass.
> +        """
> +        job = VulnerabilityJob.get(job_id)
> +        if job.job_type != cls.class_job_type:
> +            raise NotFoundError(
> +                "No object found with id %d and type %s"
> +                % (job_id, cls.class_job_type.title)
> +            )
> +        return cls(job)
> +
> +    @classmethod
> +    def iterReady(cls):
> +        """Iterate through all ready VulnerabilityJob."""
> +        jobs = IStore(VulnerabilityJob).find(
> +            VulnerabilityJob,
> +            And(
> +                VulnerabilityJob.job_type == cls.class_job_type,
> +                VulnerabilityJob.job == Job.id,

Well, made some testing and we already have a btree index as we have a unique constraint that creates it under the hood.

> +                Job.id.is_in(Job.ready_jobs),
> +            ),
> +        )
> +        return (cls(job) for job in jobs)
> +
> +    def getOopsVars(self):
> +        """See `IRunnableJob`."""
> +        vars = super().getOopsVars()
> +        vars.extend(
> +            [
> +                ("vulnerabilityjob_job_id", self.context.id),
> +                ("vulnerability_job_type", self.context.job_type.title),
> +                ("handler", self.context.handler),
> +            ]
> +        )
> +        return vars


-- 
https://code.launchpad.net/~enriqueesanchz/launchpad/+git/launchpad/+merge/491368
Your team Launchpad code reviewers is requested to review the proposed merge of ~enriqueesanchz/launchpad:add-vulnerabilityjob-model into launchpad:master.



References