Skip to content

Commit

Permalink
include OpenShift ns for picking up images for user role doesn't have…
Browse files Browse the repository at this point in the history
… access to ns
  • Loading branch information
invincibleJai committed Apr 28, 2020
1 parent 7de6dd1 commit 031e682
Show file tree
Hide file tree
Showing 4 changed files with 51 additions and 27 deletions.
Expand Up @@ -34,6 +34,10 @@ interface State {
title: React.ReactNode;
}

export interface ResourceDropdownItems {
[key: string]: string | React.ReactElement;
}

interface ResourceDropdownProps {
id?: string;
className?: string;
Expand Down Expand Up @@ -63,9 +67,10 @@ interface ResourceDropdownProps {
autoSelect?: boolean;
resourceFilter?: (resource: K8sResourceKind) => boolean;
onChange?: (key: string, name?: string | object, isListEmpty?: boolean) => void;
onLoad?: (items: { [key: string]: string }) => void;
onLoad?: (items: ResourceDropdownItems) => void;
showBadge?: boolean;
autocompleteFilter?: (strText: string, item: object) => boolean;
appendItems?: ResourceDropdownItems;
}

class ResourceDropdown extends React.Component<ResourceDropdownProps, State> {
Expand Down Expand Up @@ -143,10 +148,11 @@ class ResourceDropdown extends React.Component<ResourceDropdownProps, State> {
transformLabel,
allSelectorItem,
showBadge = false,
appendItems,
}: ResourceDropdownProps,
updateSelection: boolean,
) => {
const unsortedList = {};
let unsortedList = {};
_.each(resources, ({ data, kind }) => {
_.reduce(
data,
Expand Down Expand Up @@ -181,6 +187,12 @@ class ResourceDropdown extends React.Component<ResourceDropdownProps, State> {
sortedList[allSelectorItem.allSelectorKey] = allSelectorItem.allSelectorTitle;
}

_.keys(appendItems).forEach((key) => {
if (!_.has(unsortedList, key)) {
unsortedList = { ...unsortedList, ...{ [key]: appendItems[key] } };
}
});

_.keys(unsortedList)
.sort()
.forEach((key) => {
Expand Down
Expand Up @@ -4,7 +4,7 @@ import { useField, useFormikContext, FormikValues } from 'formik';
import { FormGroup } from '@patternfly/react-core';
import { K8sResourceKind } from '@console/internal/module/k8s';
import { Firehose, FirehoseResource } from '@console/internal/components/utils';
import ResourceDropdown from '../dropdown/ResourceDropdown';
import ResourceDropdown, { ResourceDropdownItems } from '../dropdown/ResourceDropdown';
import { DropdownFieldProps } from './field-types';
import { getFieldId } from './field-utils';
import { useFormikValidationFix } from '../../hooks';
Expand All @@ -13,7 +13,7 @@ export interface ResourceDropdownFieldProps extends DropdownFieldProps {
dataSelector: string[] | number[] | symbol[];
resources: FirehoseResource[];
showBadge?: boolean;
onLoad?: (items: { [key: string]: string }) => void;
onLoad?: (items: ResourceDropdownItems) => void;
onChange?: (key: string, name?: string | object) => void;
resourceFilter?: (resource: K8sResourceKind) => boolean;
autoSelect?: boolean;
Expand All @@ -22,6 +22,7 @@ export interface ResourceDropdownFieldProps extends DropdownFieldProps {
actionTitle: string;
actionKey: string;
}[];
appendItems?: ResourceDropdownItems;
}

const ResourceDropdownField: React.FC<ResourceDropdownFieldProps> = ({
Expand Down
Expand Up @@ -61,7 +61,9 @@ const ImageStream: React.FC = () => {
} = state;

React.useEffect(() => {
setFieldValue('imageStream.grantAccess', true);
if (imageStream.namespace !== BuilderImagesNamespace.Openshift) {
setFieldValue('imageStream.grantAccess', true);
}
}, [imageStream.namespace, setFieldValue]);
const imageStreamTagList = getImageStreamTags(selectedImageStream as K8sResourceKind);
const isNamespaceSelected = imageStream.namespace !== '' && !accessLoading;
Expand Down
Expand Up @@ -4,7 +4,7 @@ import { k8sGet } from '@console/internal/module/k8s';
import { RoleBindingModel } from '@console/internal/models';
import { checkAccess } from '@console/internal/components/utils';
import { ResourceDropdownField } from '@console/shared';
import { getProjectResource } from '../../../utils/imagestream-utils';
import { getProjectResource, BuilderImagesNamespace } from '../../../utils/imagestream-utils';
import { ImageStreamActions as Action } from '../import-types';
import { ImageStreamContext } from './ImageStreamContext';

Expand All @@ -19,28 +19,36 @@ const ImageStreamNsDropdown: React.FC = () => {
setFieldValue('isi', initialValues.isi);
dispatch({ type: Action.setLoading, value: true });
dispatch({ type: Action.setAccessLoading, value: true });
promiseArr.push(
checkAccess({
group: RoleBindingModel.apiGroup,
resource: RoleBindingModel.plural,
verb: 'create',
name: 'system:image-puller',
namespace: selectedProject,
})
.then((resp) => dispatch({ type: Action.setHasCreateAccess, value: resp.status.allowed }))
.catch(() => dispatch({ type: Action.setHasAccessToPullImage, value: false })),
);
promiseArr.push(
k8sGet(RoleBindingModel, 'system:image-puller', selectedProject)
.then(() => {
dispatch({
type: Action.setHasAccessToPullImage,
value: true,
});
setFieldValue('imageStream.grantAccess', false);
if (selectedProject === BuilderImagesNamespace.Openshift) {
dispatch({ type: Action.setHasCreateAccess, value: true });
dispatch({ type: Action.setHasAccessToPullImage, value: true });
setFieldValue('imageStream.grantAccess', false);
} else {
promiseArr.push(
checkAccess({
group: RoleBindingModel.apiGroup,
resource: RoleBindingModel.plural,
verb: 'create',
name: 'system:image-puller',
namespace: selectedProject,
})
.catch(() => dispatch({ type: Action.setHasAccessToPullImage, value: false })),
);
.then((resp) =>
dispatch({ type: Action.setHasCreateAccess, value: resp.status.allowed }),
)
.catch(() => dispatch({ type: Action.setHasAccessToPullImage, value: false })),
);
promiseArr.push(
k8sGet(RoleBindingModel, 'system:image-puller', selectedProject)
.then(() => {
dispatch({
type: Action.setHasAccessToPullImage,
value: true,
});
setFieldValue('imageStream.grantAccess', false);
})
.catch(() => dispatch({ type: Action.setHasAccessToPullImage, value: false })),
);
}
return Promise.all(promiseArr).then(() =>
dispatch({ type: Action.setAccessLoading, value: false }),
);
Expand Down Expand Up @@ -80,6 +88,7 @@ const ImageStreamNsDropdown: React.FC = () => {
resources={getProjectResource()}
dataSelector={['metadata', 'name']}
onChange={onDropdownChange}
appendItems={{ openshift: BuilderImagesNamespace.Openshift }}
/>
);
};
Expand Down

0 comments on commit 031e682

Please sign in to comment.