Skip to content

Commit d9991ed

Browse files
Merge pull request #2577 from upalatucci/storagemigrationpage
CNV-58541: add storage migration page
2 parents 7ed136d + 3331129 commit d9991ed

27 files changed

+596
-15
lines changed

locales/en/plugin__kubevirt-plugin.json

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -784,6 +784,8 @@
784784
"Migration completed successfully": "Migration completed successfully",
785785
"Migration details": "Migration details",
786786
"Migration metrics": "Migration metrics",
787+
"Migration plan is pending": "Migration plan is pending",
788+
"Migration started": "Migration started",
787789
"Migration Toolkit for Virtualization": "Migration Toolkit for Virtualization",
788790
"Migration type": "Migration type",
789791
"MigrationPolicies": "MigrationPolicies",
@@ -891,6 +893,7 @@
891893
"No snapshots found": "No snapshots found",
892894
"No SSH keys found": "No SSH keys found",
893895
"No storage checkups found": "No storage checkups found",
896+
"No storage migration found": "No storage migration found",
894897
"No subscription": "No subscription",
895898
"No Template found": "No Template found",
896899
"No Template items are being shown due to the filters being applied.": "No Template items are being shown due to the filters being applied.",
@@ -1253,6 +1256,9 @@
12531256
"Storage class with empty claimPropertySets": "Storage class with empty claimPropertySets",
12541257
"Storage IOPS": "Storage IOPS",
12551258
"Storage IOPS total read / write": "Storage IOPS total read / write",
1259+
"Storage migration": "Storage migration",
1260+
"Storage Migration": "Storage Migration",
1261+
"Storage MigrationPlans": "Storage MigrationPlans",
12561262
"Storage missing VolumeSnapshotClass": "Storage missing VolumeSnapshotClass",
12571263
"Storage operator": "Storage operator",
12581264
"Storage requirements": "Storage requirements",
@@ -1536,6 +1542,7 @@
15361542
"Volume snapshot": "Volume snapshot",
15371543
"Volume snapshot status": "Volume snapshot status",
15381544
"Volume Snapshot Status is a mechanism for reporting if a volume can be snapshotted or not.": "Volume Snapshot Status is a mechanism for reporting if a volume can be snapshotted or not.",
1545+
"Volumes": "Volumes",
15391546
"Volumes project": "Volumes project",
15401547
"VolumeSnapshot is required.": "VolumeSnapshot is required.",
15411548
"VolumeSnapshot name": "VolumeSnapshot name",

plugin-extensions.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import { extensions as utilsExtensions } from './src/utils/extension';
55
import { extensions as CDIUploadProviderExtensions } from './src/views/cdi-upload-provider/extensions';
66
import { extensions as CheckupsExtensions } from './src/views/checkups/extensions';
77
import { extensions as dashboardExtensionsExtensions } from './src/views/dashboard-extensions/extensions';
8+
import { extensions as StorageMigrationExtensions } from './src/views/storagemigrations/extensions';
89
import { extensions as VirtualMachinesExtensions } from './src/views/virtualmachines/extensions';
910

