Skip to content

Commit

Permalink
Update some storage class logic, naming
Browse files Browse the repository at this point in the history
  • Loading branch information
jpuzz0 committed Aug 28, 2024
1 parent 9ac48d4 commit d1fb830
Show file tree
Hide file tree
Showing 5 changed files with 44 additions and 31 deletions.
5 changes: 1 addition & 4 deletions frontend/src/app/AppRoutes.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,6 @@ const AppRoutes: React.FC = () => {
const isJupyterEnabled = useCheckJupyterEnabled();
const isHomeAvailable = useIsAreaAvailable(SupportedArea.HOME).status;
const isConnectionTypesAvailable = useIsAreaAvailable(SupportedArea.CONNECTION_TYPES).status;
const isStorageClassesAvailable = useIsAreaAvailable(SupportedArea.STORAGE_CLASSES).status;

if (!isAllowed) {
return (
Expand Down Expand Up @@ -131,9 +130,7 @@ const AppRoutes: React.FC = () => {
{isConnectionTypesAvailable ? (
<Route path="/connectionTypes/*" element={<ConnectionTypeRoutes />} />
) : null}
{isStorageClassesAvailable && (
<Route path="/storageClasses/*" element={<StorageClassesPage />} />
)}
<Route path="/storageClasses/*" element={<StorageClassesPage />} />
<Route path="/modelRegistrySettings/*" element={<ModelRegistrySettingsRoutes />} />
<Route path="/groupSettings" element={<GroupSettingsPage />} />
</>
Expand Down
8 changes: 4 additions & 4 deletions frontend/src/k8sTypes.ts
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ export type StorageClassConfig = {
description?: string;
};

export enum Annotation {
export enum MetadataAnnotation {
StorageClassIsDefault = 'storageclass.kubernetes.io/is-default-class',
K8sDescription = 'kubernetes.io/description',
OdhStorageClassConfig = 'opendatahub.io/sc-config',
Expand All @@ -64,10 +64,10 @@ export enum Annotation {
type StorageClassAnnotations = Partial<{
// if true, enables any persistent volume claim (PVC) that does not specify a specific storage class to automatically be provisioned.
// Only one, if any, StorageClass per cluster can be set as default.
[Annotation.StorageClassIsDefault]: 'true' | 'false';
[MetadataAnnotation.StorageClassIsDefault]: 'true' | 'false';
// the description provided by the cluster admin or Container Storage Interface (CSI) provider
[Annotation.K8sDescription]: string;
[Annotation.OdhStorageClassConfig]: string;
[MetadataAnnotation.K8sDescription]: string;
[MetadataAnnotation.OdhStorageClassConfig]: string;
}>;

export type K8sDSGResource = K8sResourceCommon & {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import * as React from 'react';
import { AppContext } from '~/app/AppContext';
import { Annotation, StorageClassKind } from '~/k8sTypes';
import { SupportedArea, useIsAreaAvailable } from '~/concepts/areas';
import { MetadataAnnotation, StorageClassKind } from '~/k8sTypes';

const usePreferredStorageClass = (): StorageClassKind | undefined => {
const {
Expand All @@ -9,13 +10,16 @@ const usePreferredStorageClass = (): StorageClassKind | undefined => {
},
storageClasses,
} = React.useContext(AppContext);
const isStorageClassesAvailable = useIsAreaAvailable(SupportedArea.STORAGE_CLASSES).status;

const defaultClusterStorageClasses = storageClasses.filter(
(storageclass) =>

Check warning on line 16 in frontend/src/pages/projects/screens/spawner/storage/usePreferredStorageClass.ts

View check run for this annotation

Codecov / codecov/patch

frontend/src/pages/projects/screens/spawner/storage/usePreferredStorageClass.ts#L16

Added line #L16 was not covered by tests
storageclass.metadata.annotations?.[Annotation.StorageClassIsDefault] === 'true',
storageclass.metadata.annotations?.[MetadataAnnotation.StorageClassIsDefault] === 'true',
);

const configStorageClassName = notebookController?.storageClassName ?? '';
const configStorageClassName = !isStorageClassesAvailable
? notebookController?.storageClassName ?? ''

Check warning on line 21 in frontend/src/pages/projects/screens/spawner/storage/usePreferredStorageClass.ts

View check run for this annotation

Codecov / codecov/patch

frontend/src/pages/projects/screens/spawner/storage/usePreferredStorageClass.ts#L21

Added line #L21 was not covered by tests
: '';

if (defaultClusterStorageClasses.length !== 0) {
return undefined;
Expand Down
38 changes: 18 additions & 20 deletions frontend/src/pages/storageClasses/StorageClassesPage.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -10,49 +10,47 @@ import {
AlertActionCloseButton,
} from '@patternfly/react-core';

import { Annotation, StorageClassConfig } from '~/k8sTypes';
import { MetadataAnnotation, StorageClassConfig } from '~/k8sTypes';
import useStorageClasses from '~/concepts/k8s/useStorageClasses';
import { ProjectObjectType, typedEmptyImage } from '~/concepts/design/utils';
import ApplicationsPage from '~/pages/ApplicationsPage';
import { updateStorageClassConfig } from '~/services/StorageClassService';
import { getStorageClassConfig, isOpenshiftDefaultStorageClass } from './utils';

const StorageClassesPage: React.FC = () => {
const [storageClasses, storageClassesLoaded, storageClassesError] = useStorageClasses();
const [isAlertOpen, setIsAlertOpen] = React.useState(false);

const defaultStorageClass = storageClasses.find(
(storageClass) =>

Check warning on line 25 in frontend/src/pages/storageClasses/StorageClassesPage.tsx

View check run for this annotation

Codecov / codecov/patch

frontend/src/pages/storageClasses/StorageClassesPage.tsx#L25

Added line #L25 was not covered by tests
storageClass.metadata.annotations?.[Annotation.StorageClassIsDefault] === 'true',
isOpenshiftDefaultStorageClass(storageClass) ||
getStorageClassConfig(storageClass)?.isDefault,

Check warning on line 27 in frontend/src/pages/storageClasses/StorageClassesPage.tsx

View check run for this annotation

Codecov / codecov/patch

frontend/src/pages/storageClasses/StorageClassesPage.tsx#L27

Added line #L27 was not covered by tests
);

// Open default class alert when no default class exists
React.useEffect(() => {
setIsAlertOpen(!defaultStorageClass?.metadata.name);
}, [defaultStorageClass?.metadata.name]);

// Add storage class config annotations automatically for all storage classes without them
React.useEffect(() => {
storageClasses.forEach((storageClass, index) => {
storageClasses.forEach(async (storageClass, index) => {
const { metadata } = storageClass;
const { name: storageClassName } = metadata;

if (!metadata.annotations?.[Annotation.OdhStorageClassConfig]) {
const isDefault = defaultStorageClass?.metadata.uid === metadata.uid;
if (!metadata.annotations?.[MetadataAnnotation.OdhStorageClassConfig]) {
let isDefault = defaultStorageClass?.metadata.uid === metadata.uid;
let isEnabled = false;

Check warning on line 38 in frontend/src/pages/storageClasses/StorageClassesPage.tsx

View check run for this annotation

Codecov / codecov/patch

frontend/src/pages/storageClasses/StorageClassesPage.tsx#L37-L38

Added lines #L37 - L38 were not covered by tests

if (!defaultStorageClass) {
isDefault = index === 0;
isEnabled = true;

Check warning on line 42 in frontend/src/pages/storageClasses/StorageClassesPage.tsx

View check run for this annotation

Codecov / codecov/patch

frontend/src/pages/storageClasses/StorageClassesPage.tsx#L40-L42

Added lines #L40 - L42 were not covered by tests
}

const storageClassConfig: StorageClassConfig = {

Check warning on line 45 in frontend/src/pages/storageClasses/StorageClassesPage.tsx

View check run for this annotation

Codecov / codecov/patch

frontend/src/pages/storageClasses/StorageClassesPage.tsx#L45

Added line #L45 was not covered by tests
isDefault,
isEnabled,
displayName: storageClassName,
...(!defaultStorageClass
? {
isEnabled: true,
isDefault: index === 0,
}
: {
isDefault,
isEnabled: isDefault,
}),
lastModified: new Date().toISOString(),
};

updateStorageClassConfig(storageClassName, storageClassConfig);
await updateStorageClassConfig(storageClassName, storageClassConfig);
setIsAlertOpen(!defaultStorageClass?.metadata.name);

Check warning on line 53 in frontend/src/pages/storageClasses/StorageClassesPage.tsx

View check run for this annotation

Codecov / codecov/patch

frontend/src/pages/storageClasses/StorageClassesPage.tsx#L52-L53

Added lines #L52 - L53 were not covered by tests
}
});
}, [defaultStorageClass, storageClasses]);
Expand Down
14 changes: 14 additions & 0 deletions frontend/src/pages/storageClasses/utils.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
import { MetadataAnnotation, StorageClassConfig, StorageClassKind } from '~/k8sTypes';

export const getStorageClassConfig = (
storageClass: StorageClassKind,
): StorageClassConfig | undefined => {

Check warning on line 5 in frontend/src/pages/storageClasses/utils.ts

View check run for this annotation

Codecov / codecov/patch

frontend/src/pages/storageClasses/utils.ts#L4-L5

Added lines #L4 - L5 were not covered by tests
const storageClassConfig: StorageClassConfig | undefined = JSON.parse(
storageClass.metadata.annotations?.[MetadataAnnotation.OdhStorageClassConfig] || '',

Check warning on line 7 in frontend/src/pages/storageClasses/utils.ts

View check run for this annotation

Codecov / codecov/patch

frontend/src/pages/storageClasses/utils.ts#L7

Added line #L7 was not covered by tests
);

return storageClassConfig;

Check warning on line 10 in frontend/src/pages/storageClasses/utils.ts

View check run for this annotation

Codecov / codecov/patch

frontend/src/pages/storageClasses/utils.ts#L10

Added line #L10 was not covered by tests
};

export const isOpenshiftDefaultStorageClass = (storageClass: StorageClassKind): boolean =>
storageClass.metadata.annotations?.[MetadataAnnotation.StorageClassIsDefault] === 'true';

Check warning on line 14 in frontend/src/pages/storageClasses/utils.ts

View check run for this annotation

Codecov / codecov/patch

frontend/src/pages/storageClasses/utils.ts#L14

Added line #L14 was not covered by tests

0 comments on commit d1fb830

Please sign in to comment.