@contrail/cli 3.5.3-alpha.d39a3e1 → 3.5.3-alpha.d978e28
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 +54 -11
- package/dist/api/org-config.d.ts +3 -0
- package/dist/api/org-config.js +26 -0
- package/dist/commands/instance/export.js +2 -0
- package/dist/commands/instance/import.js +2 -0
- package/dist/commands/org-config/export.d.ts +13 -0
- package/dist/commands/org-config/export.js +82 -0
- package/dist/commands/org-config/import.d.ts +12 -0
- package/dist/commands/org-config/import.js +70 -0
- package/dist/commands/workflow-templates/export.d.ts +1 -3
- package/dist/commands/workflow-templates/export.js +28 -105
- package/dist/helpers/workflow-templates/helper.d.ts +0 -1
- package/dist/helpers/workflow-templates/helper.js +5 -26
- package/oclif.manifest.json +115 -15
- package/package.json +1 -1
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.5.3-alpha.
|
|
20
|
+
@contrail/cli/3.5.3-alpha.d978e28 linux-x64 node-v24.19.0
|
|
21
21
|
$ contrail --help [COMMAND]
|
|
22
22
|
USAGE
|
|
23
23
|
$ contrail COMMAND
|
|
@@ -61,6 +61,8 @@ To get instructions on how to set up autocomplete for your shell, run `contrail
|
|
|
61
61
|
* [`contrail load custom-entity DATAFILE CONFIGFILE`](#contrail-load-custom-entity-datafile-configfile)
|
|
62
62
|
* [`contrail load line-sheet DATAFILE CONFIGFILE`](#contrail-load-line-sheet-datafile-configfile)
|
|
63
63
|
* [`contrail load upload-and-load INCOMINGFILE CONFIGFILENAME`](#contrail-load-upload-and-load-incomingfile-configfilename)
|
|
64
|
+
* [`contrail org-config export`](#contrail-org-config-export)
|
|
65
|
+
* [`contrail org-config import`](#contrail-org-config-import)
|
|
64
66
|
* [`contrail projects export PROJECTNAME`](#contrail-projects-export-projectname)
|
|
65
67
|
* [`contrail projects list`](#contrail-projects-list)
|
|
66
68
|
* [`contrail projects load TEMPLATEFILELOCATION`](#contrail-projects-load-templatefilelocation)
|
|
@@ -777,6 +779,53 @@ EXAMPLES
|
|
|
777
779
|
$ contrail load-processor upload-and-load <File Path> <Config Path>
|
|
778
780
|
```
|
|
779
781
|
|
|
782
|
+
## `contrail org-config export`
|
|
783
|
+
|
|
784
|
+
Export the org config for your Org
|
|
785
|
+
|
|
786
|
+
```
|
|
787
|
+
USAGE
|
|
788
|
+
$ contrail org-config export [-l error|warn|info|debug] [-e true|false] [-d <value>] [-f]
|
|
789
|
+
|
|
790
|
+
FLAGS
|
|
791
|
+
-d, --outDir=<value> [default: .] The directory to which to export the org config data. Defaults to the
|
|
792
|
+
current directory
|
|
793
|
+
-e, --alwaysConfirmEnv=<option> [default: true] The Environment variables
|
|
794
|
+
<options: true|false>
|
|
795
|
+
-f, --overwrite Replaces any existing export files in outDir
|
|
796
|
+
-l, --logLevel=<option> The Log Level
|
|
797
|
+
<options: error|warn|info|debug>
|
|
798
|
+
|
|
799
|
+
DESCRIPTION
|
|
800
|
+
Export the org config for your Org
|
|
801
|
+
|
|
802
|
+
EXAMPLES
|
|
803
|
+
$ contrail org-config export
|
|
804
|
+
```
|
|
805
|
+
|
|
806
|
+
## `contrail org-config import`
|
|
807
|
+
|
|
808
|
+
Upload an extracted org config
|
|
809
|
+
|
|
810
|
+
```
|
|
811
|
+
USAGE
|
|
812
|
+
$ contrail org-config import [-l error|warn|info|debug] [-e true|false] [-d <value>]
|
|
813
|
+
|
|
814
|
+
FLAGS
|
|
815
|
+
-d, --dir=<value> [default: .] The directory from which to import the org config data. Defaults to the
|
|
816
|
+
current directory. The org config data will be loaded from $dir/org-config.yml
|
|
817
|
+
-e, --alwaysConfirmEnv=<option> [default: true] The Environment variables
|
|
818
|
+
<options: true|false>
|
|
819
|
+
-l, --logLevel=<option> The Log Level
|
|
820
|
+
<options: error|warn|info|debug>
|
|
821
|
+
|
|
822
|
+
DESCRIPTION
|
|
823
|
+
Upload an extracted org config
|
|
824
|
+
|
|
825
|
+
EXAMPLES
|
|
826
|
+
$ contrail org-config import
|
|
827
|
+
```
|
|
828
|
+
|
|
780
829
|
## `contrail projects export PROJECTNAME`
|
|
781
830
|
|
|
782
831
|
Export a project.
|
|
@@ -1611,31 +1660,25 @@ EXAMPLES
|
|
|
1611
1660
|
|
|
1612
1661
|
## `contrail workflow-templates export`
|
|
1613
1662
|
|
|
1614
|
-
Export all workflows in the org.
|
|
1663
|
+
Export all workflows in the org.
|
|
1615
1664
|
|
|
1616
1665
|
```
|
|
1617
1666
|
USAGE
|
|
1618
|
-
$ contrail workflow-templates export [-l error|warn|info|debug] [-e true|false] [-f <value>] [
|
|
1619
|
-
[--overwrite]
|
|
1667
|
+
$ contrail workflow-templates export [-l error|warn|info|debug] [-e true|false] [-f <value>] [--overwrite]
|
|
1620
1668
|
|
|
1621
1669
|
FLAGS
|
|
1622
|
-
-d, --dir=<value> [default: .] Directory to write per-app workflow files
|
|
1623
1670
|
-e, --alwaysConfirmEnv=<option> [default: true] The Environment variables
|
|
1624
1671
|
<options: true|false>
|
|
1625
|
-
-f, --outFile=<value>
|
|
1672
|
+
-f, --outFile=<value> [default: workflows.yml] The location for the file to be saved
|
|
1626
1673
|
-l, --logLevel=<option> The Log Level
|
|
1627
1674
|
<options: error|warn|info|debug>
|
|
1628
1675
|
--overwrite Replaces existing files if they exist
|
|
1629
1676
|
|
|
1630
1677
|
DESCRIPTION
|
|
1631
|
-
Export all workflows in the org.
|
|
1678
|
+
Export all workflows in the org.
|
|
1632
1679
|
|
|
1633
1680
|
EXAMPLES
|
|
1634
1681
|
$ contrail workflow-templates export
|
|
1635
|
-
|
|
1636
|
-
$ contrail workflow-templates export --dir ./workflows
|
|
1637
|
-
|
|
1638
|
-
$ contrail workflow-templates export --outFile workflows.yml
|
|
1639
1682
|
```
|
|
1640
1683
|
|
|
1641
1684
|
## `contrail workflow-templates list`
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createOrgConfig = exports.updateOrgConfig = exports.getOrgConfigs = void 0;
|
|
4
|
+
const sdk_1 = require("@contrail/sdk");
|
|
5
|
+
async function getOrgConfigs(options) {
|
|
6
|
+
return new sdk_1.Entities().get({
|
|
7
|
+
entityName: 'org-config',
|
|
8
|
+
...options,
|
|
9
|
+
});
|
|
10
|
+
}
|
|
11
|
+
exports.getOrgConfigs = getOrgConfigs;
|
|
12
|
+
async function updateOrgConfig(id, changes) {
|
|
13
|
+
return new sdk_1.Entities().update({
|
|
14
|
+
entityName: 'org-config',
|
|
15
|
+
id,
|
|
16
|
+
object: changes,
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
exports.updateOrgConfig = updateOrgConfig;
|
|
20
|
+
async function createOrgConfig(orgConfig) {
|
|
21
|
+
return new sdk_1.Entities().create({
|
|
22
|
+
entityName: 'org-config',
|
|
23
|
+
object: orgConfig,
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
exports.createOrgConfig = createOrgConfig;
|
|
@@ -6,6 +6,7 @@ const core_1 = require("@oclif/core");
|
|
|
6
6
|
const getAll_1 = require("../types/getAll");
|
|
7
7
|
const export_1 = require("../users/export");
|
|
8
8
|
const export_2 = require("../groups/export");
|
|
9
|
+
const export_3 = require("../org-config/export");
|
|
9
10
|
const basecommand_1 = require("../../basecommand");
|
|
10
11
|
class ExportInstance extends basecommand_1.BaseCommand {
|
|
11
12
|
static description = 'Exports an data of an instance including types and users';
|
|
@@ -32,6 +33,7 @@ class ExportInstance extends basecommand_1.BaseCommand {
|
|
|
32
33
|
await (0, getAll_1.getAll)(this.flags.outDir, this.flags.overwrite);
|
|
33
34
|
await (0, export_1.exportUsers)(path.join(this.flags.outDir, 'users.yml'), this.flags.overwrite);
|
|
34
35
|
await (0, export_2.exportGroups)(path.join(this.flags.outDir, 'groups.yml'), this.flags.overwrite);
|
|
36
|
+
await (0, export_3.exportOrgConfig)(this.flags.outDir, this.flags.overwrite);
|
|
35
37
|
}
|
|
36
38
|
}
|
|
37
39
|
exports.default = ExportInstance;
|
|
@@ -8,6 +8,7 @@ const import_1 = require("../users/import");
|
|
|
8
8
|
const import_2 = require("../groups/import");
|
|
9
9
|
const uploadTypePropertyPolicies_1 = require("../types/uploadTypePropertyPolicies");
|
|
10
10
|
const uploadTypePolicies_1 = require("../types/uploadTypePolicies");
|
|
11
|
+
const import_3 = require("../org-config/import");
|
|
11
12
|
const basecommand_1 = require("../../basecommand");
|
|
12
13
|
class ImportInstance extends basecommand_1.BaseCommand {
|
|
13
14
|
static description = 'Import the data to an instance, including types and users';
|
|
@@ -30,6 +31,7 @@ class ImportInstance extends basecommand_1.BaseCommand {
|
|
|
30
31
|
await (0, import_2.uploadGroups)(path.join(this.flags.dir, 'groups.yml'));
|
|
31
32
|
await (0, uploadTypePropertyPolicies_1.uploadTypePropertyPolicies)(this.flags.dir);
|
|
32
33
|
await (0, uploadTypePolicies_1.uploadTypePolicies)(this.flags.dir);
|
|
34
|
+
await (0, import_3.uploadOrgConfig)(this.flags.dir);
|
|
33
35
|
}
|
|
34
36
|
}
|
|
35
37
|
exports.default = ImportInstance;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { BaseCommand } from '../../basecommand';
|
|
2
|
+
export default class ExportOrgConfig extends BaseCommand {
|
|
3
|
+
static description: string;
|
|
4
|
+
static examples: string[];
|
|
5
|
+
static flags: {
|
|
6
|
+
outDir: import("@oclif/core/lib/interfaces").OptionFlag<string, import("@oclif/core/lib/interfaces/parser").CustomOptions>;
|
|
7
|
+
overwrite: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
|
|
8
|
+
alwaysConfirmEnv: import("@oclif/core/lib/interfaces").OptionFlag<string, import("@oclif/core/lib/interfaces/parser").CustomOptions>;
|
|
9
|
+
logLevel: import("@oclif/core/lib/interfaces").OptionFlag<string, import("@oclif/core/lib/interfaces/parser").CustomOptions>;
|
|
10
|
+
};
|
|
11
|
+
run(): Promise<void>;
|
|
12
|
+
}
|
|
13
|
+
export declare function exportOrgConfig(outDir: string, overwrite: boolean): Promise<void>;
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.exportOrgConfig = void 0;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const path = tslib_1.__importStar(require("path"));
|
|
6
|
+
const chalk_1 = tslib_1.__importDefault(require("chalk"));
|
|
7
|
+
const fs_1 = tslib_1.__importDefault(require("fs"));
|
|
8
|
+
const login_1 = require("../../auth/login");
|
|
9
|
+
const js_yaml_1 = tslib_1.__importDefault(require("js-yaml"));
|
|
10
|
+
const core_1 = require("@oclif/core");
|
|
11
|
+
const file_helpers_1 = require("../../helpers/file-helpers");
|
|
12
|
+
const org_config_1 = require("../../api/org-config");
|
|
13
|
+
const basecommand_1 = require("../../basecommand");
|
|
14
|
+
const logger_1 = tslib_1.__importDefault(require("../../logger"));
|
|
15
|
+
const ORG_SPECIFIC_FIELDS = [
|
|
16
|
+
'id',
|
|
17
|
+
'orgId',
|
|
18
|
+
'createdOn',
|
|
19
|
+
'updatedOn',
|
|
20
|
+
'createdById',
|
|
21
|
+
'updatedById',
|
|
22
|
+
'createdBy',
|
|
23
|
+
'updatedBy',
|
|
24
|
+
];
|
|
25
|
+
class ExportOrgConfig extends basecommand_1.BaseCommand {
|
|
26
|
+
static description = 'Export the org config for your Org';
|
|
27
|
+
static examples = [
|
|
28
|
+
`$ contrail org-config export
|
|
29
|
+
`,
|
|
30
|
+
];
|
|
31
|
+
static flags = {
|
|
32
|
+
...basecommand_1.BaseCommand.baseFlags,
|
|
33
|
+
outDir: core_1.Flags.string({
|
|
34
|
+
char: 'd',
|
|
35
|
+
description: 'The directory to which to export the org config data. Defaults to the current directory',
|
|
36
|
+
required: false,
|
|
37
|
+
default: '.',
|
|
38
|
+
}),
|
|
39
|
+
overwrite: core_1.Flags.boolean({
|
|
40
|
+
char: 'f',
|
|
41
|
+
description: 'Replaces any existing export files in outDir',
|
|
42
|
+
required: false,
|
|
43
|
+
default: false,
|
|
44
|
+
}),
|
|
45
|
+
};
|
|
46
|
+
async run() {
|
|
47
|
+
await exportOrgConfig(this.flags.outDir, this.flags.overwrite);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
exports.default = ExportOrgConfig;
|
|
51
|
+
async function exportOrgConfig(outDir, overwrite) {
|
|
52
|
+
try {
|
|
53
|
+
await (0, login_1.authUser)();
|
|
54
|
+
logger_1.default.info(`${chalk_1.default.yellow.bold('ORG CONFIG')} Exporting`);
|
|
55
|
+
const orgConfigs = await (0, org_config_1.getOrgConfigs)();
|
|
56
|
+
if (!Array.isArray(orgConfigs) || orgConfigs.length === 0) {
|
|
57
|
+
logger_1.default.info(`${chalk_1.default.yellow.bold('ORG CONFIG')} No org config found. Skipping.`);
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
const orgConfig = { ...orgConfigs[0] };
|
|
61
|
+
for (const field of ORG_SPECIFIC_FIELDS) {
|
|
62
|
+
delete orgConfig[field];
|
|
63
|
+
}
|
|
64
|
+
await saveData(orgConfig, outDir, overwrite);
|
|
65
|
+
logger_1.default.info(`${chalk_1.default.yellow.bold('ORG CONFIG')} Exported`);
|
|
66
|
+
}
|
|
67
|
+
catch (e) {
|
|
68
|
+
logger_1.default.info(`${chalk_1.default.red.bold('FAIL')} Org Config Export Failed. ${e}`);
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
logger_1.default.info(`${chalk_1.default.green.bold('COMPLETE')} Org Config Export Complete.`);
|
|
72
|
+
}
|
|
73
|
+
exports.exportOrgConfig = exportOrgConfig;
|
|
74
|
+
async function saveData(data, dir, overwrite) {
|
|
75
|
+
const CURRENT_DIR = process.cwd();
|
|
76
|
+
const yamlStr = js_yaml_1.default.dump(data);
|
|
77
|
+
const pathToWrite = path.join(CURRENT_DIR, dir, 'org-config.yml');
|
|
78
|
+
if (fs_1.default.existsSync(pathToWrite)) {
|
|
79
|
+
await (0, file_helpers_1.safeFileOverwrite)(pathToWrite, overwrite);
|
|
80
|
+
}
|
|
81
|
+
fs_1.default.writeFileSync(pathToWrite, yamlStr, 'utf8');
|
|
82
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { BaseCommand } from '../../basecommand';
|
|
2
|
+
export default class ImportOrgConfig extends BaseCommand {
|
|
3
|
+
static description: string;
|
|
4
|
+
static examples: string[];
|
|
5
|
+
static flags: {
|
|
6
|
+
dir: import("@oclif/core/lib/interfaces").OptionFlag<string, import("@oclif/core/lib/interfaces/parser").CustomOptions>;
|
|
7
|
+
alwaysConfirmEnv: import("@oclif/core/lib/interfaces").OptionFlag<string, import("@oclif/core/lib/interfaces/parser").CustomOptions>;
|
|
8
|
+
logLevel: import("@oclif/core/lib/interfaces").OptionFlag<string, import("@oclif/core/lib/interfaces/parser").CustomOptions>;
|
|
9
|
+
};
|
|
10
|
+
run(): Promise<void>;
|
|
11
|
+
}
|
|
12
|
+
export declare function uploadOrgConfig(dir: string): Promise<void>;
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.uploadOrgConfig = void 0;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const path = tslib_1.__importStar(require("path"));
|
|
6
|
+
const chalk_1 = tslib_1.__importDefault(require("chalk"));
|
|
7
|
+
const fs_1 = tslib_1.__importDefault(require("fs"));
|
|
8
|
+
const login_1 = require("../../auth/login");
|
|
9
|
+
const js_yaml_1 = tslib_1.__importDefault(require("js-yaml"));
|
|
10
|
+
const core_1 = require("@oclif/core");
|
|
11
|
+
const org_config_1 = require("../../api/org-config");
|
|
12
|
+
const basecommand_1 = require("../../basecommand");
|
|
13
|
+
const logger_1 = tslib_1.__importDefault(require("../../logger"));
|
|
14
|
+
class ImportOrgConfig extends basecommand_1.BaseCommand {
|
|
15
|
+
static description = 'Upload an extracted org config';
|
|
16
|
+
static examples = [
|
|
17
|
+
`$ contrail org-config import
|
|
18
|
+
`,
|
|
19
|
+
];
|
|
20
|
+
static flags = {
|
|
21
|
+
...basecommand_1.BaseCommand.baseFlags,
|
|
22
|
+
dir: core_1.Flags.string({
|
|
23
|
+
char: 'd',
|
|
24
|
+
description: 'The directory from which to import the org config data. Defaults to the current directory. The org config data will be loaded from $dir/org-config.yml',
|
|
25
|
+
required: false,
|
|
26
|
+
default: '.',
|
|
27
|
+
}),
|
|
28
|
+
};
|
|
29
|
+
async run() {
|
|
30
|
+
await uploadOrgConfig(this.flags.dir);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
exports.default = ImportOrgConfig;
|
|
34
|
+
async function uploadOrgConfig(dir) {
|
|
35
|
+
try {
|
|
36
|
+
await (0, login_1.authUser)();
|
|
37
|
+
logger_1.default.info(`${chalk_1.default.yellow.bold('ORG CONFIG')} Uploading`);
|
|
38
|
+
const orgConfig = loadOrgConfig(dir);
|
|
39
|
+
if (!orgConfig || typeof orgConfig !== 'object') {
|
|
40
|
+
logger_1.default.info(`${chalk_1.default.yellow.bold('ORG CONFIG')} No org config found in ${dir}. Skipping.`);
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
const existingOrgConfigs = await (0, org_config_1.getOrgConfigs)();
|
|
44
|
+
if (Array.isArray(existingOrgConfigs) && existingOrgConfigs.length > 0) {
|
|
45
|
+
await (0, org_config_1.updateOrgConfig)(existingOrgConfigs[0].id, orgConfig);
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
await (0, org_config_1.createOrgConfig)(orgConfig);
|
|
49
|
+
}
|
|
50
|
+
logger_1.default.info(`${chalk_1.default.yellow.bold('ORG CONFIG')} Uploaded`);
|
|
51
|
+
}
|
|
52
|
+
catch (e) {
|
|
53
|
+
logger_1.default.info(`${chalk_1.default.red.bold('FAIL')} Org Config Upload Failed. ${e}`);
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
logger_1.default.info(`${chalk_1.default.green.bold('COMPLETE')} Org Config Upload Complete.`);
|
|
57
|
+
}
|
|
58
|
+
exports.uploadOrgConfig = uploadOrgConfig;
|
|
59
|
+
function loadOrgConfig(fromDir) {
|
|
60
|
+
const filePath = path.join(fromDir, 'org-config.yml');
|
|
61
|
+
if (!fs_1.default.existsSync(filePath)) {
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
try {
|
|
65
|
+
return js_yaml_1.default.load(fs_1.default.readFileSync(filePath, 'utf8'));
|
|
66
|
+
}
|
|
67
|
+
catch (e) {
|
|
68
|
+
throw new Error(`ERROR PARSING YAML: ${e}`);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
@@ -5,12 +5,10 @@ export default class ExportWorkflows extends BaseCommand {
|
|
|
5
5
|
static examples: string[];
|
|
6
6
|
static flags: {
|
|
7
7
|
outFile: import("@oclif/core/lib/interfaces").OptionFlag<string, import("@oclif/core/lib/interfaces/parser").CustomOptions>;
|
|
8
|
-
dir: import("@oclif/core/lib/interfaces").OptionFlag<string, import("@oclif/core/lib/interfaces/parser").CustomOptions>;
|
|
9
8
|
overwrite: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
|
|
10
9
|
alwaysConfirmEnv: import("@oclif/core/lib/interfaces").OptionFlag<string, import("@oclif/core/lib/interfaces/parser").CustomOptions>;
|
|
11
10
|
logLevel: import("@oclif/core/lib/interfaces").OptionFlag<string, import("@oclif/core/lib/interfaces/parser").CustomOptions>;
|
|
12
11
|
};
|
|
13
12
|
run(): Promise<void>;
|
|
14
13
|
}
|
|
15
|
-
export declare function
|
|
16
|
-
export declare function exportWorkflowsToFile(fileLocation: string, overwrite: boolean): Promise<void>;
|
|
14
|
+
export declare function exportWorkflows(fileLocation: string, overwrite: boolean): Promise<void>;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.exportWorkflows = exports.DEFAULT_FILE_LOCATION = void 0;
|
|
4
4
|
const tslib_1 = require("tslib");
|
|
5
5
|
const path = tslib_1.__importStar(require("path"));
|
|
6
6
|
const chalk_1 = tslib_1.__importDefault(require("chalk"));
|
|
@@ -11,30 +11,22 @@ const js_yaml_1 = tslib_1.__importDefault(require("js-yaml"));
|
|
|
11
11
|
const core_1 = require("@oclif/core");
|
|
12
12
|
const file_helpers_1 = require("../../helpers/file-helpers");
|
|
13
13
|
const event_workflow_templates_1 = require("../../api/event-workflow-templates");
|
|
14
|
-
const schedules_1 = require("../../api/schedules");
|
|
15
|
-
const apps_1 = require("../../api/apps");
|
|
16
14
|
const helper_1 = require("../../helpers/workflow-templates/helper");
|
|
17
15
|
const basecommand_1 = require("../../basecommand");
|
|
18
16
|
exports.DEFAULT_FILE_LOCATION = 'workflows.yml';
|
|
19
17
|
class ExportWorkflows extends basecommand_1.BaseCommand {
|
|
20
|
-
static description = 'Export all workflows in the org.
|
|
18
|
+
static description = 'Export all workflows in the org.';
|
|
21
19
|
static examples = [
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
'$ contrail workflow-templates export --outFile workflows.yml',
|
|
20
|
+
`$ contrail workflow-templates export
|
|
21
|
+
`,
|
|
25
22
|
];
|
|
26
23
|
static flags = {
|
|
27
24
|
...basecommand_1.BaseCommand.baseFlags,
|
|
28
25
|
outFile: core_1.Flags.string({
|
|
29
26
|
char: 'f',
|
|
30
|
-
description: '
|
|
27
|
+
description: 'The location for the file to be saved',
|
|
31
28
|
required: false,
|
|
32
|
-
|
|
33
|
-
dir: core_1.Flags.string({
|
|
34
|
-
char: 'd',
|
|
35
|
-
description: 'Directory to write per-app workflow files',
|
|
36
|
-
required: false,
|
|
37
|
-
default: '.',
|
|
29
|
+
default: exports.DEFAULT_FILE_LOCATION,
|
|
38
30
|
}),
|
|
39
31
|
overwrite: core_1.Flags.boolean({
|
|
40
32
|
description: 'Replaces existing files if they exist',
|
|
@@ -46,12 +38,7 @@ class ExportWorkflows extends basecommand_1.BaseCommand {
|
|
|
46
38
|
try {
|
|
47
39
|
await (0, login_1.authUser)();
|
|
48
40
|
this.log(`${chalk_1.default.blue.bold('START')} Getting Workflows.`);
|
|
49
|
-
|
|
50
|
-
await exportWorkflowsToFile(this.flags.outFile, this.flags.overwrite);
|
|
51
|
-
}
|
|
52
|
-
else {
|
|
53
|
-
await exportWorkflowsByApp(this.flags.dir ?? '.', this.flags.overwrite);
|
|
54
|
-
}
|
|
41
|
+
await exportWorkflows(this.flags.outFile ?? exports.DEFAULT_FILE_LOCATION, this.flags.overwrite);
|
|
55
42
|
this.log(`${chalk_1.default.yellow.bold('WORKFLOWS')} Done`);
|
|
56
43
|
}
|
|
57
44
|
catch (e) {
|
|
@@ -62,95 +49,31 @@ class ExportWorkflows extends basecommand_1.BaseCommand {
|
|
|
62
49
|
}
|
|
63
50
|
}
|
|
64
51
|
exports.default = ExportWorkflows;
|
|
65
|
-
async function
|
|
52
|
+
async function exportWorkflows(fileLocation, overwrite) {
|
|
66
53
|
const allWorkflowsInOrg = await (0, event_workflow_templates_1.getExistingWorkflowTemplates)();
|
|
67
|
-
const allSchedules = await (0, schedules_1.getExistingSchedules)();
|
|
68
|
-
const installedApps = await (0, apps_1.getInstalledApps)();
|
|
69
|
-
const appIdToIdentifier = new Map(installedApps.map((a) => [a.appId, a.app.identifier]));
|
|
70
|
-
const workflowsByApp = new Map();
|
|
71
|
-
const unassigned = [];
|
|
72
|
-
for (const workflow of allWorkflowsInOrg) {
|
|
73
|
-
let appIdentifier = workflow.supportingAppId
|
|
74
|
-
? appIdToIdentifier.get(workflow.supportingAppId)
|
|
75
|
-
: undefined;
|
|
76
|
-
// If no supportingAppId, try to extract app identifier from workflow identifier
|
|
77
|
-
// Format: @{appIdentifier}@{randomId}:{workflowName}
|
|
78
|
-
if (!appIdentifier && workflow.identifier) {
|
|
79
|
-
const match = workflow.identifier.match(/^@([^@]+)@/);
|
|
80
|
-
if (match) {
|
|
81
|
-
// Keep the @ prefix in the appIdentifier
|
|
82
|
-
appIdentifier = `@${match[1]}`;
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
if (appIdentifier) {
|
|
86
|
-
if (!workflowsByApp.has(appIdentifier)) {
|
|
87
|
-
workflowsByApp.set(appIdentifier, []);
|
|
88
|
-
}
|
|
89
|
-
const workflows = workflowsByApp.get(appIdentifier);
|
|
90
|
-
if (workflows) {
|
|
91
|
-
workflows.push(workflow);
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
else {
|
|
95
|
-
unassigned.push(workflow);
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
const resolvedDir = path.resolve(process.cwd(), outputDir);
|
|
99
|
-
for (const [appIdentifier, workflows] of workflowsByApp.entries()) {
|
|
100
|
-
const exportObj = { appIdentifier, workflows: [] };
|
|
101
|
-
for (const workflow of workflows) {
|
|
102
|
-
exportObj.workflows.push(await buildExportWorkflow(workflow, allSchedules));
|
|
103
|
-
}
|
|
104
|
-
const safeAppIdentifier = appIdentifier.replace(/[\\/]/g, '-');
|
|
105
|
-
const filePath = path.join(resolvedDir, `workflows-${safeAppIdentifier}.yml`);
|
|
106
|
-
await writeYamlFile(exportObj, filePath, overwrite);
|
|
107
|
-
console.log(`${chalk_1.default.green('EXPORTED')} ${filePath}`);
|
|
108
|
-
}
|
|
109
|
-
if (unassigned.length > 0) {
|
|
110
|
-
const unassignedObj = { workflows: [] };
|
|
111
|
-
for (const workflow of unassigned) {
|
|
112
|
-
unassignedObj.workflows.push(await buildExportWorkflow(workflow, allSchedules));
|
|
113
|
-
}
|
|
114
|
-
const unassignedFilePath = path.join(resolvedDir, 'workflows-unassigned.yml');
|
|
115
|
-
await writeYamlFile(unassignedObj, unassignedFilePath, overwrite);
|
|
116
|
-
console.log(`${chalk_1.default.yellow('EXPORTED')} ${unassignedFilePath} (unassigned workflows)`);
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
exports.exportWorkflowsByApp = exportWorkflowsByApp;
|
|
120
|
-
async function exportWorkflowsToFile(fileLocation, overwrite) {
|
|
121
|
-
const allWorkflowsInOrg = await (0, event_workflow_templates_1.getExistingWorkflowTemplates)();
|
|
122
|
-
const allSchedules = await (0, schedules_1.getExistingSchedules)();
|
|
123
54
|
const workflowsObj = { workflows: [] };
|
|
124
55
|
for (const workflow of allWorkflowsInOrg) {
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
'isActive',
|
|
137
|
-
'messageGroup',
|
|
138
|
-
'dynamicMessageGroupId',
|
|
139
|
-
'parallelWorkerCount',
|
|
140
|
-
'workflowDefinition',
|
|
141
|
-
]);
|
|
142
|
-
const schedules = allSchedules.filter((s) => s.ownerReference === `event-workflow-template:${workflow.id}`);
|
|
143
|
-
if (schedules.length > 0) {
|
|
144
|
-
exportWorkflow.crons = schedules.map((s) => ({ name: s.name, cron: s.cron }));
|
|
56
|
+
const exportWorkflow = lodash_1.default.pick(workflow, [
|
|
57
|
+
'triggerKey',
|
|
58
|
+
'workflowDefinition',
|
|
59
|
+
'name',
|
|
60
|
+
'isActive',
|
|
61
|
+
'identifier',
|
|
62
|
+
'messageGroup',
|
|
63
|
+
'dynamicMessageGroupId',
|
|
64
|
+
]);
|
|
65
|
+
await (0, helper_1.populateActionIdentifiers)(exportWorkflow);
|
|
66
|
+
workflowsObj.workflows.push(exportWorkflow);
|
|
145
67
|
}
|
|
146
|
-
await (
|
|
147
|
-
(0, helper_1.extractShortActionKeys)(exportWorkflow);
|
|
148
|
-
return exportWorkflow;
|
|
68
|
+
await saveData(workflowsObj, fileLocation, overwrite);
|
|
149
69
|
}
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
70
|
+
exports.exportWorkflows = exportWorkflows;
|
|
71
|
+
async function saveData(data, fileLocation, overwrite) {
|
|
72
|
+
const yamlStr = js_yaml_1.default.dump(data);
|
|
73
|
+
const CURRENT_DIR = process.cwd();
|
|
74
|
+
const pathToWrite = path.resolve(path.join(CURRENT_DIR, fileLocation));
|
|
75
|
+
if (fs_1.default.existsSync(pathToWrite)) {
|
|
76
|
+
await (0, file_helpers_1.safeFileOverwrite)(pathToWrite, overwrite);
|
|
153
77
|
}
|
|
154
|
-
fs_1.default.
|
|
155
|
-
fs_1.default.writeFileSync(absolutePath, js_yaml_1.default.dump(data), 'utf8');
|
|
78
|
+
fs_1.default.writeFileSync(pathToWrite, yamlStr, 'utf8');
|
|
156
79
|
}
|
|
@@ -18,4 +18,3 @@ export declare class WorkflowTemplateDeployer {
|
|
|
18
18
|
export declare function deleteWorkflowTemplates(): Promise<void>;
|
|
19
19
|
export declare function localDeployWorkflowTemplate(saveFileLocation: string): Promise<void>;
|
|
20
20
|
export declare function populateActionIdentifiers(workflowTemplate: WorkflowTemplate): Promise<void>;
|
|
21
|
-
export declare function extractShortActionKeys(workflowTemplate: WorkflowTemplate): void;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.populateActionIdentifiers = exports.localDeployWorkflowTemplate = exports.deleteWorkflowTemplates = exports.WorkflowTemplateDeployer = exports.getActionByIdentifier = exports.getWorkflowTemplateIdentifier = exports.LocalWorkflowTemplateDeployer = void 0;
|
|
4
4
|
const tslib_1 = require("tslib");
|
|
5
5
|
const util_1 = require("@contrail/util");
|
|
6
6
|
const chalk_1 = tslib_1.__importDefault(require("chalk"));
|
|
@@ -20,6 +20,7 @@ class LocalWorkflowTemplateDeployer {
|
|
|
20
20
|
const existingWorkflows = await (0, event_workflow_templates_1.getExistingWorkflowTemplates)();
|
|
21
21
|
// UPSERT / DELETE BASED ON WORKFLOW TEMPLATES IDENTIFIER
|
|
22
22
|
logger_1.default.info(`${chalk_1.default.yellow.bold('WORKFLOW TEMPLATES')} Deploying workflow templates.`);
|
|
23
|
+
logger_1.default.info(wtDeclaration);
|
|
23
24
|
for (const workflowKey of Object.keys(wtDeclaration.workflows)) {
|
|
24
25
|
await this.deployWorkflowTemplate(wtDeclaration.workflows[workflowKey], existingWorkflows, wtDeclaration.appIdentifier);
|
|
25
26
|
}
|
|
@@ -43,8 +44,6 @@ class LocalWorkflowTemplateDeployer {
|
|
|
43
44
|
isActive: workflowTemplate.isActive,
|
|
44
45
|
supportingAppId: workflowTemplate.supportingAppId,
|
|
45
46
|
messageGroupId: workflowTemplate.messageGroupId,
|
|
46
|
-
messageGroup: workflowTemplate.messageGroup,
|
|
47
|
-
dynamicMessageGroupId: workflowTemplate.dynamicMessageGroupId,
|
|
48
47
|
parallelWorkerCount: workflowTemplate.parallelWorkerCount,
|
|
49
48
|
};
|
|
50
49
|
const newWorkflowTemplate = await (0, event_workflow_templates_1.createWorkflowTemplate)(newObject);
|
|
@@ -56,10 +55,8 @@ class LocalWorkflowTemplateDeployer {
|
|
|
56
55
|
}
|
|
57
56
|
async populateActionIds(workflowTemplate, workflowKey, appIdentifier) {
|
|
58
57
|
const installedApps = await (0, apps_1.getInstalledApps)();
|
|
59
|
-
const appOrg = installedApps.find((x) => x.app
|
|
60
|
-
|
|
61
|
-
throw new Error(`Could not find installed app with identifier "${appIdentifier}". Make sure the app is installed in this org before importing workflows.`);
|
|
62
|
-
}
|
|
58
|
+
const appOrg = installedApps.find((x) => x.app.identifier === appIdentifier);
|
|
59
|
+
logger_1.default.info('workflow template:', JSON.stringify(workflowTemplate, null, 2));
|
|
63
60
|
if (!workflowTemplate?.workflowDefinition?.paths) {
|
|
64
61
|
return;
|
|
65
62
|
}
|
|
@@ -89,7 +86,7 @@ class LocalWorkflowTemplateDeployer {
|
|
|
89
86
|
}
|
|
90
87
|
}
|
|
91
88
|
async createWorkflowSchedule(workflowTemplate, workflowId) {
|
|
92
|
-
if (!workflowTemplate?.crons?.length) {
|
|
89
|
+
if (!workflowTemplate?.crons?.length || !workflowTemplate.id) {
|
|
93
90
|
return;
|
|
94
91
|
}
|
|
95
92
|
const crons = [];
|
|
@@ -286,21 +283,3 @@ async function populateActionIdentifiers(workflowTemplate) {
|
|
|
286
283
|
}
|
|
287
284
|
}
|
|
288
285
|
exports.populateActionIdentifiers = populateActionIdentifiers;
|
|
289
|
-
function extractShortActionKeys(workflowTemplate) {
|
|
290
|
-
if (!workflowTemplate?.workflowDefinition?.paths) {
|
|
291
|
-
return;
|
|
292
|
-
}
|
|
293
|
-
for (const wfPath of workflowTemplate.workflowDefinition.paths) {
|
|
294
|
-
if (!wfPath?.actionDefinitionConfigs) {
|
|
295
|
-
continue;
|
|
296
|
-
}
|
|
297
|
-
for (const actionConfig of wfPath.actionDefinitionConfigs) {
|
|
298
|
-
if (actionConfig.action?.includes(':')) {
|
|
299
|
-
// Full identifier format: "app-id@version:action-name" -> "action-name"
|
|
300
|
-
actionConfig.action = actionConfig.action.split(':').pop();
|
|
301
|
-
}
|
|
302
|
-
delete actionConfig.identifier;
|
|
303
|
-
}
|
|
304
|
-
}
|
|
305
|
-
}
|
|
306
|
-
exports.extractShortActionKeys = extractShortActionKeys;
|
package/oclif.manifest.json
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"version": "3.5.3-alpha.
|
|
2
|
+
"version": "3.5.3-alpha.d978e28",
|
|
3
3
|
"commands": {
|
|
4
4
|
"app:create": {
|
|
5
5
|
"id": "app:create",
|
|
@@ -1239,6 +1239,116 @@
|
|
|
1239
1239
|
}
|
|
1240
1240
|
}
|
|
1241
1241
|
},
|
|
1242
|
+
"org-config:export": {
|
|
1243
|
+
"id": "org-config:export",
|
|
1244
|
+
"description": "Export the org config for your Org",
|
|
1245
|
+
"strict": true,
|
|
1246
|
+
"pluginName": "@contrail/cli",
|
|
1247
|
+
"pluginAlias": "@contrail/cli",
|
|
1248
|
+
"pluginType": "core",
|
|
1249
|
+
"aliases": [],
|
|
1250
|
+
"examples": [
|
|
1251
|
+
"$ contrail org-config export\n"
|
|
1252
|
+
],
|
|
1253
|
+
"flags": {
|
|
1254
|
+
"logLevel": {
|
|
1255
|
+
"name": "logLevel",
|
|
1256
|
+
"type": "option",
|
|
1257
|
+
"char": "l",
|
|
1258
|
+
"description": "The Log Level",
|
|
1259
|
+
"required": false,
|
|
1260
|
+
"multiple": false,
|
|
1261
|
+
"options": [
|
|
1262
|
+
"error",
|
|
1263
|
+
"warn",
|
|
1264
|
+
"info",
|
|
1265
|
+
"debug"
|
|
1266
|
+
]
|
|
1267
|
+
},
|
|
1268
|
+
"alwaysConfirmEnv": {
|
|
1269
|
+
"name": "alwaysConfirmEnv",
|
|
1270
|
+
"type": "option",
|
|
1271
|
+
"char": "e",
|
|
1272
|
+
"description": "The Environment variables",
|
|
1273
|
+
"required": false,
|
|
1274
|
+
"multiple": false,
|
|
1275
|
+
"options": [
|
|
1276
|
+
"true",
|
|
1277
|
+
"false"
|
|
1278
|
+
],
|
|
1279
|
+
"default": "true"
|
|
1280
|
+
},
|
|
1281
|
+
"outDir": {
|
|
1282
|
+
"name": "outDir",
|
|
1283
|
+
"type": "option",
|
|
1284
|
+
"char": "d",
|
|
1285
|
+
"description": "The directory to which to export the org config data. Defaults to the current directory",
|
|
1286
|
+
"required": false,
|
|
1287
|
+
"multiple": false,
|
|
1288
|
+
"default": "."
|
|
1289
|
+
},
|
|
1290
|
+
"overwrite": {
|
|
1291
|
+
"name": "overwrite",
|
|
1292
|
+
"type": "boolean",
|
|
1293
|
+
"char": "f",
|
|
1294
|
+
"description": "Replaces any existing export files in outDir",
|
|
1295
|
+
"required": false,
|
|
1296
|
+
"allowNo": false
|
|
1297
|
+
}
|
|
1298
|
+
},
|
|
1299
|
+
"args": {}
|
|
1300
|
+
},
|
|
1301
|
+
"org-config:import": {
|
|
1302
|
+
"id": "org-config:import",
|
|
1303
|
+
"description": "Upload an extracted org config",
|
|
1304
|
+
"strict": true,
|
|
1305
|
+
"pluginName": "@contrail/cli",
|
|
1306
|
+
"pluginAlias": "@contrail/cli",
|
|
1307
|
+
"pluginType": "core",
|
|
1308
|
+
"aliases": [],
|
|
1309
|
+
"examples": [
|
|
1310
|
+
"$ contrail org-config import\n"
|
|
1311
|
+
],
|
|
1312
|
+
"flags": {
|
|
1313
|
+
"logLevel": {
|
|
1314
|
+
"name": "logLevel",
|
|
1315
|
+
"type": "option",
|
|
1316
|
+
"char": "l",
|
|
1317
|
+
"description": "The Log Level",
|
|
1318
|
+
"required": false,
|
|
1319
|
+
"multiple": false,
|
|
1320
|
+
"options": [
|
|
1321
|
+
"error",
|
|
1322
|
+
"warn",
|
|
1323
|
+
"info",
|
|
1324
|
+
"debug"
|
|
1325
|
+
]
|
|
1326
|
+
},
|
|
1327
|
+
"alwaysConfirmEnv": {
|
|
1328
|
+
"name": "alwaysConfirmEnv",
|
|
1329
|
+
"type": "option",
|
|
1330
|
+
"char": "e",
|
|
1331
|
+
"description": "The Environment variables",
|
|
1332
|
+
"required": false,
|
|
1333
|
+
"multiple": false,
|
|
1334
|
+
"options": [
|
|
1335
|
+
"true",
|
|
1336
|
+
"false"
|
|
1337
|
+
],
|
|
1338
|
+
"default": "true"
|
|
1339
|
+
},
|
|
1340
|
+
"dir": {
|
|
1341
|
+
"name": "dir",
|
|
1342
|
+
"type": "option",
|
|
1343
|
+
"char": "d",
|
|
1344
|
+
"description": "The directory from which to import the org config data. Defaults to the current directory. The org config data will be loaded from $dir/org-config.yml",
|
|
1345
|
+
"required": false,
|
|
1346
|
+
"multiple": false,
|
|
1347
|
+
"default": "."
|
|
1348
|
+
}
|
|
1349
|
+
},
|
|
1350
|
+
"args": {}
|
|
1351
|
+
},
|
|
1242
1352
|
"projects:export": {
|
|
1243
1353
|
"id": "projects:export",
|
|
1244
1354
|
"description": "Export a project.",
|
|
@@ -2956,16 +3066,14 @@
|
|
|
2956
3066
|
},
|
|
2957
3067
|
"workflow-templates:export": {
|
|
2958
3068
|
"id": "workflow-templates:export",
|
|
2959
|
-
"description": "Export all workflows in the org.
|
|
3069
|
+
"description": "Export all workflows in the org.",
|
|
2960
3070
|
"strict": true,
|
|
2961
3071
|
"pluginName": "@contrail/cli",
|
|
2962
3072
|
"pluginAlias": "@contrail/cli",
|
|
2963
3073
|
"pluginType": "core",
|
|
2964
3074
|
"aliases": [],
|
|
2965
3075
|
"examples": [
|
|
2966
|
-
"$ contrail workflow-templates export"
|
|
2967
|
-
"$ contrail workflow-templates export --dir ./workflows",
|
|
2968
|
-
"$ contrail workflow-templates export --outFile workflows.yml"
|
|
3076
|
+
"$ contrail workflow-templates export\n"
|
|
2969
3077
|
],
|
|
2970
3078
|
"flags": {
|
|
2971
3079
|
"logLevel": {
|
|
@@ -2999,18 +3107,10 @@
|
|
|
2999
3107
|
"name": "outFile",
|
|
3000
3108
|
"type": "option",
|
|
3001
3109
|
"char": "f",
|
|
3002
|
-
"description": "
|
|
3003
|
-
"required": false,
|
|
3004
|
-
"multiple": false
|
|
3005
|
-
},
|
|
3006
|
-
"dir": {
|
|
3007
|
-
"name": "dir",
|
|
3008
|
-
"type": "option",
|
|
3009
|
-
"char": "d",
|
|
3010
|
-
"description": "Directory to write per-app workflow files",
|
|
3110
|
+
"description": "The location for the file to be saved",
|
|
3011
3111
|
"required": false,
|
|
3012
3112
|
"multiple": false,
|
|
3013
|
-
"default": "."
|
|
3113
|
+
"default": "workflows.yml"
|
|
3014
3114
|
},
|
|
3015
3115
|
"overwrite": {
|
|
3016
3116
|
"name": "overwrite",
|