@ohos-ports/sap-cf-tools 3.3.1-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,628 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.cfApi = exports.cfGetApps = exports.cfGetServiceInstancesList = exports.cfGetInstanceKeyParameters = exports.cfGetInstanceCredentials = exports.cfGetServiceKeys = exports.cfLogout = exports.cfGetServicePlans = exports.cfGetTarget = exports.cfGetAuthToken = exports.cfGetInstanceMetadata = exports.cfBindLocalUps = exports.cfBindLocalServices = exports.cfGetSpaceServices = exports.cfGetServices = exports.cfGetTargets = exports.cfSetOrgSpace = exports.cfGetManagedServiceInstances = exports.cfGetServiceInstances = exports.cfGetServicePlansList = exports.cfGetAvailableSpaces = exports.cfGetAvailableOrgs = exports.cfLogin = exports.cfCreateUpsInstance = exports.cfCreateService = exports.cfGetUpsInstances = exports.clearCacheServiceInstances = exports.resolveEndpoint = void 0;
4
+ const comment_json_1 = require("comment-json");
5
+ const _ = require("lodash");
6
+ const cli_1 = require("./cli");
7
+ const messages_1 = require("./messages");
8
+ const types_1 = require("./types");
9
+ const utils_1 = require("./utils");
10
+ const url_1 = require("url");
11
+ const baseParams = [
12
+ types_1.eFilters.page,
13
+ types_1.eFilters.per_page,
14
+ types_1.eFilters.oder_by,
15
+ types_1.eFilters.label_selector,
16
+ types_1.eFilters.created_ats,
17
+ types_1.eFilters.updated_ats,
18
+ ];
19
+ const resourceServiceInstances = {
20
+ name: "service_instances",
21
+ params: _.uniq(_.concat(baseParams, [
22
+ types_1.eFilters.names,
23
+ types_1.eFilters.type,
24
+ types_1.eFilters.space_guids,
25
+ types_1.eFilters.organization_guids,
26
+ types_1.eFilters.service_plan_guids,
27
+ types_1.eFilters.service_plan,
28
+ types_1.eFilters.service_plan_names,
29
+ ])),
30
+ };
31
+ const resourceOrganizations = {
32
+ name: "organizations",
33
+ params: _.uniq(_.concat(baseParams, [types_1.eFilters.names, types_1.eFilters.guids])),
34
+ };
35
+ const resourceSpaces = {
36
+ name: "spaces",
37
+ params: _.uniq(_.concat(baseParams, [types_1.eFilters.names, types_1.eFilters.guids, types_1.eFilters.organization_guids, types_1.eFilters.include])),
38
+ };
39
+ const resourceServicePlan = {
40
+ name: "service_plan",
41
+ params: _.uniq(_.concat(baseParams, [
42
+ types_1.eFilters.names,
43
+ types_1.eFilters.guids,
44
+ types_1.eFilters.available,
45
+ types_1.eFilters.broker_catalog_ids,
46
+ types_1.eFilters.space_guids,
47
+ types_1.eFilters.organization_guids,
48
+ types_1.eFilters.service_broker_guids,
49
+ types_1.eFilters.service_broker_names,
50
+ types_1.eFilters.service_offering_guids,
51
+ types_1.eFilters.service_offering_names,
52
+ types_1.eFilters.service_instance_guids,
53
+ types_1.eFilters.include,
54
+ ])),
55
+ };
56
+ const resourceServiceOfferings = {
57
+ name: "service_offerings",
58
+ params: _.uniq(_.concat(baseParams, [
59
+ types_1.eFilters.names,
60
+ types_1.eFilters.available,
61
+ types_1.eFilters.service_broker_guids,
62
+ types_1.eFilters.service_broker_names,
63
+ types_1.eFilters.space_guids,
64
+ types_1.eFilters.organization_guids,
65
+ ])),
66
+ };
67
+ const resourceServiceCredentialsBinding = {
68
+ name: "service_credential_bindings",
69
+ params: _.uniq(_.concat(baseParams, [
70
+ types_1.eFilters.names,
71
+ types_1.eFilters.guids,
72
+ types_1.eFilters.include,
73
+ types_1.eFilters.service_instance_guids,
74
+ types_1.eFilters.broker_catalog_ids,
75
+ types_1.eFilters.space_guids,
76
+ types_1.eFilters.service_instance_names,
77
+ types_1.eFilters.app_guids,
78
+ types_1.eFilters.app_names,
79
+ types_1.eFilters.service_plan_names,
80
+ types_1.eFilters.service_offering_guids,
81
+ types_1.eFilters.service_offering_names,
82
+ types_1.eFilters.type,
83
+ ])),
84
+ };
85
+ const resourceApps = {
86
+ name: "apps",
87
+ params: _.uniq(_.concat(baseParams, [
88
+ types_1.eFilters.names,
89
+ types_1.eFilters.space_guids,
90
+ types_1.eFilters.organization_guids,
91
+ types_1.eFilters.guids,
92
+ types_1.eFilters.include,
93
+ ])),
94
+ };
95
+ function evaluateResponse(data) {
96
+ if (_.size(_.get(data, "errors"))) {
97
+ throw new Error(`${_.get(data, ["errors", "0", "detail"])} [code: ${_.get(data, ["errors", "0", "code"])} title: ${_.get(data, [
98
+ "errors",
99
+ "0",
100
+ "title",
101
+ ])}]`);
102
+ }
103
+ return data;
104
+ }
105
+ async function resolveEndpoint(query) {
106
+ try {
107
+ return /http/.test(new url_1.URL(query).protocol)
108
+ ? _.replace(query, (await cfGetTarget(true))["api endpoint"], "")
109
+ : query;
110
+ }
111
+ catch (e) {
112
+ return query;
113
+ }
114
+ }
115
+ exports.resolveEndpoint = resolveEndpoint;
116
+ let cacheServiceInstanceTypes = {};
117
+ function clearCacheServiceInstances() {
118
+ cacheServiceInstanceTypes = {};
119
+ }
120
+ exports.clearCacheServiceInstances = clearCacheServiceInstances;
121
+ function evaluateQueryFilters(query, resource) {
122
+ _.each(query === null || query === void 0 ? void 0 : query.filters, (filter) => {
123
+ if (!resource.params.includes(filter.key)) {
124
+ throw new Error(messages_1.messages.not_allowed_filter(filter.key, resource.name));
125
+ }
126
+ });
127
+ }
128
+ const ENTITY_STATE_INPROGRESS = "in progress";
129
+ const ENTITY_STATE_FAILED = "failed";
130
+ function composeQuery(query) {
131
+ query = (0, utils_1.ensureQuery)(query);
132
+ function _generate_statement(filter) {
133
+ const value = _.get(filter, "value");
134
+ if (value) {
135
+ return filter.op === types_1.eOperation.fields
136
+ ? `${filter.op}[${filter.key}]=${value}`
137
+ : `${filter.key}` + (filter.op ? `[${filter.op}]` : ``) + `=${value}`;
138
+ }
139
+ }
140
+ function _queryFilters(filters) {
141
+ return _.compact(_.values(_.map(filters, _generate_statement)));
142
+ }
143
+ function _queryParams(object) {
144
+ return _.compact(_.map(_.keys(object), (key) => {
145
+ const value = _.get(object, key);
146
+ if (value) {
147
+ return `${key}=${value}`;
148
+ }
149
+ }));
150
+ }
151
+ return _.compact(_.concat(_queryFilters(query.filters).join("&"), _queryParams(_.omit(query, "filters")))).join("&");
152
+ }
153
+ function waitForEntity(resolve, reject, resource, attempt, maxNumberOfAttemps, jobFunction, progress) {
154
+ if (_.size(_.get(resource, "errors"))) {
155
+ reject(new Error(messages_1.messages.service_creation_failed(_.get(resource, ["errors", "0", "detail"]))));
156
+ return;
157
+ }
158
+ if (attempt < maxNumberOfAttemps) {
159
+ if (progress.cancelToken.isCancellationRequested) {
160
+ reject(new Error(messages_1.messages.create_service_canceled_by_requester));
161
+ return;
162
+ }
163
+ const state = _.get(resource, "last_operation.state", ENTITY_STATE_INPROGRESS);
164
+ if (state === ENTITY_STATE_INPROGRESS) {
165
+ progress.progress.report({
166
+ message: `\n${messages_1.messages.service_creation_started}`,
167
+ increment: Math.floor((1 / maxNumberOfAttemps) * 100),
168
+ });
169
+ setTimeout(() => {
170
+ jobFunction()
171
+ .then((retriedResource) => {
172
+ waitForEntity(resolve, reject, retriedResource, attempt + 1, maxNumberOfAttemps, jobFunction, progress);
173
+ })
174
+ .catch((error) => {
175
+ reject(error);
176
+ });
177
+ }, 2000);
178
+ }
179
+ else if (state === ENTITY_STATE_FAILED) {
180
+ reject(new Error(messages_1.messages.failed_creating_entity(_.get(resource, "last_operation.description"), (0, utils_1.getName)(resource))));
181
+ }
182
+ else {
183
+ progress.progress.report({ message: `\n${messages_1.messages.service_creation_started}`, increment: 100 });
184
+ resolve(resource);
185
+ }
186
+ }
187
+ else {
188
+ reject(new Error(messages_1.messages.exceed_number_of_attempts((0, utils_1.getName)(resource))));
189
+ }
190
+ }
191
+ async function execQuery(args, fncParse, reverseErrorOrder) {
192
+ const cliResult = await cli_1.Cli.execute(args.query, args.options, args.token);
193
+ if (cliResult.exitCode !== 0) {
194
+ throw new Error(reverseErrorOrder
195
+ ? cliResult.stdout || cliResult.stderr || cliResult.error
196
+ : cliResult.error || cliResult.stderr || cliResult.stdout);
197
+ }
198
+ return fncParse ? await fncParse(evaluateResponse((0, comment_json_1.parse)(cliResult.stdout))) : cliResult.stdout || cliResult.stderr;
199
+ }
200
+ async function execTotal(args, fncParse) {
201
+ const collection = [];
202
+ let query = args.query;
203
+ while (query) {
204
+ const result = (0, comment_json_1.parse)(await execQuery({ query: ["curl", await resolveEndpoint(query)], options: args.options, token: args.token }));
205
+ for (const resource of _.get(result, "resources", [])) {
206
+ collection.push(fncParse ? await fncParse(resource, _.get(result, "included")) : resource);
207
+ }
208
+ query = _.get(result, ["pagination", "next", "href"]);
209
+ }
210
+ return _.compact(collection);
211
+ }
212
+ async function getServiceInstance(query, token) {
213
+ evaluateQueryFilters(query, resourceServiceInstances);
214
+ query = await (0, utils_1.padQuerySpace)(query, [{ key: types_1.eFilters.type, value: types_1.eServiceTypes.managed }]);
215
+ const result = await execTotal({ query: `/v3/service_instances?${composeQuery(query)}`, token });
216
+ if (_.size(result) >= 1) {
217
+ return _.head(result);
218
+ }
219
+ throw new Error(messages_1.messages.service_not_found(decodeURIComponent(_.get(_.find(query.filters, ["key", types_1.eFilters.names]), "value")) || "unknown"));
220
+ }
221
+ async function getUpsCredentials(instanceGuid, token) {
222
+ return execQuery({ query: ["curl", `/v3/service_instances/${instanceGuid}/credentials`], token }, (data) => data);
223
+ }
224
+ function resolveCfResource(data, service) {
225
+ return _.merge({
226
+ name: (0, utils_1.getName)(data),
227
+ guid: (0, utils_1.getGuid)(data),
228
+ description: (0, utils_1.getDescription)(data),
229
+ }, service
230
+ ? {
231
+ service_offering: {
232
+ guid: (0, utils_1.getGuid)(service),
233
+ description: (0, utils_1.getDescription)(service),
234
+ name: (0, utils_1.getName)(service),
235
+ },
236
+ }
237
+ : {});
238
+ }
239
+ function getCachedServicePlan(plan) {
240
+ if (!cacheServiceInstanceTypes[plan.guid]) {
241
+ cacheServiceInstanceTypes[plan.guid] = execQuery({ query: ["curl", `/v3/service_plans/${plan.guid}?include=service_offering`] }, (data) => {
242
+ return Promise.resolve(resolveCfResource(data, _.find(_.get(data, ["included", "service_offerings"]), [
243
+ "guid",
244
+ _.get(data, ["relationships", "service_offering", "data", "guid"]),
245
+ ])));
246
+ });
247
+ }
248
+ return cacheServiceInstanceTypes[plan.guid];
249
+ }
250
+ function getServiceInstanceItem(item) {
251
+ const planGuid = _.get(item, ["relationships", "service_plan", "data", "guid"]);
252
+ return Promise.resolve({
253
+ guid: (0, utils_1.getGuid)(item),
254
+ label: (0, utils_1.getName)(item),
255
+ tags: (0, utils_1.getTags)(item),
256
+ serviceName: (0, utils_1.isUpsType)(item)
257
+ ? Promise.resolve({ service_offering: { name: types_1.eServiceTypes.user_provided }, name: "" })
258
+ : getCachedServicePlan({ guid: planGuid })
259
+ .then((plan) => plan)
260
+ .catch(() => {
261
+ return {};
262
+ }),
263
+ plan_guid: planGuid,
264
+ credentials: (0, utils_1.isUpsType)(item)
265
+ ?
266
+ getUpsCredentials((0, utils_1.getGuid)(item))
267
+ .then((data) => data)
268
+ .catch(() => {
269
+ return {};
270
+ })
271
+ : Promise.resolve(),
272
+ });
273
+ }
274
+ async function resolveServiceInstances(results) {
275
+ const queries = _.concat(_.map(results, "serviceName"), _.map(results, "credentials"));
276
+ if (!_.size(queries)) {
277
+ return [];
278
+ }
279
+ return Promise.all(queries).then(async () => {
280
+ const instances = [];
281
+ for (const result of results) {
282
+ const serviceName = await _.get(result, "serviceName");
283
+ instances.push({
284
+ guid: (0, utils_1.getGuid)(result),
285
+ label: (0, utils_1.getLabel)(result),
286
+ serviceName: _.get(serviceName, ["service_offering", "name"], "unknown"),
287
+ plan_guid: _.get(result, "plan_guid"),
288
+ plan: _.get(serviceName, "name", "unknown"),
289
+ tags: _.get(result, "tags"),
290
+ credentials: await result.credentials,
291
+ });
292
+ }
293
+ return _.compact(instances);
294
+ });
295
+ }
296
+ async function cfGetUpsInstances(query, token) {
297
+ evaluateQueryFilters(query, resourceServiceInstances);
298
+ query = await (0, utils_1.padQuerySpace)(query, [{ key: types_1.eFilters.type, value: types_1.eServiceTypes.user_provided }]);
299
+ return resolveServiceInstances(await execTotal({ query: `/v3/service_instances?${composeQuery(query)}`, token }, async (info) => getServiceInstanceItem(info)));
300
+ }
301
+ exports.cfGetUpsInstances = cfGetUpsInstances;
302
+ async function cfCreateService(planGuid, instanceName, params, tags, progress, maxNumberOfAttemps) {
303
+ const spaceGuid = await (0, utils_1.getSpaceGuidThrowIfUndefined)();
304
+ maxNumberOfAttemps = _.isNil(maxNumberOfAttemps) ? 45 : maxNumberOfAttemps;
305
+ progress = _.defaults(progress, { progress: { report: () => "" } }, { cancelToken: { isCancellationRequested: false, onCancellationRequested: () => "" } });
306
+ const request = {
307
+ type: types_1.eServiceTypes.managed,
308
+ name: instanceName,
309
+ relationships: {
310
+ space: { data: { guid: spaceGuid } },
311
+ service_plan: { data: { guid: planGuid } },
312
+ },
313
+ parameters: params,
314
+ tags,
315
+ };
316
+ const result = await execQuery({
317
+ query: ["curl", "/v3/service_instances", "-d", (0, comment_json_1.stringify)(request), "-X", "POST"],
318
+ token: progress.cancelToken,
319
+ });
320
+ progress.progress.report({ message: `\n${messages_1.messages.service_creation_started}`, increment: 1 });
321
+ const query = {
322
+ filters: [
323
+ { key: types_1.eFilters.names, value: encodeURIComponent(instanceName) },
324
+ { key: types_1.eFilters.space_guids, value: spaceGuid },
325
+ ],
326
+ };
327
+ return new Promise((resolve, reject) => {
328
+ waitForEntity(resolve, reject, !_.isEmpty(_.replace(result, "\n", "")) ? (0, comment_json_1.parse)(result) : result, 0, maxNumberOfAttemps, () => getServiceInstance(query, progress.cancelToken), progress);
329
+ });
330
+ }
331
+ exports.cfCreateService = cfCreateService;
332
+ async function cfCreateUpsInstance(info) {
333
+ let spaceGuid = info.space_guid;
334
+ if (!spaceGuid) {
335
+ spaceGuid = await (0, utils_1.getSpaceGuidThrowIfUndefined)();
336
+ }
337
+ return evaluateResponse((0, comment_json_1.parse)(await execQuery({
338
+ query: [
339
+ "curl",
340
+ `/v3/service_instances`,
341
+ "-d",
342
+ (0, comment_json_1.stringify)(_.merge({
343
+ name: info.instanceName,
344
+ type: types_1.eServiceTypes.user_provided,
345
+ relationships: { space: { data: { guid: spaceGuid } } },
346
+ }, info.credentials ? { credentials: info.credentials } : {}, info.route_service_url ? { route_service_url: info.route_service_url } : {}, info.syslog_drain_url ? { syslog_drain_url: info.syslog_drain_url } : {}, info.tags ? { tags: info.tags } : {})),
347
+ "-X",
348
+ "POST",
349
+ ],
350
+ })));
351
+ }
352
+ exports.cfCreateUpsInstance = cfCreateUpsInstance;
353
+ async function cfLogin(options) {
354
+ let result;
355
+ try {
356
+ let query = ["login", "-a"];
357
+ query =
358
+ "ssoPasscode" in options
359
+ ? _.concat(query, [
360
+ options.endpoint,
361
+ "--sso-passcode",
362
+ options.ssoPasscode,
363
+ "-o",
364
+ "no-org-for-now",
365
+ "-s",
366
+ "no-space-for-now",
367
+ ])
368
+ : _.concat(query, [
369
+ options.endpoint,
370
+ "-u",
371
+ options.user,
372
+ "-p",
373
+ options.password,
374
+ "-o",
375
+ "no-org-for-now",
376
+ "-s",
377
+ "no-space-for-now",
378
+ ]);
379
+ query = _.concat(query, options.origin ? ["--origin", options.origin] : []);
380
+ result = await execQuery({
381
+ query,
382
+ options: { env: { CF_COLOR: "false" } },
383
+ }, undefined, true);
384
+ }
385
+ catch (e) {
386
+ result = _.get(e, "message", "");
387
+ }
388
+ return result.includes(`Authenticating...${types_1.NEW_LINE}${types_1.OK}`) ? types_1.OK : result;
389
+ }
390
+ exports.cfLogin = cfLogin;
391
+ async function cfGetAvailableOrgs(query) {
392
+ evaluateQueryFilters(query, resourceOrganizations);
393
+ const ret = execTotal({ query: `/v3/organizations?${composeQuery(query)}` }, (resource) => {
394
+ return Promise.resolve({
395
+ label: (0, utils_1.getName)(resource),
396
+ guid: (0, utils_1.getGuid)(resource),
397
+ });
398
+ });
399
+ return ret;
400
+ }
401
+ exports.cfGetAvailableOrgs = cfGetAvailableOrgs;
402
+ async function cfGetAvailableSpaces(orgGuid) {
403
+ const query = (0, utils_1.ensureQuery)();
404
+ if (orgGuid) {
405
+ _.merge(query.filters, [{ key: types_1.eFilters.organization_guids, value: orgGuid }]);
406
+ }
407
+ evaluateQueryFilters(query, resourceSpaces);
408
+ const ret = execTotal({ query: `/v3/spaces?${composeQuery(query)}` }, (resource) => {
409
+ return Promise.resolve({
410
+ label: (0, utils_1.getName)(resource),
411
+ guid: (0, utils_1.getGuid)(resource),
412
+ orgGUID: (0, utils_1.getOrgGUID)(resource),
413
+ });
414
+ });
415
+ return ret;
416
+ }
417
+ exports.cfGetAvailableSpaces = cfGetAvailableSpaces;
418
+ function resolvePlanInfo(data, service) {
419
+ return _.merge({
420
+ label: (0, utils_1.getName)(data),
421
+ guid: (0, utils_1.getGuid)(data),
422
+ description: (0, utils_1.getDescription)(data),
423
+ }, service
424
+ ? {
425
+ service_offering: {
426
+ guid: (0, utils_1.getGuid)(service),
427
+ description: (0, utils_1.getDescription)(service),
428
+ name: (0, utils_1.getName)(service),
429
+ },
430
+ }
431
+ : {});
432
+ }
433
+ async function cfGetServicePlansList(query, token) {
434
+ query = await (0, utils_1.padQuerySpace)(query, [{ key: types_1.eFilters.include, value: "service_offering" }]);
435
+ evaluateQueryFilters(query, resourceServicePlan);
436
+ return execTotal({ query: `/v3/service_plans?${composeQuery(query)}`, token }, (data, included) => {
437
+ return Promise.resolve(resolvePlanInfo(data, _.find(_.get(included, "service_offerings"), [
438
+ "guid",
439
+ _.get(data, ["relationships", "service_offering", "data", "guid"]),
440
+ ])));
441
+ });
442
+ }
443
+ exports.cfGetServicePlansList = cfGetServicePlansList;
444
+ async function cfGetServiceInstances(query, token) {
445
+ query = await (0, utils_1.padQuerySpace)(query, [
446
+ { key: types_1.eFilters.service_plan, value: "guid,name", op: types_1.eOperation.fields },
447
+ { key: types_1.eFilters.type, value: types_1.eServiceTypes.managed },
448
+ ]);
449
+ evaluateQueryFilters(query, resourceServiceInstances);
450
+ return resolveServiceInstances(await execTotal({ query: `/v3/service_instances?${composeQuery(query)}`, token }, (info) => getServiceInstanceItem(info)));
451
+ }
452
+ exports.cfGetServiceInstances = cfGetServiceInstances;
453
+ async function cfGetManagedServiceInstances(query, token) {
454
+ return cfGetServiceInstances(query, token);
455
+ }
456
+ exports.cfGetManagedServiceInstances = cfGetManagedServiceInstances;
457
+ async function cfSetOrgSpace(org, space) {
458
+ await execQuery({ query: _.concat(["target", "-o", org], space ? ["-s", space] : []) });
459
+ clearCacheServiceInstances();
460
+ void cfGetManagedServiceInstances();
461
+ }
462
+ exports.cfSetOrgSpace = cfSetOrgSpace;
463
+ async function cfGetTargets() {
464
+ const targets = (await execQuery({ query: ["targets"] }));
465
+ if (_.includes(targets, "No targets have been saved yet") || _.includes(targets, "is not a registered command")) {
466
+ return [{ label: types_1.DEFAULT_TARGET, isCurrent: true, isDirty: false }];
467
+ }
468
+ const targetSubstrings = _.compact(_.map(targets.split(types_1.NEW_LINE), (targetSubstring) => targetSubstring.trim()));
469
+ return _.map(targetSubstrings, (targetSubstring) => {
470
+ const parentthesisPos = targetSubstring.indexOf("(current");
471
+ if (parentthesisPos > 0) {
472
+ targetSubstring = targetSubstring.substring(0, parentthesisPos);
473
+ return { label: targetSubstring.trim(), isCurrent: true, isDirty: targetSubstring.includes("modified") };
474
+ }
475
+ return { label: targetSubstring, isCurrent: false, isDirty: false };
476
+ });
477
+ }
478
+ exports.cfGetTargets = cfGetTargets;
479
+ async function cfGetServices(query, cancellationToken) {
480
+ evaluateQueryFilters(query, resourceServiceOfferings);
481
+ return execTotal({ query: `/v3/service_offerings?${composeQuery(await (0, utils_1.padQuerySpace)(query))}`, token: cancellationToken }, (service) => {
482
+ return Promise.resolve({
483
+ label: (0, utils_1.getName)(service),
484
+ service_plans_url: _.get(service, ["links", "service_plans", "href"]),
485
+ guid: (0, utils_1.getGuid)(service),
486
+ description: (0, utils_1.getDescription)(service),
487
+ });
488
+ });
489
+ }
490
+ exports.cfGetServices = cfGetServices;
491
+ async function cfGetSpaceServices(query, spaceGUID, cancellationToken) {
492
+ return cfGetServices((0, utils_1.padQuery)(query, [{ key: types_1.eFilters.space_guids, value: spaceGUID }]), cancellationToken);
493
+ }
494
+ exports.cfGetSpaceServices = cfGetSpaceServices;
495
+ async function cfBindLocalServices(filePath, instanceNames, tags, serviceKeyNames, serviceKeyParams, quoteVcap) {
496
+ await execQuery({
497
+ query: [
498
+ "bind-local",
499
+ "-path",
500
+ filePath,
501
+ "-service-names",
502
+ ...instanceNames,
503
+ ...(_.size(tags) ? _.concat(["-tags"], tags) : []),
504
+ ...(_.size(serviceKeyNames) ? _.concat(["-service-keys"], serviceKeyNames) : []),
505
+ ...(_.size(serviceKeyParams)
506
+ ? _.concat(["-params"], _.map(serviceKeyParams, (param) => {
507
+ return (0, comment_json_1.stringify)(param);
508
+ }))
509
+ : []),
510
+ ...(quoteVcap ? ["-quote-vcap"] : []),
511
+ ],
512
+ });
513
+ }
514
+ exports.cfBindLocalServices = cfBindLocalServices;
515
+ async function cfBindLocalUps(filePath, instanceNames, tags, quoteVcap) {
516
+ await execQuery({
517
+ query: _.concat(["bind-local-ups", "-path", filePath], _.reduce(instanceNames, (result, instanceName) => {
518
+ result = _.concat(result, [`-service-names`, `${instanceName}`]);
519
+ return result;
520
+ }, []), _.reduce(tags, (result, tag) => {
521
+ result = _.concat(result, [`-tags`, `${tag}`]);
522
+ return result;
523
+ }, []), quoteVcap ? ["-quote-vcap"] : []),
524
+ });
525
+ }
526
+ exports.cfBindLocalUps = cfBindLocalUps;
527
+ async function cfGetInstanceMetadata(instanceName) {
528
+ const result = await cfGetServiceInstances(await (0, utils_1.padQuerySpace)({
529
+ filters: [
530
+ { key: types_1.eFilters.names, value: encodeURIComponent(instanceName) },
531
+ { key: types_1.eFilters.type, value: types_1.eServiceTypes.managed },
532
+ ],
533
+ }));
534
+ if (!_.size(result)) {
535
+ throw new Error(messages_1.messages.service_not_found(instanceName));
536
+ }
537
+ const serviceInstance = _.head(result);
538
+ return {
539
+ serviceName: (0, utils_1.getLabel)(serviceInstance),
540
+ plan: _.get(serviceInstance, "plan"),
541
+ plan_guid: _.get(serviceInstance, "plan_guid"),
542
+ service: _.get(serviceInstance, "serviceName"),
543
+ };
544
+ }
545
+ exports.cfGetInstanceMetadata = cfGetInstanceMetadata;
546
+ async function cfGetAuthToken() {
547
+ return await execQuery({ query: ["oauth-token"] });
548
+ }
549
+ exports.cfGetAuthToken = cfGetAuthToken;
550
+ async function cfGetTarget(weak) {
551
+ if (!weak) {
552
+ await cfGetAuthToken();
553
+ }
554
+ return (0, utils_1.parseRawDictData)(await execQuery({ query: ["target"], options: { env: { CF_COLOR: "false" } } }));
555
+ }
556
+ exports.cfGetTarget = cfGetTarget;
557
+ async function cfGetServicePlans(servicePlansUrl) {
558
+ return execTotal({ query: servicePlansUrl }, (data) => {
559
+ return Promise.resolve({ label: (0, utils_1.getName)(data), guid: (0, utils_1.getGuid)(data), description: (0, utils_1.getDescription)(data) });
560
+ });
561
+ }
562
+ exports.cfGetServicePlans = cfGetServicePlans;
563
+ async function cfLogout() {
564
+ await execQuery({ query: ["logout"] });
565
+ }
566
+ exports.cfLogout = cfLogout;
567
+ async function cfGetServiceKeys(query, token) {
568
+ evaluateQueryFilters(query, resourceServiceCredentialsBinding);
569
+ return execTotal({
570
+ query: `/v3/service_credential_bindings?${composeQuery((0, utils_1.padQuery)(query, [{ key: types_1.eFilters.type, value: "key" }]))}`,
571
+ token,
572
+ });
573
+ }
574
+ exports.cfGetServiceKeys = cfGetServiceKeys;
575
+ async function cfGetInstanceCredentials(query, token) {
576
+ const results = _.map(await cfGetServiceKeys(query, token), (resource) => {
577
+ return (execQuery({ query: ["curl", `/v3/service_credential_bindings/${(0, utils_1.getGuid)(resource)}/details`], token }, (data) => data)
578
+ .then((data) => data)
579
+ .catch(() => {
580
+ return {};
581
+ }));
582
+ });
583
+ return Promise.all(_.compact(results));
584
+ }
585
+ exports.cfGetInstanceCredentials = cfGetInstanceCredentials;
586
+ async function cfGetInstanceKeyParameters(instanceName) {
587
+ const instance = await getServiceInstance({
588
+ filters: [{ key: types_1.eFilters.names, value: encodeURIComponent(instanceName) }],
589
+ });
590
+ const query = { filters: [{ key: types_1.eFilters.service_instance_guids, value: (0, utils_1.getGuid)(instance) }] };
591
+ let keys = await cfGetServiceKeys(query);
592
+ if (!_.size(keys)) {
593
+ await cli_1.Cli.execute(["create-service-key", encodeURIComponent(instanceName), "key", "--wait"]);
594
+ keys = await cfGetServiceKeys((0, utils_1.padQuery)(query, [{ key: types_1.eFilters.names, value: "key" }]));
595
+ }
596
+ return (execQuery({ query: ["curl", `/v3/service_credential_bindings/${(0, utils_1.getGuid)(_.head(keys))}/details`] }, (data) => data)
597
+ .then((data) => data)
598
+ .catch(() => {
599
+ return {};
600
+ }));
601
+ }
602
+ exports.cfGetInstanceKeyParameters = cfGetInstanceKeyParameters;
603
+ async function cfGetServiceInstancesList(query, token) {
604
+ query = await (0, utils_1.padQuerySpace)(query, [{ key: types_1.eFilters.service_plan, value: "guid,name", op: types_1.eOperation.fields }]);
605
+ evaluateQueryFilters(query, resourceServiceInstances);
606
+ return resolveServiceInstances(await execTotal({ query: `/v3/service_instances?${composeQuery(query)}`, token }, (info) => getServiceInstanceItem(info)));
607
+ }
608
+ exports.cfGetServiceInstancesList = cfGetServiceInstancesList;
609
+ async function cfGetApps(query, token) {
610
+ evaluateQueryFilters(query, resourceApps);
611
+ return execTotal({ query: `/v3/apps?${composeQuery(await (0, utils_1.padQuerySpace)(query))}`, token });
612
+ }
613
+ exports.cfGetApps = cfGetApps;
614
+ async function cfApi(params) {
615
+ const query = ["api"];
616
+ if (params === null || params === void 0 ? void 0 : params.url) {
617
+ query.push(params.url);
618
+ }
619
+ if (params === null || params === void 0 ? void 0 : params.skip_ssl_validation) {
620
+ query.push("--skip-ssl-validation");
621
+ }
622
+ if (params === null || params === void 0 ? void 0 : params.unset) {
623
+ query.push("--unset");
624
+ }
625
+ return (0, utils_1.parseRawDictData)(await execQuery({ query: [...query] }));
626
+ }
627
+ exports.cfApi = cfApi;
628
+ //# sourceMappingURL=cf-local.js.map
@@ -0,0 +1,6 @@
1
+ import { ServiceInstanceInfo } from "./types";
2
+ export declare function getServicesInstancesFilteredByType(serviceTypes: string[]): Promise<ServiceInstanceInfo[]>;
3
+ export declare function getInstanceCredentials(instanceName: string): Promise<any>;
4
+ export declare function createServiceInstance(serviceType: string, servicePlan: string, serviceInstanceName: string, config?: any, nowait?: boolean): Promise<any>;
5
+ export declare function getInstanceMetadata(instanceName: string): Promise<any>;
6
+ export declare function isTargetSet(): Promise<boolean>;
@@ -0,0 +1,41 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isTargetSet = exports.getInstanceMetadata = exports.createServiceInstance = exports.getInstanceCredentials = exports.getServicesInstancesFilteredByType = void 0;
4
+ const cli_1 = require("./cli");
5
+ const _ = require("lodash");
6
+ const types_1 = require("./types");
7
+ const cf_local_1 = require("./cf-local");
8
+ async function getServicesInstancesFilteredByType(serviceTypes) {
9
+ const guids = _.map(await (0, cf_local_1.cfGetServicePlansList)({
10
+ filters: [{ key: types_1.eFilters.service_offering_names, value: _.join(_.map(serviceTypes, encodeURIComponent)) }],
11
+ }), "guid");
12
+ return _.size(guids)
13
+ ? (0, cf_local_1.cfGetManagedServiceInstances)({ filters: [{ key: types_1.eFilters.service_plan_guids, value: _.join(guids) }] })
14
+ : [];
15
+ }
16
+ exports.getServicesInstancesFilteredByType = getServicesInstancesFilteredByType;
17
+ function getInstanceCredentials(instanceName) {
18
+ return (0, cf_local_1.cfGetInstanceKeyParameters)(instanceName);
19
+ }
20
+ exports.getInstanceCredentials = getInstanceCredentials;
21
+ function createServiceInstance(serviceType, servicePlan, serviceInstanceName, config, nowait) {
22
+ let args = ["create-service", serviceType, servicePlan, serviceInstanceName];
23
+ if (config) {
24
+ args = args.concat(["-c", config]);
25
+ }
26
+ if (nowait !== true) {
27
+ args.push("--wait");
28
+ }
29
+ return cli_1.Cli.execute(args);
30
+ }
31
+ exports.createServiceInstance = createServiceInstance;
32
+ function getInstanceMetadata(instanceName) {
33
+ return (0, cf_local_1.cfGetInstanceMetadata)(instanceName);
34
+ }
35
+ exports.getInstanceMetadata = getInstanceMetadata;
36
+ async function isTargetSet() {
37
+ const target = await (0, cf_local_1.cfGetTarget)();
38
+ return !_.isEmpty(target.org) && !_.isEmpty(target.space);
39
+ }
40
+ exports.isTargetSet = isTargetSet;
41
+ //# sourceMappingURL=cfServicesUtil.js.map
@@ -0,0 +1,10 @@
1
+ /// <reference types="node" />
2
+ import { SpawnOptions } from "child_process";
3
+ import { CliResult, CancellationToken } from "./types";
4
+ export declare class Cli {
5
+ static execute(args?: string[], options?: SpawnOptions, token?: CancellationToken): Promise<CliResult>;
6
+ private static readonly CF_LOGIN_ERROR;
7
+ private static readonly CF_CMD;
8
+ private static cliResultOnExit;
9
+ private static updateSpawnOptions;
10
+ }