@squiz/dxp-cli-next 5.10.0-develop.1 → 5.10.0-develop.11
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 +1 -0
- package/lib/datastore/simulator/clear/clear.d.ts +3 -0
- package/lib/datastore/simulator/clear/clear.js +70 -0
- package/lib/datastore/simulator/clear/clear.spec.d.ts +1 -0
- package/lib/datastore/simulator/clear/clear.spec.js +224 -0
- package/lib/datastore/simulator/list/list.d.ts +3 -0
- package/lib/datastore/simulator/list/list.js +118 -0
- package/lib/datastore/simulator/list/list.spec.d.ts +1 -0
- package/lib/datastore/simulator/list/list.spec.js +95 -0
- package/lib/datastore/simulator/pause/pause.d.ts +3 -0
- package/lib/datastore/simulator/pause/pause.js +85 -0
- package/lib/datastore/simulator/pause/pause.spec.d.ts +1 -0
- package/lib/datastore/simulator/pause/pause.spec.js +90 -0
- package/lib/datastore/simulator/remove/remove.js +1 -1
- package/lib/datastore/simulator/resume/resume.d.ts +3 -0
- package/lib/datastore/simulator/resume/resume.js +85 -0
- package/lib/datastore/simulator/resume/resume.spec.d.ts +1 -0
- package/lib/datastore/simulator/resume/resume.spec.js +90 -0
- package/lib/datastore/simulator/simulatorCommand.js +11 -1
- package/lib/datastore/simulator/upgrade/upgrade.d.ts +3 -0
- package/lib/datastore/simulator/upgrade/upgrade.js +160 -0
- package/lib/datastore/simulator/upgrade/upgrade.spec.d.ts +1 -0
- package/lib/datastore/simulator/upgrade/upgrade.spec.js +204 -0
- package/lib/datastore/simulator/utils.d.ts +2 -0
- package/lib/datastore/simulator/utils.js +4 -5
- package/package.json +2 -2
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
25
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
26
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
27
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
28
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
29
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
30
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
31
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
32
|
+
});
|
|
33
|
+
};
|
|
34
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
35
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
36
|
+
};
|
|
37
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
38
|
+
const pause_1 = __importDefault(require("./pause"));
|
|
39
|
+
const utils = __importStar(require("../utils"));
|
|
40
|
+
const logSpy = jest.spyOn(global.console, 'log');
|
|
41
|
+
const exitSpy = jest.spyOn(process, 'exit').mockImplementation(() => {
|
|
42
|
+
return undefined;
|
|
43
|
+
}); // prevent process exit on error
|
|
44
|
+
beforeEach(() => {
|
|
45
|
+
jest.resetAllMocks();
|
|
46
|
+
});
|
|
47
|
+
describe('datastoreSimulatorPause', () => {
|
|
48
|
+
it('should pause a simulator', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
49
|
+
const checkUpdateAvailableSpy = jest
|
|
50
|
+
.spyOn(utils, 'checkUpdateAvailable')
|
|
51
|
+
.mockImplementation(() => {
|
|
52
|
+
return Promise.resolve(null);
|
|
53
|
+
});
|
|
54
|
+
const forcePromptSpy = jest
|
|
55
|
+
.spyOn(utils, 'forcePrompt')
|
|
56
|
+
.mockResolvedValue(true);
|
|
57
|
+
let executeCommandCount = 0;
|
|
58
|
+
const executeCommandSpy = jest
|
|
59
|
+
.spyOn(utils, 'executeCommand')
|
|
60
|
+
.mockImplementation((cmd, opt) => {
|
|
61
|
+
executeCommandCount++;
|
|
62
|
+
switch (executeCommandCount) {
|
|
63
|
+
case 1:
|
|
64
|
+
expect(cmd).toStrictEqual('docker -v');
|
|
65
|
+
return Promise.resolve('Docker version 20.10.23, build 7155243');
|
|
66
|
+
case 2:
|
|
67
|
+
expect(cmd).toStrictEqual('docker stop datastore-sim-119726bb');
|
|
68
|
+
return Promise.resolve('');
|
|
69
|
+
}
|
|
70
|
+
return Promise.reject(false);
|
|
71
|
+
});
|
|
72
|
+
const program = (0, pause_1.default)();
|
|
73
|
+
const commandErrorSpy = jest.spyOn(program, 'error');
|
|
74
|
+
yield program.parseAsync([
|
|
75
|
+
'node',
|
|
76
|
+
'dxp-cli',
|
|
77
|
+
'datastore',
|
|
78
|
+
'simulator',
|
|
79
|
+
'pause',
|
|
80
|
+
'-b',
|
|
81
|
+
'/path/to/blueprint.yaml',
|
|
82
|
+
]);
|
|
83
|
+
const opts = program.opts();
|
|
84
|
+
expect(opts.blueprint).toEqual('/path/to/blueprint.yaml');
|
|
85
|
+
expect(checkUpdateAvailableSpy).toHaveBeenCalledTimes(1);
|
|
86
|
+
expect(commandErrorSpy).not.toHaveBeenCalled();
|
|
87
|
+
expect(logSpy).toHaveBeenCalledTimes(1);
|
|
88
|
+
expect(executeCommandSpy).toHaveBeenCalledTimes(2);
|
|
89
|
+
}));
|
|
90
|
+
});
|
|
@@ -42,7 +42,7 @@ const createRemoveCommand = () => {
|
|
|
42
42
|
}
|
|
43
43
|
}
|
|
44
44
|
spinner.start('Removing simulator blueprint.');
|
|
45
|
-
const {
|
|
45
|
+
const { containerName } = (0, utils_2.getSimulatorDetails)(options.blueprint);
|
|
46
46
|
const containerCommand = yield (0, utils_2.executeCommand)(`docker ps -a --filter "name=${containerName}" --format "{{.Names}}"`);
|
|
47
47
|
if (containerCommand === '') {
|
|
48
48
|
throw new Error('Sorry, no simulator container found for that blueprint path. Please try again using a different path.');
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
|
+
};
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
const commander_1 = require("commander");
|
|
16
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
17
|
+
const ora_1 = __importDefault(require("ora"));
|
|
18
|
+
const utils_1 = require("../../utils");
|
|
19
|
+
const utils_2 = require("../utils");
|
|
20
|
+
const createResumeCommand = () => {
|
|
21
|
+
const resumeCommand = new commander_1.Command('resume')
|
|
22
|
+
.name('resume')
|
|
23
|
+
.description('Resumes the simulator')
|
|
24
|
+
.addOption(new commander_1.Option('-b, --blueprint <string>', 'Path to your datastore API yaml file.'))
|
|
25
|
+
.configureOutput({
|
|
26
|
+
outputError(str, write) {
|
|
27
|
+
write(chalk_1.default.red(str));
|
|
28
|
+
},
|
|
29
|
+
})
|
|
30
|
+
.action((options) => __awaiter(void 0, void 0, void 0, function* () {
|
|
31
|
+
yield (0, utils_1.throwErrorIfNotLoggedIn)(resumeCommand);
|
|
32
|
+
console.log('');
|
|
33
|
+
if (options.blueprint !== undefined) {
|
|
34
|
+
const { fullPath, dirPath, yamlFile, containerName } = (0, utils_2.getSimulatorDetails)(options.blueprint);
|
|
35
|
+
const command = `docker start ${containerName}`;
|
|
36
|
+
const spinner = (0, ora_1.default)();
|
|
37
|
+
try {
|
|
38
|
+
yield (0, utils_2.checkUpdateAvailable)();
|
|
39
|
+
spinner.start('Resuming simulator.');
|
|
40
|
+
yield (0, utils_2.checkDockerInstalled)();
|
|
41
|
+
yield (0, utils_2.executeCommand)(command);
|
|
42
|
+
spinner.succeed(`Done! Container ID “${containerName}” resumed.`);
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
catch (error) {
|
|
46
|
+
const errorMsg = 'Did not resume because of an unexpected error. Ask for help in our support forums.';
|
|
47
|
+
(0, utils_1.logDebug)(`ERROR: ${JSON.stringify(error)}`);
|
|
48
|
+
spinner.fail(errorMsg);
|
|
49
|
+
(0, utils_1.handleCommandError)(resumeCommand, error);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
const command = 'docker ps --filter "name=datastore-sim-*" --filter "status=exited" --format "{{.Names}}"';
|
|
54
|
+
const spinner = (0, ora_1.default)();
|
|
55
|
+
try {
|
|
56
|
+
yield (0, utils_2.checkUpdateAvailable)();
|
|
57
|
+
spinner.start('Resuming all simulators.');
|
|
58
|
+
yield (0, utils_2.checkDockerInstalled)();
|
|
59
|
+
const containerCommand = yield (0, utils_2.executeCommand)(command);
|
|
60
|
+
if (containerCommand === '') {
|
|
61
|
+
throw new Error('Sorry, all simulators are already running.');
|
|
62
|
+
}
|
|
63
|
+
const containers = containerCommand.split(/\s+/).join(' ');
|
|
64
|
+
const results = yield (0, utils_2.executeCommand)(`docker start ${containers}`);
|
|
65
|
+
results.split(/\s+/).forEach((result) => {
|
|
66
|
+
if (result !== '') {
|
|
67
|
+
spinner.succeed(`Done! Container ID “${result}” paused.`);
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
catch (error) {
|
|
73
|
+
const errorMsg = 'Did not resume because of an unexpected error. Ask for help in our support forums.';
|
|
74
|
+
(0, utils_1.logDebug)(`ERROR: ${JSON.stringify(error)}`);
|
|
75
|
+
spinner.fail(errorMsg);
|
|
76
|
+
(0, utils_1.handleCommandError)(resumeCommand, error);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}));
|
|
80
|
+
if (process.env.ENABLE_OVERRIDE_DATASTORE_URL === 'true') {
|
|
81
|
+
resumeCommand.addOption(new commander_1.Option('-i, --image <string>', 'Override the docker image'));
|
|
82
|
+
}
|
|
83
|
+
return resumeCommand;
|
|
84
|
+
};
|
|
85
|
+
exports.default = createResumeCommand;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
25
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
26
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
27
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
28
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
29
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
30
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
31
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
32
|
+
});
|
|
33
|
+
};
|
|
34
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
35
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
36
|
+
};
|
|
37
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
38
|
+
const resume_1 = __importDefault(require("./resume"));
|
|
39
|
+
const utils = __importStar(require("../utils"));
|
|
40
|
+
const logSpy = jest.spyOn(global.console, 'log');
|
|
41
|
+
const exitSpy = jest.spyOn(process, 'exit').mockImplementation(() => {
|
|
42
|
+
return undefined;
|
|
43
|
+
}); // prevent process exit on error
|
|
44
|
+
beforeEach(() => {
|
|
45
|
+
jest.resetAllMocks();
|
|
46
|
+
});
|
|
47
|
+
describe('datastoreSimulatorResume', () => {
|
|
48
|
+
it('should resume a simulator', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
49
|
+
const checkUpdateAvailableSpy = jest
|
|
50
|
+
.spyOn(utils, 'checkUpdateAvailable')
|
|
51
|
+
.mockImplementation(() => {
|
|
52
|
+
return Promise.resolve(null);
|
|
53
|
+
});
|
|
54
|
+
const forcePromptSpy = jest
|
|
55
|
+
.spyOn(utils, 'forcePrompt')
|
|
56
|
+
.mockResolvedValue(true);
|
|
57
|
+
let executeCommandCount = 0;
|
|
58
|
+
const executeCommandSpy = jest
|
|
59
|
+
.spyOn(utils, 'executeCommand')
|
|
60
|
+
.mockImplementation((cmd, opt) => {
|
|
61
|
+
executeCommandCount++;
|
|
62
|
+
switch (executeCommandCount) {
|
|
63
|
+
case 1:
|
|
64
|
+
expect(cmd).toStrictEqual('docker -v');
|
|
65
|
+
return Promise.resolve('Docker version 20.10.23, build 7155243');
|
|
66
|
+
case 2:
|
|
67
|
+
expect(cmd).toStrictEqual('docker start datastore-sim-119726bb');
|
|
68
|
+
return Promise.resolve('');
|
|
69
|
+
}
|
|
70
|
+
return Promise.reject(false);
|
|
71
|
+
});
|
|
72
|
+
const program = (0, resume_1.default)();
|
|
73
|
+
const commandErrorSpy = jest.spyOn(program, 'error');
|
|
74
|
+
yield program.parseAsync([
|
|
75
|
+
'node',
|
|
76
|
+
'dxp-cli',
|
|
77
|
+
'datastore',
|
|
78
|
+
'simulator',
|
|
79
|
+
'resume',
|
|
80
|
+
'-b',
|
|
81
|
+
'/path/to/blueprint.yaml',
|
|
82
|
+
]);
|
|
83
|
+
const opts = program.opts();
|
|
84
|
+
expect(opts.blueprint).toEqual('/path/to/blueprint.yaml');
|
|
85
|
+
expect(checkUpdateAvailableSpy).toHaveBeenCalledTimes(1);
|
|
86
|
+
expect(commandErrorSpy).not.toHaveBeenCalled();
|
|
87
|
+
expect(logSpy).toHaveBeenCalledTimes(1);
|
|
88
|
+
expect(executeCommandSpy).toHaveBeenCalledTimes(2);
|
|
89
|
+
}));
|
|
90
|
+
});
|
|
@@ -6,12 +6,22 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
6
6
|
const commander_1 = require("commander");
|
|
7
7
|
const add_1 = __importDefault(require("./add/add"));
|
|
8
8
|
const remove_1 = __importDefault(require("./remove/remove"));
|
|
9
|
+
const list_1 = __importDefault(require("./list/list"));
|
|
10
|
+
const clear_1 = __importDefault(require("./clear/clear"));
|
|
11
|
+
const upgrade_1 = __importDefault(require("./upgrade/upgrade"));
|
|
12
|
+
const pause_1 = __importDefault(require("./pause/pause"));
|
|
13
|
+
const resume_1 = __importDefault(require("./resume/resume"));
|
|
9
14
|
const createSimulatorCommand = () => {
|
|
10
15
|
const datastoreSimulatorCommand = new commander_1.Command('simulator');
|
|
11
16
|
datastoreSimulatorCommand
|
|
12
17
|
.description('Datastore Simulator Commands')
|
|
13
18
|
.addCommand((0, add_1.default)())
|
|
14
|
-
.addCommand((0, remove_1.default)())
|
|
19
|
+
.addCommand((0, remove_1.default)())
|
|
20
|
+
.addCommand((0, list_1.default)())
|
|
21
|
+
.addCommand((0, clear_1.default)())
|
|
22
|
+
.addCommand((0, upgrade_1.default)())
|
|
23
|
+
.addCommand((0, pause_1.default)())
|
|
24
|
+
.addCommand((0, resume_1.default)());
|
|
15
25
|
return datastoreSimulatorCommand;
|
|
16
26
|
};
|
|
17
27
|
exports.default = createSimulatorCommand;
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
|
+
};
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
const commander_1 = require("commander");
|
|
16
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
17
|
+
const ora_1 = __importDefault(require("ora"));
|
|
18
|
+
const utils_1 = require("../../utils");
|
|
19
|
+
const utils_2 = require("../utils");
|
|
20
|
+
const path_1 = require("path");
|
|
21
|
+
const ApplicationStore_1 = require("../../../ApplicationStore");
|
|
22
|
+
const ApiService_1 = require("../../../ApiService");
|
|
23
|
+
function getCurrentLatest() {
|
|
24
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
25
|
+
const dockerAPI = 'https://registry.hub.docker.com/v2/repositories/squizdxp/datastore/tags/latest';
|
|
26
|
+
const apiService = new ApiService_1.ApiService(utils_1.validateAxiosStatus);
|
|
27
|
+
apiService.client.interceptors.request.clear();
|
|
28
|
+
apiService.client.interceptors.response.clear();
|
|
29
|
+
const dockerFetch = yield apiService.client.get(dockerAPI);
|
|
30
|
+
const dockerResponse = dockerFetch.data;
|
|
31
|
+
return dockerResponse.images[0].digest || null;
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
function upgradeContainer(container, tempFolder, dockerDigest) {
|
|
35
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
36
|
+
if (container === '') {
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
const upgradeSpinner = (0, ora_1.default)();
|
|
40
|
+
const results = container.split('~');
|
|
41
|
+
const containerName = results[0] || '';
|
|
42
|
+
const labels = results[1].split(',');
|
|
43
|
+
let blueprint = '';
|
|
44
|
+
let port = '';
|
|
45
|
+
// Blueprint and port stored in label, extract them.
|
|
46
|
+
labels.forEach(label => {
|
|
47
|
+
if (label.startsWith('blueprint=') === true) {
|
|
48
|
+
blueprint = label.replace('blueprint=', '');
|
|
49
|
+
}
|
|
50
|
+
if (label.startsWith('port=') === true) {
|
|
51
|
+
port = label.replace('port=', '');
|
|
52
|
+
}
|
|
53
|
+
});
|
|
54
|
+
const status = results[2].toLowerCase().split(' ')[0] || '';
|
|
55
|
+
const host = '0.0.0.0';
|
|
56
|
+
const dirPath = (0, path_1.dirname)(blueprint);
|
|
57
|
+
try {
|
|
58
|
+
console.log('');
|
|
59
|
+
upgradeSpinner.start(`Upgrading Container ID "${containerName}"`);
|
|
60
|
+
yield (0, utils_2.executeCommand)(`mkdir ${tempFolder}/${containerName}`);
|
|
61
|
+
yield (0, utils_2.executeCommand)(`docker start ${containerName} > /dev/null`);
|
|
62
|
+
// Backup data from container.
|
|
63
|
+
yield (0, utils_2.executeCommand)(`docker cp ${containerName}:/var/www/data ${tempFolder}/${containerName}/`);
|
|
64
|
+
// Kill old container.
|
|
65
|
+
yield (0, utils_2.executeCommand)(`docker rm -f ${containerName} > /dev/null`);
|
|
66
|
+
// Run a new container.
|
|
67
|
+
yield (0, utils_2.executeCommand)(`docker run -l "blueprint=${blueprint}" -l "port=${port}" -itd --name ${containerName} -p ${host}:${port}:80 -e MYHOST=${host} -e MYPORT=${port} -e BLUEPRINT=${blueprint} -v "${dirPath}":/var/www/instances ${utils_2.datastoreRepo}`);
|
|
68
|
+
// Restore data folder.
|
|
69
|
+
yield (0, utils_2.executeCommand)(`docker cp ${tempFolder}/${containerName}/data ${containerName}:/var/www/`);
|
|
70
|
+
const simulatorVersion = yield (0, utils_2.executeCommand)(`docker image inspect ${utils_2.datastoreRepo} --format '{{ or (index .Config.Labels "squiz.datastore.version") (printf "Unknown") }}'`);
|
|
71
|
+
const upgradedVersion = simulatorVersion.replace(/\r?\n|\r/g, '');
|
|
72
|
+
const containerDataCmd = yield (0, utils_2.executeCommand)(`docker exec ${containerName} cat /var/www/data/containerData.json`);
|
|
73
|
+
const containerData = JSON.parse(containerDataCmd);
|
|
74
|
+
containerData.imageVersion = upgradedVersion;
|
|
75
|
+
containerData.imageDigest = dockerDigest;
|
|
76
|
+
const jsonData = JSON.stringify(containerData, null, 4).replace(/"/g, '\\"');
|
|
77
|
+
yield (0, utils_2.executeCommand)(`docker exec -i ${containerName} bash -c "echo '${jsonData}' > /var/www/data/containerData.json"`);
|
|
78
|
+
}
|
|
79
|
+
catch (error) {
|
|
80
|
+
upgradeSpinner.fail(`Unable to upgrade simulator Container ID "${containerName}"`);
|
|
81
|
+
throw new Error(`Unable to upgrade simulator Container ID "${containerName}"`);
|
|
82
|
+
}
|
|
83
|
+
// Wipe simulator data.
|
|
84
|
+
upgradeSpinner.succeed(`Done! Container ID "${containerName}" upgraded.`);
|
|
85
|
+
yield (0, utils_2.executeCommand)(`docker exec ${containerName} bash -c "rm -rf /var/www/data/storage; rm -rf /var/www/data/provision/**/oven"`);
|
|
86
|
+
if (status.includes('exit') === true) {
|
|
87
|
+
// If it was paused, stop it again.
|
|
88
|
+
yield (0, utils_2.executeCommand)(`docker stop ${containerName}`);
|
|
89
|
+
}
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
const createUpgradeCommand = () => {
|
|
93
|
+
const upgradeCommand = new commander_1.Command('upgrade')
|
|
94
|
+
.name('upgrade')
|
|
95
|
+
.description('Removes a datastore simulator')
|
|
96
|
+
.addOption(new commander_1.Option('-f, --force', 'Force the removal of the datastore simulator'))
|
|
97
|
+
.configureOutput({
|
|
98
|
+
outputError(str, write) {
|
|
99
|
+
write(chalk_1.default.red(str));
|
|
100
|
+
},
|
|
101
|
+
})
|
|
102
|
+
.action((options) => __awaiter(void 0, void 0, void 0, function* () {
|
|
103
|
+
console.log('');
|
|
104
|
+
const spinner = (0, ora_1.default)();
|
|
105
|
+
try {
|
|
106
|
+
yield (0, utils_2.checkDockerInstalled)();
|
|
107
|
+
const forceMessage = 'This will wipe all test data for all of your simulated blueprints. Are you sure you want to continue? (y/N)';
|
|
108
|
+
if (!options.force) {
|
|
109
|
+
if ((yield (0, utils_2.forcePrompt)(forceMessage, false)) === false) {
|
|
110
|
+
const removeGuide = 'To upgrade run:\n $ dxp-next datastore simulator upgrade --force\n';
|
|
111
|
+
throw new Error(removeGuide);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
spinner.start('Upgrading all simulator containers.');
|
|
115
|
+
yield (0, ApplicationStore_1.deleteApplicationFile)(utils_2.datastoreSimulatorCache);
|
|
116
|
+
const currentLatest = yield getCurrentLatest();
|
|
117
|
+
const currentDigest = yield (0, utils_2.executeCommand)(`docker image inspect ${utils_2.datastoreRepo} --format "{{ index .RepoDigests }}"`);
|
|
118
|
+
if (currentDigest.slice(20).startsWith(currentLatest) === true) {
|
|
119
|
+
// Nothing to do here.
|
|
120
|
+
spinner.succeed('Simulator already up to date');
|
|
121
|
+
return;
|
|
122
|
+
}
|
|
123
|
+
const dockerDigest = currentDigest;
|
|
124
|
+
let currentVersion = '';
|
|
125
|
+
let upgradedVersion = '';
|
|
126
|
+
let simulatorVersion = yield (0, utils_2.executeCommand)(`docker image inspect ${utils_2.datastoreRepo} --format '{{ or (index .Config.Labels "squiz.datastore.version") (printf "Unknown") }}'`);
|
|
127
|
+
currentVersion = simulatorVersion.replace(/\r?\n|\r/g, '');
|
|
128
|
+
const containersToUpgrade = yield (0, utils_2.executeCommand)('docker ps -a --filter "name=datastore-sim-*" --format "{{.Names}}~{{.Labels}}~{{.Status}}~{{.Ports}}#"');
|
|
129
|
+
if (containersToUpgrade === '') {
|
|
130
|
+
throw new Error('Sorry, could not find any simulators.');
|
|
131
|
+
}
|
|
132
|
+
spinner.text = 'Downloading latest simulator image.';
|
|
133
|
+
try {
|
|
134
|
+
yield (0, utils_2.executeCommand)(`docker pull ${utils_2.datastoreRepo}`);
|
|
135
|
+
}
|
|
136
|
+
catch (error) {
|
|
137
|
+
throw new Error('Sorry, could not download simulator image. Ask for help in our support forums.');
|
|
138
|
+
}
|
|
139
|
+
const mkdirTemp = yield (0, utils_2.executeCommand)('mktemp -d -t datastore-XXXXXXXXXX');
|
|
140
|
+
const tempFolder = mkdirTemp.replace(/\s+$/, '');
|
|
141
|
+
spinner.text = 'Restarting containers.';
|
|
142
|
+
yield Promise.all(containersToUpgrade.split(/#\s+/).map((container) => __awaiter(void 0, void 0, void 0, function* () {
|
|
143
|
+
return yield upgradeContainer(container, tempFolder, dockerDigest);
|
|
144
|
+
})));
|
|
145
|
+
simulatorVersion = yield (0, utils_2.executeCommand)(`docker image inspect ${utils_2.datastoreRepo} --format '{{ or (index .Config.Labels "squiz.datastore.version") (printf "Unknown") }}'`);
|
|
146
|
+
upgradedVersion = simulatorVersion.replace(/\r?\n|\r/g, '');
|
|
147
|
+
spinner.succeed(`All simulator containers have successfully been upgraded from ${currentVersion} to ${upgradedVersion}.`);
|
|
148
|
+
// Remove temp backup folder.
|
|
149
|
+
(0, utils_2.executeCommand)(`rm -rf ${tempFolder}`);
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
152
|
+
catch (error) {
|
|
153
|
+
(0, utils_1.logDebug)(`ERROR: ${JSON.stringify(error)}`);
|
|
154
|
+
spinner.fail();
|
|
155
|
+
(0, utils_1.handleCommandError)(upgradeCommand, error);
|
|
156
|
+
}
|
|
157
|
+
}));
|
|
158
|
+
return upgradeCommand;
|
|
159
|
+
};
|
|
160
|
+
exports.default = createUpgradeCommand;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|