Skip to content
Snippets Groups Projects
models.py 36 KiB
Newer Older
        return range(self.first_vlan, self.last_vlan + 1)

    def used_vlans(self):
        """Return the list of vlan ids in use

        The list is sorted
        """
        return sorted(network.vlan_id for network in self.networks)

    def available_vlans(self):
        """Return the list of vlan ids available"""
Benjamin Bertrand's avatar
Benjamin Bertrand committed
        return [vlan for vlan in self.vlan_range() if vlan not in self.used_vlans()]

    def used_subnets(self):
        """Return the list of subnets in use

        The list is sorted
        """
        return sorted(network.network_ip for network in self.networks)

    def available_subnets(self, prefix):
        """Return the list of available subnets with the given prefix"""
Benjamin Bertrand's avatar
Benjamin Bertrand committed
        return [
            str(subnet)
            for subnet in self.supernet_ip.subnets(new_prefix=prefix)
            if subnet not in self.used_subnets()
        ]
    def to_dict(self):
        d = super().to_dict()
Benjamin Bertrand's avatar
Benjamin Bertrand committed
        d.update(
            {
                "name": self.name,
                "first_vlan": self.first_vlan,
                "last_vlan": self.last_vlan,
                "supernet": self.supernet,
                "description": self.description,
                "domain": str(self.domain),
                "networks": [str(network) for network in self.networks],
            }
        )
        return d
Benjamin Bertrand's avatar
Benjamin Bertrand committed
# Define RQ JobStatus as a Python enum
# We can't use the one defined in rq/job.py as it's
# not a real enum (it's a custom one) and is not
# compatible with sqlalchemy
class JobStatus(Enum):
Benjamin Bertrand's avatar
Benjamin Bertrand committed
    QUEUED = "queued"
    FINISHED = "finished"
    FAILED = "failed"
    STARTED = "started"
    DEFERRED = "deferred"
Benjamin Bertrand's avatar
Benjamin Bertrand committed


class Task(db.Model):
    # Use job id generated by RQ
    id = db.Column(postgresql.UUID, primary_key=True)
    created_at = db.Column(db.DateTime, default=utcnow())
    ended_at = db.Column(db.DateTime)
Benjamin Bertrand's avatar
Benjamin Bertrand committed
    name = db.Column(db.Text, nullable=False, index=True)
    command = db.Column(db.Text)
Benjamin Bertrand's avatar
Benjamin Bertrand committed
    status = db.Column(db.Enum(JobStatus, name="job_status"))
    awx_job_id = db.Column(db.Integer)
    exception = db.Column(db.Text)
Benjamin Bertrand's avatar
Benjamin Bertrand committed
    user_id = db.Column(
        db.Integer,
        db.ForeignKey("user_account.id"),
        nullable=False,
        default=utils.fetch_current_user_id,
    )
    @property
    def awx_job_url(self):
        if self.awx_job_id is None:
            return None
        return urllib.parse.urljoin(
Benjamin Bertrand's avatar
Benjamin Bertrand committed
            current_app.config["AWX_URL"], f"/#/jobs/{self.awx_job_id}"
Benjamin Bertrand's avatar
Benjamin Bertrand committed
    def __str__(self):
        return str(self.id)

    def to_dict(self):
        return {
Benjamin Bertrand's avatar
Benjamin Bertrand committed
            "id": self.id,
            "name": self.name,
            "created_at": utils.format_field(self.created_at),
            "ended_at": utils.format_field(self.ended_at),
            "status": self.status.name,
            "awx_job_id": self.awx_job_id,
            "awx_job_url": self.awx_job_url,
            "command": self.command,
            "exception": self.exception,
            "user": str(self.user),
# call configure_mappers after defining all the models
# required by sqlalchemy_continuum
sa.orm.configure_mappers()
ItemVersion = version_class(Item)