Skip to content

Commit 2e5b2e9

Browse files
teoincontattolgarciaog
authored andcommitted
fix: dry run is not testing dependent resources
1 parent 1cc2780 commit 2e5b2e9

10 files changed

Lines changed: 324 additions & 297 deletions

File tree

stackgres-k8s/src/restapi/src/main/java/io/stackgres/apiweb/rest/cluster/ClusterResource.java

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -166,7 +166,7 @@ public List<ClusterDto> list() {
166166
""")
167167
@Override
168168
public ClusterDto create(ClusterDto resource, @Nullable Boolean dryRun) {
169-
createOrUpdateScripts(resource);
169+
createOrUpdateScripts(resource, Optional.ofNullable(dryRun).orElse(false));
170170
return super.create(resource, dryRun);
171171
}
172172

@@ -185,7 +185,7 @@ public ClusterDto create(ClusterDto resource, @Nullable Boolean dryRun) {
185185
""")
186186
@Override
187187
public ClusterDto update(ClusterDto resource, @Nullable Boolean dryRun) {
188-
createOrUpdateScripts(resource);
188+
createOrUpdateScripts(resource, Optional.ofNullable(dryRun).orElse(false));
189189
return super.update(resource, dryRun);
190190
}
191191

@@ -278,7 +278,7 @@ ClusterDto setConfigMaps(ClusterDto resource) {
278278
return resource;
279279
}
280280

