@credibledata/cred-cli 0.0.7 → 0.0.102
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-DEV.md +2 -2
- package/bun.lock +113 -337
- package/dist/client/api.js +2999 -1953
- package/dist/client/api.js.map +1 -1
- package/dist/client/base.js +1 -1
- package/dist/client/common.js +1 -1
- package/dist/client/configuration.js +1 -1
- package/dist/client/index.js +1 -1
- package/dist/clientconfiguration.js +59 -24
- package/dist/clientconfiguration.js.map +1 -1
- package/dist/clientconfiguration.spec.js +69 -37
- package/dist/clientconfiguration.spec.js.map +1 -1
- package/dist/commands/add.js +18 -5
- package/dist/commands/add.js.map +1 -1
- package/dist/commands/connection/createconnections.js +4 -4
- package/dist/commands/connection/createconnections.js.map +1 -1
- package/dist/commands/connection/createconnections.spec.js +11 -1
- package/dist/commands/connection/createconnections.spec.js.map +1 -1
- package/dist/commands/connection/deleteconnection.js +4 -4
- package/dist/commands/connection/deleteconnection.js.map +1 -1
- package/dist/commands/connection/deleteconnection.spec.js +1 -1
- package/dist/commands/connection/deleteconnection.spec.js.map +1 -1
- package/dist/commands/connection/listconnections.js +4 -4
- package/dist/commands/connection/listconnections.js.map +1 -1
- package/dist/commands/connection/listconnections.spec.js +1 -1
- package/dist/commands/connection/listconnections.spec.js.map +1 -1
- package/dist/commands/{project/createproject.js → environment/createenvironment.js} +17 -14
- package/dist/commands/environment/createenvironment.js.map +1 -0
- package/dist/commands/{project/createproject.spec.js → environment/createenvironment.spec.js} +46 -46
- package/dist/commands/environment/createenvironment.spec.js.map +1 -0
- package/dist/commands/{project/deleteproject.js → environment/deleteenvironment.js} +9 -9
- package/dist/commands/environment/deleteenvironment.js.map +1 -0
- package/dist/commands/{project/deleteproject.spec.js → environment/deleteenvironment.spec.js} +29 -29
- package/dist/commands/environment/deleteenvironment.spec.js.map +1 -0
- package/dist/commands/{project/getproject.js → environment/getenvironment.js} +8 -8
- package/dist/commands/environment/getenvironment.js.map +1 -0
- package/dist/commands/{project/getproject.spec.js → environment/getenvironment.spec.js} +32 -33
- package/dist/commands/environment/getenvironment.spec.js.map +1 -0
- package/dist/commands/{project/listprojects.js → environment/listenvironments.js} +10 -10
- package/dist/commands/environment/listenvironments.js.map +1 -0
- package/dist/commands/{project/listprojects.spec.js → environment/listenvironments.spec.js} +35 -35
- package/dist/commands/environment/listenvironments.spec.js.map +1 -0
- package/dist/commands/{project/setproject.js → environment/setenvironment.js} +6 -5
- package/dist/commands/environment/setenvironment.js.map +1 -0
- package/dist/commands/{project/setproject.spec.js → environment/setenvironment.spec.js} +9 -9
- package/dist/commands/environment/setenvironment.spec.js.map +1 -0
- package/dist/commands/{project/updateproject.js → environment/updateenvironment.js} +13 -13
- package/dist/commands/environment/updateenvironment.js.map +1 -0
- package/dist/commands/{project/updateproject.spec.js → environment/updateenvironment.spec.js} +44 -44
- package/dist/commands/environment/updateenvironment.spec.js.map +1 -0
- package/dist/commands/get.js +15 -5
- package/dist/commands/get.js.map +1 -1
- package/dist/commands/legacy.js +9 -0
- package/dist/commands/legacy.js.map +1 -0
- package/dist/commands/list.js +17 -4
- package/dist/commands/list.js.map +1 -1
- package/dist/commands/misc/login.js +2 -2
- package/dist/commands/misc/login.js.map +1 -1
- package/dist/commands/misc/login.spec.js +41 -5
- package/dist/commands/misc/login.spec.js.map +1 -1
- package/dist/commands/package/deletepackage.js +4 -4
- package/dist/commands/package/deletepackage.js.map +1 -1
- package/dist/commands/package/deletepackage.spec.js +1 -1
- package/dist/commands/package/deletepackage.spec.js.map +1 -1
- package/dist/commands/package/listpackages.js +4 -4
- package/dist/commands/package/listpackages.js.map +1 -1
- package/dist/commands/package/listpackages.spec.js +1 -1
- package/dist/commands/package/listpackages.spec.js.map +1 -1
- package/dist/commands/package/publish.js +10 -10
- package/dist/commands/package/publish.js.map +1 -1
- package/dist/commands/package/publish.spec.js +34 -6
- package/dist/commands/package/publish.spec.js.map +1 -1
- package/dist/commands/package/updatepackage.js +4 -4
- package/dist/commands/package/updatepackage.js.map +1 -1
- package/dist/commands/package/updatepackage.spec.js +1 -1
- package/dist/commands/package/updatepackage.spec.js.map +1 -1
- package/dist/commands/rm.js +15 -4
- package/dist/commands/rm.js.map +1 -1
- package/dist/commands/set.js +12 -4
- package/dist/commands/set.js.map +1 -1
- package/dist/commands/update.js +19 -6
- package/dist/commands/update.js.map +1 -1
- package/dist/commands/version/archive-unarchive-version.js +4 -5
- package/dist/commands/version/archive-unarchive-version.js.map +1 -1
- package/dist/commands/version/archive-unarchive-version.spec.js +4 -4
- package/dist/commands/version/archive-unarchive-version.spec.js.map +1 -1
- package/dist/commands/version/listversions.js +4 -4
- package/dist/commands/version/listversions.js.map +1 -1
- package/dist/commands/version/listversions.spec.js +1 -1
- package/dist/commands/version/listversions.spec.js.map +1 -1
- package/dist/constants.js +47 -19
- package/dist/constants.js.map +1 -1
- package/dist/constants.spec.js +90 -0
- package/dist/constants.spec.js.map +1 -0
- package/dist/index.js +74 -16
- package/dist/index.js.map +1 -1
- package/package.json +7 -8
- package/src/client/api.ts +3552 -2182
- package/src/client/base.ts +1 -1
- package/src/client/common.ts +1 -1
- package/src/client/configuration.ts +1 -1
- package/src/client/index.ts +1 -1
- package/src/clientconfiguration.spec.ts +113 -114
- package/src/clientconfiguration.ts +69 -28
- package/src/commands/add.ts +35 -12
- package/src/commands/connection/createconnections.spec.ts +11 -1
- package/src/commands/connection/createconnections.ts +4 -4
- package/src/commands/connection/deleteconnection.spec.ts +1 -1
- package/src/commands/connection/deleteconnection.ts +4 -4
- package/src/commands/connection/listconnections.spec.ts +1 -1
- package/src/commands/connection/listconnections.ts +4 -4
- package/src/commands/{project/createproject.spec.ts → environment/createenvironment.spec.ts} +56 -54
- package/src/commands/{project/createproject.ts → environment/createenvironment.ts} +17 -14
- package/src/commands/{project/deleteproject.spec.ts → environment/deleteenvironment.spec.ts} +59 -30
- package/src/commands/{project/deleteproject.ts → environment/deleteenvironment.ts} +10 -10
- package/src/commands/environment/getenvironment.spec.ts +110 -0
- package/src/commands/{project/getproject.ts → environment/getenvironment.ts} +9 -9
- package/src/commands/{project/listprojects.spec.ts → environment/listenvironments.spec.ts} +37 -35
- package/src/commands/{project/listprojects.ts → environment/listenvironments.ts} +13 -8
- package/src/commands/{project/setproject.spec.ts → environment/setenvironment.spec.ts} +8 -8
- package/src/commands/{project/setproject.ts → environment/setenvironment.ts} +4 -4
- package/src/commands/{project/updateproject.spec.ts → environment/updateenvironment.spec.ts} +53 -51
- package/src/commands/{project/updateproject.ts → environment/updateenvironment.ts} +19 -17
- package/src/commands/get.ts +22 -9
- package/src/commands/legacy.ts +5 -0
- package/src/commands/list.ts +33 -9
- package/src/commands/misc/login.spec.ts +47 -5
- package/src/commands/misc/login.ts +6 -2
- package/src/commands/package/deletepackage.spec.ts +1 -1
- package/src/commands/package/deletepackage.ts +4 -4
- package/src/commands/package/listpackages.spec.ts +1 -1
- package/src/commands/package/listpackages.ts +4 -4
- package/src/commands/package/publish.spec.ts +36 -6
- package/src/commands/package/publish.ts +12 -8
- package/src/commands/package/updatepackage.spec.ts +1 -1
- package/src/commands/package/updatepackage.ts +4 -4
- package/src/commands/rm.ts +25 -9
- package/src/commands/set.ts +13 -4
- package/src/commands/update.ts +32 -12
- package/src/commands/version/archive-unarchive-version.spec.ts +4 -4
- package/src/commands/version/archive-unarchive-version.ts +4 -7
- package/src/commands/version/listversions.spec.ts +1 -1
- package/src/commands/version/listversions.ts +4 -4
- package/src/constants.spec.ts +111 -0
- package/src/constants.ts +81 -18
- package/src/index.ts +103 -17
- package/dist/commands/project/createproject.js.map +0 -1
- package/dist/commands/project/createproject.spec.js.map +0 -1
- package/dist/commands/project/deleteproject.js.map +0 -1
- package/dist/commands/project/deleteproject.spec.js.map +0 -1
- package/dist/commands/project/getproject.js.map +0 -1
- package/dist/commands/project/getproject.spec.js.map +0 -1
- package/dist/commands/project/listprojects.js.map +0 -1
- package/dist/commands/project/listprojects.spec.js.map +0 -1
- package/dist/commands/project/setproject.js.map +0 -1
- package/dist/commands/project/setproject.spec.js.map +0 -1
- package/dist/commands/project/updateproject.js.map +0 -1
- package/dist/commands/project/updateproject.spec.js.map +0 -1
- package/src/commands/project/getproject.spec.ts +0 -109
package/src/commands/{project/updateproject.spec.ts → environment/updateenvironment.spec.ts}
RENAMED
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
import { expect } from "chai";
|
|
2
2
|
import sinon from "sinon";
|
|
3
|
-
import {
|
|
3
|
+
import { EnvironmentsApi } from "../../client/api";
|
|
4
4
|
import { ClientConfiguration } from "../../clientconfiguration";
|
|
5
5
|
import { logger } from "../../logger";
|
|
6
|
-
import {
|
|
6
|
+
import { updateEnvironment } from "./updateenvironment";
|
|
7
7
|
|
|
8
|
-
describe("update-
|
|
8
|
+
describe("update-environment", () => {
|
|
9
9
|
let sandbox: sinon.SinonSandbox;
|
|
10
|
-
let
|
|
10
|
+
let updateEnvironmentStub: sinon.SinonStub;
|
|
11
11
|
let loggerStub: sinon.SinonStubbedInstance<typeof logger>;
|
|
12
12
|
|
|
13
13
|
beforeEach(() => {
|
|
14
14
|
sandbox = sinon.createSandbox();
|
|
15
|
-
|
|
15
|
+
updateEnvironmentStub = sandbox.stub();
|
|
16
16
|
loggerStub = sandbox.stub(logger);
|
|
17
17
|
|
|
18
18
|
// Mock ClientConfiguration constructor
|
|
@@ -26,48 +26,50 @@ describe("update-project", () => {
|
|
|
26
26
|
.stub(ClientConfiguration.prototype, "getHeaders")
|
|
27
27
|
.returns({ Authorization: "Bearer test-token" });
|
|
28
28
|
|
|
29
|
-
// Mock
|
|
29
|
+
// Mock EnvironmentsApi constructor and method
|
|
30
30
|
sandbox
|
|
31
|
-
.stub(
|
|
32
|
-
.callsFake(
|
|
31
|
+
.stub(EnvironmentsApi.prototype, "updateEnvironment")
|
|
32
|
+
.callsFake(updateEnvironmentStub);
|
|
33
33
|
});
|
|
34
34
|
|
|
35
35
|
afterEach(() => {
|
|
36
36
|
sandbox.restore();
|
|
37
37
|
});
|
|
38
38
|
|
|
39
|
-
describe("
|
|
40
|
-
it("should update
|
|
39
|
+
describe("updateEnvironment", () => {
|
|
40
|
+
it("should update environment successfully", async () => {
|
|
41
41
|
const mockResponse = { status: 200 };
|
|
42
|
-
|
|
42
|
+
updateEnvironmentStub.resolves(mockResponse);
|
|
43
43
|
|
|
44
|
-
await
|
|
44
|
+
await updateEnvironment(
|
|
45
45
|
"http://test-server",
|
|
46
|
-
"test-
|
|
46
|
+
"test-environment",
|
|
47
47
|
{ replicationCount: 3 },
|
|
48
48
|
false,
|
|
49
49
|
true,
|
|
50
50
|
);
|
|
51
51
|
|
|
52
|
-
expect(
|
|
53
|
-
expect(
|
|
54
|
-
expect(
|
|
55
|
-
|
|
52
|
+
expect(updateEnvironmentStub.calledOnce).to.be.true;
|
|
53
|
+
expect(updateEnvironmentStub.firstCall.args[0]).to.equal("test-org");
|
|
54
|
+
expect(updateEnvironmentStub.firstCall.args[1]).to.equal(
|
|
55
|
+
"test-environment",
|
|
56
|
+
);
|
|
57
|
+
expect(updateEnvironmentStub.firstCall.args[2]).to.include({
|
|
56
58
|
replicationCount: 3,
|
|
57
59
|
});
|
|
58
|
-
expect(
|
|
60
|
+
expect(updateEnvironmentStub.firstCall.args[3]).to.deep.include({
|
|
59
61
|
baseURL: "http://test-server",
|
|
60
62
|
headers: { Authorization: "Bearer test-token" },
|
|
61
63
|
});
|
|
62
64
|
expect(
|
|
63
65
|
loggerStub.info.calledWith(
|
|
64
|
-
sinon.match("Successfully updated
|
|
66
|
+
sinon.match("Successfully updated environment test-environment"),
|
|
65
67
|
),
|
|
66
68
|
).to.be.true;
|
|
67
69
|
});
|
|
68
70
|
|
|
69
|
-
it("should handle missing
|
|
70
|
-
await
|
|
71
|
+
it("should handle missing environment name", async () => {
|
|
72
|
+
await updateEnvironment(
|
|
71
73
|
"http://test-server",
|
|
72
74
|
"",
|
|
73
75
|
{ replicationCount: 3 },
|
|
@@ -75,50 +77,50 @@ describe("update-project", () => {
|
|
|
75
77
|
true,
|
|
76
78
|
);
|
|
77
79
|
|
|
78
|
-
expect(
|
|
80
|
+
expect(updateEnvironmentStub.called).to.be.false;
|
|
79
81
|
expect(
|
|
80
82
|
loggerStub.error.calledWith(
|
|
81
|
-
sinon.match("Please provide
|
|
83
|
+
sinon.match("Please provide an environment name"),
|
|
82
84
|
),
|
|
83
85
|
).to.be.true;
|
|
84
86
|
});
|
|
85
87
|
|
|
86
88
|
it("should handle API errors", async () => {
|
|
87
89
|
const mockError = new Error("API Error");
|
|
88
|
-
|
|
90
|
+
updateEnvironmentStub.rejects(mockError);
|
|
89
91
|
|
|
90
|
-
await
|
|
92
|
+
await updateEnvironment(
|
|
91
93
|
"http://test-server",
|
|
92
|
-
"test-
|
|
94
|
+
"test-environment",
|
|
93
95
|
{ replicationCount: 3 },
|
|
94
96
|
true,
|
|
95
97
|
true,
|
|
96
98
|
);
|
|
97
99
|
|
|
98
|
-
expect(
|
|
100
|
+
expect(updateEnvironmentStub.calledOnce).to.be.true;
|
|
99
101
|
expect(
|
|
100
102
|
loggerStub.error.calledWith(
|
|
101
|
-
sinon.match("Failed to update
|
|
103
|
+
sinon.match("Failed to update environment test-environment"),
|
|
102
104
|
),
|
|
103
105
|
).to.be.true;
|
|
104
106
|
});
|
|
105
107
|
|
|
106
108
|
it("should handle non-200 response status", async () => {
|
|
107
109
|
const mockResponse = { status: 400 };
|
|
108
|
-
|
|
110
|
+
updateEnvironmentStub.resolves(mockResponse);
|
|
109
111
|
|
|
110
|
-
await
|
|
112
|
+
await updateEnvironment(
|
|
111
113
|
"http://test-server",
|
|
112
|
-
"test-
|
|
114
|
+
"test-environment",
|
|
113
115
|
{ replicationCount: 3 },
|
|
114
116
|
false,
|
|
115
117
|
true,
|
|
116
118
|
);
|
|
117
119
|
|
|
118
|
-
expect(
|
|
120
|
+
expect(updateEnvironmentStub.calledOnce).to.be.true;
|
|
119
121
|
expect(
|
|
120
122
|
loggerStub.error.calledWith(
|
|
121
|
-
sinon.match("Failed to update
|
|
123
|
+
sinon.match("Failed to update environment. Status: 400"),
|
|
122
124
|
),
|
|
123
125
|
).to.be.true;
|
|
124
126
|
});
|
|
@@ -129,25 +131,25 @@ describe("update-project", () => {
|
|
|
129
131
|
it("should fail when user is not logged in", async () => {
|
|
130
132
|
sandbox.restore();
|
|
131
133
|
sandbox = sinon.createSandbox();
|
|
132
|
-
|
|
134
|
+
updateEnvironmentStub = sandbox.stub();
|
|
133
135
|
loggerStub = sandbox.stub(logger);
|
|
134
136
|
|
|
135
137
|
sandbox
|
|
136
138
|
.stub(ClientConfiguration.prototype, "doesConfigExists")
|
|
137
139
|
.returns(false);
|
|
138
140
|
sandbox
|
|
139
|
-
.stub(
|
|
140
|
-
.callsFake(
|
|
141
|
+
.stub(EnvironmentsApi.prototype, "updateEnvironment")
|
|
142
|
+
.callsFake(updateEnvironmentStub);
|
|
141
143
|
|
|
142
|
-
await
|
|
144
|
+
await updateEnvironment(
|
|
143
145
|
"http://test-server",
|
|
144
|
-
"test-
|
|
146
|
+
"test-environment",
|
|
145
147
|
{ replicationCount: 3 },
|
|
146
148
|
false,
|
|
147
149
|
true,
|
|
148
150
|
);
|
|
149
151
|
|
|
150
|
-
expect(
|
|
152
|
+
expect(updateEnvironmentStub.called).to.be.false;
|
|
151
153
|
expect(
|
|
152
154
|
loggerStub.error.calledWith(
|
|
153
155
|
sinon.match("Please, make sure that you are logged in"),
|
|
@@ -159,36 +161,36 @@ describe("update-project", () => {
|
|
|
159
161
|
describe("replication count validation", () => {
|
|
160
162
|
it("should accept valid replication counts", async () => {
|
|
161
163
|
const mockResponse = { status: 200 };
|
|
162
|
-
|
|
164
|
+
updateEnvironmentStub.resolves(mockResponse);
|
|
163
165
|
|
|
164
166
|
const validCounts = [1, 2, 5, 10, 100];
|
|
165
167
|
|
|
166
168
|
for (const count of validCounts) {
|
|
167
|
-
await
|
|
169
|
+
await updateEnvironment(
|
|
168
170
|
"http://test-server",
|
|
169
|
-
"test-
|
|
171
|
+
"test-environment",
|
|
170
172
|
{ replicationCount: count },
|
|
171
173
|
false,
|
|
172
174
|
true,
|
|
173
175
|
);
|
|
174
|
-
expect(
|
|
175
|
-
expect(
|
|
176
|
+
expect(updateEnvironmentStub.called).to.be.true;
|
|
177
|
+
expect(updateEnvironmentStub.firstCall.args[2]).to.include({
|
|
176
178
|
replicationCount: count,
|
|
177
179
|
});
|
|
178
|
-
|
|
180
|
+
updateEnvironmentStub.reset();
|
|
179
181
|
}
|
|
180
182
|
});
|
|
181
183
|
|
|
182
184
|
it("should reject replication count less than 1", async () => {
|
|
183
|
-
await
|
|
185
|
+
await updateEnvironment(
|
|
184
186
|
"http://test-server",
|
|
185
|
-
"test-
|
|
187
|
+
"test-environment",
|
|
186
188
|
{ replicationCount: 0 },
|
|
187
189
|
false,
|
|
188
190
|
true,
|
|
189
191
|
);
|
|
190
192
|
|
|
191
|
-
expect(
|
|
193
|
+
expect(updateEnvironmentStub.called).to.be.false;
|
|
192
194
|
expect(
|
|
193
195
|
loggerStub.error.calledWith(
|
|
194
196
|
sinon.match("Replication count must be at least 1"),
|
|
@@ -197,15 +199,15 @@ describe("update-project", () => {
|
|
|
197
199
|
});
|
|
198
200
|
|
|
199
201
|
it("should reject negative replication count", async () => {
|
|
200
|
-
await
|
|
202
|
+
await updateEnvironment(
|
|
201
203
|
"http://test-server",
|
|
202
|
-
"test-
|
|
204
|
+
"test-environment",
|
|
203
205
|
{ replicationCount: -1 },
|
|
204
206
|
false,
|
|
205
207
|
true,
|
|
206
208
|
);
|
|
207
209
|
|
|
208
|
-
expect(
|
|
210
|
+
expect(updateEnvironmentStub.called).to.be.false;
|
|
209
211
|
expect(
|
|
210
212
|
loggerStub.error.calledWith(
|
|
211
213
|
sinon.match("Replication count must be at least 1"),
|
|
@@ -1,19 +1,19 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Environment, EnvironmentsApi } from "../../client/api";
|
|
2
2
|
import { Configuration } from "../../client/configuration";
|
|
3
3
|
import { ClientConfiguration } from "../../clientconfiguration";
|
|
4
4
|
import { logger } from "../../logger";
|
|
5
5
|
import { getConfirmation, printOutError } from "../../utils";
|
|
6
6
|
|
|
7
|
-
const
|
|
7
|
+
const environmentsApi = new EnvironmentsApi(new Configuration());
|
|
8
8
|
|
|
9
|
-
type
|
|
9
|
+
type UpdateEnvironmentProperties = {
|
|
10
10
|
replicationCount?: number;
|
|
11
11
|
};
|
|
12
12
|
|
|
13
|
-
export async function
|
|
13
|
+
export async function updateEnvironment(
|
|
14
14
|
controlPlane: string,
|
|
15
|
-
|
|
16
|
-
properties:
|
|
15
|
+
environmentName: string,
|
|
16
|
+
properties: UpdateEnvironmentProperties,
|
|
17
17
|
debug?: boolean,
|
|
18
18
|
skipConfirmation?: boolean,
|
|
19
19
|
) {
|
|
@@ -23,8 +23,8 @@ export async function updateProject(
|
|
|
23
23
|
return;
|
|
24
24
|
}
|
|
25
25
|
|
|
26
|
-
if (!
|
|
27
|
-
logger.error("Please provide
|
|
26
|
+
if (!environmentName) {
|
|
27
|
+
logger.error("Please provide an environment name");
|
|
28
28
|
return;
|
|
29
29
|
}
|
|
30
30
|
|
|
@@ -41,7 +41,7 @@ export async function updateProject(
|
|
|
41
41
|
try {
|
|
42
42
|
if (!skipConfirmation) {
|
|
43
43
|
const confirmation = await getConfirmation(
|
|
44
|
-
`Are you sure you want to update
|
|
44
|
+
`Are you sure you want to update environment ${environmentName}?`,
|
|
45
45
|
);
|
|
46
46
|
if (!confirmation) {
|
|
47
47
|
logger.info("Operation cancelled.");
|
|
@@ -49,16 +49,16 @@ export async function updateProject(
|
|
|
49
49
|
}
|
|
50
50
|
}
|
|
51
51
|
|
|
52
|
-
const
|
|
52
|
+
const environmentUpdate: Environment = {};
|
|
53
53
|
|
|
54
54
|
if (properties.replicationCount !== undefined) {
|
|
55
|
-
|
|
55
|
+
environmentUpdate.replicationCount = properties.replicationCount;
|
|
56
56
|
}
|
|
57
57
|
|
|
58
|
-
const response = await
|
|
58
|
+
const response = await environmentsApi.updateEnvironment(
|
|
59
59
|
organizationName,
|
|
60
|
-
|
|
61
|
-
|
|
60
|
+
environmentName,
|
|
61
|
+
environmentUpdate,
|
|
62
62
|
{
|
|
63
63
|
baseURL: controlPlane,
|
|
64
64
|
headers: clientConfig.getHeaders(),
|
|
@@ -66,17 +66,19 @@ export async function updateProject(
|
|
|
66
66
|
);
|
|
67
67
|
|
|
68
68
|
if (response.status === 200) {
|
|
69
|
-
logger.info(`Successfully updated
|
|
69
|
+
logger.info(`Successfully updated environment ${environmentName}`);
|
|
70
70
|
if (properties.replicationCount !== undefined) {
|
|
71
71
|
logger.info(
|
|
72
72
|
`Replication count set to ${properties.replicationCount}`,
|
|
73
73
|
);
|
|
74
74
|
}
|
|
75
75
|
} else {
|
|
76
|
-
logger.error(
|
|
76
|
+
logger.error(
|
|
77
|
+
`Failed to update environment. Status: ${response.status}`,
|
|
78
|
+
);
|
|
77
79
|
}
|
|
78
80
|
} catch (e) {
|
|
79
|
-
logger.error(`Failed to update
|
|
81
|
+
logger.error(`Failed to update environment ${environmentName}`);
|
|
80
82
|
printOutError(e, debug);
|
|
81
83
|
}
|
|
82
84
|
}
|
package/src/commands/get.ts
CHANGED
|
@@ -1,24 +1,37 @@
|
|
|
1
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
1
2
|
import { Command } from "commander";
|
|
2
3
|
import { controlPlanesByEnv, Environment } from "../constants";
|
|
3
4
|
import { getGroup } from "./group/getgroup";
|
|
4
|
-
import {
|
|
5
|
+
import { getEnvironment } from "./environment/getenvironment";
|
|
6
|
+
import { warnProjectDeprecated } from "./legacy";
|
|
5
7
|
|
|
6
8
|
export const registerGetCommands = (cli: Command, environment: Environment) => {
|
|
7
9
|
const get = cli
|
|
8
10
|
.command("get")
|
|
9
11
|
.description("Get a resource")
|
|
10
|
-
.argument("<resource>", "The resource to get (
|
|
12
|
+
.argument("<resource>", "The resource to get (environment | group)");
|
|
13
|
+
|
|
14
|
+
const getEnvironmentAction = (environmentName: string, options: any) => {
|
|
15
|
+
getEnvironment(
|
|
16
|
+
controlPlanesByEnv[environment],
|
|
17
|
+
environmentName,
|
|
18
|
+
options.debug,
|
|
19
|
+
);
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
get.command("environment")
|
|
23
|
+
.description("Get an environment by name.")
|
|
24
|
+
.argument("<environmentName>", "The name of the environment to get.")
|
|
25
|
+
.option("--debug")
|
|
26
|
+
.action(getEnvironmentAction);
|
|
11
27
|
|
|
12
28
|
get.command("project")
|
|
13
|
-
.description("
|
|
14
|
-
.argument("<projectName>", "The name of the
|
|
29
|
+
.description("[deprecated] Alias for 'get environment'.")
|
|
30
|
+
.argument("<projectName>", "The name of the environment to get.")
|
|
15
31
|
.option("--debug")
|
|
16
32
|
.action((projectName, options) => {
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
projectName,
|
|
20
|
-
options.debug,
|
|
21
|
-
);
|
|
33
|
+
warnProjectDeprecated("get environment");
|
|
34
|
+
getEnvironmentAction(projectName, options);
|
|
22
35
|
});
|
|
23
36
|
|
|
24
37
|
get.command("group")
|
package/src/commands/list.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
1
2
|
import { Command } from "commander";
|
|
2
3
|
import { controlPlanesByEnv, Environment } from "../constants";
|
|
3
4
|
import { DEFAULT_PAGE_SIZE, DEFAULT_PAGE } from "../utils";
|
|
@@ -5,8 +6,9 @@ import { listConnections } from "./connection/listconnections";
|
|
|
5
6
|
import { printOutGroups } from "./group/listgroups";
|
|
6
7
|
import { listGroupAccessTokens } from "./groupaccesstoken/listTokens";
|
|
7
8
|
import { printOutPackages } from "./package/listpackages";
|
|
8
|
-
import {
|
|
9
|
+
import { printOutEnvironments } from "./environment/listenvironments";
|
|
9
10
|
import { listVersions } from "./version/listversions";
|
|
11
|
+
import { warnProjectDeprecated } from "./legacy";
|
|
10
12
|
|
|
11
13
|
export const registerListCommands = (
|
|
12
14
|
cli: Command,
|
|
@@ -17,10 +19,36 @@ export const registerListCommands = (
|
|
|
17
19
|
.description("List resources of a given type")
|
|
18
20
|
.argument("<resource>", "The resource to list");
|
|
19
21
|
|
|
22
|
+
const listEnvironmentsAction = (options: any) => {
|
|
23
|
+
printOutEnvironments(
|
|
24
|
+
controlPlanesByEnv[environment],
|
|
25
|
+
options.debug,
|
|
26
|
+
options.page,
|
|
27
|
+
options.pageSize,
|
|
28
|
+
);
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
list
|
|
32
|
+
.command("environment")
|
|
33
|
+
.alias("environments")
|
|
34
|
+
.description("List all environments.")
|
|
35
|
+
.option("--debug")
|
|
36
|
+
.option(
|
|
37
|
+
"--page <number>",
|
|
38
|
+
`Page number (starts at ${DEFAULT_PAGE})`,
|
|
39
|
+
String(DEFAULT_PAGE),
|
|
40
|
+
)
|
|
41
|
+
.option(
|
|
42
|
+
"--page-size <number>",
|
|
43
|
+
`Items per page (default: all records, max: 500)`,
|
|
44
|
+
String(DEFAULT_PAGE_SIZE),
|
|
45
|
+
)
|
|
46
|
+
.action(listEnvironmentsAction);
|
|
47
|
+
|
|
20
48
|
list
|
|
21
49
|
.command("project")
|
|
22
50
|
.alias("projects")
|
|
23
|
-
.description("
|
|
51
|
+
.description("[deprecated] Alias for 'ls environment'.")
|
|
24
52
|
.option("--debug")
|
|
25
53
|
.option(
|
|
26
54
|
"--page <number>",
|
|
@@ -33,12 +61,8 @@ export const registerListCommands = (
|
|
|
33
61
|
String(DEFAULT_PAGE_SIZE),
|
|
34
62
|
)
|
|
35
63
|
.action((options) => {
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
options.debug,
|
|
39
|
-
options.page,
|
|
40
|
-
options.pageSize,
|
|
41
|
-
);
|
|
64
|
+
warnProjectDeprecated("ls environment");
|
|
65
|
+
listEnvironmentsAction(options);
|
|
42
66
|
});
|
|
43
67
|
|
|
44
68
|
list
|
|
@@ -68,7 +92,7 @@ export const registerListCommands = (
|
|
|
68
92
|
list
|
|
69
93
|
.command("package")
|
|
70
94
|
.alias("packages")
|
|
71
|
-
.description("List the packages in the active
|
|
95
|
+
.description("List the packages in the active environment.")
|
|
72
96
|
.option("--debug")
|
|
73
97
|
.option(
|
|
74
98
|
"--page <number>",
|
|
@@ -19,6 +19,7 @@ function createFakeIdToken(payload: Record<string, unknown>): string {
|
|
|
19
19
|
}
|
|
20
20
|
|
|
21
21
|
describe("login", () => {
|
|
22
|
+
let tmpConfigDir: string;
|
|
22
23
|
let tmpConfigFilePath: string;
|
|
23
24
|
let axiosStub: sinon.SinonStub;
|
|
24
25
|
let orgPermissionsStub: sinon.SinonStub;
|
|
@@ -51,8 +52,26 @@ describe("login", () => {
|
|
|
51
52
|
};
|
|
52
53
|
|
|
53
54
|
beforeEach(() => {
|
|
54
|
-
|
|
55
|
-
|
|
55
|
+
// mkdtempSync atomically creates a private (mode 0700) directory
|
|
56
|
+
// with an unguessable suffix, sidestepping the symlink / clobber
|
|
57
|
+
// class that CodeQL flags as js/insecure-temporary-file when a
|
|
58
|
+
// fixed name is reused inside the shared OS tmpdir.
|
|
59
|
+
tmpConfigDir = fs.mkdtempSync(join(os.tmpdir(), "cred-login-spec-"));
|
|
60
|
+
tmpConfigFilePath = join(tmpConfigDir, "cred.json");
|
|
61
|
+
// Seed with a valid ConfigFile. loadConfig now throws on malformed
|
|
62
|
+
// input rather than silently resetting, so an empty `{}` is no longer
|
|
63
|
+
// an acceptable starting state.
|
|
64
|
+
fs.writeFileSync(
|
|
65
|
+
tmpConfigFilePath,
|
|
66
|
+
JSON.stringify({
|
|
67
|
+
configPerEnvironment: {
|
|
68
|
+
production: {},
|
|
69
|
+
staging: {},
|
|
70
|
+
localhost: {},
|
|
71
|
+
},
|
|
72
|
+
activeEnvironment: "production",
|
|
73
|
+
}),
|
|
74
|
+
);
|
|
56
75
|
axiosStub = sinon.stub(axios, "request");
|
|
57
76
|
orgPermissionsStub = sinon
|
|
58
77
|
.stub(OrganizationsApi.prototype, "getOrganization")
|
|
@@ -60,7 +79,7 @@ describe("login", () => {
|
|
|
60
79
|
});
|
|
61
80
|
|
|
62
81
|
afterEach(() => {
|
|
63
|
-
fs.rmSync(
|
|
82
|
+
fs.rmSync(tmpConfigDir, { recursive: true, force: true });
|
|
64
83
|
sinon.restore();
|
|
65
84
|
});
|
|
66
85
|
|
|
@@ -159,7 +178,7 @@ describe("login", () => {
|
|
|
159
178
|
"https://admin.videoamp-aws-us-east-1.credibledata.com/api/v0",
|
|
160
179
|
tmpConfigFilePath,
|
|
161
180
|
);
|
|
162
|
-
expect(orgIdStub.calledOnceWithExactly("videoamp")).to.be.true;
|
|
181
|
+
expect(orgIdStub.calledOnceWithExactly("videoamp", undefined)).to.be.true;
|
|
163
182
|
expect(loopbackStub.calledOnce).to.be.true;
|
|
164
183
|
const call = loopbackStub.getCall(0);
|
|
165
184
|
expect(call.args[0].authorizeUrl).to.contain(
|
|
@@ -190,12 +209,35 @@ describe("login", () => {
|
|
|
190
209
|
"https://admin.videoamp-aws-us-east-1.credibledata.com/api/v0",
|
|
191
210
|
tmpConfigFilePath,
|
|
192
211
|
);
|
|
193
|
-
expect(orgIdStub.calledOnceWithExactly("VideoAmp")).to.be.true;
|
|
212
|
+
expect(orgIdStub.calledOnceWithExactly("VideoAmp", undefined)).to.be.true;
|
|
194
213
|
expect(loopbackStub.getCall(0).args[0].authorizeUrl).to.contain(
|
|
195
214
|
"organization=org_nMRKafeSuxOiuJeG",
|
|
196
215
|
);
|
|
197
216
|
});
|
|
198
217
|
|
|
218
|
+
it("forwards the cluster arg to getAuth0OrganizationIdForCliLogin (so -c aws triggers PKCE)", async function () {
|
|
219
|
+
this.timeout(2000);
|
|
220
|
+
const orgIdStub = sinon
|
|
221
|
+
.stub(credConstants, "getAuth0OrganizationIdForCliLogin")
|
|
222
|
+
.returns("org_nMRKafeSuxOiuJeG");
|
|
223
|
+
sinon
|
|
224
|
+
.stub(loopbackOAuth, "authorizationCodeViaLoopback")
|
|
225
|
+
.callsFake(async (opts) => {
|
|
226
|
+
opts.onListening?.();
|
|
227
|
+
return { code: "test-pkce-auth-code" };
|
|
228
|
+
});
|
|
229
|
+
axiosStub.onFirstCall().resolves(mockedAccessTokenResponse);
|
|
230
|
+
const config = new ClientConfiguration(tmpConfigFilePath);
|
|
231
|
+
config.setEnvironment("videoamp");
|
|
232
|
+
await login(
|
|
233
|
+
"videoamp",
|
|
234
|
+
"https://admin.videoamp-aws-us-east-1.credibledata.com/api/v0",
|
|
235
|
+
tmpConfigFilePath,
|
|
236
|
+
"aws",
|
|
237
|
+
);
|
|
238
|
+
expect(orgIdStub.calledOnceWithExactly("videoamp", "aws")).to.be.true;
|
|
239
|
+
});
|
|
240
|
+
|
|
199
241
|
it("should not pass Auth0 organization for unmapped org names", async function () {
|
|
200
242
|
this.timeout(2000);
|
|
201
243
|
axiosStub
|
|
@@ -7,6 +7,7 @@ import { ClientConfiguration } from "../../clientconfiguration";
|
|
|
7
7
|
import {
|
|
8
8
|
auth0ConfigsByEnv,
|
|
9
9
|
AUTH_CLI_LOOPBACK_REDIRECT_URI,
|
|
10
|
+
Cluster,
|
|
10
11
|
Environment,
|
|
11
12
|
getAuth0OrganizationIdForCliLogin,
|
|
12
13
|
LOGIN_TIMEOUT_MS,
|
|
@@ -21,6 +22,7 @@ export async function login(
|
|
|
21
22
|
organizationName: string,
|
|
22
23
|
controlPlaneBaseURL?: string,
|
|
23
24
|
configPath?: string,
|
|
25
|
+
cluster?: Cluster,
|
|
24
26
|
) {
|
|
25
27
|
const config = new ClientConfiguration(configPath);
|
|
26
28
|
const environment = config.getEnvironment();
|
|
@@ -29,8 +31,10 @@ export async function login(
|
|
|
29
31
|
return loginM2M(organizationName, config);
|
|
30
32
|
}
|
|
31
33
|
|
|
32
|
-
const auth0OrganizationId =
|
|
33
|
-
|
|
34
|
+
const auth0OrganizationId = getAuth0OrganizationIdForCliLogin(
|
|
35
|
+
organizationName,
|
|
36
|
+
cluster,
|
|
37
|
+
);
|
|
34
38
|
if (auth0OrganizationId) {
|
|
35
39
|
return loginWithAuthCodePkceOrganization(
|
|
36
40
|
environment,
|
|
@@ -123,7 +123,7 @@ describe("delete-package", () => {
|
|
|
123
123
|
expect(deletePackageStub.called).to.be.false;
|
|
124
124
|
expect(
|
|
125
125
|
loggerStub.error.calledWith(
|
|
126
|
-
sinon.match("Please, make sure to set
|
|
126
|
+
sinon.match("Please, make sure to set an environment"),
|
|
127
127
|
),
|
|
128
128
|
).to.be.true;
|
|
129
129
|
});
|
|
@@ -14,7 +14,7 @@ export async function deletePackage(
|
|
|
14
14
|
) {
|
|
15
15
|
const clientConfig = new ClientConfiguration();
|
|
16
16
|
const organizationName = clientConfig.getOrganization();
|
|
17
|
-
const
|
|
17
|
+
const environmentName = clientConfig.getProject();
|
|
18
18
|
const packageName = packagePath.replace("/", "");
|
|
19
19
|
|
|
20
20
|
if (!clientConfig.doesConfigExists()) {
|
|
@@ -22,8 +22,8 @@ export async function deletePackage(
|
|
|
22
22
|
return;
|
|
23
23
|
}
|
|
24
24
|
|
|
25
|
-
if (!
|
|
26
|
-
logger.error("Please, make sure to set
|
|
25
|
+
if (!environmentName) {
|
|
26
|
+
logger.error("Please, make sure to set an environment");
|
|
27
27
|
return;
|
|
28
28
|
}
|
|
29
29
|
|
|
@@ -42,7 +42,7 @@ export async function deletePackage(
|
|
|
42
42
|
try {
|
|
43
43
|
await packagesApi.deletePackage(
|
|
44
44
|
organizationName,
|
|
45
|
-
|
|
45
|
+
environmentName,
|
|
46
46
|
packageName,
|
|
47
47
|
{
|
|
48
48
|
baseURL: packageServer,
|
|
@@ -114,7 +114,7 @@ describe("list-packages", () => {
|
|
|
114
114
|
expect(result).to.be.undefined;
|
|
115
115
|
expect(
|
|
116
116
|
loggerStub.error.calledWith(
|
|
117
|
-
sinon.match("Please, make sure to set
|
|
117
|
+
sinon.match("Please, make sure to set an environment"),
|
|
118
118
|
),
|
|
119
119
|
).to.be.true;
|
|
120
120
|
});
|
|
@@ -19,15 +19,15 @@ export async function listPackages(
|
|
|
19
19
|
) {
|
|
20
20
|
const clientConfig = new ClientConfiguration();
|
|
21
21
|
const organizationName = clientConfig.getOrganization();
|
|
22
|
-
const
|
|
22
|
+
const environmentName = clientConfig.getProject();
|
|
23
23
|
|
|
24
24
|
if (!clientConfig.doesConfigExists()) {
|
|
25
25
|
logger.error("Please, make sure that you are logged in");
|
|
26
26
|
return;
|
|
27
27
|
}
|
|
28
28
|
|
|
29
|
-
if (!
|
|
30
|
-
logger.error("Please, make sure to set
|
|
29
|
+
if (!environmentName) {
|
|
30
|
+
logger.error("Please, make sure to set an environment");
|
|
31
31
|
return;
|
|
32
32
|
}
|
|
33
33
|
|
|
@@ -35,7 +35,7 @@ export async function listPackages(
|
|
|
35
35
|
const { limit, offset } = parsePaginationParams(page, pageSize);
|
|
36
36
|
const response = await packagesApi.listPackages(
|
|
37
37
|
organizationName,
|
|
38
|
-
|
|
38
|
+
environmentName,
|
|
39
39
|
limit,
|
|
40
40
|
offset,
|
|
41
41
|
{
|