-
- if ssl_certificate and ssl_certificate_key:
- config_spec["ssl_crt"] = "ssl_certificate {};".format(self.ssl_crt)
- config_spec["ssl_crt_key"] = "ssl_certificate_key {};".format(self.ssl_key)
- config_spec["port"] = "{} ssl".format(config_spec["port"])
-
- files = [
- {
- "name": "configuration",
- "mountPath": "/etc/nginx/sites-available/",
- "files": {
- Path(filename)
- .name: Template(Path(filename).read_text())
- .substitute(config_spec)
- for filename in glob("files/*")
- },
+ v = v.lower()
+ if v not in values.keys():
+ raise ValueError("value must be always, ifnotpresent or never")
+ return values[v]
+
+
+class NgUiCharm(CharmedOsmBase):
+ def __init__(self, *args) -> NoReturn:
+ super().__init__(*args, oci_image="image")
+
+ self.nbi_client = HttpClient(self, "nbi")
+ self.framework.observe(self.on["nbi"].relation_changed, self.configure_pod)
+ self.framework.observe(self.on["nbi"].relation_broken, self.configure_pod)
+
+ def _check_missing_dependencies(self, config: ConfigModel):
+ missing_relations = []
+
+ if self.nbi_client.is_missing_data_in_app():
+ missing_relations.append("nbi")
+
+ if missing_relations:
+ raise RelationsMissing(missing_relations)
+
+ def _build_files(self, config: ConfigModel):
+ files_builder = FilesV3Builder()
+ files_builder.add_file(
+ "default",
+ Template(Path("templates/default.template").read_text()).substitute(
+ port=config.port,
+ server_name=config.server_name,
+ max_file_size=config.max_file_size,
+ nbi_host=self.nbi_client.host,
+ nbi_port=self.nbi_client.port,
+ ),
+ )
+ return files_builder.build()
+
+ def build_pod_spec(self, image_info):
+ # Validate config
+ config = ConfigModel(**dict(self.config))
+ # Check relations
+ self._check_missing_dependencies(config)
+ # Create Builder for the PodSpec
+ pod_spec_builder = PodSpecV3Builder()
+ # Build Container
+ container_builder = ContainerV3Builder(
+ self.app.name, image_info, config.image_pull_policy
+ )
+ container_builder.add_port(name=self.app.name, port=config.port)
+ container = container_builder.build()
+ container_builder.add_tcpsocket_readiness_probe(
+ config.port,
+ initial_delay_seconds=45,
+ timeout_seconds=5,
+ )
+ container_builder.add_tcpsocket_liveness_probe(
+ config.port,
+ initial_delay_seconds=45,
+ timeout_seconds=15,
+ )
+ container_builder.add_volume_config(
+ "configuration",
+ "/etc/nginx/sites-available/",
+ self._build_files(config),
+ )
+ # Add container to pod spec
+ pod_spec_builder.add_container(container)
+ # Add ingress resources to pod spec if site url exists
+ if config.site_url:
+ parsed = urlparse(config.site_url)
+ annotations = {
+ "nginx.ingress.kubernetes.io/proxy-body-size": "{}".format(
+ str(config.max_file_size) + "m"
+ if config.max_file_size > 0
+ else config.max_file_size
+ )