WIP: connection credentials
This commit is contained in:
parent
40811cbc08
commit
60b47ed6c8
2 changed files with 110 additions and 0 deletions
|
@ -605,3 +605,80 @@ class ServiceInstance(ServalaModelMixin, models.Model):
|
||||||
if not (status := self.kubernetes_object.get("status")):
|
if not (status := self.kubernetes_object.get("status")):
|
||||||
return []
|
return []
|
||||||
return status.get("conditions") or []
|
return status.get("conditions") or []
|
||||||
|
|
||||||
|
@cached_property
|
||||||
|
def connection_credentials(self):
|
||||||
|
"""
|
||||||
|
Get connection credentials via spec.resourceRef.
|
||||||
|
The resource referenced there has the information which secret
|
||||||
|
we want in spec.writeConnectionSecretToRef.name and spec.writeConnectionSecretToRef.namespace.
|
||||||
|
"""
|
||||||
|
if not self.kubernetes_object:
|
||||||
|
return {}
|
||||||
|
if not (
|
||||||
|
resource_ref := self.kubernetes_object.get("spec", {}).get("resourceRef")
|
||||||
|
):
|
||||||
|
return {}
|
||||||
|
|
||||||
|
try:
|
||||||
|
group = resource_ref.get("apiVersion", "").split("/")[0]
|
||||||
|
version = resource_ref.get("apiVersion", "").split("/")[1]
|
||||||
|
kind = resource_ref.get("kind")
|
||||||
|
name = resource_ref.get("name")
|
||||||
|
namespace = resource_ref.get("namespace", self.organization.namespace)
|
||||||
|
|
||||||
|
if not all([group, version, kind, name]):
|
||||||
|
return {}
|
||||||
|
|
||||||
|
plural = kind.lower()
|
||||||
|
if not plural.endswith("s"):
|
||||||
|
plural = f"{plural}s"
|
||||||
|
|
||||||
|
api_instance = client.CustomObjectsApi(
|
||||||
|
self.context.control_plane.get_kubernetes_client()
|
||||||
|
)
|
||||||
|
|
||||||
|
referenced_obj = api_instance.get_namespaced_custom_object(
|
||||||
|
group=group,
|
||||||
|
version=version,
|
||||||
|
namespace=namespace,
|
||||||
|
plural=plural,
|
||||||
|
name=name,
|
||||||
|
)
|
||||||
|
|
||||||
|
secret_ref = referenced_obj.get("spec", {}).get(
|
||||||
|
"writeConnectionSecretToRef"
|
||||||
|
)
|
||||||
|
if not secret_ref:
|
||||||
|
return {}
|
||||||
|
|
||||||
|
secret_name = secret_ref.get("name")
|
||||||
|
secret_namespace = secret_ref.get("namespace", namespace)
|
||||||
|
|
||||||
|
if not secret_name:
|
||||||
|
return {}
|
||||||
|
|
||||||
|
# Get the secret data
|
||||||
|
v1 = kubernetes.client.CoreV1Api(
|
||||||
|
self.context.control_plane.get_kubernetes_client()
|
||||||
|
)
|
||||||
|
secret = v1.read_namespaced_secret(
|
||||||
|
name=secret_name, namespace=secret_namespace
|
||||||
|
)
|
||||||
|
|
||||||
|
# Secret data is base64 encoded
|
||||||
|
credentials = {}
|
||||||
|
if hasattr(secret, "data") and secret.data:
|
||||||
|
import base64
|
||||||
|
|
||||||
|
for key, value in secret.data.items():
|
||||||
|
try:
|
||||||
|
credentials[key] = base64.b64decode(value).decode("utf-8")
|
||||||
|
except Exception:
|
||||||
|
credentials[key] = f"<binary data: {len(value)} bytes>"
|
||||||
|
|
||||||
|
return credentials
|
||||||
|
except ApiException as e:
|
||||||
|
return {"error": str(e)}
|
||||||
|
except Exception as e:
|
||||||
|
return {"error": str(e)}
|
||||||
|
|
|
@ -131,6 +131,39 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
{% if instance.connection_credentials %}
|
||||||
|
<div class="card">
|
||||||
|
<div class="card-header">
|
||||||
|
<h4>{% translate "Connection Credentials" %}</h4>
|
||||||
|
</div>
|
||||||
|
<div class="card-body">
|
||||||
|
<div class="table-responsive">
|
||||||
|
<table class="table table-bordered">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th>{% translate "Name" %}</th>
|
||||||
|
<th>{% translate "Value" %}</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
{% for key, value in instance.connection_credentials.items %}
|
||||||
|
<tr>
|
||||||
|
<td>{{ key }}</td>
|
||||||
|
<td>
|
||||||
|
{% if key == "error" %}
|
||||||
|
<span class="text-danger">{{ value }}</span>
|
||||||
|
{% else %}
|
||||||
|
<code>{{ value }}</code>
|
||||||
|
{% endif %}
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
{% endfor %}
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
{% endblock content %}
|
{% endblock content %}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue