You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@airavata.apache.org by is...@apache.org on 2020/12/14 20:18:19 UTC

[airavata-custos] branch develop updated: update db dns, add python sdk KV methods

This is an automated email from the ASF dual-hosted git repository.

isjarana pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/airavata-custos.git


The following commit(s) were added to refs/heads/develop by this push:
     new 1d03d19  update db dns, add python sdk KV methods
     new f562752  Merge pull request #127 from isururanawaka/pythonSDK
1d03d19 is described below

commit 1d03d19ca627b2e24b69c51575057c30f3f61a07
Author: Isuru Ranawaka <ir...@gmail.com>
AuthorDate: Mon Dec 14 09:45:32 2020 -0500

    update db dns, add python sdk KV methods
---
 .../client/ResourceSecretManagementClient.java     |  40 ++
 .../clients/resource_secret_management_client.py   |  57 ++-
 .../server/core/ResourceSecretService_pb2.py       | 432 ++++++++++++++++-----
 .../server/core/ResourceSecretService_pb2_grpc.py  | 125 +++++-
 .../ResourceSecretManagementService_pb2.py         |  68 +++-
 .../ResourceSecretManagementService_pb2_grpc.py    | 132 +++++++
 .../src/main/resources/application.properties      |   2 +-
 .../src/main/resources/application.properties      |   2 +-
 .../src/main/resources/application.properties      |   2 +-
 .../src/main/resources/application.properties      |   2 +-
 .../src/main/resources/application.properties      |   2 +-
 .../src/main/resources/application.properties      |   2 +-
 .../src/main/resources/application.properties      |   2 +-
 .../src/main/resources/application.properties      |   2 +-
 .../custos/sharing/persistance/model/Sharing.java  |   1 +
 .../src/main/resources/application.properties      |   2 +-
 .../src/main/resources/application.properties      |   2 +-
 .../src/main/resources/application.properties      |   2 +-
 .../services/clients/keycloak/KeycloakClient.java  |   4 +-
 .../management/interceptors/InputValidator.java    |   2 +-
 20 files changed, 734 insertions(+), 149 deletions(-)

diff --git a/custos-client-sdks/custos-java-clients/resource-secret-management-client/src/main/java/org/apache/custos/resource/secret/management/client/ResourceSecretManagementClient.java b/custos-client-sdks/custos-java-clients/resource-secret-management-client/src/main/java/org/apache/custos/resource/secret/management/client/ResourceSecretManagementClient.java
index 359356b..2c29f34 100644
--- a/custos-client-sdks/custos-java-clients/resource-secret-management-client/src/main/java/org/apache/custos/resource/secret/management/client/ResourceSecretManagementClient.java
+++ b/custos-client-sdks/custos-java-clients/resource-secret-management-client/src/main/java/org/apache/custos/resource/secret/management/client/ResourceSecretManagementClient.java
@@ -156,6 +156,27 @@ public class ResourceSecretManagementClient {
 
     }
 
