Skip to content

Commit f64d818

Browse files
csweichelJanKoehnlein
authored andcommitted
Add region admission preference
1 parent 92a9fd5 commit f64d818

File tree

15 files changed

+496
-42
lines changed

15 files changed

+496
-42
lines changed

components/gitpod-protocol/src/gitpod-service.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import {
99
WhitelistedRepository, WorkspaceImageBuild, AuthProviderInfo, CreateWorkspaceMode,
1010
Token, UserEnvVarValue, ResolvePluginsParams, PreparePluginUploadParams, Terms,
1111
ResolvedPlugins, Configuration, InstallPluginsParams, UninstallPluginParams, UserInfo, GitpodTokenType,
12-
GitpodToken, AuthProviderEntry, GuessGitTokenScopesParams, GuessedGitTokenScopes, ProjectEnvVar
12+
GitpodToken, AuthProviderEntry, GuessGitTokenScopesParams, GuessedGitTokenScopes, ProjectEnvVar, WorkspaceClusterPreference
1313
} from './protocol';
1414
import {
1515
Team, TeamMemberInfo,
@@ -239,6 +239,9 @@ export interface GitpodServer extends JsonRpcServer<GitpodClient>, AdminServer,
239239
trackEvent(event: RemoteTrackMessage): Promise<void>;
240240
trackLocation(event: RemotePageMessage): Promise<void>;
241241
identifyUser(event: RemoteIdentifyMessage): Promise<void>;
242+
243+
listWorkspaceClusterRTTEndpoints(): Promise<{ endpoint: string; region: string }[]>;
244+
setWorkspaceClusterPreferences(pref: WorkspaceClusterPreference): Promise<void>;
242245
}
243246

