80 lines
3.0 KiB
Python
80 lines
3.0 KiB
Python
from __future__ import annotations
|
|
|
|
from django.conf import settings
|
|
from django.db import models
|
|
|
|
|
|
class ManagedPlugin(models.Model):
|
|
class State(models.TextChoices):
|
|
UNKNOWN = "unknown", "Unknown"
|
|
RUNNING = "running", "Operation running"
|
|
INSTALLED = "installed", "Installed"
|
|
ENABLED = "enabled", "Enabled"
|
|
DISABLED = "disabled", "Disabled"
|
|
RESTART_REQUIRED = "restart-required", "Restart required"
|
|
HANDED_OFF = "handed-off", "Handed to agent"
|
|
FAILED = "failed", "Failed"
|
|
|
|
slug = models.SlugField(max_length=64, unique=True)
|
|
name = models.CharField(max_length=200)
|
|
package_name = models.CharField(max_length=128)
|
|
import_name = models.CharField(max_length=128)
|
|
repository_url = models.URLField(max_length=500, blank=True)
|
|
installed_version = models.CharField(max_length=64, blank=True)
|
|
available_version = models.CharField(max_length=64, blank=True)
|
|
enabled = models.BooleanField(default=False)
|
|
restart_required = models.BooleanField(default=False)
|
|
state = models.CharField(max_length=32, choices=State.choices, default=State.UNKNOWN)
|
|
last_error = models.TextField(blank=True)
|
|
last_checked = models.DateTimeField(null=True, blank=True)
|
|
created = models.DateTimeField(auto_now_add=True)
|
|
updated = models.DateTimeField(auto_now=True)
|
|
|
|
_netbox_private = True
|
|
|
|
class Meta:
|
|
ordering = ("name", "slug")
|
|
permissions = (("manage_plugin", "Can execute Plugin Store lifecycle actions"),)
|
|
|
|
def __str__(self) -> str:
|
|
return self.name
|
|
|
|
|
|
class LifecycleAudit(models.Model):
|
|
class Status(models.TextChoices):
|
|
QUEUED = "queued", "Queued"
|
|
RUNNING = "running", "Running"
|
|
SUCCEEDED = "succeeded", "Succeeded"
|
|
FAILED = "failed", "Failed"
|
|
HANDED_OFF = "handed-off", "Handed to host agent"
|
|
|
|
actor = models.ForeignKey(
|
|
settings.AUTH_USER_MODEL,
|
|
on_delete=models.SET_NULL,
|
|
related_name="+",
|
|
null=True,
|
|
blank=True,
|
|
)
|
|
slug = models.SlugField(max_length=64)
|
|
action = models.CharField(max_length=16)
|
|
requested_version = models.CharField(max_length=64, blank=True)
|
|
dry_run = models.BooleanField(default=True)
|
|
status = models.CharField(max_length=16, choices=Status.choices, default=Status.QUEUED)
|
|
request_data = models.JSONField(default=dict, blank=True)
|
|
result_data = models.JSONField(default=dict, blank=True)
|
|
error = models.TextField(blank=True)
|
|
external_operation_id = models.UUIDField(null=True, blank=True, unique=True)
|
|
created = models.DateTimeField(auto_now_add=True)
|
|
started = models.DateTimeField(null=True, blank=True)
|
|
completed = models.DateTimeField(null=True, blank=True)
|
|
|
|
_netbox_private = True
|
|
|
|
class Meta:
|
|
ordering = ("-created",)
|
|
indexes = (models.Index(fields=("slug", "-created"), name="nbps_audit_slug_created"),)
|
|
permissions = (("execute_plugin_lifecycle", "Can request Plugin Store lifecycle execution"),)
|
|
|
|
def __str__(self) -> str:
|
|
return f"{self.action} {self.slug} ({self.status})"
|