20
20
import org .finos .tracdap .api .*;
21
21
import org .finos .tracdap .api .internal .InternalMetadataApiGrpc ;
22
22
import org .finos .tracdap .common .config .ConfigHelpers ;
23
+ import org .finos .tracdap .common .config .ConfigKeys ;
23
24
import org .finos .tracdap .common .config .ConfigManager ;
24
25
import org .finos .tracdap .common .config .IDynamicResources ;
26
+ import org .finos .tracdap .common .exception .EConsistencyValidation ;
25
27
import org .finos .tracdap .common .exception .EUnexpected ;
26
28
import org .finos .tracdap .common .metadata .MetadataBundle ;
27
29
import org .finos .tracdap .common .metadata .MetadataCodec ;
@@ -306,7 +308,7 @@ JobState buildJobConfig(JobState jobState) {
306
308
307
309
for (var storageEntry : internalStorage .entrySet ()) {
308
310
var storageKey = storageEntry .getKey ();
309
- var storage = translateResourceConfig (storageEntry .getValue ());
311
+ var storage = translateResourceConfig (storageKey , storageEntry .getValue (), jobState );
310
312
storageConfig .putBuckets (storageKey , storage );
311
313
}
312
314
@@ -315,7 +317,7 @@ JobState buildJobConfig(JobState jobState) {
315
317
316
318
for (var storageEntry : externalStorage .entrySet ()) {
317
319
var storageKey = storageEntry .getKey ();
318
- var storage = translateResourceConfig (storageEntry .getValue ());
320
+ var storage = translateResourceConfig (storageKey , storageEntry .getValue (), jobState );
319
321
storageConfig .putExternal (storageKey , storage );
320
322
}
321
323
@@ -336,27 +338,71 @@ JobState buildJobConfig(JobState jobState) {
336
338
resource -> resource .getResourceType () == ResourceType .MODEL_REPOSITORY );
337
339
338
340
for (var repoEntry : repositories .entrySet ()) {
341
+
339
342
var repoKey = repoEntry .getKey ();
340
- var repoConfig = translateResourceConfig (repoEntry .getValue ());
341
- sysConfig .putRepositories (repoKey , repoConfig );
343
+
344
+ // Only translate repositories required for the job
345
+ if (jobUsesRepository (repoKey , jobState )) {
346
+ var repoConfig = translateResourceConfig (repoKey , repoEntry .getValue (), jobState );
347
+ sysConfig .putRepositories (repoKey , repoConfig );
348
+ }
342
349
}
343
350
344
351
jobState .sysConfig = sysConfig .build ();
345
352
346
353
return jobState ;
347
354
}
348
355
349
- private PluginConfig translateResourceConfig (ResourceDefinition resource ) {
356
+ private boolean jobUsesRepository (String repoKey , JobState jobState ) {
357
+
358
+ // This method filters repo resources for the currently known job types
359
+ // TODO: Generic resource filtering in the IJobLogic interface
360
+
361
+ // Import model jobs can refer to repositories directly
362
+ if (jobState .jobType == JobType .IMPORT_MODEL ) {
363
+ var importModelJob = jobState .definition .getImportModel ();
364
+ if (importModelJob .getRepository ().equals (repoKey )) {
365
+ return true ;
366
+ }
367
+ }
368
+
369
+ // Check if any resources refer to the repo key
370
+ for (var object : jobState .resources .values ()) {
371
+ if (object .getObjectType () == ObjectType .MODEL ) {
372
+ if (object .getModel ().getRepository ().equals (repoKey )) {
373
+ return true ;
374
+ }
375
+ }
376
+ }
377
+
378
+ return false ;
379
+ }
380
+
381
+ private PluginConfig translateResourceConfig (String resourceKey , ResourceDefinition resource , JobState jobState ) {
350
382
351
383
var pluginConfig = ConfigHelpers .resourceToPluginConfig (resource ).toBuilder ();
352
384
385
+ var tenantScope = String .format ("/%s/%s/" , ConfigKeys .TENANT_SCOPE , jobState .tenant );
386
+
353
387
for (var secretEntry : pluginConfig .getSecretsMap ().entrySet ()) {
354
388
355
- var propKey = secretEntry .getKey ();
356
- var secretKey = secretEntry .getValue ();
357
- var secret = configManager .loadPassword (secretKey );
389
+ var propertyName = secretEntry .getKey ();
390
+ var secretAlias = secretEntry .getValue ();
391
+
392
+ // Secret loader will not load the secret if the alias is not valid
393
+ // This handling provides more meaningful errors
394
+ if (secretAlias .isBlank () || !secretAlias .startsWith (tenantScope )) {
395
+
396
+ var message = String .format ("Resource configuration for [%s] is not valid" , resourceKey );
397
+ var detail = String .format ("Inconsistent secret alias for [%s]" , propertyName );
398
+
399
+ log .error ("{}: {}" , message , detail );
400
+ throw new EConsistencyValidation (message );
401
+ }
402
+
403
+ var secret = configManager .loadPassword (secretAlias );
358
404
359
- pluginConfig .putProperties (propKey , secret );
405
+ pluginConfig .putProperties (propertyName , secret );
360
406
}
361
407
362
408
pluginConfig .clearSecrets ();
0 commit comments