feat: add NetBox plugin store
This commit is contained in:
@@ -0,0 +1,79 @@
|
||||
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})"
|
||||
Reference in New Issue
Block a user