+    public AddResourceCredentialResponse addSSHCredential(String token, String passphrase, String privateKey,
+                                                          String publicKey, String clientId, String description, String ownerId) {
+        SecretMetadata metadata = SecretMetadata.newBuilder()
+                .setClientId(clientId)
+                .setDescription(description)
+                .setOwnerId(ownerId)
+                .setToken(token).
+                        build();
+
+        SSHCredential sshCredential = SSHCredential
+                .newBuilder()
+                .setMetadata(metadata)
+                .setPassphrase(passphrase)
+                .setPrivateKey(privateKey)
+                .setPublicKey(publicKey).build();
+
+        return blockingStub.addSSHCredential(sshCredential);
+
+    }
+
+
     /**
      * Save password credentials
      *
@@ -182,6 +203,25 @@ public class ResourceSecretManagementClient {
 
     }
 
+    public AddResourceCredentialResponse addPasswordCredential(String token, String clientId, String description, String ownerId, String password) {
+        SecretMetadata metadata = SecretMetadata.newBuilder()
+                .setClientId(clientId)
+                .setDescription(description)
+                .setOwnerId(ownerId)
+                .setToken(token)
+                .build();
+
+
+        PasswordCredential sshCredential = PasswordCredential
+                .newBuilder()
+                .setMetadata(metadata)
+                .setPassword(password)
+                .build();
+
+        return blockingStub.addPasswordCredential(sshCredential);
+
+    }
+
 
     /**
      * Provides SSHCredential of given token
diff --git a/custos-client-sdks/custos-python-sdk/custos/clients/resource_secret_management_client.py b/custos-client-sdks/custos-python-sdk/custos/clients/resource_secret_management_client.py
index cf63981..fafb447 100644
--- a/custos-client-sdks/custos-python-sdk/custos/clients/resource_secret_management_client.py
+++ b/custos-client-sdks/custos-python-sdk/custos/clients/resource_secret_management_client.py
@@ -23,8 +23,7 @@ from custos.transport.settings import CustosServerClientSettings
 from custos.server.integration.ResourceSecretManagementService_pb2_grpc import ResourceSecretManagementServiceStub
 from custos.server.core.IdentityService_pb2 import GetJWKSRequest
 from custos.server.core.ResourceSecretService_pb2 import GetSecretRequest, SecretMetadata, ResourceOwnerType, \
-    ResourceSource, \
-    ResourceType, SSHCredential, PasswordCredential, GetResourceCredentialByTokenRequest
+    ResourceSource, KVCredential, ResourceType, SSHCredential, PasswordCredential, GetResourceCredentialByTokenRequest
 from google.protobuf.json_format import MessageToJson
 from custos.clients.utils.certificate_fetching_rest_client import CertificateFetchingRestClient
 
@@ -140,3 +139,57 @@ class ResourceSecretManagementClient(object):
         except Exception:
             logger.exception("Error occurred while creating password key")
             raise
+
+    def set_KV_credential(self, token, user_token, client_id, key, value):
+        try:
+            token = "Bearer " + token
+            metadata = (('authorization', token),('user_token', user_token),)
+            secret_metadata = SecretMetadata(client_id=client_id)
+            request = KVCredential(key=key, value=value, metadata=secret_metadata)
+
+            msg = self.resource_sec_client.addKVCredential(request=request, metadata=metadata)
+            return MessageToJson(msg)
+        except Exception:
+            logger.exception("Error occurred while creating KV credential")
+            raise
+
+    def update_KV_credential(self, token,user_token, client_id, key, value):
+        try:
+            token = "Bearer " + token
+            metadata = (('authorization', token),('user_token', user_token),)
+            secret_metadata = SecretMetadata(client_id=client_id)
+            request = KVCredential(key=key, value=value, metadata=secret_metadata)
+
+            msg = self.resource_sec_client.updateKVCredential(request=request, metadata=metadata)
+            return MessageToJson(msg)
+        except Exception:
+            logger.exception("Error occurred while updating KV credential")
+            raise
+
+    def delete_KV_credential(self, token, user_token, client_id, key, value):
+        try:
+            token = "Bearer " + token
+            metadata = (('authorization', token),('user_token', user_token),)
+            secret_metadata = SecretMetadata(client_id=client_id)
+            request = KVCredential(key=key, value=value, metadata=secret_metadata)
+
+            msg = self.resource_sec_client.deleteKVCredential(request=request, metadata=metadata)
+            return MessageToJson(msg)
+
+        except Exception:
+            logger.exception("Error occurred while deleting KV credential")
+            raise
+
+    def get_KV_credential(self, token, user_token, client_id, key):
+        try:
+            token = "Bearer " + token
+            metadata = (('authorization', token),('user_token', user_token),)
+            secret_metadata = SecretMetadata(client_id=client_id)
+            request = KVCredential(key=key, metadata=secret_metadata)
+
+            msg = self.resource_sec_client.getKVCredential(request=request, metadata=metadata)
+            return MessageToJson(msg)
+
+        except Exception:
+            logger.exception("Error occurred while get KV credential")
+            raise
diff --git a/custos-client-sdks/custos-python-sdk/custos/server/core/ResourceSecretService_pb2.py b/custos-client-sdks/custos-python-sdk/custos/server/core/ResourceSecretService_pb2.py
index ab90d68..cc23980 100644
--- a/custos-client-sdks/custos-python-sdk/custos/server/core/ResourceSecretService_pb2.py
+++ b/custos-client-sdks/custos-python-sdk/custos/server/core/ResourceSecretService_pb2.py
@@ -20,7 +20,7 @@ DESCRIPTOR = _descriptor.FileDescriptor(
   syntax='proto3',
   serialized_options=b'P\001',
   create_key=_descriptor._internal_create_key,
-  serialized_pb=b'\n\x1bResourceSecretService.proto\x12)org.apache.custos.resource.secret.service\"\xda\x03\n\x0eSecretMetadata\x12P\n\nowner_type\x18\x01 \x01(\x0e\x32<.org.apache.custos.resource.secret.service.ResourceOwnerType\x12N\n\rresource_type\x18\x02 \x01(\x0e\x32\x37.org.apache.custos.resource.secret.service.ResourceType\x12I\n\x06source\x18\x03 \x01(\x0e\x32\x39.org.apache.custos.resource.secret.service.ResourceSource\x12\x0c\n\x04name\x18\x04 \x01(\t\x12\r\n\x05value\x18\x05  [...]
+  serialized_pb=b'\n\x1bResourceSecretService.proto\x12)org.apache.custos.resource.secret.service\"\xda\x03\n\x0eSecretMetadata\x12P\n\nowner_type\x18\x01 \x01(\x0e\x32<.org.apache.custos.resource.secret.service.ResourceOwnerType\x12N\n\rresource_type\x18\x02 \x01(\x0e\x32\x37.org.apache.custos.resource.secret.service.ResourceType\x12I\n\x06source\x18\x03 \x01(\x0e\x32\x39.org.apache.custos.resource.secret.service.ResourceSource\x12\x0c\n\x04name\x18\x04 \x01(\t\x12\r\n\x05value\x18\x05  [...]
 )
 
 _RESOURCEOWNERTYPE = _descriptor.EnumDescriptor(
@@ -48,8 +48,8 @@ _RESOURCEOWNERTYPE = _descriptor.EnumDescriptor(
   ],
   containing_type=None,
   serialized_options=None,
-  serialized_start=1735,
-  serialized_end=1795,
+  serialized_start=2283,
+  serialized_end=2343,
 )
 _sym_db.RegisterEnumDescriptor(_RESOURCEOWNERTYPE)
 
@@ -76,11 +76,26 @@ _RESOURCETYPE = _descriptor.EnumDescriptor(
       serialized_options=None,
       type=None,
       create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='VM', index=3, number=3,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='ACCOUNT', index=4, number=4,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='OTHER', index=5, number=5,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
   ],
   containing_type=None,
   serialized_options=None,
-  serialized_start=1797,
-  serialized_end=1886,
+  serialized_start=2345,
+  serialized_end=2466,
 )
 _sym_db.RegisterEnumDescriptor(_RESOURCETYPE)
 
@@ -115,8 +130,8 @@ _RESOURCESOURCE = _descriptor.EnumDescriptor(
   ],
   containing_type=None,
   serialized_options=None,
-  serialized_start=1888,
-  serialized_end=1956,
+  serialized_start=2468,
+  serialized_end=2536,
 )
 _sym_db.RegisterEnumDescriptor(_RESOURCESOURCE)
 
@@ -143,11 +158,21 @@ _RESOURCESECRETTYPE = _descriptor.EnumDescriptor(
       serialized_options=None,
       type=None,
       create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='RAW_DATA', index=3, number=3,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
+    _descriptor.EnumValueDescriptor(
+      name='KV', index=4, number=4,
+      serialized_options=None,
+      type=None,
+      create_key=_descriptor._internal_create_key),
   ],
   containing_type=None,
   serialized_options=None,
-  serialized_start=1958,
-  serialized_end=2023,
+  serialized_start=2538,
+  serialized_end=2625,
 )
 _sym_db.RegisterEnumDescriptor(_RESOURCESECRETTYPE)
 
@@ -158,6 +183,9 @@ TENANT = 2
 SERVER_CERTIFICATE = 0
 JWT_SIGNING_CERTIFICATE = 1
 VAULT_CREDENTIAL = 2
+VM = 3
+ACCOUNT = 4
+OTHER = 5
 KUBE = 0
 LOCAL = 1
 EXTERNAL = 2
@@ -165,6 +193,8 @@ LETSENCRYPT = 3
 SSH = 0
 PASSWORD = 1
 X509_CERTIFICATE = 2
+RAW_DATA = 3
+KV = 4
 
 
 
@@ -277,113 +307,81 @@ _SECRETMETADATA = _descriptor.Descriptor(
 )
 
 
-_GETSECRETREQUEST = _descriptor.Descriptor(
-  name='GetSecretRequest',
-  full_name='org.apache.custos.resource.secret.service.GetSecretRequest',
+_CERTIFICATECREDENTIAL = _descriptor.Descriptor(
+  name='CertificateCredential',
+  full_name='org.apache.custos.resource.secret.service.CertificateCredential',
   filename=None,
   file=DESCRIPTOR,
   containing_type=None,
   create_key=_descriptor._internal_create_key,
   fields=[
     _descriptor.FieldDescriptor(
-      name='metadata', full_name='org.apache.custos.resource.secret.service.GetSecretRequest.metadata', index=0,
+      name='metadata', full_name='org.apache.custos.resource.secret.service.CertificateCredential.metadata', index=0,
       number=1, type=11, cpp_type=10, label=1,
       has_default_value=False, default_value=None,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='tenantId', full_name='org.apache.custos.resource.secret.service.GetSecretRequest.tenantId', index=1,
-      number=2, type=3, cpp_type=2, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-    _descriptor.FieldDescriptor(
-      name='clientId', full_name='org.apache.custos.resource.secret.service.GetSecretRequest.clientId', index=2,
+      name='x509_cert', full_name='org.apache.custos.resource.secret.service.CertificateCredential.x509_cert', index=1,
       number=3, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='clientSec', full_name='org.apache.custos.resource.secret.service.GetSecretRequest.clientSec', index=3,
+      name='not_after', full_name='org.apache.custos.resource.secret.service.CertificateCredential.not_after', index=2,
       number=4, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='accessToken', full_name='org.apache.custos.resource.secret.service.GetSecretRequest.accessToken', index=4,
+      name='private_key', full_name='org.apache.custos.resource.secret.service.CertificateCredential.private_key', index=3,
       number=5, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto3',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=552,
-  serialized_end=723,
-)
-
-
-_CERTIFICATECREDENTIAL = _descriptor.Descriptor(
-  name='CertificateCredential',
-  full_name='org.apache.custos.resource.secret.service.CertificateCredential',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  create_key=_descriptor._internal_create_key,
-  fields=[
     _descriptor.FieldDescriptor(
-      name='metadata', full_name='org.apache.custos.resource.secret.service.CertificateCredential.metadata', index=0,
-      number=1, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
+      name='life_time', full_name='org.apache.custos.resource.secret.service.CertificateCredential.life_time', index=4,
+      number=6, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='x509_cert', full_name='org.apache.custos.resource.secret.service.CertificateCredential.x509_cert', index=1,
-      number=3, type=9, cpp_type=9, label=1,
+      name='not_before', full_name='org.apache.custos.resource.secret.service.CertificateCredential.not_before', index=5,
+      number=7, type=9, cpp_type=9, label=1,
       has_default_value=False, default_value=b"".decode('utf-8'),
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='not_after', full_name='org.apache.custos.resource.secret.service.CertificateCredential.not_after', index=2,
-      number=4, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
+      name='useShamirsSecretSharingWithEncryption', full_name='org.apache.custos.resource.secret.service.CertificateCredential.useShamirsSecretSharingWithEncryption', index=6,
+      number=8, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='private_key', full_name='org.apache.custos.resource.secret.service.CertificateCredential.private_key', index=3,
-      number=5, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
+      name='numOfShares', full_name='org.apache.custos.resource.secret.service.CertificateCredential.numOfShares', index=7,
+      number=9, type=5, cpp_type=1, label=1,
+      has_default_value=False, default_value=0,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='life_time', full_name='org.apache.custos.resource.secret.service.CertificateCredential.life_time', index=4,
-      number=6, type=3, cpp_type=2, label=1,
+      name='threshold', full_name='org.apache.custos.resource.secret.service.CertificateCredential.threshold', index=8,
+      number=10, type=5, cpp_type=1, label=1,
       has_default_value=False, default_value=0,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='not_before', full_name='org.apache.custos.resource.secret.service.CertificateCredential.not_before', index=5,
-      number=7, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
+      name='private_key_shares', full_name='org.apache.custos.resource.secret.service.CertificateCredential.private_key_shares', index=9,
+      number=11, type=12, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
@@ -399,8 +397,8 @@ _CERTIFICATECREDENTIAL = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=726,
-  serialized_end=924,
+  serialized_start=552,
+  serialized_end=865,
 )
 
 
@@ -426,6 +424,34 @@ _PASSWORDCREDENTIAL = _descriptor.Descriptor(
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='useShamirsSecretSharingWithEncryption', full_name='org.apache.custos.resource.secret.service.PasswordCredential.useShamirsSecretSharingWithEncryption', index=2,
+      number=4, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='numOfShares', full_name='org.apache.custos.resource.secret.service.PasswordCredential.numOfShares', index=3,
+      number=5, type=5, cpp_type=1, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='threshold', full_name='org.apache.custos.resource.secret.service.PasswordCredential.threshold', index=4,
+      number=6, type=5, cpp_type=1, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='secret_shares', full_name='org.apache.custos.resource.secret.service.PasswordCredential.secret_shares', index=5,
+      number=7, type=12, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
   ],
   extensions=[
   ],
@@ -438,8 +464,8 @@ _PASSWORDCREDENTIAL = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=926,
-  serialized_end=1041,
+  serialized_start=868,
+  serialized_end=1093,
 )
 
 
@@ -479,6 +505,34 @@ _SSHCREDENTIAL = _descriptor.Descriptor(
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='useShamirsSecretSharingWithEncryption', full_name='org.apache.custos.resource.secret.service.SSHCredential.useShamirsSecretSharingWithEncryption', index=4,
+      number=6, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='numOfShares', full_name='org.apache.custos.resource.secret.service.SSHCredential.numOfShares', index=5,
+      number=7, type=5, cpp_type=1, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='threshold', full_name='org.apache.custos.resource.secret.service.SSHCredential.threshold', index=6,
+      number=8, type=5, cpp_type=1, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='private_key_shares', full_name='org.apache.custos.resource.secret.service.SSHCredential.private_key_shares', index=7,
+      number=9, type=12, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
   ],
   extensions=[
   ],
@@ -491,8 +545,8 @@ _SSHCREDENTIAL = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=1044,
-  serialized_end=1197,
+  serialized_start=1096,
+  serialized_end=1364,
 )
 
 
@@ -532,6 +586,27 @@ _GETRESOURCECREDENTIALBYTOKENREQUEST = _descriptor.Descriptor(
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='useShamirsSecretSharingWithEncryption', full_name='org.apache.custos.resource.secret.service.GetResourceCredentialByTokenRequest.useShamirsSecretSharingWithEncryption', index=4,
+      number=5, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='numOfShares', full_name='org.apache.custos.resource.secret.service.GetResourceCredentialByTokenRequest.numOfShares', index=5,
+      number=6, type=5, cpp_type=1, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='threshold', full_name='org.apache.custos.resource.secret.service.GetResourceCredentialByTokenRequest.threshold', index=6,
+      number=7, type=5, cpp_type=1, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
   ],
   extensions=[
   ],
@@ -544,8 +619,8 @@ _GETRESOURCECREDENTIALBYTOKENREQUEST = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=1199,
-  serialized_end=1310,
+  serialized_start=1367,
+  serialized_end=1565,
 )
 
 
@@ -611,8 +686,8 @@ _GETRESOURCECREDENTIALSUMMARIESREQUEST = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=1313,
-  serialized_end=1524,
+  serialized_start=1568,
+  serialized_end=1779,
 )
 
 
@@ -643,8 +718,8 @@ _RESOURCECREDENTIALSUMMARIES = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=1526,
-  serialized_end=1632,
+  serialized_start=1781,
+  serialized_end=1887,
 )
 
 
@@ -675,8 +750,8 @@ _ADDRESOURCECREDENTIALRESPONSE = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=1634,
-  serialized_end=1680,
+  serialized_start=1889,
+  serialized_end=1935,
 )
 
 
@@ -707,22 +782,128 @@ _RESOURCECREDENTIALOPERATIONSTATUS = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=1682,
-  serialized_end=1733,
+  serialized_start=1937,
+  serialized_end=1988,
+)
+
+
+_KVCREDENTIAL = _descriptor.Descriptor(
+  name='KVCredential',
+  full_name='org.apache.custos.resource.secret.service.KVCredential',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='key', full_name='org.apache.custos.resource.secret.service.KVCredential.key', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='value', full_name='org.apache.custos.resource.secret.service.KVCredential.value', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='metadata', full_name='org.apache.custos.resource.secret.service.KVCredential.metadata', index=2,
+      number=3, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='token', full_name='org.apache.custos.resource.secret.service.KVCredential.token', index=3,
+      number=4, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=1991,
+  serialized_end=2125,
+)
+
+
+_GETSECRETREQUEST = _descriptor.Descriptor(
+  name='GetSecretRequest',
+  full_name='org.apache.custos.resource.secret.service.GetSecretRequest',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='metadata', full_name='org.apache.custos.resource.secret.service.GetSecretRequest.metadata', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='client_id', full_name='org.apache.custos.resource.secret.service.GetSecretRequest.client_id', index=1,
+      number=2, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='tenant_id', full_name='org.apache.custos.resource.secret.service.GetSecretRequest.tenant_id', index=2,
+      number=3, type=3, cpp_type=2, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='client_sec', full_name='org.apache.custos.resource.secret.service.GetSecretRequest.client_sec', index=3,
+      number=4, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=b"".decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=2128,
+  serialized_end=2281,
 )
 
 _SECRETMETADATA.fields_by_name['owner_type'].enum_type = _RESOURCEOWNERTYPE
 _SECRETMETADATA.fields_by_name['resource_type'].enum_type = _RESOURCETYPE
 _SECRETMETADATA.fields_by_name['source'].enum_type = _RESOURCESOURCE
 _SECRETMETADATA.fields_by_name['type'].enum_type = _RESOURCESECRETTYPE
-_GETSECRETREQUEST.fields_by_name['metadata'].message_type = _SECRETMETADATA
 _CERTIFICATECREDENTIAL.fields_by_name['metadata'].message_type = _SECRETMETADATA
 _PASSWORDCREDENTIAL.fields_by_name['metadata'].message_type = _SECRETMETADATA
 _SSHCREDENTIAL.fields_by_name['metadata'].message_type = _SECRETMETADATA
 _GETRESOURCECREDENTIALSUMMARIESREQUEST.fields_by_name['type'].enum_type = _RESOURCETYPE
 _RESOURCECREDENTIALSUMMARIES.fields_by_name['metadata'].message_type = _SECRETMETADATA
+_KVCREDENTIAL.fields_by_name['metadata'].message_type = _SECRETMETADATA
+_GETSECRETREQUEST.fields_by_name['metadata'].message_type = _SECRETMETADATA
 DESCRIPTOR.message_types_by_name['SecretMetadata'] = _SECRETMETADATA
-DESCRIPTOR.message_types_by_name['GetSecretRequest'] = _GETSECRETREQUEST
 DESCRIPTOR.message_types_by_name['CertificateCredential'] = _CERTIFICATECREDENTIAL
 DESCRIPTOR.message_types_by_name['PasswordCredential'] = _PASSWORDCREDENTIAL
 DESCRIPTOR.message_types_by_name['SSHCredential'] = _SSHCREDENTIAL
@@ -731,6 +912,8 @@ DESCRIPTOR.message_types_by_name['GetResourceCredentialSummariesRequest'] = _GET
 DESCRIPTOR.message_types_by_name['ResourceCredentialSummaries'] = _RESOURCECREDENTIALSUMMARIES
 DESCRIPTOR.message_types_by_name['AddResourceCredentialResponse'] = _ADDRESOURCECREDENTIALRESPONSE
 DESCRIPTOR.message_types_by_name['ResourceCredentialOperationStatus'] = _RESOURCECREDENTIALOPERATIONSTATUS
+DESCRIPTOR.message_types_by_name['KVCredential'] = _KVCREDENTIAL
+DESCRIPTOR.message_types_by_name['GetSecretRequest'] = _GETSECRETREQUEST
 DESCRIPTOR.enum_types_by_name['ResourceOwnerType'] = _RESOURCEOWNERTYPE
 DESCRIPTOR.enum_types_by_name['ResourceType'] = _RESOURCETYPE
 DESCRIPTOR.enum_types_by_name['ResourceSource'] = _RESOURCESOURCE
@@ -744,13 +927,6 @@ SecretMetadata = _reflection.GeneratedProtocolMessageType('SecretMetadata', (_me
   })
 _sym_db.RegisterMessage(SecretMetadata)
 
-GetSecretRequest = _reflection.GeneratedProtocolMessageType('GetSecretRequest', (_message.Message,), {
-  'DESCRIPTOR' : _GETSECRETREQUEST,
-  '__module__' : 'ResourceSecretService_pb2'
-  # @@protoc_insertion_point(class_scope:org.apache.custos.resource.secret.service.GetSecretRequest)
-  })
-_sym_db.RegisterMessage(GetSecretRequest)
-
 CertificateCredential = _reflection.GeneratedProtocolMessageType('CertificateCredential', (_message.Message,), {
   'DESCRIPTOR' : _CERTIFICATECREDENTIAL,
   '__module__' : 'ResourceSecretService_pb2'
@@ -807,6 +983,20 @@ ResourceCredentialOperationStatus = _reflection.GeneratedProtocolMessageType('Re
   })
 _sym_db.RegisterMessage(ResourceCredentialOperationStatus)
 
+KVCredential = _reflection.GeneratedProtocolMessageType('KVCredential', (_message.Message,), {
+  'DESCRIPTOR' : _KVCREDENTIAL,
+  '__module__' : 'ResourceSecretService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.resource.secret.service.KVCredential)
+  })
+_sym_db.RegisterMessage(KVCredential)
+
+GetSecretRequest = _reflection.GeneratedProtocolMessageType('GetSecretRequest', (_message.Message,), {
+  'DESCRIPTOR' : _GETSECRETREQUEST,
+  '__module__' : 'ResourceSecretService_pb2'
+  # @@protoc_insertion_point(class_scope:org.apache.custos.resource.secret.service.GetSecretRequest)
+  })
+_sym_db.RegisterMessage(GetSecretRequest)
+
 
 DESCRIPTOR._options = None
 
@@ -817,23 +1007,53 @@ _RESOURCESECRETSERVICE = _descriptor.ServiceDescriptor(
   index=0,
   serialized_options=None,
   create_key=_descriptor._internal_create_key,
-  serialized_start=2026,
-  serialized_end=4089,
+  serialized_start=2628,
+  serialized_end=5162,
   methods=[
   _descriptor.MethodDescriptor(
-    name='getSecret',
-    full_name='org.apache.custos.resource.secret.service.ResourceSecretService.getSecret',
+    name='getKVCredential',
+    full_name='org.apache.custos.resource.secret.service.ResourceSecretService.getKVCredential',
     index=0,
     containing_service=None,
-    input_type=_GETSECRETREQUEST,
-    output_type=_SECRETMETADATA,
+    input_type=_KVCREDENTIAL,
+    output_type=_KVCREDENTIAL,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='setKVCredential',
+    full_name='org.apache.custos.resource.secret.service.ResourceSecretService.setKVCredential',
+    index=1,
+    containing_service=None,
+    input_type=_KVCREDENTIAL,
+    output_type=_RESOURCECREDENTIALOPERATIONSTATUS,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='updateKVCredential',
+    full_name='org.apache.custos.resource.secret.service.ResourceSecretService.updateKVCredential',
+    index=2,
+    containing_service=None,
+    input_type=_KVCREDENTIAL,
+    output_type=_RESOURCECREDENTIALOPERATIONSTATUS,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='deleteKVCredential',
+    full_name='org.apache.custos.resource.secret.service.ResourceSecretService.deleteKVCredential',
+    index=3,
+    containing_service=None,
+    input_type=_KVCREDENTIAL,
+    output_type=_RESOURCECREDENTIALOPERATIONSTATUS,
     serialized_options=None,
     create_key=_descriptor._internal_create_key,
   ),
   _descriptor.MethodDescriptor(
     name='getResourceCredentialSummary',
     full_name='org.apache.custos.resource.secret.service.ResourceSecretService.getResourceCredentialSummary',
-    index=1,
+    index=4,
     containing_service=None,
     input_type=_GETRESOURCECREDENTIALBYTOKENREQUEST,
     output_type=_SECRETMETADATA,
@@ -843,7 +1063,7 @@ _RESOURCESECRETSERVICE = _descriptor.ServiceDescriptor(
   _descriptor.MethodDescriptor(
     name='getAllResourceCredentialSummaries',
     full_name='org.apache.custos.resource.secret.service.ResourceSecretService.getAllResourceCredentialSummaries',
-    index=2,
+    index=5,
     containing_service=None,
     input_type=_GETRESOURCECREDENTIALSUMMARIESREQUEST,
     output_type=_RESOURCECREDENTIALSUMMARIES,
@@ -853,7 +1073,7 @@ _RESOURCESECRETSERVICE = _descriptor.ServiceDescriptor(
   _descriptor.MethodDescriptor(
     name='addSSHCredential',
     full_name='org.apache.custos.resource.secret.service.ResourceSecretService.addSSHCredential',
-    index=3,
+    index=6,
     containing_service=None,
     input_type=_SSHCREDENTIAL,
     output_type=_ADDRESOURCECREDENTIALRESPONSE,
@@ -863,7 +1083,7 @@ _RESOURCESECRETSERVICE = _descriptor.ServiceDescriptor(
   _descriptor.MethodDescriptor(
     name='addPasswordCredential',
     full_name='org.apache.custos.resource.secret.service.ResourceSecretService.addPasswordCredential',
-    index=4,
+    index=7,
     containing_service=None,
     input_type=_PASSWORDCREDENTIAL,
     output_type=_ADDRESOURCECREDENTIALRESPONSE,
@@ -873,7 +1093,7 @@ _RESOURCESECRETSERVICE = _descriptor.ServiceDescriptor(
   _descriptor.MethodDescriptor(
     name='addCertificateCredential',
     full_name='org.apache.custos.resource.secret.service.ResourceSecretService.addCertificateCredential',
-    index=5,
+    index=8,
     containing_service=None,
     input_type=_CERTIFICATECREDENTIAL,
     output_type=_ADDRESOURCECREDENTIALRESPONSE,
@@ -883,7 +1103,7 @@ _RESOURCESECRETSERVICE = _descriptor.ServiceDescriptor(
   _descriptor.MethodDescriptor(
     name='getSSHCredential',
     full_name='org.apache.custos.resource.secret.service.ResourceSecretService.getSSHCredential',
-    index=6,
+    index=9,
     containing_service=None,
     input_type=_GETRESOURCECREDENTIALBYTOKENREQUEST,
     output_type=_SSHCREDENTIAL,
@@ -893,7 +1113,7 @@ _RESOURCESECRETSERVICE = _descriptor.ServiceDescriptor(
   _descriptor.MethodDescriptor(
     name='getPasswordCredential',
     full_name='org.apache.custos.resource.secret.service.ResourceSecretService.getPasswordCredential',
-    index=7,
+    index=10,
     containing_service=None,
     input_type=_GETRESOURCECREDENTIALBYTOKENREQUEST,
     output_type=_PASSWORDCREDENTIAL,
@@ -903,7 +1123,7 @@ _RESOURCESECRETSERVICE = _descriptor.ServiceDescriptor(
   _descriptor.MethodDescriptor(
     name='getCertificateCredential',
     full_name='org.apache.custos.resource.secret.service.ResourceSecretService.getCertificateCredential',
-    index=8,
+    index=11,
     containing_service=None,
     input_type=_GETRESOURCECREDENTIALBYTOKENREQUEST,
     output_type=_CERTIFICATECREDENTIAL,
@@ -913,7 +1133,7 @@ _RESOURCESECRETSERVICE = _descriptor.ServiceDescriptor(
   _descriptor.MethodDescriptor(
     name='deleteSSHCredential',
     full_name='org.apache.custos.resource.secret.service.ResourceSecretService.deleteSSHCredential',
-    index=9,
+    index=12,
     containing_service=None,
     input_type=_GETRESOURCECREDENTIALBYTOKENREQUEST,
     output_type=_RESOURCECREDENTIALOPERATIONSTATUS,
@@ -923,7 +1143,7 @@ _RESOURCESECRETSERVICE = _descriptor.ServiceDescriptor(
   _descriptor.MethodDescriptor(
     name='deletePWDCredential',
     full_name='org.apache.custos.resource.secret.service.ResourceSecretService.deletePWDCredential',
-    index=10,
+    index=13,
     containing_service=None,
     input_type=_GETRESOURCECREDENTIALBYTOKENREQUEST,
     output_type=_RESOURCECREDENTIALOPERATIONSTATUS,
@@ -933,7 +1153,7 @@ _RESOURCESECRETSERVICE = _descriptor.ServiceDescriptor(
   _descriptor.MethodDescriptor(
     name='deleteCertificateCredential',
     full_name='org.apache.custos.resource.secret.service.ResourceSecretService.deleteCertificateCredential',
-    index=11,
+    index=14,
     containing_service=None,
     input_type=_GETRESOURCECREDENTIALBYTOKENREQUEST,
     output_type=_RESOURCECREDENTIALOPERATIONSTATUS,
diff --git a/custos-client-sdks/custos-python-sdk/custos/server/core/ResourceSecretService_pb2_grpc.py b/custos-client-sdks/custos-python-sdk/custos/server/core/ResourceSecretService_pb2_grpc.py
index cb8bef3..996a5fd 100644
--- a/custos-client-sdks/custos-python-sdk/custos/server/core/ResourceSecretService_pb2_grpc.py
+++ b/custos-client-sdks/custos-python-sdk/custos/server/core/ResourceSecretService_pb2_grpc.py
@@ -14,10 +14,25 @@ class ResourceSecretServiceStub(object):
         Args:
             channel: A grpc.Channel.
         """
-        self.getSecret = channel.unary_unary(
-                '/org.apache.custos.resource.secret.service.ResourceSecretService/getSecret',
-                request_serializer=ResourceSecretService__pb2.GetSecretRequest.SerializeToString,
-                response_deserializer=ResourceSecretService__pb2.SecretMetadata.FromString,
+        self.getKVCredential = channel.unary_unary(
+                '/org.apache.custos.resource.secret.service.ResourceSecretService/getKVCredential',
+                request_serializer=ResourceSecretService__pb2.KVCredential.SerializeToString,
+                response_deserializer=ResourceSecretService__pb2.KVCredential.FromString,
+                )
+        self.setKVCredential = channel.unary_unary(
+                '/org.apache.custos.resource.secret.service.ResourceSecretService/setKVCredential',
+                request_serializer=ResourceSecretService__pb2.KVCredential.SerializeToString,
+                response_deserializer=ResourceSecretService__pb2.ResourceCredentialOperationStatus.FromString,
+                )
+        self.updateKVCredential = channel.unary_unary(
+                '/org.apache.custos.resource.secret.service.ResourceSecretService/updateKVCredential',
+                request_serializer=ResourceSecretService__pb2.KVCredential.SerializeToString,
+                response_deserializer=ResourceSecretService__pb2.ResourceCredentialOperationStatus.FromString,
+                )
+        self.deleteKVCredential = channel.unary_unary(
+                '/org.apache.custos.resource.secret.service.ResourceSecretService/deleteKVCredential',
+                request_serializer=ResourceSecretService__pb2.KVCredential.SerializeToString,
+                response_deserializer=ResourceSecretService__pb2.ResourceCredentialOperationStatus.FromString,
                 )
         self.getResourceCredentialSummary = channel.unary_unary(
                 '/org.apache.custos.resource.secret.service.ResourceSecretService/getResourceCredentialSummary',
@@ -79,7 +94,25 @@ class ResourceSecretServiceStub(object):
 class ResourceSecretServiceServicer(object):
     """Missing associated documentation comment in .proto file."""
 
-    def getSecret(self, request, context):
+    def getKVCredential(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def setKVCredential(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def updateKVCredential(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def deleteKVCredential(self, request, context):
         """Missing associated documentation comment in .proto file."""
         context.set_code(grpc.StatusCode.UNIMPLEMENTED)
         context.set_details('Method not implemented!')
@@ -154,10 +187,25 @@ class ResourceSecretServiceServicer(object):
 
 def add_ResourceSecretServiceServicer_to_server(servicer, server):
     rpc_method_handlers = {
-            'getSecret': grpc.unary_unary_rpc_method_handler(
-                    servicer.getSecret,
-                    request_deserializer=ResourceSecretService__pb2.GetSecretRequest.FromString,
-                    response_serializer=ResourceSecretService__pb2.SecretMetadata.SerializeToString,
+            'getKVCredential': grpc.unary_unary_rpc_method_handler(
+                    servicer.getKVCredential,
+                    request_deserializer=ResourceSecretService__pb2.KVCredential.FromString,
+                    response_serializer=ResourceSecretService__pb2.KVCredential.SerializeToString,
+            ),
+            'setKVCredential': grpc.unary_unary_rpc_method_handler(
+                    servicer.setKVCredential,
+                    request_deserializer=ResourceSecretService__pb2.KVCredential.FromString,
+                    response_serializer=ResourceSecretService__pb2.ResourceCredentialOperationStatus.SerializeToString,
+            ),
+            'updateKVCredential': grpc.unary_unary_rpc_method_handler(
+                    servicer.updateKVCredential,
+                    request_deserializer=ResourceSecretService__pb2.KVCredential.FromString,
+                    response_serializer=ResourceSecretService__pb2.ResourceCredentialOperationStatus.SerializeToString,
+            ),
+            'deleteKVCredential': grpc.unary_unary_rpc_method_handler(
+                    servicer.deleteKVCredential,
+                    request_deserializer=ResourceSecretService__pb2.KVCredential.FromString,
+                    response_serializer=ResourceSecretService__pb2.ResourceCredentialOperationStatus.SerializeToString,
             ),
             'getResourceCredentialSummary': grpc.unary_unary_rpc_method_handler(
                     servicer.getResourceCredentialSummary,
@@ -225,7 +273,7 @@ class ResourceSecretService(object):
     """Missing associated documentation comment in .proto file."""
 
     @staticmethod
-    def getSecret(request,
+    def getKVCredential(request,
             target,
             options=(),
             channel_credentials=None,
@@ -235,9 +283,60 @@ class ResourceSecretService(object):
             wait_for_ready=None,
             timeout=None,
             metadata=None):
-        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.resource.secret.service.ResourceSecretService/getSecret',
-            ResourceSecretService__pb2.GetSecretRequest.SerializeToString,
-            ResourceSecretService__pb2.SecretMetadata.FromString,
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.resource.secret.service.ResourceSecretService/getKVCredential',
+            ResourceSecretService__pb2.KVCredential.SerializeToString,
+            ResourceSecretService__pb2.KVCredential.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def setKVCredential(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.resource.secret.service.ResourceSecretService/setKVCredential',
+            ResourceSecretService__pb2.KVCredential.SerializeToString,
+            ResourceSecretService__pb2.ResourceCredentialOperationStatus.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def updateKVCredential(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.resource.secret.service.ResourceSecretService/updateKVCredential',
+            ResourceSecretService__pb2.KVCredential.SerializeToString,
+            ResourceSecretService__pb2.ResourceCredentialOperationStatus.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def deleteKVCredential(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.resource.secret.service.ResourceSecretService/deleteKVCredential',
+            ResourceSecretService__pb2.KVCredential.SerializeToString,
+            ResourceSecretService__pb2.ResourceCredentialOperationStatus.FromString,
             options, channel_credentials,
             insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
 
diff --git a/custos-client-sdks/custos-python-sdk/custos/server/integration/ResourceSecretManagementService_pb2.py b/custos-client-sdks/custos-python-sdk/custos/server/integration/ResourceSecretManagementService_pb2.py
index d2b0f2f..8767a4b 100644
--- a/custos-client-sdks/custos-python-sdk/custos/server/integration/ResourceSecretManagementService_pb2.py
+++ b/custos-client-sdks/custos-python-sdk/custos/server/integration/ResourceSecretManagementService_pb2.py
@@ -24,7 +24,7 @@ DESCRIPTOR = _descriptor.FileDescriptor(
   syntax='proto3',
   serialized_options=b'P\001',
   create_key=_descriptor._internal_create_key,
-  serialized_pb=b'\n%ResourceSecretManagementService.proto\x12\x34org.apache.custos.resource.secret.management.service\x1a\x1cgoogle/api/annotations.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a\x1cgoogle/protobuf/struct.proto\x1a\x1bResourceSecretService.proto\x1a\x15IdentityService.proto2\xf4\x16\n\x1fResourceSecretManagementService\x12\xb6\x01\n\tgetSecret\x12;.org.apache.custos.resource.secret.service.GetSecretRequest\x1a\x39.org.apache.custos.resource.secret.service.SecretMetadata\"1 [...]
+  serialized_pb=b'\n%ResourceSecretManagementService.proto\x12\x34org.apache.custos.resource.secret.management.service\x1a\x1cgoogle/api/annotations.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a\x1cgoogle/protobuf/struct.proto\x1a\x1bResourceSecretService.proto\x1a\x15IdentityService.proto2\xa9\x1d\n\x1fResourceSecretManagementService\x12\xb6\x01\n\tgetSecret\x12;.org.apache.custos.resource.secret.service.GetSecretRequest\x1a\x39.org.apache.custos.resource.secret.service.SecretMetadata\"1 [...]
   ,
   dependencies=[google_dot_api_dot_annotations__pb2.DESCRIPTOR,google_dot_protobuf_dot_empty__pb2.DESCRIPTOR,google_dot_protobuf_dot_struct__pb2.DESCRIPTOR,ResourceSecretService__pb2.DESCRIPTOR,IdentityService__pb2.DESCRIPTOR,])
 
@@ -43,7 +43,7 @@ _RESOURCESECRETMANAGEMENTSERVICE = _descriptor.ServiceDescriptor(
   serialized_options=None,
   create_key=_descriptor._internal_create_key,
   serialized_start=237,
-  serialized_end=3169,
+  serialized_end=3990,
   methods=[
   _descriptor.MethodDescriptor(
     name='getSecret',
@@ -56,9 +56,49 @@ _RESOURCESECRETMANAGEMENTSERVICE = _descriptor.ServiceDescriptor(
     create_key=_descriptor._internal_create_key,
   ),
   _descriptor.MethodDescriptor(
+    name='getKVCredential',
+    full_name='org.apache.custos.resource.secret.management.service.ResourceSecretManagementService.getKVCredential',
+    index=1,
+    containing_service=None,
+    input_type=ResourceSecretService__pb2._KVCREDENTIAL,
+    output_type=ResourceSecretService__pb2._KVCREDENTIAL,
+    serialized_options=b'\202\323\344\223\002.\022,/resource-secret-management/v1.0.0/secret/kv',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='addKVCredential',
+    full_name='org.apache.custos.resource.secret.management.service.ResourceSecretManagementService.addKVCredential',
+    index=2,
+    containing_service=None,
+    input_type=ResourceSecretService__pb2._KVCREDENTIAL,
+    output_type=ResourceSecretService__pb2._RESOURCECREDENTIALOPERATIONSTATUS,
+    serialized_options=b'\202\323\344\223\002.\",/resource-secret-management/v1.0.0/secret/kv',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='updateKVCredential',
+    full_name='org.apache.custos.resource.secret.management.service.ResourceSecretManagementService.updateKVCredential',
+    index=3,
+    containing_service=None,
+    input_type=ResourceSecretService__pb2._KVCREDENTIAL,
+    output_type=ResourceSecretService__pb2._RESOURCECREDENTIALOPERATIONSTATUS,
+    serialized_options=b'\202\323\344\223\002.\032,/resource-secret-management/v1.0.0/secret/kv',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
+    name='deleteKVCredential',
+    full_name='org.apache.custos.resource.secret.management.service.ResourceSecretManagementService.deleteKVCredential',
+    index=4,
+    containing_service=None,
+    input_type=ResourceSecretService__pb2._KVCREDENTIAL,
+    output_type=ResourceSecretService__pb2._RESOURCECREDENTIALOPERATIONSTATUS,
+    serialized_options=b'\202\323\344\223\002.*,/resource-secret-management/v1.0.0/secret/kv',
+    create_key=_descriptor._internal_create_key,
+  ),
+  _descriptor.MethodDescriptor(
     name='getJWKS',
     full_name='org.apache.custos.resource.secret.management.service.ResourceSecretManagementService.getJWKS',
-    index=1,
+    index=5,
     containing_service=None,
     input_type=IdentityService__pb2._GETJWKSREQUEST,
     output_type=google_dot_protobuf_dot_struct__pb2._STRUCT,
@@ -68,7 +108,7 @@ _RESOURCESECRETMANAGEMENTSERVICE = _descriptor.ServiceDescriptor(
   _descriptor.MethodDescriptor(
     name='getResourceCredentialSummary',
     full_name='org.apache.custos.resource.secret.management.service.ResourceSecretManagementService.getResourceCredentialSummary',
-    index=2,
+    index=6,
     containing_service=None,
     input_type=ResourceSecretService__pb2._GETRESOURCECREDENTIALBYTOKENREQUEST,
     output_type=ResourceSecretService__pb2._SECRETMETADATA,
@@ -78,7 +118,7 @@ _RESOURCESECRETMANAGEMENTSERVICE = _descriptor.ServiceDescriptor(
   _descriptor.MethodDescriptor(
     name='getAllResourceCredentialSummaries',
     full_name='org.apache.custos.resource.secret.management.service.ResourceSecretManagementService.getAllResourceCredentialSummaries',
-    index=3,
+    index=7,
     containing_service=None,
     input_type=ResourceSecretService__pb2._GETRESOURCECREDENTIALSUMMARIESREQUEST,
     output_type=ResourceSecretService__pb2._RESOURCECREDENTIALSUMMARIES,
@@ -88,7 +128,7 @@ _RESOURCESECRETMANAGEMENTSERVICE = _descriptor.ServiceDescriptor(
   _descriptor.MethodDescriptor(
     name='addSSHCredential',
     full_name='org.apache.custos.resource.secret.management.service.ResourceSecretManagementService.addSSHCredential',
-    index=4,
+    index=8,
     containing_service=None,
     input_type=ResourceSecretService__pb2._SSHCREDENTIAL,
     output_type=ResourceSecretService__pb2._ADDRESOURCECREDENTIALRESPONSE,
@@ -98,7 +138,7 @@ _RESOURCESECRETMANAGEMENTSERVICE = _descriptor.ServiceDescriptor(
   _descriptor.MethodDescriptor(
     name='addPasswordCredential',
     full_name='org.apache.custos.resource.secret.management.service.ResourceSecretManagementService.addPasswordCredential',
-    index=5,
+    index=9,
     containing_service=None,
     input_type=ResourceSecretService__pb2._PASSWORDCREDENTIAL,
     output_type=ResourceSecretService__pb2._ADDRESOURCECREDENTIALRESPONSE,
@@ -108,7 +148,7 @@ _RESOURCESECRETMANAGEMENTSERVICE = _descriptor.ServiceDescriptor(
   _descriptor.MethodDescriptor(
     name='addCertificateCredential',
     full_name='org.apache.custos.resource.secret.management.service.ResourceSecretManagementService.addCertificateCredential',
-    index=6,
+    index=10,
     containing_service=None,
     input_type=ResourceSecretService__pb2._CERTIFICATECREDENTIAL,
     output_type=ResourceSecretService__pb2._ADDRESOURCECREDENTIALRESPONSE,
@@ -118,7 +158,7 @@ _RESOURCESECRETMANAGEMENTSERVICE = _descriptor.ServiceDescriptor(
   _descriptor.MethodDescriptor(
     name='getSSHCredential',
     full_name='org.apache.custos.resource.secret.management.service.ResourceSecretManagementService.getSSHCredential',
-    index=7,
+    index=11,
     containing_service=None,
     input_type=ResourceSecretService__pb2._GETRESOURCECREDENTIALBYTOKENREQUEST,
     output_type=ResourceSecretService__pb2._SSHCREDENTIAL,
@@ -128,7 +168,7 @@ _RESOURCESECRETMANAGEMENTSERVICE = _descriptor.ServiceDescriptor(
   _descriptor.MethodDescriptor(
     name='getPasswordCredential',
     full_name='org.apache.custos.resource.secret.management.service.ResourceSecretManagementService.getPasswordCredential',
-    index=8,
+    index=12,
     containing_service=None,
     input_type=ResourceSecretService__pb2._GETRESOURCECREDENTIALBYTOKENREQUEST,
     output_type=ResourceSecretService__pb2._PASSWORDCREDENTIAL,
@@ -138,7 +178,7 @@ _RESOURCESECRETMANAGEMENTSERVICE = _descriptor.ServiceDescriptor(
   _descriptor.MethodDescriptor(
     name='getCertificateCredential',
     full_name='org.apache.custos.resource.secret.management.service.ResourceSecretManagementService.getCertificateCredential',
-    index=9,
+    index=13,
     containing_service=None,
     input_type=ResourceSecretService__pb2._GETRESOURCECREDENTIALBYTOKENREQUEST,
     output_type=ResourceSecretService__pb2._CERTIFICATECREDENTIAL,
@@ -148,7 +188,7 @@ _RESOURCESECRETMANAGEMENTSERVICE = _descriptor.ServiceDescriptor(
   _descriptor.MethodDescriptor(
     name='deleteSSHCredential',
     full_name='org.apache.custos.resource.secret.management.service.ResourceSecretManagementService.deleteSSHCredential',
-    index=10,
+    index=14,
     containing_service=None,
     input_type=ResourceSecretService__pb2._GETRESOURCECREDENTIALBYTOKENREQUEST,
     output_type=ResourceSecretService__pb2._RESOURCECREDENTIALOPERATIONSTATUS,
@@ -158,7 +198,7 @@ _RESOURCESECRETMANAGEMENTSERVICE = _descriptor.ServiceDescriptor(
   _descriptor.MethodDescriptor(
     name='deletePWDCredential',
     full_name='org.apache.custos.resource.secret.management.service.ResourceSecretManagementService.deletePWDCredential',
-    index=11,
+    index=15,
     containing_service=None,
     input_type=ResourceSecretService__pb2._GETRESOURCECREDENTIALBYTOKENREQUEST,
     output_type=ResourceSecretService__pb2._RESOURCECREDENTIALOPERATIONSTATUS,
@@ -168,7 +208,7 @@ _RESOURCESECRETMANAGEMENTSERVICE = _descriptor.ServiceDescriptor(
   _descriptor.MethodDescriptor(
     name='deleteCertificateCredential',
     full_name='org.apache.custos.resource.secret.management.service.ResourceSecretManagementService.deleteCertificateCredential',
-    index=12,
+    index=16,
     containing_service=None,
     input_type=ResourceSecretService__pb2._GETRESOURCECREDENTIALBYTOKENREQUEST,
     output_type=ResourceSecretService__pb2._RESOURCECREDENTIALOPERATIONSTATUS,
diff --git a/custos-client-sdks/custos-python-sdk/custos/server/integration/ResourceSecretManagementService_pb2_grpc.py b/custos-client-sdks/custos-python-sdk/custos/server/integration/ResourceSecretManagementService_pb2_grpc.py
index 46f4569..eba7eee 100644
--- a/custos-client-sdks/custos-python-sdk/custos/server/integration/ResourceSecretManagementService_pb2_grpc.py
+++ b/custos-client-sdks/custos-python-sdk/custos/server/integration/ResourceSecretManagementService_pb2_grpc.py
@@ -21,6 +21,26 @@ class ResourceSecretManagementServiceStub(object):
                 request_serializer=ResourceSecretService__pb2.GetSecretRequest.SerializeToString,
                 response_deserializer=ResourceSecretService__pb2.SecretMetadata.FromString,
                 )
+        self.getKVCredential = channel.unary_unary(
+                '/org.apache.custos.resource.secret.management.service.ResourceSecretManagementService/getKVCredential',
+                request_serializer=ResourceSecretService__pb2.KVCredential.SerializeToString,
+                response_deserializer=ResourceSecretService__pb2.KVCredential.FromString,
+                )
+        self.addKVCredential = channel.unary_unary(
+                '/org.apache.custos.resource.secret.management.service.ResourceSecretManagementService/addKVCredential',
+                request_serializer=ResourceSecretService__pb2.KVCredential.SerializeToString,
+                response_deserializer=ResourceSecretService__pb2.ResourceCredentialOperationStatus.FromString,
+                )
+        self.updateKVCredential = channel.unary_unary(
+                '/org.apache.custos.resource.secret.management.service.ResourceSecretManagementService/updateKVCredential',
+                request_serializer=ResourceSecretService__pb2.KVCredential.SerializeToString,
+                response_deserializer=ResourceSecretService__pb2.ResourceCredentialOperationStatus.FromString,
+                )
+        self.deleteKVCredential = channel.unary_unary(
+                '/org.apache.custos.resource.secret.management.service.ResourceSecretManagementService/deleteKVCredential',
+                request_serializer=ResourceSecretService__pb2.KVCredential.SerializeToString,
+                response_deserializer=ResourceSecretService__pb2.ResourceCredentialOperationStatus.FromString,
+                )
         self.getJWKS = channel.unary_unary(
                 '/org.apache.custos.resource.secret.management.service.ResourceSecretManagementService/getJWKS',
                 request_serializer=IdentityService__pb2.GetJWKSRequest.SerializeToString,
@@ -92,6 +112,30 @@ class ResourceSecretManagementServiceServicer(object):
         context.set_details('Method not implemented!')
         raise NotImplementedError('Method not implemented!')
 
+    def getKVCredential(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def addKVCredential(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def updateKVCredential(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def deleteKVCredential(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
     def getJWKS(self, request, context):
         """Missing associated documentation comment in .proto file."""
         context.set_code(grpc.StatusCode.UNIMPLEMENTED)
@@ -172,6 +216,26 @@ def add_ResourceSecretManagementServiceServicer_to_server(servicer, server):
                     request_deserializer=ResourceSecretService__pb2.GetSecretRequest.FromString,
                     response_serializer=ResourceSecretService__pb2.SecretMetadata.SerializeToString,
             ),
+            'getKVCredential': grpc.unary_unary_rpc_method_handler(
+                    servicer.getKVCredential,
+                    request_deserializer=ResourceSecretService__pb2.KVCredential.FromString,
+                    response_serializer=ResourceSecretService__pb2.KVCredential.SerializeToString,
+            ),
+            'addKVCredential': grpc.unary_unary_rpc_method_handler(
+                    servicer.addKVCredential,
+                    request_deserializer=ResourceSecretService__pb2.KVCredential.FromString,
+                    response_serializer=ResourceSecretService__pb2.ResourceCredentialOperationStatus.SerializeToString,
+            ),
+            'updateKVCredential': grpc.unary_unary_rpc_method_handler(
+                    servicer.updateKVCredential,
+                    request_deserializer=ResourceSecretService__pb2.KVCredential.FromString,
+                    response_serializer=ResourceSecretService__pb2.ResourceCredentialOperationStatus.SerializeToString,
+            ),
+            'deleteKVCredential': grpc.unary_unary_rpc_method_handler(
+                    servicer.deleteKVCredential,
+                    request_deserializer=ResourceSecretService__pb2.KVCredential.FromString,
+                    response_serializer=ResourceSecretService__pb2.ResourceCredentialOperationStatus.SerializeToString,
+            ),
             'getJWKS': grpc.unary_unary_rpc_method_handler(
                     servicer.getJWKS,
                     request_deserializer=IdentityService__pb2.GetJWKSRequest.FromString,
@@ -260,6 +324,74 @@ class ResourceSecretManagementService(object):
             insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
 
     @staticmethod
+    def getKVCredential(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.resource.secret.management.service.ResourceSecretManagementService/getKVCredential',
+            ResourceSecretService__pb2.KVCredential.SerializeToString,
+            ResourceSecretService__pb2.KVCredential.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def addKVCredential(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.resource.secret.management.service.ResourceSecretManagementService/addKVCredential',
+            ResourceSecretService__pb2.KVCredential.SerializeToString,
+            ResourceSecretService__pb2.ResourceCredentialOperationStatus.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def updateKVCredential(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.resource.secret.management.service.ResourceSecretManagementService/updateKVCredential',
+            ResourceSecretService__pb2.KVCredential.SerializeToString,
+            ResourceSecretService__pb2.ResourceCredentialOperationStatus.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def deleteKVCredential(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/org.apache.custos.resource.secret.management.service.ResourceSecretManagementService/deleteKVCredential',
+            ResourceSecretService__pb2.KVCredential.SerializeToString,
+            ResourceSecretService__pb2.ResourceCredentialOperationStatus.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
     def getJWKS(request,
             target,
             options=(),
diff --git a/custos-core-services/agent-profile-core-service/src/main/resources/application.properties b/custos-core-services/agent-profile-core-service/src/main/resources/application.properties
index 5fb3e72..b43627d 100644
--- a/custos-core-services/agent-profile-core-service/src/main/resources/application.properties
+++ b/custos-core-services/agent-profile-core-service/src/main/resources/application.properties
@@ -27,7 +27,7 @@ management.security.enabled=false
 management.endpoints.web.exposure.include=*
 management.endpoint.metrics.enabled=true
 
-spring.datasource.url = jdbc:mysql://mysql.custos.svc.cluster.local:3306/core_agent_profile?useSSL=false&serverTimezone=UTC&useLegacyDatetimeCode=false
+spring.datasource.url = jdbc:mysql://mysql-primary.custos.svc.cluster.local:3306/core_agent_profile?useSSL=false&serverTimezone=UTC&useLegacyDatetimeCode=false
 spring.datasource.username = root
 spring.datasource.password = root
 
diff --git a/custos-core-services/cluster-management-core-service/src/main/resources/application.properties b/custos-core-services/cluster-management-core-service/src/main/resources/application.properties
index 3768b33..1a2e97c 100644
--- a/custos-core-services/cluster-management-core-service/src/main/resources/application.properties
+++ b/custos-core-services/cluster-management-core-service/src/main/resources/application.properties
@@ -27,7 +27,7 @@ management.security.enabled=false
 management.endpoints.web.exposure.include=*
 management.endpoint.metrics.enabled=true
 
-spring.datasource.url = jdbc:mysql://mysql.custos.svc.cluster.local:3306/core_cluster_manager?useSSL=false&serverTimezone=UTC&useLegacyDatetimeCode=false
+spring.datasource.url = jdbc:mysql://mysql-primary.custos.svc.cluster.local:3306/core_cluster_manager?useSSL=false&serverTimezone=UTC&useLegacyDatetimeCode=false
 spring.datasource.username = root
 spring.datasource.password = root
 
diff --git a/custos-core-services/credential-store-core-service/src/main/resources/application.properties b/custos-core-services/credential-store-core-service/src/main/resources/application.properties
index a26a7d1..6f3c54b 100644
--- a/custos-core-services/credential-store-core-service/src/main/resources/application.properties
+++ b/custos-core-services/credential-store-core-service/src/main/resources/application.properties
@@ -27,7 +27,7 @@ management.endpoints.web.exposure.include=*
 management.endpoint.metrics.enabled=true
 
 
-spring.datasource.url = jdbc:mysql://mysql.custos.svc.cluster.local:3306/core_credential_store?useSSL=false&serverTimezone=UTC&useLegacyDatetimeCode=false
+spring.datasource.url = jdbc:mysql://mysql-primary.custos.svc.cluster.local:3306/core_credential_store?useSSL=false&serverTimezone=UTC&useLegacyDatetimeCode=false
 spring.datasource.username = root
 spring.datasource.password = root
 
diff --git a/custos-core-services/custos-logging/src/main/resources/application.properties b/custos-core-services/custos-logging/src/main/resources/application.properties
index 2711f34..a56cab7 100644
--- a/custos-core-services/custos-logging/src/main/resources/application.properties
+++ b/custos-core-services/custos-logging/src/main/resources/application.properties
@@ -28,7 +28,7 @@ management.endpoints.web.exposure.include=*
 management.endpoint.metrics.enabled=true
 
 
-spring.datasource.url = jdbc:mysql://mysql.custos.svc.cluster.local:3306/core_logging?useSSL=false&serverTimezone=UTC&useLegacyDatetimeCode=false
+spring.datasource.url = jdbc:mysql://mysql-primary.custos.svc.cluster.local:3306/core_logging?useSSL=false&serverTimezone=UTC&useLegacyDatetimeCode=false
 spring.datasource.username = root
 spring.datasource.password = root
 
diff --git a/custos-core-services/federated-authentication-core-service/src/main/resources/application.properties b/custos-core-services/federated-authentication-core-service/src/main/resources/application.properties
index 1904647..70fece9 100644
--- a/custos-core-services/federated-authentication-core-service/src/main/resources/application.properties
+++ b/custos-core-services/federated-authentication-core-service/src/main/resources/application.properties
@@ -28,7 +28,7 @@ management.endpoints.web.exposure.include=*
 management.endpoint.metrics.enabled=true
 
 
-spring.datasource.url = jdbc:mysql://mysql.custos.svc.cluster.local:3306/core_federated_authentication?useSSL=false&serverTimezone=UTC&useLegacyDatetimeCode=false
+spring.datasource.url = jdbc:mysql://mysql-primary.custos.svc.cluster.local:3306/core_federated_authentication?useSSL=false&serverTimezone=UTC&useLegacyDatetimeCode=false
 spring.datasource.username = root
 spring.datasource.password = root
 
diff --git a/custos-core-services/iam-admin-core-service/src/main/resources/application.properties b/custos-core-services/iam-admin-core-service/src/main/resources/application.properties
index 8453f69..9169a6a 100644
--- a/custos-core-services/iam-admin-core-service/src/main/resources/application.properties
+++ b/custos-core-services/iam-admin-core-service/src/main/resources/application.properties
@@ -28,7 +28,7 @@ management.endpoints.web.exposure.include=*
 management.endpoint.metrics.enabled=true
 
 
-spring.datasource.url = jdbc:mysql://mysql.custos.svc.cluster.local:3306/core_iam?useSSL=false&serverTimezone=UTC&useLegacyDatetimeCode=false
+spring.datasource.url = jdbc:mysql://mysql-primary.custos.svc.cluster.local:3306/core_iam?useSSL=false&serverTimezone=UTC&useLegacyDatetimeCode=false
 spring.datasource.username = root
 spring.datasource.password = root
 
diff --git a/custos-core-services/identity-core-service/src/main/resources/application.properties b/custos-core-services/identity-core-service/src/main/resources/application.properties
index 27e8f36..1893be2 100644
--- a/custos-core-services/identity-core-service/src/main/resources/application.properties
+++ b/custos-core-services/identity-core-service/src/main/resources/application.properties
@@ -28,7 +28,7 @@ management.endpoints.web.exposure.include=*
 management.endpoint.metrics.enabled=true
 
 
-spring.datasource.url = jdbc:mysql://mysql.custos.svc.cluster.local:3306/core_identity?useSSL=false&serverTimezone=UTC&useLegacyDatetimeCode=false
+spring.datasource.url = jdbc:mysql://mysql-primary.custos.svc.cluster.local:3306/core_identity?useSSL=false&serverTimezone=UTC&useLegacyDatetimeCode=false
 spring.datasource.username = root
 spring.datasource.password = root
 
diff --git a/custos-core-services/resource-secret-core-service/src/main/resources/application.properties b/custos-core-services/resource-secret-core-service/src/main/resources/application.properties
index c34ddd3..3168f2d 100644
--- a/custos-core-services/resource-secret-core-service/src/main/resources/application.properties
+++ b/custos-core-services/resource-secret-core-service/src/main/resources/application.properties
@@ -27,7 +27,7 @@ management.security.enabled=false
 management.endpoints.web.exposure.include=*
 management.endpoint.metrics.enabled=true
 
-spring.datasource.url = jdbc:mysql://mysql.custos.svc.cluster.local:3306/core_resource_secret?useSSL=false&serverTimezone=UTC&useLegacyDatetimeCode=false
+spring.datasource.url = jdbc:mysql://mysql-primary.custos.svc.cluster.local:3306/core_resource_secret?useSSL=false&serverTimezone=UTC&useLegacyDatetimeCode=false
 spring.datasource.username = root
 spring.datasource.password = root
 
diff --git a/custos-core-services/sharing-core-service/src/main/java/org/apache/custos/sharing/persistance/model/Sharing.java b/custos-core-services/sharing-core-service/src/main/java/org/apache/custos/sharing/persistance/model/Sharing.java
index 566da2e..67ac600 100644
--- a/custos-core-services/sharing-core-service/src/main/java/org/apache/custos/sharing/persistance/model/Sharing.java
+++ b/custos-core-services/sharing-core-service/src/main/java/org/apache/custos/sharing/persistance/model/Sharing.java
@@ -33,6 +33,7 @@ import java.util.Date;
 public class Sharing {
 
     @Id
+    @Column(length = 1000)
     private String id;
 
     @Column(nullable = false)
diff --git a/custos-core-services/sharing-core-service/src/main/resources/application.properties b/custos-core-services/sharing-core-service/src/main/resources/application.properties
index bc2eb60..01df48f 100644
--- a/custos-core-services/sharing-core-service/src/main/resources/application.properties
+++ b/custos-core-services/sharing-core-service/src/main/resources/application.properties
@@ -27,7 +27,7 @@ management.security.enabled=false
 management.endpoints.web.exposure.include=*
 management.endpoint.metrics.enabled=true
 
-spring.datasource.url = jdbc:mysql://mysql.custos.svc.cluster.local:3306/core_sharing?useSSL=false&serverTimezone=UTC&useLegacyDatetimeCode=false
+spring.datasource.url = jdbc:mysql://mysql-primary.custos.svc.cluster.local:3306/core_sharing?useSSL=false&serverTimezone=UTC&useLegacyDatetimeCode=false
 spring.datasource.username = root
 spring.datasource.password = root
 
diff --git a/custos-core-services/tenant-profile-core-service/src/main/resources/application.properties b/custos-core-services/tenant-profile-core-service/src/main/resources/application.properties
index af475b5..af49ec2 100644
--- a/custos-core-services/tenant-profile-core-service/src/main/resources/application.properties
+++ b/custos-core-services/tenant-profile-core-service/src/main/resources/application.properties
@@ -27,7 +27,7 @@ management.security.enabled=false
 management.endpoints.web.exposure.include=*
 management.endpoint.metrics.enabled=true
 
-spring.datasource.url = jdbc:mysql://mysql.custos.svc.cluster.local:3306/core_tenant?useSSL=false&serverTimezone=UTC&useLegacyDatetimeCode=false
+spring.datasource.url = jdbc:mysql://mysql-primary.custos.svc.cluster.local:3306/core_tenant?useSSL=false&serverTimezone=UTC&useLegacyDatetimeCode=false
 spring.datasource.username = root
 spring.datasource.password = root
 
diff --git a/custos-core-services/user-profile-core-service/src/main/resources/application.properties b/custos-core-services/user-profile-core-service/src/main/resources/application.properties
index c045435..969557c 100644
--- a/custos-core-services/user-profile-core-service/src/main/resources/application.properties
+++ b/custos-core-services/user-profile-core-service/src/main/resources/application.properties
@@ -27,7 +27,7 @@ management.security.enabled=false
 management.endpoints.web.exposure.include=*
 management.endpoint.metrics.enabled=true
 
-spring.datasource.url = jdbc:mysql://mysql.custos.svc.cluster.local:3306/core_user_profile?useSSL=false&serverTimezone=UTC&useLegacyDatetimeCode=false
+spring.datasource.url = jdbc:mysql://mysql-primary.custos.svc.cluster.local:3306/core_user_profile?useSSL=false&serverTimezone=UTC&useLegacyDatetimeCode=false
 spring.datasource.username = root
 spring.datasource.password = root
 
diff --git a/custos-federated-services-clients/src/main/java/org/apache/custos/federated/services/clients/keycloak/KeycloakClient.java b/custos-federated-services-clients/src/main/java/org/apache/custos/federated/services/clients/keycloak/KeycloakClient.java
index e127c5a..143b0c0 100644
--- a/custos-federated-services-clients/src/main/java/org/apache/custos/federated/services/clients/keycloak/KeycloakClient.java
+++ b/custos-federated-services-clients/src/main/java/org/apache/custos/federated/services/clients/keycloak/KeycloakClient.java
@@ -1252,8 +1252,8 @@ public class KeycloakClient {
 
         } catch (Exception ex) {
             String msg = "Error occurred while pulling events, reason: " + ex.getMessage();
-            LOGGER.error(msg, ex);
-            throw new RuntimeException(msg, ex);
+            LOGGER.warn(msg, ex);
+            return null;
 
         } finally {
             if (client != null) {
diff --git a/custos-integration-services/resource-secret-management-service-parent/resource-secret-management-service/src/main/java/org/apache/custos/resource/secret/management/interceptors/InputValidator.java b/custos-integration-services/resource-secret-management-service-parent/resource-secret-management-service/src/main/java/org/apache/custos/resource/secret/management/interceptors/InputValidator.java
index 4b4a4b0..7efea08 100644
--- a/custos-integration-services/resource-secret-management-service-parent/resource-secret-management-service/src/main/java/org/apache/custos/resource/secret/management/interceptors/InputValidator.java
+++ b/custos-integration-services/resource-secret-management-service-parent/resource-secret-management-service/src/main/java/org/apache/custos/resource/secret/management/interceptors/InputValidator.java
@@ -79,7 +79,7 @@ public class InputValidator implements IntegrationServiceInterceptor {
                     throw new MissingParameterException("At least key or token should be added ", null);
                 }
 
-                if ((value == null || value.trim().equals(""))) {
+                if ((method.equals("addKVCredential") || method.equals("updateKVCredential")) && (value == null || value.trim().equals(""))) {
                     throw new MissingParameterException("Vaule should not be null ", null);
                 }