@contrail/cli 3.6.0-alpha-8-alpha.2a57edb → 3.6.0-alpha-8-alpha.de819d3
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.
package/README.md
CHANGED
|
@@ -17,7 +17,7 @@ $ npm install -g @contrail/cli
|
|
|
17
17
|
$ contrail COMMAND
|
|
18
18
|
running command...
|
|
19
19
|
$ contrail (--version)
|
|
20
|
-
@contrail/cli/3.6.0-alpha-8-alpha.
|
|
20
|
+
@contrail/cli/3.6.0-alpha-8-alpha.de819d3 linux-x64 node-v24.21.0
|
|
21
21
|
$ contrail --help [COMMAND]
|
|
22
22
|
USAGE
|
|
23
23
|
$ contrail COMMAND
|
|
@@ -686,7 +686,7 @@ Update an entity
|
|
|
686
686
|
|
|
687
687
|
```
|
|
688
688
|
USAGE
|
|
689
|
-
$ contrail entities update ENTITYNAME [IDS] [-l error|warn|info|debug] [-e true|false] [-S] [-d] [-i <value>]
|
|
689
|
+
$ contrail entities update ENTITYNAME [IDS] [-l error|warn|info|debug] [-e true|false] [-S] [-d] [-i <value>]
|
|
690
690
|
[--suffix <value>] [--apiVersion 1|2]
|
|
691
691
|
|
|
692
692
|
ARGUMENTS
|
|
@@ -694,7 +694,6 @@ ARGUMENTS
|
|
|
694
694
|
IDS One or more entity ids to update
|
|
695
695
|
|
|
696
696
|
FLAGS
|
|
697
|
-
-F, --force Force update without validation. Internal use only
|
|
698
697
|
-S, --skipHydrateRelationships Skip hydrating relationships when updating the entity
|
|
699
698
|
-d, --dryRun If true, does not update the entities but simulates the update
|
|
700
699
|
-e, --alwaysConfirmEnv=<option> [default: true] The Environment variables
|
|
@@ -91,8 +91,8 @@ class DeleteEntity extends basecommand_1.BaseCommand {
|
|
|
91
91
|
console.error('deleted entities:');
|
|
92
92
|
}
|
|
93
93
|
this.log(JSON.stringify(response, null, 2));
|
|
94
|
-
if (response.
|
|
95
|
-
console.error(`${response.
|
|
94
|
+
if (response.failed.length > 0) {
|
|
95
|
+
console.error(`${response.failed.length} of ${ids.length} deletes failed.`);
|
|
96
96
|
process.exitCode = 1;
|
|
97
97
|
}
|
|
98
98
|
}
|
|
@@ -103,32 +103,26 @@ class DeleteEntity extends basecommand_1.BaseCommand {
|
|
|
103
103
|
}
|
|
104
104
|
exports.default = DeleteEntity;
|
|
105
105
|
async function deleteEntityByIds(entityName, ids, routing = {}) {
|
|
106
|
-
const
|
|
107
|
-
const
|
|
108
|
-
const
|
|
106
|
+
const deletedIds = [];
|
|
107
|
+
const notFoundIds = [];
|
|
108
|
+
const failed = [];
|
|
109
109
|
const limit = (0, p_limit_1.default)(10);
|
|
110
110
|
const deletePromises = ids.map((id) => limit(() => deleteEntityById(entityName, id, routing).then((entity) => {
|
|
111
111
|
if (!entity) {
|
|
112
|
-
|
|
113
|
-
return
|
|
112
|
+
notFoundIds.push(id);
|
|
113
|
+
return;
|
|
114
114
|
}
|
|
115
|
-
|
|
116
|
-
return entity;
|
|
115
|
+
deletedIds.push(id);
|
|
117
116
|
}, (error) => {
|
|
118
117
|
if (error.message.includes('not found')) {
|
|
119
|
-
|
|
118
|
+
notFoundIds.push(id);
|
|
120
119
|
}
|
|
121
120
|
else {
|
|
122
|
-
|
|
121
|
+
failed.push({ id, error: (0, common_1.sdkErrorMessage)(error) });
|
|
123
122
|
}
|
|
124
|
-
return null;
|
|
125
123
|
})));
|
|
126
124
|
await Promise.all(deletePromises);
|
|
127
|
-
return {
|
|
128
|
-
idsDeleted: Array.from(idsDeleted),
|
|
129
|
-
idsNotFound: Array.from(idsNotFound),
|
|
130
|
-
idsErrored: Array.from(idsErrored),
|
|
131
|
-
};
|
|
125
|
+
return { deletedIds, notFoundIds, failed };
|
|
132
126
|
}
|
|
133
127
|
async function deleteEntityById(entityName, id, routing = {}) {
|
|
134
128
|
const client = new sdk_1.Entities();
|
|
@@ -157,6 +157,9 @@ class GetEntity extends basecommand_1.BaseCommand {
|
|
|
157
157
|
apiVersion: apiVersion,
|
|
158
158
|
take,
|
|
159
159
|
});
|
|
160
|
+
if (response === null) {
|
|
161
|
+
this.error(`Entity not found: ${propertySpecBySlug.get('id')}`, { exit: 1 });
|
|
162
|
+
}
|
|
160
163
|
if (outputFile) {
|
|
161
164
|
fs_1.default.writeFileSync(outputFile, JSON.stringify(response, null, 2));
|
|
162
165
|
console.error(`Output saved to ${outputFile}`);
|
|
@@ -167,6 +170,9 @@ class GetEntity extends basecommand_1.BaseCommand {
|
|
|
167
170
|
}
|
|
168
171
|
}
|
|
169
172
|
catch (e) {
|
|
173
|
+
if (e.message?.startsWith('Entity not found:')) {
|
|
174
|
+
throw e;
|
|
175
|
+
}
|
|
170
176
|
this.error(`Error fetching entity: ${e.message}`);
|
|
171
177
|
}
|
|
172
178
|
}
|
|
@@ -182,6 +188,8 @@ async function getEntityByTypePath(typePath, propertySpec, options = {}) {
|
|
|
182
188
|
}
|
|
183
189
|
return find(entityName, {
|
|
184
190
|
id,
|
|
191
|
+
// a missing id returns null (no retries); the command turns it into a clean not-found error
|
|
192
|
+
ignore404: id !== undefined,
|
|
185
193
|
skipHydrateRelationships,
|
|
186
194
|
relations,
|
|
187
195
|
propertySlugs,
|
|
@@ -201,9 +209,10 @@ function convertPropertySpecIntoCriteria(propertySpec) {
|
|
|
201
209
|
}
|
|
202
210
|
async function find(entityName, options = {}) {
|
|
203
211
|
const client = new sdk_1.Entities();
|
|
204
|
-
const { criteria, id, propertySlugs, skipHydrateRelationships, relations, skip, suffix, apiVersion, take, } = options;
|
|
212
|
+
const { criteria, id, ignore404, propertySlugs, skipHydrateRelationships, relations, skip, suffix, apiVersion, take, } = options;
|
|
205
213
|
const queryOptions = {
|
|
206
214
|
entityName,
|
|
215
|
+
ignore404,
|
|
207
216
|
skipHydrateRelationships,
|
|
208
217
|
relations,
|
|
209
218
|
skip,
|
|
@@ -6,7 +6,6 @@ export default class UpdateEntity extends BaseCommand {
|
|
|
6
6
|
skipHydrateRelationships: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
|
|
7
7
|
dryRun: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
|
|
8
8
|
inputFile: import("@oclif/core/lib/interfaces").OptionFlag<string, import("@oclif/core/lib/interfaces/parser").CustomOptions>;
|
|
9
|
-
force: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
|
|
10
9
|
suffix: import("@oclif/core/lib/interfaces").OptionFlag<string, import("@oclif/core/lib/interfaces/parser").CustomOptions>;
|
|
11
10
|
apiVersion: import("@oclif/core/lib/interfaces").OptionFlag<string, import("@oclif/core/lib/interfaces/parser").CustomOptions>;
|
|
12
11
|
alwaysConfirmEnv: import("@oclif/core/lib/interfaces").OptionFlag<string, import("@oclif/core/lib/interfaces/parser").CustomOptions>;
|
|
@@ -36,11 +36,6 @@ class UpdateEntity extends basecommand_1.BaseCommand {
|
|
|
36
36
|
description: 'A file with a JSON array of {id, ...} objects; each object is one entity to update.',
|
|
37
37
|
required: false,
|
|
38
38
|
}),
|
|
39
|
-
force: core_1.Flags.boolean({
|
|
40
|
-
char: 'F',
|
|
41
|
-
description: 'Force update without validation. Internal use only',
|
|
42
|
-
required: false,
|
|
43
|
-
}),
|
|
44
39
|
suffix: core_1.Flags.string({
|
|
45
40
|
description: 'Append a sub-route to the entity endpoint (e.g. --suffix=synchronous targets /<entities>/synchronous)',
|
|
46
41
|
required: false,
|
|
@@ -67,7 +62,7 @@ class UpdateEntity extends basecommand_1.BaseCommand {
|
|
|
67
62
|
await (0, login_1.authUser)();
|
|
68
63
|
const { args, argv } = await this.parse(UpdateEntity);
|
|
69
64
|
const { entityName } = args;
|
|
70
|
-
const { dryRun: isDryRun, inputFile: inputFilename, skipHydrateRelationships, suffix, apiVersion,
|
|
65
|
+
const { dryRun: isDryRun, inputFile: inputFilename, skipHydrateRelationships, suffix, apiVersion, } = this.flags;
|
|
71
66
|
const { ids: positionalIds, specs } = (0, propertySpecifications_1.partitionIdsAndSpecs)(argv.slice(1));
|
|
72
67
|
const propertySpec = (0, propertySpecifications_1.parsePropertySpecificationsIntoMap)(specs);
|
|
73
68
|
if (propertySpec.has('id') || propertySpec.has('ids')) {
|
|
@@ -101,7 +96,6 @@ class UpdateEntity extends basecommand_1.BaseCommand {
|
|
|
101
96
|
skipHydrateRelationships,
|
|
102
97
|
suffix,
|
|
103
98
|
apiVersion: apiVersion,
|
|
104
|
-
force,
|
|
105
99
|
});
|
|
106
100
|
}
|
|
107
101
|
try {
|
|
@@ -142,7 +136,7 @@ function summarizeSettledUpdates(inputs, settled, skipped) {
|
|
|
142
136
|
exports.summarizeSettledUpdates = summarizeSettledUpdates;
|
|
143
137
|
async function updateEntityById(entityName, id, changes, options = {}) {
|
|
144
138
|
const client = new sdk_1.Entities();
|
|
145
|
-
const { skipHydrateRelationships, suffix, apiVersion
|
|
139
|
+
const { skipHydrateRelationships, suffix, apiVersion } = options;
|
|
146
140
|
return client.update({
|
|
147
141
|
entityName,
|
|
148
142
|
id,
|
package/oclif.manifest.json
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"version": "3.6.0-alpha-8-alpha.
|
|
2
|
+
"version": "3.6.0-alpha-8-alpha.de819d3",
|
|
3
3
|
"commands": {
|
|
4
4
|
"app:create": {
|
|
5
5
|
"id": "app:create",
|
|
@@ -1089,14 +1089,6 @@
|
|
|
1089
1089
|
"required": false,
|
|
1090
1090
|
"multiple": false
|
|
1091
1091
|
},
|
|
1092
|
-
"force": {
|
|
1093
|
-
"name": "force",
|
|
1094
|
-
"type": "boolean",
|
|
1095
|
-
"char": "F",
|
|
1096
|
-
"description": "Force update without validation. Internal use only",
|
|
1097
|
-
"required": false,
|
|
1098
|
-
"allowNo": false
|
|
1099
|
-
},
|
|
1100
1092
|
"suffix": {
|
|
1101
1093
|
"name": "suffix",
|
|
1102
1094
|
"type": "option",
|