Make ingress-internal mandatory relation
* Make ingress-internal relation mandatory for charms instead of ingress-public * If ingress-public is not integrated, default public endpoint to internal endpoint Change-Id: Ibbc600b3dd53655f2160394d4717b75e14d63cf8
This commit is contained in:
parent
dd24355383
commit
43119913d6
@ -84,10 +84,10 @@ requires:
|
|||||||
interface: keystone
|
interface: keystone
|
||||||
ingress-internal:
|
ingress-internal:
|
||||||
interface: ingress
|
interface: ingress
|
||||||
optional: true
|
|
||||||
limit: 1
|
limit: 1
|
||||||
ingress-public:
|
ingress-public:
|
||||||
interface: ingress
|
interface: ingress
|
||||||
|
optional: true
|
||||||
limit: 1
|
limit: 1
|
||||||
amqp:
|
amqp:
|
||||||
interface: rabbitmq
|
interface: rabbitmq
|
||||||
|
@ -255,7 +255,7 @@ class AodhOperatorCharm(sunbeam_charm.OSBaseOperatorAPICharm):
|
|||||||
mandatory_relations = {
|
mandatory_relations = {
|
||||||
"database",
|
"database",
|
||||||
"identity-service",
|
"identity-service",
|
||||||
"ingress-public",
|
"ingress-internal",
|
||||||
"amqp",
|
"amqp",
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4,8 +4,8 @@ Listen {{ wsgi_config.public_port }}
|
|||||||
WSGIDaemonProcess {{ wsgi_config.group }} processes=3 threads=1 user={{ wsgi_config.user }} group={{ wsgi_config.group }} \
|
WSGIDaemonProcess {{ wsgi_config.group }} processes=3 threads=1 user={{ wsgi_config.user }} group={{ wsgi_config.group }} \
|
||||||
display-name=%{GROUP}
|
display-name=%{GROUP}
|
||||||
WSGIProcessGroup {{ wsgi_config.group }}
|
WSGIProcessGroup {{ wsgi_config.group }}
|
||||||
{% if ingress_public.ingress_path -%}
|
{% if ingress_internal.ingress_path -%}
|
||||||
WSGIScriptAlias {{ ingress_public.ingress_path }} {{ wsgi_config.wsgi_public_script }}
|
WSGIScriptAlias {{ ingress_internal.ingress_path }} {{ wsgi_config.wsgi_public_script }}
|
||||||
{% endif -%}
|
{% endif -%}
|
||||||
WSGIScriptAlias / {{ wsgi_config.wsgi_public_script }}
|
WSGIScriptAlias / {{ wsgi_config.wsgi_public_script }}
|
||||||
WSGIApplicationGroup %{GLOBAL}
|
WSGIApplicationGroup %{GLOBAL}
|
||||||
|
@ -4,8 +4,8 @@ Listen {{ wsgi_config.public_port }}
|
|||||||
WSGIDaemonProcess {{ wsgi_config.group }} processes=3 threads=1 user={{ wsgi_config.user }} group={{ wsgi_config.group }} \
|
WSGIDaemonProcess {{ wsgi_config.group }} processes=3 threads=1 user={{ wsgi_config.user }} group={{ wsgi_config.group }} \
|
||||||
display-name=%{GROUP}
|
display-name=%{GROUP}
|
||||||
WSGIProcessGroup {{ wsgi_config.group }}
|
WSGIProcessGroup {{ wsgi_config.group }}
|
||||||
{% if ingress_public.ingress_path -%}
|
{% if ingress_internal.ingress_path -%}
|
||||||
WSGIScriptAlias {{ ingress_public.ingress_path }} {{ wsgi_config.wsgi_public_script }}
|
WSGIScriptAlias {{ ingress_internal.ingress_path }} {{ wsgi_config.wsgi_public_script }}
|
||||||
{% endif -%}
|
{% endif -%}
|
||||||
WSGIScriptAlias / {{ wsgi_config.wsgi_public_script }}
|
WSGIScriptAlias / {{ wsgi_config.wsgi_public_script }}
|
||||||
WSGIApplicationGroup %{GLOBAL}
|
WSGIApplicationGroup %{GLOBAL}
|
||||||
|
@ -50,9 +50,9 @@ requires:
|
|||||||
ingress-internal:
|
ingress-internal:
|
||||||
interface: ingress
|
interface: ingress
|
||||||
limit: 1
|
limit: 1
|
||||||
optional: true
|
|
||||||
ingress-public:
|
ingress-public:
|
||||||
interface: ingress
|
interface: ingress
|
||||||
|
optional: true
|
||||||
limit: 1
|
limit: 1
|
||||||
database:
|
database:
|
||||||
interface: mysql_client
|
interface: mysql_client
|
||||||
|
@ -254,7 +254,7 @@ class BarbicanOperatorCharm(sunbeam_charm.OSBaseOperatorAPICharm):
|
|||||||
"database",
|
"database",
|
||||||
"amqp",
|
"amqp",
|
||||||
"identity-service",
|
"identity-service",
|
||||||
"ingress-public",
|
"ingress-internal",
|
||||||
}
|
}
|
||||||
|
|
||||||
db_sync_cmds = [
|
db_sync_cmds = [
|
||||||
|
@ -4,8 +4,8 @@ Listen {{ wsgi_barbican_admin.public_port }}
|
|||||||
WSGIDaemonProcess barbican-api processes=4 threads=1 user={{ wsgi_config.user }} group={{ wsgi_config.group }} \
|
WSGIDaemonProcess barbican-api processes=4 threads=1 user={{ wsgi_config.user }} group={{ wsgi_config.group }} \
|
||||||
display-name=%{GROUP}
|
display-name=%{GROUP}
|
||||||
WSGIProcessGroup barbican-api
|
WSGIProcessGroup barbican-api
|
||||||
{% if ingress_public and ingress_public.ingress_path -%}
|
{% if ingress_internal and ingress_internal.ingress_path -%}
|
||||||
WSGIScriptAlias {{ ingress_public.ingress_path }} {{ wsgi_config.wsgi_public_script }}
|
WSGIScriptAlias {{ ingress_internal.ingress_path }} {{ wsgi_config.wsgi_public_script }}
|
||||||
{% endif -%}
|
{% endif -%}
|
||||||
WSGIScriptAlias / {{ wsgi_config.wsgi_public_script }}
|
WSGIScriptAlias / {{ wsgi_config.wsgi_public_script }}
|
||||||
WSGIApplicationGroup %{GLOBAL}
|
WSGIApplicationGroup %{GLOBAL}
|
||||||
|
@ -4,8 +4,8 @@ Listen {{ wsgi_config.public_port }}
|
|||||||
WSGIDaemonProcess {{ wsgi_config.group }} processes=3 threads=1 user={{ wsgi_config.user }} group={{ wsgi_config.group }} \
|
WSGIDaemonProcess {{ wsgi_config.group }} processes=3 threads=1 user={{ wsgi_config.user }} group={{ wsgi_config.group }} \
|
||||||
display-name=%{GROUP}
|
display-name=%{GROUP}
|
||||||
WSGIProcessGroup {{ wsgi_config.group }}
|
WSGIProcessGroup {{ wsgi_config.group }}
|
||||||
{% if ingress_public.ingress_path -%}
|
{% if ingress_internal.ingress_path -%}
|
||||||
WSGIScriptAlias {{ ingress_public.ingress_path }} {{ wsgi_config.wsgi_public_script }}
|
WSGIScriptAlias {{ ingress_internal.ingress_path }} {{ wsgi_config.wsgi_public_script }}
|
||||||
{% endif -%}
|
{% endif -%}
|
||||||
WSGIScriptAlias / {{ wsgi_config.wsgi_public_script }}
|
WSGIScriptAlias / {{ wsgi_config.wsgi_public_script }}
|
||||||
WSGIApplicationGroup %{GLOBAL}
|
WSGIApplicationGroup %{GLOBAL}
|
||||||
|
@ -4,8 +4,8 @@ Listen {{ wsgi_config.public_port }}
|
|||||||
WSGIDaemonProcess {{ wsgi_config.group }} processes=3 threads=1 user={{ wsgi_config.user }} group={{ wsgi_config.group }} \
|
WSGIDaemonProcess {{ wsgi_config.group }} processes=3 threads=1 user={{ wsgi_config.user }} group={{ wsgi_config.group }} \
|
||||||
display-name=%{GROUP}
|
display-name=%{GROUP}
|
||||||
WSGIProcessGroup {{ wsgi_config.group }}
|
WSGIProcessGroup {{ wsgi_config.group }}
|
||||||
{% if ingress_public.ingress_path -%}
|
{% if ingress_internal.ingress_path -%}
|
||||||
WSGIScriptAlias {{ ingress_public.ingress_path }} {{ wsgi_config.wsgi_public_script }}
|
WSGIScriptAlias {{ ingress_internal.ingress_path }} {{ wsgi_config.wsgi_public_script }}
|
||||||
{% endif -%}
|
{% endif -%}
|
||||||
WSGIScriptAlias / {{ wsgi_config.wsgi_public_script }}
|
WSGIScriptAlias / {{ wsgi_config.wsgi_public_script }}
|
||||||
WSGIApplicationGroup %{GLOBAL}
|
WSGIApplicationGroup %{GLOBAL}
|
||||||
|
@ -50,10 +50,10 @@ requires:
|
|||||||
limit: 1
|
limit: 1
|
||||||
ingress-internal:
|
ingress-internal:
|
||||||
interface: ingress
|
interface: ingress
|
||||||
optional: true
|
|
||||||
limit: 1
|
limit: 1
|
||||||
ingress-public:
|
ingress-public:
|
||||||
interface: ingress
|
interface: ingress
|
||||||
|
optional: true
|
||||||
limit: 1
|
limit: 1
|
||||||
identity-service:
|
identity-service:
|
||||||
interface: keystone
|
interface: keystone
|
||||||
|
@ -206,7 +206,7 @@ class CinderOperatorCharm(sunbeam_charm.OSBaseOperatorAPICharm):
|
|||||||
"amqp",
|
"amqp",
|
||||||
"storage-backend",
|
"storage-backend",
|
||||||
"identity-service",
|
"identity-service",
|
||||||
"ingress-public",
|
"ingress-internal",
|
||||||
}
|
}
|
||||||
|
|
||||||
db_sync_cmds = [
|
db_sync_cmds = [
|
||||||
|
@ -3,9 +3,9 @@ use = call:cinder.api:root_app_factory
|
|||||||
/: apiversions
|
/: apiversions
|
||||||
/healthcheck: healthcheck
|
/healthcheck: healthcheck
|
||||||
/v3: openstack_volume_api_v3
|
/v3: openstack_volume_api_v3
|
||||||
{% if ingress_public.ingress_path -%}
|
{% if ingress_internal.ingress_path -%}
|
||||||
{{ ingress_public.ingress_path }}: apiversions
|
{{ ingress_internal.ingress_path }}: apiversions
|
||||||
{{ ingress_public.ingress_path }}/v3: openstack_volume_api_v3
|
{{ ingress_internal.ingress_path }}/v3: openstack_volume_api_v3
|
||||||
{% endif -%}
|
{% endif -%}
|
||||||
|
|
||||||
[composite:openstack_volume_api_v3]
|
[composite:openstack_volume_api_v3]
|
||||||
|
@ -3,8 +3,8 @@ Listen 8776
|
|||||||
WSGIDaemonProcess cinder processes=4 threads=1 user=cinder group=cinder \
|
WSGIDaemonProcess cinder processes=4 threads=1 user=cinder group=cinder \
|
||||||
display-name=%{GROUP}
|
display-name=%{GROUP}
|
||||||
WSGIProcessGroup cinder
|
WSGIProcessGroup cinder
|
||||||
{% if ingress_public and ingress_public.ingress_path -%}
|
{% if ingress_internal and ingress_internal.ingress_path -%}
|
||||||
WSGIScriptAlias {{ ingress_public.ingress_path }} {{ wsgi_config.wsgi_public_script }}
|
WSGIScriptAlias {{ ingress_internal.ingress_path }} {{ wsgi_config.wsgi_public_script }}
|
||||||
{% endif -%}
|
{% endif -%}
|
||||||
WSGIScriptAlias / {{ wsgi_config.wsgi_public_script }}
|
WSGIScriptAlias / {{ wsgi_config.wsgi_public_script }}
|
||||||
WSGIApplicationGroup %{GLOBAL}
|
WSGIApplicationGroup %{GLOBAL}
|
||||||
|
@ -54,10 +54,10 @@ requires:
|
|||||||
interface: keystone
|
interface: keystone
|
||||||
ingress-internal:
|
ingress-internal:
|
||||||
interface: ingress
|
interface: ingress
|
||||||
optional: true
|
|
||||||
limit: 1
|
limit: 1
|
||||||
ingress-public:
|
ingress-public:
|
||||||
interface: ingress
|
interface: ingress
|
||||||
|
optional: true
|
||||||
limit: 1
|
limit: 1
|
||||||
amqp:
|
amqp:
|
||||||
interface: rabbitmq
|
interface: rabbitmq
|
||||||
|
@ -364,7 +364,7 @@ class DesignateOperatorCharm(sunbeam_charm.OSBaseOperatorAPICharm):
|
|||||||
mandatory_relations = {
|
mandatory_relations = {
|
||||||
"database",
|
"database",
|
||||||
"identity-service",
|
"identity-service",
|
||||||
"ingress-public",
|
"ingress-internal",
|
||||||
"amqp",
|
"amqp",
|
||||||
BIND_RNDC_RELATION,
|
BIND_RNDC_RELATION,
|
||||||
}
|
}
|
||||||
|
@ -4,8 +4,8 @@ Listen {{ wsgi_config.public_port }}
|
|||||||
WSGIDaemonProcess {{ wsgi_config.group }} processes=3 threads=1 user={{ wsgi_config.user }} group={{ wsgi_config.group }} \
|
WSGIDaemonProcess {{ wsgi_config.group }} processes=3 threads=1 user={{ wsgi_config.user }} group={{ wsgi_config.group }} \
|
||||||
display-name=%{GROUP}
|
display-name=%{GROUP}
|
||||||
WSGIProcessGroup {{ wsgi_config.group }}
|
WSGIProcessGroup {{ wsgi_config.group }}
|
||||||
{% if ingress_public.ingress_path -%}
|
{% if ingress_internal.ingress_path -%}
|
||||||
WSGIScriptAlias {{ ingress_public.ingress_path }} {{ wsgi_config.wsgi_public_script }}
|
WSGIScriptAlias {{ ingress_internal.ingress_path }} {{ wsgi_config.wsgi_public_script }}
|
||||||
{% endif -%}
|
{% endif -%}
|
||||||
WSGIScriptAlias / {{ wsgi_config.wsgi_public_script }}
|
WSGIScriptAlias / {{ wsgi_config.wsgi_public_script }}
|
||||||
WSGIApplicationGroup %{GLOBAL}
|
WSGIApplicationGroup %{GLOBAL}
|
||||||
|
@ -316,10 +316,10 @@ requires:
|
|||||||
limit: 1
|
limit: 1
|
||||||
ingress-internal:
|
ingress-internal:
|
||||||
interface: ingress
|
interface: ingress
|
||||||
optional: true
|
|
||||||
limit: 1
|
limit: 1
|
||||||
ingress-public:
|
ingress-public:
|
||||||
interface: ingress
|
interface: ingress
|
||||||
|
optional: true
|
||||||
limit: 1
|
limit: 1
|
||||||
identity-service:
|
identity-service:
|
||||||
interface: keystone
|
interface: keystone
|
||||||
|
@ -290,7 +290,7 @@ class GlanceOperatorCharm(sunbeam_charm.OSBaseOperatorAPICharm):
|
|||||||
mandatory_relations = {
|
mandatory_relations = {
|
||||||
"database",
|
"database",
|
||||||
"identity-service",
|
"identity-service",
|
||||||
"ingress-public",
|
"ingress-internal",
|
||||||
"ceph",
|
"ceph",
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3,9 +3,9 @@ Listen 9292
|
|||||||
<VirtualHost *:9292>
|
<VirtualHost *:9292>
|
||||||
ProxyPreserveHost On
|
ProxyPreserveHost On
|
||||||
ProxyRequests Off
|
ProxyRequests Off
|
||||||
{% if ingress_public and ingress_public.ingress_path -%}
|
{% if ingress_internal and ingress_internal.ingress_path -%}
|
||||||
ProxyPass {{ ingress_public.ingress_path }} http://localhost:9282/
|
ProxyPass {{ ingress_internal.ingress_path }} http://localhost:9282/
|
||||||
ProxyPassReverse {{ ingress_public.ingress_path }} http://localhost:9282/
|
ProxyPassReverse {{ ingress_internal.ingress_path }} http://localhost:9282/
|
||||||
{% endif -%}
|
{% endif -%}
|
||||||
ProxyPass / http://localhost:9282/
|
ProxyPass / http://localhost:9282/
|
||||||
ProxyPassReverse / http://localhost:9282/
|
ProxyPassReverse / http://localhost:9282/
|
||||||
|
@ -283,10 +283,10 @@ requires:
|
|||||||
interface: keystone
|
interface: keystone
|
||||||
ingress-internal:
|
ingress-internal:
|
||||||
interface: ingress
|
interface: ingress
|
||||||
optional: true
|
|
||||||
limit: 1
|
limit: 1
|
||||||
ingress-public:
|
ingress-public:
|
||||||
interface: ingress
|
interface: ingress
|
||||||
|
optional: true
|
||||||
limit: 1
|
limit: 1
|
||||||
ceph:
|
ceph:
|
||||||
interface: ceph-client
|
interface: ceph-client
|
||||||
|
@ -187,7 +187,7 @@ class GnocchiOperatorCharm(sunbeam_charm.OSBaseOperatorAPICharm):
|
|||||||
mandatory_relations = {
|
mandatory_relations = {
|
||||||
"database",
|
"database",
|
||||||
"identity-service",
|
"identity-service",
|
||||||
"ingress-public",
|
"ingress-internal",
|
||||||
"ceph",
|
"ceph",
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3,10 +3,10 @@ use = egg:Paste#urlmap
|
|||||||
/ = gnocchiversions_pipeline
|
/ = gnocchiversions_pipeline
|
||||||
/v1 = gnocchiv1+noauth
|
/v1 = gnocchiv1+noauth
|
||||||
/healthcheck = healthcheck
|
/healthcheck = healthcheck
|
||||||
{% if ingress_public.ingress_path -%}
|
{% if ingress_internal.ingress_path -%}
|
||||||
{{ ingress_public.ingress_path }}: gnocchiversions_pipeline
|
{{ ingress_internal.ingress_path }}: gnocchiversions_pipeline
|
||||||
{{ ingress_public.ingress_path }}/v1 = gnocchiv1+noauth
|
{{ ingress_internal.ingress_path }}/v1 = gnocchiv1+noauth
|
||||||
{{ ingress_public.ingress_path }}/healthcheck = healthcheck
|
{{ ingress_internal.ingress_path }}/healthcheck = healthcheck
|
||||||
{% endif -%}
|
{% endif -%}
|
||||||
|
|
||||||
[composite:gnocchi+keystone]
|
[composite:gnocchi+keystone]
|
||||||
@ -14,10 +14,10 @@ use = egg:Paste#urlmap
|
|||||||
/ = gnocchiversions_pipeline
|
/ = gnocchiversions_pipeline
|
||||||
/v1 = gnocchiv1+keystone
|
/v1 = gnocchiv1+keystone
|
||||||
/healthcheck = healthcheck
|
/healthcheck = healthcheck
|
||||||
{% if ingress_public.ingress_path -%}
|
{% if ingress_internal.ingress_path -%}
|
||||||
{{ ingress_public.ingress_path }}: gnocchiversions_pipeline
|
{{ ingress_internal.ingress_path }}: gnocchiversions_pipeline
|
||||||
{{ ingress_public.ingress_path }}/v1 = gnocchiv1+keystone
|
{{ ingress_internal.ingress_path }}/v1 = gnocchiv1+keystone
|
||||||
{{ ingress_public.ingress_path }}/healthcheck = healthcheck
|
{{ ingress_internal.ingress_path }}/healthcheck = healthcheck
|
||||||
{% endif -%}
|
{% endif -%}
|
||||||
|
|
||||||
[composite:gnocchi+remoteuser]
|
[composite:gnocchi+remoteuser]
|
||||||
@ -25,10 +25,10 @@ use = egg:Paste#urlmap
|
|||||||
/ = gnocchiversions_pipeline
|
/ = gnocchiversions_pipeline
|
||||||
/v1 = gnocchiv1+noauth
|
/v1 = gnocchiv1+noauth
|
||||||
/healthcheck = healthcheck
|
/healthcheck = healthcheck
|
||||||
{% if ingress_public.ingress_path -%}
|
{% if ingress_internal.ingress_path -%}
|
||||||
{{ ingress_public.ingress_path }}: gnocchiversions_pipeline
|
{{ ingress_internal.ingress_path }}: gnocchiversions_pipeline
|
||||||
{{ ingress_public.ingress_path }}/v1 = gnocchiv1+noauth
|
{{ ingress_internal.ingress_path }}/v1 = gnocchiv1+noauth
|
||||||
{{ ingress_public.ingress_path }}/healthcheck = healthcheck
|
{{ ingress_internal.ingress_path }}/healthcheck = healthcheck
|
||||||
{% endif -%}
|
{% endif -%}
|
||||||
|
|
||||||
[pipeline:gnocchiv1+noauth]
|
[pipeline:gnocchiv1+noauth]
|
||||||
|
@ -4,8 +4,8 @@ Listen {{ wsgi_config.public_port }}
|
|||||||
WSGIDaemonProcess {{ wsgi_config.group }} processes=3 threads=1 user={{ wsgi_config.user }} group={{ wsgi_config.group }} \
|
WSGIDaemonProcess {{ wsgi_config.group }} processes=3 threads=1 user={{ wsgi_config.user }} group={{ wsgi_config.group }} \
|
||||||
display-name=%{GROUP}
|
display-name=%{GROUP}
|
||||||
WSGIProcessGroup {{ wsgi_config.group }}
|
WSGIProcessGroup {{ wsgi_config.group }}
|
||||||
{% if ingress_public.ingress_path -%}
|
{% if ingress_internal.ingress_path -%}
|
||||||
WSGIScriptAlias {{ ingress_public.ingress_path }} {{ wsgi_config.wsgi_public_script }}
|
WSGIScriptAlias {{ ingress_internal.ingress_path }} {{ wsgi_config.wsgi_public_script }}
|
||||||
{% endif -%}
|
{% endif -%}
|
||||||
WSGIScriptAlias / {{ wsgi_config.wsgi_public_script }}
|
WSGIScriptAlias / {{ wsgi_config.wsgi_public_script }}
|
||||||
WSGIApplicationGroup %{GLOBAL}
|
WSGIApplicationGroup %{GLOBAL}
|
||||||
|
@ -55,10 +55,10 @@ requires:
|
|||||||
interface: keystone
|
interface: keystone
|
||||||
traefik-route-internal:
|
traefik-route-internal:
|
||||||
interface: traefik_route
|
interface: traefik_route
|
||||||
optional: true
|
|
||||||
limit: 1
|
limit: 1
|
||||||
traefik-route-public:
|
traefik-route-public:
|
||||||
interface: traefik_route
|
interface: traefik_route
|
||||||
|
optional: true
|
||||||
limit: 1
|
limit: 1
|
||||||
amqp:
|
amqp:
|
||||||
interface: rabbitmq
|
interface: rabbitmq
|
||||||
|
@ -207,7 +207,7 @@ class HeatOperatorCharm(sunbeam_charm.OSBaseOperatorAPICharm):
|
|||||||
"database",
|
"database",
|
||||||
"amqp",
|
"amqp",
|
||||||
"identity-service",
|
"identity-service",
|
||||||
"traefik-route-public",
|
"traefik-route-internal",
|
||||||
"identity-ops",
|
"identity-ops",
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -509,9 +509,7 @@ class HeatOperatorCharm(sunbeam_charm.OSBaseOperatorAPICharm):
|
|||||||
)
|
)
|
||||||
return self.add_explicit_port(public_url)
|
return self.add_explicit_port(public_url)
|
||||||
else:
|
else:
|
||||||
return self.add_explicit_port(
|
return self.heat_internal_url
|
||||||
self.service_url(self.public_ingress_address)
|
|
||||||
)
|
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def heat_cfn_public_url(self) -> str:
|
def heat_cfn_public_url(self) -> str:
|
||||||
@ -528,9 +526,7 @@ class HeatOperatorCharm(sunbeam_charm.OSBaseOperatorAPICharm):
|
|||||||
)
|
)
|
||||||
return self.add_explicit_port(public_url)
|
return self.add_explicit_port(public_url)
|
||||||
else:
|
else:
|
||||||
return self.add_explicit_port(
|
return self.heat_cfn_internal_url
|
||||||
self.service_url(self.public_ingress_address)
|
|
||||||
)
|
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def heat_internal_url(self) -> str:
|
def heat_internal_url(self) -> str:
|
||||||
|
@ -102,7 +102,7 @@ class WSGIHorizonPebbleHandler(sunbeam_chandlers.WSGIPebbleHandler):
|
|||||||
logger.debug("Files changed: %r", files)
|
logger.debug("Files changed: %r", files)
|
||||||
if (
|
if (
|
||||||
self.charm.service_conf in files
|
self.charm.service_conf in files
|
||||||
and self.charm.ingress_public.ready
|
and self.charm.ingress_internal.ready
|
||||||
):
|
):
|
||||||
logger.debug("local_settings.py changed, running django utilities")
|
logger.debug("local_settings.py changed, running django utilities")
|
||||||
container = self.charm.unit.get_container(self.container_name)
|
container = self.charm.unit.get_container(self.container_name)
|
||||||
@ -141,7 +141,7 @@ class HorizonOperatorCharm(sunbeam_charm.OSBaseOperatorAPICharm):
|
|||||||
|
|
||||||
mandatory_relations = {
|
mandatory_relations = {
|
||||||
"database",
|
"database",
|
||||||
"ingress-public",
|
"ingress-internal",
|
||||||
"identity-credentials",
|
"identity-credentials",
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -231,6 +231,10 @@ class HorizonOperatorCharm(sunbeam_charm.OSBaseOperatorAPICharm):
|
|||||||
self.model.app.status = ops.model.ActiveStatus(
|
self.model.app.status = ops.model.ActiveStatus(
|
||||||
self.ingress_public.url
|
self.ingress_public.url
|
||||||
)
|
)
|
||||||
|
elif self.ingress_internal.url:
|
||||||
|
self.model.app.status = ops.model.ActiveStatus(
|
||||||
|
self.ingress_internal.url
|
||||||
|
)
|
||||||
else:
|
else:
|
||||||
self.model.app.status = ops.model.ActiveStatus()
|
self.model.app.status = ops.model.ActiveStatus()
|
||||||
|
|
||||||
@ -273,7 +277,7 @@ class HorizonOperatorCharm(sunbeam_charm.OSBaseOperatorAPICharm):
|
|||||||
"""Healthcheck HTTP URL for the service."""
|
"""Healthcheck HTTP URL for the service."""
|
||||||
return (
|
return (
|
||||||
super().healthcheck_http_url
|
super().healthcheck_http_url
|
||||||
+ self.ingress_public.context().get(
|
+ self.ingress_internal.context().get(
|
||||||
"ingress_path", self.model.name + "-horizon"
|
"ingress_path", self.model.name + "-horizon"
|
||||||
)
|
)
|
||||||
+ "/auth/login/"
|
+ "/auth/login/"
|
||||||
|
@ -833,17 +833,17 @@ REST_API_REQUIRED_SETTINGS = ['OPENSTACK_HYPERVISOR_FEATURES',
|
|||||||
|
|
||||||
# XXX Review theme handling and update here
|
# XXX Review theme handling and update here
|
||||||
|
|
||||||
WEBROOT = '{{ ingress_public.ingress_path }}'
|
WEBROOT = '{{ ingress_internal.ingress_path }}'
|
||||||
STATIC_URL = '{{ ingress_public.ingress_path }}/static/'
|
STATIC_URL = '{{ ingress_internal.ingress_path }}/static/'
|
||||||
|
|
||||||
{% if webroot == "/" %}
|
{% if webroot == "/" %}
|
||||||
LOGIN_URL='/auth/login/'
|
LOGIN_URL='/auth/login/'
|
||||||
LOGOUT_URL='/auth/logout/'
|
LOGOUT_URL='/auth/logout/'
|
||||||
{% else %}
|
{% else %}
|
||||||
LOGIN_URL='{{ ingress_public.ingress_path }}/auth/login/'
|
LOGIN_URL='{{ ingress_internal.ingress_path }}/auth/login/'
|
||||||
LOGOUT_URL='{{ ingress_public.ingress_path }}/auth/logout/'
|
LOGOUT_URL='{{ ingress_internal.ingress_path }}/auth/logout/'
|
||||||
{% endif %}
|
{% endif %}
|
||||||
LOGIN_REDIRECT_URL='{{ ingress_public.ingress_path }}'
|
LOGIN_REDIRECT_URL='{{ ingress_internal.ingress_path }}'
|
||||||
|
|
||||||
# By default, validation of the HTTP Host header is disabled. Production
|
# By default, validation of the HTTP Host header is disabled. Production
|
||||||
# installations should have this set accordingly. For more information
|
# installations should have this set accordingly. For more information
|
||||||
|
@ -1,12 +1,12 @@
|
|||||||
Listen 0.0.0.0:80
|
Listen 0.0.0.0:80
|
||||||
|
|
||||||
WSGIScriptAlias {{ ingress_public.ingress_path }} /usr/share/openstack-dashboard/openstack_dashboard/wsgi.py process-group=horizon
|
WSGIScriptAlias {{ ingress_internal.ingress_path }} /usr/share/openstack-dashboard/openstack_dashboard/wsgi.py process-group=horizon
|
||||||
WSGIDaemonProcess horizon user=horizon group=horizon processes=4 threads=10 display-name=%{GROUP}
|
WSGIDaemonProcess horizon user=horizon group=horizon processes=4 threads=10 display-name=%{GROUP}
|
||||||
WSGIProcessGroup horizon
|
WSGIProcessGroup horizon
|
||||||
WSGIApplicationGroup %{GLOBAL}
|
WSGIApplicationGroup %{GLOBAL}
|
||||||
|
|
||||||
Alias /static /var/lib/openstack-dashboard/static/
|
Alias /static /var/lib/openstack-dashboard/static/
|
||||||
Alias {{ ingress_public.ingress_path }}/static /var/lib/openstack-dashboard/static/
|
Alias {{ ingress_internal.ingress_path }}/static /var/lib/openstack-dashboard/static/
|
||||||
|
|
||||||
ErrorLog {{ wsgi_config.error_log }}
|
ErrorLog {{ wsgi_config.error_log }}
|
||||||
CustomLog {{ wsgi_config.custom_log }} combined
|
CustomLog {{ wsgi_config.custom_log }} combined
|
||||||
|
@ -113,5 +113,5 @@ class TestHorizonOperatorCharm(test_utils.CharmTestCase):
|
|||||||
action_event = MagicMock()
|
action_event = MagicMock()
|
||||||
self.harness.charm._get_dashboard_url_action(action_event)
|
self.harness.charm._get_dashboard_url_action(action_event)
|
||||||
action_event.set_results.assert_called_with(
|
action_event.set_results.assert_called_with(
|
||||||
{"url": "http://dashboard.juju:80"}
|
{"url": "http://10.0.0.10:80"}
|
||||||
)
|
)
|
||||||
|
@ -141,9 +141,9 @@ requires:
|
|||||||
ingress-internal:
|
ingress-internal:
|
||||||
interface: ingress
|
interface: ingress
|
||||||
limit: 1
|
limit: 1
|
||||||
optional: true
|
|
||||||
ingress-public:
|
ingress-public:
|
||||||
interface: ingress
|
interface: ingress
|
||||||
|
optional: true
|
||||||
limit: 1
|
limit: 1
|
||||||
amqp:
|
amqp:
|
||||||
interface: rabbitmq
|
interface: rabbitmq
|
||||||
|
@ -334,7 +334,7 @@ class KeystoneOperatorCharm(sunbeam_charm.OSBaseOperatorAPICharm):
|
|||||||
domain_config_dir = Path("/etc/keystone/domains")
|
domain_config_dir = Path("/etc/keystone/domains")
|
||||||
domain_ca_dir = Path("/usr/local/share/ca-certificates")
|
domain_ca_dir = Path("/usr/local/share/ca-certificates")
|
||||||
service_port = 5000
|
service_port = 5000
|
||||||
mandatory_relations = {"database", "ingress-public"}
|
mandatory_relations = {"database", "ingress-internal"}
|
||||||
db_sync_cmds = [
|
db_sync_cmds = [
|
||||||
[
|
[
|
||||||
"sudo",
|
"sudo",
|
||||||
@ -1461,12 +1461,7 @@ export OS_AUTH_VERSION=3
|
|||||||
if self.ingress_public and self.ingress_public.url:
|
if self.ingress_public and self.ingress_public.url:
|
||||||
return self.ingress_public.url.removesuffix("/") + "/v3"
|
return self.ingress_public.url.removesuffix("/") + "/v3"
|
||||||
|
|
||||||
address = self.public_ingress_address
|
return self.internal_endpoint
|
||||||
if not address:
|
|
||||||
address = self.model.get_binding(
|
|
||||||
self.IDSVC_RELATION_NAME
|
|
||||||
).network.ingress_address
|
|
||||||
return f"http://{address}:{self.service_port}/v3"
|
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def healthcheck_http_url(self) -> str:
|
def healthcheck_http_url(self) -> str:
|
||||||
|
@ -3,8 +3,8 @@ Listen 0.0.0.0:{{ ks_config.public_port }}
|
|||||||
<VirtualHost *:{{ ks_config.public_port }}>
|
<VirtualHost *:{{ ks_config.public_port }}>
|
||||||
WSGIDaemonProcess keystone-public processes=4 threads=1 user=keystone group=keystone display-name=%{GROUP} python-path=/usr/lib/python3/site-packages
|
WSGIDaemonProcess keystone-public processes=4 threads=1 user=keystone group=keystone display-name=%{GROUP} python-path=/usr/lib/python3/site-packages
|
||||||
WSGIProcessGroup keystone-public
|
WSGIProcessGroup keystone-public
|
||||||
{% if ingress_public and ingress_public.ingress_path -%}
|
{% if ingress_internal and ingress_internal.ingress_path -%}
|
||||||
WSGIScriptAlias {{ ingress_public.ingress_path }} /usr/bin/keystone-wsgi-public
|
WSGIScriptAlias {{ ingress_internal.ingress_path }} /usr/bin/keystone-wsgi-public
|
||||||
{% endif -%}
|
{% endif -%}
|
||||||
WSGIScriptAlias / /usr/bin/keystone-wsgi-public
|
WSGIScriptAlias / /usr/bin/keystone-wsgi-public
|
||||||
WSGIApplicationGroup %{GLOBAL}
|
WSGIApplicationGroup %{GLOBAL}
|
||||||
|
@ -543,7 +543,7 @@ class TestKeystoneOperatorCharm(test_utils.CharmTestCase):
|
|||||||
label = charm.CREDENTIALS_SECRET_PREFIX + "svc_" + "cinder"
|
label = charm.CREDENTIALS_SECRET_PREFIX + "svc_" + "cinder"
|
||||||
secret_id = rel_data["service-credentials"]
|
secret_id = rel_data["service-credentials"]
|
||||||
if remove_ingress:
|
if remove_ingress:
|
||||||
rel = self.harness.charm.model.get_relation("ingress-public")
|
rel = self.harness.charm.model.get_relation("ingress-internal")
|
||||||
rel_id = rel.id
|
rel_id = rel.id
|
||||||
self.harness.remove_relation(rel_id)
|
self.harness.remove_relation(rel_id)
|
||||||
self.km_mock.create_service_account = create_service_mock
|
self.km_mock.create_service_account = create_service_mock
|
||||||
|
@ -59,10 +59,10 @@ requires:
|
|||||||
interface: keystone-resources
|
interface: keystone-resources
|
||||||
ingress-internal:
|
ingress-internal:
|
||||||
interface: ingress
|
interface: ingress
|
||||||
optional: true
|
|
||||||
limit: 1
|
limit: 1
|
||||||
ingress-public:
|
ingress-public:
|
||||||
interface: ingress
|
interface: ingress
|
||||||
|
optional: true
|
||||||
limit: 1
|
limit: 1
|
||||||
amqp:
|
amqp:
|
||||||
interface: rabbitmq
|
interface: rabbitmq
|
||||||
|
@ -146,7 +146,7 @@ class MagnumOperatorCharm(sunbeam_charm.OSBaseOperatorAPICharm):
|
|||||||
"database",
|
"database",
|
||||||
"amqp",
|
"amqp",
|
||||||
"identity-service",
|
"identity-service",
|
||||||
"ingress-public",
|
"ingress-internal",
|
||||||
"identity-ops",
|
"identity-ops",
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2,8 +2,8 @@
|
|||||||
paste.composite_factory = magnum.api:root_app_factory
|
paste.composite_factory = magnum.api:root_app_factory
|
||||||
/: api
|
/: api
|
||||||
/healthcheck: healthcheck
|
/healthcheck: healthcheck
|
||||||
{% if ingress_public.ingress_path -%}
|
{% if ingress_internal.ingress_path -%}
|
||||||
{{ ingress_public.ingress_path }}: api
|
{{ ingress_internal.ingress_path }}: api
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
[pipeline:api]
|
[pipeline:api]
|
||||||
|
@ -3,8 +3,8 @@ Listen {{ wsgi_config.public_port }}
|
|||||||
WSGIDaemonProcess {{ wsgi_config.group }} processes=3 threads=1 user={{ wsgi_config.user }} group={{ wsgi_config.group }} \
|
WSGIDaemonProcess {{ wsgi_config.group }} processes=3 threads=1 user={{ wsgi_config.user }} group={{ wsgi_config.group }} \
|
||||||
display-name=%{GROUP}
|
display-name=%{GROUP}
|
||||||
WSGIProcessGroup {{ wsgi_config.group }}
|
WSGIProcessGroup {{ wsgi_config.group }}
|
||||||
{% if ingress_public and ingress_public.ingress_path -%}
|
{% if ingress_internal and ingress_internal.ingress_path -%}
|
||||||
WSGIScriptAlias {{ ingress_public.ingress_path }} {{ wsgi_config.wsgi_public_script }}
|
WSGIScriptAlias {{ ingress_internal.ingress_path }} {{ wsgi_config.wsgi_public_script }}
|
||||||
{% endif -%}
|
{% endif -%}
|
||||||
WSGIScriptAlias / {{ wsgi_config.wsgi_public_script }}
|
WSGIScriptAlias / {{ wsgi_config.wsgi_public_script }}
|
||||||
WSGIApplicationGroup %{GLOBAL}
|
WSGIApplicationGroup %{GLOBAL}
|
||||||
|
@ -69,9 +69,9 @@ requires:
|
|||||||
ingress-internal:
|
ingress-internal:
|
||||||
interface: ingress
|
interface: ingress
|
||||||
limit: 1
|
limit: 1
|
||||||
optional: true
|
|
||||||
ingress-public:
|
ingress-public:
|
||||||
interface: ingress
|
interface: ingress
|
||||||
|
optional: true
|
||||||
limit: 1
|
limit: 1
|
||||||
logging:
|
logging:
|
||||||
interface: loki_push_api
|
interface: loki_push_api
|
||||||
|
@ -294,7 +294,7 @@ class MasakariOperatorCharm(sunbeam_charm.OSBaseOperatorAPICharm):
|
|||||||
"database",
|
"database",
|
||||||
"amqp",
|
"amqp",
|
||||||
"identity-service",
|
"identity-service",
|
||||||
"ingress-public",
|
"ingress-internal",
|
||||||
}
|
}
|
||||||
|
|
||||||
wsgi_admin_script = "/usr/bin/masakari-wsgi"
|
wsgi_admin_script = "/usr/bin/masakari-wsgi"
|
||||||
|
@ -4,8 +4,8 @@ Listen {{ wsgi_config.public_port }}
|
|||||||
WSGIDaemonProcess {{ wsgi_config.name }} processes=4 threads=1 user={{ wsgi_config.user }} group={{ wsgi_config.group }} \
|
WSGIDaemonProcess {{ wsgi_config.name }} processes=4 threads=1 user={{ wsgi_config.user }} group={{ wsgi_config.group }} \
|
||||||
display-name=%{GROUP}
|
display-name=%{GROUP}
|
||||||
WSGIProcessGroup {{ wsgi_config.name }}
|
WSGIProcessGroup {{ wsgi_config.name }}
|
||||||
{% if ingress_public and ingress_public.ingress_path -%}
|
{% if ingress_internal and ingress_internal.ingress_path -%}
|
||||||
WSGIScriptAlias {{ ingress_public.ingress_path }} {{ wsgi_config.wsgi_public_script }}
|
WSGIScriptAlias {{ ingress_internal.ingress_path }} {{ wsgi_config.wsgi_public_script }}
|
||||||
{% endif -%}
|
{% endif -%}
|
||||||
WSGIScriptAlias / {{ wsgi_config.wsgi_public_script }}
|
WSGIScriptAlias / {{ wsgi_config.wsgi_public_script }}
|
||||||
WSGIApplicationGroup %{GLOBAL}
|
WSGIApplicationGroup %{GLOBAL}
|
||||||
|
@ -123,10 +123,10 @@ resources:
|
|||||||
requires:
|
requires:
|
||||||
ingress-internal:
|
ingress-internal:
|
||||||
interface: ingress
|
interface: ingress
|
||||||
optional: true
|
|
||||||
limit: 1
|
limit: 1
|
||||||
ingress-public:
|
ingress-public:
|
||||||
interface: ingress
|
interface: ingress
|
||||||
|
optional: true
|
||||||
limit: 1
|
limit: 1
|
||||||
database:
|
database:
|
||||||
interface: mysql_client
|
interface: mysql_client
|
||||||
|
@ -432,7 +432,7 @@ class NeutronOVNOperatorCharm(NeutronOperatorCharm):
|
|||||||
"database",
|
"database",
|
||||||
"ovsdb-cms",
|
"ovsdb-cms",
|
||||||
"identity-service",
|
"identity-service",
|
||||||
"ingress-public",
|
"ingress-internal",
|
||||||
}
|
}
|
||||||
|
|
||||||
@property
|
@property
|
||||||
|
@ -3,9 +3,9 @@ use = egg:Paste#urlmap
|
|||||||
/: neutronversions_composite
|
/: neutronversions_composite
|
||||||
/healthcheck: healthcheck
|
/healthcheck: healthcheck
|
||||||
/v2.0: neutronapi_v2_0
|
/v2.0: neutronapi_v2_0
|
||||||
{% if ingress_public.ingress_path -%}
|
{% if ingress_internal.ingress_path -%}
|
||||||
{{ ingress_public.ingress_path }}: neutronversions_composite
|
{{ ingress_internal.ingress_path }}: neutronversions_composite
|
||||||
{{ ingress_public.ingress_path }}/v2.0: neutronapi_v2_0
|
{{ ingress_internal.ingress_path }}/v2.0: neutronapi_v2_0
|
||||||
{% endif -%}
|
{% endif -%}
|
||||||
|
|
||||||
[composite:neutronapi_v2_0]
|
[composite:neutronapi_v2_0]
|
||||||
|
@ -3,8 +3,8 @@ Listen {{ wsgi_config.public_port }}
|
|||||||
WSGIDaemonProcess glance processes=4 threads=1 user={{ wsgi_config.user }} group={{ wsgi_config.group }} \
|
WSGIDaemonProcess glance processes=4 threads=1 user={{ wsgi_config.user }} group={{ wsgi_config.group }} \
|
||||||
display-name=%{GROUP}
|
display-name=%{GROUP}
|
||||||
WSGIProcessGroup glance
|
WSGIProcessGroup glance
|
||||||
{% if ingress_public and ingress_public.ingress_path -%}
|
{% if ingress_internal and ingress_internal.ingress_path -%}
|
||||||
WSGIScriptAlias {{ ingress_public.ingress_path }} {{ wsgi_config.wsgi_public_script }}
|
WSGIScriptAlias {{ ingress_internal.ingress_path }} {{ wsgi_config.wsgi_public_script }}
|
||||||
{% endif -%}
|
{% endif -%}
|
||||||
WSGIScriptAlias / {{ wsgi_config.wsgi_public_script }}
|
WSGIScriptAlias / {{ wsgi_config.wsgi_public_script }}
|
||||||
WSGIApplicationGroup %{GLOBAL}
|
WSGIApplicationGroup %{GLOBAL}
|
||||||
|
@ -68,17 +68,17 @@ resources:
|
|||||||
requires:
|
requires:
|
||||||
ingress-internal:
|
ingress-internal:
|
||||||
interface: ingress
|
interface: ingress
|
||||||
optional: true
|
|
||||||
limit: 1
|
limit: 1
|
||||||
ingress-public:
|
ingress-public:
|
||||||
interface: ingress
|
interface: ingress
|
||||||
|
optional: true
|
||||||
limit: 1
|
limit: 1
|
||||||
traefik-route-internal:
|
traefik-route-internal:
|
||||||
interface: traefik_route
|
interface: traefik_route
|
||||||
optional: true
|
|
||||||
limit: 1
|
limit: 1
|
||||||
traefik-route-public:
|
traefik-route-public:
|
||||||
interface: traefik_route
|
interface: traefik_route
|
||||||
|
optional: true
|
||||||
limit: 1
|
limit: 1
|
||||||
database:
|
database:
|
||||||
interface: mysql_client
|
interface: mysql_client
|
||||||
|
@ -349,8 +349,8 @@ class NovaOperatorCharm(sunbeam_charm.OSBaseOperatorAPICharm):
|
|||||||
"cell-database",
|
"cell-database",
|
||||||
"amqp",
|
"amqp",
|
||||||
"identity-service",
|
"identity-service",
|
||||||
"ingress-public",
|
"ingress-internal",
|
||||||
"traefik-route-public",
|
"traefik-route-internal",
|
||||||
}
|
}
|
||||||
|
|
||||||
def __init__(self, framework):
|
def __init__(self, framework):
|
||||||
@ -448,6 +448,15 @@ class NovaOperatorCharm(sunbeam_charm.OSBaseOperatorAPICharm):
|
|||||||
f"{self.model.name}-{NOVA_SPICEPROXY_INGRESS_NAME}"
|
f"{self.model.name}-{NOVA_SPICEPROXY_INGRESS_NAME}"
|
||||||
)
|
)
|
||||||
return public_url
|
return public_url
|
||||||
|
elif self.traefik_route_internal and self.traefik_route_internal.ready:
|
||||||
|
scheme = self.traefik_route_internal.interface.scheme
|
||||||
|
external_host = self.traefik_route_internal.interface.external_host
|
||||||
|
internal_url = (
|
||||||
|
f"{scheme}://{external_host}/{self.model.name}"
|
||||||
|
f"-{NOVA_SPICEPROXY_INGRESS_NAME}/spice_auto.html?path=/"
|
||||||
|
f"{self.model.name}-{NOVA_SPICEPROXY_INGRESS_NAME}"
|
||||||
|
)
|
||||||
|
return internal_url
|
||||||
|
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
@ -4,8 +4,8 @@ Listen {{ wsgi_nova_metadata.public_port }}
|
|||||||
WSGIDaemonProcess nova-api processes=4 threads=1 user={{ wsgi_config.user }} group={{ wsgi_config.group }} \
|
WSGIDaemonProcess nova-api processes=4 threads=1 user={{ wsgi_config.user }} group={{ wsgi_config.group }} \
|
||||||
display-name=%{GROUP}
|
display-name=%{GROUP}
|
||||||
WSGIProcessGroup nova-api
|
WSGIProcessGroup nova-api
|
||||||
{% if ingress_public and ingress_public.ingress_path -%}
|
{% if ingress_internal and ingress_internal.ingress_path -%}
|
||||||
WSGIScriptAlias {{ ingress_public.ingress_path }} {{ wsgi_config.wsgi_public_script }}
|
WSGIScriptAlias {{ ingress_internal.ingress_path }} {{ wsgi_config.wsgi_public_script }}
|
||||||
{% endif -%}
|
{% endif -%}
|
||||||
WSGIScriptAlias / {{ wsgi_config.wsgi_public_script }}
|
WSGIScriptAlias / {{ wsgi_config.wsgi_public_script }}
|
||||||
WSGIApplicationGroup %{GLOBAL}
|
WSGIApplicationGroup %{GLOBAL}
|
||||||
|
@ -72,10 +72,10 @@ requires:
|
|||||||
interface: keystone
|
interface: keystone
|
||||||
ingress-internal:
|
ingress-internal:
|
||||||
interface: ingress
|
interface: ingress
|
||||||
optional: true
|
|
||||||
limit: 1
|
limit: 1
|
||||||
ingress-public:
|
ingress-public:
|
||||||
interface: ingress
|
interface: ingress
|
||||||
|
optional: true
|
||||||
limit: 1
|
limit: 1
|
||||||
ovsdb-cms:
|
ovsdb-cms:
|
||||||
interface: ovsdb-cms
|
interface: ovsdb-cms
|
||||||
|
@ -304,7 +304,7 @@ class OctaviaOVNOperatorCharm(OctaviaOperatorCharm):
|
|||||||
"database",
|
"database",
|
||||||
"ovsdb-cms",
|
"ovsdb-cms",
|
||||||
"identity-service",
|
"identity-service",
|
||||||
"ingress-public",
|
"ingress-internal",
|
||||||
}
|
}
|
||||||
|
|
||||||
@property
|
@property
|
||||||
|
@ -4,8 +4,8 @@ Listen {{ wsgi_config.public_port }}
|
|||||||
WSGIDaemonProcess {{ wsgi_config.group }} processes=3 threads=1 user={{ wsgi_config.user }} group={{ wsgi_config.group }} \
|
WSGIDaemonProcess {{ wsgi_config.group }} processes=3 threads=1 user={{ wsgi_config.user }} group={{ wsgi_config.group }} \
|
||||||
display-name=%{GROUP}
|
display-name=%{GROUP}
|
||||||
WSGIProcessGroup {{ wsgi_config.group }}
|
WSGIProcessGroup {{ wsgi_config.group }}
|
||||||
{% if ingress_public.ingress_path -%}
|
{% if ingress_internal.ingress_path -%}
|
||||||
WSGIScriptAlias {{ ingress_public.ingress_path }} {{ wsgi_config.wsgi_public_script }}
|
WSGIScriptAlias {{ ingress_internal.ingress_path }} {{ wsgi_config.wsgi_public_script }}
|
||||||
{% endif -%}
|
{% endif -%}
|
||||||
WSGIScriptAlias / {{ wsgi_config.wsgi_public_script }}
|
WSGIScriptAlias / {{ wsgi_config.wsgi_public_script }}
|
||||||
WSGIApplicationGroup %{GLOBAL}
|
WSGIApplicationGroup %{GLOBAL}
|
||||||
|
@ -4,8 +4,8 @@ Listen {{ wsgi_config.public_port }}
|
|||||||
WSGIDaemonProcess {{ wsgi_config.group }} processes=3 threads=1 user={{ wsgi_config.user }} group={{ wsgi_config.group }} \
|
WSGIDaemonProcess {{ wsgi_config.group }} processes=3 threads=1 user={{ wsgi_config.user }} group={{ wsgi_config.group }} \
|
||||||
display-name=%{GROUP}
|
display-name=%{GROUP}
|
||||||
WSGIProcessGroup {{ wsgi_config.group }}
|
WSGIProcessGroup {{ wsgi_config.group }}
|
||||||
{% if ingress_public.ingress_path -%}
|
{% if ingress_internal.ingress_path -%}
|
||||||
WSGIScriptAlias {{ ingress_public.ingress_path }} {{ wsgi_config.wsgi_public_script }}
|
WSGIScriptAlias {{ ingress_internal.ingress_path }} {{ wsgi_config.wsgi_public_script }}
|
||||||
{% endif -%}
|
{% endif -%}
|
||||||
WSGIScriptAlias / {{ wsgi_config.wsgi_public_script }}
|
WSGIScriptAlias / {{ wsgi_config.wsgi_public_script }}
|
||||||
WSGIApplicationGroup %{GLOBAL}
|
WSGIApplicationGroup %{GLOBAL}
|
||||||
|
@ -62,6 +62,7 @@ requires:
|
|||||||
optional: true
|
optional: true
|
||||||
ingress-public:
|
ingress-public:
|
||||||
interface: ingress
|
interface: ingress
|
||||||
|
optional: true
|
||||||
limit: 1
|
limit: 1
|
||||||
identity-service:
|
identity-service:
|
||||||
interface: keystone
|
interface: keystone
|
||||||
|
@ -157,7 +157,7 @@ class OpenstackImagesSyncK8SCharm(sunbeam_charm.OSBaseOperatorAPICharm):
|
|||||||
service_name = "openstack-images-sync"
|
service_name = "openstack-images-sync"
|
||||||
mandatory_relations = {
|
mandatory_relations = {
|
||||||
"identity-service",
|
"identity-service",
|
||||||
"ingress-public",
|
"ingress-internal",
|
||||||
}
|
}
|
||||||
|
|
||||||
@property
|
@property
|
||||||
|
@ -3,8 +3,8 @@ Listen {{ httpd_config.public_port }}
|
|||||||
<VirtualHost *:{{ httpd_config.public_port }}>
|
<VirtualHost *:{{ httpd_config.public_port }}>
|
||||||
DocumentRoot "/var/www/html/simplestreams"
|
DocumentRoot "/var/www/html/simplestreams"
|
||||||
|
|
||||||
{% if ingress_public and ingress_public.ingress_path %}
|
{% if ingress_internal and ingress_internal.ingress_path %}
|
||||||
Alias {{ ingress_public.ingress_path }} "/var/www/html/simplestreams"
|
Alias {{ ingress_internal.ingress_path }} "/var/www/html/simplestreams"
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
<Directory "/var/www/html/simplestreams">
|
<Directory "/var/www/html/simplestreams">
|
||||||
|
@ -3,8 +3,8 @@ Listen {{ wsgi_config.public_port }}
|
|||||||
WSGIDaemonProcess placement processes=4 threads=1 user={{ wsgi_config.user }} group={{ wsgi_config.group }} \
|
WSGIDaemonProcess placement processes=4 threads=1 user={{ wsgi_config.user }} group={{ wsgi_config.group }} \
|
||||||
display-name=%{GROUP}
|
display-name=%{GROUP}
|
||||||
WSGIProcessGroup placement
|
WSGIProcessGroup placement
|
||||||
{% if ingress_public and ingress_public.ingress_path -%}
|
{% if ingress_internal and ingress_internal.ingress_path -%}
|
||||||
WSGIScriptAlias {{ ingress_public.ingress_path }} {{ wsgi_config.wsgi_public_script }}
|
WSGIScriptAlias {{ ingress_internal.ingress_path }} {{ wsgi_config.wsgi_public_script }}
|
||||||
{% endif -%}
|
{% endif -%}
|
||||||
WSGIScriptAlias / {{ wsgi_config.wsgi_public_script }}
|
WSGIScriptAlias / {{ wsgi_config.wsgi_public_script }}
|
||||||
WSGIApplicationGroup %{GLOBAL}
|
WSGIApplicationGroup %{GLOBAL}
|
||||||
|
@ -80,9 +80,9 @@ requires:
|
|||||||
ingress-internal:
|
ingress-internal:
|
||||||
interface: ingress
|
interface: ingress
|
||||||
limit: 1
|
limit: 1
|
||||||
optional: true
|
|
||||||
ingress-public:
|
ingress-public:
|
||||||
interface: ingress
|
interface: ingress
|
||||||
|
optional: true
|
||||||
limit: 1
|
limit: 1
|
||||||
logging:
|
logging:
|
||||||
interface: loki_push_api
|
interface: loki_push_api
|
||||||
|
@ -118,7 +118,12 @@ class WatcherOperatorCharm(sunbeam_charm.OSBaseOperatorAPICharm):
|
|||||||
service_name = "watcher-api"
|
service_name = "watcher-api"
|
||||||
wsgi_admin_script = "/usr/bin/watcher-api-wsgi"
|
wsgi_admin_script = "/usr/bin/watcher-api-wsgi"
|
||||||
wsgi_public_script = "/usr/bin/watcher-api-wsgi"
|
wsgi_public_script = "/usr/bin/watcher-api-wsgi"
|
||||||
mandatory_relations = {"database", "amqp", "identity-service"}
|
mandatory_relations = {
|
||||||
|
"database",
|
||||||
|
"amqp",
|
||||||
|
"identity-service",
|
||||||
|
"ingress-internal",
|
||||||
|
}
|
||||||
|
|
||||||
db_sync_cmds = [
|
db_sync_cmds = [
|
||||||
[
|
[
|
||||||
|
@ -3,8 +3,8 @@ Listen {{ wsgi_config.public_port }}
|
|||||||
WSGIDaemonProcess {{ wsgi_config.name }} processes=4 threads=1 user={{ wsgi_config.user }} group={{ wsgi_config.group }} \
|
WSGIDaemonProcess {{ wsgi_config.name }} processes=4 threads=1 user={{ wsgi_config.user }} group={{ wsgi_config.group }} \
|
||||||
display-name=%{GROUP}
|
display-name=%{GROUP}
|
||||||
WSGIProcessGroup {{ wsgi_config.name }}
|
WSGIProcessGroup {{ wsgi_config.name }}
|
||||||
{% if ingress_public and ingress_public.ingress_path -%}
|
{% if ingress_internal and ingress_internal.ingress_path -%}
|
||||||
WSGIScriptAlias {{ ingress_public.ingress_path }} {{ wsgi_config.wsgi_public_script }}
|
WSGIScriptAlias {{ ingress_internal.ingress_path }} {{ wsgi_config.wsgi_public_script }}
|
||||||
{% endif -%}
|
{% endif -%}
|
||||||
WSGIScriptAlias / {{ wsgi_config.wsgi_public_script }}
|
WSGIScriptAlias / {{ wsgi_config.wsgi_public_script }}
|
||||||
WSGIApplicationGroup %{GLOBAL}
|
WSGIApplicationGroup %{GLOBAL}
|
||||||
@ -24,4 +24,4 @@ Listen {{ wsgi_config.public_port }}
|
|||||||
Allow from all
|
Allow from all
|
||||||
</IfVersion>
|
</IfVersion>
|
||||||
</Directory>
|
</Directory>
|
||||||
</VirtualHost>
|
</VirtualHost>
|
||||||
|
@ -789,7 +789,7 @@ class OSBaseOperatorCharmK8S(OSBaseOperatorCharm):
|
|||||||
class OSBaseOperatorAPICharm(OSBaseOperatorCharmK8S):
|
class OSBaseOperatorAPICharm(OSBaseOperatorCharmK8S):
|
||||||
"""Base class for OpenStack API operators."""
|
"""Base class for OpenStack API operators."""
|
||||||
|
|
||||||
mandatory_relations = {"database", "identity-service", "ingress-public"}
|
mandatory_relations = {"database", "identity-service", "ingress-internal"}
|
||||||
wsgi_admin_script: str
|
wsgi_admin_script: str
|
||||||
wsgi_public_script: str
|
wsgi_public_script: str
|
||||||
|
|
||||||
@ -918,9 +918,7 @@ class OSBaseOperatorAPICharm(OSBaseOperatorCharmK8S):
|
|||||||
except (AttributeError, KeyError):
|
except (AttributeError, KeyError):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
return self.add_explicit_port(
|
return self.internal_url
|
||||||
self.service_url(self.public_ingress_address)
|
|
||||||
)
|
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def admin_url(self) -> str:
|
def admin_url(self) -> str:
|
||||||
|
@ -144,7 +144,7 @@ relations:
|
|||||||
- - mysql:database
|
- - mysql:database
|
||||||
- keystone:database
|
- keystone:database
|
||||||
- - traefik:ingress
|
- - traefik:ingress
|
||||||
- keystone:ingress-public
|
- keystone:ingress-internal
|
||||||
|
|
||||||
- - mysql:database
|
- - mysql:database
|
||||||
- glance:database
|
- glance:database
|
||||||
@ -153,7 +153,7 @@ relations:
|
|||||||
- - rabbitmq:amqp
|
- - rabbitmq:amqp
|
||||||
- glance:amqp
|
- glance:amqp
|
||||||
- - traefik:ingress
|
- - traefik:ingress
|
||||||
- glance:ingress-public
|
- glance:ingress-internal
|
||||||
- - keystone:send-ca-cert
|
- - keystone:send-ca-cert
|
||||||
- glance:receive-ca-cert
|
- glance:receive-ca-cert
|
||||||
|
|
||||||
@ -164,7 +164,7 @@ relations:
|
|||||||
- - keystone:identity-ops
|
- - keystone:identity-ops
|
||||||
- heat:identity-ops
|
- heat:identity-ops
|
||||||
- - traefik:traefik-route
|
- - traefik:traefik-route
|
||||||
- heat:traefik-route-public
|
- heat:traefik-route-internal
|
||||||
- - rabbitmq:amqp
|
- - rabbitmq:amqp
|
||||||
- heat:amqp
|
- heat:amqp
|
||||||
- - keystone:send-ca-cert
|
- - keystone:send-ca-cert
|
||||||
@ -177,7 +177,7 @@ relations:
|
|||||||
- - keystone:identity-ops
|
- - keystone:identity-ops
|
||||||
- octavia:identity-ops
|
- octavia:identity-ops
|
||||||
- - traefik:ingress
|
- - traefik:ingress
|
||||||
- octavia:ingress-public
|
- octavia:ingress-internal
|
||||||
- - tls-operator:certificates
|
- - tls-operator:certificates
|
||||||
- octavia:certificates
|
- octavia:certificates
|
||||||
- - octavia:ovsdb-cms
|
- - octavia:ovsdb-cms
|
||||||
@ -194,7 +194,7 @@ relations:
|
|||||||
- - keystone:identity-ops
|
- - keystone:identity-ops
|
||||||
- barbican:identity-ops
|
- barbican:identity-ops
|
||||||
- - traefik:ingress
|
- - traefik:ingress
|
||||||
- barbican:ingress-public
|
- barbican:ingress-internal
|
||||||
- - vault:vault-kv
|
- - vault:vault-kv
|
||||||
- barbican:vault-kv
|
- barbican:vault-kv
|
||||||
- - keystone:send-ca-cert
|
- - keystone:send-ca-cert
|
||||||
@ -209,6 +209,6 @@ relations:
|
|||||||
- - keystone:identity-ops
|
- - keystone:identity-ops
|
||||||
- magnum:identity-ops
|
- magnum:identity-ops
|
||||||
- - traefik:ingress
|
- - traefik:ingress
|
||||||
- magnum:ingress-public
|
- magnum:ingress-internal
|
||||||
- - keystone:send-ca-cert
|
- - keystone:send-ca-cert
|
||||||
- magnum:receive-ca-cert
|
- magnum:receive-ca-cert
|
||||||
|
@ -125,7 +125,7 @@ relations:
|
|||||||
- - mysql:database
|
- - mysql:database
|
||||||
- keystone:database
|
- keystone:database
|
||||||
- - traefik:ingress
|
- - traefik:ingress
|
||||||
- keystone:ingress-public
|
- keystone:ingress-internal
|
||||||
|
|
||||||
- - mysql:database
|
- - mysql:database
|
||||||
- cinder:database
|
- cinder:database
|
||||||
@ -134,7 +134,7 @@ relations:
|
|||||||
- - keystone:identity-service
|
- - keystone:identity-service
|
||||||
- cinder:identity-service
|
- cinder:identity-service
|
||||||
- - traefik:ingress
|
- - traefik:ingress
|
||||||
- cinder:ingress-public
|
- cinder:ingress-internal
|
||||||
- - keystone:send-ca-cert
|
- - keystone:send-ca-cert
|
||||||
- cinder:receive-ca-cert
|
- cinder:receive-ca-cert
|
||||||
|
|
||||||
@ -150,7 +150,7 @@ relations:
|
|||||||
- - mysql:database
|
- - mysql:database
|
||||||
- gnocchi:database
|
- gnocchi:database
|
||||||
- - traefik:ingress
|
- - traefik:ingress
|
||||||
- gnocchi:ingress-public
|
- gnocchi:ingress-internal
|
||||||
- - keystone:identity-service
|
- - keystone:identity-service
|
||||||
- gnocchi:identity-service
|
- gnocchi:identity-service
|
||||||
- - keystone:send-ca-cert
|
- - keystone:send-ca-cert
|
||||||
@ -172,7 +172,7 @@ relations:
|
|||||||
- - keystone:identity-service
|
- - keystone:identity-service
|
||||||
- aodh:identity-service
|
- aodh:identity-service
|
||||||
- - traefik:ingress
|
- - traefik:ingress
|
||||||
- aodh:ingress-public
|
- aodh:ingress-internal
|
||||||
- - keystone:send-ca-cert
|
- - keystone:send-ca-cert
|
||||||
- aodh:receive-ca-cert
|
- aodh:receive-ca-cert
|
||||||
|
|
||||||
@ -183,7 +183,7 @@ relations:
|
|||||||
- - keystone:identity-service
|
- - keystone:identity-service
|
||||||
- watcher:identity-service
|
- watcher:identity-service
|
||||||
- - traefik:ingress
|
- - traefik:ingress
|
||||||
- watcher:ingress-public
|
- watcher:ingress-internal
|
||||||
- - keystone:send-ca-cert
|
- - keystone:send-ca-cert
|
||||||
- watcher:receive-ca-cert
|
- watcher:receive-ca-cert
|
||||||
- - gnocchi:gnocchi-service
|
- - gnocchi:gnocchi-service
|
||||||
|
@ -159,7 +159,7 @@ relations:
|
|||||||
- - mysql:database
|
- - mysql:database
|
||||||
- keystone:database
|
- keystone:database
|
||||||
- - traefik:ingress
|
- - traefik:ingress
|
||||||
- keystone:ingress-public
|
- keystone:ingress-internal
|
||||||
|
|
||||||
- - mysql:database
|
- - mysql:database
|
||||||
- glance:database
|
- glance:database
|
||||||
@ -168,7 +168,7 @@ relations:
|
|||||||
- - rabbitmq:amqp
|
- - rabbitmq:amqp
|
||||||
- glance:amqp
|
- glance:amqp
|
||||||
- - traefik:ingress
|
- - traefik:ingress
|
||||||
- glance:ingress-public
|
- glance:ingress-internal
|
||||||
- - keystone:send-ca-cert
|
- - keystone:send-ca-cert
|
||||||
- glance:receive-ca-cert
|
- glance:receive-ca-cert
|
||||||
|
|
||||||
@ -183,9 +183,9 @@ relations:
|
|||||||
- - keystone:identity-service
|
- - keystone:identity-service
|
||||||
- nova:identity-service
|
- nova:identity-service
|
||||||
- - traefik:ingress
|
- - traefik:ingress
|
||||||
- nova:ingress-public
|
- nova:ingress-internal
|
||||||
- - traefik:traefik-route
|
- - traefik:traefik-route
|
||||||
- nova:traefik-route-public
|
- nova:traefik-route-internal
|
||||||
- - keystone:send-ca-cert
|
- - keystone:send-ca-cert
|
||||||
- nova:receive-ca-cert
|
- nova:receive-ca-cert
|
||||||
|
|
||||||
@ -194,7 +194,7 @@ relations:
|
|||||||
- - keystone:identity-service
|
- - keystone:identity-service
|
||||||
- placement:identity-service
|
- placement:identity-service
|
||||||
- - traefik:ingress
|
- - traefik:ingress
|
||||||
- placement:ingress-public
|
- placement:ingress-internal
|
||||||
- - keystone:send-ca-cert
|
- - keystone:send-ca-cert
|
||||||
- placement:receive-ca-cert
|
- placement:receive-ca-cert
|
||||||
|
|
||||||
@ -205,7 +205,7 @@ relations:
|
|||||||
- - keystone:identity-service
|
- - keystone:identity-service
|
||||||
- neutron:identity-service
|
- neutron:identity-service
|
||||||
- - traefik:ingress
|
- - traefik:ingress
|
||||||
- neutron:ingress-public
|
- neutron:ingress-internal
|
||||||
- - tls-operator:certificates
|
- - tls-operator:certificates
|
||||||
- neutron:certificates
|
- neutron:certificates
|
||||||
- - neutron:ovsdb-cms
|
- - neutron:ovsdb-cms
|
||||||
@ -216,4 +216,4 @@ relations:
|
|||||||
- - keystone:identity-service
|
- - keystone:identity-service
|
||||||
- openstack-images-sync:identity-service
|
- openstack-images-sync:identity-service
|
||||||
- - traefik:ingress
|
- - traefik:ingress
|
||||||
- openstack-images-sync:ingress-public
|
- openstack-images-sync:ingress-internal
|
||||||
|
@ -127,7 +127,7 @@ relations:
|
|||||||
- - mysql:database
|
- - mysql:database
|
||||||
- keystone:database
|
- keystone:database
|
||||||
- - traefik:ingress
|
- - traefik:ingress
|
||||||
- keystone:ingress-public
|
- keystone:ingress-internal
|
||||||
|
|
||||||
- - mysql:database
|
- - mysql:database
|
||||||
- designate:database
|
- designate:database
|
||||||
@ -136,7 +136,7 @@ relations:
|
|||||||
- - keystone:identity-service
|
- - keystone:identity-service
|
||||||
- designate:identity-service
|
- designate:identity-service
|
||||||
- - traefik:ingress
|
- - traefik:ingress
|
||||||
- designate:ingress-public
|
- designate:ingress-internal
|
||||||
- - designate-bind:dns-backend
|
- - designate-bind:dns-backend
|
||||||
- designate:dns-backend
|
- designate:dns-backend
|
||||||
- - keystone:send-ca-cert
|
- - keystone:send-ca-cert
|
||||||
@ -153,7 +153,7 @@ relations:
|
|||||||
- - keystone:identity-credentials
|
- - keystone:identity-credentials
|
||||||
- horizon:identity-credentials
|
- horizon:identity-credentials
|
||||||
- - traefik:ingress
|
- - traefik:ingress
|
||||||
- horizon:ingress-public
|
- horizon:ingress-internal
|
||||||
- - keystone:send-ca-cert
|
- - keystone:send-ca-cert
|
||||||
- horizon:receive-ca-cert
|
- horizon:receive-ca-cert
|
||||||
|
|
||||||
@ -164,7 +164,7 @@ relations:
|
|||||||
- - keystone:identity-service
|
- - keystone:identity-service
|
||||||
- masakari:identity-service
|
- masakari:identity-service
|
||||||
- - traefik:ingress
|
- - traefik:ingress
|
||||||
- masakari:ingress-public
|
- masakari:ingress-internal
|
||||||
|
|
||||||
- - masakari:consul-management
|
- - masakari:consul-management
|
||||||
- consul:consul-cluster
|
- consul:consul-cluster
|
||||||
|
@ -154,7 +154,7 @@ relations:
|
|||||||
- - mysql:database
|
- - mysql:database
|
||||||
- keystone:database
|
- keystone:database
|
||||||
- - traefik:ingress
|
- - traefik:ingress
|
||||||
- keystone:ingress-public
|
- keystone:ingress-internal
|
||||||
|
|
||||||
- - mysql:database
|
- - mysql:database
|
||||||
- glance:database
|
- glance:database
|
||||||
@ -163,7 +163,7 @@ relations:
|
|||||||
- - rabbitmq:amqp
|
- - rabbitmq:amqp
|
||||||
- glance:amqp
|
- glance:amqp
|
||||||
- - traefik:ingress
|
- - traefik:ingress
|
||||||
- glance:ingress-public
|
- glance:ingress-internal
|
||||||
- - keystone:send-ca-cert
|
- - keystone:send-ca-cert
|
||||||
- glance:receive-ca-cert
|
- glance:receive-ca-cert
|
||||||
|
|
||||||
@ -178,9 +178,9 @@ relations:
|
|||||||
- - keystone:identity-service
|
- - keystone:identity-service
|
||||||
- nova:identity-service
|
- nova:identity-service
|
||||||
- - traefik:ingress
|
- - traefik:ingress
|
||||||
- nova:ingress-public
|
- nova:ingress-internal
|
||||||
- - traefik:traefik-route
|
- - traefik:traefik-route
|
||||||
- nova:traefik-route-public
|
- nova:traefik-route-internal
|
||||||
- - keystone:send-ca-cert
|
- - keystone:send-ca-cert
|
||||||
- nova:receive-ca-cert
|
- nova:receive-ca-cert
|
||||||
|
|
||||||
@ -189,7 +189,7 @@ relations:
|
|||||||
- - keystone:identity-service
|
- - keystone:identity-service
|
||||||
- placement:identity-service
|
- placement:identity-service
|
||||||
- - traefik:ingress
|
- - traefik:ingress
|
||||||
- placement:ingress-public
|
- placement:ingress-internal
|
||||||
- - keystone:send-ca-cert
|
- - keystone:send-ca-cert
|
||||||
- placement:receive-ca-cert
|
- placement:receive-ca-cert
|
||||||
|
|
||||||
@ -200,7 +200,7 @@ relations:
|
|||||||
- - keystone:identity-service
|
- - keystone:identity-service
|
||||||
- neutron:identity-service
|
- neutron:identity-service
|
||||||
- - traefik:ingress
|
- - traefik:ingress
|
||||||
- neutron:ingress-public
|
- neutron:ingress-internal
|
||||||
- - tls-operator:certificates
|
- - tls-operator:certificates
|
||||||
- neutron:certificates
|
- neutron:certificates
|
||||||
- - neutron:ovsdb-cms
|
- - neutron:ovsdb-cms
|
||||||
|
Loading…
x
Reference in New Issue
Block a user