From 935f21006681fe62481ebf01bfafed57f87e9b5d Mon Sep 17 00:00:00 2001 From: Kuruyia <8174691+Kuruyia@users.noreply.github.com> Date: Fri, 9 Jun 2023 17:43:34 +0200 Subject: [PATCH 01/10] feat: add command for dumping an Elasticsearch instance in the PaaS --- src/commands/paas/elasticsearch/dump.ts | 185 ++++++++++++++++++++++++ 1 file changed, 185 insertions(+) create mode 100644 src/commands/paas/elasticsearch/dump.ts diff --git a/src/commands/paas/elasticsearch/dump.ts b/src/commands/paas/elasticsearch/dump.ts new file mode 100644 index 00000000..f4f281a3 --- /dev/null +++ b/src/commands/paas/elasticsearch/dump.ts @@ -0,0 +1,185 @@ +import path from "path"; +import fs from "node:fs/promises"; + +import { flags } from "@oclif/command"; + +import { PaasKommand } from "../../../support/PaasKommand"; + +/** + * Results of the document dump action. + */ +type DocumentDump = { + pit_id: string; + hits: DocumentDumpHits; +}; + +type DocumentDumpHits = { + total: DocumentDumpHitsTotal; + hits: DocumentDumpHit[]; +}; + +type DocumentDumpHitsTotal = { + value: number; +}; + +type DocumentDumpHit = { + sort: string[]; +}; + +class PaasInit extends PaasKommand { + public static description = "Dump data from the Elasticsearch of a PaaS application"; + + public static flags = { + help: flags.help(), + project: flags.string({ + description: "Current PaaS project", + }), + }; + + static args = [ + { + name: "environment", + description: "Project environment name", + required: true, + }, + { + name: "applicationId", + description: "Application Identifier", + required: true, + }, + { + name: "dumpDirectory", + description: "Directory where to store dump files", + required: true, + } + ]; + + async runSafe() { + // Log in to the PaaS + const apiKey = await this.getCredentials(); + + await this.initPaasClient({ apiKey }); + + const user = await this.paas.auth.getCurrentUser(); + this.logInfo( + `Logged as "${user._id}" for project "${this.flags.project || this.getProject() + }"` + ); + + // Create the dump directory + await fs.mkdir(this.args.dumpDirectory, { recursive: true }); + await fs.mkdir(path.join(this.args.dumpDirectory, "documents/"), { recursive: true }); + + // Dump the indexes + this.logInfo("Dumping Elasticsearch indexes..."); + + const indexesResult = await this.getAllIndexes(); + await fs.writeFile(path.join(this.args.dumpDirectory, "indexes.json"), JSON.stringify(indexesResult)); + + this.logOk("Elasticsearch indexes dumped!"); + + // Dump all the documents + this.logInfo("Dumping Elasticsearch documents..."); + await this.dumpAllDocuments(); + + this.logOk("Elasticsearch documents dumped!"); + this.logOk(`The dumped files are available under "${path.resolve(this.args.dumpDirectory)}"`) + } + + /** + * @description Get all indexes from the Elasticsearch of the PaaS application. + * @returns The indexes. + */ + private async getAllIndexes() { + const { result }: any = await this.paas.query({ + controller: "application/storage", + action: "getIndexes", + environmentId: this.args.environment, + projectId: this.flags.project || this.getProject(), + applicationId: this.args.applicationId, + body: {}, + }); + + return result; + } + + /** + * @description Dump documents from the Elasticsearch of the PaaS application. + * @param pitId ID of the PIT opened on Elasticsearch. + * @param searchAfter Cursor for dumping documents after a certain one. + * @returns The dumped documents. + */ + private async dumpDocuments(pitId: string, searchAfter: string[]): Promise { + const { result }: any = await this.paas.query({ + controller: "application/storage", + action: "dumpDocuments", + environmentId: this.args.environment, + projectId: this.flags.project || this.getProject(), + applicationId: this.args.applicationId, + body: { + pitId, + searchAfter: JSON.stringify(searchAfter), + }, + }); + + return result; + } + + private async dumpAllDocuments() { + // Prepare dumping all documents + let pitId = ""; + let searchAfter: string[] = []; + + let currentDocumentChunk = 0; + let dumpedDocuments = 0; + let totalDocuments = 0; + + // Dump the first batch + let result = await this.dumpDocuments(pitId, searchAfter); + let hits = result.hits.hits; + + while (hits.length > 0) { + // Update the PIT ID and the cursor for the next dump + pitId = result.pit_id; + searchAfter = hits[hits.length - 1].sort; + + // Save the document + await fs.writeFile(path.join(this.args.dumpDirectory, "documents/", `${currentDocumentChunk++}.json`), JSON.stringify(hits)); + + dumpedDocuments += hits.length; + totalDocuments = result.hits.total.value; + this.logInfo(`Dumping Elasticsearch documents: ${Math.floor(dumpedDocuments / totalDocuments * 100)}% (${dumpedDocuments}/${totalDocuments})`); + + // Dump the next batch + result = await this.dumpDocuments(pitId, searchAfter); + hits = result.hits.hits; + } + + // Finish the dump + try { + await this.finishDump(pitId); + } catch (error: any) { + this.logInfo("Unable to cleanly finish the dump session:"); + console.warn(error) + } + } + + /** + * @description Finish the document dumping session. + * @param pitId ID of the PIT opened on Elasticsearch. + */ + private async finishDump(pitId: string) { + await this.paas.query({ + controller: "application/storage", + action: "finishDumpDocuments", + environmentId: this.args.environment, + projectId: this.flags.project || this.getProject(), + applicationId: this.args.applicationId, + body: { + pitId, + }, + }); + } +} + +export default PaasInit; From 2692da9af42fdfba2d9e79ed5cfbf7a64c9eb168 Mon Sep 17 00:00:00 2001 From: Kuruyia <8174691+Kuruyia@users.noreply.github.com> Date: Fri, 9 Jun 2023 17:48:41 +0200 Subject: [PATCH 02/10] docs: add README section for the PaaS Elasticsearch dump command --- README.md | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/README.md b/README.md index a8339f45..a53d73e0 100644 --- a/README.md +++ b/README.md @@ -160,6 +160,7 @@ All other arguments and options will be passed as-is to the `sdk:query` method. * [`kourou instance:logs`](#kourou-instancelogs) * [`kourou instance:spawn`](#kourou-instancespawn) * [`kourou paas:deploy ENVIRONMENT APPLICATIONID IMAGE`](#kourou-paasdeploy-environment-applicationid-image) +* [`kourou paas:elasticsearch:dump ENVIRONMENT APPLICATIONID DUMPDIRECTORY`](#kourou-paaselasticsearchdump-environment-applicationid-dumpdirectory) * [`kourou paas:init PROJECT`](#kourou-paasinit-project) * [`kourou paas:login`](#kourou-paaslogin) * [`kourou paas:logs ENVIRONMENT APPLICATION`](#kourou-paaslogs-environment-application) @@ -1057,6 +1058,26 @@ OPTIONS _See code: [src/commands/paas/deploy.ts](src/commands/paas/deploy.ts)_ +## `kourou paas:elasticsearch:dump ENVIRONMENT APPLICATIONID DUMPDIRECTORY` + +Dump data from the Elasticsearch of a PaaS application + +``` +USAGE + $ kourou paas:elasticsearch:dump ENVIRONMENT APPLICATIONID DUMPDIRECTORY + +ARGUMENTS + ENVIRONMENT Project environment name + APPLICATIONID Application Identifier + DUMPDIRECTORY Directory where to store dump files + +OPTIONS + --help show CLI help + --project=project Current PaaS project +``` + +_See code: [src/commands/paas/elasticsearch/dump.ts](src/commands/paas/elasticsearch/dump.ts)_ + ## `kourou paas:init PROJECT` Initialize a PaaS project in current directory From 77bae1e757a35a54bc6404a8987e99c319d1d6ea Mon Sep 17 00:00:00 2001 From: Kuruyia <8174691+Kuruyia@users.noreply.github.com> Date: Wed, 3 Jan 2024 10:30:34 +0100 Subject: [PATCH 03/10] chore: rename PaaS ES dump class --- src/commands/paas/elasticsearch/dump.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/commands/paas/elasticsearch/dump.ts b/src/commands/paas/elasticsearch/dump.ts index f4f281a3..c9948641 100644 --- a/src/commands/paas/elasticsearch/dump.ts +++ b/src/commands/paas/elasticsearch/dump.ts @@ -26,7 +26,7 @@ type DocumentDumpHit = { sort: string[]; }; -class PaasInit extends PaasKommand { +class PaasEsDump extends PaasKommand { public static description = "Dump data from the Elasticsearch of a PaaS application"; public static flags = { @@ -182,4 +182,4 @@ class PaasInit extends PaasKommand { } } -export default PaasInit; +export default PaasEsDump; From edd34404bc0aa9571a411604fbe14c40e9cf65b4 Mon Sep 17 00:00:00 2001 From: Kuruyia <8174691+Kuruyia@users.noreply.github.com> Date: Wed, 3 Jan 2024 12:43:32 +0100 Subject: [PATCH 04/10] feat: add flag to the PaaS ES dump command to configure the document batch size --- src/commands/paas/elasticsearch/dump.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/commands/paas/elasticsearch/dump.ts b/src/commands/paas/elasticsearch/dump.ts index c9948641..3652fe09 100644 --- a/src/commands/paas/elasticsearch/dump.ts +++ b/src/commands/paas/elasticsearch/dump.ts @@ -34,6 +34,10 @@ class PaasEsDump extends PaasKommand { project: flags.string({ description: "Current PaaS project", }), + "batch-size": flags.integer({ + description: "Maximum batch size", + default: 2000, + }), }; static args = [ @@ -119,6 +123,7 @@ class PaasEsDump extends PaasKommand { body: { pitId, searchAfter: JSON.stringify(searchAfter), + size: this.flags["batch-size"], }, }); From 16fad0f479dc05ae622d29b923ecf38b4ceaffd9 Mon Sep 17 00:00:00 2001 From: Kuruyia <8174691+Kuruyia@users.noreply.github.com> Date: Wed, 3 Jan 2024 13:23:18 +0100 Subject: [PATCH 05/10] fix: attempt to cleanly finish dumping PaaS ES documents if dumping failed --- src/commands/paas/elasticsearch/dump.ts | 77 ++++++++++++++----------- 1 file changed, 43 insertions(+), 34 deletions(-) diff --git a/src/commands/paas/elasticsearch/dump.ts b/src/commands/paas/elasticsearch/dump.ts index 3652fe09..4cecb0c3 100644 --- a/src/commands/paas/elasticsearch/dump.ts +++ b/src/commands/paas/elasticsearch/dump.ts @@ -139,34 +139,39 @@ class PaasEsDump extends PaasKommand { let dumpedDocuments = 0; let totalDocuments = 0; - // Dump the first batch - let result = await this.dumpDocuments(pitId, searchAfter); - let hits = result.hits.hits; - - while (hits.length > 0) { - // Update the PIT ID and the cursor for the next dump - pitId = result.pit_id; - searchAfter = hits[hits.length - 1].sort; - - // Save the document - await fs.writeFile(path.join(this.args.dumpDirectory, "documents/", `${currentDocumentChunk++}.json`), JSON.stringify(hits)); - - dumpedDocuments += hits.length; - totalDocuments = result.hits.total.value; - this.logInfo(`Dumping Elasticsearch documents: ${Math.floor(dumpedDocuments / totalDocuments * 100)}% (${dumpedDocuments}/${totalDocuments})`); + try { + // Dump the first batch + let result = await this.dumpDocuments(pitId, searchAfter); + let hits = result.hits.hits; + + while (hits.length > 0) { + // Update the PIT ID and the cursor for the next dump + pitId = result.pit_id; + searchAfter = hits[hits.length - 1].sort; + + // Save the document + await fs.writeFile(path.join(this.args.dumpDirectory, "documents/", `${currentDocumentChunk++}.json`), JSON.stringify(hits)); + + dumpedDocuments += hits.length; + totalDocuments = result.hits.total.value; + this.logInfo(`Dumping Elasticsearch documents: ${Math.floor(dumpedDocuments / totalDocuments * 100)}% (${dumpedDocuments}/${totalDocuments})`); + + // Dump the next batch + result = await this.dumpDocuments(pitId, searchAfter); + hits = result.hits.hits; + } + } catch (error: any) { + // Attempt to finish the dump if a PIT ID is set + if (pitId.length > 0) { + await this.finishDump(pitId); + } - // Dump the next batch - result = await this.dumpDocuments(pitId, searchAfter); - hits = result.hits.hits; + this.logKo(`Error while dumping the documents: ${error}`); + process.exit(1); } // Finish the dump - try { - await this.finishDump(pitId); - } catch (error: any) { - this.logInfo("Unable to cleanly finish the dump session:"); - console.warn(error) - } + await this.finishDump(pitId); } /** @@ -174,16 +179,20 @@ class PaasEsDump extends PaasKommand { * @param pitId ID of the PIT opened on Elasticsearch. */ private async finishDump(pitId: string) { - await this.paas.query({ - controller: "application/storage", - action: "finishDumpDocuments", - environmentId: this.args.environment, - projectId: this.flags.project || this.getProject(), - applicationId: this.args.applicationId, - body: { - pitId, - }, - }); + try { + await this.paas.query({ + controller: "application/storage", + action: "finishDumpDocuments", + environmentId: this.args.environment, + projectId: this.flags.project || this.getProject(), + applicationId: this.args.applicationId, + body: { + pitId, + }, + }); + } catch (error: any) { + this.logInfo(`Unable to cleanly finish the dump session: ${error}`); + } } } From 8b0cd2ce18c75f7c6db0737a5d7c2892721c0e42 Mon Sep 17 00:00:00 2001 From: Kuruyia <8174691+Kuruyia@users.noreply.github.com> Date: Wed, 3 Jan 2024 15:47:51 +0100 Subject: [PATCH 06/10] feat: store dumped PaaS ES documents in a single JSONL file --- package-lock.json | 36 +++++++++++++++++------ package.json | 2 +- src/commands/paas/elasticsearch/dump.ts | 39 +++++++++++++++++++------ 3 files changed, 58 insertions(+), 19 deletions(-) diff --git a/package-lock.json b/package-lock.json index 465022df..241ee7ad 100644 --- a/package-lock.json +++ b/package-lock.json @@ -47,7 +47,7 @@ "@types/listr": "^0.14.2", "@types/mocha": "^8.2.2", "@types/ndjson": "^2.0.0", - "@types/node": "^14.14.41", + "@types/node": "^18.19.0", "@types/node-emoji": "^1.8.1", "@types/node-fetch": "^2.6.1", "@types/tar": "^6.1.3", @@ -1366,10 +1366,13 @@ } }, "node_modules/@types/node": { - "version": "14.18.36", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.36.tgz", - "integrity": "sha512-FXKWbsJ6a1hIrRxv+FoukuHnGTgEzKYGi7kilfMae96AL9UNkPFNWJEEYWzdRI9ooIkbr4AKldyuSTLql06vLQ==", - "dev": true + "version": "18.19.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.4.tgz", + "integrity": "sha512-xNzlUhzoHotIsnFoXmJB+yWmBvFZgKCI9TtPIEdYIMM1KWfwuY8zh7wvc1u1OAXlC7dlf6mZVx/s+Y5KfFz19A==", + "dev": true, + "dependencies": { + "undici-types": "~5.26.4" + } }, "node_modules/@types/node-emoji": { "version": "1.8.2", @@ -7668,6 +7671,12 @@ "node": ">=4.2.0" } }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "dev": true + }, "node_modules/universalify": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", @@ -9180,10 +9189,13 @@ } }, "@types/node": { - "version": "14.18.36", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.36.tgz", - "integrity": "sha512-FXKWbsJ6a1hIrRxv+FoukuHnGTgEzKYGi7kilfMae96AL9UNkPFNWJEEYWzdRI9ooIkbr4AKldyuSTLql06vLQ==", - "dev": true + "version": "18.19.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.4.tgz", + "integrity": "sha512-xNzlUhzoHotIsnFoXmJB+yWmBvFZgKCI9TtPIEdYIMM1KWfwuY8zh7wvc1u1OAXlC7dlf6mZVx/s+Y5KfFz19A==", + "dev": true, + "requires": { + "undici-types": "~5.26.4" + } }, "@types/node-emoji": { "version": "1.8.2", @@ -13917,6 +13929,12 @@ "integrity": "sha512-DqGhF5IKoBl8WNf8C1gu8q0xZSInh9j1kJJMqT3a94w1JzVaBU4EXOSMrz9yDqMT0xt3selp83fuFMQ0uzv6qA==", "dev": true }, + "undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "dev": true + }, "universalify": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", diff --git a/package.json b/package.json index c18fa3df..b77a093b 100644 --- a/package.json +++ b/package.json @@ -54,7 +54,7 @@ "@types/listr": "^0.14.2", "@types/mocha": "^8.2.2", "@types/ndjson": "^2.0.0", - "@types/node": "^14.14.41", + "@types/node": "^18.19.0", "@types/node-emoji": "^1.8.1", "@types/node-fetch": "^2.6.1", "@types/tar": "^6.1.3", diff --git a/src/commands/paas/elasticsearch/dump.ts b/src/commands/paas/elasticsearch/dump.ts index 4cecb0c3..d886d5df 100644 --- a/src/commands/paas/elasticsearch/dump.ts +++ b/src/commands/paas/elasticsearch/dump.ts @@ -1,6 +1,7 @@ import path from "path"; import fs from "node:fs/promises"; +import ndjson from "ndjson"; import { flags } from "@oclif/command"; import { PaasKommand } from "../../../support/PaasKommand"; @@ -72,7 +73,6 @@ class PaasEsDump extends PaasKommand { // Create the dump directory await fs.mkdir(this.args.dumpDirectory, { recursive: true }); - await fs.mkdir(path.join(this.args.dumpDirectory, "documents/"), { recursive: true }); // Dump the indexes this.logInfo("Dumping Elasticsearch indexes..."); @@ -135,10 +135,32 @@ class PaasEsDump extends PaasKommand { let pitId = ""; let searchAfter: string[] = []; - let currentDocumentChunk = 0; let dumpedDocuments = 0; let totalDocuments = 0; + const fd = await fs.open(path.join(this.args.dumpDirectory, "documents.jsonl"), "w"); + const writeStream = fd.createWriteStream(); + const ndjsonStream = ndjson.stringify(); + + writeStream.on("error", (error) => { + throw error; + }); + + ndjsonStream.on("data", (line: string) => { + writeStream.write(line); + }); + + const teardown = async () => { + // Finish the dump session if a PIT ID is set + if (pitId.length > 0) { + await this.finishDump(pitId); + } + + // Close the open streams/file + writeStream.close(); + await fd.close(); + }; + try { // Dump the first batch let result = await this.dumpDocuments(pitId, searchAfter); @@ -149,8 +171,10 @@ class PaasEsDump extends PaasKommand { pitId = result.pit_id; searchAfter = hits[hits.length - 1].sort; - // Save the document - await fs.writeFile(path.join(this.args.dumpDirectory, "documents/", `${currentDocumentChunk++}.json`), JSON.stringify(hits)); + // Save the documents + for (let i = 0; i < hits.length; ++i) { + ndjsonStream.write(hits[i]); + } dumpedDocuments += hits.length; totalDocuments = result.hits.total.value; @@ -161,17 +185,14 @@ class PaasEsDump extends PaasKommand { hits = result.hits.hits; } } catch (error: any) { - // Attempt to finish the dump if a PIT ID is set - if (pitId.length > 0) { - await this.finishDump(pitId); - } + teardown(); this.logKo(`Error while dumping the documents: ${error}`); process.exit(1); } // Finish the dump - await this.finishDump(pitId); + teardown(); } /** From 1eb4b2cebb70bdeb255bed53cac2b07cf7ba37f6 Mon Sep 17 00:00:00 2001 From: Kuruyia <8174691+Kuruyia@users.noreply.github.com> Date: Wed, 3 Jan 2024 15:55:46 +0100 Subject: [PATCH 07/10] docs: update README --- README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index a53d73e0..3006ee67 100644 --- a/README.md +++ b/README.md @@ -1072,8 +1072,9 @@ ARGUMENTS DUMPDIRECTORY Directory where to store dump files OPTIONS - --help show CLI help - --project=project Current PaaS project + --batch-size=batch-size [default: 2000] Maximum batch size + --help show CLI help + --project=project Current PaaS project ``` _See code: [src/commands/paas/elasticsearch/dump.ts](src/commands/paas/elasticsearch/dump.ts)_ From 0c64151bd6b46abaa9ae73fd26704aee5061dfc2 Mon Sep 17 00:00:00 2001 From: Kuruyia <8174691+Kuruyia@users.noreply.github.com> Date: Wed, 3 Jan 2024 16:45:32 +0100 Subject: [PATCH 08/10] feat: check the batch size --- src/commands/paas/elasticsearch/dump.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/commands/paas/elasticsearch/dump.ts b/src/commands/paas/elasticsearch/dump.ts index d886d5df..c73266ed 100644 --- a/src/commands/paas/elasticsearch/dump.ts +++ b/src/commands/paas/elasticsearch/dump.ts @@ -60,6 +60,12 @@ class PaasEsDump extends PaasKommand { ]; async runSafe() { + // Check that the batch size is positive + if (this.flags["batch-size"] <= 0) { + this.logKo(`The batch size must be greater than zero. (Specified batch size: ${this.flags["batch-size"]})`); + process.exit(1); + } + // Log in to the PaaS const apiKey = await this.getCredentials(); From a103dd4215b5a1c5a62ed31c5e036d0beba293cf Mon Sep 17 00:00:00 2001 From: rolljee Date: Tue, 16 Jan 2024 09:17:25 +0100 Subject: [PATCH 09/10] feat(paas): Update paas snapshot api call --- src/commands/paas/snapshots/restore.ts | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/commands/paas/snapshots/restore.ts b/src/commands/paas/snapshots/restore.ts index f52f0405..64be1569 100644 --- a/src/commands/paas/snapshots/restore.ts +++ b/src/commands/paas/snapshots/restore.ts @@ -55,10 +55,7 @@ class PaasSnapshotsRestore extends PaasKommand { environmentId: this.args.environment, projectId: this.flags.project || this.getProject(), applicationId: this.args.applicationId, - body: { - repository: "automated", - snapshot: this.args.snapshotId, - }, + snapshotId: this.args.snapshotId }); this.logInfo("Ok"); From bb17b8a166f2ba2d5449e104aacfb648ae5687ad Mon Sep 17 00:00:00 2001 From: rolljee Date: Tue, 16 Jan 2024 10:05:37 +0100 Subject: [PATCH 10/10] Release 0.28.0 --- README.md | 4 +--- package-lock.json | 4 ++-- package.json | 2 +- 3 files changed, 4 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 6ca97495..80208219 100644 --- a/README.md +++ b/README.md @@ -27,7 +27,7 @@ $ npm install -g kourou $ kourou COMMAND running command... $ kourou (-v|--version|version) -kourou/0.27.1 darwin-arm64 node-v18.17.1 +kourou/0.28.0 darwin-arm64 node-v20.10.0 $ kourou --help [COMMAND] USAGE $ kourou COMMAND @@ -1084,8 +1084,6 @@ OPTIONS --project=project Current PaaS project ``` -_See code: [src/commands/paas/elasticsearch/dump.ts](src/commands/paas/elasticsearch/dump.ts)_ - ## `kourou paas:init PROJECT` Initialize a PaaS project in current directory diff --git a/package-lock.json b/package-lock.json index 5ce0359d..f66df273 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "kourou", - "version": "0.27.1", + "version": "0.28.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "kourou", - "version": "0.27.1", + "version": "0.28.0", "license": "Apache-2.0", "dependencies": { "@elastic/elasticsearch": "^7.12.0", diff --git a/package.json b/package.json index ce1b2e17..82963ad3 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "kourou", "description": "The CLI that helps you manage your Kuzzle instances", - "version": "0.27.1", + "version": "0.28.0", "author": "The Kuzzle Team ", "bin": { "kourou": "./bin/run"