@squiz/dxp-cli-next 5.10.0-develop.2 → 5.10.0-develop.4
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/remove/remove.js +1 -1
- package/lib/datastore/simulator/simulatorCommand.js +3 -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
package/README.md
CHANGED
|
@@ -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.');
|
|
@@ -6,12 +6,14 @@ 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 upgrade_1 = __importDefault(require("./upgrade/upgrade"));
|
|
9
10
|
const createSimulatorCommand = () => {
|
|
10
11
|
const datastoreSimulatorCommand = new commander_1.Command('simulator');
|
|
11
12
|
datastoreSimulatorCommand
|
|
12
13
|
.description('Datastore Simulator Commands')
|
|
13
14
|
.addCommand((0, add_1.default)())
|
|
14
|
-
.addCommand((0, remove_1.default)())
|
|
15
|
+
.addCommand((0, remove_1.default)())
|
|
16
|
+
.addCommand((0, upgrade_1.default)());
|
|
15
17
|
return datastoreSimulatorCommand;
|
|
16
18
|
};
|
|
17
19
|
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 {};
|
|
@@ -0,0 +1,204 @@
|
|
|
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 upgrade_1 = __importDefault(require("./upgrade"));
|
|
39
|
+
const utils = __importStar(require("../utils"));
|
|
40
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
41
|
+
const nock_1 = __importDefault(require("nock"));
|
|
42
|
+
const logSpy = jest.spyOn(global.console, 'log');
|
|
43
|
+
const exitSpy = jest.spyOn(process, 'exit').mockImplementation(() => {
|
|
44
|
+
return undefined;
|
|
45
|
+
}); // prevent process exit on error
|
|
46
|
+
beforeEach(() => {
|
|
47
|
+
jest.resetAllMocks();
|
|
48
|
+
(0, nock_1.default)('https://registry.hub.docker.com')
|
|
49
|
+
.get('/v2/repositories/squizdxp/datastore/tags/latest')
|
|
50
|
+
.reply(200, {
|
|
51
|
+
images: [
|
|
52
|
+
{
|
|
53
|
+
digest: 'sha256:bd61f8f80d9f235d81477454cf512a6edede0ae6d2d0a8c0508956db2418dbe0',
|
|
54
|
+
},
|
|
55
|
+
],
|
|
56
|
+
});
|
|
57
|
+
});
|
|
58
|
+
describe('datastoreSimulatorUpgrade', () => {
|
|
59
|
+
it('should not upgrade a simulator if prompt returns false', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
60
|
+
const forcePromptSpy = jest
|
|
61
|
+
.spyOn(utils, 'forcePrompt')
|
|
62
|
+
.mockResolvedValue(false);
|
|
63
|
+
let executeCommandCount = 0;
|
|
64
|
+
const executeCommandSpy = jest
|
|
65
|
+
.spyOn(utils, 'executeCommand')
|
|
66
|
+
.mockImplementation((cmd, opt) => {
|
|
67
|
+
executeCommandCount++;
|
|
68
|
+
switch (executeCommandCount) {
|
|
69
|
+
case 1:
|
|
70
|
+
expect(cmd).toStrictEqual('docker -v');
|
|
71
|
+
return Promise.resolve('Docker version 20.10.23, build 7155243');
|
|
72
|
+
}
|
|
73
|
+
return Promise.reject(false);
|
|
74
|
+
});
|
|
75
|
+
const program = (0, upgrade_1.default)();
|
|
76
|
+
const commandErrorSpy = jest.spyOn(program, 'error');
|
|
77
|
+
yield program.parseAsync([
|
|
78
|
+
'node',
|
|
79
|
+
'dxp-cli',
|
|
80
|
+
'datastore',
|
|
81
|
+
'simulator',
|
|
82
|
+
'upgrade',
|
|
83
|
+
]);
|
|
84
|
+
expect(commandErrorSpy).toHaveBeenCalledWith(chalk_1.default.red(`To upgrade run:
|
|
85
|
+
$ dxp-next datastore simulator upgrade --force
|
|
86
|
+
`));
|
|
87
|
+
expect(forcePromptSpy).toHaveBeenCalledWith('This will wipe all test data for all of your simulated blueprints. Are you sure you want to continue? (y/N)', false);
|
|
88
|
+
expect(logSpy).toHaveBeenCalledTimes(1);
|
|
89
|
+
expect(executeCommandSpy).toHaveBeenCalledTimes(1);
|
|
90
|
+
}));
|
|
91
|
+
it('should not upgrade a simulator if already on latest', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
92
|
+
let executeCommandCount = 0;
|
|
93
|
+
const executeCommandSpy = jest
|
|
94
|
+
.spyOn(utils, 'executeCommand')
|
|
95
|
+
.mockImplementation((cmd, opt) => {
|
|
96
|
+
executeCommandCount++;
|
|
97
|
+
switch (executeCommandCount) {
|
|
98
|
+
case 1:
|
|
99
|
+
expect(cmd).toStrictEqual('docker -v');
|
|
100
|
+
return Promise.resolve('Docker version 20.10.23, build 7155243');
|
|
101
|
+
case 2:
|
|
102
|
+
expect(cmd).toStrictEqual('docker image inspect squizdxp/datastore:latest --format "{{ index .RepoDigests }}"');
|
|
103
|
+
return Promise.resolve('[squizdxp/datastore@sha256:bd61f8f80d9f235d81477454cf512a6edede0ae6d2d0a8c0508956db2418dbe0]');
|
|
104
|
+
}
|
|
105
|
+
return Promise.reject(false);
|
|
106
|
+
});
|
|
107
|
+
const program = (0, upgrade_1.default)();
|
|
108
|
+
const commandErrorSpy = jest.spyOn(program, 'error');
|
|
109
|
+
yield program.parseAsync([
|
|
110
|
+
'node',
|
|
111
|
+
'dxp-cli',
|
|
112
|
+
'datastore',
|
|
113
|
+
'simulator',
|
|
114
|
+
'upgrade',
|
|
115
|
+
'--force',
|
|
116
|
+
]);
|
|
117
|
+
expect(logSpy).toHaveBeenCalledTimes(1);
|
|
118
|
+
expect(executeCommandSpy).toHaveBeenCalledTimes(2);
|
|
119
|
+
}));
|
|
120
|
+
it('should upgrade a simulator if prompt returns true', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
121
|
+
const forcePromptSpy = jest
|
|
122
|
+
.spyOn(utils, 'forcePrompt')
|
|
123
|
+
.mockResolvedValue(true);
|
|
124
|
+
let executeCommandCount = 0;
|
|
125
|
+
const executeCommandSpy = jest
|
|
126
|
+
.spyOn(utils, 'executeCommand')
|
|
127
|
+
.mockImplementation((cmd, opt) => {
|
|
128
|
+
executeCommandCount++;
|
|
129
|
+
// console.info(executeCommandCount, cmd);
|
|
130
|
+
switch (executeCommandCount) {
|
|
131
|
+
case 1:
|
|
132
|
+
expect(cmd).toStrictEqual('docker -v');
|
|
133
|
+
return Promise.resolve('Docker version 20.10.23, build 7155243');
|
|
134
|
+
case 2:
|
|
135
|
+
expect(cmd).toStrictEqual('docker image inspect squizdxp/datastore:latest --format "{{ index .RepoDigests }}"');
|
|
136
|
+
return Promise.resolve('[squizdxp/datastore@sha256:bd61f8f80d9f235d81477454cf512a6edede0ae6d2d0a8c0508956db2418dbe1]');
|
|
137
|
+
case 3:
|
|
138
|
+
expect(cmd).toStrictEqual('docker image inspect squizdxp/datastore:latest --format \'{{ or (index .Config.Labels "squiz.datastore.version") (printf "Unknown") }}\'');
|
|
139
|
+
return Promise.resolve('4.0.0');
|
|
140
|
+
case 4:
|
|
141
|
+
expect(cmd).toStrictEqual('docker ps -a --filter "name=datastore-sim-*" --format "{{.Names}}~{{.Labels}}~{{.Status}}~{{.Ports}}#"');
|
|
142
|
+
return Promise.resolve('datastore-sim-6909fc2c~desktop.docker.io/binds/0/Source=/Users/pnolland/Documents/Work/GitRepos/blueprints/boilerplate,desktop.docker.io/binds/0/SourceKind=hostFile,desktop.docker.io/binds/0/Target=/var/www/instances,port=7001,squiz.datastore.version=4.0.0,blueprint=/Users/pnolland/Documents/Work/GitRepos/blueprints/boilerplate/api.yaml~Up 16 hours~0.0.0.0:7001->80/tcp#');
|
|
143
|
+
case 5:
|
|
144
|
+
expect(cmd).toStrictEqual('docker pull squizdxp/datastore:latest');
|
|
145
|
+
return Promise.resolve('');
|
|
146
|
+
case 6:
|
|
147
|
+
expect(cmd).toStrictEqual('mktemp -d -t datastore-XXXXXXXXXX');
|
|
148
|
+
return Promise.resolve('/tmp/datastore-XXXXXXXXXX');
|
|
149
|
+
case 7:
|
|
150
|
+
expect(cmd).toStrictEqual('mkdir /tmp/datastore-XXXXXXXXXX/datastore-sim-6909fc2c');
|
|
151
|
+
return Promise.resolve('');
|
|
152
|
+
case 8:
|
|
153
|
+
expect(cmd).toStrictEqual('docker start datastore-sim-6909fc2c > /dev/null');
|
|
154
|
+
return Promise.resolve('');
|
|
155
|
+
case 9:
|
|
156
|
+
expect(cmd).toStrictEqual('docker cp datastore-sim-6909fc2c:/var/www/data /tmp/datastore-XXXXXXXXXX/datastore-sim-6909fc2c/');
|
|
157
|
+
return Promise.resolve('');
|
|
158
|
+
case 10:
|
|
159
|
+
expect(cmd).toStrictEqual('docker rm -f datastore-sim-6909fc2c > /dev/null');
|
|
160
|
+
return Promise.resolve('');
|
|
161
|
+
case 11:
|
|
162
|
+
expect(cmd).toStrictEqual('docker run -l "blueprint=/Users/pnolland/Documents/Work/GitRepos/blueprints/boilerplate/api.yaml" -l "port=7001" -itd --name datastore-sim-6909fc2c -p 0.0.0.0:7001:80 -e MYHOST=0.0.0.0 -e MYPORT=7001 -e BLUEPRINT=/Users/pnolland/Documents/Work/GitRepos/blueprints/boilerplate/api.yaml -v "/Users/pnolland/Documents/Work/GitRepos/blueprints/boilerplate":/var/www/instances squizdxp/datastore:latest');
|
|
163
|
+
return Promise.resolve('');
|
|
164
|
+
case 12:
|
|
165
|
+
expect(cmd).toStrictEqual('docker cp /tmp/datastore-XXXXXXXXXX/datastore-sim-6909fc2c/data datastore-sim-6909fc2c:/var/www/');
|
|
166
|
+
return Promise.resolve('');
|
|
167
|
+
case 13:
|
|
168
|
+
expect(cmd).toStrictEqual('docker image inspect squizdxp/datastore:latest --format \'{{ or (index .Config.Labels "squiz.datastore.version") (printf "Unknown") }}\'');
|
|
169
|
+
return Promise.resolve('4.0.1');
|
|
170
|
+
case 14:
|
|
171
|
+
expect(cmd).toStrictEqual('docker exec datastore-sim-6909fc2c cat /var/www/data/containerData.json');
|
|
172
|
+
return Promise.resolve('{}');
|
|
173
|
+
case 15:
|
|
174
|
+
expect(cmd).toStrictEqual(`docker exec -i datastore-sim-6909fc2c bash -c "echo '{
|
|
175
|
+
\\"imageVersion\\": \\"4.0.1\\",
|
|
176
|
+
\\"imageDigest\\": \\"[squizdxp/datastore@sha256:bd61f8f80d9f235d81477454cf512a6edede0ae6d2d0a8c0508956db2418dbe1]\\"
|
|
177
|
+
}' > /var/www/data/containerData.json"`);
|
|
178
|
+
return Promise.resolve('');
|
|
179
|
+
case 16:
|
|
180
|
+
expect(cmd).toStrictEqual('docker exec datastore-sim-6909fc2c bash -c "rm -rf /var/www/data/storage; rm -rf /var/www/data/provision/**/oven"');
|
|
181
|
+
return Promise.resolve('');
|
|
182
|
+
case 17:
|
|
183
|
+
expect(cmd).toStrictEqual('docker image inspect squizdxp/datastore:latest --format \'{{ or (index .Config.Labels "squiz.datastore.version") (printf "Unknown") }}\'');
|
|
184
|
+
return Promise.resolve('4.0.1');
|
|
185
|
+
case 18:
|
|
186
|
+
expect(cmd).toStrictEqual('rm -rf /tmp/datastore-XXXXXXXXXX');
|
|
187
|
+
return Promise.resolve('');
|
|
188
|
+
}
|
|
189
|
+
return Promise.reject(false);
|
|
190
|
+
});
|
|
191
|
+
const program = (0, upgrade_1.default)();
|
|
192
|
+
const commandErrorSpy = jest.spyOn(program, 'error');
|
|
193
|
+
yield program.parseAsync([
|
|
194
|
+
'node',
|
|
195
|
+
'dxp-cli',
|
|
196
|
+
'datastore',
|
|
197
|
+
'simulator',
|
|
198
|
+
'upgrade',
|
|
199
|
+
]);
|
|
200
|
+
expect(forcePromptSpy).toHaveBeenCalledWith('This will wipe all test data for all of your simulated blueprints. Are you sure you want to continue? (y/N)', false);
|
|
201
|
+
expect(logSpy).toHaveBeenCalledTimes(2);
|
|
202
|
+
expect(executeCommandSpy).toHaveBeenCalledTimes(18);
|
|
203
|
+
}));
|
|
204
|
+
});
|
|
@@ -1,8 +1,10 @@
|
|
|
1
|
+
import { FileStore } from '../../ApplicationStore';
|
|
1
2
|
declare type datastoreVersionCache = {
|
|
2
3
|
digest: string;
|
|
3
4
|
updatedAt: number;
|
|
4
5
|
version: string;
|
|
5
6
|
};
|
|
7
|
+
export declare const datastoreSimulatorCache: FileStore;
|
|
6
8
|
export declare const datastoreRepo = "squizdxp/datastore:latest";
|
|
7
9
|
export declare const allowedExtensions: string[];
|
|
8
10
|
export declare const host = "0.0.0.0";
|
|
@@ -32,13 +32,13 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
32
32
|
});
|
|
33
33
|
};
|
|
34
34
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
35
|
-
exports.getSimulatorDetails = exports.checkUpdateAvailable = exports.checkDockerInstalled = exports.forcePrompt = exports.promptForContinue = exports.stringHashShort = exports.executeCommand = exports.availablePorts = exports.host = exports.allowedExtensions = exports.datastoreRepo = void 0;
|
|
35
|
+
exports.getSimulatorDetails = exports.checkUpdateAvailable = exports.checkDockerInstalled = exports.forcePrompt = exports.promptForContinue = exports.stringHashShort = exports.executeCommand = exports.availablePorts = exports.host = exports.allowedExtensions = exports.datastoreRepo = exports.datastoreSimulatorCache = void 0;
|
|
36
36
|
const child_process_1 = require("child_process");
|
|
37
37
|
const ApplicationStore_1 = require("../../ApplicationStore");
|
|
38
38
|
const ApiService_1 = require("../../ApiService");
|
|
39
39
|
const utils_1 = require("../utils");
|
|
40
40
|
const path_1 = require("path");
|
|
41
|
-
|
|
41
|
+
exports.datastoreSimulatorCache = {
|
|
42
42
|
name: 'datastore-simulator',
|
|
43
43
|
type: 'data',
|
|
44
44
|
};
|
|
@@ -95,7 +95,6 @@ const promptForContinue = (versionCache, currentVersion) => __awaiter(void 0, vo
|
|
|
95
95
|
});
|
|
96
96
|
exports.promptForContinue = promptForContinue;
|
|
97
97
|
const forcePrompt = (message, def = false) => __awaiter(void 0, void 0, void 0, function* () {
|
|
98
|
-
console.info('WHY!!!!!');
|
|
99
98
|
const inquirer = yield Promise.resolve().then(() => __importStar(require('inquirer')));
|
|
100
99
|
const confirm = yield inquirer.default.prompt([
|
|
101
100
|
{
|
|
@@ -124,7 +123,7 @@ const checkUpdateAvailable = () => __awaiter(void 0, void 0, void 0, function* (
|
|
|
124
123
|
simulatorVersionCmd +=
|
|
125
124
|
' --format \'{{ or (index .Config.Labels "squiz.datastore.version") (printf "Unknown") }}\'';
|
|
126
125
|
// Default updatedAt to over 1 hour ago to force a check
|
|
127
|
-
const versionCache = JSON.parse((yield (0, ApplicationStore_1.getApplicationFile)(datastoreSimulatorCache)) ||
|
|
126
|
+
const versionCache = JSON.parse((yield (0, ApplicationStore_1.getApplicationFile)(exports.datastoreSimulatorCache)) ||
|
|
128
127
|
`{"updatedAt": ${Math.floor(Date.now() / 1000 - 7200)}}`);
|
|
129
128
|
let refreshVersionCache = false;
|
|
130
129
|
let versionInfo = versionCache;
|
|
@@ -155,7 +154,7 @@ const checkUpdateAvailable = () => __awaiter(void 0, void 0, void 0, function* (
|
|
|
155
154
|
updatedAt: Date.now() / 1000,
|
|
156
155
|
version: taggedImage.name || '',
|
|
157
156
|
};
|
|
158
|
-
yield (0, ApplicationStore_1.saveApplicationFile)(datastoreSimulatorCache, JSON.stringify(versionInfo));
|
|
157
|
+
yield (0, ApplicationStore_1.saveApplicationFile)(exports.datastoreSimulatorCache, JSON.stringify(versionInfo));
|
|
159
158
|
}
|
|
160
159
|
let result;
|
|
161
160
|
try {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@squiz/dxp-cli-next",
|
|
3
|
-
"version": "5.10.0-develop.
|
|
3
|
+
"version": "5.10.0-develop.4",
|
|
4
4
|
"repository": {
|
|
5
5
|
"url": "https://gitlab.squiz.net/dxp/dxp-cli-next"
|
|
6
6
|
},
|
|
@@ -39,7 +39,7 @@
|
|
|
39
39
|
"codecov"
|
|
40
40
|
],
|
|
41
41
|
"dependencies": {
|
|
42
|
-
"@squiz/component-cli-lib": "1.63.1-alpha.
|
|
42
|
+
"@squiz/component-cli-lib": "1.63.1-alpha.6",
|
|
43
43
|
"@apidevtools/swagger-parser": "10.1.0",
|
|
44
44
|
"axios": "1.1.3",
|
|
45
45
|
"cli-color": "2.0.3",
|