Skip to content

Commit 87fcb80

Browse files
committed
add json output for catalog list services
1 parent c984206 commit 87fcb80

File tree

2 files changed

+56
-33
lines changed

2 files changed

+56
-33
lines changed

src/odo.ts

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ export class Command {
9999
return `odo catalog list components`;
100100
}
101101
static listCatalogServices () {
102-
return `odo catalog list services`;
102+
return `odo catalog list services -o json`;
103103
}
104104
static listStorageNames(project: string, app: string, component: string) {
105105
return `odo storage list -o json`;
@@ -772,20 +772,30 @@ export class OdoImpl implements Odo {
772772
}
773773

774774
public async getServiceTemplates(): Promise<string[]> {
775+
// tslint:disable-next-line: prefer-const
776+
let serviceTemplate: Array<string>;
777+
let items: Array<any> = [];
775778
const result: cliInstance.CliExitData = await this.execute(Command.listCatalogServices(), Platform.getUserHomePath(), false);
776-
if (result.error) {
777-
throw new Error(result.stderr.trim());
779+
try {
780+
items = JSON.parse(result.stdout).items;
781+
} catch (err) {
782+
throw new Error(JSON.parse(result.stderr).message);
778783
}
779-
return result.stdout.trim().split('\n').slice(1).map((value) => value.trim().replace(/\s{1,}/g, '|').split('|')[0]);
784+
serviceTemplate = items.map((value: { metadata: { name: string; }; }) => value.metadata.name);
785+
return serviceTemplate;
780786
}
781787

782788
public async getServiceTemplatePlans(svcName: string): Promise<string[]> {
789+
let items: Array<any>;
783790
const result: cliInstance.CliExitData = await this.execute(Command.listCatalogServices(), Platform.getUserHomePath());
784-
const plans = result.stdout.trim().split('\n').slice(1).filter((value) => {
785-
const data = value.trim().replace(/\s{1,}/g, '|').split('|');
786-
return data[0] === svcName;
787-
}).map((value) => value.trim().replace(/\s{1,}/g, '|').split('|')[1]);
788-
return plans[0].split(',');
791+
try {
792+
items = JSON.parse(result.stdout).items;
793+
} catch (err) {
794+
// ignore
795+
}
796+
const stpObject: Array<any> = items.filter((value) => value.metadata.name === svcName);
797+
const serviceTemplatePlans = stpObject.map((value: { spec: { planList: any; }; }) => value.spec.planList)[0];
798+
return serviceTemplatePlans;
789799
}
790800

791801
async getServices(application: OpenShiftObject): Promise<OpenShiftObject[]> {

test/unit/odo.test.ts

Lines changed: 37 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -267,18 +267,21 @@ suite("odo", () => {
267267
});
268268

269269
test('getServiceTemplates throws exception if service catalog is not enabled', async () => {
270-
const stderr = 'error message';
271-
execStub.resolves({error: new Error(), stdout: '', stderr});
270+
execStub.resolves({error: null, stdout: '', stderr:
271+
JSON.stringify({
272+
kind: "Error",
273+
apiVersion: "odo.openshift.io/v1alpha1",
274+
message: "unable to list services because Service Catalog is not enabled in your cluster"
275+
})
276+
});
272277
let e: Error;
273278
try {
274279
await odoCli.getServiceTemplates();
275280
} catch (err) {
276281
e = err;
277282
}
278283

279-
expect(e, 'getServiceTemplates has not threw error').is.not.undefined;
280-
expect(e.message, 'error has no message fields').is.not.undefined;
281-
expect(e.message, 'message is not equal stdout stream output').equals(stderr);
284+
expect(e.message).equals("unable to list services because Service Catalog is not enabled in your cluster");
282285

283286
});
284287

@@ -440,36 +443,46 @@ suite("odo", () => {
440443
});
441444

442445
suite("service integration", () => {
443-
const svc1 = 'svc1';
444-
const svc2 = 'svc2';
445-
const svc3 = 'svc3';
446-
447-
const odoPlans: string = [
448-
`NAME PLANS`,
449-
`${svc1} default,free,paid`,
450-
`${svc2} default,free`,
451-
`${svc3} default`
452-
].join('\n');
453-
const data: CliExitData = { error: undefined, stderr: null, stdout: odoPlans };
446+
const data: CliExitData = { error: undefined, stderr: null, stdout:
447+
JSON.stringify({
448+
kind: "ServiceTypeList",
449+
apiVersion: "odo.openshift.io/v1alpha1",
450+
metadata: {
451+
creationTimestamp: null
452+
},
453+
items: [
454+
{
455+
kind: "ServiceType",
456+
apiVersion: "odo.openshift.io/v1alpha1",
457+
metadata: {
458+
name: "cakephp-mysql-persistent",
459+
creationTimestamp: null
460+
},
461+
spec: {
462+
hidden: false,
463+
planList: [
464+
"default"
465+
]
466+
}
467+
},
468+
]
469+
})
470+
};
454471

455472
setup(() => {
456473
sandbox.stub(odo.OdoImpl.prototype, 'execute').resolves(data);
457474
});
458475

459476
test("getServiceTemplates returns correct number of services", async () => {
460477
const result: string[] = await odoCli.getServiceTemplates();
461-
assert.equal(result.length, 3);
462-
assert.equal(result[0], svc1);
463-
assert.equal(result[1], svc2);
464-
assert.equal(result[2], svc3);
478+
expect(result.length).equals(1);
479+
expect(result[0]).equals("cakephp-mysql-persistent");
465480
});
466481

467482
test("getServiceTemplatePlans returns correct number of plans for service", async () => {
468-
const result: string[] = await odoCli.getServiceTemplatePlans(svc1);
469-
assert.equal(result.length, 3);
483+
const result: string[] = await odoCli.getServiceTemplatePlans("cakephp-mysql-persistent");
484+
assert.equal(result.length, 1);
470485
assert.equal(result[0], 'default');
471-
assert.equal(result[1], 'free');
472-
assert.equal(result[2], 'paid');
473486
});
474487
});
475488

0 commit comments

Comments
 (0)