From 8ba9febfd1ca7e39f9774110e909a4f400475463 Mon Sep 17 00:00:00 2001 From: Gero Posmyk-Leinemann Date: Thu, 8 May 2025 09:44:03 +0000 Subject: [PATCH 01/12] [dashboard] Initial infra rollout page, incl. list running workspaces --- components/dashboard/src/app/AppRoutes.tsx | 2 + .../src/menu/OrganizationSelector.tsx | 9 ++ .../dashboard/src/org-admin/AdminPage.tsx | 62 +++++++++ .../src/org-admin/RunningWorkspacesCard.tsx | 121 ++++++++++++++++++ 4 files changed, 194 insertions(+) create mode 100644 components/dashboard/src/org-admin/AdminPage.tsx create mode 100644 components/dashboard/src/org-admin/RunningWorkspacesCard.tsx diff --git a/components/dashboard/src/app/AppRoutes.tsx b/components/dashboard/src/app/AppRoutes.tsx index 135e39b023ef78..26b49f750e0f8f 100644 --- a/components/dashboard/src/app/AppRoutes.tsx +++ b/components/dashboard/src/app/AppRoutes.tsx @@ -79,6 +79,7 @@ const ConfigurationDetailPage = React.lazy( ); const PrebuildListPage = React.lazy(() => import(/* webpackPrefetch: true */ "../prebuilds/list/PrebuildListPage")); +const AdminPage = React.lazy(() => import(/* webpackPrefetch: true */ "../org-admin/AdminPage")); export const AppRoutes = () => { const hash = getURLHash(); @@ -205,6 +206,7 @@ export const AppRoutes = () => { {/* TODO: migrate other org settings pages underneath /settings prefix so we can utilize nested routes */} + diff --git a/components/dashboard/src/menu/OrganizationSelector.tsx b/components/dashboard/src/menu/OrganizationSelector.tsx index 362f5bbdcc8c33..c16e7ce6204284 100644 --- a/components/dashboard/src/menu/OrganizationSelector.tsx +++ b/components/dashboard/src/menu/OrganizationSelector.tsx @@ -98,6 +98,15 @@ export default function OrganizationSelector() { } // Show billing if user is an owner of current org if (isOwner) { + // Add Admin link for owners + linkEntries.push({ + title: "Admin", + customContent: Admin, + active: false, + separator: false, + link: "/org-admin", + }); + if (billingMode?.mode === "usage-based") { linkEntries.push({ title: "Billing", diff --git a/components/dashboard/src/org-admin/AdminPage.tsx b/components/dashboard/src/org-admin/AdminPage.tsx new file mode 100644 index 00000000000000..a270c1cf01d38c --- /dev/null +++ b/components/dashboard/src/org-admin/AdminPage.tsx @@ -0,0 +1,62 @@ +/** + * Copyright (c) 2025 Gitpod GmbH. All rights reserved. + * Licensed under the GNU Affero General Public License (AGPL). + * See License.AGPL.txt in the project root for license information. + */ + +import React, { useEffect } from "react"; +import { useHistory } from "react-router-dom"; +import { useUserLoader } from "../hooks/use-user-loader"; +import { useCurrentOrg } from "../data/organizations/orgs-query"; +import { useIsOwner } from "../data/organizations/members-query"; +import Header from "../components/Header"; +import { SpinnerLoader } from "../components/Loader"; +import { RunningWorkspacesCard } from "./RunningWorkspacesCard"; + +const AdminPage: React.FC = () => { + const history = useHistory(); + const { loading: userLoading } = useUserLoader(); + const { data: currentOrg, isLoading: orgLoading } = useCurrentOrg(); + const isOwner = useIsOwner(); + + useEffect(() => { + if (userLoading || orgLoading) { + return; + } + if (!isOwner) { + history.replace("/workspaces"); + } + }, [isOwner, userLoading, orgLoading, history, currentOrg?.id]); + + return ( +
+
+
+

Infrastructure Rollout

+ + {userLoading || + orgLoading || + (!isOwner && ( +
+ +
+ ))} + + {!orgLoading && !currentOrg && ( +
+ Could not load organization details. Please ensure you are part of an organization. +
+ )} + + {currentOrg && } + + {/* Other admin cards/sections will go here in the future */} +
+
+ ); +}; + +export default AdminPage; diff --git a/components/dashboard/src/org-admin/RunningWorkspacesCard.tsx b/components/dashboard/src/org-admin/RunningWorkspacesCard.tsx new file mode 100644 index 00000000000000..f04f5be0c7e168 --- /dev/null +++ b/components/dashboard/src/org-admin/RunningWorkspacesCard.tsx @@ -0,0 +1,121 @@ +/** + * Copyright (c) Gitpod GmbH. All rights reserved. + * Licensed under the GNU Affero General Public License (AGPL). + * See License.AGPL.txt in the project root for license information. + */ + +import { FC, useEffect, useMemo } from "react"; +import dayjs from "dayjs"; +import { WorkspaceSession, WorkspacePhase_Phase } from "@gitpod/public-api/lib/gitpod/v1/workspace_pb"; +import { useWorkspaceSessions } from "../data/insights/list-workspace-sessions-query"; +import { Item, ItemField, ItemsList } from "../components/ItemsList"; +import Alert from "../components/Alert"; +import Spinner from "../icons/Spinner.svg"; +import { toRemoteURL } from "../projects/render-utils"; +import { displayTime } from "../usage/UsageEntry"; +import { Timestamp } from "@bufbuild/protobuf"; +import { WorkspaceStatusIndicator } from "../workspaces/WorkspaceStatusIndicator"; + +interface RunningWorkspacesCardProps {} + +const isWorkspaceNotStopped = (session: WorkspaceSession): boolean => { + return session.workspace?.status?.phase?.name !== WorkspacePhase_Phase.STOPPED; +}; + +export const RunningWorkspacesCard: FC = () => { + const lookbackHours = 48; + + const { data, fetchNextPage, hasNextPage, isLoading, isError, error, isFetchingNextPage } = useWorkspaceSessions({ + from: Timestamp.fromDate(dayjs().subtract(lookbackHours, "hours").startOf("day").toDate()), + }); + + useEffect(() => { + if (hasNextPage && !isFetchingNextPage) { + fetchNextPage(); + } + }, [hasNextPage, isFetchingNextPage, fetchNextPage]); + + const runningWorkspaces = useMemo(() => { + if (!data?.pages) { + return []; + } + const allSessions = data.pages.flatMap((page) => page); + return allSessions.filter(isWorkspaceNotStopped); + }, [data]); + + if (isLoading) { + return ( +
+ Loading Spinner + Loading running workspaces... +
+ ); + } + + if (isError && error) { + return ( + +

Error loading running workspaces:

+
{error instanceof Error ? error.message : String(error)}
+
+ ); + } + + return ( +
+

+ Currently Running Workspaces ({runningWorkspaces.length}) +

+ {runningWorkspaces.length === 0 ? ( +

No workspaces are currently running.

+ ) : ( + + + Status + Workspace ID + User + Project + Started + + {runningWorkspaces.map((session) => { + const workspace = session.workspace; + const owner = session.owner; + const context = session.context; + const status = workspace?.status; + + const startedTimeString = session.startedTime + ? displayTime(session.startedTime.toDate().getTime()) + : "-"; + const projectContextURL = + context?.repository?.cloneUrl || workspace?.metadata?.originalContextUrl; + + return ( + + + + + + {workspace?.id || "-"} + + + {owner?.name || "-"} + + + + {projectContextURL ? toRemoteURL(projectContextURL) : "-"} + + + + {startedTimeString} + + + ); + })} + + )} +
+ ); +}; From ccdca908008e11b4c15663e29c6940b66650b8a4 Mon Sep 17 00:00:00 2001 From: Gero Posmyk-Leinemann Date: Thu, 8 May 2025 13:07:52 +0000 Subject: [PATCH 02/12] [server, db, dashboard] Allow org-owner to stop workspace on all workspaces in the organization Also, fix maintenanceMode update --- components/dashboard/src/AppNotifications.tsx | 40 +- .../src/components/MaintenanceModeBanner.tsx | 26 + .../src/data/maintenance-mode-query.ts | 64 + .../dashboard/src/org-admin/AdminPage.tsx | 10 +- .../src/org-admin/MaintenanceModeCard.tsx | 50 + .../src/org-admin/RunningWorkspacesCard.tsx | 96 +- .../service/json-rpc-organization-client.ts | 32 + components/gitpod-db/src/team-db.ts | 2 +- .../gitpod-db/src/typeorm/entity/db-team.ts | 3 + .../1715259000000-AddMaintenanceModeToTeam.ts | 17 + .../gitpod-db/src/typeorm/team-db-impl.ts | 28 +- .../gitpod-protocol/src/gitpod-service.ts | 2 +- .../src/teams-projects-protocol.ts | 1 + .../public-api/gitpod/v1/organization.proto | 29 + .../public-api/go/v1/organization.pb.go | 615 +++-- .../public-api/go/v1/organization_grpc.pb.go | 76 + .../go/v1/v1connect/organization.connect.go | 50 + .../v1connect/organization.proxy.connect.go | 20 + .../publicapi/v1/OrganizationOuterClass.java | 2254 ++++++++++++++++- .../publicapi/v1/OrganizationServiceClient.kt | 36 + .../v1/OrganizationServiceClientInterface.kt | 16 + .../src/gitpod/v1/organization_connect.ts | 24 +- .../src/gitpod/v1/organization_pb.ts | 164 ++ .../src/api/organization-service-api.ts | 46 +- .../server/src/authorization/definitions.ts | 1 + .../server/src/orgs/organization-service.ts | 52 +- components/server/src/prometheus-metrics.ts | 1 + .../src/workspace/gitpod-server-impl.ts | 8 +- .../server/src/workspace/workspace-starter.ts | 30 + components/spicedb/schema/schema.yaml | 5 +- 30 files changed, 3530 insertions(+), 268 deletions(-) create mode 100644 components/dashboard/src/components/MaintenanceModeBanner.tsx create mode 100644 components/dashboard/src/data/maintenance-mode-query.ts create mode 100644 components/dashboard/src/org-admin/MaintenanceModeCard.tsx create mode 100644 components/gitpod-db/src/typeorm/migration/1715259000000-AddMaintenanceModeToTeam.ts diff --git a/components/dashboard/src/AppNotifications.tsx b/components/dashboard/src/AppNotifications.tsx index f0a09d6a8d1be2..f98a0a19867954 100644 --- a/components/dashboard/src/AppNotifications.tsx +++ b/components/dashboard/src/AppNotifications.tsx @@ -18,6 +18,7 @@ import { AttributionId } from "@gitpod/gitpod-protocol/lib/attribution"; import { getGitpodService } from "./service/service"; import { useOrgBillingMode } from "./data/billing-mode/org-billing-mode-query"; import { Organization } from "@gitpod/public-api/lib/gitpod/v1/organization_pb"; +import { MaintenanceModeBanner } from "./components/MaintenanceModeBanner"; const KEY_APP_DISMISSED_NOTIFICATIONS = "gitpod-app-notifications-dismissed"; const PRIVACY_POLICY_LAST_UPDATED = "2024-12-03"; @@ -208,29 +209,28 @@ export function AppNotifications() { setTopNotification(undefined); }, [topNotification, setTopNotification]); - if (!topNotification) { - return <>; - } - return (
- { - if (!topNotification.preventDismiss) { - dismissNotification(); - } else { - if (topNotification.onClose) { - topNotification.onClose(); + + {topNotification && ( + { + if (!topNotification.preventDismiss) { + dismissNotification(); + } else { + if (topNotification.onClose) { + topNotification.onClose(); + } } - } - }} - showIcon={true} - className="flex rounded mb-2 w-full" - > - {topNotification.message} - + }} + showIcon={true} + className="flex rounded mb-2 w-full" + > + {topNotification.message} + + )}
); } diff --git a/components/dashboard/src/components/MaintenanceModeBanner.tsx b/components/dashboard/src/components/MaintenanceModeBanner.tsx new file mode 100644 index 00000000000000..abcfb92c0a1240 --- /dev/null +++ b/components/dashboard/src/components/MaintenanceModeBanner.tsx @@ -0,0 +1,26 @@ +/** + * Copyright (c) 2025 Gitpod GmbH. All rights reserved. + * Licensed under the GNU Affero General Public License (AGPL). + * See License.AGPL.txt in the project root for license information. + */ + +import { FC } from "react"; +import Alert from "./Alert"; +import { useMaintenanceMode } from "../data/maintenance-mode-query"; + +export const MaintenanceModeBanner: FC = () => { + const { isMaintenanceMode } = useMaintenanceMode(); + + if (!isMaintenanceMode) { + return null; + } + + return ( + +
+ System is in maintenance mode. + Starting new workspaces is currently disabled. +
+
+ ); +}; diff --git a/components/dashboard/src/data/maintenance-mode-query.ts b/components/dashboard/src/data/maintenance-mode-query.ts new file mode 100644 index 00000000000000..a63812105a482f --- /dev/null +++ b/components/dashboard/src/data/maintenance-mode-query.ts @@ -0,0 +1,64 @@ +/** + * Copyright (c) 2025 Gitpod GmbH. All rights reserved. + * Licensed under the GNU Affero General Public License (AGPL). + * See License.AGPL.txt in the project root for license information. + */ + +import { useQuery, useQueryClient } from "@tanstack/react-query"; +import { useCurrentOrg } from "./organizations/orgs-query"; +import { organizationClient } from "../service/public-api"; + +export const maintenanceModeQueryKey = (orgId: string) => ["maintenance-mode", orgId]; + +export const useMaintenanceMode = () => { + const { data: org } = useCurrentOrg(); + const queryClient = useQueryClient(); + + const { data: isMaintenanceMode = false, isLoading } = useQuery( + maintenanceModeQueryKey(org?.id || ""), + async () => { + if (!org?.id) return false; + + try { + const response = await organizationClient.getOrganizationMaintenanceMode({ + organizationId: org.id, + }); + return response.enabled; + } catch (error) { + console.error("Failed to fetch maintenance mode status", error); + return false; + } + }, + { + enabled: !!org?.id, + staleTime: 30 * 1000, // 30 seconds + refetchInterval: 60 * 1000, // 1 minute + }, + ); + + const setMaintenanceMode = async (enabled: boolean) => { + if (!org?.id) return false; + + try { + const response = await organizationClient.setOrganizationMaintenanceMode({ + organizationId: org.id, + enabled, + }); + const result = response.enabled; + + // Update the cache + queryClient.setQueryData(maintenanceModeQueryKey(org.id), result); + + return result; + } catch (error) { + console.error("Failed to set maintenance mode", error); + return false; + } + }; + + return { + isMaintenanceMode, + isLoading, + setMaintenanceMode, + }; +}; diff --git a/components/dashboard/src/org-admin/AdminPage.tsx b/components/dashboard/src/org-admin/AdminPage.tsx index a270c1cf01d38c..772557bf7e77ff 100644 --- a/components/dashboard/src/org-admin/AdminPage.tsx +++ b/components/dashboard/src/org-admin/AdminPage.tsx @@ -12,6 +12,7 @@ import { useIsOwner } from "../data/organizations/members-query"; import Header from "../components/Header"; import { SpinnerLoader } from "../components/Loader"; import { RunningWorkspacesCard } from "./RunningWorkspacesCard"; +import { MaintenanceModeCard } from "./MaintenanceModeCard"; const AdminPage: React.FC = () => { const history = useHistory(); @@ -51,9 +52,12 @@ const AdminPage: React.FC = () => { )} - {currentOrg && } - - {/* Other admin cards/sections will go here in the future */} + {currentOrg && ( + <> + + + + )} ); diff --git a/components/dashboard/src/org-admin/MaintenanceModeCard.tsx b/components/dashboard/src/org-admin/MaintenanceModeCard.tsx new file mode 100644 index 00000000000000..62597cd747737e --- /dev/null +++ b/components/dashboard/src/org-admin/MaintenanceModeCard.tsx @@ -0,0 +1,50 @@ +/** + * Copyright (c) 2025 Gitpod GmbH. All rights reserved. + * Licensed under the GNU Affero General Public License (AGPL). + * See License.AGPL.txt in the project root for license information. + */ + +import { FC } from "react"; +import { useToast } from "../components/toasts/Toasts"; +import { Button } from "@podkit/buttons/Button"; +import { useMaintenanceMode } from "../data/maintenance-mode-query"; + +export const MaintenanceModeCard: FC = () => { + const { isMaintenanceMode, isLoading, setMaintenanceMode } = useMaintenanceMode(); + const toast = useToast(); + + const toggleMaintenanceMode = async () => { + try { + const newState = !isMaintenanceMode; + const result = await setMaintenanceMode(newState); + + toast.toast({ + message: `Maintenance mode ${result ? "enabled" : "disabled"}`, + type: "success", + }); + } catch (error) { + console.error("Failed to toggle maintenance mode", error); + toast.toast({ message: "Failed to toggle maintenance mode", type: "error" }); + } + }; + + return ( +
+
+
+

Maintenance Mode

+

+ When enabled, users cannot start new workspaces and a notification is displayed. +

+
+ +
+
+ ); +}; diff --git a/components/dashboard/src/org-admin/RunningWorkspacesCard.tsx b/components/dashboard/src/org-admin/RunningWorkspacesCard.tsx index f04f5be0c7e168..e1572eb666fb3c 100644 --- a/components/dashboard/src/org-admin/RunningWorkspacesCard.tsx +++ b/components/dashboard/src/org-admin/RunningWorkspacesCard.tsx @@ -4,10 +4,15 @@ * See License.AGPL.txt in the project root for license information. */ -import { FC, useEffect, useMemo } from "react"; +import { FC, useEffect, useMemo, useState } from "react"; import dayjs from "dayjs"; import { WorkspaceSession, WorkspacePhase_Phase } from "@gitpod/public-api/lib/gitpod/v1/workspace_pb"; +import { workspaceClient } from "../service/public-api"; import { useWorkspaceSessions } from "../data/insights/list-workspace-sessions-query"; +import { Button } from "@podkit/buttons/Button"; +import ConfirmationModal from "../components/ConfirmationModal"; +import { useToast } from "../components/toasts/Toasts"; +import { useMaintenanceMode } from "../data/maintenance-mode-query"; import { Item, ItemField, ItemsList } from "../components/ItemsList"; import Alert from "../components/Alert"; import Spinner from "../icons/Spinner.svg"; @@ -24,10 +29,15 @@ const isWorkspaceNotStopped = (session: WorkspaceSession): boolean => { export const RunningWorkspacesCard: FC = () => { const lookbackHours = 48; + const [isStopAllModalOpen, setIsStopAllModalOpen] = useState(false); + const [isStoppingAll, setIsStoppingAll] = useState(false); + const toast = useToast(); + const { isMaintenanceMode } = useMaintenanceMode(); - const { data, fetchNextPage, hasNextPage, isLoading, isError, error, isFetchingNextPage } = useWorkspaceSessions({ - from: Timestamp.fromDate(dayjs().subtract(lookbackHours, "hours").startOf("day").toDate()), - }); + const { data, fetchNextPage, hasNextPage, isLoading, isError, error, isFetchingNextPage, refetch } = + useWorkspaceSessions({ + from: Timestamp.fromDate(dayjs().subtract(lookbackHours, "hours").startOf("day").toDate()), + }); useEffect(() => { if (hasNextPage && !isFetchingNextPage) { @@ -43,7 +53,51 @@ export const RunningWorkspacesCard: FC = () => { return allSessions.filter(isWorkspaceNotStopped); }, [data]); - if (isLoading) { + const handleStopAllWorkspaces = async () => { + if (runningWorkspaces.length === 0) { + toast.toast({ type: "error", message: "No running workspaces to stop." }); + setIsStopAllModalOpen(false); + return; + } + + setIsStoppingAll(true); + let successCount = 0; + let errorCount = 0; + + const stopPromises = runningWorkspaces.map(async (session) => { + if (session.workspace?.id) { + try { + await workspaceClient.stopWorkspace({ workspaceId: session.workspace.id }); + successCount++; + } catch (e) { + console.error(`Failed to stop workspace ${session.workspace.id}:`, e); + errorCount++; + } + } + }); + + await Promise.allSettled(stopPromises); + + setIsStoppingAll(false); + setIsStopAllModalOpen(false); + + if (errorCount > 0) { + toast.toast({ + type: "error", + message: `Failed to stop all workspaces`, + description: `Attempted to stop ${runningWorkspaces.length} workspaces. ${successCount} stopped, ${errorCount} failed.`, + }); + } else { + toast.toast({ + type: "success", + message: `Stop command sent`, + description: `Successfully sent stop command for ${successCount} workspaces.`, + }); + } + refetch(); + }; + + if (isLoading && !isStoppingAll) { return (
Loading Spinner @@ -63,10 +117,19 @@ export const RunningWorkspacesCard: FC = () => { return (
-

- Currently Running Workspaces ({runningWorkspaces.length}) -

- {runningWorkspaces.length === 0 ? ( +
+

+ Currently Running Workspaces ({runningWorkspaces.length}) +

+ +
+ {runningWorkspaces.length === 0 && !isLoading ? (

No workspaces are currently running.

) : ( @@ -116,6 +179,21 @@ export const RunningWorkspacesCard: FC = () => { })} )} + setIsStopAllModalOpen(false)} + onConfirm={handleStopAllWorkspaces} + buttonText={isStoppingAll ? "Stopping..." : "Confirm Stop All"} + buttonType="destructive" + buttonDisabled={isStoppingAll} + > +

+ Are you sure you want to stop all {runningWorkspaces.length} currently running workspaces in this + organization? Workspaces will be backed up before stopping. This action cannot be undone for the + stop process itself. +

+
); }; diff --git a/components/dashboard/src/service/json-rpc-organization-client.ts b/components/dashboard/src/service/json-rpc-organization-client.ts index f48c35f6627a25..7b7834ea0ad289 100644 --- a/components/dashboard/src/service/json-rpc-organization-client.ts +++ b/components/dashboard/src/service/json-rpc-organization-client.ts @@ -16,6 +16,8 @@ import { DeleteOrganizationResponse, GetOrganizationInvitationRequest, GetOrganizationInvitationResponse, + GetOrganizationMaintenanceModeRequest, + GetOrganizationMaintenanceModeResponse, GetOrganizationRequest, GetOrganizationResponse, GetOrganizationSettingsRequest, @@ -31,6 +33,8 @@ import { OrganizationSettings, ResetOrganizationInvitationRequest, ResetOrganizationInvitationResponse, + SetOrganizationMaintenanceModeRequest, + SetOrganizationMaintenanceModeResponse, UpdateOrganizationMemberRequest, UpdateOrganizationMemberResponse, UpdateOrganizationRequest, @@ -285,4 +289,32 @@ export class JsonRpcOrganizationClient implements PromiseClient, + options?: CallOptions | undefined, + ): Promise { + if (!request.organizationId) { + throw new ApplicationError(ErrorCodes.BAD_REQUEST, "organizationId is required"); + } + const result = await getGitpodService().server.getTeam(request.organizationId); + return new GetOrganizationMaintenanceModeResponse({ + enabled: result.maintenanceMode, + }); + } + + async setOrganizationMaintenanceMode( + request: PartialMessage, + options?: CallOptions | undefined, + ): Promise { + if (!request.organizationId) { + throw new ApplicationError(ErrorCodes.BAD_REQUEST, "organizationId is required"); + } + const result = await getGitpodService().server.updateTeam(request.organizationId, { + maintenanceMode: request.enabled, + }); + return new SetOrganizationMaintenanceModeResponse({ + enabled: result.maintenanceMode, + }); + } } diff --git a/components/gitpod-db/src/team-db.ts b/components/gitpod-db/src/team-db.ts index 5471d16a955422..ddd7b16e8f3cb9 100644 --- a/components/gitpod-db/src/team-db.ts +++ b/components/gitpod-db/src/team-db.ts @@ -32,7 +32,7 @@ export interface TeamDB extends TransactionalDB { findTeamsByUser(userId: string): Promise; findTeamsByUserAsSoleOwner(userId: string): Promise; createTeam(userId: string, name: string): Promise; - updateTeam(teamId: string, team: Pick): Promise; + updateTeam(teamId: string, team: Partial>): Promise; addMemberToTeam(userId: string, teamId: string): Promise<"added" | "already_member">; setTeamMemberRole(userId: string, teamId: string, role: TeamMemberRole): Promise; removeMemberFromTeam(userId: string, teamId: string): Promise; diff --git a/components/gitpod-db/src/typeorm/entity/db-team.ts b/components/gitpod-db/src/typeorm/entity/db-team.ts index 8b3dc8138f480c..24a6d6c6fe8a71 100644 --- a/components/gitpod-db/src/typeorm/entity/db-team.ts +++ b/components/gitpod-db/src/typeorm/entity/db-team.ts @@ -25,4 +25,7 @@ export class DBTeam implements Team { @Column() markedDeleted?: boolean; + + @Column({ default: false }) + maintenanceMode?: boolean; } diff --git a/components/gitpod-db/src/typeorm/migration/1715259000000-AddMaintenanceModeToTeam.ts b/components/gitpod-db/src/typeorm/migration/1715259000000-AddMaintenanceModeToTeam.ts new file mode 100644 index 00000000000000..01f2de789f08ae --- /dev/null +++ b/components/gitpod-db/src/typeorm/migration/1715259000000-AddMaintenanceModeToTeam.ts @@ -0,0 +1,17 @@ +/** + * Copyright (c) 2025 Gitpod GmbH. All rights reserved. + * Licensed under the GNU Affero General Public License (AGPL). + * See License.AGPL.txt in the project root for license information. + */ + +import { MigrationInterface, QueryRunner } from "typeorm"; + +export class AddMaintenanceModeToTeam1715259000000 implements MigrationInterface { + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query("ALTER TABLE `d_b_team` ADD COLUMN `maintenanceMode` tinyint(1) NOT NULL DEFAULT 0"); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query("ALTER TABLE `d_b_team` DROP COLUMN `maintenanceMode`"); + } +} diff --git a/components/gitpod-db/src/typeorm/team-db-impl.ts b/components/gitpod-db/src/typeorm/team-db-impl.ts index 2b5e5c840af589..c36316c852767e 100644 --- a/components/gitpod-db/src/typeorm/team-db-impl.ts +++ b/components/gitpod-db/src/typeorm/team-db-impl.ts @@ -154,9 +154,10 @@ export class TeamDBImpl extends TransactionalDBImpl implements TeamDB { return soleOwnedTeams; } - public async updateTeam(teamId: string, team: Pick): Promise { + public async updateTeam(teamId: string, team: Pick): Promise { const name = team.name && team.name.trim(); - if (!name) { + const maintenanceModeSet = team.maintenanceMode !== undefined; + if (!name && !maintenanceModeSet) { throw new ApplicationError(ErrorCodes.BAD_REQUEST, "No update provided"); } @@ -169,19 +170,22 @@ export class TeamDBImpl extends TransactionalDBImpl implements TeamDB { throw new ApplicationError(ErrorCodes.NOT_FOUND, "Organization not found"); } - // no changes - if (existingTeam.name === name) { - return existingTeam; + // Update name if provided + if (name) { + if (name.length > 32) { + throw new ApplicationError( + ErrorCodes.INVALID_VALUE, + "The name must be between 1 and 32 characters long", + ); + } + existingTeam.name = name; + existingTeam.slug = await this.createUniqueSlug(teamRepo, name); } - if (name.length > 32) { - throw new ApplicationError( - ErrorCodes.INVALID_VALUE, - "The name must be between 1 and 32 characters long", - ); + // Update maintenance mode if provided + if (maintenanceModeSet) { + existingTeam.maintenanceMode = team.maintenanceMode; } - existingTeam.name = name; - existingTeam.slug = await this.createUniqueSlug(teamRepo, name); return teamRepo.save(existingTeam); }); diff --git a/components/gitpod-protocol/src/gitpod-service.ts b/components/gitpod-protocol/src/gitpod-service.ts index e28848b62a8124..ff4ffc62c298e1 100644 --- a/components/gitpod-protocol/src/gitpod-service.ts +++ b/components/gitpod-protocol/src/gitpod-service.ts @@ -166,7 +166,7 @@ export interface GitpodServer extends JsonRpcServer, AdminServer, // Teams getTeam(teamId: string): Promise; - updateTeam(teamId: string, team: Pick): Promise; + updateTeam(teamId: string, team: Partial>): Promise; getTeams(): Promise; getTeamMembers(teamId: string): Promise; createTeam(name: string): Promise; diff --git a/components/gitpod-protocol/src/teams-projects-protocol.ts b/components/gitpod-protocol/src/teams-projects-protocol.ts index 8933e4c8f73d21..fc2a311e3ee7c3 100644 --- a/components/gitpod-protocol/src/teams-projects-protocol.ts +++ b/components/gitpod-protocol/src/teams-projects-protocol.ts @@ -217,6 +217,7 @@ export interface Organization { slug?: string; creationTime: string; markedDeleted?: boolean; + maintenanceMode?: boolean; } export interface OrganizationSettings { diff --git a/components/public-api/gitpod/v1/organization.proto b/components/public-api/gitpod/v1/organization.proto index fbae0925108c81..e52ec0cd072597 100644 --- a/components/public-api/gitpod/v1/organization.proto +++ b/components/public-api/gitpod/v1/organization.proto @@ -147,6 +147,12 @@ service OrganizationService { // ListOrganizationWorkspaceClasses lists workspace classes of a // Organization. rpc ListOrganizationWorkspaceClasses(ListOrganizationWorkspaceClassesRequest) returns (ListOrganizationWorkspaceClassesResponse) {} + + // GetOrganizationMaintenanceMode retrieves the maintenance mode status for an organization. + rpc GetOrganizationMaintenanceMode(GetOrganizationMaintenanceModeRequest) returns (GetOrganizationMaintenanceModeResponse) {} + + // SetOrganizationMaintenanceMode sets the maintenance mode status for an organization. + rpc SetOrganizationMaintenanceMode(SetOrganizationMaintenanceModeRequest) returns (SetOrganizationMaintenanceModeResponse) {} } message ListOrganizationWorkspaceClassesRequest { @@ -379,3 +385,26 @@ message DeleteOrganizationMemberRequest { } message DeleteOrganizationMemberResponse {} + +message GetOrganizationMaintenanceModeRequest { + // organization_id is the ID of the organization to retrieve the maintenance mode status for. + string organization_id = 1; +} + +message GetOrganizationMaintenanceModeResponse { + // enabled indicates whether maintenance mode is enabled for the organization. + bool enabled = 1; +} + +message SetOrganizationMaintenanceModeRequest { + // organization_id is the ID of the organization to set the maintenance mode status for. + string organization_id = 1; + + // enabled indicates whether maintenance mode should be enabled or disabled. + bool enabled = 2; +} + +message SetOrganizationMaintenanceModeResponse { + // enabled indicates the new maintenance mode status after the update. + bool enabled = 1; +} diff --git a/components/public-api/go/v1/organization.pb.go b/components/public-api/go/v1/organization.pb.go index a4a27f8d84f471..a4c3e5844beee5 100644 --- a/components/public-api/go/v1/organization.pb.go +++ b/components/public-api/go/v1/organization.pb.go @@ -2227,6 +2227,207 @@ func (*DeleteOrganizationMemberResponse) Descriptor() ([]byte, []int) { return file_gitpod_v1_organization_proto_rawDescGZIP(), []int{33} } +type GetOrganizationMaintenanceModeRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // organization_id is the ID of the organization to retrieve the maintenance mode status for. + OrganizationId string `protobuf:"bytes,1,opt,name=organization_id,json=organizationId,proto3" json:"organization_id,omitempty"` +} + +func (x *GetOrganizationMaintenanceModeRequest) Reset() { + *x = GetOrganizationMaintenanceModeRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_gitpod_v1_organization_proto_msgTypes[34] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetOrganizationMaintenanceModeRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetOrganizationMaintenanceModeRequest) ProtoMessage() {} + +func (x *GetOrganizationMaintenanceModeRequest) ProtoReflect() protoreflect.Message { + mi := &file_gitpod_v1_organization_proto_msgTypes[34] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetOrganizationMaintenanceModeRequest.ProtoReflect.Descriptor instead. +func (*GetOrganizationMaintenanceModeRequest) Descriptor() ([]byte, []int) { + return file_gitpod_v1_organization_proto_rawDescGZIP(), []int{34} +} + +func (x *GetOrganizationMaintenanceModeRequest) GetOrganizationId() string { + if x != nil { + return x.OrganizationId + } + return "" +} + +type GetOrganizationMaintenanceModeResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // enabled indicates whether maintenance mode is enabled for the organization. + Enabled bool `protobuf:"varint,1,opt,name=enabled,proto3" json:"enabled,omitempty"` +} + +func (x *GetOrganizationMaintenanceModeResponse) Reset() { + *x = GetOrganizationMaintenanceModeResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_gitpod_v1_organization_proto_msgTypes[35] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetOrganizationMaintenanceModeResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetOrganizationMaintenanceModeResponse) ProtoMessage() {} + +func (x *GetOrganizationMaintenanceModeResponse) ProtoReflect() protoreflect.Message { + mi := &file_gitpod_v1_organization_proto_msgTypes[35] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetOrganizationMaintenanceModeResponse.ProtoReflect.Descriptor instead. +func (*GetOrganizationMaintenanceModeResponse) Descriptor() ([]byte, []int) { + return file_gitpod_v1_organization_proto_rawDescGZIP(), []int{35} +} + +func (x *GetOrganizationMaintenanceModeResponse) GetEnabled() bool { + if x != nil { + return x.Enabled + } + return false +} + +type SetOrganizationMaintenanceModeRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // organization_id is the ID of the organization to set the maintenance mode status for. + OrganizationId string `protobuf:"bytes,1,opt,name=organization_id,json=organizationId,proto3" json:"organization_id,omitempty"` + // enabled indicates whether maintenance mode should be enabled or disabled. + Enabled bool `protobuf:"varint,2,opt,name=enabled,proto3" json:"enabled,omitempty"` +} + +func (x *SetOrganizationMaintenanceModeRequest) Reset() { + *x = SetOrganizationMaintenanceModeRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_gitpod_v1_organization_proto_msgTypes[36] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SetOrganizationMaintenanceModeRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SetOrganizationMaintenanceModeRequest) ProtoMessage() {} + +func (x *SetOrganizationMaintenanceModeRequest) ProtoReflect() protoreflect.Message { + mi := &file_gitpod_v1_organization_proto_msgTypes[36] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SetOrganizationMaintenanceModeRequest.ProtoReflect.Descriptor instead. +func (*SetOrganizationMaintenanceModeRequest) Descriptor() ([]byte, []int) { + return file_gitpod_v1_organization_proto_rawDescGZIP(), []int{36} +} + +func (x *SetOrganizationMaintenanceModeRequest) GetOrganizationId() string { + if x != nil { + return x.OrganizationId + } + return "" +} + +func (x *SetOrganizationMaintenanceModeRequest) GetEnabled() bool { + if x != nil { + return x.Enabled + } + return false +} + +type SetOrganizationMaintenanceModeResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // enabled indicates the new maintenance mode status after the update. + Enabled bool `protobuf:"varint,1,opt,name=enabled,proto3" json:"enabled,omitempty"` +} + +func (x *SetOrganizationMaintenanceModeResponse) Reset() { + *x = SetOrganizationMaintenanceModeResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_gitpod_v1_organization_proto_msgTypes[37] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SetOrganizationMaintenanceModeResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SetOrganizationMaintenanceModeResponse) ProtoMessage() {} + +func (x *SetOrganizationMaintenanceModeResponse) ProtoReflect() protoreflect.Message { + mi := &file_gitpod_v1_organization_proto_msgTypes[37] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SetOrganizationMaintenanceModeResponse.ProtoReflect.Descriptor instead. +func (*SetOrganizationMaintenanceModeResponse) Descriptor() ([]byte, []int) { + return file_gitpod_v1_organization_proto_rawDescGZIP(), []int{37} +} + +func (x *SetOrganizationMaintenanceModeResponse) GetEnabled() bool { + if x != nil { + return x.Enabled + } + return false +} + type OnboardingSettings_WelcomeMessage struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -2247,7 +2448,7 @@ type OnboardingSettings_WelcomeMessage struct { func (x *OnboardingSettings_WelcomeMessage) Reset() { *x = OnboardingSettings_WelcomeMessage{} if protoimpl.UnsafeEnabled { - mi := &file_gitpod_v1_organization_proto_msgTypes[34] + mi := &file_gitpod_v1_organization_proto_msgTypes[38] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2260,7 +2461,7 @@ func (x *OnboardingSettings_WelcomeMessage) String() string { func (*OnboardingSettings_WelcomeMessage) ProtoMessage() {} func (x *OnboardingSettings_WelcomeMessage) ProtoReflect() protoreflect.Message { - mi := &file_gitpod_v1_organization_proto_msgTypes[34] + mi := &file_gitpod_v1_organization_proto_msgTypes[38] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2735,129 +2936,167 @@ var file_gitpod_v1_organization_proto_rawDesc = []byte{ 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x22, 0x22, 0x0a, 0x20, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x2a, 0x94, 0x01, 0x0a, 0x10, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x6f, 0x6c, 0x65, 0x12, 0x21, 0x0a, 0x1d, 0x4f, 0x52, 0x47, 0x41, - 0x4e, 0x49, 0x5a, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x5f, 0x55, 0x4e, - 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x1b, 0x0a, 0x17, 0x4f, - 0x52, 0x47, 0x41, 0x4e, 0x49, 0x5a, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x52, 0x4f, 0x4c, 0x45, - 0x5f, 0x4f, 0x57, 0x4e, 0x45, 0x52, 0x10, 0x01, 0x12, 0x1c, 0x0a, 0x18, 0x4f, 0x52, 0x47, 0x41, - 0x4e, 0x49, 0x5a, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x5f, 0x4d, 0x45, - 0x4d, 0x42, 0x45, 0x52, 0x10, 0x02, 0x12, 0x22, 0x0a, 0x1e, 0x4f, 0x52, 0x47, 0x41, 0x4e, 0x49, - 0x5a, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x5f, 0x43, 0x4f, 0x4c, 0x4c, - 0x41, 0x42, 0x4f, 0x52, 0x41, 0x54, 0x4f, 0x52, 0x10, 0x03, 0x2a, 0x74, 0x0a, 0x16, 0x4f, 0x72, - 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, - 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x27, 0x0a, 0x23, 0x4f, 0x52, 0x47, 0x41, 0x4e, 0x49, 0x5a, 0x41, - 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x50, 0x45, 0x52, 0x4d, 0x49, 0x53, 0x53, 0x49, 0x4f, 0x4e, 0x5f, - 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x31, 0x0a, - 0x2d, 0x4f, 0x52, 0x47, 0x41, 0x4e, 0x49, 0x5a, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x50, 0x45, - 0x52, 0x4d, 0x49, 0x53, 0x53, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x52, 0x54, 0x5f, 0x41, - 0x52, 0x42, 0x49, 0x54, 0x52, 0x41, 0x52, 0x59, 0x5f, 0x52, 0x45, 0x50, 0x4f, 0x53, 0x10, 0x01, - 0x32, 0xbe, 0x0c, 0x0a, 0x13, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x63, 0x0a, 0x12, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x24, - 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, + 0x6e, 0x73, 0x65, 0x22, 0x50, 0x0a, 0x25, 0x47, 0x65, 0x74, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, + 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x69, 0x6e, 0x74, 0x65, 0x6e, 0x61, 0x6e, 0x63, + 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x27, 0x0a, 0x0f, + 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x22, 0x42, 0x0a, 0x26, 0x47, 0x65, 0x74, 0x4f, 0x72, 0x67, 0x61, + 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x69, 0x6e, 0x74, 0x65, 0x6e, 0x61, + 0x6e, 0x63, 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x22, 0x6a, 0x0a, 0x25, 0x53, 0x65, 0x74, + 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x69, 0x6e, + 0x74, 0x65, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6f, 0x72, 0x67, + 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x65, + 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, + 0x61, 0x62, 0x6c, 0x65, 0x64, 0x22, 0x42, 0x0a, 0x26, 0x53, 0x65, 0x74, 0x4f, 0x72, 0x67, 0x61, + 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x69, 0x6e, 0x74, 0x65, 0x6e, 0x61, + 0x6e, 0x63, 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x2a, 0x94, 0x01, 0x0a, 0x10, 0x4f, 0x72, + 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x6f, 0x6c, 0x65, 0x12, 0x21, + 0x0a, 0x1d, 0x4f, 0x52, 0x47, 0x41, 0x4e, 0x49, 0x5a, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x52, + 0x4f, 0x4c, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, + 0x00, 0x12, 0x1b, 0x0a, 0x17, 0x4f, 0x52, 0x47, 0x41, 0x4e, 0x49, 0x5a, 0x41, 0x54, 0x49, 0x4f, + 0x4e, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x5f, 0x4f, 0x57, 0x4e, 0x45, 0x52, 0x10, 0x01, 0x12, 0x1c, + 0x0a, 0x18, 0x4f, 0x52, 0x47, 0x41, 0x4e, 0x49, 0x5a, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x52, + 0x4f, 0x4c, 0x45, 0x5f, 0x4d, 0x45, 0x4d, 0x42, 0x45, 0x52, 0x10, 0x02, 0x12, 0x22, 0x0a, 0x1e, + 0x4f, 0x52, 0x47, 0x41, 0x4e, 0x49, 0x5a, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x52, 0x4f, 0x4c, + 0x45, 0x5f, 0x43, 0x4f, 0x4c, 0x4c, 0x41, 0x42, 0x4f, 0x52, 0x41, 0x54, 0x4f, 0x52, 0x10, 0x03, + 0x2a, 0x74, 0x0a, 0x16, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x27, 0x0a, 0x23, 0x4f, 0x52, + 0x47, 0x41, 0x4e, 0x49, 0x5a, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x50, 0x45, 0x52, 0x4d, 0x49, + 0x53, 0x53, 0x49, 0x4f, 0x4e, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, + 0x44, 0x10, 0x00, 0x12, 0x31, 0x0a, 0x2d, 0x4f, 0x52, 0x47, 0x41, 0x4e, 0x49, 0x5a, 0x41, 0x54, + 0x49, 0x4f, 0x4e, 0x5f, 0x50, 0x45, 0x52, 0x4d, 0x49, 0x53, 0x53, 0x49, 0x4f, 0x4e, 0x5f, 0x53, + 0x54, 0x41, 0x52, 0x54, 0x5f, 0x41, 0x52, 0x42, 0x49, 0x54, 0x52, 0x41, 0x52, 0x59, 0x5f, 0x52, + 0x45, 0x50, 0x4f, 0x53, 0x10, 0x01, 0x32, 0xd2, 0x0e, 0x0a, 0x13, 0x4f, 0x72, 0x67, 0x61, 0x6e, + 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x63, + 0x0a, 0x12, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5a, 0x0a, - 0x0f, 0x47, 0x65, 0x74, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x12, 0x21, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, - 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, - 0x47, 0x65, 0x74, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x63, 0x0a, 0x12, 0x55, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, - 0x24, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, + 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x67, 0x69, 0x74, + 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4f, 0x72, 0x67, + 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x00, 0x12, 0x5a, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, + 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, + 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x67, 0x69, 0x74, 0x70, + 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, + 0x63, 0x0a, 0x12, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x60, - 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x12, 0x23, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, - 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, - 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, - 0x12, 0x63, 0x0a, 0x12, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, - 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, - 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x67, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x67, 0x69, + 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4f, 0x72, + 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x72, 0x67, 0x61, + 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x23, 0x2e, 0x67, 0x69, 0x74, 0x70, + 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, + 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, + 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4f, + 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x63, 0x0a, 0x12, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, - 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x78, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x4f, 0x72, 0x67, 0x61, - 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x12, 0x2b, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x47, + 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x44, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x78, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, - 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x2c, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4f, - 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x76, 0x69, 0x74, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, - 0x5d, 0x0a, 0x10, 0x4a, 0x6f, 0x69, 0x6e, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x12, 0x22, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, - 0x4a, 0x6f, 0x69, 0x6e, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, - 0x2e, 0x76, 0x31, 0x2e, 0x4a, 0x6f, 0x69, 0x6e, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x7e, - 0x0a, 0x1b, 0x52, 0x65, 0x73, 0x65, 0x74, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2d, 0x2e, - 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x65, 0x74, 0x4f, - 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x76, 0x69, 0x74, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x67, - 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x65, 0x74, 0x4f, 0x72, - 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x72, - 0x0a, 0x17, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x12, 0x29, 0x2e, 0x67, 0x69, 0x74, 0x70, - 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, - 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, - 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x00, 0x12, 0x75, 0x0a, 0x18, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4f, 0x72, 0x67, 0x61, - 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x2a, - 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x6d, - 0x62, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x67, 0x69, 0x74, - 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4f, 0x72, 0x67, - 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x75, 0x0a, 0x18, 0x44, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, - 0x65, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x2a, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, - 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x2b, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, - 0x12, 0x72, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x29, 0x2e, 0x67, 0x69, - 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x72, 0x67, 0x61, 0x6e, - 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, - 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x00, 0x12, 0x7b, 0x0a, 0x1a, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4f, 0x72, - 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, - 0x67, 0x73, 0x12, 0x2c, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x55, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x2d, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, - 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x00, 0x12, 0x8d, 0x01, 0x0a, 0x20, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, - 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x43, - 0x6c, 0x61, 0x73, 0x73, 0x65, 0x73, 0x12, 0x32, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, - 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x43, 0x6c, 0x61, 0x73, - 0x73, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x33, 0x2e, 0x67, 0x69, 0x74, + 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2b, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, + 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, + 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x10, 0x4a, 0x6f, 0x69, 0x6e, 0x4f, 0x72, 0x67, + 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x22, 0x2e, 0x67, 0x69, 0x74, 0x70, + 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x4a, 0x6f, 0x69, 0x6e, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, + 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, + 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x4a, 0x6f, 0x69, 0x6e, 0x4f, 0x72, + 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x00, 0x12, 0x7e, 0x0a, 0x1b, 0x52, 0x65, 0x73, 0x65, 0x74, 0x4f, 0x72, 0x67, + 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x2d, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, + 0x52, 0x65, 0x73, 0x65, 0x74, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x52, + 0x65, 0x73, 0x65, 0x74, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x49, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x00, 0x12, 0x72, 0x0a, 0x17, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x72, 0x67, 0x61, + 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x12, + 0x29, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, + 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x6d, 0x62, + 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x72, 0x67, 0x61, 0x6e, - 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x43, 0x6c, 0x61, 0x73, 0x73, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x00, 0x42, 0x51, 0x0a, 0x16, 0x69, 0x6f, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x70, - 0x75, 0x62, 0x6c, 0x69, 0x63, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x5a, 0x37, 0x67, 0x69, 0x74, - 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2d, 0x69, - 0x6f, 0x2f, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, - 0x6e, 0x74, 0x73, 0x2f, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x2d, 0x61, 0x70, 0x69, 0x2f, 0x67, - 0x6f, 0x2f, 0x76, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x75, 0x0a, 0x18, 0x55, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, + 0x6d, 0x62, 0x65, 0x72, 0x12, 0x2a, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, + 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x2b, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, + 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, + 0x75, 0x0a, 0x18, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x2a, 0x2e, 0x67, 0x69, + 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x72, + 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, + 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, + 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x72, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x4f, 0x72, 0x67, + 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, + 0x73, 0x12, 0x29, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, + 0x74, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x74, + 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x67, + 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x72, 0x67, 0x61, + 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x7b, 0x0a, 0x1a, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x2c, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, + 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4f, 0x72, 0x67, 0x61, 0x6e, + 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, + 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x8d, 0x01, 0x0a, 0x20, 0x4c, 0x69, 0x73, 0x74, + 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x65, 0x73, 0x12, 0x32, 0x2e, 0x67, + 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x72, 0x67, + 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x33, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, + 0x74, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x6f, 0x72, + 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x65, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x87, 0x01, 0x0a, 0x1e, 0x47, 0x65, 0x74, 0x4f, + 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x69, 0x6e, 0x74, + 0x65, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x30, 0x2e, 0x67, 0x69, 0x74, + 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, + 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x69, 0x6e, 0x74, 0x65, 0x6e, 0x61, 0x6e, 0x63, + 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x31, 0x2e, 0x67, + 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x72, 0x67, 0x61, + 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x69, 0x6e, 0x74, 0x65, 0x6e, 0x61, + 0x6e, 0x63, 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x00, 0x12, 0x87, 0x01, 0x0a, 0x1e, 0x53, 0x65, 0x74, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x69, 0x6e, 0x74, 0x65, 0x6e, 0x61, 0x6e, 0x63, 0x65, + 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x30, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, + 0x2e, 0x53, 0x65, 0x74, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x4d, 0x61, 0x69, 0x6e, 0x74, 0x65, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x31, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, + 0x76, 0x31, 0x2e, 0x53, 0x65, 0x74, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x4d, 0x61, 0x69, 0x6e, 0x74, 0x65, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x4d, 0x6f, 0x64, + 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x51, 0x0a, 0x16, 0x69, + 0x6f, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x5a, 0x37, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, + 0x6d, 0x2f, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2d, 0x69, 0x6f, 0x2f, 0x67, 0x69, 0x74, 0x70, + 0x6f, 0x64, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x70, 0x75, + 0x62, 0x6c, 0x69, 0x63, 0x2d, 0x61, 0x70, 0x69, 0x2f, 0x67, 0x6f, 0x2f, 0x76, 0x31, 0x62, 0x06, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -2873,7 +3112,7 @@ func file_gitpod_v1_organization_proto_rawDescGZIP() []byte { } var file_gitpod_v1_organization_proto_enumTypes = make([]protoimpl.EnumInfo, 3) -var file_gitpod_v1_organization_proto_msgTypes = make([]protoimpl.MessageInfo, 37) +var file_gitpod_v1_organization_proto_msgTypes = make([]protoimpl.MessageInfo, 41) var file_gitpod_v1_organization_proto_goTypes = []interface{}{ (OrganizationRole)(0), // 0: gitpod.v1.OrganizationRole (OrganizationPermission)(0), // 1: gitpod.v1.OrganizationPermission @@ -2912,32 +3151,36 @@ var file_gitpod_v1_organization_proto_goTypes = []interface{}{ (*UpdateOrganizationMemberResponse)(nil), // 34: gitpod.v1.UpdateOrganizationMemberResponse (*DeleteOrganizationMemberRequest)(nil), // 35: gitpod.v1.DeleteOrganizationMemberRequest (*DeleteOrganizationMemberResponse)(nil), // 36: gitpod.v1.DeleteOrganizationMemberResponse - (*OnboardingSettings_WelcomeMessage)(nil), // 37: gitpod.v1.OnboardingSettings.WelcomeMessage - nil, // 38: gitpod.v1.OrganizationSettings.PinnedEditorVersionsEntry - nil, // 39: gitpod.v1.UpdateOrganizationSettingsRequest.PinnedEditorVersionsEntry - (*timestamppb.Timestamp)(nil), // 40: google.protobuf.Timestamp - (*PaginationRequest)(nil), // 41: gitpod.v1.PaginationRequest - (*PaginationResponse)(nil), // 42: gitpod.v1.PaginationResponse - (*WorkspaceClass)(nil), // 43: gitpod.v1.WorkspaceClass - (*durationpb.Duration)(nil), // 44: google.protobuf.Duration + (*GetOrganizationMaintenanceModeRequest)(nil), // 37: gitpod.v1.GetOrganizationMaintenanceModeRequest + (*GetOrganizationMaintenanceModeResponse)(nil), // 38: gitpod.v1.GetOrganizationMaintenanceModeResponse + (*SetOrganizationMaintenanceModeRequest)(nil), // 39: gitpod.v1.SetOrganizationMaintenanceModeRequest + (*SetOrganizationMaintenanceModeResponse)(nil), // 40: gitpod.v1.SetOrganizationMaintenanceModeResponse + (*OnboardingSettings_WelcomeMessage)(nil), // 41: gitpod.v1.OnboardingSettings.WelcomeMessage + nil, // 42: gitpod.v1.OrganizationSettings.PinnedEditorVersionsEntry + nil, // 43: gitpod.v1.UpdateOrganizationSettingsRequest.PinnedEditorVersionsEntry + (*timestamppb.Timestamp)(nil), // 44: google.protobuf.Timestamp + (*PaginationRequest)(nil), // 45: gitpod.v1.PaginationRequest + (*PaginationResponse)(nil), // 46: gitpod.v1.PaginationResponse + (*WorkspaceClass)(nil), // 47: gitpod.v1.WorkspaceClass + (*durationpb.Duration)(nil), // 48: google.protobuf.Duration } var file_gitpod_v1_organization_proto_depIdxs = []int32{ - 40, // 0: gitpod.v1.Organization.creation_time:type_name -> google.protobuf.Timestamp + 44, // 0: gitpod.v1.Organization.creation_time:type_name -> google.protobuf.Timestamp 0, // 1: gitpod.v1.OrganizationMember.role:type_name -> gitpod.v1.OrganizationRole - 40, // 2: gitpod.v1.OrganizationMember.member_since:type_name -> google.protobuf.Timestamp + 44, // 2: gitpod.v1.OrganizationMember.member_since:type_name -> google.protobuf.Timestamp 0, // 3: gitpod.v1.RoleRestrictionEntry.role:type_name -> gitpod.v1.OrganizationRole 1, // 4: gitpod.v1.RoleRestrictionEntry.permissions:type_name -> gitpod.v1.OrganizationPermission - 37, // 5: gitpod.v1.OnboardingSettings.welcome_message:type_name -> gitpod.v1.OnboardingSettings.WelcomeMessage - 38, // 6: gitpod.v1.OrganizationSettings.pinned_editor_versions:type_name -> gitpod.v1.OrganizationSettings.PinnedEditorVersionsEntry + 41, // 5: gitpod.v1.OnboardingSettings.welcome_message:type_name -> gitpod.v1.OnboardingSettings.WelcomeMessage + 42, // 6: gitpod.v1.OrganizationSettings.pinned_editor_versions:type_name -> gitpod.v1.OrganizationSettings.PinnedEditorVersionsEntry 12, // 7: gitpod.v1.OrganizationSettings.timeout_settings:type_name -> gitpod.v1.TimeoutSettings 5, // 8: gitpod.v1.OrganizationSettings.role_restrictions:type_name -> gitpod.v1.RoleRestrictionEntry 6, // 9: gitpod.v1.OrganizationSettings.onboarding_settings:type_name -> gitpod.v1.OnboardingSettings - 41, // 10: gitpod.v1.ListOrganizationWorkspaceClassesRequest.pagination:type_name -> gitpod.v1.PaginationRequest - 42, // 11: gitpod.v1.ListOrganizationWorkspaceClassesResponse.pagination:type_name -> gitpod.v1.PaginationResponse - 43, // 12: gitpod.v1.ListOrganizationWorkspaceClassesResponse.workspace_classes:type_name -> gitpod.v1.WorkspaceClass + 45, // 10: gitpod.v1.ListOrganizationWorkspaceClassesRequest.pagination:type_name -> gitpod.v1.PaginationRequest + 46, // 11: gitpod.v1.ListOrganizationWorkspaceClassesResponse.pagination:type_name -> gitpod.v1.PaginationResponse + 47, // 12: gitpod.v1.ListOrganizationWorkspaceClassesResponse.workspace_classes:type_name -> gitpod.v1.WorkspaceClass 3, // 13: gitpod.v1.UpdateOrganizationResponse.organization:type_name -> gitpod.v1.Organization - 44, // 14: gitpod.v1.TimeoutSettings.inactivity:type_name -> google.protobuf.Duration - 39, // 15: gitpod.v1.UpdateOrganizationSettingsRequest.pinned_editor_versions:type_name -> gitpod.v1.UpdateOrganizationSettingsRequest.PinnedEditorVersionsEntry + 48, // 14: gitpod.v1.TimeoutSettings.inactivity:type_name -> google.protobuf.Duration + 43, // 15: gitpod.v1.UpdateOrganizationSettingsRequest.pinned_editor_versions:type_name -> gitpod.v1.UpdateOrganizationSettingsRequest.PinnedEditorVersionsEntry 12, // 16: gitpod.v1.UpdateOrganizationSettingsRequest.timeout_settings:type_name -> gitpod.v1.TimeoutSettings 5, // 17: gitpod.v1.UpdateOrganizationSettingsRequest.role_restrictions:type_name -> gitpod.v1.RoleRestrictionEntry 6, // 18: gitpod.v1.UpdateOrganizationSettingsRequest.onboarding_settings:type_name -> gitpod.v1.OnboardingSettings @@ -2945,13 +3188,13 @@ var file_gitpod_v1_organization_proto_depIdxs = []int32{ 7, // 20: gitpod.v1.GetOrganizationSettingsResponse.settings:type_name -> gitpod.v1.OrganizationSettings 3, // 21: gitpod.v1.CreateOrganizationResponse.organization:type_name -> gitpod.v1.Organization 3, // 22: gitpod.v1.GetOrganizationResponse.organization:type_name -> gitpod.v1.Organization - 41, // 23: gitpod.v1.ListOrganizationsRequest.pagination:type_name -> gitpod.v1.PaginationRequest + 45, // 23: gitpod.v1.ListOrganizationsRequest.pagination:type_name -> gitpod.v1.PaginationRequest 2, // 24: gitpod.v1.ListOrganizationsRequest.scope:type_name -> gitpod.v1.ListOrganizationsRequest.Scope 3, // 25: gitpod.v1.ListOrganizationsResponse.organizations:type_name -> gitpod.v1.Organization - 42, // 26: gitpod.v1.ListOrganizationsResponse.pagination:type_name -> gitpod.v1.PaginationResponse - 41, // 27: gitpod.v1.ListOrganizationMembersRequest.pagination:type_name -> gitpod.v1.PaginationRequest + 46, // 26: gitpod.v1.ListOrganizationsResponse.pagination:type_name -> gitpod.v1.PaginationResponse + 45, // 27: gitpod.v1.ListOrganizationMembersRequest.pagination:type_name -> gitpod.v1.PaginationRequest 4, // 28: gitpod.v1.ListOrganizationMembersResponse.members:type_name -> gitpod.v1.OrganizationMember - 42, // 29: gitpod.v1.ListOrganizationMembersResponse.pagination:type_name -> gitpod.v1.PaginationResponse + 46, // 29: gitpod.v1.ListOrganizationMembersResponse.pagination:type_name -> gitpod.v1.PaginationResponse 0, // 30: gitpod.v1.UpdateOrganizationMemberRequest.role:type_name -> gitpod.v1.OrganizationRole 4, // 31: gitpod.v1.UpdateOrganizationMemberResponse.member:type_name -> gitpod.v1.OrganizationMember 17, // 32: gitpod.v1.OrganizationService.CreateOrganization:input_type -> gitpod.v1.CreateOrganizationRequest @@ -2968,22 +3211,26 @@ var file_gitpod_v1_organization_proto_depIdxs = []int32{ 15, // 43: gitpod.v1.OrganizationService.GetOrganizationSettings:input_type -> gitpod.v1.GetOrganizationSettingsRequest 13, // 44: gitpod.v1.OrganizationService.UpdateOrganizationSettings:input_type -> gitpod.v1.UpdateOrganizationSettingsRequest 8, // 45: gitpod.v1.OrganizationService.ListOrganizationWorkspaceClasses:input_type -> gitpod.v1.ListOrganizationWorkspaceClassesRequest - 18, // 46: gitpod.v1.OrganizationService.CreateOrganization:output_type -> gitpod.v1.CreateOrganizationResponse - 20, // 47: gitpod.v1.OrganizationService.GetOrganization:output_type -> gitpod.v1.GetOrganizationResponse - 11, // 48: gitpod.v1.OrganizationService.UpdateOrganization:output_type -> gitpod.v1.UpdateOrganizationResponse - 22, // 49: gitpod.v1.OrganizationService.ListOrganizations:output_type -> gitpod.v1.ListOrganizationsResponse - 24, // 50: gitpod.v1.OrganizationService.DeleteOrganization:output_type -> gitpod.v1.DeleteOrganizationResponse - 26, // 51: gitpod.v1.OrganizationService.GetOrganizationInvitation:output_type -> gitpod.v1.GetOrganizationInvitationResponse - 28, // 52: gitpod.v1.OrganizationService.JoinOrganization:output_type -> gitpod.v1.JoinOrganizationResponse - 30, // 53: gitpod.v1.OrganizationService.ResetOrganizationInvitation:output_type -> gitpod.v1.ResetOrganizationInvitationResponse - 32, // 54: gitpod.v1.OrganizationService.ListOrganizationMembers:output_type -> gitpod.v1.ListOrganizationMembersResponse - 34, // 55: gitpod.v1.OrganizationService.UpdateOrganizationMember:output_type -> gitpod.v1.UpdateOrganizationMemberResponse - 36, // 56: gitpod.v1.OrganizationService.DeleteOrganizationMember:output_type -> gitpod.v1.DeleteOrganizationMemberResponse - 16, // 57: gitpod.v1.OrganizationService.GetOrganizationSettings:output_type -> gitpod.v1.GetOrganizationSettingsResponse - 14, // 58: gitpod.v1.OrganizationService.UpdateOrganizationSettings:output_type -> gitpod.v1.UpdateOrganizationSettingsResponse - 9, // 59: gitpod.v1.OrganizationService.ListOrganizationWorkspaceClasses:output_type -> gitpod.v1.ListOrganizationWorkspaceClassesResponse - 46, // [46:60] is the sub-list for method output_type - 32, // [32:46] is the sub-list for method input_type + 37, // 46: gitpod.v1.OrganizationService.GetOrganizationMaintenanceMode:input_type -> gitpod.v1.GetOrganizationMaintenanceModeRequest + 39, // 47: gitpod.v1.OrganizationService.SetOrganizationMaintenanceMode:input_type -> gitpod.v1.SetOrganizationMaintenanceModeRequest + 18, // 48: gitpod.v1.OrganizationService.CreateOrganization:output_type -> gitpod.v1.CreateOrganizationResponse + 20, // 49: gitpod.v1.OrganizationService.GetOrganization:output_type -> gitpod.v1.GetOrganizationResponse + 11, // 50: gitpod.v1.OrganizationService.UpdateOrganization:output_type -> gitpod.v1.UpdateOrganizationResponse + 22, // 51: gitpod.v1.OrganizationService.ListOrganizations:output_type -> gitpod.v1.ListOrganizationsResponse + 24, // 52: gitpod.v1.OrganizationService.DeleteOrganization:output_type -> gitpod.v1.DeleteOrganizationResponse + 26, // 53: gitpod.v1.OrganizationService.GetOrganizationInvitation:output_type -> gitpod.v1.GetOrganizationInvitationResponse + 28, // 54: gitpod.v1.OrganizationService.JoinOrganization:output_type -> gitpod.v1.JoinOrganizationResponse + 30, // 55: gitpod.v1.OrganizationService.ResetOrganizationInvitation:output_type -> gitpod.v1.ResetOrganizationInvitationResponse + 32, // 56: gitpod.v1.OrganizationService.ListOrganizationMembers:output_type -> gitpod.v1.ListOrganizationMembersResponse + 34, // 57: gitpod.v1.OrganizationService.UpdateOrganizationMember:output_type -> gitpod.v1.UpdateOrganizationMemberResponse + 36, // 58: gitpod.v1.OrganizationService.DeleteOrganizationMember:output_type -> gitpod.v1.DeleteOrganizationMemberResponse + 16, // 59: gitpod.v1.OrganizationService.GetOrganizationSettings:output_type -> gitpod.v1.GetOrganizationSettingsResponse + 14, // 60: gitpod.v1.OrganizationService.UpdateOrganizationSettings:output_type -> gitpod.v1.UpdateOrganizationSettingsResponse + 9, // 61: gitpod.v1.OrganizationService.ListOrganizationWorkspaceClasses:output_type -> gitpod.v1.ListOrganizationWorkspaceClassesResponse + 38, // 62: gitpod.v1.OrganizationService.GetOrganizationMaintenanceMode:output_type -> gitpod.v1.GetOrganizationMaintenanceModeResponse + 40, // 63: gitpod.v1.OrganizationService.SetOrganizationMaintenanceMode:output_type -> gitpod.v1.SetOrganizationMaintenanceModeResponse + 48, // [48:64] is the sub-list for method output_type + 32, // [32:48] is the sub-list for method input_type 32, // [32:32] is the sub-list for extension type_name 32, // [32:32] is the sub-list for extension extendee 0, // [0:32] is the sub-list for field type_name @@ -3406,6 +3653,54 @@ func file_gitpod_v1_organization_proto_init() { } } file_gitpod_v1_organization_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetOrganizationMaintenanceModeRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_gitpod_v1_organization_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetOrganizationMaintenanceModeResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_gitpod_v1_organization_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SetOrganizationMaintenanceModeRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_gitpod_v1_organization_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SetOrganizationMaintenanceModeResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_gitpod_v1_organization_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*OnboardingSettings_WelcomeMessage); i { case 0: return &v.state @@ -3424,14 +3719,14 @@ func file_gitpod_v1_organization_proto_init() { file_gitpod_v1_organization_proto_msgTypes[9].OneofWrappers = []interface{}{} file_gitpod_v1_organization_proto_msgTypes[10].OneofWrappers = []interface{}{} file_gitpod_v1_organization_proto_msgTypes[30].OneofWrappers = []interface{}{} - file_gitpod_v1_organization_proto_msgTypes[34].OneofWrappers = []interface{}{} + file_gitpod_v1_organization_proto_msgTypes[38].OneofWrappers = []interface{}{} type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_gitpod_v1_organization_proto_rawDesc, NumEnums: 3, - NumMessages: 37, + NumMessages: 41, NumExtensions: 0, NumServices: 1, }, diff --git a/components/public-api/go/v1/organization_grpc.pb.go b/components/public-api/go/v1/organization_grpc.pb.go index 6d4dd7c411229e..7f7e1cbc82d7d1 100644 --- a/components/public-api/go/v1/organization_grpc.pb.go +++ b/components/public-api/go/v1/organization_grpc.pb.go @@ -56,6 +56,10 @@ type OrganizationServiceClient interface { // ListOrganizationWorkspaceClasses lists workspace classes of a // Organization. ListOrganizationWorkspaceClasses(ctx context.Context, in *ListOrganizationWorkspaceClassesRequest, opts ...grpc.CallOption) (*ListOrganizationWorkspaceClassesResponse, error) + // GetOrganizationMaintenanceMode retrieves the maintenance mode status for an organization. + GetOrganizationMaintenanceMode(ctx context.Context, in *GetOrganizationMaintenanceModeRequest, opts ...grpc.CallOption) (*GetOrganizationMaintenanceModeResponse, error) + // SetOrganizationMaintenanceMode sets the maintenance mode status for an organization. + SetOrganizationMaintenanceMode(ctx context.Context, in *SetOrganizationMaintenanceModeRequest, opts ...grpc.CallOption) (*SetOrganizationMaintenanceModeResponse, error) } type organizationServiceClient struct { @@ -192,6 +196,24 @@ func (c *organizationServiceClient) ListOrganizationWorkspaceClasses(ctx context return out, nil } +func (c *organizationServiceClient) GetOrganizationMaintenanceMode(ctx context.Context, in *GetOrganizationMaintenanceModeRequest, opts ...grpc.CallOption) (*GetOrganizationMaintenanceModeResponse, error) { + out := new(GetOrganizationMaintenanceModeResponse) + err := c.cc.Invoke(ctx, "/gitpod.v1.OrganizationService/GetOrganizationMaintenanceMode", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *organizationServiceClient) SetOrganizationMaintenanceMode(ctx context.Context, in *SetOrganizationMaintenanceModeRequest, opts ...grpc.CallOption) (*SetOrganizationMaintenanceModeResponse, error) { + out := new(SetOrganizationMaintenanceModeResponse) + err := c.cc.Invoke(ctx, "/gitpod.v1.OrganizationService/SetOrganizationMaintenanceMode", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + // OrganizationServiceServer is the server API for OrganizationService service. // All implementations must embed UnimplementedOrganizationServiceServer // for forward compatibility @@ -226,6 +248,10 @@ type OrganizationServiceServer interface { // ListOrganizationWorkspaceClasses lists workspace classes of a // Organization. ListOrganizationWorkspaceClasses(context.Context, *ListOrganizationWorkspaceClassesRequest) (*ListOrganizationWorkspaceClassesResponse, error) + // GetOrganizationMaintenanceMode retrieves the maintenance mode status for an organization. + GetOrganizationMaintenanceMode(context.Context, *GetOrganizationMaintenanceModeRequest) (*GetOrganizationMaintenanceModeResponse, error) + // SetOrganizationMaintenanceMode sets the maintenance mode status for an organization. + SetOrganizationMaintenanceMode(context.Context, *SetOrganizationMaintenanceModeRequest) (*SetOrganizationMaintenanceModeResponse, error) mustEmbedUnimplementedOrganizationServiceServer() } @@ -275,6 +301,12 @@ func (UnimplementedOrganizationServiceServer) UpdateOrganizationSettings(context func (UnimplementedOrganizationServiceServer) ListOrganizationWorkspaceClasses(context.Context, *ListOrganizationWorkspaceClassesRequest) (*ListOrganizationWorkspaceClassesResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method ListOrganizationWorkspaceClasses not implemented") } +func (UnimplementedOrganizationServiceServer) GetOrganizationMaintenanceMode(context.Context, *GetOrganizationMaintenanceModeRequest) (*GetOrganizationMaintenanceModeResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetOrganizationMaintenanceMode not implemented") +} +func (UnimplementedOrganizationServiceServer) SetOrganizationMaintenanceMode(context.Context, *SetOrganizationMaintenanceModeRequest) (*SetOrganizationMaintenanceModeResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method SetOrganizationMaintenanceMode not implemented") +} func (UnimplementedOrganizationServiceServer) mustEmbedUnimplementedOrganizationServiceServer() {} // UnsafeOrganizationServiceServer may be embedded to opt out of forward compatibility for this service. @@ -540,6 +572,42 @@ func _OrganizationService_ListOrganizationWorkspaceClasses_Handler(srv interface return interceptor(ctx, in, info, handler) } +func _OrganizationService_GetOrganizationMaintenanceMode_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetOrganizationMaintenanceModeRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(OrganizationServiceServer).GetOrganizationMaintenanceMode(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/gitpod.v1.OrganizationService/GetOrganizationMaintenanceMode", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(OrganizationServiceServer).GetOrganizationMaintenanceMode(ctx, req.(*GetOrganizationMaintenanceModeRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _OrganizationService_SetOrganizationMaintenanceMode_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(SetOrganizationMaintenanceModeRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(OrganizationServiceServer).SetOrganizationMaintenanceMode(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/gitpod.v1.OrganizationService/SetOrganizationMaintenanceMode", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(OrganizationServiceServer).SetOrganizationMaintenanceMode(ctx, req.(*SetOrganizationMaintenanceModeRequest)) + } + return interceptor(ctx, in, info, handler) +} + // OrganizationService_ServiceDesc is the grpc.ServiceDesc for OrganizationService service. // It's only intended for direct use with grpc.RegisterService, // and not to be introspected or modified (even as a copy) @@ -603,6 +671,14 @@ var OrganizationService_ServiceDesc = grpc.ServiceDesc{ MethodName: "ListOrganizationWorkspaceClasses", Handler: _OrganizationService_ListOrganizationWorkspaceClasses_Handler, }, + { + MethodName: "GetOrganizationMaintenanceMode", + Handler: _OrganizationService_GetOrganizationMaintenanceMode_Handler, + }, + { + MethodName: "SetOrganizationMaintenanceMode", + Handler: _OrganizationService_SetOrganizationMaintenanceMode_Handler, + }, }, Streams: []grpc.StreamDesc{}, Metadata: "gitpod/v1/organization.proto", diff --git a/components/public-api/go/v1/v1connect/organization.connect.go b/components/public-api/go/v1/v1connect/organization.connect.go index f7ff0e5b4f52e8..8e5163eaeb4b37 100644 --- a/components/public-api/go/v1/v1connect/organization.connect.go +++ b/components/public-api/go/v1/v1connect/organization.connect.go @@ -61,6 +61,10 @@ type OrganizationServiceClient interface { // ListOrganizationWorkspaceClasses lists workspace classes of a // Organization. ListOrganizationWorkspaceClasses(context.Context, *connect_go.Request[v1.ListOrganizationWorkspaceClassesRequest]) (*connect_go.Response[v1.ListOrganizationWorkspaceClassesResponse], error) + // GetOrganizationMaintenanceMode retrieves the maintenance mode status for an organization. + GetOrganizationMaintenanceMode(context.Context, *connect_go.Request[v1.GetOrganizationMaintenanceModeRequest]) (*connect_go.Response[v1.GetOrganizationMaintenanceModeResponse], error) + // SetOrganizationMaintenanceMode sets the maintenance mode status for an organization. + SetOrganizationMaintenanceMode(context.Context, *connect_go.Request[v1.SetOrganizationMaintenanceModeRequest]) (*connect_go.Response[v1.SetOrganizationMaintenanceModeResponse], error) } // NewOrganizationServiceClient constructs a client for the gitpod.v1.OrganizationService service. @@ -143,6 +147,16 @@ func NewOrganizationServiceClient(httpClient connect_go.HTTPClient, baseURL stri baseURL+"/gitpod.v1.OrganizationService/ListOrganizationWorkspaceClasses", opts..., ), + getOrganizationMaintenanceMode: connect_go.NewClient[v1.GetOrganizationMaintenanceModeRequest, v1.GetOrganizationMaintenanceModeResponse]( + httpClient, + baseURL+"/gitpod.v1.OrganizationService/GetOrganizationMaintenanceMode", + opts..., + ), + setOrganizationMaintenanceMode: connect_go.NewClient[v1.SetOrganizationMaintenanceModeRequest, v1.SetOrganizationMaintenanceModeResponse]( + httpClient, + baseURL+"/gitpod.v1.OrganizationService/SetOrganizationMaintenanceMode", + opts..., + ), } } @@ -162,6 +176,8 @@ type organizationServiceClient struct { getOrganizationSettings *connect_go.Client[v1.GetOrganizationSettingsRequest, v1.GetOrganizationSettingsResponse] updateOrganizationSettings *connect_go.Client[v1.UpdateOrganizationSettingsRequest, v1.UpdateOrganizationSettingsResponse] listOrganizationWorkspaceClasses *connect_go.Client[v1.ListOrganizationWorkspaceClassesRequest, v1.ListOrganizationWorkspaceClassesResponse] + getOrganizationMaintenanceMode *connect_go.Client[v1.GetOrganizationMaintenanceModeRequest, v1.GetOrganizationMaintenanceModeResponse] + setOrganizationMaintenanceMode *connect_go.Client[v1.SetOrganizationMaintenanceModeRequest, v1.SetOrganizationMaintenanceModeResponse] } // CreateOrganization calls gitpod.v1.OrganizationService.CreateOrganization. @@ -235,6 +251,18 @@ func (c *organizationServiceClient) ListOrganizationWorkspaceClasses(ctx context return c.listOrganizationWorkspaceClasses.CallUnary(ctx, req) } +// GetOrganizationMaintenanceMode calls +// gitpod.v1.OrganizationService.GetOrganizationMaintenanceMode. +func (c *organizationServiceClient) GetOrganizationMaintenanceMode(ctx context.Context, req *connect_go.Request[v1.GetOrganizationMaintenanceModeRequest]) (*connect_go.Response[v1.GetOrganizationMaintenanceModeResponse], error) { + return c.getOrganizationMaintenanceMode.CallUnary(ctx, req) +} + +// SetOrganizationMaintenanceMode calls +// gitpod.v1.OrganizationService.SetOrganizationMaintenanceMode. +func (c *organizationServiceClient) SetOrganizationMaintenanceMode(ctx context.Context, req *connect_go.Request[v1.SetOrganizationMaintenanceModeRequest]) (*connect_go.Response[v1.SetOrganizationMaintenanceModeResponse], error) { + return c.setOrganizationMaintenanceMode.CallUnary(ctx, req) +} + // OrganizationServiceHandler is an implementation of the gitpod.v1.OrganizationService service. type OrganizationServiceHandler interface { // CreateOrganization creates a new Organization. @@ -267,6 +295,10 @@ type OrganizationServiceHandler interface { // ListOrganizationWorkspaceClasses lists workspace classes of a // Organization. ListOrganizationWorkspaceClasses(context.Context, *connect_go.Request[v1.ListOrganizationWorkspaceClassesRequest]) (*connect_go.Response[v1.ListOrganizationWorkspaceClassesResponse], error) + // GetOrganizationMaintenanceMode retrieves the maintenance mode status for an organization. + GetOrganizationMaintenanceMode(context.Context, *connect_go.Request[v1.GetOrganizationMaintenanceModeRequest]) (*connect_go.Response[v1.GetOrganizationMaintenanceModeResponse], error) + // SetOrganizationMaintenanceMode sets the maintenance mode status for an organization. + SetOrganizationMaintenanceMode(context.Context, *connect_go.Request[v1.SetOrganizationMaintenanceModeRequest]) (*connect_go.Response[v1.SetOrganizationMaintenanceModeResponse], error) } // NewOrganizationServiceHandler builds an HTTP handler from the service implementation. It returns @@ -346,6 +378,16 @@ func NewOrganizationServiceHandler(svc OrganizationServiceHandler, opts ...conne svc.ListOrganizationWorkspaceClasses, opts..., )) + mux.Handle("/gitpod.v1.OrganizationService/GetOrganizationMaintenanceMode", connect_go.NewUnaryHandler( + "/gitpod.v1.OrganizationService/GetOrganizationMaintenanceMode", + svc.GetOrganizationMaintenanceMode, + opts..., + )) + mux.Handle("/gitpod.v1.OrganizationService/SetOrganizationMaintenanceMode", connect_go.NewUnaryHandler( + "/gitpod.v1.OrganizationService/SetOrganizationMaintenanceMode", + svc.SetOrganizationMaintenanceMode, + opts..., + )) return "/gitpod.v1.OrganizationService/", mux } @@ -407,3 +449,11 @@ func (UnimplementedOrganizationServiceHandler) UpdateOrganizationSettings(contex func (UnimplementedOrganizationServiceHandler) ListOrganizationWorkspaceClasses(context.Context, *connect_go.Request[v1.ListOrganizationWorkspaceClassesRequest]) (*connect_go.Response[v1.ListOrganizationWorkspaceClassesResponse], error) { return nil, connect_go.NewError(connect_go.CodeUnimplemented, errors.New("gitpod.v1.OrganizationService.ListOrganizationWorkspaceClasses is not implemented")) } + +func (UnimplementedOrganizationServiceHandler) GetOrganizationMaintenanceMode(context.Context, *connect_go.Request[v1.GetOrganizationMaintenanceModeRequest]) (*connect_go.Response[v1.GetOrganizationMaintenanceModeResponse], error) { + return nil, connect_go.NewError(connect_go.CodeUnimplemented, errors.New("gitpod.v1.OrganizationService.GetOrganizationMaintenanceMode is not implemented")) +} + +func (UnimplementedOrganizationServiceHandler) SetOrganizationMaintenanceMode(context.Context, *connect_go.Request[v1.SetOrganizationMaintenanceModeRequest]) (*connect_go.Response[v1.SetOrganizationMaintenanceModeResponse], error) { + return nil, connect_go.NewError(connect_go.CodeUnimplemented, errors.New("gitpod.v1.OrganizationService.SetOrganizationMaintenanceMode is not implemented")) +} diff --git a/components/public-api/go/v1/v1connect/organization.proxy.connect.go b/components/public-api/go/v1/v1connect/organization.proxy.connect.go index 921249145fc376..4e7551e5f43c53 100644 --- a/components/public-api/go/v1/v1connect/organization.proxy.connect.go +++ b/components/public-api/go/v1/v1connect/organization.proxy.connect.go @@ -158,3 +158,23 @@ func (s *ProxyOrganizationServiceHandler) ListOrganizationWorkspaceClasses(ctx c return connect_go.NewResponse(resp), nil } + +func (s *ProxyOrganizationServiceHandler) GetOrganizationMaintenanceMode(ctx context.Context, req *connect_go.Request[v1.GetOrganizationMaintenanceModeRequest]) (*connect_go.Response[v1.GetOrganizationMaintenanceModeResponse], error) { + resp, err := s.Client.GetOrganizationMaintenanceMode(ctx, req.Msg) + if err != nil { + // TODO(milan): Convert to correct status code + return nil, err + } + + return connect_go.NewResponse(resp), nil +} + +func (s *ProxyOrganizationServiceHandler) SetOrganizationMaintenanceMode(ctx context.Context, req *connect_go.Request[v1.SetOrganizationMaintenanceModeRequest]) (*connect_go.Response[v1.SetOrganizationMaintenanceModeResponse], error) { + resp, err := s.Client.SetOrganizationMaintenanceMode(ctx, req.Msg) + if err != nil { + // TODO(milan): Convert to correct status code + return nil, err + } + + return connect_go.NewResponse(resp), nil +} diff --git a/components/public-api/java/src/main/java/io/gitpod/publicapi/v1/OrganizationOuterClass.java b/components/public-api/java/src/main/java/io/gitpod/publicapi/v1/OrganizationOuterClass.java index 7e634d22cb077a..0e51e87df0317c 100644 --- a/components/public-api/java/src/main/java/io/gitpod/publicapi/v1/OrganizationOuterClass.java +++ b/components/public-api/java/src/main/java/io/gitpod/publicapi/v1/OrganizationOuterClass.java @@ -31343,6 +31343,2101 @@ public io.gitpod.publicapi.v1.OrganizationOuterClass.DeleteOrganizationMemberRes } + public interface GetOrganizationMaintenanceModeRequestOrBuilder extends + // @@protoc_insertion_point(interface_extends:gitpod.v1.GetOrganizationMaintenanceModeRequest) + com.google.protobuf.MessageOrBuilder { + + /** + *
+     * organization_id is the ID of the organization to retrieve the maintenance mode status for.
+     * 
+ * + * string organization_id = 1 [json_name = "organizationId"]; + * @return The organizationId. + */ + java.lang.String getOrganizationId(); + /** + *
+     * organization_id is the ID of the organization to retrieve the maintenance mode status for.
+     * 
+ * + * string organization_id = 1 [json_name = "organizationId"]; + * @return The bytes for organizationId. + */ + com.google.protobuf.ByteString + getOrganizationIdBytes(); + } + /** + * Protobuf type {@code gitpod.v1.GetOrganizationMaintenanceModeRequest} + */ + public static final class GetOrganizationMaintenanceModeRequest extends + com.google.protobuf.GeneratedMessage implements + // @@protoc_insertion_point(message_implements:gitpod.v1.GetOrganizationMaintenanceModeRequest) + GetOrganizationMaintenanceModeRequestOrBuilder { + private static final long serialVersionUID = 0L; + static { + com.google.protobuf.RuntimeVersion.validateProtobufGencodeVersion( + com.google.protobuf.RuntimeVersion.RuntimeDomain.PUBLIC, + /* major= */ 4, + /* minor= */ 27, + /* patch= */ 2, + /* suffix= */ "", + GetOrganizationMaintenanceModeRequest.class.getName()); + } + // Use GetOrganizationMaintenanceModeRequest.newBuilder() to construct. + private GetOrganizationMaintenanceModeRequest(com.google.protobuf.GeneratedMessage.Builder builder) { + super(builder); + } + private GetOrganizationMaintenanceModeRequest() { + organizationId_ = ""; + } + + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return io.gitpod.publicapi.v1.OrganizationOuterClass.internal_static_gitpod_v1_GetOrganizationMaintenanceModeRequest_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return io.gitpod.publicapi.v1.OrganizationOuterClass.internal_static_gitpod_v1_GetOrganizationMaintenanceModeRequest_fieldAccessorTable + .ensureFieldAccessorsInitialized( + io.gitpod.publicapi.v1.OrganizationOuterClass.GetOrganizationMaintenanceModeRequest.class, io.gitpod.publicapi.v1.OrganizationOuterClass.GetOrganizationMaintenanceModeRequest.Builder.class); + } + + public static final int ORGANIZATION_ID_FIELD_NUMBER = 1; + @SuppressWarnings("serial") + private volatile java.lang.Object organizationId_ = ""; + /** + *
+     * organization_id is the ID of the organization to retrieve the maintenance mode status for.
+     * 
+ * + * string organization_id = 1 [json_name = "organizationId"]; + * @return The organizationId. + */ + @java.lang.Override + public java.lang.String getOrganizationId() { + java.lang.Object ref = organizationId_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + organizationId_ = s; + return s; + } + } + /** + *
+     * organization_id is the ID of the organization to retrieve the maintenance mode status for.
+     * 
+ * + * string organization_id = 1 [json_name = "organizationId"]; + * @return The bytes for organizationId. + */ + @java.lang.Override + public com.google.protobuf.ByteString + getOrganizationIdBytes() { + java.lang.Object ref = organizationId_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + organizationId_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + private byte memoizedIsInitialized = -1; + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + if (!com.google.protobuf.GeneratedMessage.isStringEmpty(organizationId_)) { + com.google.protobuf.GeneratedMessage.writeString(output, 1, organizationId_); + } + getUnknownFields().writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (!com.google.protobuf.GeneratedMessage.isStringEmpty(organizationId_)) { + size += com.google.protobuf.GeneratedMessage.computeStringSize(1, organizationId_); + } + size += getUnknownFields().getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof io.gitpod.publicapi.v1.OrganizationOuterClass.GetOrganizationMaintenanceModeRequest)) { + return super.equals(obj); + } + io.gitpod.publicapi.v1.OrganizationOuterClass.GetOrganizationMaintenanceModeRequest other = (io.gitpod.publicapi.v1.OrganizationOuterClass.GetOrganizationMaintenanceModeRequest) obj; + + if (!getOrganizationId() + .equals(other.getOrganizationId())) return false; + if (!getUnknownFields().equals(other.getUnknownFields())) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + hash = (37 * hash) + ORGANIZATION_ID_FIELD_NUMBER; + hash = (53 * hash) + getOrganizationId().hashCode(); + hash = (29 * hash) + getUnknownFields().hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static io.gitpod.publicapi.v1.OrganizationOuterClass.GetOrganizationMaintenanceModeRequest parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static io.gitpod.publicapi.v1.OrganizationOuterClass.GetOrganizationMaintenanceModeRequest parseFrom( + java.nio.ByteBuffer data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static io.gitpod.publicapi.v1.OrganizationOuterClass.GetOrganizationMaintenanceModeRequest parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static io.gitpod.publicapi.v1.OrganizationOuterClass.GetOrganizationMaintenanceModeRequest parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static io.gitpod.publicapi.v1.OrganizationOuterClass.GetOrganizationMaintenanceModeRequest parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static io.gitpod.publicapi.v1.OrganizationOuterClass.GetOrganizationMaintenanceModeRequest parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static io.gitpod.publicapi.v1.OrganizationOuterClass.GetOrganizationMaintenanceModeRequest parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessage + .parseWithIOException(PARSER, input); + } + public static io.gitpod.publicapi.v1.OrganizationOuterClass.GetOrganizationMaintenanceModeRequest parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessage + .parseWithIOException(PARSER, input, extensionRegistry); + } + + public static io.gitpod.publicapi.v1.OrganizationOuterClass.GetOrganizationMaintenanceModeRequest parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessage + .parseDelimitedWithIOException(PARSER, input); + } + + public static io.gitpod.publicapi.v1.OrganizationOuterClass.GetOrganizationMaintenanceModeRequest parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessage + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + public static io.gitpod.publicapi.v1.OrganizationOuterClass.GetOrganizationMaintenanceModeRequest parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessage + .parseWithIOException(PARSER, input); + } + public static io.gitpod.publicapi.v1.OrganizationOuterClass.GetOrganizationMaintenanceModeRequest parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessage + .parseWithIOException(PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + public static Builder newBuilder(io.gitpod.publicapi.v1.OrganizationOuterClass.GetOrganizationMaintenanceModeRequest prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code gitpod.v1.GetOrganizationMaintenanceModeRequest} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessage.Builder implements + // @@protoc_insertion_point(builder_implements:gitpod.v1.GetOrganizationMaintenanceModeRequest) + io.gitpod.publicapi.v1.OrganizationOuterClass.GetOrganizationMaintenanceModeRequestOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return io.gitpod.publicapi.v1.OrganizationOuterClass.internal_static_gitpod_v1_GetOrganizationMaintenanceModeRequest_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return io.gitpod.publicapi.v1.OrganizationOuterClass.internal_static_gitpod_v1_GetOrganizationMaintenanceModeRequest_fieldAccessorTable + .ensureFieldAccessorsInitialized( + io.gitpod.publicapi.v1.OrganizationOuterClass.GetOrganizationMaintenanceModeRequest.class, io.gitpod.publicapi.v1.OrganizationOuterClass.GetOrganizationMaintenanceModeRequest.Builder.class); + } + + // Construct using io.gitpod.publicapi.v1.OrganizationOuterClass.GetOrganizationMaintenanceModeRequest.newBuilder() + private Builder() { + + } + + private Builder( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + super(parent); + + } + @java.lang.Override + public Builder clear() { + super.clear(); + bitField0_ = 0; + organizationId_ = ""; + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return io.gitpod.publicapi.v1.OrganizationOuterClass.internal_static_gitpod_v1_GetOrganizationMaintenanceModeRequest_descriptor; + } + + @java.lang.Override + public io.gitpod.publicapi.v1.OrganizationOuterClass.GetOrganizationMaintenanceModeRequest getDefaultInstanceForType() { + return io.gitpod.publicapi.v1.OrganizationOuterClass.GetOrganizationMaintenanceModeRequest.getDefaultInstance(); + } + + @java.lang.Override + public io.gitpod.publicapi.v1.OrganizationOuterClass.GetOrganizationMaintenanceModeRequest build() { + io.gitpod.publicapi.v1.OrganizationOuterClass.GetOrganizationMaintenanceModeRequest result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public io.gitpod.publicapi.v1.OrganizationOuterClass.GetOrganizationMaintenanceModeRequest buildPartial() { + io.gitpod.publicapi.v1.OrganizationOuterClass.GetOrganizationMaintenanceModeRequest result = new io.gitpod.publicapi.v1.OrganizationOuterClass.GetOrganizationMaintenanceModeRequest(this); + if (bitField0_ != 0) { buildPartial0(result); } + onBuilt(); + return result; + } + + private void buildPartial0(io.gitpod.publicapi.v1.OrganizationOuterClass.GetOrganizationMaintenanceModeRequest result) { + int from_bitField0_ = bitField0_; + if (((from_bitField0_ & 0x00000001) != 0)) { + result.organizationId_ = organizationId_; + } + } + + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof io.gitpod.publicapi.v1.OrganizationOuterClass.GetOrganizationMaintenanceModeRequest) { + return mergeFrom((io.gitpod.publicapi.v1.OrganizationOuterClass.GetOrganizationMaintenanceModeRequest)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(io.gitpod.publicapi.v1.OrganizationOuterClass.GetOrganizationMaintenanceModeRequest other) { + if (other == io.gitpod.publicapi.v1.OrganizationOuterClass.GetOrganizationMaintenanceModeRequest.getDefaultInstance()) return this; + if (!other.getOrganizationId().isEmpty()) { + organizationId_ = other.organizationId_; + bitField0_ |= 0x00000001; + onChanged(); + } + this.mergeUnknownFields(other.getUnknownFields()); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + return true; + } + + @java.lang.Override + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + case 10: { + organizationId_ = input.readStringRequireUtf8(); + bitField0_ |= 0x00000001; + break; + } // case 10 + default: { + if (!super.parseUnknownField(input, extensionRegistry, tag)) { + done = true; // was an endgroup tag + } + break; + } // default: + } // switch (tag) + } // while (!done) + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.unwrapIOException(); + } finally { + onChanged(); + } // finally + return this; + } + private int bitField0_; + + private java.lang.Object organizationId_ = ""; + /** + *
+       * organization_id is the ID of the organization to retrieve the maintenance mode status for.
+       * 
+ * + * string organization_id = 1 [json_name = "organizationId"]; + * @return The organizationId. + */ + public java.lang.String getOrganizationId() { + java.lang.Object ref = organizationId_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + organizationId_ = s; + return s; + } else { + return (java.lang.String) ref; + } + } + /** + *
+       * organization_id is the ID of the organization to retrieve the maintenance mode status for.
+       * 
+ * + * string organization_id = 1 [json_name = "organizationId"]; + * @return The bytes for organizationId. + */ + public com.google.protobuf.ByteString + getOrganizationIdBytes() { + java.lang.Object ref = organizationId_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + organizationId_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + *
+       * organization_id is the ID of the organization to retrieve the maintenance mode status for.
+       * 
+ * + * string organization_id = 1 [json_name = "organizationId"]; + * @param value The organizationId to set. + * @return This builder for chaining. + */ + public Builder setOrganizationId( + java.lang.String value) { + if (value == null) { throw new NullPointerException(); } + organizationId_ = value; + bitField0_ |= 0x00000001; + onChanged(); + return this; + } + /** + *
+       * organization_id is the ID of the organization to retrieve the maintenance mode status for.
+       * 
+ * + * string organization_id = 1 [json_name = "organizationId"]; + * @return This builder for chaining. + */ + public Builder clearOrganizationId() { + organizationId_ = getDefaultInstance().getOrganizationId(); + bitField0_ = (bitField0_ & ~0x00000001); + onChanged(); + return this; + } + /** + *
+       * organization_id is the ID of the organization to retrieve the maintenance mode status for.
+       * 
+ * + * string organization_id = 1 [json_name = "organizationId"]; + * @param value The bytes for organizationId to set. + * @return This builder for chaining. + */ + public Builder setOrganizationIdBytes( + com.google.protobuf.ByteString value) { + if (value == null) { throw new NullPointerException(); } + checkByteStringIsUtf8(value); + organizationId_ = value; + bitField0_ |= 0x00000001; + onChanged(); + return this; + } + + // @@protoc_insertion_point(builder_scope:gitpod.v1.GetOrganizationMaintenanceModeRequest) + } + + // @@protoc_insertion_point(class_scope:gitpod.v1.GetOrganizationMaintenanceModeRequest) + private static final io.gitpod.publicapi.v1.OrganizationOuterClass.GetOrganizationMaintenanceModeRequest DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new io.gitpod.publicapi.v1.OrganizationOuterClass.GetOrganizationMaintenanceModeRequest(); + } + + public static io.gitpod.publicapi.v1.OrganizationOuterClass.GetOrganizationMaintenanceModeRequest getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + private static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { + @java.lang.Override + public GetOrganizationMaintenanceModeRequest parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + Builder builder = newBuilder(); + try { + builder.mergeFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(builder.buildPartial()); + } catch (com.google.protobuf.UninitializedMessageException e) { + throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial()); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException(e) + .setUnfinishedMessage(builder.buildPartial()); + } + return builder.buildPartial(); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public io.gitpod.publicapi.v1.OrganizationOuterClass.GetOrganizationMaintenanceModeRequest getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + + public interface GetOrganizationMaintenanceModeResponseOrBuilder extends + // @@protoc_insertion_point(interface_extends:gitpod.v1.GetOrganizationMaintenanceModeResponse) + com.google.protobuf.MessageOrBuilder { + + /** + *
+     * enabled indicates whether maintenance mode is enabled for the organization.
+     * 
+ * + * bool enabled = 1 [json_name = "enabled"]; + * @return The enabled. + */ + boolean getEnabled(); + } + /** + * Protobuf type {@code gitpod.v1.GetOrganizationMaintenanceModeResponse} + */ + public static final class GetOrganizationMaintenanceModeResponse extends + com.google.protobuf.GeneratedMessage implements + // @@protoc_insertion_point(message_implements:gitpod.v1.GetOrganizationMaintenanceModeResponse) + GetOrganizationMaintenanceModeResponseOrBuilder { + private static final long serialVersionUID = 0L; + static { + com.google.protobuf.RuntimeVersion.validateProtobufGencodeVersion( + com.google.protobuf.RuntimeVersion.RuntimeDomain.PUBLIC, + /* major= */ 4, + /* minor= */ 27, + /* patch= */ 2, + /* suffix= */ "", + GetOrganizationMaintenanceModeResponse.class.getName()); + } + // Use GetOrganizationMaintenanceModeResponse.newBuilder() to construct. + private GetOrganizationMaintenanceModeResponse(com.google.protobuf.GeneratedMessage.Builder builder) { + super(builder); + } + private GetOrganizationMaintenanceModeResponse() { + } + + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return io.gitpod.publicapi.v1.OrganizationOuterClass.internal_static_gitpod_v1_GetOrganizationMaintenanceModeResponse_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return io.gitpod.publicapi.v1.OrganizationOuterClass.internal_static_gitpod_v1_GetOrganizationMaintenanceModeResponse_fieldAccessorTable + .ensureFieldAccessorsInitialized( + io.gitpod.publicapi.v1.OrganizationOuterClass.GetOrganizationMaintenanceModeResponse.class, io.gitpod.publicapi.v1.OrganizationOuterClass.GetOrganizationMaintenanceModeResponse.Builder.class); + } + + public static final int ENABLED_FIELD_NUMBER = 1; + private boolean enabled_ = false; + /** + *
+     * enabled indicates whether maintenance mode is enabled for the organization.
+     * 
+ * + * bool enabled = 1 [json_name = "enabled"]; + * @return The enabled. + */ + @java.lang.Override + public boolean getEnabled() { + return enabled_; + } + + private byte memoizedIsInitialized = -1; + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + if (enabled_ != false) { + output.writeBool(1, enabled_); + } + getUnknownFields().writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (enabled_ != false) { + size += com.google.protobuf.CodedOutputStream + .computeBoolSize(1, enabled_); + } + size += getUnknownFields().getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof io.gitpod.publicapi.v1.OrganizationOuterClass.GetOrganizationMaintenanceModeResponse)) { + return super.equals(obj); + } + io.gitpod.publicapi.v1.OrganizationOuterClass.GetOrganizationMaintenanceModeResponse other = (io.gitpod.publicapi.v1.OrganizationOuterClass.GetOrganizationMaintenanceModeResponse) obj; + + if (getEnabled() + != other.getEnabled()) return false; + if (!getUnknownFields().equals(other.getUnknownFields())) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + hash = (37 * hash) + ENABLED_FIELD_NUMBER; + hash = (53 * hash) + com.google.protobuf.Internal.hashBoolean( + getEnabled()); + hash = (29 * hash) + getUnknownFields().hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static io.gitpod.publicapi.v1.OrganizationOuterClass.GetOrganizationMaintenanceModeResponse parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static io.gitpod.publicapi.v1.OrganizationOuterClass.GetOrganizationMaintenanceModeResponse parseFrom( + java.nio.ByteBuffer data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static io.gitpod.publicapi.v1.OrganizationOuterClass.GetOrganizationMaintenanceModeResponse parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static io.gitpod.publicapi.v1.OrganizationOuterClass.GetOrganizationMaintenanceModeResponse parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static io.gitpod.publicapi.v1.OrganizationOuterClass.GetOrganizationMaintenanceModeResponse parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static io.gitpod.publicapi.v1.OrganizationOuterClass.GetOrganizationMaintenanceModeResponse parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static io.gitpod.publicapi.v1.OrganizationOuterClass.GetOrganizationMaintenanceModeResponse parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessage + .parseWithIOException(PARSER, input); + } + public static io.gitpod.publicapi.v1.OrganizationOuterClass.GetOrganizationMaintenanceModeResponse parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessage + .parseWithIOException(PARSER, input, extensionRegistry); + } + + public static io.gitpod.publicapi.v1.OrganizationOuterClass.GetOrganizationMaintenanceModeResponse parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessage + .parseDelimitedWithIOException(PARSER, input); + } + + public static io.gitpod.publicapi.v1.OrganizationOuterClass.GetOrganizationMaintenanceModeResponse parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessage + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + public static io.gitpod.publicapi.v1.OrganizationOuterClass.GetOrganizationMaintenanceModeResponse parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessage + .parseWithIOException(PARSER, input); + } + public static io.gitpod.publicapi.v1.OrganizationOuterClass.GetOrganizationMaintenanceModeResponse parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessage + .parseWithIOException(PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + public static Builder newBuilder(io.gitpod.publicapi.v1.OrganizationOuterClass.GetOrganizationMaintenanceModeResponse prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code gitpod.v1.GetOrganizationMaintenanceModeResponse} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessage.Builder implements + // @@protoc_insertion_point(builder_implements:gitpod.v1.GetOrganizationMaintenanceModeResponse) + io.gitpod.publicapi.v1.OrganizationOuterClass.GetOrganizationMaintenanceModeResponseOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return io.gitpod.publicapi.v1.OrganizationOuterClass.internal_static_gitpod_v1_GetOrganizationMaintenanceModeResponse_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return io.gitpod.publicapi.v1.OrganizationOuterClass.internal_static_gitpod_v1_GetOrganizationMaintenanceModeResponse_fieldAccessorTable + .ensureFieldAccessorsInitialized( + io.gitpod.publicapi.v1.OrganizationOuterClass.GetOrganizationMaintenanceModeResponse.class, io.gitpod.publicapi.v1.OrganizationOuterClass.GetOrganizationMaintenanceModeResponse.Builder.class); + } + + // Construct using io.gitpod.publicapi.v1.OrganizationOuterClass.GetOrganizationMaintenanceModeResponse.newBuilder() + private Builder() { + + } + + private Builder( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + super(parent); + + } + @java.lang.Override + public Builder clear() { + super.clear(); + bitField0_ = 0; + enabled_ = false; + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return io.gitpod.publicapi.v1.OrganizationOuterClass.internal_static_gitpod_v1_GetOrganizationMaintenanceModeResponse_descriptor; + } + + @java.lang.Override + public io.gitpod.publicapi.v1.OrganizationOuterClass.GetOrganizationMaintenanceModeResponse getDefaultInstanceForType() { + return io.gitpod.publicapi.v1.OrganizationOuterClass.GetOrganizationMaintenanceModeResponse.getDefaultInstance(); + } + + @java.lang.Override + public io.gitpod.publicapi.v1.OrganizationOuterClass.GetOrganizationMaintenanceModeResponse build() { + io.gitpod.publicapi.v1.OrganizationOuterClass.GetOrganizationMaintenanceModeResponse result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public io.gitpod.publicapi.v1.OrganizationOuterClass.GetOrganizationMaintenanceModeResponse buildPartial() { + io.gitpod.publicapi.v1.OrganizationOuterClass.GetOrganizationMaintenanceModeResponse result = new io.gitpod.publicapi.v1.OrganizationOuterClass.GetOrganizationMaintenanceModeResponse(this); + if (bitField0_ != 0) { buildPartial0(result); } + onBuilt(); + return result; + } + + private void buildPartial0(io.gitpod.publicapi.v1.OrganizationOuterClass.GetOrganizationMaintenanceModeResponse result) { + int from_bitField0_ = bitField0_; + if (((from_bitField0_ & 0x00000001) != 0)) { + result.enabled_ = enabled_; + } + } + + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof io.gitpod.publicapi.v1.OrganizationOuterClass.GetOrganizationMaintenanceModeResponse) { + return mergeFrom((io.gitpod.publicapi.v1.OrganizationOuterClass.GetOrganizationMaintenanceModeResponse)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(io.gitpod.publicapi.v1.OrganizationOuterClass.GetOrganizationMaintenanceModeResponse other) { + if (other == io.gitpod.publicapi.v1.OrganizationOuterClass.GetOrganizationMaintenanceModeResponse.getDefaultInstance()) return this; + if (other.getEnabled() != false) { + setEnabled(other.getEnabled()); + } + this.mergeUnknownFields(other.getUnknownFields()); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + return true; + } + + @java.lang.Override + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + case 8: { + enabled_ = input.readBool(); + bitField0_ |= 0x00000001; + break; + } // case 8 + default: { + if (!super.parseUnknownField(input, extensionRegistry, tag)) { + done = true; // was an endgroup tag + } + break; + } // default: + } // switch (tag) + } // while (!done) + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.unwrapIOException(); + } finally { + onChanged(); + } // finally + return this; + } + private int bitField0_; + + private boolean enabled_ ; + /** + *
+       * enabled indicates whether maintenance mode is enabled for the organization.
+       * 
+ * + * bool enabled = 1 [json_name = "enabled"]; + * @return The enabled. + */ + @java.lang.Override + public boolean getEnabled() { + return enabled_; + } + /** + *
+       * enabled indicates whether maintenance mode is enabled for the organization.
+       * 
+ * + * bool enabled = 1 [json_name = "enabled"]; + * @param value The enabled to set. + * @return This builder for chaining. + */ + public Builder setEnabled(boolean value) { + + enabled_ = value; + bitField0_ |= 0x00000001; + onChanged(); + return this; + } + /** + *
+       * enabled indicates whether maintenance mode is enabled for the organization.
+       * 
+ * + * bool enabled = 1 [json_name = "enabled"]; + * @return This builder for chaining. + */ + public Builder clearEnabled() { + bitField0_ = (bitField0_ & ~0x00000001); + enabled_ = false; + onChanged(); + return this; + } + + // @@protoc_insertion_point(builder_scope:gitpod.v1.GetOrganizationMaintenanceModeResponse) + } + + // @@protoc_insertion_point(class_scope:gitpod.v1.GetOrganizationMaintenanceModeResponse) + private static final io.gitpod.publicapi.v1.OrganizationOuterClass.GetOrganizationMaintenanceModeResponse DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new io.gitpod.publicapi.v1.OrganizationOuterClass.GetOrganizationMaintenanceModeResponse(); + } + + public static io.gitpod.publicapi.v1.OrganizationOuterClass.GetOrganizationMaintenanceModeResponse getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + private static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { + @java.lang.Override + public GetOrganizationMaintenanceModeResponse parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + Builder builder = newBuilder(); + try { + builder.mergeFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(builder.buildPartial()); + } catch (com.google.protobuf.UninitializedMessageException e) { + throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial()); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException(e) + .setUnfinishedMessage(builder.buildPartial()); + } + return builder.buildPartial(); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public io.gitpod.publicapi.v1.OrganizationOuterClass.GetOrganizationMaintenanceModeResponse getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + + public interface SetOrganizationMaintenanceModeRequestOrBuilder extends + // @@protoc_insertion_point(interface_extends:gitpod.v1.SetOrganizationMaintenanceModeRequest) + com.google.protobuf.MessageOrBuilder { + + /** + *
+     * organization_id is the ID of the organization to set the maintenance mode status for.
+     * 
+ * + * string organization_id = 1 [json_name = "organizationId"]; + * @return The organizationId. + */ + java.lang.String getOrganizationId(); + /** + *
+     * organization_id is the ID of the organization to set the maintenance mode status for.
+     * 
+ * + * string organization_id = 1 [json_name = "organizationId"]; + * @return The bytes for organizationId. + */ + com.google.protobuf.ByteString + getOrganizationIdBytes(); + + /** + *
+     * enabled indicates whether maintenance mode should be enabled or disabled.
+     * 
+ * + * bool enabled = 2 [json_name = "enabled"]; + * @return The enabled. + */ + boolean getEnabled(); + } + /** + * Protobuf type {@code gitpod.v1.SetOrganizationMaintenanceModeRequest} + */ + public static final class SetOrganizationMaintenanceModeRequest extends + com.google.protobuf.GeneratedMessage implements + // @@protoc_insertion_point(message_implements:gitpod.v1.SetOrganizationMaintenanceModeRequest) + SetOrganizationMaintenanceModeRequestOrBuilder { + private static final long serialVersionUID = 0L; + static { + com.google.protobuf.RuntimeVersion.validateProtobufGencodeVersion( + com.google.protobuf.RuntimeVersion.RuntimeDomain.PUBLIC, + /* major= */ 4, + /* minor= */ 27, + /* patch= */ 2, + /* suffix= */ "", + SetOrganizationMaintenanceModeRequest.class.getName()); + } + // Use SetOrganizationMaintenanceModeRequest.newBuilder() to construct. + private SetOrganizationMaintenanceModeRequest(com.google.protobuf.GeneratedMessage.Builder builder) { + super(builder); + } + private SetOrganizationMaintenanceModeRequest() { + organizationId_ = ""; + } + + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return io.gitpod.publicapi.v1.OrganizationOuterClass.internal_static_gitpod_v1_SetOrganizationMaintenanceModeRequest_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return io.gitpod.publicapi.v1.OrganizationOuterClass.internal_static_gitpod_v1_SetOrganizationMaintenanceModeRequest_fieldAccessorTable + .ensureFieldAccessorsInitialized( + io.gitpod.publicapi.v1.OrganizationOuterClass.SetOrganizationMaintenanceModeRequest.class, io.gitpod.publicapi.v1.OrganizationOuterClass.SetOrganizationMaintenanceModeRequest.Builder.class); + } + + public static final int ORGANIZATION_ID_FIELD_NUMBER = 1; + @SuppressWarnings("serial") + private volatile java.lang.Object organizationId_ = ""; + /** + *
+     * organization_id is the ID of the organization to set the maintenance mode status for.
+     * 
+ * + * string organization_id = 1 [json_name = "organizationId"]; + * @return The organizationId. + */ + @java.lang.Override + public java.lang.String getOrganizationId() { + java.lang.Object ref = organizationId_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + organizationId_ = s; + return s; + } + } + /** + *
+     * organization_id is the ID of the organization to set the maintenance mode status for.
+     * 
+ * + * string organization_id = 1 [json_name = "organizationId"]; + * @return The bytes for organizationId. + */ + @java.lang.Override + public com.google.protobuf.ByteString + getOrganizationIdBytes() { + java.lang.Object ref = organizationId_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + organizationId_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + public static final int ENABLED_FIELD_NUMBER = 2; + private boolean enabled_ = false; + /** + *
+     * enabled indicates whether maintenance mode should be enabled or disabled.
+     * 
+ * + * bool enabled = 2 [json_name = "enabled"]; + * @return The enabled. + */ + @java.lang.Override + public boolean getEnabled() { + return enabled_; + } + + private byte memoizedIsInitialized = -1; + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + if (!com.google.protobuf.GeneratedMessage.isStringEmpty(organizationId_)) { + com.google.protobuf.GeneratedMessage.writeString(output, 1, organizationId_); + } + if (enabled_ != false) { + output.writeBool(2, enabled_); + } + getUnknownFields().writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (!com.google.protobuf.GeneratedMessage.isStringEmpty(organizationId_)) { + size += com.google.protobuf.GeneratedMessage.computeStringSize(1, organizationId_); + } + if (enabled_ != false) { + size += com.google.protobuf.CodedOutputStream + .computeBoolSize(2, enabled_); + } + size += getUnknownFields().getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof io.gitpod.publicapi.v1.OrganizationOuterClass.SetOrganizationMaintenanceModeRequest)) { + return super.equals(obj); + } + io.gitpod.publicapi.v1.OrganizationOuterClass.SetOrganizationMaintenanceModeRequest other = (io.gitpod.publicapi.v1.OrganizationOuterClass.SetOrganizationMaintenanceModeRequest) obj; + + if (!getOrganizationId() + .equals(other.getOrganizationId())) return false; + if (getEnabled() + != other.getEnabled()) return false; + if (!getUnknownFields().equals(other.getUnknownFields())) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + hash = (37 * hash) + ORGANIZATION_ID_FIELD_NUMBER; + hash = (53 * hash) + getOrganizationId().hashCode(); + hash = (37 * hash) + ENABLED_FIELD_NUMBER; + hash = (53 * hash) + com.google.protobuf.Internal.hashBoolean( + getEnabled()); + hash = (29 * hash) + getUnknownFields().hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static io.gitpod.publicapi.v1.OrganizationOuterClass.SetOrganizationMaintenanceModeRequest parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static io.gitpod.publicapi.v1.OrganizationOuterClass.SetOrganizationMaintenanceModeRequest parseFrom( + java.nio.ByteBuffer data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static io.gitpod.publicapi.v1.OrganizationOuterClass.SetOrganizationMaintenanceModeRequest parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static io.gitpod.publicapi.v1.OrganizationOuterClass.SetOrganizationMaintenanceModeRequest parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static io.gitpod.publicapi.v1.OrganizationOuterClass.SetOrganizationMaintenanceModeRequest parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static io.gitpod.publicapi.v1.OrganizationOuterClass.SetOrganizationMaintenanceModeRequest parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static io.gitpod.publicapi.v1.OrganizationOuterClass.SetOrganizationMaintenanceModeRequest parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessage + .parseWithIOException(PARSER, input); + } + public static io.gitpod.publicapi.v1.OrganizationOuterClass.SetOrganizationMaintenanceModeRequest parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessage + .parseWithIOException(PARSER, input, extensionRegistry); + } + + public static io.gitpod.publicapi.v1.OrganizationOuterClass.SetOrganizationMaintenanceModeRequest parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessage + .parseDelimitedWithIOException(PARSER, input); + } + + public static io.gitpod.publicapi.v1.OrganizationOuterClass.SetOrganizationMaintenanceModeRequest parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessage + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + public static io.gitpod.publicapi.v1.OrganizationOuterClass.SetOrganizationMaintenanceModeRequest parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessage + .parseWithIOException(PARSER, input); + } + public static io.gitpod.publicapi.v1.OrganizationOuterClass.SetOrganizationMaintenanceModeRequest parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessage + .parseWithIOException(PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + public static Builder newBuilder(io.gitpod.publicapi.v1.OrganizationOuterClass.SetOrganizationMaintenanceModeRequest prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code gitpod.v1.SetOrganizationMaintenanceModeRequest} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessage.Builder implements + // @@protoc_insertion_point(builder_implements:gitpod.v1.SetOrganizationMaintenanceModeRequest) + io.gitpod.publicapi.v1.OrganizationOuterClass.SetOrganizationMaintenanceModeRequestOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return io.gitpod.publicapi.v1.OrganizationOuterClass.internal_static_gitpod_v1_SetOrganizationMaintenanceModeRequest_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return io.gitpod.publicapi.v1.OrganizationOuterClass.internal_static_gitpod_v1_SetOrganizationMaintenanceModeRequest_fieldAccessorTable + .ensureFieldAccessorsInitialized( + io.gitpod.publicapi.v1.OrganizationOuterClass.SetOrganizationMaintenanceModeRequest.class, io.gitpod.publicapi.v1.OrganizationOuterClass.SetOrganizationMaintenanceModeRequest.Builder.class); + } + + // Construct using io.gitpod.publicapi.v1.OrganizationOuterClass.SetOrganizationMaintenanceModeRequest.newBuilder() + private Builder() { + + } + + private Builder( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + super(parent); + + } + @java.lang.Override + public Builder clear() { + super.clear(); + bitField0_ = 0; + organizationId_ = ""; + enabled_ = false; + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return io.gitpod.publicapi.v1.OrganizationOuterClass.internal_static_gitpod_v1_SetOrganizationMaintenanceModeRequest_descriptor; + } + + @java.lang.Override + public io.gitpod.publicapi.v1.OrganizationOuterClass.SetOrganizationMaintenanceModeRequest getDefaultInstanceForType() { + return io.gitpod.publicapi.v1.OrganizationOuterClass.SetOrganizationMaintenanceModeRequest.getDefaultInstance(); + } + + @java.lang.Override + public io.gitpod.publicapi.v1.OrganizationOuterClass.SetOrganizationMaintenanceModeRequest build() { + io.gitpod.publicapi.v1.OrganizationOuterClass.SetOrganizationMaintenanceModeRequest result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public io.gitpod.publicapi.v1.OrganizationOuterClass.SetOrganizationMaintenanceModeRequest buildPartial() { + io.gitpod.publicapi.v1.OrganizationOuterClass.SetOrganizationMaintenanceModeRequest result = new io.gitpod.publicapi.v1.OrganizationOuterClass.SetOrganizationMaintenanceModeRequest(this); + if (bitField0_ != 0) { buildPartial0(result); } + onBuilt(); + return result; + } + + private void buildPartial0(io.gitpod.publicapi.v1.OrganizationOuterClass.SetOrganizationMaintenanceModeRequest result) { + int from_bitField0_ = bitField0_; + if (((from_bitField0_ & 0x00000001) != 0)) { + result.organizationId_ = organizationId_; + } + if (((from_bitField0_ & 0x00000002) != 0)) { + result.enabled_ = enabled_; + } + } + + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof io.gitpod.publicapi.v1.OrganizationOuterClass.SetOrganizationMaintenanceModeRequest) { + return mergeFrom((io.gitpod.publicapi.v1.OrganizationOuterClass.SetOrganizationMaintenanceModeRequest)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(io.gitpod.publicapi.v1.OrganizationOuterClass.SetOrganizationMaintenanceModeRequest other) { + if (other == io.gitpod.publicapi.v1.OrganizationOuterClass.SetOrganizationMaintenanceModeRequest.getDefaultInstance()) return this; + if (!other.getOrganizationId().isEmpty()) { + organizationId_ = other.organizationId_; + bitField0_ |= 0x00000001; + onChanged(); + } + if (other.getEnabled() != false) { + setEnabled(other.getEnabled()); + } + this.mergeUnknownFields(other.getUnknownFields()); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + return true; + } + + @java.lang.Override + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + case 10: { + organizationId_ = input.readStringRequireUtf8(); + bitField0_ |= 0x00000001; + break; + } // case 10 + case 16: { + enabled_ = input.readBool(); + bitField0_ |= 0x00000002; + break; + } // case 16 + default: { + if (!super.parseUnknownField(input, extensionRegistry, tag)) { + done = true; // was an endgroup tag + } + break; + } // default: + } // switch (tag) + } // while (!done) + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.unwrapIOException(); + } finally { + onChanged(); + } // finally + return this; + } + private int bitField0_; + + private java.lang.Object organizationId_ = ""; + /** + *
+       * organization_id is the ID of the organization to set the maintenance mode status for.
+       * 
+ * + * string organization_id = 1 [json_name = "organizationId"]; + * @return The organizationId. + */ + public java.lang.String getOrganizationId() { + java.lang.Object ref = organizationId_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + organizationId_ = s; + return s; + } else { + return (java.lang.String) ref; + } + } + /** + *
+       * organization_id is the ID of the organization to set the maintenance mode status for.
+       * 
+ * + * string organization_id = 1 [json_name = "organizationId"]; + * @return The bytes for organizationId. + */ + public com.google.protobuf.ByteString + getOrganizationIdBytes() { + java.lang.Object ref = organizationId_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + organizationId_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + *
+       * organization_id is the ID of the organization to set the maintenance mode status for.
+       * 
+ * + * string organization_id = 1 [json_name = "organizationId"]; + * @param value The organizationId to set. + * @return This builder for chaining. + */ + public Builder setOrganizationId( + java.lang.String value) { + if (value == null) { throw new NullPointerException(); } + organizationId_ = value; + bitField0_ |= 0x00000001; + onChanged(); + return this; + } + /** + *
+       * organization_id is the ID of the organization to set the maintenance mode status for.
+       * 
+ * + * string organization_id = 1 [json_name = "organizationId"]; + * @return This builder for chaining. + */ + public Builder clearOrganizationId() { + organizationId_ = getDefaultInstance().getOrganizationId(); + bitField0_ = (bitField0_ & ~0x00000001); + onChanged(); + return this; + } + /** + *
+       * organization_id is the ID of the organization to set the maintenance mode status for.
+       * 
+ * + * string organization_id = 1 [json_name = "organizationId"]; + * @param value The bytes for organizationId to set. + * @return This builder for chaining. + */ + public Builder setOrganizationIdBytes( + com.google.protobuf.ByteString value) { + if (value == null) { throw new NullPointerException(); } + checkByteStringIsUtf8(value); + organizationId_ = value; + bitField0_ |= 0x00000001; + onChanged(); + return this; + } + + private boolean enabled_ ; + /** + *
+       * enabled indicates whether maintenance mode should be enabled or disabled.
+       * 
+ * + * bool enabled = 2 [json_name = "enabled"]; + * @return The enabled. + */ + @java.lang.Override + public boolean getEnabled() { + return enabled_; + } + /** + *
+       * enabled indicates whether maintenance mode should be enabled or disabled.
+       * 
+ * + * bool enabled = 2 [json_name = "enabled"]; + * @param value The enabled to set. + * @return This builder for chaining. + */ + public Builder setEnabled(boolean value) { + + enabled_ = value; + bitField0_ |= 0x00000002; + onChanged(); + return this; + } + /** + *
+       * enabled indicates whether maintenance mode should be enabled or disabled.
+       * 
+ * + * bool enabled = 2 [json_name = "enabled"]; + * @return This builder for chaining. + */ + public Builder clearEnabled() { + bitField0_ = (bitField0_ & ~0x00000002); + enabled_ = false; + onChanged(); + return this; + } + + // @@protoc_insertion_point(builder_scope:gitpod.v1.SetOrganizationMaintenanceModeRequest) + } + + // @@protoc_insertion_point(class_scope:gitpod.v1.SetOrganizationMaintenanceModeRequest) + private static final io.gitpod.publicapi.v1.OrganizationOuterClass.SetOrganizationMaintenanceModeRequest DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new io.gitpod.publicapi.v1.OrganizationOuterClass.SetOrganizationMaintenanceModeRequest(); + } + + public static io.gitpod.publicapi.v1.OrganizationOuterClass.SetOrganizationMaintenanceModeRequest getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + private static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { + @java.lang.Override + public SetOrganizationMaintenanceModeRequest parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + Builder builder = newBuilder(); + try { + builder.mergeFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(builder.buildPartial()); + } catch (com.google.protobuf.UninitializedMessageException e) { + throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial()); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException(e) + .setUnfinishedMessage(builder.buildPartial()); + } + return builder.buildPartial(); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public io.gitpod.publicapi.v1.OrganizationOuterClass.SetOrganizationMaintenanceModeRequest getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + + public interface SetOrganizationMaintenanceModeResponseOrBuilder extends + // @@protoc_insertion_point(interface_extends:gitpod.v1.SetOrganizationMaintenanceModeResponse) + com.google.protobuf.MessageOrBuilder { + + /** + *
+     * enabled indicates the new maintenance mode status after the update.
+     * 
+ * + * bool enabled = 1 [json_name = "enabled"]; + * @return The enabled. + */ + boolean getEnabled(); + } + /** + * Protobuf type {@code gitpod.v1.SetOrganizationMaintenanceModeResponse} + */ + public static final class SetOrganizationMaintenanceModeResponse extends + com.google.protobuf.GeneratedMessage implements + // @@protoc_insertion_point(message_implements:gitpod.v1.SetOrganizationMaintenanceModeResponse) + SetOrganizationMaintenanceModeResponseOrBuilder { + private static final long serialVersionUID = 0L; + static { + com.google.protobuf.RuntimeVersion.validateProtobufGencodeVersion( + com.google.protobuf.RuntimeVersion.RuntimeDomain.PUBLIC, + /* major= */ 4, + /* minor= */ 27, + /* patch= */ 2, + /* suffix= */ "", + SetOrganizationMaintenanceModeResponse.class.getName()); + } + // Use SetOrganizationMaintenanceModeResponse.newBuilder() to construct. + private SetOrganizationMaintenanceModeResponse(com.google.protobuf.GeneratedMessage.Builder builder) { + super(builder); + } + private SetOrganizationMaintenanceModeResponse() { + } + + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return io.gitpod.publicapi.v1.OrganizationOuterClass.internal_static_gitpod_v1_SetOrganizationMaintenanceModeResponse_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return io.gitpod.publicapi.v1.OrganizationOuterClass.internal_static_gitpod_v1_SetOrganizationMaintenanceModeResponse_fieldAccessorTable + .ensureFieldAccessorsInitialized( + io.gitpod.publicapi.v1.OrganizationOuterClass.SetOrganizationMaintenanceModeResponse.class, io.gitpod.publicapi.v1.OrganizationOuterClass.SetOrganizationMaintenanceModeResponse.Builder.class); + } + + public static final int ENABLED_FIELD_NUMBER = 1; + private boolean enabled_ = false; + /** + *
+     * enabled indicates the new maintenance mode status after the update.
+     * 
+ * + * bool enabled = 1 [json_name = "enabled"]; + * @return The enabled. + */ + @java.lang.Override + public boolean getEnabled() { + return enabled_; + } + + private byte memoizedIsInitialized = -1; + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + if (enabled_ != false) { + output.writeBool(1, enabled_); + } + getUnknownFields().writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (enabled_ != false) { + size += com.google.protobuf.CodedOutputStream + .computeBoolSize(1, enabled_); + } + size += getUnknownFields().getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof io.gitpod.publicapi.v1.OrganizationOuterClass.SetOrganizationMaintenanceModeResponse)) { + return super.equals(obj); + } + io.gitpod.publicapi.v1.OrganizationOuterClass.SetOrganizationMaintenanceModeResponse other = (io.gitpod.publicapi.v1.OrganizationOuterClass.SetOrganizationMaintenanceModeResponse) obj; + + if (getEnabled() + != other.getEnabled()) return false; + if (!getUnknownFields().equals(other.getUnknownFields())) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + hash = (37 * hash) + ENABLED_FIELD_NUMBER; + hash = (53 * hash) + com.google.protobuf.Internal.hashBoolean( + getEnabled()); + hash = (29 * hash) + getUnknownFields().hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static io.gitpod.publicapi.v1.OrganizationOuterClass.SetOrganizationMaintenanceModeResponse parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static io.gitpod.publicapi.v1.OrganizationOuterClass.SetOrganizationMaintenanceModeResponse parseFrom( + java.nio.ByteBuffer data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static io.gitpod.publicapi.v1.OrganizationOuterClass.SetOrganizationMaintenanceModeResponse parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static io.gitpod.publicapi.v1.OrganizationOuterClass.SetOrganizationMaintenanceModeResponse parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static io.gitpod.publicapi.v1.OrganizationOuterClass.SetOrganizationMaintenanceModeResponse parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static io.gitpod.publicapi.v1.OrganizationOuterClass.SetOrganizationMaintenanceModeResponse parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static io.gitpod.publicapi.v1.OrganizationOuterClass.SetOrganizationMaintenanceModeResponse parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessage + .parseWithIOException(PARSER, input); + } + public static io.gitpod.publicapi.v1.OrganizationOuterClass.SetOrganizationMaintenanceModeResponse parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessage + .parseWithIOException(PARSER, input, extensionRegistry); + } + + public static io.gitpod.publicapi.v1.OrganizationOuterClass.SetOrganizationMaintenanceModeResponse parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessage + .parseDelimitedWithIOException(PARSER, input); + } + + public static io.gitpod.publicapi.v1.OrganizationOuterClass.SetOrganizationMaintenanceModeResponse parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessage + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + public static io.gitpod.publicapi.v1.OrganizationOuterClass.SetOrganizationMaintenanceModeResponse parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessage + .parseWithIOException(PARSER, input); + } + public static io.gitpod.publicapi.v1.OrganizationOuterClass.SetOrganizationMaintenanceModeResponse parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessage + .parseWithIOException(PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + public static Builder newBuilder(io.gitpod.publicapi.v1.OrganizationOuterClass.SetOrganizationMaintenanceModeResponse prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code gitpod.v1.SetOrganizationMaintenanceModeResponse} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessage.Builder implements + // @@protoc_insertion_point(builder_implements:gitpod.v1.SetOrganizationMaintenanceModeResponse) + io.gitpod.publicapi.v1.OrganizationOuterClass.SetOrganizationMaintenanceModeResponseOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return io.gitpod.publicapi.v1.OrganizationOuterClass.internal_static_gitpod_v1_SetOrganizationMaintenanceModeResponse_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return io.gitpod.publicapi.v1.OrganizationOuterClass.internal_static_gitpod_v1_SetOrganizationMaintenanceModeResponse_fieldAccessorTable + .ensureFieldAccessorsInitialized( + io.gitpod.publicapi.v1.OrganizationOuterClass.SetOrganizationMaintenanceModeResponse.class, io.gitpod.publicapi.v1.OrganizationOuterClass.SetOrganizationMaintenanceModeResponse.Builder.class); + } + + // Construct using io.gitpod.publicapi.v1.OrganizationOuterClass.SetOrganizationMaintenanceModeResponse.newBuilder() + private Builder() { + + } + + private Builder( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + super(parent); + + } + @java.lang.Override + public Builder clear() { + super.clear(); + bitField0_ = 0; + enabled_ = false; + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return io.gitpod.publicapi.v1.OrganizationOuterClass.internal_static_gitpod_v1_SetOrganizationMaintenanceModeResponse_descriptor; + } + + @java.lang.Override + public io.gitpod.publicapi.v1.OrganizationOuterClass.SetOrganizationMaintenanceModeResponse getDefaultInstanceForType() { + return io.gitpod.publicapi.v1.OrganizationOuterClass.SetOrganizationMaintenanceModeResponse.getDefaultInstance(); + } + + @java.lang.Override + public io.gitpod.publicapi.v1.OrganizationOuterClass.SetOrganizationMaintenanceModeResponse build() { + io.gitpod.publicapi.v1.OrganizationOuterClass.SetOrganizationMaintenanceModeResponse result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public io.gitpod.publicapi.v1.OrganizationOuterClass.SetOrganizationMaintenanceModeResponse buildPartial() { + io.gitpod.publicapi.v1.OrganizationOuterClass.SetOrganizationMaintenanceModeResponse result = new io.gitpod.publicapi.v1.OrganizationOuterClass.SetOrganizationMaintenanceModeResponse(this); + if (bitField0_ != 0) { buildPartial0(result); } + onBuilt(); + return result; + } + + private void buildPartial0(io.gitpod.publicapi.v1.OrganizationOuterClass.SetOrganizationMaintenanceModeResponse result) { + int from_bitField0_ = bitField0_; + if (((from_bitField0_ & 0x00000001) != 0)) { + result.enabled_ = enabled_; + } + } + + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof io.gitpod.publicapi.v1.OrganizationOuterClass.SetOrganizationMaintenanceModeResponse) { + return mergeFrom((io.gitpod.publicapi.v1.OrganizationOuterClass.SetOrganizationMaintenanceModeResponse)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(io.gitpod.publicapi.v1.OrganizationOuterClass.SetOrganizationMaintenanceModeResponse other) { + if (other == io.gitpod.publicapi.v1.OrganizationOuterClass.SetOrganizationMaintenanceModeResponse.getDefaultInstance()) return this; + if (other.getEnabled() != false) { + setEnabled(other.getEnabled()); + } + this.mergeUnknownFields(other.getUnknownFields()); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + return true; + } + + @java.lang.Override + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + case 8: { + enabled_ = input.readBool(); + bitField0_ |= 0x00000001; + break; + } // case 8 + default: { + if (!super.parseUnknownField(input, extensionRegistry, tag)) { + done = true; // was an endgroup tag + } + break; + } // default: + } // switch (tag) + } // while (!done) + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.unwrapIOException(); + } finally { + onChanged(); + } // finally + return this; + } + private int bitField0_; + + private boolean enabled_ ; + /** + *
+       * enabled indicates the new maintenance mode status after the update.
+       * 
+ * + * bool enabled = 1 [json_name = "enabled"]; + * @return The enabled. + */ + @java.lang.Override + public boolean getEnabled() { + return enabled_; + } + /** + *
+       * enabled indicates the new maintenance mode status after the update.
+       * 
+ * + * bool enabled = 1 [json_name = "enabled"]; + * @param value The enabled to set. + * @return This builder for chaining. + */ + public Builder setEnabled(boolean value) { + + enabled_ = value; + bitField0_ |= 0x00000001; + onChanged(); + return this; + } + /** + *
+       * enabled indicates the new maintenance mode status after the update.
+       * 
+ * + * bool enabled = 1 [json_name = "enabled"]; + * @return This builder for chaining. + */ + public Builder clearEnabled() { + bitField0_ = (bitField0_ & ~0x00000001); + enabled_ = false; + onChanged(); + return this; + } + + // @@protoc_insertion_point(builder_scope:gitpod.v1.SetOrganizationMaintenanceModeResponse) + } + + // @@protoc_insertion_point(class_scope:gitpod.v1.SetOrganizationMaintenanceModeResponse) + private static final io.gitpod.publicapi.v1.OrganizationOuterClass.SetOrganizationMaintenanceModeResponse DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new io.gitpod.publicapi.v1.OrganizationOuterClass.SetOrganizationMaintenanceModeResponse(); + } + + public static io.gitpod.publicapi.v1.OrganizationOuterClass.SetOrganizationMaintenanceModeResponse getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + private static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { + @java.lang.Override + public SetOrganizationMaintenanceModeResponse parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + Builder builder = newBuilder(); + try { + builder.mergeFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(builder.buildPartial()); + } catch (com.google.protobuf.UninitializedMessageException e) { + throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial()); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException(e) + .setUnfinishedMessage(builder.buildPartial()); + } + return builder.buildPartial(); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public io.gitpod.publicapi.v1.OrganizationOuterClass.SetOrganizationMaintenanceModeResponse getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + private static final com.google.protobuf.Descriptors.Descriptor internal_static_gitpod_v1_Organization_descriptor; private static final @@ -31528,6 +33623,26 @@ public io.gitpod.publicapi.v1.OrganizationOuterClass.DeleteOrganizationMemberRes private static final com.google.protobuf.GeneratedMessage.FieldAccessorTable internal_static_gitpod_v1_DeleteOrganizationMemberResponse_fieldAccessorTable; + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_gitpod_v1_GetOrganizationMaintenanceModeRequest_descriptor; + private static final + com.google.protobuf.GeneratedMessage.FieldAccessorTable + internal_static_gitpod_v1_GetOrganizationMaintenanceModeRequest_fieldAccessorTable; + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_gitpod_v1_GetOrganizationMaintenanceModeResponse_descriptor; + private static final + com.google.protobuf.GeneratedMessage.FieldAccessorTable + internal_static_gitpod_v1_GetOrganizationMaintenanceModeResponse_fieldAccessorTable; + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_gitpod_v1_SetOrganizationMaintenanceModeRequest_descriptor; + private static final + com.google.protobuf.GeneratedMessage.FieldAccessorTable + internal_static_gitpod_v1_SetOrganizationMaintenanceModeRequest_fieldAccessorTable; + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_gitpod_v1_SetOrganizationMaintenanceModeResponse_descriptor; + private static final + com.google.protobuf.GeneratedMessage.FieldAccessorTable + internal_static_gitpod_v1_SetOrganizationMaintenanceModeResponse_fieldAccessorTable; public static com.google.protobuf.Descriptors.FileDescriptor getDescriptor() { @@ -31708,56 +33823,71 @@ public io.gitpod.publicapi.v1.OrganizationOuterClass.DeleteOrganizationMemberRes "leteOrganizationMemberRequest\022\'\n\017organiz" + "ation_id\030\001 \001(\tR\016organizationId\022\027\n\007user_i" + "d\030\002 \001(\tR\006userId\"\"\n DeleteOrganizationMem" + - "berResponse*\224\001\n\020OrganizationRole\022!\n\035ORGA" + - "NIZATION_ROLE_UNSPECIFIED\020\000\022\033\n\027ORGANIZAT" + - "ION_ROLE_OWNER\020\001\022\034\n\030ORGANIZATION_ROLE_ME" + - "MBER\020\002\022\"\n\036ORGANIZATION_ROLE_COLLABORATOR" + - "\020\003*t\n\026OrganizationPermission\022\'\n#ORGANIZA" + - "TION_PERMISSION_UNSPECIFIED\020\000\0221\n-ORGANIZ" + - "ATION_PERMISSION_START_ARBITRARY_REPOS\020\001" + - "2\276\014\n\023OrganizationService\022c\n\022CreateOrgani" + - "zation\022$.gitpod.v1.CreateOrganizationReq" + - "uest\032%.gitpod.v1.CreateOrganizationRespo" + - "nse\"\000\022Z\n\017GetOrganization\022!.gitpod.v1.Get" + - "OrganizationRequest\032\".gitpod.v1.GetOrgan" + - "izationResponse\"\000\022c\n\022UpdateOrganization\022" + - "$.gitpod.v1.UpdateOrganizationRequest\032%." + - "gitpod.v1.UpdateOrganizationResponse\"\000\022`" + - "\n\021ListOrganizations\022#.gitpod.v1.ListOrga" + - "nizationsRequest\032$.gitpod.v1.ListOrganiz" + - "ationsResponse\"\000\022c\n\022DeleteOrganization\022$" + - ".gitpod.v1.DeleteOrganizationRequest\032%.g" + - "itpod.v1.DeleteOrganizationResponse\"\000\022x\n" + - "\031GetOrganizationInvitation\022+.gitpod.v1.G" + - "etOrganizationInvitationRequest\032,.gitpod" + - ".v1.GetOrganizationInvitationResponse\"\000\022" + - "]\n\020JoinOrganization\022\".gitpod.v1.JoinOrga" + - "nizationRequest\032#.gitpod.v1.JoinOrganiza" + - "tionResponse\"\000\022~\n\033ResetOrganizationInvit" + - "ation\022-.gitpod.v1.ResetOrganizationInvit" + - "ationRequest\032..gitpod.v1.ResetOrganizati" + - "onInvitationResponse\"\000\022r\n\027ListOrganizati" + - "onMembers\022).gitpod.v1.ListOrganizationMe" + - "mbersRequest\032*.gitpod.v1.ListOrganizatio" + - "nMembersResponse\"\000\022u\n\030UpdateOrganization" + - "Member\022*.gitpod.v1.UpdateOrganizationMem" + - "berRequest\032+.gitpod.v1.UpdateOrganizatio" + - "nMemberResponse\"\000\022u\n\030DeleteOrganizationM" + - "ember\022*.gitpod.v1.DeleteOrganizationMemb" + - "erRequest\032+.gitpod.v1.DeleteOrganization" + - "MemberResponse\"\000\022r\n\027GetOrganizationSetti" + - "ngs\022).gitpod.v1.GetOrganizationSettingsR" + - "equest\032*.gitpod.v1.GetOrganizationSettin" + - "gsResponse\"\000\022{\n\032UpdateOrganizationSettin" + - "gs\022,.gitpod.v1.UpdateOrganizationSetting" + - "sRequest\032-.gitpod.v1.UpdateOrganizationS" + - "ettingsResponse\"\000\022\215\001\n ListOrganizationWo" + - "rkspaceClasses\0222.gitpod.v1.ListOrganizat" + - "ionWorkspaceClassesRequest\0323.gitpod.v1.L" + - "istOrganizationWorkspaceClassesResponse\"" + - "\000BQ\n\026io.gitpod.publicapi.v1Z7github.com/" + - "gitpod-io/gitpod/components/public-api/g" + - "o/v1b\006proto3" + "berResponse\"P\n%GetOrganizationMaintenanc" + + "eModeRequest\022\'\n\017organization_id\030\001 \001(\tR\016o" + + "rganizationId\"B\n&GetOrganizationMaintena" + + "nceModeResponse\022\030\n\007enabled\030\001 \001(\010R\007enable" + + "d\"j\n%SetOrganizationMaintenanceModeReque" + + "st\022\'\n\017organization_id\030\001 \001(\tR\016organizatio" + + "nId\022\030\n\007enabled\030\002 \001(\010R\007enabled\"B\n&SetOrga" + + "nizationMaintenanceModeResponse\022\030\n\007enabl" + + "ed\030\001 \001(\010R\007enabled*\224\001\n\020OrganizationRole\022!" + + "\n\035ORGANIZATION_ROLE_UNSPECIFIED\020\000\022\033\n\027ORG" + + "ANIZATION_ROLE_OWNER\020\001\022\034\n\030ORGANIZATION_R" + + "OLE_MEMBER\020\002\022\"\n\036ORGANIZATION_ROLE_COLLAB" + + "ORATOR\020\003*t\n\026OrganizationPermission\022\'\n#OR" + + "GANIZATION_PERMISSION_UNSPECIFIED\020\000\0221\n-O" + + "RGANIZATION_PERMISSION_START_ARBITRARY_R" + + "EPOS\020\0012\322\016\n\023OrganizationService\022c\n\022Create" + + "Organization\022$.gitpod.v1.CreateOrganizat" + + "ionRequest\032%.gitpod.v1.CreateOrganizatio" + + "nResponse\"\000\022Z\n\017GetOrganization\022!.gitpod." + + "v1.GetOrganizationRequest\032\".gitpod.v1.Ge" + + "tOrganizationResponse\"\000\022c\n\022UpdateOrganiz" + + "ation\022$.gitpod.v1.UpdateOrganizationRequ" + + "est\032%.gitpod.v1.UpdateOrganizationRespon" + + "se\"\000\022`\n\021ListOrganizations\022#.gitpod.v1.Li" + + "stOrganizationsRequest\032$.gitpod.v1.ListO" + + "rganizationsResponse\"\000\022c\n\022DeleteOrganiza" + + "tion\022$.gitpod.v1.DeleteOrganizationReque" + + "st\032%.gitpod.v1.DeleteOrganizationRespons" + + "e\"\000\022x\n\031GetOrganizationInvitation\022+.gitpo" + + "d.v1.GetOrganizationInvitationRequest\032,." + + "gitpod.v1.GetOrganizationInvitationRespo" + + "nse\"\000\022]\n\020JoinOrganization\022\".gitpod.v1.Jo" + + "inOrganizationRequest\032#.gitpod.v1.JoinOr" + + "ganizationResponse\"\000\022~\n\033ResetOrganizatio" + + "nInvitation\022-.gitpod.v1.ResetOrganizatio" + + "nInvitationRequest\032..gitpod.v1.ResetOrga" + + "nizationInvitationResponse\"\000\022r\n\027ListOrga" + + "nizationMembers\022).gitpod.v1.ListOrganiza" + + "tionMembersRequest\032*.gitpod.v1.ListOrgan" + + "izationMembersResponse\"\000\022u\n\030UpdateOrgani" + + "zationMember\022*.gitpod.v1.UpdateOrganizat" + + "ionMemberRequest\032+.gitpod.v1.UpdateOrgan" + + "izationMemberResponse\"\000\022u\n\030DeleteOrganiz" + + "ationMember\022*.gitpod.v1.DeleteOrganizati" + + "onMemberRequest\032+.gitpod.v1.DeleteOrgani" + + "zationMemberResponse\"\000\022r\n\027GetOrganizatio" + + "nSettings\022).gitpod.v1.GetOrganizationSet" + + "tingsRequest\032*.gitpod.v1.GetOrganization" + + "SettingsResponse\"\000\022{\n\032UpdateOrganization" + + "Settings\022,.gitpod.v1.UpdateOrganizationS" + + "ettingsRequest\032-.gitpod.v1.UpdateOrganiz" + + "ationSettingsResponse\"\000\022\215\001\n ListOrganiza" + + "tionWorkspaceClasses\0222.gitpod.v1.ListOrg" + + "anizationWorkspaceClassesRequest\0323.gitpo" + + "d.v1.ListOrganizationWorkspaceClassesRes" + + "ponse\"\000\022\207\001\n\036GetOrganizationMaintenanceMo" + + "de\0220.gitpod.v1.GetOrganizationMaintenanc" + + "eModeRequest\0321.gitpod.v1.GetOrganization" + + "MaintenanceModeResponse\"\000\022\207\001\n\036SetOrganiz" + + "ationMaintenanceMode\0220.gitpod.v1.SetOrga" + + "nizationMaintenanceModeRequest\0321.gitpod." + + "v1.SetOrganizationMaintenanceModeRespons" + + "e\"\000BQ\n\026io.gitpod.publicapi.v1Z7github.co" + + "m/gitpod-io/gitpod/components/public-api" + + "/go/v1b\006proto3" }; descriptor = com.google.protobuf.Descriptors.FileDescriptor .internalBuildGeneratedFileFrom(descriptorData, @@ -31989,6 +34119,30 @@ public io.gitpod.publicapi.v1.OrganizationOuterClass.DeleteOrganizationMemberRes com.google.protobuf.GeneratedMessage.FieldAccessorTable( internal_static_gitpod_v1_DeleteOrganizationMemberResponse_descriptor, new java.lang.String[] { }); + internal_static_gitpod_v1_GetOrganizationMaintenanceModeRequest_descriptor = + getDescriptor().getMessageTypes().get(34); + internal_static_gitpod_v1_GetOrganizationMaintenanceModeRequest_fieldAccessorTable = new + com.google.protobuf.GeneratedMessage.FieldAccessorTable( + internal_static_gitpod_v1_GetOrganizationMaintenanceModeRequest_descriptor, + new java.lang.String[] { "OrganizationId", }); + internal_static_gitpod_v1_GetOrganizationMaintenanceModeResponse_descriptor = + getDescriptor().getMessageTypes().get(35); + internal_static_gitpod_v1_GetOrganizationMaintenanceModeResponse_fieldAccessorTable = new + com.google.protobuf.GeneratedMessage.FieldAccessorTable( + internal_static_gitpod_v1_GetOrganizationMaintenanceModeResponse_descriptor, + new java.lang.String[] { "Enabled", }); + internal_static_gitpod_v1_SetOrganizationMaintenanceModeRequest_descriptor = + getDescriptor().getMessageTypes().get(36); + internal_static_gitpod_v1_SetOrganizationMaintenanceModeRequest_fieldAccessorTable = new + com.google.protobuf.GeneratedMessage.FieldAccessorTable( + internal_static_gitpod_v1_SetOrganizationMaintenanceModeRequest_descriptor, + new java.lang.String[] { "OrganizationId", "Enabled", }); + internal_static_gitpod_v1_SetOrganizationMaintenanceModeResponse_descriptor = + getDescriptor().getMessageTypes().get(37); + internal_static_gitpod_v1_SetOrganizationMaintenanceModeResponse_fieldAccessorTable = new + com.google.protobuf.GeneratedMessage.FieldAccessorTable( + internal_static_gitpod_v1_SetOrganizationMaintenanceModeResponse_descriptor, + new java.lang.String[] { "Enabled", }); descriptor.resolveAllFeaturesImmutable(); io.gitpod.publicapi.v1.Pagination.getDescriptor(); io.gitpod.publicapi.v1.WorkspaceOuterClass.getDescriptor(); diff --git a/components/public-api/java/src/main/java/io/gitpod/publicapi/v1/OrganizationServiceClient.kt b/components/public-api/java/src/main/java/io/gitpod/publicapi/v1/OrganizationServiceClient.kt index 72e3147b9f0296..c8ef0c07f32192 100644 --- a/components/public-api/java/src/main/java/io/gitpod/publicapi/v1/OrganizationServiceClient.kt +++ b/components/public-api/java/src/main/java/io/gitpod/publicapi/v1/OrganizationServiceClient.kt @@ -265,4 +265,40 @@ public class OrganizationServiceClient( ), ) + + /** + * GetOrganizationMaintenanceMode retrieves the maintenance mode status for an organization. + */ + override suspend + fun getOrganizationMaintenanceMode(request: OrganizationOuterClass.GetOrganizationMaintenanceModeRequest, + headers: Headers): + ResponseMessage = client.unary( + request, + headers, + MethodSpec( + "gitpod.v1.OrganizationService/GetOrganizationMaintenanceMode", + io.gitpod.publicapi.v1.OrganizationOuterClass.GetOrganizationMaintenanceModeRequest::class, + io.gitpod.publicapi.v1.OrganizationOuterClass.GetOrganizationMaintenanceModeResponse::class, + StreamType.UNARY, + ), + ) + + + /** + * SetOrganizationMaintenanceMode sets the maintenance mode status for an organization. + */ + override suspend + fun setOrganizationMaintenanceMode(request: OrganizationOuterClass.SetOrganizationMaintenanceModeRequest, + headers: Headers): + ResponseMessage = client.unary( + request, + headers, + MethodSpec( + "gitpod.v1.OrganizationService/SetOrganizationMaintenanceMode", + io.gitpod.publicapi.v1.OrganizationOuterClass.SetOrganizationMaintenanceModeRequest::class, + io.gitpod.publicapi.v1.OrganizationOuterClass.SetOrganizationMaintenanceModeResponse::class, + StreamType.UNARY, + ), + ) + } diff --git a/components/public-api/java/src/main/java/io/gitpod/publicapi/v1/OrganizationServiceClientInterface.kt b/components/public-api/java/src/main/java/io/gitpod/publicapi/v1/OrganizationServiceClientInterface.kt index 2e300be9b8cbc5..ae24245dd4e40c 100644 --- a/components/public-api/java/src/main/java/io/gitpod/publicapi/v1/OrganizationServiceClientInterface.kt +++ b/components/public-api/java/src/main/java/io/gitpod/publicapi/v1/OrganizationServiceClientInterface.kt @@ -119,4 +119,20 @@ public interface OrganizationServiceClientInterface { fun listOrganizationWorkspaceClasses(request: OrganizationOuterClass.ListOrganizationWorkspaceClassesRequest, headers: Headers = emptyMap()): ResponseMessage + + /** + * GetOrganizationMaintenanceMode retrieves the maintenance mode status for an organization. + */ + public suspend + fun getOrganizationMaintenanceMode(request: OrganizationOuterClass.GetOrganizationMaintenanceModeRequest, + headers: Headers = emptyMap()): + ResponseMessage + + /** + * SetOrganizationMaintenanceMode sets the maintenance mode status for an organization. + */ + public suspend + fun setOrganizationMaintenanceMode(request: OrganizationOuterClass.SetOrganizationMaintenanceModeRequest, + headers: Headers = emptyMap()): + ResponseMessage } diff --git a/components/public-api/typescript/src/gitpod/v1/organization_connect.ts b/components/public-api/typescript/src/gitpod/v1/organization_connect.ts index c3b818358c6a44..b975c44875f441 100644 --- a/components/public-api/typescript/src/gitpod/v1/organization_connect.ts +++ b/components/public-api/typescript/src/gitpod/v1/organization_connect.ts @@ -9,7 +9,7 @@ /* eslint-disable */ // @ts-nocheck -import { CreateOrganizationRequest, CreateOrganizationResponse, DeleteOrganizationMemberRequest, DeleteOrganizationMemberResponse, DeleteOrganizationRequest, DeleteOrganizationResponse, GetOrganizationInvitationRequest, GetOrganizationInvitationResponse, GetOrganizationRequest, GetOrganizationResponse, GetOrganizationSettingsRequest, GetOrganizationSettingsResponse, JoinOrganizationRequest, JoinOrganizationResponse, ListOrganizationMembersRequest, ListOrganizationMembersResponse, ListOrganizationsRequest, ListOrganizationsResponse, ListOrganizationWorkspaceClassesRequest, ListOrganizationWorkspaceClassesResponse, ResetOrganizationInvitationRequest, ResetOrganizationInvitationResponse, UpdateOrganizationMemberRequest, UpdateOrganizationMemberResponse, UpdateOrganizationRequest, UpdateOrganizationResponse, UpdateOrganizationSettingsRequest, UpdateOrganizationSettingsResponse } from "./organization_pb.js"; +import { CreateOrganizationRequest, CreateOrganizationResponse, DeleteOrganizationMemberRequest, DeleteOrganizationMemberResponse, DeleteOrganizationRequest, DeleteOrganizationResponse, GetOrganizationInvitationRequest, GetOrganizationInvitationResponse, GetOrganizationMaintenanceModeRequest, GetOrganizationMaintenanceModeResponse, GetOrganizationRequest, GetOrganizationResponse, GetOrganizationSettingsRequest, GetOrganizationSettingsResponse, JoinOrganizationRequest, JoinOrganizationResponse, ListOrganizationMembersRequest, ListOrganizationMembersResponse, ListOrganizationsRequest, ListOrganizationsResponse, ListOrganizationWorkspaceClassesRequest, ListOrganizationWorkspaceClassesResponse, ResetOrganizationInvitationRequest, ResetOrganizationInvitationResponse, SetOrganizationMaintenanceModeRequest, SetOrganizationMaintenanceModeResponse, UpdateOrganizationMemberRequest, UpdateOrganizationMemberResponse, UpdateOrganizationRequest, UpdateOrganizationResponse, UpdateOrganizationSettingsRequest, UpdateOrganizationSettingsResponse } from "./organization_pb.js"; import { MethodKind } from "@bufbuild/protobuf"; /** @@ -174,5 +174,27 @@ export const OrganizationService = { O: ListOrganizationWorkspaceClassesResponse, kind: MethodKind.Unary, }, + /** + * GetOrganizationMaintenanceMode retrieves the maintenance mode status for an organization. + * + * @generated from rpc gitpod.v1.OrganizationService.GetOrganizationMaintenanceMode + */ + getOrganizationMaintenanceMode: { + name: "GetOrganizationMaintenanceMode", + I: GetOrganizationMaintenanceModeRequest, + O: GetOrganizationMaintenanceModeResponse, + kind: MethodKind.Unary, + }, + /** + * SetOrganizationMaintenanceMode sets the maintenance mode status for an organization. + * + * @generated from rpc gitpod.v1.OrganizationService.SetOrganizationMaintenanceMode + */ + setOrganizationMaintenanceMode: { + name: "SetOrganizationMaintenanceMode", + I: SetOrganizationMaintenanceModeRequest, + O: SetOrganizationMaintenanceModeResponse, + kind: MethodKind.Unary, + }, } } as const; diff --git a/components/public-api/typescript/src/gitpod/v1/organization_pb.ts b/components/public-api/typescript/src/gitpod/v1/organization_pb.ts index 84f2a18d29dd19..8e29c7c3718c54 100644 --- a/components/public-api/typescript/src/gitpod/v1/organization_pb.ts +++ b/components/public-api/typescript/src/gitpod/v1/organization_pb.ts @@ -1835,3 +1835,167 @@ export class DeleteOrganizationMemberResponse extends Message { + /** + * organization_id is the ID of the organization to retrieve the maintenance mode status for. + * + * @generated from field: string organization_id = 1; + */ + organizationId = ""; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "gitpod.v1.GetOrganizationMaintenanceModeRequest"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "organization_id", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): GetOrganizationMaintenanceModeRequest { + return new GetOrganizationMaintenanceModeRequest().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): GetOrganizationMaintenanceModeRequest { + return new GetOrganizationMaintenanceModeRequest().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): GetOrganizationMaintenanceModeRequest { + return new GetOrganizationMaintenanceModeRequest().fromJsonString(jsonString, options); + } + + static equals(a: GetOrganizationMaintenanceModeRequest | PlainMessage | undefined, b: GetOrganizationMaintenanceModeRequest | PlainMessage | undefined): boolean { + return proto3.util.equals(GetOrganizationMaintenanceModeRequest, a, b); + } +} + +/** + * @generated from message gitpod.v1.GetOrganizationMaintenanceModeResponse + */ +export class GetOrganizationMaintenanceModeResponse extends Message { + /** + * enabled indicates whether maintenance mode is enabled for the organization. + * + * @generated from field: bool enabled = 1; + */ + enabled = false; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "gitpod.v1.GetOrganizationMaintenanceModeResponse"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "enabled", kind: "scalar", T: 8 /* ScalarType.BOOL */ }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): GetOrganizationMaintenanceModeResponse { + return new GetOrganizationMaintenanceModeResponse().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): GetOrganizationMaintenanceModeResponse { + return new GetOrganizationMaintenanceModeResponse().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): GetOrganizationMaintenanceModeResponse { + return new GetOrganizationMaintenanceModeResponse().fromJsonString(jsonString, options); + } + + static equals(a: GetOrganizationMaintenanceModeResponse | PlainMessage | undefined, b: GetOrganizationMaintenanceModeResponse | PlainMessage | undefined): boolean { + return proto3.util.equals(GetOrganizationMaintenanceModeResponse, a, b); + } +} + +/** + * @generated from message gitpod.v1.SetOrganizationMaintenanceModeRequest + */ +export class SetOrganizationMaintenanceModeRequest extends Message { + /** + * organization_id is the ID of the organization to set the maintenance mode status for. + * + * @generated from field: string organization_id = 1; + */ + organizationId = ""; + + /** + * enabled indicates whether maintenance mode should be enabled or disabled. + * + * @generated from field: bool enabled = 2; + */ + enabled = false; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "gitpod.v1.SetOrganizationMaintenanceModeRequest"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "organization_id", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + { no: 2, name: "enabled", kind: "scalar", T: 8 /* ScalarType.BOOL */ }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): SetOrganizationMaintenanceModeRequest { + return new SetOrganizationMaintenanceModeRequest().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): SetOrganizationMaintenanceModeRequest { + return new SetOrganizationMaintenanceModeRequest().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): SetOrganizationMaintenanceModeRequest { + return new SetOrganizationMaintenanceModeRequest().fromJsonString(jsonString, options); + } + + static equals(a: SetOrganizationMaintenanceModeRequest | PlainMessage | undefined, b: SetOrganizationMaintenanceModeRequest | PlainMessage | undefined): boolean { + return proto3.util.equals(SetOrganizationMaintenanceModeRequest, a, b); + } +} + +/** + * @generated from message gitpod.v1.SetOrganizationMaintenanceModeResponse + */ +export class SetOrganizationMaintenanceModeResponse extends Message { + /** + * enabled indicates the new maintenance mode status after the update. + * + * @generated from field: bool enabled = 1; + */ + enabled = false; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "gitpod.v1.SetOrganizationMaintenanceModeResponse"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "enabled", kind: "scalar", T: 8 /* ScalarType.BOOL */ }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): SetOrganizationMaintenanceModeResponse { + return new SetOrganizationMaintenanceModeResponse().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): SetOrganizationMaintenanceModeResponse { + return new SetOrganizationMaintenanceModeResponse().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): SetOrganizationMaintenanceModeResponse { + return new SetOrganizationMaintenanceModeResponse().fromJsonString(jsonString, options); + } + + static equals(a: SetOrganizationMaintenanceModeResponse | PlainMessage | undefined, b: SetOrganizationMaintenanceModeResponse | PlainMessage | undefined): boolean { + return proto3.util.equals(SetOrganizationMaintenanceModeResponse, a, b); + } +} diff --git a/components/server/src/api/organization-service-api.ts b/components/server/src/api/organization-service-api.ts index 15e4f6558064de..3ceec9dc7c0453 100644 --- a/components/server/src/api/organization-service-api.ts +++ b/components/server/src/api/organization-service-api.ts @@ -16,27 +16,31 @@ import { DeleteOrganizationResponse, GetOrganizationInvitationRequest, GetOrganizationInvitationResponse, + GetOrganizationMaintenanceModeRequest, + GetOrganizationMaintenanceModeResponse, GetOrganizationRequest, GetOrganizationResponse, + GetOrganizationSettingsRequest, + GetOrganizationSettingsResponse, JoinOrganizationRequest, JoinOrganizationResponse, ListOrganizationMembersRequest, ListOrganizationMembersResponse, ListOrganizationsRequest, + ListOrganizationsRequest_Scope, ListOrganizationsResponse, + ListOrganizationWorkspaceClassesRequest, + ListOrganizationWorkspaceClassesResponse, ResetOrganizationInvitationRequest, ResetOrganizationInvitationResponse, - UpdateOrganizationRequest, - UpdateOrganizationResponse, + SetOrganizationMaintenanceModeRequest, + SetOrganizationMaintenanceModeResponse, UpdateOrganizationMemberRequest, UpdateOrganizationMemberResponse, - GetOrganizationSettingsRequest, - GetOrganizationSettingsResponse, + UpdateOrganizationRequest, + UpdateOrganizationResponse, UpdateOrganizationSettingsRequest, UpdateOrganizationSettingsResponse, - ListOrganizationsRequest_Scope, - ListOrganizationWorkspaceClassesRequest, - ListOrganizationWorkspaceClassesResponse, } from "@gitpod/public-api/lib/gitpod/v1/organization_pb"; import { PublicAPIConverter } from "@gitpod/public-api-common/lib/public-api-converter"; import { OrganizationService } from "../orgs/organization-service"; @@ -313,4 +317,32 @@ export class OrganizationServiceAPI implements ServiceImpl { + if (!uuidValidate(req.organizationId)) { + throw new ApplicationError(ErrorCodes.BAD_REQUEST, "organizationId is required"); + } + + const enabled = await this.orgService.getMaintenanceMode(ctxUserId(), req.organizationId); + return new GetOrganizationMaintenanceModeResponse({ + enabled, + }); + } + + async setOrganizationMaintenanceMode( + req: SetOrganizationMaintenanceModeRequest, + _: HandlerContext, + ): Promise { + if (!uuidValidate(req.organizationId)) { + throw new ApplicationError(ErrorCodes.BAD_REQUEST, "organizationId is required"); + } + + const enabled = await this.orgService.setMaintenanceMode(ctxUserId(), req.organizationId, req.enabled); + return new SetOrganizationMaintenanceModeResponse({ + enabled, + }); + } } diff --git a/components/server/src/authorization/definitions.ts b/components/server/src/authorization/definitions.ts index 1a2861c423c879..5355afd9d4b80b 100644 --- a/components/server/src/authorization/definitions.ts +++ b/components/server/src/authorization/definitions.ts @@ -68,6 +68,7 @@ export type OrganizationPermission = | "read_env_var" | "write_env_var" | "read_audit_logs" + | "maintenance" | "read_members" | "invite_members" | "write_members" diff --git a/components/server/src/orgs/organization-service.ts b/components/server/src/orgs/organization-service.ts index c99004418263ab..cdaba03afa84d9 100644 --- a/components/server/src/orgs/organization-service.ts +++ b/components/server/src/orgs/organization-service.ts @@ -145,7 +145,7 @@ export class OrganizationService { async updateOrganization( userId: string, orgId: string, - changes: Pick, + changes: Partial>, ): Promise { await this.auth.checkPermissionOnOrganization(userId, "write_info", orgId); return this.teamDB.updateTeam(orgId, changes); @@ -766,4 +766,54 @@ export class OrganizationService { } return allClasses; } + + /** + * Gets the maintenance mode status for an organization. + * + * @param userId The ID of the user making the request + * @param orgId The ID of the organization + * @returns A boolean indicating whether maintenance mode is enabled + */ + public async getMaintenanceMode(userId: string, orgId: string): Promise { + // Using write_settings permission as it's available to owners and installation admins + await this.auth.checkPermissionOnOrganization(userId, "write_settings", orgId); + + const team = await this.teamDB.findTeamById(orgId); + if (!team) { + throw new ApplicationError(ErrorCodes.NOT_FOUND, `Organization ${orgId} not found`); + } + + return !!team.maintenanceMode; + } + + /** + * Sets the maintenance mode status for an organization. + * + * @param userId The ID of the user making the request + * @param orgId The ID of the organization + * @param enabled Whether maintenance mode should be enabled + * @returns A boolean indicating the new maintenance mode status + */ + public async setMaintenanceMode(userId: string, orgId: string, enabled: boolean): Promise { + // Using write_settings permission as it's available to owners and installation admins + await this.auth.checkPermissionOnOrganization(userId, "write_settings", orgId); + + const team = await this.teamDB.findTeamById(orgId); + if (!team) { + throw new ApplicationError(ErrorCodes.NOT_FOUND, `Organization ${orgId} not found`); + } + + await this.teamDB.updateTeam(orgId, { maintenanceMode: enabled }); + + // Track the maintenance mode change + this.analytics.track({ + userId, + event: enabled ? "maintenance_mode_enabled" : "maintenance_mode_disabled", + properties: { + organization_id: orgId, + }, + }); + + return enabled; + } } diff --git a/components/server/src/prometheus-metrics.ts b/components/server/src/prometheus-metrics.ts index 6f1d6e5ad211c2..d8bb739aa92b5b 100644 --- a/components/server/src/prometheus-metrics.ts +++ b/components/server/src/prometheus-metrics.ts @@ -208,6 +208,7 @@ export type FailedInstanceStartReason = | "scmAccessFailed" | "resourceExhausted" | "workspaceClusterMaintenance" + | "maintenanceMode" | "other"; export function increaseFailedInstanceStartCounter(reason: FailedInstanceStartReason) { instanceStartsFailedTotal.inc({ reason }); diff --git a/components/server/src/workspace/gitpod-server-impl.ts b/components/server/src/workspace/gitpod-server-impl.ts index f8dbafef14d95d..11baa497cb2f09 100644 --- a/components/server/src/workspace/gitpod-server-impl.ts +++ b/components/server/src/workspace/gitpod-server-impl.ts @@ -1391,8 +1391,12 @@ export class GitpodServerImpl implements GitpodServerWithTracing, Disposable { return this.organizationService.getOrganization(user.id, teamId); } - public async updateTeam(ctx: TraceContext, teamId: string, team: Pick): Promise { - traceAPIParams(ctx, { teamId }); + public async updateTeam( + ctx: TraceContext, + teamId: string, + team: Partial>, + ): Promise { + traceAPIParams(ctx, { teamId, team }); const user = await this.checkUser("updateTeam"); await this.guardTeamOperation(teamId, "update"); diff --git a/components/server/src/workspace/workspace-starter.ts b/components/server/src/workspace/workspace-starter.ts index ae9fb0805092e0..5330c27fec79bd 100644 --- a/components/server/src/workspace/workspace-starter.ts +++ b/components/server/src/workspace/workspace-starter.ts @@ -590,6 +590,33 @@ export class WorkspaceStarter { } } + /** + * Checks if the organization is in maintenance mode and if the user has permission to bypass it. + * + * @param user The user trying to start the workspace + * @param workspace The workspace to be started + * @throws ApplicationError if the organization is in maintenance mode and the user doesn't have permission to bypass it + */ + private async checkMaintenanceMode(user: User, workspace: Workspace): Promise { + if (!workspace.organizationId) { + return; + } + + // Get the organization's maintenance mode status + const org = await this.orgService.getOrganization(user.id, workspace.organizationId); + if (!org.maintenanceMode) { + throw new StartInstanceError( + "maintenanceMode", + new Error( + "Cannot start workspace: The organization is currently in maintenance mode. Please try again later or contact your organization administrator.", + ), + ); + // throw new ApplicationError( + // ErrorCodes.PRECONDITION_FAILED, + // ); + } + } + // Note: this function does not expect to be awaited for by its caller. This means that it takes care of error handling itself. private async actuallyStartWorkspace( ctx: TraceContext, @@ -631,6 +658,9 @@ export class WorkspaceStarter { } } + // check maintenance mode: throw application error if the organization is in maintenance mode + await this.checkMaintenanceMode(user, workspace); + // build workspace image const additionalAuth = envVars.gitpodImageAuth || new Map(); instance = await this.buildWorkspaceImage( diff --git a/components/spicedb/schema/schema.yaml b/components/spicedb/schema/schema.yaml index c00546cf6eadc0..4261c996db0b01 100644 --- a/components/spicedb/schema/schema.yaml +++ b/components/spicedb/schema/schema.yaml @@ -80,6 +80,9 @@ schema: |- permission read_audit_logs = owner + installation->admin + // Maintenance mode permission + permission maintenance = owner + installation->admin + // Operations on Organization's Members permission read_members = member + owner + installation->admin permission invite_members = member + owner + installation->admin @@ -143,7 +146,7 @@ schema: |- // Note: All of this is modelled after current behavior. // There are a lot of improvements we can make here in the light of Organizations, but we explicitly do that as a separate step permission start = owner - permission stop = owner + org->installation_admin + permission stop = owner + org->installation_admin + org->owner permission delete = owner // Whether a user can read basic info/metadata of a workspace From d73be97f243ed2a922b347650dd831044994bbe2 Mon Sep 17 00:00:00 2001 From: Gero Posmyk-Leinemann Date: Wed, 14 May 2025 11:28:22 +0000 Subject: [PATCH 03/12] [public-api, db, server, dashboard] Introduce MaintenanceNofitication banner that can be configured per org --- components/dashboard/src/AppNotifications.tsx | 4 +- .../data/maintenance-notification-query.ts | 77 + .../dashboard/src/org-admin/AdminPage.tsx | 2 + .../MaintenanceModeBanner.tsx | 2 +- .../org-admin/MaintenanceNotificationCard.tsx | 143 + .../org-admin/ScheduledMaintenanceBanner.tsx | 33 + .../service/json-rpc-organization-client.ts | 41 +- components/gitpod-db/src/team-db.ts | 5 +- .../gitpod-db/src/typeorm/entity/db-team.ts | 5 +- ...000000-AddMaintenanceNotificationToTeam.ts | 17 + .../gitpod-db/src/typeorm/team-db-impl.ts | 13 +- .../gitpod-protocol/src/gitpod-service.ts | 5 +- .../src/teams-projects-protocol.ts | 5 + .../public-api/gitpod/v1/organization.proto | 40 + .../public-api/go/v1/organization.pb.go | 682 +++- .../public-api/go/v1/organization_grpc.pb.go | 76 + .../go/v1/v1connect/organization.connect.go | 48 + .../v1connect/organization.proxy.connect.go | 20 + .../publicapi/v1/OrganizationOuterClass.java | 2924 ++++++++++++++++- .../publicapi/v1/OrganizationServiceClient.kt | 37 + .../v1/OrganizationServiceClientInterface.kt | 17 + .../src/gitpod/v1/organization_connect.ts | 24 +- .../src/gitpod/v1/organization_pb.ts | 190 ++ .../src/api/organization-service-api.ts | 40 + .../server/src/orgs/organization-service.ts | 65 +- 25 files changed, 4273 insertions(+), 242 deletions(-) create mode 100644 components/dashboard/src/data/maintenance-notification-query.ts rename components/dashboard/src/{components => org-admin}/MaintenanceModeBanner.tsx (95%) create mode 100644 components/dashboard/src/org-admin/MaintenanceNotificationCard.tsx create mode 100644 components/dashboard/src/org-admin/ScheduledMaintenanceBanner.tsx create mode 100644 components/gitpod-db/src/typeorm/migration/1715694000000-AddMaintenanceNotificationToTeam.ts diff --git a/components/dashboard/src/AppNotifications.tsx b/components/dashboard/src/AppNotifications.tsx index f98a0a19867954..f4633a095dfaba 100644 --- a/components/dashboard/src/AppNotifications.tsx +++ b/components/dashboard/src/AppNotifications.tsx @@ -18,7 +18,8 @@ import { AttributionId } from "@gitpod/gitpod-protocol/lib/attribution"; import { getGitpodService } from "./service/service"; import { useOrgBillingMode } from "./data/billing-mode/org-billing-mode-query"; import { Organization } from "@gitpod/public-api/lib/gitpod/v1/organization_pb"; -import { MaintenanceModeBanner } from "./components/MaintenanceModeBanner"; +import { MaintenanceModeBanner } from "./org-admin/MaintenanceModeBanner"; +import { ScheduledMaintenanceBanner } from "./org-admin/ScheduledMaintenanceBanner"; const KEY_APP_DISMISSED_NOTIFICATIONS = "gitpod-app-notifications-dismissed"; const PRIVACY_POLICY_LAST_UPDATED = "2024-12-03"; @@ -212,6 +213,7 @@ export function AppNotifications() { return (
+ {topNotification && ( ["maintenance-notification", orgId]; + +export const useMaintenanceNotification = () => { + const { data: org } = useCurrentOrg(); + const queryClient = useQueryClient(); + + const { data, isLoading } = useQuery( + maintenanceNotificationQueryKey(org?.id || ""), + async () => { + if (!org?.id) return { enabled: false }; + + try { + const response = await organizationClient.getMaintenanceNotification({ + organizationId: org.id, + }); + return { + enabled: response.isEnabled, + message: response.message, + }; + } catch (error) { + console.error("Failed to fetch maintenance notification settings", error); + return { enabled: false }; + } + }, + { + enabled: !!org?.id, + staleTime: 30 * 1000, // 30 seconds + refetchInterval: 60 * 1000, // 1 minute + }, + ); + + const setMaintenanceNotification = async ( + isEnabled: boolean, + customMessage?: string, + ): Promise => { + if (!org?.id) return { enabled: false, message: "" }; + + try { + const response = await organizationClient.setMaintenanceNotification({ + organizationId: org.id, + isEnabled, + customMessage, + }); + + const result: MaintenanceNotification = { + enabled: response.isEnabled, + message: response.message, + }; + + // Update the cache + queryClient.setQueryData(maintenanceNotificationQueryKey(org.id), result); + + return result; + } catch (error) { + console.error("Failed to set maintenance notification", error); + return { enabled: false }; + } + }; + + return { + isNotificationEnabled: data?.enabled || false, + notificationMessage: data?.message, + isLoading, + setMaintenanceNotification, + }; +}; diff --git a/components/dashboard/src/org-admin/AdminPage.tsx b/components/dashboard/src/org-admin/AdminPage.tsx index 772557bf7e77ff..74df9026f012c4 100644 --- a/components/dashboard/src/org-admin/AdminPage.tsx +++ b/components/dashboard/src/org-admin/AdminPage.tsx @@ -13,6 +13,7 @@ import Header from "../components/Header"; import { SpinnerLoader } from "../components/Loader"; import { RunningWorkspacesCard } from "./RunningWorkspacesCard"; import { MaintenanceModeCard } from "./MaintenanceModeCard"; +import { MaintenanceNotificationCard } from "./MaintenanceNotificationCard"; const AdminPage: React.FC = () => { const history = useHistory(); @@ -54,6 +55,7 @@ const AdminPage: React.FC = () => { {currentOrg && ( <> + diff --git a/components/dashboard/src/components/MaintenanceModeBanner.tsx b/components/dashboard/src/org-admin/MaintenanceModeBanner.tsx similarity index 95% rename from components/dashboard/src/components/MaintenanceModeBanner.tsx rename to components/dashboard/src/org-admin/MaintenanceModeBanner.tsx index abcfb92c0a1240..48b692f00bd997 100644 --- a/components/dashboard/src/components/MaintenanceModeBanner.tsx +++ b/components/dashboard/src/org-admin/MaintenanceModeBanner.tsx @@ -5,7 +5,7 @@ */ import { FC } from "react"; -import Alert from "./Alert"; +import Alert from "../components/Alert"; import { useMaintenanceMode } from "../data/maintenance-mode-query"; export const MaintenanceModeBanner: FC = () => { diff --git a/components/dashboard/src/org-admin/MaintenanceNotificationCard.tsx b/components/dashboard/src/org-admin/MaintenanceNotificationCard.tsx new file mode 100644 index 00000000000000..892d250d9af6f0 --- /dev/null +++ b/components/dashboard/src/org-admin/MaintenanceNotificationCard.tsx @@ -0,0 +1,143 @@ +/** + * Copyright (c) 2025 Gitpod GmbH. All rights reserved. + * Licensed under the GNU Affero General Public License (AGPL). + * See License.AGPL.txt in the project root for license information. + */ + +import { FC, useState, useEffect } from "react"; +import { useToast } from "../components/toasts/Toasts"; +import { Button } from "@podkit/buttons/Button"; +import { useMaintenanceNotification } from "../data/maintenance-notification-query"; +import Alert from "../components/Alert"; + +export const MaintenanceNotificationCard: FC = () => { + const { isNotificationEnabled, notificationMessage, isLoading, setMaintenanceNotification } = + useMaintenanceNotification(); + const [message, setMessage] = useState(notificationMessage); + const [isEditing, setIsEditing] = useState(false); + const toast = useToast(); + + // Update local state when the data from the API changes + useEffect(() => { + setMessage(notificationMessage); + }, [notificationMessage]); + + const toggleNotification = async () => { + try { + const newState = !isNotificationEnabled; + const result = await setMaintenanceNotification(newState, message); + + toast.toast({ + message: `Maintenance notification ${result.enabled ? "enabled" : "disabled"}`, + type: "success", + }); + + setIsEditing(false); + } catch (error) { + console.error("Failed to toggle maintenance notification", error); + toast.toast({ message: "Failed to toggle maintenance notification", type: "error" }); + } + }; + + const saveMessage = async () => { + try { + await setMaintenanceNotification(isNotificationEnabled, message); + + toast.toast({ + message: "Maintenance notification message updated", + type: "success", + }); + + setIsEditing(false); + } catch (error) { + console.error("Failed to update maintenance notification message", error); + toast.toast({ message: "Failed to update maintenance notification message", type: "error" }); + } + }; + + return ( +
+
+
+

+ Scheduled Maintenance Notification +

+

+ Display a notification banner to inform users about upcoming maintenance. +

+
+ +
+ + {/* Message input section */} +
+ + {isEditing ? ( +
+