From b169a32807209d30cea3797f5b457b5837365f82 Mon Sep 17 00:00:00 2001
From: Hemanth Nakkina <hemanth.nakkina@canonical.com>
Date: Mon, 6 Mar 2023 20:25:20 +0530
Subject: [PATCH] Use library identity_service v1.0

Update identity_service library to v1.0

Update zuul.yaml to use juju 3.1 for CI tests

Change-Id: I95f6628202b6c85998e4079b581867d3fcd270b9
---
 charms/nova-k8s/.zuul.yaml                    |  4 ++
 charms/nova-k8s/fetch-libs.sh                 |  2 +-
 .../{v0 => v1}/identity_service.py            | 45 ++++++++++++++-----
 charms/nova-k8s/test-requirements.txt         |  2 +-
 4 files changed, 41 insertions(+), 12 deletions(-)
 rename charms/nova-k8s/lib/charms/keystone_k8s/{v0 => v1}/identity_service.py (92%)

diff --git a/charms/nova-k8s/.zuul.yaml b/charms/nova-k8s/.zuul.yaml
index d2810cb2..6b033934 100644
--- a/charms/nova-k8s/.zuul.yaml
+++ b/charms/nova-k8s/.zuul.yaml
@@ -5,3 +5,7 @@
       - microk8s-func-test
     vars:
       charm_build_name: nova-k8s
+      juju_channel: 3.1/stable
+      juju_classic_mode: false
+      microk8s_channel: 1.26-strict/stable
+      microk8s_classic_mode: false
diff --git a/charms/nova-k8s/fetch-libs.sh b/charms/nova-k8s/fetch-libs.sh
index 0cd30496..9db9b9bf 100755
--- a/charms/nova-k8s/fetch-libs.sh
+++ b/charms/nova-k8s/fetch-libs.sh
@@ -2,7 +2,7 @@
 
 echo "INFO: Fetching libs from charmhub."
 charmcraft fetch-lib charms.data_platform_libs.v0.database_requires
-charmcraft fetch-lib charms.keystone_k8s.v0.identity_service
+charmcraft fetch-lib charms.keystone_k8s.v1.identity_service
 charmcraft fetch-lib charms.rabbitmq_k8s.v0.rabbitmq
 charmcraft fetch-lib charms.observability_libs.v0.kubernetes_service_patch
 charmcraft fetch-lib charms.traefik_k8s.v1.ingress
diff --git a/charms/nova-k8s/lib/charms/keystone_k8s/v0/identity_service.py b/charms/nova-k8s/lib/charms/keystone_k8s/v1/identity_service.py
similarity index 92%
rename from charms/nova-k8s/lib/charms/keystone_k8s/v0/identity_service.py
rename to charms/nova-k8s/lib/charms/keystone_k8s/v1/identity_service.py
index e8d2773e..35556622 100644
--- a/charms/nova-k8s/lib/charms/keystone_k8s/v0/identity_service.py
+++ b/charms/nova-k8s/lib/charms/keystone_k8s/v1/identity_service.py
@@ -26,7 +26,7 @@ Two events are also available to respond to:
 A basic example showing the usage of this relation follows:
 
 ```
-from charms.keystone_k8s.v0.identity_service import IdentityServiceRequires
+from charms.keystone_k8s.v1.identity_service import IdentityServiceRequires
 
 class IdentityServiceClientCharm(CharmBase):
     def __init__(self, *args):
@@ -85,7 +85,10 @@ from ops.framework import (
     EventSource,
     Object,
 )
-from ops.model import Relation
+from ops.model import (
+    Relation,
+    SecretNotFoundError,
+)
 
 logger = logging.getLogger(__name__)
 
@@ -93,11 +96,11 @@ logger = logging.getLogger(__name__)
 LIBID = "0fa7fe7236c14c6e9624acf232b9a3b0"
 
 # Increment this major API version when introducing breaking changes
-LIBAPI = 0
+LIBAPI = 1
 
 # Increment this PATCH version before using `charmcraft publish-lib` or reset
 # to 0 if you are raising the major API version
-LIBPATCH = 2
+LIBPATCH = 0
 
 
 logger = logging.getLogger(__name__)
@@ -273,10 +276,24 @@ class IdentityServiceRequires(Object):
         """Return the service_host."""
         return self.get_remote_app_data('service-host')
 
+    @property
+    def service_credentials(self) -> str:
+        """Return the service_credentials secret."""
+        return self.get_remote_app_data('service-credentials')
+
     @property
     def service_password(self) -> str:
         """Return the service_password."""
-        return self.get_remote_app_data('service-password')
+        credentials_id = self.get_remote_app_data('service-credentials')
+        if not credentials_id:
+            return None
+
+        try:
+            credentials = self.charm.model.get_secret(id=credentials_id)
+            return credentials.get_content().get("password")
+        except SecretNotFoundError:
+            logger.warning(f"Secret {credentials_id} not found")
+            return None
 
     @property
     def service_port(self) -> str:
@@ -301,7 +318,16 @@ class IdentityServiceRequires(Object):
     @property
     def service_user_name(self) -> str:
         """Return the service_user_name."""
-        return self.get_remote_app_data('service-user-name')
+        credentials_id = self.get_remote_app_data('service-credentials')
+        if not credentials_id:
+            return None
+
+        try:
+            credentials = self.charm.model.get_secret(id=credentials_id)
+            return credentials.get_content().get("username")
+        except SecretNotFoundError:
+            logger.warning(f"Secret {credentials_id} not found")
+            return None
 
     @property
     def service_user_id(self) -> str:
@@ -450,12 +476,12 @@ class IdentityServiceProvides(Object):
                                          admin_project: str,
                                          admin_user: str,
                                          service_domain: str,
-                                         service_password: str,
                                          service_project: str,
                                          service_user: str,
                                          internal_auth_url: str,
                                          admin_auth_url: str,
-                                         public_auth_url: str):
+                                         public_auth_url: str,
+                                         service_credentials: str):
         logging.debug("Setting identity_service connection information.")
         _identity_service_rel = None
         for relation in self.framework.model.relations[relation_name]:
@@ -485,9 +511,8 @@ class IdentityServiceProvides(Object):
         app_data["service-domain-id"] = service_domain.id
         app_data["service-project-name"] = service_project.name
         app_data["service-project-id"] = service_project.id
-        app_data["service-user-name"] = service_user.name
         app_data["service-user-id"] = service_user.id
-        app_data["service-password"] = service_password
         app_data["internal-auth-url"] = internal_auth_url
         app_data["admin-auth-url"] = admin_auth_url
         app_data["public-auth-url"] = public_auth_url
+        app_data["service-credentials"] = service_credentials
diff --git a/charms/nova-k8s/test-requirements.txt b/charms/nova-k8s/test-requirements.txt
index 8febe61e..0b8ca0cd 100644
--- a/charms/nova-k8s/test-requirements.txt
+++ b/charms/nova-k8s/test-requirements.txt
@@ -8,7 +8,7 @@ coverage
 mock
 flake8
 stestr
-git+https://github.com/openstack-charmers/zaza.git#egg=zaza
+git+https://github.com/openstack-charmers/zaza.git@libjuju-3.1#egg=zaza
 git+https://github.com/openstack-charmers/zaza-openstack-tests.git#egg=zaza.openstack
 git+https://opendev.org/openstack/tempest.git#egg=tempest
 ops