Skip to content

Commit 216690d

Browse files
authored
Merge pull request #561 from rundeck/enh/archives-import-include
[RUN-4685] Enh/archives import include
2 parents 9ca7e5c + bce8d1d commit 216690d

4 files changed

Lines changed: 568 additions & 21 deletions

File tree

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
## Unreleased
22

3+
* Add `--include` option to `projects archives import`, matching the equivalent option on `projects archives export`, to select archive contents (`executions,config,acl,scm,webhooks,nodeSources`) with a single flag instead of individual `--include-*` booleans. Existing `--include-*`/`--noExecutions` flags still work when `--include` is not specified. [PR #561](https://github.com/rundeck/rundeck-cli/pull/561)
4+
35
## 3.0.0
46

57
* **Breaking change**: Java 17 or later is required to run the CLI and to build from source. Java 11 is no longer supported.

rd-cli-tool/src/main/java/org/rundeck/client/tool/commands/projects/Archives.java

Lines changed: 65 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ String validate(ProjectInput opts) throws InputError {
7070
}
7171

7272
@Getter @Setter
73-
static class ArchiveImportOpts extends BaseOptions{
73+
public static class ArchiveImportOpts extends BaseOptions{
7474
@CommandLine.Option(names = {"-r"}, description = "Remove Job UUIDs in imported jobs. Default: preserve job UUIDs.")
7575
boolean remove;
7676

@@ -122,6 +122,54 @@ static class ArchiveImportOpts extends BaseOptions{
122122
description = "Set options for enabled components, in the form name.key=value")
123123
Map<String, String> componentOptions;
124124

125+
@CommandLine.Option(
126+
names = {"--include"/*, "-i"*/}, //note: -i would conflict with async import
127+
description =
128+
"List of archive contents to import. [executions,config,acl,scm,webhooks,nodeSources]. Default: " +
129+
"executions. (webhooks: requires API v34. nodeSources: requires API v38).")
130+
Set<ImportFlags> includeFlags;
131+
132+
boolean isIncludeFlags() {
133+
return includeFlags != null && !includeFlags.isEmpty();
134+
}
135+
136+
Set<ImportFlags> calculateFlags(){
137+
if(isIncludeFlags()){
138+
return includeFlags;
139+
}
140+
Set<ImportFlags> importFlags = new HashSet<>();
141+
//determine via boolean options
142+
if(!isNoExecutions()){
143+
importFlags.add(ImportFlags.executions);
144+
}
145+
if(isIncludeConfig()){
146+
importFlags.add(ImportFlags.config);
147+
}
148+
if(isIncludeAcl()){
149+
importFlags.add(ImportFlags.acl);
150+
}
151+
if(isIncludeScm()){
152+
importFlags.add(ImportFlags.scm);
153+
}
154+
if(isIncludeWebhooks()){
155+
importFlags.add(ImportFlags.webhooks);
156+
}
157+
if(isIncludeNodeSources()){
158+
importFlags.add(ImportFlags.nodeSources);
159+
}
160+
161+
return importFlags;
162+
}
163+
164+
}
165+
166+
enum ImportFlags {
167+
executions,
168+
config,
169+
acl,
170+
scm,
171+
webhooks,
172+
nodeSources,
125173
}
126174

127175
@CommandLine.Command(description = "Get the status of an ongoing asynchronous import process.", name = "async-import-status")
@@ -142,24 +190,25 @@ public int importArchive(@CommandLine.Mixin ArchiveImportOpts opts) throws Input
142190
if (!input.canRead() || !input.isFile()) {
143191
throw new InputError(String.format("File is not readable or does not exist: %s", input));
144192
}
145-
if ((opts.isIncludeWebhooks() || opts.isWhkRegenAuthTokens()) && getRdTool().getClient().getApiVersion() < 34) {
146-
throw new InputError(String.format("Cannot use --include-webhooks or --regenerate-tokens with API < 34 (currently: %s)", getRdTool().getClient().getApiVersion()));
193+
Set<ImportFlags> importFlags = opts.calculateFlags();
194+
if ((importFlags.contains(ImportFlags.webhooks) || opts.isWhkRegenAuthTokens()) && getRdTool().getClient().getApiVersion() < 34) {
195+
throw new InputError(String.format("Cannot include webhooks (--include-webhooks or --include webhooks) or use --regenerate-tokens with API < 34 (currently: %s)", getRdTool().getClient().getApiVersion()));
147196
}
148-
if ((opts.isIncludeWebhooks() || opts.isWhkRegenUuid()) && getRdTool().getClient().getApiVersion() < 47) {
149-
throw new InputError(String.format("Cannot use --include-webhooks or --remove-webhooks-uuids with API < 47 (currently: %s)", getRdTool().getClient().getApiVersion()));
197+
if ((importFlags.contains(ImportFlags.webhooks) && opts.isWhkRegenUuid()) && getRdTool().getClient().getApiVersion() < 47) {
198+
throw new InputError(String.format("Cannot include webhooks (--include-webhooks or --include webhooks) with --remove-webhooks-uuids with API < 47 (currently: %s)", getRdTool().getClient().getApiVersion()));
150199
}
151-
if ((opts.isIncludeNodeSources()) && getRdTool().getClient().getApiVersion() < 38) {
152-
throw new InputError(String.format("Cannot use --include-node-sources with API < 38 (currently: %s)", getRdTool().getClient().getApiVersion()));
200+
if ((importFlags.contains(ImportFlags.nodeSources)) && getRdTool().getClient().getApiVersion() < 38) {
201+
throw new InputError(String.format("Cannot include node sources (--include-node-sources or --include nodeSources) with API < 38 (currently: %s)", getRdTool().getClient().getApiVersion()));
153202
}
154203
RequestBody body = RequestBody.create(input, Client.MEDIA_TYPE_ZIP);
155204

156205
Map<String, String> extraCompOpts = new HashMap<>();
157-
if (opts.components != null && opts.components.size() > 0) {
206+
if (opts.components != null && !opts.components.isEmpty()) {
158207
for (String component : opts.components) {
159208
extraCompOpts.put("importComponents." + component, "true");
160209
}
161210
}
162-
if (opts.componentOptions != null && opts.componentOptions.size() > 0) {
211+
if (opts.componentOptions != null && !opts.componentOptions.isEmpty()) {
163212
for (Map.Entry<String, String> stringStringEntry : opts.componentOptions.entrySet()) {
164213
extraCompOpts.put("importOpts." + stringStringEntry.getKey(), stringStringEntry.getValue());
165214
}
@@ -168,14 +217,14 @@ public int importArchive(@CommandLine.Mixin ArchiveImportOpts opts) throws Input
168217
ProjectImportStatus status = apiCall(api -> api.importProjectArchive(
169218
project,
170219
opts.isRemove() ? "remove" : "preserve",
171-
!opts.isNoExecutions(),
172-
opts.isIncludeConfig(),
173-
opts.isIncludeAcl(),
174-
opts.isIncludeScm(),
175-
opts.isIncludeWebhooks(),
220+
importFlags.contains(ImportFlags.executions),
221+
importFlags.contains(ImportFlags.config),
222+
importFlags.contains(ImportFlags.acl),
223+
importFlags.contains(ImportFlags.scm),
224+
importFlags.contains(ImportFlags.webhooks),
176225
opts.isWhkRegenAuthTokens(),
177226
opts.isWhkRegenUuid(),
178-
opts.isIncludeNodeSources(),
227+
importFlags.contains(ImportFlags.nodeSources),
179228
opts.isAsyncImportEnabled(),
180229
extraCompOpts,
181230
body
@@ -216,7 +265,7 @@ public int importArchive(@CommandLine.Mixin ArchiveImportOpts opts) throws Input
216265

217266

218267
@Getter @Setter
219-
static class ArchiveExportOpts extends BaseOptions {
268+
public static class ArchiveExportOpts extends BaseOptions {
220269

221270
@CommandLine.Option(
222271
names = {"--execids", "-e"},

0 commit comments

Comments
 (0)