Skip to content

Commit 54d37d0

Browse files
author
dakodakov
authored
control-service: make kv store configurable (#3422)
Allow the configuration of the KV store name for Vault --------- Signed-off-by: Dako Dakov <ddakov@vmware.com>
1 parent faa6e3d commit 54d37d0

File tree

6 files changed

+44
-11
lines changed

6 files changed

+44
-11
lines changed

projects/control-service/projects/helm_charts/pipelines-control-service/templates/_helpers.tpl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -186,6 +186,8 @@ Generate default Vault configuration.
186186
URI: {{ default "http://localhost:8200" .Values.secrets.vault.uri | b64enc | quote }}
187187
ROLEID: {{ default "root" .Values.secrets.vault.approle.roleid | b64enc | quote }}
188188
SECRETID: {{ default "root" .Values.secrets.vault.approle.secretid | b64enc | quote }}
189+
KVSTORE: {{ default "secret" .Values.secrets.vault.kvstore | b64enc | quote }}
190+
KVSTOREMETA: {{ default "secret/metadata/" .Values.secrets.vault.kvstoremeta | b64enc | quote }}
189191
{{- end -}}
190192

191193
{{/*

projects/control-service/projects/helm_charts/pipelines-control-service/templates/deployment.yaml

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -374,6 +374,16 @@ spec:
374374
secretKeyRef:
375375
name: {{ .Values.secrets.vault.externalSecretName | default (include "pipelines-control-service.vaultSecretName" . ) }}
376376
key: SECRETID
377+
- name: VDK_VAULT_KVSTORE
378+
valueFrom:
379+
secretKeyRef:
380+
name: {{ .Values.secrets.vault.externalSecretName | default (include "pipelines-control-service.vaultSecretName" . ) }}
381+
key: KVSTORE
382+
- name: VDK_VAULT_KVSTOREMETA
383+
valueFrom:
384+
secretKeyRef:
385+
name: {{ .Values.secrets.vault.externalSecretName | default (include "pipelines-control-service.vaultSecretName" . ) }}
386+
key: KVSTOREMETA
377387
- name: DATAJOBS_VAULT_SIZE_LIMIT_BYTES
378388
value: "{{ .Values.secrets.vault.sizeLimitBytes }}"
379389
{{- end }}

projects/control-service/projects/helm_charts/pipelines-control-service/values.yaml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1267,3 +1267,7 @@ secrets:
12671267
roleid: foo
12681268
secretid: foo
12691269
sizeLimitBytes: "1048576"
1270+
## name of the key-value store to use
1271+
kvstore: "secret"
1272+
## location of the key-value store metadata, usually at "<kv store name>/metadata/"
1273+
kvstoremeta: "secret/metadata/"

projects/control-service/projects/pipelines_control_service/src/main/java/com/vmware/taurus/secrets/service/vault/VaultJobSecretsService.java

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,11 @@ public class VaultJobSecretsService implements com.vmware.taurus.secrets.service
3333

3434
// package private so it can be used in tests
3535
static final int VAULT_SIZE_LIMIT_DEFAULT = 1048576; // 1 MB
36-
private static final String SECRET = "secret";
37-
public static final String METADATA_PATH = "secret/metadata/";
36+
37+
@Value("${vdk.vault.kvstore:secret}")
38+
String kvStore;
39+
@Value("${vdk.vault.kvstoremeta:secret/metadata/}")
40+
String kvStoreMeta;
3841
public static final String TEAM_OAUTH_CREDENTIALS = "team-oauth-credentials";
3942

4043
@Value("${datajobs.vault.size.limit.bytes}")
@@ -60,7 +63,7 @@ public void updateJobSecrets(String teamName, String jobName, Map<String, Object
6063
String secretKey = getJobSecretKey(teamName, jobName);
6164

6265
Versioned<VaultJobSecrets> readResponse =
63-
vaultOperations.opsForVersionedKeyValue(SECRET).get(secretKey, VaultJobSecrets.class);
66+
vaultOperations.opsForVersionedKeyValue(kvStore).get(secretKey, VaultJobSecrets.class);
6467

6568
VaultJobSecrets vaultJobSecrets;
6669

@@ -90,7 +93,7 @@ public void updateJobSecrets(String teamName, String jobName, Map<String, Object
9093

9194
vaultJobSecrets.setSecretsJson(updatedSecretsString);
9295

93-
vaultOperations.opsForVersionedKeyValue(SECRET).put(secretKey, vaultJobSecrets);
96+
vaultOperations.opsForVersionedKeyValue(kvStore).put(secretKey, vaultJobSecrets);
9497
}
9598

9699
@Override
@@ -101,7 +104,7 @@ public Map<String, Object> readJobSecrets(String teamName, String jobName)
101104
String secretKey = getJobSecretKey(teamName, jobName);
102105

103106
Versioned<VaultJobSecrets> readResponse =
104-
vaultOperations.opsForVersionedKeyValue(SECRET).get(secretKey, VaultJobSecrets.class);
107+
vaultOperations.opsForVersionedKeyValue(kvStore).get(secretKey, VaultJobSecrets.class);
105108

106109
VaultJobSecrets vaultJobSecrets;
107110

@@ -127,7 +130,7 @@ public void updateTeamOauthCredentials(String teamName, String clientId, String
127130
VaultTeamCredentials teamCredentials =
128131
new VaultTeamCredentials(teamName, clientId, clientSecret);
129132

130-
vaultOperations.opsForVersionedKeyValue(SECRET).put(secretKey, teamCredentials);
133+
vaultOperations.opsForVersionedKeyValue(kvStore).put(secretKey, teamCredentials);
131134
clientIdToTeamIdCache.put(teamCredentials.getClientId(), teamName);
132135
teamIdToCredentialsCache.put(teamName, teamCredentials);
133136
}
@@ -142,7 +145,7 @@ public VaultTeamCredentials readTeamOauthCredentials(String teamName) {
142145

143146
Versioned<VaultTeamCredentials> readResponse =
144147
vaultOperations
145-
.opsForVersionedKeyValue(SECRET)
148+
.opsForVersionedKeyValue(kvStore)
146149
.get(secretKey, VaultTeamCredentials.class);
147150

148151
if (readResponse != null && readResponse.hasData()) {
@@ -163,7 +166,7 @@ public String getTeamIdForClientId(String clientId) {
163166
} else {
164167
// Search through all team entries in Vault
165168
try {
166-
var response = vaultOperations.list(METADATA_PATH);
169+
var response = vaultOperations.list(kvStoreMeta);
167170
if (response != null) {
168171
for (String teamId : response) {
169172
teamId = StringUtils.removeEnd(teamId, "/");

projects/control-service/projects/pipelines_control_service/src/main/resources/application.properties

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -348,6 +348,8 @@ vdk.vault.uri=http://localhost:8200/v1/
348348
vdk.vault.approle.roleid=
349349
vdk.vault.approle.secretid=
350350
vdk.vault.token=
351+
vdk.vault.kvstore=secret
352+
vdk.vault.kvstoremeta=secret/metadata/
351353
datajobs.vault.size.limit.bytes=1048576
352354

353355
datajobs.jfrog.artifactory.url=${JFROG_ARTIFACTORY_URL:}

projects/control-service/projects/pipelines_control_service/src/test/java/com/vmware/taurus/secrets/vault/VaultJobSecretsServiceTest.java

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
import com.fasterxml.jackson.core.JsonProcessingException;
99
import com.vmware.taurus.ControlplaneApplication;
10+
import com.vmware.taurus.authorization.webhook.AuthorizationBody;
1011
import com.vmware.taurus.exception.DataJobSecretsException;
1112
import com.vmware.taurus.exception.DataJobSecretsSizeLimitException;
1213
import com.vmware.taurus.exception.DataJobTeamSecretsException;
@@ -16,13 +17,15 @@
1617
import org.apache.commons.lang3.RandomStringUtils;
1718
import org.hamcrest.CoreMatchers;
1819
import org.junit.Assert;
20+
import org.junit.jupiter.api.BeforeEach;
1921
import org.junit.jupiter.api.Test;
2022
import org.junit.jupiter.api.extension.ExtendWith;
2123
import org.mockito.InjectMocks;
2224
import org.mockito.Mock;
2325
import org.springframework.boot.test.context.SpringBootTest;
2426
import org.springframework.test.context.TestPropertySource;
2527
import org.springframework.test.context.junit.jupiter.SpringExtension;
28+
import org.springframework.test.util.ReflectionTestUtils;
2629
import org.springframework.vault.core.VaultTemplate;
2730
import org.springframework.vault.core.VaultVersionedKeyValueOperations;
2831
import org.springframework.vault.support.Versioned;
@@ -31,7 +34,6 @@
3134
import java.util.List;
3235
import java.util.Map;
3336

34-
import static com.vmware.taurus.secrets.service.vault.VaultJobSecretsService.METADATA_PATH;
3537
import static com.vmware.taurus.secrets.service.vault.VaultJobSecretsService.TEAM_OAUTH_CREDENTIALS;
3638
import static org.junit.jupiter.api.Assertions.assertEquals;
3739
import static org.junit.jupiter.api.Assertions.assertNotEquals;
@@ -47,16 +49,26 @@
4749
@TestPropertySource(
4850
properties = {
4951
"datajobs.vault.size.limit.bytes=1048576",
52+
"vdk.vault.kvstore=secret",
53+
"vdk.vault.kvstoremeta=secret/metadata/",
5054
})
5155
class VaultJobSecretsServiceTest {
5256

5357
private static final String SECRET = "secret";
58+
private static final String SECRET_META = "secret/metadata/";
5459

5560
@Mock private VaultTemplate vaultTemplate;
5661
@Mock private VaultVersionedKeyValueOperations vaultOperations;
5762

5863
@InjectMocks private VaultJobSecretsService secretsService;
5964

65+
@BeforeEach
66+
public void setUp() {
67+
ReflectionTestUtils.setField(secretsService, "kvStore", "secret");
68+
ReflectionTestUtils.setField(secretsService, "kvStoreMeta", "secret/metadata/");
69+
}
70+
71+
6072
@Test
6173
void testUpdateJobSecrets() throws JsonProcessingException {
6274
String jobName = "testJob";
@@ -268,7 +280,7 @@ void testGetTeamIdForClientId() {
268280
String secretKey = teamName + "/" + TEAM_OAUTH_CREDENTIALS;
269281
Versioned<VaultTeamCredentials> readResponse = Versioned.create(expectedCredentials);
270282

271-
when(vaultTemplate.list(METADATA_PATH)).thenReturn(List.of(teamName));
283+
when(vaultTemplate.list(SECRET_META)).thenReturn(List.of(teamName));
272284
when(vaultTemplate.opsForVersionedKeyValue(SECRET)).thenReturn(vaultOperations);
273285
when(vaultOperations.get(secretKey, VaultTeamCredentials.class)).thenReturn(readResponse);
274286

@@ -294,7 +306,7 @@ void testGetTeamIdForNonExistentClientId() {
294306
String nonExistentClientId = "nonExistentClient";
295307

296308
when(vaultTemplate.opsForVersionedKeyValue(SECRET)).thenReturn(vaultOperations);
297-
when(vaultOperations.list("secret/metadata/")).thenReturn(List.of("team1"));
309+
when(vaultOperations.list(SECRET_META)).thenReturn(List.of("team1"));
298310
when(vaultOperations.get("secret/oauth/team1")).thenReturn(null);
299311

300312
String result = secretsService.getTeamIdForClientId(nonExistentClientId);

0 commit comments

Comments
 (0)