Как узнать версию двигателя KV для VaultTemplate в Spring Cloud Vault?

Вопрос или проблема

Нам нужно поддерживать KV-движки версии 1 и 2. Как мы можем узнать, какую версию использовать для ops:

val ops = vaultTemplate.opsForKeyValue(path, VaultKeyValueOperationsSupport.KeyValueBackend.???)

Существует метод isVersioned(String path) в Spring Vault Core в org.springframework.vault.core.util.KeyValueDelegate, но он не доступен для использования.

Попробуйте создать утилитный метод – determineKVBackend

    KeyValueBackend determineKVVersion(String path) {
        if (KeyValueDelegate.isVersioned(path)) {
            return KeyValueBackend.KV_2;
        } else {
            return KeyValueBackend.KV_1;
        }
    }

И перед вызовом `opsForKeyValue` попытайтесь получить ключ на основе параметра из конфигурации окружения или логики кода

    KeyValueBackend dynamicEngine = VaultUtils.determineKVVersion(path);
    VaultKeyValueOperationsSupport.KeyValueBackend ops = vaultTemplate.opsForKeyValue(path, kvBackend);

.

Ответ или решение

Чтобы определить версию KV-движка для использования с VaultTemplate в Spring Cloud Vault, необходимо учесть специфику работы с KV-движками версии 1 и 2. Следуя рекомендациям кода, представленным в вопросе, можно создать метод, который будет динамически определять версию KV-движка на основе заданного пути.

Шаги для определения версии KV-движка

  1. Создание метода для определения версии KV-движка:
    Ваша функция determineKVVersion должна проверять, является ли указанный путь версионированным. Для этого можно воспользоваться классом KeyValueDelegate, однако стоит учитывать, что метод isVersioned не является частью публичного API Spring Vault. Вам придется самостоятельно реализовать логику проверки.

    Вот образец реализации метода:

    import org.springframework.vault.core.util.KeyValueDelegate;
    
    public class VaultUtils {
       public static KeyValueBackend determineKVVersion(String path) {
           // Логика для определения версии KV движка
           // Лучше использовать ваш вариант проверки
           if (isVersioned(path)) {
               return KeyValueBackend.KV_2;
           } else {
               return KeyValueBackend.KV_1;
           }
       }
    
       private static boolean isVersioned(String path) {
           // Ваша логика для определения, является ли путь версионированным
           // Например, проверка наличия подкаталога для версии или анализа структуры пути
           // Это условие можно настроить на основе вашей конкретной реализации
       }
    }
  2. Использование определенной версии KV-движка перед вызовом метода opsForKeyValue:
    После того как вы реализовали метод для определения KV-движка, вы сможете динамически выбирать подходящий бэкенд перед вызовом opsForKeyValue. Вот как это может выглядеть:

    import org.springframework.vault.core.VaultTemplate;
    
    public class YourService {
       private final VaultTemplate vaultTemplate;
    
       public YourService(VaultTemplate vaultTemplate) {
           this.vaultTemplate = vaultTemplate;
       }
    
       public void execute(String path) {
           KeyValueBackend dynamicEngine = VaultUtils.determineKVVersion(path);
           VaultKeyValueOperationsSupport.KeyValueBackend ops = vaultTemplate.opsForKeyValue(path, dynamicEngine);
    
           // Здесь могут идти дальнейшие операции с ops
       }
    }

Обобщение

В приведенных примерах мы создали утилитарный метод для динамического определения версии KV-движка на основе анализа пути. Это решение поможет обеспечить совместимость с обоими версиями KV-движка, позволяя вашей системе адаптироваться к изменениям в конфигурации без значительного переосмысления логики работы.

Для успешной работы этого решения, убедитесь, что ваша логика определения версионирования соответствует специфике вашей инфраструктуры Vault, и протестируйте метод с различными развертываниями KV-движка.

Оцените материал
Добавить комментарий

Капча загружается...