@axway/axway-central-cli 2.5.0 → 2.6.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.
@@ -52,6 +52,7 @@ const get = {
52
52
  account,
53
53
  region,
54
54
  tag,
55
+ team,
55
56
  title
56
57
  } = argv; // will be set to true and exit 1 if any get result contains an error or args invalid
57
58
 
@@ -69,6 +70,7 @@ const get = {
69
70
  baseUrl,
70
71
  account,
71
72
  region,
73
+ team,
72
74
  useCache: cache
73
75
  });
74
76
  const defsManager = await new _DefinitionsManager.DefinitionsManager(client).init();
@@ -166,34 +168,28 @@ ${defsManager.getDefsTableForHelpMsg()}`);
166
168
  name: 'args',
167
169
  desc: 'Command arguments, run "axway central get" to see the examples',
168
170
  multiple: true,
169
- required: false,
170
- type: 'string'
171
+ required: false
171
172
  }],
172
173
  options: { ..._types.commonCmdArgsDescription,
173
174
  '-o, --output [value]': {
174
- desc: `Additional output formats. One of: ${_types.OutputTypes.yaml} | ${_types.OutputTypes.json}`,
175
- type: 'string'
175
+ desc: `Additional output formats. One of: ${_types.OutputTypes.yaml} | ${_types.OutputTypes.json}`
176
176
  },
177
- '-s, --scope [name|kind/name]"': {
178
- desc: `Scope name or kind/name for scoped resources`,
179
- type: 'string'
177
+ '-s, --scope [name|kind/name]': {
178
+ desc: 'Scope name or kind/name for scoped resources'
180
179
  },
181
180
  '-q, --query [RSQL query]': {
182
- desc: `RSQL-formatted query to search for filters that match specific parameters`,
183
- type: 'string'
181
+ desc: 'RSQL-formatted query to search for filters that match specific parameters'
184
182
  },
185
183
  '--title [title]': {
186
- desc: `Title of resource(s) to fetch`,
187
- type: 'string'
184
+ desc: 'Title of resource(s) to fetch'
188
185
  },
189
186
  '--attribute [key=value]': {
190
- desc: `Attribute in key=value pair format to filter by`,
191
- type: 'string'
187
+ desc: 'Attribute in key=value pair format to filter by'
192
188
  },
193
189
  '--tag [tag]': {
194
- desc: `Tag of resource(s) to fetch`,
195
- type: 'string'
196
- }
190
+ desc: 'Tag of resource(s) to fetch'
191
+ },
192
+ '--team [guid|name]': 'The team name or guid to use'
197
193
  }
198
194
  };
199
195
  exports.get = get;
@@ -9,8 +9,6 @@ var _chalk = _interopRequireDefault(require("chalk"));
9
9
 
10
10
  var _snooplogg = _interopRequireDefault(require("snooplogg"));
11
11
 
12
- var _ApiCentralClient = require("../../common/ApiCentralClient");
13
-
14
12
  var _ApiServerClient = require("../../common/ApiServerClient");
15
13
 
16
14
  var _basicPrompts = require("../../common/basicPrompts");
@@ -84,12 +82,7 @@ const agents = {
84
82
  const render = new _Renderer.default(console);
85
83
 
86
84
  try {
87
- // initiate clients
88
- const apiCentralClient = new _ApiCentralClient.ApiCentralClient({
89
- baseUrl,
90
- account,
91
- region
92
- });
85
+ // initialize clients
93
86
  const apiServerClient = new _ApiServerClient.ApiServerClient({
94
87
  baseUrl,
95
88
  account,
@@ -144,7 +137,7 @@ const agents = {
144
137
  } // get platform connectivity
145
138
 
146
139
 
147
- installConfig.centralConfig = await platform.getCentralConfig(apiCentralClient, apiServerClient, platformClient, defsManager, apicDeployment, installConfig); // Create the object of GatewayTypes -> GatewayConnectivity functions
140
+ installConfig.centralConfig = await platform.getCentralConfig(apiServerClient, platformClient, defsManager, apicDeployment, installConfig); // Create the object of GatewayTypes -> GatewayConnectivity functions
148
141
 
149
142
  installConfig.gatewayConfig = await agentInstallFlow.AskGatewayQuestions(installConfig, apiServerClient, defsManager); // traceability options
150
143
 
@@ -157,7 +150,7 @@ const agents = {
157
150
 
158
151
  if (agentInstallFlow.InstallPreprocess) installConfig = await agentInstallFlow.InstallPreprocess(installConfig); // finalize platform setup
159
152
 
160
- installConfig = await platform.finalizeCentralInstall(apiCentralClient, apiServerClient, platformClient, defsManager, installConfig); // finalize gateway setup and output
153
+ installConfig = await platform.finalizeCentralInstall(apiServerClient, platformClient, defsManager, installConfig); // finalize gateway setup and output
161
154
 
162
155
  await agentInstallFlow.FinalizeGatewayInstall(installConfig, apiServerClient, defsManager);
163
156
  } catch (e) {
@@ -317,7 +317,7 @@ const completeInstall = async installConfig => {
317
317
 
318
318
  await helpers.createSecret(v7AgentValues.namespace.name, helpers.amplifyAgentsKeysSecret, async () => {
319
319
  if (installConfig.centralConfig.ampcDosaInfo.isNew) {
320
- console.log(_cliKit.chalk.yellow(`The secret '${helpers.amplifyAgentsKeysSecret}' will be created with the same "private_key.pem" and "public_key.pem" that was auto generated to create the DOSA Account.`));
320
+ console.log(_cliKit.chalk.yellow(`The secret '${helpers.amplifyAgentsKeysSecret}' will be created with the same "private_key.pem" and "public_key.pem" that was auto generated to create the Service Account.`));
321
321
  }
322
322
 
323
323
  await helpers.createAmplifyAgentKeysSecret(v7AgentValues.namespace.name, helpers.amplifyAgentsKeysSecret, 'public_key', v7AgentValues.centralConfig.dosaAccount.publicKey, 'private_key', v7AgentValues.centralConfig.dosaAccount.privateKey);
@@ -13,6 +13,8 @@ var _bashCommands = require("../../../common/bashCommands");
13
13
 
14
14
  var _Kubectl = require("../../../common/Kubectl");
15
15
 
16
+ var _PlatformClient = require("../../../common/PlatformClient");
17
+
16
18
  var _types = require("../../../common/types");
17
19
 
18
20
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
@@ -48,18 +50,15 @@ const createDosaAndCerts = async (client, name) => {
48
50
 
49
51
  const publicCert = _fsExtra.default.readFileSync(publicKey).toString();
50
52
 
51
- const result = await client.createDOSAAccount(name, publicCert);
52
-
53
- if (!result.data) {
54
- var _result$error;
55
-
56
- throw Error(`Cannot create service account${(_result$error = result.error) !== null && _result$error !== void 0 && _result$error.length ? `: ${result.error[0].title}` : '.'}`);
57
- } else {
58
- console.log(_chalk.default.green(`New service account "${result.data.name}" with clientId "${result.data.clientId}" has been successfully created.`));
59
- console.log(_chalk.default.green(`The private key has been placed at ${privateKey}\nThe public key has been placed at ${publicKey}`));
60
- }
61
-
62
- return new _types.DosaAccount(result.data.clientId, publicKey, privateKey);
53
+ const account = await client.createServiceAccount({
54
+ name: name,
55
+ desc: name,
56
+ publicKey: publicCert,
57
+ roles: [_PlatformClient.PlatformServiceAccountRole.ApiCentralAdmin]
58
+ });
59
+ console.log(_chalk.default.green(`New service account "${account.name}" with clientId "${account.client_id}" has been successfully created.`));
60
+ console.log(_chalk.default.green(`The private key has been placed at ${privateKey}\nThe public key has been placed at ${publicKey}`));
61
+ return new _types.DosaAccount(account.client_id, publicKey, privateKey);
63
62
  };
64
63
 
65
64
  exports.createDosaAndCerts = createDosaAndCerts;
@@ -85,9 +84,9 @@ const createByResourceType = async (client, defsManager, name, resourceType, res
85
84
  });
86
85
 
87
86
  if (!result.data) {
88
- var _result$error2;
87
+ var _result$error;
89
88
 
90
- throw Error(`Cannot create a new ${resourceType.toLowerCase()}${(_result$error2 = result.error) !== null && _result$error2 !== void 0 && _result$error2.length ? `: ${result.error[0].detail}` : '.'}`);
89
+ throw Error(`Cannot create a new ${resourceType.toLowerCase()}${(_result$error = result.error) !== null && _result$error !== void 0 && _result$error.length ? `: ${result.error[0].detail}` : '.'}`);
91
90
  } else {
92
91
  console.log(`New ${resourceType.toLowerCase()} "${result.data.name}" has been successfully created.`);
93
92
  }
@@ -123,9 +122,9 @@ const createNewAgentResource = async (client, defsManager, envName, dataPlaneTyp
123
122
  });
124
123
 
125
124
  if (!result.data) {
126
- var _result$error3;
125
+ var _result$error2;
127
126
 
128
- throw Error(`Cannot create a new agent ${(_result$error3 = result.error) !== null && _result$error3 !== void 0 && _result$error3.length ? `: ${result.error[0].detail}` : '.'}`);
127
+ throw Error(`Cannot create a new agent ${(_result$error2 = result.error) !== null && _result$error2 !== void 0 && _result$error2.length ? `: ${result.error[0].detail}` : '.'}`);
129
128
  } else {
130
129
  console.log(`New agent of type "${defs[0].resource.name}" named "${result.data.name}" has been successfully created.`);
131
130
  }
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.transactionLoggingMessages = exports.serviceAccountNameAlreadyExists = exports.selectServiceAccount = exports.selectIngestionProtocol = exports.secretAlreadyExists = exports.namespaceAlreadyExists = exports.k8sClusterMessages = exports.fetchServiceAccount = exports.envMessages = exports.enterServiceAccountName = exports.enterPublicKeyPath = exports.enterPrivateKeyPath = exports.enterNamespaceName = exports.createNamespace = exports.createGatewayAgentCredsSecret = exports.createAmplifyAgentKeysSecret = exports.askToEnableTransactionLogging = exports.askServiceAccountName = exports.askPublicKeyPath = exports.askPublicAndPrivateKeysPath = exports.askPrivateKeyPath = exports.askNamespace = exports.askK8sClusterName = exports.askIngestionProtocol = exports.askForSecretName = exports.askEnvironmentName = exports.askDosaClientId = exports.askBundleType = exports.askAgentName = exports.agentMessages = void 0;
6
+ exports.transactionLoggingMessages = exports.serviceAccountNameAlreadyExists = exports.selectServiceAccount = exports.selectIngestionProtocol = exports.secretAlreadyExists = exports.namespaceAlreadyExists = exports.k8sClusterMessages = exports.envMessages = exports.enterServiceAccountName = exports.enterPublicKeyPath = exports.enterPrivateKeyPath = exports.enterNamespaceName = exports.createNamespace = exports.createGatewayAgentCredsSecret = exports.createAmplifyAgentKeysSecret = exports.askToEnableTransactionLogging = exports.askServiceAccountName = exports.askPublicKeyPath = exports.askPublicAndPrivateKeysPath = exports.askPrivateKeyPath = exports.askNamespace = exports.askK8sClusterName = exports.askIngestionProtocol = exports.askForSecretName = exports.askEnvironmentName = exports.askDosaClientId = exports.askBundleType = exports.askAgentName = exports.agentMessages = void 0;
7
7
 
8
8
  var _chalk = _interopRequireDefault(require("chalk"));
9
9
 
@@ -61,7 +61,7 @@ const secretAlreadyExists = 'Secret already exists. Please enter a new name.';
61
61
  exports.secretAlreadyExists = secretAlreadyExists;
62
62
  const enterNamespaceName = 'Enter a new namespace name';
63
63
  exports.enterNamespaceName = enterNamespaceName;
64
- const selectServiceAccount = 'Select a service account (DOSA)';
64
+ const selectServiceAccount = 'Select a service account';
65
65
  exports.selectServiceAccount = selectServiceAccount;
66
66
  const enterServiceAccountName = 'Enter a new service account name';
67
67
  exports.enterServiceAccountName = enterServiceAccountName;
@@ -74,10 +74,8 @@ exports.selectIngestionProtocol = selectIngestionProtocol;
74
74
  const serviceAccountNameAlreadyExists = 'Service account already exists. Please enter a new name.';
75
75
  exports.serviceAccountNameAlreadyExists = serviceAccountNameAlreadyExists;
76
76
 
77
- const askServiceAccountName = async serviceAccounts => {
78
- console.warn(_chalk.default.yellow(`WARNING: Creating a new DOSA account will overwrite any existing "private_key.pem" and "public_key.pem" files in this directory`)); // map to get sa names
79
-
80
- const serviceAccountNames = serviceAccounts.map(a => a.name);
77
+ const askServiceAccountName = async serviceAccountNames => {
78
+ console.warn(_chalk.default.yellow(`WARNING: Creating a new service account will overwrite any existing "private_key.pem" and "public_key.pem" files in this directory`));
81
79
  const name = await (0, _basicPrompts.askInput)({
82
80
  msg: enterServiceAccountName,
83
81
  defaultValue: cliNowString,
@@ -88,41 +86,38 @@ const askServiceAccountName = async serviceAccounts => {
88
86
 
89
87
  exports.askServiceAccountName = askServiceAccountName;
90
88
 
91
- const fetchServiceAccount = async client => {
92
- const res = await client.getServiceAccounts();
93
- if (!res.data) throw Error('Get service accounts error.');
94
- return res.data;
95
- };
96
-
97
- exports.fetchServiceAccount = fetchServiceAccount;
98
-
99
89
  const askDosaClientId = async (client, showWarning = true) => {
100
- const serviceAccounts = await fetchServiceAccount(client);
101
- const answer = await (0, _basicPrompts.askList)({
90
+ // Fetch all existing service accounts.
91
+ const serviceAccounts = await client.getServiceAccounts();
92
+ const serviceAccountNames = serviceAccounts.map(nextAccount => nextAccount.name); // Ask user to select an existing service account or create a new one.
93
+
94
+ const selectedName = await (0, _basicPrompts.askList)({
102
95
  msg: selectServiceAccount,
103
96
  choices: [{
104
- name: 'Create a new account',
97
+ name: 'Create a new service account',
105
98
  value: 'CREATE_NEW'
106
- }, new _inquirer.default.Separator(), ...serviceAccounts.map(a => a.name), new _inquirer.default.Separator()]
99
+ }, new _inquirer.default.Separator(), ...serviceAccountNames, new _inquirer.default.Separator()]
107
100
  });
108
101
 
109
- if (answer === 'CREATE_NEW') {
110
- const name = await askServiceAccountName(serviceAccounts);
102
+ if (selectedName === 'CREATE_NEW') {
103
+ // We're going to create a new service account. Ask for a unique name. (We'll create it later.)
104
+ const name = await askServiceAccountName(serviceAccountNames);
111
105
  return {
112
106
  clientId: null,
113
107
  name,
114
108
  isNew: true
115
109
  };
116
110
  } else {
117
- const dosa = serviceAccounts.find(a => a.name === answer);
118
-
111
+ // We're using an existing service account. Notify user to make its keys available to the agents.
119
112
  if (showWarning) {
120
113
  console.log(_chalk.default.yellow('Please make sure your "private_key.pem" and "public_key.pem" files for the selected service account are copied to the folder location of the agents.'));
121
- }
114
+ } // Fetch selected service account's client ID and return info about it.
115
+
122
116
 
117
+ const selectedAccount = serviceAccounts.find(nextAccount => nextAccount.name === selectedName);
123
118
  return {
124
- clientId: dosa.clientId,
125
- name: dosa.name,
119
+ clientId: selectedAccount === null || selectedAccount === void 0 ? void 0 : selectedAccount.client_id,
120
+ name: selectedName,
126
121
  isNew: false
127
122
  };
128
123
  }
@@ -244,7 +239,7 @@ const askEnvironmentName = async (client, defsManager, isAxwayManaged = null) =>
244
239
  choices: [{
245
240
  name: envMessages.createNewEnvironment,
246
241
  value: 'CREATE_NEW'
247
- }, new _inquirer.default.Separator(), ...envs.map(e => e.name), new _inquirer.default.Separator()]
242
+ }, new _inquirer.default.Separator(), ...envs.map(e => e.name).sort((name1, name2) => name1.localeCompare(name2)), new _inquirer.default.Separator()]
248
243
  });
249
244
 
250
245
  if (answer === 'CREATE_NEW') {
@@ -332,11 +327,11 @@ const askAgentName = async (client, defsManager, agentType, scopeName) => {
332
327
  };
333
328
  /**
334
329
  * @description Create a secret that contains a public & private key pair for agents to connect to central.
335
- * If a user is creating a new DOSA account, then the keys should be passed in as args.
336
- * If they are using an existing account, then the user will be prompted for the keys that created the DOSA account.
330
+ * If a user is creating a new service account, then the keys should be passed in as args.
331
+ * If they are using an existing account, then the user will be prompted for the keys that created the service account.
337
332
  * @param namespace The namespace to create the secret in.
338
333
  * @param secretName The name of the secret.
339
- * @param publicKey The file path to the public key attached to the chosen DOSA.
334
+ * @param publicKey The file path to the public key attached to the chosen service account.
340
335
  * @param privateKey The file path to the corresponding private key.
341
336
  */
342
337
 
@@ -395,7 +390,7 @@ const askPrivateKeyPath = async () => await (0, _basicPrompts.askInput)({
395
390
  exports.askPrivateKeyPath = askPrivateKeyPath;
396
391
 
397
392
  const askPublicAndPrivateKeysPath = async () => {
398
- console.log(_chalk.default.yellow('Please provide the same "private_key.pem" and "public_key.pem" that was used to create the selected DOSA Account.'));
393
+ console.log(_chalk.default.yellow('Please provide the same "private_key.pem" and "public_key.pem" that was used to create the selected Service Account.'));
399
394
  const publicKey = await askPublicKeyPath();
400
395
  const privateKey = await askPrivateKeyPath();
401
396
  return [publicKey, privateKey];
@@ -71,7 +71,7 @@ als:
71
71
  # distinguishes events between apic deployments
72
72
  apicDeployment: {{centralConfig.deployment}}
73
73
 
74
- # DOSA client ID
74
+ # service account client ID
75
75
  clientID: {{centralConfig.dosaAccount.clientId}}
76
76
 
77
77
  # condor ingestion endpoint
@@ -85,7 +85,7 @@ als:
85
85
  per_api: true
86
86
  reportAllErrors: {{traceabilityConfig.samplingReportAllErrors}}
87
87
 
88
- # name of the secret containing the public & private keys used by the provided DOSA client ID
88
+ # name of the secret containing the public & private keys used by the provided service account client ID
89
89
  keysSecretName: {{istioAgentValues.keysSecretName}}
90
90
  publishHeaders: true
91
91
 
@@ -93,7 +93,7 @@ als:
93
93
 
94
94
  # discovers API Documentation
95
95
  ada:
96
- # DOSA client ID
96
+ # service account client ID
97
97
  clientID: {{centralConfig.dosaAccount.clientId}}
98
98
 
99
99
  # name of the K8SCluster the agent is connected to
@@ -101,12 +101,12 @@ ada:
101
101
  command: apis
102
102
  enabled: {{istioAgentValues.discoveryEnabled}}
103
103
 
104
- # name of the secret containing the public & private keys used by the provided DOSA client ID
104
+ # name of the secret containing the public & private keys used by the provided service account client ID
105
105
  keysSecretName: {{istioAgentValues.keysSecretName}}
106
106
 
107
107
  # discovers running pods/services
108
108
  rda:
109
- # DOSA client ID
109
+ # service account client ID
110
110
  clientID: {{centralConfig.dosaAccount.clientId}}
111
111
 
112
112
  # name of the connected K8SCluster
@@ -114,7 +114,7 @@ rda:
114
114
  command: resources
115
115
  enabled: {{istioAgentValues.discoveryEnabled}}
116
116
 
117
- # name of the secret containing the public & private keys used by the provided DOSA client ID
117
+ # name of the secret containing the public & private keys used by the provided service account client ID
118
118
  keysSecretName: {{istioAgentValues.keysSecretName}}
119
119
 
120
120
  # to enable deployment of demo list service with agent installation. Set to true to install the demo service
@@ -398,11 +398,11 @@ const createHybridOverride = overrides => {
398
398
  exports.createHybridOverride = createHybridOverride;
399
399
 
400
400
  const installPreprocess = async installConfig => {
401
- // name of the dosa account, and if it is new or not
401
+ // name of the service account, and if it is new or not
402
402
  if (!installConfig.centralConfig.ampcDosaInfo.isNew) {
403
403
  [installConfig.centralConfig.dosaAccount.publicKey, installConfig.centralConfig.dosaAccount.privateKey] = await helpers.askPublicAndPrivateKeysPath();
404
404
  } else {
405
- console.log(_chalk.default.yellow(`The secret will be created with the same "private_key.pem" and "public_key.pem" that will be auto generated to create the DOSA Account, following the completion of these prompts.`));
405
+ console.log(_chalk.default.yellow(`The secret will be created with the same "private_key.pem" and "public_key.pem" that will be auto generated to create the Service Account, following the completion of these prompts.`));
406
406
  }
407
407
 
408
408
  return installConfig;
@@ -424,7 +424,7 @@ const completeInstall = async (installConfig, apiServerClient, defsManager) => {
424
424
 
425
425
  await helpers.createSecret(istioValues.istioAgentValues.namespace.name, helpers.amplifyAgentsKeysSecret, async () => {
426
426
  if (installConfig.centralConfig.ampcDosaInfo.isNew) {
427
- console.log(_chalk.default.yellow(`The secret '${helpers.amplifyAgentsKeysSecret}' will be created with the same "private_key.pem" and "public_key.pem" that was auto generated to create the DOSA Account.`));
427
+ console.log(_chalk.default.yellow(`The secret '${helpers.amplifyAgentsKeysSecret}' will be created with the same "private_key.pem" and "public_key.pem" that was auto generated to create the Service Account.`));
428
428
  }
429
429
 
430
430
  await helpers.createAmplifyAgentKeysSecret(istioValues.istioAgentValues.namespace.name, helpers.amplifyAgentsKeysSecret, 'publicKey', istioValues.centralConfig.dosaAccount.publicKey, 'privateKey', istioValues.centralConfig.dosaAccount.privateKey);
@@ -31,14 +31,18 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de
31
31
  // Complex prompts
32
32
  //
33
33
  const askTeamName = async client => {
34
- var _res$data$result$find;
34
+ var _teams$find;
35
+
36
+ const teams = await client.getTeams();
37
+
38
+ if (!(teams !== null && teams !== void 0 && teams.length)) {
39
+ throw new Error('Account has no teams!');
40
+ }
35
41
 
36
- const res = await client.getTeams();
37
- if (!res.data) throw Error('Get teams error.');
38
42
  return (0, _basicPrompts.askList)({
39
43
  msg: helpers.envMessages.selectTeam,
40
- choices: res.data.result.map(t => t.name),
41
- default: (_res$data$result$find = res.data.result.find(t => t.default)) === null || _res$data$result$find === void 0 ? void 0 : _res$data$result$find.name
44
+ choices: teams.map(t => t.name).sort((name1, name2) => name1.localeCompare(name2)),
45
+ default: (_teams$find = teams.find(t => t.default)) === null || _teams$find === void 0 ? void 0 : _teams$find.name
42
46
  });
43
47
  };
44
48
 
@@ -82,12 +86,12 @@ const getTraceabilityConfig = async installConfig => {
82
86
 
83
87
  exports.getTraceabilityConfig = getTraceabilityConfig;
84
88
 
85
- const getCentralConfig = async (apiCentralClient, apiServerClient, platformClient, defsManager, apicDeployment, installConfig) => {
89
+ const getCentralConfig = async (apiServerClient, platformClient, defsManager, apicDeployment, installConfig) => {
86
90
  // initiate CentralAgentConfig
87
91
  let centralConfig = installConfig.centralConfig;
88
92
  await centralConfig.setBaseHost();
89
93
  centralConfig.authUrl = `${_CoreConfigController.CoreConfigController.getAuthUrl()}/auth`;
90
- centralConfig.region = String(apiCentralClient.region || (await (0, _utils.getConfig)())[_types.ConfigTypes.REGION] || _types.Regions.US).toUpperCase();
94
+ centralConfig.region = String(apiServerClient.region || (await (0, _utils.getConfig)())[_types.ConfigTypes.REGION] || _types.Regions.US).toUpperCase();
91
95
  centralConfig.deployment = apicDeployment || getApicDeployment(centralConfig.region, _CoreConfigController.CoreConfigController.getEnv()); // apic config
92
96
 
93
97
  console.log('\nCONNECTION TO AMPLIFY PLATFORM:');
@@ -104,7 +108,7 @@ const getCentralConfig = async (apiCentralClient, apiServerClient, platformClien
104
108
  };
105
109
 
106
110
  if (installConfig.bundleType !== _types.BundleType.TRACEABILITY_OFFLINE) {
107
- centralConfig.ampcDosaInfo = await helpers.askDosaClientId(apiCentralClient);
111
+ centralConfig.ampcDosaInfo = await helpers.askDosaClientId(platformClient);
108
112
  } // Get the DA Agent name
109
113
 
110
114
 
@@ -126,14 +130,14 @@ const getCentralConfig = async (apiCentralClient, apiServerClient, platformClien
126
130
 
127
131
  exports.getCentralConfig = getCentralConfig;
128
132
 
129
- const finalizeCentralInstall = async (apiCentralClient, apiServerClient, platformClient, defsManager, installConfig) => {
133
+ const finalizeCentralInstall = async (apiServerClient, platformClient, defsManager, installConfig) => {
130
134
  /**
131
135
  * Create agent resources
132
136
  */
133
137
  console.log('Creating agent resources');
134
138
 
135
139
  if (installConfig.centralConfig.ampcDosaInfo.isNew) {
136
- installConfig.centralConfig.dosaAccount = await helpers.createDosaAndCerts(apiCentralClient, installConfig.centralConfig.ampcDosaInfo.name);
140
+ installConfig.centralConfig.dosaAccount = await helpers.createDosaAndCerts(platformClient, installConfig.centralConfig.ampcDosaInfo.name);
137
141
  } else {
138
142
  installConfig.centralConfig.dosaAccount.clientId = installConfig.centralConfig.ampcDosaInfo.clientId;
139
143
  }
@@ -48,7 +48,8 @@ class ApiServerClient {
48
48
  baseUrl,
49
49
  region,
50
50
  account,
51
- useCache
51
+ useCache,
52
+ team
52
53
  } = {}) {
53
54
  _defineProperty(this, "baseUrl", void 0);
54
55
 
@@ -58,11 +59,15 @@ class ApiServerClient {
58
59
 
59
60
  _defineProperty(this, "account", void 0);
60
61
 
61
- log(`initializing client with params: baseUrl = ${baseUrl}, region = ${region}, account = ${account}, useCache = ${useCache}`);
62
+ _defineProperty(this, "team", void 0);
63
+
64
+ log(`initializing client with params: baseUrl = ${baseUrl}, region = ${region}, account = ${account}, useCache = ${useCache}, team = ${team}`);
62
65
  this.baseUrl = baseUrl;
63
66
  this.account = account;
64
67
  this.region = region;
65
68
  this.useCache = useCache === undefined ? true : useCache; // using cache by default
69
+
70
+ this.team = team;
66
71
  }
67
72
  /**
68
73
  * Build resource url based on its ResourceDefinition and passed scope def and name.
@@ -111,7 +116,8 @@ class ApiServerClient {
111
116
  const service = await (0, _dataService.dataService)({
112
117
  baseUrl: this.baseUrl,
113
118
  region: this.region,
114
- account: this.account
119
+ account: this.account,
120
+ team: this.team
115
121
  });
116
122
  const baseUrl = this.buildResourceBaseUrl({
117
123
  resourceDef,
@@ -238,7 +244,8 @@ class ApiServerClient {
238
244
  const service = await (0, _dataService.dataService)({
239
245
  baseUrl: this.baseUrl,
240
246
  region: this.region,
241
- account: this.account
247
+ account: this.account,
248
+ team: this.team
242
249
  });
243
250
  const url = this.buildResourceBaseUrl({
244
251
  resourceDef,
@@ -311,7 +318,8 @@ class ApiServerClient {
311
318
  const service = await (0, _dataService.dataService)({
312
319
  baseUrl: this.baseUrl,
313
320
  region: this.region,
314
- account: this.account
321
+ account: this.account,
322
+ team: this.team
315
323
  });
316
324
  const url = this.buildResourceBaseUrl({
317
325
  resourceDef,
@@ -384,7 +392,8 @@ class ApiServerClient {
384
392
  const service = await (0, _dataService.dataService)({
385
393
  baseUrl: this.baseUrl,
386
394
  region: this.region,
387
- account: this.account
395
+ account: this.account,
396
+ team: this.team
388
397
  });
389
398
  const url = this.buildResourceBaseUrl({
390
399
  resourceDef,
@@ -463,7 +472,8 @@ class ApiServerClient {
463
472
  const service = await (0, _dataService.dataService)({
464
473
  baseUrl: this.baseUrl,
465
474
  region: this.region,
466
- account: this.account
475
+ account: this.account,
476
+ team: this.team
467
477
  });
468
478
  const url = this.buildResourceBaseUrl({
469
479
  resourceDef,
@@ -513,7 +523,8 @@ class ApiServerClient {
513
523
  const service = await (0, _dataService.dataService)({
514
524
  baseUrl: this.baseUrl,
515
525
  region: this.region,
516
- account: this.account
526
+ account: this.account,
527
+ team: this.team
517
528
  });
518
529
  const url = this.buildResourceBaseUrl({
519
530
  resourceDef,
@@ -7,12 +7,8 @@ exports.CoreConfigController = void 0;
7
7
 
8
8
  var _amplifyCliUtils = require("@axway/amplify-cli-utils");
9
9
 
10
- var _chalk = _interopRequireDefault(require("chalk"));
11
-
12
10
  var _snooplogg = _interopRequireDefault(require("snooplogg"));
13
11
 
14
- var _basicPrompts = require("./basicPrompts");
15
-
16
12
  var _CliConfigManager = require("./CliConfigManager");
17
13
 
18
14
  var _types = require("./types");
@@ -23,85 +19,83 @@ function _defineProperty(obj, key, value) { if (key in obj) { Object.definePrope
23
19
 
24
20
  const {
25
21
  log
26
- } = (0, _snooplogg.default)('central: CoreConfigController');
22
+ } = (0, _snooplogg.default)('central: CoreConfigController'); // TODO: https://jira.axway.com/browse/APIGOV-20520
23
+ // interface AuthenticationError extends Error {
24
+ // errors?: Array<object>;
25
+ // }
27
26
 
28
27
  class CoreConfigController {
29
28
  /**
30
29
  * Get authentication info
31
- * @param clientId client id to use
30
+ * @param {String} clientId client id to use
31
+ * @param {String} [team] The team name or guid to use, otherwise fallsback to the default from
32
+ * the Axway CLI config.
32
33
  * @returns object containing token and orgId. For service accounts orgId is undefined.
33
34
  * @throws 401 if no authenticated account found.
34
35
  */
35
36
  async getAuthInfo({
36
37
  account,
37
- clientId
38
+ clientId,
39
+ team
38
40
  } = {}) {
39
- var _CoreConfigController;
41
+ var _devOpsAccount$org;
40
42
 
41
- const configCtrl = new _CliConfigManager.CliConfigManager(); // note: remove this validator after couple of versions
43
+ const configCtrl = new _CliConfigManager.CliConfigManager();
44
+ const config = (0, _amplifyCliUtils.loadConfig)(); // note: remove this validator after couple of versions
42
45
 
43
46
  configCtrl.validateSavedConfigKeys();
44
- log(`getAuthInfo, received clientId = ${clientId}, account = ${account}`);
45
-
46
- if (!CoreConfigController.devOpsAccount || account && CoreConfigController.devOpsAccount.name !== account) {
47
+ log(`getAuthInfo, received clientId = ${clientId}, account = ${account}, team = ${team}`);
48
+ const baseUrl = configCtrl.get(_CliConfigManager.CliConfigKeys.BASE_URL); // environment defined by using central cli "base-url" or axway "env" configs if set,
49
+ // otherwise its undefined (equals to prod)
50
+
51
+ const environment = !baseUrl || baseUrl === _types.ProdBaseUrls.US || baseUrl === _types.ProdBaseUrls.EU ? config.get('env') : 'preprod';
52
+ log(`getAuthInfo, baseUrl = ${baseUrl}, environment = ${environment}`);
53
+ const {
54
+ sdk
55
+ } = (0, _amplifyCliUtils.initSDK)({
56
+ env: environment
57
+ }, config);
58
+ let {
59
+ devOpsAccount
60
+ } = CoreConfigController;
61
+
62
+ if (!devOpsAccount || account && devOpsAccount.name !== account) {
47
63
  log(`getAuthInfo, no cached devOpsAccount found, or account name does not match`);
48
- const baseUrl = configCtrl.get(_CliConfigManager.CliConfigKeys.BASE_URL); // environment defined by using central cli "base-url" or axway "env" configs if set,
49
- // otherwise its undefined (equals to prod)
50
-
51
- const environment = !baseUrl || baseUrl === _types.ProdBaseUrls.US || baseUrl === _types.ProdBaseUrls.EU ? this.getConfig('env') : 'preprod';
52
- log(`getAuthInfo, baseUrl = ${baseUrl}, environment = ${environment}`);
53
- const {
54
- config,
55
- sdk
56
- } = (0, _amplifyCliUtils.initSDK)({
57
- env: environment
58
- });
59
64
 
60
65
  if (clientId) {
61
66
  // TODO: client-id is a legacy option used only by proxies promote/create, should be removed
62
67
  // https://jira.axway.com/browse/APIGOV-20818
63
68
  log(`getAuthInfo, clientId value passed, trying to find a matching account`);
64
69
  const list = await sdk.auth.list({
65
- verify: true
70
+ validate: true
66
71
  });
67
72
  const matchingAccount = list.find(a => a.auth.clientId === clientId);
68
- if (matchingAccount) CoreConfigController.devOpsAccount = await sdk.auth.find(matchingAccount.name);
73
+
74
+ if (matchingAccount) {
75
+ devOpsAccount = await sdk.auth.find(matchingAccount.name);
76
+ }
69
77
  } else if (account) {
70
78
  // ELSE IF: account name passed - ignoring defaultAccount and other accounts
71
79
  log(`getAuthInfo, account value passed, trying to find a matching account`);
72
- CoreConfigController.devOpsAccount = await sdk.auth.find(account);
80
+ devOpsAccount = await sdk.auth.find(account);
73
81
  } else {
74
82
  // ELSE: trying to get any authenticated account
75
83
  log(`getAuthInfo, account value not passed, trying to find default/any match`);
76
84
  const list = await sdk.auth.list({
77
- verify: true
85
+ validate: true
78
86
  });
79
87
  log(`getAuthInfo, authenticated accounts found: ${list.length}`);
80
88
 
81
89
  if (list.length === 1) {
82
90
  log(`getAuthInfo, using a single account found with name: ${list[0].name}`);
83
- CoreConfigController.devOpsAccount = await sdk.auth.find(list[0].name);
91
+ devOpsAccount = list[0];
84
92
  } else if (list.length > 1) {
85
93
  // try to find the default account
86
- const defaultAccount = list.find(a => a.name === config.get('auth.defaultAccount'));
87
-
88
- if (defaultAccount) {
89
- log(`getAuthInfo, match found for defaultAccount, refreshing its token`);
90
- CoreConfigController.devOpsAccount = await sdk.auth.find(defaultAccount.name);
91
- } else {
92
- log(`getAuthInfo, no match found for defaultAccount`);
93
- const selectedName = await (0, _basicPrompts.askList)({
94
- msg: 'Multiple authenticated accounts found, please select which one you want to use',
95
- choices: Array.from(new Set(list.map(a => a.name)))
96
- });
97
- console.log((0, _chalk.default)`{grey If you always want to use this account by default, run:\naxway config set auth.defaultAccount ${selectedName}}\n`);
98
- log(`getAuthInfo, refreshing token for selected account: ${selectedName}`);
99
- CoreConfigController.devOpsAccount = await sdk.auth.find(selectedName);
100
- }
94
+ devOpsAccount = list.find(a => a.name === config.get('auth.defaultAccount')) || list.find(a => a.default) || list[0];
101
95
  }
102
96
  }
103
97
 
104
- if (!CoreConfigController.devOpsAccount) {
98
+ if (!devOpsAccount) {
105
99
  // TODO: piece of old logic here, move throwing out of the method?
106
100
  // temporary commenting out the new functionality and reverting back to the old one, will be fixed with:
107
101
  // https://jira.axway.com/browse/APIGOV-20520
@@ -119,43 +113,48 @@ class CoreConfigController {
119
113
  }]
120
114
  };
121
115
  }
116
+
117
+ CoreConfigController.devOpsAccount = devOpsAccount;
122
118
  }
123
119
 
124
- const token = CoreConfigController.devOpsAccount.auth.tokens.access_token;
125
- const orgId = CoreConfigController.devOpsAccount.isPlatform ? `${CoreConfigController.devOpsAccount.org.id}` : undefined;
126
- const orgRegion = (_CoreConfigController = CoreConfigController.devOpsAccount.org) === null || _CoreConfigController === void 0 ? void 0 : _CoreConfigController.region;
127
- log(`getAuthInfo, returning account = ${CoreConfigController.devOpsAccount.name}`);
128
- log(`getAuthInfo, returning token = ${token.substring(0, 5)}*****${token.substring(token.length - 5)}`);
129
- log(`getAuthInfo, returning orgId = ${orgId}`);
130
- log(`getAuthInfo, returning orgRegion = ${orgRegion}`);
131
- return {
132
- orgId,
133
- orgRegion,
134
- token
135
- };
136
- }
137
- /**
138
- * Get all or specific config value from core cli.
139
- * @returns entire object config or a specific value if key passed.
140
- */
120
+ const result = {
121
+ orgId: devOpsAccount.isPlatform ? `${devOpsAccount.org.id}` : undefined,
122
+ orgRegion: (_devOpsAccount$org = devOpsAccount.org) === null || _devOpsAccount$org === void 0 ? void 0 : _devOpsAccount$org.region,
123
+ token: devOpsAccount.auth.tokens.access_token
124
+ }; // now that we have resolved the account, we can validate the team
141
125
 
126
+ if (team) {
127
+ var _devOpsAccount$org$te;
128
+
129
+ const teamObj = (_devOpsAccount$org$te = devOpsAccount.org.teams) === null || _devOpsAccount$org$te === void 0 ? void 0 : _devOpsAccount$org$te.find(t => {
130
+ return t.guid.toLowerCase() === team.toLowerCase() || t.name.toLowerCase() === team.toLowerCase();
131
+ });
142
132
 
143
- getConfig(key) {
144
- log(`getConfig, key = ${key}`); // note: not using loadConfig().get(key) because of config mocks setup for tests.
133
+ if (!teamObj) {
134
+ throw new Error(`Unable to find team "${team}" in the "${devOpsAccount.org.name}" organization`);
135
+ }
136
+
137
+ result.teamGuid = teamObj.guid;
138
+ }
145
139
 
146
- return key ? (0, _amplifyCliUtils.loadConfig)().get()[key] : (0, _amplifyCliUtils.loadConfig)().get();
140
+ log(`getAuthInfo, returning account = ${devOpsAccount.name}`);
141
+ log(`getAuthInfo, returning token = ${result.token.substring(0, 5)}*****${result.token.substring(result.token.length - 5)}`);
142
+ log(`getAuthInfo, returning orgId = ${result.orgId}`);
143
+ log(`getAuthInfo, returning orgRegion = ${result.orgRegion}`);
144
+ log(`getAuthInfo, returning teamGuid = ${result.teamGuid}`);
145
+ return result;
147
146
  }
148
147
 
149
148
  static getEnv() {
150
- var _CoreConfigController2, _CoreConfigController3;
149
+ var _CoreConfigController, _CoreConfigController2;
151
150
 
152
- return ((_CoreConfigController2 = CoreConfigController.devOpsAccount) === null || _CoreConfigController2 === void 0 ? void 0 : (_CoreConfigController3 = _CoreConfigController2.auth) === null || _CoreConfigController3 === void 0 ? void 0 : _CoreConfigController3.env) || _types.Platforms.prod;
151
+ return ((_CoreConfigController = CoreConfigController.devOpsAccount) === null || _CoreConfigController === void 0 ? void 0 : (_CoreConfigController2 = _CoreConfigController.auth) === null || _CoreConfigController2 === void 0 ? void 0 : _CoreConfigController2.env) || _types.Platforms.prod;
153
152
  }
154
153
 
155
154
  static getAuthUrl() {
156
- var _CoreConfigController4, _CoreConfigController5;
155
+ var _CoreConfigController3, _CoreConfigController4;
157
156
 
158
- return ((_CoreConfigController4 = CoreConfigController.devOpsAccount) === null || _CoreConfigController4 === void 0 ? void 0 : (_CoreConfigController5 = _CoreConfigController4.auth) === null || _CoreConfigController5 === void 0 ? void 0 : _CoreConfigController5.baseUrl) || _types.AuthUrls.Prod;
157
+ return ((_CoreConfigController3 = CoreConfigController.devOpsAccount) === null || _CoreConfigController3 === void 0 ? void 0 : (_CoreConfigController4 = _CoreConfigController3.auth) === null || _CoreConfigController4 === void 0 ? void 0 : _CoreConfigController4.baseUrl) || _types.AuthUrls.Prod;
159
158
  }
160
159
 
161
160
  }
@@ -3,21 +3,72 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.PlatformClient = void 0;
6
+ exports.PlatformTeamMemberRole = exports.PlatformServiceAccountRole = exports.PlatformClient = exports.PlatformAuthMethod = void 0;
7
7
 
8
8
  var _snooplogg = _interopRequireDefault(require("snooplogg"));
9
9
 
10
- var _dataService = require("./dataService");
11
-
12
- var _types = require("./types");
10
+ var _amplifyCliUtils = require("@axway/amplify-cli-utils");
13
11
 
14
12
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
15
13
 
16
- function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
14
+ function _classPrivateFieldInitSpec(obj, privateMap, value) { _checkPrivateRedeclaration(obj, privateMap); privateMap.set(obj, value); }
15
+
16
+ function _checkPrivateRedeclaration(obj, privateCollection) { if (privateCollection.has(obj)) { throw new TypeError("Cannot initialize the same private elements twice on an object"); } }
17
+
18
+ function _classPrivateFieldGet(receiver, privateMap) { var descriptor = _classExtractFieldDescriptor(receiver, privateMap, "get"); return _classApplyDescriptorGet(receiver, descriptor); }
19
+
20
+ function _classApplyDescriptorGet(receiver, descriptor) { if (descriptor.get) { return descriptor.get.call(receiver); } return descriptor.value; }
21
+
22
+ function _classPrivateFieldSet(receiver, privateMap, value) { var descriptor = _classExtractFieldDescriptor(receiver, privateMap, "set"); _classApplyDescriptorSet(receiver, descriptor, value); return value; }
23
+
24
+ function _classExtractFieldDescriptor(receiver, privateMap, action) { if (!privateMap.has(receiver)) { throw new TypeError("attempted to " + action + " private field on non-instance"); } return privateMap.get(receiver); }
25
+
26
+ function _classApplyDescriptorSet(receiver, descriptor, value) { if (descriptor.set) { descriptor.set.call(receiver, value); } else { if (!descriptor.writable) { throw new TypeError("attempted to set read only private field"); } descriptor.value = value; } }
17
27
 
18
28
  const {
19
29
  log
20
30
  } = (0, _snooplogg.default)('central:class.PlatformClient');
31
+ let PlatformAuthMethod;
32
+ exports.PlatformAuthMethod = PlatformAuthMethod;
33
+
34
+ (function (PlatformAuthMethod) {
35
+ PlatformAuthMethod["Certificate"] = "certificate";
36
+ PlatformAuthMethod["Secret"] = "secret";
37
+ })(PlatformAuthMethod || (exports.PlatformAuthMethod = PlatformAuthMethod = {}));
38
+
39
+ let PlatformServiceAccountRole;
40
+ exports.PlatformServiceAccountRole = PlatformServiceAccountRole;
41
+
42
+ (function (PlatformServiceAccountRole) {
43
+ PlatformServiceAccountRole["ApiCentralAdmin"] = "api_central_admin";
44
+ PlatformServiceAccountRole["FlowCentralAccessManager"] = "fc_access_manager";
45
+ PlatformServiceAccountRole["FlowCentralIntegration"] = "fc_integration";
46
+ PlatformServiceAccountRole["FlowCentralITAdmin"] = "fc_it_admin";
47
+ PlatformServiceAccountRole["FlowCentralProductsAdmin"] = "fc_products_admin";
48
+ PlatformServiceAccountRole["FlowCentralSpecOps"] = "fc_spec_ops";
49
+ PlatformServiceAccountRole["FlowCentralSubscriptionApprover"] = "fc_subscriptionapprover";
50
+ PlatformServiceAccountRole["FlowCentralSubscriptionSpecialist"] = "fc_subscriptionspecialist";
51
+ PlatformServiceAccountRole["FlowCentralTemplatePublisher"] = "fc_templatepublisher";
52
+ PlatformServiceAccountRole["FlowCentralCftAdmin"] = "fc_cft_admin";
53
+ })(PlatformServiceAccountRole || (exports.PlatformServiceAccountRole = PlatformServiceAccountRole = {}));
54
+
55
+ let PlatformTeamMemberRole;
56
+ exports.PlatformTeamMemberRole = PlatformTeamMemberRole;
57
+
58
+ (function (PlatformTeamMemberRole) {
59
+ PlatformTeamMemberRole["Admin"] = "administrator";
60
+ PlatformTeamMemberRole["Developer"] = "developer";
61
+ PlatformTeamMemberRole["Consumer"] = "consumer";
62
+ PlatformTeamMemberRole["CatalogManager"] = "catalog_manager";
63
+ })(PlatformTeamMemberRole || (exports.PlatformTeamMemberRole = PlatformTeamMemberRole = {}));
64
+
65
+ var _baseUrl = /*#__PURE__*/new WeakMap();
66
+
67
+ var _accountName = /*#__PURE__*/new WeakMap();
68
+
69
+ var _amplifyConfig = /*#__PURE__*/new WeakMap();
70
+
71
+ var _amplifySdk = /*#__PURE__*/new WeakMap();
21
72
 
22
73
  class PlatformClient {
23
74
  constructor({
@@ -25,41 +76,99 @@ class PlatformClient {
25
76
  region,
26
77
  account
27
78
  } = {}) {
28
- _defineProperty(this, "baseUrl", void 0);
79
+ _classPrivateFieldInitSpec(this, _baseUrl, {
80
+ writable: true,
81
+ value: void 0
82
+ });
83
+
84
+ _classPrivateFieldInitSpec(this, _accountName, {
85
+ writable: true,
86
+ value: void 0
87
+ });
88
+
89
+ _classPrivateFieldInitSpec(this, _amplifyConfig, {
90
+ writable: true,
91
+ value: void 0
92
+ });
93
+
94
+ _classPrivateFieldInitSpec(this, _amplifySdk, {
95
+ writable: true,
96
+ value: void 0
97
+ });
29
98
 
30
- _defineProperty(this, "account", void 0);
99
+ log(`initializing client with params: baseUrl = ${baseUrl}, region = ${region}, account = ${account}`);
31
100
 
32
- _defineProperty(this, "region", void 0);
101
+ _classPrivateFieldSet(this, _baseUrl, baseUrl);
33
102
 
34
- log(`initializing client with params: baseUrl = ${baseUrl}, region = ${region}, account = ${account}`);
35
- this.baseUrl = baseUrl;
36
- this.account = account;
37
- this.region = region;
103
+ _classPrivateFieldSet(this, _accountName, account);
104
+
105
+ const initResult = (0, _amplifyCliUtils.initSDK)({
106
+ baseUrl: _classPrivateFieldGet(this, _baseUrl),
107
+ username: _classPrivateFieldGet(this, _accountName)
108
+ });
109
+
110
+ _classPrivateFieldSet(this, _amplifyConfig, initResult.config);
111
+
112
+ _classPrivateFieldSet(this, _amplifySdk, initResult.sdk);
38
113
  }
39
114
 
40
- async getTeams() {
41
- log(`getTeams`);
42
- const result = {
43
- data: null,
44
- error: null
45
- };
46
-
47
- try {
48
- const service = await (0, _dataService.dataService)({
49
- baseUrl: this.baseUrl,
50
- basePath: _types.BasePaths.Platform,
51
- account: this.account
52
- }); // Not using "getWithPagination" method here because /teams API does not support pagination
53
-
54
- const response = await service.get('/team');
55
- result.data = response;
56
- } catch (e) {
57
- if (e.errors && Array.isArray(e.errors)) {
58
- result.error = e.errors;
59
- } else throw e;
115
+ async getAccountInfo() {
116
+ var _classPrivateFieldGet2;
117
+
118
+ // Get default teams from config.
119
+ const defaultTeams = _classPrivateFieldGet(this, _amplifyConfig).get(`${(0, _amplifyCliUtils.getAuthConfigEnvSpecifier)((_classPrivateFieldGet2 = _classPrivateFieldGet(this, _amplifySdk).env) === null || _classPrivateFieldGet2 === void 0 ? void 0 : _classPrivateFieldGet2.name)}.defaultTeam`); // Fetch specified account or default account currently logged in.
120
+
121
+
122
+ let accountInfo;
123
+
124
+ if (_classPrivateFieldGet(this, _accountName)) {
125
+ accountInfo = await _classPrivateFieldGet(this, _amplifySdk).auth.find(_classPrivateFieldGet(this, _accountName), defaultTeams);
126
+
127
+ if (!accountInfo) {
128
+ throw new Error(`Account "${_classPrivateFieldGet(this, _accountName)}" not found`);
129
+ }
60
130
  }
61
131
 
62
- return result;
132
+ if (!accountInfo) {
133
+ const accountArray = await _classPrivateFieldGet(this, _amplifySdk).auth.list({
134
+ defaultTeams,
135
+ validate: true
136
+ });
137
+
138
+ if (accountArray) {
139
+ accountInfo = accountArray.find(nextAccount => nextAccount.default) || accountArray[0];
140
+ }
141
+ } // Make sure "subscriptions" is defined since Amplify SDK requires it. (Will throw error if missing.)
142
+
143
+
144
+ if (accountInfo && accountInfo.org && !accountInfo.org.subscriptions) {
145
+ accountInfo.org.subscriptions = [];
146
+ } // Return account info if found.
147
+
148
+
149
+ return accountInfo;
150
+ }
151
+
152
+ async createServiceAccount(options) {
153
+ const accountInfo = await this.getAccountInfo();
154
+ const result = await _classPrivateFieldGet(this, _amplifySdk).client.create(accountInfo, accountInfo === null || accountInfo === void 0 ? void 0 : accountInfo.org, options);
155
+ return result.client;
156
+ }
157
+
158
+ async getServiceAccounts() {
159
+ const result = await _classPrivateFieldGet(this, _amplifySdk).client.list(await this.getAccountInfo());
160
+ return result.clients || [];
161
+ }
162
+
163
+ async getTeams() {
164
+ log(`getTeams`);
165
+ const account = await this.getAccountInfo();
166
+ const {
167
+ teams
168
+ } = await _classPrivateFieldGet(this, _amplifySdk).team.list(account);
169
+ return teams.map(team => ({ ...team,
170
+ default: team.guid === account.team.guid
171
+ }));
63
172
  }
64
173
 
65
174
  }
@@ -84,22 +84,63 @@ const handleResponse = response => {
84
84
  return /application\/json/.test(response.headers['content-type']) ? JSON.parse(response.body) : response.body;
85
85
  };
86
86
 
87
+ const updateRequestError = err => {
88
+ var _err$response;
89
+
90
+ // Do not change given object if it's a timeout error.
91
+ if (err instanceof _got.TimeoutError) {
92
+ return;
93
+ } // If we have a JSON HTTP body, then turn it into a dictionary.
94
+
95
+
96
+ let jsonBody = null;
97
+
98
+ if (err instanceof _got.RequestError && (_err$response = err.response) !== null && _err$response !== void 0 && _err$response.body) {
99
+ jsonBody = handleResponse(err.response);
100
+ } // Turn given Error object into an "ApiServerError" or "ApiServerErrorResponse" object.
101
+
102
+
103
+ if (!jsonBody) {
104
+ // No response message received. Could be any kind of exception error.
105
+ // Turn given error into an "ApiServerErrorResponse" object.
106
+ err.errors = [err];
107
+ } else if (typeof jsonBody.code === 'number' && typeof jsonBody.description === 'string') {
108
+ // We received a "Platform" server error response.
109
+ err.status = jsonBody.code;
110
+ err.detail = jsonBody.description;
111
+ } else {
112
+ // Assume we received a "Central" server error response which should already conform to "ApiServerError".
113
+ Object.assign(err, jsonBody);
114
+ }
115
+ };
116
+ /**
117
+ * Creates an object with various functions communicating with the API Server.
118
+ * @param {String} clientId Client id to use.
119
+ * @param {String} [team] The preferred team to use. This value overrides the default from the Axway CLI config.
120
+ * @param {String} [region] The preferred region to use.
121
+ * @returns Object containing data retrieval functions.
122
+ */
123
+
124
+
87
125
  const dataService = async ({
88
126
  account,
89
127
  baseUrl,
90
128
  basePath = _types.BasePaths.ApiServer,
91
129
  clientId,
92
- region
130
+ region,
131
+ team
93
132
  }) => {
94
133
  // see above
95
134
  // await versionCheckWarning();
96
135
  const {
97
136
  orgId,
98
137
  orgRegion,
138
+ teamGuid,
99
139
  token
100
140
  } = await new _CoreConfigController.CoreConfigController().getAuthInfo({
101
141
  account,
102
- clientId
142
+ clientId,
143
+ team
103
144
  });
104
145
  const url = await getBaseUrl(baseUrl, basePath, region, orgRegion);
105
146
  const defaultHeaders = getDefaultHeaders({
@@ -110,6 +151,13 @@ const dataService = async ({
110
151
 
111
152
  const fetch = async (method, url, params = {}) => {
112
153
  try {
154
+ // add the team guid
155
+ if (teamGuid) {
156
+ const parsed = new _url.URL(url);
157
+ parsed.searchParams.set('query', `owner.id==${teamGuid}`);
158
+ url = parsed.toString();
159
+ }
160
+
113
161
  const response = await got[method](url, {
114
162
  followRedirect: false,
115
163
  retry: 0,
@@ -124,14 +172,7 @@ const dataService = async ({
124
172
 
125
173
  return response;
126
174
  } catch (err) {
127
- if (!(err instanceof _got.TimeoutError)) {
128
- var _err$response;
129
-
130
- Object.assign(err, ((_err$response = err.response) === null || _err$response === void 0 ? void 0 : _err$response.body) && handleResponse(err.response) || {
131
- errors: [err]
132
- });
133
- }
134
-
175
+ updateRequestError(err);
135
176
  throw err;
136
177
  }
137
178
  };
@@ -250,14 +291,7 @@ const dataService = async ({
250
291
  stream.on('error', reject);
251
292
  });
252
293
  } catch (err) {
253
- if (!(err instanceof _got.TimeoutError)) {
254
- var _err$response2;
255
-
256
- Object.assign(err, ((_err$response2 = err.response) === null || _err$response2 === void 0 ? void 0 : _err$response2.body) && handleResponse(err.response) || {
257
- errors: [err]
258
- });
259
- }
260
-
294
+ updateRequestError(err);
261
295
  throw err;
262
296
  }
263
297
  }
@@ -149,9 +149,9 @@ const APICDeployments = {
149
149
  };
150
150
  exports.APICDeployments = APICDeployments;
151
151
  const commonCmdArgsDescription = {
152
- '--account [value]': `Override your default account config`,
153
- '--region [value]': `Override your region config`,
154
- '--no-cache': `Do not use cache when communicating with the server`,
152
+ '--account [value]': 'Override your default account config',
153
+ '--region [value]': 'Override your region config',
154
+ '--no-cache': 'Do not use cache when communicating with the server',
155
155
  '--base-url [value]': {
156
156
  hidden: true
157
157
  },
@@ -726,5 +726,7 @@ class IstioInstallValues {
726
726
  }
727
727
 
728
728
  }
729
+ /** Provides information for a platform team. */
730
+
729
731
 
730
732
  exports.IstioInstallValues = IstioInstallValues;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@axway/axway-central-cli",
3
- "version": "2.5.0",
3
+ "version": "2.6.0",
4
4
  "description": "Manage APIs, services and publish to the Unified Catalog",
5
5
  "homepage": "https://platform.axway.com",
6
6
  "author": {
@@ -41,9 +41,9 @@
41
41
  "name": "central"
42
42
  },
43
43
  "dependencies": {
44
- "@axway/amplify-cli-utils": "^5.0.2",
44
+ "@axway/amplify-cli-utils": "^5.0.3",
45
45
  "chalk": "^4.1.2",
46
- "cli-kit": "^1.14.1",
46
+ "cli-kit": "^1.15.0",
47
47
  "dayjs": "^1.10.7",
48
48
  "easy-table": "^1.2.0",
49
49
  "extract-zip": "^2.0.1",
@@ -60,42 +60,42 @@
60
60
  "tmp": "^0.2.1"
61
61
  },
62
62
  "devDependencies": {
63
- "@babel/cli": "^7.15.7",
64
- "@babel/core": "^7.15.8",
65
- "@babel/plugin-proposal-class-properties": "^7.14.5",
66
- "@babel/plugin-proposal-nullish-coalescing-operator": "^7.14.5",
67
- "@babel/plugin-proposal-optional-chaining": "^7.14.5",
68
- "@babel/preset-env": "^7.15.8",
69
- "@babel/preset-typescript": "^7.15.0",
63
+ "@babel/cli": "^7.16.0",
64
+ "@babel/core": "^7.16.0",
65
+ "@babel/plugin-proposal-class-properties": "^7.16.0",
66
+ "@babel/plugin-proposal-nullish-coalescing-operator": "^7.16.0",
67
+ "@babel/plugin-proposal-optional-chaining": "^7.16.0",
68
+ "@babel/preset-env": "^7.16.4",
69
+ "@babel/preset-typescript": "^7.16.0",
70
70
  "@types/chai": "^4.2.22",
71
71
  "@types/chai-as-promised": "^7.1.4",
72
72
  "@types/easy-table": "^0.0.33",
73
73
  "@types/form-data": "^2.5.0",
74
74
  "@types/fs-extra": "^9.0.13",
75
75
  "@types/inquirer": "^8.1.3",
76
- "@types/js-yaml": "^4.0.4",
77
- "@types/lodash": "^4.14.176",
76
+ "@types/js-yaml": "^4.0.5",
77
+ "@types/lodash": "^4.14.177",
78
78
  "@types/mocha": "^9.0.0",
79
- "@types/node": "^16.11.5",
79
+ "@types/node": "^16.11.10",
80
80
  "@types/rx": "^4.1.2",
81
81
  "@types/semver": "^7.3.9",
82
- "@types/sinon": "^10.0.5",
82
+ "@types/sinon": "^10.0.6",
83
83
  "@types/tmp": "^0.2.2",
84
84
  "@types/update-notifier": "^5.1.0",
85
- "@types/uuid": "^8.3.1",
85
+ "@types/uuid": "^8.3.3",
86
86
  "babel-plugin-lodash": "^3.3.4",
87
87
  "chai": "^4.3.4",
88
88
  "chai-as-promised": "^7.1.1",
89
- "core-js": "^3.19.0",
89
+ "core-js": "^3.19.1",
90
90
  "mocha": "^9.1.3",
91
- "nock": "^13.1.4",
92
- "nodemon": "^2.0.14",
91
+ "nock": "^13.2.1",
92
+ "nodemon": "^2.0.15",
93
93
  "nyc": "^15.1.0",
94
94
  "prettier": "^2.4.1",
95
95
  "sinon": "^11.1.2",
96
- "source-map-support": "^0.5.20",
96
+ "source-map-support": "^0.5.21",
97
97
  "ts-mocha": "^8.0.0",
98
- "typescript": "^4.4.4"
98
+ "typescript": "^4.5.2"
99
99
  },
100
100
  "jest": {
101
101
  "verbose": true,
@@ -1,114 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.ApiCentralClient = void 0;
7
-
8
- var _snooplogg = _interopRequireDefault(require("snooplogg"));
9
-
10
- var _dataService = require("./dataService");
11
-
12
- var _types = require("./types");
13
-
14
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
15
-
16
- function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
17
-
18
- const {
19
- log
20
- } = (0, _snooplogg.default)('central:class.ApiCentralClient');
21
-
22
- class ApiCentralClient {
23
- constructor({
24
- baseUrl,
25
- region,
26
- account
27
- }) {
28
- _defineProperty(this, "baseUrl", void 0);
29
-
30
- _defineProperty(this, "region", void 0);
31
-
32
- _defineProperty(this, "account", void 0);
33
-
34
- log(`initializing client with params: baseUrl = ${baseUrl}, region = ${region}, account = ${account}`);
35
- this.baseUrl = baseUrl;
36
- this.account = account;
37
- this.region = region;
38
- }
39
- /**
40
- * Create DOSA account.
41
- * @param accountName name of dosa account (can be non-unique)
42
- * @param publicKey public .pem file content
43
- */
44
-
45
-
46
- async createDOSAAccount(accountName, publicKey) {
47
- log(`createDOSAAccount`);
48
- const result = {
49
- data: null,
50
- error: null
51
- };
52
-
53
- try {
54
- const service = await (0, _dataService.dataService)({
55
- baseUrl: this.baseUrl,
56
- basePath: _types.BasePaths.ApiCentral,
57
- account: this.account,
58
- region: this.region
59
- });
60
- const payload = {
61
- generateKeypair: false,
62
- pemEncodedPublicKey: publicKey.replace(/(\r\n)/gm, '\n'),
63
- serviceAccountName: accountName,
64
- serviceAccountType: 'DOSA'
65
- };
66
- const response = await service.post('/serviceAccounts', payload);
67
- result.data = response;
68
- } catch (e) {
69
- log('createDOSAAccount, error: ', e); // expecting only a valid ApiServer error response here
70
- // re-throw if something different, so it should be handled by command's catch block.
71
-
72
- if (e.errors && Array.isArray(e.errors)) {
73
- result.error = e.errors;
74
- } else throw e;
75
- }
76
-
77
- return result;
78
- }
79
- /**
80
- * List service accounts.
81
- */
82
-
83
-
84
- async getServiceAccounts() {
85
- log(`getServiceAccounts`);
86
- const result = {
87
- data: null,
88
- error: null
89
- };
90
-
91
- try {
92
- const service = await (0, _dataService.dataService)({
93
- baseUrl: this.baseUrl,
94
- basePath: _types.BasePaths.ApiCentral,
95
- account: this.account,
96
- region: this.region
97
- });
98
- const response = await service.getWithPagination(`/serviceAccounts`, 'type==SA&sort=modifyTime%2CDESC');
99
- result.data = response;
100
- } catch (e) {
101
- log('getServiceAccounts, error: ', e); // expecting only a valid ApiServer error response here
102
- // re-throw if something different, so it should be handled by command's catch block.
103
-
104
- if (e.errors && Array.isArray(e.errors)) {
105
- result.error = e.errors;
106
- } else throw e;
107
- }
108
-
109
- return result;
110
- }
111
-
112
- }
113
-
114
- exports.ApiCentralClient = ApiCentralClient;