Skip to content

Commit 2d8b9cb

Browse files
committed
Migrate envvarService
1 parent 0e00e3d commit 2d8b9cb

File tree

13 files changed

+1676
-11
lines changed

13 files changed

+1676
-11
lines changed
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
/**
2+
* Copyright (c) 2023 Gitpod GmbH. All rights reserved.
3+
* Licensed under the GNU Affero General Public License (AGPL).
4+
* See License.AGPL.txt in the project root for license information.
5+
*/
6+
7+
import { Code, ConnectError, PromiseClient } from "@connectrpc/connect";
8+
import { PartialMessage } from "@bufbuild/protobuf";
9+
import { EnvironmentVariableService } from "@gitpod/public-api/lib/gitpod/v1/envvar_connect";
10+
import {
11+
ListEnvironmentVariablesRequest,
12+
ListEnvironmentVariablesResponse,
13+
UpdateEnvironmentVariableRequest,
14+
UpdateEnvironmentVariableResponse,
15+
DeleteEnvironmentVariableRequest,
16+
DeleteEnvironmentVariableResponse,
17+
} from "@gitpod/public-api/lib/gitpod/v1/envvar_pb";
18+
import { converter } from "./public-api";
19+
import { getGitpodService } from "./service";
20+
import { UserEnvVar, UserEnvVarValue } from "@gitpod/gitpod-protocol";
21+
22+
export class JsonRpcEnvvarClient implements PromiseClient<typeof EnvironmentVariableService> {
23+
async listEnvironmentVariables(
24+
req: PartialMessage<ListEnvironmentVariablesRequest>,
25+
): Promise<ListEnvironmentVariablesResponse> {
26+
const userEnvVars = await getGitpodService().server.getAllEnvVars();
27+
const result = new ListEnvironmentVariablesResponse();
28+
result.environmentVariables = userEnvVars.map((i) => converter.toUserEnvironmentVariable(i));
29+
return result;
30+
}
31+
32+
async updateEnvironmentVariable(
33+
req: PartialMessage<UpdateEnvironmentVariableRequest>,
34+
): Promise<UpdateEnvironmentVariableResponse> {
35+
await getGitpodService().server.setEnvVar({
36+
name: req.envvarName || "",
37+
value: req.envvarValue || "",
38+
repositoryPattern: req.envvarRepositoryPattern || "",
39+
});
40+
41+
req.envvarRepositoryPattern = UserEnvVar.normalizeRepoPattern(req.envvarRepositoryPattern || "");
42+
const updatedUserEnvVars = await getGitpodService().server.getAllEnvVars();
43+
const updatedUserEnvVar = updatedUserEnvVars.find(
44+
(v) => v.name === req.envvarName && v.repositoryPattern === req.envvarRepositoryPattern,
45+
);
46+
if (!updatedUserEnvVar) {
47+
throw new ConnectError("env variable not found", Code.Internal);
48+
}
49+
50+
const response = new UpdateEnvironmentVariableResponse();
51+
response.environmentVariable = converter.toUserEnvironmentVariable(updatedUserEnvVar);
52+
return response;
53+
}
54+
55+
async deleteEnvironmentVariable(
56+
req: PartialMessage<DeleteEnvironmentVariableRequest>,
57+
): Promise<DeleteEnvironmentVariableResponse> {
58+
const variable: UserEnvVarValue = {
59+
name: req.envvarName || "",
60+
value: "",
61+
repositoryPattern: req.envvarRepositoryPattern || "",
62+
};
63+
await getGitpodService().server.deleteEnvVar(variable);
64+
65+
const response = new DeleteEnvironmentVariableResponse();
66+
return response;
67+
}
68+
}

components/dashboard/src/service/public-api.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@ import { JsonRpcOrganizationClient } from "./json-rpc-organization-client";
2525
import { JsonRpcWorkspaceClient } from "./json-rpc-workspace-client";
2626
import { JsonRpcAuthProviderClient } from "./json-rpc-authprovider-client";
2727
import { AuthProviderService } from "@gitpod/public-api/lib/gitpod/v1/authprovider_connect";
28+
import { EnvironmentVariableService } from "@gitpod/public-api/lib/gitpod/v1/envvar_connect";
29+
import { JsonRpcEnvvarClient } from "./json-rpc-envvar-client";
2830

