diff --git a/frontend/apps/web/components/connections/forms/postgres/PostgresForm.tsx b/frontend/apps/web/components/connections/forms/postgres/PostgresForm.tsx
index fb4d8af05a..90b6f54435 100644
--- a/frontend/apps/web/components/connections/forms/postgres/PostgresForm.tsx
+++ b/frontend/apps/web/components/connections/forms/postgres/PostgresForm.tsx
@@ -1,4 +1,7 @@
-import { buildConnectionConfigPostgres } from '@/app/(mgmt)/[account]/connections/util';
+import {
+ buildConnectionConfigPostgres,
+ getTunnelConfig,
+} from '@/app/(mgmt)/[account]/connections/util';
import Submit from '@/components/forms/Submit';
import { useAccount } from '@/components/providers/account-provider';
import { BaseStore } from '@/util/zustand.stores.util';
@@ -8,6 +11,8 @@ import { useMutation } from '@connectrpc/connect-query';
import {
CheckConnectionConfigByIdRequestSchema,
CheckConnectionConfigRequestSchema,
+ CheckSSHConnectionByIdRequestSchema,
+ CheckSSHConnectionRequestSchema,
ConnectionService,
} from '@neosync/sdk';
import { ReactElement, useEffect } from 'react';
@@ -196,6 +201,16 @@ export default function PostgresForm(props: Props): ReactElement {
const values = await getValueWithSecrets?.();
return values?.tunnel;
}}
+ onCheckRequest={() => {
+ return createMessage(CheckSSHConnectionRequestSchema, {
+ tunnel: getTunnelConfig(formData.tunnel),
+ });
+ }}
+ onCheckIdRequest={() => {
+ return createMessage(CheckSSHConnectionByIdRequestSchema, {
+ id: connectionId ?? '',
+ });
+ }}
/>
diff --git a/frontend/apps/web/components/connections/forms/sql-server/SqlServerForm.tsx b/frontend/apps/web/components/connections/forms/sql-server/SqlServerForm.tsx
index 862dde531c..1ca5688f4b 100644
--- a/frontend/apps/web/components/connections/forms/sql-server/SqlServerForm.tsx
+++ b/frontend/apps/web/components/connections/forms/sql-server/SqlServerForm.tsx
@@ -1,4 +1,7 @@
-import { buildConnectionConfigMssql } from '@/app/(mgmt)/[account]/connections/util';
+import {
+ buildConnectionConfigMssql,
+ getTunnelConfig,
+} from '@/app/(mgmt)/[account]/connections/util';
import Submit from '@/components/forms/Submit';
import { useAccount } from '@/components/providers/account-provider';
import { BaseStore } from '@/util/zustand.stores.util';
@@ -8,6 +11,8 @@ import { useMutation } from '@connectrpc/connect-query';
import {
CheckConnectionConfigByIdRequestSchema,
CheckConnectionConfigRequestSchema,
+ CheckSSHConnectionByIdRequestSchema,
+ CheckSSHConnectionRequestSchema,
ConnectionService,
} from '@neosync/sdk';
import { ReactElement, useEffect } from 'react';
@@ -184,6 +189,16 @@ export default function SqlServerForm(props: Props): ReactElement {
const values = await getValueWithSecrets?.();
return values?.tunnel;
}}
+ onCheckRequest={() => {
+ return createMessage(CheckSSHConnectionRequestSchema, {
+ tunnel: getTunnelConfig(formData.tunnel),
+ });
+ }}
+ onCheckIdRequest={() => {
+ return createMessage(CheckSSHConnectionByIdRequestSchema, {
+ id: connectionId ?? '',
+ });
+ }}
/>
diff --git a/frontend/packages/sdk/src/client/mgmt/v1alpha1/connection_pb.ts b/frontend/packages/sdk/src/client/mgmt/v1alpha1/connection_pb.ts
index dc639947c7..3e6914cb1a 100644
--- a/frontend/packages/sdk/src/client/mgmt/v1alpha1/connection_pb.ts
+++ b/frontend/packages/sdk/src/client/mgmt/v1alpha1/connection_pb.ts
@@ -13,7 +13,7 @@ import type { Message } from "@bufbuild/protobuf";
* Describes the file mgmt/v1alpha1/connection.proto.
*/
export const file_mgmt_v1alpha1_connection: GenFile = /*@__PURE__*/
- fileDesc("Ch5tZ210L3YxYWxwaGExL2Nvbm5lY3Rpb24ucHJvdG8SDW1nbXQudjFhbHBoYTEiUAoVR2V0Q29ubmVjdGlvbnNSZXF1ZXN0EhwKCmFjY291bnRfaWQYASABKAlCCLpIBXIDsAEBEhkKEWV4Y2x1ZGVfc2Vuc2l0aXZlGAIgASgIIkgKFkdldENvbm5lY3Rpb25zUmVzcG9uc2USLgoLY29ubmVjdGlvbnMYASADKAsyGS5tZ210LnYxYWxwaGExLkNvbm5lY3Rpb24iRwoUR2V0Q29ubmVjdGlvblJlcXVlc3QSFAoCaWQYASABKAlCCLpIBXIDsAEBEhkKEWV4Y2x1ZGVfc2Vuc2l0aXZlGAIgASgIIkYKFUdldENvbm5lY3Rpb25SZXNwb25zZRItCgpjb25uZWN0aW9uGAEgASgLMhkubWdtdC52MWFscGhhMS5Db25uZWN0aW9uIpwBChdDcmVhdGVDb25uZWN0aW9uUmVxdWVzdBIcCgphY2NvdW50X2lkGAEgASgJQgi6SAVyA7ABARInCgRuYW1lGAIgASgJQhm6SBZyFDISXlthLXowLTktXXszLDEwMH0kEjoKEWNvbm5lY3Rpb25fY29uZmlnGAMgASgLMh8ubWdtdC52MWFscGhhMS5Db25uZWN0aW9uQ29uZmlnIkkKGENyZWF0ZUNvbm5lY3Rpb25SZXNwb25zZRItCgpjb25uZWN0aW9uGAEgASgLMhkubWdtdC52MWFscGhhMS5Db25uZWN0aW9uIpQBChdVcGRhdGVDb25uZWN0aW9uUmVxdWVzdBIUCgJpZBgBIAEoCUIIukgFcgOwAQESJwoEbmFtZRgCIAEoCUIZukgWchQyEl5bYS16MC05LV17MywxMDB9JBI6ChFjb25uZWN0aW9uX2NvbmZpZxgDIAEoCzIfLm1nbXQudjFhbHBoYTEuQ29ubmVjdGlvbkNvbmZpZyJJChhVcGRhdGVDb25uZWN0aW9uUmVzcG9uc2USLQoKY29ubmVjdGlvbhgBIAEoCzIZLm1nbXQudjFhbHBoYTEuQ29ubmVjdGlvbiIvChdEZWxldGVDb25uZWN0aW9uUmVxdWVzdBIUCgJpZBgBIAEoCUIIukgFcgOwAQEiGgoYRGVsZXRlQ29ubmVjdGlvblJlc3BvbnNlIloKHENoZWNrQ29ubmVjdGlvbkNvbmZpZ1JlcXVlc3QSOgoRY29ubmVjdGlvbl9jb25maWcYASABKAsyHy5tZ210LnYxYWxwaGExLkNvbm5lY3Rpb25Db25maWciOAogQ2hlY2tDb25uZWN0aW9uQ29uZmlnQnlJZFJlcXVlc3QSFAoCaWQYASABKAlCCLpIBXIDsAEBIqkBCiFDaGVja0Nvbm5lY3Rpb25Db25maWdCeUlkUmVzcG9uc2USFAoMaXNfY29ubmVjdGVkGAEgASgIEh0KEGNvbm5lY3Rpb25fZXJyb3IYAiABKAlIAIgBARI6Cgpwcml2aWxlZ2VzGAMgAygLMiYubWdtdC52MWFscGhhMS5Db25uZWN0aW9uUm9sZVByaXZpbGVnZUITChFfY29ubmVjdGlvbl9lcnJvciKlAQodQ2hlY2tDb25uZWN0aW9uQ29uZmlnUmVzcG9uc2USFAoMaXNfY29ubmVjdGVkGAEgASgIEh0KEGNvbm5lY3Rpb25fZXJyb3IYAiABKAlIAIgBARI6Cgpwcml2aWxlZ2VzGAMgAygLMiYubWdtdC52MWFscGhhMS5Db25uZWN0aW9uUm9sZVByaXZpbGVnZUITChFfY29ubmVjdGlvbl9lcnJvciJhChdDb25uZWN0aW9uUm9sZVByaXZpbGVnZRIPCgdncmFudGVlGAEgASgJEg4KBnNjaGVtYRgCIAEoCRINCgV0YWJsZRgDIAEoCRIWCg5wcml2aWxlZ2VfdHlwZRgEIAMoCSKOAgoKQ29ubmVjdGlvbhIKCgJpZBgBIAEoCRIMCgRuYW1lGAIgASgJEjoKEWNvbm5lY3Rpb25fY29uZmlnGAMgASgLMh8ubWdtdC52MWFscGhhMS5Db25uZWN0aW9uQ29uZmlnEhoKEmNyZWF0ZWRfYnlfdXNlcl9pZBgEIAEoCRIuCgpjcmVhdGVkX2F0GAUgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBIaChJ1cGRhdGVkX2J5X3VzZXJfaWQYBiABKAkSLgoKdXBkYXRlZF9hdBgHIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASEgoKYWNjb3VudF9pZBgIIAEoCSL8BAoQQ29ubmVjdGlvbkNvbmZpZxI8CglwZ19jb25maWcYASABKAsyJy5tZ210LnYxYWxwaGExLlBvc3RncmVzQ29ubmVjdGlvbkNvbmZpZ0gAEj0KDWF3c19zM19jb25maWcYAiABKAsyJC5tZ210LnYxYWxwaGExLkF3c1MzQ29ubmVjdGlvbkNvbmZpZ0gAEjwKDG15c3FsX2NvbmZpZxgDIAEoCzIkLm1nbXQudjFhbHBoYTEuTXlzcWxDb25uZWN0aW9uQ29uZmlnSAASSQoQbG9jYWxfZGlyX2NvbmZpZxgEIAEoCzItLm1nbXQudjFhbHBoYTEuTG9jYWxEaXJlY3RvcnlDb25uZWN0aW9uQ29uZmlnSAASPgoNb3BlbmFpX2NvbmZpZxgFIAEoCzIlLm1nbXQudjFhbHBoYTEuT3BlbkFpQ29ubmVjdGlvbkNvbmZpZ0gAEjwKDG1vbmdvX2NvbmZpZxgGIAEoCzIkLm1nbXQudjFhbHBoYTEuTW9uZ29Db25uZWN0aW9uQ29uZmlnSAASUQoXZ2NwX2Nsb3Vkc3RvcmFnZV9jb25maWcYByABKAsyLi5tZ210LnYxYWxwaGExLkdjcENsb3VkU3RvcmFnZUNvbm5lY3Rpb25Db25maWdIABJCCg9keW5hbW9kYl9jb25maWcYCCABKAsyJy5tZ210LnYxYWxwaGExLkR5bmFtb0RCQ29ubmVjdGlvbkNvbmZpZ0gAEjwKDG1zc3FsX2NvbmZpZxgJIAEoCzIkLm1nbXQudjFhbHBoYTEuTXNzcWxDb25uZWN0aW9uQ29uZmlnSABCDwoGY29uZmlnEgW6SAIIASL5AQoVTXNzcWxDb25uZWN0aW9uQ29uZmlnEg0KA3VybBgBIAEoCUgAEhYKDHVybF9mcm9tX2VudhgFIAEoCUgAEj8KEmNvbm5lY3Rpb25fb3B0aW9ucxgCIAEoCzIjLm1nbXQudjFhbHBoYTEuU3FsQ29ubmVjdGlvbk9wdGlvbnMSKAoGdHVubmVsGAMgASgLMhgubWdtdC52MWFscGhhMS5TU0hUdW5uZWwSMgoKY2xpZW50X3RscxgEIAEoCzIeLm1nbXQudjFhbHBoYTEuQ2xpZW50VGxzQ29uZmlnQhoKEWNvbm5lY3Rpb25fY29uZmlnEgW6SAIIASKpAQoYRHluYW1vREJDb25uZWN0aW9uQ29uZmlnEjkKC2NyZWRlbnRpYWxzGAEgASgLMh8ubWdtdC52MWFscGhhMS5Bd3NTM0NyZWRlbnRpYWxzSACIAQESEwoGcmVnaW9uGAIgASgJSAGIAQESFQoIZW5kcG9pbnQYAyABKAlIAogBAUIOCgxfY3JlZGVudGlhbHNCCQoHX3JlZ2lvbkILCglfZW5kcG9pbnQioAEKFU1vbmdvQ29ubmVjdGlvbkNvbmZpZxINCgN1cmwYASABKAlIABIoCgZ0dW5uZWwYAiABKAsyGC5tZ210LnYxYWxwaGExLlNTSFR1bm5lbBIyCgpjbGllbnRfdGxzGAMgASgLMh4ubWdtdC52MWFscGhhMS5DbGllbnRUbHNDb25maWdCGgoRY29ubmVjdGlvbl9jb25maWcSBbpIAggBIjoKFk9wZW5BaUNvbm5lY3Rpb25Db25maWcSDwoHYXBpX2tleRgBIAEoCRIPCgdhcGlfdXJsGAIgASgJIjcKHkxvY2FsRGlyZWN0b3J5Q29ubmVjdGlvbkNvbmZpZxIVCgRwYXRoGAEgASgJQge6SARyAhABIrUCChhQb3N0Z3Jlc0Nvbm5lY3Rpb25Db25maWcSDQoDdXJsGAEgASgJSAASNwoKY29ubmVjdGlvbhgCIAEoCzIhLm1nbXQudjFhbHBoYTEuUG9zdGdyZXNDb25uZWN0aW9uSAASFgoMdXJsX2Zyb21fZW52GAYgASgJSAASKAoGdHVubmVsGAMgASgLMhgubWdtdC52MWFscGhhMS5TU0hUdW5uZWwSPwoSY29ubmVjdGlvbl9vcHRpb25zGAQgASgLMiMubWdtdC52MWFscGhhMS5TcWxDb25uZWN0aW9uT3B0aW9ucxIyCgpjbGllbnRfdGxzGAUgASgLMh4ubWdtdC52MWFscGhhMS5DbGllbnRUbHNDb25maWdCGgoRY29ubmVjdGlvbl9jb25maWcSBbpIAggBIrMBCg9DbGllbnRUbHNDb25maWcSFgoJcm9vdF9jZXJ0GAEgASgJSACIAQESGAoLY2xpZW50X2NlcnQYAiABKAlIAYgBARIXCgpjbGllbnRfa2V5GAMgASgJSAKIAQESGAoLc2VydmVyX25hbWUYBCABKAlIA4gBAUIMCgpfcm9vdF9jZXJ0Qg4KDF9jbGllbnRfY2VydEINCgtfY2xpZW50X2tleUIOCgxfc2VydmVyX25hbWUi+gEKFFNxbENvbm5lY3Rpb25PcHRpb25zEiEKFG1heF9jb25uZWN0aW9uX2xpbWl0GAEgASgFSACIAQESIQoUbWF4X2lkbGVfY29ubmVjdGlvbnMYAiABKAVIAYgBARIeChFtYXhfaWRsZV9kdXJhdGlvbhgDIAEoCUgCiAEBEh4KEW1heF9vcGVuX2R1cmF0aW9uGAQgASgJSAOIAQFCFwoVX21heF9jb25uZWN0aW9uX2xpbWl0QhcKFV9tYXhfaWRsZV9jb25uZWN0aW9uc0IUChJfbWF4X2lkbGVfZHVyYXRpb25CFAoSX21heF9vcGVuX2R1cmF0aW9uItEBCglTU0hUdW5uZWwSFQoEaG9zdBgBIAEoCUIHukgEcgIQARIVCgRwb3J0GAIgASgFQge6SAQaAigAEhUKBHVzZXIYAyABKAlCB7pIBHICEAESKwoVa25vd25faG9zdF9wdWJsaWNfa2V5GAQgASgJQge6SARyAhABSACIAQESOAoOYXV0aGVudGljYXRpb24YBSABKAsyIC5tZ210LnYxYWxwaGExLlNTSEF1dGhlbnRpY2F0aW9uQhgKFl9rbm93bl9ob3N0X3B1YmxpY19rZXkikgEKEVNTSEF1dGhlbnRpY2F0aW9uEjIKCnBhc3NwaHJhc2UYASABKAsyHC5tZ210LnYxYWxwaGExLlNTSFBhc3NwaHJhc2VIABIzCgtwcml2YXRlX2tleRgCIAEoCzIcLm1nbXQudjFhbHBoYTEuU1NIUHJpdmF0ZUtleUgAQhQKC2F1dGhfY29uZmlnEgW6SAIIASInCg1TU0hQYXNzcGhyYXNlEhYKBXZhbHVlGAEgASgJQge6SARyAhABIk8KDVNTSFByaXZhdGVLZXkSFgoFdmFsdWUYASABKAlCB7pIBHICEAESFwoKcGFzc3BocmFzZRgCIAEoCUgAiAEBQg0KC19wYXNzcGhyYXNlIn4KElBvc3RncmVzQ29ubmVjdGlvbhIMCgRob3N0GAEgASgJEgwKBHBvcnQYAiABKAUSDAoEbmFtZRgDIAEoCRIMCgR1c2VyGAQgASgJEgwKBHBhc3MYBSABKAkSFQoIc3NsX21vZGUYBiABKAlIAIgBAUILCglfc3NsX21vZGUiaQoPTXlzcWxDb25uZWN0aW9uEgwKBHVzZXIYASABKAkSDAoEcGFzcxgCIAEoCRIQCghwcm90b2NvbBgDIAEoCRIMCgRob3N0GAQgASgJEgwKBHBvcnQYBSABKAUSDAoEbmFtZRgGIAEoCSKvAgoVTXlzcWxDb25uZWN0aW9uQ29uZmlnEg0KA3VybBgBIAEoCUgAEjQKCmNvbm5lY3Rpb24YAiABKAsyHi5tZ210LnYxYWxwaGExLk15c3FsQ29ubmVjdGlvbkgAEhYKDHVybF9mcm9tX2VudhgGIAEoCUgAEigKBnR1bm5lbBgDIAEoCzIYLm1nbXQudjFhbHBoYTEuU1NIVHVubmVsEj8KEmNvbm5lY3Rpb25fb3B0aW9ucxgEIAEoCzIjLm1nbXQudjFhbHBoYTEuU3FsQ29ubmVjdGlvbk9wdGlvbnMSMgoKY2xpZW50X3RscxgFIAEoCzIeLm1nbXQudjFhbHBoYTEuQ2xpZW50VGxzQ29uZmlnQhoKEWNvbm5lY3Rpb25fY29uZmlnEgW6SAIIASLvAQoVQXdzUzNDb25uZWN0aW9uQ29uZmlnEhgKC3BhdGhfcHJlZml4GAIgASgJSACIAQESOQoLY3JlZGVudGlhbHMYAyABKAsyHy5tZ210LnYxYWxwaGExLkF3c1MzQ3JlZGVudGlhbHNIAYgBARITCgZyZWdpb24YBCABKAlIAogBARIVCghlbmRwb2ludBgFIAEoCUgDiAEBEhcKBmJ1Y2tldBgGIAEoCUIHukgEcgIQAUIOCgxfcGF0aF9wcmVmaXhCDgoMX2NyZWRlbnRpYWxzQgkKB19yZWdpb25CCwoJX2VuZHBvaW50SgQIARACIswCChBBd3NTM0NyZWRlbnRpYWxzEhQKB3Byb2ZpbGUYASABKAlIAIgBARIaCg1hY2Nlc3Nfa2V5X2lkGAIgASgJSAGIAQESHgoRc2VjcmV0X2FjY2Vzc19rZXkYAyABKAlIAogBARIaCg1zZXNzaW9uX3Rva2VuGAQgASgJSAOIAQESGgoNZnJvbV9lYzJfcm9sZRgFIAEoCEgEiAEBEhUKCHJvbGVfYXJuGAYgASgJSAWIAQESHQoQcm9sZV9leHRlcm5hbF9pZBgHIAEoCUgGiAEBQgoKCF9wcm9maWxlQhAKDl9hY2Nlc3Nfa2V5X2lkQhQKEl9zZWNyZXRfYWNjZXNzX2tleUIQCg5fc2Vzc2lvbl90b2tlbkIQCg5fZnJvbV9lYzJfcm9sZUILCglfcm9sZV9hcm5CEwoRX3JvbGVfZXh0ZXJuYWxfaWQirgEKH0djcENsb3VkU3RvcmFnZUNvbm5lY3Rpb25Db25maWcSFwoGYnVja2V0GAEgASgJQge6SARyAhABEhgKC3BhdGhfcHJlZml4GAIgASgJSACIAQESKAobc2VydmljZV9hY2NvdW50X2NyZWRlbnRpYWxzGAMgASgJSAGIAQFCDgoMX3BhdGhfcHJlZml4Qh4KHF9zZXJ2aWNlX2FjY291bnRfY3JlZGVudGlhbHMidAogSXNDb25uZWN0aW9uTmFtZUF2YWlsYWJsZVJlcXVlc3QSHAoKYWNjb3VudF9pZBgBIAEoCUIIukgFcgOwAQESMgoPY29ubmVjdGlvbl9uYW1lGAIgASgJQhm6SBZyFDISXlthLXowLTktXXszLDEwMH0kIjkKIUlzQ29ubmVjdGlvbk5hbWVBdmFpbGFibGVSZXNwb25zZRIUCgxpc19hdmFpbGFibGUYASABKAgiRAoUQ2hlY2tTcWxRdWVyeVJlcXVlc3QSFAoCaWQYASABKAlCCLpIBXIDsAEBEhYKBXF1ZXJ5GAIgASgJQge6SARyAhABIlcKFUNoZWNrU3FsUXVlcnlSZXNwb25zZRIQCghpc192YWxpZBgBIAEoCBIaCg1lcm9ycl9tZXNzYWdlGAIgASgJSACIAQFCEAoOX2Vyb3JyX21lc3NhZ2Uy5wcKEUNvbm5lY3Rpb25TZXJ2aWNlEmIKDkdldENvbm5lY3Rpb25zEiQubWdtdC52MWFscGhhMS5HZXRDb25uZWN0aW9uc1JlcXVlc3QaJS5tZ210LnYxYWxwaGExLkdldENvbm5lY3Rpb25zUmVzcG9uc2UiA5ACARJfCg1HZXRDb25uZWN0aW9uEiMubWdtdC52MWFscGhhMS5HZXRDb25uZWN0aW9uUmVxdWVzdBokLm1nbXQudjFhbHBoYTEuR2V0Q29ubmVjdGlvblJlc3BvbnNlIgOQAgESZQoQQ3JlYXRlQ29ubmVjdGlvbhImLm1nbXQudjFhbHBoYTEuQ3JlYXRlQ29ubmVjdGlvblJlcXVlc3QaJy5tZ210LnYxYWxwaGExLkNyZWF0ZUNvbm5lY3Rpb25SZXNwb25zZSIAEmUKEFVwZGF0ZUNvbm5lY3Rpb24SJi5tZ210LnYxYWxwaGExLlVwZGF0ZUNvbm5lY3Rpb25SZXF1ZXN0GicubWdtdC52MWFscGhhMS5VcGRhdGVDb25uZWN0aW9uUmVzcG9uc2UiABJlChBEZWxldGVDb25uZWN0aW9uEiYubWdtdC52MWFscGhhMS5EZWxldGVDb25uZWN0aW9uUmVxdWVzdBonLm1nbXQudjFhbHBoYTEuRGVsZXRlQ29ubmVjdGlvblJlc3BvbnNlIgASgAEKGUlzQ29ubmVjdGlvbk5hbWVBdmFpbGFibGUSLy5tZ210LnYxYWxwaGExLklzQ29ubmVjdGlvbk5hbWVBdmFpbGFibGVSZXF1ZXN0GjAubWdtdC52MWFscGhhMS5Jc0Nvbm5lY3Rpb25OYW1lQXZhaWxhYmxlUmVzcG9uc2UiABJ0ChVDaGVja0Nvbm5lY3Rpb25Db25maWcSKy5tZ210LnYxYWxwaGExLkNoZWNrQ29ubmVjdGlvbkNvbmZpZ1JlcXVlc3QaLC5tZ210LnYxYWxwaGExLkNoZWNrQ29ubmVjdGlvbkNvbmZpZ1Jlc3BvbnNlIgASgAEKGUNoZWNrQ29ubmVjdGlvbkNvbmZpZ0J5SWQSLy5tZ210LnYxYWxwaGExLkNoZWNrQ29ubmVjdGlvbkNvbmZpZ0J5SWRSZXF1ZXN0GjAubWdtdC52MWFscGhhMS5DaGVja0Nvbm5lY3Rpb25Db25maWdCeUlkUmVzcG9uc2UiABJcCg1DaGVja1NxbFF1ZXJ5EiMubWdtdC52MWFscGhhMS5DaGVja1NxbFF1ZXJ5UmVxdWVzdBokLm1nbXQudjFhbHBoYTEuQ2hlY2tTcWxRdWVyeVJlc3BvbnNlIgBCywEKEWNvbS5tZ210LnYxYWxwaGExQg9Db25uZWN0aW9uUHJvdG9QAVpQZ2l0aHViLmNvbS9udWNsZXVzY2xvdWQvbmVvc3luYy9iYWNrZW5kL2dlbi9nby9wcm90b3MvbWdtdC92MWFscGhhMTttZ210djFhbHBoYTGiAgNNWFiqAg1NZ210LlYxYWxwaGExygINTWdtdFxWMWFscGhhMeICGU1nbXRcVjFhbHBoYTFcR1BCTWV0YWRhdGHqAg5NZ210OjpWMWFscGhhMWIGcHJvdG8z", [file_buf_validate_validate, file_google_protobuf_timestamp]);
+ fileDesc("Ch5tZ210L3YxYWxwaGExL2Nvbm5lY3Rpb24ucHJvdG8SDW1nbXQudjFhbHBoYTEiUAoVR2V0Q29ubmVjdGlvbnNSZXF1ZXN0EhwKCmFjY291bnRfaWQYASABKAlCCLpIBXIDsAEBEhkKEWV4Y2x1ZGVfc2Vuc2l0aXZlGAIgASgIIkgKFkdldENvbm5lY3Rpb25zUmVzcG9uc2USLgoLY29ubmVjdGlvbnMYASADKAsyGS5tZ210LnYxYWxwaGExLkNvbm5lY3Rpb24iRwoUR2V0Q29ubmVjdGlvblJlcXVlc3QSFAoCaWQYASABKAlCCLpIBXIDsAEBEhkKEWV4Y2x1ZGVfc2Vuc2l0aXZlGAIgASgIIkYKFUdldENvbm5lY3Rpb25SZXNwb25zZRItCgpjb25uZWN0aW9uGAEgASgLMhkubWdtdC52MWFscGhhMS5Db25uZWN0aW9uIpwBChdDcmVhdGVDb25uZWN0aW9uUmVxdWVzdBIcCgphY2NvdW50X2lkGAEgASgJQgi6SAVyA7ABARInCgRuYW1lGAIgASgJQhm6SBZyFDISXlthLXowLTktXXszLDEwMH0kEjoKEWNvbm5lY3Rpb25fY29uZmlnGAMgASgLMh8ubWdtdC52MWFscGhhMS5Db25uZWN0aW9uQ29uZmlnIkkKGENyZWF0ZUNvbm5lY3Rpb25SZXNwb25zZRItCgpjb25uZWN0aW9uGAEgASgLMhkubWdtdC52MWFscGhhMS5Db25uZWN0aW9uIpQBChdVcGRhdGVDb25uZWN0aW9uUmVxdWVzdBIUCgJpZBgBIAEoCUIIukgFcgOwAQESJwoEbmFtZRgCIAEoCUIZukgWchQyEl5bYS16MC05LV17MywxMDB9JBI6ChFjb25uZWN0aW9uX2NvbmZpZxgDIAEoCzIfLm1nbXQudjFhbHBoYTEuQ29ubmVjdGlvbkNvbmZpZyJJChhVcGRhdGVDb25uZWN0aW9uUmVzcG9uc2USLQoKY29ubmVjdGlvbhgBIAEoCzIZLm1nbXQudjFhbHBoYTEuQ29ubmVjdGlvbiIvChdEZWxldGVDb25uZWN0aW9uUmVxdWVzdBIUCgJpZBgBIAEoCUIIukgFcgOwAQEiGgoYRGVsZXRlQ29ubmVjdGlvblJlc3BvbnNlIloKHENoZWNrQ29ubmVjdGlvbkNvbmZpZ1JlcXVlc3QSOgoRY29ubmVjdGlvbl9jb25maWcYASABKAsyHy5tZ210LnYxYWxwaGExLkNvbm5lY3Rpb25Db25maWciOAogQ2hlY2tDb25uZWN0aW9uQ29uZmlnQnlJZFJlcXVlc3QSFAoCaWQYASABKAlCCLpIBXIDsAEBIqkBCiFDaGVja0Nvbm5lY3Rpb25Db25maWdCeUlkUmVzcG9uc2USFAoMaXNfY29ubmVjdGVkGAEgASgIEh0KEGNvbm5lY3Rpb25fZXJyb3IYAiABKAlIAIgBARI6Cgpwcml2aWxlZ2VzGAMgAygLMiYubWdtdC52MWFscGhhMS5Db25uZWN0aW9uUm9sZVByaXZpbGVnZUITChFfY29ubmVjdGlvbl9lcnJvciKlAQodQ2hlY2tDb25uZWN0aW9uQ29uZmlnUmVzcG9uc2USFAoMaXNfY29ubmVjdGVkGAEgASgIEh0KEGNvbm5lY3Rpb25fZXJyb3IYAiABKAlIAIgBARI6Cgpwcml2aWxlZ2VzGAMgAygLMiYubWdtdC52MWFscGhhMS5Db25uZWN0aW9uUm9sZVByaXZpbGVnZUITChFfY29ubmVjdGlvbl9lcnJvciJhChdDb25uZWN0aW9uUm9sZVByaXZpbGVnZRIPCgdncmFudGVlGAEgASgJEg4KBnNjaGVtYRgCIAEoCRINCgV0YWJsZRgDIAEoCRIWCg5wcml2aWxlZ2VfdHlwZRgEIAMoCSKOAgoKQ29ubmVjdGlvbhIKCgJpZBgBIAEoCRIMCgRuYW1lGAIgASgJEjoKEWNvbm5lY3Rpb25fY29uZmlnGAMgASgLMh8ubWdtdC52MWFscGhhMS5Db25uZWN0aW9uQ29uZmlnEhoKEmNyZWF0ZWRfYnlfdXNlcl9pZBgEIAEoCRIuCgpjcmVhdGVkX2F0GAUgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBIaChJ1cGRhdGVkX2J5X3VzZXJfaWQYBiABKAkSLgoKdXBkYXRlZF9hdBgHIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASEgoKYWNjb3VudF9pZBgIIAEoCSL8BAoQQ29ubmVjdGlvbkNvbmZpZxI8CglwZ19jb25maWcYASABKAsyJy5tZ210LnYxYWxwaGExLlBvc3RncmVzQ29ubmVjdGlvbkNvbmZpZ0gAEj0KDWF3c19zM19jb25maWcYAiABKAsyJC5tZ210LnYxYWxwaGExLkF3c1MzQ29ubmVjdGlvbkNvbmZpZ0gAEjwKDG15c3FsX2NvbmZpZxgDIAEoCzIkLm1nbXQudjFhbHBoYTEuTXlzcWxDb25uZWN0aW9uQ29uZmlnSAASSQoQbG9jYWxfZGlyX2NvbmZpZxgEIAEoCzItLm1nbXQudjFhbHBoYTEuTG9jYWxEaXJlY3RvcnlDb25uZWN0aW9uQ29uZmlnSAASPgoNb3BlbmFpX2NvbmZpZxgFIAEoCzIlLm1nbXQudjFhbHBoYTEuT3BlbkFpQ29ubmVjdGlvbkNvbmZpZ0gAEjwKDG1vbmdvX2NvbmZpZxgGIAEoCzIkLm1nbXQudjFhbHBoYTEuTW9uZ29Db25uZWN0aW9uQ29uZmlnSAASUQoXZ2NwX2Nsb3Vkc3RvcmFnZV9jb25maWcYByABKAsyLi5tZ210LnYxYWxwaGExLkdjcENsb3VkU3RvcmFnZUNvbm5lY3Rpb25Db25maWdIABJCCg9keW5hbW9kYl9jb25maWcYCCABKAsyJy5tZ210LnYxYWxwaGExLkR5bmFtb0RCQ29ubmVjdGlvbkNvbmZpZ0gAEjwKDG1zc3FsX2NvbmZpZxgJIAEoCzIkLm1nbXQudjFhbHBoYTEuTXNzcWxDb25uZWN0aW9uQ29uZmlnSABCDwoGY29uZmlnEgW6SAIIASL5AQoVTXNzcWxDb25uZWN0aW9uQ29uZmlnEg0KA3VybBgBIAEoCUgAEhYKDHVybF9mcm9tX2VudhgFIAEoCUgAEj8KEmNvbm5lY3Rpb25fb3B0aW9ucxgCIAEoCzIjLm1nbXQudjFhbHBoYTEuU3FsQ29ubmVjdGlvbk9wdGlvbnMSKAoGdHVubmVsGAMgASgLMhgubWdtdC52MWFscGhhMS5TU0hUdW5uZWwSMgoKY2xpZW50X3RscxgEIAEoCzIeLm1nbXQudjFhbHBoYTEuQ2xpZW50VGxzQ29uZmlnQhoKEWNvbm5lY3Rpb25fY29uZmlnEgW6SAIIASKpAQoYRHluYW1vREJDb25uZWN0aW9uQ29uZmlnEjkKC2NyZWRlbnRpYWxzGAEgASgLMh8ubWdtdC52MWFscGhhMS5Bd3NTM0NyZWRlbnRpYWxzSACIAQESEwoGcmVnaW9uGAIgASgJSAGIAQESFQoIZW5kcG9pbnQYAyABKAlIAogBAUIOCgxfY3JlZGVudGlhbHNCCQoHX3JlZ2lvbkILCglfZW5kcG9pbnQioAEKFU1vbmdvQ29ubmVjdGlvbkNvbmZpZxINCgN1cmwYASABKAlIABIoCgZ0dW5uZWwYAiABKAsyGC5tZ210LnYxYWxwaGExLlNTSFR1bm5lbBIyCgpjbGllbnRfdGxzGAMgASgLMh4ubWdtdC52MWFscGhhMS5DbGllbnRUbHNDb25maWdCGgoRY29ubmVjdGlvbl9jb25maWcSBbpIAggBIjoKFk9wZW5BaUNvbm5lY3Rpb25Db25maWcSDwoHYXBpX2tleRgBIAEoCRIPCgdhcGlfdXJsGAIgASgJIjcKHkxvY2FsRGlyZWN0b3J5Q29ubmVjdGlvbkNvbmZpZxIVCgRwYXRoGAEgASgJQge6SARyAhABIrUCChhQb3N0Z3Jlc0Nvbm5lY3Rpb25Db25maWcSDQoDdXJsGAEgASgJSAASNwoKY29ubmVjdGlvbhgCIAEoCzIhLm1nbXQudjFhbHBoYTEuUG9zdGdyZXNDb25uZWN0aW9uSAASFgoMdXJsX2Zyb21fZW52GAYgASgJSAASKAoGdHVubmVsGAMgASgLMhgubWdtdC52MWFscGhhMS5TU0hUdW5uZWwSPwoSY29ubmVjdGlvbl9vcHRpb25zGAQgASgLMiMubWdtdC52MWFscGhhMS5TcWxDb25uZWN0aW9uT3B0aW9ucxIyCgpjbGllbnRfdGxzGAUgASgLMh4ubWdtdC52MWFscGhhMS5DbGllbnRUbHNDb25maWdCGgoRY29ubmVjdGlvbl9jb25maWcSBbpIAggBIrMBCg9DbGllbnRUbHNDb25maWcSFgoJcm9vdF9jZXJ0GAEgASgJSACIAQESGAoLY2xpZW50X2NlcnQYAiABKAlIAYgBARIXCgpjbGllbnRfa2V5GAMgASgJSAKIAQESGAoLc2VydmVyX25hbWUYBCABKAlIA4gBAUIMCgpfcm9vdF9jZXJ0Qg4KDF9jbGllbnRfY2VydEINCgtfY2xpZW50X2tleUIOCgxfc2VydmVyX25hbWUi+gEKFFNxbENvbm5lY3Rpb25PcHRpb25zEiEKFG1heF9jb25uZWN0aW9uX2xpbWl0GAEgASgFSACIAQESIQoUbWF4X2lkbGVfY29ubmVjdGlvbnMYAiABKAVIAYgBARIeChFtYXhfaWRsZV9kdXJhdGlvbhgDIAEoCUgCiAEBEh4KEW1heF9vcGVuX2R1cmF0aW9uGAQgASgJSAOIAQFCFwoVX21heF9jb25uZWN0aW9uX2xpbWl0QhcKFV9tYXhfaWRsZV9jb25uZWN0aW9uc0IUChJfbWF4X2lkbGVfZHVyYXRpb25CFAoSX21heF9vcGVuX2R1cmF0aW9uItEBCglTU0hUdW5uZWwSFQoEaG9zdBgBIAEoCUIHukgEcgIQARIVCgRwb3J0GAIgASgFQge6SAQaAigAEhUKBHVzZXIYAyABKAlCB7pIBHICEAESKwoVa25vd25faG9zdF9wdWJsaWNfa2V5GAQgASgJQge6SARyAhABSACIAQESOAoOYXV0aGVudGljYXRpb24YBSABKAsyIC5tZ210LnYxYWxwaGExLlNTSEF1dGhlbnRpY2F0aW9uQhgKFl9rbm93bl9ob3N0X3B1YmxpY19rZXkikgEKEVNTSEF1dGhlbnRpY2F0aW9uEjIKCnBhc3NwaHJhc2UYASABKAsyHC5tZ210LnYxYWxwaGExLlNTSFBhc3NwaHJhc2VIABIzCgtwcml2YXRlX2tleRgCIAEoCzIcLm1nbXQudjFhbHBoYTEuU1NIUHJpdmF0ZUtleUgAQhQKC2F1dGhfY29uZmlnEgW6SAIIASInCg1TU0hQYXNzcGhyYXNlEhYKBXZhbHVlGAEgASgJQge6SARyAhABIk8KDVNTSFByaXZhdGVLZXkSFgoFdmFsdWUYASABKAlCB7pIBHICEAESFwoKcGFzc3BocmFzZRgCIAEoCUgAiAEBQg0KC19wYXNzcGhyYXNlIn4KElBvc3RncmVzQ29ubmVjdGlvbhIMCgRob3N0GAEgASgJEgwKBHBvcnQYAiABKAUSDAoEbmFtZRgDIAEoCRIMCgR1c2VyGAQgASgJEgwKBHBhc3MYBSABKAkSFQoIc3NsX21vZGUYBiABKAlIAIgBAUILCglfc3NsX21vZGUiaQoPTXlzcWxDb25uZWN0aW9uEgwKBHVzZXIYASABKAkSDAoEcGFzcxgCIAEoCRIQCghwcm90b2NvbBgDIAEoCRIMCgRob3N0GAQgASgJEgwKBHBvcnQYBSABKAUSDAoEbmFtZRgGIAEoCSKvAgoVTXlzcWxDb25uZWN0aW9uQ29uZmlnEg0KA3VybBgBIAEoCUgAEjQKCmNvbm5lY3Rpb24YAiABKAsyHi5tZ210LnYxYWxwaGExLk15c3FsQ29ubmVjdGlvbkgAEhYKDHVybF9mcm9tX2VudhgGIAEoCUgAEigKBnR1bm5lbBgDIAEoCzIYLm1nbXQudjFhbHBoYTEuU1NIVHVubmVsEj8KEmNvbm5lY3Rpb25fb3B0aW9ucxgEIAEoCzIjLm1nbXQudjFhbHBoYTEuU3FsQ29ubmVjdGlvbk9wdGlvbnMSMgoKY2xpZW50X3RscxgFIAEoCzIeLm1nbXQudjFhbHBoYTEuQ2xpZW50VGxzQ29uZmlnQhoKEWNvbm5lY3Rpb25fY29uZmlnEgW6SAIIASLvAQoVQXdzUzNDb25uZWN0aW9uQ29uZmlnEhgKC3BhdGhfcHJlZml4GAIgASgJSACIAQESOQoLY3JlZGVudGlhbHMYAyABKAsyHy5tZ210LnYxYWxwaGExLkF3c1MzQ3JlZGVudGlhbHNIAYgBARITCgZyZWdpb24YBCABKAlIAogBARIVCghlbmRwb2ludBgFIAEoCUgDiAEBEhcKBmJ1Y2tldBgGIAEoCUIHukgEcgIQAUIOCgxfcGF0aF9wcmVmaXhCDgoMX2NyZWRlbnRpYWxzQgkKB19yZWdpb25CCwoJX2VuZHBvaW50SgQIARACIswCChBBd3NTM0NyZWRlbnRpYWxzEhQKB3Byb2ZpbGUYASABKAlIAIgBARIaCg1hY2Nlc3Nfa2V5X2lkGAIgASgJSAGIAQESHgoRc2VjcmV0X2FjY2Vzc19rZXkYAyABKAlIAogBARIaCg1zZXNzaW9uX3Rva2VuGAQgASgJSAOIAQESGgoNZnJvbV9lYzJfcm9sZRgFIAEoCEgEiAEBEhUKCHJvbGVfYXJuGAYgASgJSAWIAQESHQoQcm9sZV9leHRlcm5hbF9pZBgHIAEoCUgGiAEBQgoKCF9wcm9maWxlQhAKDl9hY2Nlc3Nfa2V5X2lkQhQKEl9zZWNyZXRfYWNjZXNzX2tleUIQCg5fc2Vzc2lvbl90b2tlbkIQCg5fZnJvbV9lYzJfcm9sZUILCglfcm9sZV9hcm5CEwoRX3JvbGVfZXh0ZXJuYWxfaWQirgEKH0djcENsb3VkU3RvcmFnZUNvbm5lY3Rpb25Db25maWcSFwoGYnVja2V0GAEgASgJQge6SARyAhABEhgKC3BhdGhfcHJlZml4GAIgASgJSACIAQESKAobc2VydmljZV9hY2NvdW50X2NyZWRlbnRpYWxzGAMgASgJSAGIAQFCDgoMX3BhdGhfcHJlZml4Qh4KHF9zZXJ2aWNlX2FjY291bnRfY3JlZGVudGlhbHMidAogSXNDb25uZWN0aW9uTmFtZUF2YWlsYWJsZVJlcXVlc3QSHAoKYWNjb3VudF9pZBgBIAEoCUIIukgFcgOwAQESMgoPY29ubmVjdGlvbl9uYW1lGAIgASgJQhm6SBZyFDISXlthLXowLTktXXszLDEwMH0kIjkKIUlzQ29ubmVjdGlvbk5hbWVBdmFpbGFibGVSZXNwb25zZRIUCgxpc19hdmFpbGFibGUYASABKAgiRAoUQ2hlY2tTcWxRdWVyeVJlcXVlc3QSFAoCaWQYASABKAlCCLpIBXIDsAEBEhYKBXF1ZXJ5GAIgASgJQge6SARyAhABIlcKFUNoZWNrU3FsUXVlcnlSZXNwb25zZRIQCghpc192YWxpZBgBIAEoCBIaCg1lcm9ycl9tZXNzYWdlGAIgASgJSACIAQFCEAoOX2Vyb3JyX21lc3NhZ2UiRQoZQ2hlY2tTU0hDb25uZWN0aW9uUmVxdWVzdBIoCgZ0dW5uZWwYASABKAsyGC5tZ210LnYxYWxwaGExLlNTSFR1bm5lbCJVChpDaGVja1NTSENvbm5lY3Rpb25SZXNwb25zZRI3CgZyZXN1bHQYASABKAsyJy5tZ210LnYxYWxwaGExLkNoZWNrU1NIQ29ubmVjdGlvblJlc3VsdCI1Ch1DaGVja1NTSENvbm5lY3Rpb25CeUlkUmVxdWVzdBIUCgJpZBgBIAEoCUIIukgFcgOwAQEiWQoeQ2hlY2tTU0hDb25uZWN0aW9uQnlJZFJlc3BvbnNlEjcKBnJlc3VsdBgBIAEoCzInLm1nbXQudjFhbHBoYTEuQ2hlY2tTU0hDb25uZWN0aW9uUmVzdWx0Il8KGENoZWNrU1NIQ29ubmVjdGlvblJlc3VsdBIVCg1pc19zdWNjZXNzZnVsGAEgASgIEhoKDWVycm9yX21lc3NhZ2UYAiABKAlIAIgBAUIQCg5fZXJyb3JfbWVzc2FnZTLNCQoRQ29ubmVjdGlvblNlcnZpY2USYgoOR2V0Q29ubmVjdGlvbnMSJC5tZ210LnYxYWxwaGExLkdldENvbm5lY3Rpb25zUmVxdWVzdBolLm1nbXQudjFhbHBoYTEuR2V0Q29ubmVjdGlvbnNSZXNwb25zZSIDkAIBEl8KDUdldENvbm5lY3Rpb24SIy5tZ210LnYxYWxwaGExLkdldENvbm5lY3Rpb25SZXF1ZXN0GiQubWdtdC52MWFscGhhMS5HZXRDb25uZWN0aW9uUmVzcG9uc2UiA5ACARJlChBDcmVhdGVDb25uZWN0aW9uEiYubWdtdC52MWFscGhhMS5DcmVhdGVDb25uZWN0aW9uUmVxdWVzdBonLm1nbXQudjFhbHBoYTEuQ3JlYXRlQ29ubmVjdGlvblJlc3BvbnNlIgASZQoQVXBkYXRlQ29ubmVjdGlvbhImLm1nbXQudjFhbHBoYTEuVXBkYXRlQ29ubmVjdGlvblJlcXVlc3QaJy5tZ210LnYxYWxwaGExLlVwZGF0ZUNvbm5lY3Rpb25SZXNwb25zZSIAEmUKEERlbGV0ZUNvbm5lY3Rpb24SJi5tZ210LnYxYWxwaGExLkRlbGV0ZUNvbm5lY3Rpb25SZXF1ZXN0GicubWdtdC52MWFscGhhMS5EZWxldGVDb25uZWN0aW9uUmVzcG9uc2UiABKAAQoZSXNDb25uZWN0aW9uTmFtZUF2YWlsYWJsZRIvLm1nbXQudjFhbHBoYTEuSXNDb25uZWN0aW9uTmFtZUF2YWlsYWJsZVJlcXVlc3QaMC5tZ210LnYxYWxwaGExLklzQ29ubmVjdGlvbk5hbWVBdmFpbGFibGVSZXNwb25zZSIAEnQKFUNoZWNrQ29ubmVjdGlvbkNvbmZpZxIrLm1nbXQudjFhbHBoYTEuQ2hlY2tDb25uZWN0aW9uQ29uZmlnUmVxdWVzdBosLm1nbXQudjFhbHBoYTEuQ2hlY2tDb25uZWN0aW9uQ29uZmlnUmVzcG9uc2UiABKAAQoZQ2hlY2tDb25uZWN0aW9uQ29uZmlnQnlJZBIvLm1nbXQudjFhbHBoYTEuQ2hlY2tDb25uZWN0aW9uQ29uZmlnQnlJZFJlcXVlc3QaMC5tZ210LnYxYWxwaGExLkNoZWNrQ29ubmVjdGlvbkNvbmZpZ0J5SWRSZXNwb25zZSIAElwKDUNoZWNrU3FsUXVlcnkSIy5tZ210LnYxYWxwaGExLkNoZWNrU3FsUXVlcnlSZXF1ZXN0GiQubWdtdC52MWFscGhhMS5DaGVja1NxbFF1ZXJ5UmVzcG9uc2UiABJrChJDaGVja1NTSENvbm5lY3Rpb24SKC5tZ210LnYxYWxwaGExLkNoZWNrU1NIQ29ubmVjdGlvblJlcXVlc3QaKS5tZ210LnYxYWxwaGExLkNoZWNrU1NIQ29ubmVjdGlvblJlc3BvbnNlIgASdwoWQ2hlY2tTU0hDb25uZWN0aW9uQnlJZBIsLm1nbXQudjFhbHBoYTEuQ2hlY2tTU0hDb25uZWN0aW9uQnlJZFJlcXVlc3QaLS5tZ210LnYxYWxwaGExLkNoZWNrU1NIQ29ubmVjdGlvbkJ5SWRSZXNwb25zZSIAQssBChFjb20ubWdtdC52MWFscGhhMUIPQ29ubmVjdGlvblByb3RvUAFaUGdpdGh1Yi5jb20vbnVjbGV1c2Nsb3VkL25lb3N5bmMvYmFja2VuZC9nZW4vZ28vcHJvdG9zL21nbXQvdjFhbHBoYTE7bWdtdHYxYWxwaGExogIDTVhYqgINTWdtdC5WMWFscGhhMcoCDU1nbXRcVjFhbHBoYTHiAhlNZ210XFYxYWxwaGExXEdQQk1ldGFkYXRh6gIOTWdtdDo6VjFhbHBoYTFiBnByb3RvMw", [file_buf_validate_validate, file_google_protobuf_timestamp]);
/**
* @generated from message mgmt.v1alpha1.GetConnectionsRequest
@@ -1443,6 +1443,108 @@ export type CheckSqlQueryResponse = Message<"mgmt.v1alpha1.CheckSqlQueryResponse
export const CheckSqlQueryResponseSchema: GenMessage = /*@__PURE__*/
messageDesc(file_mgmt_v1alpha1_connection, 38);
+/**
+ * @generated from message mgmt.v1alpha1.CheckSSHConnectionRequest
+ */
+export type CheckSSHConnectionRequest = Message<"mgmt.v1alpha1.CheckSSHConnectionRequest"> & {
+ /**
+ * The SSH tunnel configuration to use for the connection
+ *
+ * @generated from field: mgmt.v1alpha1.SSHTunnel tunnel = 1;
+ */
+ tunnel?: SSHTunnel;
+};
+
+/**
+ * Describes the message mgmt.v1alpha1.CheckSSHConnectionRequest.
+ * Use `create(CheckSSHConnectionRequestSchema)` to create a new message.
+ */
+export const CheckSSHConnectionRequestSchema: GenMessage = /*@__PURE__*/
+ messageDesc(file_mgmt_v1alpha1_connection, 39);
+
+/**
+ * @generated from message mgmt.v1alpha1.CheckSSHConnectionResponse
+ */
+export type CheckSSHConnectionResponse = Message<"mgmt.v1alpha1.CheckSSHConnectionResponse"> & {
+ /**
+ * The result of the SSH connection check
+ *
+ * @generated from field: mgmt.v1alpha1.CheckSSHConnectionResult result = 1;
+ */
+ result?: CheckSSHConnectionResult;
+};
+
+/**
+ * Describes the message mgmt.v1alpha1.CheckSSHConnectionResponse.
+ * Use `create(CheckSSHConnectionResponseSchema)` to create a new message.
+ */
+export const CheckSSHConnectionResponseSchema: GenMessage = /*@__PURE__*/
+ messageDesc(file_mgmt_v1alpha1_connection, 40);
+
+/**
+ * @generated from message mgmt.v1alpha1.CheckSSHConnectionByIdRequest
+ */
+export type CheckSSHConnectionByIdRequest = Message<"mgmt.v1alpha1.CheckSSHConnectionByIdRequest"> & {
+ /**
+ * The connection id that the SSH connection will be checked against
+ *
+ * @generated from field: string id = 1;
+ */
+ id: string;
+};
+
+/**
+ * Describes the message mgmt.v1alpha1.CheckSSHConnectionByIdRequest.
+ * Use `create(CheckSSHConnectionByIdRequestSchema)` to create a new message.
+ */
+export const CheckSSHConnectionByIdRequestSchema: GenMessage = /*@__PURE__*/
+ messageDesc(file_mgmt_v1alpha1_connection, 41);
+
+/**
+ * @generated from message mgmt.v1alpha1.CheckSSHConnectionByIdResponse
+ */
+export type CheckSSHConnectionByIdResponse = Message<"mgmt.v1alpha1.CheckSSHConnectionByIdResponse"> & {
+ /**
+ * The result of the SSH connection check
+ *
+ * @generated from field: mgmt.v1alpha1.CheckSSHConnectionResult result = 1;
+ */
+ result?: CheckSSHConnectionResult;
+};
+
+/**
+ * Describes the message mgmt.v1alpha1.CheckSSHConnectionByIdResponse.
+ * Use `create(CheckSSHConnectionByIdResponseSchema)` to create a new message.
+ */
+export const CheckSSHConnectionByIdResponseSchema: GenMessage = /*@__PURE__*/
+ messageDesc(file_mgmt_v1alpha1_connection, 42);
+
+/**
+ * @generated from message mgmt.v1alpha1.CheckSSHConnectionResult
+ */
+export type CheckSSHConnectionResult = Message<"mgmt.v1alpha1.CheckSSHConnectionResult"> & {
+ /**
+ * Whether or not the SSH connection is successful
+ *
+ * @generated from field: bool is_successful = 1;
+ */
+ isSuccessful: boolean;
+
+ /**
+ * The error message returned by the SSH client if the connection is not successful
+ *
+ * @generated from field: optional string error_message = 2;
+ */
+ errorMessage?: string;
+};
+
+/**
+ * Describes the message mgmt.v1alpha1.CheckSSHConnectionResult.
+ * Use `create(CheckSSHConnectionResultSchema)` to create a new message.
+ */
+export const CheckSSHConnectionResultSchema: GenMessage = /*@__PURE__*/
+ messageDesc(file_mgmt_v1alpha1_connection, 43);
+
/**
* Service for managing datasource connections.
* This is a primary data model in Neosync and is used in reference when hooking up Jobs to synchronize and generate data.
@@ -1543,6 +1645,26 @@ export const ConnectionService: GenService<{
input: typeof CheckSqlQueryRequestSchema;
output: typeof CheckSqlQueryResponseSchema;
},
+ /**
+ * Checks if the SSH server is reachable and accessible with the given credentials
+ *
+ * @generated from rpc mgmt.v1alpha1.ConnectionService.CheckSSHConnection
+ */
+ checkSSHConnection: {
+ methodKind: "unary";
+ input: typeof CheckSSHConnectionRequestSchema;
+ output: typeof CheckSSHConnectionResponseSchema;
+ },
+ /**
+ * Checks if the SSH server is reachable and accessible with the given credentials
+ *
+ * @generated from rpc mgmt.v1alpha1.ConnectionService.CheckSSHConnectionById
+ */
+ checkSSHConnectionById: {
+ methodKind: "unary";
+ input: typeof CheckSSHConnectionByIdRequestSchema;
+ output: typeof CheckSSHConnectionByIdResponseSchema;
+ },
}> = /*@__PURE__*/
serviceDesc(file_mgmt_v1alpha1_connection, 0);
diff --git a/internal/sshtunnel/connectors/postgrestunconnector/connector.go b/internal/sshtunnel/connectors/postgrestunconnector/connector.go
index 590d6e6f93..f990619b54 100644
--- a/internal/sshtunnel/connectors/postgrestunconnector/connector.go
+++ b/internal/sshtunnel/connectors/postgrestunconnector/connector.go
@@ -74,6 +74,20 @@ func New(
pgxConfig.DialFunc = func(ctx context.Context, network, addr string) (net.Conn, error) {
return cfg.dialer.DialContext(ctx, network, addr)
}
+
+ // This solves an issue with AWS Multi-AZ connections that seems to plague the PGX driver.
+ // Related: https://github.com/jackc/pgx/issues/1724
+ pgxConfig.LookupFunc = func(ctx context.Context, name string) ([]string, error) {
+ addrs := []string{name}
+ resp, err := net.DefaultResolver.LookupHost(ctx, name)
+ if err != nil {
+ cfg.logger.Error("unable to lookup addrs for hostname during postgres tunnel dial", "name", name, "err", err)
+ } else {
+ addrs = append(addrs, resp...)
+ }
+ cfg.logger.Debug("looked up", "name", name, "addrs", addrs)
+ return addrs, nil
+ }
}
if cfg.tlsConfig != nil {
pgxConfig.TLSConfig = cfg.tlsConfig
diff --git a/internal/sshtunnel/dialer.go b/internal/sshtunnel/dialer.go
index d2ea3dcd44..8a01c1c833 100644
--- a/internal/sshtunnel/dialer.go
+++ b/internal/sshtunnel/dialer.go
@@ -83,7 +83,8 @@ func (s *SSHDialer) DialContext(ctx context.Context, network, addr string) (net.
if err != nil {
return nil, fmt.Errorf("unable to get or create ssh client during DialContext: %w", err)
}
- conn, err := client.DialContext(ctx, network, addr)
+ s.logger.Debug("dialing", "network", network, "addr", addr)
+ conn, err := client.Dial(network, addr)
if err != nil {
return nil, fmt.Errorf("unable to dial address: %w", err)
}
@@ -207,6 +208,8 @@ func (s *SSHDialer) startKeepAlive(client *ssh.Client) {
s.logger.Error("keepalive failed", "error", err)
s.client = nil
client.Close()
+ } else {
+ s.logger.Debug("keepalive successful")
}
case <-ctx.Done():
s.logger.Error("keepalive timed out")
diff --git a/internal/sshtunnel/utils.go b/internal/sshtunnel/utils.go
index 94ccca6583..6129157c58 100644
--- a/internal/sshtunnel/utils.go
+++ b/internal/sshtunnel/utils.go
@@ -1,13 +1,17 @@
package sshtunnel
import (
+ "errors"
"fmt"
+ "net"
+ "strconv"
+ "time"
mgmtv1alpha1 "github.com/nucleuscloud/neosync/backend/gen/go/protos/mgmt/v1alpha1"
"golang.org/x/crypto/ssh"
)
-func GetPrivateKeyAuthMethod(keyBytes []byte, passphrase *string) (ssh.AuthMethod, error) {
+func getPrivateKeyAuthMethod(keyBytes []byte, passphrase *string) (ssh.AuthMethod, error) {
if passphrase != nil && *passphrase != "" {
return getEncryptedPrivateKeyAuthMethod(keyBytes, []byte(*passphrase))
}
@@ -30,7 +34,7 @@ func getPlaintextPrivateKeyAuthMethod(keyBytes []byte) (ssh.AuthMethod, error) {
return ssh.PublicKeys(key), nil
}
-func ParseSshKey(keyString string) (ssh.PublicKey, error) {
+func parseSshKey(keyString string) (ssh.PublicKey, error) {
// Parse the key
publicKey, _, _, _, err := ssh.ParseAuthorizedKey([]byte(keyString)) //nolint
if err != nil {
@@ -42,7 +46,7 @@ func ParseSshKey(keyString string) (ssh.PublicKey, error) {
// Auth Method is optional and will return nil if there is no valid method.
// Will only return error if unable to parse the private key into an auth method
-func GetTunnelAuthMethodFromSshConfig(auth *mgmtv1alpha1.SSHAuthentication) (ssh.AuthMethod, error) {
+func getTunnelAuthMethodFromSshConfig(auth *mgmtv1alpha1.SSHAuthentication) (ssh.AuthMethod, error) {
if auth == nil {
return nil, nil
}
@@ -50,7 +54,7 @@ func GetTunnelAuthMethodFromSshConfig(auth *mgmtv1alpha1.SSHAuthentication) (ssh
case *mgmtv1alpha1.SSHAuthentication_Passphrase:
return ssh.Password(config.Passphrase.Value), nil
case *mgmtv1alpha1.SSHAuthentication_PrivateKey:
- authMethod, err := GetPrivateKeyAuthMethod([]byte(config.PrivateKey.Value), config.PrivateKey.Passphrase)
+ authMethod, err := getPrivateKeyAuthMethod([]byte(config.PrivateKey.Value), config.PrivateKey.Passphrase)
if err != nil {
return nil, err
}
@@ -59,3 +63,60 @@ func GetTunnelAuthMethodFromSshConfig(auth *mgmtv1alpha1.SSHAuthentication) (ssh
return nil, nil
}
}
+
+type DtoTunnelConfig struct {
+ Addr string
+ ClientConfig *ssh.ClientConfig
+}
+
+// Converts the proto SSHTunnel into a config that can be plugged in to ssh.Dial
+func GetTunnelConfigFromSSHDto(tunnel *mgmtv1alpha1.SSHTunnel) (*DtoTunnelConfig, error) {
+ if tunnel == nil {
+ return nil, errors.New("tunnel config is nil")
+ }
+
+ hostcallback, err := buildHostKeyCallback(tunnel)
+ if err != nil {
+ return nil, fmt.Errorf("unable to build host key callback: %w", err)
+ }
+
+ authmethod, err := getTunnelAuthMethodFromSshConfig(tunnel.GetAuthentication())
+ if err != nil {
+ return nil, fmt.Errorf("unable to parse ssh auth method: %w", err)
+ }
+
+ authmethods := []ssh.AuthMethod{}
+ if authmethod != nil {
+ authmethods = append(authmethods, authmethod)
+ }
+ return &DtoTunnelConfig{
+ Addr: getSshAddr(tunnel),
+ ClientConfig: &ssh.ClientConfig{
+ User: tunnel.GetUser(),
+ Auth: authmethods,
+ HostKeyCallback: hostcallback,
+ Timeout: 15 * time.Second, // todo: make configurable
+ },
+ }, nil
+}
+
+func getSshAddr(tunnel *mgmtv1alpha1.SSHTunnel) string {
+ host := tunnel.GetHost()
+ port := tunnel.GetPort()
+ if port > 0 {
+ return net.JoinHostPort(host, strconv.FormatInt(int64(port), 10))
+ }
+ return host
+}
+
+func buildHostKeyCallback(tunnel *mgmtv1alpha1.SSHTunnel) (ssh.HostKeyCallback, error) {
+ if tunnel.GetKnownHostPublicKey() != "" {
+ publickey, err := parseSshKey(tunnel.GetKnownHostPublicKey())
+ if err != nil {
+ return nil, fmt.Errorf("unable to parse ssh known host public key: %w", err)
+ }
+ return ssh.FixedHostKey(publickey), nil
+ } else {
+ return ssh.InsecureIgnoreHostKey(), nil //nolint:gosec // the user has chosen to not provide a known host public key
+ }
+}
diff --git a/internal/sshtunnel/utils_test.go b/internal/sshtunnel/utils_test.go
index efae1ed135..68c8346612 100644
--- a/internal/sshtunnel/utils_test.go
+++ b/internal/sshtunnel/utils_test.go
@@ -28,24 +28,24 @@ UmTDjHp2ZBeXOtnQniimAAAAEHRlc3RAZXhhbXBsZS5jb20BAgMEBQ==
unencryptedPublicKey = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIJVer1BVE7oIuxR6Z5uP/yBwUmTDjHp2ZBeXOtnQniim test@example.com"
)
-func Test_GetPrivateKeyAuthMethod(t *testing.T) {
- out, err := GetPrivateKeyAuthMethod([]byte(encryptedPrivateKey), ptr(encryptedPrivateKeyPass))
+func Test_getPrivateKeyAuthMethod(t *testing.T) {
+ out, err := getPrivateKeyAuthMethod([]byte(encryptedPrivateKey), ptr(encryptedPrivateKeyPass))
assert.NoError(t, err)
assert.NotNil(t, out)
- out, err = GetPrivateKeyAuthMethod([]byte(encryptedPrivateKey), ptr("badpassword"))
+ out, err = getPrivateKeyAuthMethod([]byte(encryptedPrivateKey), ptr("badpassword"))
assert.Error(t, err)
assert.Nil(t, out)
- out, err = GetPrivateKeyAuthMethod([]byte("bad key"), ptr(encryptedPrivateKeyPass))
+ out, err = getPrivateKeyAuthMethod([]byte("bad key"), ptr(encryptedPrivateKeyPass))
assert.Error(t, err)
assert.Nil(t, out)
- out, err = GetPrivateKeyAuthMethod([]byte(unencryptedPrivateKey), nil)
+ out, err = getPrivateKeyAuthMethod([]byte(unencryptedPrivateKey), nil)
assert.NoError(t, err)
assert.NotNil(t, out)
- out, err = GetPrivateKeyAuthMethod([]byte("bad key"), nil)
+ out, err = getPrivateKeyAuthMethod([]byte("bad key"), nil)
assert.Error(t, err)
assert.Nil(t, out)
}
@@ -54,26 +54,26 @@ func ptr[T any](val T) *T {
return &val
}
-func Test_ParseSshKey(t *testing.T) {
- pk, err := ParseSshKey(unencryptedPublicKey)
+func Test_parseSshKey(t *testing.T) {
+ pk, err := parseSshKey(unencryptedPublicKey)
assert.NoError(t, err)
assert.NotNil(t, pk)
- pk, err = ParseSshKey("bad key")
+ pk, err = parseSshKey("bad key")
assert.Error(t, err)
assert.Nil(t, pk)
}
-func Test_GetTunnelAuthMethodFromSshConfig(t *testing.T) {
- out, err := GetTunnelAuthMethodFromSshConfig(nil)
+func Test_getTunnelAuthMethodFromSshConfig(t *testing.T) {
+ out, err := getTunnelAuthMethodFromSshConfig(nil)
assert.NoError(t, err)
assert.Nil(t, out)
- out, err = GetTunnelAuthMethodFromSshConfig(&mgmtv1alpha1.SSHAuthentication{})
+ out, err = getTunnelAuthMethodFromSshConfig(&mgmtv1alpha1.SSHAuthentication{})
assert.NoError(t, err)
assert.Nil(t, out)
- out, err = GetTunnelAuthMethodFromSshConfig(&mgmtv1alpha1.SSHAuthentication{
+ out, err = getTunnelAuthMethodFromSshConfig(&mgmtv1alpha1.SSHAuthentication{
AuthConfig: &mgmtv1alpha1.SSHAuthentication_Passphrase{
Passphrase: &mgmtv1alpha1.SSHPassphrase{
Value: "foo",
@@ -83,7 +83,7 @@ func Test_GetTunnelAuthMethodFromSshConfig(t *testing.T) {
assert.NoError(t, err)
assert.NotNil(t, out)
- out, err = GetTunnelAuthMethodFromSshConfig(&mgmtv1alpha1.SSHAuthentication{
+ out, err = getTunnelAuthMethodFromSshConfig(&mgmtv1alpha1.SSHAuthentication{
AuthConfig: &mgmtv1alpha1.SSHAuthentication_PrivateKey{
PrivateKey: &mgmtv1alpha1.SSHPrivateKey{
Value: encryptedPrivateKey,
@@ -94,7 +94,7 @@ func Test_GetTunnelAuthMethodFromSshConfig(t *testing.T) {
assert.NoError(t, err)
assert.NotNil(t, out)
- out, err = GetTunnelAuthMethodFromSshConfig(&mgmtv1alpha1.SSHAuthentication{
+ out, err = getTunnelAuthMethodFromSshConfig(&mgmtv1alpha1.SSHAuthentication{
AuthConfig: &mgmtv1alpha1.SSHAuthentication_PrivateKey{
PrivateKey: &mgmtv1alpha1.SSHPrivateKey{
Value: encryptedPrivateKey,
@@ -105,3 +105,19 @@ func Test_GetTunnelAuthMethodFromSshConfig(t *testing.T) {
assert.Error(t, err)
assert.Nil(t, out)
}
+
+func Test_getSshAddr(t *testing.T) {
+ t.Run("with port", func(t *testing.T) {
+ actual := getSshAddr(&mgmtv1alpha1.SSHTunnel{
+ Host: "localhost",
+ Port: 2222,
+ })
+ assert.Equal(t, "localhost:2222", actual)
+ })
+ t.Run("without port", func(t *testing.T) {
+ actual := getSshAddr(&mgmtv1alpha1.SSHTunnel{
+ Host: "localhost",
+ })
+ assert.Equal(t, "localhost", actual)
+ })
+}
diff --git a/python/src/neosync/mgmt/v1alpha1/connection_pb2.py b/python/src/neosync/mgmt/v1alpha1/connection_pb2.py
index 150556ff9e..c5057a0a53 100644
--- a/python/src/neosync/mgmt/v1alpha1/connection_pb2.py
+++ b/python/src/neosync/mgmt/v1alpha1/connection_pb2.py
@@ -26,7 +26,7 @@
from google.protobuf import timestamp_pb2 as google_dot_protobuf_dot_timestamp__pb2
-DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1emgmt/v1alpha1/connection.proto\x12\rmgmt.v1alpha1\x1a\x1b\x62uf/validate/validate.proto\x1a\x1fgoogle/protobuf/timestamp.proto\"m\n\x15GetConnectionsRequest\x12\'\n\naccount_id\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\taccountId\x12+\n\x11\x65xclude_sensitive\x18\x02 \x01(\x08R\x10\x65xcludeSensitive\"U\n\x16GetConnectionsResponse\x12;\n\x0b\x63onnections\x18\x01 \x03(\x0b\x32\x19.mgmt.v1alpha1.ConnectionR\x0b\x63onnections\"]\n\x14GetConnectionRequest\x12\x18\n\x02id\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\x02id\x12+\n\x11\x65xclude_sensitive\x18\x02 \x01(\x08R\x10\x65xcludeSensitive\"R\n\x15GetConnectionResponse\x12\x39\n\nconnection\x18\x01 \x01(\x0b\x32\x19.mgmt.v1alpha1.ConnectionR\nconnection\"\xbf\x01\n\x17\x43reateConnectionRequest\x12\'\n\naccount_id\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\taccountId\x12-\n\x04name\x18\x02 \x01(\tB\x19\xbaH\x16r\x14\x32\x12^[a-z0-9-]{3,100}$R\x04name\x12L\n\x11\x63onnection_config\x18\x03 \x01(\x0b\x32\x1f.mgmt.v1alpha1.ConnectionConfigR\x10\x63onnectionConfig\"U\n\x18\x43reateConnectionResponse\x12\x39\n\nconnection\x18\x01 \x01(\x0b\x32\x19.mgmt.v1alpha1.ConnectionR\nconnection\"\xb0\x01\n\x17UpdateConnectionRequest\x12\x18\n\x02id\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\x02id\x12-\n\x04name\x18\x02 \x01(\tB\x19\xbaH\x16r\x14\x32\x12^[a-z0-9-]{3,100}$R\x04name\x12L\n\x11\x63onnection_config\x18\x03 \x01(\x0b\x32\x1f.mgmt.v1alpha1.ConnectionConfigR\x10\x63onnectionConfig\"U\n\x18UpdateConnectionResponse\x12\x39\n\nconnection\x18\x01 \x01(\x0b\x32\x19.mgmt.v1alpha1.ConnectionR\nconnection\"3\n\x17\x44\x65leteConnectionRequest\x12\x18\n\x02id\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\x02id\"\x1a\n\x18\x44\x65leteConnectionResponse\"l\n\x1c\x43heckConnectionConfigRequest\x12L\n\x11\x63onnection_config\x18\x01 \x01(\x0b\x32\x1f.mgmt.v1alpha1.ConnectionConfigR\x10\x63onnectionConfig\"<\n CheckConnectionConfigByIdRequest\x12\x18\n\x02id\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\x02id\"\xd3\x01\n!CheckConnectionConfigByIdResponse\x12!\n\x0cis_connected\x18\x01 \x01(\x08R\x0bisConnected\x12.\n\x10\x63onnection_error\x18\x02 \x01(\tH\x00R\x0f\x63onnectionError\x88\x01\x01\x12\x46\n\nprivileges\x18\x03 \x03(\x0b\x32&.mgmt.v1alpha1.ConnectionRolePrivilegeR\nprivilegesB\x13\n\x11_connection_error\"\xcf\x01\n\x1d\x43heckConnectionConfigResponse\x12!\n\x0cis_connected\x18\x01 \x01(\x08R\x0bisConnected\x12.\n\x10\x63onnection_error\x18\x02 \x01(\tH\x00R\x0f\x63onnectionError\x88\x01\x01\x12\x46\n\nprivileges\x18\x03 \x03(\x0b\x32&.mgmt.v1alpha1.ConnectionRolePrivilegeR\nprivilegesB\x13\n\x11_connection_error\"\x88\x01\n\x17\x43onnectionRolePrivilege\x12\x18\n\x07grantee\x18\x01 \x01(\tR\x07grantee\x12\x16\n\x06schema\x18\x02 \x01(\tR\x06schema\x12\x14\n\x05table\x18\x03 \x01(\tR\x05table\x12%\n\x0eprivilege_type\x18\x04 \x03(\tR\rprivilegeType\"\xed\x02\n\nConnection\x12\x0e\n\x02id\x18\x01 \x01(\tR\x02id\x12\x12\n\x04name\x18\x02 \x01(\tR\x04name\x12L\n\x11\x63onnection_config\x18\x03 \x01(\x0b\x32\x1f.mgmt.v1alpha1.ConnectionConfigR\x10\x63onnectionConfig\x12+\n\x12\x63reated_by_user_id\x18\x04 \x01(\tR\x0f\x63reatedByUserId\x12\x39\n\ncreated_at\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.TimestampR\tcreatedAt\x12+\n\x12updated_by_user_id\x18\x06 \x01(\tR\x0fupdatedByUserId\x12\x39\n\nupdated_at\x18\x07 \x01(\x0b\x32\x1a.google.protobuf.TimestampR\tupdatedAt\x12\x1d\n\naccount_id\x18\x08 \x01(\tR\taccountId\"\xff\x05\n\x10\x43onnectionConfig\x12\x46\n\tpg_config\x18\x01 \x01(\x0b\x32\'.mgmt.v1alpha1.PostgresConnectionConfigH\x00R\x08pgConfig\x12J\n\raws_s3_config\x18\x02 \x01(\x0b\x32$.mgmt.v1alpha1.AwsS3ConnectionConfigH\x00R\x0b\x61wsS3Config\x12I\n\x0cmysql_config\x18\x03 \x01(\x0b\x32$.mgmt.v1alpha1.MysqlConnectionConfigH\x00R\x0bmysqlConfig\x12Y\n\x10local_dir_config\x18\x04 \x01(\x0b\x32-.mgmt.v1alpha1.LocalDirectoryConnectionConfigH\x00R\x0elocalDirConfig\x12L\n\ropenai_config\x18\x05 \x01(\x0b\x32%.mgmt.v1alpha1.OpenAiConnectionConfigH\x00R\x0copenaiConfig\x12I\n\x0cmongo_config\x18\x06 \x01(\x0b\x32$.mgmt.v1alpha1.MongoConnectionConfigH\x00R\x0bmongoConfig\x12h\n\x17gcp_cloudstorage_config\x18\x07 \x01(\x0b\x32..mgmt.v1alpha1.GcpCloudStorageConnectionConfigH\x00R\x15gcpCloudstorageConfig\x12R\n\x0f\x64ynamodb_config\x18\x08 \x01(\x0b\x32\'.mgmt.v1alpha1.DynamoDBConnectionConfigH\x00R\x0e\x64ynamodbConfig\x12I\n\x0cmssql_config\x18\t \x01(\x0b\x32$.mgmt.v1alpha1.MssqlConnectionConfigH\x00R\x0bmssqlConfigB\x0f\n\x06\x63onfig\x12\x05\xbaH\x02\x08\x01\"\xb0\x02\n\x15MssqlConnectionConfig\x12\x12\n\x03url\x18\x01 \x01(\tH\x00R\x03url\x12\"\n\x0curl_from_env\x18\x05 \x01(\tH\x00R\nurlFromEnv\x12R\n\x12\x63onnection_options\x18\x02 \x01(\x0b\x32#.mgmt.v1alpha1.SqlConnectionOptionsR\x11\x63onnectionOptions\x12\x30\n\x06tunnel\x18\x03 \x01(\x0b\x32\x18.mgmt.v1alpha1.SSHTunnelR\x06tunnel\x12=\n\nclient_tls\x18\x04 \x01(\x0b\x32\x1e.mgmt.v1alpha1.ClientTlsConfigR\tclientTlsB\x1a\n\x11\x63onnection_config\x12\x05\xbaH\x02\x08\x01\"\xc8\x01\n\x18\x44ynamoDBConnectionConfig\x12\x46\n\x0b\x63redentials\x18\x01 \x01(\x0b\x32\x1f.mgmt.v1alpha1.AwsS3CredentialsH\x00R\x0b\x63redentials\x88\x01\x01\x12\x1b\n\x06region\x18\x02 \x01(\tH\x01R\x06region\x88\x01\x01\x12\x1f\n\x08\x65ndpoint\x18\x03 \x01(\tH\x02R\x08\x65ndpoint\x88\x01\x01\x42\x0e\n\x0c_credentialsB\t\n\x07_regionB\x0b\n\t_endpoint\"\xb8\x01\n\x15MongoConnectionConfig\x12\x12\n\x03url\x18\x01 \x01(\tH\x00R\x03url\x12\x30\n\x06tunnel\x18\x02 \x01(\x0b\x32\x18.mgmt.v1alpha1.SSHTunnelR\x06tunnel\x12=\n\nclient_tls\x18\x03 \x01(\x0b\x32\x1e.mgmt.v1alpha1.ClientTlsConfigR\tclientTlsB\x1a\n\x11\x63onnection_config\x12\x05\xbaH\x02\x08\x01\"J\n\x16OpenAiConnectionConfig\x12\x17\n\x07\x61pi_key\x18\x01 \x01(\tR\x06\x61piKey\x12\x17\n\x07\x61pi_url\x18\x02 \x01(\tR\x06\x61piUrl\"=\n\x1eLocalDirectoryConnectionConfig\x12\x1b\n\x04path\x18\x01 \x01(\tB\x07\xbaH\x04r\x02\x10\x01R\x04path\"\xf8\x02\n\x18PostgresConnectionConfig\x12\x12\n\x03url\x18\x01 \x01(\tH\x00R\x03url\x12\x43\n\nconnection\x18\x02 \x01(\x0b\x32!.mgmt.v1alpha1.PostgresConnectionH\x00R\nconnection\x12\"\n\x0curl_from_env\x18\x06 \x01(\tH\x00R\nurlFromEnv\x12\x30\n\x06tunnel\x18\x03 \x01(\x0b\x32\x18.mgmt.v1alpha1.SSHTunnelR\x06tunnel\x12R\n\x12\x63onnection_options\x18\x04 \x01(\x0b\x32#.mgmt.v1alpha1.SqlConnectionOptionsR\x11\x63onnectionOptions\x12=\n\nclient_tls\x18\x05 \x01(\x0b\x32\x1e.mgmt.v1alpha1.ClientTlsConfigR\tclientTlsB\x1a\n\x11\x63onnection_config\x12\x05\xbaH\x02\x08\x01\"\xe0\x01\n\x0f\x43lientTlsConfig\x12 \n\troot_cert\x18\x01 \x01(\tH\x00R\x08rootCert\x88\x01\x01\x12$\n\x0b\x63lient_cert\x18\x02 \x01(\tH\x01R\nclientCert\x88\x01\x01\x12\"\n\nclient_key\x18\x03 \x01(\tH\x02R\tclientKey\x88\x01\x01\x12$\n\x0bserver_name\x18\x04 \x01(\tH\x03R\nserverName\x88\x01\x01\x42\x0c\n\n_root_certB\x0e\n\x0c_client_certB\r\n\x0b_client_keyB\x0e\n\x0c_server_name\"\xc4\x02\n\x14SqlConnectionOptions\x12\x35\n\x14max_connection_limit\x18\x01 \x01(\x05H\x00R\x12maxConnectionLimit\x88\x01\x01\x12\x35\n\x14max_idle_connections\x18\x02 \x01(\x05H\x01R\x12maxIdleConnections\x88\x01\x01\x12/\n\x11max_idle_duration\x18\x03 \x01(\tH\x02R\x0fmaxIdleDuration\x88\x01\x01\x12/\n\x11max_open_duration\x18\x04 \x01(\tH\x03R\x0fmaxOpenDuration\x88\x01\x01\x42\x17\n\x15_max_connection_limitB\x17\n\x15_max_idle_connectionsB\x14\n\x12_max_idle_durationB\x14\n\x12_max_open_duration\"\x87\x02\n\tSSHTunnel\x12\x1b\n\x04host\x18\x01 \x01(\tB\x07\xbaH\x04r\x02\x10\x01R\x04host\x12\x1b\n\x04port\x18\x02 \x01(\x05\x42\x07\xbaH\x04\x1a\x02(\x00R\x04port\x12\x1b\n\x04user\x18\x03 \x01(\tB\x07\xbaH\x04r\x02\x10\x01R\x04user\x12?\n\x15known_host_public_key\x18\x04 \x01(\tB\x07\xbaH\x04r\x02\x10\x01H\x00R\x12knownHostPublicKey\x88\x01\x01\x12H\n\x0e\x61uthentication\x18\x05 \x01(\x0b\x32 .mgmt.v1alpha1.SSHAuthenticationR\x0e\x61uthenticationB\x18\n\x16_known_host_public_key\"\xaa\x01\n\x11SSHAuthentication\x12>\n\npassphrase\x18\x01 \x01(\x0b\x32\x1c.mgmt.v1alpha1.SSHPassphraseH\x00R\npassphrase\x12?\n\x0bprivate_key\x18\x02 \x01(\x0b\x32\x1c.mgmt.v1alpha1.SSHPrivateKeyH\x00R\nprivateKeyB\x14\n\x0b\x61uth_config\x12\x05\xbaH\x02\x08\x01\".\n\rSSHPassphrase\x12\x1d\n\x05value\x18\x01 \x01(\tB\x07\xbaH\x04r\x02\x10\x01R\x05value\"b\n\rSSHPrivateKey\x12\x1d\n\x05value\x18\x01 \x01(\tB\x07\xbaH\x04r\x02\x10\x01R\x05value\x12#\n\npassphrase\x18\x02 \x01(\tH\x00R\npassphrase\x88\x01\x01\x42\r\n\x0b_passphrase\"\xa5\x01\n\x12PostgresConnection\x12\x12\n\x04host\x18\x01 \x01(\tR\x04host\x12\x12\n\x04port\x18\x02 \x01(\x05R\x04port\x12\x12\n\x04name\x18\x03 \x01(\tR\x04name\x12\x12\n\x04user\x18\x04 \x01(\tR\x04user\x12\x12\n\x04pass\x18\x05 \x01(\tR\x04pass\x12\x1e\n\x08ssl_mode\x18\x06 \x01(\tH\x00R\x07sslMode\x88\x01\x01\x42\x0b\n\t_ssl_mode\"\x91\x01\n\x0fMysqlConnection\x12\x12\n\x04user\x18\x01 \x01(\tR\x04user\x12\x12\n\x04pass\x18\x02 \x01(\tR\x04pass\x12\x1a\n\x08protocol\x18\x03 \x01(\tR\x08protocol\x12\x12\n\x04host\x18\x04 \x01(\tR\x04host\x12\x12\n\x04port\x18\x05 \x01(\x05R\x04port\x12\x12\n\x04name\x18\x06 \x01(\tR\x04name\"\xf2\x02\n\x15MysqlConnectionConfig\x12\x12\n\x03url\x18\x01 \x01(\tH\x00R\x03url\x12@\n\nconnection\x18\x02 \x01(\x0b\x32\x1e.mgmt.v1alpha1.MysqlConnectionH\x00R\nconnection\x12\"\n\x0curl_from_env\x18\x06 \x01(\tH\x00R\nurlFromEnv\x12\x30\n\x06tunnel\x18\x03 \x01(\x0b\x32\x18.mgmt.v1alpha1.SSHTunnelR\x06tunnel\x12R\n\x12\x63onnection_options\x18\x04 \x01(\x0b\x32#.mgmt.v1alpha1.SqlConnectionOptionsR\x11\x63onnectionOptions\x12=\n\nclient_tls\x18\x05 \x01(\x0b\x32\x1e.mgmt.v1alpha1.ClientTlsConfigR\tclientTlsB\x1a\n\x11\x63onnection_config\x12\x05\xbaH\x02\x08\x01\"\xa2\x02\n\x15\x41wsS3ConnectionConfig\x12$\n\x0bpath_prefix\x18\x02 \x01(\tH\x00R\npathPrefix\x88\x01\x01\x12\x46\n\x0b\x63redentials\x18\x03 \x01(\x0b\x32\x1f.mgmt.v1alpha1.AwsS3CredentialsH\x01R\x0b\x63redentials\x88\x01\x01\x12\x1b\n\x06region\x18\x04 \x01(\tH\x02R\x06region\x88\x01\x01\x12\x1f\n\x08\x65ndpoint\x18\x05 \x01(\tH\x03R\x08\x65ndpoint\x88\x01\x01\x12\x1f\n\x06\x62ucket\x18\x06 \x01(\tB\x07\xbaH\x04r\x02\x10\x01R\x06\x62ucketB\x0e\n\x0c_path_prefixB\x0e\n\x0c_credentialsB\t\n\x07_regionB\x0b\n\t_endpointJ\x04\x08\x01\x10\x02\"\xa7\x03\n\x10\x41wsS3Credentials\x12\x1d\n\x07profile\x18\x01 \x01(\tH\x00R\x07profile\x88\x01\x01\x12\'\n\raccess_key_id\x18\x02 \x01(\tH\x01R\x0b\x61\x63\x63\x65ssKeyId\x88\x01\x01\x12/\n\x11secret_access_key\x18\x03 \x01(\tH\x02R\x0fsecretAccessKey\x88\x01\x01\x12(\n\rsession_token\x18\x04 \x01(\tH\x03R\x0csessionToken\x88\x01\x01\x12\'\n\rfrom_ec2_role\x18\x05 \x01(\x08H\x04R\x0b\x66romEc2Role\x88\x01\x01\x12\x1e\n\x08role_arn\x18\x06 \x01(\tH\x05R\x07roleArn\x88\x01\x01\x12-\n\x10role_external_id\x18\x07 \x01(\tH\x06R\x0eroleExternalId\x88\x01\x01\x42\n\n\x08_profileB\x10\n\x0e_access_key_idB\x14\n\x12_secret_access_keyB\x10\n\x0e_session_tokenB\x10\n\x0e_from_ec2_roleB\x0b\n\t_role_arnB\x13\n\x11_role_external_id\"\xdd\x01\n\x1fGcpCloudStorageConnectionConfig\x12\x1f\n\x06\x62ucket\x18\x01 \x01(\tB\x07\xbaH\x04r\x02\x10\x01R\x06\x62ucket\x12$\n\x0bpath_prefix\x18\x02 \x01(\tH\x00R\npathPrefix\x88\x01\x01\x12\x43\n\x1bservice_account_credentials\x18\x03 \x01(\tH\x01R\x19serviceAccountCredentials\x88\x01\x01\x42\x0e\n\x0c_path_prefixB\x1e\n\x1c_service_account_credentials\"\x8f\x01\n IsConnectionNameAvailableRequest\x12\'\n\naccount_id\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\taccountId\x12\x42\n\x0f\x63onnection_name\x18\x02 \x01(\tB\x19\xbaH\x16r\x14\x32\x12^[a-z0-9-]{3,100}$R\x0e\x63onnectionName\"F\n!IsConnectionNameAvailableResponse\x12!\n\x0cis_available\x18\x01 \x01(\x08R\x0bisAvailable\"O\n\x14\x43heckSqlQueryRequest\x12\x18\n\x02id\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\x02id\x12\x1d\n\x05query\x18\x02 \x01(\tB\x07\xbaH\x04r\x02\x10\x01R\x05query\"n\n\x15\x43heckSqlQueryResponse\x12\x19\n\x08is_valid\x18\x01 \x01(\x08R\x07isValid\x12(\n\rerorr_message\x18\x02 \x01(\tH\x00R\x0c\x65rorrMessage\x88\x01\x01\x42\x10\n\x0e_erorr_message2\xe7\x07\n\x11\x43onnectionService\x12\x62\n\x0eGetConnections\x12$.mgmt.v1alpha1.GetConnectionsRequest\x1a%.mgmt.v1alpha1.GetConnectionsResponse\"\x03\x90\x02\x01\x12_\n\rGetConnection\x12#.mgmt.v1alpha1.GetConnectionRequest\x1a$.mgmt.v1alpha1.GetConnectionResponse\"\x03\x90\x02\x01\x12\x65\n\x10\x43reateConnection\x12&.mgmt.v1alpha1.CreateConnectionRequest\x1a\'.mgmt.v1alpha1.CreateConnectionResponse\"\x00\x12\x65\n\x10UpdateConnection\x12&.mgmt.v1alpha1.UpdateConnectionRequest\x1a\'.mgmt.v1alpha1.UpdateConnectionResponse\"\x00\x12\x65\n\x10\x44\x65leteConnection\x12&.mgmt.v1alpha1.DeleteConnectionRequest\x1a\'.mgmt.v1alpha1.DeleteConnectionResponse\"\x00\x12\x80\x01\n\x19IsConnectionNameAvailable\x12/.mgmt.v1alpha1.IsConnectionNameAvailableRequest\x1a\x30.mgmt.v1alpha1.IsConnectionNameAvailableResponse\"\x00\x12t\n\x15\x43heckConnectionConfig\x12+.mgmt.v1alpha1.CheckConnectionConfigRequest\x1a,.mgmt.v1alpha1.CheckConnectionConfigResponse\"\x00\x12\x80\x01\n\x19\x43heckConnectionConfigById\x12/.mgmt.v1alpha1.CheckConnectionConfigByIdRequest\x1a\x30.mgmt.v1alpha1.CheckConnectionConfigByIdResponse\"\x00\x12\\\n\rCheckSqlQuery\x12#.mgmt.v1alpha1.CheckSqlQueryRequest\x1a$.mgmt.v1alpha1.CheckSqlQueryResponse\"\x00\x42\xcb\x01\n\x11\x63om.mgmt.v1alpha1B\x0f\x43onnectionProtoP\x01ZPgithub.com/nucleuscloud/neosync/backend/gen/go/protos/mgmt/v1alpha1;mgmtv1alpha1\xa2\x02\x03MXX\xaa\x02\rMgmt.V1alpha1\xca\x02\rMgmt\\V1alpha1\xe2\x02\x19Mgmt\\V1alpha1\\GPBMetadata\xea\x02\x0eMgmt::V1alpha1b\x06proto3')
+DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1emgmt/v1alpha1/connection.proto\x12\rmgmt.v1alpha1\x1a\x1b\x62uf/validate/validate.proto\x1a\x1fgoogle/protobuf/timestamp.proto\"m\n\x15GetConnectionsRequest\x12\'\n\naccount_id\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\taccountId\x12+\n\x11\x65xclude_sensitive\x18\x02 \x01(\x08R\x10\x65xcludeSensitive\"U\n\x16GetConnectionsResponse\x12;\n\x0b\x63onnections\x18\x01 \x03(\x0b\x32\x19.mgmt.v1alpha1.ConnectionR\x0b\x63onnections\"]\n\x14GetConnectionRequest\x12\x18\n\x02id\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\x02id\x12+\n\x11\x65xclude_sensitive\x18\x02 \x01(\x08R\x10\x65xcludeSensitive\"R\n\x15GetConnectionResponse\x12\x39\n\nconnection\x18\x01 \x01(\x0b\x32\x19.mgmt.v1alpha1.ConnectionR\nconnection\"\xbf\x01\n\x17\x43reateConnectionRequest\x12\'\n\naccount_id\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\taccountId\x12-\n\x04name\x18\x02 \x01(\tB\x19\xbaH\x16r\x14\x32\x12^[a-z0-9-]{3,100}$R\x04name\x12L\n\x11\x63onnection_config\x18\x03 \x01(\x0b\x32\x1f.mgmt.v1alpha1.ConnectionConfigR\x10\x63onnectionConfig\"U\n\x18\x43reateConnectionResponse\x12\x39\n\nconnection\x18\x01 \x01(\x0b\x32\x19.mgmt.v1alpha1.ConnectionR\nconnection\"\xb0\x01\n\x17UpdateConnectionRequest\x12\x18\n\x02id\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\x02id\x12-\n\x04name\x18\x02 \x01(\tB\x19\xbaH\x16r\x14\x32\x12^[a-z0-9-]{3,100}$R\x04name\x12L\n\x11\x63onnection_config\x18\x03 \x01(\x0b\x32\x1f.mgmt.v1alpha1.ConnectionConfigR\x10\x63onnectionConfig\"U\n\x18UpdateConnectionResponse\x12\x39\n\nconnection\x18\x01 \x01(\x0b\x32\x19.mgmt.v1alpha1.ConnectionR\nconnection\"3\n\x17\x44\x65leteConnectionRequest\x12\x18\n\x02id\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\x02id\"\x1a\n\x18\x44\x65leteConnectionResponse\"l\n\x1c\x43heckConnectionConfigRequest\x12L\n\x11\x63onnection_config\x18\x01 \x01(\x0b\x32\x1f.mgmt.v1alpha1.ConnectionConfigR\x10\x63onnectionConfig\"<\n CheckConnectionConfigByIdRequest\x12\x18\n\x02id\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\x02id\"\xd3\x01\n!CheckConnectionConfigByIdResponse\x12!\n\x0cis_connected\x18\x01 \x01(\x08R\x0bisConnected\x12.\n\x10\x63onnection_error\x18\x02 \x01(\tH\x00R\x0f\x63onnectionError\x88\x01\x01\x12\x46\n\nprivileges\x18\x03 \x03(\x0b\x32&.mgmt.v1alpha1.ConnectionRolePrivilegeR\nprivilegesB\x13\n\x11_connection_error\"\xcf\x01\n\x1d\x43heckConnectionConfigResponse\x12!\n\x0cis_connected\x18\x01 \x01(\x08R\x0bisConnected\x12.\n\x10\x63onnection_error\x18\x02 \x01(\tH\x00R\x0f\x63onnectionError\x88\x01\x01\x12\x46\n\nprivileges\x18\x03 \x03(\x0b\x32&.mgmt.v1alpha1.ConnectionRolePrivilegeR\nprivilegesB\x13\n\x11_connection_error\"\x88\x01\n\x17\x43onnectionRolePrivilege\x12\x18\n\x07grantee\x18\x01 \x01(\tR\x07grantee\x12\x16\n\x06schema\x18\x02 \x01(\tR\x06schema\x12\x14\n\x05table\x18\x03 \x01(\tR\x05table\x12%\n\x0eprivilege_type\x18\x04 \x03(\tR\rprivilegeType\"\xed\x02\n\nConnection\x12\x0e\n\x02id\x18\x01 \x01(\tR\x02id\x12\x12\n\x04name\x18\x02 \x01(\tR\x04name\x12L\n\x11\x63onnection_config\x18\x03 \x01(\x0b\x32\x1f.mgmt.v1alpha1.ConnectionConfigR\x10\x63onnectionConfig\x12+\n\x12\x63reated_by_user_id\x18\x04 \x01(\tR\x0f\x63reatedByUserId\x12\x39\n\ncreated_at\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.TimestampR\tcreatedAt\x12+\n\x12updated_by_user_id\x18\x06 \x01(\tR\x0fupdatedByUserId\x12\x39\n\nupdated_at\x18\x07 \x01(\x0b\x32\x1a.google.protobuf.TimestampR\tupdatedAt\x12\x1d\n\naccount_id\x18\x08 \x01(\tR\taccountId\"\xff\x05\n\x10\x43onnectionConfig\x12\x46\n\tpg_config\x18\x01 \x01(\x0b\x32\'.mgmt.v1alpha1.PostgresConnectionConfigH\x00R\x08pgConfig\x12J\n\raws_s3_config\x18\x02 \x01(\x0b\x32$.mgmt.v1alpha1.AwsS3ConnectionConfigH\x00R\x0b\x61wsS3Config\x12I\n\x0cmysql_config\x18\x03 \x01(\x0b\x32$.mgmt.v1alpha1.MysqlConnectionConfigH\x00R\x0bmysqlConfig\x12Y\n\x10local_dir_config\x18\x04 \x01(\x0b\x32-.mgmt.v1alpha1.LocalDirectoryConnectionConfigH\x00R\x0elocalDirConfig\x12L\n\ropenai_config\x18\x05 \x01(\x0b\x32%.mgmt.v1alpha1.OpenAiConnectionConfigH\x00R\x0copenaiConfig\x12I\n\x0cmongo_config\x18\x06 \x01(\x0b\x32$.mgmt.v1alpha1.MongoConnectionConfigH\x00R\x0bmongoConfig\x12h\n\x17gcp_cloudstorage_config\x18\x07 \x01(\x0b\x32..mgmt.v1alpha1.GcpCloudStorageConnectionConfigH\x00R\x15gcpCloudstorageConfig\x12R\n\x0f\x64ynamodb_config\x18\x08 \x01(\x0b\x32\'.mgmt.v1alpha1.DynamoDBConnectionConfigH\x00R\x0e\x64ynamodbConfig\x12I\n\x0cmssql_config\x18\t \x01(\x0b\x32$.mgmt.v1alpha1.MssqlConnectionConfigH\x00R\x0bmssqlConfigB\x0f\n\x06\x63onfig\x12\x05\xbaH\x02\x08\x01\"\xb0\x02\n\x15MssqlConnectionConfig\x12\x12\n\x03url\x18\x01 \x01(\tH\x00R\x03url\x12\"\n\x0curl_from_env\x18\x05 \x01(\tH\x00R\nurlFromEnv\x12R\n\x12\x63onnection_options\x18\x02 \x01(\x0b\x32#.mgmt.v1alpha1.SqlConnectionOptionsR\x11\x63onnectionOptions\x12\x30\n\x06tunnel\x18\x03 \x01(\x0b\x32\x18.mgmt.v1alpha1.SSHTunnelR\x06tunnel\x12=\n\nclient_tls\x18\x04 \x01(\x0b\x32\x1e.mgmt.v1alpha1.ClientTlsConfigR\tclientTlsB\x1a\n\x11\x63onnection_config\x12\x05\xbaH\x02\x08\x01\"\xc8\x01\n\x18\x44ynamoDBConnectionConfig\x12\x46\n\x0b\x63redentials\x18\x01 \x01(\x0b\x32\x1f.mgmt.v1alpha1.AwsS3CredentialsH\x00R\x0b\x63redentials\x88\x01\x01\x12\x1b\n\x06region\x18\x02 \x01(\tH\x01R\x06region\x88\x01\x01\x12\x1f\n\x08\x65ndpoint\x18\x03 \x01(\tH\x02R\x08\x65ndpoint\x88\x01\x01\x42\x0e\n\x0c_credentialsB\t\n\x07_regionB\x0b\n\t_endpoint\"\xb8\x01\n\x15MongoConnectionConfig\x12\x12\n\x03url\x18\x01 \x01(\tH\x00R\x03url\x12\x30\n\x06tunnel\x18\x02 \x01(\x0b\x32\x18.mgmt.v1alpha1.SSHTunnelR\x06tunnel\x12=\n\nclient_tls\x18\x03 \x01(\x0b\x32\x1e.mgmt.v1alpha1.ClientTlsConfigR\tclientTlsB\x1a\n\x11\x63onnection_config\x12\x05\xbaH\x02\x08\x01\"J\n\x16OpenAiConnectionConfig\x12\x17\n\x07\x61pi_key\x18\x01 \x01(\tR\x06\x61piKey\x12\x17\n\x07\x61pi_url\x18\x02 \x01(\tR\x06\x61piUrl\"=\n\x1eLocalDirectoryConnectionConfig\x12\x1b\n\x04path\x18\x01 \x01(\tB\x07\xbaH\x04r\x02\x10\x01R\x04path\"\xf8\x02\n\x18PostgresConnectionConfig\x12\x12\n\x03url\x18\x01 \x01(\tH\x00R\x03url\x12\x43\n\nconnection\x18\x02 \x01(\x0b\x32!.mgmt.v1alpha1.PostgresConnectionH\x00R\nconnection\x12\"\n\x0curl_from_env\x18\x06 \x01(\tH\x00R\nurlFromEnv\x12\x30\n\x06tunnel\x18\x03 \x01(\x0b\x32\x18.mgmt.v1alpha1.SSHTunnelR\x06tunnel\x12R\n\x12\x63onnection_options\x18\x04 \x01(\x0b\x32#.mgmt.v1alpha1.SqlConnectionOptionsR\x11\x63onnectionOptions\x12=\n\nclient_tls\x18\x05 \x01(\x0b\x32\x1e.mgmt.v1alpha1.ClientTlsConfigR\tclientTlsB\x1a\n\x11\x63onnection_config\x12\x05\xbaH\x02\x08\x01\"\xe0\x01\n\x0f\x43lientTlsConfig\x12 \n\troot_cert\x18\x01 \x01(\tH\x00R\x08rootCert\x88\x01\x01\x12$\n\x0b\x63lient_cert\x18\x02 \x01(\tH\x01R\nclientCert\x88\x01\x01\x12\"\n\nclient_key\x18\x03 \x01(\tH\x02R\tclientKey\x88\x01\x01\x12$\n\x0bserver_name\x18\x04 \x01(\tH\x03R\nserverName\x88\x01\x01\x42\x0c\n\n_root_certB\x0e\n\x0c_client_certB\r\n\x0b_client_keyB\x0e\n\x0c_server_name\"\xc4\x02\n\x14SqlConnectionOptions\x12\x35\n\x14max_connection_limit\x18\x01 \x01(\x05H\x00R\x12maxConnectionLimit\x88\x01\x01\x12\x35\n\x14max_idle_connections\x18\x02 \x01(\x05H\x01R\x12maxIdleConnections\x88\x01\x01\x12/\n\x11max_idle_duration\x18\x03 \x01(\tH\x02R\x0fmaxIdleDuration\x88\x01\x01\x12/\n\x11max_open_duration\x18\x04 \x01(\tH\x03R\x0fmaxOpenDuration\x88\x01\x01\x42\x17\n\x15_max_connection_limitB\x17\n\x15_max_idle_connectionsB\x14\n\x12_max_idle_durationB\x14\n\x12_max_open_duration\"\x87\x02\n\tSSHTunnel\x12\x1b\n\x04host\x18\x01 \x01(\tB\x07\xbaH\x04r\x02\x10\x01R\x04host\x12\x1b\n\x04port\x18\x02 \x01(\x05\x42\x07\xbaH\x04\x1a\x02(\x00R\x04port\x12\x1b\n\x04user\x18\x03 \x01(\tB\x07\xbaH\x04r\x02\x10\x01R\x04user\x12?\n\x15known_host_public_key\x18\x04 \x01(\tB\x07\xbaH\x04r\x02\x10\x01H\x00R\x12knownHostPublicKey\x88\x01\x01\x12H\n\x0e\x61uthentication\x18\x05 \x01(\x0b\x32 .mgmt.v1alpha1.SSHAuthenticationR\x0e\x61uthenticationB\x18\n\x16_known_host_public_key\"\xaa\x01\n\x11SSHAuthentication\x12>\n\npassphrase\x18\x01 \x01(\x0b\x32\x1c.mgmt.v1alpha1.SSHPassphraseH\x00R\npassphrase\x12?\n\x0bprivate_key\x18\x02 \x01(\x0b\x32\x1c.mgmt.v1alpha1.SSHPrivateKeyH\x00R\nprivateKeyB\x14\n\x0b\x61uth_config\x12\x05\xbaH\x02\x08\x01\".\n\rSSHPassphrase\x12\x1d\n\x05value\x18\x01 \x01(\tB\x07\xbaH\x04r\x02\x10\x01R\x05value\"b\n\rSSHPrivateKey\x12\x1d\n\x05value\x18\x01 \x01(\tB\x07\xbaH\x04r\x02\x10\x01R\x05value\x12#\n\npassphrase\x18\x02 \x01(\tH\x00R\npassphrase\x88\x01\x01\x42\r\n\x0b_passphrase\"\xa5\x01\n\x12PostgresConnection\x12\x12\n\x04host\x18\x01 \x01(\tR\x04host\x12\x12\n\x04port\x18\x02 \x01(\x05R\x04port\x12\x12\n\x04name\x18\x03 \x01(\tR\x04name\x12\x12\n\x04user\x18\x04 \x01(\tR\x04user\x12\x12\n\x04pass\x18\x05 \x01(\tR\x04pass\x12\x1e\n\x08ssl_mode\x18\x06 \x01(\tH\x00R\x07sslMode\x88\x01\x01\x42\x0b\n\t_ssl_mode\"\x91\x01\n\x0fMysqlConnection\x12\x12\n\x04user\x18\x01 \x01(\tR\x04user\x12\x12\n\x04pass\x18\x02 \x01(\tR\x04pass\x12\x1a\n\x08protocol\x18\x03 \x01(\tR\x08protocol\x12\x12\n\x04host\x18\x04 \x01(\tR\x04host\x12\x12\n\x04port\x18\x05 \x01(\x05R\x04port\x12\x12\n\x04name\x18\x06 \x01(\tR\x04name\"\xf2\x02\n\x15MysqlConnectionConfig\x12\x12\n\x03url\x18\x01 \x01(\tH\x00R\x03url\x12@\n\nconnection\x18\x02 \x01(\x0b\x32\x1e.mgmt.v1alpha1.MysqlConnectionH\x00R\nconnection\x12\"\n\x0curl_from_env\x18\x06 \x01(\tH\x00R\nurlFromEnv\x12\x30\n\x06tunnel\x18\x03 \x01(\x0b\x32\x18.mgmt.v1alpha1.SSHTunnelR\x06tunnel\x12R\n\x12\x63onnection_options\x18\x04 \x01(\x0b\x32#.mgmt.v1alpha1.SqlConnectionOptionsR\x11\x63onnectionOptions\x12=\n\nclient_tls\x18\x05 \x01(\x0b\x32\x1e.mgmt.v1alpha1.ClientTlsConfigR\tclientTlsB\x1a\n\x11\x63onnection_config\x12\x05\xbaH\x02\x08\x01\"\xa2\x02\n\x15\x41wsS3ConnectionConfig\x12$\n\x0bpath_prefix\x18\x02 \x01(\tH\x00R\npathPrefix\x88\x01\x01\x12\x46\n\x0b\x63redentials\x18\x03 \x01(\x0b\x32\x1f.mgmt.v1alpha1.AwsS3CredentialsH\x01R\x0b\x63redentials\x88\x01\x01\x12\x1b\n\x06region\x18\x04 \x01(\tH\x02R\x06region\x88\x01\x01\x12\x1f\n\x08\x65ndpoint\x18\x05 \x01(\tH\x03R\x08\x65ndpoint\x88\x01\x01\x12\x1f\n\x06\x62ucket\x18\x06 \x01(\tB\x07\xbaH\x04r\x02\x10\x01R\x06\x62ucketB\x0e\n\x0c_path_prefixB\x0e\n\x0c_credentialsB\t\n\x07_regionB\x0b\n\t_endpointJ\x04\x08\x01\x10\x02\"\xa7\x03\n\x10\x41wsS3Credentials\x12\x1d\n\x07profile\x18\x01 \x01(\tH\x00R\x07profile\x88\x01\x01\x12\'\n\raccess_key_id\x18\x02 \x01(\tH\x01R\x0b\x61\x63\x63\x65ssKeyId\x88\x01\x01\x12/\n\x11secret_access_key\x18\x03 \x01(\tH\x02R\x0fsecretAccessKey\x88\x01\x01\x12(\n\rsession_token\x18\x04 \x01(\tH\x03R\x0csessionToken\x88\x01\x01\x12\'\n\rfrom_ec2_role\x18\x05 \x01(\x08H\x04R\x0b\x66romEc2Role\x88\x01\x01\x12\x1e\n\x08role_arn\x18\x06 \x01(\tH\x05R\x07roleArn\x88\x01\x01\x12-\n\x10role_external_id\x18\x07 \x01(\tH\x06R\x0eroleExternalId\x88\x01\x01\x42\n\n\x08_profileB\x10\n\x0e_access_key_idB\x14\n\x12_secret_access_keyB\x10\n\x0e_session_tokenB\x10\n\x0e_from_ec2_roleB\x0b\n\t_role_arnB\x13\n\x11_role_external_id\"\xdd\x01\n\x1fGcpCloudStorageConnectionConfig\x12\x1f\n\x06\x62ucket\x18\x01 \x01(\tB\x07\xbaH\x04r\x02\x10\x01R\x06\x62ucket\x12$\n\x0bpath_prefix\x18\x02 \x01(\tH\x00R\npathPrefix\x88\x01\x01\x12\x43\n\x1bservice_account_credentials\x18\x03 \x01(\tH\x01R\x19serviceAccountCredentials\x88\x01\x01\x42\x0e\n\x0c_path_prefixB\x1e\n\x1c_service_account_credentials\"\x8f\x01\n IsConnectionNameAvailableRequest\x12\'\n\naccount_id\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\taccountId\x12\x42\n\x0f\x63onnection_name\x18\x02 \x01(\tB\x19\xbaH\x16r\x14\x32\x12^[a-z0-9-]{3,100}$R\x0e\x63onnectionName\"F\n!IsConnectionNameAvailableResponse\x12!\n\x0cis_available\x18\x01 \x01(\x08R\x0bisAvailable\"O\n\x14\x43heckSqlQueryRequest\x12\x18\n\x02id\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\x02id\x12\x1d\n\x05query\x18\x02 \x01(\tB\x07\xbaH\x04r\x02\x10\x01R\x05query\"n\n\x15\x43heckSqlQueryResponse\x12\x19\n\x08is_valid\x18\x01 \x01(\x08R\x07isValid\x12(\n\rerorr_message\x18\x02 \x01(\tH\x00R\x0c\x65rorrMessage\x88\x01\x01\x42\x10\n\x0e_erorr_message\"M\n\x19\x43heckSSHConnectionRequest\x12\x30\n\x06tunnel\x18\x01 \x01(\x0b\x32\x18.mgmt.v1alpha1.SSHTunnelR\x06tunnel\"]\n\x1a\x43heckSSHConnectionResponse\x12?\n\x06result\x18\x01 \x01(\x0b\x32\'.mgmt.v1alpha1.CheckSSHConnectionResultR\x06result\"9\n\x1d\x43heckSSHConnectionByIdRequest\x12\x18\n\x02id\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\x02id\"a\n\x1e\x43heckSSHConnectionByIdResponse\x12?\n\x06result\x18\x01 \x01(\x0b\x32\'.mgmt.v1alpha1.CheckSSHConnectionResultR\x06result\"{\n\x18\x43heckSSHConnectionResult\x12#\n\ris_successful\x18\x01 \x01(\x08R\x0cisSuccessful\x12(\n\rerror_message\x18\x02 \x01(\tH\x00R\x0c\x65rrorMessage\x88\x01\x01\x42\x10\n\x0e_error_message2\xcd\t\n\x11\x43onnectionService\x12\x62\n\x0eGetConnections\x12$.mgmt.v1alpha1.GetConnectionsRequest\x1a%.mgmt.v1alpha1.GetConnectionsResponse\"\x03\x90\x02\x01\x12_\n\rGetConnection\x12#.mgmt.v1alpha1.GetConnectionRequest\x1a$.mgmt.v1alpha1.GetConnectionResponse\"\x03\x90\x02\x01\x12\x65\n\x10\x43reateConnection\x12&.mgmt.v1alpha1.CreateConnectionRequest\x1a\'.mgmt.v1alpha1.CreateConnectionResponse\"\x00\x12\x65\n\x10UpdateConnection\x12&.mgmt.v1alpha1.UpdateConnectionRequest\x1a\'.mgmt.v1alpha1.UpdateConnectionResponse\"\x00\x12\x65\n\x10\x44\x65leteConnection\x12&.mgmt.v1alpha1.DeleteConnectionRequest\x1a\'.mgmt.v1alpha1.DeleteConnectionResponse\"\x00\x12\x80\x01\n\x19IsConnectionNameAvailable\x12/.mgmt.v1alpha1.IsConnectionNameAvailableRequest\x1a\x30.mgmt.v1alpha1.IsConnectionNameAvailableResponse\"\x00\x12t\n\x15\x43heckConnectionConfig\x12+.mgmt.v1alpha1.CheckConnectionConfigRequest\x1a,.mgmt.v1alpha1.CheckConnectionConfigResponse\"\x00\x12\x80\x01\n\x19\x43heckConnectionConfigById\x12/.mgmt.v1alpha1.CheckConnectionConfigByIdRequest\x1a\x30.mgmt.v1alpha1.CheckConnectionConfigByIdResponse\"\x00\x12\\\n\rCheckSqlQuery\x12#.mgmt.v1alpha1.CheckSqlQueryRequest\x1a$.mgmt.v1alpha1.CheckSqlQueryResponse\"\x00\x12k\n\x12\x43heckSSHConnection\x12(.mgmt.v1alpha1.CheckSSHConnectionRequest\x1a).mgmt.v1alpha1.CheckSSHConnectionResponse\"\x00\x12w\n\x16\x43heckSSHConnectionById\x12,.mgmt.v1alpha1.CheckSSHConnectionByIdRequest\x1a-.mgmt.v1alpha1.CheckSSHConnectionByIdResponse\"\x00\x42\xcb\x01\n\x11\x63om.mgmt.v1alpha1B\x0f\x43onnectionProtoP\x01ZPgithub.com/nucleuscloud/neosync/backend/gen/go/protos/mgmt/v1alpha1;mgmtv1alpha1\xa2\x02\x03MXX\xaa\x02\rMgmt.V1alpha1\xca\x02\rMgmt\\V1alpha1\xe2\x02\x19Mgmt\\V1alpha1\\GPBMetadata\xea\x02\x0eMgmt::V1alpha1b\x06proto3')
_globals = globals()
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
@@ -88,6 +88,8 @@
_globals['_CHECKSQLQUERYREQUEST'].fields_by_name['id']._serialized_options = b'\272H\005r\003\260\001\001'
_globals['_CHECKSQLQUERYREQUEST'].fields_by_name['query']._loaded_options = None
_globals['_CHECKSQLQUERYREQUEST'].fields_by_name['query']._serialized_options = b'\272H\004r\002\020\001'
+ _globals['_CHECKSSHCONNECTIONBYIDREQUEST'].fields_by_name['id']._loaded_options = None
+ _globals['_CHECKSSHCONNECTIONBYIDREQUEST'].fields_by_name['id']._serialized_options = b'\272H\005r\003\260\001\001'
_globals['_CONNECTIONSERVICE'].methods_by_name['GetConnections']._loaded_options = None
_globals['_CONNECTIONSERVICE'].methods_by_name['GetConnections']._serialized_options = b'\220\002\001'
_globals['_CONNECTIONSERVICE'].methods_by_name['GetConnection']._loaded_options = None
@@ -170,6 +172,16 @@
_globals['_CHECKSQLQUERYREQUEST']._serialized_end=7274
_globals['_CHECKSQLQUERYRESPONSE']._serialized_start=7276
_globals['_CHECKSQLQUERYRESPONSE']._serialized_end=7386
- _globals['_CONNECTIONSERVICE']._serialized_start=7389
- _globals['_CONNECTIONSERVICE']._serialized_end=8388
+ _globals['_CHECKSSHCONNECTIONREQUEST']._serialized_start=7388
+ _globals['_CHECKSSHCONNECTIONREQUEST']._serialized_end=7465
+ _globals['_CHECKSSHCONNECTIONRESPONSE']._serialized_start=7467
+ _globals['_CHECKSSHCONNECTIONRESPONSE']._serialized_end=7560
+ _globals['_CHECKSSHCONNECTIONBYIDREQUEST']._serialized_start=7562
+ _globals['_CHECKSSHCONNECTIONBYIDREQUEST']._serialized_end=7619
+ _globals['_CHECKSSHCONNECTIONBYIDRESPONSE']._serialized_start=7621
+ _globals['_CHECKSSHCONNECTIONBYIDRESPONSE']._serialized_end=7718
+ _globals['_CHECKSSHCONNECTIONRESULT']._serialized_start=7720
+ _globals['_CHECKSSHCONNECTIONRESULT']._serialized_end=7843
+ _globals['_CONNECTIONSERVICE']._serialized_start=7846
+ _globals['_CONNECTIONSERVICE']._serialized_end=9075
# @@protoc_insertion_point(module_scope)
diff --git a/python/src/neosync/mgmt/v1alpha1/connection_pb2.pyi b/python/src/neosync/mgmt/v1alpha1/connection_pb2.pyi
index e2abeb77f4..84123e331d 100644
--- a/python/src/neosync/mgmt/v1alpha1/connection_pb2.pyi
+++ b/python/src/neosync/mgmt/v1alpha1/connection_pb2.pyi
@@ -404,3 +404,35 @@ class CheckSqlQueryResponse(_message.Message):
is_valid: bool
erorr_message: str
def __init__(self, is_valid: bool = ..., erorr_message: _Optional[str] = ...) -> None: ...
+
+class CheckSSHConnectionRequest(_message.Message):
+ __slots__ = ("tunnel",)
+ TUNNEL_FIELD_NUMBER: _ClassVar[int]
+ tunnel: SSHTunnel
+ def __init__(self, tunnel: _Optional[_Union[SSHTunnel, _Mapping]] = ...) -> None: ...
+
+class CheckSSHConnectionResponse(_message.Message):
+ __slots__ = ("result",)
+ RESULT_FIELD_NUMBER: _ClassVar[int]
+ result: CheckSSHConnectionResult
+ def __init__(self, result: _Optional[_Union[CheckSSHConnectionResult, _Mapping]] = ...) -> None: ...
+
+class CheckSSHConnectionByIdRequest(_message.Message):
+ __slots__ = ("id",)
+ ID_FIELD_NUMBER: _ClassVar[int]
+ id: str
+ def __init__(self, id: _Optional[str] = ...) -> None: ...
+
+class CheckSSHConnectionByIdResponse(_message.Message):
+ __slots__ = ("result",)
+ RESULT_FIELD_NUMBER: _ClassVar[int]
+ result: CheckSSHConnectionResult
+ def __init__(self, result: _Optional[_Union[CheckSSHConnectionResult, _Mapping]] = ...) -> None: ...
+
+class CheckSSHConnectionResult(_message.Message):
+ __slots__ = ("is_successful", "error_message")
+ IS_SUCCESSFUL_FIELD_NUMBER: _ClassVar[int]
+ ERROR_MESSAGE_FIELD_NUMBER: _ClassVar[int]
+ is_successful: bool
+ error_message: str
+ def __init__(self, is_successful: bool = ..., error_message: _Optional[str] = ...) -> None: ...
diff --git a/python/src/neosync/mgmt/v1alpha1/connection_pb2_grpc.py b/python/src/neosync/mgmt/v1alpha1/connection_pb2_grpc.py
index f3577956cf..a71f7a5127 100644
--- a/python/src/neosync/mgmt/v1alpha1/connection_pb2_grpc.py
+++ b/python/src/neosync/mgmt/v1alpha1/connection_pb2_grpc.py
@@ -61,6 +61,16 @@ def __init__(self, channel):
request_serializer=mgmt_dot_v1alpha1_dot_connection__pb2.CheckSqlQueryRequest.SerializeToString,
response_deserializer=mgmt_dot_v1alpha1_dot_connection__pb2.CheckSqlQueryResponse.FromString,
_registered_method=True)
+ self.CheckSSHConnection = channel.unary_unary(
+ '/mgmt.v1alpha1.ConnectionService/CheckSSHConnection',
+ request_serializer=mgmt_dot_v1alpha1_dot_connection__pb2.CheckSSHConnectionRequest.SerializeToString,
+ response_deserializer=mgmt_dot_v1alpha1_dot_connection__pb2.CheckSSHConnectionResponse.FromString,
+ _registered_method=True)
+ self.CheckSSHConnectionById = channel.unary_unary(
+ '/mgmt.v1alpha1.ConnectionService/CheckSSHConnectionById',
+ request_serializer=mgmt_dot_v1alpha1_dot_connection__pb2.CheckSSHConnectionByIdRequest.SerializeToString,
+ response_deserializer=mgmt_dot_v1alpha1_dot_connection__pb2.CheckSSHConnectionByIdResponse.FromString,
+ _registered_method=True)
class ConnectionServiceServicer(object):
@@ -134,6 +144,20 @@ def CheckSqlQuery(self, request, context):
context.set_details('Method not implemented!')
raise NotImplementedError('Method not implemented!')
+ def CheckSSHConnection(self, request, context):
+ """Checks if the SSH server is reachable and accessible with the given credentials
+ """
+ context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+ context.set_details('Method not implemented!')
+ raise NotImplementedError('Method not implemented!')
+
+ def CheckSSHConnectionById(self, request, context):
+ """Checks if the SSH server is reachable and accessible with the given credentials
+ """
+ context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+ context.set_details('Method not implemented!')
+ raise NotImplementedError('Method not implemented!')
+
def add_ConnectionServiceServicer_to_server(servicer, server):
rpc_method_handlers = {
@@ -182,6 +206,16 @@ def add_ConnectionServiceServicer_to_server(servicer, server):
request_deserializer=mgmt_dot_v1alpha1_dot_connection__pb2.CheckSqlQueryRequest.FromString,
response_serializer=mgmt_dot_v1alpha1_dot_connection__pb2.CheckSqlQueryResponse.SerializeToString,
),
+ 'CheckSSHConnection': grpc.unary_unary_rpc_method_handler(
+ servicer.CheckSSHConnection,
+ request_deserializer=mgmt_dot_v1alpha1_dot_connection__pb2.CheckSSHConnectionRequest.FromString,
+ response_serializer=mgmt_dot_v1alpha1_dot_connection__pb2.CheckSSHConnectionResponse.SerializeToString,
+ ),
+ 'CheckSSHConnectionById': grpc.unary_unary_rpc_method_handler(
+ servicer.CheckSSHConnectionById,
+ request_deserializer=mgmt_dot_v1alpha1_dot_connection__pb2.CheckSSHConnectionByIdRequest.FromString,
+ response_serializer=mgmt_dot_v1alpha1_dot_connection__pb2.CheckSSHConnectionByIdResponse.SerializeToString,
+ ),
}
generic_handler = grpc.method_handlers_generic_handler(
'mgmt.v1alpha1.ConnectionService', rpc_method_handlers)
@@ -437,3 +471,57 @@ def CheckSqlQuery(request,
timeout,
metadata,
_registered_method=True)
+
+ @staticmethod
+ def CheckSSHConnection(request,
+ target,
+ options=(),
+ channel_credentials=None,
+ call_credentials=None,
+ insecure=False,
+ compression=None,
+ wait_for_ready=None,
+ timeout=None,
+ metadata=None):
+ return grpc.experimental.unary_unary(
+ request,
+ target,
+ '/mgmt.v1alpha1.ConnectionService/CheckSSHConnection',
+ mgmt_dot_v1alpha1_dot_connection__pb2.CheckSSHConnectionRequest.SerializeToString,
+ mgmt_dot_v1alpha1_dot_connection__pb2.CheckSSHConnectionResponse.FromString,
+ options,
+ channel_credentials,
+ insecure,
+ call_credentials,
+ compression,
+ wait_for_ready,
+ timeout,
+ metadata,
+ _registered_method=True)
+
+ @staticmethod
+ def CheckSSHConnectionById(request,
+ target,
+ options=(),
+ channel_credentials=None,
+ call_credentials=None,
+ insecure=False,
+ compression=None,
+ wait_for_ready=None,
+ timeout=None,
+ metadata=None):
+ return grpc.experimental.unary_unary(
+ request,
+ target,
+ '/mgmt.v1alpha1.ConnectionService/CheckSSHConnectionById',
+ mgmt_dot_v1alpha1_dot_connection__pb2.CheckSSHConnectionByIdRequest.SerializeToString,
+ mgmt_dot_v1alpha1_dot_connection__pb2.CheckSSHConnectionByIdResponse.FromString,
+ options,
+ channel_credentials,
+ insecure,
+ call_credentials,
+ compression,
+ wait_for_ready,
+ timeout,
+ metadata,
+ _registered_method=True)