Skip to content

Commit a9cc98f

Browse files
authored
Add duplicate mount path validation for storage (#1946)
Signed-off-by: Denis Golovin [email protected]
1 parent 1857510 commit a9cc98f

File tree

3 files changed

+36
-13
lines changed

3 files changed

+36
-13
lines changed

src/odo.ts

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ import { Command } from './odo/command';
2929
import { BuilderImage } from './odo/builderImage';
3030
import { ImageStream } from './odo/imageStream';
3131
import { VsCommandError } from './vscommand';
32+
import { Storage } from './odo/storage';
3233

3334
import bs = require('binary-search');
3435

@@ -217,7 +218,7 @@ export class OpenShiftApplication extends OpenShiftObjectImpl {
217218
}
218219

219220
export class OpenShiftStorage extends OpenShiftObjectImpl {
220-
constructor(parent: OpenShiftObject, name: string) {
221+
constructor(parent: OpenShiftObject, name: string, public readonly mountPath: string) {
221222
super(parent, name, ContextType.STORAGE, 'storage-node.png', TreeItemCollapsibleState.None);
222223
}
223224

@@ -341,7 +342,7 @@ export interface Odo {
341342
getComponentChildren(component: OpenShiftObject): Promise<OpenShiftObject[]>;
342343
getRoutes(component: OpenShiftObject): Promise<OpenShiftObject[]>;
343344
getComponentPorts(component: OpenShiftObject): Promise<odo.Port[]>;
344-
getStorageNames(component: OpenShiftObject): Promise<OpenShiftObject[]>;
345+
getStorageNames(component: OpenShiftObject): Promise<OpenShiftStorage[]>;
345346
getServiceTemplates(): Promise<string[]>;
346347
getServiceTemplatePlans(svc: string): Promise<string[]>;
347348
getServices(application: OpenShiftObject): Promise<OpenShiftObject[]>;
@@ -732,13 +733,13 @@ export class OdoImpl implements Odo {
732733
.map((value) => new OpenShiftUrl(component, value.metadata.name));
733734
}
734735

735-
async getStorageNames(component: OpenShiftObject): Promise<OpenShiftObject[]> {
736-
return (await this.getComponentChildren(component)).filter((value) => value.contextValue === ContextType.STORAGE);
736+
async getStorageNames(component: OpenShiftObject): Promise<OpenShiftStorage[]> {
737+
return (await this.getComponentChildren(component)).filter((value) => value.contextValue === ContextType.STORAGE) as OpenShiftStorage[];
737738
}
738739

739740
public async _getStorageNames(component: OpenShiftObject): Promise<OpenShiftObject[]> {
740741
const result: cliInstance.CliExitData = await this.execute(Command.listStorageNames(), component.contextPath ? component.contextPath.fsPath : Platform.getUserHomePath());
741-
return this.loadItems<Storage>(result).map<OpenShiftObject>((value) => new OpenShiftStorage(component, value.metadata.name));
742+
return this.loadItems<Storage>(result).map<OpenShiftObject>((value) => new OpenShiftStorage(component, value.metadata.name, value.spec.path));
742743
}
743744

744745
public async getServiceTemplates(): Promise<string[]> {
@@ -1003,7 +1004,7 @@ export class OdoImpl implements Odo {
10031004

10041005
public async createStorage(component: OpenShiftObject, name: string, mountPath: string, size: string): Promise<OpenShiftObject> {
10051006
await this.execute(Command.createStorage(name, mountPath, size), component.contextPath.fsPath);
1006-
return this.insertAndReveal(new OpenShiftStorage(component, name));
1007+
return this.insertAndReveal(new OpenShiftStorage(component, name, mountPath));
10071008
}
10081009

10091010
public async deleteStorage(storage: OpenShiftObject): Promise<OpenShiftObject> {

src/openshift/storage.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,11 @@ export class Storage extends OpenShiftItem {
2626

2727
const mountPath = await window.showInputBox({prompt: 'Specify the mount path',
2828
ignoreFocusOut: true,
29-
validateInput: (value: string) => {
29+
validateInput: async (value: string) => {
30+
const storages = await storageList;
31+
if (storages.find(storage => storage.mountPath === value)) {
32+
return 'Mount path is already taken';
33+
}
3034
if (isEmpty(value.trim())) {
3135
return 'Invalid mount path';
3236
}

test/unit/odo.test.ts

Lines changed: 24 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -401,11 +401,17 @@ suite('odo', () => {
401401
{
402402
metadata: {
403403
name: 'storage1'
404+
},
405+
spec: {
406+
path: '/mnt/path1'
404407
}
405408
},
406409
{
407410
metadata: {
408411
name: 'storage2'
412+
},
413+
spec: {
414+
path: '/mnt/path1'
409415
}
410416
}
411417
]
@@ -426,11 +432,17 @@ suite('odo', () => {
426432
{
427433
metadata: {
428434
name: 'route1'
435+
},
436+
spec: {
437+
path: '/mnt/path1'
429438
}
430439
},
431440
{
432441
metadata: {
433442
name: 'route2'
443+
},
444+
spec: {
445+
path: '/mnt/path2'
434446
}
435447
}
436448
]
@@ -448,12 +460,18 @@ suite('odo', () => {
448460
items: [
449461
{
450462
metadata: {
451-
name: 'route1'
463+
name: 'storage1'
464+
},
465+
spec: {
466+
path: '/mnt/path1'
452467
}
453468
},
454469
{
455470
metadata: {
456-
name: 'route2'
471+
name: 'storage2'
472+
},
473+
spec: {
474+
path: '/mnt/path2'
457475
}
458476
}
459477
]
@@ -462,20 +480,20 @@ suite('odo', () => {
462480
items: [
463481
{
464482
metadata: {
465-
name: 'storage1'
483+
name: 'route1'
466484
}
467485
},
468486
{
469487
metadata: {
470-
name: 'storage2'
488+
name: 'route2'
471489
}
472490
}
473491
]
474492
}), stderr: ''});
475493
const result = await odoCli.getComponentChildren(component);
476494

477-
expect(result[2].getName()).deep.equals('route1');
478-
expect(result[0].getName()).deep.equals('storage1');
495+
expect(result[2].getName()).deep.equals('storage1');
496+
expect(result[0].getName()).deep.equals('route1');
479497
});
480498
});
481499

0 commit comments

Comments
 (0)