138 lines
3.9 KiB
Python
138 lines
3.9 KiB
Python
from django.db import models
|
|
from django.utils.translation import gettext_lazy as _
|
|
|
|
|
|
class ServiceCategory(models.Model):
|
|
"""
|
|
Categories for services, e.g. "Databases", "Storage", "Compute".
|
|
"""
|
|
|
|
name = models.CharField(max_length=100, verbose_name=_("Name"))
|
|
description = models.TextField(blank=True, verbose_name=_("Description"))
|
|
logo = models.ImageField(
|
|
upload_to="public/service_categories",
|
|
blank=True,
|
|
null=True,
|
|
verbose_name=_("Logo"),
|
|
)
|
|
|
|
parent = models.ForeignKey(
|
|
to="self",
|
|
on_delete=models.CASCADE,
|
|
related_name="children",
|
|
blank=True,
|
|
null=True,
|
|
verbose_name=_("Parent"),
|
|
)
|
|
|
|
def __str__(self):
|
|
return self.name
|
|
|
|
|
|
class Service(models.Model):
|
|
"""
|
|
A service that can be offered, e.g. "PostgreSQL", "MinIO", "Kubernetes".
|
|
"""
|
|
|
|
name = models.CharField(max_length=100, verbose_name=_("Name"))
|
|
description = models.TextField(blank=True, verbose_name=_("Description"))
|
|
logo = models.ImageField(
|
|
upload_to="public/services", blank=True, null=True, verbose_name=_("Logo")
|
|
)
|
|
# TODO schema
|
|
external_links = models.JSONField(blank=True, verbose_name=_("External links"))
|
|
|
|
category = models.ForeignKey(
|
|
to="ServiceCategory",
|
|
on_delete=models.PROTECT,
|
|
related_name="services",
|
|
verbose_name=_("Category"),
|
|
)
|
|
|
|
def __str__(self):
|
|
return self.name
|
|
|
|
|
|
class ControlPlane(models.Model):
|
|
name = models.CharField(max_length=100, verbose_name=_("Name"))
|
|
description = models.TextField(blank=True, verbose_name=_("Description"))
|
|
k8s_api_endpoint = models.URLField(verbose_name=_("Kubernetes API endpoint"))
|
|
# TODO: schema
|
|
api_credentials = models.JSONField(verbose_name=_("API credentials"))
|
|
|
|
cloud_provider = models.ForeignKey(
|
|
to="CloudProvider",
|
|
on_delete=models.PROTECT,
|
|
related_name="control_planes",
|
|
verbose_name=_("Cloud provider"),
|
|
)
|
|
|
|
def __str__(self):
|
|
return self.name
|
|
|
|
|
|
class CloudProvider(models.Model):
|
|
"""
|
|
A cloud provider, e.g. "Exoscale".
|
|
"""
|
|
|
|
name = models.CharField(max_length=100, verbose_name=_("Name"))
|
|
description = models.TextField(blank=True, verbose_name=_("Description"))
|
|
logo = models.ImageField(
|
|
upload_to="public/service_providers",
|
|
blank=True,
|
|
null=True,
|
|
verbose_name=_("Logo"),
|
|
)
|
|
external_links = models.JSONField(blank=True, verbose_name=_("External links"))
|
|
|
|
def __str__(self):
|
|
return self.name
|
|
|
|
|
|
class Plan(models.Model):
|
|
"""
|
|
Each service offering can have multiple plans, e.g. for different tiers.
|
|
"""
|
|
|
|
name = models.CharField(max_length=100, verbose_name=_("Name"))
|
|
description = models.TextField(blank=True, verbose_name=_("Description"))
|
|
# TODO schema
|
|
features = models.JSONField(verbose_name=_("Features"))
|
|
# TODO schema
|
|
pricing = models.JSONField(verbose_name=_("Pricing"))
|
|
term = models.DurationField(verbose_name=_("Term"))
|
|
service_offering = models.ForeignKey(
|
|
to="ServiceOffering",
|
|
on_delete=models.PROTECT,
|
|
related_name="plans",
|
|
verbose_name=_("Service offering"),
|
|
)
|
|
|
|
def __str__(self):
|
|
return self.name
|
|
|
|
|
|
class ServiceOffering(models.Model):
|
|
"""
|
|
A service offering, e.g. "PostgreSQL on AWS", "MinIO on GCP".
|
|
"""
|
|
|
|
description = models.TextField(blank=True, verbose_name=_("Description"))
|
|
service = models.ForeignKey(
|
|
to="Service",
|
|
on_delete=models.PROTECT,
|
|
related_name="offerings",
|
|
verbose_name=_("Services"),
|
|
)
|
|
provider = models.ForeignKey(
|
|
to="CloudProvider",
|
|
on_delete=models.PROTECT,
|
|
related_name="offerings",
|
|
verbose_name=_("Providers"),
|
|
)
|
|
control_plane = models.ManyToManyField(
|
|
to="ControlPlane",
|
|
related_name="offerings",
|
|
verbose_name=_("Control plane"),
|
|
)
|