@@ -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