244247
export interface CreateProjectParams {

components/gitpod-protocol/src/protocol.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,9 @@ export interface AdditionalUserData {
107107

108108
// Git clone URL pointing to the user's dotfile repo
109109
dotfileRepo?: string;
110+
111+
// cluster preferences collect data useful for workspace cluster selection
112+
clusterPreferences?: WorkspaceClusterPreference;
110113
}
111114

112115
export interface EmailNotificationSettings {
@@ -1230,3 +1233,7 @@ export interface Terms {
12301233
readonly content: string;
12311234
readonly formElements?: object;
12321235
}
1236+
1237+
export interface WorkspaceClusterPreference {
1238+
region?: string;
1239+
}

components/gitpod-protocol/src/workspace-cluster.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,9 +60,13 @@ export type AdmissionConstraintFeaturePreview = { type: "has-feature-preview" };
6060
export type AdmissionConstraintHasRole = { type: "has-permission", permission: PermissionName };
6161
export type AdmissionConstraintHasUserLevel = { type: "has-user-level", level: string };
6262

63-
export type AdmissionPreference = AdmissionPreferenceUserLevel;
63+
export type AdmissionPreference = AdmissionPreferenceUserLevel | AdmissionPreferenceRegion;
6464
export type AdmissionPreferenceUserLevel = { type: 'user-level', level: string };
65+
export type AdmissionPreferenceRegion = { type: 'region', rttEndpoint: string, name: string };
6566

67+
export function isAdmissionPreferenceRegion(arg: any): arg is AdmissionPreferenceRegion {
68+
return "type" in arg && arg.type === "region" && "rttEndpoint" in arg && "region" in arg;
69+
}
6670

6771
export const WorkspaceClusterDB = Symbol("WorkspaceClusterDB");
6872
export interface WorkspaceClusterDB {

components/server/src/auth/rate-limiter.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,9 @@ function getConfig(config: RateLimiterConfig): RateLimiterConfig {
176176
"trackLocation": { group: "default", points: 1},
177177
"identifyUser": { group: "default", points: 1},
178178
"getIDEOptions": { group: "default", points: 1 },
179+
180+
"listWorkspaceClusterRTTEndpoints": { group: "default", points: 1 },
181+
"setWorkspaceClusterPreferences": { group: "default", points: 1 },
179182
};
180183

181184
return {

components/server/src/workspace/gitpod-server-impl.ts

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
import { DownloadUrlRequest, DownloadUrlResponse, UploadUrlRequest, UploadUrlResponse } from '@gitpod/content-service/lib/blobs_pb';
88
import { AppInstallationDB, UserDB, UserMessageViewsDB, WorkspaceDB, DBWithTracing, TracedWorkspaceDB, DBGitpodToken, DBUser, UserStorageResourcesDB, TeamDB } from '@gitpod/gitpod-db/lib';
9-
import { AuthProviderEntry, AuthProviderInfo, CommitContext, Configuration, CreateWorkspaceMode, DisposableCollection, GetWorkspaceTimeoutResult, GitpodClient as GitpodApiClient, GitpodServer, GitpodToken, GitpodTokenType, InstallPluginsParams, PermissionName, PortVisibility, PrebuiltWorkspace, PrebuiltWorkspaceContext, PreparePluginUploadParams, ResolvedPlugins, ResolvePluginsParams, SetWorkspaceTimeoutResult, StartPrebuildContext, StartWorkspaceResult, Terms, Token, UninstallPluginParams, User, UserEnvVar, UserEnvVarValue, UserInfo, WhitelistedRepository, Workspace, WorkspaceContext, WorkspaceCreationResult, WorkspaceImageBuild, WorkspaceInfo, WorkspaceInstance, WorkspaceInstancePort, WorkspaceInstanceUser, WorkspaceTimeoutDuration, GuessGitTokenScopesParams, GuessedGitTokenScopes, Team, TeamMemberInfo, TeamMembershipInvite, CreateProjectParams, Project, ProviderRepository, TeamMemberRole, WithDefaultConfig, FindPrebuildsParams, PrebuildWithStatus, StartPrebuildResult, ClientHeaderFields } from '@gitpod/gitpod-protocol';
9+
import { AuthProviderEntry, AuthProviderInfo, CommitContext, Configuration, CreateWorkspaceMode, DisposableCollection, GetWorkspaceTimeoutResult, GitpodClient as GitpodApiClient, GitpodServer, GitpodToken, GitpodTokenType, InstallPluginsParams, PermissionName, PortVisibility, PrebuiltWorkspace, PrebuiltWorkspaceContext, PreparePluginUploadParams, ResolvedPlugins, ResolvePluginsParams, SetWorkspaceTimeoutResult, StartPrebuildContext, StartWorkspaceResult, Terms, Token, UninstallPluginParams, User, UserEnvVar, UserEnvVarValue, UserInfo, WhitelistedRepository, Workspace, WorkspaceContext, WorkspaceCreationResult, WorkspaceImageBuild, WorkspaceInfo, WorkspaceInstance, WorkspaceInstancePort, WorkspaceInstanceUser, WorkspaceTimeoutDuration, GuessGitTokenScopesParams, GuessedGitTokenScopes, Team, TeamMemberInfo, TeamMembershipInvite, CreateProjectParams, Project, ProviderRepository, TeamMemberRole, WithDefaultConfig, FindPrebuildsParams, PrebuildWithStatus, StartPrebuildResult, ClientHeaderFields, WorkspaceClusterPreference } from '@gitpod/gitpod-protocol';
1010
import { AccountStatement } from "@gitpod/gitpod-protocol/lib/accounting-protocol";
1111
import { AdminBlockUserRequest, AdminGetListRequest, AdminGetListResult, AdminGetWorkspacesRequest, AdminModifyPermanentWorkspaceFeatureFlagRequest, AdminModifyRoleOrPermissionRequest, WorkspaceAndInstance } from '@gitpod/gitpod-protocol/lib/admin-protocol';
1212
import { GetLicenseInfoResult, LicenseFeature, LicenseValidationResult } from '@gitpod/gitpod-protocol/lib/license-protocol';
@@ -57,6 +57,7 @@ import { PartialProject } from '@gitpod/gitpod-protocol/src/teams-projects-proto
5757
import { ClientMetadata } from '../websocket/websocket-connection-manager';
5858
import { ConfigurationService } from '../config/configuration-service';
5959
import { ProjectEnvVar } from '@gitpod/gitpod-protocol/src/protocol';
60+
import { AdmissionPreferenceRegion, WorkspaceClusterDB } from '@gitpod/gitpod-protocol/lib/workspace-cluster';
6061

6162
// shortcut
6263
export const traceWI = (ctx: TraceContext, wi: Omit<LogContext, "userId">) => TraceContext.setOWI(ctx, wi); // userId is already taken care of in WebsocketConnectionManager
@@ -114,6 +115,8 @@ export class GitpodServerImpl implements GitpodServerWithTracing, Disposable {
114115

115116
@inject(IDEConfigService) protected readonly ideConfigService: IDEConfigService;
116117

118+
@inject(WorkspaceClusterDB) protected readonly workspaceClusterDB: WorkspaceClusterDB;
119+
117120
/** Id the uniquely identifies this server instance */
118121
public readonly uuid: string = uuidv4();
119122
public readonly clientMetadata: ClientMetadata;
@@ -2203,6 +2206,34 @@ export class GitpodServerImpl implements GitpodServerWithTracing, Disposable {
22032206
return ideConfig.ideOptions;
22042207
}
22052208

2209+
async listWorkspaceClusterRTTEndpoints(ctx: TraceContext): Promise<{ region: string; endpoint: string; }[]> {
2210+
const candidates = await this.workspaceClusterDB.findFiltered({state: 'available'});
2211+
const allEndpoints = candidates.flatMap(c => (c.admissionPreferences || []).filter(ap => ap.type === 'region')).map(ap => {
2212+
const rap = ap as AdmissionPreferenceRegion;
2213+
return {
2214+
region: rap.name,
2215+
endpoint: rap.rttEndpoint,
2216+
};
2217+
});
2218+
2219+
return [...new Set(allEndpoints)];
2220+
}
2221+
2222+
async setWorkspaceClusterPreferences(ctx: TraceContext, pref: WorkspaceClusterPreference): Promise<void> {
2223+
const user = this.checkUser("setWorkspaceClusterPreferences");
2224+
2225+
const data = user.additionalData || {};
2226+
const clusterPref = data.clusterPreferences || {};
2227+
2228+
// don't just dump `pref` in here, we have no idea what it contains.
2229+
clusterPref.region = pref.region;
2230+
2231+
data.clusterPreferences = clusterPref;
2232+
user.additionalData = data;
2233+
2234+
await this.userDB.updateUserPartial(user);
2235+
}
2236+
22062237
//#region gitpod.io concerns
22072238
//
22082239
async adminGetAccountStatement(ctx: TraceContext, userId: string): Promise<AccountStatement> {

components/ws-manager-api/typescript/src/client-provider.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -199,6 +199,8 @@ function admissionPreferencesFilter(user: ExtendedUser): (c: WorkspaceClusterWoT
199199
switch (pref.type) {
200200
case "user-level":
201201
return pref.level === user.level;
202+
case "region":
203+
return pref.name === user.additionalData?.clusterPreferences?.region;
202204
default:
203205
return false;
204206
}

components/ws-manager-bridge-api/cluster-service.proto

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,8 +52,14 @@ message AdmissionConstraint {
5252
}
5353

5454
message AdmissionPreference {
55+
message Region {
56+
string name = 1;
57+
string rtt_endpoint = 2;
58+
}
59+
5560
oneof preference {
5661
string user_level = 1;
62+
Region region = 2;
5763
}
5864
}
5965

0 commit comments

Comments
 (0)