Вопрос или проблема
Нам нужно поддерживать 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-движка
-
Создание метода для определения версии 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) { // Ваша логика для определения, является ли путь версионированным // Например, проверка наличия подкаталога для версии или анализа структуры пути // Это условие можно настроить на основе вашей конкретной реализации } }
-
Использование определенной версии 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-движка.