Skip to content

Commit 4dc3a0f

Browse files
committed
Merge branches 'w/130.0/bugfix/ARTESCA-14623-getToken' and 'q/w/4542/129.0/bugfix/ARTESCA-14623-getToken' into tmp/octopus/q/130.0
3 parents 46c3c9c + 44daa12 + 6e5e8fd commit 4dc3a0f

File tree

2 files changed

+60
-33
lines changed

2 files changed

+60
-33
lines changed

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

Lines changed: 27 additions & 21 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';
15-
const mockToken = 'mock-token';
18+
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(),
@@ -39,8 +35,6 @@ describe('Metalk8sLocalVolumeProvider', () => {
3935
});
4036

4137
provider = new Metalk8sLocalVolumeProvider(mockUrl, mockToken);
42-
provider.k8sClient = mockCoreV1Api;
43-
provider.volumeClient = mockVolumeClient;
4438
});
4539

4640
describe('listLocalPersistentVolumes', () => {
@@ -73,7 +67,7 @@ describe('Metalk8sLocalVolumeProvider', () => {
7367
});
7468

7569
(
76-
mockVolumeClient.getMetalk8sV1alpha1VolumeList as jest.Mock
70+
mockCustomObjectsApi.listClusterCustomObject as jest.Mock
7771
).mockResolvedValue({
7872
body: {
7973
items: [
@@ -155,7 +149,7 @@ describe('Metalk8sLocalVolumeProvider', () => {
155149
});
156150

157151
(
158-
mockVolumeClient.getMetalk8sV1alpha1VolumeList as jest.Mock
152+
mockCustomObjectsApi.listClusterCustomObject as jest.Mock
159153
).mockRejectedValue(new Error('Failed to fetch volumes'));
160154

161155
await expect(
@@ -170,7 +164,7 @@ describe('Metalk8sLocalVolumeProvider', () => {
170164
it('should detach hardware volumes and virtual volumes', async () => {
171165
//S
172166
(
173-
mockVolumeClient.deleteMetalk8sV1alpha1Volume as jest.Mock
167+
mockCustomObjectsApi.deleteClusterCustomObject as jest.Mock
174168
).mockResolvedValue({
175169
body: {},
176170
});
@@ -193,17 +187,29 @@ describe('Metalk8sLocalVolumeProvider', () => {
193187
]);
194188
//V
195189
expect(
196-
mockVolumeClient.deleteMetalk8sV1alpha1Volume,
197-
).toHaveBeenCalledWith('test-volume');
190+
mockCustomObjectsApi.deleteClusterCustomObject,
191+
).toHaveBeenCalledWith(
192+
MOCK_GROUP,
193+
MOCK_VERSION,
194+
MOCK_PLURAL,
195+
'test-volume',
196+
{},
197+
);
198198
expect(
199-
mockVolumeClient.deleteMetalk8sV1alpha1Volume,
200-
).toHaveBeenCalledWith('test-lvm');
199+
mockCustomObjectsApi.deleteClusterCustomObject,
200+
).toHaveBeenCalledWith(
201+
MOCK_GROUP,
202+
MOCK_VERSION,
203+
MOCK_PLURAL,
204+
'test-lvm',
205+
{},
206+
);
201207
});
202208

203209
it('should raise an error if metalk8s volume deletion fails', async () => {
204210
//S
205211
(
206-
mockVolumeClient.deleteMetalk8sV1alpha1Volume as jest.Mock
212+
mockCustomObjectsApi.deleteClusterCustomObject as jest.Mock
207213
).mockRejectedValue(new Error('Failed to delete metalk8s volume'));
208214
//E+V
209215
await expect(

ui/src/services/k8s/Metalk8sLocalVolumeProvider.ts

Lines changed: 33 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { CoreV1Api, V1PersistentVolume } from '@kubernetes/client-node';
1+
import { V1PersistentVolume } from '@kubernetes/client-node';
22
import * as ApiK8s from './api';
33
import {
44
Metalk8sV1alpha1VolumeClient,
@@ -22,18 +22,24 @@ export type LocalPersistentVolume = V1PersistentVolume & {
2222
};
2323

2424
export default class Metalk8sLocalVolumeProvider {
25-
volumeClient: Metalk8sV1alpha1VolumeClient;
26-
k8sClient: CoreV1Api;
27-
constructor(url: string, token: string) {
28-
const { coreV1, customObjects } = ApiK8s.updateApiServerConfig(url, token);
29-
this.volumeClient = new Metalk8sV1alpha1VolumeClient(customObjects);
30-
this.k8sClient = coreV1;
25+
apiUrl: string;
26+
constructor(apiUrl: string, private getToken: () => Promise<string>) {
27+
this.apiUrl = apiUrl;
3128
}
29+
3230
public listLocalPersistentVolumes = async (
3331
serverName: string,
3432
): Promise<LocalPersistentVolume[]> => {
3533
try {
36-
const nodes = await this.k8sClient.listNode();
34+
const token = await this.getToken();
35+
const { coreV1, customObjects } = ApiK8s.updateApiServerConfig(
36+
this.apiUrl,
37+
token,
38+
);
39+
const volumeClient = new Metalk8sV1alpha1VolumeClient(customObjects);
40+
const k8sClient = coreV1;
41+
42+
const nodes = await k8sClient.listNode();
3743
const nodeIP = nodes.body.items
3844
.find((node) => node.metadata.name === serverName)
3945
?.status.addresses.find((address) => address.type === 'InternalIP');
@@ -42,13 +48,13 @@ export default class Metalk8sLocalVolumeProvider {
4248
throw new Error(`Failed to find IP for node ${serverName}`);
4349
}
4450

45-
const volumes = await this.volumeClient.getMetalk8sV1alpha1VolumeList();
51+
const volumes = await volumeClient.getMetalk8sV1alpha1VolumeList();
4652

4753
if (!isError(volumes)) {
4854
const nodeVolumes = volumes.body.items.filter(
4955
(volume) => volume.spec.nodeName === serverName,
5056
);
51-
const pv = await this.k8sClient.listPersistentVolume();
57+
const pv = await k8sClient.listPersistentVolume();
5258

5359
const localPv = nodeVolumes.reduce((acc, item) => {
5460
const isLocalPv = pv.body.items.find(
@@ -72,7 +78,7 @@ export default class Metalk8sLocalVolumeProvider {
7278

7379
return localPv;
7480
} else {
75-
throw new Error(`Failed to fetch metalk8s volumes: ${volumes.error}`);
81+
throw new Error(`${volumes.error.message}`);
7682
}
7783
} catch (error) {
7884
throw new Error(
@@ -89,8 +95,23 @@ export default class Metalk8sLocalVolumeProvider {
8995
const volumeNames = localPVs.map((localPV) => localPV.metadata.name);
9096

9197
for (const volumeName of volumeNames) {
98+
const token = await this.getToken();
99+
const { customObjects } = ApiK8s.updateApiServerConfig(
100+
this.apiUrl,
101+
token,
102+
);
103+
const volumeClient = new Metalk8sV1alpha1VolumeClient(customObjects);
104+
92105
try {
93-
await this.volumeClient.deleteMetalk8sV1alpha1Volume(volumeName);
106+
const deleteVolume = await volumeClient.deleteMetalk8sV1alpha1Volume(
107+
volumeName,
108+
);
109+
110+
if (isError(deleteVolume)) {
111+
throw new Error(
112+
`Failed to delete MetalK8s volume ${volumeName}: ${deleteVolume.error.message}`,
113+
);
114+
}
94115
} catch (error) {
95116
throw new Error(
96117
`Failed to delete MetalK8s volume ${volumeName}: ${

0 commit comments

Comments
 (0)