diff --git a/components/dashboard/src/Login.tsx b/components/dashboard/src/Login.tsx index bd28d0c090365d..45eec5730a495d 100644 --- a/components/dashboard/src/Login.tsx +++ b/components/dashboard/src/Login.tsx @@ -311,10 +311,7 @@ const LoginContent = ({ )) )} - + {errorMessage && } diff --git a/components/dashboard/src/data/featureflag-query.ts b/components/dashboard/src/data/featureflag-query.ts index f9529ebf68a81b..3ef95e7fa6cddb 100644 --- a/components/dashboard/src/data/featureflag-query.ts +++ b/components/dashboard/src/data/featureflag-query.ts @@ -15,13 +15,13 @@ const featureFlags = { // Default to true to enable on gitpod dedicated until ff support is added for dedicated orgGitAuthProviders: true, userGitAuthProviders: false, - enableDedicatedOnboardingFlow: false, // Local SSH feature of VS Code Desktop Extension gitpod_desktop_use_local_ssh_proxy: false, enabledOrbitalDiscoveries: "", repositoryFinderSearch: false, // dummy specified dataops feature, default false dataops: false, + enable_multi_org: false, showBrowserExtensionPromotion: false, enable_experimental_jbtb: false, enabled_configuration_prebuild_full_clone: false, diff --git a/components/dashboard/src/data/installation/default-workspace-image-query.ts b/components/dashboard/src/data/installation/default-workspace-image-query.ts index 1ed3be36fce7e8..6b866b19fb2743 100644 --- a/components/dashboard/src/data/installation/default-workspace-image-query.ts +++ b/components/dashboard/src/data/installation/default-workspace-image-query.ts @@ -17,3 +17,14 @@ export const useInstallationDefaultWorkspaceImageQuery = () => { }, }); }; + +export const useInstallationConfiguration = () => { + return useQuery({ + queryKey: ["installation-configuration"], + staleTime: 1000 * 60 * 10, // 10 minute + queryFn: async () => { + const response = await installationClient.getInstallationConfiguration({}); + return response.configuration; + }, + }); +}; diff --git a/components/dashboard/src/data/organizations/orgs-query.ts b/components/dashboard/src/data/organizations/orgs-query.ts index 320621812557fe..b98938eb32eb32 100644 --- a/components/dashboard/src/data/organizations/orgs-query.ts +++ b/components/dashboard/src/data/organizations/orgs-query.ts @@ -61,14 +61,31 @@ export function useCurrentOrg(): { data?: Organization; isLoading: boolean } { return { data: undefined, isLoading: true }; } let orgId = localStorage.getItem("active-org"); + let org: Organization | undefined = undefined; + if (orgId) { + org = orgs.data.find((org) => org.id === orgId); + } + + // 1. Check for org slug + const orgSlugParam = getOrgSlugFromQuery(location.search); + if (orgSlugParam) { + org = orgs.data.find((org) => org.slug === orgSlugParam); + } + + // 2. Check for org id + // id is more speficic than slug, so it takes precedence const orgIdParam = new URLSearchParams(location.search).get("org"); if (orgIdParam) { orgId = orgIdParam; + org = orgs.data.find((org) => org.id === orgId); } - let org = orgs.data.find((org) => org.id === orgId); + + // 3. Fallback: pick the first org if (!org) { org = orgs.data[0]; } + + // Persist the selected org if (org) { localStorage.setItem("active-org", org.id); } else if (orgId && (orgs.isLoading || orgs.isStale)) { @@ -79,3 +96,7 @@ export function useCurrentOrg(): { data?: Organization; isLoading: boolean } { } return { data: org, isLoading: false }; } + +export function getOrgSlugFromQuery(search: string): string | undefined { + return new URLSearchParams(search).get("orgSlug") || undefined; +} diff --git a/components/dashboard/src/dedicated-setup/use-needs-setup.ts b/components/dashboard/src/dedicated-setup/use-needs-setup.ts index 9e84cd627687c0..3f77c89f64d56a 100644 --- a/components/dashboard/src/dedicated-setup/use-needs-setup.ts +++ b/components/dashboard/src/dedicated-setup/use-needs-setup.ts @@ -5,17 +5,18 @@ */ import { useQuery } from "@tanstack/react-query"; -import { useFeatureFlag } from "../data/featureflag-query"; import { noPersistence } from "../data/setup"; import { installationClient } from "../service/public-api"; import { GetOnboardingStateRequest } from "@gitpod/public-api/lib/gitpod/v1/installation_pb"; +import { useInstallationConfiguration } from "../data/installation/default-workspace-image-query"; /** * @description Returns a flage stating if the current installation still needs setup before it can be used. Also returns an isLoading indicator as the check is async */ export const useNeedsSetup = () => { const { data: onboardingState, isLoading } = useOnboardingState(); - const enableDedicatedOnboardingFlow = useFeatureFlag("enableDedicatedOnboardingFlow"); + const { data: installationConfig } = useInstallationConfiguration(); + const isDedicatedInstallation = !!installationConfig?.isDedicatedInstallation; // This needs to only be true if we've loaded the onboarding state let needsSetup = !isLoading && onboardingState && onboardingState.completed !== true; @@ -25,14 +26,14 @@ export const useNeedsSetup = () => { } return { - needsSetup: enableDedicatedOnboardingFlow && needsSetup, + needsSetup: isDedicatedInstallation && needsSetup, // disabled queries stay in `isLoading` state, so checking feature flag here too - isLoading: enableDedicatedOnboardingFlow && isLoading, + isLoading: isDedicatedInstallation && isLoading, }; }; -const useOnboardingState = () => { - const enableDedicatedOnboardingFlow = useFeatureFlag("enableDedicatedOnboardingFlow"); +export const useOnboardingState = () => { + const { data: installationConfig } = useInstallationConfiguration(); return useQuery( noPersistence(["onboarding-state"]), @@ -42,7 +43,7 @@ const useOnboardingState = () => { }, { // Only query if feature flag is enabled - enabled: enableDedicatedOnboardingFlow, + enabled: !!installationConfig?.isDedicatedInstallation, }, ); }; diff --git a/components/dashboard/src/dedicated-setup/use-show-dedicated-setup.ts b/components/dashboard/src/dedicated-setup/use-show-dedicated-setup.ts index 7a222eab221735..4c329c360f2f3c 100644 --- a/components/dashboard/src/dedicated-setup/use-show-dedicated-setup.ts +++ b/components/dashboard/src/dedicated-setup/use-show-dedicated-setup.ts @@ -5,9 +5,9 @@ */ import { useQueryParams } from "../hooks/use-query-params"; -import { useFeatureFlag } from "../data/featureflag-query"; import { useCallback, useState } from "react"; import { isCurrentHostExcludedFromSetup, useNeedsSetup } from "./use-needs-setup"; +import { useInstallationConfiguration } from "../data/installation/default-workspace-image-query"; const FORCE_SETUP_PARAM = "dedicated-setup"; const FORCE_SETUP_PARAM_VALUE = "force"; @@ -21,7 +21,8 @@ export const useShowDedicatedSetup = () => { // again in case onboarding state isn't updated right away const [inProgress, setInProgress] = useState(false); - const enableDedicatedOnboardingFlow = useFeatureFlag("enableDedicatedOnboardingFlow"); + const { data: installationConfig } = useInstallationConfiguration(); + const enableDedicatedOnboardingFlow = !!installationConfig?.isDedicatedInstallation; const params = useQueryParams(); const { needsSetup } = useNeedsSetup(); diff --git a/components/dashboard/src/login/SSOLoginForm.tsx b/components/dashboard/src/login/SSOLoginForm.tsx index cdf8aef9a1722e..c6226dc0e3442e 100644 --- a/components/dashboard/src/login/SSOLoginForm.tsx +++ b/components/dashboard/src/login/SSOLoginForm.tsx @@ -12,9 +12,11 @@ import { useOnBlurError } from "../hooks/use-onblur-error"; import { openOIDCStartWindow } from "../provider-utils"; import { useFeatureFlag } from "../data/featureflag-query"; import { useLocation } from "react-router"; +import { useOnboardingState } from "../dedicated-setup/use-needs-setup"; +import { getOrgSlugFromQuery } from "../data/organizations/orgs-query"; +import { storageAvailable } from "../utils"; type Props = { - singleOrgMode?: boolean; onSuccess: () => void; }; @@ -27,11 +29,13 @@ function getOrgSlugFromPath(path: string) { return pathSegments[2]; } -export const SSOLoginForm: FC = ({ singleOrgMode, onSuccess }) => { +export const SSOLoginForm: FC = ({ onSuccess }) => { const location = useLocation(); + const { data: onboardingState } = useOnboardingState(); + const singleOrgMode = (onboardingState?.organizationCountTotal || 0) < 2; const [orgSlug, setOrgSlug] = useState( - getOrgSlugFromPath(location.pathname) || window.localStorage.getItem("sso-org-slug") || "", + getOrgSlugFromPath(location.pathname) || getOrgSlugFromQuery(location.search) || readSSOOrgSlug() || "", ); const [error, setError] = useState(""); @@ -40,7 +44,7 @@ export const SSOLoginForm: FC = ({ singleOrgMode, onSuccess }) => { const openLoginWithSSO = useCallback( async (e: React.FormEvent) => { e.preventDefault(); - window.localStorage.setItem("sso-org-slug", orgSlug.trim()); + persistSSOOrgSlug(orgSlug.trim()); try { await openOIDCStartWindow({ @@ -78,7 +82,7 @@ export const SSOLoginForm: FC = ({ singleOrgMode, onSuccess }) => {
{!singleOrgMode && ( = ({ singleOrgMode, onSuccess }) => { ); }; + +function readSSOOrgSlug(): string | undefined { + const isLocalStorageAvailable = storageAvailable("localStorage"); + if (isLocalStorageAvailable) { + return window.localStorage.getItem("sso-org-slug") || undefined; + } + return undefined; +} + +function persistSSOOrgSlug(slug: string) { + const isLocalStorageAvailable = storageAvailable("localStorage"); + if (isLocalStorageAvailable) { + window.localStorage.setItem("sso-org-slug", slug.trim()); + } +} diff --git a/components/dashboard/src/menu/OrganizationSelector.tsx b/components/dashboard/src/menu/OrganizationSelector.tsx index 3a9d9849a08a6b..225c8ec852eb1d 100644 --- a/components/dashboard/src/menu/OrganizationSelector.tsx +++ b/components/dashboard/src/menu/OrganizationSelector.tsx @@ -11,10 +11,11 @@ import { useCurrentUser } from "../user-context"; import { useCurrentOrg, useOrganizations } from "../data/organizations/orgs-query"; import { useLocation } from "react-router"; import { useOrgBillingMode } from "../data/billing-mode/org-billing-mode-query"; -import { useFeatureFlag } from "../data/featureflag-query"; import { useIsOwner, useListOrganizationMembers, useHasRolePermission } from "../data/organizations/members-query"; -import { isOrganizationOwned } from "@gitpod/public-api-common/lib/user-utils"; +import { isAllowedToCreateOrganization } from "@gitpod/public-api-common/lib/user-utils"; import { OrganizationRole } from "@gitpod/public-api/lib/gitpod/v1/organization_pb"; +import { useInstallationConfiguration } from "../data/installation/default-workspace-image-query"; +import { useFeatureFlag } from "../data/featureflag-query"; export default function OrganizationSelector() { const user = useCurrentUser(); @@ -25,10 +26,12 @@ export default function OrganizationSelector() { const hasMemberPermission = useHasRolePermission(OrganizationRole.MEMBER); const { data: billingMode } = useOrgBillingMode(); const getOrgURL = useGetOrgURL(); - const isDedicated = useFeatureFlag("enableDedicatedOnboardingFlow"); + const { data: installationConfig } = useInstallationConfiguration(); + const isDedicated = !!installationConfig?.isDedicatedInstallation; + const isMultiOrgEnabled = useFeatureFlag("enable_multi_org"); // we should have an API to ask for permissions, until then we duplicate the logic here - const canCreateOrgs = user && !isOrganizationOwned(user) && !isDedicated; + const canCreateOrgs = user && isAllowedToCreateOrganization(user, isDedicated, isMultiOrgEnabled); const userFullName = user?.name || "..."; diff --git a/components/dashboard/src/service/json-rpc-installation-client.ts b/components/dashboard/src/service/json-rpc-installation-client.ts index f7d72c9d0d184c..26fafc9c90fb13 100644 --- a/components/dashboard/src/service/json-rpc-installation-client.ts +++ b/components/dashboard/src/service/json-rpc-installation-client.ts @@ -22,6 +22,8 @@ import { GetInstallationWorkspaceDefaultImageResponse, GetOnboardingStateRequest, GetOnboardingStateResponse, + GetInstallationConfigurationRequest, + GetInstallationConfigurationResponse, } from "@gitpod/public-api/lib/gitpod/v1/installation_pb"; import { ApplicationError, ErrorCodes } from "@gitpod/gitpod-protocol/lib/messaging/error"; import { getGitpodService } from "./service"; @@ -130,4 +132,14 @@ export class JsonRpcInstallationClient implements PromiseClient, + _options?: CallOptions | undefined, + ): Promise { + const config = await getGitpodService().server.getConfiguration(); + return new GetInstallationConfigurationResponse({ + configuration: converter.toInstallationConfiguration(config), + }); + } } diff --git a/components/gitpod-db/BUILD.yaml b/components/gitpod-db/BUILD.yaml index 8a614a0133af1a..e47c742d942150 100644 --- a/components/gitpod-db/BUILD.yaml +++ b/components/gitpod-db/BUILD.yaml @@ -77,7 +77,7 @@ packages: # Note: In CI there is a DB running as sidecar; in workspaces we're starting it once. # Re-use of the instance because of the init scripts (cmp. next step). # (gpl): It would be nice to use bitnami/mysql here as we do in previews. However the container does not start in Gitpod workspaces due to some docker/kernel/namespace issue. - - ["sh", "-c", "mysqladmin ping --wait=${DB_RETRIES:-1} -h $DB_HOST --port $DB_PORT -p$DB_PASSWORD -u$DB_USER --default-auth=mysql_native_password --silent || (docker run --name test-mysql -d -e MYSQL_ROOT_PASSWORD=$DB_PASSWORD -e MYSQL_TCP_PORT=$DB_PORT -p $DB_PORT:$DB_PORT mysql:8.0.33 --default-authentication-plugin=mysql_native_password; while ! mysqladmin ping -h \"$DB_HOST\" -P \"$DB_PORT\" -p$DB_PASSWORD -u$DB_USER --default-auth=mysql_native_password --silent; do echo \"waiting for DB...\"; sleep 2; done)"] + - ["sh", "-c", "mysqladmin ping --wait=${DB_RETRIES:-1} -h $DB_HOST --port $DB_PORT -p$DB_PASSWORD -u$DB_USER --default-auth=mysql_native_password --silent || (docker container rm test-mysql; docker run --name test-mysql -d -e MYSQL_ROOT_PASSWORD=$DB_PASSWORD -e MYSQL_TCP_PORT=$DB_PORT -p $DB_PORT:$DB_PORT mysql:8.0.33 --default-authentication-plugin=mysql_native_password; while ! mysqladmin ping -h \"$DB_HOST\" -P \"$DB_PORT\" -p$DB_PASSWORD -u$DB_USER --default-auth=mysql_native_password --silent; do echo \"waiting for DB...\"; sleep 2; done)"] # Apply the DB initialization scripts (re-creates the "gitpod" DB if already there) - ["mkdir", "-p", "init-scripts"] - ["sh", "-c", "find . -name \"*.sql\" | sort | xargs -I file cp file init-scripts"] diff --git a/components/gitpod-db/src/team-db.ts b/components/gitpod-db/src/team-db.ts index e55932caab6699..869a614c404d55 100644 --- a/components/gitpod-db/src/team-db.ts +++ b/components/gitpod-db/src/team-db.ts @@ -18,7 +18,7 @@ export const TeamDB = Symbol("TeamDB"); export interface TeamDB extends TransactionalDB { findTeams( offset: number, - limit: number, + limit: number | undefined, orderBy: keyof Team, orderDir: "ASC" | "DESC", searchTerm?: string, diff --git a/components/gitpod-db/src/typeorm/team-db-impl.ts b/components/gitpod-db/src/typeorm/team-db-impl.ts index 6b5a328c37773b..40b2464446d2fc 100644 --- a/components/gitpod-db/src/typeorm/team-db-impl.ts +++ b/components/gitpod-db/src/typeorm/team-db-impl.ts @@ -58,7 +58,7 @@ export class TeamDBImpl extends TransactionalDBImpl implements TeamDB { public async findTeams( offset: number, - limit: number, + limit: number | undefined, orderBy: keyof Team, orderDir: "DESC" | "ASC", searchTerm?: string, @@ -70,7 +70,11 @@ export class TeamDBImpl extends TransactionalDBImpl implements TeamDB { searchTerm: `%${searchTerm}%`, }); } - queryBuilder = queryBuilder.andWhere("markedDeleted = 0").skip(offset).take(limit).orderBy(orderBy, orderDir); + queryBuilder = queryBuilder.andWhere("markedDeleted = 0").skip(offset); + if (limit) { + queryBuilder = queryBuilder.take(limit); + } + queryBuilder = queryBuilder.orderBy(orderBy, orderDir); const [rows, total] = await queryBuilder.getManyAndCount(); return { total, rows }; diff --git a/components/gitpod-protocol/go/gitpod-service.go b/components/gitpod-protocol/go/gitpod-service.go index 9f1711422fac3f..235cbb2dd7f6d7 100644 --- a/components/gitpod-protocol/go/gitpod-service.go +++ b/components/gitpod-protocol/go/gitpod-service.go @@ -1878,8 +1878,7 @@ type VSCodeConfig struct { // Configuration is the Configuration message type type Configuration struct { - DaysBeforeGarbageCollection float64 `json:"daysBeforeGarbageCollection,omitempty"` - GarbageCollectionStartDate float64 `json:"garbageCollectionStartDate,omitempty"` + IsDedicatedInstallation bool `json:"isDedicatedInstallation,omitempty"` } // EnvVar is the EnvVar message type diff --git a/components/gitpod-protocol/src/gitpod-service.ts b/components/gitpod-protocol/src/gitpod-service.ts index efbf5dd900ecbd..f08313b90a5055 100644 --- a/components/gitpod-protocol/src/gitpod-service.ts +++ b/components/gitpod-protocol/src/gitpod-service.ts @@ -489,11 +489,10 @@ export namespace GitpodServer { * Whether this Gitpod instance is already configured with SSO. */ readonly isCompleted: boolean; - /** - * Whether this Gitpod instance has at least one org. + * Total number of organizations. */ - readonly hasAnyOrg: boolean; + readonly organizationCountTotal: number; } } diff --git a/components/gitpod-protocol/src/protocol.ts b/components/gitpod-protocol/src/protocol.ts index 11ddc6faff13ca..59a3f23e1cecdb 100644 --- a/components/gitpod-protocol/src/protocol.ts +++ b/components/gitpod-protocol/src/protocol.ts @@ -1456,9 +1456,7 @@ export namespace AuthProviderEntry { } export interface Configuration { - readonly daysBeforeGarbageCollection: number; - readonly garbageCollectionStartDate: number; - readonly isSingleOrgInstallation: boolean; + readonly isDedicatedInstallation: boolean; } export interface StripeConfig { diff --git a/components/public-api/gitpod/v1/installation.proto b/components/public-api/gitpod/v1/installation.proto index 3fe6ddf67fbc3f..f76065c5e440c7 100644 --- a/components/public-api/gitpod/v1/installation.proto +++ b/components/public-api/gitpod/v1/installation.proto @@ -31,6 +31,9 @@ service InstallationService { // GetOnboardingState returns the onboarding state of the installation. rpc GetOnboardingState(GetOnboardingStateRequest) returns (GetOnboardingStateResponse) {} + + // GetInstallationConfiguration returns configuration of the installation. + rpc GetInstallationConfiguration(GetInstallationConfigurationRequest) returns (GetInstallationConfigurationResponse) {} } message GetOnboardingStateRequest {} @@ -39,7 +42,11 @@ message GetOnboardingStateResponse { } message OnboardingState { + // Whether at least one organization has completed the onboarding bool completed = 1; + + // The total number of organizations + int32 organization_count_total = 2; } message GetInstallationWorkspaceDefaultImageRequest {} @@ -144,3 +151,11 @@ message BlockedEmailDomain { bool negative = 3; } + +message GetInstallationConfigurationRequest {} +message GetInstallationConfigurationResponse { + InstallationConfiguration configuration = 1; +} +message InstallationConfiguration { + bool is_dedicated_installation = 1; +} diff --git a/components/public-api/go/v1/installation.pb.go b/components/public-api/go/v1/installation.pb.go index c12a5d60ffd9a1..47a39003af1c85 100644 --- a/components/public-api/go/v1/installation.pb.go +++ b/components/public-api/go/v1/installation.pb.go @@ -115,7 +115,10 @@ type OnboardingState struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields + // Whether at least one organization has completed the onboarding Completed bool `protobuf:"varint,1,opt,name=completed,proto3" json:"completed,omitempty"` + // The total number of organizations + OrganizationCountTotal int32 `protobuf:"varint,2,opt,name=organization_count_total,json=organizationCountTotal,proto3" json:"organization_count_total,omitempty"` } func (x *OnboardingState) Reset() { @@ -157,6 +160,13 @@ func (x *OnboardingState) GetCompleted() bool { return false } +func (x *OnboardingState) GetOrganizationCountTotal() int32 { + if x != nil { + return x.OrganizationCountTotal + } + return 0 +} + type GetInstallationWorkspaceDefaultImageRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -933,6 +943,138 @@ func (x *BlockedEmailDomain) GetNegative() bool { return false } +type GetInstallationConfigurationRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *GetInstallationConfigurationRequest) Reset() { + *x = GetInstallationConfigurationRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_gitpod_v1_installation_proto_msgTypes[17] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetInstallationConfigurationRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetInstallationConfigurationRequest) ProtoMessage() {} + +func (x *GetInstallationConfigurationRequest) ProtoReflect() protoreflect.Message { + mi := &file_gitpod_v1_installation_proto_msgTypes[17] + 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 GetInstallationConfigurationRequest.ProtoReflect.Descriptor instead. +func (*GetInstallationConfigurationRequest) Descriptor() ([]byte, []int) { + return file_gitpod_v1_installation_proto_rawDescGZIP(), []int{17} +} + +type GetInstallationConfigurationResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Configuration *InstallationConfiguration `protobuf:"bytes,1,opt,name=configuration,proto3" json:"configuration,omitempty"` +} + +func (x *GetInstallationConfigurationResponse) Reset() { + *x = GetInstallationConfigurationResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_gitpod_v1_installation_proto_msgTypes[18] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetInstallationConfigurationResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetInstallationConfigurationResponse) ProtoMessage() {} + +func (x *GetInstallationConfigurationResponse) ProtoReflect() protoreflect.Message { + mi := &file_gitpod_v1_installation_proto_msgTypes[18] + 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 GetInstallationConfigurationResponse.ProtoReflect.Descriptor instead. +func (*GetInstallationConfigurationResponse) Descriptor() ([]byte, []int) { + return file_gitpod_v1_installation_proto_rawDescGZIP(), []int{18} +} + +func (x *GetInstallationConfigurationResponse) GetConfiguration() *InstallationConfiguration { + if x != nil { + return x.Configuration + } + return nil +} + +type InstallationConfiguration struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + IsDedicatedInstallation bool `protobuf:"varint,1,opt,name=is_dedicated_installation,json=isDedicatedInstallation,proto3" json:"is_dedicated_installation,omitempty"` +} + +func (x *InstallationConfiguration) Reset() { + *x = InstallationConfiguration{} + if protoimpl.UnsafeEnabled { + mi := &file_gitpod_v1_installation_proto_msgTypes[19] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *InstallationConfiguration) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*InstallationConfiguration) ProtoMessage() {} + +func (x *InstallationConfiguration) ProtoReflect() protoreflect.Message { + mi := &file_gitpod_v1_installation_proto_msgTypes[19] + 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 InstallationConfiguration.ProtoReflect.Descriptor instead. +func (*InstallationConfiguration) Descriptor() ([]byte, []int) { + return file_gitpod_v1_installation_proto_rawDescGZIP(), []int{19} +} + +func (x *InstallationConfiguration) GetIsDedicatedInstallation() bool { + if x != nil { + return x.IsDedicatedInstallation + } + return false +} + var File_gitpod_v1_installation_proto protoreflect.FileDescriptor var file_gitpod_v1_installation_proto_rawDesc = []byte{ @@ -952,176 +1094,203 @@ var file_gitpod_v1_installation_proto_rawDesc = []byte{ 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x6e, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x0f, 0x6f, 0x6e, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, - 0x65, 0x22, 0x2f, 0x0a, 0x0f, 0x4f, 0x6e, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x53, + 0x65, 0x22, 0x69, 0x0a, 0x0f, 0x4f, 0x6e, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, - 0x65, 0x64, 0x22, 0x2d, 0x0a, 0x2b, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x44, 0x65, - 0x66, 0x61, 0x75, 0x6c, 0x74, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x22, 0x66, 0x0a, 0x2c, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x44, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x36, 0x0a, 0x17, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x77, 0x6f, 0x72, - 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x15, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, - 0x70, 0x61, 0x63, 0x65, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x22, 0xa4, 0x01, 0x0a, 0x1e, 0x4c, 0x69, - 0x73, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, - 0x6f, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3c, 0x0a, 0x0a, - 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1c, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x67, - 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x0a, - 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x23, 0x0a, 0x04, 0x73, 0x6f, - 0x72, 0x74, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, - 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x6f, 0x72, 0x74, 0x52, 0x04, 0x73, 0x6f, 0x72, 0x74, 0x12, - 0x1f, 0x0a, 0x0b, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x5f, 0x74, 0x65, 0x72, 0x6d, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x54, 0x65, 0x72, 0x6d, - 0x22, 0xb1, 0x01, 0x0a, 0x1f, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, - 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3d, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, - 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x12, 0x4f, 0x0a, 0x14, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x5f, 0x72, - 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x6c, - 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x52, - 0x13, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, - 0x72, 0x69, 0x65, 0x73, 0x22, 0x88, 0x01, 0x0a, 0x1e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, - 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x75, 0x72, 0x6c, 0x5f, 0x72, - 0x65, 0x67, 0x65, 0x78, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x75, 0x72, 0x6c, - 0x52, 0x65, 0x67, 0x65, 0x78, 0x70, 0x12, 0x1d, 0x0a, 0x0a, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, - 0x75, 0x73, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x62, 0x6c, 0x6f, 0x63, - 0x6b, 0x55, 0x73, 0x65, 0x72, 0x12, 0x28, 0x0a, 0x10, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x66, - 0x72, 0x65, 0x65, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x0e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x46, 0x72, 0x65, 0x65, 0x55, 0x73, 0x61, 0x67, 0x65, 0x22, - 0x6e, 0x0a, 0x1f, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, - 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x4b, 0x0a, 0x12, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x5f, 0x72, 0x65, - 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, - 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, - 0x65, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x11, 0x62, 0x6c, - 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x22, - 0x54, 0x0a, 0x1e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, + 0x65, 0x64, 0x12, 0x38, 0x0a, 0x18, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x16, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x22, 0x2d, 0x0a, 0x2b, + 0x47, 0x65, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, + 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x49, + 0x6d, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x66, 0x0a, 0x2c, 0x47, + 0x65, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x6f, + 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x49, 0x6d, + 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x36, 0x0a, 0x17, 0x64, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x64, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x6d, + 0x61, 0x67, 0x65, 0x22, 0xa4, 0x01, 0x0a, 0x1e, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x6c, 0x6f, 0x63, + 0x6b, 0x65, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x65, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3c, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x69, 0x74, + 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x23, 0x0a, 0x04, 0x73, 0x6f, 0x72, 0x74, 0x18, 0x02, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x53, + 0x6f, 0x72, 0x74, 0x52, 0x04, 0x73, 0x6f, 0x72, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x65, 0x61, + 0x72, 0x63, 0x68, 0x5f, 0x74, 0x65, 0x72, 0x6d, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, + 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x54, 0x65, 0x72, 0x6d, 0x22, 0xb1, 0x01, 0x0a, 0x1f, 0x4c, + 0x69, 0x73, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, + 0x74, 0x6f, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3d, + 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x50, + 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x4f, 0x0a, + 0x14, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x5f, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, + 0x6f, 0x72, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x69, + 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x52, + 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x13, 0x62, 0x6c, 0x6f, 0x63, 0x6b, + 0x65, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x65, 0x73, 0x22, 0x88, + 0x01, 0x0a, 0x1e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x32, 0x0a, 0x15, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x5f, 0x72, 0x65, 0x70, - 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, - 0x52, 0x13, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, - 0x6f, 0x72, 0x79, 0x49, 0x64, 0x22, 0x21, 0x0a, 0x1f, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x42, - 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x5e, 0x0a, 0x1e, 0x4c, 0x69, 0x73, 0x74, - 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x45, 0x6d, 0x61, 0x69, 0x6c, 0x44, 0x6f, 0x6d, 0x61, - 0x69, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3c, 0x0a, 0x0a, 0x70, 0x61, - 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, - 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x67, 0x69, 0x6e, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x0a, 0x70, 0x61, - 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xb3, 0x01, 0x0a, 0x1f, 0x4c, 0x69, 0x73, - 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x45, 0x6d, 0x61, 0x69, 0x6c, 0x44, 0x6f, 0x6d, - 0x61, 0x69, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3d, 0x0a, 0x0a, - 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1d, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x67, - 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, - 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x51, 0x0a, 0x15, 0x62, - 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x5f, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x5f, 0x64, 0x6f, 0x6d, - 0x61, 0x69, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x67, 0x69, 0x74, - 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x45, 0x6d, - 0x61, 0x69, 0x6c, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x52, 0x13, 0x62, 0x6c, 0x6f, 0x63, 0x6b, - 0x65, 0x64, 0x45, 0x6d, 0x61, 0x69, 0x6c, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x73, 0x22, 0x55, - 0x0a, 0x1f, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x45, - 0x6d, 0x61, 0x69, 0x6c, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x16, 0x0a, 0x06, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x06, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x6e, 0x65, 0x67, - 0x61, 0x74, 0x69, 0x76, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x6e, 0x65, 0x67, - 0x61, 0x74, 0x69, 0x76, 0x65, 0x22, 0x73, 0x0a, 0x20, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, - 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x45, 0x6d, 0x61, 0x69, 0x6c, 0x44, 0x6f, 0x6d, 0x61, 0x69, - 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4f, 0x0a, 0x14, 0x62, 0x6c, 0x6f, - 0x63, 0x6b, 0x65, 0x64, 0x5f, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x5f, 0x64, 0x6f, 0x6d, 0x61, 0x69, - 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, - 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x45, 0x6d, 0x61, 0x69, 0x6c, - 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x52, 0x12, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x45, - 0x6d, 0x61, 0x69, 0x6c, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x22, 0x89, 0x02, 0x0a, 0x11, 0x42, - 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, - 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, 0x69, 0x64, - 0x12, 0x1d, 0x0a, 0x0a, 0x75, 0x72, 0x6c, 0x5f, 0x72, 0x65, 0x67, 0x65, 0x78, 0x70, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x75, 0x72, 0x6c, 0x52, 0x65, 0x67, 0x65, 0x78, 0x70, 0x12, - 0x1d, 0x0a, 0x0a, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x09, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x55, 0x73, 0x65, 0x72, 0x12, 0x3f, - 0x0a, 0x0d, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, - 0x70, 0x52, 0x0c, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x12, - 0x3b, 0x0a, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, - 0x52, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x10, - 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x66, 0x72, 0x65, 0x65, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x46, 0x72, 0x65, - 0x65, 0x55, 0x73, 0x61, 0x67, 0x65, 0x22, 0x58, 0x0a, 0x12, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x65, - 0x64, 0x45, 0x6d, 0x61, 0x69, 0x6c, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x12, 0x0e, 0x0a, 0x02, - 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x16, 0x0a, 0x06, - 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x64, 0x6f, - 0x6d, 0x61, 0x69, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x6e, 0x65, 0x67, 0x61, 0x74, 0x69, 0x76, 0x65, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x6e, 0x65, 0x67, 0x61, 0x74, 0x69, 0x76, 0x65, - 0x32, 0xdd, 0x06, 0x0a, 0x13, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x99, 0x01, 0x0a, 0x24, 0x47, 0x65, 0x74, - 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, - 0x73, 0x70, 0x61, 0x63, 0x65, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x49, 0x6d, 0x61, 0x67, - 0x65, 0x12, 0x36, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, - 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x6f, 0x72, - 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x49, 0x6d, 0x61, - 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x37, 0x2e, 0x67, 0x69, 0x74, 0x70, - 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x44, 0x65, - 0x66, 0x61, 0x75, 0x6c, 0x74, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x00, 0x12, 0x72, 0x0a, 0x17, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x6c, 0x6f, 0x63, - 0x6b, 0x65, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x65, 0x73, 0x12, - 0x29, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, - 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, - 0x69, 0x65, 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, 0x42, 0x6c, 0x6f, 0x63, 0x6b, - 0x65, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x72, 0x0a, 0x17, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, - 0x6f, 0x72, 0x79, 0x12, 0x29, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, - 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x52, 0x65, 0x70, - 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, - 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, - 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x72, 0x0a, 0x17, - 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x52, 0x65, 0x70, - 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x29, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, - 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x65, - 0x64, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x44, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x52, 0x65, 0x70, 0x6f, - 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, - 0x12, 0x72, 0x0a, 0x17, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x45, - 0x6d, 0x61, 0x69, 0x6c, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x73, 0x12, 0x29, 0x2e, 0x67, 0x69, - 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x6c, 0x6f, 0x63, - 0x6b, 0x65, 0x64, 0x45, 0x6d, 0x61, 0x69, 0x6c, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 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, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x45, 0x6d, - 0x61, 0x69, 0x6c, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x00, 0x12, 0x75, 0x0a, 0x18, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x6c, + 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x75, 0x72, 0x6c, 0x5f, 0x72, 0x65, 0x67, 0x65, 0x78, 0x70, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x75, 0x72, 0x6c, 0x52, 0x65, 0x67, 0x65, 0x78, 0x70, + 0x12, 0x1d, 0x0a, 0x0a, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x55, 0x73, 0x65, 0x72, 0x12, + 0x28, 0x0a, 0x10, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x66, 0x72, 0x65, 0x65, 0x5f, 0x75, 0x73, + 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, + 0x46, 0x72, 0x65, 0x65, 0x55, 0x73, 0x61, 0x67, 0x65, 0x22, 0x6e, 0x0a, 0x1f, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, + 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4b, 0x0a, 0x12, + 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x5f, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, + 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, + 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x52, 0x65, 0x70, 0x6f, + 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x11, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x52, + 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x22, 0x54, 0x0a, 0x1e, 0x44, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, + 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x32, 0x0a, 0x15, 0x62, + 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x5f, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, + 0x79, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x13, 0x62, 0x6c, 0x6f, 0x63, + 0x6b, 0x65, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x49, 0x64, 0x22, + 0x21, 0x0a, 0x1f, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, + 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x5e, 0x0a, 0x1e, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x65, + 0x64, 0x45, 0x6d, 0x61, 0x69, 0x6c, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x3c, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, + 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0xb3, 0x01, 0x0a, 0x1f, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, + 0x65, 0x64, 0x45, 0x6d, 0x61, 0x69, 0x6c, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3d, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x67, 0x69, 0x74, + 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x51, 0x0a, 0x15, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, + 0x5f, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x5f, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x73, 0x18, 0x02, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, + 0x2e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x45, 0x6d, 0x61, 0x69, 0x6c, 0x44, 0x6f, 0x6d, + 0x61, 0x69, 0x6e, 0x52, 0x13, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x45, 0x6d, 0x61, 0x69, + 0x6c, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x73, 0x22, 0x55, 0x0a, 0x1f, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x45, 0x6d, 0x61, 0x69, 0x6c, 0x44, 0x6f, + 0x6d, 0x61, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x64, + 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x64, 0x6f, 0x6d, + 0x61, 0x69, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x6e, 0x65, 0x67, 0x61, 0x74, 0x69, 0x76, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x6e, 0x65, 0x67, 0x61, 0x74, 0x69, 0x76, 0x65, 0x22, + 0x73, 0x0a, 0x20, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, + 0x45, 0x6d, 0x61, 0x69, 0x6c, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x4f, 0x0a, 0x14, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x5f, 0x65, + 0x6d, 0x61, 0x69, 0x6c, 0x5f, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1d, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x45, 0x6d, 0x61, 0x69, 0x6c, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, - 0x12, 0x2a, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x45, 0x6d, 0x61, 0x69, 0x6c, 0x44, - 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x67, + 0x52, 0x12, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x45, 0x6d, 0x61, 0x69, 0x6c, 0x44, 0x6f, + 0x6d, 0x61, 0x69, 0x6e, 0x22, 0x89, 0x02, 0x0a, 0x11, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, + 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x75, 0x72, + 0x6c, 0x5f, 0x72, 0x65, 0x67, 0x65, 0x78, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, + 0x75, 0x72, 0x6c, 0x52, 0x65, 0x67, 0x65, 0x78, 0x70, 0x12, 0x1d, 0x0a, 0x0a, 0x62, 0x6c, 0x6f, + 0x63, 0x6b, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x62, + 0x6c, 0x6f, 0x63, 0x6b, 0x55, 0x73, 0x65, 0x72, 0x12, 0x3f, 0x0a, 0x0d, 0x63, 0x72, 0x65, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0c, 0x63, 0x72, 0x65, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x3b, 0x0a, 0x0b, 0x75, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x75, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x10, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, + 0x66, 0x72, 0x65, 0x65, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x0e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x46, 0x72, 0x65, 0x65, 0x55, 0x73, 0x61, 0x67, 0x65, + 0x22, 0x58, 0x0a, 0x12, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x45, 0x6d, 0x61, 0x69, 0x6c, + 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x12, 0x1a, + 0x0a, 0x08, 0x6e, 0x65, 0x67, 0x61, 0x74, 0x69, 0x76, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x08, 0x6e, 0x65, 0x67, 0x61, 0x74, 0x69, 0x76, 0x65, 0x22, 0x25, 0x0a, 0x23, 0x47, 0x65, + 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x22, 0x72, 0x0a, 0x24, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4a, 0x0a, 0x0d, 0x63, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x24, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6e, 0x73, + 0x74, 0x61, 0x6c, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0d, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x57, 0x0a, 0x19, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x19, 0x69, 0x73, 0x5f, 0x64, 0x65, 0x64, 0x69, 0x63, 0x61, 0x74, + 0x65, 0x64, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x17, 0x69, 0x73, 0x44, 0x65, 0x64, 0x69, 0x63, 0x61, 0x74, + 0x65, 0x64, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x32, 0xe1, + 0x07, 0x0a, 0x13, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x99, 0x01, 0x0a, 0x24, 0x47, 0x65, 0x74, 0x49, 0x6e, + 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x12, + 0x36, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x49, + 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x49, 0x6d, 0x61, 0x67, 0x65, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x37, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, + 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x44, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x00, 0x12, 0x72, 0x0a, 0x17, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x65, + 0x64, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x65, 0x73, 0x12, 0x29, 0x2e, + 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x6c, + 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x65, + 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, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, + 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x72, 0x0a, 0x17, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, + 0x79, 0x12, 0x29, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x73, + 0x69, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, - 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x45, 0x6d, 0x61, 0x69, 0x6c, 0x44, 0x6f, 0x6d, 0x61, 0x69, - 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x63, 0x0a, 0x12, 0x47, - 0x65, 0x74, 0x4f, 0x6e, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, - 0x65, 0x12, 0x24, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, - 0x74, 0x4f, 0x6e, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, - 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x6e, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x69, 0x6e, - 0x67, 0x53, 0x74, 0x61, 0x74, 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, + 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x72, 0x0a, 0x17, 0x44, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x73, + 0x69, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x29, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, + 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x52, + 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x2a, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, + 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x72, + 0x0a, 0x17, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x45, 0x6d, 0x61, + 0x69, 0x6c, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x73, 0x12, 0x29, 0x2e, 0x67, 0x69, 0x74, 0x70, + 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x65, + 0x64, 0x45, 0x6d, 0x61, 0x69, 0x6c, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 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, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x45, 0x6d, 0x61, 0x69, + 0x6c, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x00, 0x12, 0x75, 0x0a, 0x18, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x6c, 0x6f, 0x63, + 0x6b, 0x65, 0x64, 0x45, 0x6d, 0x61, 0x69, 0x6c, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x12, 0x2a, + 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x45, 0x6d, 0x61, 0x69, 0x6c, 0x44, 0x6f, 0x6d, + 0x61, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x67, 0x69, 0x74, + 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x6c, 0x6f, + 0x63, 0x6b, 0x65, 0x64, 0x45, 0x6d, 0x61, 0x69, 0x6c, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x63, 0x0a, 0x12, 0x47, 0x65, 0x74, + 0x4f, 0x6e, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, + 0x24, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4f, + 0x6e, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, + 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x6e, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x53, + 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x81, + 0x01, 0x0a, 0x1c, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x2e, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x49, + 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x2f, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x49, + 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 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 ( @@ -1136,7 +1305,7 @@ func file_gitpod_v1_installation_proto_rawDescGZIP() []byte { return file_gitpod_v1_installation_proto_rawDescData } -var file_gitpod_v1_installation_proto_msgTypes = make([]protoimpl.MessageInfo, 17) +var file_gitpod_v1_installation_proto_msgTypes = make([]protoimpl.MessageInfo, 20) var file_gitpod_v1_installation_proto_goTypes = []interface{}{ (*GetOnboardingStateRequest)(nil), // 0: gitpod.v1.GetOnboardingStateRequest (*GetOnboardingStateResponse)(nil), // 1: gitpod.v1.GetOnboardingStateResponse @@ -1155,43 +1324,49 @@ var file_gitpod_v1_installation_proto_goTypes = []interface{}{ (*CreateBlockedEmailDomainResponse)(nil), // 14: gitpod.v1.CreateBlockedEmailDomainResponse (*BlockedRepository)(nil), // 15: gitpod.v1.BlockedRepository (*BlockedEmailDomain)(nil), // 16: gitpod.v1.BlockedEmailDomain - (*PaginationRequest)(nil), // 17: gitpod.v1.PaginationRequest - (*Sort)(nil), // 18: gitpod.v1.Sort - (*PaginationResponse)(nil), // 19: gitpod.v1.PaginationResponse - (*timestamppb.Timestamp)(nil), // 20: google.protobuf.Timestamp + (*GetInstallationConfigurationRequest)(nil), // 17: gitpod.v1.GetInstallationConfigurationRequest + (*GetInstallationConfigurationResponse)(nil), // 18: gitpod.v1.GetInstallationConfigurationResponse + (*InstallationConfiguration)(nil), // 19: gitpod.v1.InstallationConfiguration + (*PaginationRequest)(nil), // 20: gitpod.v1.PaginationRequest + (*Sort)(nil), // 21: gitpod.v1.Sort + (*PaginationResponse)(nil), // 22: gitpod.v1.PaginationResponse + (*timestamppb.Timestamp)(nil), // 23: google.protobuf.Timestamp } var file_gitpod_v1_installation_proto_depIdxs = []int32{ 2, // 0: gitpod.v1.GetOnboardingStateResponse.onboarding_state:type_name -> gitpod.v1.OnboardingState - 17, // 1: gitpod.v1.ListBlockedRepositoriesRequest.pagination:type_name -> gitpod.v1.PaginationRequest - 18, // 2: gitpod.v1.ListBlockedRepositoriesRequest.sort:type_name -> gitpod.v1.Sort - 19, // 3: gitpod.v1.ListBlockedRepositoriesResponse.pagination:type_name -> gitpod.v1.PaginationResponse + 20, // 1: gitpod.v1.ListBlockedRepositoriesRequest.pagination:type_name -> gitpod.v1.PaginationRequest + 21, // 2: gitpod.v1.ListBlockedRepositoriesRequest.sort:type_name -> gitpod.v1.Sort + 22, // 3: gitpod.v1.ListBlockedRepositoriesResponse.pagination:type_name -> gitpod.v1.PaginationResponse 15, // 4: gitpod.v1.ListBlockedRepositoriesResponse.blocked_repositories:type_name -> gitpod.v1.BlockedRepository 15, // 5: gitpod.v1.CreateBlockedRepositoryResponse.blocked_repository:type_name -> gitpod.v1.BlockedRepository - 17, // 6: gitpod.v1.ListBlockedEmailDomainsRequest.pagination:type_name -> gitpod.v1.PaginationRequest - 19, // 7: gitpod.v1.ListBlockedEmailDomainsResponse.pagination:type_name -> gitpod.v1.PaginationResponse + 20, // 6: gitpod.v1.ListBlockedEmailDomainsRequest.pagination:type_name -> gitpod.v1.PaginationRequest + 22, // 7: gitpod.v1.ListBlockedEmailDomainsResponse.pagination:type_name -> gitpod.v1.PaginationResponse 16, // 8: gitpod.v1.ListBlockedEmailDomainsResponse.blocked_email_domains:type_name -> gitpod.v1.BlockedEmailDomain 16, // 9: gitpod.v1.CreateBlockedEmailDomainResponse.blocked_email_domain:type_name -> gitpod.v1.BlockedEmailDomain - 20, // 10: gitpod.v1.BlockedRepository.creation_time:type_name -> google.protobuf.Timestamp - 20, // 11: gitpod.v1.BlockedRepository.update_time:type_name -> google.protobuf.Timestamp - 3, // 12: gitpod.v1.InstallationService.GetInstallationWorkspaceDefaultImage:input_type -> gitpod.v1.GetInstallationWorkspaceDefaultImageRequest - 5, // 13: gitpod.v1.InstallationService.ListBlockedRepositories:input_type -> gitpod.v1.ListBlockedRepositoriesRequest - 7, // 14: gitpod.v1.InstallationService.CreateBlockedRepository:input_type -> gitpod.v1.CreateBlockedRepositoryRequest - 9, // 15: gitpod.v1.InstallationService.DeleteBlockedRepository:input_type -> gitpod.v1.DeleteBlockedRepositoryRequest - 11, // 16: gitpod.v1.InstallationService.ListBlockedEmailDomains:input_type -> gitpod.v1.ListBlockedEmailDomainsRequest - 13, // 17: gitpod.v1.InstallationService.CreateBlockedEmailDomain:input_type -> gitpod.v1.CreateBlockedEmailDomainRequest - 0, // 18: gitpod.v1.InstallationService.GetOnboardingState:input_type -> gitpod.v1.GetOnboardingStateRequest - 4, // 19: gitpod.v1.InstallationService.GetInstallationWorkspaceDefaultImage:output_type -> gitpod.v1.GetInstallationWorkspaceDefaultImageResponse - 6, // 20: gitpod.v1.InstallationService.ListBlockedRepositories:output_type -> gitpod.v1.ListBlockedRepositoriesResponse - 8, // 21: gitpod.v1.InstallationService.CreateBlockedRepository:output_type -> gitpod.v1.CreateBlockedRepositoryResponse - 10, // 22: gitpod.v1.InstallationService.DeleteBlockedRepository:output_type -> gitpod.v1.DeleteBlockedRepositoryResponse - 12, // 23: gitpod.v1.InstallationService.ListBlockedEmailDomains:output_type -> gitpod.v1.ListBlockedEmailDomainsResponse - 14, // 24: gitpod.v1.InstallationService.CreateBlockedEmailDomain:output_type -> gitpod.v1.CreateBlockedEmailDomainResponse - 1, // 25: gitpod.v1.InstallationService.GetOnboardingState:output_type -> gitpod.v1.GetOnboardingStateResponse - 19, // [19:26] is the sub-list for method output_type - 12, // [12:19] is the sub-list for method input_type - 12, // [12:12] is the sub-list for extension type_name - 12, // [12:12] is the sub-list for extension extendee - 0, // [0:12] is the sub-list for field type_name + 23, // 10: gitpod.v1.BlockedRepository.creation_time:type_name -> google.protobuf.Timestamp + 23, // 11: gitpod.v1.BlockedRepository.update_time:type_name -> google.protobuf.Timestamp + 19, // 12: gitpod.v1.GetInstallationConfigurationResponse.configuration:type_name -> gitpod.v1.InstallationConfiguration + 3, // 13: gitpod.v1.InstallationService.GetInstallationWorkspaceDefaultImage:input_type -> gitpod.v1.GetInstallationWorkspaceDefaultImageRequest + 5, // 14: gitpod.v1.InstallationService.ListBlockedRepositories:input_type -> gitpod.v1.ListBlockedRepositoriesRequest + 7, // 15: gitpod.v1.InstallationService.CreateBlockedRepository:input_type -> gitpod.v1.CreateBlockedRepositoryRequest + 9, // 16: gitpod.v1.InstallationService.DeleteBlockedRepository:input_type -> gitpod.v1.DeleteBlockedRepositoryRequest + 11, // 17: gitpod.v1.InstallationService.ListBlockedEmailDomains:input_type -> gitpod.v1.ListBlockedEmailDomainsRequest + 13, // 18: gitpod.v1.InstallationService.CreateBlockedEmailDomain:input_type -> gitpod.v1.CreateBlockedEmailDomainRequest + 0, // 19: gitpod.v1.InstallationService.GetOnboardingState:input_type -> gitpod.v1.GetOnboardingStateRequest + 17, // 20: gitpod.v1.InstallationService.GetInstallationConfiguration:input_type -> gitpod.v1.GetInstallationConfigurationRequest + 4, // 21: gitpod.v1.InstallationService.GetInstallationWorkspaceDefaultImage:output_type -> gitpod.v1.GetInstallationWorkspaceDefaultImageResponse + 6, // 22: gitpod.v1.InstallationService.ListBlockedRepositories:output_type -> gitpod.v1.ListBlockedRepositoriesResponse + 8, // 23: gitpod.v1.InstallationService.CreateBlockedRepository:output_type -> gitpod.v1.CreateBlockedRepositoryResponse + 10, // 24: gitpod.v1.InstallationService.DeleteBlockedRepository:output_type -> gitpod.v1.DeleteBlockedRepositoryResponse + 12, // 25: gitpod.v1.InstallationService.ListBlockedEmailDomains:output_type -> gitpod.v1.ListBlockedEmailDomainsResponse + 14, // 26: gitpod.v1.InstallationService.CreateBlockedEmailDomain:output_type -> gitpod.v1.CreateBlockedEmailDomainResponse + 1, // 27: gitpod.v1.InstallationService.GetOnboardingState:output_type -> gitpod.v1.GetOnboardingStateResponse + 18, // 28: gitpod.v1.InstallationService.GetInstallationConfiguration:output_type -> gitpod.v1.GetInstallationConfigurationResponse + 21, // [21:29] is the sub-list for method output_type + 13, // [13:21] is the sub-list for method input_type + 13, // [13:13] is the sub-list for extension type_name + 13, // [13:13] is the sub-list for extension extendee + 0, // [0:13] is the sub-list for field type_name } func init() { file_gitpod_v1_installation_proto_init() } @@ -1406,6 +1581,42 @@ func file_gitpod_v1_installation_proto_init() { return nil } } + file_gitpod_v1_installation_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetInstallationConfigurationRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_gitpod_v1_installation_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetInstallationConfigurationResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_gitpod_v1_installation_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*InstallationConfiguration); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } } type x struct{} out := protoimpl.TypeBuilder{ @@ -1413,7 +1624,7 @@ func file_gitpod_v1_installation_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_gitpod_v1_installation_proto_rawDesc, NumEnums: 0, - NumMessages: 17, + NumMessages: 20, NumExtensions: 0, NumServices: 1, }, diff --git a/components/public-api/go/v1/installation_grpc.pb.go b/components/public-api/go/v1/installation_grpc.pb.go index 12be3b12049081..0f5ffd0a374b94 100644 --- a/components/public-api/go/v1/installation_grpc.pb.go +++ b/components/public-api/go/v1/installation_grpc.pb.go @@ -41,6 +41,8 @@ type InstallationServiceClient interface { CreateBlockedEmailDomain(ctx context.Context, in *CreateBlockedEmailDomainRequest, opts ...grpc.CallOption) (*CreateBlockedEmailDomainResponse, error) // GetOnboardingState returns the onboarding state of the installation. GetOnboardingState(ctx context.Context, in *GetOnboardingStateRequest, opts ...grpc.CallOption) (*GetOnboardingStateResponse, error) + // GetInstallationConfiguration returns configuration of the installation. + GetInstallationConfiguration(ctx context.Context, in *GetInstallationConfigurationRequest, opts ...grpc.CallOption) (*GetInstallationConfigurationResponse, error) } type installationServiceClient struct { @@ -114,6 +116,15 @@ func (c *installationServiceClient) GetOnboardingState(ctx context.Context, in * return out, nil } +func (c *installationServiceClient) GetInstallationConfiguration(ctx context.Context, in *GetInstallationConfigurationRequest, opts ...grpc.CallOption) (*GetInstallationConfigurationResponse, error) { + out := new(GetInstallationConfigurationResponse) + err := c.cc.Invoke(ctx, "/gitpod.v1.InstallationService/GetInstallationConfiguration", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + // InstallationServiceServer is the server API for InstallationService service. // All implementations must embed UnimplementedInstallationServiceServer // for forward compatibility @@ -133,6 +144,8 @@ type InstallationServiceServer interface { CreateBlockedEmailDomain(context.Context, *CreateBlockedEmailDomainRequest) (*CreateBlockedEmailDomainResponse, error) // GetOnboardingState returns the onboarding state of the installation. GetOnboardingState(context.Context, *GetOnboardingStateRequest) (*GetOnboardingStateResponse, error) + // GetInstallationConfiguration returns configuration of the installation. + GetInstallationConfiguration(context.Context, *GetInstallationConfigurationRequest) (*GetInstallationConfigurationResponse, error) mustEmbedUnimplementedInstallationServiceServer() } @@ -161,6 +174,9 @@ func (UnimplementedInstallationServiceServer) CreateBlockedEmailDomain(context.C func (UnimplementedInstallationServiceServer) GetOnboardingState(context.Context, *GetOnboardingStateRequest) (*GetOnboardingStateResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method GetOnboardingState not implemented") } +func (UnimplementedInstallationServiceServer) GetInstallationConfiguration(context.Context, *GetInstallationConfigurationRequest) (*GetInstallationConfigurationResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetInstallationConfiguration not implemented") +} func (UnimplementedInstallationServiceServer) mustEmbedUnimplementedInstallationServiceServer() {} // UnsafeInstallationServiceServer may be embedded to opt out of forward compatibility for this service. @@ -300,6 +316,24 @@ func _InstallationService_GetOnboardingState_Handler(srv interface{}, ctx contex return interceptor(ctx, in, info, handler) } +func _InstallationService_GetInstallationConfiguration_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetInstallationConfigurationRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(InstallationServiceServer).GetInstallationConfiguration(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/gitpod.v1.InstallationService/GetInstallationConfiguration", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(InstallationServiceServer).GetInstallationConfiguration(ctx, req.(*GetInstallationConfigurationRequest)) + } + return interceptor(ctx, in, info, handler) +} + // InstallationService_ServiceDesc is the grpc.ServiceDesc for InstallationService service. // It's only intended for direct use with grpc.RegisterService, // and not to be introspected or modified (even as a copy) @@ -335,6 +369,10 @@ var InstallationService_ServiceDesc = grpc.ServiceDesc{ MethodName: "GetOnboardingState", Handler: _InstallationService_GetOnboardingState_Handler, }, + { + MethodName: "GetInstallationConfiguration", + Handler: _InstallationService_GetInstallationConfiguration_Handler, + }, }, Streams: []grpc.StreamDesc{}, Metadata: "gitpod/v1/installation.proto", diff --git a/components/public-api/go/v1/v1connect/installation.connect.go b/components/public-api/go/v1/v1connect/installation.connect.go index 211540b94a6fd9..9cfe7648df4071 100644 --- a/components/public-api/go/v1/v1connect/installation.connect.go +++ b/components/public-api/go/v1/v1connect/installation.connect.go @@ -46,6 +46,8 @@ type InstallationServiceClient interface { CreateBlockedEmailDomain(context.Context, *connect_go.Request[v1.CreateBlockedEmailDomainRequest]) (*connect_go.Response[v1.CreateBlockedEmailDomainResponse], error) // GetOnboardingState returns the onboarding state of the installation. GetOnboardingState(context.Context, *connect_go.Request[v1.GetOnboardingStateRequest]) (*connect_go.Response[v1.GetOnboardingStateResponse], error) + // GetInstallationConfiguration returns configuration of the installation. + GetInstallationConfiguration(context.Context, *connect_go.Request[v1.GetInstallationConfigurationRequest]) (*connect_go.Response[v1.GetInstallationConfigurationResponse], error) } // NewInstallationServiceClient constructs a client for the gitpod.v1.InstallationService service. @@ -93,6 +95,11 @@ func NewInstallationServiceClient(httpClient connect_go.HTTPClient, baseURL stri baseURL+"/gitpod.v1.InstallationService/GetOnboardingState", opts..., ), + getInstallationConfiguration: connect_go.NewClient[v1.GetInstallationConfigurationRequest, v1.GetInstallationConfigurationResponse]( + httpClient, + baseURL+"/gitpod.v1.InstallationService/GetInstallationConfiguration", + opts..., + ), } } @@ -105,6 +112,7 @@ type installationServiceClient struct { listBlockedEmailDomains *connect_go.Client[v1.ListBlockedEmailDomainsRequest, v1.ListBlockedEmailDomainsResponse] createBlockedEmailDomain *connect_go.Client[v1.CreateBlockedEmailDomainRequest, v1.CreateBlockedEmailDomainResponse] getOnboardingState *connect_go.Client[v1.GetOnboardingStateRequest, v1.GetOnboardingStateResponse] + getInstallationConfiguration *connect_go.Client[v1.GetInstallationConfigurationRequest, v1.GetInstallationConfigurationResponse] } // GetInstallationWorkspaceDefaultImage calls @@ -143,6 +151,11 @@ func (c *installationServiceClient) GetOnboardingState(ctx context.Context, req return c.getOnboardingState.CallUnary(ctx, req) } +// GetInstallationConfiguration calls gitpod.v1.InstallationService.GetInstallationConfiguration. +func (c *installationServiceClient) GetInstallationConfiguration(ctx context.Context, req *connect_go.Request[v1.GetInstallationConfigurationRequest]) (*connect_go.Response[v1.GetInstallationConfigurationResponse], error) { + return c.getInstallationConfiguration.CallUnary(ctx, req) +} + // InstallationServiceHandler is an implementation of the gitpod.v1.InstallationService service. type InstallationServiceHandler interface { // GetInstallationWorkspaceDefaultImage returns the default image for current @@ -160,6 +173,8 @@ type InstallationServiceHandler interface { CreateBlockedEmailDomain(context.Context, *connect_go.Request[v1.CreateBlockedEmailDomainRequest]) (*connect_go.Response[v1.CreateBlockedEmailDomainResponse], error) // GetOnboardingState returns the onboarding state of the installation. GetOnboardingState(context.Context, *connect_go.Request[v1.GetOnboardingStateRequest]) (*connect_go.Response[v1.GetOnboardingStateResponse], error) + // GetInstallationConfiguration returns configuration of the installation. + GetInstallationConfiguration(context.Context, *connect_go.Request[v1.GetInstallationConfigurationRequest]) (*connect_go.Response[v1.GetInstallationConfigurationResponse], error) } // NewInstallationServiceHandler builds an HTTP handler from the service implementation. It returns @@ -204,6 +219,11 @@ func NewInstallationServiceHandler(svc InstallationServiceHandler, opts ...conne svc.GetOnboardingState, opts..., )) + mux.Handle("/gitpod.v1.InstallationService/GetInstallationConfiguration", connect_go.NewUnaryHandler( + "/gitpod.v1.InstallationService/GetInstallationConfiguration", + svc.GetInstallationConfiguration, + opts..., + )) return "/gitpod.v1.InstallationService/", mux } @@ -237,3 +257,7 @@ func (UnimplementedInstallationServiceHandler) CreateBlockedEmailDomain(context. func (UnimplementedInstallationServiceHandler) GetOnboardingState(context.Context, *connect_go.Request[v1.GetOnboardingStateRequest]) (*connect_go.Response[v1.GetOnboardingStateResponse], error) { return nil, connect_go.NewError(connect_go.CodeUnimplemented, errors.New("gitpod.v1.InstallationService.GetOnboardingState is not implemented")) } + +func (UnimplementedInstallationServiceHandler) GetInstallationConfiguration(context.Context, *connect_go.Request[v1.GetInstallationConfigurationRequest]) (*connect_go.Response[v1.GetInstallationConfigurationResponse], error) { + return nil, connect_go.NewError(connect_go.CodeUnimplemented, errors.New("gitpod.v1.InstallationService.GetInstallationConfiguration is not implemented")) +} diff --git a/components/public-api/go/v1/v1connect/installation.proxy.connect.go b/components/public-api/go/v1/v1connect/installation.proxy.connect.go index f97b62c1a7f2a1..cccf4ab5b201a8 100644 --- a/components/public-api/go/v1/v1connect/installation.proxy.connect.go +++ b/components/public-api/go/v1/v1connect/installation.proxy.connect.go @@ -88,3 +88,13 @@ func (s *ProxyInstallationServiceHandler) GetOnboardingState(ctx context.Context return connect_go.NewResponse(resp), nil } + +func (s *ProxyInstallationServiceHandler) GetInstallationConfiguration(ctx context.Context, req *connect_go.Request[v1.GetInstallationConfigurationRequest]) (*connect_go.Response[v1.GetInstallationConfigurationResponse], error) { + resp, err := s.Client.GetInstallationConfiguration(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/Installation.java b/components/public-api/java/src/main/java/io/gitpod/publicapi/v1/Installation.java index d0f341bcd1e38b..15657b9b63f4ab 100644 --- a/components/public-api/java/src/main/java/io/gitpod/publicapi/v1/Installation.java +++ b/components/public-api/java/src/main/java/io/gitpod/publicapi/v1/Installation.java @@ -959,10 +959,24 @@ public interface OnboardingStateOrBuilder extends com.google.protobuf.MessageOrBuilder { /** + *
+     * Whether at least one organization has completed the onboarding
+     * 
+ * * bool completed = 1 [json_name = "completed"]; * @return The completed. */ boolean getCompleted(); + + /** + *
+     * The total number of organizations
+     * 
+ * + * int32 organization_count_total = 2 [json_name = "organizationCountTotal"]; + * @return The organizationCountTotal. + */ + int getOrganizationCountTotal(); } /** * Protobuf type {@code gitpod.v1.OnboardingState} @@ -1004,6 +1018,10 @@ private OnboardingState() { public static final int COMPLETED_FIELD_NUMBER = 1; private boolean completed_ = false; /** + *
+     * Whether at least one organization has completed the onboarding
+     * 
+ * * bool completed = 1 [json_name = "completed"]; * @return The completed. */ @@ -1012,6 +1030,21 @@ public boolean getCompleted() { return completed_; } + public static final int ORGANIZATION_COUNT_TOTAL_FIELD_NUMBER = 2; + private int organizationCountTotal_ = 0; + /** + *
+     * The total number of organizations
+     * 
+ * + * int32 organization_count_total = 2 [json_name = "organizationCountTotal"]; + * @return The organizationCountTotal. + */ + @java.lang.Override + public int getOrganizationCountTotal() { + return organizationCountTotal_; + } + private byte memoizedIsInitialized = -1; @java.lang.Override public final boolean isInitialized() { @@ -1029,6 +1062,9 @@ public void writeTo(com.google.protobuf.CodedOutputStream output) if (completed_ != false) { output.writeBool(1, completed_); } + if (organizationCountTotal_ != 0) { + output.writeInt32(2, organizationCountTotal_); + } getUnknownFields().writeTo(output); } @@ -1042,6 +1078,10 @@ public int getSerializedSize() { size += com.google.protobuf.CodedOutputStream .computeBoolSize(1, completed_); } + if (organizationCountTotal_ != 0) { + size += com.google.protobuf.CodedOutputStream + .computeInt32Size(2, organizationCountTotal_); + } size += getUnknownFields().getSerializedSize(); memoizedSize = size; return size; @@ -1059,6 +1099,8 @@ public boolean equals(final java.lang.Object obj) { if (getCompleted() != other.getCompleted()) return false; + if (getOrganizationCountTotal() + != other.getOrganizationCountTotal()) return false; if (!getUnknownFields().equals(other.getUnknownFields())) return false; return true; } @@ -1073,6 +1115,8 @@ public int hashCode() { hash = (37 * hash) + COMPLETED_FIELD_NUMBER; hash = (53 * hash) + com.google.protobuf.Internal.hashBoolean( getCompleted()); + hash = (37 * hash) + ORGANIZATION_COUNT_TOTAL_FIELD_NUMBER; + hash = (53 * hash) + getOrganizationCountTotal(); hash = (29 * hash) + getUnknownFields().hashCode(); memoizedHashCode = hash; return hash; @@ -1205,6 +1249,7 @@ public Builder clear() { super.clear(); bitField0_ = 0; completed_ = false; + organizationCountTotal_ = 0; return this; } @@ -1241,6 +1286,9 @@ private void buildPartial0(io.gitpod.publicapi.v1.Installation.OnboardingState r if (((from_bitField0_ & 0x00000001) != 0)) { result.completed_ = completed_; } + if (((from_bitField0_ & 0x00000002) != 0)) { + result.organizationCountTotal_ = organizationCountTotal_; + } } @java.lang.Override @@ -1258,6 +1306,9 @@ public Builder mergeFrom(io.gitpod.publicapi.v1.Installation.OnboardingState oth if (other.getCompleted() != false) { setCompleted(other.getCompleted()); } + if (other.getOrganizationCountTotal() != 0) { + setOrganizationCountTotal(other.getOrganizationCountTotal()); + } this.mergeUnknownFields(other.getUnknownFields()); onChanged(); return this; @@ -1289,6 +1340,11 @@ public Builder mergeFrom( bitField0_ |= 0x00000001; break; } // case 8 + case 16: { + organizationCountTotal_ = input.readInt32(); + bitField0_ |= 0x00000002; + break; + } // case 16 default: { if (!super.parseUnknownField(input, extensionRegistry, tag)) { done = true; // was an endgroup tag @@ -1308,6 +1364,10 @@ public Builder mergeFrom( private boolean completed_ ; /** + *
+       * Whether at least one organization has completed the onboarding
+       * 
+ * * bool completed = 1 [json_name = "completed"]; * @return The completed. */ @@ -1316,6 +1376,10 @@ public boolean getCompleted() { return completed_; } /** + *
+       * Whether at least one organization has completed the onboarding
+       * 
+ * * bool completed = 1 [json_name = "completed"]; * @param value The completed to set. * @return This builder for chaining. @@ -1328,6 +1392,10 @@ public Builder setCompleted(boolean value) { return this; } /** + *
+       * Whether at least one organization has completed the onboarding
+       * 
+ * * bool completed = 1 [json_name = "completed"]; * @return This builder for chaining. */ @@ -1338,6 +1406,50 @@ public Builder clearCompleted() { return this; } + private int organizationCountTotal_ ; + /** + *
+       * The total number of organizations
+       * 
+ * + * int32 organization_count_total = 2 [json_name = "organizationCountTotal"]; + * @return The organizationCountTotal. + */ + @java.lang.Override + public int getOrganizationCountTotal() { + return organizationCountTotal_; + } + /** + *
+       * The total number of organizations
+       * 
+ * + * int32 organization_count_total = 2 [json_name = "organizationCountTotal"]; + * @param value The organizationCountTotal to set. + * @return This builder for chaining. + */ + public Builder setOrganizationCountTotal(int value) { + + organizationCountTotal_ = value; + bitField0_ |= 0x00000002; + onChanged(); + return this; + } + /** + *
+       * The total number of organizations
+       * 
+ * + * int32 organization_count_total = 2 [json_name = "organizationCountTotal"]; + * @return This builder for chaining. + */ + public Builder clearOrganizationCountTotal() { + bitField0_ = (bitField0_ & ~0x00000002); + organizationCountTotal_ = 0; + onChanged(); + return this; + } + // @@protoc_insertion_point(builder_scope:gitpod.v1.OnboardingState) } @@ -11834,264 +11946,1650 @@ public io.gitpod.publicapi.v1.Installation.BlockedEmailDomain getDefaultInstance } - private static final com.google.protobuf.Descriptors.Descriptor - internal_static_gitpod_v1_GetOnboardingStateRequest_descriptor; - private static final - com.google.protobuf.GeneratedMessage.FieldAccessorTable - internal_static_gitpod_v1_GetOnboardingStateRequest_fieldAccessorTable; - private static final com.google.protobuf.Descriptors.Descriptor - internal_static_gitpod_v1_GetOnboardingStateResponse_descriptor; - private static final - com.google.protobuf.GeneratedMessage.FieldAccessorTable - internal_static_gitpod_v1_GetOnboardingStateResponse_fieldAccessorTable; - private static final com.google.protobuf.Descriptors.Descriptor - internal_static_gitpod_v1_OnboardingState_descriptor; - private static final - com.google.protobuf.GeneratedMessage.FieldAccessorTable - internal_static_gitpod_v1_OnboardingState_fieldAccessorTable; - private static final com.google.protobuf.Descriptors.Descriptor - internal_static_gitpod_v1_GetInstallationWorkspaceDefaultImageRequest_descriptor; - private static final - com.google.protobuf.GeneratedMessage.FieldAccessorTable - internal_static_gitpod_v1_GetInstallationWorkspaceDefaultImageRequest_fieldAccessorTable; - private static final com.google.protobuf.Descriptors.Descriptor - internal_static_gitpod_v1_GetInstallationWorkspaceDefaultImageResponse_descriptor; - private static final - com.google.protobuf.GeneratedMessage.FieldAccessorTable - internal_static_gitpod_v1_GetInstallationWorkspaceDefaultImageResponse_fieldAccessorTable; - private static final com.google.protobuf.Descriptors.Descriptor - internal_static_gitpod_v1_ListBlockedRepositoriesRequest_descriptor; - private static final - com.google.protobuf.GeneratedMessage.FieldAccessorTable - internal_static_gitpod_v1_ListBlockedRepositoriesRequest_fieldAccessorTable; - private static final com.google.protobuf.Descriptors.Descriptor - internal_static_gitpod_v1_ListBlockedRepositoriesResponse_descriptor; - private static final - com.google.protobuf.GeneratedMessage.FieldAccessorTable - internal_static_gitpod_v1_ListBlockedRepositoriesResponse_fieldAccessorTable; - private static final com.google.protobuf.Descriptors.Descriptor - internal_static_gitpod_v1_CreateBlockedRepositoryRequest_descriptor; - private static final - com.google.protobuf.GeneratedMessage.FieldAccessorTable - internal_static_gitpod_v1_CreateBlockedRepositoryRequest_fieldAccessorTable; - private static final com.google.protobuf.Descriptors.Descriptor - internal_static_gitpod_v1_CreateBlockedRepositoryResponse_descriptor; - private static final - com.google.protobuf.GeneratedMessage.FieldAccessorTable - internal_static_gitpod_v1_CreateBlockedRepositoryResponse_fieldAccessorTable; - private static final com.google.protobuf.Descriptors.Descriptor - internal_static_gitpod_v1_DeleteBlockedRepositoryRequest_descriptor; - private static final - com.google.protobuf.GeneratedMessage.FieldAccessorTable - internal_static_gitpod_v1_DeleteBlockedRepositoryRequest_fieldAccessorTable; - private static final com.google.protobuf.Descriptors.Descriptor - internal_static_gitpod_v1_DeleteBlockedRepositoryResponse_descriptor; - private static final - com.google.protobuf.GeneratedMessage.FieldAccessorTable - internal_static_gitpod_v1_DeleteBlockedRepositoryResponse_fieldAccessorTable; - private static final com.google.protobuf.Descriptors.Descriptor - internal_static_gitpod_v1_ListBlockedEmailDomainsRequest_descriptor; - private static final - com.google.protobuf.GeneratedMessage.FieldAccessorTable - internal_static_gitpod_v1_ListBlockedEmailDomainsRequest_fieldAccessorTable; - private static final com.google.protobuf.Descriptors.Descriptor - internal_static_gitpod_v1_ListBlockedEmailDomainsResponse_descriptor; - private static final - com.google.protobuf.GeneratedMessage.FieldAccessorTable - internal_static_gitpod_v1_ListBlockedEmailDomainsResponse_fieldAccessorTable; - private static final com.google.protobuf.Descriptors.Descriptor - internal_static_gitpod_v1_CreateBlockedEmailDomainRequest_descriptor; - private static final - com.google.protobuf.GeneratedMessage.FieldAccessorTable - internal_static_gitpod_v1_CreateBlockedEmailDomainRequest_fieldAccessorTable; - private static final com.google.protobuf.Descriptors.Descriptor - internal_static_gitpod_v1_CreateBlockedEmailDomainResponse_descriptor; - private static final - com.google.protobuf.GeneratedMessage.FieldAccessorTable - internal_static_gitpod_v1_CreateBlockedEmailDomainResponse_fieldAccessorTable; - private static final com.google.protobuf.Descriptors.Descriptor - internal_static_gitpod_v1_BlockedRepository_descriptor; - private static final - com.google.protobuf.GeneratedMessage.FieldAccessorTable - internal_static_gitpod_v1_BlockedRepository_fieldAccessorTable; - private static final com.google.protobuf.Descriptors.Descriptor - internal_static_gitpod_v1_BlockedEmailDomain_descriptor; - private static final - com.google.protobuf.GeneratedMessage.FieldAccessorTable - internal_static_gitpod_v1_BlockedEmailDomain_fieldAccessorTable; - - public static com.google.protobuf.Descriptors.FileDescriptor - getDescriptor() { - return descriptor; + public interface GetInstallationConfigurationRequestOrBuilder extends + // @@protoc_insertion_point(interface_extends:gitpod.v1.GetInstallationConfigurationRequest) + com.google.protobuf.MessageOrBuilder { } - private static com.google.protobuf.Descriptors.FileDescriptor - descriptor; - static { - java.lang.String[] descriptorData = { - "\n\034gitpod/v1/installation.proto\022\tgitpod.v" + - "1\032\032gitpod/v1/pagination.proto\032\027gitpod/v1" + - "/sorting.proto\032\037google/protobuf/timestam" + - "p.proto\"\033\n\031GetOnboardingStateRequest\"c\n\032" + - "GetOnboardingStateResponse\022E\n\020onboarding" + - "_state\030\001 \001(\0132\032.gitpod.v1.OnboardingState" + - "R\017onboardingState\"/\n\017OnboardingState\022\034\n\t" + - "completed\030\001 \001(\010R\tcompleted\"-\n+GetInstall" + - "ationWorkspaceDefaultImageRequest\"f\n,Get" + - "InstallationWorkspaceDefaultImageRespons" + - "e\0226\n\027default_workspace_image\030\001 \001(\tR\025defa" + - "ultWorkspaceImage\"\244\001\n\036ListBlockedReposit" + - "oriesRequest\022<\n\npagination\030\001 \001(\0132\034.gitpo" + - "d.v1.PaginationRequestR\npagination\022#\n\004so" + - "rt\030\002 \003(\0132\017.gitpod.v1.SortR\004sort\022\037\n\013searc" + - "h_term\030\003 \001(\tR\nsearchTerm\"\261\001\n\037ListBlocked" + - "RepositoriesResponse\022=\n\npagination\030\001 \001(\013" + - "2\035.gitpod.v1.PaginationResponseR\npaginat" + - "ion\022O\n\024blocked_repositories\030\002 \003(\0132\034.gitp" + - "od.v1.BlockedRepositoryR\023blockedReposito" + - "ries\"\210\001\n\036CreateBlockedRepositoryRequest\022" + - "\035\n\nurl_regexp\030\001 \001(\tR\turlRegexp\022\035\n\nblock_" + - "user\030\002 \001(\010R\tblockUser\022(\n\020block_free_usag" + - "e\030\003 \001(\010R\016blockFreeUsage\"n\n\037CreateBlocked" + - "RepositoryResponse\022K\n\022blocked_repository" + - "\030\001 \001(\0132\034.gitpod.v1.BlockedRepositoryR\021bl" + - "ockedRepository\"T\n\036DeleteBlockedReposito" + - "ryRequest\0222\n\025blocked_repository_id\030\001 \001(\r" + - "R\023blockedRepositoryId\"!\n\037DeleteBlockedRe" + - "positoryResponse\"^\n\036ListBlockedEmailDoma" + - "insRequest\022<\n\npagination\030\001 \001(\0132\034.gitpod." + - "v1.PaginationRequestR\npagination\"\263\001\n\037Lis" + - "tBlockedEmailDomainsResponse\022=\n\npaginati" + - "on\030\001 \001(\0132\035.gitpod.v1.PaginationResponseR" + - "\npagination\022Q\n\025blocked_email_domains\030\002 \003" + - "(\0132\035.gitpod.v1.BlockedEmailDomainR\023block" + - "edEmailDomains\"U\n\037CreateBlockedEmailDoma" + - "inRequest\022\026\n\006domain\030\001 \001(\tR\006domain\022\032\n\010neg" + - "ative\030\002 \001(\010R\010negative\"s\n CreateBlockedEm" + - "ailDomainResponse\022O\n\024blocked_email_domai" + - "n\030\001 \001(\0132\035.gitpod.v1.BlockedEmailDomainR\022" + - "blockedEmailDomain\"\211\002\n\021BlockedRepository" + - "\022\016\n\002id\030\001 \001(\rR\002id\022\035\n\nurl_regexp\030\002 \001(\tR\tur" + - "lRegexp\022\035\n\nblock_user\030\003 \001(\010R\tblockUser\022?" + - "\n\rcreation_time\030\004 \001(\0132\032.google.protobuf." + - "TimestampR\014creationTime\022;\n\013update_time\030\005" + - " \001(\0132\032.google.protobuf.TimestampR\nupdate" + - "Time\022(\n\020block_free_usage\030\006 \001(\010R\016blockFre" + - "eUsage\"X\n\022BlockedEmailDomain\022\016\n\002id\030\001 \001(\t" + - "R\002id\022\026\n\006domain\030\002 \001(\tR\006domain\022\032\n\010negative" + - "\030\003 \001(\010R\010negative2\335\006\n\023InstallationService" + - "\022\231\001\n$GetInstallationWorkspaceDefaultImag" + - "e\0226.gitpod.v1.GetInstallationWorkspaceDe" + - "faultImageRequest\0327.gitpod.v1.GetInstall" + - "ationWorkspaceDefaultImageResponse\"\000\022r\n\027" + - "ListBlockedRepositories\022).gitpod.v1.List" + - "BlockedRepositoriesRequest\032*.gitpod.v1.L" + - "istBlockedRepositoriesResponse\"\000\022r\n\027Crea" + - "teBlockedRepository\022).gitpod.v1.CreateBl" + - "ockedRepositoryRequest\032*.gitpod.v1.Creat" + - "eBlockedRepositoryResponse\"\000\022r\n\027DeleteBl" + - "ockedRepository\022).gitpod.v1.DeleteBlocke" + - "dRepositoryRequest\032*.gitpod.v1.DeleteBlo" + - "ckedRepositoryResponse\"\000\022r\n\027ListBlockedE" + - "mailDomains\022).gitpod.v1.ListBlockedEmail" + - "DomainsRequest\032*.gitpod.v1.ListBlockedEm" + - "ailDomainsResponse\"\000\022u\n\030CreateBlockedEma" + - "ilDomain\022*.gitpod.v1.CreateBlockedEmailD" + - "omainRequest\032+.gitpod.v1.CreateBlockedEm" + - "ailDomainResponse\"\000\022c\n\022GetOnboardingStat" + - "e\022$.gitpod.v1.GetOnboardingStateRequest\032" + - "%.gitpod.v1.GetOnboardingStateResponse\"\000" + - "BQ\n\026io.gitpod.publicapi.v1Z7github.com/g" + - "itpod-io/gitpod/components/public-api/go" + - "/v1b\006proto3" - }; - descriptor = com.google.protobuf.Descriptors.FileDescriptor - .internalBuildGeneratedFileFrom(descriptorData, - new com.google.protobuf.Descriptors.FileDescriptor[] { - io.gitpod.publicapi.v1.Pagination.getDescriptor(), - io.gitpod.publicapi.v1.Sorting.getDescriptor(), - com.google.protobuf.TimestampProto.getDescriptor(), - }); - internal_static_gitpod_v1_GetOnboardingStateRequest_descriptor = - getDescriptor().getMessageTypes().get(0); - internal_static_gitpod_v1_GetOnboardingStateRequest_fieldAccessorTable = new - com.google.protobuf.GeneratedMessage.FieldAccessorTable( - internal_static_gitpod_v1_GetOnboardingStateRequest_descriptor, - new java.lang.String[] { }); - internal_static_gitpod_v1_GetOnboardingStateResponse_descriptor = - getDescriptor().getMessageTypes().get(1); - internal_static_gitpod_v1_GetOnboardingStateResponse_fieldAccessorTable = new - com.google.protobuf.GeneratedMessage.FieldAccessorTable( - internal_static_gitpod_v1_GetOnboardingStateResponse_descriptor, - new java.lang.String[] { "OnboardingState", }); - internal_static_gitpod_v1_OnboardingState_descriptor = - getDescriptor().getMessageTypes().get(2); - internal_static_gitpod_v1_OnboardingState_fieldAccessorTable = new - com.google.protobuf.GeneratedMessage.FieldAccessorTable( - internal_static_gitpod_v1_OnboardingState_descriptor, - new java.lang.String[] { "Completed", }); - internal_static_gitpod_v1_GetInstallationWorkspaceDefaultImageRequest_descriptor = - getDescriptor().getMessageTypes().get(3); - internal_static_gitpod_v1_GetInstallationWorkspaceDefaultImageRequest_fieldAccessorTable = new - com.google.protobuf.GeneratedMessage.FieldAccessorTable( - internal_static_gitpod_v1_GetInstallationWorkspaceDefaultImageRequest_descriptor, - new java.lang.String[] { }); - internal_static_gitpod_v1_GetInstallationWorkspaceDefaultImageResponse_descriptor = - getDescriptor().getMessageTypes().get(4); - internal_static_gitpod_v1_GetInstallationWorkspaceDefaultImageResponse_fieldAccessorTable = new - com.google.protobuf.GeneratedMessage.FieldAccessorTable( - internal_static_gitpod_v1_GetInstallationWorkspaceDefaultImageResponse_descriptor, - new java.lang.String[] { "DefaultWorkspaceImage", }); - internal_static_gitpod_v1_ListBlockedRepositoriesRequest_descriptor = - getDescriptor().getMessageTypes().get(5); - internal_static_gitpod_v1_ListBlockedRepositoriesRequest_fieldAccessorTable = new - com.google.protobuf.GeneratedMessage.FieldAccessorTable( - internal_static_gitpod_v1_ListBlockedRepositoriesRequest_descriptor, - new java.lang.String[] { "Pagination", "Sort", "SearchTerm", }); - internal_static_gitpod_v1_ListBlockedRepositoriesResponse_descriptor = - getDescriptor().getMessageTypes().get(6); - internal_static_gitpod_v1_ListBlockedRepositoriesResponse_fieldAccessorTable = new - com.google.protobuf.GeneratedMessage.FieldAccessorTable( - internal_static_gitpod_v1_ListBlockedRepositoriesResponse_descriptor, - new java.lang.String[] { "Pagination", "BlockedRepositories", }); - internal_static_gitpod_v1_CreateBlockedRepositoryRequest_descriptor = - getDescriptor().getMessageTypes().get(7); - internal_static_gitpod_v1_CreateBlockedRepositoryRequest_fieldAccessorTable = new - com.google.protobuf.GeneratedMessage.FieldAccessorTable( - internal_static_gitpod_v1_CreateBlockedRepositoryRequest_descriptor, - new java.lang.String[] { "UrlRegexp", "BlockUser", "BlockFreeUsage", }); - internal_static_gitpod_v1_CreateBlockedRepositoryResponse_descriptor = - getDescriptor().getMessageTypes().get(8); - internal_static_gitpod_v1_CreateBlockedRepositoryResponse_fieldAccessorTable = new - com.google.protobuf.GeneratedMessage.FieldAccessorTable( - internal_static_gitpod_v1_CreateBlockedRepositoryResponse_descriptor, - new java.lang.String[] { "BlockedRepository", }); - internal_static_gitpod_v1_DeleteBlockedRepositoryRequest_descriptor = - getDescriptor().getMessageTypes().get(9); - internal_static_gitpod_v1_DeleteBlockedRepositoryRequest_fieldAccessorTable = new - com.google.protobuf.GeneratedMessage.FieldAccessorTable( - internal_static_gitpod_v1_DeleteBlockedRepositoryRequest_descriptor, - new java.lang.String[] { "BlockedRepositoryId", }); - internal_static_gitpod_v1_DeleteBlockedRepositoryResponse_descriptor = - getDescriptor().getMessageTypes().get(10); - internal_static_gitpod_v1_DeleteBlockedRepositoryResponse_fieldAccessorTable = new - com.google.protobuf.GeneratedMessage.FieldAccessorTable( - internal_static_gitpod_v1_DeleteBlockedRepositoryResponse_descriptor, - new java.lang.String[] { }); - internal_static_gitpod_v1_ListBlockedEmailDomainsRequest_descriptor = - getDescriptor().getMessageTypes().get(11); - internal_static_gitpod_v1_ListBlockedEmailDomainsRequest_fieldAccessorTable = new - com.google.protobuf.GeneratedMessage.FieldAccessorTable( - internal_static_gitpod_v1_ListBlockedEmailDomainsRequest_descriptor, - new java.lang.String[] { "Pagination", }); - internal_static_gitpod_v1_ListBlockedEmailDomainsResponse_descriptor = - getDescriptor().getMessageTypes().get(12); - internal_static_gitpod_v1_ListBlockedEmailDomainsResponse_fieldAccessorTable = new - com.google.protobuf.GeneratedMessage.FieldAccessorTable( - internal_static_gitpod_v1_ListBlockedEmailDomainsResponse_descriptor, - new java.lang.String[] { "Pagination", "BlockedEmailDomains", }); - internal_static_gitpod_v1_CreateBlockedEmailDomainRequest_descriptor = - getDescriptor().getMessageTypes().get(13); - internal_static_gitpod_v1_CreateBlockedEmailDomainRequest_fieldAccessorTable = new + /** + * Protobuf type {@code gitpod.v1.GetInstallationConfigurationRequest} + */ + public static final class GetInstallationConfigurationRequest extends + com.google.protobuf.GeneratedMessage implements + // @@protoc_insertion_point(message_implements:gitpod.v1.GetInstallationConfigurationRequest) + GetInstallationConfigurationRequestOrBuilder { + 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= */ "", + GetInstallationConfigurationRequest.class.getName()); + } + // Use GetInstallationConfigurationRequest.newBuilder() to construct. + private GetInstallationConfigurationRequest(com.google.protobuf.GeneratedMessage.Builder builder) { + super(builder); + } + private GetInstallationConfigurationRequest() { + } + + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return io.gitpod.publicapi.v1.Installation.internal_static_gitpod_v1_GetInstallationConfigurationRequest_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return io.gitpod.publicapi.v1.Installation.internal_static_gitpod_v1_GetInstallationConfigurationRequest_fieldAccessorTable + .ensureFieldAccessorsInitialized( + io.gitpod.publicapi.v1.Installation.GetInstallationConfigurationRequest.class, io.gitpod.publicapi.v1.Installation.GetInstallationConfigurationRequest.Builder.class); + } + + 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 { + getUnknownFields().writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + 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.Installation.GetInstallationConfigurationRequest)) { + return super.equals(obj); + } + io.gitpod.publicapi.v1.Installation.GetInstallationConfigurationRequest other = (io.gitpod.publicapi.v1.Installation.GetInstallationConfigurationRequest) obj; + + 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 = (29 * hash) + getUnknownFields().hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static io.gitpod.publicapi.v1.Installation.GetInstallationConfigurationRequest parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static io.gitpod.publicapi.v1.Installation.GetInstallationConfigurationRequest 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.Installation.GetInstallationConfigurationRequest parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static io.gitpod.publicapi.v1.Installation.GetInstallationConfigurationRequest 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.Installation.GetInstallationConfigurationRequest parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static io.gitpod.publicapi.v1.Installation.GetInstallationConfigurationRequest parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static io.gitpod.publicapi.v1.Installation.GetInstallationConfigurationRequest parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessage + .parseWithIOException(PARSER, input); + } + public static io.gitpod.publicapi.v1.Installation.GetInstallationConfigurationRequest 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.Installation.GetInstallationConfigurationRequest parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessage + .parseDelimitedWithIOException(PARSER, input); + } + + public static io.gitpod.publicapi.v1.Installation.GetInstallationConfigurationRequest 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.Installation.GetInstallationConfigurationRequest parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessage + .parseWithIOException(PARSER, input); + } + public static io.gitpod.publicapi.v1.Installation.GetInstallationConfigurationRequest 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.Installation.GetInstallationConfigurationRequest 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.GetInstallationConfigurationRequest} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessage.Builder implements + // @@protoc_insertion_point(builder_implements:gitpod.v1.GetInstallationConfigurationRequest) + io.gitpod.publicapi.v1.Installation.GetInstallationConfigurationRequestOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return io.gitpod.publicapi.v1.Installation.internal_static_gitpod_v1_GetInstallationConfigurationRequest_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return io.gitpod.publicapi.v1.Installation.internal_static_gitpod_v1_GetInstallationConfigurationRequest_fieldAccessorTable + .ensureFieldAccessorsInitialized( + io.gitpod.publicapi.v1.Installation.GetInstallationConfigurationRequest.class, io.gitpod.publicapi.v1.Installation.GetInstallationConfigurationRequest.Builder.class); + } + + // Construct using io.gitpod.publicapi.v1.Installation.GetInstallationConfigurationRequest.newBuilder() + private Builder() { + + } + + private Builder( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + super(parent); + + } + @java.lang.Override + public Builder clear() { + super.clear(); + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return io.gitpod.publicapi.v1.Installation.internal_static_gitpod_v1_GetInstallationConfigurationRequest_descriptor; + } + + @java.lang.Override + public io.gitpod.publicapi.v1.Installation.GetInstallationConfigurationRequest getDefaultInstanceForType() { + return io.gitpod.publicapi.v1.Installation.GetInstallationConfigurationRequest.getDefaultInstance(); + } + + @java.lang.Override + public io.gitpod.publicapi.v1.Installation.GetInstallationConfigurationRequest build() { + io.gitpod.publicapi.v1.Installation.GetInstallationConfigurationRequest result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public io.gitpod.publicapi.v1.Installation.GetInstallationConfigurationRequest buildPartial() { + io.gitpod.publicapi.v1.Installation.GetInstallationConfigurationRequest result = new io.gitpod.publicapi.v1.Installation.GetInstallationConfigurationRequest(this); + onBuilt(); + return result; + } + + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof io.gitpod.publicapi.v1.Installation.GetInstallationConfigurationRequest) { + return mergeFrom((io.gitpod.publicapi.v1.Installation.GetInstallationConfigurationRequest)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(io.gitpod.publicapi.v1.Installation.GetInstallationConfigurationRequest other) { + if (other == io.gitpod.publicapi.v1.Installation.GetInstallationConfigurationRequest.getDefaultInstance()) return this; + 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; + 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; + } + + // @@protoc_insertion_point(builder_scope:gitpod.v1.GetInstallationConfigurationRequest) + } + + // @@protoc_insertion_point(class_scope:gitpod.v1.GetInstallationConfigurationRequest) + private static final io.gitpod.publicapi.v1.Installation.GetInstallationConfigurationRequest DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new io.gitpod.publicapi.v1.Installation.GetInstallationConfigurationRequest(); + } + + public static io.gitpod.publicapi.v1.Installation.GetInstallationConfigurationRequest getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + private static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { + @java.lang.Override + public GetInstallationConfigurationRequest 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.Installation.GetInstallationConfigurationRequest getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + + public interface GetInstallationConfigurationResponseOrBuilder extends + // @@protoc_insertion_point(interface_extends:gitpod.v1.GetInstallationConfigurationResponse) + com.google.protobuf.MessageOrBuilder { + + /** + * .gitpod.v1.InstallationConfiguration configuration = 1 [json_name = "configuration"]; + * @return Whether the configuration field is set. + */ + boolean hasConfiguration(); + /** + * .gitpod.v1.InstallationConfiguration configuration = 1 [json_name = "configuration"]; + * @return The configuration. + */ + io.gitpod.publicapi.v1.Installation.InstallationConfiguration getConfiguration(); + /** + * .gitpod.v1.InstallationConfiguration configuration = 1 [json_name = "configuration"]; + */ + io.gitpod.publicapi.v1.Installation.InstallationConfigurationOrBuilder getConfigurationOrBuilder(); + } + /** + * Protobuf type {@code gitpod.v1.GetInstallationConfigurationResponse} + */ + public static final class GetInstallationConfigurationResponse extends + com.google.protobuf.GeneratedMessage implements + // @@protoc_insertion_point(message_implements:gitpod.v1.GetInstallationConfigurationResponse) + GetInstallationConfigurationResponseOrBuilder { + 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= */ "", + GetInstallationConfigurationResponse.class.getName()); + } + // Use GetInstallationConfigurationResponse.newBuilder() to construct. + private GetInstallationConfigurationResponse(com.google.protobuf.GeneratedMessage.Builder builder) { + super(builder); + } + private GetInstallationConfigurationResponse() { + } + + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return io.gitpod.publicapi.v1.Installation.internal_static_gitpod_v1_GetInstallationConfigurationResponse_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return io.gitpod.publicapi.v1.Installation.internal_static_gitpod_v1_GetInstallationConfigurationResponse_fieldAccessorTable + .ensureFieldAccessorsInitialized( + io.gitpod.publicapi.v1.Installation.GetInstallationConfigurationResponse.class, io.gitpod.publicapi.v1.Installation.GetInstallationConfigurationResponse.Builder.class); + } + + private int bitField0_; + public static final int CONFIGURATION_FIELD_NUMBER = 1; + private io.gitpod.publicapi.v1.Installation.InstallationConfiguration configuration_; + /** + * .gitpod.v1.InstallationConfiguration configuration = 1 [json_name = "configuration"]; + * @return Whether the configuration field is set. + */ + @java.lang.Override + public boolean hasConfiguration() { + return ((bitField0_ & 0x00000001) != 0); + } + /** + * .gitpod.v1.InstallationConfiguration configuration = 1 [json_name = "configuration"]; + * @return The configuration. + */ + @java.lang.Override + public io.gitpod.publicapi.v1.Installation.InstallationConfiguration getConfiguration() { + return configuration_ == null ? io.gitpod.publicapi.v1.Installation.InstallationConfiguration.getDefaultInstance() : configuration_; + } + /** + * .gitpod.v1.InstallationConfiguration configuration = 1 [json_name = "configuration"]; + */ + @java.lang.Override + public io.gitpod.publicapi.v1.Installation.InstallationConfigurationOrBuilder getConfigurationOrBuilder() { + return configuration_ == null ? io.gitpod.publicapi.v1.Installation.InstallationConfiguration.getDefaultInstance() : configuration_; + } + + 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 (((bitField0_ & 0x00000001) != 0)) { + output.writeMessage(1, getConfiguration()); + } + getUnknownFields().writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) != 0)) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(1, getConfiguration()); + } + 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.Installation.GetInstallationConfigurationResponse)) { + return super.equals(obj); + } + io.gitpod.publicapi.v1.Installation.GetInstallationConfigurationResponse other = (io.gitpod.publicapi.v1.Installation.GetInstallationConfigurationResponse) obj; + + if (hasConfiguration() != other.hasConfiguration()) return false; + if (hasConfiguration()) { + if (!getConfiguration() + .equals(other.getConfiguration())) 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(); + if (hasConfiguration()) { + hash = (37 * hash) + CONFIGURATION_FIELD_NUMBER; + hash = (53 * hash) + getConfiguration().hashCode(); + } + hash = (29 * hash) + getUnknownFields().hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static io.gitpod.publicapi.v1.Installation.GetInstallationConfigurationResponse parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static io.gitpod.publicapi.v1.Installation.GetInstallationConfigurationResponse 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.Installation.GetInstallationConfigurationResponse parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static io.gitpod.publicapi.v1.Installation.GetInstallationConfigurationResponse 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.Installation.GetInstallationConfigurationResponse parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static io.gitpod.publicapi.v1.Installation.GetInstallationConfigurationResponse parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static io.gitpod.publicapi.v1.Installation.GetInstallationConfigurationResponse parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessage + .parseWithIOException(PARSER, input); + } + public static io.gitpod.publicapi.v1.Installation.GetInstallationConfigurationResponse 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.Installation.GetInstallationConfigurationResponse parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessage + .parseDelimitedWithIOException(PARSER, input); + } + + public static io.gitpod.publicapi.v1.Installation.GetInstallationConfigurationResponse 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.Installation.GetInstallationConfigurationResponse parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessage + .parseWithIOException(PARSER, input); + } + public static io.gitpod.publicapi.v1.Installation.GetInstallationConfigurationResponse 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.Installation.GetInstallationConfigurationResponse 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.GetInstallationConfigurationResponse} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessage.Builder implements + // @@protoc_insertion_point(builder_implements:gitpod.v1.GetInstallationConfigurationResponse) + io.gitpod.publicapi.v1.Installation.GetInstallationConfigurationResponseOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return io.gitpod.publicapi.v1.Installation.internal_static_gitpod_v1_GetInstallationConfigurationResponse_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return io.gitpod.publicapi.v1.Installation.internal_static_gitpod_v1_GetInstallationConfigurationResponse_fieldAccessorTable + .ensureFieldAccessorsInitialized( + io.gitpod.publicapi.v1.Installation.GetInstallationConfigurationResponse.class, io.gitpod.publicapi.v1.Installation.GetInstallationConfigurationResponse.Builder.class); + } + + // Construct using io.gitpod.publicapi.v1.Installation.GetInstallationConfigurationResponse.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessage + .alwaysUseFieldBuilders) { + getConfigurationFieldBuilder(); + } + } + @java.lang.Override + public Builder clear() { + super.clear(); + bitField0_ = 0; + configuration_ = null; + if (configurationBuilder_ != null) { + configurationBuilder_.dispose(); + configurationBuilder_ = null; + } + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return io.gitpod.publicapi.v1.Installation.internal_static_gitpod_v1_GetInstallationConfigurationResponse_descriptor; + } + + @java.lang.Override + public io.gitpod.publicapi.v1.Installation.GetInstallationConfigurationResponse getDefaultInstanceForType() { + return io.gitpod.publicapi.v1.Installation.GetInstallationConfigurationResponse.getDefaultInstance(); + } + + @java.lang.Override + public io.gitpod.publicapi.v1.Installation.GetInstallationConfigurationResponse build() { + io.gitpod.publicapi.v1.Installation.GetInstallationConfigurationResponse result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public io.gitpod.publicapi.v1.Installation.GetInstallationConfigurationResponse buildPartial() { + io.gitpod.publicapi.v1.Installation.GetInstallationConfigurationResponse result = new io.gitpod.publicapi.v1.Installation.GetInstallationConfigurationResponse(this); + if (bitField0_ != 0) { buildPartial0(result); } + onBuilt(); + return result; + } + + private void buildPartial0(io.gitpod.publicapi.v1.Installation.GetInstallationConfigurationResponse result) { + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) != 0)) { + result.configuration_ = configurationBuilder_ == null + ? configuration_ + : configurationBuilder_.build(); + to_bitField0_ |= 0x00000001; + } + result.bitField0_ |= to_bitField0_; + } + + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof io.gitpod.publicapi.v1.Installation.GetInstallationConfigurationResponse) { + return mergeFrom((io.gitpod.publicapi.v1.Installation.GetInstallationConfigurationResponse)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(io.gitpod.publicapi.v1.Installation.GetInstallationConfigurationResponse other) { + if (other == io.gitpod.publicapi.v1.Installation.GetInstallationConfigurationResponse.getDefaultInstance()) return this; + if (other.hasConfiguration()) { + mergeConfiguration(other.getConfiguration()); + } + 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: { + input.readMessage( + getConfigurationFieldBuilder().getBuilder(), + extensionRegistry); + 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 io.gitpod.publicapi.v1.Installation.InstallationConfiguration configuration_; + private com.google.protobuf.SingleFieldBuilder< + io.gitpod.publicapi.v1.Installation.InstallationConfiguration, io.gitpod.publicapi.v1.Installation.InstallationConfiguration.Builder, io.gitpod.publicapi.v1.Installation.InstallationConfigurationOrBuilder> configurationBuilder_; + /** + * .gitpod.v1.InstallationConfiguration configuration = 1 [json_name = "configuration"]; + * @return Whether the configuration field is set. + */ + public boolean hasConfiguration() { + return ((bitField0_ & 0x00000001) != 0); + } + /** + * .gitpod.v1.InstallationConfiguration configuration = 1 [json_name = "configuration"]; + * @return The configuration. + */ + public io.gitpod.publicapi.v1.Installation.InstallationConfiguration getConfiguration() { + if (configurationBuilder_ == null) { + return configuration_ == null ? io.gitpod.publicapi.v1.Installation.InstallationConfiguration.getDefaultInstance() : configuration_; + } else { + return configurationBuilder_.getMessage(); + } + } + /** + * .gitpod.v1.InstallationConfiguration configuration = 1 [json_name = "configuration"]; + */ + public Builder setConfiguration(io.gitpod.publicapi.v1.Installation.InstallationConfiguration value) { + if (configurationBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + configuration_ = value; + } else { + configurationBuilder_.setMessage(value); + } + bitField0_ |= 0x00000001; + onChanged(); + return this; + } + /** + * .gitpod.v1.InstallationConfiguration configuration = 1 [json_name = "configuration"]; + */ + public Builder setConfiguration( + io.gitpod.publicapi.v1.Installation.InstallationConfiguration.Builder builderForValue) { + if (configurationBuilder_ == null) { + configuration_ = builderForValue.build(); + } else { + configurationBuilder_.setMessage(builderForValue.build()); + } + bitField0_ |= 0x00000001; + onChanged(); + return this; + } + /** + * .gitpod.v1.InstallationConfiguration configuration = 1 [json_name = "configuration"]; + */ + public Builder mergeConfiguration(io.gitpod.publicapi.v1.Installation.InstallationConfiguration value) { + if (configurationBuilder_ == null) { + if (((bitField0_ & 0x00000001) != 0) && + configuration_ != null && + configuration_ != io.gitpod.publicapi.v1.Installation.InstallationConfiguration.getDefaultInstance()) { + getConfigurationBuilder().mergeFrom(value); + } else { + configuration_ = value; + } + } else { + configurationBuilder_.mergeFrom(value); + } + if (configuration_ != null) { + bitField0_ |= 0x00000001; + onChanged(); + } + return this; + } + /** + * .gitpod.v1.InstallationConfiguration configuration = 1 [json_name = "configuration"]; + */ + public Builder clearConfiguration() { + bitField0_ = (bitField0_ & ~0x00000001); + configuration_ = null; + if (configurationBuilder_ != null) { + configurationBuilder_.dispose(); + configurationBuilder_ = null; + } + onChanged(); + return this; + } + /** + * .gitpod.v1.InstallationConfiguration configuration = 1 [json_name = "configuration"]; + */ + public io.gitpod.publicapi.v1.Installation.InstallationConfiguration.Builder getConfigurationBuilder() { + bitField0_ |= 0x00000001; + onChanged(); + return getConfigurationFieldBuilder().getBuilder(); + } + /** + * .gitpod.v1.InstallationConfiguration configuration = 1 [json_name = "configuration"]; + */ + public io.gitpod.publicapi.v1.Installation.InstallationConfigurationOrBuilder getConfigurationOrBuilder() { + if (configurationBuilder_ != null) { + return configurationBuilder_.getMessageOrBuilder(); + } else { + return configuration_ == null ? + io.gitpod.publicapi.v1.Installation.InstallationConfiguration.getDefaultInstance() : configuration_; + } + } + /** + * .gitpod.v1.InstallationConfiguration configuration = 1 [json_name = "configuration"]; + */ + private com.google.protobuf.SingleFieldBuilder< + io.gitpod.publicapi.v1.Installation.InstallationConfiguration, io.gitpod.publicapi.v1.Installation.InstallationConfiguration.Builder, io.gitpod.publicapi.v1.Installation.InstallationConfigurationOrBuilder> + getConfigurationFieldBuilder() { + if (configurationBuilder_ == null) { + configurationBuilder_ = new com.google.protobuf.SingleFieldBuilder< + io.gitpod.publicapi.v1.Installation.InstallationConfiguration, io.gitpod.publicapi.v1.Installation.InstallationConfiguration.Builder, io.gitpod.publicapi.v1.Installation.InstallationConfigurationOrBuilder>( + getConfiguration(), + getParentForChildren(), + isClean()); + configuration_ = null; + } + return configurationBuilder_; + } + + // @@protoc_insertion_point(builder_scope:gitpod.v1.GetInstallationConfigurationResponse) + } + + // @@protoc_insertion_point(class_scope:gitpod.v1.GetInstallationConfigurationResponse) + private static final io.gitpod.publicapi.v1.Installation.GetInstallationConfigurationResponse DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new io.gitpod.publicapi.v1.Installation.GetInstallationConfigurationResponse(); + } + + public static io.gitpod.publicapi.v1.Installation.GetInstallationConfigurationResponse getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + private static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { + @java.lang.Override + public GetInstallationConfigurationResponse 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.Installation.GetInstallationConfigurationResponse getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + + public interface InstallationConfigurationOrBuilder extends + // @@protoc_insertion_point(interface_extends:gitpod.v1.InstallationConfiguration) + com.google.protobuf.MessageOrBuilder { + + /** + * bool is_dedicated_installation = 1 [json_name = "isDedicatedInstallation"]; + * @return The isDedicatedInstallation. + */ + boolean getIsDedicatedInstallation(); + } + /** + * Protobuf type {@code gitpod.v1.InstallationConfiguration} + */ + public static final class InstallationConfiguration extends + com.google.protobuf.GeneratedMessage implements + // @@protoc_insertion_point(message_implements:gitpod.v1.InstallationConfiguration) + InstallationConfigurationOrBuilder { + 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= */ "", + InstallationConfiguration.class.getName()); + } + // Use InstallationConfiguration.newBuilder() to construct. + private InstallationConfiguration(com.google.protobuf.GeneratedMessage.Builder builder) { + super(builder); + } + private InstallationConfiguration() { + } + + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return io.gitpod.publicapi.v1.Installation.internal_static_gitpod_v1_InstallationConfiguration_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return io.gitpod.publicapi.v1.Installation.internal_static_gitpod_v1_InstallationConfiguration_fieldAccessorTable + .ensureFieldAccessorsInitialized( + io.gitpod.publicapi.v1.Installation.InstallationConfiguration.class, io.gitpod.publicapi.v1.Installation.InstallationConfiguration.Builder.class); + } + + public static final int IS_DEDICATED_INSTALLATION_FIELD_NUMBER = 1; + private boolean isDedicatedInstallation_ = false; + /** + * bool is_dedicated_installation = 1 [json_name = "isDedicatedInstallation"]; + * @return The isDedicatedInstallation. + */ + @java.lang.Override + public boolean getIsDedicatedInstallation() { + return isDedicatedInstallation_; + } + + 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 (isDedicatedInstallation_ != false) { + output.writeBool(1, isDedicatedInstallation_); + } + getUnknownFields().writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (isDedicatedInstallation_ != false) { + size += com.google.protobuf.CodedOutputStream + .computeBoolSize(1, isDedicatedInstallation_); + } + 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.Installation.InstallationConfiguration)) { + return super.equals(obj); + } + io.gitpod.publicapi.v1.Installation.InstallationConfiguration other = (io.gitpod.publicapi.v1.Installation.InstallationConfiguration) obj; + + if (getIsDedicatedInstallation() + != other.getIsDedicatedInstallation()) 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) + IS_DEDICATED_INSTALLATION_FIELD_NUMBER; + hash = (53 * hash) + com.google.protobuf.Internal.hashBoolean( + getIsDedicatedInstallation()); + hash = (29 * hash) + getUnknownFields().hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static io.gitpod.publicapi.v1.Installation.InstallationConfiguration parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static io.gitpod.publicapi.v1.Installation.InstallationConfiguration 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.Installation.InstallationConfiguration parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static io.gitpod.publicapi.v1.Installation.InstallationConfiguration 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.Installation.InstallationConfiguration parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static io.gitpod.publicapi.v1.Installation.InstallationConfiguration parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static io.gitpod.publicapi.v1.Installation.InstallationConfiguration parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessage + .parseWithIOException(PARSER, input); + } + public static io.gitpod.publicapi.v1.Installation.InstallationConfiguration 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.Installation.InstallationConfiguration parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessage + .parseDelimitedWithIOException(PARSER, input); + } + + public static io.gitpod.publicapi.v1.Installation.InstallationConfiguration 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.Installation.InstallationConfiguration parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessage + .parseWithIOException(PARSER, input); + } + public static io.gitpod.publicapi.v1.Installation.InstallationConfiguration 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.Installation.InstallationConfiguration 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.InstallationConfiguration} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessage.Builder implements + // @@protoc_insertion_point(builder_implements:gitpod.v1.InstallationConfiguration) + io.gitpod.publicapi.v1.Installation.InstallationConfigurationOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return io.gitpod.publicapi.v1.Installation.internal_static_gitpod_v1_InstallationConfiguration_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return io.gitpod.publicapi.v1.Installation.internal_static_gitpod_v1_InstallationConfiguration_fieldAccessorTable + .ensureFieldAccessorsInitialized( + io.gitpod.publicapi.v1.Installation.InstallationConfiguration.class, io.gitpod.publicapi.v1.Installation.InstallationConfiguration.Builder.class); + } + + // Construct using io.gitpod.publicapi.v1.Installation.InstallationConfiguration.newBuilder() + private Builder() { + + } + + private Builder( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + super(parent); + + } + @java.lang.Override + public Builder clear() { + super.clear(); + bitField0_ = 0; + isDedicatedInstallation_ = false; + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return io.gitpod.publicapi.v1.Installation.internal_static_gitpod_v1_InstallationConfiguration_descriptor; + } + + @java.lang.Override + public io.gitpod.publicapi.v1.Installation.InstallationConfiguration getDefaultInstanceForType() { + return io.gitpod.publicapi.v1.Installation.InstallationConfiguration.getDefaultInstance(); + } + + @java.lang.Override + public io.gitpod.publicapi.v1.Installation.InstallationConfiguration build() { + io.gitpod.publicapi.v1.Installation.InstallationConfiguration result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public io.gitpod.publicapi.v1.Installation.InstallationConfiguration buildPartial() { + io.gitpod.publicapi.v1.Installation.InstallationConfiguration result = new io.gitpod.publicapi.v1.Installation.InstallationConfiguration(this); + if (bitField0_ != 0) { buildPartial0(result); } + onBuilt(); + return result; + } + + private void buildPartial0(io.gitpod.publicapi.v1.Installation.InstallationConfiguration result) { + int from_bitField0_ = bitField0_; + if (((from_bitField0_ & 0x00000001) != 0)) { + result.isDedicatedInstallation_ = isDedicatedInstallation_; + } + } + + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof io.gitpod.publicapi.v1.Installation.InstallationConfiguration) { + return mergeFrom((io.gitpod.publicapi.v1.Installation.InstallationConfiguration)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(io.gitpod.publicapi.v1.Installation.InstallationConfiguration other) { + if (other == io.gitpod.publicapi.v1.Installation.InstallationConfiguration.getDefaultInstance()) return this; + if (other.getIsDedicatedInstallation() != false) { + setIsDedicatedInstallation(other.getIsDedicatedInstallation()); + } + 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: { + isDedicatedInstallation_ = 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 isDedicatedInstallation_ ; + /** + * bool is_dedicated_installation = 1 [json_name = "isDedicatedInstallation"]; + * @return The isDedicatedInstallation. + */ + @java.lang.Override + public boolean getIsDedicatedInstallation() { + return isDedicatedInstallation_; + } + /** + * bool is_dedicated_installation = 1 [json_name = "isDedicatedInstallation"]; + * @param value The isDedicatedInstallation to set. + * @return This builder for chaining. + */ + public Builder setIsDedicatedInstallation(boolean value) { + + isDedicatedInstallation_ = value; + bitField0_ |= 0x00000001; + onChanged(); + return this; + } + /** + * bool is_dedicated_installation = 1 [json_name = "isDedicatedInstallation"]; + * @return This builder for chaining. + */ + public Builder clearIsDedicatedInstallation() { + bitField0_ = (bitField0_ & ~0x00000001); + isDedicatedInstallation_ = false; + onChanged(); + return this; + } + + // @@protoc_insertion_point(builder_scope:gitpod.v1.InstallationConfiguration) + } + + // @@protoc_insertion_point(class_scope:gitpod.v1.InstallationConfiguration) + private static final io.gitpod.publicapi.v1.Installation.InstallationConfiguration DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new io.gitpod.publicapi.v1.Installation.InstallationConfiguration(); + } + + public static io.gitpod.publicapi.v1.Installation.InstallationConfiguration getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + private static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { + @java.lang.Override + public InstallationConfiguration 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.Installation.InstallationConfiguration getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_gitpod_v1_GetOnboardingStateRequest_descriptor; + private static final + com.google.protobuf.GeneratedMessage.FieldAccessorTable + internal_static_gitpod_v1_GetOnboardingStateRequest_fieldAccessorTable; + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_gitpod_v1_GetOnboardingStateResponse_descriptor; + private static final + com.google.protobuf.GeneratedMessage.FieldAccessorTable + internal_static_gitpod_v1_GetOnboardingStateResponse_fieldAccessorTable; + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_gitpod_v1_OnboardingState_descriptor; + private static final + com.google.protobuf.GeneratedMessage.FieldAccessorTable + internal_static_gitpod_v1_OnboardingState_fieldAccessorTable; + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_gitpod_v1_GetInstallationWorkspaceDefaultImageRequest_descriptor; + private static final + com.google.protobuf.GeneratedMessage.FieldAccessorTable + internal_static_gitpod_v1_GetInstallationWorkspaceDefaultImageRequest_fieldAccessorTable; + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_gitpod_v1_GetInstallationWorkspaceDefaultImageResponse_descriptor; + private static final + com.google.protobuf.GeneratedMessage.FieldAccessorTable + internal_static_gitpod_v1_GetInstallationWorkspaceDefaultImageResponse_fieldAccessorTable; + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_gitpod_v1_ListBlockedRepositoriesRequest_descriptor; + private static final + com.google.protobuf.GeneratedMessage.FieldAccessorTable + internal_static_gitpod_v1_ListBlockedRepositoriesRequest_fieldAccessorTable; + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_gitpod_v1_ListBlockedRepositoriesResponse_descriptor; + private static final + com.google.protobuf.GeneratedMessage.FieldAccessorTable + internal_static_gitpod_v1_ListBlockedRepositoriesResponse_fieldAccessorTable; + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_gitpod_v1_CreateBlockedRepositoryRequest_descriptor; + private static final + com.google.protobuf.GeneratedMessage.FieldAccessorTable + internal_static_gitpod_v1_CreateBlockedRepositoryRequest_fieldAccessorTable; + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_gitpod_v1_CreateBlockedRepositoryResponse_descriptor; + private static final + com.google.protobuf.GeneratedMessage.FieldAccessorTable + internal_static_gitpod_v1_CreateBlockedRepositoryResponse_fieldAccessorTable; + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_gitpod_v1_DeleteBlockedRepositoryRequest_descriptor; + private static final + com.google.protobuf.GeneratedMessage.FieldAccessorTable + internal_static_gitpod_v1_DeleteBlockedRepositoryRequest_fieldAccessorTable; + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_gitpod_v1_DeleteBlockedRepositoryResponse_descriptor; + private static final + com.google.protobuf.GeneratedMessage.FieldAccessorTable + internal_static_gitpod_v1_DeleteBlockedRepositoryResponse_fieldAccessorTable; + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_gitpod_v1_ListBlockedEmailDomainsRequest_descriptor; + private static final + com.google.protobuf.GeneratedMessage.FieldAccessorTable + internal_static_gitpod_v1_ListBlockedEmailDomainsRequest_fieldAccessorTable; + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_gitpod_v1_ListBlockedEmailDomainsResponse_descriptor; + private static final + com.google.protobuf.GeneratedMessage.FieldAccessorTable + internal_static_gitpod_v1_ListBlockedEmailDomainsResponse_fieldAccessorTable; + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_gitpod_v1_CreateBlockedEmailDomainRequest_descriptor; + private static final + com.google.protobuf.GeneratedMessage.FieldAccessorTable + internal_static_gitpod_v1_CreateBlockedEmailDomainRequest_fieldAccessorTable; + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_gitpod_v1_CreateBlockedEmailDomainResponse_descriptor; + private static final + com.google.protobuf.GeneratedMessage.FieldAccessorTable + internal_static_gitpod_v1_CreateBlockedEmailDomainResponse_fieldAccessorTable; + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_gitpod_v1_BlockedRepository_descriptor; + private static final + com.google.protobuf.GeneratedMessage.FieldAccessorTable + internal_static_gitpod_v1_BlockedRepository_fieldAccessorTable; + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_gitpod_v1_BlockedEmailDomain_descriptor; + private static final + com.google.protobuf.GeneratedMessage.FieldAccessorTable + internal_static_gitpod_v1_BlockedEmailDomain_fieldAccessorTable; + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_gitpod_v1_GetInstallationConfigurationRequest_descriptor; + private static final + com.google.protobuf.GeneratedMessage.FieldAccessorTable + internal_static_gitpod_v1_GetInstallationConfigurationRequest_fieldAccessorTable; + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_gitpod_v1_GetInstallationConfigurationResponse_descriptor; + private static final + com.google.protobuf.GeneratedMessage.FieldAccessorTable + internal_static_gitpod_v1_GetInstallationConfigurationResponse_fieldAccessorTable; + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_gitpod_v1_InstallationConfiguration_descriptor; + private static final + com.google.protobuf.GeneratedMessage.FieldAccessorTable + internal_static_gitpod_v1_InstallationConfiguration_fieldAccessorTable; + + public static com.google.protobuf.Descriptors.FileDescriptor + getDescriptor() { + return descriptor; + } + private static com.google.protobuf.Descriptors.FileDescriptor + descriptor; + static { + java.lang.String[] descriptorData = { + "\n\034gitpod/v1/installation.proto\022\tgitpod.v" + + "1\032\032gitpod/v1/pagination.proto\032\027gitpod/v1" + + "/sorting.proto\032\037google/protobuf/timestam" + + "p.proto\"\033\n\031GetOnboardingStateRequest\"c\n\032" + + "GetOnboardingStateResponse\022E\n\020onboarding" + + "_state\030\001 \001(\0132\032.gitpod.v1.OnboardingState" + + "R\017onboardingState\"i\n\017OnboardingState\022\034\n\t" + + "completed\030\001 \001(\010R\tcompleted\0228\n\030organizati" + + "on_count_total\030\002 \001(\005R\026organizationCountT" + + "otal\"-\n+GetInstallationWorkspaceDefaultI" + + "mageRequest\"f\n,GetInstallationWorkspaceD" + + "efaultImageResponse\0226\n\027default_workspace" + + "_image\030\001 \001(\tR\025defaultWorkspaceImage\"\244\001\n\036" + + "ListBlockedRepositoriesRequest\022<\n\npagina" + + "tion\030\001 \001(\0132\034.gitpod.v1.PaginationRequest" + + "R\npagination\022#\n\004sort\030\002 \003(\0132\017.gitpod.v1.S" + + "ortR\004sort\022\037\n\013search_term\030\003 \001(\tR\nsearchTe" + + "rm\"\261\001\n\037ListBlockedRepositoriesResponse\022=" + + "\n\npagination\030\001 \001(\0132\035.gitpod.v1.Paginatio" + + "nResponseR\npagination\022O\n\024blocked_reposit" + + "ories\030\002 \003(\0132\034.gitpod.v1.BlockedRepositor" + + "yR\023blockedRepositories\"\210\001\n\036CreateBlocked" + + "RepositoryRequest\022\035\n\nurl_regexp\030\001 \001(\tR\tu" + + "rlRegexp\022\035\n\nblock_user\030\002 \001(\010R\tblockUser\022" + + "(\n\020block_free_usage\030\003 \001(\010R\016blockFreeUsag" + + "e\"n\n\037CreateBlockedRepositoryResponse\022K\n\022" + + "blocked_repository\030\001 \001(\0132\034.gitpod.v1.Blo" + + "ckedRepositoryR\021blockedRepository\"T\n\036Del" + + "eteBlockedRepositoryRequest\0222\n\025blocked_r" + + "epository_id\030\001 \001(\rR\023blockedRepositoryId\"" + + "!\n\037DeleteBlockedRepositoryResponse\"^\n\036Li" + + "stBlockedEmailDomainsRequest\022<\n\npaginati" + + "on\030\001 \001(\0132\034.gitpod.v1.PaginationRequestR\n" + + "pagination\"\263\001\n\037ListBlockedEmailDomainsRe" + + "sponse\022=\n\npagination\030\001 \001(\0132\035.gitpod.v1.P" + + "aginationResponseR\npagination\022Q\n\025blocked" + + "_email_domains\030\002 \003(\0132\035.gitpod.v1.Blocked" + + "EmailDomainR\023blockedEmailDomains\"U\n\037Crea" + + "teBlockedEmailDomainRequest\022\026\n\006domain\030\001 " + + "\001(\tR\006domain\022\032\n\010negative\030\002 \001(\010R\010negative\"" + + "s\n CreateBlockedEmailDomainResponse\022O\n\024b" + + "locked_email_domain\030\001 \001(\0132\035.gitpod.v1.Bl" + + "ockedEmailDomainR\022blockedEmailDomain\"\211\002\n" + + "\021BlockedRepository\022\016\n\002id\030\001 \001(\rR\002id\022\035\n\nur" + + "l_regexp\030\002 \001(\tR\turlRegexp\022\035\n\nblock_user\030" + + "\003 \001(\010R\tblockUser\022?\n\rcreation_time\030\004 \001(\0132" + + "\032.google.protobuf.TimestampR\014creationTim" + + "e\022;\n\013update_time\030\005 \001(\0132\032.google.protobuf" + + ".TimestampR\nupdateTime\022(\n\020block_free_usa" + + "ge\030\006 \001(\010R\016blockFreeUsage\"X\n\022BlockedEmail" + + "Domain\022\016\n\002id\030\001 \001(\tR\002id\022\026\n\006domain\030\002 \001(\tR\006" + + "domain\022\032\n\010negative\030\003 \001(\010R\010negative\"%\n#Ge" + + "tInstallationConfigurationRequest\"r\n$Get" + + "InstallationConfigurationResponse\022J\n\rcon" + + "figuration\030\001 \001(\0132$.gitpod.v1.Installatio" + + "nConfigurationR\rconfiguration\"W\n\031Install" + + "ationConfiguration\022:\n\031is_dedicated_insta" + + "llation\030\001 \001(\010R\027isDedicatedInstallation2\341" + + "\007\n\023InstallationService\022\231\001\n$GetInstallati" + + "onWorkspaceDefaultImage\0226.gitpod.v1.GetI" + + "nstallationWorkspaceDefaultImageRequest\032" + + "7.gitpod.v1.GetInstallationWorkspaceDefa" + + "ultImageResponse\"\000\022r\n\027ListBlockedReposit" + + "ories\022).gitpod.v1.ListBlockedRepositorie" + + "sRequest\032*.gitpod.v1.ListBlockedReposito" + + "riesResponse\"\000\022r\n\027CreateBlockedRepositor" + + "y\022).gitpod.v1.CreateBlockedRepositoryReq" + + "uest\032*.gitpod.v1.CreateBlockedRepository" + + "Response\"\000\022r\n\027DeleteBlockedRepository\022)." + + "gitpod.v1.DeleteBlockedRepositoryRequest" + + "\032*.gitpod.v1.DeleteBlockedRepositoryResp" + + "onse\"\000\022r\n\027ListBlockedEmailDomains\022).gitp" + + "od.v1.ListBlockedEmailDomainsRequest\032*.g" + + "itpod.v1.ListBlockedEmailDomainsResponse" + + "\"\000\022u\n\030CreateBlockedEmailDomain\022*.gitpod." + + "v1.CreateBlockedEmailDomainRequest\032+.git" + + "pod.v1.CreateBlockedEmailDomainResponse\"" + + "\000\022c\n\022GetOnboardingState\022$.gitpod.v1.GetO" + + "nboardingStateRequest\032%.gitpod.v1.GetOnb" + + "oardingStateResponse\"\000\022\201\001\n\034GetInstallati" + + "onConfiguration\022..gitpod.v1.GetInstallat" + + "ionConfigurationRequest\032/.gitpod.v1.GetI" + + "nstallationConfigurationResponse\"\000BQ\n\026io" + + ".gitpod.publicapi.v1Z7github.com/gitpod-" + + "io/gitpod/components/public-api/go/v1b\006p" + + "roto3" + }; + descriptor = com.google.protobuf.Descriptors.FileDescriptor + .internalBuildGeneratedFileFrom(descriptorData, + new com.google.protobuf.Descriptors.FileDescriptor[] { + io.gitpod.publicapi.v1.Pagination.getDescriptor(), + io.gitpod.publicapi.v1.Sorting.getDescriptor(), + com.google.protobuf.TimestampProto.getDescriptor(), + }); + internal_static_gitpod_v1_GetOnboardingStateRequest_descriptor = + getDescriptor().getMessageTypes().get(0); + internal_static_gitpod_v1_GetOnboardingStateRequest_fieldAccessorTable = new + com.google.protobuf.GeneratedMessage.FieldAccessorTable( + internal_static_gitpod_v1_GetOnboardingStateRequest_descriptor, + new java.lang.String[] { }); + internal_static_gitpod_v1_GetOnboardingStateResponse_descriptor = + getDescriptor().getMessageTypes().get(1); + internal_static_gitpod_v1_GetOnboardingStateResponse_fieldAccessorTable = new + com.google.protobuf.GeneratedMessage.FieldAccessorTable( + internal_static_gitpod_v1_GetOnboardingStateResponse_descriptor, + new java.lang.String[] { "OnboardingState", }); + internal_static_gitpod_v1_OnboardingState_descriptor = + getDescriptor().getMessageTypes().get(2); + internal_static_gitpod_v1_OnboardingState_fieldAccessorTable = new + com.google.protobuf.GeneratedMessage.FieldAccessorTable( + internal_static_gitpod_v1_OnboardingState_descriptor, + new java.lang.String[] { "Completed", "OrganizationCountTotal", }); + internal_static_gitpod_v1_GetInstallationWorkspaceDefaultImageRequest_descriptor = + getDescriptor().getMessageTypes().get(3); + internal_static_gitpod_v1_GetInstallationWorkspaceDefaultImageRequest_fieldAccessorTable = new + com.google.protobuf.GeneratedMessage.FieldAccessorTable( + internal_static_gitpod_v1_GetInstallationWorkspaceDefaultImageRequest_descriptor, + new java.lang.String[] { }); + internal_static_gitpod_v1_GetInstallationWorkspaceDefaultImageResponse_descriptor = + getDescriptor().getMessageTypes().get(4); + internal_static_gitpod_v1_GetInstallationWorkspaceDefaultImageResponse_fieldAccessorTable = new + com.google.protobuf.GeneratedMessage.FieldAccessorTable( + internal_static_gitpod_v1_GetInstallationWorkspaceDefaultImageResponse_descriptor, + new java.lang.String[] { "DefaultWorkspaceImage", }); + internal_static_gitpod_v1_ListBlockedRepositoriesRequest_descriptor = + getDescriptor().getMessageTypes().get(5); + internal_static_gitpod_v1_ListBlockedRepositoriesRequest_fieldAccessorTable = new + com.google.protobuf.GeneratedMessage.FieldAccessorTable( + internal_static_gitpod_v1_ListBlockedRepositoriesRequest_descriptor, + new java.lang.String[] { "Pagination", "Sort", "SearchTerm", }); + internal_static_gitpod_v1_ListBlockedRepositoriesResponse_descriptor = + getDescriptor().getMessageTypes().get(6); + internal_static_gitpod_v1_ListBlockedRepositoriesResponse_fieldAccessorTable = new + com.google.protobuf.GeneratedMessage.FieldAccessorTable( + internal_static_gitpod_v1_ListBlockedRepositoriesResponse_descriptor, + new java.lang.String[] { "Pagination", "BlockedRepositories", }); + internal_static_gitpod_v1_CreateBlockedRepositoryRequest_descriptor = + getDescriptor().getMessageTypes().get(7); + internal_static_gitpod_v1_CreateBlockedRepositoryRequest_fieldAccessorTable = new + com.google.protobuf.GeneratedMessage.FieldAccessorTable( + internal_static_gitpod_v1_CreateBlockedRepositoryRequest_descriptor, + new java.lang.String[] { "UrlRegexp", "BlockUser", "BlockFreeUsage", }); + internal_static_gitpod_v1_CreateBlockedRepositoryResponse_descriptor = + getDescriptor().getMessageTypes().get(8); + internal_static_gitpod_v1_CreateBlockedRepositoryResponse_fieldAccessorTable = new + com.google.protobuf.GeneratedMessage.FieldAccessorTable( + internal_static_gitpod_v1_CreateBlockedRepositoryResponse_descriptor, + new java.lang.String[] { "BlockedRepository", }); + internal_static_gitpod_v1_DeleteBlockedRepositoryRequest_descriptor = + getDescriptor().getMessageTypes().get(9); + internal_static_gitpod_v1_DeleteBlockedRepositoryRequest_fieldAccessorTable = new + com.google.protobuf.GeneratedMessage.FieldAccessorTable( + internal_static_gitpod_v1_DeleteBlockedRepositoryRequest_descriptor, + new java.lang.String[] { "BlockedRepositoryId", }); + internal_static_gitpod_v1_DeleteBlockedRepositoryResponse_descriptor = + getDescriptor().getMessageTypes().get(10); + internal_static_gitpod_v1_DeleteBlockedRepositoryResponse_fieldAccessorTable = new + com.google.protobuf.GeneratedMessage.FieldAccessorTable( + internal_static_gitpod_v1_DeleteBlockedRepositoryResponse_descriptor, + new java.lang.String[] { }); + internal_static_gitpod_v1_ListBlockedEmailDomainsRequest_descriptor = + getDescriptor().getMessageTypes().get(11); + internal_static_gitpod_v1_ListBlockedEmailDomainsRequest_fieldAccessorTable = new + com.google.protobuf.GeneratedMessage.FieldAccessorTable( + internal_static_gitpod_v1_ListBlockedEmailDomainsRequest_descriptor, + new java.lang.String[] { "Pagination", }); + internal_static_gitpod_v1_ListBlockedEmailDomainsResponse_descriptor = + getDescriptor().getMessageTypes().get(12); + internal_static_gitpod_v1_ListBlockedEmailDomainsResponse_fieldAccessorTable = new + com.google.protobuf.GeneratedMessage.FieldAccessorTable( + internal_static_gitpod_v1_ListBlockedEmailDomainsResponse_descriptor, + new java.lang.String[] { "Pagination", "BlockedEmailDomains", }); + internal_static_gitpod_v1_CreateBlockedEmailDomainRequest_descriptor = + getDescriptor().getMessageTypes().get(13); + internal_static_gitpod_v1_CreateBlockedEmailDomainRequest_fieldAccessorTable = new com.google.protobuf.GeneratedMessage.FieldAccessorTable( internal_static_gitpod_v1_CreateBlockedEmailDomainRequest_descriptor, new java.lang.String[] { "Domain", "Negative", }); @@ -12113,6 +13611,24 @@ public io.gitpod.publicapi.v1.Installation.BlockedEmailDomain getDefaultInstance com.google.protobuf.GeneratedMessage.FieldAccessorTable( internal_static_gitpod_v1_BlockedEmailDomain_descriptor, new java.lang.String[] { "Id", "Domain", "Negative", }); + internal_static_gitpod_v1_GetInstallationConfigurationRequest_descriptor = + getDescriptor().getMessageTypes().get(17); + internal_static_gitpod_v1_GetInstallationConfigurationRequest_fieldAccessorTable = new + com.google.protobuf.GeneratedMessage.FieldAccessorTable( + internal_static_gitpod_v1_GetInstallationConfigurationRequest_descriptor, + new java.lang.String[] { }); + internal_static_gitpod_v1_GetInstallationConfigurationResponse_descriptor = + getDescriptor().getMessageTypes().get(18); + internal_static_gitpod_v1_GetInstallationConfigurationResponse_fieldAccessorTable = new + com.google.protobuf.GeneratedMessage.FieldAccessorTable( + internal_static_gitpod_v1_GetInstallationConfigurationResponse_descriptor, + new java.lang.String[] { "Configuration", }); + internal_static_gitpod_v1_InstallationConfiguration_descriptor = + getDescriptor().getMessageTypes().get(19); + internal_static_gitpod_v1_InstallationConfiguration_fieldAccessorTable = new + com.google.protobuf.GeneratedMessage.FieldAccessorTable( + internal_static_gitpod_v1_InstallationConfiguration_descriptor, + new java.lang.String[] { "IsDedicatedInstallation", }); descriptor.resolveAllFeaturesImmutable(); io.gitpod.publicapi.v1.Pagination.getDescriptor(); io.gitpod.publicapi.v1.Sorting.getDescriptor(); diff --git a/components/public-api/java/src/main/java/io/gitpod/publicapi/v1/InstallationServiceClient.kt b/components/public-api/java/src/main/java/io/gitpod/publicapi/v1/InstallationServiceClient.kt index 811e95ab99849e..0b639e5353e1ea 100644 --- a/components/public-api/java/src/main/java/io/gitpod/publicapi/v1/InstallationServiceClient.kt +++ b/components/public-api/java/src/main/java/io/gitpod/publicapi/v1/InstallationServiceClient.kt @@ -137,4 +137,22 @@ public class InstallationServiceClient( ), ) + + /** + * GetInstallationConfiguration returns configuration of the installation. + */ + override suspend + fun getInstallationConfiguration(request: Installation.GetInstallationConfigurationRequest, + headers: Headers): ResponseMessage = + client.unary( + request, + headers, + MethodSpec( + "gitpod.v1.InstallationService/GetInstallationConfiguration", + io.gitpod.publicapi.v1.Installation.GetInstallationConfigurationRequest::class, + io.gitpod.publicapi.v1.Installation.GetInstallationConfigurationResponse::class, + StreamType.UNARY, + ), + ) + } diff --git a/components/public-api/java/src/main/java/io/gitpod/publicapi/v1/InstallationServiceClientInterface.kt b/components/public-api/java/src/main/java/io/gitpod/publicapi/v1/InstallationServiceClientInterface.kt index 3b8c5544e40c89..40c0e53b6fdf13 100644 --- a/components/public-api/java/src/main/java/io/gitpod/publicapi/v1/InstallationServiceClientInterface.kt +++ b/components/public-api/java/src/main/java/io/gitpod/publicapi/v1/InstallationServiceClientInterface.kt @@ -56,4 +56,12 @@ public interface InstallationServiceClientInterface { */ public suspend fun getOnboardingState(request: Installation.GetOnboardingStateRequest, headers: Headers = emptyMap()): ResponseMessage + + /** + * GetInstallationConfiguration returns configuration of the installation. + */ + public suspend + fun getInstallationConfiguration(request: Installation.GetInstallationConfigurationRequest, + headers: Headers = emptyMap()): + ResponseMessage } diff --git a/components/public-api/typescript-common/src/public-api-converter.spec.ts b/components/public-api/typescript-common/src/public-api-converter.spec.ts index 05b0937216ef6d..6c885a81f275ac 100644 --- a/components/public-api/typescript-common/src/public-api-converter.spec.ts +++ b/components/public-api/typescript-common/src/public-api-converter.spec.ts @@ -277,10 +277,11 @@ describe("PublicAPIConverter", () => { it("should convert", () => { const result = converter.toOnboardingState({ isCompleted: true, - hasAnyOrg: true, + organizationCountTotal: 1, }); expect(result).to.deep.equal({ completed: true, + organizationCountTotal: 1, }); }); }); diff --git a/components/public-api/typescript-common/src/public-api-converter.ts b/components/public-api/typescript-common/src/public-api-converter.ts index 416127462680ec..b7f4c5a24e424e 100644 --- a/components/public-api/typescript-common/src/public-api-converter.ts +++ b/components/public-api/typescript-common/src/public-api-converter.ts @@ -39,6 +39,7 @@ import { WorkspaceContext, WorkspaceInfo, WorkspaceSession as WorkspaceSessionProtocol, + Configuration as GitpodServerInstallationConfiguration, } from "@gitpod/gitpod-protocol/lib/protocol"; import { AuditLog as AuditLogProtocol } from "@gitpod/gitpod-protocol/lib/audit-log"; import { @@ -104,6 +105,7 @@ import { import { BlockedEmailDomain, BlockedRepository, + InstallationConfiguration, OnboardingState, } from "@gitpod/public-api/lib/gitpod/v1/installation_pb"; import { @@ -1665,6 +1667,13 @@ export class PublicAPIConverter { toOnboardingState(state: GitpodServer.OnboardingState): OnboardingState { return new OnboardingState({ completed: state.isCompleted, + organizationCountTotal: state.organizationCountTotal, + }); + } + + toInstallationConfiguration(config: GitpodServerInstallationConfiguration): InstallationConfiguration { + return new InstallationConfiguration({ + isDedicatedInstallation: config.isDedicatedInstallation, }); } diff --git a/components/public-api/typescript-common/src/user-utils.ts b/components/public-api/typescript-common/src/user-utils.ts index 5027e6442c6aa7..2bbb4aa76960df 100644 --- a/components/public-api/typescript-common/src/user-utils.ts +++ b/components/public-api/typescript-common/src/user-utils.ts @@ -73,3 +73,24 @@ export function getName(user: User | UserProtocol): string | undefined { export function isOrganizationOwned(user: User | UserProtocol) { return !!user.organizationId; } + +/** + * gitpod.io: Only installation-level users are allowed to create orgs (installation-level users on gitpod.io, and admin user on Dedicated) + * Dedicated: Only if multiOrg is enabled, installation-level users can create orgs + * @param user + * @param isDedicated + * @param isMultiOrgEnabled + * @returns + */ +export function isAllowedToCreateOrganization( + user: User | UserProtocol, + isDedicated: boolean, + isMultiOrgEnabled?: boolean, +): boolean { + if (!isDedicated) { + // gitpod.io case + return !isOrganizationOwned(user); + } + + return !isOrganizationOwned(user) && !!isMultiOrgEnabled; +} diff --git a/components/public-api/typescript/src/gitpod/v1/installation_connect.ts b/components/public-api/typescript/src/gitpod/v1/installation_connect.ts index 50d4ce2450111a..257e5c26d2a39a 100644 --- a/components/public-api/typescript/src/gitpod/v1/installation_connect.ts +++ b/components/public-api/typescript/src/gitpod/v1/installation_connect.ts @@ -9,7 +9,7 @@ /* eslint-disable */ // @ts-nocheck -import { CreateBlockedEmailDomainRequest, CreateBlockedEmailDomainResponse, CreateBlockedRepositoryRequest, CreateBlockedRepositoryResponse, DeleteBlockedRepositoryRequest, DeleteBlockedRepositoryResponse, GetInstallationWorkspaceDefaultImageRequest, GetInstallationWorkspaceDefaultImageResponse, GetOnboardingStateRequest, GetOnboardingStateResponse, ListBlockedEmailDomainsRequest, ListBlockedEmailDomainsResponse, ListBlockedRepositoriesRequest, ListBlockedRepositoriesResponse } from "./installation_pb.js"; +import { CreateBlockedEmailDomainRequest, CreateBlockedEmailDomainResponse, CreateBlockedRepositoryRequest, CreateBlockedRepositoryResponse, DeleteBlockedRepositoryRequest, DeleteBlockedRepositoryResponse, GetInstallationConfigurationRequest, GetInstallationConfigurationResponse, GetInstallationWorkspaceDefaultImageRequest, GetInstallationWorkspaceDefaultImageResponse, GetOnboardingStateRequest, GetOnboardingStateResponse, ListBlockedEmailDomainsRequest, ListBlockedEmailDomainsResponse, ListBlockedRepositoriesRequest, ListBlockedRepositoriesResponse } from "./installation_pb.js"; import { MethodKind } from "@bufbuild/protobuf"; /** @@ -96,5 +96,16 @@ export const InstallationService = { O: GetOnboardingStateResponse, kind: MethodKind.Unary, }, + /** + * GetInstallationConfiguration returns configuration of the installation. + * + * @generated from rpc gitpod.v1.InstallationService.GetInstallationConfiguration + */ + getInstallationConfiguration: { + name: "GetInstallationConfiguration", + I: GetInstallationConfigurationRequest, + O: GetInstallationConfigurationResponse, + kind: MethodKind.Unary, + }, } } as const; diff --git a/components/public-api/typescript/src/gitpod/v1/installation_pb.ts b/components/public-api/typescript/src/gitpod/v1/installation_pb.ts index 1b8776f4421423..cfb2477dcbb037 100644 --- a/components/public-api/typescript/src/gitpod/v1/installation_pb.ts +++ b/components/public-api/typescript/src/gitpod/v1/installation_pb.ts @@ -87,10 +87,19 @@ export class GetOnboardingStateResponse extends Message { /** + * Whether at least one organization has completed the onboarding + * * @generated from field: bool completed = 1; */ completed = false; + /** + * The total number of organizations + * + * @generated from field: int32 organization_count_total = 2; + */ + organizationCountTotal = 0; + constructor(data?: PartialMessage) { super(); proto3.util.initPartial(data, this); @@ -100,6 +109,7 @@ export class OnboardingState extends Message { static readonly typeName = "gitpod.v1.OnboardingState"; static readonly fields: FieldList = proto3.util.newFieldList(() => [ { no: 1, name: "completed", kind: "scalar", T: 8 /* ScalarType.BOOL */ }, + { no: 2, name: "organization_count_total", kind: "scalar", T: 5 /* ScalarType.INT32 */ }, ]); static fromBinary(bytes: Uint8Array, options?: Partial): OnboardingState { @@ -751,3 +761,108 @@ export class BlockedEmailDomain extends Message { return proto3.util.equals(BlockedEmailDomain, a, b); } } + +/** + * @generated from message gitpod.v1.GetInstallationConfigurationRequest + */ +export class GetInstallationConfigurationRequest extends Message { + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "gitpod.v1.GetInstallationConfigurationRequest"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): GetInstallationConfigurationRequest { + return new GetInstallationConfigurationRequest().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): GetInstallationConfigurationRequest { + return new GetInstallationConfigurationRequest().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): GetInstallationConfigurationRequest { + return new GetInstallationConfigurationRequest().fromJsonString(jsonString, options); + } + + static equals(a: GetInstallationConfigurationRequest | PlainMessage | undefined, b: GetInstallationConfigurationRequest | PlainMessage | undefined): boolean { + return proto3.util.equals(GetInstallationConfigurationRequest, a, b); + } +} + +/** + * @generated from message gitpod.v1.GetInstallationConfigurationResponse + */ +export class GetInstallationConfigurationResponse extends Message { + /** + * @generated from field: gitpod.v1.InstallationConfiguration configuration = 1; + */ + configuration?: InstallationConfiguration; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "gitpod.v1.GetInstallationConfigurationResponse"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "configuration", kind: "message", T: InstallationConfiguration }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): GetInstallationConfigurationResponse { + return new GetInstallationConfigurationResponse().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): GetInstallationConfigurationResponse { + return new GetInstallationConfigurationResponse().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): GetInstallationConfigurationResponse { + return new GetInstallationConfigurationResponse().fromJsonString(jsonString, options); + } + + static equals(a: GetInstallationConfigurationResponse | PlainMessage | undefined, b: GetInstallationConfigurationResponse | PlainMessage | undefined): boolean { + return proto3.util.equals(GetInstallationConfigurationResponse, a, b); + } +} + +/** + * @generated from message gitpod.v1.InstallationConfiguration + */ +export class InstallationConfiguration extends Message { + /** + * @generated from field: bool is_dedicated_installation = 1; + */ + isDedicatedInstallation = false; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "gitpod.v1.InstallationConfiguration"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "is_dedicated_installation", kind: "scalar", T: 8 /* ScalarType.BOOL */ }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): InstallationConfiguration { + return new InstallationConfiguration().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): InstallationConfiguration { + return new InstallationConfiguration().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): InstallationConfiguration { + return new InstallationConfiguration().fromJsonString(jsonString, options); + } + + static equals(a: InstallationConfiguration | PlainMessage | undefined, b: InstallationConfiguration | PlainMessage | undefined): boolean { + return proto3.util.equals(InstallationConfiguration, a, b); + } +} diff --git a/components/server/src/api/installation-service-api.ts b/components/server/src/api/installation-service-api.ts index 1e9adb7c6618f4..00010fbadb7bae 100644 --- a/components/server/src/api/installation-service-api.ts +++ b/components/server/src/api/installation-service-api.ts @@ -14,6 +14,8 @@ import { CreateBlockedRepositoryResponse, DeleteBlockedRepositoryRequest, DeleteBlockedRepositoryResponse, + GetInstallationConfigurationRequest, + GetInstallationConfigurationResponse, GetInstallationWorkspaceDefaultImageRequest, GetInstallationWorkspaceDefaultImageResponse, GetOnboardingStateRequest, @@ -149,4 +151,14 @@ export class InstallationServiceAPI implements ServiceImpl { + const config = await this.installationService.getInstallationConfiguration(); + return new GetInstallationConfigurationResponse({ + configuration: this.apiConverter.toInstallationConfiguration(config), + }); + } } diff --git a/components/server/src/auth/installation-service.ts b/components/server/src/auth/installation-service.ts index e787672fe3b387..db529d0a7ad7a3 100644 --- a/components/server/src/auth/installation-service.ts +++ b/components/server/src/auth/installation-service.ts @@ -4,7 +4,13 @@ * See License.AGPL.txt in the project root for license information. */ -import { AdminGetListRequest, AdminGetListResult, EmailDomainFilterEntry, GitpodServer } from "@gitpod/gitpod-protocol"; +import { + AdminGetListRequest, + AdminGetListResult, + Configuration, + EmailDomainFilterEntry, + GitpodServer, +} from "@gitpod/gitpod-protocol"; import { inject, injectable } from "inversify"; import { EmailDomainFilterDB, TeamDB } from "@gitpod/gitpod-db/lib"; import { BlockedRepository } from "@gitpod/gitpod-protocol/lib/blocked-repositories-protocol"; @@ -73,12 +79,11 @@ export class InstallationService { // Find useful details about the state of the Gitpod installation. const { rows } = await this.teamDB.findTeams( 0 /* offset */, - 1 /* limit */, + undefined /* limit */, "creationTime" /* order by */, "ASC", "" /* empty search term returns any */, ); - const hasAnyOrg = rows.length > 0; let isCompleted = false; for (const row of rows) { isCompleted = await this.teamDB.hasActiveSSO(row.id); @@ -88,7 +93,7 @@ export class InstallationService { } return { isCompleted, - hasAnyOrg, + organizationCountTotal: rows.length, }; } @@ -121,6 +126,13 @@ export class InstallationService { })); return classes; } + + async getInstallationConfiguration(): Promise { + // everybody can read this configuration + return { + isDedicatedInstallation: this.config.isDedicatedInstallation, + }; + } } export async function isWorkspaceClassDiscoveryEnabled(user: { id: string }): Promise { diff --git a/components/server/src/auth/verification-service.ts b/components/server/src/auth/verification-service.ts index 71617ba00d5007..e23c6d974f0326 100644 --- a/components/server/src/auth/verification-service.ts +++ b/components/server/src/auth/verification-service.ts @@ -110,7 +110,7 @@ export class VerificationService { ) { if (this.config.twilioConfig) { this.verifyService = new TwilioVerificationEndpoint(this.config); - } else if (this.config.devBranch && !this.config.isSingleOrgInstallation) { + } else if (this.config.devBranch && !this.config.isDedicatedInstallation) { // preview environments get the mock verification endpoint this.verifyService = new MockVerificationEndpoint(); } diff --git a/components/server/src/config.ts b/components/server/src/config.ts index c949a156ffba8d..0e1b8d06a78d9d 100644 --- a/components/server/src/config.ts +++ b/components/server/src/config.ts @@ -157,8 +157,6 @@ export interface ConfigSerialized { passlist: string[]; }; - showSetupModal: boolean; - admin: { credentialsPath: string; }; @@ -274,7 +272,8 @@ export interface ConfigSerialized { address: string; }; - isSingleOrgInstallation: boolean; + /** true if this is a Dedicated */ + isDedicatedInstallation: boolean; } export interface CookieConfig { diff --git a/components/server/src/iam/iam-session-app.spec.ts b/components/server/src/iam/iam-session-app.spec.ts index 32c6d7f8ea169e..14e4b55ba36a6b 100644 --- a/components/server/src/iam/iam-session-app.spec.ts +++ b/components/server/src/iam/iam-session-app.spec.ts @@ -19,7 +19,7 @@ import request from "supertest"; import * as chai from "chai"; import { OIDCCreateSessionPayload } from "./iam-oidc-create-session-payload"; -import { TeamMemberInfo, TeamMemberRole, User } from "@gitpod/gitpod-protocol"; +import { TeamMemberInfo, User } from "@gitpod/gitpod-protocol"; import { OrganizationService } from "../orgs/organization-service"; import { UserService } from "../user/user-service"; import { TeamDB, UserDB } from "@gitpod/gitpod-db/lib"; @@ -40,9 +40,6 @@ class TestIamSessionApp { }; protected userServiceMock: Partial = { - createUser: (params) => { - return { id: "id-new-user" } as any; - }, updateUser: (userId, update) => { return {} as any; }, @@ -67,8 +64,10 @@ class TestIamSessionApp { listMembers: async (teamId: string): Promise => { return []; }, - async addOrUpdateMember(userId: string, teamId: string, memberId: string, role: TeamMemberRole): Promise { - this.memberships.add(memberId); + async createOrgOwnedUser(params): Promise { + const user = { id: "id-new-user" } as any as User; + this.memberships.add(user.id); + return user; }, }; diff --git a/components/server/src/iam/iam-session-app.ts b/components/server/src/iam/iam-session-app.ts index c4908ce7778fb8..27f7ef3444edb7 100644 --- a/components/server/src/iam/iam-session-app.ts +++ b/components/server/src/iam/iam-session-app.ts @@ -16,7 +16,6 @@ import { reportJWTCookieIssued } from "../prometheus-metrics"; import { ApplicationError } from "@gitpod/gitpod-protocol/lib/messaging/error"; import { OrganizationService } from "../orgs/organization-service"; import { UserService } from "../user/user-service"; -import { UserDB } from "@gitpod/gitpod-db/lib"; import { SYSTEM_USER, SYSTEM_USER_ID } from "../authorization/authorizer"; import { runWithSubjectId, runWithRequestContext } from "../util/request-context"; @@ -29,7 +28,6 @@ export class IamSessionApp { @inject(UserService) private readonly userService: UserService, @inject(OrganizationService) private readonly orgService: OrganizationService, @inject(SessionHandler) private readonly session: SessionHandler, - @inject(UserDB) private readonly userDb: UserDB, ) {} public getMiddlewares() { @@ -167,30 +165,15 @@ export class IamSessionApp { private async createNewOIDCUser(payload: OIDCCreateSessionPayload): Promise { const { claims, organizationId } = payload; - return this.userDb.transaction(async (_, ctx) => { - // Until we support SKIM (or any other means to sync accounts) we create new users here as a side-effect of the login - const user = await this.userService.createUser( - { - organizationId, - identity: { ...this.mapOIDCProfileToIdentity(payload), lastSigninTime: new Date().toISOString() }, - userUpdate: (user) => { - user.fullName = claims.name; - user.name = claims.name; - user.avatarUrl = claims.picture; - }, - }, - ctx, - ); - - await this.orgService.addOrUpdateMember( - SYSTEM_USER_ID, - organizationId, - user.id, - "member", - { flexibleRole: true }, - ctx, - ); - return user; + // Until we support SKIM (or any other means to sync accounts) we create new users here as a side-effect of the login + return this.orgService.createOrgOwnedUser({ + organizationId, + identity: { ...this.mapOIDCProfileToIdentity(payload), lastSigninTime: new Date().toISOString() }, + userUpdate: (user) => { + user.fullName = claims.name; + user.name = claims.name; + user.avatarUrl = claims.picture; + }, }); } } diff --git a/components/server/src/orgs/organization-service.spec.db.ts b/components/server/src/orgs/organization-service.spec.db.ts index bf225fc04f3084..73f6b8509472ca 100644 --- a/components/server/src/orgs/organization-service.spec.db.ts +++ b/components/server/src/orgs/organization-service.spec.db.ts @@ -4,7 +4,7 @@ * See License.AGPL.txt in the project root for license information. */ -import { BUILTIN_INSTLLATION_ADMIN_USER_ID, TypeORM } from "@gitpod/gitpod-db/lib"; +import { BUILTIN_INSTLLATION_ADMIN_USER_ID, TypeORM, UserDB } from "@gitpod/gitpod-db/lib"; import { Organization, OrganizationSettings, TeamMemberRole, User } from "@gitpod/gitpod-protocol"; import { Experiments } from "@gitpod/gitpod-protocol/lib/experiments/configcat-server"; import { ErrorCodes } from "@gitpod/gitpod-protocol/lib/messaging/error"; @@ -473,4 +473,54 @@ describe("OrganizationService", async () => { ); await assertUpdateSettings("should enable workspace sharing", { workspaceSharingDisabled: false }, {}); }); + + it("org-owned users can't create new organizations", async () => { + const userDB = container.get(UserDB); + const os = container.get(OrganizationService); + + // create the owner (installation-level) + const owner = await userDB.newUser(); + + // create an org + const orgService = container.get(OrganizationService); + const myOrg = await orgService.createOrganization(owner.id, "my-org"); + + // create org-owned user + const member = await createOrgOwnedUser(os, myOrg.id); + + await expectError(ErrorCodes.PERMISSION_DENIED, () => os.createOrganization(member.id, "member's crew")); + }); + + it("org-owned users can't join another org", async () => { + const userDB = container.get(UserDB); + const os = container.get(OrganizationService); + + // create the owner (installation-level) + const owner = await userDB.newUser(); + + // create the orgs + const orgService = container.get(OrganizationService); + const myOrg = await orgService.createOrganization(owner.id, "my-org"); + const anotherOrg = await orgService.createOrganization(owner.id, "another-org"); + + // create org-owned user + const member = await createOrgOwnedUser(os, myOrg.id); + + const failingInvite = await orgService.getOrCreateInvite(owner.id, anotherOrg.id); + await expectError(ErrorCodes.PERMISSION_DENIED, () => os.joinOrganization(member.id, failingInvite.id)); + }); }); + +async function createOrgOwnedUser(os: OrganizationService, organizationId: string) { + // create org-owned member + return os.createOrgOwnedUser({ + organizationId, + identity: { + authId: "123", + authProviderId: "https://accounts.google.com", + authName: "member", + lastSigninTime: new Date().toISOString(), + }, + userUpdate: (user) => {}, + }); +} diff --git a/components/server/src/orgs/organization-service.spec.ts b/components/server/src/orgs/organization-service.spec.ts index 92879cfe436dbf..cec702b6a28413 100644 --- a/components/server/src/orgs/organization-service.spec.ts +++ b/components/server/src/orgs/organization-service.spec.ts @@ -19,6 +19,7 @@ import { Config } from "../config"; import { IDEService } from "../ide-service"; import { StripeService } from "../billing/stripe-service"; import { UsageService } from "./usage-service"; +import { UserAuthentication } from "../user/user-authentication"; const expect = chai.expect; @@ -77,6 +78,7 @@ describe("OrganizationService", async () => { } as any as InstallationService); container.bind(StripeService).toConstantValue({} as any as StripeService); container.bind(UsageService).toConstantValue({} as any as UsageService); + container.bind(UserAuthentication).toConstantValue({} as any as UserAuthentication); os = container.get(OrganizationService); }); diff --git a/components/server/src/orgs/organization-service.ts b/components/server/src/orgs/organization-service.ts index a163262c0dbad5..c4f8a9b15caeaf 100644 --- a/components/server/src/orgs/organization-service.ts +++ b/components/server/src/orgs/organization-service.ts @@ -13,6 +13,7 @@ import { TeamMembershipInvite, WorkspaceTimeoutDuration, OrgMemberRole, + User, } from "@gitpod/gitpod-protocol"; import { IAnalyticsWriter } from "@gitpod/gitpod-protocol/lib/analytics"; import { ApplicationError, ErrorCodes } from "@gitpod/gitpod-protocol/lib/messaging/error"; @@ -33,6 +34,7 @@ import { StripeService } from "../billing/stripe-service"; import { AttributionId } from "@gitpod/gitpod-protocol/lib/attribution"; import { UsageService } from "./usage-service"; import { CostCenter_BillingStrategy } from "@gitpod/gitpod-protocol/lib/usage"; +import { CreateUserParams, UserAuthentication } from "../user/user-authentication"; @injectable() export class OrganizationService { @@ -49,6 +51,7 @@ export class OrganizationService { @inject(UsageService) private readonly usageService: UsageService, @inject(DefaultWorkspaceImageValidator) private readonly validateDefaultWorkspaceImage: DefaultWorkspaceImageValidator, + @inject(UserAuthentication) private readonly userAuthentication: UserAuthentication, ) {} async listOrganizations( @@ -145,6 +148,19 @@ export class OrganizationService { } async createOrganization(userId: string, name: string): Promise { + // TODO(gpl): Should we use the authorization layer to make this decision? + const user = await this.userDB.findUserById(userId); + if (!user) { + throw new ApplicationError(ErrorCodes.NOT_AUTHENTICATED, `User not authenticated. Please login.`); + } + const mayCreateOrganization = await this.userAuthentication.mayCreateOrganization(user); + if (!mayCreateOrganization) { + throw new ApplicationError( + ErrorCodes.PERMISSION_DENIED, + "Organizational accounts are not allowed to create new organizations", + ); + } + let result: Organization; try { result = await this.teamDB.transaction(async (db) => { @@ -254,6 +270,19 @@ export class OrganizationService { } public async joinOrganization(userId: string, inviteId: string): Promise { + const user = await this.userDB.findUserById(userId); + if (!user) { + throw new ApplicationError(ErrorCodes.INTERNAL_SERVER_ERROR, `User ${userId} not found`); + } + + const mayJoinOrganization = await this.userAuthentication.mayJoinOrganization(user); + if (!mayJoinOrganization) { + throw new ApplicationError( + ErrorCodes.PERMISSION_DENIED, + "Organizational accounts are not allowed to join other organizations", + ); + } + // Invites can be used by anyone, as long as they know the invite ID, hence needs no resource guard const invite = await this.teamDB.findTeamMembershipInviteById(inviteId); if (!invite || invite.invalidationTime !== "") { @@ -262,10 +291,6 @@ export class OrganizationService { if (await this.teamDB.hasActiveSSO(invite.teamId)) { throw new ApplicationError(ErrorCodes.NOT_FOUND, "Invites are disabled for SSO-enabled organizations."); } - const user = await this.userDB.findUserById(userId); - if (!user) { - throw new ApplicationError(ErrorCodes.INTERNAL_SERVER_ERROR, `User ${userId} not found`); - } // set skipRoleUpdate=true to avoid member/owner click join link again cause role change await runWithSubjectId(SYSTEM_USER, () => @@ -300,6 +325,26 @@ export class OrganizationService { return invite.teamId; } + /** + * Convenience method, analogue to UserService.createUser() +`` + */ + public async createOrgOwnedUser(params: CreateUserParams & { organizationId: string }): Promise { + return this.userDB.transaction(async (_, ctx) => { + const user = await this.userService.createUser(params, ctx); + + await this.addOrUpdateMember( + SYSTEM_USER_ID, + params.organizationId, + user.id, + "member", + { flexibleRole: true }, + ctx, + ); + return user; + }); + } + /** * Add or update member to an organization, if there's no `owner` in the organization, target role will be owner * diff --git a/components/server/src/user/env-var-service.spec.db.ts b/components/server/src/user/env-var-service.spec.db.ts index 8c43dbc763bc87..01ca2aa69843be 100644 --- a/components/server/src/user/env-var-service.spec.db.ts +++ b/components/server/src/user/env-var-service.spec.db.ts @@ -19,7 +19,7 @@ import { Experiments } from "@gitpod/gitpod-protocol/lib/experiments/configcat-s import * as chai from "chai"; import { Container } from "inversify"; import "mocha"; -import { createTestContainer, withTestCtx } from "../test/service-testing-container-module"; +import { createTestContainer } from "../test/service-testing-container-module"; import { resetDB } from "@gitpod/gitpod-db/lib/test/reset-db"; import { OrganizationService } from "../orgs/organization-service"; import { UserService } from "./user-service"; @@ -27,7 +27,6 @@ import { expectError } from "../test/expect-utils"; import { ErrorCodes } from "@gitpod/gitpod-protocol/lib/messaging/error"; import { EnvVarService } from "./env-var-service"; import { ProjectsService } from "../projects/projects-service"; -import { SYSTEM_USER } from "../authorization/authorizer"; const expect = chai.expect; @@ -98,9 +97,8 @@ describe("EnvVarService", async () => { const orgService = container.get(OrganizationService); org = await orgService.createOrganization(BUILTIN_INSTLLATION_ADMIN_USER_ID, "myOrg"); - const invite = await orgService.getOrCreateInvite(BUILTIN_INSTLLATION_ADMIN_USER_ID, org.id); - member = await userService.createUser({ + member = await orgService.createOrgOwnedUser({ organizationId: org.id, identity: { authId: "foo", @@ -109,7 +107,6 @@ describe("EnvVarService", async () => { primaryEmail: "yolo@yolo.com", }, }); - await withTestCtx(SYSTEM_USER, () => orgService.joinOrganization(member.id, invite.id)); stranger = await userService.createUser({ identity: { authId: "foo2", diff --git a/components/server/src/user/gitpod-token-service.spec.db.ts b/components/server/src/user/gitpod-token-service.spec.db.ts index bf942095b0e274..171140bd619cee 100644 --- a/components/server/src/user/gitpod-token-service.spec.db.ts +++ b/components/server/src/user/gitpod-token-service.spec.db.ts @@ -10,14 +10,13 @@ import { Experiments } from "@gitpod/gitpod-protocol/lib/experiments/configcat-s import * as chai from "chai"; import { Container } from "inversify"; import "mocha"; -import { createTestContainer, withTestCtx } from "../test/service-testing-container-module"; +import { createTestContainer } from "../test/service-testing-container-module"; import { resetDB } from "@gitpod/gitpod-db/lib/test/reset-db"; import { OrganizationService } from "../orgs/organization-service"; import { UserService } from "./user-service"; import { expectError } from "../test/expect-utils"; import { ErrorCodes } from "@gitpod/gitpod-protocol/lib/messaging/error"; import { GitpodTokenService } from "./gitpod-token-service"; -import { SYSTEM_USER } from "../authorization/authorizer"; const expect = chai.expect; @@ -35,10 +34,9 @@ describe("GitpodTokenService", async () => { const orgService = container.get(OrganizationService); org = await orgService.createOrganization(BUILTIN_INSTLLATION_ADMIN_USER_ID, "myOrg"); - const invite = await orgService.getOrCreateInvite(BUILTIN_INSTLLATION_ADMIN_USER_ID, org.id); const userService = container.get(UserService); - member = await userService.createUser({ + member = await orgService.createOrgOwnedUser({ organizationId: org.id, identity: { authId: "foo", @@ -47,7 +45,6 @@ describe("GitpodTokenService", async () => { primaryEmail: "yolo@yolo.com", }, }); - await withTestCtx(SYSTEM_USER, () => orgService.joinOrganization(member.id, invite.id)); stranger = await userService.createUser({ identity: { authId: "foo2", diff --git a/components/server/src/user/sshkey-service.spec.db.ts b/components/server/src/user/sshkey-service.spec.db.ts index babd8427ffe7c1..3adf16644d893a 100644 --- a/components/server/src/user/sshkey-service.spec.db.ts +++ b/components/server/src/user/sshkey-service.spec.db.ts @@ -10,14 +10,13 @@ import { Experiments } from "@gitpod/gitpod-protocol/lib/experiments/configcat-s import * as chai from "chai"; import { Container } from "inversify"; import "mocha"; -import { createTestContainer, withTestCtx } from "../test/service-testing-container-module"; +import { createTestContainer } from "../test/service-testing-container-module"; import { resetDB } from "@gitpod/gitpod-db/lib/test/reset-db"; import { SSHKeyService } from "./sshkey-service"; import { OrganizationService } from "../orgs/organization-service"; import { UserService } from "./user-service"; import { expectError } from "../test/expect-utils"; import { ErrorCodes } from "@gitpod/gitpod-protocol/lib/messaging/error"; -import { SYSTEM_USER } from "../authorization/authorizer"; const expect = chai.expect; @@ -46,10 +45,9 @@ describe("SSHKeyService", async () => { const orgService = container.get(OrganizationService); org = await orgService.createOrganization(BUILTIN_INSTLLATION_ADMIN_USER_ID, "myOrg"); - const invite = await orgService.getOrCreateInvite(BUILTIN_INSTLLATION_ADMIN_USER_ID, org.id); const userService = container.get(UserService); - member = await userService.createUser({ + member = await orgService.createOrgOwnedUser({ organizationId: org.id, identity: { authId: "foo", @@ -58,7 +56,6 @@ describe("SSHKeyService", async () => { primaryEmail: "yolo@yolo.com", }, }); - await withTestCtx(SYSTEM_USER, () => orgService.joinOrganization(member.id, invite.id)); stranger = await userService.createUser({ identity: { authId: "foo2", diff --git a/components/server/src/user/token-service.spec.db.ts b/components/server/src/user/token-service.spec.db.ts index 8b0f1bdb403c5c..50d1af5382dabc 100644 --- a/components/server/src/user/token-service.spec.db.ts +++ b/components/server/src/user/token-service.spec.db.ts @@ -8,12 +8,10 @@ import { Experiments } from "@gitpod/gitpod-protocol/lib/experiments/configcat-s import * as chai from "chai"; import "mocha"; import { Container } from "inversify"; -import { createTestContainer, withTestCtx } from "../test/service-testing-container-module"; +import { createTestContainer } from "../test/service-testing-container-module"; import { BUILTIN_INSTLLATION_ADMIN_USER_ID, TypeORM, UserDB } from "@gitpod/gitpod-db/lib"; import { resetDB } from "@gitpod/gitpod-db/lib/test/reset-db"; import { OrganizationService } from "../orgs/organization-service"; -import { SYSTEM_USER } from "../authorization/authorizer"; -import { UserService } from "./user-service"; import { Organization, Token, User } from "@gitpod/gitpod-protocol"; import { TokenService } from "./token-service"; import { TokenProvider } from "./token-provider"; @@ -33,11 +31,9 @@ describe("TokenService", async () => { let container: Container; let tokenService: TokenService; - let userService: UserService; let userDB: UserDB; let orgService: OrganizationService; let org: Organization; - let owner: User; let user: User; let token: Token; @@ -127,23 +123,10 @@ describe("TokenService", async () => { tokenService = container.get(TokenService); userDB = container.get(UserDB); - userService = container.get(UserService); orgService = container.get(OrganizationService); org = await orgService.createOrganization(BUILTIN_INSTLLATION_ADMIN_USER_ID, "myOrg"); - const invite = await orgService.getOrCreateInvite(BUILTIN_INSTLLATION_ADMIN_USER_ID, org.id); - // first not builtin user join an org will be an owner - owner = await userService.createUser({ - organizationId: org.id, - identity: { - authId: "foo", - authName: "bar", - authProviderId: "github", - primaryEmail: "yolo@yolo.com", - }, - }); - await withTestCtx(SYSTEM_USER, () => orgService.joinOrganization(owner.id, invite.id)); - user = await userService.createUser({ + user = await orgService.createOrgOwnedUser({ organizationId: org.id, identity: { authId: githubUserAuthId, @@ -159,7 +142,6 @@ describe("TokenService", async () => { primaryEmail: "yolo@yolo.com", }); await userDB.storeUser(user); - await withTestCtx(SYSTEM_USER, () => orgService.joinOrganization(user.id, invite.id)); // test data token = { diff --git a/components/server/src/user/user-authentication.ts b/components/server/src/user/user-authentication.ts index 40250e7bffde40..ddb2f3051fb631 100644 --- a/components/server/src/user/user-authentication.ts +++ b/components/server/src/user/user-authentication.ts @@ -16,6 +16,8 @@ import { EmailAddressAlreadyTakenException, SelectAccountException } from "../au import { SelectAccountPayload } from "@gitpod/gitpod-protocol/lib/auth"; import { UserService } from "./user-service"; import { Authorizer } from "../authorization/authorizer"; +import { getExperimentsClientForBackend } from "@gitpod/gitpod-protocol/lib/experiments/configcat-server"; +import { isOrganizationOwned, isAllowedToCreateOrganization } from "@gitpod/public-api-common/lib/user-utils"; export interface CreateUserParams { organizationId?: string; @@ -193,12 +195,26 @@ export class UserAuthentication { } /** - * Only installation-level users are allowed to create/join other orgs then the one they belong to + * Only installation-level users are allowed to join other orgs then the one they belong to * @param user * @returns */ - async mayCreateOrJoinOrganization(user: User): Promise { - return !user.organizationId; + async mayJoinOrganization(user: User): Promise { + return !isOrganizationOwned(user); + } + + /** + * gitpod.io: Only installation-level users are allowed to create orgs + * Dedicated: Only if multiOrg is enabled, installation-level users (=admin-user) can create orgs + * @param user + * @returns + */ + async mayCreateOrganization(user: User): Promise { + const isDedicated = this.config.isDedicatedInstallation; + const isMultiOrgEnabled = await getExperimentsClientForBackend().getValueAsync("enable_multi_org", false, { + gitpodHost: this.config.hostUrl.url.host, + }); + return isAllowedToCreateOrganization(user, isDedicated, isMultiOrgEnabled); } async isBlocked(params: CheckIsBlockedParams): Promise { diff --git a/components/server/src/user/user-service.spec.db.ts b/components/server/src/user/user-service.spec.db.ts index 5a0a06adba5927..9e1ee7e3b5ffc8 100644 --- a/components/server/src/user/user-service.spec.db.ts +++ b/components/server/src/user/user-service.spec.db.ts @@ -8,11 +8,11 @@ import { Experiments } from "@gitpod/gitpod-protocol/lib/experiments/configcat-s import * as chai from "chai"; import "mocha"; import { Container } from "inversify"; -import { createTestContainer, withTestCtx } from "../test/service-testing-container-module"; +import { createTestContainer } from "../test/service-testing-container-module"; import { BUILTIN_INSTLLATION_ADMIN_USER_ID, TypeORM } from "@gitpod/gitpod-db/lib"; import { resetDB } from "@gitpod/gitpod-db/lib/test/reset-db"; import { OrganizationService } from "../orgs/organization-service"; -import { Authorizer, SYSTEM_USER } from "../authorization/authorizer"; +import { Authorizer } from "../authorization/authorizer"; import { UserService } from "./user-service"; import { Organization, User } from "@gitpod/gitpod-protocol"; import { ErrorCodes } from "@gitpod/gitpod-protocol/lib/messaging/error"; @@ -38,9 +38,8 @@ describe("UserService", async () => { auth = container.get(Authorizer); orgService = container.get(OrganizationService); org = await orgService.createOrganization(BUILTIN_INSTLLATION_ADMIN_USER_ID, "myOrg"); - const invite = await orgService.getOrCreateInvite(BUILTIN_INSTLLATION_ADMIN_USER_ID, org.id); // first not builtin user join an org will be an owner - owner = await userService.createUser({ + owner = await orgService.createOrgOwnedUser({ organizationId: org.id, identity: { authId: "foo", @@ -49,9 +48,8 @@ describe("UserService", async () => { primaryEmail: "yolo@yolo.com", }, }); - await withTestCtx(SYSTEM_USER, () => orgService.joinOrganization(owner.id, invite.id)); - user = await userService.createUser({ + user = await orgService.createOrgOwnedUser({ organizationId: org.id, identity: { authId: "foo", @@ -60,9 +58,8 @@ describe("UserService", async () => { primaryEmail: "yolo@yolo.com", }, }); - await withTestCtx(SYSTEM_USER, () => orgService.joinOrganization(user.id, invite.id)); - user2 = await userService.createUser({ + user2 = await orgService.createOrgOwnedUser({ organizationId: org.id, identity: { authId: "foo", @@ -71,7 +68,6 @@ describe("UserService", async () => { primaryEmail: "yolo@yolo.com", }, }); - await withTestCtx(SYSTEM_USER, () => orgService.joinOrganization(user2.id, invite.id)); nonOrgUser = await userService.createUser({ identity: { diff --git a/components/server/src/workspace/gitpod-server-impl.ts b/components/server/src/workspace/gitpod-server-impl.ts index 6fe9441300f087..6762eafb411d02 100644 --- a/components/server/src/workspace/gitpod-server-impl.ts +++ b/components/server/src/workspace/gitpod-server-impl.ts @@ -517,9 +517,7 @@ export class GitpodServerImpl implements GitpodServerWithTracing, Disposable { public async getConfiguration(ctx: TraceContext): Promise { return { - garbageCollectionStartDate: this.config.workspaceGarbageCollection.startDate, - daysBeforeGarbageCollection: this.config.workspaceGarbageCollection.minAgeDays, - isSingleOrgInstallation: this.config.isSingleOrgInstallation, + isDedicatedInstallation: this.config.isDedicatedInstallation, }; } @@ -1435,15 +1433,6 @@ export class GitpodServerImpl implements GitpodServerWithTracing, Disposable { // Note: this operation is per-user only, hence needs no resource guard const user = await this.checkAndBlockUser("createTeam"); - - const mayCreateOrganization = await this.userAuthentication.mayCreateOrJoinOrganization(user); - if (!mayCreateOrganization) { - throw new ApplicationError( - ErrorCodes.PERMISSION_DENIED, - "Organizational accounts are not allowed to create new organizations", - ); - } - const org = await this.organizationService.createOrganization(user.id, name); // create a cost center await this.usageService.getCostCenter(user.id, org.id); @@ -1457,14 +1446,6 @@ export class GitpodServerImpl implements GitpodServerWithTracing, Disposable { const user = await this.checkAndBlockUser("joinTeam"); - const mayCreateOrganization = await this.userAuthentication.mayCreateOrJoinOrganization(user); - if (!mayCreateOrganization) { - throw new ApplicationError( - ErrorCodes.PERMISSION_DENIED, - "Organizational accounts are not allowed to join other organizations", - ); - } - const orgId = await this.organizationService.joinOrganization(user.id, inviteId); const org = await this.getTeam(ctx, orgId); if (org !== undefined) { diff --git a/dev/preview/workflow/preview/deploy-gitpod.sh b/dev/preview/workflow/preview/deploy-gitpod.sh index 7f18fac19aeed2..64a8c2a753ecac 100755 --- a/dev/preview/workflow/preview/deploy-gitpod.sh +++ b/dev/preview/workflow/preview/deploy-gitpod.sh @@ -273,7 +273,7 @@ fi # if [[ "${GITPOD_WITH_DEDICATED_EMU}" == "true" ]] then - yq w -i "${INSTALLER_CONFIG_PATH}" experimental.webapp.server.isSingleOrgInstallation "true" + yq w -i "${INSTALLER_CONFIG_PATH}" experimental.webapp.server.isDedicatedInstallation "true" fi # diff --git a/install/installer/pkg/components/server/configmap.go b/install/installer/pkg/components/server/configmap.go index 76baabfe29fd1f..b23d2187286dff 100644 --- a/install/installer/pkg/components/server/configmap.go +++ b/install/installer/pkg/components/server/configmap.go @@ -172,18 +172,10 @@ func configmap(ctx *common.RenderContext) ([]runtime.Object, error) { return nil }) - showSetupModal := true // old default to make self-hosted continue to work! - _ = ctx.WithExperimental(func(cfg *experimental.Config) error { - if cfg.WebApp != nil && cfg.WebApp.Server != nil && cfg.WebApp.Server.ShowSetupModal != nil { - showSetupModal = *cfg.WebApp.Server.ShowSetupModal - } - return nil - }) - - var isSingleOrgInstallation bool + var isDedicatedInstallation bool _ = ctx.WithExperimental(func(cfg *experimental.Config) error { if cfg.WebApp != nil && cfg.WebApp.Server != nil { - isSingleOrgInstallation = cfg.WebApp.Server.IsSingleOrgInstallation + isDedicatedInstallation = cfg.WebApp.Server.IsDedicatedInstallation || cfg.WebApp.Server.IsSingleOrgInstallation } return nil }) @@ -296,10 +288,9 @@ func configmap(ctx *common.RenderContext) ([]runtime.Object, error) { Admin: AdminConfig{ CredentialsPath: adminCredentialsPath, }, - ShowSetupModal: showSetupModal, Auth: authCfg, Redis: redisConfig, - IsSingleOrgInstallation: isSingleOrgInstallation, + IsDedicatedInstallation: isDedicatedInstallation, } fc, err := common.ToJSONString(scfg) diff --git a/install/installer/pkg/components/server/types.go b/install/installer/pkg/components/server/types.go index caad6d8af0bf9d..9b953c31e9de62 100644 --- a/install/installer/pkg/components/server/types.go +++ b/install/installer/pkg/components/server/types.go @@ -39,9 +39,8 @@ type ConfigSerialized struct { EnablePayment bool `json:"enablePayment"` LinkedInSecretsFile string `json:"linkedInSecretsFile"` PATSigningKeyFile string `json:"patSigningKeyFile"` - ShowSetupModal bool `json:"showSetupModal"` Auth auth.Config `json:"auth"` - IsSingleOrgInstallation bool `json:"isSingleOrgInstallation"` + IsDedicatedInstallation bool `json:"isDedicatedInstallation"` WorkspaceHeartbeat WorkspaceHeartbeat `json:"workspaceHeartbeat"` WorkspaceDefaults WorkspaceDefaults `json:"workspaceDefaults"` diff --git a/install/installer/pkg/config/v1/experimental/experimental.go b/install/installer/pkg/config/v1/experimental/experimental.go index 1826651b5934d1..79b468d17141c3 100644 --- a/install/installer/pkg/config/v1/experimental/experimental.go +++ b/install/installer/pkg/config/v1/experimental/experimental.go @@ -269,8 +269,9 @@ type ServerConfig struct { DisableWorkspaceGarbageCollection bool `json:"disableWorkspaceGarbageCollection"` DisableCompleteSnapshotJob bool `json:"disableCompleteSnapshotJob"` InactivityPeriodForReposInDays *int `json:"inactivityPeriodForReposInDays"` - ShowSetupModal *bool `json:"showSetupModal"` - IsSingleOrgInstallation bool `json:"isSingleOrgInstallation"` + // deprecated: use IsDedicatedInstallation instead + IsSingleOrgInstallation bool `json:"isSingleOrgInstallation"` + IsDedicatedInstallation bool `json:"isDedicatedInstallation"` // @deprecated use containerRegistry.privateBaseImageAllowList instead DefaultBaseImageRegistryWhiteList []string `json:"defaultBaseImageRegistryWhitelist"`