Skip to content

Commit d893888

Browse files
committed
Refactor volume deletion logic to use CustomObjectsApi and improve error handling
1 parent db7e7ad commit d893888

File tree

2 files changed

+36
-20
lines changed

2 files changed

+36
-20
lines changed

ui/src/services/k8s/Metalk8sLocalVolumeProvider.test.ts

Lines changed: 26 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,27 @@
11
import { CoreV1Api, CustomObjectsApi } from '@kubernetes/client-node';
2+
import { updateApiServerConfig } from './api';
23
import Metalk8sLocalVolumeProvider, {
34
VolumeType,
45
} from './Metalk8sLocalVolumeProvider';
5-
import { updateApiServerConfig } from './api';
6-
import { Metalk8sV1alpha1VolumeClient } from './Metalk8sVolumeClient.generated';
76

87
jest.mock('../k8s/api', () => ({
98
updateApiServerConfig: jest.fn(),
109
}));
1110

11+
const MOCK_GROUP = 'storage.metalk8s.scality.com';
12+
const MOCK_VERSION = 'v1alpha1';
13+
const MOCK_PLURAL = 'volumes';
14+
1215
describe('Metalk8sLocalVolumeProvider', () => {
1316
let provider: Metalk8sLocalVolumeProvider;
1417
const mockUrl = 'mock-url';
1518
const mockToken = jest.fn(() => Promise.resolve('mock-token'));
1619

1720
const mockCustomObjectsApi = {
1821
listClusterCustomObject: jest.fn(),
22+
deleteClusterCustomObject: jest.fn(),
1923
} as unknown as CustomObjectsApi;
2024

21-
const mockVolumeClient = {
22-
deleteMetalk8sV1alpha1Volume: jest.fn().mockResolvedValue({ body: {} }),
23-
getMetalk8sV1alpha1VolumeList: jest.fn(),
24-
getMetalk8sV1alpha1Volume: jest.fn(),
25-
createMetalk8sV1alpha1Volume: jest.fn(),
26-
patchMetalk8sV1alpha1Volume: jest.fn(),
27-
} as unknown as Metalk8sV1alpha1VolumeClient;
28-
2925
const mockCoreV1Api = {
3026
listNode: jest.fn(),
3127
listPersistentVolume: jest.fn(),
@@ -71,7 +67,7 @@ describe('Metalk8sLocalVolumeProvider', () => {
7167
});
7268

7369
(
74-
mockVolumeClient.getMetalk8sV1alpha1VolumeList as jest.Mock
70+
mockCustomObjectsApi.listClusterCustomObject as jest.Mock
7571
).mockResolvedValue({
7672
body: {
7773
items: [
@@ -153,7 +149,7 @@ describe('Metalk8sLocalVolumeProvider', () => {
153149
});
154150

155151
(
156-
mockVolumeClient.getMetalk8sV1alpha1VolumeList as jest.Mock
152+
mockCustomObjectsApi.listClusterCustomObject as jest.Mock
157153
).mockRejectedValue(new Error('Failed to fetch volumes'));
158154

159155
await expect(
@@ -168,7 +164,7 @@ describe('Metalk8sLocalVolumeProvider', () => {
168164
it('should detach hardware volumes and virtual volumes', async () => {
169165
//S
170166
(
171-
mockVolumeClient.deleteMetalk8sV1alpha1Volume as jest.Mock
167+
mockCustomObjectsApi.deleteClusterCustomObject as jest.Mock
172168
).mockResolvedValue({
173169
body: {},
174170
});
@@ -191,17 +187,29 @@ describe('Metalk8sLocalVolumeProvider', () => {
191187
]);
192188
//V
193189
expect(
194-
mockVolumeClient.deleteMetalk8sV1alpha1Volume,
195-
).toHaveBeenCalledWith('test-volume');
190+
mockCustomObjectsApi.deleteClusterCustomObject,
191+
).toHaveBeenCalledWith(
192+
MOCK_GROUP,
193+
MOCK_VERSION,
194+
MOCK_PLURAL,
195+
'test-volume',
196+
{},
197+
);
196198
expect(
197-
mockVolumeClient.deleteMetalk8sV1alpha1Volume,
198-
).toHaveBeenCalledWith('test-lvm');
199+
mockCustomObjectsApi.deleteClusterCustomObject,
200+
).toHaveBeenCalledWith(
201+
MOCK_GROUP,
202+
MOCK_VERSION,
203+
MOCK_PLURAL,
204+
'test-lvm',
205+
{},
206+
);
199207
});
200208

201209
it('should raise an error if metalk8s volume deletion fails', async () => {
202210
//S
203211
(
204-
mockVolumeClient.deleteMetalk8sV1alpha1Volume as jest.Mock
212+
mockCustomObjectsApi.deleteClusterCustomObject as jest.Mock
205213
).mockRejectedValue(new Error('Failed to delete metalk8s volume'));
206214
//E+V
207215
await expect(

ui/src/services/k8s/Metalk8sLocalVolumeProvider.ts

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ export default class Metalk8sLocalVolumeProvider {
7878

7979
return localPv;
8080
} else {
81-
throw new Error(`Failed to fetch metalk8s volumes: ${volumes.error}`);
81+
throw new Error(`${volumes.error.message}`);
8282
}
8383
} catch (error) {
8484
throw new Error(
@@ -99,7 +99,15 @@ export default class Metalk8sLocalVolumeProvider {
9999

100100
for (const volumeName of volumeNames) {
101101
try {
102-
await volumeClient.deleteMetalk8sV1alpha1Volume(volumeName);
102+
const deleteVolume = await volumeClient.deleteMetalk8sV1alpha1Volume(
103+
volumeName,
104+
);
105+
106+
if (isError(deleteVolume)) {
107+
throw new Error(
108+
`Failed to delete MetalK8s volume ${volumeName}: ${deleteVolume.error.message}`,
109+
);
110+
}
103111
} catch (error) {
104112
throw new Error(
105113
`Failed to delete MetalK8s volume ${volumeName}: ${

0 commit comments

Comments
 (0)