blob: abf306a49e7a3fde308b95895721d19092296d32 [file] [log] [blame]
Mohammed Naser5c804a22022-09-29 21:27:21 -04001import os
2
3import tomli
4from schematics import types
5
6from atmosphere.models import base
7
8CONFIG_FILE = os.environ.get("ATMOSPHERE_CONFIG", "/etc/atmosphere/config.toml")
9
10
11class AcmeIssuerSolverConfig(base.Model):
Mohammed Naser57b53392022-09-30 19:39:07 +000012 type = types.StringType(
13 choices=("http", "rfc2136", "route53"), default="http", required=True
14 )
Mohammed Naser5c804a22022-09-29 21:27:21 -040015
16 @classmethod
17 def _claim_polymorphic(cls, data):
18 return data.get("type", cls.type.default) == cls.TYPE
19
20
21class HttpAcmeIssuerSolverConfig(AcmeIssuerSolverConfig):
22 TYPE = "http"
23
24
Mohammed Naser57b53392022-09-30 19:39:07 +000025class Rfc2136AcmeIssuerSolverConfig(AcmeIssuerSolverConfig):
26 TYPE = "rfc2136"
27
28 nameserver = types.StringType(required=True)
29 tsig_algorithm = types.StringType(required=True)
30 tsig_key_name = types.StringType(required=True)
31 tsig_secret = types.StringType(required=True)
32
33
Mohammed Naser5c804a22022-09-29 21:27:21 -040034class Route53AcmeIssuerSolverConfig(AcmeIssuerSolverConfig):
35 TYPE = "route53"
36
Mohammed Naser57b53392022-09-30 19:39:07 +000037 region = types.StringType(default="global", required=True)
38 hosted_zone_id = types.StringType(required=True)
Mohammed Naser5c804a22022-09-29 21:27:21 -040039 access_key_id = types.StringType(required=True)
40 secret_access_key = types.StringType(required=True)
Mohammed Naser5c804a22022-09-29 21:27:21 -040041
42
43class Issuer(base.Model):
44 type = types.StringType(
Mohammed Naser57b53392022-09-30 19:39:07 +000045 choices=("acme", "ca", "self-signed"), default="acme", required=True
Mohammed Naser5c804a22022-09-29 21:27:21 -040046 )
47
48 @classmethod
49 def _claim_polymorphic(cls, data):
50 return data.get("type", cls.type.default) == cls.TYPE
51
52
53class AcmeIssuerConfig(Issuer):
54 TYPE = "acme"
55
56 email = types.StringType(required=True)
57 server = types.URLType(default="https://acme-v02.api.letsencrypt.org/directory")
58 solver = types.PolyModelType(
Mohammed Naser57b53392022-09-30 19:39:07 +000059 [
60 HttpAcmeIssuerSolverConfig,
61 Rfc2136AcmeIssuerSolverConfig,
62 Route53AcmeIssuerSolverConfig,
63 ],
64 default=HttpAcmeIssuerSolverConfig(),
65 required=True,
Mohammed Naser5c804a22022-09-29 21:27:21 -040066 )
67
68
Mohammed Naser57b53392022-09-30 19:39:07 +000069class CaIssuerConfig(Issuer):
70 TYPE = "ca"
71
72 certificate = types.StringType(required=True)
73 private_key = types.StringType(required=True)
74
75
Mohammed Naser5c804a22022-09-29 21:27:21 -040076class SelfSignedIssuerConfig(Issuer):
77 TYPE = "self-signed"
78
79
Mohammed Nasere04907d2022-10-05 21:39:31 +000080class ChartConfig(base.Model):
81 enabled = types.BooleanType(default=True, required=True)
82 overrides = types.DictType(types.BaseType(), default={})
83
84
Mohammed Naser5c804a22022-09-29 21:27:21 -040085class MemcachedImagesConfig(base.Model):
86 memcached = types.StringType(default="docker.io/library/memcached:1.6.17")
87 exporter = types.StringType(default="quay.io/prometheus/memcached-exporter:v0.10.0")
88
89
Mohammed Nasere04907d2022-10-05 21:39:31 +000090class MemcachedChartConfig(ChartConfig):
Mohammed Naser661b0b02022-10-07 20:54:59 +000091 namespace = types.StringType(default="openstack", required=True)
Mohammed Naser5c804a22022-09-29 21:27:21 -040092 secret_key = types.StringType(required=True)
93 images = types.ModelType(MemcachedImagesConfig, default=MemcachedImagesConfig())
Mohammed Nasere04907d2022-10-05 21:39:31 +000094
95
Mohammed Nasera7853cb2022-10-07 20:47:57 +000096class IngressNginxChartConfig(ChartConfig):
Mohammed Nasere04907d2022-10-05 21:39:31 +000097 pass
Mohammed Naser5c804a22022-09-29 21:27:21 -040098
99
100class Config(base.Model):
Mohammed Nasera7853cb2022-10-07 20:47:57 +0000101 ingress_nginx = types.ModelType(
102 IngressNginxChartConfig, default=IngressNginxChartConfig()
103 )
Mohammed Naser62256dc2022-09-29 22:31:50 -0400104 memcached = types.ModelType(
Mohammed Nasere04907d2022-10-05 21:39:31 +0000105 MemcachedChartConfig, default=MemcachedChartConfig(), required=True
Mohammed Naser62256dc2022-09-29 22:31:50 -0400106 )
Mohammed Naser57b53392022-09-30 19:39:07 +0000107 issuer = types.PolyModelType(
108 [AcmeIssuerConfig, CaIssuerConfig, SelfSignedIssuerConfig],
109 default=AcmeIssuerConfig(),
110 required=True,
Mohammed Naser5c804a22022-09-29 21:27:21 -0400111 )
112
113 @classmethod
Mohammed Naser57b53392022-09-30 19:39:07 +0000114 def from_toml(cls, data, validate=True):
115 c = cls(data, validate=validate)
116 if validate:
117 c.validate()
118 return c
119
120 @classmethod
121 def from_file(cls, path=CONFIG_FILE):
Mohammed Naser5c804a22022-09-29 21:27:21 -0400122 with open(path, "rb") as fd:
123 data = tomli.load(fd)
Mohammed Naser57b53392022-09-30 19:39:07 +0000124 return cls.from_toml(data)
125
126 @classmethod
127 def from_string(cls, data: str, validate=True):
128 data = tomli.loads(data)
129 return cls.from_toml(data, validate)