281-
private void createOrUpdateScripts(ClusterDto resource) {
281+
private void createOrUpdateScripts(ClusterDto resource, boolean dryRun) {
282282
var scriptsToCreate = getScriptsToCreate(resource)
283283
.stream()
284284
.filter(t -> isNotDefaultScript(t.v2))
@@ -337,32 +337,36 @@ private void createOrUpdateScripts(ClusterDto resource) {
337337
configMapsToCreate.stream()
338338
.filter(t -> t.v2.isEmpty())
339339
.map(Tuple2::v1)
340-
.forEach(configMapWriter::create);
340+
.forEach(configMap -> configMapWriter.create(configMap, dryRun));
341341
configMapsToCreate.stream()
342342
.filter(t -> t.v2.isPresent())
343343
.map(Tuple2::v1)
344-
.forEach(configMapWriter::update);
344+
.forEach(configMap -> configMapWriter.update(configMap, dryRun));
345345
secretsToCreate.stream()
346346
.filter(t -> t.v2.isEmpty())
347347
.map(Tuple2::v1)
348-
.forEach(secretWriter::create);
348+
.forEach(secret -> secretWriter.create(secret, dryRun));
349349
secretsToCreate.stream()
350350
.filter(t -> t.v2.isPresent())
351351
.map(Tuple2::v1)
352-
.forEach(secretWriter::update);
352+
.forEach(secret -> secretWriter.update(secret, dryRun));
353353
scriptsToCreate.stream()
354354
.filter(t -> t.v3.isEmpty())
355-
.forEach(t -> addFieldPrefixOnScriptValidationError(t.v1, t.v2, scriptScheduler::create));
355+
.forEach(t -> addFieldPrefixOnScriptValidationError(
356+
t.v1, t.v2, script -> scriptScheduler.create(script, dryRun)));
356357
scriptsToCreate.stream()
357358
.filter(t -> t.v3.isPresent())
358-
.forEach(t -> addFieldPrefixOnScriptValidationError(t.v1, t.v2, scriptScheduler::update));
359+
.forEach(t -> addFieldPrefixOnScriptValidationError(
360+
t.v1, t.v2, script -> scriptScheduler.update(script, dryRun)));
359361
}
360362

361363
private boolean isNotDefaultScript(StackGresScript script) {
362364
return !script.getMetadata().getName().endsWith(ManagedSqlUtil.DEFAULT_SCRIPT_NAME_SUFFIX);
363365
}
364366

365-
private void addFieldPrefixOnScriptValidationError(Integer sgScriptIndex, StackGresScript script,
367+
private void addFieldPrefixOnScriptValidationError(
368+
Integer sgScriptIndex,
369+
StackGresScript script,
366370
Consumer<StackGresScript> consumer) {
367371
try {
368372
consumer.accept(script);

stackgres-k8s/src/restapi/src/main/java/io/stackgres/apiweb/rest/misc/NamespaceResource.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,14 @@
1616
import io.stackgres.common.OperatorProperty;
1717
import io.stackgres.common.resource.ResourceScanner;
1818
import io.stackgres.common.resource.ResourceWriter;
19+
import jakarta.annotation.Nullable;
1920
import jakarta.enterprise.context.RequestScoped;
2021
import jakarta.inject.Inject;
2122
import jakarta.ws.rs.GET;
2223
import jakarta.ws.rs.POST;
2324
import jakarta.ws.rs.Path;
2425
import jakarta.ws.rs.PathParam;
26+
import jakarta.ws.rs.QueryParam;
2527
import org.eclipse.microprofile.openapi.annotations.Operation;
2628
import org.eclipse.microprofile.openapi.annotations.enums.SchemaType;
2729
import org.eclipse.microprofile.openapi.annotations.media.Content;
@@ -99,13 +101,14 @@ public List<String> get() {
99101
""")
100102
@Path("{name}")
101103
@POST
102-
public void create(@PathParam("name") String name) {
104+
public void create(@PathParam("name") String name, @Nullable @QueryParam("dryRun") Boolean dryRun) {
103105
namespaceWriter.create(
104106
new NamespaceBuilder()
105107
.withNewMetadata()
106108
.withName(name)
107109
.endMetadata()
108-
.build());
110+
.build(),
111+
Optional.ofNullable(dryRun).orElse(false));
109112
}
110113

111114
}

stackgres-k8s/src/restapi/src/main/java/io/stackgres/apiweb/rest/sgobjectstorage/ObjectStorageResource.java

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -103,9 +103,7 @@ public class ObjectStorageResource
103103
@Override
104104
public ObjectStorageDto create(@Nonnull ObjectStorageDto resource, @Nullable Boolean dryRun) {
105105
setSecretKeySelectors(resource);
106-
if (!Optional.ofNullable(dryRun).orElse(false)) {
107-
createOrUpdateSecret(resource);
108-
}
106+
createOrUpdateSecret(resource, Optional.ofNullable(dryRun).orElse(false));
109107
return super.create(resource, dryRun);
110108
}
111109

@@ -127,9 +125,7 @@ public ObjectStorageDto create(@Nonnull ObjectStorageDto resource, @Nullable Boo
127125
@Override
128126
public ObjectStorageDto update(@Nonnull ObjectStorageDto resource, @Nullable Boolean dryRun) {
129127
setSecretKeySelectors(resource);
130-
if (!Optional.ofNullable(dryRun).orElse(false)) {
131-
createOrUpdateSecret(resource);
132-
}
128+
createOrUpdateSecret(resource, Optional.ofNullable(dryRun).orElse(false));
133129
return super.update(resource, dryRun);
134130
}
135131

@@ -177,7 +173,7 @@ private void setSecretKeySelectors(ObjectStorageDto resource) {
177173
.forEach(t -> t.v2.v4.accept(new SecretKeySelector(t.v1, name)));
178174
}
179175

180-
private void createOrUpdateSecret(ObjectStorageDto resource) {
176+
private void createOrUpdateSecret(ObjectStorageDto resource, boolean dryRun) {
181177
final ImmutableMap<String, String> secrets = BackupStorageDtoUtil
182178
.extractSecretInfo(resource.getSpec())
183179
.filter(t -> t.v2.v1 != null)
@@ -187,7 +183,7 @@ private void createOrUpdateSecret(ObjectStorageDto resource) {
187183
secretFinder.findByNameAndNamespace(name, namespace)
188184
.map(secret -> {
189185
secret.setStringData(secrets);
190-
secretWriter.update(secret);
186+
secretWriter.update(secret, dryRun);
191187
return secret;
192188
})
193189
.orElseGet(() -> {
@@ -202,7 +198,7 @@ private void createOrUpdateSecret(ObjectStorageDto resource) {
202198
.orElse(ImmutableList.of()))
203199
.endMetadata()
204200
.withStringData(secrets)
205-
.build());
201+
.build(), dryRun);
206202
return null;
207203
});
208204
}

stackgres-k8s/src/restapi/src/main/java/io/stackgres/apiweb/rest/sgscripts/ScriptResource.java

Lines changed: 71 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -73,15 +73,18 @@ public class ScriptResource
7373
public static final String DEFAULT_SCRIPT_KEY = "script";
7474

7575
private final ResourceWriter<Secret> secretWriter;
76+
private final ResourceFinder<Secret> secretFinder;
7677
private final ResourceWriter<ConfigMap> configMapWriter;
7778
private final ResourceFinder<ConfigMap> configMapFinder;
7879

7980
@Inject
8081
public ScriptResource(ResourceWriter<Secret> secretWriter,
82+
ResourceFinder<Secret> secretFinder,
8183
ResourceWriter<ConfigMap> configMapWriter,
8284
ResourceFinder<ConfigMap> configMapFinder) {
8385
super();
8486
this.secretWriter = secretWriter;
87+
this.secretFinder = secretFinder;
8588
this.configMapWriter = configMapWriter;
8689
this.configMapFinder = configMapFinder;
8790
}
@@ -133,11 +136,8 @@ public List<ScriptDto> list() {
133136
""")
134137
@Override
135138
public ScriptDto create(ScriptDto resource, @Nullable Boolean dryRun) {
136-
List<Secret> secretsToCreate = getSecretsToCreate(resource);
137-
List<ConfigMap> configMapsToCreate = getConfigMapsToCreate(resource);
138-
139-
secretsToCreate.forEach(secretWriter::create);
140-
configMapsToCreate.forEach(configMapWriter::create);
139+
createOrUpdateSecret(resource, Optional.ofNullable(dryRun).orElse(false));
140+
createOrUpdateConfigMap(resource, Optional.ofNullable(dryRun).orElse(false));
141141
return super.create(resource, dryRun);
142142
}
143143

@@ -169,13 +169,8 @@ public void delete(ScriptDto resource, @Nullable Boolean dryRun) {
169169
""")
170170
@Override
171171
public ScriptDto update(ScriptDto resource, @Nullable Boolean dryRun) {
172-
List<Secret> secretsToCreate = getSecretsToCreate(resource);
173-
List<ConfigMap> configMapsToCreate = getConfigMapsToCreate(resource);
174-
175-
if (!Optional.ofNullable(dryRun).orElse(false)) {
176-
secretsToCreate.forEach(secretWriter::create);
177-
configMapsToCreate.forEach(configMapWriter::create);
178-
}
172+
createOrUpdateSecret(resource, Optional.ofNullable(dryRun).orElse(false));
173+
createOrUpdateConfigMap(resource, Optional.ofNullable(dryRun).orElse(false));
179174
return super.update(resource, dryRun);
180175
}
181176

@@ -204,76 +199,99 @@ ScriptDto setConfigMaps(ScriptDto resource) {
204199
return resource;
205200
}
206201

207-
private List<ConfigMap> getConfigMapsToCreate(ScriptDto resource) {
208-
return Seq.seq(Optional.ofNullable(resource.getSpec())
202+
private void createOrUpdateConfigMap(ScriptDto resource, boolean dryRun) {
203+
String namespace = resource.getMetadata().getNamespace();
204+
Seq.seq(Optional.ofNullable(resource.getSpec())
209205
.map(ScriptSpec::getScripts)
210206
.stream()
211207
.flatMap(List::stream))
212208
.zipWithIndex()
213209
.filter(t -> t.v1.getScriptFrom() != null)
214210
.filter(t -> t.v1.getScriptFrom().getConfigMapScript() != null)
215-
.map(t -> {
211+
.forEach(t -> {
216212
ScriptFrom clusterScriptFrom = t.v1.getScriptFrom();
217213
final String configMapScript = clusterScriptFrom.getConfigMapScript();
218214
if (clusterScriptFrom.getConfigMapKeyRef() == null) {
219-
String configMapName = scriptEntryResourceName(resource, t.v2.intValue());
215+
String name = scriptEntryResourceName(resource, t.v2.intValue());
220216
ConfigMapKeySelector configMapKeyRef = new ConfigMapKeySelector();
221-
configMapKeyRef.setName(configMapName);
217+
configMapKeyRef.setName(name);
222218
configMapKeyRef.setKey(DEFAULT_SCRIPT_KEY);
223219
clusterScriptFrom.setConfigMapKeyRef(configMapKeyRef);
224220
}
225-
return new ConfigMapBuilder()
226-
.withNewMetadata()
227-
.withName(clusterScriptFrom.getConfigMapKeyRef().getName())
228-
.withNamespace(resource.getMetadata().getNamespace())
229-
.endMetadata()
230-
.withData(Map.of(clusterScriptFrom.getConfigMapKeyRef().getKey(),
231-
configMapScript))
232-
.build();
233-
})
234-
.toList();
221+
String name = clusterScriptFrom.getConfigMapKeyRef().getName();
222+
var configMaps = Map.of(
223+
clusterScriptFrom.getConfigMapKeyRef().getKey(),
224+
configMapScript);
225+
configMapFinder.findByNameAndNamespace(name, namespace)
226+
.map(configMap -> {
227+
configMap.setData(configMaps);
228+
configMapWriter.update(configMap, dryRun);
229+
return configMap;
230+
})
231+
.orElseGet(() -> {
232+
configMapWriter.create(new ConfigMapBuilder()
233+
.withNewMetadata()
234+
.withNamespace(namespace)
235+
.withName(name)
236+
.withOwnerReferences(finder.findByNameAndNamespace(
237+
resource.getMetadata().getName(), resource.getMetadata().getNamespace())
238+
.map(ResourceUtil::getOwnerReference)
239+
.map(List::of)
240+
.orElse(List.of()))
241+
.endMetadata()
242+
.withData(configMaps)
243+
.build(), dryRun);
244+
return null;
245+
});
246+
});
235247
}
236248

237-
private List<Secret> getSecretsToCreate(ScriptDto resource) {
238-
return Seq.seq(Optional.ofNullable(resource.getSpec())
249+
private void createOrUpdateSecret(ScriptDto resource, boolean dryRun) {
250+
String namespace = resource.getMetadata().getNamespace();
251+
Seq.seq(Optional.ofNullable(resource.getSpec())
239252
.map(ScriptSpec::getScripts)
240253
.stream()
241254
.flatMap(List::stream))
242255
.zipWithIndex()
243256
.filter(t -> t.v1.getScriptFrom() != null)
244257
.filter(t -> t.v1.getScriptFrom().getSecretScript() != null)
245-
.map(t -> {
258+
.forEach(t -> {
246259
ScriptFrom clusterScriptFrom = t.v1.getScriptFrom();
247260
final String secretScript = ResourceUtil
248261
.encodeSecret(clusterScriptFrom.getSecretScript());
249262
if (clusterScriptFrom.getSecretKeyRef() == null) {
250-
String secretName = scriptEntryResourceName(resource, t.v2.intValue());
263+
String name = scriptEntryResourceName(resource, t.v2.intValue());
251264
SecretKeySelector secretKeyRef = new SecretKeySelector();
252-
secretKeyRef.setName(secretName);
265+
secretKeyRef.setName(name);
253266
secretKeyRef.setKey(DEFAULT_SCRIPT_KEY);
254267
clusterScriptFrom.setSecretKeyRef(secretKeyRef);
255268
}
256-
return new SecretBuilder()
257-
.withNewMetadata()
258-
.withName(clusterScriptFrom.getSecretKeyRef().getName())
259-
.withNamespace(resource.getMetadata().getNamespace())
260-
.endMetadata()
261-
.withData(Map.of(clusterScriptFrom.getSecretKeyRef().getKey(),
262-
secretScript))
263-
.build();
264-
})
265-
.grouped(secret -> secret.getMetadata().getName())
266-
.flatMap(t -> t.v2.reduce(
267-
Optional.<Secret>empty(),
268-
(merged, secret) -> merged
269-
.or(() -> Optional.of(secret))
270-
.map(mergedSecret -> {
271-
mergedSecret.getData().putAll(secret.getData());
272-
return mergedSecret;
273-
}),
274-
(u, v) -> v)
275-
.stream())
276-
.toList();
269+
String name = clusterScriptFrom.getSecretKeyRef().getName();
270+
var secrets = Map.of(
271+
clusterScriptFrom.getSecretKeyRef().getKey(),
272+
secretScript);
273+
secretFinder.findByNameAndNamespace(name, namespace)
274+
.map(secret -> {
275+
secret.setData(secrets);
276+
secretWriter.update(secret, dryRun);
277+
return secret;
278+
})
279+
.orElseGet(() -> {
280+
secretWriter.create(new SecretBuilder()
281+
.withNewMetadata()
282+
.withNamespace(namespace)
283+
.withName(name)
284+
.withOwnerReferences(finder.findByNameAndNamespace(
285+
resource.getMetadata().getName(), resource.getMetadata().getNamespace())
286+
.map(ResourceUtil::getOwnerReference)
287+
.map(List::of)
288+
.orElse(List.of()))
289+
.endMetadata()
290+
.withData(secrets)
291+
.build(), dryRun);
292+
return null;
293+
});
294+
});
277295
}
278296

279297
private

0 commit comments

Comments
 (0)