Skip to content

Commit 7183d28

Browse files
committed
feat(ui): Add package configuration provider form data
Add package configuration provider fields to the create-run form schema, default values, rerun restoration, validation, and payload conversion. Selected providers are submitted via `jobConfigs.evaluator.packageConfigurationProviders`, or via `jobConfigs.reporter.packageConfigurationProviders` when the evaluator job is disabled. Signed-off-by: Jyrki Keisala <jyrki.keisala@doubleopen.io>
1 parent 3daa12a commit 7183d28

4 files changed

Lines changed: 657 additions & 119 deletions

File tree

ui/src/routes/organizations/$orgId/products/$productId/repositories/$repoId/_repo-layout/create-run/-components/default-values.ts

Lines changed: 160 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,8 @@ export function defaultValues(
3737
advisorPlugins: PreconfiguredPluginDescriptor[],
3838
scannerPlugins: PreconfiguredPluginDescriptor[],
3939
isSuperuser: boolean,
40-
packageCurationProviderPlugins: PreconfiguredPluginDescriptor[]
40+
packageCurationProviderPlugins: PreconfiguredPluginDescriptor[],
41+
packageConfigurationProviderPlugins: PreconfiguredPluginDescriptor[] = []
4142
): CreateRunFormValues {
4243
/**
4344
* Constructs the default options for a package manager, either as a blank set of options
@@ -93,6 +94,16 @@ export function defaultValues(
9394
const packageCurationProviderFormValues = providerPluginConfigsToFormValues(
9495
ortRun?.jobConfigs.analyzer?.packageCurationProviders
9596
);
97+
const packageConfigurationProviderPluginDefaultValues =
98+
getPluginDefaultValues(packageConfigurationProviderPlugins);
99+
const evaluatorPackageConfigurationProviderFormValues =
100+
providerPluginConfigsToFormValues(
101+
ortRun?.jobConfigs.evaluator?.packageConfigurationProviders
102+
);
103+
const reporterPackageConfigurationProviderFormValues =
104+
providerPluginConfigsToFormValues(
105+
ortRun?.jobConfigs.reporter?.packageConfigurationProviders
106+
);
96107
const scannerDefaults = {
97108
scanners: ['ScanCode'],
98109
scannerScopes: {
@@ -170,12 +181,18 @@ export function defaultValues(
170181
copyrightGarbageFile: '',
171182
resolutionsFile: '',
172183
keepAliveWorker: false,
184+
packageConfigurationProviders: [],
185+
packageConfigurationProviderConfig:
186+
packageConfigurationProviderPluginDefaultValues,
173187
},
174188
reporter: {
175189
enabled: true,
176190
formats: ['CycloneDX', 'SpdxDocument', 'WebApp'],
177191
deduplicateDependencyTree: false,
178192
keepAliveWorker: false,
193+
packageConfigurationProviders: [],
194+
packageConfigurationProviderConfig:
195+
packageConfigurationProviderPluginDefaultValues,
179196
},
180197
notifier: {
181198
enabled: false,
@@ -289,6 +306,12 @@ export function defaultValues(
289306
enabled:
290307
ortRun.jobConfigs.evaluator !== undefined &&
291308
ortRun.jobConfigs.evaluator !== null,
309+
packageConfigurationProviders:
310+
evaluatorPackageConfigurationProviderFormValues.selectedPluginIds,
311+
packageConfigurationProviderConfig: mergePluginConfigs(
312+
evaluatorPackageConfigurationProviderFormValues.config,
313+
packageConfigurationProviderPluginDefaultValues
314+
),
292315
keepAliveWorker:
293316
(ortRun.jobConfigs.evaluator?.keepAliveWorker && isSuperuser) ||
294317
baseDefaults.jobConfigs.evaluator.keepAliveWorker,
@@ -303,6 +326,12 @@ export function defaultValues(
303326
) || baseDefaults.jobConfigs.reporter.formats,
304327
deduplicateDependencyTree:
305328
deduplicateDependencyTreeEnabled || undefined,
329+
packageConfigurationProviders:
330+
reporterPackageConfigurationProviderFormValues.selectedPluginIds,
331+
packageConfigurationProviderConfig: mergePluginConfigs(
332+
reporterPackageConfigurationProviderFormValues.config,
333+
packageConfigurationProviderPluginDefaultValues
334+
),
306335
keepAliveWorker:
307336
(ortRun.jobConfigs.reporter?.keepAliveWorker && isSuperuser) ||
308337
baseDefaults.jobConfigs.reporter.keepAliveWorker,
@@ -443,6 +472,136 @@ if (import.meta.vitest) {
443472
});
444473
});
445474

475+
it('uses package configuration provider plugin default values for fresh runs', () => {
476+
const defaults = defaultValues(
477+
null,
478+
[],
479+
[],
480+
false,
481+
[],
482+
[
483+
{
484+
id: 'OrtConfig',
485+
type: 'PACKAGE_CONFIGURATION_PROVIDER',
486+
displayName: 'ORT Config',
487+
summary: 'A package configuration provider plugin',
488+
description: 'A package configuration provider plugin.',
489+
options: [
490+
{
491+
name: 'path',
492+
description: 'Provider path.',
493+
type: 'STRING',
494+
defaultValue: 'package-configurations.yml',
495+
isFixed: true,
496+
isNullable: false,
497+
isRequired: true,
498+
},
499+
],
500+
},
501+
]
502+
);
503+
504+
expect(defaults.jobConfigs.evaluator.packageConfigurationProviders).toEqual(
505+
[]
506+
);
507+
expect(
508+
defaults.jobConfigs.evaluator.packageConfigurationProviderConfig
509+
).toEqual({
510+
OrtConfig: {
511+
options: {
512+
path: 'package-configurations.yml',
513+
},
514+
secrets: {},
515+
},
516+
});
517+
expect(defaults.jobConfigs.reporter.packageConfigurationProviders).toEqual(
518+
[]
519+
);
520+
expect(
521+
defaults.jobConfigs.reporter.packageConfigurationProviderConfig
522+
).toEqual({
523+
OrtConfig: {
524+
options: {
525+
path: 'package-configurations.yml',
526+
},
527+
secrets: {},
528+
},
529+
});
530+
});
531+
532+
it('preserves package configuration provider config from reruns', () => {
533+
const ortRun = {
534+
revision: 'main',
535+
path: '',
536+
jobConfigs: {
537+
evaluator: {
538+
packageConfigurationProviders: [
539+
{
540+
type: 'OrtConfig',
541+
id: 'OrtConfig',
542+
enabled: true,
543+
options: {
544+
path: 'evaluator-package-configurations.yml',
545+
},
546+
secrets: {
547+
token: 'evaluator-token',
548+
},
549+
},
550+
],
551+
},
552+
reporter: {
553+
packageConfigurationProviders: [
554+
{
555+
type: 'OrtConfig',
556+
id: 'OrtConfig',
557+
enabled: true,
558+
options: {
559+
path: 'reporter-package-configurations.yml',
560+
},
561+
secrets: {
562+
token: 'reporter-token',
563+
},
564+
},
565+
],
566+
},
567+
},
568+
labels: {},
569+
} as unknown as OrtRun;
570+
571+
const defaults = defaultValues(ortRun, [], [], false, []);
572+
573+
expect(defaults.jobConfigs.evaluator.packageConfigurationProviders).toEqual(
574+
['OrtConfig']
575+
);
576+
expect(
577+
defaults.jobConfigs.evaluator.packageConfigurationProviderConfig
578+
).toEqual({
579+
OrtConfig: {
580+
options: {
581+
path: 'evaluator-package-configurations.yml',
582+
},
583+
secrets: {
584+
token: 'evaluator-token',
585+
},
586+
},
587+
});
588+
expect(defaults.jobConfigs.reporter.packageConfigurationProviders).toEqual([
589+
'OrtConfig',
590+
]);
591+
expect(
592+
defaults.jobConfigs.reporter.packageConfigurationProviderConfig
593+
).toEqual({
594+
OrtConfig: {
595+
options: {
596+
path: 'reporter-package-configurations.yml',
597+
},
598+
secrets: {
599+
token: 'reporter-token',
600+
},
601+
},
602+
});
603+
});
604+
446605
it('uses scanner plugin default values for fresh runs', () => {
447606
const defaults = defaultValues(
448607
null,

ui/src/routes/organizations/$orgId/products/$productId/repositories/$repoId/_repo-layout/create-run/-components/payload.ts

Lines changed: 158 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919

2020
import {
2121
AnalyzerJobConfiguration,
22+
EvaluatorJobConfiguration,
2223
PostRepositoryRun,
2324
ReporterJobConfiguration,
2425
} from '@/api';
@@ -228,8 +229,13 @@ export function formValuesToPayload(
228229
// Evaluator configuration
229230
//
230231

231-
const evaluatorConfig = values.jobConfigs.evaluator.enabled
232+
const evaluatorConfig: EvaluatorJobConfiguration | undefined = values
233+
.jobConfigs.evaluator.enabled
232234
? {
235+
packageConfigurationProviders: createProviderPluginPayload(
236+
values.jobConfigs.evaluator.packageConfigurationProviderConfig,
237+
values.jobConfigs.evaluator.packageConfigurationProviders
238+
),
233239
keepAliveWorker:
234240
values.jobConfigs.evaluator.keepAliveWorker || undefined,
235241
}
@@ -290,6 +296,12 @@ export function formValuesToPayload(
290296
? {
291297
formats: values.jobConfigs.reporter.formats,
292298
config: Object.keys(config).length > 0 ? config : undefined,
299+
packageConfigurationProviders: evaluatorConfig
300+
? undefined
301+
: createProviderPluginPayload(
302+
values.jobConfigs.reporter.packageConfigurationProviderConfig,
303+
values.jobConfigs.reporter.packageConfigurationProviders
304+
),
293305
keepAliveWorker:
294306
values.jobConfigs.reporter.keepAliveWorker || undefined,
295307
}
@@ -449,6 +461,151 @@ if (import.meta.vitest) {
449461
).toBeUndefined();
450462
});
451463

464+
it('adds selected evaluator package configuration providers', () => {
465+
const values = createFormValues();
466+
values.jobConfigs.evaluator.packageConfigurationProviders = ['OrtConfig'];
467+
values.jobConfigs.evaluator.packageConfigurationProviderConfig = {
468+
OrtConfig: {
469+
options: {
470+
path: 'evaluator-package-configurations.yml',
471+
},
472+
secrets: {
473+
token: 'evaluator-token',
474+
},
475+
},
476+
File: {
477+
options: {
478+
path: 'ignored-package-configurations.yml',
479+
},
480+
secrets: {},
481+
},
482+
};
483+
484+
const payload = formValuesToPayload(values);
485+
486+
expect(
487+
payload.jobConfigs.evaluator?.packageConfigurationProviders
488+
).toEqual([
489+
{
490+
type: 'OrtConfig',
491+
id: 'OrtConfig',
492+
enabled: true,
493+
options: {
494+
path: 'evaluator-package-configurations.yml',
495+
},
496+
secrets: {
497+
token: 'evaluator-token',
498+
},
499+
},
500+
]);
501+
});
502+
503+
it('adds selected reporter package configuration providers when evaluator is disabled', () => {
504+
const values = createFormValues();
505+
values.jobConfigs.evaluator.enabled = false;
506+
values.jobConfigs.reporter.packageConfigurationProviders = ['OrtConfig'];
507+
values.jobConfigs.reporter.packageConfigurationProviderConfig = {
508+
OrtConfig: {
509+
options: {
510+
path: 'reporter-package-configurations.yml',
511+
},
512+
secrets: {
513+
token: 'reporter-token',
514+
},
515+
},
516+
};
517+
518+
const payload = formValuesToPayload(values);
519+
520+
expect(payload.jobConfigs.evaluator).toBeUndefined();
521+
expect(
522+
payload.jobConfigs.reporter?.packageConfigurationProviders
523+
).toEqual([
524+
{
525+
type: 'OrtConfig',
526+
id: 'OrtConfig',
527+
enabled: true,
528+
options: {
529+
path: 'reporter-package-configurations.yml',
530+
},
531+
secrets: {
532+
token: 'reporter-token',
533+
},
534+
},
535+
]);
536+
});
537+
538+
it('omits package configuration providers if none are selected', () => {
539+
const values = createFormValues();
540+
values.jobConfigs.evaluator.packageConfigurationProviders = [];
541+
values.jobConfigs.evaluator.packageConfigurationProviderConfig = {
542+
OrtConfig: {
543+
options: {
544+
path: 'evaluator-package-configurations.yml',
545+
},
546+
secrets: {},
547+
},
548+
};
549+
values.jobConfigs.reporter.packageConfigurationProviders = [];
550+
values.jobConfigs.reporter.packageConfigurationProviderConfig = {
551+
OrtConfig: {
552+
options: {
553+
path: 'reporter-package-configurations.yml',
554+
},
555+
secrets: {},
556+
},
557+
};
558+
559+
const payload = formValuesToPayload(values);
560+
561+
expect(
562+
payload.jobConfigs.evaluator?.packageConfigurationProviders
563+
).toBeUndefined();
564+
expect(
565+
payload.jobConfigs.reporter?.packageConfigurationProviders
566+
).toBeUndefined();
567+
});
568+
569+
it('omits reporter package configuration providers when evaluator is enabled', () => {
570+
const values = createFormValues();
571+
values.jobConfigs.evaluator.packageConfigurationProviders = ['OrtConfig'];
572+
values.jobConfigs.evaluator.packageConfigurationProviderConfig = {
573+
OrtConfig: {
574+
options: {
575+
path: 'evaluator-package-configurations.yml',
576+
},
577+
secrets: {},
578+
},
579+
};
580+
values.jobConfigs.reporter.packageConfigurationProviders = ['File'];
581+
values.jobConfigs.reporter.packageConfigurationProviderConfig = {
582+
File: {
583+
options: {
584+
path: 'reporter-package-configurations.yml',
585+
},
586+
secrets: {},
587+
},
588+
};
589+
590+
const payload = formValuesToPayload(values);
591+
592+
expect(
593+
payload.jobConfigs.evaluator?.packageConfigurationProviders
594+
).toEqual([
595+
{
596+
type: 'OrtConfig',
597+
id: 'OrtConfig',
598+
enabled: true,
599+
options: {
600+
path: 'evaluator-package-configurations.yml',
601+
},
602+
},
603+
]);
604+
expect(
605+
payload.jobConfigs.reporter?.packageConfigurationProviders
606+
).toBeUndefined();
607+
});
608+
452609
it('omits infrastructure services from environment configs', () => {
453610
const values = createFormValues();
454611
values.jobConfigs.analyzer.environmentDefinitions = {

0 commit comments

Comments
 (0)