Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

OCPBUGS-12891: check for valid OLM selector in K8sResourceWidget to p… #12887

Merged
merged 1 commit into from Jul 10, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
Expand Up @@ -5,10 +5,10 @@ import { WidgetProps } from '@rjsf/core';
import { getSchemaType } from '@rjsf/core/dist/cjs/utils';
import * as _ from 'lodash';
import { useTranslation } from 'react-i18next';
import { Selector } from '@console/dynamic-plugin-sdk/src/api/common-types';
import { RadioGroup } from '@console/internal/components/radio';
import { NumberSpinner, ListDropdown, Dropdown } from '@console/internal/components/utils';
import { K8sKind, GroupVersionKind, ImagePullPolicy } from '@console/internal/module/k8s';
import { selectorFromString } from '@console/internal/module/k8s/selector';
import { JSON_SCHEMA_NUMBER_TYPES } from './const';
import { DynamicFormFieldOptionsList } from './types';

Expand Down Expand Up @@ -124,15 +124,29 @@ export const K8sResourceWidget: React.FC<K8sResourceWidgetProps> = ({
const { model, groupVersionKind, selector } = options;
const { namespace } = formContext;
const selectedKey = value ? `${value}-${groupVersionKind}` : null;

const selectorObj = React.useMemo(() => {
try {
return selectorFromString(selector);
} catch (e) {
// eslint-disable-next-line no-console
console.error(
`Invalid selector string provided to K8sResourceWidget: '${selector}'. If using OLM descriptors, please validate the provided selector.`,
);
}
return null;
}, [selector]);
return (
<div>
{!_.isUndefined(model) ? (
<ListDropdown
key={id}
id={id}
resources={[
{ kind: groupVersionKind, selector, namespace: model.namespaced ? namespace : null },
{
kind: groupVersionKind,
selector: selectorObj,
namespace: model.namespaced ? namespace : null,
},
]}
desc={label}
placeholder={t('console-shared~Select {{label}}', { label: model.label })}
Expand Down Expand Up @@ -200,7 +214,7 @@ type K8sResourceWidgetProps = WidgetProps & {
options: {
model: K8sKind;
groupVersionKind: GroupVersionKind;
selector: Selector;
selector: string;
};
};

Expand Down
@@ -1,5 +1,4 @@
import { ServiceAccountModel } from '@console/internal/models';
import { selectorFromString } from '@console/internal/module/k8s/selector';
import { getJSONSchemaOrder } from '@console/shared/src/components/dynamic-form/utils';
import { SpecCapability } from '../descriptors/types';
import { capabilitiesToUISchema } from './utils';
Expand Down Expand Up @@ -107,9 +106,7 @@ describe('capabilitiesToUISchema', () => {
expect(uiSchema['ui:widget']).toEqual('K8sResourceWidget');
expect(uiSchema['ui:options'].model).toEqual(ServiceAccountModel);
expect(uiSchema['ui:options'].groupVersionKind).toEqual('ServiceAccount');
expect(uiSchema['ui:options'].selector).toEqual(
selectorFromString('label!=test,level=production'),
);
expect(uiSchema['ui:options'].selector).toEqual('label!=test,level=production');
});
it('Handles SpecCapability.k8sResourcePrefix with set-based label queries', () => {
const uiSchema = capabilitiesToUISchema([
Expand All @@ -118,9 +115,7 @@ describe('capabilitiesToUISchema', () => {
expect(uiSchema['ui:widget']).toEqual('K8sResourceWidget');
expect(uiSchema['ui:options'].model).toEqual(ServiceAccountModel);
expect(uiSchema['ui:options'].groupVersionKind).toEqual('ServiceAccount');
expect(uiSchema['ui:options'].selector).toEqual(
selectorFromString('level in (production, qa)'),
);
expect(uiSchema['ui:options'].selector).toEqual('level in (production,qa)');
});
it('Handles SpecCapablitiy.select', () => {
const uiSchema = capabilitiesToUISchema([
Expand Down
Expand Up @@ -4,7 +4,6 @@ import { JSONSchema7 } from 'json-schema';
import * as _ from 'lodash';
import i18n from '@console/internal/i18n';
import { modelFor } from '@console/internal/module/k8s';
import { selectorFromString } from '@console/internal/module/k8s/selector';
import { getSchemaAtPath } from '@console/shared';
import {
getJSONSchemaOrder,
Expand Down Expand Up @@ -34,16 +33,14 @@ export const hideAllExistingProperties = (schema: JSONSchema7) => {
};

const k8sResourceCapabilityToUISchema = (capability: SpecCapability): UiSchema => {
const [, groupVersionKindToken, selectorToken] =
capability.match(REGEXP_K8S_RESOURCE_SUFFIX) ?? [];
const [, groupVersionKindToken, selector] = capability.match(REGEXP_K8S_RESOURCE_SUFFIX) ?? [];
const groupVersionKind = groupVersionKindToken?.replace(/:/g, '~');
const selector = selectorFromString(selectorToken);

const model = groupVersionKind && modelFor(groupVersionKind);
if (model) {
return {
'ui:widget': 'K8sResourceWidget',
'ui:options': { model, groupVersionKind, selector },
'ui:options': { model, groupVersionKind, ...(selector ? { selector } : {}) },
};
}
return {};
Expand Down