gergo/serverMigration (#2067)

* feat: add server migration data to server info

* chore: gqlcodegen
This commit is contained in:
Gergő Jedlicska
2024-02-21 17:55:08 +01:00
committed by GitHub
parent 34486739ba
commit dca0d8c325
10 changed files with 109 additions and 2 deletions
@@ -2,6 +2,11 @@ extend type Query {
serverInfo: ServerInfo!
}
type ServerMigration {
movedFrom: String
movedTo: String
}
"""
Information about this server.
"""
@@ -25,6 +30,10 @@ type ServerInfo {
Base URL of Speckle Automate, if set
"""
automateUrl: String
"""
Server relocation / migration info
"""
migration: ServerMigration
}
type Role {
@@ -2089,6 +2089,8 @@ export type ServerInfo = {
description?: Maybe<Scalars['String']>;
guestModeEnabled: Scalars['Boolean'];
inviteOnly?: Maybe<Scalars['Boolean']>;
/** Server relocation / migration info */
migration?: Maybe<ServerMigration>;
name: Scalars['String'];
/** @deprecated Use role constants from the @speckle/shared npm package instead */
roles: Array<Role>;
@@ -2122,6 +2124,12 @@ export type ServerInviteCreateInput = {
serverRole?: InputMaybe<Scalars['String']>;
};
export type ServerMigration = {
__typename?: 'ServerMigration';
movedFrom?: Maybe<Scalars['String']>;
movedTo?: Maybe<Scalars['String']>;
};
export enum ServerRole {
ServerAdmin = 'SERVER_ADMIN',
ServerArchivedUser = 'SERVER_ARCHIVED_USER',
@@ -3122,6 +3130,7 @@ export type ResolversTypes = {
ServerInfoUpdateInput: ServerInfoUpdateInput;
ServerInvite: ResolverTypeWrapper<ServerInviteGraphQLReturnType>;
ServerInviteCreateInput: ServerInviteCreateInput;
ServerMigration: ResolverTypeWrapper<ServerMigration>;
ServerRole: ServerRole;
ServerRoleItem: ResolverTypeWrapper<ServerRoleItem>;
ServerStatistics: ResolverTypeWrapper<GraphQLEmptyReturn>;
@@ -3289,6 +3298,7 @@ export type ResolversParentTypes = {
ServerInfoUpdateInput: ServerInfoUpdateInput;
ServerInvite: ServerInviteGraphQLReturnType;
ServerInviteCreateInput: ServerInviteCreateInput;
ServerMigration: ServerMigration;
ServerRoleItem: ServerRoleItem;
ServerStatistics: GraphQLEmptyReturn;
ServerStats: ServerStats;
@@ -4071,6 +4081,7 @@ export type ServerInfoResolvers<ContextType = GraphQLContext, ParentType extends
description?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;
guestModeEnabled?: Resolver<ResolversTypes['Boolean'], ParentType, ContextType>;
inviteOnly?: Resolver<Maybe<ResolversTypes['Boolean']>, ParentType, ContextType>;
migration?: Resolver<Maybe<ResolversTypes['ServerMigration']>, ParentType, ContextType>;
name?: Resolver<ResolversTypes['String'], ParentType, ContextType>;
roles?: Resolver<Array<ResolversTypes['Role']>, ParentType, ContextType>;
scopes?: Resolver<Array<ResolversTypes['Scope']>, ParentType, ContextType>;
@@ -4087,6 +4098,12 @@ export type ServerInviteResolvers<ContextType = GraphQLContext, ParentType exten
__isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;
};
export type ServerMigrationResolvers<ContextType = GraphQLContext, ParentType extends ResolversParentTypes['ServerMigration'] = ResolversParentTypes['ServerMigration']> = {
movedFrom?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;
movedTo?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;
__isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;
};
export type ServerRoleItemResolvers<ContextType = GraphQLContext, ParentType extends ResolversParentTypes['ServerRoleItem'] = ResolversParentTypes['ServerRoleItem']> = {
id?: Resolver<ResolversTypes['String'], ParentType, ContextType>;
title?: Resolver<ResolversTypes['String'], ParentType, ContextType>;
@@ -4411,6 +4428,7 @@ export type Resolvers<ContextType = GraphQLContext> = {
ServerAppListItem?: ServerAppListItemResolvers<ContextType>;
ServerInfo?: ServerInfoResolvers<ContextType>;
ServerInvite?: ServerInviteResolvers<ContextType>;
ServerMigration?: ServerMigrationResolvers<ContextType>;
ServerRoleItem?: ServerRoleItemResolvers<ContextType>;
ServerStatistics?: ServerStatisticsResolvers<ContextType>;
ServerStats?: ServerStatsResolvers<ContextType>;
@@ -82,6 +82,7 @@ export type ServerInfo = ServerConfigRecord & {
* Dynamically resolved from env vars
*/
version: string
migration?: { movedFrom?: string; movedTo?: string }
}
export type CommitRecord = {
@@ -1,5 +1,11 @@
'use strict'
const knex = require('@/db/knex')
const {
getServerVersion,
getServerOrigin,
getServerMovedTo,
getServerMovedFrom
} = require('@/modules/shared/helpers/envHelper')
const Roles = () => knex('user_roles')
const Scopes = () => knex('scopes')
@@ -11,8 +17,11 @@ module.exports = {
*/
async getServerInfo() {
const serverInfo = await Info().select('*').first()
serverInfo.version = process.env.SPECKLE_SERVER_VERSION || 'dev'
serverInfo.canonicalUrl = process.env.CANONICAL_URL || '127.0.0.1'
serverInfo.version = getServerVersion()
serverInfo.canonicalUrl = getServerOrigin()
const movedTo = getServerMovedTo()
const movedFrom = getServerMovedFrom()
if (movedTo || movedFrom) serverInfo.migration = { movedTo, movedFrom }
return serverInfo
},
@@ -2079,6 +2079,8 @@ export type ServerInfo = {
description?: Maybe<Scalars['String']>;
guestModeEnabled: Scalars['Boolean'];
inviteOnly?: Maybe<Scalars['Boolean']>;
/** Server relocation / migration info */
migration?: Maybe<ServerMigration>;
name: Scalars['String'];
/** @deprecated Use role constants from the @speckle/shared npm package instead */
roles: Array<Role>;
@@ -2112,6 +2114,12 @@ export type ServerInviteCreateInput = {
serverRole?: InputMaybe<Scalars['String']>;
};
export type ServerMigration = {
__typename?: 'ServerMigration';
movedFrom?: Maybe<Scalars['String']>;
movedTo?: Maybe<Scalars['String']>;
};
export enum ServerRole {
ServerAdmin = 'SERVER_ADMIN',
ServerArchivedUser = 'SERVER_ARCHIVED_USER',
@@ -160,6 +160,28 @@ export function isSSLServer() {
return /^https:\/\//.test(getBaseUrl())
}
function parseUrlVar(value: string, name: string) {
try {
return new URL(value)
} catch (err: unknown) {
if (err instanceof TypeError && err.message === 'Invalid URL')
throw new MisconfiguredEnvironmentError(`${name} has to be a valid URL`)
throw err
}
}
export function getServerMovedFrom() {
const value = process.env.MIGRATION_SERVER_MOVED_FROM
if (!value) return value
return parseUrlVar(value, 'MIGRATION_SERVER_MOVED_FROM')
}
export function getServerMovedTo() {
const value = process.env.MIGRATION_SERVER_MOVED_TO
if (!value) return value
return parseUrlVar(value, 'MIGRATION_SERVER_MOVED_TO')
}
export function adminOverrideEnabled() {
return process.env.ADMIN_OVERRIDE_ENABLED === 'true'
}
@@ -2080,6 +2080,8 @@ export type ServerInfo = {
description?: Maybe<Scalars['String']>;
guestModeEnabled: Scalars['Boolean'];
inviteOnly?: Maybe<Scalars['Boolean']>;
/** Server relocation / migration info */
migration?: Maybe<ServerMigration>;
name: Scalars['String'];
/** @deprecated Use role constants from the @speckle/shared npm package instead */
roles: Array<Role>;
@@ -2113,6 +2115,12 @@ export type ServerInviteCreateInput = {
serverRole?: InputMaybe<Scalars['String']>;
};
export type ServerMigration = {
__typename?: 'ServerMigration';
movedFrom?: Maybe<Scalars['String']>;
movedTo?: Maybe<Scalars['String']>;
};
export enum ServerRole {
ServerAdmin = 'SERVER_ADMIN',
ServerArchivedUser = 'SERVER_ARCHIVED_USER',
@@ -131,6 +131,17 @@ spec:
- name: SPECKLE_AUTOMATE_URL
value: {{ .Values.server.speckleAutomateUrl }}
{{- if .Values.server.migration.movedFrom }}
- name: MIGRATION_SERVER_MOVED_FROM
value: {{ .Values.server.migration.movedFrom }}
{{- end }}
{{- if .Values.server.migration.movedTo }}
- name: MIGRATION_SERVER_MOVED_TO
value: {{ .Values.server.migration.movedTo }}
{{- end }}
# *** Redis ***
- name: REDIS_URL
valueFrom:
@@ -983,6 +983,21 @@
}
}
},
"migration": {
"type": "object",
"properties": {
"movedFrom": {
"type": "string",
"description": "Indicate the URL where the server moved from",
"default": ""
},
"movedTo": {
"type": "string",
"description": "Indicate the URL where the server moved to",
"default": ""
}
}
},
"monitoring": {
"type": "object",
"properties": {
+6
View File
@@ -647,6 +647,12 @@ server:
## @param server.fileUploads.enabled If enabled, file uploads on the server will be flagged as enabled
enabled: true
migration:
## @param server.migration.movedFrom Indicate the URL where the server moved from
movedFrom: ''
## @param server.migration.movedTo Indicate the URL where the server moved to
movedTo: ''
monitoring:
apollo:
## @param server.monitoring.apollo.enabled (Optional) If enabled, exports metrics from the GraphQL API to Apollo Graphql Studio.