1011
const extensions: EncodedExtension[] = [
@@ -14,6 +15,7 @@ const extensions: EncodedExtension[] = [
1415
...utilsExtensions,
1516
...VirtualMachinesExtensions,
1617
...CDIUploadProviderExtensions,
18+
...StorageMigrationExtensions,
1719
{
1820
properties: {
1921
flag: 'KUBEVIRT_CDI',

plugin-metadata.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import { exposedModules as utilsExposedModules } from './src/utils/extension';
55
import { exposedModules as CDIUploadProviderExposedModules } from './src/views/cdi-upload-provider/extensions';
66
import { exposedModules as CheckupsExposedModules } from './src/views/checkups/extensions';
77
import { exposedModules as dashboardExtensionsExposedModules } from './src/views/dashboard-extensions/extensions';
8+
import { exposedModules as StorageMigrationExposedModules } from './src/views/storagemigrations/extensions';
89
import { exposedModules as VirtualMachinesExposedModules } from './src/views/virtualmachines/extensions';
910

1011
const metadata: ConsolePluginBuildMetadata = {
@@ -19,6 +20,7 @@ const metadata: ConsolePluginBuildMetadata = {
1920
...utilsExposedModules,
2021
...VirtualMachinesExposedModules,
2122
...CDIUploadProviderExposedModules,
23+
...StorageMigrationExposedModules,
2224
BootableVolumesList: './views/bootablevolumes/list/BootableVolumesList.tsx',
2325
Catalog: './views/catalog/Catalog.tsx',
2426
ClusterOverviewPage: './views/clusteroverview/ClusterOverviewPage.tsx',

src/utils/extension.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,4 +96,9 @@ export const extensions: EncodedExtension[] = [
9696
},
9797
type: 'console.telemetry/listener',
9898
} as EncodedExtension<TelemetryListener>,
99+
100+
{
101+
properties: { handler: { $codeRef: 'kubevirtFlags.useStorageMigrationEnabled' } },
102+
type: 'console.flag/hookProvider',
103+
} as EncodedExtension<FeatureFlagHookProvider>,
99104
];

src/utils/flags/consts.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,5 @@ export const FLAG_KUBEVIRT_CDI = 'KUBEVIRT_CDI';
33
export const FLAG_CONSOLE_CLI_DOWNLOAD = 'CONSOLE_CLI_DOWNLOAD';
44
export const FLAG_KUBEVIRT_PREFERENCES = 'KUBEVIRT_PREFERENCES';
55
export const FLAG_KUBEVIRT_INSTANCETYPES = 'KUBEVIRT_INSTANCETYPES';
6+
7+
export const FLAG_STORAGE_MIGRATION_ENABLED = 'STORAGE_MIGRATION_ENABLED';

src/utils/flags/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
11
export { enableKubevirtDynamicFlag } from './enableKubevirtDynamicFlag';
22
export { default as useEnableKubevirtMenuFlags } from './useEnableKubevirtMenuFlags';
3+
export { default as useStorageMigrationEnabled } from './useStorageMigrationEnabled';
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
import {
2+
DEFAULT_MIGRATION_NAMESPACE,
3+
MigPlanModel,
4+
} from '@kubevirt-utils/resources/migrations/constants';
5+
import { isEmpty } from '@kubevirt-utils/utils/utils';
6+
import {
7+
getGroupVersionKindForModel,
8+
SetFeatureFlag,
9+
useAccessReview,
10+
useK8sModel,
11+
} from '@openshift-console/dynamic-plugin-sdk';
12+
13+
import { FLAG_STORAGE_MIGRATION_ENABLED } from './consts';
14+
15+
const useStorageMigrationEnabled = (setFeatureFlag: SetFeatureFlag) => {
16+
const [model] = useK8sModel(getGroupVersionKindForModel(MigPlanModel));
17+
const [haveAccessToMigrationNamespace] = useAccessReview({
18+
group: model?.apiGroup,
19+
namespace: DEFAULT_MIGRATION_NAMESPACE,
20+
resource: model?.plural,
21+
verb: 'list',
22+
});
23+
24+
setFeatureFlag(FLAG_STORAGE_MIGRATION_ENABLED, !isEmpty(model) && haveAccessToMigrationNamespace);
25+
};
26+
27+
export default useStorageMigrationEnabled;

src/utils/i18n.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,3 +41,4 @@
4141
// t('plugin__kubevirt-plugin~Node')
4242
// t('plugin__kubevirt-plugin~Create a Virtual Machine from a template')
4343
// t('plugin__kubevirt-plugin~Hardware Devices')
44+
// t('plugin__kubevirt-plugin~Storage MigrationPlans')

src/views/virtualmachines/actions/components/VirtualMachineMigration/constants.ts renamed to src/utils/resources/migrations/constants.ts

Lines changed: 52 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,42 @@ import {
44
K8sResourceCondition,
55
} from '@openshift-console/dynamic-plugin-sdk';
66

7-
export type MigPlan = K8sResourceCommon & { spec: any; status?: { suffix: string } };
7+
export const MIGRATION_PHASES = {
8+
Completed: 'Completed',
9+
Failed: 'Failed',
10+
InProgress: 'InProgress',
11+
Pending: 'Pending',
12+
};
13+
14+
export type PersistentVolumesMigPlan = {
15+
capacity: string;
16+
name: string;
17+
proposedCapacity: string;
18+
pvc: {
19+
accessModes: string[];
20+
name: string;
21+
namespace: string;
22+
volumeMode: string;
23+
};
24+
selection: {
25+
action: 'copy' | 'skip';
26+
copyMethod: string;
27+
storageClass: string;
28+
};
29+
storageClass: string;
30+
supported: {
31+
actions: string[];
32+
copyMethods: string[];
33+
};
34+
};
35+
36+
export type MigPlan = K8sResourceCommon & {
37+
spec: {
38+
[key: string]: any;
39+
persistentVolumes?: PersistentVolumesMigPlan[];
40+
};
41+
status?: { conditions: K8sResourceCondition[]; suffix: string };
42+
};
843

944
export const MigPlanModel: K8sModel = {
1045
abbr: 'MP',
@@ -32,6 +67,7 @@ export type MigMigration = K8sResourceCommon & {
3267
status?: {
3368
conditions?: K8sResourceCondition[];
3469
phase: string;
70+
startTimestamp?: string;
3571
};
3672
};
3773

@@ -58,11 +94,24 @@ export type LiveMigrationProgress = {
5894
vmNamespace: string;
5995
};
6096

97+
export type PodProgress = {
98+
lastObservedProgressPercent: string;
99+
pvcRef: {
100+
name: string;
101+
namespace: string;
102+
};
103+
totalElapsedTime: string;
104+
};
105+
61106
export type DirectVolumeMigration = K8sResourceCommon & {
62107
status?: {
108+
failedLiveMigration?: LiveMigrationProgress[];
109+
failedPods?: PodProgress[];
63110
phase: string;
64111
runningLiveMigration?: LiveMigrationProgress[];
112+
runningPods?: PodProgress[];
65113
successfulLiveMigration?: LiveMigrationProgress[];
114+
successfulPods?: PodProgress[];
66115
};
67116
};
68117

@@ -82,3 +131,5 @@ export const MigMigrationStatuses = {
82131
Completed: 'Completed',
83132
Failed: 'Failed',
84133
};
134+
135+
export const DEFAULT_MIGRATION_NAMESPACE = 'openshift-migration';
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
import { MigMigration } from './constants';
2+
3+
export const getMigMigrationStartTimestamp = (migMigration: MigMigration) =>
4+
migMigration?.status?.startTimestamp;

0 commit comments

Comments
 (0)