2931
const transport = createConnectTransport({
3032
baseUrl: `${window.location.protocol}//${window.location.host}/public-api`,
@@ -53,6 +55,8 @@ export const configurationClient = createServiceClient(ConfigurationService);
5355

5456
export const authProviderClient = createServiceClient(AuthProviderService, new JsonRpcAuthProviderClient());
5557

58+
export const envvarClient = createServiceClient(EnvironmentVariableService, new JsonRpcEnvvarClient());
59+
5660
export async function listAllProjects(opts: { orgId: string }): Promise<ProtocolProject[]> {
5761
let pagination = {
5862
page: 1,

components/dashboard/src/user-settings/EnvironmentVariables.tsx

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,11 @@ import { useCallback, useEffect, useRef, useState } from "react";
99
import ConfirmationModal from "../components/ConfirmationModal";
1010
import { Item, ItemField, ItemsList } from "../components/ItemsList";
1111
import Modal, { ModalBody, ModalFooter, ModalHeader } from "../components/Modal";
12-
import { getGitpodService } from "../service/service";
1312
import { PageWithSettingsSubMenu } from "./PageWithSettingsSubMenu";
1413
import { EnvironmentVariableEntry } from "./EnvironmentVariableEntry";
1514
import { Button } from "../components/Button";
1615
import { Heading2, Subheading } from "../components/typography/headings";
16+
import { envvarClient } from "../service/public-api";
1717

1818
interface EnvVarModalProps {
1919
envVar: UserEnvVarValue;
@@ -150,9 +150,9 @@ export default function EnvVars() {
150150
const [isAddEnvVarModalVisible, setAddEnvVarModalVisible] = useState(false);
151151
const [isDeleteEnvVarModalVisible, setDeleteEnvVarModalVisible] = useState(false);
152152
const update = async () => {
153-
await getGitpodService()
154-
.server.getAllEnvVars()
155-
.then((r) => setEnvVars(r.sort(sortEnvVars)));
153+
await envvarClient
154+
.listEnvironmentVariables({})
155+
.then((r) => setEnvVars(r.environmentVariables.sort(sortEnvVars)));
156156
};
157157

158158
useEffect(() => {
@@ -178,12 +178,19 @@ export default function EnvVars() {
178178
};
179179

180180
const save = async (variable: UserEnvVarValue) => {
181-
await getGitpodService().server.setEnvVar(variable);
181+
await envvarClient.updateEnvironmentVariable({
182+
envvarName: variable.name,
183+
envvarValue: variable.value,
184+
envvarRepositoryPattern: variable.repositoryPattern,
185+
});
182186
await update();
183187
};
184188

185189
const deleteVariable = async (variable: UserEnvVarValue) => {
186-
await getGitpodService().server.deleteEnvVar(variable);
190+
await envvarClient.deleteEnvironmentVariable({
191+
envvarName: variable.name,
192+
envvarRepositoryPattern: variable.repositoryPattern,
193+
});
187194
await update();
188195
};
189196

components/gitpod-protocol/src/public-api-converter.ts

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ import {
3838
WorkspacePort_Protocol,
3939
WorkspaceStatus,
4040
} from "@gitpod/public-api/lib/gitpod/v1/workspace_pb";
41+
import { UserEnvironmentVariable } from "@gitpod/public-api/lib/gitpod/v1/envvar_pb";
4142
import { ContextURL } from "./context-url";
4243
import { ApplicationError, ErrorCode, ErrorCodes } from "./messaging/error";
4344
import {
@@ -50,6 +51,7 @@ import {
5051
WithPrebuild,
5152
WorkspaceContext,
5253
WorkspaceInfo,
54+
UserEnvVarValue,
5355
} from "./protocol";
5456
import {
5557
OrgMemberInfo,
@@ -104,7 +106,7 @@ export class PublicAPIConverter {
104106
status.admission = this.toAdmission(arg.workspace.shareable);
105107
status.gitStatus = this.toGitStatus(arg.workspace);
106108
workspace.status = status;
107-
workspace.additionalEnvironmentVariables = this.toEnvironmentVariables(arg.workspace.context);
109+
workspace.additionalEnvironmentVariables = this.toWorkspaceEnvironmentVariables(arg.workspace.context);
108110

109111
if (arg.latestInstance) {
110112
return this.toWorkspace(arg.latestInstance, workspace);
@@ -221,17 +223,26 @@ export class PublicAPIConverter {
221223
return new ApplicationError(code, reason.message, new TrustedValue(data));
222224
}
223225

224-
toEnvironmentVariables(context: WorkspaceContext): WorkspaceEnvironmentVariable[] {
226+
toWorkspaceEnvironmentVariables(context: WorkspaceContext): WorkspaceEnvironmentVariable[] {
225227
if (WithEnvvarsContext.is(context)) {
226-
return context.envvars.map((envvar) => this.toEnvironmentVariable(envvar));
228+
return context.envvars.map((envvar) => this.toWorkspaceEnvironmentVariable(envvar));
227229
}
228230
return [];
229231
}
230232

231-
toEnvironmentVariable(envVar: EnvVarWithValue): WorkspaceEnvironmentVariable {
233+
toWorkspaceEnvironmentVariable(envVar: EnvVarWithValue): WorkspaceEnvironmentVariable {
232234
const result = new WorkspaceEnvironmentVariable();
233235
result.name = envVar.name;
234-
envVar.value = envVar.value;
236+
result.value = envVar.value;
237+
return result;
238+
}
239+
240+
toUserEnvironmentVariable(envVar: UserEnvVarValue): UserEnvironmentVariable {
241+
const result = new UserEnvironmentVariable();
242+
result.id = envVar.id || "";
243+
result.name = envVar.name;
244+
result.value = envVar.value;
245+
result.repositoryPattern = envVar.repositoryPattern;
235246
return result;
236247
}
237248

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
syntax = "proto3";
2+
3+
package gitpod.v1;
4+
5+
option go_package = "github.com/gitpod-io/gitpod/components/public-api/go/v1";
6+
7+
service EnvironmentVariableService {
8+
// ListEnvironmentVariables returns all environment variables for the
9+
// authenticated user.
10+
//
11+
// +return NOT_FOUND User does not have access to a workspace with the given
12+
// ID +return NOT_FOUND Workspace does not exist
13+
rpc ListEnvironmentVariables(ListEnvironmentVariablesRequest)
14+
returns (ListEnvironmentVariablesResponse) {}
15+
16+
// UpdateEnvironmentVariable updates an environment variable for the
17+
// authenticated user.
18+
//
19+
// workspace_id +return NOT_FOUND Workspace does not exist
20+
rpc UpdateEnvironmentVariable(UpdateEnvironmentVariableRequest)
21+
returns (UpdateEnvironmentVariableResponse) {}
22+
23+
// DeleteEnvironmentVariable deletes an environment variable for the
24+
// authenticated user.
25+
//
26+
// workspace_id +return NOT_FOUND Workspace does not exist
27+
rpc DeleteEnvironmentVariable(DeleteEnvironmentVariableRequest)
28+
returns (DeleteEnvironmentVariableResponse) {}
29+
}
30+
31+
message UserEnvironmentVariable {
32+
string id = 1;
33+
string name = 2;
34+
string value = 3;
35+
string repository_pattern = 4;
36+
}
37+
38+
message ListEnvironmentVariablesRequest { optional string workspace_id = 1; }
39+
40+
message ListEnvironmentVariablesResponse {
41+
repeated UserEnvironmentVariable environment_variables = 1;
42+
}
43+
44+
message UpdateEnvironmentVariableRequest {
45+
optional string envvar_name = 1;
46+
optional string envvar_value = 2;
47+
optional string envvar_repository_pattern = 3;
48+
}
49+
50+
message UpdateEnvironmentVariableResponse {
51+
UserEnvironmentVariable environment_variable = 1;
52+
}
53+
54+
message DeleteEnvironmentVariableRequest {
55+
string envvar_name = 1;
56+
string envvar_repository_pattern = 2;
57+
}
58+
59+
message DeleteEnvironmentVariableResponse {}

0 commit comments

Comments
 (0)