From e39e53dccaceda9dd6489a8020364ba89cf94d3a Mon Sep 17 00:00:00 2001 From: Ludwig Bedacht Date: Sat, 2 May 2026 01:22:25 +0200 Subject: [PATCH 01/26] feat: support features claim in graph tokens (#2811) --- .../federated-graph/createFederatedGraphToken.ts | 13 +++++++++++++ .../src/core/repositories/OrganizationRepository.ts | 1 + controlplane/src/types/index.ts | 4 +++- 3 files changed, 17 insertions(+), 1 deletion(-) diff --git a/controlplane/src/core/bufservices/federated-graph/createFederatedGraphToken.ts b/controlplane/src/core/bufservices/federated-graph/createFederatedGraphToken.ts index 337a437f13..71e2bd0870 100644 --- a/controlplane/src/core/bufservices/federated-graph/createFederatedGraphToken.ts +++ b/controlplane/src/core/bufservices/federated-graph/createFederatedGraphToken.ts @@ -13,6 +13,7 @@ import { DefaultNamespace } from '../../repositories/NamespaceRepository.js'; import type { RouterOptions } from '../../routes.js'; import { enrichLogger, getLogger, handleError } from '../../util.js'; import { UnauthorizedError } from '../../errors/errors.js'; +import { OrganizationRepository } from '../../repositories/OrganizationRepository.js'; export function createFederatedGraphToken( opts: RouterOptions, @@ -71,6 +72,17 @@ export function createFederatedGraphToken( }; } + const orgRepo = new OrganizationRepository(logger, opts.db, opts.billingDefaultPlanId); + const splitConfigFeature = await orgRepo.getFeature({ + organizationId: authContext.organizationId, + featureId: 'split-config-loading', + }); + + const features: string[] = []; + if (splitConfigFeature?.enabled) { + features.push('split-config-loading'); + } + const tokenValue = await signJwtHS256({ secret: opts.jwtSecret, token: { @@ -78,6 +90,7 @@ export function createFederatedGraphToken( federated_graph_id: graph.id, aud: audiences.cosmoGraphKey, // to distinguish from other tokens organization_id: authContext.organizationId, + features: features.length > 0 ? features : undefined, }, }); diff --git a/controlplane/src/core/repositories/OrganizationRepository.ts b/controlplane/src/core/repositories/OrganizationRepository.ts index c132f647e7..2ceb5c86cb 100644 --- a/controlplane/src/core/repositories/OrganizationRepository.ts +++ b/controlplane/src/core/repositories/OrganizationRepository.ts @@ -1420,6 +1420,7 @@ export class OrganizationRepository { sso: false, 'subgraph-check-extensions': false, support: false, + 'split-config-loading': false, }; for (const feature of features) { diff --git a/controlplane/src/types/index.ts b/controlplane/src/types/index.ts index 3cf35cf690..d438237876 100644 --- a/controlplane/src/types/index.ts +++ b/controlplane/src/types/index.ts @@ -28,7 +28,8 @@ export type FeatureIds = | 'security' | 'sso' | 'subgraph-check-extensions' - | 'support'; + | 'support' + | 'split-config-loading'; export type Features = { [key in FeatureIds]: Feature; @@ -498,6 +499,7 @@ export type AuthContext = { export interface GraphApiKeyJwtPayload extends JWTPayload { federated_graph_id: string; organization_id: string; + features?: string[]; } export interface PluginAccess { From 932f4ec73042ece47625e0ca9c7147185d170108 Mon Sep 17 00:00:00 2001 From: Dominik Korittki <23359034+dkorittki@users.noreply.github.com> Date: Mon, 4 May 2026 10:15:18 +0000 Subject: [PATCH 02/26] chore(router, controlplane): add engine config hash mapping to node proto v1 (#2816) --- .../gen/proto/wg/cosmo/node/v1/node.pb.go | 808 ++++++++++-------- connect/src/wg/cosmo/node/v1/node_pb.ts | 40 + proto/wg/cosmo/node/v1/node.proto | 6 + router/gen/proto/wg/cosmo/node/v1/node.pb.go | 808 ++++++++++-------- 4 files changed, 908 insertions(+), 754 deletions(-) diff --git a/connect-go/gen/proto/wg/cosmo/node/v1/node.pb.go b/connect-go/gen/proto/wg/cosmo/node/v1/node.pb.go index 3d9776a6ca..d02c520cbd 100644 --- a/connect-go/gen/proto/wg/cosmo/node/v1/node.pb.go +++ b/connect-go/gen/proto/wg/cosmo/node/v1/node.pb.go @@ -669,6 +669,52 @@ func (x *RouterConfig) GetCompatibilityVersion() string { return "" } +type ActiveGraphs struct { + state protoimpl.MessageState `protogen:"open.v1"` + // key = feature flag name, empty means base graph + // value = hash of engine_config + GraphConfigs map[string]string `protobuf:"bytes,1,rep,name=graphConfigs,proto3" json:"graphConfigs,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ActiveGraphs) Reset() { + *x = ActiveGraphs{} + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ActiveGraphs) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ActiveGraphs) ProtoMessage() {} + +func (x *ActiveGraphs) ProtoReflect() protoreflect.Message { + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[4] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ActiveGraphs.ProtoReflect.Descriptor instead. +func (*ActiveGraphs) Descriptor() ([]byte, []int) { + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{4} +} + +func (x *ActiveGraphs) GetGraphConfigs() map[string]string { + if x != nil { + return x.GraphConfigs + } + return nil +} + type Response struct { state protoimpl.MessageState `protogen:"open.v1"` Code common.EnumStatusCode `protobuf:"varint,1,opt,name=code,proto3,enum=wg.cosmo.common.EnumStatusCode" json:"code,omitempty"` @@ -680,7 +726,7 @@ type Response struct { func (x *Response) Reset() { *x = Response{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[4] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[5] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -692,7 +738,7 @@ func (x *Response) String() string { func (*Response) ProtoMessage() {} func (x *Response) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[4] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[5] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -705,7 +751,7 @@ func (x *Response) ProtoReflect() protoreflect.Message { // Deprecated: Use Response.ProtoReflect.Descriptor instead. func (*Response) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{4} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{5} } func (x *Response) GetCode() common.EnumStatusCode { @@ -732,7 +778,7 @@ type ResponseStatus struct { func (x *ResponseStatus) Reset() { *x = ResponseStatus{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[5] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -744,7 +790,7 @@ func (x *ResponseStatus) String() string { func (*ResponseStatus) ProtoMessage() {} func (x *ResponseStatus) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[5] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[6] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -757,7 +803,7 @@ func (x *ResponseStatus) ProtoReflect() protoreflect.Message { // Deprecated: Use ResponseStatus.ProtoReflect.Descriptor instead. func (*ResponseStatus) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{5} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{6} } func (x *ResponseStatus) GetCode() int32 { @@ -784,7 +830,7 @@ type RegistrationInfo struct { func (x *RegistrationInfo) Reset() { *x = RegistrationInfo{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[6] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -796,7 +842,7 @@ func (x *RegistrationInfo) String() string { func (*RegistrationInfo) ProtoMessage() {} func (x *RegistrationInfo) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[6] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[7] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -809,7 +855,7 @@ func (x *RegistrationInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use RegistrationInfo.ProtoReflect.Descriptor instead. func (*RegistrationInfo) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{6} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{7} } func (x *RegistrationInfo) GetAccountLimits() *AccountLimits { @@ -837,7 +883,7 @@ type AccountLimits struct { func (x *AccountLimits) Reset() { *x = AccountLimits{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[7] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -849,7 +895,7 @@ func (x *AccountLimits) String() string { func (*AccountLimits) ProtoMessage() {} func (x *AccountLimits) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[7] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[8] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -862,7 +908,7 @@ func (x *AccountLimits) ProtoReflect() protoreflect.Message { // Deprecated: Use AccountLimits.ProtoReflect.Descriptor instead. func (*AccountLimits) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{7} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{8} } func (x *AccountLimits) GetTraceSamplingRate() float32 { @@ -880,7 +926,7 @@ type SelfRegisterRequest struct { func (x *SelfRegisterRequest) Reset() { *x = SelfRegisterRequest{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[8] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -892,7 +938,7 @@ func (x *SelfRegisterRequest) String() string { func (*SelfRegisterRequest) ProtoMessage() {} func (x *SelfRegisterRequest) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[8] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[9] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -905,7 +951,7 @@ func (x *SelfRegisterRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SelfRegisterRequest.ProtoReflect.Descriptor instead. func (*SelfRegisterRequest) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{8} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{9} } type SelfRegisterResponse struct { @@ -918,7 +964,7 @@ type SelfRegisterResponse struct { func (x *SelfRegisterResponse) Reset() { *x = SelfRegisterResponse{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[9] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -930,7 +976,7 @@ func (x *SelfRegisterResponse) String() string { func (*SelfRegisterResponse) ProtoMessage() {} func (x *SelfRegisterResponse) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[9] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[10] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -943,7 +989,7 @@ func (x *SelfRegisterResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use SelfRegisterResponse.ProtoReflect.Descriptor instead. func (*SelfRegisterResponse) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{9} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{10} } func (x *SelfRegisterResponse) GetResponse() *Response { @@ -975,7 +1021,7 @@ type EngineConfiguration struct { func (x *EngineConfiguration) Reset() { *x = EngineConfiguration{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[10] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -987,7 +1033,7 @@ func (x *EngineConfiguration) String() string { func (*EngineConfiguration) ProtoMessage() {} func (x *EngineConfiguration) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[10] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[11] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1000,7 +1046,7 @@ func (x *EngineConfiguration) ProtoReflect() protoreflect.Message { // Deprecated: Use EngineConfiguration.ProtoReflect.Descriptor instead. func (*EngineConfiguration) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{10} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{11} } func (x *EngineConfiguration) GetDefaultFlushInterval() int64 { @@ -1076,7 +1122,7 @@ type DataSourceConfiguration struct { func (x *DataSourceConfiguration) Reset() { *x = DataSourceConfiguration{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[11] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1088,7 +1134,7 @@ func (x *DataSourceConfiguration) String() string { func (*DataSourceConfiguration) ProtoMessage() {} func (x *DataSourceConfiguration) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[11] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[12] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1101,7 +1147,7 @@ func (x *DataSourceConfiguration) ProtoReflect() protoreflect.Message { // Deprecated: Use DataSourceConfiguration.ProtoReflect.Descriptor instead. func (*DataSourceConfiguration) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{11} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{12} } func (x *DataSourceConfiguration) GetKind() DataSourceKind { @@ -1228,7 +1274,7 @@ type CostConfiguration struct { func (x *CostConfiguration) Reset() { *x = CostConfiguration{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[12] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1240,7 +1286,7 @@ func (x *CostConfiguration) String() string { func (*CostConfiguration) ProtoMessage() {} func (x *CostConfiguration) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[12] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[13] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1253,7 +1299,7 @@ func (x *CostConfiguration) ProtoReflect() protoreflect.Message { // Deprecated: Use CostConfiguration.ProtoReflect.Descriptor instead. func (*CostConfiguration) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{12} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{13} } func (x *CostConfiguration) GetFieldWeights() []*FieldWeightConfiguration { @@ -1297,7 +1343,7 @@ type FieldWeightConfiguration struct { func (x *FieldWeightConfiguration) Reset() { *x = FieldWeightConfiguration{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[13] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1309,7 +1355,7 @@ func (x *FieldWeightConfiguration) String() string { func (*FieldWeightConfiguration) ProtoMessage() {} func (x *FieldWeightConfiguration) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[13] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[14] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1322,7 +1368,7 @@ func (x *FieldWeightConfiguration) ProtoReflect() protoreflect.Message { // Deprecated: Use FieldWeightConfiguration.ProtoReflect.Descriptor instead. func (*FieldWeightConfiguration) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{13} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{14} } func (x *FieldWeightConfiguration) GetTypeName() string { @@ -1374,7 +1420,7 @@ type FieldListSizeConfiguration struct { func (x *FieldListSizeConfiguration) Reset() { *x = FieldListSizeConfiguration{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[14] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[15] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1386,7 +1432,7 @@ func (x *FieldListSizeConfiguration) String() string { func (*FieldListSizeConfiguration) ProtoMessage() {} func (x *FieldListSizeConfiguration) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[14] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[15] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1399,7 +1445,7 @@ func (x *FieldListSizeConfiguration) ProtoReflect() protoreflect.Message { // Deprecated: Use FieldListSizeConfiguration.ProtoReflect.Descriptor instead. func (*FieldListSizeConfiguration) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{14} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{15} } func (x *FieldListSizeConfiguration) GetTypeName() string { @@ -1454,7 +1500,7 @@ type ArgumentConfiguration struct { func (x *ArgumentConfiguration) Reset() { *x = ArgumentConfiguration{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[15] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[16] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1466,7 +1512,7 @@ func (x *ArgumentConfiguration) String() string { func (*ArgumentConfiguration) ProtoMessage() {} func (x *ArgumentConfiguration) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[15] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[16] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1479,7 +1525,7 @@ func (x *ArgumentConfiguration) ProtoReflect() protoreflect.Message { // Deprecated: Use ArgumentConfiguration.ProtoReflect.Descriptor instead. func (*ArgumentConfiguration) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{15} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{16} } func (x *ArgumentConfiguration) GetName() string { @@ -1505,7 +1551,7 @@ type Scopes struct { func (x *Scopes) Reset() { *x = Scopes{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[16] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[17] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1517,7 +1563,7 @@ func (x *Scopes) String() string { func (*Scopes) ProtoMessage() {} func (x *Scopes) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[16] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[17] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1530,7 +1576,7 @@ func (x *Scopes) ProtoReflect() protoreflect.Message { // Deprecated: Use Scopes.ProtoReflect.Descriptor instead. func (*Scopes) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{16} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{17} } func (x *Scopes) GetRequiredAndScopes() []string { @@ -1551,7 +1597,7 @@ type AuthorizationConfiguration struct { func (x *AuthorizationConfiguration) Reset() { *x = AuthorizationConfiguration{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[17] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[18] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1563,7 +1609,7 @@ func (x *AuthorizationConfiguration) String() string { func (*AuthorizationConfiguration) ProtoMessage() {} func (x *AuthorizationConfiguration) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[17] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[18] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1576,7 +1622,7 @@ func (x *AuthorizationConfiguration) ProtoReflect() protoreflect.Message { // Deprecated: Use AuthorizationConfiguration.ProtoReflect.Descriptor instead. func (*AuthorizationConfiguration) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{17} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{18} } func (x *AuthorizationConfiguration) GetRequiresAuthentication() bool { @@ -1613,7 +1659,7 @@ type FieldConfiguration struct { func (x *FieldConfiguration) Reset() { *x = FieldConfiguration{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[18] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[19] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1625,7 +1671,7 @@ func (x *FieldConfiguration) String() string { func (*FieldConfiguration) ProtoMessage() {} func (x *FieldConfiguration) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[18] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[19] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1638,7 +1684,7 @@ func (x *FieldConfiguration) ProtoReflect() protoreflect.Message { // Deprecated: Use FieldConfiguration.ProtoReflect.Descriptor instead. func (*FieldConfiguration) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{18} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{19} } func (x *FieldConfiguration) GetTypeName() string { @@ -1686,7 +1732,7 @@ type TypeConfiguration struct { func (x *TypeConfiguration) Reset() { *x = TypeConfiguration{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[19] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[20] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1698,7 +1744,7 @@ func (x *TypeConfiguration) String() string { func (*TypeConfiguration) ProtoMessage() {} func (x *TypeConfiguration) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[19] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[20] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1711,7 +1757,7 @@ func (x *TypeConfiguration) ProtoReflect() protoreflect.Message { // Deprecated: Use TypeConfiguration.ProtoReflect.Descriptor instead. func (*TypeConfiguration) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{19} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{20} } func (x *TypeConfiguration) GetTypeName() string { @@ -1740,7 +1786,7 @@ type TypeField struct { func (x *TypeField) Reset() { *x = TypeField{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[20] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[21] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1752,7 +1798,7 @@ func (x *TypeField) String() string { func (*TypeField) ProtoMessage() {} func (x *TypeField) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[20] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[21] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1765,7 +1811,7 @@ func (x *TypeField) ProtoReflect() protoreflect.Message { // Deprecated: Use TypeField.ProtoReflect.Descriptor instead. func (*TypeField) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{20} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{21} } func (x *TypeField) GetTypeName() string { @@ -1806,7 +1852,7 @@ type FieldCoordinates struct { func (x *FieldCoordinates) Reset() { *x = FieldCoordinates{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[21] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[22] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1818,7 +1864,7 @@ func (x *FieldCoordinates) String() string { func (*FieldCoordinates) ProtoMessage() {} func (x *FieldCoordinates) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[21] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[22] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1831,7 +1877,7 @@ func (x *FieldCoordinates) ProtoReflect() protoreflect.Message { // Deprecated: Use FieldCoordinates.ProtoReflect.Descriptor instead. func (*FieldCoordinates) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{21} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{22} } func (x *FieldCoordinates) GetFieldName() string { @@ -1858,7 +1904,7 @@ type FieldSetCondition struct { func (x *FieldSetCondition) Reset() { *x = FieldSetCondition{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[22] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[23] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1870,7 +1916,7 @@ func (x *FieldSetCondition) String() string { func (*FieldSetCondition) ProtoMessage() {} func (x *FieldSetCondition) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[22] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[23] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1883,7 +1929,7 @@ func (x *FieldSetCondition) ProtoReflect() protoreflect.Message { // Deprecated: Use FieldSetCondition.ProtoReflect.Descriptor instead. func (*FieldSetCondition) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{22} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{23} } func (x *FieldSetCondition) GetFieldCoordinatesPath() []*FieldCoordinates { @@ -1913,7 +1959,7 @@ type RequiredField struct { func (x *RequiredField) Reset() { *x = RequiredField{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[23] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[24] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1925,7 +1971,7 @@ func (x *RequiredField) String() string { func (*RequiredField) ProtoMessage() {} func (x *RequiredField) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[23] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[24] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1938,7 +1984,7 @@ func (x *RequiredField) ProtoReflect() protoreflect.Message { // Deprecated: Use RequiredField.ProtoReflect.Descriptor instead. func (*RequiredField) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{23} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{24} } func (x *RequiredField) GetTypeName() string { @@ -1986,7 +2032,7 @@ type EntityInterfaceConfiguration struct { func (x *EntityInterfaceConfiguration) Reset() { *x = EntityInterfaceConfiguration{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[24] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[25] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1998,7 +2044,7 @@ func (x *EntityInterfaceConfiguration) String() string { func (*EntityInterfaceConfiguration) ProtoMessage() {} func (x *EntityInterfaceConfiguration) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[24] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[25] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2011,7 +2057,7 @@ func (x *EntityInterfaceConfiguration) ProtoReflect() protoreflect.Message { // Deprecated: Use EntityInterfaceConfiguration.ProtoReflect.Descriptor instead. func (*EntityInterfaceConfiguration) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{24} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{25} } func (x *EntityInterfaceConfiguration) GetInterfaceTypeName() string { @@ -2054,7 +2100,7 @@ type FetchConfiguration struct { func (x *FetchConfiguration) Reset() { *x = FetchConfiguration{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[25] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[26] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2066,7 +2112,7 @@ func (x *FetchConfiguration) String() string { func (*FetchConfiguration) ProtoMessage() {} func (x *FetchConfiguration) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[25] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[26] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2079,7 +2125,7 @@ func (x *FetchConfiguration) ProtoReflect() protoreflect.Message { // Deprecated: Use FetchConfiguration.ProtoReflect.Descriptor instead. func (*FetchConfiguration) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{25} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{26} } func (x *FetchConfiguration) GetUrl() *ConfigurationVariable { @@ -2163,7 +2209,7 @@ type StatusCodeTypeMapping struct { func (x *StatusCodeTypeMapping) Reset() { *x = StatusCodeTypeMapping{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[26] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[27] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2175,7 +2221,7 @@ func (x *StatusCodeTypeMapping) String() string { func (*StatusCodeTypeMapping) ProtoMessage() {} func (x *StatusCodeTypeMapping) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[26] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[27] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2188,7 +2234,7 @@ func (x *StatusCodeTypeMapping) ProtoReflect() protoreflect.Message { // Deprecated: Use StatusCodeTypeMapping.ProtoReflect.Descriptor instead. func (*StatusCodeTypeMapping) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{26} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{27} } func (x *StatusCodeTypeMapping) GetStatusCode() int64 { @@ -2226,7 +2272,7 @@ type DataSourceCustom_GraphQL struct { func (x *DataSourceCustom_GraphQL) Reset() { *x = DataSourceCustom_GraphQL{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[27] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[28] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2238,7 +2284,7 @@ func (x *DataSourceCustom_GraphQL) String() string { func (*DataSourceCustom_GraphQL) ProtoMessage() {} func (x *DataSourceCustom_GraphQL) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[27] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[28] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2251,7 +2297,7 @@ func (x *DataSourceCustom_GraphQL) ProtoReflect() protoreflect.Message { // Deprecated: Use DataSourceCustom_GraphQL.ProtoReflect.Descriptor instead. func (*DataSourceCustom_GraphQL) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{27} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{28} } func (x *DataSourceCustom_GraphQL) GetFetch() *FetchConfiguration { @@ -2307,7 +2353,7 @@ type GRPCConfiguration struct { func (x *GRPCConfiguration) Reset() { *x = GRPCConfiguration{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[28] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[29] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2319,7 +2365,7 @@ func (x *GRPCConfiguration) String() string { func (*GRPCConfiguration) ProtoMessage() {} func (x *GRPCConfiguration) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[28] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[29] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2332,7 +2378,7 @@ func (x *GRPCConfiguration) ProtoReflect() protoreflect.Message { // Deprecated: Use GRPCConfiguration.ProtoReflect.Descriptor instead. func (*GRPCConfiguration) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{28} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{29} } func (x *GRPCConfiguration) GetMapping() *GRPCMapping { @@ -2366,7 +2412,7 @@ type ImageReference struct { func (x *ImageReference) Reset() { *x = ImageReference{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[29] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[30] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2378,7 +2424,7 @@ func (x *ImageReference) String() string { func (*ImageReference) ProtoMessage() {} func (x *ImageReference) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[29] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[30] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2391,7 +2437,7 @@ func (x *ImageReference) ProtoReflect() protoreflect.Message { // Deprecated: Use ImageReference.ProtoReflect.Descriptor instead. func (*ImageReference) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{29} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{30} } func (x *ImageReference) GetRepository() string { @@ -2421,7 +2467,7 @@ type PluginConfiguration struct { func (x *PluginConfiguration) Reset() { *x = PluginConfiguration{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[30] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[31] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2433,7 +2479,7 @@ func (x *PluginConfiguration) String() string { func (*PluginConfiguration) ProtoMessage() {} func (x *PluginConfiguration) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[30] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[31] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2446,7 +2492,7 @@ func (x *PluginConfiguration) ProtoReflect() protoreflect.Message { // Deprecated: Use PluginConfiguration.ProtoReflect.Descriptor instead. func (*PluginConfiguration) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{30} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{31} } func (x *PluginConfiguration) GetName() string { @@ -2480,7 +2526,7 @@ type SSLConfiguration struct { func (x *SSLConfiguration) Reset() { *x = SSLConfiguration{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[31] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[32] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2492,7 +2538,7 @@ func (x *SSLConfiguration) String() string { func (*SSLConfiguration) ProtoMessage() {} func (x *SSLConfiguration) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[31] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[32] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2505,7 +2551,7 @@ func (x *SSLConfiguration) ProtoReflect() protoreflect.Message { // Deprecated: Use SSLConfiguration.ProtoReflect.Descriptor instead. func (*SSLConfiguration) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{31} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{32} } func (x *SSLConfiguration) GetEnabled() bool { @@ -2538,7 +2584,7 @@ type GRPCMapping struct { func (x *GRPCMapping) Reset() { *x = GRPCMapping{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[32] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[33] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2550,7 +2596,7 @@ func (x *GRPCMapping) String() string { func (*GRPCMapping) ProtoMessage() {} func (x *GRPCMapping) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[32] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[33] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2563,7 +2609,7 @@ func (x *GRPCMapping) ProtoReflect() protoreflect.Message { // Deprecated: Use GRPCMapping.ProtoReflect.Descriptor instead. func (*GRPCMapping) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{32} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{33} } func (x *GRPCMapping) GetVersion() int32 { @@ -2634,7 +2680,7 @@ type LookupMapping struct { func (x *LookupMapping) Reset() { *x = LookupMapping{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[33] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[34] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2646,7 +2692,7 @@ func (x *LookupMapping) String() string { func (*LookupMapping) ProtoMessage() {} func (x *LookupMapping) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[33] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[34] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2659,7 +2705,7 @@ func (x *LookupMapping) ProtoReflect() protoreflect.Message { // Deprecated: Use LookupMapping.ProtoReflect.Descriptor instead. func (*LookupMapping) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{33} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{34} } func (x *LookupMapping) GetType() LookupType { @@ -2710,7 +2756,7 @@ type LookupFieldMapping struct { func (x *LookupFieldMapping) Reset() { *x = LookupFieldMapping{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[34] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[35] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2722,7 +2768,7 @@ func (x *LookupFieldMapping) String() string { func (*LookupFieldMapping) ProtoMessage() {} func (x *LookupFieldMapping) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[34] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[35] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2735,7 +2781,7 @@ func (x *LookupFieldMapping) ProtoReflect() protoreflect.Message { // Deprecated: Use LookupFieldMapping.ProtoReflect.Descriptor instead. func (*LookupFieldMapping) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{34} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{35} } func (x *LookupFieldMapping) GetType() string { @@ -2771,7 +2817,7 @@ type OperationMapping struct { func (x *OperationMapping) Reset() { *x = OperationMapping{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[35] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[36] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2783,7 +2829,7 @@ func (x *OperationMapping) String() string { func (*OperationMapping) ProtoMessage() {} func (x *OperationMapping) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[35] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[36] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2796,7 +2842,7 @@ func (x *OperationMapping) ProtoReflect() protoreflect.Message { // Deprecated: Use OperationMapping.ProtoReflect.Descriptor instead. func (*OperationMapping) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{35} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{36} } func (x *OperationMapping) GetType() OperationType { @@ -2857,7 +2903,7 @@ type EntityMapping struct { func (x *EntityMapping) Reset() { *x = EntityMapping{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[36] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[37] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2869,7 +2915,7 @@ func (x *EntityMapping) String() string { func (*EntityMapping) ProtoMessage() {} func (x *EntityMapping) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[36] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[37] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2882,7 +2928,7 @@ func (x *EntityMapping) ProtoReflect() protoreflect.Message { // Deprecated: Use EntityMapping.ProtoReflect.Descriptor instead. func (*EntityMapping) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{36} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{37} } func (x *EntityMapping) GetTypeName() string { @@ -2950,7 +2996,7 @@ type RequiredFieldMapping struct { func (x *RequiredFieldMapping) Reset() { *x = RequiredFieldMapping{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[37] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[38] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2962,7 +3008,7 @@ func (x *RequiredFieldMapping) String() string { func (*RequiredFieldMapping) ProtoMessage() {} func (x *RequiredFieldMapping) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[37] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[38] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2975,7 +3021,7 @@ func (x *RequiredFieldMapping) ProtoReflect() protoreflect.Message { // Deprecated: Use RequiredFieldMapping.ProtoReflect.Descriptor instead. func (*RequiredFieldMapping) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{37} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{38} } func (x *RequiredFieldMapping) GetFieldMapping() *FieldMapping { @@ -3019,7 +3065,7 @@ type TypeFieldMapping struct { func (x *TypeFieldMapping) Reset() { *x = TypeFieldMapping{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[38] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[39] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3031,7 +3077,7 @@ func (x *TypeFieldMapping) String() string { func (*TypeFieldMapping) ProtoMessage() {} func (x *TypeFieldMapping) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[38] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[39] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3044,7 +3090,7 @@ func (x *TypeFieldMapping) ProtoReflect() protoreflect.Message { // Deprecated: Use TypeFieldMapping.ProtoReflect.Descriptor instead. func (*TypeFieldMapping) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{38} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{39} } func (x *TypeFieldMapping) GetType() string { @@ -3076,7 +3122,7 @@ type FieldMapping struct { func (x *FieldMapping) Reset() { *x = FieldMapping{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[39] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[40] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3088,7 +3134,7 @@ func (x *FieldMapping) String() string { func (*FieldMapping) ProtoMessage() {} func (x *FieldMapping) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[39] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[40] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3101,7 +3147,7 @@ func (x *FieldMapping) ProtoReflect() protoreflect.Message { // Deprecated: Use FieldMapping.ProtoReflect.Descriptor instead. func (*FieldMapping) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{39} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{40} } func (x *FieldMapping) GetOriginal() string { @@ -3138,7 +3184,7 @@ type ArgumentMapping struct { func (x *ArgumentMapping) Reset() { *x = ArgumentMapping{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[40] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[41] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3150,7 +3196,7 @@ func (x *ArgumentMapping) String() string { func (*ArgumentMapping) ProtoMessage() {} func (x *ArgumentMapping) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[40] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[41] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3163,7 +3209,7 @@ func (x *ArgumentMapping) ProtoReflect() protoreflect.Message { // Deprecated: Use ArgumentMapping.ProtoReflect.Descriptor instead. func (*ArgumentMapping) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{40} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{41} } func (x *ArgumentMapping) GetOriginal() string { @@ -3190,7 +3236,7 @@ type EnumMapping struct { func (x *EnumMapping) Reset() { *x = EnumMapping{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[41] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[42] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3202,7 +3248,7 @@ func (x *EnumMapping) String() string { func (*EnumMapping) ProtoMessage() {} func (x *EnumMapping) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[41] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[42] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3215,7 +3261,7 @@ func (x *EnumMapping) ProtoReflect() protoreflect.Message { // Deprecated: Use EnumMapping.ProtoReflect.Descriptor instead. func (*EnumMapping) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{41} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{42} } func (x *EnumMapping) GetType() string { @@ -3242,7 +3288,7 @@ type EnumValueMapping struct { func (x *EnumValueMapping) Reset() { *x = EnumValueMapping{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[42] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[43] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3254,7 +3300,7 @@ func (x *EnumValueMapping) String() string { func (*EnumValueMapping) ProtoMessage() {} func (x *EnumValueMapping) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[42] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[43] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3267,7 +3313,7 @@ func (x *EnumValueMapping) ProtoReflect() protoreflect.Message { // Deprecated: Use EnumValueMapping.ProtoReflect.Descriptor instead. func (*EnumValueMapping) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{42} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{43} } func (x *EnumValueMapping) GetOriginal() string { @@ -3295,7 +3341,7 @@ type NatsStreamConfiguration struct { func (x *NatsStreamConfiguration) Reset() { *x = NatsStreamConfiguration{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[43] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[44] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3307,7 +3353,7 @@ func (x *NatsStreamConfiguration) String() string { func (*NatsStreamConfiguration) ProtoMessage() {} func (x *NatsStreamConfiguration) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[43] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[44] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3320,7 +3366,7 @@ func (x *NatsStreamConfiguration) ProtoReflect() protoreflect.Message { // Deprecated: Use NatsStreamConfiguration.ProtoReflect.Descriptor instead. func (*NatsStreamConfiguration) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{43} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{44} } func (x *NatsStreamConfiguration) GetConsumerName() string { @@ -3355,7 +3401,7 @@ type NatsEventConfiguration struct { func (x *NatsEventConfiguration) Reset() { *x = NatsEventConfiguration{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[44] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[45] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3367,7 +3413,7 @@ func (x *NatsEventConfiguration) String() string { func (*NatsEventConfiguration) ProtoMessage() {} func (x *NatsEventConfiguration) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[44] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[45] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3380,7 +3426,7 @@ func (x *NatsEventConfiguration) ProtoReflect() protoreflect.Message { // Deprecated: Use NatsEventConfiguration.ProtoReflect.Descriptor instead. func (*NatsEventConfiguration) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{44} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{45} } func (x *NatsEventConfiguration) GetEngineEventConfiguration() *EngineEventConfiguration { @@ -3414,7 +3460,7 @@ type KafkaEventConfiguration struct { func (x *KafkaEventConfiguration) Reset() { *x = KafkaEventConfiguration{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[45] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[46] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3426,7 +3472,7 @@ func (x *KafkaEventConfiguration) String() string { func (*KafkaEventConfiguration) ProtoMessage() {} func (x *KafkaEventConfiguration) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[45] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[46] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3439,7 +3485,7 @@ func (x *KafkaEventConfiguration) ProtoReflect() protoreflect.Message { // Deprecated: Use KafkaEventConfiguration.ProtoReflect.Descriptor instead. func (*KafkaEventConfiguration) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{45} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{46} } func (x *KafkaEventConfiguration) GetEngineEventConfiguration() *EngineEventConfiguration { @@ -3466,7 +3512,7 @@ type RedisEventConfiguration struct { func (x *RedisEventConfiguration) Reset() { *x = RedisEventConfiguration{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[46] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[47] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3478,7 +3524,7 @@ func (x *RedisEventConfiguration) String() string { func (*RedisEventConfiguration) ProtoMessage() {} func (x *RedisEventConfiguration) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[46] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[47] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3491,7 +3537,7 @@ func (x *RedisEventConfiguration) ProtoReflect() protoreflect.Message { // Deprecated: Use RedisEventConfiguration.ProtoReflect.Descriptor instead. func (*RedisEventConfiguration) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{46} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{47} } func (x *RedisEventConfiguration) GetEngineEventConfiguration() *EngineEventConfiguration { @@ -3520,7 +3566,7 @@ type EngineEventConfiguration struct { func (x *EngineEventConfiguration) Reset() { *x = EngineEventConfiguration{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[47] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[48] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3532,7 +3578,7 @@ func (x *EngineEventConfiguration) String() string { func (*EngineEventConfiguration) ProtoMessage() {} func (x *EngineEventConfiguration) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[47] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[48] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3545,7 +3591,7 @@ func (x *EngineEventConfiguration) ProtoReflect() protoreflect.Message { // Deprecated: Use EngineEventConfiguration.ProtoReflect.Descriptor instead. func (*EngineEventConfiguration) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{47} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{48} } func (x *EngineEventConfiguration) GetProviderId() string { @@ -3587,7 +3633,7 @@ type DataSourceCustomEvents struct { func (x *DataSourceCustomEvents) Reset() { *x = DataSourceCustomEvents{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[48] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[49] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3599,7 +3645,7 @@ func (x *DataSourceCustomEvents) String() string { func (*DataSourceCustomEvents) ProtoMessage() {} func (x *DataSourceCustomEvents) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[48] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[49] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3612,7 +3658,7 @@ func (x *DataSourceCustomEvents) ProtoReflect() protoreflect.Message { // Deprecated: Use DataSourceCustomEvents.ProtoReflect.Descriptor instead. func (*DataSourceCustomEvents) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{48} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{49} } func (x *DataSourceCustomEvents) GetNats() []*NatsEventConfiguration { @@ -3645,7 +3691,7 @@ type DataSourceCustom_Static struct { func (x *DataSourceCustom_Static) Reset() { *x = DataSourceCustom_Static{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[49] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[50] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3657,7 +3703,7 @@ func (x *DataSourceCustom_Static) String() string { func (*DataSourceCustom_Static) ProtoMessage() {} func (x *DataSourceCustom_Static) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[49] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[50] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3670,7 +3716,7 @@ func (x *DataSourceCustom_Static) ProtoReflect() protoreflect.Message { // Deprecated: Use DataSourceCustom_Static.ProtoReflect.Descriptor instead. func (*DataSourceCustom_Static) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{49} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{50} } func (x *DataSourceCustom_Static) GetData() *ConfigurationVariable { @@ -3693,7 +3739,7 @@ type ConfigurationVariable struct { func (x *ConfigurationVariable) Reset() { *x = ConfigurationVariable{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[50] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[51] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3705,7 +3751,7 @@ func (x *ConfigurationVariable) String() string { func (*ConfigurationVariable) ProtoMessage() {} func (x *ConfigurationVariable) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[50] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[51] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3718,7 +3764,7 @@ func (x *ConfigurationVariable) ProtoReflect() protoreflect.Message { // Deprecated: Use ConfigurationVariable.ProtoReflect.Descriptor instead. func (*ConfigurationVariable) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{50} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{51} } func (x *ConfigurationVariable) GetKind() ConfigurationVariableKind { @@ -3766,7 +3812,7 @@ type DirectiveConfiguration struct { func (x *DirectiveConfiguration) Reset() { *x = DirectiveConfiguration{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[51] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[52] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3778,7 +3824,7 @@ func (x *DirectiveConfiguration) String() string { func (*DirectiveConfiguration) ProtoMessage() {} func (x *DirectiveConfiguration) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[51] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[52] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3791,7 +3837,7 @@ func (x *DirectiveConfiguration) ProtoReflect() protoreflect.Message { // Deprecated: Use DirectiveConfiguration.ProtoReflect.Descriptor instead. func (*DirectiveConfiguration) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{51} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{52} } func (x *DirectiveConfiguration) GetDirectiveName() string { @@ -3818,7 +3864,7 @@ type URLQueryConfiguration struct { func (x *URLQueryConfiguration) Reset() { *x = URLQueryConfiguration{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[52] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[53] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3830,7 +3876,7 @@ func (x *URLQueryConfiguration) String() string { func (*URLQueryConfiguration) ProtoMessage() {} func (x *URLQueryConfiguration) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[52] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[53] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3843,7 +3889,7 @@ func (x *URLQueryConfiguration) ProtoReflect() protoreflect.Message { // Deprecated: Use URLQueryConfiguration.ProtoReflect.Descriptor instead. func (*URLQueryConfiguration) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{52} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{53} } func (x *URLQueryConfiguration) GetName() string { @@ -3869,7 +3915,7 @@ type HTTPHeader struct { func (x *HTTPHeader) Reset() { *x = HTTPHeader{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[53] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[54] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3881,7 +3927,7 @@ func (x *HTTPHeader) String() string { func (*HTTPHeader) ProtoMessage() {} func (x *HTTPHeader) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[53] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[54] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3894,7 +3940,7 @@ func (x *HTTPHeader) ProtoReflect() protoreflect.Message { // Deprecated: Use HTTPHeader.ProtoReflect.Descriptor instead. func (*HTTPHeader) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{53} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{54} } func (x *HTTPHeader) GetValues() []*ConfigurationVariable { @@ -3915,7 +3961,7 @@ type MTLSConfiguration struct { func (x *MTLSConfiguration) Reset() { *x = MTLSConfiguration{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[54] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[55] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3927,7 +3973,7 @@ func (x *MTLSConfiguration) String() string { func (*MTLSConfiguration) ProtoMessage() {} func (x *MTLSConfiguration) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[54] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[55] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3940,7 +3986,7 @@ func (x *MTLSConfiguration) ProtoReflect() protoreflect.Message { // Deprecated: Use MTLSConfiguration.ProtoReflect.Descriptor instead. func (*MTLSConfiguration) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{54} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{55} } func (x *MTLSConfiguration) GetKey() *ConfigurationVariable { @@ -3978,7 +4024,7 @@ type GraphQLSubscriptionConfiguration struct { func (x *GraphQLSubscriptionConfiguration) Reset() { *x = GraphQLSubscriptionConfiguration{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[55] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[56] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3990,7 +4036,7 @@ func (x *GraphQLSubscriptionConfiguration) String() string { func (*GraphQLSubscriptionConfiguration) ProtoMessage() {} func (x *GraphQLSubscriptionConfiguration) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[55] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[56] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4003,7 +4049,7 @@ func (x *GraphQLSubscriptionConfiguration) ProtoReflect() protoreflect.Message { // Deprecated: Use GraphQLSubscriptionConfiguration.ProtoReflect.Descriptor instead. func (*GraphQLSubscriptionConfiguration) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{55} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{56} } func (x *GraphQLSubscriptionConfiguration) GetEnabled() bool { @@ -4051,7 +4097,7 @@ type GraphQLFederationConfiguration struct { func (x *GraphQLFederationConfiguration) Reset() { *x = GraphQLFederationConfiguration{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[56] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[57] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4063,7 +4109,7 @@ func (x *GraphQLFederationConfiguration) String() string { func (*GraphQLFederationConfiguration) ProtoMessage() {} func (x *GraphQLFederationConfiguration) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[56] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[57] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4076,7 +4122,7 @@ func (x *GraphQLFederationConfiguration) ProtoReflect() protoreflect.Message { // Deprecated: Use GraphQLFederationConfiguration.ProtoReflect.Descriptor instead. func (*GraphQLFederationConfiguration) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{56} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{57} } func (x *GraphQLFederationConfiguration) GetEnabled() bool { @@ -4103,7 +4149,7 @@ type InternedString struct { func (x *InternedString) Reset() { *x = InternedString{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[57] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[58] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4115,7 +4161,7 @@ func (x *InternedString) String() string { func (*InternedString) ProtoMessage() {} func (x *InternedString) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[57] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[58] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4128,7 +4174,7 @@ func (x *InternedString) ProtoReflect() protoreflect.Message { // Deprecated: Use InternedString.ProtoReflect.Descriptor instead. func (*InternedString) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{57} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{58} } func (x *InternedString) GetKey() string { @@ -4148,7 +4194,7 @@ type SingleTypeField struct { func (x *SingleTypeField) Reset() { *x = SingleTypeField{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[58] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[59] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4160,7 +4206,7 @@ func (x *SingleTypeField) String() string { func (*SingleTypeField) ProtoMessage() {} func (x *SingleTypeField) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[58] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[59] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4173,7 +4219,7 @@ func (x *SingleTypeField) ProtoReflect() protoreflect.Message { // Deprecated: Use SingleTypeField.ProtoReflect.Descriptor instead. func (*SingleTypeField) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{58} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{59} } func (x *SingleTypeField) GetTypeName() string { @@ -4200,7 +4246,7 @@ type SubscriptionFieldCondition struct { func (x *SubscriptionFieldCondition) Reset() { *x = SubscriptionFieldCondition{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[59] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[60] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4212,7 +4258,7 @@ func (x *SubscriptionFieldCondition) String() string { func (*SubscriptionFieldCondition) ProtoMessage() {} func (x *SubscriptionFieldCondition) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[59] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[60] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4225,7 +4271,7 @@ func (x *SubscriptionFieldCondition) ProtoReflect() protoreflect.Message { // Deprecated: Use SubscriptionFieldCondition.ProtoReflect.Descriptor instead. func (*SubscriptionFieldCondition) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{59} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{60} } func (x *SubscriptionFieldCondition) GetFieldPath() []string { @@ -4254,7 +4300,7 @@ type SubscriptionFilterCondition struct { func (x *SubscriptionFilterCondition) Reset() { *x = SubscriptionFilterCondition{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[60] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[61] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4266,7 +4312,7 @@ func (x *SubscriptionFilterCondition) String() string { func (*SubscriptionFilterCondition) ProtoMessage() {} func (x *SubscriptionFilterCondition) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[60] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[61] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4279,7 +4325,7 @@ func (x *SubscriptionFilterCondition) ProtoReflect() protoreflect.Message { // Deprecated: Use SubscriptionFilterCondition.ProtoReflect.Descriptor instead. func (*SubscriptionFilterCondition) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{60} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{61} } func (x *SubscriptionFilterCondition) GetAnd() []*SubscriptionFilterCondition { @@ -4319,7 +4365,7 @@ type CacheWarmerOperations struct { func (x *CacheWarmerOperations) Reset() { *x = CacheWarmerOperations{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[61] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[62] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4331,7 +4377,7 @@ func (x *CacheWarmerOperations) String() string { func (*CacheWarmerOperations) ProtoMessage() {} func (x *CacheWarmerOperations) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[61] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[62] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4344,7 +4390,7 @@ func (x *CacheWarmerOperations) ProtoReflect() protoreflect.Message { // Deprecated: Use CacheWarmerOperations.ProtoReflect.Descriptor instead. func (*CacheWarmerOperations) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{61} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{62} } func (x *CacheWarmerOperations) GetOperations() []*Operation { @@ -4364,7 +4410,7 @@ type Operation struct { func (x *Operation) Reset() { *x = Operation{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[62] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[63] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4376,7 +4422,7 @@ func (x *Operation) String() string { func (*Operation) ProtoMessage() {} func (x *Operation) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[62] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[63] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4389,7 +4435,7 @@ func (x *Operation) ProtoReflect() protoreflect.Message { // Deprecated: Use Operation.ProtoReflect.Descriptor instead. func (*Operation) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{62} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{63} } func (x *Operation) GetRequest() *OperationRequest { @@ -4417,7 +4463,7 @@ type OperationRequest struct { func (x *OperationRequest) Reset() { *x = OperationRequest{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[63] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[64] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4429,7 +4475,7 @@ func (x *OperationRequest) String() string { func (*OperationRequest) ProtoMessage() {} func (x *OperationRequest) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[63] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[64] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4442,7 +4488,7 @@ func (x *OperationRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use OperationRequest.ProtoReflect.Descriptor instead. func (*OperationRequest) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{63} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{64} } func (x *OperationRequest) GetOperationName() string { @@ -4475,7 +4521,7 @@ type Extension struct { func (x *Extension) Reset() { *x = Extension{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[64] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[65] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4487,7 +4533,7 @@ func (x *Extension) String() string { func (*Extension) ProtoMessage() {} func (x *Extension) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[64] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[65] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4500,7 +4546,7 @@ func (x *Extension) ProtoReflect() protoreflect.Message { // Deprecated: Use Extension.ProtoReflect.Descriptor instead. func (*Extension) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{64} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{65} } func (x *Extension) GetPersistedQuery() *PersistedQuery { @@ -4520,7 +4566,7 @@ type PersistedQuery struct { func (x *PersistedQuery) Reset() { *x = PersistedQuery{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[65] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[66] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4532,7 +4578,7 @@ func (x *PersistedQuery) String() string { func (*PersistedQuery) ProtoMessage() {} func (x *PersistedQuery) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[65] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[66] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4545,7 +4591,7 @@ func (x *PersistedQuery) ProtoReflect() protoreflect.Message { // Deprecated: Use PersistedQuery.ProtoReflect.Descriptor instead. func (*PersistedQuery) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{65} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{66} } func (x *PersistedQuery) GetSha256Hash() string { @@ -4572,7 +4618,7 @@ type ClientInfo struct { func (x *ClientInfo) Reset() { *x = ClientInfo{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[66] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[67] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4584,7 +4630,7 @@ func (x *ClientInfo) String() string { func (*ClientInfo) ProtoMessage() {} func (x *ClientInfo) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[66] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[67] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4597,7 +4643,7 @@ func (x *ClientInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use ClientInfo.ProtoReflect.Descriptor instead. func (*ClientInfo) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{66} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{67} } func (x *ClientInfo) GetName() string { @@ -4639,7 +4685,12 @@ const file_wg_cosmo_node_v1_node_proto_rawDesc = "" + "\tsubgraphs\x18\x03 \x03(\v2\x1a.wg.cosmo.node.v1.SubgraphR\tsubgraphs\x12j\n" + "\x14feature_flag_configs\x18\x04 \x01(\v23.wg.cosmo.node.v1.FeatureFlagRouterExecutionConfigsH\x00R\x12featureFlagConfigs\x88\x01\x01\x123\n" + "\x15compatibility_version\x18\x05 \x01(\tR\x14compatibilityVersionB\x17\n" + - "\x15_feature_flag_configs\"j\n" + + "\x15_feature_flag_configs\"\xa5\x01\n" + + "\fActiveGraphs\x12T\n" + + "\fgraphConfigs\x18\x01 \x03(\v20.wg.cosmo.node.v1.ActiveGraphs.GraphConfigsEntryR\fgraphConfigs\x1a?\n" + + "\x11GraphConfigsEntry\x12\x10\n" + + "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + + "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\"j\n" + "\bResponse\x123\n" + "\x04code\x18\x01 \x01(\x0e2\x1f.wg.cosmo.common.EnumStatusCodeR\x04code\x12\x1d\n" + "\adetails\x18\x02 \x01(\tH\x00R\adetails\x88\x01\x01B\n" + @@ -5030,7 +5081,7 @@ func file_wg_cosmo_node_v1_node_proto_rawDescGZIP() []byte { } var file_wg_cosmo_node_v1_node_proto_enumTypes = make([]protoimpl.EnumInfo, 8) -var file_wg_cosmo_node_v1_node_proto_msgTypes = make([]protoimpl.MessageInfo, 74) +var file_wg_cosmo_node_v1_node_proto_msgTypes = make([]protoimpl.MessageInfo, 76) var file_wg_cosmo_node_v1_node_proto_goTypes = []any{ (ArgumentRenderConfiguration)(0), // 0: wg.cosmo.node.v1.ArgumentRenderConfiguration (ArgumentSource)(0), // 1: wg.cosmo.node.v1.ArgumentSource @@ -5044,188 +5095,191 @@ var file_wg_cosmo_node_v1_node_proto_goTypes = []any{ (*FeatureFlagRouterExecutionConfigs)(nil), // 9: wg.cosmo.node.v1.FeatureFlagRouterExecutionConfigs (*FeatureFlagRouterExecutionConfig)(nil), // 10: wg.cosmo.node.v1.FeatureFlagRouterExecutionConfig (*RouterConfig)(nil), // 11: wg.cosmo.node.v1.RouterConfig - (*Response)(nil), // 12: wg.cosmo.node.v1.Response - (*ResponseStatus)(nil), // 13: wg.cosmo.node.v1.ResponseStatus - (*RegistrationInfo)(nil), // 14: wg.cosmo.node.v1.RegistrationInfo - (*AccountLimits)(nil), // 15: wg.cosmo.node.v1.AccountLimits - (*SelfRegisterRequest)(nil), // 16: wg.cosmo.node.v1.SelfRegisterRequest - (*SelfRegisterResponse)(nil), // 17: wg.cosmo.node.v1.SelfRegisterResponse - (*EngineConfiguration)(nil), // 18: wg.cosmo.node.v1.EngineConfiguration - (*DataSourceConfiguration)(nil), // 19: wg.cosmo.node.v1.DataSourceConfiguration - (*CostConfiguration)(nil), // 20: wg.cosmo.node.v1.CostConfiguration - (*FieldWeightConfiguration)(nil), // 21: wg.cosmo.node.v1.FieldWeightConfiguration - (*FieldListSizeConfiguration)(nil), // 22: wg.cosmo.node.v1.FieldListSizeConfiguration - (*ArgumentConfiguration)(nil), // 23: wg.cosmo.node.v1.ArgumentConfiguration - (*Scopes)(nil), // 24: wg.cosmo.node.v1.Scopes - (*AuthorizationConfiguration)(nil), // 25: wg.cosmo.node.v1.AuthorizationConfiguration - (*FieldConfiguration)(nil), // 26: wg.cosmo.node.v1.FieldConfiguration - (*TypeConfiguration)(nil), // 27: wg.cosmo.node.v1.TypeConfiguration - (*TypeField)(nil), // 28: wg.cosmo.node.v1.TypeField - (*FieldCoordinates)(nil), // 29: wg.cosmo.node.v1.FieldCoordinates - (*FieldSetCondition)(nil), // 30: wg.cosmo.node.v1.FieldSetCondition - (*RequiredField)(nil), // 31: wg.cosmo.node.v1.RequiredField - (*EntityInterfaceConfiguration)(nil), // 32: wg.cosmo.node.v1.EntityInterfaceConfiguration - (*FetchConfiguration)(nil), // 33: wg.cosmo.node.v1.FetchConfiguration - (*StatusCodeTypeMapping)(nil), // 34: wg.cosmo.node.v1.StatusCodeTypeMapping - (*DataSourceCustom_GraphQL)(nil), // 35: wg.cosmo.node.v1.DataSourceCustom_GraphQL - (*GRPCConfiguration)(nil), // 36: wg.cosmo.node.v1.GRPCConfiguration - (*ImageReference)(nil), // 37: wg.cosmo.node.v1.ImageReference - (*PluginConfiguration)(nil), // 38: wg.cosmo.node.v1.PluginConfiguration - (*SSLConfiguration)(nil), // 39: wg.cosmo.node.v1.SSLConfiguration - (*GRPCMapping)(nil), // 40: wg.cosmo.node.v1.GRPCMapping - (*LookupMapping)(nil), // 41: wg.cosmo.node.v1.LookupMapping - (*LookupFieldMapping)(nil), // 42: wg.cosmo.node.v1.LookupFieldMapping - (*OperationMapping)(nil), // 43: wg.cosmo.node.v1.OperationMapping - (*EntityMapping)(nil), // 44: wg.cosmo.node.v1.EntityMapping - (*RequiredFieldMapping)(nil), // 45: wg.cosmo.node.v1.RequiredFieldMapping - (*TypeFieldMapping)(nil), // 46: wg.cosmo.node.v1.TypeFieldMapping - (*FieldMapping)(nil), // 47: wg.cosmo.node.v1.FieldMapping - (*ArgumentMapping)(nil), // 48: wg.cosmo.node.v1.ArgumentMapping - (*EnumMapping)(nil), // 49: wg.cosmo.node.v1.EnumMapping - (*EnumValueMapping)(nil), // 50: wg.cosmo.node.v1.EnumValueMapping - (*NatsStreamConfiguration)(nil), // 51: wg.cosmo.node.v1.NatsStreamConfiguration - (*NatsEventConfiguration)(nil), // 52: wg.cosmo.node.v1.NatsEventConfiguration - (*KafkaEventConfiguration)(nil), // 53: wg.cosmo.node.v1.KafkaEventConfiguration - (*RedisEventConfiguration)(nil), // 54: wg.cosmo.node.v1.RedisEventConfiguration - (*EngineEventConfiguration)(nil), // 55: wg.cosmo.node.v1.EngineEventConfiguration - (*DataSourceCustomEvents)(nil), // 56: wg.cosmo.node.v1.DataSourceCustomEvents - (*DataSourceCustom_Static)(nil), // 57: wg.cosmo.node.v1.DataSourceCustom_Static - (*ConfigurationVariable)(nil), // 58: wg.cosmo.node.v1.ConfigurationVariable - (*DirectiveConfiguration)(nil), // 59: wg.cosmo.node.v1.DirectiveConfiguration - (*URLQueryConfiguration)(nil), // 60: wg.cosmo.node.v1.URLQueryConfiguration - (*HTTPHeader)(nil), // 61: wg.cosmo.node.v1.HTTPHeader - (*MTLSConfiguration)(nil), // 62: wg.cosmo.node.v1.MTLSConfiguration - (*GraphQLSubscriptionConfiguration)(nil), // 63: wg.cosmo.node.v1.GraphQLSubscriptionConfiguration - (*GraphQLFederationConfiguration)(nil), // 64: wg.cosmo.node.v1.GraphQLFederationConfiguration - (*InternedString)(nil), // 65: wg.cosmo.node.v1.InternedString - (*SingleTypeField)(nil), // 66: wg.cosmo.node.v1.SingleTypeField - (*SubscriptionFieldCondition)(nil), // 67: wg.cosmo.node.v1.SubscriptionFieldCondition - (*SubscriptionFilterCondition)(nil), // 68: wg.cosmo.node.v1.SubscriptionFilterCondition - (*CacheWarmerOperations)(nil), // 69: wg.cosmo.node.v1.CacheWarmerOperations - (*Operation)(nil), // 70: wg.cosmo.node.v1.Operation - (*OperationRequest)(nil), // 71: wg.cosmo.node.v1.OperationRequest - (*Extension)(nil), // 72: wg.cosmo.node.v1.Extension - (*PersistedQuery)(nil), // 73: wg.cosmo.node.v1.PersistedQuery - (*ClientInfo)(nil), // 74: wg.cosmo.node.v1.ClientInfo - nil, // 75: wg.cosmo.node.v1.FeatureFlagRouterExecutionConfigs.ConfigByFeatureFlagNameEntry - nil, // 76: wg.cosmo.node.v1.EngineConfiguration.StringStorageEntry - nil, // 77: wg.cosmo.node.v1.CostConfiguration.TypeWeightsEntry - nil, // 78: wg.cosmo.node.v1.CostConfiguration.DirectiveArgumentWeightsEntry - nil, // 79: wg.cosmo.node.v1.FieldWeightConfiguration.ArgumentWeightsEntry - nil, // 80: wg.cosmo.node.v1.FieldWeightConfiguration.DirectiveArgumentWeightsEntry - nil, // 81: wg.cosmo.node.v1.FetchConfiguration.HeaderEntry - (common.EnumStatusCode)(0), // 82: wg.cosmo.common.EnumStatusCode - (common.GraphQLSubscriptionProtocol)(0), // 83: wg.cosmo.common.GraphQLSubscriptionProtocol - (common.GraphQLWebsocketSubprotocol)(0), // 84: wg.cosmo.common.GraphQLWebsocketSubprotocol + (*ActiveGraphs)(nil), // 12: wg.cosmo.node.v1.ActiveGraphs + (*Response)(nil), // 13: wg.cosmo.node.v1.Response + (*ResponseStatus)(nil), // 14: wg.cosmo.node.v1.ResponseStatus + (*RegistrationInfo)(nil), // 15: wg.cosmo.node.v1.RegistrationInfo + (*AccountLimits)(nil), // 16: wg.cosmo.node.v1.AccountLimits + (*SelfRegisterRequest)(nil), // 17: wg.cosmo.node.v1.SelfRegisterRequest + (*SelfRegisterResponse)(nil), // 18: wg.cosmo.node.v1.SelfRegisterResponse + (*EngineConfiguration)(nil), // 19: wg.cosmo.node.v1.EngineConfiguration + (*DataSourceConfiguration)(nil), // 20: wg.cosmo.node.v1.DataSourceConfiguration + (*CostConfiguration)(nil), // 21: wg.cosmo.node.v1.CostConfiguration + (*FieldWeightConfiguration)(nil), // 22: wg.cosmo.node.v1.FieldWeightConfiguration + (*FieldListSizeConfiguration)(nil), // 23: wg.cosmo.node.v1.FieldListSizeConfiguration + (*ArgumentConfiguration)(nil), // 24: wg.cosmo.node.v1.ArgumentConfiguration + (*Scopes)(nil), // 25: wg.cosmo.node.v1.Scopes + (*AuthorizationConfiguration)(nil), // 26: wg.cosmo.node.v1.AuthorizationConfiguration + (*FieldConfiguration)(nil), // 27: wg.cosmo.node.v1.FieldConfiguration + (*TypeConfiguration)(nil), // 28: wg.cosmo.node.v1.TypeConfiguration + (*TypeField)(nil), // 29: wg.cosmo.node.v1.TypeField + (*FieldCoordinates)(nil), // 30: wg.cosmo.node.v1.FieldCoordinates + (*FieldSetCondition)(nil), // 31: wg.cosmo.node.v1.FieldSetCondition + (*RequiredField)(nil), // 32: wg.cosmo.node.v1.RequiredField + (*EntityInterfaceConfiguration)(nil), // 33: wg.cosmo.node.v1.EntityInterfaceConfiguration + (*FetchConfiguration)(nil), // 34: wg.cosmo.node.v1.FetchConfiguration + (*StatusCodeTypeMapping)(nil), // 35: wg.cosmo.node.v1.StatusCodeTypeMapping + (*DataSourceCustom_GraphQL)(nil), // 36: wg.cosmo.node.v1.DataSourceCustom_GraphQL + (*GRPCConfiguration)(nil), // 37: wg.cosmo.node.v1.GRPCConfiguration + (*ImageReference)(nil), // 38: wg.cosmo.node.v1.ImageReference + (*PluginConfiguration)(nil), // 39: wg.cosmo.node.v1.PluginConfiguration + (*SSLConfiguration)(nil), // 40: wg.cosmo.node.v1.SSLConfiguration + (*GRPCMapping)(nil), // 41: wg.cosmo.node.v1.GRPCMapping + (*LookupMapping)(nil), // 42: wg.cosmo.node.v1.LookupMapping + (*LookupFieldMapping)(nil), // 43: wg.cosmo.node.v1.LookupFieldMapping + (*OperationMapping)(nil), // 44: wg.cosmo.node.v1.OperationMapping + (*EntityMapping)(nil), // 45: wg.cosmo.node.v1.EntityMapping + (*RequiredFieldMapping)(nil), // 46: wg.cosmo.node.v1.RequiredFieldMapping + (*TypeFieldMapping)(nil), // 47: wg.cosmo.node.v1.TypeFieldMapping + (*FieldMapping)(nil), // 48: wg.cosmo.node.v1.FieldMapping + (*ArgumentMapping)(nil), // 49: wg.cosmo.node.v1.ArgumentMapping + (*EnumMapping)(nil), // 50: wg.cosmo.node.v1.EnumMapping + (*EnumValueMapping)(nil), // 51: wg.cosmo.node.v1.EnumValueMapping + (*NatsStreamConfiguration)(nil), // 52: wg.cosmo.node.v1.NatsStreamConfiguration + (*NatsEventConfiguration)(nil), // 53: wg.cosmo.node.v1.NatsEventConfiguration + (*KafkaEventConfiguration)(nil), // 54: wg.cosmo.node.v1.KafkaEventConfiguration + (*RedisEventConfiguration)(nil), // 55: wg.cosmo.node.v1.RedisEventConfiguration + (*EngineEventConfiguration)(nil), // 56: wg.cosmo.node.v1.EngineEventConfiguration + (*DataSourceCustomEvents)(nil), // 57: wg.cosmo.node.v1.DataSourceCustomEvents + (*DataSourceCustom_Static)(nil), // 58: wg.cosmo.node.v1.DataSourceCustom_Static + (*ConfigurationVariable)(nil), // 59: wg.cosmo.node.v1.ConfigurationVariable + (*DirectiveConfiguration)(nil), // 60: wg.cosmo.node.v1.DirectiveConfiguration + (*URLQueryConfiguration)(nil), // 61: wg.cosmo.node.v1.URLQueryConfiguration + (*HTTPHeader)(nil), // 62: wg.cosmo.node.v1.HTTPHeader + (*MTLSConfiguration)(nil), // 63: wg.cosmo.node.v1.MTLSConfiguration + (*GraphQLSubscriptionConfiguration)(nil), // 64: wg.cosmo.node.v1.GraphQLSubscriptionConfiguration + (*GraphQLFederationConfiguration)(nil), // 65: wg.cosmo.node.v1.GraphQLFederationConfiguration + (*InternedString)(nil), // 66: wg.cosmo.node.v1.InternedString + (*SingleTypeField)(nil), // 67: wg.cosmo.node.v1.SingleTypeField + (*SubscriptionFieldCondition)(nil), // 68: wg.cosmo.node.v1.SubscriptionFieldCondition + (*SubscriptionFilterCondition)(nil), // 69: wg.cosmo.node.v1.SubscriptionFilterCondition + (*CacheWarmerOperations)(nil), // 70: wg.cosmo.node.v1.CacheWarmerOperations + (*Operation)(nil), // 71: wg.cosmo.node.v1.Operation + (*OperationRequest)(nil), // 72: wg.cosmo.node.v1.OperationRequest + (*Extension)(nil), // 73: wg.cosmo.node.v1.Extension + (*PersistedQuery)(nil), // 74: wg.cosmo.node.v1.PersistedQuery + (*ClientInfo)(nil), // 75: wg.cosmo.node.v1.ClientInfo + nil, // 76: wg.cosmo.node.v1.FeatureFlagRouterExecutionConfigs.ConfigByFeatureFlagNameEntry + nil, // 77: wg.cosmo.node.v1.ActiveGraphs.GraphConfigsEntry + nil, // 78: wg.cosmo.node.v1.EngineConfiguration.StringStorageEntry + nil, // 79: wg.cosmo.node.v1.CostConfiguration.TypeWeightsEntry + nil, // 80: wg.cosmo.node.v1.CostConfiguration.DirectiveArgumentWeightsEntry + nil, // 81: wg.cosmo.node.v1.FieldWeightConfiguration.ArgumentWeightsEntry + nil, // 82: wg.cosmo.node.v1.FieldWeightConfiguration.DirectiveArgumentWeightsEntry + nil, // 83: wg.cosmo.node.v1.FetchConfiguration.HeaderEntry + (common.EnumStatusCode)(0), // 84: wg.cosmo.common.EnumStatusCode + (common.GraphQLSubscriptionProtocol)(0), // 85: wg.cosmo.common.GraphQLSubscriptionProtocol + (common.GraphQLWebsocketSubprotocol)(0), // 86: wg.cosmo.common.GraphQLWebsocketSubprotocol } var file_wg_cosmo_node_v1_node_proto_depIdxs = []int32{ - 75, // 0: wg.cosmo.node.v1.FeatureFlagRouterExecutionConfigs.config_by_feature_flag_name:type_name -> wg.cosmo.node.v1.FeatureFlagRouterExecutionConfigs.ConfigByFeatureFlagNameEntry - 18, // 1: wg.cosmo.node.v1.FeatureFlagRouterExecutionConfig.engine_config:type_name -> wg.cosmo.node.v1.EngineConfiguration + 76, // 0: wg.cosmo.node.v1.FeatureFlagRouterExecutionConfigs.config_by_feature_flag_name:type_name -> wg.cosmo.node.v1.FeatureFlagRouterExecutionConfigs.ConfigByFeatureFlagNameEntry + 19, // 1: wg.cosmo.node.v1.FeatureFlagRouterExecutionConfig.engine_config:type_name -> wg.cosmo.node.v1.EngineConfiguration 8, // 2: wg.cosmo.node.v1.FeatureFlagRouterExecutionConfig.subgraphs:type_name -> wg.cosmo.node.v1.Subgraph - 18, // 3: wg.cosmo.node.v1.RouterConfig.engine_config:type_name -> wg.cosmo.node.v1.EngineConfiguration + 19, // 3: wg.cosmo.node.v1.RouterConfig.engine_config:type_name -> wg.cosmo.node.v1.EngineConfiguration 8, // 4: wg.cosmo.node.v1.RouterConfig.subgraphs:type_name -> wg.cosmo.node.v1.Subgraph 9, // 5: wg.cosmo.node.v1.RouterConfig.feature_flag_configs:type_name -> wg.cosmo.node.v1.FeatureFlagRouterExecutionConfigs - 82, // 6: wg.cosmo.node.v1.Response.code:type_name -> wg.cosmo.common.EnumStatusCode - 15, // 7: wg.cosmo.node.v1.RegistrationInfo.account_limits:type_name -> wg.cosmo.node.v1.AccountLimits - 12, // 8: wg.cosmo.node.v1.SelfRegisterResponse.response:type_name -> wg.cosmo.node.v1.Response - 14, // 9: wg.cosmo.node.v1.SelfRegisterResponse.registrationInfo:type_name -> wg.cosmo.node.v1.RegistrationInfo - 19, // 10: wg.cosmo.node.v1.EngineConfiguration.datasource_configurations:type_name -> wg.cosmo.node.v1.DataSourceConfiguration - 26, // 11: wg.cosmo.node.v1.EngineConfiguration.field_configurations:type_name -> wg.cosmo.node.v1.FieldConfiguration - 27, // 12: wg.cosmo.node.v1.EngineConfiguration.type_configurations:type_name -> wg.cosmo.node.v1.TypeConfiguration - 76, // 13: wg.cosmo.node.v1.EngineConfiguration.string_storage:type_name -> wg.cosmo.node.v1.EngineConfiguration.StringStorageEntry - 2, // 14: wg.cosmo.node.v1.DataSourceConfiguration.kind:type_name -> wg.cosmo.node.v1.DataSourceKind - 28, // 15: wg.cosmo.node.v1.DataSourceConfiguration.root_nodes:type_name -> wg.cosmo.node.v1.TypeField - 28, // 16: wg.cosmo.node.v1.DataSourceConfiguration.child_nodes:type_name -> wg.cosmo.node.v1.TypeField - 35, // 17: wg.cosmo.node.v1.DataSourceConfiguration.custom_graphql:type_name -> wg.cosmo.node.v1.DataSourceCustom_GraphQL - 57, // 18: wg.cosmo.node.v1.DataSourceConfiguration.custom_static:type_name -> wg.cosmo.node.v1.DataSourceCustom_Static - 59, // 19: wg.cosmo.node.v1.DataSourceConfiguration.directives:type_name -> wg.cosmo.node.v1.DirectiveConfiguration - 31, // 20: wg.cosmo.node.v1.DataSourceConfiguration.keys:type_name -> wg.cosmo.node.v1.RequiredField - 31, // 21: wg.cosmo.node.v1.DataSourceConfiguration.provides:type_name -> wg.cosmo.node.v1.RequiredField - 31, // 22: wg.cosmo.node.v1.DataSourceConfiguration.requires:type_name -> wg.cosmo.node.v1.RequiredField - 56, // 23: wg.cosmo.node.v1.DataSourceConfiguration.custom_events:type_name -> wg.cosmo.node.v1.DataSourceCustomEvents - 32, // 24: wg.cosmo.node.v1.DataSourceConfiguration.entity_interfaces:type_name -> wg.cosmo.node.v1.EntityInterfaceConfiguration - 32, // 25: wg.cosmo.node.v1.DataSourceConfiguration.interface_objects:type_name -> wg.cosmo.node.v1.EntityInterfaceConfiguration - 20, // 26: wg.cosmo.node.v1.DataSourceConfiguration.cost_configuration:type_name -> wg.cosmo.node.v1.CostConfiguration - 21, // 27: wg.cosmo.node.v1.CostConfiguration.field_weights:type_name -> wg.cosmo.node.v1.FieldWeightConfiguration - 22, // 28: wg.cosmo.node.v1.CostConfiguration.list_sizes:type_name -> wg.cosmo.node.v1.FieldListSizeConfiguration - 77, // 29: wg.cosmo.node.v1.CostConfiguration.type_weights:type_name -> wg.cosmo.node.v1.CostConfiguration.TypeWeightsEntry - 78, // 30: wg.cosmo.node.v1.CostConfiguration.directive_argument_weights:type_name -> wg.cosmo.node.v1.CostConfiguration.DirectiveArgumentWeightsEntry - 79, // 31: wg.cosmo.node.v1.FieldWeightConfiguration.argument_weights:type_name -> wg.cosmo.node.v1.FieldWeightConfiguration.ArgumentWeightsEntry - 80, // 32: wg.cosmo.node.v1.FieldWeightConfiguration.directive_argument_weights:type_name -> wg.cosmo.node.v1.FieldWeightConfiguration.DirectiveArgumentWeightsEntry - 1, // 33: wg.cosmo.node.v1.ArgumentConfiguration.source_type:type_name -> wg.cosmo.node.v1.ArgumentSource - 24, // 34: wg.cosmo.node.v1.AuthorizationConfiguration.required_or_scopes:type_name -> wg.cosmo.node.v1.Scopes - 24, // 35: wg.cosmo.node.v1.AuthorizationConfiguration.required_or_scopes_by_or:type_name -> wg.cosmo.node.v1.Scopes - 23, // 36: wg.cosmo.node.v1.FieldConfiguration.arguments_configuration:type_name -> wg.cosmo.node.v1.ArgumentConfiguration - 25, // 37: wg.cosmo.node.v1.FieldConfiguration.authorization_configuration:type_name -> wg.cosmo.node.v1.AuthorizationConfiguration - 68, // 38: wg.cosmo.node.v1.FieldConfiguration.subscription_filter_condition:type_name -> wg.cosmo.node.v1.SubscriptionFilterCondition - 29, // 39: wg.cosmo.node.v1.FieldSetCondition.field_coordinates_path:type_name -> wg.cosmo.node.v1.FieldCoordinates - 30, // 40: wg.cosmo.node.v1.RequiredField.conditions:type_name -> wg.cosmo.node.v1.FieldSetCondition - 58, // 41: wg.cosmo.node.v1.FetchConfiguration.url:type_name -> wg.cosmo.node.v1.ConfigurationVariable - 7, // 42: wg.cosmo.node.v1.FetchConfiguration.method:type_name -> wg.cosmo.node.v1.HTTPMethod - 81, // 43: wg.cosmo.node.v1.FetchConfiguration.header:type_name -> wg.cosmo.node.v1.FetchConfiguration.HeaderEntry - 58, // 44: wg.cosmo.node.v1.FetchConfiguration.body:type_name -> wg.cosmo.node.v1.ConfigurationVariable - 60, // 45: wg.cosmo.node.v1.FetchConfiguration.query:type_name -> wg.cosmo.node.v1.URLQueryConfiguration - 62, // 46: wg.cosmo.node.v1.FetchConfiguration.mtls:type_name -> wg.cosmo.node.v1.MTLSConfiguration - 58, // 47: wg.cosmo.node.v1.FetchConfiguration.base_url:type_name -> wg.cosmo.node.v1.ConfigurationVariable - 58, // 48: wg.cosmo.node.v1.FetchConfiguration.path:type_name -> wg.cosmo.node.v1.ConfigurationVariable - 58, // 49: wg.cosmo.node.v1.FetchConfiguration.http_proxy_url:type_name -> wg.cosmo.node.v1.ConfigurationVariable - 33, // 50: wg.cosmo.node.v1.DataSourceCustom_GraphQL.fetch:type_name -> wg.cosmo.node.v1.FetchConfiguration - 63, // 51: wg.cosmo.node.v1.DataSourceCustom_GraphQL.subscription:type_name -> wg.cosmo.node.v1.GraphQLSubscriptionConfiguration - 64, // 52: wg.cosmo.node.v1.DataSourceCustom_GraphQL.federation:type_name -> wg.cosmo.node.v1.GraphQLFederationConfiguration - 65, // 53: wg.cosmo.node.v1.DataSourceCustom_GraphQL.upstream_schema:type_name -> wg.cosmo.node.v1.InternedString - 66, // 54: wg.cosmo.node.v1.DataSourceCustom_GraphQL.custom_scalar_type_fields:type_name -> wg.cosmo.node.v1.SingleTypeField - 36, // 55: wg.cosmo.node.v1.DataSourceCustom_GraphQL.grpc:type_name -> wg.cosmo.node.v1.GRPCConfiguration - 40, // 56: wg.cosmo.node.v1.GRPCConfiguration.mapping:type_name -> wg.cosmo.node.v1.GRPCMapping - 38, // 57: wg.cosmo.node.v1.GRPCConfiguration.plugin:type_name -> wg.cosmo.node.v1.PluginConfiguration - 37, // 58: wg.cosmo.node.v1.PluginConfiguration.image_reference:type_name -> wg.cosmo.node.v1.ImageReference - 43, // 59: wg.cosmo.node.v1.GRPCMapping.operation_mappings:type_name -> wg.cosmo.node.v1.OperationMapping - 44, // 60: wg.cosmo.node.v1.GRPCMapping.entity_mappings:type_name -> wg.cosmo.node.v1.EntityMapping - 46, // 61: wg.cosmo.node.v1.GRPCMapping.type_field_mappings:type_name -> wg.cosmo.node.v1.TypeFieldMapping - 49, // 62: wg.cosmo.node.v1.GRPCMapping.enum_mappings:type_name -> wg.cosmo.node.v1.EnumMapping - 41, // 63: wg.cosmo.node.v1.GRPCMapping.resolve_mappings:type_name -> wg.cosmo.node.v1.LookupMapping - 3, // 64: wg.cosmo.node.v1.LookupMapping.type:type_name -> wg.cosmo.node.v1.LookupType - 42, // 65: wg.cosmo.node.v1.LookupMapping.lookup_mapping:type_name -> wg.cosmo.node.v1.LookupFieldMapping - 47, // 66: wg.cosmo.node.v1.LookupFieldMapping.field_mapping:type_name -> wg.cosmo.node.v1.FieldMapping - 4, // 67: wg.cosmo.node.v1.OperationMapping.type:type_name -> wg.cosmo.node.v1.OperationType - 45, // 68: wg.cosmo.node.v1.EntityMapping.required_field_mappings:type_name -> wg.cosmo.node.v1.RequiredFieldMapping - 47, // 69: wg.cosmo.node.v1.RequiredFieldMapping.field_mapping:type_name -> wg.cosmo.node.v1.FieldMapping - 47, // 70: wg.cosmo.node.v1.TypeFieldMapping.field_mappings:type_name -> wg.cosmo.node.v1.FieldMapping - 48, // 71: wg.cosmo.node.v1.FieldMapping.argument_mappings:type_name -> wg.cosmo.node.v1.ArgumentMapping - 50, // 72: wg.cosmo.node.v1.EnumMapping.values:type_name -> wg.cosmo.node.v1.EnumValueMapping - 55, // 73: wg.cosmo.node.v1.NatsEventConfiguration.engine_event_configuration:type_name -> wg.cosmo.node.v1.EngineEventConfiguration - 51, // 74: wg.cosmo.node.v1.NatsEventConfiguration.stream_configuration:type_name -> wg.cosmo.node.v1.NatsStreamConfiguration - 55, // 75: wg.cosmo.node.v1.KafkaEventConfiguration.engine_event_configuration:type_name -> wg.cosmo.node.v1.EngineEventConfiguration - 55, // 76: wg.cosmo.node.v1.RedisEventConfiguration.engine_event_configuration:type_name -> wg.cosmo.node.v1.EngineEventConfiguration - 5, // 77: wg.cosmo.node.v1.EngineEventConfiguration.type:type_name -> wg.cosmo.node.v1.EventType - 52, // 78: wg.cosmo.node.v1.DataSourceCustomEvents.nats:type_name -> wg.cosmo.node.v1.NatsEventConfiguration - 53, // 79: wg.cosmo.node.v1.DataSourceCustomEvents.kafka:type_name -> wg.cosmo.node.v1.KafkaEventConfiguration - 54, // 80: wg.cosmo.node.v1.DataSourceCustomEvents.redis:type_name -> wg.cosmo.node.v1.RedisEventConfiguration - 58, // 81: wg.cosmo.node.v1.DataSourceCustom_Static.data:type_name -> wg.cosmo.node.v1.ConfigurationVariable - 6, // 82: wg.cosmo.node.v1.ConfigurationVariable.kind:type_name -> wg.cosmo.node.v1.ConfigurationVariableKind - 58, // 83: wg.cosmo.node.v1.HTTPHeader.values:type_name -> wg.cosmo.node.v1.ConfigurationVariable - 58, // 84: wg.cosmo.node.v1.MTLSConfiguration.key:type_name -> wg.cosmo.node.v1.ConfigurationVariable - 58, // 85: wg.cosmo.node.v1.MTLSConfiguration.cert:type_name -> wg.cosmo.node.v1.ConfigurationVariable - 58, // 86: wg.cosmo.node.v1.GraphQLSubscriptionConfiguration.url:type_name -> wg.cosmo.node.v1.ConfigurationVariable - 83, // 87: wg.cosmo.node.v1.GraphQLSubscriptionConfiguration.protocol:type_name -> wg.cosmo.common.GraphQLSubscriptionProtocol - 84, // 88: wg.cosmo.node.v1.GraphQLSubscriptionConfiguration.websocketSubprotocol:type_name -> wg.cosmo.common.GraphQLWebsocketSubprotocol - 68, // 89: wg.cosmo.node.v1.SubscriptionFilterCondition.and:type_name -> wg.cosmo.node.v1.SubscriptionFilterCondition - 67, // 90: wg.cosmo.node.v1.SubscriptionFilterCondition.in:type_name -> wg.cosmo.node.v1.SubscriptionFieldCondition - 68, // 91: wg.cosmo.node.v1.SubscriptionFilterCondition.not:type_name -> wg.cosmo.node.v1.SubscriptionFilterCondition - 68, // 92: wg.cosmo.node.v1.SubscriptionFilterCondition.or:type_name -> wg.cosmo.node.v1.SubscriptionFilterCondition - 70, // 93: wg.cosmo.node.v1.CacheWarmerOperations.operations:type_name -> wg.cosmo.node.v1.Operation - 71, // 94: wg.cosmo.node.v1.Operation.request:type_name -> wg.cosmo.node.v1.OperationRequest - 74, // 95: wg.cosmo.node.v1.Operation.client:type_name -> wg.cosmo.node.v1.ClientInfo - 72, // 96: wg.cosmo.node.v1.OperationRequest.extensions:type_name -> wg.cosmo.node.v1.Extension - 73, // 97: wg.cosmo.node.v1.Extension.persisted_query:type_name -> wg.cosmo.node.v1.PersistedQuery - 10, // 98: wg.cosmo.node.v1.FeatureFlagRouterExecutionConfigs.ConfigByFeatureFlagNameEntry.value:type_name -> wg.cosmo.node.v1.FeatureFlagRouterExecutionConfig - 61, // 99: wg.cosmo.node.v1.FetchConfiguration.HeaderEntry.value:type_name -> wg.cosmo.node.v1.HTTPHeader - 16, // 100: wg.cosmo.node.v1.NodeService.SelfRegister:input_type -> wg.cosmo.node.v1.SelfRegisterRequest - 17, // 101: wg.cosmo.node.v1.NodeService.SelfRegister:output_type -> wg.cosmo.node.v1.SelfRegisterResponse - 101, // [101:102] is the sub-list for method output_type - 100, // [100:101] is the sub-list for method input_type - 100, // [100:100] is the sub-list for extension type_name - 100, // [100:100] is the sub-list for extension extendee - 0, // [0:100] is the sub-list for field type_name + 77, // 6: wg.cosmo.node.v1.ActiveGraphs.graphConfigs:type_name -> wg.cosmo.node.v1.ActiveGraphs.GraphConfigsEntry + 84, // 7: wg.cosmo.node.v1.Response.code:type_name -> wg.cosmo.common.EnumStatusCode + 16, // 8: wg.cosmo.node.v1.RegistrationInfo.account_limits:type_name -> wg.cosmo.node.v1.AccountLimits + 13, // 9: wg.cosmo.node.v1.SelfRegisterResponse.response:type_name -> wg.cosmo.node.v1.Response + 15, // 10: wg.cosmo.node.v1.SelfRegisterResponse.registrationInfo:type_name -> wg.cosmo.node.v1.RegistrationInfo + 20, // 11: wg.cosmo.node.v1.EngineConfiguration.datasource_configurations:type_name -> wg.cosmo.node.v1.DataSourceConfiguration + 27, // 12: wg.cosmo.node.v1.EngineConfiguration.field_configurations:type_name -> wg.cosmo.node.v1.FieldConfiguration + 28, // 13: wg.cosmo.node.v1.EngineConfiguration.type_configurations:type_name -> wg.cosmo.node.v1.TypeConfiguration + 78, // 14: wg.cosmo.node.v1.EngineConfiguration.string_storage:type_name -> wg.cosmo.node.v1.EngineConfiguration.StringStorageEntry + 2, // 15: wg.cosmo.node.v1.DataSourceConfiguration.kind:type_name -> wg.cosmo.node.v1.DataSourceKind + 29, // 16: wg.cosmo.node.v1.DataSourceConfiguration.root_nodes:type_name -> wg.cosmo.node.v1.TypeField + 29, // 17: wg.cosmo.node.v1.DataSourceConfiguration.child_nodes:type_name -> wg.cosmo.node.v1.TypeField + 36, // 18: wg.cosmo.node.v1.DataSourceConfiguration.custom_graphql:type_name -> wg.cosmo.node.v1.DataSourceCustom_GraphQL + 58, // 19: wg.cosmo.node.v1.DataSourceConfiguration.custom_static:type_name -> wg.cosmo.node.v1.DataSourceCustom_Static + 60, // 20: wg.cosmo.node.v1.DataSourceConfiguration.directives:type_name -> wg.cosmo.node.v1.DirectiveConfiguration + 32, // 21: wg.cosmo.node.v1.DataSourceConfiguration.keys:type_name -> wg.cosmo.node.v1.RequiredField + 32, // 22: wg.cosmo.node.v1.DataSourceConfiguration.provides:type_name -> wg.cosmo.node.v1.RequiredField + 32, // 23: wg.cosmo.node.v1.DataSourceConfiguration.requires:type_name -> wg.cosmo.node.v1.RequiredField + 57, // 24: wg.cosmo.node.v1.DataSourceConfiguration.custom_events:type_name -> wg.cosmo.node.v1.DataSourceCustomEvents + 33, // 25: wg.cosmo.node.v1.DataSourceConfiguration.entity_interfaces:type_name -> wg.cosmo.node.v1.EntityInterfaceConfiguration + 33, // 26: wg.cosmo.node.v1.DataSourceConfiguration.interface_objects:type_name -> wg.cosmo.node.v1.EntityInterfaceConfiguration + 21, // 27: wg.cosmo.node.v1.DataSourceConfiguration.cost_configuration:type_name -> wg.cosmo.node.v1.CostConfiguration + 22, // 28: wg.cosmo.node.v1.CostConfiguration.field_weights:type_name -> wg.cosmo.node.v1.FieldWeightConfiguration + 23, // 29: wg.cosmo.node.v1.CostConfiguration.list_sizes:type_name -> wg.cosmo.node.v1.FieldListSizeConfiguration + 79, // 30: wg.cosmo.node.v1.CostConfiguration.type_weights:type_name -> wg.cosmo.node.v1.CostConfiguration.TypeWeightsEntry + 80, // 31: wg.cosmo.node.v1.CostConfiguration.directive_argument_weights:type_name -> wg.cosmo.node.v1.CostConfiguration.DirectiveArgumentWeightsEntry + 81, // 32: wg.cosmo.node.v1.FieldWeightConfiguration.argument_weights:type_name -> wg.cosmo.node.v1.FieldWeightConfiguration.ArgumentWeightsEntry + 82, // 33: wg.cosmo.node.v1.FieldWeightConfiguration.directive_argument_weights:type_name -> wg.cosmo.node.v1.FieldWeightConfiguration.DirectiveArgumentWeightsEntry + 1, // 34: wg.cosmo.node.v1.ArgumentConfiguration.source_type:type_name -> wg.cosmo.node.v1.ArgumentSource + 25, // 35: wg.cosmo.node.v1.AuthorizationConfiguration.required_or_scopes:type_name -> wg.cosmo.node.v1.Scopes + 25, // 36: wg.cosmo.node.v1.AuthorizationConfiguration.required_or_scopes_by_or:type_name -> wg.cosmo.node.v1.Scopes + 24, // 37: wg.cosmo.node.v1.FieldConfiguration.arguments_configuration:type_name -> wg.cosmo.node.v1.ArgumentConfiguration + 26, // 38: wg.cosmo.node.v1.FieldConfiguration.authorization_configuration:type_name -> wg.cosmo.node.v1.AuthorizationConfiguration + 69, // 39: wg.cosmo.node.v1.FieldConfiguration.subscription_filter_condition:type_name -> wg.cosmo.node.v1.SubscriptionFilterCondition + 30, // 40: wg.cosmo.node.v1.FieldSetCondition.field_coordinates_path:type_name -> wg.cosmo.node.v1.FieldCoordinates + 31, // 41: wg.cosmo.node.v1.RequiredField.conditions:type_name -> wg.cosmo.node.v1.FieldSetCondition + 59, // 42: wg.cosmo.node.v1.FetchConfiguration.url:type_name -> wg.cosmo.node.v1.ConfigurationVariable + 7, // 43: wg.cosmo.node.v1.FetchConfiguration.method:type_name -> wg.cosmo.node.v1.HTTPMethod + 83, // 44: wg.cosmo.node.v1.FetchConfiguration.header:type_name -> wg.cosmo.node.v1.FetchConfiguration.HeaderEntry + 59, // 45: wg.cosmo.node.v1.FetchConfiguration.body:type_name -> wg.cosmo.node.v1.ConfigurationVariable + 61, // 46: wg.cosmo.node.v1.FetchConfiguration.query:type_name -> wg.cosmo.node.v1.URLQueryConfiguration + 63, // 47: wg.cosmo.node.v1.FetchConfiguration.mtls:type_name -> wg.cosmo.node.v1.MTLSConfiguration + 59, // 48: wg.cosmo.node.v1.FetchConfiguration.base_url:type_name -> wg.cosmo.node.v1.ConfigurationVariable + 59, // 49: wg.cosmo.node.v1.FetchConfiguration.path:type_name -> wg.cosmo.node.v1.ConfigurationVariable + 59, // 50: wg.cosmo.node.v1.FetchConfiguration.http_proxy_url:type_name -> wg.cosmo.node.v1.ConfigurationVariable + 34, // 51: wg.cosmo.node.v1.DataSourceCustom_GraphQL.fetch:type_name -> wg.cosmo.node.v1.FetchConfiguration + 64, // 52: wg.cosmo.node.v1.DataSourceCustom_GraphQL.subscription:type_name -> wg.cosmo.node.v1.GraphQLSubscriptionConfiguration + 65, // 53: wg.cosmo.node.v1.DataSourceCustom_GraphQL.federation:type_name -> wg.cosmo.node.v1.GraphQLFederationConfiguration + 66, // 54: wg.cosmo.node.v1.DataSourceCustom_GraphQL.upstream_schema:type_name -> wg.cosmo.node.v1.InternedString + 67, // 55: wg.cosmo.node.v1.DataSourceCustom_GraphQL.custom_scalar_type_fields:type_name -> wg.cosmo.node.v1.SingleTypeField + 37, // 56: wg.cosmo.node.v1.DataSourceCustom_GraphQL.grpc:type_name -> wg.cosmo.node.v1.GRPCConfiguration + 41, // 57: wg.cosmo.node.v1.GRPCConfiguration.mapping:type_name -> wg.cosmo.node.v1.GRPCMapping + 39, // 58: wg.cosmo.node.v1.GRPCConfiguration.plugin:type_name -> wg.cosmo.node.v1.PluginConfiguration + 38, // 59: wg.cosmo.node.v1.PluginConfiguration.image_reference:type_name -> wg.cosmo.node.v1.ImageReference + 44, // 60: wg.cosmo.node.v1.GRPCMapping.operation_mappings:type_name -> wg.cosmo.node.v1.OperationMapping + 45, // 61: wg.cosmo.node.v1.GRPCMapping.entity_mappings:type_name -> wg.cosmo.node.v1.EntityMapping + 47, // 62: wg.cosmo.node.v1.GRPCMapping.type_field_mappings:type_name -> wg.cosmo.node.v1.TypeFieldMapping + 50, // 63: wg.cosmo.node.v1.GRPCMapping.enum_mappings:type_name -> wg.cosmo.node.v1.EnumMapping + 42, // 64: wg.cosmo.node.v1.GRPCMapping.resolve_mappings:type_name -> wg.cosmo.node.v1.LookupMapping + 3, // 65: wg.cosmo.node.v1.LookupMapping.type:type_name -> wg.cosmo.node.v1.LookupType + 43, // 66: wg.cosmo.node.v1.LookupMapping.lookup_mapping:type_name -> wg.cosmo.node.v1.LookupFieldMapping + 48, // 67: wg.cosmo.node.v1.LookupFieldMapping.field_mapping:type_name -> wg.cosmo.node.v1.FieldMapping + 4, // 68: wg.cosmo.node.v1.OperationMapping.type:type_name -> wg.cosmo.node.v1.OperationType + 46, // 69: wg.cosmo.node.v1.EntityMapping.required_field_mappings:type_name -> wg.cosmo.node.v1.RequiredFieldMapping + 48, // 70: wg.cosmo.node.v1.RequiredFieldMapping.field_mapping:type_name -> wg.cosmo.node.v1.FieldMapping + 48, // 71: wg.cosmo.node.v1.TypeFieldMapping.field_mappings:type_name -> wg.cosmo.node.v1.FieldMapping + 49, // 72: wg.cosmo.node.v1.FieldMapping.argument_mappings:type_name -> wg.cosmo.node.v1.ArgumentMapping + 51, // 73: wg.cosmo.node.v1.EnumMapping.values:type_name -> wg.cosmo.node.v1.EnumValueMapping + 56, // 74: wg.cosmo.node.v1.NatsEventConfiguration.engine_event_configuration:type_name -> wg.cosmo.node.v1.EngineEventConfiguration + 52, // 75: wg.cosmo.node.v1.NatsEventConfiguration.stream_configuration:type_name -> wg.cosmo.node.v1.NatsStreamConfiguration + 56, // 76: wg.cosmo.node.v1.KafkaEventConfiguration.engine_event_configuration:type_name -> wg.cosmo.node.v1.EngineEventConfiguration + 56, // 77: wg.cosmo.node.v1.RedisEventConfiguration.engine_event_configuration:type_name -> wg.cosmo.node.v1.EngineEventConfiguration + 5, // 78: wg.cosmo.node.v1.EngineEventConfiguration.type:type_name -> wg.cosmo.node.v1.EventType + 53, // 79: wg.cosmo.node.v1.DataSourceCustomEvents.nats:type_name -> wg.cosmo.node.v1.NatsEventConfiguration + 54, // 80: wg.cosmo.node.v1.DataSourceCustomEvents.kafka:type_name -> wg.cosmo.node.v1.KafkaEventConfiguration + 55, // 81: wg.cosmo.node.v1.DataSourceCustomEvents.redis:type_name -> wg.cosmo.node.v1.RedisEventConfiguration + 59, // 82: wg.cosmo.node.v1.DataSourceCustom_Static.data:type_name -> wg.cosmo.node.v1.ConfigurationVariable + 6, // 83: wg.cosmo.node.v1.ConfigurationVariable.kind:type_name -> wg.cosmo.node.v1.ConfigurationVariableKind + 59, // 84: wg.cosmo.node.v1.HTTPHeader.values:type_name -> wg.cosmo.node.v1.ConfigurationVariable + 59, // 85: wg.cosmo.node.v1.MTLSConfiguration.key:type_name -> wg.cosmo.node.v1.ConfigurationVariable + 59, // 86: wg.cosmo.node.v1.MTLSConfiguration.cert:type_name -> wg.cosmo.node.v1.ConfigurationVariable + 59, // 87: wg.cosmo.node.v1.GraphQLSubscriptionConfiguration.url:type_name -> wg.cosmo.node.v1.ConfigurationVariable + 85, // 88: wg.cosmo.node.v1.GraphQLSubscriptionConfiguration.protocol:type_name -> wg.cosmo.common.GraphQLSubscriptionProtocol + 86, // 89: wg.cosmo.node.v1.GraphQLSubscriptionConfiguration.websocketSubprotocol:type_name -> wg.cosmo.common.GraphQLWebsocketSubprotocol + 69, // 90: wg.cosmo.node.v1.SubscriptionFilterCondition.and:type_name -> wg.cosmo.node.v1.SubscriptionFilterCondition + 68, // 91: wg.cosmo.node.v1.SubscriptionFilterCondition.in:type_name -> wg.cosmo.node.v1.SubscriptionFieldCondition + 69, // 92: wg.cosmo.node.v1.SubscriptionFilterCondition.not:type_name -> wg.cosmo.node.v1.SubscriptionFilterCondition + 69, // 93: wg.cosmo.node.v1.SubscriptionFilterCondition.or:type_name -> wg.cosmo.node.v1.SubscriptionFilterCondition + 71, // 94: wg.cosmo.node.v1.CacheWarmerOperations.operations:type_name -> wg.cosmo.node.v1.Operation + 72, // 95: wg.cosmo.node.v1.Operation.request:type_name -> wg.cosmo.node.v1.OperationRequest + 75, // 96: wg.cosmo.node.v1.Operation.client:type_name -> wg.cosmo.node.v1.ClientInfo + 73, // 97: wg.cosmo.node.v1.OperationRequest.extensions:type_name -> wg.cosmo.node.v1.Extension + 74, // 98: wg.cosmo.node.v1.Extension.persisted_query:type_name -> wg.cosmo.node.v1.PersistedQuery + 10, // 99: wg.cosmo.node.v1.FeatureFlagRouterExecutionConfigs.ConfigByFeatureFlagNameEntry.value:type_name -> wg.cosmo.node.v1.FeatureFlagRouterExecutionConfig + 62, // 100: wg.cosmo.node.v1.FetchConfiguration.HeaderEntry.value:type_name -> wg.cosmo.node.v1.HTTPHeader + 17, // 101: wg.cosmo.node.v1.NodeService.SelfRegister:input_type -> wg.cosmo.node.v1.SelfRegisterRequest + 18, // 102: wg.cosmo.node.v1.NodeService.SelfRegister:output_type -> wg.cosmo.node.v1.SelfRegisterResponse + 102, // [102:103] is the sub-list for method output_type + 101, // [101:102] is the sub-list for method input_type + 101, // [101:101] is the sub-list for extension type_name + 101, // [101:101] is the sub-list for extension extendee + 0, // [0:101] is the sub-list for field type_name } func init() { file_wg_cosmo_node_v1_node_proto_init() } @@ -5234,23 +5288,23 @@ func file_wg_cosmo_node_v1_node_proto_init() { return } file_wg_cosmo_node_v1_node_proto_msgTypes[3].OneofWrappers = []any{} - file_wg_cosmo_node_v1_node_proto_msgTypes[4].OneofWrappers = []any{} - file_wg_cosmo_node_v1_node_proto_msgTypes[9].OneofWrappers = []any{} + file_wg_cosmo_node_v1_node_proto_msgTypes[5].OneofWrappers = []any{} file_wg_cosmo_node_v1_node_proto_msgTypes[10].OneofWrappers = []any{} - file_wg_cosmo_node_v1_node_proto_msgTypes[13].OneofWrappers = []any{} + file_wg_cosmo_node_v1_node_proto_msgTypes[11].OneofWrappers = []any{} file_wg_cosmo_node_v1_node_proto_msgTypes[14].OneofWrappers = []any{} - file_wg_cosmo_node_v1_node_proto_msgTypes[18].OneofWrappers = []any{} - file_wg_cosmo_node_v1_node_proto_msgTypes[25].OneofWrappers = []any{} - file_wg_cosmo_node_v1_node_proto_msgTypes[30].OneofWrappers = []any{} - file_wg_cosmo_node_v1_node_proto_msgTypes[55].OneofWrappers = []any{} - file_wg_cosmo_node_v1_node_proto_msgTypes[60].OneofWrappers = []any{} + file_wg_cosmo_node_v1_node_proto_msgTypes[15].OneofWrappers = []any{} + file_wg_cosmo_node_v1_node_proto_msgTypes[19].OneofWrappers = []any{} + file_wg_cosmo_node_v1_node_proto_msgTypes[26].OneofWrappers = []any{} + file_wg_cosmo_node_v1_node_proto_msgTypes[31].OneofWrappers = []any{} + file_wg_cosmo_node_v1_node_proto_msgTypes[56].OneofWrappers = []any{} + file_wg_cosmo_node_v1_node_proto_msgTypes[61].OneofWrappers = []any{} type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: unsafe.Slice(unsafe.StringData(file_wg_cosmo_node_v1_node_proto_rawDesc), len(file_wg_cosmo_node_v1_node_proto_rawDesc)), NumEnums: 8, - NumMessages: 74, + NumMessages: 76, NumExtensions: 0, NumServices: 1, }, diff --git a/connect/src/wg/cosmo/node/v1/node_pb.ts b/connect/src/wg/cosmo/node/v1/node_pb.ts index b50794f361..e109a08ab4 100644 --- a/connect/src/wg/cosmo/node/v1/node_pb.ts +++ b/connect/src/wg/cosmo/node/v1/node_pb.ts @@ -441,6 +441,46 @@ export class RouterConfig extends Message { } } +/** + * @generated from message wg.cosmo.node.v1.ActiveGraphs + */ +export class ActiveGraphs extends Message { + /** + * key = feature flag name, empty means base graph + * value = hash of engine_config + * + * @generated from field: map graphConfigs = 1; + */ + graphConfigs: { [key: string]: string } = {}; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "wg.cosmo.node.v1.ActiveGraphs"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "graphConfigs", kind: "map", K: 9 /* ScalarType.STRING */, V: {kind: "scalar", T: 9 /* ScalarType.STRING */} }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): ActiveGraphs { + return new ActiveGraphs().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): ActiveGraphs { + return new ActiveGraphs().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): ActiveGraphs { + return new ActiveGraphs().fromJsonString(jsonString, options); + } + + static equals(a: ActiveGraphs | PlainMessage | undefined, b: ActiveGraphs | PlainMessage | undefined): boolean { + return proto3.util.equals(ActiveGraphs, a, b); + } +} + /** * @generated from message wg.cosmo.node.v1.Response */ diff --git a/proto/wg/cosmo/node/v1/node.proto b/proto/wg/cosmo/node/v1/node.proto index af7bd79bb4..314615363d 100644 --- a/proto/wg/cosmo/node/v1/node.proto +++ b/proto/wg/cosmo/node/v1/node.proto @@ -29,6 +29,12 @@ message RouterConfig { string compatibility_version = 5; } +message ActiveGraphs { + // key = feature flag name, empty means base graph + // value = hash of engine_config + map graphConfigs = 1; +} + message Response { wg.cosmo.common.EnumStatusCode code = 1; // details is an optional field which can be used to provide more details about the error. diff --git a/router/gen/proto/wg/cosmo/node/v1/node.pb.go b/router/gen/proto/wg/cosmo/node/v1/node.pb.go index 0384fac5a6..a6bcd937fc 100644 --- a/router/gen/proto/wg/cosmo/node/v1/node.pb.go +++ b/router/gen/proto/wg/cosmo/node/v1/node.pb.go @@ -669,6 +669,52 @@ func (x *RouterConfig) GetCompatibilityVersion() string { return "" } +type ActiveGraphs struct { + state protoimpl.MessageState `protogen:"open.v1"` + // key = feature flag name, empty means base graph + // value = hash of engine_config + GraphConfigs map[string]string `protobuf:"bytes,1,rep,name=graphConfigs,proto3" json:"graphConfigs,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ActiveGraphs) Reset() { + *x = ActiveGraphs{} + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ActiveGraphs) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ActiveGraphs) ProtoMessage() {} + +func (x *ActiveGraphs) ProtoReflect() protoreflect.Message { + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[4] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ActiveGraphs.ProtoReflect.Descriptor instead. +func (*ActiveGraphs) Descriptor() ([]byte, []int) { + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{4} +} + +func (x *ActiveGraphs) GetGraphConfigs() map[string]string { + if x != nil { + return x.GraphConfigs + } + return nil +} + type Response struct { state protoimpl.MessageState `protogen:"open.v1"` Code common.EnumStatusCode `protobuf:"varint,1,opt,name=code,proto3,enum=wg.cosmo.common.EnumStatusCode" json:"code,omitempty"` @@ -680,7 +726,7 @@ type Response struct { func (x *Response) Reset() { *x = Response{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[4] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[5] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -692,7 +738,7 @@ func (x *Response) String() string { func (*Response) ProtoMessage() {} func (x *Response) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[4] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[5] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -705,7 +751,7 @@ func (x *Response) ProtoReflect() protoreflect.Message { // Deprecated: Use Response.ProtoReflect.Descriptor instead. func (*Response) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{4} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{5} } func (x *Response) GetCode() common.EnumStatusCode { @@ -732,7 +778,7 @@ type ResponseStatus struct { func (x *ResponseStatus) Reset() { *x = ResponseStatus{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[5] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -744,7 +790,7 @@ func (x *ResponseStatus) String() string { func (*ResponseStatus) ProtoMessage() {} func (x *ResponseStatus) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[5] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[6] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -757,7 +803,7 @@ func (x *ResponseStatus) ProtoReflect() protoreflect.Message { // Deprecated: Use ResponseStatus.ProtoReflect.Descriptor instead. func (*ResponseStatus) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{5} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{6} } func (x *ResponseStatus) GetCode() int32 { @@ -784,7 +830,7 @@ type RegistrationInfo struct { func (x *RegistrationInfo) Reset() { *x = RegistrationInfo{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[6] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -796,7 +842,7 @@ func (x *RegistrationInfo) String() string { func (*RegistrationInfo) ProtoMessage() {} func (x *RegistrationInfo) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[6] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[7] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -809,7 +855,7 @@ func (x *RegistrationInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use RegistrationInfo.ProtoReflect.Descriptor instead. func (*RegistrationInfo) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{6} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{7} } func (x *RegistrationInfo) GetAccountLimits() *AccountLimits { @@ -837,7 +883,7 @@ type AccountLimits struct { func (x *AccountLimits) Reset() { *x = AccountLimits{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[7] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -849,7 +895,7 @@ func (x *AccountLimits) String() string { func (*AccountLimits) ProtoMessage() {} func (x *AccountLimits) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[7] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[8] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -862,7 +908,7 @@ func (x *AccountLimits) ProtoReflect() protoreflect.Message { // Deprecated: Use AccountLimits.ProtoReflect.Descriptor instead. func (*AccountLimits) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{7} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{8} } func (x *AccountLimits) GetTraceSamplingRate() float32 { @@ -880,7 +926,7 @@ type SelfRegisterRequest struct { func (x *SelfRegisterRequest) Reset() { *x = SelfRegisterRequest{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[8] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -892,7 +938,7 @@ func (x *SelfRegisterRequest) String() string { func (*SelfRegisterRequest) ProtoMessage() {} func (x *SelfRegisterRequest) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[8] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[9] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -905,7 +951,7 @@ func (x *SelfRegisterRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SelfRegisterRequest.ProtoReflect.Descriptor instead. func (*SelfRegisterRequest) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{8} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{9} } type SelfRegisterResponse struct { @@ -918,7 +964,7 @@ type SelfRegisterResponse struct { func (x *SelfRegisterResponse) Reset() { *x = SelfRegisterResponse{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[9] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -930,7 +976,7 @@ func (x *SelfRegisterResponse) String() string { func (*SelfRegisterResponse) ProtoMessage() {} func (x *SelfRegisterResponse) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[9] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[10] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -943,7 +989,7 @@ func (x *SelfRegisterResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use SelfRegisterResponse.ProtoReflect.Descriptor instead. func (*SelfRegisterResponse) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{9} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{10} } func (x *SelfRegisterResponse) GetResponse() *Response { @@ -975,7 +1021,7 @@ type EngineConfiguration struct { func (x *EngineConfiguration) Reset() { *x = EngineConfiguration{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[10] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -987,7 +1033,7 @@ func (x *EngineConfiguration) String() string { func (*EngineConfiguration) ProtoMessage() {} func (x *EngineConfiguration) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[10] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[11] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1000,7 +1046,7 @@ func (x *EngineConfiguration) ProtoReflect() protoreflect.Message { // Deprecated: Use EngineConfiguration.ProtoReflect.Descriptor instead. func (*EngineConfiguration) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{10} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{11} } func (x *EngineConfiguration) GetDefaultFlushInterval() int64 { @@ -1076,7 +1122,7 @@ type DataSourceConfiguration struct { func (x *DataSourceConfiguration) Reset() { *x = DataSourceConfiguration{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[11] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1088,7 +1134,7 @@ func (x *DataSourceConfiguration) String() string { func (*DataSourceConfiguration) ProtoMessage() {} func (x *DataSourceConfiguration) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[11] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[12] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1101,7 +1147,7 @@ func (x *DataSourceConfiguration) ProtoReflect() protoreflect.Message { // Deprecated: Use DataSourceConfiguration.ProtoReflect.Descriptor instead. func (*DataSourceConfiguration) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{11} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{12} } func (x *DataSourceConfiguration) GetKind() DataSourceKind { @@ -1228,7 +1274,7 @@ type CostConfiguration struct { func (x *CostConfiguration) Reset() { *x = CostConfiguration{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[12] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1240,7 +1286,7 @@ func (x *CostConfiguration) String() string { func (*CostConfiguration) ProtoMessage() {} func (x *CostConfiguration) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[12] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[13] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1253,7 +1299,7 @@ func (x *CostConfiguration) ProtoReflect() protoreflect.Message { // Deprecated: Use CostConfiguration.ProtoReflect.Descriptor instead. func (*CostConfiguration) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{12} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{13} } func (x *CostConfiguration) GetFieldWeights() []*FieldWeightConfiguration { @@ -1297,7 +1343,7 @@ type FieldWeightConfiguration struct { func (x *FieldWeightConfiguration) Reset() { *x = FieldWeightConfiguration{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[13] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1309,7 +1355,7 @@ func (x *FieldWeightConfiguration) String() string { func (*FieldWeightConfiguration) ProtoMessage() {} func (x *FieldWeightConfiguration) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[13] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[14] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1322,7 +1368,7 @@ func (x *FieldWeightConfiguration) ProtoReflect() protoreflect.Message { // Deprecated: Use FieldWeightConfiguration.ProtoReflect.Descriptor instead. func (*FieldWeightConfiguration) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{13} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{14} } func (x *FieldWeightConfiguration) GetTypeName() string { @@ -1374,7 +1420,7 @@ type FieldListSizeConfiguration struct { func (x *FieldListSizeConfiguration) Reset() { *x = FieldListSizeConfiguration{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[14] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[15] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1386,7 +1432,7 @@ func (x *FieldListSizeConfiguration) String() string { func (*FieldListSizeConfiguration) ProtoMessage() {} func (x *FieldListSizeConfiguration) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[14] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[15] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1399,7 +1445,7 @@ func (x *FieldListSizeConfiguration) ProtoReflect() protoreflect.Message { // Deprecated: Use FieldListSizeConfiguration.ProtoReflect.Descriptor instead. func (*FieldListSizeConfiguration) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{14} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{15} } func (x *FieldListSizeConfiguration) GetTypeName() string { @@ -1454,7 +1500,7 @@ type ArgumentConfiguration struct { func (x *ArgumentConfiguration) Reset() { *x = ArgumentConfiguration{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[15] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[16] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1466,7 +1512,7 @@ func (x *ArgumentConfiguration) String() string { func (*ArgumentConfiguration) ProtoMessage() {} func (x *ArgumentConfiguration) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[15] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[16] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1479,7 +1525,7 @@ func (x *ArgumentConfiguration) ProtoReflect() protoreflect.Message { // Deprecated: Use ArgumentConfiguration.ProtoReflect.Descriptor instead. func (*ArgumentConfiguration) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{15} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{16} } func (x *ArgumentConfiguration) GetName() string { @@ -1505,7 +1551,7 @@ type Scopes struct { func (x *Scopes) Reset() { *x = Scopes{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[16] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[17] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1517,7 +1563,7 @@ func (x *Scopes) String() string { func (*Scopes) ProtoMessage() {} func (x *Scopes) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[16] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[17] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1530,7 +1576,7 @@ func (x *Scopes) ProtoReflect() protoreflect.Message { // Deprecated: Use Scopes.ProtoReflect.Descriptor instead. func (*Scopes) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{16} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{17} } func (x *Scopes) GetRequiredAndScopes() []string { @@ -1551,7 +1597,7 @@ type AuthorizationConfiguration struct { func (x *AuthorizationConfiguration) Reset() { *x = AuthorizationConfiguration{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[17] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[18] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1563,7 +1609,7 @@ func (x *AuthorizationConfiguration) String() string { func (*AuthorizationConfiguration) ProtoMessage() {} func (x *AuthorizationConfiguration) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[17] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[18] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1576,7 +1622,7 @@ func (x *AuthorizationConfiguration) ProtoReflect() protoreflect.Message { // Deprecated: Use AuthorizationConfiguration.ProtoReflect.Descriptor instead. func (*AuthorizationConfiguration) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{17} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{18} } func (x *AuthorizationConfiguration) GetRequiresAuthentication() bool { @@ -1613,7 +1659,7 @@ type FieldConfiguration struct { func (x *FieldConfiguration) Reset() { *x = FieldConfiguration{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[18] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[19] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1625,7 +1671,7 @@ func (x *FieldConfiguration) String() string { func (*FieldConfiguration) ProtoMessage() {} func (x *FieldConfiguration) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[18] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[19] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1638,7 +1684,7 @@ func (x *FieldConfiguration) ProtoReflect() protoreflect.Message { // Deprecated: Use FieldConfiguration.ProtoReflect.Descriptor instead. func (*FieldConfiguration) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{18} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{19} } func (x *FieldConfiguration) GetTypeName() string { @@ -1686,7 +1732,7 @@ type TypeConfiguration struct { func (x *TypeConfiguration) Reset() { *x = TypeConfiguration{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[19] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[20] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1698,7 +1744,7 @@ func (x *TypeConfiguration) String() string { func (*TypeConfiguration) ProtoMessage() {} func (x *TypeConfiguration) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[19] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[20] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1711,7 +1757,7 @@ func (x *TypeConfiguration) ProtoReflect() protoreflect.Message { // Deprecated: Use TypeConfiguration.ProtoReflect.Descriptor instead. func (*TypeConfiguration) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{19} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{20} } func (x *TypeConfiguration) GetTypeName() string { @@ -1740,7 +1786,7 @@ type TypeField struct { func (x *TypeField) Reset() { *x = TypeField{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[20] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[21] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1752,7 +1798,7 @@ func (x *TypeField) String() string { func (*TypeField) ProtoMessage() {} func (x *TypeField) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[20] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[21] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1765,7 +1811,7 @@ func (x *TypeField) ProtoReflect() protoreflect.Message { // Deprecated: Use TypeField.ProtoReflect.Descriptor instead. func (*TypeField) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{20} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{21} } func (x *TypeField) GetTypeName() string { @@ -1806,7 +1852,7 @@ type FieldCoordinates struct { func (x *FieldCoordinates) Reset() { *x = FieldCoordinates{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[21] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[22] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1818,7 +1864,7 @@ func (x *FieldCoordinates) String() string { func (*FieldCoordinates) ProtoMessage() {} func (x *FieldCoordinates) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[21] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[22] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1831,7 +1877,7 @@ func (x *FieldCoordinates) ProtoReflect() protoreflect.Message { // Deprecated: Use FieldCoordinates.ProtoReflect.Descriptor instead. func (*FieldCoordinates) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{21} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{22} } func (x *FieldCoordinates) GetFieldName() string { @@ -1858,7 +1904,7 @@ type FieldSetCondition struct { func (x *FieldSetCondition) Reset() { *x = FieldSetCondition{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[22] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[23] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1870,7 +1916,7 @@ func (x *FieldSetCondition) String() string { func (*FieldSetCondition) ProtoMessage() {} func (x *FieldSetCondition) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[22] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[23] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1883,7 +1929,7 @@ func (x *FieldSetCondition) ProtoReflect() protoreflect.Message { // Deprecated: Use FieldSetCondition.ProtoReflect.Descriptor instead. func (*FieldSetCondition) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{22} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{23} } func (x *FieldSetCondition) GetFieldCoordinatesPath() []*FieldCoordinates { @@ -1913,7 +1959,7 @@ type RequiredField struct { func (x *RequiredField) Reset() { *x = RequiredField{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[23] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[24] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1925,7 +1971,7 @@ func (x *RequiredField) String() string { func (*RequiredField) ProtoMessage() {} func (x *RequiredField) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[23] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[24] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1938,7 +1984,7 @@ func (x *RequiredField) ProtoReflect() protoreflect.Message { // Deprecated: Use RequiredField.ProtoReflect.Descriptor instead. func (*RequiredField) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{23} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{24} } func (x *RequiredField) GetTypeName() string { @@ -1986,7 +2032,7 @@ type EntityInterfaceConfiguration struct { func (x *EntityInterfaceConfiguration) Reset() { *x = EntityInterfaceConfiguration{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[24] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[25] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1998,7 +2044,7 @@ func (x *EntityInterfaceConfiguration) String() string { func (*EntityInterfaceConfiguration) ProtoMessage() {} func (x *EntityInterfaceConfiguration) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[24] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[25] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2011,7 +2057,7 @@ func (x *EntityInterfaceConfiguration) ProtoReflect() protoreflect.Message { // Deprecated: Use EntityInterfaceConfiguration.ProtoReflect.Descriptor instead. func (*EntityInterfaceConfiguration) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{24} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{25} } func (x *EntityInterfaceConfiguration) GetInterfaceTypeName() string { @@ -2054,7 +2100,7 @@ type FetchConfiguration struct { func (x *FetchConfiguration) Reset() { *x = FetchConfiguration{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[25] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[26] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2066,7 +2112,7 @@ func (x *FetchConfiguration) String() string { func (*FetchConfiguration) ProtoMessage() {} func (x *FetchConfiguration) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[25] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[26] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2079,7 +2125,7 @@ func (x *FetchConfiguration) ProtoReflect() protoreflect.Message { // Deprecated: Use FetchConfiguration.ProtoReflect.Descriptor instead. func (*FetchConfiguration) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{25} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{26} } func (x *FetchConfiguration) GetUrl() *ConfigurationVariable { @@ -2163,7 +2209,7 @@ type StatusCodeTypeMapping struct { func (x *StatusCodeTypeMapping) Reset() { *x = StatusCodeTypeMapping{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[26] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[27] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2175,7 +2221,7 @@ func (x *StatusCodeTypeMapping) String() string { func (*StatusCodeTypeMapping) ProtoMessage() {} func (x *StatusCodeTypeMapping) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[26] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[27] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2188,7 +2234,7 @@ func (x *StatusCodeTypeMapping) ProtoReflect() protoreflect.Message { // Deprecated: Use StatusCodeTypeMapping.ProtoReflect.Descriptor instead. func (*StatusCodeTypeMapping) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{26} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{27} } func (x *StatusCodeTypeMapping) GetStatusCode() int64 { @@ -2226,7 +2272,7 @@ type DataSourceCustom_GraphQL struct { func (x *DataSourceCustom_GraphQL) Reset() { *x = DataSourceCustom_GraphQL{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[27] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[28] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2238,7 +2284,7 @@ func (x *DataSourceCustom_GraphQL) String() string { func (*DataSourceCustom_GraphQL) ProtoMessage() {} func (x *DataSourceCustom_GraphQL) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[27] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[28] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2251,7 +2297,7 @@ func (x *DataSourceCustom_GraphQL) ProtoReflect() protoreflect.Message { // Deprecated: Use DataSourceCustom_GraphQL.ProtoReflect.Descriptor instead. func (*DataSourceCustom_GraphQL) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{27} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{28} } func (x *DataSourceCustom_GraphQL) GetFetch() *FetchConfiguration { @@ -2307,7 +2353,7 @@ type GRPCConfiguration struct { func (x *GRPCConfiguration) Reset() { *x = GRPCConfiguration{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[28] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[29] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2319,7 +2365,7 @@ func (x *GRPCConfiguration) String() string { func (*GRPCConfiguration) ProtoMessage() {} func (x *GRPCConfiguration) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[28] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[29] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2332,7 +2378,7 @@ func (x *GRPCConfiguration) ProtoReflect() protoreflect.Message { // Deprecated: Use GRPCConfiguration.ProtoReflect.Descriptor instead. func (*GRPCConfiguration) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{28} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{29} } func (x *GRPCConfiguration) GetMapping() *GRPCMapping { @@ -2366,7 +2412,7 @@ type ImageReference struct { func (x *ImageReference) Reset() { *x = ImageReference{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[29] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[30] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2378,7 +2424,7 @@ func (x *ImageReference) String() string { func (*ImageReference) ProtoMessage() {} func (x *ImageReference) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[29] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[30] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2391,7 +2437,7 @@ func (x *ImageReference) ProtoReflect() protoreflect.Message { // Deprecated: Use ImageReference.ProtoReflect.Descriptor instead. func (*ImageReference) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{29} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{30} } func (x *ImageReference) GetRepository() string { @@ -2421,7 +2467,7 @@ type PluginConfiguration struct { func (x *PluginConfiguration) Reset() { *x = PluginConfiguration{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[30] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[31] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2433,7 +2479,7 @@ func (x *PluginConfiguration) String() string { func (*PluginConfiguration) ProtoMessage() {} func (x *PluginConfiguration) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[30] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[31] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2446,7 +2492,7 @@ func (x *PluginConfiguration) ProtoReflect() protoreflect.Message { // Deprecated: Use PluginConfiguration.ProtoReflect.Descriptor instead. func (*PluginConfiguration) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{30} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{31} } func (x *PluginConfiguration) GetName() string { @@ -2480,7 +2526,7 @@ type SSLConfiguration struct { func (x *SSLConfiguration) Reset() { *x = SSLConfiguration{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[31] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[32] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2492,7 +2538,7 @@ func (x *SSLConfiguration) String() string { func (*SSLConfiguration) ProtoMessage() {} func (x *SSLConfiguration) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[31] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[32] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2505,7 +2551,7 @@ func (x *SSLConfiguration) ProtoReflect() protoreflect.Message { // Deprecated: Use SSLConfiguration.ProtoReflect.Descriptor instead. func (*SSLConfiguration) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{31} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{32} } func (x *SSLConfiguration) GetEnabled() bool { @@ -2538,7 +2584,7 @@ type GRPCMapping struct { func (x *GRPCMapping) Reset() { *x = GRPCMapping{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[32] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[33] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2550,7 +2596,7 @@ func (x *GRPCMapping) String() string { func (*GRPCMapping) ProtoMessage() {} func (x *GRPCMapping) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[32] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[33] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2563,7 +2609,7 @@ func (x *GRPCMapping) ProtoReflect() protoreflect.Message { // Deprecated: Use GRPCMapping.ProtoReflect.Descriptor instead. func (*GRPCMapping) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{32} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{33} } func (x *GRPCMapping) GetVersion() int32 { @@ -2634,7 +2680,7 @@ type LookupMapping struct { func (x *LookupMapping) Reset() { *x = LookupMapping{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[33] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[34] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2646,7 +2692,7 @@ func (x *LookupMapping) String() string { func (*LookupMapping) ProtoMessage() {} func (x *LookupMapping) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[33] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[34] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2659,7 +2705,7 @@ func (x *LookupMapping) ProtoReflect() protoreflect.Message { // Deprecated: Use LookupMapping.ProtoReflect.Descriptor instead. func (*LookupMapping) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{33} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{34} } func (x *LookupMapping) GetType() LookupType { @@ -2710,7 +2756,7 @@ type LookupFieldMapping struct { func (x *LookupFieldMapping) Reset() { *x = LookupFieldMapping{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[34] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[35] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2722,7 +2768,7 @@ func (x *LookupFieldMapping) String() string { func (*LookupFieldMapping) ProtoMessage() {} func (x *LookupFieldMapping) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[34] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[35] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2735,7 +2781,7 @@ func (x *LookupFieldMapping) ProtoReflect() protoreflect.Message { // Deprecated: Use LookupFieldMapping.ProtoReflect.Descriptor instead. func (*LookupFieldMapping) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{34} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{35} } func (x *LookupFieldMapping) GetType() string { @@ -2771,7 +2817,7 @@ type OperationMapping struct { func (x *OperationMapping) Reset() { *x = OperationMapping{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[35] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[36] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2783,7 +2829,7 @@ func (x *OperationMapping) String() string { func (*OperationMapping) ProtoMessage() {} func (x *OperationMapping) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[35] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[36] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2796,7 +2842,7 @@ func (x *OperationMapping) ProtoReflect() protoreflect.Message { // Deprecated: Use OperationMapping.ProtoReflect.Descriptor instead. func (*OperationMapping) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{35} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{36} } func (x *OperationMapping) GetType() OperationType { @@ -2857,7 +2903,7 @@ type EntityMapping struct { func (x *EntityMapping) Reset() { *x = EntityMapping{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[36] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[37] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2869,7 +2915,7 @@ func (x *EntityMapping) String() string { func (*EntityMapping) ProtoMessage() {} func (x *EntityMapping) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[36] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[37] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2882,7 +2928,7 @@ func (x *EntityMapping) ProtoReflect() protoreflect.Message { // Deprecated: Use EntityMapping.ProtoReflect.Descriptor instead. func (*EntityMapping) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{36} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{37} } func (x *EntityMapping) GetTypeName() string { @@ -2950,7 +2996,7 @@ type RequiredFieldMapping struct { func (x *RequiredFieldMapping) Reset() { *x = RequiredFieldMapping{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[37] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[38] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2962,7 +3008,7 @@ func (x *RequiredFieldMapping) String() string { func (*RequiredFieldMapping) ProtoMessage() {} func (x *RequiredFieldMapping) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[37] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[38] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2975,7 +3021,7 @@ func (x *RequiredFieldMapping) ProtoReflect() protoreflect.Message { // Deprecated: Use RequiredFieldMapping.ProtoReflect.Descriptor instead. func (*RequiredFieldMapping) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{37} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{38} } func (x *RequiredFieldMapping) GetFieldMapping() *FieldMapping { @@ -3019,7 +3065,7 @@ type TypeFieldMapping struct { func (x *TypeFieldMapping) Reset() { *x = TypeFieldMapping{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[38] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[39] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3031,7 +3077,7 @@ func (x *TypeFieldMapping) String() string { func (*TypeFieldMapping) ProtoMessage() {} func (x *TypeFieldMapping) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[38] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[39] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3044,7 +3090,7 @@ func (x *TypeFieldMapping) ProtoReflect() protoreflect.Message { // Deprecated: Use TypeFieldMapping.ProtoReflect.Descriptor instead. func (*TypeFieldMapping) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{38} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{39} } func (x *TypeFieldMapping) GetType() string { @@ -3076,7 +3122,7 @@ type FieldMapping struct { func (x *FieldMapping) Reset() { *x = FieldMapping{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[39] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[40] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3088,7 +3134,7 @@ func (x *FieldMapping) String() string { func (*FieldMapping) ProtoMessage() {} func (x *FieldMapping) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[39] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[40] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3101,7 +3147,7 @@ func (x *FieldMapping) ProtoReflect() protoreflect.Message { // Deprecated: Use FieldMapping.ProtoReflect.Descriptor instead. func (*FieldMapping) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{39} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{40} } func (x *FieldMapping) GetOriginal() string { @@ -3138,7 +3184,7 @@ type ArgumentMapping struct { func (x *ArgumentMapping) Reset() { *x = ArgumentMapping{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[40] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[41] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3150,7 +3196,7 @@ func (x *ArgumentMapping) String() string { func (*ArgumentMapping) ProtoMessage() {} func (x *ArgumentMapping) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[40] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[41] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3163,7 +3209,7 @@ func (x *ArgumentMapping) ProtoReflect() protoreflect.Message { // Deprecated: Use ArgumentMapping.ProtoReflect.Descriptor instead. func (*ArgumentMapping) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{40} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{41} } func (x *ArgumentMapping) GetOriginal() string { @@ -3190,7 +3236,7 @@ type EnumMapping struct { func (x *EnumMapping) Reset() { *x = EnumMapping{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[41] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[42] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3202,7 +3248,7 @@ func (x *EnumMapping) String() string { func (*EnumMapping) ProtoMessage() {} func (x *EnumMapping) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[41] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[42] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3215,7 +3261,7 @@ func (x *EnumMapping) ProtoReflect() protoreflect.Message { // Deprecated: Use EnumMapping.ProtoReflect.Descriptor instead. func (*EnumMapping) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{41} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{42} } func (x *EnumMapping) GetType() string { @@ -3242,7 +3288,7 @@ type EnumValueMapping struct { func (x *EnumValueMapping) Reset() { *x = EnumValueMapping{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[42] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[43] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3254,7 +3300,7 @@ func (x *EnumValueMapping) String() string { func (*EnumValueMapping) ProtoMessage() {} func (x *EnumValueMapping) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[42] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[43] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3267,7 +3313,7 @@ func (x *EnumValueMapping) ProtoReflect() protoreflect.Message { // Deprecated: Use EnumValueMapping.ProtoReflect.Descriptor instead. func (*EnumValueMapping) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{42} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{43} } func (x *EnumValueMapping) GetOriginal() string { @@ -3295,7 +3341,7 @@ type NatsStreamConfiguration struct { func (x *NatsStreamConfiguration) Reset() { *x = NatsStreamConfiguration{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[43] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[44] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3307,7 +3353,7 @@ func (x *NatsStreamConfiguration) String() string { func (*NatsStreamConfiguration) ProtoMessage() {} func (x *NatsStreamConfiguration) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[43] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[44] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3320,7 +3366,7 @@ func (x *NatsStreamConfiguration) ProtoReflect() protoreflect.Message { // Deprecated: Use NatsStreamConfiguration.ProtoReflect.Descriptor instead. func (*NatsStreamConfiguration) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{43} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{44} } func (x *NatsStreamConfiguration) GetConsumerName() string { @@ -3355,7 +3401,7 @@ type NatsEventConfiguration struct { func (x *NatsEventConfiguration) Reset() { *x = NatsEventConfiguration{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[44] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[45] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3367,7 +3413,7 @@ func (x *NatsEventConfiguration) String() string { func (*NatsEventConfiguration) ProtoMessage() {} func (x *NatsEventConfiguration) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[44] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[45] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3380,7 +3426,7 @@ func (x *NatsEventConfiguration) ProtoReflect() protoreflect.Message { // Deprecated: Use NatsEventConfiguration.ProtoReflect.Descriptor instead. func (*NatsEventConfiguration) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{44} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{45} } func (x *NatsEventConfiguration) GetEngineEventConfiguration() *EngineEventConfiguration { @@ -3414,7 +3460,7 @@ type KafkaEventConfiguration struct { func (x *KafkaEventConfiguration) Reset() { *x = KafkaEventConfiguration{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[45] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[46] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3426,7 +3472,7 @@ func (x *KafkaEventConfiguration) String() string { func (*KafkaEventConfiguration) ProtoMessage() {} func (x *KafkaEventConfiguration) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[45] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[46] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3439,7 +3485,7 @@ func (x *KafkaEventConfiguration) ProtoReflect() protoreflect.Message { // Deprecated: Use KafkaEventConfiguration.ProtoReflect.Descriptor instead. func (*KafkaEventConfiguration) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{45} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{46} } func (x *KafkaEventConfiguration) GetEngineEventConfiguration() *EngineEventConfiguration { @@ -3466,7 +3512,7 @@ type RedisEventConfiguration struct { func (x *RedisEventConfiguration) Reset() { *x = RedisEventConfiguration{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[46] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[47] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3478,7 +3524,7 @@ func (x *RedisEventConfiguration) String() string { func (*RedisEventConfiguration) ProtoMessage() {} func (x *RedisEventConfiguration) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[46] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[47] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3491,7 +3537,7 @@ func (x *RedisEventConfiguration) ProtoReflect() protoreflect.Message { // Deprecated: Use RedisEventConfiguration.ProtoReflect.Descriptor instead. func (*RedisEventConfiguration) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{46} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{47} } func (x *RedisEventConfiguration) GetEngineEventConfiguration() *EngineEventConfiguration { @@ -3520,7 +3566,7 @@ type EngineEventConfiguration struct { func (x *EngineEventConfiguration) Reset() { *x = EngineEventConfiguration{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[47] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[48] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3532,7 +3578,7 @@ func (x *EngineEventConfiguration) String() string { func (*EngineEventConfiguration) ProtoMessage() {} func (x *EngineEventConfiguration) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[47] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[48] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3545,7 +3591,7 @@ func (x *EngineEventConfiguration) ProtoReflect() protoreflect.Message { // Deprecated: Use EngineEventConfiguration.ProtoReflect.Descriptor instead. func (*EngineEventConfiguration) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{47} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{48} } func (x *EngineEventConfiguration) GetProviderId() string { @@ -3587,7 +3633,7 @@ type DataSourceCustomEvents struct { func (x *DataSourceCustomEvents) Reset() { *x = DataSourceCustomEvents{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[48] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[49] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3599,7 +3645,7 @@ func (x *DataSourceCustomEvents) String() string { func (*DataSourceCustomEvents) ProtoMessage() {} func (x *DataSourceCustomEvents) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[48] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[49] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3612,7 +3658,7 @@ func (x *DataSourceCustomEvents) ProtoReflect() protoreflect.Message { // Deprecated: Use DataSourceCustomEvents.ProtoReflect.Descriptor instead. func (*DataSourceCustomEvents) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{48} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{49} } func (x *DataSourceCustomEvents) GetNats() []*NatsEventConfiguration { @@ -3645,7 +3691,7 @@ type DataSourceCustom_Static struct { func (x *DataSourceCustom_Static) Reset() { *x = DataSourceCustom_Static{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[49] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[50] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3657,7 +3703,7 @@ func (x *DataSourceCustom_Static) String() string { func (*DataSourceCustom_Static) ProtoMessage() {} func (x *DataSourceCustom_Static) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[49] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[50] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3670,7 +3716,7 @@ func (x *DataSourceCustom_Static) ProtoReflect() protoreflect.Message { // Deprecated: Use DataSourceCustom_Static.ProtoReflect.Descriptor instead. func (*DataSourceCustom_Static) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{49} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{50} } func (x *DataSourceCustom_Static) GetData() *ConfigurationVariable { @@ -3693,7 +3739,7 @@ type ConfigurationVariable struct { func (x *ConfigurationVariable) Reset() { *x = ConfigurationVariable{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[50] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[51] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3705,7 +3751,7 @@ func (x *ConfigurationVariable) String() string { func (*ConfigurationVariable) ProtoMessage() {} func (x *ConfigurationVariable) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[50] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[51] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3718,7 +3764,7 @@ func (x *ConfigurationVariable) ProtoReflect() protoreflect.Message { // Deprecated: Use ConfigurationVariable.ProtoReflect.Descriptor instead. func (*ConfigurationVariable) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{50} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{51} } func (x *ConfigurationVariable) GetKind() ConfigurationVariableKind { @@ -3766,7 +3812,7 @@ type DirectiveConfiguration struct { func (x *DirectiveConfiguration) Reset() { *x = DirectiveConfiguration{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[51] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[52] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3778,7 +3824,7 @@ func (x *DirectiveConfiguration) String() string { func (*DirectiveConfiguration) ProtoMessage() {} func (x *DirectiveConfiguration) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[51] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[52] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3791,7 +3837,7 @@ func (x *DirectiveConfiguration) ProtoReflect() protoreflect.Message { // Deprecated: Use DirectiveConfiguration.ProtoReflect.Descriptor instead. func (*DirectiveConfiguration) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{51} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{52} } func (x *DirectiveConfiguration) GetDirectiveName() string { @@ -3818,7 +3864,7 @@ type URLQueryConfiguration struct { func (x *URLQueryConfiguration) Reset() { *x = URLQueryConfiguration{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[52] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[53] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3830,7 +3876,7 @@ func (x *URLQueryConfiguration) String() string { func (*URLQueryConfiguration) ProtoMessage() {} func (x *URLQueryConfiguration) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[52] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[53] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3843,7 +3889,7 @@ func (x *URLQueryConfiguration) ProtoReflect() protoreflect.Message { // Deprecated: Use URLQueryConfiguration.ProtoReflect.Descriptor instead. func (*URLQueryConfiguration) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{52} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{53} } func (x *URLQueryConfiguration) GetName() string { @@ -3869,7 +3915,7 @@ type HTTPHeader struct { func (x *HTTPHeader) Reset() { *x = HTTPHeader{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[53] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[54] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3881,7 +3927,7 @@ func (x *HTTPHeader) String() string { func (*HTTPHeader) ProtoMessage() {} func (x *HTTPHeader) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[53] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[54] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3894,7 +3940,7 @@ func (x *HTTPHeader) ProtoReflect() protoreflect.Message { // Deprecated: Use HTTPHeader.ProtoReflect.Descriptor instead. func (*HTTPHeader) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{53} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{54} } func (x *HTTPHeader) GetValues() []*ConfigurationVariable { @@ -3915,7 +3961,7 @@ type MTLSConfiguration struct { func (x *MTLSConfiguration) Reset() { *x = MTLSConfiguration{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[54] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[55] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3927,7 +3973,7 @@ func (x *MTLSConfiguration) String() string { func (*MTLSConfiguration) ProtoMessage() {} func (x *MTLSConfiguration) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[54] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[55] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3940,7 +3986,7 @@ func (x *MTLSConfiguration) ProtoReflect() protoreflect.Message { // Deprecated: Use MTLSConfiguration.ProtoReflect.Descriptor instead. func (*MTLSConfiguration) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{54} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{55} } func (x *MTLSConfiguration) GetKey() *ConfigurationVariable { @@ -3978,7 +4024,7 @@ type GraphQLSubscriptionConfiguration struct { func (x *GraphQLSubscriptionConfiguration) Reset() { *x = GraphQLSubscriptionConfiguration{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[55] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[56] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3990,7 +4036,7 @@ func (x *GraphQLSubscriptionConfiguration) String() string { func (*GraphQLSubscriptionConfiguration) ProtoMessage() {} func (x *GraphQLSubscriptionConfiguration) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[55] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[56] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4003,7 +4049,7 @@ func (x *GraphQLSubscriptionConfiguration) ProtoReflect() protoreflect.Message { // Deprecated: Use GraphQLSubscriptionConfiguration.ProtoReflect.Descriptor instead. func (*GraphQLSubscriptionConfiguration) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{55} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{56} } func (x *GraphQLSubscriptionConfiguration) GetEnabled() bool { @@ -4051,7 +4097,7 @@ type GraphQLFederationConfiguration struct { func (x *GraphQLFederationConfiguration) Reset() { *x = GraphQLFederationConfiguration{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[56] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[57] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4063,7 +4109,7 @@ func (x *GraphQLFederationConfiguration) String() string { func (*GraphQLFederationConfiguration) ProtoMessage() {} func (x *GraphQLFederationConfiguration) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[56] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[57] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4076,7 +4122,7 @@ func (x *GraphQLFederationConfiguration) ProtoReflect() protoreflect.Message { // Deprecated: Use GraphQLFederationConfiguration.ProtoReflect.Descriptor instead. func (*GraphQLFederationConfiguration) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{56} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{57} } func (x *GraphQLFederationConfiguration) GetEnabled() bool { @@ -4103,7 +4149,7 @@ type InternedString struct { func (x *InternedString) Reset() { *x = InternedString{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[57] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[58] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4115,7 +4161,7 @@ func (x *InternedString) String() string { func (*InternedString) ProtoMessage() {} func (x *InternedString) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[57] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[58] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4128,7 +4174,7 @@ func (x *InternedString) ProtoReflect() protoreflect.Message { // Deprecated: Use InternedString.ProtoReflect.Descriptor instead. func (*InternedString) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{57} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{58} } func (x *InternedString) GetKey() string { @@ -4148,7 +4194,7 @@ type SingleTypeField struct { func (x *SingleTypeField) Reset() { *x = SingleTypeField{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[58] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[59] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4160,7 +4206,7 @@ func (x *SingleTypeField) String() string { func (*SingleTypeField) ProtoMessage() {} func (x *SingleTypeField) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[58] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[59] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4173,7 +4219,7 @@ func (x *SingleTypeField) ProtoReflect() protoreflect.Message { // Deprecated: Use SingleTypeField.ProtoReflect.Descriptor instead. func (*SingleTypeField) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{58} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{59} } func (x *SingleTypeField) GetTypeName() string { @@ -4200,7 +4246,7 @@ type SubscriptionFieldCondition struct { func (x *SubscriptionFieldCondition) Reset() { *x = SubscriptionFieldCondition{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[59] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[60] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4212,7 +4258,7 @@ func (x *SubscriptionFieldCondition) String() string { func (*SubscriptionFieldCondition) ProtoMessage() {} func (x *SubscriptionFieldCondition) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[59] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[60] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4225,7 +4271,7 @@ func (x *SubscriptionFieldCondition) ProtoReflect() protoreflect.Message { // Deprecated: Use SubscriptionFieldCondition.ProtoReflect.Descriptor instead. func (*SubscriptionFieldCondition) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{59} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{60} } func (x *SubscriptionFieldCondition) GetFieldPath() []string { @@ -4254,7 +4300,7 @@ type SubscriptionFilterCondition struct { func (x *SubscriptionFilterCondition) Reset() { *x = SubscriptionFilterCondition{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[60] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[61] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4266,7 +4312,7 @@ func (x *SubscriptionFilterCondition) String() string { func (*SubscriptionFilterCondition) ProtoMessage() {} func (x *SubscriptionFilterCondition) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[60] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[61] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4279,7 +4325,7 @@ func (x *SubscriptionFilterCondition) ProtoReflect() protoreflect.Message { // Deprecated: Use SubscriptionFilterCondition.ProtoReflect.Descriptor instead. func (*SubscriptionFilterCondition) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{60} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{61} } func (x *SubscriptionFilterCondition) GetAnd() []*SubscriptionFilterCondition { @@ -4319,7 +4365,7 @@ type CacheWarmerOperations struct { func (x *CacheWarmerOperations) Reset() { *x = CacheWarmerOperations{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[61] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[62] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4331,7 +4377,7 @@ func (x *CacheWarmerOperations) String() string { func (*CacheWarmerOperations) ProtoMessage() {} func (x *CacheWarmerOperations) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[61] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[62] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4344,7 +4390,7 @@ func (x *CacheWarmerOperations) ProtoReflect() protoreflect.Message { // Deprecated: Use CacheWarmerOperations.ProtoReflect.Descriptor instead. func (*CacheWarmerOperations) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{61} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{62} } func (x *CacheWarmerOperations) GetOperations() []*Operation { @@ -4364,7 +4410,7 @@ type Operation struct { func (x *Operation) Reset() { *x = Operation{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[62] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[63] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4376,7 +4422,7 @@ func (x *Operation) String() string { func (*Operation) ProtoMessage() {} func (x *Operation) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[62] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[63] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4389,7 +4435,7 @@ func (x *Operation) ProtoReflect() protoreflect.Message { // Deprecated: Use Operation.ProtoReflect.Descriptor instead. func (*Operation) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{62} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{63} } func (x *Operation) GetRequest() *OperationRequest { @@ -4417,7 +4463,7 @@ type OperationRequest struct { func (x *OperationRequest) Reset() { *x = OperationRequest{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[63] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[64] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4429,7 +4475,7 @@ func (x *OperationRequest) String() string { func (*OperationRequest) ProtoMessage() {} func (x *OperationRequest) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[63] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[64] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4442,7 +4488,7 @@ func (x *OperationRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use OperationRequest.ProtoReflect.Descriptor instead. func (*OperationRequest) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{63} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{64} } func (x *OperationRequest) GetOperationName() string { @@ -4475,7 +4521,7 @@ type Extension struct { func (x *Extension) Reset() { *x = Extension{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[64] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[65] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4487,7 +4533,7 @@ func (x *Extension) String() string { func (*Extension) ProtoMessage() {} func (x *Extension) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[64] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[65] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4500,7 +4546,7 @@ func (x *Extension) ProtoReflect() protoreflect.Message { // Deprecated: Use Extension.ProtoReflect.Descriptor instead. func (*Extension) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{64} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{65} } func (x *Extension) GetPersistedQuery() *PersistedQuery { @@ -4520,7 +4566,7 @@ type PersistedQuery struct { func (x *PersistedQuery) Reset() { *x = PersistedQuery{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[65] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[66] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4532,7 +4578,7 @@ func (x *PersistedQuery) String() string { func (*PersistedQuery) ProtoMessage() {} func (x *PersistedQuery) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[65] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[66] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4545,7 +4591,7 @@ func (x *PersistedQuery) ProtoReflect() protoreflect.Message { // Deprecated: Use PersistedQuery.ProtoReflect.Descriptor instead. func (*PersistedQuery) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{65} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{66} } func (x *PersistedQuery) GetSha256Hash() string { @@ -4572,7 +4618,7 @@ type ClientInfo struct { func (x *ClientInfo) Reset() { *x = ClientInfo{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[66] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[67] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4584,7 +4630,7 @@ func (x *ClientInfo) String() string { func (*ClientInfo) ProtoMessage() {} func (x *ClientInfo) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[66] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[67] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4597,7 +4643,7 @@ func (x *ClientInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use ClientInfo.ProtoReflect.Descriptor instead. func (*ClientInfo) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{66} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{67} } func (x *ClientInfo) GetName() string { @@ -4639,7 +4685,12 @@ const file_wg_cosmo_node_v1_node_proto_rawDesc = "" + "\tsubgraphs\x18\x03 \x03(\v2\x1a.wg.cosmo.node.v1.SubgraphR\tsubgraphs\x12j\n" + "\x14feature_flag_configs\x18\x04 \x01(\v23.wg.cosmo.node.v1.FeatureFlagRouterExecutionConfigsH\x00R\x12featureFlagConfigs\x88\x01\x01\x123\n" + "\x15compatibility_version\x18\x05 \x01(\tR\x14compatibilityVersionB\x17\n" + - "\x15_feature_flag_configs\"j\n" + + "\x15_feature_flag_configs\"\xa5\x01\n" + + "\fActiveGraphs\x12T\n" + + "\fgraphConfigs\x18\x01 \x03(\v20.wg.cosmo.node.v1.ActiveGraphs.GraphConfigsEntryR\fgraphConfigs\x1a?\n" + + "\x11GraphConfigsEntry\x12\x10\n" + + "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + + "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\"j\n" + "\bResponse\x123\n" + "\x04code\x18\x01 \x01(\x0e2\x1f.wg.cosmo.common.EnumStatusCodeR\x04code\x12\x1d\n" + "\adetails\x18\x02 \x01(\tH\x00R\adetails\x88\x01\x01B\n" + @@ -5030,7 +5081,7 @@ func file_wg_cosmo_node_v1_node_proto_rawDescGZIP() []byte { } var file_wg_cosmo_node_v1_node_proto_enumTypes = make([]protoimpl.EnumInfo, 8) -var file_wg_cosmo_node_v1_node_proto_msgTypes = make([]protoimpl.MessageInfo, 74) +var file_wg_cosmo_node_v1_node_proto_msgTypes = make([]protoimpl.MessageInfo, 76) var file_wg_cosmo_node_v1_node_proto_goTypes = []any{ (ArgumentRenderConfiguration)(0), // 0: wg.cosmo.node.v1.ArgumentRenderConfiguration (ArgumentSource)(0), // 1: wg.cosmo.node.v1.ArgumentSource @@ -5044,188 +5095,191 @@ var file_wg_cosmo_node_v1_node_proto_goTypes = []any{ (*FeatureFlagRouterExecutionConfigs)(nil), // 9: wg.cosmo.node.v1.FeatureFlagRouterExecutionConfigs (*FeatureFlagRouterExecutionConfig)(nil), // 10: wg.cosmo.node.v1.FeatureFlagRouterExecutionConfig (*RouterConfig)(nil), // 11: wg.cosmo.node.v1.RouterConfig - (*Response)(nil), // 12: wg.cosmo.node.v1.Response - (*ResponseStatus)(nil), // 13: wg.cosmo.node.v1.ResponseStatus - (*RegistrationInfo)(nil), // 14: wg.cosmo.node.v1.RegistrationInfo - (*AccountLimits)(nil), // 15: wg.cosmo.node.v1.AccountLimits - (*SelfRegisterRequest)(nil), // 16: wg.cosmo.node.v1.SelfRegisterRequest - (*SelfRegisterResponse)(nil), // 17: wg.cosmo.node.v1.SelfRegisterResponse - (*EngineConfiguration)(nil), // 18: wg.cosmo.node.v1.EngineConfiguration - (*DataSourceConfiguration)(nil), // 19: wg.cosmo.node.v1.DataSourceConfiguration - (*CostConfiguration)(nil), // 20: wg.cosmo.node.v1.CostConfiguration - (*FieldWeightConfiguration)(nil), // 21: wg.cosmo.node.v1.FieldWeightConfiguration - (*FieldListSizeConfiguration)(nil), // 22: wg.cosmo.node.v1.FieldListSizeConfiguration - (*ArgumentConfiguration)(nil), // 23: wg.cosmo.node.v1.ArgumentConfiguration - (*Scopes)(nil), // 24: wg.cosmo.node.v1.Scopes - (*AuthorizationConfiguration)(nil), // 25: wg.cosmo.node.v1.AuthorizationConfiguration - (*FieldConfiguration)(nil), // 26: wg.cosmo.node.v1.FieldConfiguration - (*TypeConfiguration)(nil), // 27: wg.cosmo.node.v1.TypeConfiguration - (*TypeField)(nil), // 28: wg.cosmo.node.v1.TypeField - (*FieldCoordinates)(nil), // 29: wg.cosmo.node.v1.FieldCoordinates - (*FieldSetCondition)(nil), // 30: wg.cosmo.node.v1.FieldSetCondition - (*RequiredField)(nil), // 31: wg.cosmo.node.v1.RequiredField - (*EntityInterfaceConfiguration)(nil), // 32: wg.cosmo.node.v1.EntityInterfaceConfiguration - (*FetchConfiguration)(nil), // 33: wg.cosmo.node.v1.FetchConfiguration - (*StatusCodeTypeMapping)(nil), // 34: wg.cosmo.node.v1.StatusCodeTypeMapping - (*DataSourceCustom_GraphQL)(nil), // 35: wg.cosmo.node.v1.DataSourceCustom_GraphQL - (*GRPCConfiguration)(nil), // 36: wg.cosmo.node.v1.GRPCConfiguration - (*ImageReference)(nil), // 37: wg.cosmo.node.v1.ImageReference - (*PluginConfiguration)(nil), // 38: wg.cosmo.node.v1.PluginConfiguration - (*SSLConfiguration)(nil), // 39: wg.cosmo.node.v1.SSLConfiguration - (*GRPCMapping)(nil), // 40: wg.cosmo.node.v1.GRPCMapping - (*LookupMapping)(nil), // 41: wg.cosmo.node.v1.LookupMapping - (*LookupFieldMapping)(nil), // 42: wg.cosmo.node.v1.LookupFieldMapping - (*OperationMapping)(nil), // 43: wg.cosmo.node.v1.OperationMapping - (*EntityMapping)(nil), // 44: wg.cosmo.node.v1.EntityMapping - (*RequiredFieldMapping)(nil), // 45: wg.cosmo.node.v1.RequiredFieldMapping - (*TypeFieldMapping)(nil), // 46: wg.cosmo.node.v1.TypeFieldMapping - (*FieldMapping)(nil), // 47: wg.cosmo.node.v1.FieldMapping - (*ArgumentMapping)(nil), // 48: wg.cosmo.node.v1.ArgumentMapping - (*EnumMapping)(nil), // 49: wg.cosmo.node.v1.EnumMapping - (*EnumValueMapping)(nil), // 50: wg.cosmo.node.v1.EnumValueMapping - (*NatsStreamConfiguration)(nil), // 51: wg.cosmo.node.v1.NatsStreamConfiguration - (*NatsEventConfiguration)(nil), // 52: wg.cosmo.node.v1.NatsEventConfiguration - (*KafkaEventConfiguration)(nil), // 53: wg.cosmo.node.v1.KafkaEventConfiguration - (*RedisEventConfiguration)(nil), // 54: wg.cosmo.node.v1.RedisEventConfiguration - (*EngineEventConfiguration)(nil), // 55: wg.cosmo.node.v1.EngineEventConfiguration - (*DataSourceCustomEvents)(nil), // 56: wg.cosmo.node.v1.DataSourceCustomEvents - (*DataSourceCustom_Static)(nil), // 57: wg.cosmo.node.v1.DataSourceCustom_Static - (*ConfigurationVariable)(nil), // 58: wg.cosmo.node.v1.ConfigurationVariable - (*DirectiveConfiguration)(nil), // 59: wg.cosmo.node.v1.DirectiveConfiguration - (*URLQueryConfiguration)(nil), // 60: wg.cosmo.node.v1.URLQueryConfiguration - (*HTTPHeader)(nil), // 61: wg.cosmo.node.v1.HTTPHeader - (*MTLSConfiguration)(nil), // 62: wg.cosmo.node.v1.MTLSConfiguration - (*GraphQLSubscriptionConfiguration)(nil), // 63: wg.cosmo.node.v1.GraphQLSubscriptionConfiguration - (*GraphQLFederationConfiguration)(nil), // 64: wg.cosmo.node.v1.GraphQLFederationConfiguration - (*InternedString)(nil), // 65: wg.cosmo.node.v1.InternedString - (*SingleTypeField)(nil), // 66: wg.cosmo.node.v1.SingleTypeField - (*SubscriptionFieldCondition)(nil), // 67: wg.cosmo.node.v1.SubscriptionFieldCondition - (*SubscriptionFilterCondition)(nil), // 68: wg.cosmo.node.v1.SubscriptionFilterCondition - (*CacheWarmerOperations)(nil), // 69: wg.cosmo.node.v1.CacheWarmerOperations - (*Operation)(nil), // 70: wg.cosmo.node.v1.Operation - (*OperationRequest)(nil), // 71: wg.cosmo.node.v1.OperationRequest - (*Extension)(nil), // 72: wg.cosmo.node.v1.Extension - (*PersistedQuery)(nil), // 73: wg.cosmo.node.v1.PersistedQuery - (*ClientInfo)(nil), // 74: wg.cosmo.node.v1.ClientInfo - nil, // 75: wg.cosmo.node.v1.FeatureFlagRouterExecutionConfigs.ConfigByFeatureFlagNameEntry - nil, // 76: wg.cosmo.node.v1.EngineConfiguration.StringStorageEntry - nil, // 77: wg.cosmo.node.v1.CostConfiguration.TypeWeightsEntry - nil, // 78: wg.cosmo.node.v1.CostConfiguration.DirectiveArgumentWeightsEntry - nil, // 79: wg.cosmo.node.v1.FieldWeightConfiguration.ArgumentWeightsEntry - nil, // 80: wg.cosmo.node.v1.FieldWeightConfiguration.DirectiveArgumentWeightsEntry - nil, // 81: wg.cosmo.node.v1.FetchConfiguration.HeaderEntry - (common.EnumStatusCode)(0), // 82: wg.cosmo.common.EnumStatusCode - (common.GraphQLSubscriptionProtocol)(0), // 83: wg.cosmo.common.GraphQLSubscriptionProtocol - (common.GraphQLWebsocketSubprotocol)(0), // 84: wg.cosmo.common.GraphQLWebsocketSubprotocol + (*ActiveGraphs)(nil), // 12: wg.cosmo.node.v1.ActiveGraphs + (*Response)(nil), // 13: wg.cosmo.node.v1.Response + (*ResponseStatus)(nil), // 14: wg.cosmo.node.v1.ResponseStatus + (*RegistrationInfo)(nil), // 15: wg.cosmo.node.v1.RegistrationInfo + (*AccountLimits)(nil), // 16: wg.cosmo.node.v1.AccountLimits + (*SelfRegisterRequest)(nil), // 17: wg.cosmo.node.v1.SelfRegisterRequest + (*SelfRegisterResponse)(nil), // 18: wg.cosmo.node.v1.SelfRegisterResponse + (*EngineConfiguration)(nil), // 19: wg.cosmo.node.v1.EngineConfiguration + (*DataSourceConfiguration)(nil), // 20: wg.cosmo.node.v1.DataSourceConfiguration + (*CostConfiguration)(nil), // 21: wg.cosmo.node.v1.CostConfiguration + (*FieldWeightConfiguration)(nil), // 22: wg.cosmo.node.v1.FieldWeightConfiguration + (*FieldListSizeConfiguration)(nil), // 23: wg.cosmo.node.v1.FieldListSizeConfiguration + (*ArgumentConfiguration)(nil), // 24: wg.cosmo.node.v1.ArgumentConfiguration + (*Scopes)(nil), // 25: wg.cosmo.node.v1.Scopes + (*AuthorizationConfiguration)(nil), // 26: wg.cosmo.node.v1.AuthorizationConfiguration + (*FieldConfiguration)(nil), // 27: wg.cosmo.node.v1.FieldConfiguration + (*TypeConfiguration)(nil), // 28: wg.cosmo.node.v1.TypeConfiguration + (*TypeField)(nil), // 29: wg.cosmo.node.v1.TypeField + (*FieldCoordinates)(nil), // 30: wg.cosmo.node.v1.FieldCoordinates + (*FieldSetCondition)(nil), // 31: wg.cosmo.node.v1.FieldSetCondition + (*RequiredField)(nil), // 32: wg.cosmo.node.v1.RequiredField + (*EntityInterfaceConfiguration)(nil), // 33: wg.cosmo.node.v1.EntityInterfaceConfiguration + (*FetchConfiguration)(nil), // 34: wg.cosmo.node.v1.FetchConfiguration + (*StatusCodeTypeMapping)(nil), // 35: wg.cosmo.node.v1.StatusCodeTypeMapping + (*DataSourceCustom_GraphQL)(nil), // 36: wg.cosmo.node.v1.DataSourceCustom_GraphQL + (*GRPCConfiguration)(nil), // 37: wg.cosmo.node.v1.GRPCConfiguration + (*ImageReference)(nil), // 38: wg.cosmo.node.v1.ImageReference + (*PluginConfiguration)(nil), // 39: wg.cosmo.node.v1.PluginConfiguration + (*SSLConfiguration)(nil), // 40: wg.cosmo.node.v1.SSLConfiguration + (*GRPCMapping)(nil), // 41: wg.cosmo.node.v1.GRPCMapping + (*LookupMapping)(nil), // 42: wg.cosmo.node.v1.LookupMapping + (*LookupFieldMapping)(nil), // 43: wg.cosmo.node.v1.LookupFieldMapping + (*OperationMapping)(nil), // 44: wg.cosmo.node.v1.OperationMapping + (*EntityMapping)(nil), // 45: wg.cosmo.node.v1.EntityMapping + (*RequiredFieldMapping)(nil), // 46: wg.cosmo.node.v1.RequiredFieldMapping + (*TypeFieldMapping)(nil), // 47: wg.cosmo.node.v1.TypeFieldMapping + (*FieldMapping)(nil), // 48: wg.cosmo.node.v1.FieldMapping + (*ArgumentMapping)(nil), // 49: wg.cosmo.node.v1.ArgumentMapping + (*EnumMapping)(nil), // 50: wg.cosmo.node.v1.EnumMapping + (*EnumValueMapping)(nil), // 51: wg.cosmo.node.v1.EnumValueMapping + (*NatsStreamConfiguration)(nil), // 52: wg.cosmo.node.v1.NatsStreamConfiguration + (*NatsEventConfiguration)(nil), // 53: wg.cosmo.node.v1.NatsEventConfiguration + (*KafkaEventConfiguration)(nil), // 54: wg.cosmo.node.v1.KafkaEventConfiguration + (*RedisEventConfiguration)(nil), // 55: wg.cosmo.node.v1.RedisEventConfiguration + (*EngineEventConfiguration)(nil), // 56: wg.cosmo.node.v1.EngineEventConfiguration + (*DataSourceCustomEvents)(nil), // 57: wg.cosmo.node.v1.DataSourceCustomEvents + (*DataSourceCustom_Static)(nil), // 58: wg.cosmo.node.v1.DataSourceCustom_Static + (*ConfigurationVariable)(nil), // 59: wg.cosmo.node.v1.ConfigurationVariable + (*DirectiveConfiguration)(nil), // 60: wg.cosmo.node.v1.DirectiveConfiguration + (*URLQueryConfiguration)(nil), // 61: wg.cosmo.node.v1.URLQueryConfiguration + (*HTTPHeader)(nil), // 62: wg.cosmo.node.v1.HTTPHeader + (*MTLSConfiguration)(nil), // 63: wg.cosmo.node.v1.MTLSConfiguration + (*GraphQLSubscriptionConfiguration)(nil), // 64: wg.cosmo.node.v1.GraphQLSubscriptionConfiguration + (*GraphQLFederationConfiguration)(nil), // 65: wg.cosmo.node.v1.GraphQLFederationConfiguration + (*InternedString)(nil), // 66: wg.cosmo.node.v1.InternedString + (*SingleTypeField)(nil), // 67: wg.cosmo.node.v1.SingleTypeField + (*SubscriptionFieldCondition)(nil), // 68: wg.cosmo.node.v1.SubscriptionFieldCondition + (*SubscriptionFilterCondition)(nil), // 69: wg.cosmo.node.v1.SubscriptionFilterCondition + (*CacheWarmerOperations)(nil), // 70: wg.cosmo.node.v1.CacheWarmerOperations + (*Operation)(nil), // 71: wg.cosmo.node.v1.Operation + (*OperationRequest)(nil), // 72: wg.cosmo.node.v1.OperationRequest + (*Extension)(nil), // 73: wg.cosmo.node.v1.Extension + (*PersistedQuery)(nil), // 74: wg.cosmo.node.v1.PersistedQuery + (*ClientInfo)(nil), // 75: wg.cosmo.node.v1.ClientInfo + nil, // 76: wg.cosmo.node.v1.FeatureFlagRouterExecutionConfigs.ConfigByFeatureFlagNameEntry + nil, // 77: wg.cosmo.node.v1.ActiveGraphs.GraphConfigsEntry + nil, // 78: wg.cosmo.node.v1.EngineConfiguration.StringStorageEntry + nil, // 79: wg.cosmo.node.v1.CostConfiguration.TypeWeightsEntry + nil, // 80: wg.cosmo.node.v1.CostConfiguration.DirectiveArgumentWeightsEntry + nil, // 81: wg.cosmo.node.v1.FieldWeightConfiguration.ArgumentWeightsEntry + nil, // 82: wg.cosmo.node.v1.FieldWeightConfiguration.DirectiveArgumentWeightsEntry + nil, // 83: wg.cosmo.node.v1.FetchConfiguration.HeaderEntry + (common.EnumStatusCode)(0), // 84: wg.cosmo.common.EnumStatusCode + (common.GraphQLSubscriptionProtocol)(0), // 85: wg.cosmo.common.GraphQLSubscriptionProtocol + (common.GraphQLWebsocketSubprotocol)(0), // 86: wg.cosmo.common.GraphQLWebsocketSubprotocol } var file_wg_cosmo_node_v1_node_proto_depIdxs = []int32{ - 75, // 0: wg.cosmo.node.v1.FeatureFlagRouterExecutionConfigs.config_by_feature_flag_name:type_name -> wg.cosmo.node.v1.FeatureFlagRouterExecutionConfigs.ConfigByFeatureFlagNameEntry - 18, // 1: wg.cosmo.node.v1.FeatureFlagRouterExecutionConfig.engine_config:type_name -> wg.cosmo.node.v1.EngineConfiguration + 76, // 0: wg.cosmo.node.v1.FeatureFlagRouterExecutionConfigs.config_by_feature_flag_name:type_name -> wg.cosmo.node.v1.FeatureFlagRouterExecutionConfigs.ConfigByFeatureFlagNameEntry + 19, // 1: wg.cosmo.node.v1.FeatureFlagRouterExecutionConfig.engine_config:type_name -> wg.cosmo.node.v1.EngineConfiguration 8, // 2: wg.cosmo.node.v1.FeatureFlagRouterExecutionConfig.subgraphs:type_name -> wg.cosmo.node.v1.Subgraph - 18, // 3: wg.cosmo.node.v1.RouterConfig.engine_config:type_name -> wg.cosmo.node.v1.EngineConfiguration + 19, // 3: wg.cosmo.node.v1.RouterConfig.engine_config:type_name -> wg.cosmo.node.v1.EngineConfiguration 8, // 4: wg.cosmo.node.v1.RouterConfig.subgraphs:type_name -> wg.cosmo.node.v1.Subgraph 9, // 5: wg.cosmo.node.v1.RouterConfig.feature_flag_configs:type_name -> wg.cosmo.node.v1.FeatureFlagRouterExecutionConfigs - 82, // 6: wg.cosmo.node.v1.Response.code:type_name -> wg.cosmo.common.EnumStatusCode - 15, // 7: wg.cosmo.node.v1.RegistrationInfo.account_limits:type_name -> wg.cosmo.node.v1.AccountLimits - 12, // 8: wg.cosmo.node.v1.SelfRegisterResponse.response:type_name -> wg.cosmo.node.v1.Response - 14, // 9: wg.cosmo.node.v1.SelfRegisterResponse.registrationInfo:type_name -> wg.cosmo.node.v1.RegistrationInfo - 19, // 10: wg.cosmo.node.v1.EngineConfiguration.datasource_configurations:type_name -> wg.cosmo.node.v1.DataSourceConfiguration - 26, // 11: wg.cosmo.node.v1.EngineConfiguration.field_configurations:type_name -> wg.cosmo.node.v1.FieldConfiguration - 27, // 12: wg.cosmo.node.v1.EngineConfiguration.type_configurations:type_name -> wg.cosmo.node.v1.TypeConfiguration - 76, // 13: wg.cosmo.node.v1.EngineConfiguration.string_storage:type_name -> wg.cosmo.node.v1.EngineConfiguration.StringStorageEntry - 2, // 14: wg.cosmo.node.v1.DataSourceConfiguration.kind:type_name -> wg.cosmo.node.v1.DataSourceKind - 28, // 15: wg.cosmo.node.v1.DataSourceConfiguration.root_nodes:type_name -> wg.cosmo.node.v1.TypeField - 28, // 16: wg.cosmo.node.v1.DataSourceConfiguration.child_nodes:type_name -> wg.cosmo.node.v1.TypeField - 35, // 17: wg.cosmo.node.v1.DataSourceConfiguration.custom_graphql:type_name -> wg.cosmo.node.v1.DataSourceCustom_GraphQL - 57, // 18: wg.cosmo.node.v1.DataSourceConfiguration.custom_static:type_name -> wg.cosmo.node.v1.DataSourceCustom_Static - 59, // 19: wg.cosmo.node.v1.DataSourceConfiguration.directives:type_name -> wg.cosmo.node.v1.DirectiveConfiguration - 31, // 20: wg.cosmo.node.v1.DataSourceConfiguration.keys:type_name -> wg.cosmo.node.v1.RequiredField - 31, // 21: wg.cosmo.node.v1.DataSourceConfiguration.provides:type_name -> wg.cosmo.node.v1.RequiredField - 31, // 22: wg.cosmo.node.v1.DataSourceConfiguration.requires:type_name -> wg.cosmo.node.v1.RequiredField - 56, // 23: wg.cosmo.node.v1.DataSourceConfiguration.custom_events:type_name -> wg.cosmo.node.v1.DataSourceCustomEvents - 32, // 24: wg.cosmo.node.v1.DataSourceConfiguration.entity_interfaces:type_name -> wg.cosmo.node.v1.EntityInterfaceConfiguration - 32, // 25: wg.cosmo.node.v1.DataSourceConfiguration.interface_objects:type_name -> wg.cosmo.node.v1.EntityInterfaceConfiguration - 20, // 26: wg.cosmo.node.v1.DataSourceConfiguration.cost_configuration:type_name -> wg.cosmo.node.v1.CostConfiguration - 21, // 27: wg.cosmo.node.v1.CostConfiguration.field_weights:type_name -> wg.cosmo.node.v1.FieldWeightConfiguration - 22, // 28: wg.cosmo.node.v1.CostConfiguration.list_sizes:type_name -> wg.cosmo.node.v1.FieldListSizeConfiguration - 77, // 29: wg.cosmo.node.v1.CostConfiguration.type_weights:type_name -> wg.cosmo.node.v1.CostConfiguration.TypeWeightsEntry - 78, // 30: wg.cosmo.node.v1.CostConfiguration.directive_argument_weights:type_name -> wg.cosmo.node.v1.CostConfiguration.DirectiveArgumentWeightsEntry - 79, // 31: wg.cosmo.node.v1.FieldWeightConfiguration.argument_weights:type_name -> wg.cosmo.node.v1.FieldWeightConfiguration.ArgumentWeightsEntry - 80, // 32: wg.cosmo.node.v1.FieldWeightConfiguration.directive_argument_weights:type_name -> wg.cosmo.node.v1.FieldWeightConfiguration.DirectiveArgumentWeightsEntry - 1, // 33: wg.cosmo.node.v1.ArgumentConfiguration.source_type:type_name -> wg.cosmo.node.v1.ArgumentSource - 24, // 34: wg.cosmo.node.v1.AuthorizationConfiguration.required_or_scopes:type_name -> wg.cosmo.node.v1.Scopes - 24, // 35: wg.cosmo.node.v1.AuthorizationConfiguration.required_or_scopes_by_or:type_name -> wg.cosmo.node.v1.Scopes - 23, // 36: wg.cosmo.node.v1.FieldConfiguration.arguments_configuration:type_name -> wg.cosmo.node.v1.ArgumentConfiguration - 25, // 37: wg.cosmo.node.v1.FieldConfiguration.authorization_configuration:type_name -> wg.cosmo.node.v1.AuthorizationConfiguration - 68, // 38: wg.cosmo.node.v1.FieldConfiguration.subscription_filter_condition:type_name -> wg.cosmo.node.v1.SubscriptionFilterCondition - 29, // 39: wg.cosmo.node.v1.FieldSetCondition.field_coordinates_path:type_name -> wg.cosmo.node.v1.FieldCoordinates - 30, // 40: wg.cosmo.node.v1.RequiredField.conditions:type_name -> wg.cosmo.node.v1.FieldSetCondition - 58, // 41: wg.cosmo.node.v1.FetchConfiguration.url:type_name -> wg.cosmo.node.v1.ConfigurationVariable - 7, // 42: wg.cosmo.node.v1.FetchConfiguration.method:type_name -> wg.cosmo.node.v1.HTTPMethod - 81, // 43: wg.cosmo.node.v1.FetchConfiguration.header:type_name -> wg.cosmo.node.v1.FetchConfiguration.HeaderEntry - 58, // 44: wg.cosmo.node.v1.FetchConfiguration.body:type_name -> wg.cosmo.node.v1.ConfigurationVariable - 60, // 45: wg.cosmo.node.v1.FetchConfiguration.query:type_name -> wg.cosmo.node.v1.URLQueryConfiguration - 62, // 46: wg.cosmo.node.v1.FetchConfiguration.mtls:type_name -> wg.cosmo.node.v1.MTLSConfiguration - 58, // 47: wg.cosmo.node.v1.FetchConfiguration.base_url:type_name -> wg.cosmo.node.v1.ConfigurationVariable - 58, // 48: wg.cosmo.node.v1.FetchConfiguration.path:type_name -> wg.cosmo.node.v1.ConfigurationVariable - 58, // 49: wg.cosmo.node.v1.FetchConfiguration.http_proxy_url:type_name -> wg.cosmo.node.v1.ConfigurationVariable - 33, // 50: wg.cosmo.node.v1.DataSourceCustom_GraphQL.fetch:type_name -> wg.cosmo.node.v1.FetchConfiguration - 63, // 51: wg.cosmo.node.v1.DataSourceCustom_GraphQL.subscription:type_name -> wg.cosmo.node.v1.GraphQLSubscriptionConfiguration - 64, // 52: wg.cosmo.node.v1.DataSourceCustom_GraphQL.federation:type_name -> wg.cosmo.node.v1.GraphQLFederationConfiguration - 65, // 53: wg.cosmo.node.v1.DataSourceCustom_GraphQL.upstream_schema:type_name -> wg.cosmo.node.v1.InternedString - 66, // 54: wg.cosmo.node.v1.DataSourceCustom_GraphQL.custom_scalar_type_fields:type_name -> wg.cosmo.node.v1.SingleTypeField - 36, // 55: wg.cosmo.node.v1.DataSourceCustom_GraphQL.grpc:type_name -> wg.cosmo.node.v1.GRPCConfiguration - 40, // 56: wg.cosmo.node.v1.GRPCConfiguration.mapping:type_name -> wg.cosmo.node.v1.GRPCMapping - 38, // 57: wg.cosmo.node.v1.GRPCConfiguration.plugin:type_name -> wg.cosmo.node.v1.PluginConfiguration - 37, // 58: wg.cosmo.node.v1.PluginConfiguration.image_reference:type_name -> wg.cosmo.node.v1.ImageReference - 43, // 59: wg.cosmo.node.v1.GRPCMapping.operation_mappings:type_name -> wg.cosmo.node.v1.OperationMapping - 44, // 60: wg.cosmo.node.v1.GRPCMapping.entity_mappings:type_name -> wg.cosmo.node.v1.EntityMapping - 46, // 61: wg.cosmo.node.v1.GRPCMapping.type_field_mappings:type_name -> wg.cosmo.node.v1.TypeFieldMapping - 49, // 62: wg.cosmo.node.v1.GRPCMapping.enum_mappings:type_name -> wg.cosmo.node.v1.EnumMapping - 41, // 63: wg.cosmo.node.v1.GRPCMapping.resolve_mappings:type_name -> wg.cosmo.node.v1.LookupMapping - 3, // 64: wg.cosmo.node.v1.LookupMapping.type:type_name -> wg.cosmo.node.v1.LookupType - 42, // 65: wg.cosmo.node.v1.LookupMapping.lookup_mapping:type_name -> wg.cosmo.node.v1.LookupFieldMapping - 47, // 66: wg.cosmo.node.v1.LookupFieldMapping.field_mapping:type_name -> wg.cosmo.node.v1.FieldMapping - 4, // 67: wg.cosmo.node.v1.OperationMapping.type:type_name -> wg.cosmo.node.v1.OperationType - 45, // 68: wg.cosmo.node.v1.EntityMapping.required_field_mappings:type_name -> wg.cosmo.node.v1.RequiredFieldMapping - 47, // 69: wg.cosmo.node.v1.RequiredFieldMapping.field_mapping:type_name -> wg.cosmo.node.v1.FieldMapping - 47, // 70: wg.cosmo.node.v1.TypeFieldMapping.field_mappings:type_name -> wg.cosmo.node.v1.FieldMapping - 48, // 71: wg.cosmo.node.v1.FieldMapping.argument_mappings:type_name -> wg.cosmo.node.v1.ArgumentMapping - 50, // 72: wg.cosmo.node.v1.EnumMapping.values:type_name -> wg.cosmo.node.v1.EnumValueMapping - 55, // 73: wg.cosmo.node.v1.NatsEventConfiguration.engine_event_configuration:type_name -> wg.cosmo.node.v1.EngineEventConfiguration - 51, // 74: wg.cosmo.node.v1.NatsEventConfiguration.stream_configuration:type_name -> wg.cosmo.node.v1.NatsStreamConfiguration - 55, // 75: wg.cosmo.node.v1.KafkaEventConfiguration.engine_event_configuration:type_name -> wg.cosmo.node.v1.EngineEventConfiguration - 55, // 76: wg.cosmo.node.v1.RedisEventConfiguration.engine_event_configuration:type_name -> wg.cosmo.node.v1.EngineEventConfiguration - 5, // 77: wg.cosmo.node.v1.EngineEventConfiguration.type:type_name -> wg.cosmo.node.v1.EventType - 52, // 78: wg.cosmo.node.v1.DataSourceCustomEvents.nats:type_name -> wg.cosmo.node.v1.NatsEventConfiguration - 53, // 79: wg.cosmo.node.v1.DataSourceCustomEvents.kafka:type_name -> wg.cosmo.node.v1.KafkaEventConfiguration - 54, // 80: wg.cosmo.node.v1.DataSourceCustomEvents.redis:type_name -> wg.cosmo.node.v1.RedisEventConfiguration - 58, // 81: wg.cosmo.node.v1.DataSourceCustom_Static.data:type_name -> wg.cosmo.node.v1.ConfigurationVariable - 6, // 82: wg.cosmo.node.v1.ConfigurationVariable.kind:type_name -> wg.cosmo.node.v1.ConfigurationVariableKind - 58, // 83: wg.cosmo.node.v1.HTTPHeader.values:type_name -> wg.cosmo.node.v1.ConfigurationVariable - 58, // 84: wg.cosmo.node.v1.MTLSConfiguration.key:type_name -> wg.cosmo.node.v1.ConfigurationVariable - 58, // 85: wg.cosmo.node.v1.MTLSConfiguration.cert:type_name -> wg.cosmo.node.v1.ConfigurationVariable - 58, // 86: wg.cosmo.node.v1.GraphQLSubscriptionConfiguration.url:type_name -> wg.cosmo.node.v1.ConfigurationVariable - 83, // 87: wg.cosmo.node.v1.GraphQLSubscriptionConfiguration.protocol:type_name -> wg.cosmo.common.GraphQLSubscriptionProtocol - 84, // 88: wg.cosmo.node.v1.GraphQLSubscriptionConfiguration.websocketSubprotocol:type_name -> wg.cosmo.common.GraphQLWebsocketSubprotocol - 68, // 89: wg.cosmo.node.v1.SubscriptionFilterCondition.and:type_name -> wg.cosmo.node.v1.SubscriptionFilterCondition - 67, // 90: wg.cosmo.node.v1.SubscriptionFilterCondition.in:type_name -> wg.cosmo.node.v1.SubscriptionFieldCondition - 68, // 91: wg.cosmo.node.v1.SubscriptionFilterCondition.not:type_name -> wg.cosmo.node.v1.SubscriptionFilterCondition - 68, // 92: wg.cosmo.node.v1.SubscriptionFilterCondition.or:type_name -> wg.cosmo.node.v1.SubscriptionFilterCondition - 70, // 93: wg.cosmo.node.v1.CacheWarmerOperations.operations:type_name -> wg.cosmo.node.v1.Operation - 71, // 94: wg.cosmo.node.v1.Operation.request:type_name -> wg.cosmo.node.v1.OperationRequest - 74, // 95: wg.cosmo.node.v1.Operation.client:type_name -> wg.cosmo.node.v1.ClientInfo - 72, // 96: wg.cosmo.node.v1.OperationRequest.extensions:type_name -> wg.cosmo.node.v1.Extension - 73, // 97: wg.cosmo.node.v1.Extension.persisted_query:type_name -> wg.cosmo.node.v1.PersistedQuery - 10, // 98: wg.cosmo.node.v1.FeatureFlagRouterExecutionConfigs.ConfigByFeatureFlagNameEntry.value:type_name -> wg.cosmo.node.v1.FeatureFlagRouterExecutionConfig - 61, // 99: wg.cosmo.node.v1.FetchConfiguration.HeaderEntry.value:type_name -> wg.cosmo.node.v1.HTTPHeader - 16, // 100: wg.cosmo.node.v1.NodeService.SelfRegister:input_type -> wg.cosmo.node.v1.SelfRegisterRequest - 17, // 101: wg.cosmo.node.v1.NodeService.SelfRegister:output_type -> wg.cosmo.node.v1.SelfRegisterResponse - 101, // [101:102] is the sub-list for method output_type - 100, // [100:101] is the sub-list for method input_type - 100, // [100:100] is the sub-list for extension type_name - 100, // [100:100] is the sub-list for extension extendee - 0, // [0:100] is the sub-list for field type_name + 77, // 6: wg.cosmo.node.v1.ActiveGraphs.graphConfigs:type_name -> wg.cosmo.node.v1.ActiveGraphs.GraphConfigsEntry + 84, // 7: wg.cosmo.node.v1.Response.code:type_name -> wg.cosmo.common.EnumStatusCode + 16, // 8: wg.cosmo.node.v1.RegistrationInfo.account_limits:type_name -> wg.cosmo.node.v1.AccountLimits + 13, // 9: wg.cosmo.node.v1.SelfRegisterResponse.response:type_name -> wg.cosmo.node.v1.Response + 15, // 10: wg.cosmo.node.v1.SelfRegisterResponse.registrationInfo:type_name -> wg.cosmo.node.v1.RegistrationInfo + 20, // 11: wg.cosmo.node.v1.EngineConfiguration.datasource_configurations:type_name -> wg.cosmo.node.v1.DataSourceConfiguration + 27, // 12: wg.cosmo.node.v1.EngineConfiguration.field_configurations:type_name -> wg.cosmo.node.v1.FieldConfiguration + 28, // 13: wg.cosmo.node.v1.EngineConfiguration.type_configurations:type_name -> wg.cosmo.node.v1.TypeConfiguration + 78, // 14: wg.cosmo.node.v1.EngineConfiguration.string_storage:type_name -> wg.cosmo.node.v1.EngineConfiguration.StringStorageEntry + 2, // 15: wg.cosmo.node.v1.DataSourceConfiguration.kind:type_name -> wg.cosmo.node.v1.DataSourceKind + 29, // 16: wg.cosmo.node.v1.DataSourceConfiguration.root_nodes:type_name -> wg.cosmo.node.v1.TypeField + 29, // 17: wg.cosmo.node.v1.DataSourceConfiguration.child_nodes:type_name -> wg.cosmo.node.v1.TypeField + 36, // 18: wg.cosmo.node.v1.DataSourceConfiguration.custom_graphql:type_name -> wg.cosmo.node.v1.DataSourceCustom_GraphQL + 58, // 19: wg.cosmo.node.v1.DataSourceConfiguration.custom_static:type_name -> wg.cosmo.node.v1.DataSourceCustom_Static + 60, // 20: wg.cosmo.node.v1.DataSourceConfiguration.directives:type_name -> wg.cosmo.node.v1.DirectiveConfiguration + 32, // 21: wg.cosmo.node.v1.DataSourceConfiguration.keys:type_name -> wg.cosmo.node.v1.RequiredField + 32, // 22: wg.cosmo.node.v1.DataSourceConfiguration.provides:type_name -> wg.cosmo.node.v1.RequiredField + 32, // 23: wg.cosmo.node.v1.DataSourceConfiguration.requires:type_name -> wg.cosmo.node.v1.RequiredField + 57, // 24: wg.cosmo.node.v1.DataSourceConfiguration.custom_events:type_name -> wg.cosmo.node.v1.DataSourceCustomEvents + 33, // 25: wg.cosmo.node.v1.DataSourceConfiguration.entity_interfaces:type_name -> wg.cosmo.node.v1.EntityInterfaceConfiguration + 33, // 26: wg.cosmo.node.v1.DataSourceConfiguration.interface_objects:type_name -> wg.cosmo.node.v1.EntityInterfaceConfiguration + 21, // 27: wg.cosmo.node.v1.DataSourceConfiguration.cost_configuration:type_name -> wg.cosmo.node.v1.CostConfiguration + 22, // 28: wg.cosmo.node.v1.CostConfiguration.field_weights:type_name -> wg.cosmo.node.v1.FieldWeightConfiguration + 23, // 29: wg.cosmo.node.v1.CostConfiguration.list_sizes:type_name -> wg.cosmo.node.v1.FieldListSizeConfiguration + 79, // 30: wg.cosmo.node.v1.CostConfiguration.type_weights:type_name -> wg.cosmo.node.v1.CostConfiguration.TypeWeightsEntry + 80, // 31: wg.cosmo.node.v1.CostConfiguration.directive_argument_weights:type_name -> wg.cosmo.node.v1.CostConfiguration.DirectiveArgumentWeightsEntry + 81, // 32: wg.cosmo.node.v1.FieldWeightConfiguration.argument_weights:type_name -> wg.cosmo.node.v1.FieldWeightConfiguration.ArgumentWeightsEntry + 82, // 33: wg.cosmo.node.v1.FieldWeightConfiguration.directive_argument_weights:type_name -> wg.cosmo.node.v1.FieldWeightConfiguration.DirectiveArgumentWeightsEntry + 1, // 34: wg.cosmo.node.v1.ArgumentConfiguration.source_type:type_name -> wg.cosmo.node.v1.ArgumentSource + 25, // 35: wg.cosmo.node.v1.AuthorizationConfiguration.required_or_scopes:type_name -> wg.cosmo.node.v1.Scopes + 25, // 36: wg.cosmo.node.v1.AuthorizationConfiguration.required_or_scopes_by_or:type_name -> wg.cosmo.node.v1.Scopes + 24, // 37: wg.cosmo.node.v1.FieldConfiguration.arguments_configuration:type_name -> wg.cosmo.node.v1.ArgumentConfiguration + 26, // 38: wg.cosmo.node.v1.FieldConfiguration.authorization_configuration:type_name -> wg.cosmo.node.v1.AuthorizationConfiguration + 69, // 39: wg.cosmo.node.v1.FieldConfiguration.subscription_filter_condition:type_name -> wg.cosmo.node.v1.SubscriptionFilterCondition + 30, // 40: wg.cosmo.node.v1.FieldSetCondition.field_coordinates_path:type_name -> wg.cosmo.node.v1.FieldCoordinates + 31, // 41: wg.cosmo.node.v1.RequiredField.conditions:type_name -> wg.cosmo.node.v1.FieldSetCondition + 59, // 42: wg.cosmo.node.v1.FetchConfiguration.url:type_name -> wg.cosmo.node.v1.ConfigurationVariable + 7, // 43: wg.cosmo.node.v1.FetchConfiguration.method:type_name -> wg.cosmo.node.v1.HTTPMethod + 83, // 44: wg.cosmo.node.v1.FetchConfiguration.header:type_name -> wg.cosmo.node.v1.FetchConfiguration.HeaderEntry + 59, // 45: wg.cosmo.node.v1.FetchConfiguration.body:type_name -> wg.cosmo.node.v1.ConfigurationVariable + 61, // 46: wg.cosmo.node.v1.FetchConfiguration.query:type_name -> wg.cosmo.node.v1.URLQueryConfiguration + 63, // 47: wg.cosmo.node.v1.FetchConfiguration.mtls:type_name -> wg.cosmo.node.v1.MTLSConfiguration + 59, // 48: wg.cosmo.node.v1.FetchConfiguration.base_url:type_name -> wg.cosmo.node.v1.ConfigurationVariable + 59, // 49: wg.cosmo.node.v1.FetchConfiguration.path:type_name -> wg.cosmo.node.v1.ConfigurationVariable + 59, // 50: wg.cosmo.node.v1.FetchConfiguration.http_proxy_url:type_name -> wg.cosmo.node.v1.ConfigurationVariable + 34, // 51: wg.cosmo.node.v1.DataSourceCustom_GraphQL.fetch:type_name -> wg.cosmo.node.v1.FetchConfiguration + 64, // 52: wg.cosmo.node.v1.DataSourceCustom_GraphQL.subscription:type_name -> wg.cosmo.node.v1.GraphQLSubscriptionConfiguration + 65, // 53: wg.cosmo.node.v1.DataSourceCustom_GraphQL.federation:type_name -> wg.cosmo.node.v1.GraphQLFederationConfiguration + 66, // 54: wg.cosmo.node.v1.DataSourceCustom_GraphQL.upstream_schema:type_name -> wg.cosmo.node.v1.InternedString + 67, // 55: wg.cosmo.node.v1.DataSourceCustom_GraphQL.custom_scalar_type_fields:type_name -> wg.cosmo.node.v1.SingleTypeField + 37, // 56: wg.cosmo.node.v1.DataSourceCustom_GraphQL.grpc:type_name -> wg.cosmo.node.v1.GRPCConfiguration + 41, // 57: wg.cosmo.node.v1.GRPCConfiguration.mapping:type_name -> wg.cosmo.node.v1.GRPCMapping + 39, // 58: wg.cosmo.node.v1.GRPCConfiguration.plugin:type_name -> wg.cosmo.node.v1.PluginConfiguration + 38, // 59: wg.cosmo.node.v1.PluginConfiguration.image_reference:type_name -> wg.cosmo.node.v1.ImageReference + 44, // 60: wg.cosmo.node.v1.GRPCMapping.operation_mappings:type_name -> wg.cosmo.node.v1.OperationMapping + 45, // 61: wg.cosmo.node.v1.GRPCMapping.entity_mappings:type_name -> wg.cosmo.node.v1.EntityMapping + 47, // 62: wg.cosmo.node.v1.GRPCMapping.type_field_mappings:type_name -> wg.cosmo.node.v1.TypeFieldMapping + 50, // 63: wg.cosmo.node.v1.GRPCMapping.enum_mappings:type_name -> wg.cosmo.node.v1.EnumMapping + 42, // 64: wg.cosmo.node.v1.GRPCMapping.resolve_mappings:type_name -> wg.cosmo.node.v1.LookupMapping + 3, // 65: wg.cosmo.node.v1.LookupMapping.type:type_name -> wg.cosmo.node.v1.LookupType + 43, // 66: wg.cosmo.node.v1.LookupMapping.lookup_mapping:type_name -> wg.cosmo.node.v1.LookupFieldMapping + 48, // 67: wg.cosmo.node.v1.LookupFieldMapping.field_mapping:type_name -> wg.cosmo.node.v1.FieldMapping + 4, // 68: wg.cosmo.node.v1.OperationMapping.type:type_name -> wg.cosmo.node.v1.OperationType + 46, // 69: wg.cosmo.node.v1.EntityMapping.required_field_mappings:type_name -> wg.cosmo.node.v1.RequiredFieldMapping + 48, // 70: wg.cosmo.node.v1.RequiredFieldMapping.field_mapping:type_name -> wg.cosmo.node.v1.FieldMapping + 48, // 71: wg.cosmo.node.v1.TypeFieldMapping.field_mappings:type_name -> wg.cosmo.node.v1.FieldMapping + 49, // 72: wg.cosmo.node.v1.FieldMapping.argument_mappings:type_name -> wg.cosmo.node.v1.ArgumentMapping + 51, // 73: wg.cosmo.node.v1.EnumMapping.values:type_name -> wg.cosmo.node.v1.EnumValueMapping + 56, // 74: wg.cosmo.node.v1.NatsEventConfiguration.engine_event_configuration:type_name -> wg.cosmo.node.v1.EngineEventConfiguration + 52, // 75: wg.cosmo.node.v1.NatsEventConfiguration.stream_configuration:type_name -> wg.cosmo.node.v1.NatsStreamConfiguration + 56, // 76: wg.cosmo.node.v1.KafkaEventConfiguration.engine_event_configuration:type_name -> wg.cosmo.node.v1.EngineEventConfiguration + 56, // 77: wg.cosmo.node.v1.RedisEventConfiguration.engine_event_configuration:type_name -> wg.cosmo.node.v1.EngineEventConfiguration + 5, // 78: wg.cosmo.node.v1.EngineEventConfiguration.type:type_name -> wg.cosmo.node.v1.EventType + 53, // 79: wg.cosmo.node.v1.DataSourceCustomEvents.nats:type_name -> wg.cosmo.node.v1.NatsEventConfiguration + 54, // 80: wg.cosmo.node.v1.DataSourceCustomEvents.kafka:type_name -> wg.cosmo.node.v1.KafkaEventConfiguration + 55, // 81: wg.cosmo.node.v1.DataSourceCustomEvents.redis:type_name -> wg.cosmo.node.v1.RedisEventConfiguration + 59, // 82: wg.cosmo.node.v1.DataSourceCustom_Static.data:type_name -> wg.cosmo.node.v1.ConfigurationVariable + 6, // 83: wg.cosmo.node.v1.ConfigurationVariable.kind:type_name -> wg.cosmo.node.v1.ConfigurationVariableKind + 59, // 84: wg.cosmo.node.v1.HTTPHeader.values:type_name -> wg.cosmo.node.v1.ConfigurationVariable + 59, // 85: wg.cosmo.node.v1.MTLSConfiguration.key:type_name -> wg.cosmo.node.v1.ConfigurationVariable + 59, // 86: wg.cosmo.node.v1.MTLSConfiguration.cert:type_name -> wg.cosmo.node.v1.ConfigurationVariable + 59, // 87: wg.cosmo.node.v1.GraphQLSubscriptionConfiguration.url:type_name -> wg.cosmo.node.v1.ConfigurationVariable + 85, // 88: wg.cosmo.node.v1.GraphQLSubscriptionConfiguration.protocol:type_name -> wg.cosmo.common.GraphQLSubscriptionProtocol + 86, // 89: wg.cosmo.node.v1.GraphQLSubscriptionConfiguration.websocketSubprotocol:type_name -> wg.cosmo.common.GraphQLWebsocketSubprotocol + 69, // 90: wg.cosmo.node.v1.SubscriptionFilterCondition.and:type_name -> wg.cosmo.node.v1.SubscriptionFilterCondition + 68, // 91: wg.cosmo.node.v1.SubscriptionFilterCondition.in:type_name -> wg.cosmo.node.v1.SubscriptionFieldCondition + 69, // 92: wg.cosmo.node.v1.SubscriptionFilterCondition.not:type_name -> wg.cosmo.node.v1.SubscriptionFilterCondition + 69, // 93: wg.cosmo.node.v1.SubscriptionFilterCondition.or:type_name -> wg.cosmo.node.v1.SubscriptionFilterCondition + 71, // 94: wg.cosmo.node.v1.CacheWarmerOperations.operations:type_name -> wg.cosmo.node.v1.Operation + 72, // 95: wg.cosmo.node.v1.Operation.request:type_name -> wg.cosmo.node.v1.OperationRequest + 75, // 96: wg.cosmo.node.v1.Operation.client:type_name -> wg.cosmo.node.v1.ClientInfo + 73, // 97: wg.cosmo.node.v1.OperationRequest.extensions:type_name -> wg.cosmo.node.v1.Extension + 74, // 98: wg.cosmo.node.v1.Extension.persisted_query:type_name -> wg.cosmo.node.v1.PersistedQuery + 10, // 99: wg.cosmo.node.v1.FeatureFlagRouterExecutionConfigs.ConfigByFeatureFlagNameEntry.value:type_name -> wg.cosmo.node.v1.FeatureFlagRouterExecutionConfig + 62, // 100: wg.cosmo.node.v1.FetchConfiguration.HeaderEntry.value:type_name -> wg.cosmo.node.v1.HTTPHeader + 17, // 101: wg.cosmo.node.v1.NodeService.SelfRegister:input_type -> wg.cosmo.node.v1.SelfRegisterRequest + 18, // 102: wg.cosmo.node.v1.NodeService.SelfRegister:output_type -> wg.cosmo.node.v1.SelfRegisterResponse + 102, // [102:103] is the sub-list for method output_type + 101, // [101:102] is the sub-list for method input_type + 101, // [101:101] is the sub-list for extension type_name + 101, // [101:101] is the sub-list for extension extendee + 0, // [0:101] is the sub-list for field type_name } func init() { file_wg_cosmo_node_v1_node_proto_init() } @@ -5234,23 +5288,23 @@ func file_wg_cosmo_node_v1_node_proto_init() { return } file_wg_cosmo_node_v1_node_proto_msgTypes[3].OneofWrappers = []any{} - file_wg_cosmo_node_v1_node_proto_msgTypes[4].OneofWrappers = []any{} - file_wg_cosmo_node_v1_node_proto_msgTypes[9].OneofWrappers = []any{} + file_wg_cosmo_node_v1_node_proto_msgTypes[5].OneofWrappers = []any{} file_wg_cosmo_node_v1_node_proto_msgTypes[10].OneofWrappers = []any{} - file_wg_cosmo_node_v1_node_proto_msgTypes[13].OneofWrappers = []any{} + file_wg_cosmo_node_v1_node_proto_msgTypes[11].OneofWrappers = []any{} file_wg_cosmo_node_v1_node_proto_msgTypes[14].OneofWrappers = []any{} - file_wg_cosmo_node_v1_node_proto_msgTypes[18].OneofWrappers = []any{} - file_wg_cosmo_node_v1_node_proto_msgTypes[25].OneofWrappers = []any{} - file_wg_cosmo_node_v1_node_proto_msgTypes[30].OneofWrappers = []any{} - file_wg_cosmo_node_v1_node_proto_msgTypes[55].OneofWrappers = []any{} - file_wg_cosmo_node_v1_node_proto_msgTypes[60].OneofWrappers = []any{} + file_wg_cosmo_node_v1_node_proto_msgTypes[15].OneofWrappers = []any{} + file_wg_cosmo_node_v1_node_proto_msgTypes[19].OneofWrappers = []any{} + file_wg_cosmo_node_v1_node_proto_msgTypes[26].OneofWrappers = []any{} + file_wg_cosmo_node_v1_node_proto_msgTypes[31].OneofWrappers = []any{} + file_wg_cosmo_node_v1_node_proto_msgTypes[56].OneofWrappers = []any{} + file_wg_cosmo_node_v1_node_proto_msgTypes[61].OneofWrappers = []any{} type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: unsafe.Slice(unsafe.StringData(file_wg_cosmo_node_v1_node_proto_rawDesc), len(file_wg_cosmo_node_v1_node_proto_rawDesc)), NumEnums: 8, - NumMessages: 74, + NumMessages: 76, NumExtensions: 0, NumServices: 1, }, From 787d2d07fd6819f218987808f8b8483d09a95612 Mon Sep 17 00:00:00 2001 From: Dominik Korittki <23359034+dkorittki@users.noreply.github.com> Date: Tue, 5 May 2026 12:35:45 +0000 Subject: [PATCH 03/26] feat(router): allow split config polling (#2814) --- router/core/init_config_poller.go | 51 ++ router/internal/jwt/claims.go | 30 +- .../configpoller/split_config_poller.go | 277 +++++++++++ .../configpoller/split_config_poller_test.go | 450 ++++++++++++++++++ router/pkg/routerconfig/cdn/split_fetcher.go | 229 +++++++++ .../routerconfig/cdn/split_fetcher_test.go | 439 +++++++++++++++++ 6 files changed, 1474 insertions(+), 2 deletions(-) create mode 100644 router/pkg/controlplane/configpoller/split_config_poller.go create mode 100644 router/pkg/controlplane/configpoller/split_config_poller_test.go create mode 100644 router/pkg/routerconfig/cdn/split_fetcher.go create mode 100644 router/pkg/routerconfig/cdn/split_fetcher_test.go diff --git a/router/core/init_config_poller.go b/router/core/init_config_poller.go index b8358ccae0..2748be71f5 100644 --- a/router/core/init_config_poller.go +++ b/router/core/init_config_poller.go @@ -4,6 +4,7 @@ import ( "errors" "fmt" + rjwt "github.com/wundergraph/cosmo/router/internal/jwt" "github.com/wundergraph/cosmo/router/pkg/controlplane/configpoller" "github.com/wundergraph/cosmo/router/pkg/execution_config" "github.com/wundergraph/cosmo/router/pkg/routerconfig" @@ -125,6 +126,22 @@ func InitializeConfigPoller(r *Router, registry *ProviderRegistry) (*configpolle return nil, nil } + // Check whether the router JWT requests the split-config-loading strategy. + // Split config is only supported with the default Cosmo CDN (no custom storage provider). + hasSplitCfgFeature, err := hasSplitConfigFeature(r) + if err != nil { + return nil, err + } + + if hasSplitCfgFeature { + providerID := r.routerConfigPollerConfig.Storage.ProviderID + if providerID == "" { + return newSplitConfigPoller(r) + } + r.logger.Info("split-config-loading feature is enabled but a custom storage provider is configured; falling back to regular config polling", + zap.String("provider_id", providerID)) + } + primaryClient, err := getConfigClient(r, registry, r.routerConfigPollerConfig.Storage.ProviderID, false) if err != nil { return nil, err @@ -159,3 +176,37 @@ func InitializeConfigPoller(r *Router, registry *ProviderRegistry) (*configpolle return &configPoller, nil } + +func hasSplitConfigFeature(r *Router) (bool, error) { + if r.graphApiToken == "" { + return false, nil + } + + claims, err := rjwt.ExtractFederatedGraphTokenClaims(r.graphApiToken) + if err != nil { + return false, fmt.Errorf("failed to parse graph API token: %w", err) + } + + return claims.HasFeature(rjwt.FeatureSplitConfigLoading), nil +} + +func newSplitConfigPoller(r *Router) (*configpoller.ConfigPoller, error) { + fetcher, err := configCDNProvider.NewSplitFetcher( + r.cdnConfig.URL, + r.graphApiToken, + &configCDNProvider.Options{ + Logger: r.logger, + SignatureKey: r.routerConfigPollerConfig.GraphSignKey, + }, + ) + if err != nil { + return nil, fmt.Errorf("failed to create split config fetcher: %w", err) + } + + splitPoller := configpoller.NewSplitConfigPoller( + fetcher, + configpoller.WithSplitLogger(r.logger), + configpoller.WithSplitPolling(r.routerConfigPollerConfig.PollInterval, r.routerConfigPollerConfig.PollJitter), + ) + return &splitPoller, nil +} diff --git a/router/internal/jwt/claims.go b/router/internal/jwt/claims.go index b6b60f832b..cdf8f78a00 100644 --- a/router/internal/jwt/claims.go +++ b/router/internal/jwt/claims.go @@ -2,17 +2,27 @@ package jwt import ( "fmt" + "slices" + "github.com/golang-jwt/jwt/v5" ) const ( - FederatedGraphIDClaim = "federated_graph_id" - OrganizationIDClaim = "organization_id" + FederatedGraphIDClaim = "federated_graph_id" + OrganizationIDClaim = "organization_id" + FeaturesClaim = "features" + FeatureSplitConfigLoading = "split-config-loading" ) type FederatedGraphTokenClaims struct { FederatedGraphID string OrganizationID string + Features []string +} + +// HasFeature reports whether the given feature flag is present in the token claims. +func (c *FederatedGraphTokenClaims) HasFeature(feature string) bool { + return slices.Contains(c.Features, feature) } func ExtractFederatedGraphTokenClaims(token string) (*FederatedGraphTokenClaims, error) { @@ -44,8 +54,24 @@ func ExtractFederatedGraphTokenClaims(token string) (*FederatedGraphTokenClaims, return nil, fmt.Errorf("invalid token claims, %q is not a string, it's %T", OrganizationIDClaim, organizationIDValue) } + var features []string + if featuresValue := claims[FeaturesClaim]; featuresValue != nil { + featuresSlice, ok := featuresValue.([]any) + if !ok { + return nil, fmt.Errorf("invalid token claims, %q is not an array, it's %T", FeaturesClaim, featuresValue) + } + for _, v := range featuresSlice { + s, ok := v.(string) + if !ok { + return nil, fmt.Errorf("invalid token claims, %q contains a non-string element %T", FeaturesClaim, v) + } + features = append(features, s) + } + } + return &FederatedGraphTokenClaims{ FederatedGraphID: federatedGraphID, OrganizationID: organizationID, + Features: features, }, nil } diff --git a/router/pkg/controlplane/configpoller/split_config_poller.go b/router/pkg/controlplane/configpoller/split_config_poller.go new file mode 100644 index 0000000000..ed661e4efe --- /dev/null +++ b/router/pkg/controlplane/configpoller/split_config_poller.go @@ -0,0 +1,277 @@ +package configpoller + +import ( + "context" + "fmt" + "slices" + "time" + + "github.com/cespare/xxhash/v2" + nodev1 "github.com/wundergraph/cosmo/router/gen/proto/wg/cosmo/node/v1" + "github.com/wundergraph/cosmo/router/pkg/controlplane" + "github.com/wundergraph/cosmo/router/pkg/routerconfig" + "go.uber.org/zap" + "google.golang.org/protobuf/proto" +) + +// SplitConfigFetcher fetches individual graph configs from CDN using the split-config strategy. +type SplitConfigFetcher interface { + // FetchMapper fetches the mapper file listing all active graphs and their hashes. + FetchMapper(ctx context.Context) (*nodev1.ActiveGraphs, error) + // FetchConfig fetches the router config for the given feature flag name. + // featureFlagName="" fetches the base graph (manifest/latest.json). + // featureFlagName="X" fetches the feature flag config (manifest/feature-flags/X.json). + FetchConfig(ctx context.Context, featureFlagName string) (*nodev1.RouterConfig, error) +} + +// SplitConfigPollerOption configures a splitConfigPoller. +type SplitConfigPollerOption func(*splitConfigPoller) + +type splitConfigPoller struct { + logger *zap.Logger + poller controlplane.Poller + pollInterval time.Duration + pollJitter time.Duration + fetcher SplitConfigFetcher + + // Internal state – not safe for concurrent access. + knownHashes map[string]string // name -> hash from last successful mapper fetch ("" = base) + currentConfig *nodev1.RouterConfig // last successfully assembled full config + latestVersion string // composite hash used for change detection +} + +// NewSplitConfigPoller creates a ConfigPoller that uses the split-config strategy. +func NewSplitConfigPoller(fetcher SplitConfigFetcher, opts ...SplitConfigPollerOption) ConfigPoller { + p := &splitConfigPoller{ + fetcher: fetcher, + knownHashes: make(map[string]string), + } + for _, opt := range opts { + opt(p) + } + if p.logger == nil { + p.logger = zap.NewNop() + } + p.poller = controlplane.NewPoll(p.pollInterval, p.pollJitter) + return p +} + +// WithSplitLogger sets the logger for the split config poller. +func WithSplitLogger(logger *zap.Logger) SplitConfigPollerOption { + return func(p *splitConfigPoller) { + p.logger = logger + } +} + +// WithSplitPolling sets the polling interval and jitter for the split config poller. +func WithSplitPolling(interval time.Duration, jitter time.Duration) SplitConfigPollerOption { + return func(p *splitConfigPoller) { + p.pollInterval = interval + p.pollJitter = jitter + } +} + +// computeCompositeVersion returns a deterministic version string derived from all mapper entries. +func computeCompositeVersion(graphConfigs map[string]string) string { + keys := make([]string, 0, len(graphConfigs)) + for k := range graphConfigs { + keys = append(keys, k) + } + slices.Sort(keys) + + h := xxhash.New() + for _, k := range keys { + _, _ = h.Write([]byte(k + ":" + graphConfigs[k] + ";")) + } + return fmt.Sprintf("split-%x", h.Sum64()) +} + +// fetchAndAssembleAll fetches every config listed in activeGraphs and assembles a full RouterConfig. +func (p *splitConfigPoller) fetchAndAssembleAll(ctx context.Context, activeGraphs *nodev1.ActiveGraphs) (*nodev1.RouterConfig, error) { + // Fetch base graph. + baseConfig, err := p.fetcher.FetchConfig(ctx, "") + if err != nil { + return nil, fmt.Errorf("failed to fetch base config: %w", err) + } + + assembled := &nodev1.RouterConfig{ + EngineConfig: baseConfig.EngineConfig, + Version: baseConfig.Version, + Subgraphs: baseConfig.Subgraphs, + CompatibilityVersion: baseConfig.CompatibilityVersion, + } + + // Fetch feature flag configs. + for name := range activeGraphs.GetGraphConfigs() { + if name == "" { + continue // base graph already handled above + } + ffConfig, err := p.fetcher.FetchConfig(ctx, name) + if err != nil { + return nil, fmt.Errorf("failed to fetch config for feature flag %q: %w", name, err) + } + if assembled.FeatureFlagConfigs == nil { + assembled.FeatureFlagConfigs = &nodev1.FeatureFlagRouterExecutionConfigs{ + ConfigByFeatureFlagName: make(map[string]*nodev1.FeatureFlagRouterExecutionConfig), + } + } + assembled.FeatureFlagConfigs.ConfigByFeatureFlagName[name] = &nodev1.FeatureFlagRouterExecutionConfig{ + EngineConfig: ffConfig.EngineConfig, + Version: ffConfig.Version, + Subgraphs: ffConfig.Subgraphs, + } + } + + return assembled, nil +} + +// GetRouterConfig performs the initial fetch: mapper + all individual configs. +func (p *splitConfigPoller) GetRouterConfig(ctx context.Context) (*routerconfig.Response, error) { + activeGraphs, err := p.fetcher.FetchMapper(ctx) + if err != nil { + return nil, fmt.Errorf("failed to fetch mapper: %w", err) + } + + graphConfigs := activeGraphs.GetGraphConfigs() + if len(graphConfigs) == 0 { + return nil, fmt.Errorf("mapper returned empty graph configs") + } + + config, err := p.fetchAndAssembleAll(ctx, activeGraphs) + if err != nil { + return nil, err + } + + p.knownHashes = graphConfigs + p.currentConfig = config + p.latestVersion = computeCompositeVersion(graphConfigs) + + return &routerconfig.Response{Config: config}, nil +} + +// Subscribe starts the polling loop and calls handler whenever the assembled config changes. +func (p *splitConfigPoller) Subscribe(ctx context.Context, handler func(newConfig *nodev1.RouterConfig, oldVersion string) error) { + p.poller.Subscribe(ctx, func() { + fetchStart := time.Now() + + activeGraphs, err := p.fetcher.FetchMapper(ctx) + if err != nil { + p.logger.Error("Failed to fetch mapper during poll, keeping existing config", zap.Error(err)) + return + } + + graphConfigs := activeGraphs.GetGraphConfigs() + if len(graphConfigs) == 0 { + p.logger.Warn("Mapper returned empty graph configs, keeping existing config") + return + } + + if _, ok := graphConfigs[""]; !ok { + p.logger.Warn("Mapper missing base graph entry, keeping existing config") + return + } + + newVersion := computeCompositeVersion(graphConfigs) + if newVersion == p.latestVersion { + p.logger.Debug("No changes detected in engine config, keeping existing config") + return + } + + p.logger.Info("Router execution config has changed, hot reloading server", + zap.String("old_version", p.latestVersion), + zap.String("new_version", newVersion), + zap.String("fetch_time", time.Since(fetchStart).String()), + ) + + // Determine what changed, was added, or was removed. + changed := make(map[string]struct{}) + added := make(map[string]struct{}) + removed := make(map[string]struct{}) + + for name, hash := range graphConfigs { + if oldHash, exists := p.knownHashes[name]; !exists { + added[name] = struct{}{} + } else if oldHash != hash { + changed[name] = struct{}{} + } + } + for name := range p.knownHashes { + if _, exists := graphConfigs[name]; !exists { + removed[name] = struct{}{} + } + } + + // Clone the in-use config before mutating. + patched := proto.Clone(p.currentConfig).(*nodev1.RouterConfig) + + // Apply changes and additions. + toFetch := make(map[string]struct{}, len(changed)+len(added)) + for name := range changed { + toFetch[name] = struct{}{} + } + for name := range added { + toFetch[name] = struct{}{} + } + + for name := range toFetch { + fetchedConfig, err := p.fetcher.FetchConfig(ctx, name) + if err != nil { + p.logger.Error("Failed to fetch config, skipping entire update", + zap.String("name", name), + zap.Error(err), + ) + return + } + + if name == "" { + // Base graph update. + patched.EngineConfig = fetchedConfig.EngineConfig + patched.Version = fetchedConfig.Version + patched.Subgraphs = fetchedConfig.Subgraphs + patched.CompatibilityVersion = fetchedConfig.CompatibilityVersion + } else { + if patched.FeatureFlagConfigs == nil { + patched.FeatureFlagConfigs = &nodev1.FeatureFlagRouterExecutionConfigs{ + ConfigByFeatureFlagName: make(map[string]*nodev1.FeatureFlagRouterExecutionConfig), + } + } + patched.FeatureFlagConfigs.ConfigByFeatureFlagName[name] = &nodev1.FeatureFlagRouterExecutionConfig{ + EngineConfig: fetchedConfig.EngineConfig, + Version: fetchedConfig.Version, + Subgraphs: fetchedConfig.Subgraphs, + } + } + } + + // Remove deleted feature flags. + for name := range removed { + if name == "" { + continue // base graph cannot be removed + } + if patched.FeatureFlagConfigs != nil { + delete(patched.FeatureFlagConfigs.ConfigByFeatureFlagName, name) + if len(patched.FeatureFlagConfigs.ConfigByFeatureFlagName) == 0 { + patched.FeatureFlagConfigs = nil + } + } + } + + oldVersion := p.latestVersion + + handlerStart := time.Now() + if err := handler(patched, oldVersion); err != nil { + p.logger.Error("Error invoking config poll handler", zap.Error(err)) + return + } + + p.logger.Debug("New graph server swapped", + zap.String("duration", time.Since(handlerStart).String()), + zap.String("config_version", newVersion), + ) + + // Only update internal state after the handler succeeds. + p.knownHashes = graphConfigs + p.currentConfig = patched + p.latestVersion = newVersion + }) +} diff --git a/router/pkg/controlplane/configpoller/split_config_poller_test.go b/router/pkg/controlplane/configpoller/split_config_poller_test.go new file mode 100644 index 0000000000..6760ce89c9 --- /dev/null +++ b/router/pkg/controlplane/configpoller/split_config_poller_test.go @@ -0,0 +1,450 @@ +package configpoller + +import ( + "context" + "errors" + "testing" + "time" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + nodev1 "github.com/wundergraph/cosmo/router/gen/proto/wg/cosmo/node/v1" + "go.uber.org/zap" +) + +// mockSplitFetcher is a controllable implementation of SplitConfigFetcher for tests. +type mockSplitFetcher struct { + mapperResult *nodev1.ActiveGraphs + mapperErr error + // configResults maps feature flag name -> result (use "" for base graph) + configResults map[string]*nodev1.RouterConfig + configErrors map[string]error + // tracks calls for assertion + fetchConfigCalls []string + fetchMapperCalls int +} + +func (m *mockSplitFetcher) FetchMapper(_ context.Context) (*nodev1.ActiveGraphs, error) { + m.fetchMapperCalls++ + return m.mapperResult, m.mapperErr +} + +func (m *mockSplitFetcher) FetchConfig(_ context.Context, featureFlagName string) (*nodev1.RouterConfig, error) { + m.fetchConfigCalls = append(m.fetchConfigCalls, featureFlagName) + if err, ok := m.configErrors[featureFlagName]; ok { + return nil, err + } + if cfg, ok := m.configResults[featureFlagName]; ok { + return cfg, nil + } + return nil, errors.New("no config registered for: " + featureFlagName) +} + +func makeRouterConfig(version string) *nodev1.RouterConfig { + return &nodev1.RouterConfig{ + Version: version, + EngineConfig: &nodev1.EngineConfiguration{ + DefaultFlushInterval: 500, + }, + CompatibilityVersion: "1", + } +} + +func makeActiveGraphs(entries map[string]string) *nodev1.ActiveGraphs { + return &nodev1.ActiveGraphs{GraphConfigs: entries} +} + +// newTestPoller builds a splitConfigPoller wired to the given mock fetcher. +// The polling interval is set long enough that Subscribe won't fire automatically in tests. +func newTestPoller(fetcher SplitConfigFetcher) *splitConfigPoller { + p := &splitConfigPoller{ + fetcher: fetcher, + knownHashes: make(map[string]string), + pollInterval: 24 * time.Hour, + pollJitter: 0, + logger: zap.NewNop(), + } + return p +} + +// ---- GetRouterConfig tests ---- + +func TestSplitGetRouterConfig_BaseOnly(t *testing.T) { + baseCfg := makeRouterConfig("v1") + mock := &mockSplitFetcher{ + mapperResult: makeActiveGraphs(map[string]string{"": "hash-base"}), + configResults: map[string]*nodev1.RouterConfig{"": baseCfg}, + } + + p := newTestPoller(mock) + resp, err := p.GetRouterConfig(context.Background()) + require.NoError(t, err) + require.NotNil(t, resp) + + assert.Equal(t, "v1", resp.Config.Version) + assert.Nil(t, resp.Config.FeatureFlagConfigs) + assert.Equal(t, "hash-base", p.knownHashes[""]) + assert.Contains(t, p.latestVersion, "split-") +} + +func TestSplitGetRouterConfig_WithFeatureFlags(t *testing.T) { + baseCfg := makeRouterConfig("v1") + ffCfg := makeRouterConfig("ff-v1") + mock := &mockSplitFetcher{ + mapperResult: makeActiveGraphs(map[string]string{ + "": "hash-base", + "ff1": "hash-ff1", + }), + configResults: map[string]*nodev1.RouterConfig{ + "": baseCfg, + "ff1": ffCfg, + }, + } + + p := newTestPoller(mock) + resp, err := p.GetRouterConfig(context.Background()) + require.NoError(t, err) + + assert.Equal(t, "v1", resp.Config.Version) + require.NotNil(t, resp.Config.FeatureFlagConfigs) + ff := resp.Config.FeatureFlagConfigs.ConfigByFeatureFlagName["ff1"] + require.NotNil(t, ff) + assert.Equal(t, "ff-v1", ff.Version) + + assert.Equal(t, "hash-base", p.knownHashes[""]) + assert.Equal(t, "hash-ff1", p.knownHashes["ff1"]) +} + +func TestSplitGetRouterConfig_MapperError(t *testing.T) { + mock := &mockSplitFetcher{ + mapperErr: errors.New("network error"), + } + p := newTestPoller(mock) + _, err := p.GetRouterConfig(context.Background()) + require.Error(t, err) + assert.Contains(t, err.Error(), "network error") +} + +func TestSplitGetRouterConfig_EmptyMapper(t *testing.T) { + mock := &mockSplitFetcher{ + mapperResult: makeActiveGraphs(map[string]string{}), + } + p := newTestPoller(mock) + _, err := p.GetRouterConfig(context.Background()) + require.Error(t, err) + assert.Contains(t, err.Error(), "empty graph configs") +} + +func TestSplitGetRouterConfig_ConfigFetchError(t *testing.T) { + mock := &mockSplitFetcher{ + mapperResult: makeActiveGraphs(map[string]string{"": "hash-base"}), + configErrors: map[string]error{"": errors.New("CDN unavailable")}, + } + p := newTestPoller(mock) + _, err := p.GetRouterConfig(context.Background()) + require.Error(t, err) + assert.Contains(t, err.Error(), "CDN unavailable") +} + +// ---- Subscribe / polling tests ---- + +// pollOnce manually executes one poll iteration using the poller's internal logic. +// It extracts the subscribe callback by using a fake controlplane.Poller. +func pollOnce(p *splitConfigPoller, handler func(*nodev1.RouterConfig, string) error) { + var tickFn func() + p.poller = &capturingPoller{capture: &tickFn} + p.Subscribe(context.Background(), handler) // sets tickFn + if tickFn != nil { + tickFn() + } +} + +// capturingPoller captures the handler passed to Subscribe so tests can invoke it manually. +type capturingPoller struct { + capture *func() +} + +func (c *capturingPoller) Subscribe(_ context.Context, fn func()) { + *c.capture = fn +} + +func TestSplitSubscribe_NoChanges(t *testing.T) { + baseCfg := makeRouterConfig("v1") + mock := &mockSplitFetcher{ + mapperResult: makeActiveGraphs(map[string]string{"": "hash-base"}), + configResults: map[string]*nodev1.RouterConfig{"": baseCfg}, + } + + p := newTestPoller(mock) + // Seed state as if GetRouterConfig was already called. + p.knownHashes = map[string]string{"": "hash-base"} + p.currentConfig = baseCfg + p.latestVersion = computeCompositeVersion(p.knownHashes) + + handlerCalled := false + pollOnce(p, func(_ *nodev1.RouterConfig, _ string) error { + handlerCalled = true + return nil + }) + + assert.False(t, handlerCalled, "handler must not be called when nothing changed") + // Only FetchMapper should have been called, no FetchConfig calls. + assert.Equal(t, 0, len(mock.fetchConfigCalls)) +} + +func TestSplitSubscribe_BaseGraphChanged(t *testing.T) { + oldBase := makeRouterConfig("v1") + newBase := makeRouterConfig("v2") + mock := &mockSplitFetcher{ + // Mapper now reports a new hash for the base graph. + mapperResult: makeActiveGraphs(map[string]string{"": "hash-base-new"}), + configResults: map[string]*nodev1.RouterConfig{"": newBase}, + } + + p := newTestPoller(mock) + p.knownHashes = map[string]string{"": "hash-base-old"} + p.currentConfig = oldBase + p.latestVersion = computeCompositeVersion(p.knownHashes) + + var received *nodev1.RouterConfig + pollOnce(p, func(cfg *nodev1.RouterConfig, _ string) error { + received = cfg + return nil + }) + + require.NotNil(t, received) + assert.Equal(t, "v2", received.Version) + // Only base config should have been fetched. + assert.Equal(t, []string{""}, mock.fetchConfigCalls) + // State updated. + assert.Equal(t, "hash-base-new", p.knownHashes[""]) +} + +func TestSplitSubscribe_SingleFFChanged(t *testing.T) { + baseCfg := makeRouterConfig("v1") + oldFF := makeRouterConfig("ff-v1") + newFF := makeRouterConfig("ff-v2") + mock := &mockSplitFetcher{ + mapperResult: makeActiveGraphs(map[string]string{ + "": "hash-base", + "ff1": "hash-ff1-new", + }), + configResults: map[string]*nodev1.RouterConfig{"ff1": newFF}, + } + + p := newTestPoller(mock) + p.knownHashes = map[string]string{"": "hash-base", "ff1": "hash-ff1-old"} + p.currentConfig = &nodev1.RouterConfig{ + Version: "v1", + EngineConfig: baseCfg.EngineConfig, + FeatureFlagConfigs: &nodev1.FeatureFlagRouterExecutionConfigs{ + ConfigByFeatureFlagName: map[string]*nodev1.FeatureFlagRouterExecutionConfig{ + "ff1": {Version: oldFF.Version, EngineConfig: oldFF.EngineConfig}, + }, + }, + } + p.latestVersion = computeCompositeVersion(p.knownHashes) + + var received *nodev1.RouterConfig + pollOnce(p, func(cfg *nodev1.RouterConfig, _ string) error { + received = cfg + return nil + }) + + require.NotNil(t, received) + // Base unchanged. + assert.Equal(t, "v1", received.Version) + // FF updated. + require.NotNil(t, received.FeatureFlagConfigs) + assert.Equal(t, "ff-v2", received.FeatureFlagConfigs.ConfigByFeatureFlagName["ff1"].Version) + // Only ff1 config should have been re-fetched (not base). + assert.Equal(t, []string{"ff1"}, mock.fetchConfigCalls) +} + +func TestSplitSubscribe_FFAdded(t *testing.T) { + baseCfg := makeRouterConfig("v1") + newFF := makeRouterConfig("ff-v1") + mock := &mockSplitFetcher{ + mapperResult: makeActiveGraphs(map[string]string{ + "": "hash-base", + "ff1": "hash-ff1", + }), + configResults: map[string]*nodev1.RouterConfig{"ff1": newFF}, + } + + p := newTestPoller(mock) + p.knownHashes = map[string]string{"": "hash-base"} + p.currentConfig = baseCfg + p.latestVersion = computeCompositeVersion(p.knownHashes) + + var received *nodev1.RouterConfig + pollOnce(p, func(cfg *nodev1.RouterConfig, _ string) error { + received = cfg + return nil + }) + + require.NotNil(t, received) + require.NotNil(t, received.FeatureFlagConfigs) + assert.Equal(t, "ff-v1", received.FeatureFlagConfigs.ConfigByFeatureFlagName["ff1"].Version) + assert.Equal(t, []string{"ff1"}, mock.fetchConfigCalls) +} + +func TestSplitSubscribe_FFRemoved(t *testing.T) { + baseCfg := makeRouterConfig("v1") + oldFF := makeRouterConfig("ff-v1") + mock := &mockSplitFetcher{ + // Mapper no longer contains ff1. + mapperResult: makeActiveGraphs(map[string]string{"": "hash-base"}), + } + + p := newTestPoller(mock) + p.knownHashes = map[string]string{"": "hash-base", "ff1": "hash-ff1"} + p.currentConfig = &nodev1.RouterConfig{ + Version: "v1", + EngineConfig: baseCfg.EngineConfig, + FeatureFlagConfigs: &nodev1.FeatureFlagRouterExecutionConfigs{ + ConfigByFeatureFlagName: map[string]*nodev1.FeatureFlagRouterExecutionConfig{ + "ff1": {Version: oldFF.Version, EngineConfig: oldFF.EngineConfig}, + }, + }, + } + p.latestVersion = computeCompositeVersion(p.knownHashes) + + var received *nodev1.RouterConfig + pollOnce(p, func(cfg *nodev1.RouterConfig, _ string) error { + received = cfg + return nil + }) + + require.NotNil(t, received) + assert.Nil(t, received.FeatureFlagConfigs, "FeatureFlagConfigs should be nil when last FF is removed") + // No FetchConfig calls needed for removal. + assert.Empty(t, mock.fetchConfigCalls) +} + +func TestSplitSubscribe_MultipleChanges(t *testing.T) { + baseCfg := makeRouterConfig("v1") + newBase := makeRouterConfig("v2") + newFF2 := makeRouterConfig("ff2-v1") + oldFF1 := makeRouterConfig("ff1-v1") + mock := &mockSplitFetcher{ + // base changed, ff2 added, ff1 removed. + mapperResult: makeActiveGraphs(map[string]string{ + "": "hash-base-new", + "ff2": "hash-ff2", + }), + configResults: map[string]*nodev1.RouterConfig{ + "": newBase, + "ff2": newFF2, + }, + } + + p := newTestPoller(mock) + p.knownHashes = map[string]string{"": "hash-base-old", "ff1": "hash-ff1"} + p.currentConfig = &nodev1.RouterConfig{ + Version: "v1", + EngineConfig: baseCfg.EngineConfig, + FeatureFlagConfigs: &nodev1.FeatureFlagRouterExecutionConfigs{ + ConfigByFeatureFlagName: map[string]*nodev1.FeatureFlagRouterExecutionConfig{ + "ff1": {Version: oldFF1.Version}, + }, + }, + } + p.latestVersion = computeCompositeVersion(p.knownHashes) + + var received *nodev1.RouterConfig + pollOnce(p, func(cfg *nodev1.RouterConfig, _ string) error { + received = cfg + return nil + }) + + require.NotNil(t, received) + assert.Equal(t, "v2", received.Version) + require.NotNil(t, received.FeatureFlagConfigs) + assert.Equal(t, "ff2-v1", received.FeatureFlagConfigs.ConfigByFeatureFlagName["ff2"].Version) + _, hasFF1 := received.FeatureFlagConfigs.ConfigByFeatureFlagName["ff1"] + assert.False(t, hasFF1, "ff1 should have been removed") +} + +func TestSplitSubscribe_MapperFetchFailure(t *testing.T) { + baseCfg := makeRouterConfig("v1") + mock := &mockSplitFetcher{ + mapperErr: errors.New("mapper fetch failed"), + } + + p := newTestPoller(mock) + p.knownHashes = map[string]string{"": "hash-base"} + p.currentConfig = baseCfg + initialVersion := computeCompositeVersion(p.knownHashes) + p.latestVersion = initialVersion + + handlerCalled := false + pollOnce(p, func(_ *nodev1.RouterConfig, _ string) error { + handlerCalled = true + return nil + }) + + assert.False(t, handlerCalled) + // State unchanged. + assert.Equal(t, initialVersion, p.latestVersion) +} + +func TestSplitSubscribe_ConfigFetchFailure(t *testing.T) { + baseCfg := makeRouterConfig("v1") + mock := &mockSplitFetcher{ + mapperResult: makeActiveGraphs(map[string]string{"": "hash-base-new"}), + configErrors: map[string]error{"": errors.New("config fetch failed")}, + } + + p := newTestPoller(mock) + p.knownHashes = map[string]string{"": "hash-base-old"} + p.currentConfig = baseCfg + initialVersion := computeCompositeVersion(p.knownHashes) + p.latestVersion = initialVersion + + handlerCalled := false + pollOnce(p, func(_ *nodev1.RouterConfig, _ string) error { + handlerCalled = true + return nil + }) + + assert.False(t, handlerCalled) + // State must remain unchanged after a failed fetch. + assert.Equal(t, initialVersion, p.latestVersion) + assert.Equal(t, "hash-base-old", p.knownHashes[""]) +} + +func TestSplitSubscribe_HandlerError_StateNotUpdated(t *testing.T) { + baseCfg := makeRouterConfig("v1") + newBase := makeRouterConfig("v2") + mock := &mockSplitFetcher{ + mapperResult: makeActiveGraphs(map[string]string{"": "hash-base-new"}), + configResults: map[string]*nodev1.RouterConfig{"": newBase}, + } + + p := newTestPoller(mock) + p.knownHashes = map[string]string{"": "hash-base-old"} + p.currentConfig = baseCfg + initialVersion := computeCompositeVersion(p.knownHashes) + p.latestVersion = initialVersion + + pollOnce(p, func(_ *nodev1.RouterConfig, _ string) error { + return errors.New("handler failed") + }) + + // State must remain unchanged after a handler failure. + assert.Equal(t, initialVersion, p.latestVersion) + assert.Equal(t, "hash-base-old", p.knownHashes[""]) +} + +func TestComputeCompositeVersion_Deterministic(t *testing.T) { + m1 := map[string]string{"a": "1", "b": "2", "c": "3"} + m2 := map[string]string{"c": "3", "a": "1", "b": "2"} + assert.Equal(t, computeCompositeVersion(m1), computeCompositeVersion(m2)) +} + +func TestComputeCompositeVersion_DifferentInputsDifferentOutput(t *testing.T) { + m1 := map[string]string{"a": "1"} + m2 := map[string]string{"a": "2"} + assert.NotEqual(t, computeCompositeVersion(m1), computeCompositeVersion(m2)) +} diff --git a/router/pkg/routerconfig/cdn/split_fetcher.go b/router/pkg/routerconfig/cdn/split_fetcher.go new file mode 100644 index 0000000000..1f39fbe85f --- /dev/null +++ b/router/pkg/routerconfig/cdn/split_fetcher.go @@ -0,0 +1,229 @@ +package cdn + +import ( + "bytes" + "compress/gzip" + "context" + "crypto/hmac" + "crypto/sha256" + "crypto/subtle" + "encoding/base64" + "errors" + "fmt" + "hash" + "io" + "net/http" + "net/url" + + nodev1 "github.com/wundergraph/cosmo/router/gen/proto/wg/cosmo/node/v1" + "github.com/wundergraph/cosmo/router/internal/httpclient" + "github.com/wundergraph/cosmo/router/internal/jwt" + "github.com/wundergraph/cosmo/router/pkg/execution_config" + "go.uber.org/zap" + "google.golang.org/protobuf/encoding/protojson" +) + +// SplitFetcher fetches mapper and individual router configs from the CDN +// using simple GET requests (no version negotiation). +type SplitFetcher struct { + cdnURL *url.URL + authenticationToken string + federatedGraphID string + organizationID string + httpClient *http.Client + logger *zap.Logger + hash hash.Hash // HMAC-SHA256 for signature validation; nil if no key configured +} + +// NewSplitFetcher creates a SplitFetcher for the given CDN endpoint and router token. +// It follows the same setup pattern as NewClient. +func NewSplitFetcher(endpoint string, token string, opts *Options) (*SplitFetcher, error) { + if token == "" { + return nil, errors.New("token is required for split config fetcher") + } + + if opts == nil { + opts = &Options{} + } + + u, err := url.Parse(endpoint) + if err != nil { + return nil, fmt.Errorf("invalid CDN URL %q: %w", endpoint, err) + } + + if opts.Logger == nil { + opts.Logger = zap.NewNop() + } + + claims, err := jwt.ExtractFederatedGraphTokenClaims(token) + if err != nil { + return nil, err + } + + logger := opts.Logger.With(zap.String("component", "split_config_fetcher")) + + f := &SplitFetcher{ + cdnURL: u, + authenticationToken: token, + federatedGraphID: url.PathEscape(claims.FederatedGraphID), + organizationID: url.PathEscape(claims.OrganizationID), + httpClient: httpclient.NewRetryableHTTPClient(logger), + logger: logger, + } + + if opts.SignatureKey != "" { + f.hash = hmac.New(sha256.New, []byte(opts.SignatureKey)) + } + + return f, nil +} + +// post performs an authenticated POST request to the given CDN path, validates the +// optional HMAC signature, and returns the (decompressed) response body. +func (f *SplitFetcher) post(ctx context.Context, path string) ([]byte, error) { + target := f.cdnURL.ResolveReference(&url.URL{Path: path}) + + // This payload tells the cdn to always return a 200 OK instead + // 304 Not Modified (in case the version did not change). The split config poller + // already does config change detection, so no need for the CDN to do the same. + reqBody := []byte(`{"version": ""}`) + + req, err := http.NewRequestWithContext(ctx, http.MethodPost, target.String(), bytes.NewReader(reqBody)) + if err != nil { + return nil, err + } + req.Header.Set("Content-Type", "application/json; charset=UTF-8") + req.Header.Add("Authorization", "Bearer "+f.authenticationToken) + req.Header.Set("Accept-Encoding", "gzip") + + resp, err := f.httpClient.Do(req) + if err != nil { + return nil, err + } + defer func() { + _ = resp.Body.Close() + }() + + switch resp.StatusCode { + case http.StatusOK: + // handled below + case http.StatusNotFound: + return nil, ErrConfigNotFound + case http.StatusUnauthorized: + return nil, errors.New("could not authenticate against CDN") + case http.StatusBadRequest: + return nil, errors.New("bad request") + default: + return nil, fmt.Errorf("unexpected status code when loading split config, statusCode: %d", resp.StatusCode) + } + + var reader io.Reader = resp.Body + if resp.Header.Get("Content-Encoding") == "gzip" { + r, err := gzip.NewReader(resp.Body) + if err != nil { + return nil, fmt.Errorf("could not create gzip reader: %w", err) + } + defer func() { + _ = r.Close() + }() + reader = r + } + + body, err := io.ReadAll(reader) + if err != nil { + return nil, fmt.Errorf("could not read response body: %w", err) + } + if len(body) == 0 { + return nil, errors.New("empty response body") + } + + // Validate HMAC signature when a key is configured. + if f.hash != nil { + configSignature := resp.Header.Get(sigResponseHeaderName) + if configSignature == "" { + f.logger.Error( + "Signature header not found in CDN response. Ensure that your Admission Controller was able to sign the config.", + zap.Error(ErrMissingSignatureHeader), + ) + return nil, ErrMissingSignatureHeader + } + + if _, err := f.hash.Write(body); err != nil { + return nil, fmt.Errorf("could not write config body to hmac: %w", err) + } + dataHmac := f.hash.Sum(nil) + f.hash.Reset() + + rawSignature, err := base64.StdEncoding.DecodeString(configSignature) + if err != nil { + return nil, fmt.Errorf("could not decode signature: %w", err) + } + + if subtle.ConstantTimeCompare(rawSignature, dataHmac) != 1 { + f.logger.Error( + "Invalid config signature, potential tampering detected.", + zap.Error(ErrInvalidSignature), + ) + return nil, ErrInvalidSignature + } + + f.logger.Info("Config signature validation successful", + zap.String("federatedGraphID", f.federatedGraphID), + zap.String("signature", configSignature), + ) + } + + return body, nil +} + +// FetchMapper fetches the mapper file and returns the active graph configs and their hashes. +func (f *SplitFetcher) FetchMapper(ctx context.Context) (*nodev1.ActiveGraphs, error) { + path, err := url.JoinPath("/", f.organizationID, f.federatedGraphID, "manifest/mapper.json") + if err != nil { + return nil, fmt.Errorf("could not join path: %w", err) + } + body, err := f.post(ctx, path) + if err != nil { + return nil, fmt.Errorf("could not fetch mapper: %w", err) + } + + var activeGraphs nodev1.ActiveGraphs + ms := protojson.UnmarshalOptions{DiscardUnknown: true} + if err := ms.Unmarshal(body, &activeGraphs); err != nil { + return nil, fmt.Errorf("could not unmarshal mapper: %w", err) + } + + return &activeGraphs, nil +} + +// FetchConfig fetches a single router config from CDN. +// featureFlagName="" returns the base graph; any other value returns the named feature flag config. +func (f *SplitFetcher) FetchConfig(ctx context.Context, featureFlagName string) (*nodev1.RouterConfig, error) { + var ( + path string + err error + ) + + if featureFlagName == "" { + path, err = url.JoinPath("/", f.organizationID, f.federatedGraphID, "manifest/latest.json") + } else { + path, err = url.JoinPath("/", f.organizationID, f.federatedGraphID, "manifest/feature-flags", + featureFlagName+".json") + } + + if err != nil { + return nil, fmt.Errorf("could not join path: %w", err) + } + + body, err := f.post(ctx, path) + if err != nil { + return nil, fmt.Errorf("could not fetch config for %q: %w", featureFlagName, err) + } + + cfg, err := execution_config.UnmarshalConfig(body) + if err != nil { + return nil, fmt.Errorf("could not unmarshal router config for %q: %w", featureFlagName, err) + } + + return cfg, nil +} diff --git a/router/pkg/routerconfig/cdn/split_fetcher_test.go b/router/pkg/routerconfig/cdn/split_fetcher_test.go new file mode 100644 index 0000000000..19eb06aca0 --- /dev/null +++ b/router/pkg/routerconfig/cdn/split_fetcher_test.go @@ -0,0 +1,439 @@ +package cdn_test + +import ( + "bytes" + "compress/gzip" + "context" + "crypto/hmac" + "crypto/sha256" + "encoding/base64" + "io" + "net/http" + "net/http/httptest" + "testing" + + jwt "github.com/golang-jwt/jwt/v5" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + nodev1 "github.com/wundergraph/cosmo/router/gen/proto/wg/cosmo/node/v1" + "github.com/wundergraph/cosmo/router/pkg/routerconfig/cdn" + "google.golang.org/protobuf/encoding/protojson" +) + +const ( + testGraphID = "871e5543-60f6-4ffc-a302-4f15277de4e7" + testOrgID = "5f718753-77d6-4e28-a3a3-52b24c812802" +) + +// testToken is a HS256-signed JWT with testGraphID / testOrgID claims. +// NewSplitFetcher calls ParseUnverified internally, so the signing key is irrelevant. +var testToken = func() string { + claims := jwt.MapClaims{ + "federated_graph_id": testGraphID, + "organization_id": testOrgID, + "features": []string{"split-config-loading"}, + } + tok := jwt.NewWithClaims(jwt.SigningMethodHS256, claims) + str, err := tok.SignedString([]byte("test-secret")) + if err != nil { + panic("failed to create test token: " + err.Error()) + } + return str +}() + +// newFetcher creates a SplitFetcher pointed at serverURL using testToken. +func newFetcher(t *testing.T, serverURL string, opts *cdn.Options) *cdn.SplitFetcher { + t.Helper() + f, err := cdn.NewSplitFetcher(serverURL, testToken, opts) + require.NoError(t, err) + return f +} + +func marshalActiveGraphs(t *testing.T, configs map[string]string) []byte { + t.Helper() + b, err := protojson.Marshal(&nodev1.ActiveGraphs{GraphConfigs: configs}) + require.NoError(t, err) + return b +} + +func marshalRouterConfig(t *testing.T, cfg *nodev1.RouterConfig) []byte { + t.Helper() + b, err := protojson.Marshal(cfg) + require.NoError(t, err) + return b +} + +func gzipData(t *testing.T, data []byte) []byte { + t.Helper() + var buf bytes.Buffer + w := gzip.NewWriter(&buf) + _, err := w.Write(data) + require.NoError(t, err) + require.NoError(t, w.Close()) + return buf.Bytes() +} + +func computeHMAC(key, body []byte) string { + h := hmac.New(sha256.New, key) + h.Write(body) + return base64.StdEncoding.EncodeToString(h.Sum(nil)) +} + +// ─── NewSplitFetcher ────────────────────────────────────────────────────────── + +func TestNewSplitFetcher_EmptyToken(t *testing.T) { + _, err := cdn.NewSplitFetcher("http://cdn.example.com", "", nil) + require.Error(t, err) + assert.Contains(t, err.Error(), "token is required") +} + +func TestNewSplitFetcher_InvalidToken(t *testing.T) { + _, err := cdn.NewSplitFetcher("http://cdn.example.com", "not-a-jwt", nil) + require.Error(t, err) +} + +func TestNewSplitFetcher_InvalidURL(t *testing.T) { + _, err := cdn.NewSplitFetcher("://invalid-url", testToken, nil) + require.Error(t, err) + assert.Contains(t, err.Error(), "invalid CDN URL") +} + +func TestNewSplitFetcher_NilOpts(t *testing.T) { + f, err := cdn.NewSplitFetcher("http://cdn.example.com", testToken, nil) + require.NoError(t, err) + require.NotNil(t, f) +} + +func TestNewSplitFetcher_WithSignatureKey(t *testing.T) { + f, err := cdn.NewSplitFetcher("http://cdn.example.com", testToken, &cdn.Options{SignatureKey: "my-secret"}) + require.NoError(t, err) + require.NotNil(t, f) +} + +// ─── HTTP error status codes ────────────────────────────────────────────────── + +func TestFetchMapper_HTTPErrors(t *testing.T) { + tests := []struct { + name string + statusCode int + wantErr error // checked with errors.Is when non-nil + wantErrMsg string // checked with assert.Contains when non-empty + }{ + { + name: "not found", + statusCode: http.StatusNotFound, + wantErr: cdn.ErrConfigNotFound, + }, + { + name: "unauthorized", + statusCode: http.StatusUnauthorized, + wantErrMsg: "could not authenticate against CDN", + }, + { + name: "bad request", + statusCode: http.StatusBadRequest, + wantErrMsg: "bad request", + }, + { + // Real unexpected CDN codes (5xx) would be retried; 418 exercises the + // default branch without triggering the retryable client's retry loop. + name: "unexpected status", + statusCode: http.StatusTeapot, + wantErrMsg: "unexpected status code when loading split config, statusCode: 418", + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { + w.WriteHeader(tt.statusCode) + })) + defer srv.Close() + + _, err := newFetcher(t, srv.URL, nil).FetchMapper(context.Background()) + require.Error(t, err) + if tt.wantErr != nil { + assert.ErrorIs(t, err, tt.wantErr) + } + if tt.wantErrMsg != "" { + assert.Contains(t, err.Error(), tt.wantErrMsg) + } + }) + } +} + +// ─── Request details ────────────────────────────────────────────────────────── + +func TestFetchMapper_RequestMethodAndBody(t *testing.T) { + var gotMethod string + var gotBody []byte + body := marshalActiveGraphs(t, map[string]string{"": "h1"}) + + srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + gotMethod = r.Method + gotBody, _ = io.ReadAll(r.Body) + w.WriteHeader(http.StatusOK) + _, _ = w.Write(body) + })) + defer srv.Close() + + _, err := newFetcher(t, srv.URL, nil).FetchMapper(context.Background()) + require.NoError(t, err) + + assert.Equal(t, http.MethodPost, gotMethod) + assert.JSONEq(t, `{"version":""}`, string(gotBody)) +} + +func TestFetchMapper_RequestHeaders(t *testing.T) { + body := marshalActiveGraphs(t, map[string]string{"": "h1"}) + var gotAuth, gotCT, gotAE string + + srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + gotAuth = r.Header.Get("Authorization") + gotCT = r.Header.Get("Content-Type") + gotAE = r.Header.Get("Accept-Encoding") + w.WriteHeader(http.StatusOK) + _, _ = w.Write(body) + })) + defer srv.Close() + + _, err := newFetcher(t, srv.URL, nil).FetchMapper(context.Background()) + require.NoError(t, err) + + assert.Equal(t, "Bearer "+testToken, gotAuth) + assert.Equal(t, "application/json; charset=UTF-8", gotCT) + assert.Equal(t, "gzip", gotAE) +} + +// ─── Response body handling ─────────────────────────────────────────────────── + +func TestFetchMapper_EmptyBody(t *testing.T) { + srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { + w.WriteHeader(http.StatusOK) + // intentionally write nothing + })) + defer srv.Close() + + _, err := newFetcher(t, srv.URL, nil).FetchMapper(context.Background()) + require.Error(t, err) + assert.Contains(t, err.Error(), "empty response body") +} + +func TestFetchMapper_GzipEncoded(t *testing.T) { + // The fetcher sets Accept-Encoding: gzip explicitly, which disables Go's + // transparent decompression, so the manual gzip path in post() is exercised. + raw := marshalActiveGraphs(t, map[string]string{"": "hash-base", "ff1": "hash-ff1"}) + compressed := gzipData(t, raw) + + srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { + w.Header().Set("Content-Encoding", "gzip") + w.WriteHeader(http.StatusOK) + _, _ = w.Write(compressed) + })) + defer srv.Close() + + result, err := newFetcher(t, srv.URL, nil).FetchMapper(context.Background()) + require.NoError(t, err) + require.NotNil(t, result) + assert.Equal(t, "hash-base", result.GraphConfigs[""]) + assert.Equal(t, "hash-ff1", result.GraphConfigs["ff1"]) +} + +// ─── FetchMapper: parsing & URL path ───────────────────────────────────────── + +func TestFetchMapper_Success(t *testing.T) { + configs := map[string]string{"": "hash-base", "ff1": "hash-ff1"} + body := marshalActiveGraphs(t, configs) + + srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { + w.WriteHeader(http.StatusOK) + _, _ = w.Write(body) + })) + defer srv.Close() + + result, err := newFetcher(t, srv.URL, nil).FetchMapper(context.Background()) + require.NoError(t, err) + require.NotNil(t, result) + assert.Equal(t, "hash-base", result.GraphConfigs[""]) + assert.Equal(t, "hash-ff1", result.GraphConfigs["ff1"]) +} + +func TestFetchMapper_InvalidJSON(t *testing.T) { + srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { + w.WriteHeader(http.StatusOK) + _, _ = w.Write([]byte("not-valid-proto-json")) + })) + defer srv.Close() + + _, err := newFetcher(t, srv.URL, nil).FetchMapper(context.Background()) + require.Error(t, err) + assert.Contains(t, err.Error(), "could not unmarshal mapper") +} + +func TestFetchMapper_URLPath(t *testing.T) { + var gotPath string + body := marshalActiveGraphs(t, map[string]string{"": "h1"}) + + srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + gotPath = r.URL.Path + w.WriteHeader(http.StatusOK) + _, _ = w.Write(body) + })) + defer srv.Close() + + _, err := newFetcher(t, srv.URL, nil).FetchMapper(context.Background()) + require.NoError(t, err) + + assert.Equal(t, "/"+testOrgID+"/"+testGraphID+"/manifest/mapper.json", gotPath) +} + +// ─── HMAC signature validation ──────────────────────────────────────────────── + +func TestFetchMapper_Signature(t *testing.T) { + const sigKey = "my-secret" + body := marshalActiveGraphs(t, map[string]string{"": "h1"}) + validSig := computeHMAC([]byte(sigKey), body) + wrongSig := computeHMAC([]byte("wrong-key"), body) + + tests := []struct { + name string + sigKey string // empty = no HMAC configured + respSig string // value of X-Signature-SHA256 sent by server; empty = omit header + wantErr error + wantErrMsg string + }{ + { + name: "no key – signature header ignored", + sigKey: "", + // no header; succeeds because HMAC is disabled + }, + { + name: "valid signature", + sigKey: sigKey, + respSig: validSig, + }, + { + name: "missing signature header", + sigKey: sigKey, + wantErr: cdn.ErrMissingSignatureHeader, + }, + { + name: "invalid base64 in signature", + sigKey: sigKey, + respSig: "!!!not-base64!!!", + wantErrMsg: "could not decode signature", + }, + { + name: "signature mismatch", + sigKey: sigKey, + respSig: wrongSig, + wantErr: cdn.ErrInvalidSignature, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { + if tt.respSig != "" { + w.Header().Set("X-Signature-SHA256", tt.respSig) + } + w.WriteHeader(http.StatusOK) + _, _ = w.Write(body) + })) + defer srv.Close() + + var opts *cdn.Options + if tt.sigKey != "" { + opts = &cdn.Options{SignatureKey: tt.sigKey} + } + _, err := newFetcher(t, srv.URL, opts).FetchMapper(context.Background()) + + if tt.wantErr == nil && tt.wantErrMsg == "" { + require.NoError(t, err) + return + } + require.Error(t, err) + if tt.wantErr != nil { + assert.ErrorIs(t, err, tt.wantErr) + } + if tt.wantErrMsg != "" { + assert.Contains(t, err.Error(), tt.wantErrMsg) + } + }) + } +} + +// ─── FetchConfig ────────────────────────────────────────────────────────────── + +func TestFetchConfig_URLPaths(t *testing.T) { + tests := []struct { + name string + featureFlagName string + wantPath string + }{ + { + name: "base graph uses latest.json", + featureFlagName: "", + wantPath: "/" + testOrgID + "/" + testGraphID + "/manifest/latest.json", + }, + { + name: "feature flag uses feature-flags sub-path", + featureFlagName: "my-flag", + wantPath: "/" + testOrgID + "/" + testGraphID + "/manifest/feature-flags/my-flag.json", + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + var gotPath string + body := marshalRouterConfig(t, &nodev1.RouterConfig{ + Version: "v1", + EngineConfig: &nodev1.EngineConfiguration{DefaultFlushInterval: 500}, + CompatibilityVersion: "1", + }) + + srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + gotPath = r.URL.Path + w.WriteHeader(http.StatusOK) + _, _ = w.Write(body) + })) + defer srv.Close() + + _, err := newFetcher(t, srv.URL, nil).FetchConfig(context.Background(), tt.featureFlagName) + require.NoError(t, err) + assert.Equal(t, tt.wantPath, gotPath) + }) + } +} + +func TestFetchConfig_Success(t *testing.T) { + expected := &nodev1.RouterConfig{ + Version: "v42", + EngineConfig: &nodev1.EngineConfiguration{DefaultFlushInterval: 500}, + CompatibilityVersion: "1", + } + body := marshalRouterConfig(t, expected) + + srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { + w.WriteHeader(http.StatusOK) + _, _ = w.Write(body) + })) + defer srv.Close() + + result, err := newFetcher(t, srv.URL, nil).FetchConfig(context.Background(), "") + require.NoError(t, err) + require.NotNil(t, result) + assert.Equal(t, "v42", result.Version) +} + +func TestFetchConfig_InvalidJSON(t *testing.T) { + srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { + w.WriteHeader(http.StatusOK) + _, _ = w.Write([]byte("not-valid-proto-json")) + })) + defer srv.Close() + + _, err := newFetcher(t, srv.URL, nil).FetchConfig(context.Background(), "") + require.Error(t, err) + assert.Contains(t, err.Error(), "could not unmarshal router config") +} From 6bf713b1597642343203cb5b26f566a0656cca1b Mon Sep 17 00:00:00 2001 From: Dominik Korittki <23359034+dkorittki@users.noreply.github.com> Date: Thu, 7 May 2026 07:12:42 +0000 Subject: [PATCH 04/26] feat(router): reuse unchanged feature flag muxes on graph server (#2823) --- router-tests/events/nats_events_test.go | 6 +- router-tests/operations/cache_warmup_test.go | 10 +- .../operations/plan_fallback_cache_test.go | 9 +- .../protocol/config_hot_reload_test.go | 21 ++-- router/core/graph_server.go | 108 ++++++++++++++---- router/core/init_config_poller.go | 1 + router/core/router.go | 23 ++-- .../configpoller/config_poller.go | 14 ++- .../configpoller/split_config_poller.go | 46 +++++--- .../configpoller/split_config_poller_test.go | 31 ++--- router/pkg/routerconfig/client.go | 15 +++ 11 files changed, 190 insertions(+), 94 deletions(-) diff --git a/router-tests/events/nats_events_test.go b/router-tests/events/nats_events_test.go index 7b3f3822b5..5f242d3237 100644 --- a/router-tests/events/nats_events_test.go +++ b/router-tests/events/nats_events_test.go @@ -36,11 +36,11 @@ var ( type ConfigPollerMock struct { initConfig *nodev1.RouterConfig - updateConfig func(newConfig *nodev1.RouterConfig, oldVersion string) error + updateConfig func(newConfig *routerconfig.Response) error ready chan struct{} } -func (c *ConfigPollerMock) Subscribe(_ context.Context, handler func(newConfig *nodev1.RouterConfig, oldVersion string) error) { +func (c *ConfigPollerMock) Subscribe(_ context.Context, handler func(newConfig *routerconfig.Response) error) { c.updateConfig = handler close(c.ready) } @@ -1595,7 +1595,7 @@ func TestNatsEvents(t *testing.T) { xEnv.WaitForSubscriptionCount(3, EventWaitTimeout) // Swap config - require.NoError(t, pm.updateConfig(pm.initConfig, "old-1")) + require.NoError(t, pm.updateConfig(&routerconfig.Response{Config: pm.initConfig})) // Wait for all providers to shut down and restart require.Eventually(t, func() bool { diff --git a/router-tests/operations/cache_warmup_test.go b/router-tests/operations/cache_warmup_test.go index 2f9c662abd..dc8b0d144a 100644 --- a/router-tests/operations/cache_warmup_test.go +++ b/router-tests/operations/cache_warmup_test.go @@ -1016,7 +1016,7 @@ func TestInMemoryPlanCacheFallback(t *testing.T) { <-pm.ready pm.initConfig.Version = "updated" - require.NoError(t, pm.updateConfig(pm.initConfig, "old-1")) + require.NoError(t, pm.updateConfig(&routerconfig.Response{Config: pm.initConfig})) res = xEnv.MakeGraphQLRequestOK(testenv.GraphQLRequest{ Query: `{ employees { id } }`, @@ -1061,7 +1061,7 @@ func TestInMemoryPlanCacheFallback(t *testing.T) { <-pm.ready pm.initConfig.Version = "updated" - require.NoError(t, pm.updateConfig(pm.initConfig, "old-1")) + require.NoError(t, pm.updateConfig(&routerconfig.Response{Config: pm.initConfig})) res = xEnv.MakeGraphQLRequestOK(testenv.GraphQLRequest{ Query: `{ employees { id } }`, @@ -1110,7 +1110,7 @@ func TestInMemoryPlanCacheFallback(t *testing.T) { <-pm.ready pm.initConfig.Version = "updated" - require.NoError(t, pm.updateConfig(pm.initConfig, "old-1")) + require.NoError(t, pm.updateConfig(&routerconfig.Response{Config: pm.initConfig})) res = xEnv.MakeGraphQLRequestOK(testenv.GraphQLRequest{ Query: `{ employees { id customDetails: details { forename } } }`, @@ -1412,11 +1412,11 @@ func writeTestConfig(t *testing.T, version string, path string) { type ConfigPollerMock struct { initConfig *nodev1.RouterConfig - updateConfig func(newConfig *nodev1.RouterConfig, oldVersion string) error + updateConfig func(newConfig *routerconfig.Response) error ready chan struct{} } -func (c *ConfigPollerMock) Subscribe(_ context.Context, handler func(newConfig *nodev1.RouterConfig, oldVersion string) error) { +func (c *ConfigPollerMock) Subscribe(_ context.Context, handler func(_ *routerconfig.Response) error) { c.updateConfig = handler close(c.ready) } diff --git a/router-tests/operations/plan_fallback_cache_test.go b/router-tests/operations/plan_fallback_cache_test.go index 1b00ce0181..0ff63d461e 100644 --- a/router-tests/operations/plan_fallback_cache_test.go +++ b/router-tests/operations/plan_fallback_cache_test.go @@ -12,6 +12,7 @@ import ( nodev1 "github.com/wundergraph/cosmo/router/gen/proto/wg/cosmo/node/v1" "github.com/wundergraph/cosmo/router/pkg/config" "github.com/wundergraph/cosmo/router/pkg/controlplane/configpoller" + "github.com/wundergraph/cosmo/router/pkg/routerconfig" ) func TestPlanFallbackCache(t *testing.T) { @@ -169,7 +170,7 @@ func TestPlanFallbackCache(t *testing.T) { // Trigger config reload — new Ristretto cache is created (size 1). <-pm.ready pm.initConfig.Version = "updated" - require.NoError(t, pm.updateConfig(pm.initConfig, "old-1")) + require.NoError(t, pm.updateConfig(&routerconfig.Response{Config: pm.initConfig})) // After reload, slow queries should still be available via fallback cache. waitForPlanCacheHits(t, xEnv, slowQueries, func(ct *assert.CollectT, res *testenv.TestResponse) { @@ -230,7 +231,7 @@ func TestPlanFallbackCache(t *testing.T) { // Trigger config reload — main plan cache is reset. <-pm.ready pm.initConfig.Version = "updated" - require.NoError(t, pm.updateConfig(pm.initConfig, "old-1")) + require.NoError(t, pm.updateConfig(&routerconfig.Response{Config: pm.initConfig})) // Wait for reload to complete by checking a slow query (which will be // served from the fallback cache, confirming the new server is active). @@ -293,7 +294,7 @@ func TestPlanFallbackCache(t *testing.T) { // First reload pm.initConfig.Version = "v2" - require.NoError(t, pm.updateConfig(pm.initConfig, "old-1")) + require.NoError(t, pm.updateConfig(&routerconfig.Response{Config: pm.initConfig})) waitForPlanCacheHits(t, xEnv, slowQueries, func(ct *assert.CollectT, res *testenv.TestResponse) { assert.Equal(ct, "v2", res.Response.Header.Get("X-Router-Config-Version")) @@ -301,7 +302,7 @@ func TestPlanFallbackCache(t *testing.T) { // Second reload pm.initConfig.Version = "v3" - require.NoError(t, pm.updateConfig(pm.initConfig, "v2")) + require.NoError(t, pm.updateConfig(&routerconfig.Response{Config: pm.initConfig})) waitForPlanCacheHits(t, xEnv, slowQueries, func(ct *assert.CollectT, res *testenv.TestResponse) { assert.Equal(ct, "v3", res.Response.Header.Get("X-Router-Config-Version")) diff --git a/router-tests/protocol/config_hot_reload_test.go b/router-tests/protocol/config_hot_reload_test.go index 447fff851e..6221ebd5df 100644 --- a/router-tests/protocol/config_hot_reload_test.go +++ b/router-tests/protocol/config_hot_reload_test.go @@ -5,15 +5,16 @@ import ( "context" "encoding/json" + "os" + "sync/atomic" + "testing" + "time" + "github.com/wundergraph/cosmo/router/pkg/otel" "go.opentelemetry.io/otel/attribute" "go.opentelemetry.io/otel/sdk/metric" "go.opentelemetry.io/otel/sdk/metric/metricdata" "go.opentelemetry.io/otel/sdk/metric/metricdata/metricdatatest" - "os" - "sync/atomic" - "testing" - "time" "github.com/wundergraph/cosmo/router/pkg/routerconfig" @@ -33,11 +34,11 @@ var ( type ConfigPollerMock struct { initConfig *nodev1.RouterConfig - updateConfig func(newConfig *nodev1.RouterConfig, oldVersion string) error + updateConfig func(response *routerconfig.Response) error ready chan struct{} } -func (c *ConfigPollerMock) Subscribe(_ context.Context, handler func(newConfig *nodev1.RouterConfig, oldVersion string) error) { +func (c *ConfigPollerMock) Subscribe(_ context.Context, handler func(response *routerconfig.Response) error) { c.updateConfig = handler close(c.ready) } @@ -86,7 +87,7 @@ func TestConfigHotReloadPoller(t *testing.T) { <-pm.ready pm.initConfig.Version = "updated" - require.NoError(t, pm.updateConfig(pm.initConfig, "old-1")) + require.NoError(t, pm.updateConfig(&routerconfig.Response{Config: pm.initConfig})) res = xEnv.MakeGraphQLRequestOK(testenv.GraphQLRequest{ Query: `{ employees { id } }`, @@ -156,7 +157,7 @@ func TestConfigHotReloadPoller(t *testing.T) { // Swap config pm.initConfig.Version = "updated" - require.NoError(t, pm.updateConfig(pm.initConfig, "old-1")) + require.NoError(t, pm.updateConfig(&routerconfig.Response{Config: pm.initConfig})) res := xEnv.MakeGraphQLRequestOK(testenv.GraphQLRequest{ Query: `{ employees { id } }`, @@ -223,7 +224,7 @@ func TestConfigHotReloadPoller(t *testing.T) { // Swap config — the ReadJSON below expects a possible websocket close error, // so use a deadline instead of WSReadJSON (which retries on errors) - require.NoError(t, pm.updateConfig(pm.initConfig, "old-1")) + require.NoError(t, pm.updateConfig(&routerconfig.Response{Config: pm.initConfig})) conn.SetReadDeadline(time.Now().Add(5 * time.Second)) err = conn.ReadJSON(&msg) conn.SetReadDeadline(time.Time{}) @@ -657,7 +658,7 @@ func BenchmarkConfigHotReload(b *testing.B) { b.ResetTimer() for i := 0; i < b.N; i++ { - require.NoError(t, pm.updateConfig(pm.initConfig, "old-1")) + require.NoError(t, pm.updateConfig(&routerconfig.Response{Config: pm.initConfig})) } }) diff --git a/router/core/graph_server.go b/router/core/graph_server.go index 23812b8fe4..6fc67b68ca 100644 --- a/router/core/graph_server.go +++ b/router/core/graph_server.go @@ -22,6 +22,7 @@ import ( "github.com/golang-jwt/jwt/v5" "github.com/klauspost/compress/gzhttp" "github.com/klauspost/compress/gzip" + "github.com/wundergraph/cosmo/router/pkg/routerconfig" "go.opentelemetry.io/otel/attribute" otelmetric "go.opentelemetry.io/otel/metric" oteltrace "go.opentelemetry.io/otel/trace" @@ -91,9 +92,11 @@ type ( baseRouterConfigVersion string mux *chi.Mux // inFlightRequests is used to track the number of requests currently being processed - // does not include websocket (hijacked) connections - inFlightRequests *atomic.Uint64 - graphMuxList []*graphMux + // does not include websocket (hijacked) connections. + inFlightRequests *atomic.Uint64 + // graphMuxList contains all graph muxes of this graph server. + // It's keyed by mux name (feature flag name or empty string for base graph). + graphMuxList map[string]*graphMux graphMuxListLock sync.Mutex runtimeMetrics *rmetric.RuntimeMetrics otlpEngineMetrics *rmetric.EngineMetrics @@ -127,18 +130,20 @@ type buildMultiGraphHandlerOptions struct { baseMux *chi.Mux featureFlagConfigs map[string]*nodev1.FeatureFlagRouterExecutionConfig reloadPersistentState *ReloadPersistentState + currentGraphMuxes map[string]*graphMux + changes *routerconfig.Changes } // newGraphServer creates a new server instance. -func newGraphServer(ctx context.Context, r *Router, routerConfig *nodev1.RouterConfig, proxy ProxyFunc) (*graphServer, error) { +func newGraphServer(ctx context.Context, r *Router, response *routerconfig.Response, proxy ProxyFunc) (*graphServer, error) { /* Older versions of composition will not populate a compatibility version. * Currently, all "old" router execution configurations are compatible as there have been no breaking * changes. * Upon the first breaking change to the execution config, an unpopulated compatibility version will * also be unsupported (and the logic for IsRouterCompatibleWithExecutionConfig will need to be updated). */ - if !execution_config.IsRouterCompatibleWithExecutionConfig(r.logger, routerConfig.CompatibilityVersion) { - return nil, fmt.Errorf(`the compatibility version "%s" is not compatible with this router version`, routerConfig.CompatibilityVersion) + if !execution_config.IsRouterCompatibleWithExecutionConfig(r.logger, response.Config.CompatibilityVersion) { + return nil, fmt.Errorf(`the compatibility version "%s" is not compatible with this router version`, response.Config.CompatibilityVersion) } isConnStoreEnabled := r.metricConfig.OpenTelemetry.ConnectionStats || r.metricConfig.Prometheus.ConnectionStats @@ -186,9 +191,9 @@ func newGraphServer(ctx context.Context, r *Router, routerConfig *nodev1.RouterC subgraphTransports: subgraphTransports, playgroundHandler: r.playgroundHandler, traceDialer: traceDialer, - baseRouterConfigVersion: routerConfig.GetVersion(), + baseRouterConfigVersion: response.Config.GetVersion(), inFlightRequests: &atomic.Uint64{}, - graphMuxList: make([]*graphMux, 0, 1), + graphMuxList: make(map[string]*graphMux, 1), instanceData: InstanceData{ HostName: r.hostName, ListenAddress: r.listenAddr, @@ -294,23 +299,38 @@ func newGraphServer(ctx context.Context, r *Router, routerConfig *nodev1.RouterC s.circuitBreakerManager = manager } - routingUrlGroupings, err := getRoutingUrlGroupingForCircuitBreakers(routerConfig, s.overrideRoutingURLConfiguration, s.overrides) + routingUrlGroupings, err := getRoutingUrlGroupingForCircuitBreakers(response.Config, s.overrideRoutingURLConfiguration, s.overrides) if err != nil { return nil, err } - gm, err := s.buildGraphMux(ctx, BuildGraphMuxOptions{ - RouterConfigVersion: s.baseRouterConfigVersion, - EngineConfig: routerConfig.GetEngineConfig(), - ConfigSubgraphs: routerConfig.GetSubgraphs(), - RoutingUrlGroupings: routingUrlGroupings, - ReloadPersistentState: r.reloadPersistentState, - }) - if err != nil { - return nil, fmt.Errorf("failed to build base mux: %w", err) + currentMuxes := currentGraphMuxes(r) + var gm *graphMux + + mux, oldBaseGraphMuxExists := currentMuxes[""] + needNewBaseGraphMux := response.Changes == nil || response.Changes.BaseGraphChanged() || !oldBaseGraphMuxExists + + if needNewBaseGraphMux { + // build new base grap mux + gm, err = s.buildGraphMux(ctx, BuildGraphMuxOptions{ + RouterConfigVersion: s.baseRouterConfigVersion, + EngineConfig: response.Config.GetEngineConfig(), + ConfigSubgraphs: response.Config.GetSubgraphs(), + RoutingUrlGroupings: routingUrlGroupings, + ReloadPersistentState: r.reloadPersistentState, + }) + if err != nil { + return nil, fmt.Errorf("failed to build base mux: %w", err) + } + } else { + gm = mux + gm.reused.Store(true) + s.graphMuxListLock.Lock() + s.graphMuxList[""] = gm + s.graphMuxListLock.Unlock() } - featureFlagConfigMap := routerConfig.FeatureFlagConfigs.GetConfigByFeatureFlagName() + featureFlagConfigMap := response.Config.FeatureFlagConfigs.GetConfigByFeatureFlagName() if len(featureFlagConfigMap) > 0 { s.logger.Info("Feature flags enabled", zap.Strings("flags", maps.Keys(featureFlagConfigMap))) } @@ -319,6 +339,8 @@ func newGraphServer(ctx context.Context, r *Router, routerConfig *nodev1.RouterC baseMux: gm.mux, featureFlagConfigs: featureFlagConfigMap, reloadPersistentState: r.reloadPersistentState, + currentGraphMuxes: currentMuxes, + changes: response.Changes, }) if err != nil { return nil, fmt.Errorf("failed to build feature flag handler: %w", err) @@ -477,6 +499,24 @@ func (s *graphServer) buildMultiGraphHandler( // Build all the muxes for the feature flags in serial to avoid any race conditions for featureFlagName, executionConfig := range opts.featureFlagConfigs { + if opts.changes != nil { + // if the ff is unchanged and still needed, we reuse it + _, hasChanged := opts.changes.ChangedConfigs[featureFlagName] + _, wasAdded := opts.changes.AddedConfigs[featureFlagName] + + if !hasChanged && !wasAdded { + oldGraphMux, exists := opts.currentGraphMuxes[featureFlagName] + if exists { + featureFlagToMux[featureFlagName] = oldGraphMux.mux + s.graphMuxListLock.Lock() + s.graphMuxList[featureFlagName] = oldGraphMux + s.graphMuxListLock.Unlock() + oldGraphMux.reused.Store(true) + continue + } + } + } + gm, err := s.buildGraphMux(ctx, BuildGraphMuxOptions{ FeatureFlagName: featureFlagName, RouterConfigVersion: executionConfig.GetVersion(), @@ -544,7 +584,8 @@ func (s *graphServer) setupEngineStatistics(baseAttributes []attribute.KeyValue) } type graphMux struct { - mux *chi.Mux + mux *chi.Mux + reused atomic.Bool planCache *ristretto.Cache[uint64, *planWithMetaData] planFallbackCache *slowplancache.Cache[*planWithMetaData] @@ -1734,7 +1775,7 @@ func (s *graphServer) buildGraphMux( s.graphMuxListLock.Lock() defer s.graphMuxListLock.Unlock() - s.graphMuxList = append(s.graphMuxList, gm) + s.graphMuxList[opts.FeatureFlagName] = gm return gm, nil } @@ -1982,11 +2023,15 @@ func (s *graphServer) Shutdown(ctx context.Context) error { } } - // Shutdown all graphs muxes to release resources + // Shutdown graphs muxes, which are not reused by the next graph server, to release resources // e.g. planner cache s.graphMuxListLock.Lock() defer s.graphMuxListLock.Unlock() for _, mux := range s.graphMuxList { + if mux.reused.Load() { + mux.reused.Store(false) // set to false to avoid the mux from being skipped forever + continue + } if err := mux.Shutdown(ctx); err != nil { finalErr = errors.Join(finalErr, err) } @@ -2171,3 +2216,22 @@ func configureSubgraphOverwrites( return subgraphs, nil } + +// currentGraphMuxes returns a list of currently active graph muxes +// used by the currently running graph server. +func currentGraphMuxes(r *Router) map[string]*graphMux { + currentState := r.httpServer.state.Load() + if currentState == nil { + return nil + } + + currentGraphServer := currentState.graphServer + if currentGraphServer == nil { + return nil + } + + currentGraphServer.graphMuxListLock.Lock() + defer currentGraphServer.graphMuxListLock.Unlock() + + return maps.Clone(currentGraphServer.graphMuxList) +} diff --git a/router/core/init_config_poller.go b/router/core/init_config_poller.go index 2748be71f5..38de03c448 100644 --- a/router/core/init_config_poller.go +++ b/router/core/init_config_poller.go @@ -136,6 +136,7 @@ func InitializeConfigPoller(r *Router, registry *ProviderRegistry) (*configpolle if hasSplitCfgFeature { providerID := r.routerConfigPollerConfig.Storage.ProviderID if providerID == "" { + r.logger.Debug("Use split-config poller to fetch execution config") return newSplitConfigPoller(r) } r.logger.Info("split-config-loading feature is enabled but a custom storage provider is configured; falling back to regular config polling", diff --git a/router/core/router.go b/router/core/router.go index cb173417d3..4dc4a5a9fe 100644 --- a/router/core/router.go +++ b/router/core/router.go @@ -17,6 +17,7 @@ import ( "connectrpc.com/connect" "github.com/mitchellh/mapstructure" "github.com/nats-io/nuid" + "github.com/wundergraph/cosmo/router/pkg/routerconfig" "go.opentelemetry.io/otel" "go.opentelemetry.io/otel/attribute" "go.opentelemetry.io/otel/propagation" @@ -602,8 +603,8 @@ func NewRouter(opts ...Option) (*Router, error) { } // newGraphServer creates a new server. -func (r *Router) newServer(ctx context.Context, cfg *nodev1.RouterConfig) error { - server, err := newGraphServer(ctx, r, cfg, r.proxy) +func (r *Router) newServer(ctx context.Context, response *routerconfig.Response) error { + server, err := newGraphServer(ctx, r, response, r.proxy) if err != nil { r.logger.Error("Failed to create graph server. Keeping the old server", zap.Error(err)) return err @@ -612,7 +613,7 @@ func (r *Router) newServer(ctx context.Context, cfg *nodev1.RouterConfig) error r.httpServer.SwapGraphServer(ctx, server) // Cleanup any unused feature flags in case a feature flag was removed - r.reloadPersistentState.CleanupFeatureFlags(cfg) + r.reloadPersistentState.CleanupFeatureFlags(response.Config) return nil } @@ -792,7 +793,7 @@ func (r *Router) NewServer(ctx context.Context) (Server, error) { // Start the server with the static config without polling if r.staticExecutionConfig != nil { r.logger.Info("Static execution config provided. Polling is disabled. Updating execution config is only possible by providing a config.") - return r.httpServer, r.newServer(ctx, r.staticExecutionConfig) + return r.httpServer, r.newServer(ctx, &routerconfig.Response{Config: r.staticExecutionConfig}) } // when no static config is provided and no poller is configured, we can't start the server @@ -805,7 +806,7 @@ func (r *Router) NewServer(ctx context.Context) (Server, error) { return nil, fmt.Errorf("failed to get initial execution config: %w", err) } - if err := r.newServer(ctx, cfg.Config); err != nil { + if err := r.newServer(ctx, cfg); err != nil { r.logger.Error("Failed to start server with initial config", zap.Error(err)) return nil, err } @@ -1463,7 +1464,7 @@ func (r *Router) Start(ctx context.Context) error { return err } - if err := r.newServer(ctx, r.staticExecutionConfig); err != nil { + if err := r.newServer(ctx, &routerconfig.Response{Config: r.staticExecutionConfig}); err != nil { return err } @@ -1507,7 +1508,7 @@ func (r *Router) Start(ctx context.Context) error { return } - if err := r.newServer(ctx, cfg); err != nil { + if err := r.newServer(ctx, &routerconfig.Response{Config: cfg}); err != nil { ll.Error("Failed to update server with new config", zap.Error(err)) return } @@ -1557,7 +1558,7 @@ func (r *Router) Start(ctx context.Context) error { return err } - if err := r.newServer(ctx, cfg.Config); err != nil { + if err := r.newServer(ctx, cfg); err != nil { return err } @@ -1591,15 +1592,15 @@ func (r *Router) Start(ctx context.Context) error { ) } - r.configPoller.Subscribe(ctx, func(newConfig *nodev1.RouterConfig, oldVersion string) error { + r.configPoller.Subscribe(ctx, func(response *routerconfig.Response) error { if r.shutdown.Load() { r.logger.Warn("Router is in shutdown state. Skipping config update") return nil } - r.trackExecutionConfigUsage(newConfig, false) + r.trackExecutionConfigUsage(response.Config, false) - if err := r.newServer(ctx, newConfig); err != nil { + if err := r.newServer(ctx, response); err != nil { return err } diff --git a/router/pkg/controlplane/configpoller/config_poller.go b/router/pkg/controlplane/configpoller/config_poller.go index 0cb9b20f69..0c34bd2aa2 100644 --- a/router/pkg/controlplane/configpoller/config_poller.go +++ b/router/pkg/controlplane/configpoller/config_poller.go @@ -7,7 +7,6 @@ import ( "github.com/wundergraph/cosmo/router/pkg/routerconfig" - nodev1 "github.com/wundergraph/cosmo/router/gen/proto/wg/cosmo/node/v1" "github.com/wundergraph/cosmo/router/pkg/controlplane" "go.uber.org/zap" ) @@ -19,9 +18,9 @@ var ErrConfigNotFound = errors.New("config not found") type ConfigPoller interface { // Subscribe subscribes to the config poller with a handler function that will be invoked - // with the latest router config and the previous version string. If the handler takes longer than the poll interval + // with the latest router config. If the handler takes longer than the poll interval // to execute, the next invocation will be skipped. - Subscribe(ctx context.Context, handler func(newConfig *nodev1.RouterConfig, oldVersion string) error) + Subscribe(ctx context.Context, handler func(response *routerconfig.Response) error) // GetRouterConfig returns the latest router config from the CDN // If the Config is nil, no new config is available and the current config should be used. // and updates the latest router config version. This method is only used for the initial config @@ -63,7 +62,7 @@ func (c *configPoller) Version() string { return c.latestRouterConfigVersion } -func (c *configPoller) Subscribe(ctx context.Context, handler func(newConfig *nodev1.RouterConfig, _ string) error) { +func (c *configPoller) Subscribe(ctx context.Context, handler func(newConfig *routerconfig.Response) error) { c.poller.Subscribe(ctx, func() { start := time.Now() @@ -99,7 +98,12 @@ func (c *configPoller) Subscribe(ctx context.Context, handler func(newConfig *no start = time.Now() - if err := handler(cfg.Config, c.latestRouterConfigVersion); err != nil { + response := &routerconfig.Response{ + Config: cfg.Config, + Changes: nil, // purposefully leaving this nil to indicate we don't know what changed + } + + if err := handler(response); err != nil { c.logger.Error("Error invoking config poll handler", zap.Error(err)) return } diff --git a/router/pkg/controlplane/configpoller/split_config_poller.go b/router/pkg/controlplane/configpoller/split_config_poller.go index ed661e4efe..2cd3a72c94 100644 --- a/router/pkg/controlplane/configpoller/split_config_poller.go +++ b/router/pkg/controlplane/configpoller/split_config_poller.go @@ -3,6 +3,7 @@ package configpoller import ( "context" "fmt" + "maps" "slices" "time" @@ -146,11 +147,16 @@ func (p *splitConfigPoller) GetRouterConfig(ctx context.Context) (*routerconfig. p.currentConfig = config p.latestVersion = computeCompositeVersion(graphConfigs) - return &routerconfig.Response{Config: config}, nil + response := &routerconfig.Response{ + Config: config, + Changes: nil, // purposefully nil to tell callers to rebuild everything since this is the initial fetch + } + + return response, nil } // Subscribe starts the polling loop and calls handler whenever the assembled config changes. -func (p *splitConfigPoller) Subscribe(ctx context.Context, handler func(newConfig *nodev1.RouterConfig, oldVersion string) error) { +func (p *splitConfigPoller) Subscribe(ctx context.Context, handler func(response *routerconfig.Response) error) { p.poller.Subscribe(ctx, func() { fetchStart := time.Now() @@ -184,20 +190,22 @@ func (p *splitConfigPoller) Subscribe(ctx context.Context, handler func(newConfi ) // Determine what changed, was added, or was removed. - changed := make(map[string]struct{}) - added := make(map[string]struct{}) - removed := make(map[string]struct{}) + changes := routerconfig.Changes{ + AddedConfigs: make(map[string]struct{}), + RemovedConfigs: make(map[string]struct{}), + ChangedConfigs: make(map[string]struct{}), + } for name, hash := range graphConfigs { if oldHash, exists := p.knownHashes[name]; !exists { - added[name] = struct{}{} + changes.AddedConfigs[name] = struct{}{} } else if oldHash != hash { - changed[name] = struct{}{} + changes.ChangedConfigs[name] = struct{}{} } } for name := range p.knownHashes { if _, exists := graphConfigs[name]; !exists { - removed[name] = struct{}{} + changes.RemovedConfigs[name] = struct{}{} } } @@ -205,13 +213,9 @@ func (p *splitConfigPoller) Subscribe(ctx context.Context, handler func(newConfi patched := proto.Clone(p.currentConfig).(*nodev1.RouterConfig) // Apply changes and additions. - toFetch := make(map[string]struct{}, len(changed)+len(added)) - for name := range changed { - toFetch[name] = struct{}{} - } - for name := range added { - toFetch[name] = struct{}{} - } + toFetch := make(map[string]struct{}, len(changes.ChangedConfigs)+len(changes.AddedConfigs)) + maps.Copy(toFetch, changes.ChangedConfigs) + maps.Copy(toFetch, changes.AddedConfigs) for name := range toFetch { fetchedConfig, err := p.fetcher.FetchConfig(ctx, name) @@ -244,7 +248,7 @@ func (p *splitConfigPoller) Subscribe(ctx context.Context, handler func(newConfi } // Remove deleted feature flags. - for name := range removed { + for name := range changes.RemovedConfigs { if name == "" { continue // base graph cannot be removed } @@ -256,10 +260,13 @@ func (p *splitConfigPoller) Subscribe(ctx context.Context, handler func(newConfi } } - oldVersion := p.latestVersion + response := &routerconfig.Response{ + Config: patched, + Changes: &changes, + } handlerStart := time.Now() - if err := handler(patched, oldVersion); err != nil { + if err := handler(response); err != nil { p.logger.Error("Error invoking config poll handler", zap.Error(err)) return } @@ -269,7 +276,8 @@ func (p *splitConfigPoller) Subscribe(ctx context.Context, handler func(newConfi zap.String("config_version", newVersion), ) - // Only update internal state after the handler succeeds. + // Only update internal state after the handler succeeds, + // i.e. the newly created engine config is actually used by the graph server. p.knownHashes = graphConfigs p.currentConfig = patched p.latestVersion = newVersion diff --git a/router/pkg/controlplane/configpoller/split_config_poller_test.go b/router/pkg/controlplane/configpoller/split_config_poller_test.go index 6760ce89c9..620f09fb87 100644 --- a/router/pkg/controlplane/configpoller/split_config_poller_test.go +++ b/router/pkg/controlplane/configpoller/split_config_poller_test.go @@ -9,6 +9,7 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" nodev1 "github.com/wundergraph/cosmo/router/gen/proto/wg/cosmo/node/v1" + "github.com/wundergraph/cosmo/router/pkg/routerconfig" "go.uber.org/zap" ) @@ -150,7 +151,7 @@ func TestSplitGetRouterConfig_ConfigFetchError(t *testing.T) { // pollOnce manually executes one poll iteration using the poller's internal logic. // It extracts the subscribe callback by using a fake controlplane.Poller. -func pollOnce(p *splitConfigPoller, handler func(*nodev1.RouterConfig, string) error) { +func pollOnce(p *splitConfigPoller, handler func(_ *routerconfig.Response) error) { var tickFn func() p.poller = &capturingPoller{capture: &tickFn} p.Subscribe(context.Background(), handler) // sets tickFn @@ -182,7 +183,7 @@ func TestSplitSubscribe_NoChanges(t *testing.T) { p.latestVersion = computeCompositeVersion(p.knownHashes) handlerCalled := false - pollOnce(p, func(_ *nodev1.RouterConfig, _ string) error { + pollOnce(p, func(_ *routerconfig.Response) error { handlerCalled = true return nil }) @@ -207,8 +208,8 @@ func TestSplitSubscribe_BaseGraphChanged(t *testing.T) { p.latestVersion = computeCompositeVersion(p.knownHashes) var received *nodev1.RouterConfig - pollOnce(p, func(cfg *nodev1.RouterConfig, _ string) error { - received = cfg + pollOnce(p, func(resp *routerconfig.Response) error { + received = resp.Config return nil }) @@ -246,8 +247,8 @@ func TestSplitSubscribe_SingleFFChanged(t *testing.T) { p.latestVersion = computeCompositeVersion(p.knownHashes) var received *nodev1.RouterConfig - pollOnce(p, func(cfg *nodev1.RouterConfig, _ string) error { - received = cfg + pollOnce(p, func(resp *routerconfig.Response) error { + received = resp.Config return nil }) @@ -278,8 +279,8 @@ func TestSplitSubscribe_FFAdded(t *testing.T) { p.latestVersion = computeCompositeVersion(p.knownHashes) var received *nodev1.RouterConfig - pollOnce(p, func(cfg *nodev1.RouterConfig, _ string) error { - received = cfg + pollOnce(p, func(resp *routerconfig.Response) error { + received = resp.Config return nil }) @@ -311,8 +312,8 @@ func TestSplitSubscribe_FFRemoved(t *testing.T) { p.latestVersion = computeCompositeVersion(p.knownHashes) var received *nodev1.RouterConfig - pollOnce(p, func(cfg *nodev1.RouterConfig, _ string) error { - received = cfg + pollOnce(p, func(resp *routerconfig.Response) error { + received = resp.Config return nil }) @@ -353,8 +354,8 @@ func TestSplitSubscribe_MultipleChanges(t *testing.T) { p.latestVersion = computeCompositeVersion(p.knownHashes) var received *nodev1.RouterConfig - pollOnce(p, func(cfg *nodev1.RouterConfig, _ string) error { - received = cfg + pollOnce(p, func(resp *routerconfig.Response) error { + received = resp.Config return nil }) @@ -379,7 +380,7 @@ func TestSplitSubscribe_MapperFetchFailure(t *testing.T) { p.latestVersion = initialVersion handlerCalled := false - pollOnce(p, func(_ *nodev1.RouterConfig, _ string) error { + pollOnce(p, func(_ *routerconfig.Response) error { handlerCalled = true return nil }) @@ -403,7 +404,7 @@ func TestSplitSubscribe_ConfigFetchFailure(t *testing.T) { p.latestVersion = initialVersion handlerCalled := false - pollOnce(p, func(_ *nodev1.RouterConfig, _ string) error { + pollOnce(p, func(_ *routerconfig.Response) error { handlerCalled = true return nil }) @@ -428,7 +429,7 @@ func TestSplitSubscribe_HandlerError_StateNotUpdated(t *testing.T) { initialVersion := computeCompositeVersion(p.knownHashes) p.latestVersion = initialVersion - pollOnce(p, func(_ *nodev1.RouterConfig, _ string) error { + pollOnce(p, func(_ *routerconfig.Response) error { return errors.New("handler failed") }) diff --git a/router/pkg/routerconfig/client.go b/router/pkg/routerconfig/client.go index 8537d72006..2d1e50c8f5 100644 --- a/router/pkg/routerconfig/client.go +++ b/router/pkg/routerconfig/client.go @@ -11,6 +11,21 @@ import ( type Response struct { // Config is the marshaled router config Config *nodev1.RouterConfig + // Changes is a summary of which parts of Config + // have changed since the last successful config apply. + // Nil means changes are unknown -> expect everything to be changed. + Changes *Changes +} + +type Changes struct { + AddedConfigs map[string]struct{} + RemovedConfigs map[string]struct{} + ChangedConfigs map[string]struct{} +} + +func (c *Changes) BaseGraphChanged() bool { + _, exists := c.ChangedConfigs[""] + return exists } type Client interface { From 44be5ab520ffd0530f7f14d5134158393af26fe6 Mon Sep 17 00:00:00 2001 From: Dominik Korittki <23359034+dkorittki@users.noreply.github.com> Date: Thu, 7 May 2026 15:48:43 +0000 Subject: [PATCH 05/26] fix(router): keep websockets + resolver alive for reused graph muxes (#2838) --- .../protocol/config_hot_reload_test.go | 113 ++++++++++++++++++ router/core/graph_server.go | 61 ++++++---- 2 files changed, 152 insertions(+), 22 deletions(-) diff --git a/router-tests/protocol/config_hot_reload_test.go b/router-tests/protocol/config_hot_reload_test.go index 6221ebd5df..df03ecd498 100644 --- a/router-tests/protocol/config_hot_reload_test.go +++ b/router-tests/protocol/config_hot_reload_test.go @@ -5,6 +5,7 @@ import ( "context" "encoding/json" + "net/http" "os" "sync/atomic" "testing" @@ -582,6 +583,118 @@ func TestFlakyConfigHotReloadPoller(t *testing.T) { }) } +func TestConfigHotReloadGraphServerSwap(t *testing.T) { + t.Parallel() + + t.Run("verify only ws connections on swapped muxes are closed", func(t *testing.T) { + // verifies that after a config update that changes only one feature flag's mux, websocket connections on + // unchanged muxes (base graph and unmodified feature flags) remain active, while + // connections on the changed mux are closed by the server. + + pm := ConfigPollerMock{ + ready: make(chan struct{}), + } + + testenv.Run(t, &testenv.Config{ + RouterConfig: &testenv.RouterConfig{ + ConfigPollerFactory: func(cfg *nodev1.RouterConfig) configpoller.ConfigPoller { + // Add "myff2" as a second feature flag (clone of "myff") so the router + // starts with three distinct muxes: base graph, myff, and myff2. + if cfg.FeatureFlagConfigs != nil { + if myff, ok := cfg.FeatureFlagConfigs.ConfigByFeatureFlagName["myff"]; ok { + cfg.FeatureFlagConfigs.ConfigByFeatureFlagName["myff2"] = &nodev1.FeatureFlagRouterExecutionConfig{ + EngineConfig: myff.EngineConfig, + Version: "myff2-initial", + Subgraphs: myff.Subgraphs, + } + } + } + pm.initConfig = cfg + return &pm + }, + }, + }, func(t *testing.T, xEnv *testenv.Environment) { + // Wait for the config poller to be ready before establishing connections. + <-pm.ready + + // subscribe dials a WebSocket, starts a currentTime subscription, and reads + // one initial message to confirm the subscription is live before returning. + subscribe := func(header http.Header) *websocket.Conn { + t.Helper() + conn := xEnv.InitGraphQLWebSocketConnection(header, nil, nil) + err := conn.WriteJSON(&testenv.WebSocketMessage{ + ID: "1", + Type: "subscribe", + Payload: []byte(`{"query":"subscription { currentTime { unixTime timeStamp }}"}`), + }) + require.NoError(t, err) + var msg testenv.WebSocketMessage + err = testenv.WSReadJSON(t, conn, &msg) + require.NoError(t, err) + require.Equal(t, "next", msg.Type) + return conn + } + + // Establish 2 connections on each of the three muxes (6 total). + baseConn1 := subscribe(nil) + baseConn2 := subscribe(nil) + myffConn1 := subscribe(http.Header{"X-Feature-Flag": []string{"myff"}}) + myffConn2 := subscribe(http.Header{"X-Feature-Flag": []string{"myff"}}) + myff2Conn1 := subscribe(http.Header{"X-Feature-Flag": []string{"myff2"}}) + myff2Conn2 := subscribe(http.Header{"X-Feature-Flag": []string{"myff2"}}) + + // Trigger a config update where only "myff" has changed. + // The base graph mux and "myff2" mux are unchanged and will be reused. + pm.initConfig.FeatureFlagConfigs.ConfigByFeatureFlagName["myff"].Version = "myff-v2" + require.NoError(t, pm.updateConfig(&routerconfig.Response{ + Config: pm.initConfig, + Changes: &routerconfig.Changes{ + ChangedConfigs: map[string]struct{}{"myff": {}}, + }, + })) + + // assertConnectionClosed drains any pending subscription messages then expects + // a WebSocket close error, confirming the server closed the connection. + // A single absolute deadline is set on the connection before the loop so that + // continuous data messages cannot prevent the timeout from firing. + assertConnectionClosed := func(conn *websocket.Conn) { + t.Helper() + conn.SetReadDeadline(time.Now().Add(10 * time.Second)) + defer conn.SetReadDeadline(time.Time{}) + for { + var msg testenv.WebSocketMessage + err := conn.ReadJSON(&msg) + if err != nil { + var wsErr *websocket.CloseError + require.ErrorAs(t, err, &wsErr, "expected websocket close error, got: %v", err) + return + } + // A data message arrived before the close — keep draining. + require.Equal(t, "next", msg.Type) + } + } + + // The "myff" connections must be closed because their mux was rebuilt. + assertConnectionClosed(myffConn1) + assertConnectionClosed(myffConn2) + + // The base graph and "myff2" connections must still receive data because their + // muxes were reused and their per-mux contexts were not cancelled. + for _, conn := range []*websocket.Conn{baseConn1, baseConn2, myff2Conn1, myff2Conn2} { + var msg testenv.WebSocketMessage + err := testenv.WSReadJSON(t, conn, &msg) + require.NoError(t, err) + require.Equal(t, "next", msg.Type) + } + + // Close the remaining connections. + for _, conn := range []*websocket.Conn{baseConn1, baseConn2, myff2Conn1, myff2Conn2} { + require.NoError(t, conn.Close()) + } + }) + }) +} + func writeTestConfig(t *testing.T, version string, path string) { t.Helper() diff --git a/router/core/graph_server.go b/router/core/graph_server.go index 6fc67b68ca..5994b4444d 100644 --- a/router/core/graph_server.go +++ b/router/core/graph_server.go @@ -80,8 +80,9 @@ type ( // All fields are shared between all feature muxes. On shutdown, all graph instances are shutdown. graphServer struct { *Config - context context.Context - cancelFunc context.CancelFunc + graphServerCtx context.Context + graphServerCancel context.CancelFunc + routerCtx context.Context storageProviders *config.StorageProviders engineStats statistics.EngineStatistics playgroundHandler func(http.Handler) http.Handler @@ -135,7 +136,7 @@ type buildMultiGraphHandlerOptions struct { } // newGraphServer creates a new server instance. -func newGraphServer(ctx context.Context, r *Router, response *routerconfig.Response, proxy ProxyFunc) (*graphServer, error) { +func newGraphServer(routerCtx context.Context, r *Router, response *routerconfig.Response, proxy ProxyFunc) (*graphServer, error) { /* Older versions of composition will not populate a compatibility version. * Currently, all "old" router execution configurations are compatible as there have been no breaking * changes. @@ -181,10 +182,11 @@ func newGraphServer(ctx context.Context, r *Router, response *routerconfig.Respo } } - ctx, cancel := context.WithCancel(ctx) + graphServerCtx, graphServerCancel := context.WithCancel(routerCtx) s := &graphServer{ - context: ctx, - cancelFunc: cancel, + graphServerCtx: graphServerCtx, + graphServerCancel: graphServerCancel, + routerCtx: routerCtx, Config: &r.Config, engineStats: r.EngineStats, baseTransport: baseTransport, @@ -312,7 +314,8 @@ func newGraphServer(ctx context.Context, r *Router, response *routerconfig.Respo if needNewBaseGraphMux { // build new base grap mux - gm, err = s.buildGraphMux(ctx, BuildGraphMuxOptions{ + s.logger.Debug("Will build a new base graph mux for new graph server") + gm, err = s.buildGraphMux(BuildGraphMuxOptions{ RouterConfigVersion: s.baseRouterConfigVersion, EngineConfig: response.Config.GetEngineConfig(), ConfigSubgraphs: response.Config.GetSubgraphs(), @@ -323,6 +326,7 @@ func newGraphServer(ctx context.Context, r *Router, response *routerconfig.Respo return nil, fmt.Errorf("failed to build base mux: %w", err) } } else { + s.logger.Debug("Will reuse old base graph mux for new graph server") gm = mux gm.reused.Store(true) s.graphMuxListLock.Lock() @@ -335,7 +339,7 @@ func newGraphServer(ctx context.Context, r *Router, response *routerconfig.Respo s.logger.Info("Feature flags enabled", zap.Strings("flags", maps.Keys(featureFlagConfigMap))) } - multiGraphHandler, err := s.buildMultiGraphHandler(ctx, buildMultiGraphHandlerOptions{ + multiGraphHandler, err := s.buildMultiGraphHandler(buildMultiGraphHandlerOptions{ baseMux: gm.mux, featureFlagConfigs: featureFlagConfigMap, reloadPersistentState: r.reloadPersistentState, @@ -488,7 +492,6 @@ func getRoutingUrlGroupingForCircuitBreakers( } func (s *graphServer) buildMultiGraphHandler( - ctx context.Context, opts buildMultiGraphHandlerOptions, ) (http.HandlerFunc, error) { if len(opts.featureFlagConfigs) == 0 { @@ -507,6 +510,8 @@ func (s *graphServer) buildMultiGraphHandler( if !hasChanged && !wasAdded { oldGraphMux, exists := opts.currentGraphMuxes[featureFlagName] if exists { + s.logger.Debug("will reuse feature flag mux for new graph server", + zap.String("flag", featureFlagName)) featureFlagToMux[featureFlagName] = oldGraphMux.mux s.graphMuxListLock.Lock() s.graphMuxList[featureFlagName] = oldGraphMux @@ -517,7 +522,10 @@ func (s *graphServer) buildMultiGraphHandler( } } - gm, err := s.buildGraphMux(ctx, BuildGraphMuxOptions{ + s.logger.Debug("will create a new feature flag mux for new graph server", + zap.String("flag", featureFlagName)) + + gm, err := s.buildGraphMux(BuildGraphMuxOptions{ FeatureFlagName: featureFlagName, RouterConfigVersion: executionConfig.GetVersion(), EngineConfig: executionConfig.GetEngineConfig(), @@ -584,6 +592,9 @@ func (s *graphServer) setupEngineStatistics(baseAttributes []attribute.KeyValue) } type graphMux struct { + ctx context.Context + cancel context.CancelFunc + mux *chi.Mux reused atomic.Bool @@ -864,6 +875,9 @@ func (s *graphMux) configureCacheMetrics(srv *graphServer, baseOtelAttributes [] } func (s *graphMux) Shutdown(ctx context.Context) error { + // cancel the graph muxes context to close its resources like websocket connections, resolvers, etc. + s.cancel() + s.planCache.Close() s.planFallbackCache.Close() s.persistedOperationCache.Close() @@ -923,10 +937,13 @@ func (s *graphMux) Shutdown(ctx context.Context) error { // It also creates a new execution plan cache for the mux. The mux is not mounted on the server. // The mux is appended internally to the graph server's list of muxes to clean up later when the server is swapped. func (s *graphServer) buildGraphMux( - ctx context.Context, opts BuildGraphMuxOptions, ) (*graphMux, error) { + graphMuxCtx, graphMuxCancel := context.WithCancel(s.routerCtx) + gm := &graphMux{ + ctx: graphMuxCtx, + cancel: graphMuxCancel, metricStore: rmetric.NewNoopMetrics(), streamMetricStore: rmetric.NewNoopStreamMetricStore(), } @@ -1320,7 +1337,7 @@ func (s *graphServer) buildGraphMux( subgraphTippers[subgraph] = subgraphTransport } - if err := s.setupConnector(ctx, opts.EngineConfig, opts.ConfigSubgraphs, telemetryAttExpressions, tracingAttExpressions); err != nil { + if err := s.setupConnector(s.graphServerCtx, opts.EngineConfig, opts.ConfigSubgraphs, telemetryAttExpressions, tracingAttExpressions); err != nil { return nil, fmt.Errorf("failed to setup plugin host: %w", err) } @@ -1369,7 +1386,7 @@ func (s *graphServer) buildGraphMux( } executor, providers, err := ecb.Build( - ctx, + graphMuxCtx, &ExecutorBuildOptions{ EngineConfig: opts.EngineConfig, Subgraphs: opts.ConfigSubgraphs, @@ -1387,7 +1404,7 @@ func (s *graphServer) buildGraphMux( } s.pubSubProviders = providers - if pubSubStartupErr := s.startupPubSubProviders(ctx); pubSubStartupErr != nil { + if pubSubStartupErr := s.startupPubSubProviders(s.graphServerCtx); pubSubStartupErr != nil { return nil, pubSubStartupErr } @@ -1458,7 +1475,7 @@ func (s *graphServer) buildGraphMux( } warmupConfig.AfterOperation = func(item *CacheWarmupOperationPlanResult) { - gm.metricStore.MeasureOperationPlanningTime(ctx, + gm.metricStore.MeasureOperationPlanningTime(graphMuxCtx, item.PlanningTime, nil, otelmetric.WithAttributes( @@ -1510,7 +1527,7 @@ func (s *graphServer) buildGraphMux( return nil, fmt.Errorf("unexpected cache warmer source provided") } - err = WarmupCaches(ctx, warmupConfig) + err = WarmupCaches(graphMuxCtx, warmupConfig) if err != nil { // We don't want to fail the server if the cache warmup fails s.logger.Error("Failed to warmup caches. It will retry after server restart or graph execution config update", zap.Error(err)) @@ -1537,7 +1554,7 @@ func (s *graphServer) buildGraphMux( }) manifestAfterOperation := func(item *CacheWarmupOperationPlanResult) { - gm.metricStore.MeasureOperationPlanningTime(ctx, + gm.metricStore.MeasureOperationPlanningTime(graphMuxCtx, item.PlanningTime, nil, otelmetric.WithAttributes( @@ -1564,7 +1581,7 @@ func (s *graphServer) buildGraphMux( AfterOperation: manifestAfterOperation, } - err = WarmupCaches(ctx, manifestWarmupConfig) + err = WarmupCaches(graphMuxCtx, manifestWarmupConfig) if err != nil { s.logger.Error("Failed to warmup PQL manifest operations", zap.Error(err)) } @@ -1583,7 +1600,7 @@ func (s *graphServer) buildGraphMux( AfterOperation: manifestAfterOperation, } - if rewarmErr := WarmupCaches(ctx, rewarmConfig); rewarmErr != nil { + if rewarmErr := WarmupCaches(graphMuxCtx, rewarmConfig); rewarmErr != nil { s.logger.Error("Failed to re-warm PQL manifest operations after update", zap.Error(rewarmErr)) } }) @@ -1711,7 +1728,7 @@ func (s *graphServer) buildGraphMux( }) if s.webSocketConfiguration != nil && s.webSocketConfiguration.Enabled { - wsMiddleware := NewWebsocketMiddleware(ctx, WebsocketMiddlewareOptions{ + wsMiddleware := NewWebsocketMiddleware(graphMuxCtx, WebsocketMiddlewareOptions{ OperationProcessor: operationProcessor, OperationBlocker: operationBlocker, Planner: operationPlanner, @@ -1971,8 +1988,8 @@ func (s *graphServer) wait(ctx context.Context) error { // Shutdown does cancel the context after all non-hijacked requests such as WebSockets has been handled. func (s *graphServer) Shutdown(ctx context.Context) error { // Cancel the context after the graceful shutdown is done - // to clean up resources like websocket connections, pools, etc. - defer s.cancelFunc() + // to clean up resources. + defer s.graphServerCancel() s.logger.Debug("Shutdown of graph server initiated. Waiting for in-flight requests to finish.", zap.String("config_version", s.baseRouterConfigVersion), From 1ae7d2e69ed810ab901372a18f764c03513526e6 Mon Sep 17 00:00:00 2001 From: Peter Polacik Date: Thu, 7 May 2026 19:33:16 +0200 Subject: [PATCH 06/26] feat: add support for split config in cdn (#2839) --- cdn-server/cdn/src/index.ts | 98 +++++++++++++ cdn-server/cdn/test/cdn.test.ts | 249 +++++++++++++++++++++++++++++++- 2 files changed, 343 insertions(+), 4 deletions(-) diff --git a/cdn-server/cdn/src/index.ts b/cdn-server/cdn/src/index.ts index 6c2ad55a21..78ae5b096b 100644 --- a/cdn-server/cdn/src/index.ts +++ b/cdn-server/cdn/src/index.ts @@ -52,6 +52,7 @@ declare module 'hono' { interface ContextVariableMap { authenticatedOrganizationId: string; authenticatedFederatedGraphId: string; + authenticatedFeatures: string[]; } } @@ -102,6 +103,19 @@ const jwtMiddleware = (secret: string | ((c: Context) => string)) => { c.set('authenticatedFederatedGraphId', federatedGraphId as string); } + const features = result.payload.features; + c.set('authenticatedFeatures', Array.isArray(features) ? (features as string[]) : []); + + await next(); + }; +}; + +const requireFeature = (feature: string) => { + return async (c: Context, next: Next) => { + const features = c.get('authenticatedFeatures'); + if (!features || !features.includes(feature)) { + return c.text('Forbidden - Missing required feature', 403); + } await next(); }; }; @@ -353,6 +367,59 @@ const subgraphChecks = (storage: BlobStorage) => { }; }; +const manifestBlob = (storage: BlobStorage, keyBuilder: (orgId: string, graphId: string, c: Context) => string) => { + return async (c: Context) => { + const organizationId = c.get('authenticatedOrganizationId'); + const federatedGraphId = c.get('authenticatedFederatedGraphId'); + + if (organizationId !== c.req.param('organization_id') || federatedGraphId !== c.req.param('federated_graph_id')) { + return c.text('Bad Request', 400); + } + + const key = keyBuilder(organizationId, federatedGraphId, c); + + const body = await c.req.json(); + + let isModified = true; + + if (body?.version) { + try { + isModified = await storage.headObject({ context: c, key, version: body.version }); + } catch (e: any) { + if (e instanceof BlobNotFoundError) { + return c.notFound(); + } + throw e; + } + } + + if (!isModified) { + return c.body(null, 304); + } + + let blobObject: BlobObject; + + try { + blobObject = await storage.getObject({ context: c, key, cacheControl: 'no-cache' }); + + if (blobObject.metadata && blobObject.metadata['signature-sha256']) { + c.header(signatureSha256Header, blobObject.metadata['signature-sha256']); + } + } catch (e: any) { + if (e instanceof BlobNotFoundError) { + return c.notFound(); + } + throw e; + } + + c.header('Content-Type', 'application/json; charset=UTF-8'); + + return stream(c, async (stream) => { + await stream.pipe(blobObject.stream); + }); + }; +}; + // eslint-disable-next-line @typescript-eslint/ban-types export const cdn = ( hono: Hono, @@ -391,4 +458,35 @@ export const cdn = `${orgId}/${graphId}/manifest/mapper.json`), + ); + + const manifestLatestPath = '/:organization_id/:federated_graph_id/manifest/latest.json'; + hono + .use(manifestLatestPath, jwtMiddleware(opts.authJwtSecret)) + .use(manifestLatestPath, requireFeature('split-config-loading')) + .post( + manifestLatestPath, + manifestBlob(opts.blobStorage, (orgId, graphId) => `${orgId}/${graphId}/manifest/latest.json`), + ); + + const manifestFeatureFlagPath = + '/:organization_id/:federated_graph_id/manifest/feature-flags/:feature_flag_name{.+\\.json$}'; + hono + .use(manifestFeatureFlagPath, jwtMiddleware(opts.authJwtSecret)) + .use(manifestFeatureFlagPath, requireFeature('split-config-loading')) + .post( + manifestFeatureFlagPath, + manifestBlob( + opts.blobStorage, + (orgId, graphId, c) => `${orgId}/${graphId}/manifest/feature-flags/${c.req.param('feature_flag_name')}`, + ), + ); }; diff --git a/cdn-server/cdn/test/cdn.test.ts b/cdn-server/cdn/test/cdn.test.ts index 9e2eec6e87..3a1ecef73f 100644 --- a/cdn-server/cdn/test/cdn.test.ts +++ b/cdn-server/cdn/test/cdn.test.ts @@ -7,11 +7,21 @@ import { BlobStorage, BlobNotFoundError, cdn, BlobObject, signatureSha256Header const secretKey = 'hunter2'; const secretAdmissionKey = 'hunter3'; -const generateToken = async (organizationId: string, federatedGraphId: string | undefined, secret: string) => { +const generateToken = async ( + organizationId: string, + federatedGraphId: string | undefined, + secret: string, + features?: string[], +) => { const secretKey = new TextEncoder().encode(secret); - return await new SignJWT({ organization_id: organizationId, federated_graph_id: federatedGraphId }) - .setProtectedHeader({ alg: 'HS256' }) - .sign(secretKey); + const payload: Record = { + organization_id: organizationId, + federated_graph_id: federatedGraphId, + }; + if (features !== undefined) { + payload.features = features; + } + return await new SignJWT(payload).setProtectedHeader({ alg: 'HS256' }).sign(secretKey); }; class InMemoryBlobStorage implements BlobStorage { @@ -844,4 +854,235 @@ describe('CDN handlers', () => { expect(res.status).toBe(404); }); }); + + describe('Test manifest endpoints (split-config-loading)', async () => { + const federatedGraphId = 'federatedGraphId'; + const organizationId = 'organizationId'; + const tokenWithFeature = await generateToken(organizationId, federatedGraphId, secretKey, ['split-config-loading']); + const tokenNoFeature = await generateToken(organizationId, federatedGraphId, secretKey); + const tokenWrongFeature = await generateToken(organizationId, federatedGraphId, secretKey, ['other-feature']); + const blobStorage = new InMemoryBlobStorage(); + + const mapperContents = JSON.stringify({ graphConfigs: { '': 'hash-base' } }); + const latestContents = JSON.stringify({ version: 'v1', engineConfig: {} }); + const featureFlagContents = JSON.stringify({ version: 'v1', engineConfig: { featureFlag: true } }); + + blobStorage.objects.set(`${organizationId}/${federatedGraphId}/manifest/mapper.json`, { + buffer: Buffer.from(mapperContents), + metadata: { version: 'v1', 'signature-sha256': 'sig-mapper' }, + }); + + blobStorage.objects.set(`${organizationId}/${federatedGraphId}/manifest/latest.json`, { + buffer: Buffer.from(latestContents), + metadata: { version: 'v1' }, + }); + + blobStorage.objects.set(`${organizationId}/${federatedGraphId}/manifest/feature-flags/my-flag.json`, { + buffer: Buffer.from(featureFlagContents), + metadata: { version: 'v1' }, + }); + + const app = new Hono(); + + cdn(app, { + authJwtSecret: secretKey, + authAdmissionJwtSecret: secretAdmissionKey, + blobStorage, + }); + + describe('feature gate authorization', () => { + test('returns 403 when features claim is missing from JWT', async () => { + const res = await app.request(`/${organizationId}/${federatedGraphId}/manifest/mapper.json`, { + method: 'POST', + headers: { Authorization: `Bearer ${tokenNoFeature}` }, + body: JSON.stringify({ version: '' }), + }); + expect(res.status).toBe(403); + }); + + test('returns 403 when features claim does not include split-config-loading', async () => { + const res = await app.request(`/${organizationId}/${federatedGraphId}/manifest/mapper.json`, { + method: 'POST', + headers: { Authorization: `Bearer ${tokenWrongFeature}` }, + body: JSON.stringify({ version: '' }), + }); + expect(res.status).toBe(403); + }); + + test('returns 403 for latest.json without feature', async () => { + const res = await app.request(`/${organizationId}/${federatedGraphId}/manifest/latest.json`, { + method: 'POST', + headers: { Authorization: `Bearer ${tokenNoFeature}` }, + body: JSON.stringify({ version: '' }), + }); + expect(res.status).toBe(403); + }); + + test('returns 403 for feature-flags without feature', async () => { + const res = await app.request(`/${organizationId}/${federatedGraphId}/manifest/feature-flags/my-flag.json`, { + method: 'POST', + headers: { Authorization: `Bearer ${tokenNoFeature}` }, + body: JSON.stringify({ version: '' }), + }); + expect(res.status).toBe(403); + }); + }); + + describe('JWT authentication', () => { + test('returns 401 with no token', async () => { + const res = await app.request(`/${organizationId}/${federatedGraphId}/manifest/mapper.json`, { + method: 'POST', + }); + expect(res.status).toBe(401); + }); + + test('returns 401 with invalid token', async () => { + const res = await app.request(`/${organizationId}/${federatedGraphId}/manifest/mapper.json`, { + method: 'POST', + headers: { Authorization: `Bearer ${tokenWithFeature.slice(0, -1)}}` }, + body: JSON.stringify({ version: '' }), + }); + expect(res.status).toBe(401); + }); + + test('returns 401 with expired token', async () => { + const expiredToken = await new SignJWT({ + organization_id: organizationId, + federated_graph_id: federatedGraphId, + features: ['split-config-loading'], + exp: Math.floor(Date.now() / 1000) - 60, + }) + .setProtectedHeader({ alg: 'HS256' }) + .sign(new TextEncoder().encode(secretKey)); + const res = await app.request(`/${organizationId}/${federatedGraphId}/manifest/mapper.json`, { + method: 'POST', + headers: { Authorization: `Bearer ${expiredToken}` }, + body: JSON.stringify({ version: '' }), + }); + expect(res.status).toBe(401); + }); + }); + + describe('mapper.json', () => { + test('returns mapper blob content with correct headers', async () => { + const res = await app.request(`/${organizationId}/${federatedGraphId}/manifest/mapper.json`, { + method: 'POST', + headers: { Authorization: `Bearer ${tokenWithFeature}` }, + body: JSON.stringify({ version: '' }), + }); + expect(res.status).toBe(200); + expect(res.headers.get('Content-Type')).toBe('application/json; charset=UTF-8'); + expect(res.headers.get(signatureSha256Header)).toBe('sig-mapper'); + expect(await res.text()).toBe(mapperContents); + }); + + test('returns 304 when version matches', async () => { + const res = await app.request(`/${organizationId}/${federatedGraphId}/manifest/mapper.json`, { + method: 'POST', + headers: { Authorization: `Bearer ${tokenWithFeature}` }, + body: JSON.stringify({ version: 'v1' }), + }); + expect(res.status).toBe(304); + }); + + test('returns 404 when blob does not exist', async () => { + const emptyStorage = new InMemoryBlobStorage(); + const otherApp = new Hono(); + cdn(otherApp, { + authJwtSecret: secretKey, + authAdmissionJwtSecret: secretAdmissionKey, + blobStorage: emptyStorage, + }); + + const res = await otherApp.request(`/${organizationId}/${federatedGraphId}/manifest/mapper.json`, { + method: 'POST', + headers: { Authorization: `Bearer ${tokenWithFeature}` }, + body: JSON.stringify({ version: '' }), + }); + expect(res.status).toBe(404); + }); + + test('returns 400 when org/graph ID mismatch', async () => { + const res = await app.request(`/wrong-org/${federatedGraphId}/manifest/mapper.json`, { + method: 'POST', + headers: { Authorization: `Bearer ${tokenWithFeature}` }, + body: JSON.stringify({ version: '' }), + }); + expect(res.status).toBe(400); + }); + }); + + describe('latest.json', () => { + test('returns latest manifest blob content', async () => { + const res = await app.request(`/${organizationId}/${federatedGraphId}/manifest/latest.json`, { + method: 'POST', + headers: { Authorization: `Bearer ${tokenWithFeature}` }, + body: JSON.stringify({ version: '' }), + }); + expect(res.status).toBe(200); + expect(res.headers.get('Content-Type')).toBe('application/json; charset=UTF-8'); + expect(await res.text()).toBe(latestContents); + }); + + test('returns 304 when version matches', async () => { + const res = await app.request(`/${organizationId}/${federatedGraphId}/manifest/latest.json`, { + method: 'POST', + headers: { Authorization: `Bearer ${tokenWithFeature}` }, + body: JSON.stringify({ version: 'v1' }), + }); + expect(res.status).toBe(304); + }); + + test('returns 404 when blob does not exist', async () => { + const emptyStorage = new InMemoryBlobStorage(); + const otherApp = new Hono(); + cdn(otherApp, { + authJwtSecret: secretKey, + authAdmissionJwtSecret: secretAdmissionKey, + blobStorage: emptyStorage, + }); + + const res = await otherApp.request(`/${organizationId}/${federatedGraphId}/manifest/latest.json`, { + method: 'POST', + headers: { Authorization: `Bearer ${tokenWithFeature}` }, + body: JSON.stringify({ version: '' }), + }); + expect(res.status).toBe(404); + }); + }); + + describe('feature-flags/:name.json', () => { + test('returns feature flag blob content', async () => { + const res = await app.request(`/${organizationId}/${federatedGraphId}/manifest/feature-flags/my-flag.json`, { + method: 'POST', + headers: { Authorization: `Bearer ${tokenWithFeature}` }, + body: JSON.stringify({ version: '' }), + }); + expect(res.status).toBe(200); + expect(res.headers.get('Content-Type')).toBe('application/json; charset=UTF-8'); + expect(await res.text()).toBe(featureFlagContents); + }); + + test('returns 304 when version matches', async () => { + const res = await app.request(`/${organizationId}/${federatedGraphId}/manifest/feature-flags/my-flag.json`, { + method: 'POST', + headers: { Authorization: `Bearer ${tokenWithFeature}` }, + body: JSON.stringify({ version: 'v1' }), + }); + expect(res.status).toBe(304); + }); + + test('returns 404 when blob does not exist', async () => { + const res = await app.request( + `/${organizationId}/${federatedGraphId}/manifest/feature-flags/nonexistent.json`, + { + method: 'POST', + headers: { Authorization: `Bearer ${tokenWithFeature}` }, + body: JSON.stringify({ version: '' }), + }, + ); + expect(res.status).toBe(404); + }); + }); + }); }); From ba6368082ee5685a66ef47bf37ce39678321a182 Mon Sep 17 00:00:00 2001 From: Dominik Korittki <23359034+dkorittki@users.noreply.github.com> Date: Fri, 8 May 2026 13:28:33 +0000 Subject: [PATCH 07/26] fix(router): fix unmarshall error of mapper.json during config fetch (#2842) --- .../gen/proto/wg/cosmo/node/v1/node.pb.go | 808 ++++++++---------- connect/src/wg/cosmo/node/v1/node_pb.ts | 40 - proto/wg/cosmo/node/v1/node.proto | 6 - router/gen/proto/wg/cosmo/node/v1/node.pb.go | 808 ++++++++---------- .../configpoller/split_config_poller.go | 33 +- .../configpoller/split_config_poller_test.go | 40 +- router/pkg/routerconfig/cdn/split_fetcher.go | 12 +- .../routerconfig/cdn/split_fetcher_test.go | 11 +- 8 files changed, 797 insertions(+), 961 deletions(-) diff --git a/connect-go/gen/proto/wg/cosmo/node/v1/node.pb.go b/connect-go/gen/proto/wg/cosmo/node/v1/node.pb.go index d02c520cbd..3d9776a6ca 100644 --- a/connect-go/gen/proto/wg/cosmo/node/v1/node.pb.go +++ b/connect-go/gen/proto/wg/cosmo/node/v1/node.pb.go @@ -669,52 +669,6 @@ func (x *RouterConfig) GetCompatibilityVersion() string { return "" } -type ActiveGraphs struct { - state protoimpl.MessageState `protogen:"open.v1"` - // key = feature flag name, empty means base graph - // value = hash of engine_config - GraphConfigs map[string]string `protobuf:"bytes,1,rep,name=graphConfigs,proto3" json:"graphConfigs,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache -} - -func (x *ActiveGraphs) Reset() { - *x = ActiveGraphs{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[4] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *ActiveGraphs) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ActiveGraphs) ProtoMessage() {} - -func (x *ActiveGraphs) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[4] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use ActiveGraphs.ProtoReflect.Descriptor instead. -func (*ActiveGraphs) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{4} -} - -func (x *ActiveGraphs) GetGraphConfigs() map[string]string { - if x != nil { - return x.GraphConfigs - } - return nil -} - type Response struct { state protoimpl.MessageState `protogen:"open.v1"` Code common.EnumStatusCode `protobuf:"varint,1,opt,name=code,proto3,enum=wg.cosmo.common.EnumStatusCode" json:"code,omitempty"` @@ -726,7 +680,7 @@ type Response struct { func (x *Response) Reset() { *x = Response{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[5] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[4] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -738,7 +692,7 @@ func (x *Response) String() string { func (*Response) ProtoMessage() {} func (x *Response) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[5] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[4] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -751,7 +705,7 @@ func (x *Response) ProtoReflect() protoreflect.Message { // Deprecated: Use Response.ProtoReflect.Descriptor instead. func (*Response) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{5} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{4} } func (x *Response) GetCode() common.EnumStatusCode { @@ -778,7 +732,7 @@ type ResponseStatus struct { func (x *ResponseStatus) Reset() { *x = ResponseStatus{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[6] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[5] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -790,7 +744,7 @@ func (x *ResponseStatus) String() string { func (*ResponseStatus) ProtoMessage() {} func (x *ResponseStatus) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[6] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[5] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -803,7 +757,7 @@ func (x *ResponseStatus) ProtoReflect() protoreflect.Message { // Deprecated: Use ResponseStatus.ProtoReflect.Descriptor instead. func (*ResponseStatus) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{6} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{5} } func (x *ResponseStatus) GetCode() int32 { @@ -830,7 +784,7 @@ type RegistrationInfo struct { func (x *RegistrationInfo) Reset() { *x = RegistrationInfo{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[7] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -842,7 +796,7 @@ func (x *RegistrationInfo) String() string { func (*RegistrationInfo) ProtoMessage() {} func (x *RegistrationInfo) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[7] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[6] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -855,7 +809,7 @@ func (x *RegistrationInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use RegistrationInfo.ProtoReflect.Descriptor instead. func (*RegistrationInfo) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{7} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{6} } func (x *RegistrationInfo) GetAccountLimits() *AccountLimits { @@ -883,7 +837,7 @@ type AccountLimits struct { func (x *AccountLimits) Reset() { *x = AccountLimits{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[8] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -895,7 +849,7 @@ func (x *AccountLimits) String() string { func (*AccountLimits) ProtoMessage() {} func (x *AccountLimits) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[8] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[7] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -908,7 +862,7 @@ func (x *AccountLimits) ProtoReflect() protoreflect.Message { // Deprecated: Use AccountLimits.ProtoReflect.Descriptor instead. func (*AccountLimits) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{8} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{7} } func (x *AccountLimits) GetTraceSamplingRate() float32 { @@ -926,7 +880,7 @@ type SelfRegisterRequest struct { func (x *SelfRegisterRequest) Reset() { *x = SelfRegisterRequest{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[9] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -938,7 +892,7 @@ func (x *SelfRegisterRequest) String() string { func (*SelfRegisterRequest) ProtoMessage() {} func (x *SelfRegisterRequest) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[9] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[8] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -951,7 +905,7 @@ func (x *SelfRegisterRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SelfRegisterRequest.ProtoReflect.Descriptor instead. func (*SelfRegisterRequest) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{9} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{8} } type SelfRegisterResponse struct { @@ -964,7 +918,7 @@ type SelfRegisterResponse struct { func (x *SelfRegisterResponse) Reset() { *x = SelfRegisterResponse{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[10] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -976,7 +930,7 @@ func (x *SelfRegisterResponse) String() string { func (*SelfRegisterResponse) ProtoMessage() {} func (x *SelfRegisterResponse) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[10] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[9] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -989,7 +943,7 @@ func (x *SelfRegisterResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use SelfRegisterResponse.ProtoReflect.Descriptor instead. func (*SelfRegisterResponse) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{10} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{9} } func (x *SelfRegisterResponse) GetResponse() *Response { @@ -1021,7 +975,7 @@ type EngineConfiguration struct { func (x *EngineConfiguration) Reset() { *x = EngineConfiguration{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[11] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1033,7 +987,7 @@ func (x *EngineConfiguration) String() string { func (*EngineConfiguration) ProtoMessage() {} func (x *EngineConfiguration) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[11] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[10] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1046,7 +1000,7 @@ func (x *EngineConfiguration) ProtoReflect() protoreflect.Message { // Deprecated: Use EngineConfiguration.ProtoReflect.Descriptor instead. func (*EngineConfiguration) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{11} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{10} } func (x *EngineConfiguration) GetDefaultFlushInterval() int64 { @@ -1122,7 +1076,7 @@ type DataSourceConfiguration struct { func (x *DataSourceConfiguration) Reset() { *x = DataSourceConfiguration{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[12] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1134,7 +1088,7 @@ func (x *DataSourceConfiguration) String() string { func (*DataSourceConfiguration) ProtoMessage() {} func (x *DataSourceConfiguration) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[12] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[11] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1147,7 +1101,7 @@ func (x *DataSourceConfiguration) ProtoReflect() protoreflect.Message { // Deprecated: Use DataSourceConfiguration.ProtoReflect.Descriptor instead. func (*DataSourceConfiguration) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{12} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{11} } func (x *DataSourceConfiguration) GetKind() DataSourceKind { @@ -1274,7 +1228,7 @@ type CostConfiguration struct { func (x *CostConfiguration) Reset() { *x = CostConfiguration{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[13] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1286,7 +1240,7 @@ func (x *CostConfiguration) String() string { func (*CostConfiguration) ProtoMessage() {} func (x *CostConfiguration) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[13] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[12] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1299,7 +1253,7 @@ func (x *CostConfiguration) ProtoReflect() protoreflect.Message { // Deprecated: Use CostConfiguration.ProtoReflect.Descriptor instead. func (*CostConfiguration) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{13} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{12} } func (x *CostConfiguration) GetFieldWeights() []*FieldWeightConfiguration { @@ -1343,7 +1297,7 @@ type FieldWeightConfiguration struct { func (x *FieldWeightConfiguration) Reset() { *x = FieldWeightConfiguration{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[14] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1355,7 +1309,7 @@ func (x *FieldWeightConfiguration) String() string { func (*FieldWeightConfiguration) ProtoMessage() {} func (x *FieldWeightConfiguration) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[14] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[13] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1368,7 +1322,7 @@ func (x *FieldWeightConfiguration) ProtoReflect() protoreflect.Message { // Deprecated: Use FieldWeightConfiguration.ProtoReflect.Descriptor instead. func (*FieldWeightConfiguration) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{14} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{13} } func (x *FieldWeightConfiguration) GetTypeName() string { @@ -1420,7 +1374,7 @@ type FieldListSizeConfiguration struct { func (x *FieldListSizeConfiguration) Reset() { *x = FieldListSizeConfiguration{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[15] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1432,7 +1386,7 @@ func (x *FieldListSizeConfiguration) String() string { func (*FieldListSizeConfiguration) ProtoMessage() {} func (x *FieldListSizeConfiguration) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[15] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[14] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1445,7 +1399,7 @@ func (x *FieldListSizeConfiguration) ProtoReflect() protoreflect.Message { // Deprecated: Use FieldListSizeConfiguration.ProtoReflect.Descriptor instead. func (*FieldListSizeConfiguration) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{15} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{14} } func (x *FieldListSizeConfiguration) GetTypeName() string { @@ -1500,7 +1454,7 @@ type ArgumentConfiguration struct { func (x *ArgumentConfiguration) Reset() { *x = ArgumentConfiguration{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[16] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[15] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1512,7 +1466,7 @@ func (x *ArgumentConfiguration) String() string { func (*ArgumentConfiguration) ProtoMessage() {} func (x *ArgumentConfiguration) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[16] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[15] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1525,7 +1479,7 @@ func (x *ArgumentConfiguration) ProtoReflect() protoreflect.Message { // Deprecated: Use ArgumentConfiguration.ProtoReflect.Descriptor instead. func (*ArgumentConfiguration) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{16} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{15} } func (x *ArgumentConfiguration) GetName() string { @@ -1551,7 +1505,7 @@ type Scopes struct { func (x *Scopes) Reset() { *x = Scopes{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[17] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[16] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1563,7 +1517,7 @@ func (x *Scopes) String() string { func (*Scopes) ProtoMessage() {} func (x *Scopes) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[17] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[16] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1576,7 +1530,7 @@ func (x *Scopes) ProtoReflect() protoreflect.Message { // Deprecated: Use Scopes.ProtoReflect.Descriptor instead. func (*Scopes) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{17} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{16} } func (x *Scopes) GetRequiredAndScopes() []string { @@ -1597,7 +1551,7 @@ type AuthorizationConfiguration struct { func (x *AuthorizationConfiguration) Reset() { *x = AuthorizationConfiguration{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[18] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[17] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1609,7 +1563,7 @@ func (x *AuthorizationConfiguration) String() string { func (*AuthorizationConfiguration) ProtoMessage() {} func (x *AuthorizationConfiguration) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[18] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[17] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1622,7 +1576,7 @@ func (x *AuthorizationConfiguration) ProtoReflect() protoreflect.Message { // Deprecated: Use AuthorizationConfiguration.ProtoReflect.Descriptor instead. func (*AuthorizationConfiguration) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{18} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{17} } func (x *AuthorizationConfiguration) GetRequiresAuthentication() bool { @@ -1659,7 +1613,7 @@ type FieldConfiguration struct { func (x *FieldConfiguration) Reset() { *x = FieldConfiguration{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[19] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[18] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1671,7 +1625,7 @@ func (x *FieldConfiguration) String() string { func (*FieldConfiguration) ProtoMessage() {} func (x *FieldConfiguration) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[19] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[18] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1684,7 +1638,7 @@ func (x *FieldConfiguration) ProtoReflect() protoreflect.Message { // Deprecated: Use FieldConfiguration.ProtoReflect.Descriptor instead. func (*FieldConfiguration) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{19} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{18} } func (x *FieldConfiguration) GetTypeName() string { @@ -1732,7 +1686,7 @@ type TypeConfiguration struct { func (x *TypeConfiguration) Reset() { *x = TypeConfiguration{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[20] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[19] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1744,7 +1698,7 @@ func (x *TypeConfiguration) String() string { func (*TypeConfiguration) ProtoMessage() {} func (x *TypeConfiguration) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[20] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[19] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1757,7 +1711,7 @@ func (x *TypeConfiguration) ProtoReflect() protoreflect.Message { // Deprecated: Use TypeConfiguration.ProtoReflect.Descriptor instead. func (*TypeConfiguration) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{20} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{19} } func (x *TypeConfiguration) GetTypeName() string { @@ -1786,7 +1740,7 @@ type TypeField struct { func (x *TypeField) Reset() { *x = TypeField{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[21] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[20] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1798,7 +1752,7 @@ func (x *TypeField) String() string { func (*TypeField) ProtoMessage() {} func (x *TypeField) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[21] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[20] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1811,7 +1765,7 @@ func (x *TypeField) ProtoReflect() protoreflect.Message { // Deprecated: Use TypeField.ProtoReflect.Descriptor instead. func (*TypeField) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{21} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{20} } func (x *TypeField) GetTypeName() string { @@ -1852,7 +1806,7 @@ type FieldCoordinates struct { func (x *FieldCoordinates) Reset() { *x = FieldCoordinates{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[22] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[21] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1864,7 +1818,7 @@ func (x *FieldCoordinates) String() string { func (*FieldCoordinates) ProtoMessage() {} func (x *FieldCoordinates) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[22] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[21] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1877,7 +1831,7 @@ func (x *FieldCoordinates) ProtoReflect() protoreflect.Message { // Deprecated: Use FieldCoordinates.ProtoReflect.Descriptor instead. func (*FieldCoordinates) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{22} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{21} } func (x *FieldCoordinates) GetFieldName() string { @@ -1904,7 +1858,7 @@ type FieldSetCondition struct { func (x *FieldSetCondition) Reset() { *x = FieldSetCondition{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[23] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[22] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1916,7 +1870,7 @@ func (x *FieldSetCondition) String() string { func (*FieldSetCondition) ProtoMessage() {} func (x *FieldSetCondition) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[23] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[22] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1929,7 +1883,7 @@ func (x *FieldSetCondition) ProtoReflect() protoreflect.Message { // Deprecated: Use FieldSetCondition.ProtoReflect.Descriptor instead. func (*FieldSetCondition) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{23} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{22} } func (x *FieldSetCondition) GetFieldCoordinatesPath() []*FieldCoordinates { @@ -1959,7 +1913,7 @@ type RequiredField struct { func (x *RequiredField) Reset() { *x = RequiredField{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[24] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[23] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1971,7 +1925,7 @@ func (x *RequiredField) String() string { func (*RequiredField) ProtoMessage() {} func (x *RequiredField) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[24] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[23] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1984,7 +1938,7 @@ func (x *RequiredField) ProtoReflect() protoreflect.Message { // Deprecated: Use RequiredField.ProtoReflect.Descriptor instead. func (*RequiredField) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{24} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{23} } func (x *RequiredField) GetTypeName() string { @@ -2032,7 +1986,7 @@ type EntityInterfaceConfiguration struct { func (x *EntityInterfaceConfiguration) Reset() { *x = EntityInterfaceConfiguration{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[25] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[24] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2044,7 +1998,7 @@ func (x *EntityInterfaceConfiguration) String() string { func (*EntityInterfaceConfiguration) ProtoMessage() {} func (x *EntityInterfaceConfiguration) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[25] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[24] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2057,7 +2011,7 @@ func (x *EntityInterfaceConfiguration) ProtoReflect() protoreflect.Message { // Deprecated: Use EntityInterfaceConfiguration.ProtoReflect.Descriptor instead. func (*EntityInterfaceConfiguration) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{25} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{24} } func (x *EntityInterfaceConfiguration) GetInterfaceTypeName() string { @@ -2100,7 +2054,7 @@ type FetchConfiguration struct { func (x *FetchConfiguration) Reset() { *x = FetchConfiguration{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[26] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[25] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2112,7 +2066,7 @@ func (x *FetchConfiguration) String() string { func (*FetchConfiguration) ProtoMessage() {} func (x *FetchConfiguration) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[26] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[25] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2125,7 +2079,7 @@ func (x *FetchConfiguration) ProtoReflect() protoreflect.Message { // Deprecated: Use FetchConfiguration.ProtoReflect.Descriptor instead. func (*FetchConfiguration) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{26} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{25} } func (x *FetchConfiguration) GetUrl() *ConfigurationVariable { @@ -2209,7 +2163,7 @@ type StatusCodeTypeMapping struct { func (x *StatusCodeTypeMapping) Reset() { *x = StatusCodeTypeMapping{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[27] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[26] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2221,7 +2175,7 @@ func (x *StatusCodeTypeMapping) String() string { func (*StatusCodeTypeMapping) ProtoMessage() {} func (x *StatusCodeTypeMapping) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[27] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[26] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2234,7 +2188,7 @@ func (x *StatusCodeTypeMapping) ProtoReflect() protoreflect.Message { // Deprecated: Use StatusCodeTypeMapping.ProtoReflect.Descriptor instead. func (*StatusCodeTypeMapping) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{27} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{26} } func (x *StatusCodeTypeMapping) GetStatusCode() int64 { @@ -2272,7 +2226,7 @@ type DataSourceCustom_GraphQL struct { func (x *DataSourceCustom_GraphQL) Reset() { *x = DataSourceCustom_GraphQL{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[28] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[27] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2284,7 +2238,7 @@ func (x *DataSourceCustom_GraphQL) String() string { func (*DataSourceCustom_GraphQL) ProtoMessage() {} func (x *DataSourceCustom_GraphQL) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[28] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[27] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2297,7 +2251,7 @@ func (x *DataSourceCustom_GraphQL) ProtoReflect() protoreflect.Message { // Deprecated: Use DataSourceCustom_GraphQL.ProtoReflect.Descriptor instead. func (*DataSourceCustom_GraphQL) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{28} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{27} } func (x *DataSourceCustom_GraphQL) GetFetch() *FetchConfiguration { @@ -2353,7 +2307,7 @@ type GRPCConfiguration struct { func (x *GRPCConfiguration) Reset() { *x = GRPCConfiguration{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[29] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[28] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2365,7 +2319,7 @@ func (x *GRPCConfiguration) String() string { func (*GRPCConfiguration) ProtoMessage() {} func (x *GRPCConfiguration) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[29] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[28] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2378,7 +2332,7 @@ func (x *GRPCConfiguration) ProtoReflect() protoreflect.Message { // Deprecated: Use GRPCConfiguration.ProtoReflect.Descriptor instead. func (*GRPCConfiguration) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{29} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{28} } func (x *GRPCConfiguration) GetMapping() *GRPCMapping { @@ -2412,7 +2366,7 @@ type ImageReference struct { func (x *ImageReference) Reset() { *x = ImageReference{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[30] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[29] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2424,7 +2378,7 @@ func (x *ImageReference) String() string { func (*ImageReference) ProtoMessage() {} func (x *ImageReference) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[30] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[29] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2437,7 +2391,7 @@ func (x *ImageReference) ProtoReflect() protoreflect.Message { // Deprecated: Use ImageReference.ProtoReflect.Descriptor instead. func (*ImageReference) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{30} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{29} } func (x *ImageReference) GetRepository() string { @@ -2467,7 +2421,7 @@ type PluginConfiguration struct { func (x *PluginConfiguration) Reset() { *x = PluginConfiguration{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[31] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[30] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2479,7 +2433,7 @@ func (x *PluginConfiguration) String() string { func (*PluginConfiguration) ProtoMessage() {} func (x *PluginConfiguration) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[31] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[30] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2492,7 +2446,7 @@ func (x *PluginConfiguration) ProtoReflect() protoreflect.Message { // Deprecated: Use PluginConfiguration.ProtoReflect.Descriptor instead. func (*PluginConfiguration) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{31} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{30} } func (x *PluginConfiguration) GetName() string { @@ -2526,7 +2480,7 @@ type SSLConfiguration struct { func (x *SSLConfiguration) Reset() { *x = SSLConfiguration{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[32] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[31] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2538,7 +2492,7 @@ func (x *SSLConfiguration) String() string { func (*SSLConfiguration) ProtoMessage() {} func (x *SSLConfiguration) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[32] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[31] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2551,7 +2505,7 @@ func (x *SSLConfiguration) ProtoReflect() protoreflect.Message { // Deprecated: Use SSLConfiguration.ProtoReflect.Descriptor instead. func (*SSLConfiguration) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{32} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{31} } func (x *SSLConfiguration) GetEnabled() bool { @@ -2584,7 +2538,7 @@ type GRPCMapping struct { func (x *GRPCMapping) Reset() { *x = GRPCMapping{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[33] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[32] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2596,7 +2550,7 @@ func (x *GRPCMapping) String() string { func (*GRPCMapping) ProtoMessage() {} func (x *GRPCMapping) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[33] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[32] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2609,7 +2563,7 @@ func (x *GRPCMapping) ProtoReflect() protoreflect.Message { // Deprecated: Use GRPCMapping.ProtoReflect.Descriptor instead. func (*GRPCMapping) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{33} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{32} } func (x *GRPCMapping) GetVersion() int32 { @@ -2680,7 +2634,7 @@ type LookupMapping struct { func (x *LookupMapping) Reset() { *x = LookupMapping{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[34] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[33] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2692,7 +2646,7 @@ func (x *LookupMapping) String() string { func (*LookupMapping) ProtoMessage() {} func (x *LookupMapping) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[34] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[33] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2705,7 +2659,7 @@ func (x *LookupMapping) ProtoReflect() protoreflect.Message { // Deprecated: Use LookupMapping.ProtoReflect.Descriptor instead. func (*LookupMapping) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{34} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{33} } func (x *LookupMapping) GetType() LookupType { @@ -2756,7 +2710,7 @@ type LookupFieldMapping struct { func (x *LookupFieldMapping) Reset() { *x = LookupFieldMapping{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[35] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[34] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2768,7 +2722,7 @@ func (x *LookupFieldMapping) String() string { func (*LookupFieldMapping) ProtoMessage() {} func (x *LookupFieldMapping) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[35] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[34] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2781,7 +2735,7 @@ func (x *LookupFieldMapping) ProtoReflect() protoreflect.Message { // Deprecated: Use LookupFieldMapping.ProtoReflect.Descriptor instead. func (*LookupFieldMapping) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{35} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{34} } func (x *LookupFieldMapping) GetType() string { @@ -2817,7 +2771,7 @@ type OperationMapping struct { func (x *OperationMapping) Reset() { *x = OperationMapping{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[36] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[35] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2829,7 +2783,7 @@ func (x *OperationMapping) String() string { func (*OperationMapping) ProtoMessage() {} func (x *OperationMapping) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[36] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[35] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2842,7 +2796,7 @@ func (x *OperationMapping) ProtoReflect() protoreflect.Message { // Deprecated: Use OperationMapping.ProtoReflect.Descriptor instead. func (*OperationMapping) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{36} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{35} } func (x *OperationMapping) GetType() OperationType { @@ -2903,7 +2857,7 @@ type EntityMapping struct { func (x *EntityMapping) Reset() { *x = EntityMapping{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[37] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[36] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2915,7 +2869,7 @@ func (x *EntityMapping) String() string { func (*EntityMapping) ProtoMessage() {} func (x *EntityMapping) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[37] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[36] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2928,7 +2882,7 @@ func (x *EntityMapping) ProtoReflect() protoreflect.Message { // Deprecated: Use EntityMapping.ProtoReflect.Descriptor instead. func (*EntityMapping) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{37} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{36} } func (x *EntityMapping) GetTypeName() string { @@ -2996,7 +2950,7 @@ type RequiredFieldMapping struct { func (x *RequiredFieldMapping) Reset() { *x = RequiredFieldMapping{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[38] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[37] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3008,7 +2962,7 @@ func (x *RequiredFieldMapping) String() string { func (*RequiredFieldMapping) ProtoMessage() {} func (x *RequiredFieldMapping) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[38] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[37] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3021,7 +2975,7 @@ func (x *RequiredFieldMapping) ProtoReflect() protoreflect.Message { // Deprecated: Use RequiredFieldMapping.ProtoReflect.Descriptor instead. func (*RequiredFieldMapping) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{38} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{37} } func (x *RequiredFieldMapping) GetFieldMapping() *FieldMapping { @@ -3065,7 +3019,7 @@ type TypeFieldMapping struct { func (x *TypeFieldMapping) Reset() { *x = TypeFieldMapping{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[39] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[38] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3077,7 +3031,7 @@ func (x *TypeFieldMapping) String() string { func (*TypeFieldMapping) ProtoMessage() {} func (x *TypeFieldMapping) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[39] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[38] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3090,7 +3044,7 @@ func (x *TypeFieldMapping) ProtoReflect() protoreflect.Message { // Deprecated: Use TypeFieldMapping.ProtoReflect.Descriptor instead. func (*TypeFieldMapping) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{39} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{38} } func (x *TypeFieldMapping) GetType() string { @@ -3122,7 +3076,7 @@ type FieldMapping struct { func (x *FieldMapping) Reset() { *x = FieldMapping{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[40] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[39] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3134,7 +3088,7 @@ func (x *FieldMapping) String() string { func (*FieldMapping) ProtoMessage() {} func (x *FieldMapping) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[40] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[39] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3147,7 +3101,7 @@ func (x *FieldMapping) ProtoReflect() protoreflect.Message { // Deprecated: Use FieldMapping.ProtoReflect.Descriptor instead. func (*FieldMapping) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{40} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{39} } func (x *FieldMapping) GetOriginal() string { @@ -3184,7 +3138,7 @@ type ArgumentMapping struct { func (x *ArgumentMapping) Reset() { *x = ArgumentMapping{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[41] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[40] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3196,7 +3150,7 @@ func (x *ArgumentMapping) String() string { func (*ArgumentMapping) ProtoMessage() {} func (x *ArgumentMapping) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[41] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[40] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3209,7 +3163,7 @@ func (x *ArgumentMapping) ProtoReflect() protoreflect.Message { // Deprecated: Use ArgumentMapping.ProtoReflect.Descriptor instead. func (*ArgumentMapping) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{41} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{40} } func (x *ArgumentMapping) GetOriginal() string { @@ -3236,7 +3190,7 @@ type EnumMapping struct { func (x *EnumMapping) Reset() { *x = EnumMapping{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[42] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[41] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3248,7 +3202,7 @@ func (x *EnumMapping) String() string { func (*EnumMapping) ProtoMessage() {} func (x *EnumMapping) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[42] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[41] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3261,7 +3215,7 @@ func (x *EnumMapping) ProtoReflect() protoreflect.Message { // Deprecated: Use EnumMapping.ProtoReflect.Descriptor instead. func (*EnumMapping) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{42} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{41} } func (x *EnumMapping) GetType() string { @@ -3288,7 +3242,7 @@ type EnumValueMapping struct { func (x *EnumValueMapping) Reset() { *x = EnumValueMapping{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[43] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[42] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3300,7 +3254,7 @@ func (x *EnumValueMapping) String() string { func (*EnumValueMapping) ProtoMessage() {} func (x *EnumValueMapping) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[43] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[42] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3313,7 +3267,7 @@ func (x *EnumValueMapping) ProtoReflect() protoreflect.Message { // Deprecated: Use EnumValueMapping.ProtoReflect.Descriptor instead. func (*EnumValueMapping) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{43} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{42} } func (x *EnumValueMapping) GetOriginal() string { @@ -3341,7 +3295,7 @@ type NatsStreamConfiguration struct { func (x *NatsStreamConfiguration) Reset() { *x = NatsStreamConfiguration{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[44] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[43] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3353,7 +3307,7 @@ func (x *NatsStreamConfiguration) String() string { func (*NatsStreamConfiguration) ProtoMessage() {} func (x *NatsStreamConfiguration) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[44] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[43] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3366,7 +3320,7 @@ func (x *NatsStreamConfiguration) ProtoReflect() protoreflect.Message { // Deprecated: Use NatsStreamConfiguration.ProtoReflect.Descriptor instead. func (*NatsStreamConfiguration) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{44} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{43} } func (x *NatsStreamConfiguration) GetConsumerName() string { @@ -3401,7 +3355,7 @@ type NatsEventConfiguration struct { func (x *NatsEventConfiguration) Reset() { *x = NatsEventConfiguration{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[45] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[44] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3413,7 +3367,7 @@ func (x *NatsEventConfiguration) String() string { func (*NatsEventConfiguration) ProtoMessage() {} func (x *NatsEventConfiguration) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[45] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[44] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3426,7 +3380,7 @@ func (x *NatsEventConfiguration) ProtoReflect() protoreflect.Message { // Deprecated: Use NatsEventConfiguration.ProtoReflect.Descriptor instead. func (*NatsEventConfiguration) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{45} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{44} } func (x *NatsEventConfiguration) GetEngineEventConfiguration() *EngineEventConfiguration { @@ -3460,7 +3414,7 @@ type KafkaEventConfiguration struct { func (x *KafkaEventConfiguration) Reset() { *x = KafkaEventConfiguration{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[46] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[45] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3472,7 +3426,7 @@ func (x *KafkaEventConfiguration) String() string { func (*KafkaEventConfiguration) ProtoMessage() {} func (x *KafkaEventConfiguration) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[46] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[45] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3485,7 +3439,7 @@ func (x *KafkaEventConfiguration) ProtoReflect() protoreflect.Message { // Deprecated: Use KafkaEventConfiguration.ProtoReflect.Descriptor instead. func (*KafkaEventConfiguration) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{46} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{45} } func (x *KafkaEventConfiguration) GetEngineEventConfiguration() *EngineEventConfiguration { @@ -3512,7 +3466,7 @@ type RedisEventConfiguration struct { func (x *RedisEventConfiguration) Reset() { *x = RedisEventConfiguration{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[47] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[46] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3524,7 +3478,7 @@ func (x *RedisEventConfiguration) String() string { func (*RedisEventConfiguration) ProtoMessage() {} func (x *RedisEventConfiguration) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[47] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[46] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3537,7 +3491,7 @@ func (x *RedisEventConfiguration) ProtoReflect() protoreflect.Message { // Deprecated: Use RedisEventConfiguration.ProtoReflect.Descriptor instead. func (*RedisEventConfiguration) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{47} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{46} } func (x *RedisEventConfiguration) GetEngineEventConfiguration() *EngineEventConfiguration { @@ -3566,7 +3520,7 @@ type EngineEventConfiguration struct { func (x *EngineEventConfiguration) Reset() { *x = EngineEventConfiguration{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[48] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[47] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3578,7 +3532,7 @@ func (x *EngineEventConfiguration) String() string { func (*EngineEventConfiguration) ProtoMessage() {} func (x *EngineEventConfiguration) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[48] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[47] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3591,7 +3545,7 @@ func (x *EngineEventConfiguration) ProtoReflect() protoreflect.Message { // Deprecated: Use EngineEventConfiguration.ProtoReflect.Descriptor instead. func (*EngineEventConfiguration) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{48} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{47} } func (x *EngineEventConfiguration) GetProviderId() string { @@ -3633,7 +3587,7 @@ type DataSourceCustomEvents struct { func (x *DataSourceCustomEvents) Reset() { *x = DataSourceCustomEvents{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[49] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[48] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3645,7 +3599,7 @@ func (x *DataSourceCustomEvents) String() string { func (*DataSourceCustomEvents) ProtoMessage() {} func (x *DataSourceCustomEvents) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[49] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[48] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3658,7 +3612,7 @@ func (x *DataSourceCustomEvents) ProtoReflect() protoreflect.Message { // Deprecated: Use DataSourceCustomEvents.ProtoReflect.Descriptor instead. func (*DataSourceCustomEvents) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{49} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{48} } func (x *DataSourceCustomEvents) GetNats() []*NatsEventConfiguration { @@ -3691,7 +3645,7 @@ type DataSourceCustom_Static struct { func (x *DataSourceCustom_Static) Reset() { *x = DataSourceCustom_Static{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[50] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[49] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3703,7 +3657,7 @@ func (x *DataSourceCustom_Static) String() string { func (*DataSourceCustom_Static) ProtoMessage() {} func (x *DataSourceCustom_Static) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[50] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[49] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3716,7 +3670,7 @@ func (x *DataSourceCustom_Static) ProtoReflect() protoreflect.Message { // Deprecated: Use DataSourceCustom_Static.ProtoReflect.Descriptor instead. func (*DataSourceCustom_Static) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{50} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{49} } func (x *DataSourceCustom_Static) GetData() *ConfigurationVariable { @@ -3739,7 +3693,7 @@ type ConfigurationVariable struct { func (x *ConfigurationVariable) Reset() { *x = ConfigurationVariable{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[51] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[50] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3751,7 +3705,7 @@ func (x *ConfigurationVariable) String() string { func (*ConfigurationVariable) ProtoMessage() {} func (x *ConfigurationVariable) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[51] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[50] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3764,7 +3718,7 @@ func (x *ConfigurationVariable) ProtoReflect() protoreflect.Message { // Deprecated: Use ConfigurationVariable.ProtoReflect.Descriptor instead. func (*ConfigurationVariable) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{51} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{50} } func (x *ConfigurationVariable) GetKind() ConfigurationVariableKind { @@ -3812,7 +3766,7 @@ type DirectiveConfiguration struct { func (x *DirectiveConfiguration) Reset() { *x = DirectiveConfiguration{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[52] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[51] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3824,7 +3778,7 @@ func (x *DirectiveConfiguration) String() string { func (*DirectiveConfiguration) ProtoMessage() {} func (x *DirectiveConfiguration) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[52] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[51] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3837,7 +3791,7 @@ func (x *DirectiveConfiguration) ProtoReflect() protoreflect.Message { // Deprecated: Use DirectiveConfiguration.ProtoReflect.Descriptor instead. func (*DirectiveConfiguration) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{52} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{51} } func (x *DirectiveConfiguration) GetDirectiveName() string { @@ -3864,7 +3818,7 @@ type URLQueryConfiguration struct { func (x *URLQueryConfiguration) Reset() { *x = URLQueryConfiguration{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[53] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[52] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3876,7 +3830,7 @@ func (x *URLQueryConfiguration) String() string { func (*URLQueryConfiguration) ProtoMessage() {} func (x *URLQueryConfiguration) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[53] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[52] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3889,7 +3843,7 @@ func (x *URLQueryConfiguration) ProtoReflect() protoreflect.Message { // Deprecated: Use URLQueryConfiguration.ProtoReflect.Descriptor instead. func (*URLQueryConfiguration) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{53} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{52} } func (x *URLQueryConfiguration) GetName() string { @@ -3915,7 +3869,7 @@ type HTTPHeader struct { func (x *HTTPHeader) Reset() { *x = HTTPHeader{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[54] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[53] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3927,7 +3881,7 @@ func (x *HTTPHeader) String() string { func (*HTTPHeader) ProtoMessage() {} func (x *HTTPHeader) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[54] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[53] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3940,7 +3894,7 @@ func (x *HTTPHeader) ProtoReflect() protoreflect.Message { // Deprecated: Use HTTPHeader.ProtoReflect.Descriptor instead. func (*HTTPHeader) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{54} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{53} } func (x *HTTPHeader) GetValues() []*ConfigurationVariable { @@ -3961,7 +3915,7 @@ type MTLSConfiguration struct { func (x *MTLSConfiguration) Reset() { *x = MTLSConfiguration{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[55] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[54] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3973,7 +3927,7 @@ func (x *MTLSConfiguration) String() string { func (*MTLSConfiguration) ProtoMessage() {} func (x *MTLSConfiguration) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[55] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[54] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3986,7 +3940,7 @@ func (x *MTLSConfiguration) ProtoReflect() protoreflect.Message { // Deprecated: Use MTLSConfiguration.ProtoReflect.Descriptor instead. func (*MTLSConfiguration) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{55} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{54} } func (x *MTLSConfiguration) GetKey() *ConfigurationVariable { @@ -4024,7 +3978,7 @@ type GraphQLSubscriptionConfiguration struct { func (x *GraphQLSubscriptionConfiguration) Reset() { *x = GraphQLSubscriptionConfiguration{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[56] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[55] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4036,7 +3990,7 @@ func (x *GraphQLSubscriptionConfiguration) String() string { func (*GraphQLSubscriptionConfiguration) ProtoMessage() {} func (x *GraphQLSubscriptionConfiguration) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[56] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[55] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4049,7 +4003,7 @@ func (x *GraphQLSubscriptionConfiguration) ProtoReflect() protoreflect.Message { // Deprecated: Use GraphQLSubscriptionConfiguration.ProtoReflect.Descriptor instead. func (*GraphQLSubscriptionConfiguration) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{56} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{55} } func (x *GraphQLSubscriptionConfiguration) GetEnabled() bool { @@ -4097,7 +4051,7 @@ type GraphQLFederationConfiguration struct { func (x *GraphQLFederationConfiguration) Reset() { *x = GraphQLFederationConfiguration{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[57] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[56] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4109,7 +4063,7 @@ func (x *GraphQLFederationConfiguration) String() string { func (*GraphQLFederationConfiguration) ProtoMessage() {} func (x *GraphQLFederationConfiguration) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[57] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[56] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4122,7 +4076,7 @@ func (x *GraphQLFederationConfiguration) ProtoReflect() protoreflect.Message { // Deprecated: Use GraphQLFederationConfiguration.ProtoReflect.Descriptor instead. func (*GraphQLFederationConfiguration) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{57} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{56} } func (x *GraphQLFederationConfiguration) GetEnabled() bool { @@ -4149,7 +4103,7 @@ type InternedString struct { func (x *InternedString) Reset() { *x = InternedString{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[58] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[57] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4161,7 +4115,7 @@ func (x *InternedString) String() string { func (*InternedString) ProtoMessage() {} func (x *InternedString) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[58] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[57] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4174,7 +4128,7 @@ func (x *InternedString) ProtoReflect() protoreflect.Message { // Deprecated: Use InternedString.ProtoReflect.Descriptor instead. func (*InternedString) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{58} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{57} } func (x *InternedString) GetKey() string { @@ -4194,7 +4148,7 @@ type SingleTypeField struct { func (x *SingleTypeField) Reset() { *x = SingleTypeField{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[59] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[58] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4206,7 +4160,7 @@ func (x *SingleTypeField) String() string { func (*SingleTypeField) ProtoMessage() {} func (x *SingleTypeField) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[59] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[58] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4219,7 +4173,7 @@ func (x *SingleTypeField) ProtoReflect() protoreflect.Message { // Deprecated: Use SingleTypeField.ProtoReflect.Descriptor instead. func (*SingleTypeField) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{59} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{58} } func (x *SingleTypeField) GetTypeName() string { @@ -4246,7 +4200,7 @@ type SubscriptionFieldCondition struct { func (x *SubscriptionFieldCondition) Reset() { *x = SubscriptionFieldCondition{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[60] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[59] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4258,7 +4212,7 @@ func (x *SubscriptionFieldCondition) String() string { func (*SubscriptionFieldCondition) ProtoMessage() {} func (x *SubscriptionFieldCondition) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[60] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[59] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4271,7 +4225,7 @@ func (x *SubscriptionFieldCondition) ProtoReflect() protoreflect.Message { // Deprecated: Use SubscriptionFieldCondition.ProtoReflect.Descriptor instead. func (*SubscriptionFieldCondition) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{60} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{59} } func (x *SubscriptionFieldCondition) GetFieldPath() []string { @@ -4300,7 +4254,7 @@ type SubscriptionFilterCondition struct { func (x *SubscriptionFilterCondition) Reset() { *x = SubscriptionFilterCondition{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[61] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[60] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4312,7 +4266,7 @@ func (x *SubscriptionFilterCondition) String() string { func (*SubscriptionFilterCondition) ProtoMessage() {} func (x *SubscriptionFilterCondition) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[61] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[60] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4325,7 +4279,7 @@ func (x *SubscriptionFilterCondition) ProtoReflect() protoreflect.Message { // Deprecated: Use SubscriptionFilterCondition.ProtoReflect.Descriptor instead. func (*SubscriptionFilterCondition) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{61} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{60} } func (x *SubscriptionFilterCondition) GetAnd() []*SubscriptionFilterCondition { @@ -4365,7 +4319,7 @@ type CacheWarmerOperations struct { func (x *CacheWarmerOperations) Reset() { *x = CacheWarmerOperations{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[62] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[61] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4377,7 +4331,7 @@ func (x *CacheWarmerOperations) String() string { func (*CacheWarmerOperations) ProtoMessage() {} func (x *CacheWarmerOperations) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[62] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[61] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4390,7 +4344,7 @@ func (x *CacheWarmerOperations) ProtoReflect() protoreflect.Message { // Deprecated: Use CacheWarmerOperations.ProtoReflect.Descriptor instead. func (*CacheWarmerOperations) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{62} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{61} } func (x *CacheWarmerOperations) GetOperations() []*Operation { @@ -4410,7 +4364,7 @@ type Operation struct { func (x *Operation) Reset() { *x = Operation{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[63] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[62] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4422,7 +4376,7 @@ func (x *Operation) String() string { func (*Operation) ProtoMessage() {} func (x *Operation) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[63] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[62] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4435,7 +4389,7 @@ func (x *Operation) ProtoReflect() protoreflect.Message { // Deprecated: Use Operation.ProtoReflect.Descriptor instead. func (*Operation) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{63} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{62} } func (x *Operation) GetRequest() *OperationRequest { @@ -4463,7 +4417,7 @@ type OperationRequest struct { func (x *OperationRequest) Reset() { *x = OperationRequest{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[64] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[63] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4475,7 +4429,7 @@ func (x *OperationRequest) String() string { func (*OperationRequest) ProtoMessage() {} func (x *OperationRequest) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[64] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[63] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4488,7 +4442,7 @@ func (x *OperationRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use OperationRequest.ProtoReflect.Descriptor instead. func (*OperationRequest) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{64} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{63} } func (x *OperationRequest) GetOperationName() string { @@ -4521,7 +4475,7 @@ type Extension struct { func (x *Extension) Reset() { *x = Extension{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[65] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[64] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4533,7 +4487,7 @@ func (x *Extension) String() string { func (*Extension) ProtoMessage() {} func (x *Extension) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[65] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[64] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4546,7 +4500,7 @@ func (x *Extension) ProtoReflect() protoreflect.Message { // Deprecated: Use Extension.ProtoReflect.Descriptor instead. func (*Extension) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{65} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{64} } func (x *Extension) GetPersistedQuery() *PersistedQuery { @@ -4566,7 +4520,7 @@ type PersistedQuery struct { func (x *PersistedQuery) Reset() { *x = PersistedQuery{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[66] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[65] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4578,7 +4532,7 @@ func (x *PersistedQuery) String() string { func (*PersistedQuery) ProtoMessage() {} func (x *PersistedQuery) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[66] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[65] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4591,7 +4545,7 @@ func (x *PersistedQuery) ProtoReflect() protoreflect.Message { // Deprecated: Use PersistedQuery.ProtoReflect.Descriptor instead. func (*PersistedQuery) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{66} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{65} } func (x *PersistedQuery) GetSha256Hash() string { @@ -4618,7 +4572,7 @@ type ClientInfo struct { func (x *ClientInfo) Reset() { *x = ClientInfo{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[67] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[66] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4630,7 +4584,7 @@ func (x *ClientInfo) String() string { func (*ClientInfo) ProtoMessage() {} func (x *ClientInfo) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[67] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[66] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4643,7 +4597,7 @@ func (x *ClientInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use ClientInfo.ProtoReflect.Descriptor instead. func (*ClientInfo) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{67} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{66} } func (x *ClientInfo) GetName() string { @@ -4685,12 +4639,7 @@ const file_wg_cosmo_node_v1_node_proto_rawDesc = "" + "\tsubgraphs\x18\x03 \x03(\v2\x1a.wg.cosmo.node.v1.SubgraphR\tsubgraphs\x12j\n" + "\x14feature_flag_configs\x18\x04 \x01(\v23.wg.cosmo.node.v1.FeatureFlagRouterExecutionConfigsH\x00R\x12featureFlagConfigs\x88\x01\x01\x123\n" + "\x15compatibility_version\x18\x05 \x01(\tR\x14compatibilityVersionB\x17\n" + - "\x15_feature_flag_configs\"\xa5\x01\n" + - "\fActiveGraphs\x12T\n" + - "\fgraphConfigs\x18\x01 \x03(\v20.wg.cosmo.node.v1.ActiveGraphs.GraphConfigsEntryR\fgraphConfigs\x1a?\n" + - "\x11GraphConfigsEntry\x12\x10\n" + - "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + - "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\"j\n" + + "\x15_feature_flag_configs\"j\n" + "\bResponse\x123\n" + "\x04code\x18\x01 \x01(\x0e2\x1f.wg.cosmo.common.EnumStatusCodeR\x04code\x12\x1d\n" + "\adetails\x18\x02 \x01(\tH\x00R\adetails\x88\x01\x01B\n" + @@ -5081,7 +5030,7 @@ func file_wg_cosmo_node_v1_node_proto_rawDescGZIP() []byte { } var file_wg_cosmo_node_v1_node_proto_enumTypes = make([]protoimpl.EnumInfo, 8) -var file_wg_cosmo_node_v1_node_proto_msgTypes = make([]protoimpl.MessageInfo, 76) +var file_wg_cosmo_node_v1_node_proto_msgTypes = make([]protoimpl.MessageInfo, 74) var file_wg_cosmo_node_v1_node_proto_goTypes = []any{ (ArgumentRenderConfiguration)(0), // 0: wg.cosmo.node.v1.ArgumentRenderConfiguration (ArgumentSource)(0), // 1: wg.cosmo.node.v1.ArgumentSource @@ -5095,191 +5044,188 @@ var file_wg_cosmo_node_v1_node_proto_goTypes = []any{ (*FeatureFlagRouterExecutionConfigs)(nil), // 9: wg.cosmo.node.v1.FeatureFlagRouterExecutionConfigs (*FeatureFlagRouterExecutionConfig)(nil), // 10: wg.cosmo.node.v1.FeatureFlagRouterExecutionConfig (*RouterConfig)(nil), // 11: wg.cosmo.node.v1.RouterConfig - (*ActiveGraphs)(nil), // 12: wg.cosmo.node.v1.ActiveGraphs - (*Response)(nil), // 13: wg.cosmo.node.v1.Response - (*ResponseStatus)(nil), // 14: wg.cosmo.node.v1.ResponseStatus - (*RegistrationInfo)(nil), // 15: wg.cosmo.node.v1.RegistrationInfo - (*AccountLimits)(nil), // 16: wg.cosmo.node.v1.AccountLimits - (*SelfRegisterRequest)(nil), // 17: wg.cosmo.node.v1.SelfRegisterRequest - (*SelfRegisterResponse)(nil), // 18: wg.cosmo.node.v1.SelfRegisterResponse - (*EngineConfiguration)(nil), // 19: wg.cosmo.node.v1.EngineConfiguration - (*DataSourceConfiguration)(nil), // 20: wg.cosmo.node.v1.DataSourceConfiguration - (*CostConfiguration)(nil), // 21: wg.cosmo.node.v1.CostConfiguration - (*FieldWeightConfiguration)(nil), // 22: wg.cosmo.node.v1.FieldWeightConfiguration - (*FieldListSizeConfiguration)(nil), // 23: wg.cosmo.node.v1.FieldListSizeConfiguration - (*ArgumentConfiguration)(nil), // 24: wg.cosmo.node.v1.ArgumentConfiguration - (*Scopes)(nil), // 25: wg.cosmo.node.v1.Scopes - (*AuthorizationConfiguration)(nil), // 26: wg.cosmo.node.v1.AuthorizationConfiguration - (*FieldConfiguration)(nil), // 27: wg.cosmo.node.v1.FieldConfiguration - (*TypeConfiguration)(nil), // 28: wg.cosmo.node.v1.TypeConfiguration - (*TypeField)(nil), // 29: wg.cosmo.node.v1.TypeField - (*FieldCoordinates)(nil), // 30: wg.cosmo.node.v1.FieldCoordinates - (*FieldSetCondition)(nil), // 31: wg.cosmo.node.v1.FieldSetCondition - (*RequiredField)(nil), // 32: wg.cosmo.node.v1.RequiredField - (*EntityInterfaceConfiguration)(nil), // 33: wg.cosmo.node.v1.EntityInterfaceConfiguration - (*FetchConfiguration)(nil), // 34: wg.cosmo.node.v1.FetchConfiguration - (*StatusCodeTypeMapping)(nil), // 35: wg.cosmo.node.v1.StatusCodeTypeMapping - (*DataSourceCustom_GraphQL)(nil), // 36: wg.cosmo.node.v1.DataSourceCustom_GraphQL - (*GRPCConfiguration)(nil), // 37: wg.cosmo.node.v1.GRPCConfiguration - (*ImageReference)(nil), // 38: wg.cosmo.node.v1.ImageReference - (*PluginConfiguration)(nil), // 39: wg.cosmo.node.v1.PluginConfiguration - (*SSLConfiguration)(nil), // 40: wg.cosmo.node.v1.SSLConfiguration - (*GRPCMapping)(nil), // 41: wg.cosmo.node.v1.GRPCMapping - (*LookupMapping)(nil), // 42: wg.cosmo.node.v1.LookupMapping - (*LookupFieldMapping)(nil), // 43: wg.cosmo.node.v1.LookupFieldMapping - (*OperationMapping)(nil), // 44: wg.cosmo.node.v1.OperationMapping - (*EntityMapping)(nil), // 45: wg.cosmo.node.v1.EntityMapping - (*RequiredFieldMapping)(nil), // 46: wg.cosmo.node.v1.RequiredFieldMapping - (*TypeFieldMapping)(nil), // 47: wg.cosmo.node.v1.TypeFieldMapping - (*FieldMapping)(nil), // 48: wg.cosmo.node.v1.FieldMapping - (*ArgumentMapping)(nil), // 49: wg.cosmo.node.v1.ArgumentMapping - (*EnumMapping)(nil), // 50: wg.cosmo.node.v1.EnumMapping - (*EnumValueMapping)(nil), // 51: wg.cosmo.node.v1.EnumValueMapping - (*NatsStreamConfiguration)(nil), // 52: wg.cosmo.node.v1.NatsStreamConfiguration - (*NatsEventConfiguration)(nil), // 53: wg.cosmo.node.v1.NatsEventConfiguration - (*KafkaEventConfiguration)(nil), // 54: wg.cosmo.node.v1.KafkaEventConfiguration - (*RedisEventConfiguration)(nil), // 55: wg.cosmo.node.v1.RedisEventConfiguration - (*EngineEventConfiguration)(nil), // 56: wg.cosmo.node.v1.EngineEventConfiguration - (*DataSourceCustomEvents)(nil), // 57: wg.cosmo.node.v1.DataSourceCustomEvents - (*DataSourceCustom_Static)(nil), // 58: wg.cosmo.node.v1.DataSourceCustom_Static - (*ConfigurationVariable)(nil), // 59: wg.cosmo.node.v1.ConfigurationVariable - (*DirectiveConfiguration)(nil), // 60: wg.cosmo.node.v1.DirectiveConfiguration - (*URLQueryConfiguration)(nil), // 61: wg.cosmo.node.v1.URLQueryConfiguration - (*HTTPHeader)(nil), // 62: wg.cosmo.node.v1.HTTPHeader - (*MTLSConfiguration)(nil), // 63: wg.cosmo.node.v1.MTLSConfiguration - (*GraphQLSubscriptionConfiguration)(nil), // 64: wg.cosmo.node.v1.GraphQLSubscriptionConfiguration - (*GraphQLFederationConfiguration)(nil), // 65: wg.cosmo.node.v1.GraphQLFederationConfiguration - (*InternedString)(nil), // 66: wg.cosmo.node.v1.InternedString - (*SingleTypeField)(nil), // 67: wg.cosmo.node.v1.SingleTypeField - (*SubscriptionFieldCondition)(nil), // 68: wg.cosmo.node.v1.SubscriptionFieldCondition - (*SubscriptionFilterCondition)(nil), // 69: wg.cosmo.node.v1.SubscriptionFilterCondition - (*CacheWarmerOperations)(nil), // 70: wg.cosmo.node.v1.CacheWarmerOperations - (*Operation)(nil), // 71: wg.cosmo.node.v1.Operation - (*OperationRequest)(nil), // 72: wg.cosmo.node.v1.OperationRequest - (*Extension)(nil), // 73: wg.cosmo.node.v1.Extension - (*PersistedQuery)(nil), // 74: wg.cosmo.node.v1.PersistedQuery - (*ClientInfo)(nil), // 75: wg.cosmo.node.v1.ClientInfo - nil, // 76: wg.cosmo.node.v1.FeatureFlagRouterExecutionConfigs.ConfigByFeatureFlagNameEntry - nil, // 77: wg.cosmo.node.v1.ActiveGraphs.GraphConfigsEntry - nil, // 78: wg.cosmo.node.v1.EngineConfiguration.StringStorageEntry - nil, // 79: wg.cosmo.node.v1.CostConfiguration.TypeWeightsEntry - nil, // 80: wg.cosmo.node.v1.CostConfiguration.DirectiveArgumentWeightsEntry - nil, // 81: wg.cosmo.node.v1.FieldWeightConfiguration.ArgumentWeightsEntry - nil, // 82: wg.cosmo.node.v1.FieldWeightConfiguration.DirectiveArgumentWeightsEntry - nil, // 83: wg.cosmo.node.v1.FetchConfiguration.HeaderEntry - (common.EnumStatusCode)(0), // 84: wg.cosmo.common.EnumStatusCode - (common.GraphQLSubscriptionProtocol)(0), // 85: wg.cosmo.common.GraphQLSubscriptionProtocol - (common.GraphQLWebsocketSubprotocol)(0), // 86: wg.cosmo.common.GraphQLWebsocketSubprotocol + (*Response)(nil), // 12: wg.cosmo.node.v1.Response + (*ResponseStatus)(nil), // 13: wg.cosmo.node.v1.ResponseStatus + (*RegistrationInfo)(nil), // 14: wg.cosmo.node.v1.RegistrationInfo + (*AccountLimits)(nil), // 15: wg.cosmo.node.v1.AccountLimits + (*SelfRegisterRequest)(nil), // 16: wg.cosmo.node.v1.SelfRegisterRequest + (*SelfRegisterResponse)(nil), // 17: wg.cosmo.node.v1.SelfRegisterResponse + (*EngineConfiguration)(nil), // 18: wg.cosmo.node.v1.EngineConfiguration + (*DataSourceConfiguration)(nil), // 19: wg.cosmo.node.v1.DataSourceConfiguration + (*CostConfiguration)(nil), // 20: wg.cosmo.node.v1.CostConfiguration + (*FieldWeightConfiguration)(nil), // 21: wg.cosmo.node.v1.FieldWeightConfiguration + (*FieldListSizeConfiguration)(nil), // 22: wg.cosmo.node.v1.FieldListSizeConfiguration + (*ArgumentConfiguration)(nil), // 23: wg.cosmo.node.v1.ArgumentConfiguration + (*Scopes)(nil), // 24: wg.cosmo.node.v1.Scopes + (*AuthorizationConfiguration)(nil), // 25: wg.cosmo.node.v1.AuthorizationConfiguration + (*FieldConfiguration)(nil), // 26: wg.cosmo.node.v1.FieldConfiguration + (*TypeConfiguration)(nil), // 27: wg.cosmo.node.v1.TypeConfiguration + (*TypeField)(nil), // 28: wg.cosmo.node.v1.TypeField + (*FieldCoordinates)(nil), // 29: wg.cosmo.node.v1.FieldCoordinates + (*FieldSetCondition)(nil), // 30: wg.cosmo.node.v1.FieldSetCondition + (*RequiredField)(nil), // 31: wg.cosmo.node.v1.RequiredField + (*EntityInterfaceConfiguration)(nil), // 32: wg.cosmo.node.v1.EntityInterfaceConfiguration + (*FetchConfiguration)(nil), // 33: wg.cosmo.node.v1.FetchConfiguration + (*StatusCodeTypeMapping)(nil), // 34: wg.cosmo.node.v1.StatusCodeTypeMapping + (*DataSourceCustom_GraphQL)(nil), // 35: wg.cosmo.node.v1.DataSourceCustom_GraphQL + (*GRPCConfiguration)(nil), // 36: wg.cosmo.node.v1.GRPCConfiguration + (*ImageReference)(nil), // 37: wg.cosmo.node.v1.ImageReference + (*PluginConfiguration)(nil), // 38: wg.cosmo.node.v1.PluginConfiguration + (*SSLConfiguration)(nil), // 39: wg.cosmo.node.v1.SSLConfiguration + (*GRPCMapping)(nil), // 40: wg.cosmo.node.v1.GRPCMapping + (*LookupMapping)(nil), // 41: wg.cosmo.node.v1.LookupMapping + (*LookupFieldMapping)(nil), // 42: wg.cosmo.node.v1.LookupFieldMapping + (*OperationMapping)(nil), // 43: wg.cosmo.node.v1.OperationMapping + (*EntityMapping)(nil), // 44: wg.cosmo.node.v1.EntityMapping + (*RequiredFieldMapping)(nil), // 45: wg.cosmo.node.v1.RequiredFieldMapping + (*TypeFieldMapping)(nil), // 46: wg.cosmo.node.v1.TypeFieldMapping + (*FieldMapping)(nil), // 47: wg.cosmo.node.v1.FieldMapping + (*ArgumentMapping)(nil), // 48: wg.cosmo.node.v1.ArgumentMapping + (*EnumMapping)(nil), // 49: wg.cosmo.node.v1.EnumMapping + (*EnumValueMapping)(nil), // 50: wg.cosmo.node.v1.EnumValueMapping + (*NatsStreamConfiguration)(nil), // 51: wg.cosmo.node.v1.NatsStreamConfiguration + (*NatsEventConfiguration)(nil), // 52: wg.cosmo.node.v1.NatsEventConfiguration + (*KafkaEventConfiguration)(nil), // 53: wg.cosmo.node.v1.KafkaEventConfiguration + (*RedisEventConfiguration)(nil), // 54: wg.cosmo.node.v1.RedisEventConfiguration + (*EngineEventConfiguration)(nil), // 55: wg.cosmo.node.v1.EngineEventConfiguration + (*DataSourceCustomEvents)(nil), // 56: wg.cosmo.node.v1.DataSourceCustomEvents + (*DataSourceCustom_Static)(nil), // 57: wg.cosmo.node.v1.DataSourceCustom_Static + (*ConfigurationVariable)(nil), // 58: wg.cosmo.node.v1.ConfigurationVariable + (*DirectiveConfiguration)(nil), // 59: wg.cosmo.node.v1.DirectiveConfiguration + (*URLQueryConfiguration)(nil), // 60: wg.cosmo.node.v1.URLQueryConfiguration + (*HTTPHeader)(nil), // 61: wg.cosmo.node.v1.HTTPHeader + (*MTLSConfiguration)(nil), // 62: wg.cosmo.node.v1.MTLSConfiguration + (*GraphQLSubscriptionConfiguration)(nil), // 63: wg.cosmo.node.v1.GraphQLSubscriptionConfiguration + (*GraphQLFederationConfiguration)(nil), // 64: wg.cosmo.node.v1.GraphQLFederationConfiguration + (*InternedString)(nil), // 65: wg.cosmo.node.v1.InternedString + (*SingleTypeField)(nil), // 66: wg.cosmo.node.v1.SingleTypeField + (*SubscriptionFieldCondition)(nil), // 67: wg.cosmo.node.v1.SubscriptionFieldCondition + (*SubscriptionFilterCondition)(nil), // 68: wg.cosmo.node.v1.SubscriptionFilterCondition + (*CacheWarmerOperations)(nil), // 69: wg.cosmo.node.v1.CacheWarmerOperations + (*Operation)(nil), // 70: wg.cosmo.node.v1.Operation + (*OperationRequest)(nil), // 71: wg.cosmo.node.v1.OperationRequest + (*Extension)(nil), // 72: wg.cosmo.node.v1.Extension + (*PersistedQuery)(nil), // 73: wg.cosmo.node.v1.PersistedQuery + (*ClientInfo)(nil), // 74: wg.cosmo.node.v1.ClientInfo + nil, // 75: wg.cosmo.node.v1.FeatureFlagRouterExecutionConfigs.ConfigByFeatureFlagNameEntry + nil, // 76: wg.cosmo.node.v1.EngineConfiguration.StringStorageEntry + nil, // 77: wg.cosmo.node.v1.CostConfiguration.TypeWeightsEntry + nil, // 78: wg.cosmo.node.v1.CostConfiguration.DirectiveArgumentWeightsEntry + nil, // 79: wg.cosmo.node.v1.FieldWeightConfiguration.ArgumentWeightsEntry + nil, // 80: wg.cosmo.node.v1.FieldWeightConfiguration.DirectiveArgumentWeightsEntry + nil, // 81: wg.cosmo.node.v1.FetchConfiguration.HeaderEntry + (common.EnumStatusCode)(0), // 82: wg.cosmo.common.EnumStatusCode + (common.GraphQLSubscriptionProtocol)(0), // 83: wg.cosmo.common.GraphQLSubscriptionProtocol + (common.GraphQLWebsocketSubprotocol)(0), // 84: wg.cosmo.common.GraphQLWebsocketSubprotocol } var file_wg_cosmo_node_v1_node_proto_depIdxs = []int32{ - 76, // 0: wg.cosmo.node.v1.FeatureFlagRouterExecutionConfigs.config_by_feature_flag_name:type_name -> wg.cosmo.node.v1.FeatureFlagRouterExecutionConfigs.ConfigByFeatureFlagNameEntry - 19, // 1: wg.cosmo.node.v1.FeatureFlagRouterExecutionConfig.engine_config:type_name -> wg.cosmo.node.v1.EngineConfiguration + 75, // 0: wg.cosmo.node.v1.FeatureFlagRouterExecutionConfigs.config_by_feature_flag_name:type_name -> wg.cosmo.node.v1.FeatureFlagRouterExecutionConfigs.ConfigByFeatureFlagNameEntry + 18, // 1: wg.cosmo.node.v1.FeatureFlagRouterExecutionConfig.engine_config:type_name -> wg.cosmo.node.v1.EngineConfiguration 8, // 2: wg.cosmo.node.v1.FeatureFlagRouterExecutionConfig.subgraphs:type_name -> wg.cosmo.node.v1.Subgraph - 19, // 3: wg.cosmo.node.v1.RouterConfig.engine_config:type_name -> wg.cosmo.node.v1.EngineConfiguration + 18, // 3: wg.cosmo.node.v1.RouterConfig.engine_config:type_name -> wg.cosmo.node.v1.EngineConfiguration 8, // 4: wg.cosmo.node.v1.RouterConfig.subgraphs:type_name -> wg.cosmo.node.v1.Subgraph 9, // 5: wg.cosmo.node.v1.RouterConfig.feature_flag_configs:type_name -> wg.cosmo.node.v1.FeatureFlagRouterExecutionConfigs - 77, // 6: wg.cosmo.node.v1.ActiveGraphs.graphConfigs:type_name -> wg.cosmo.node.v1.ActiveGraphs.GraphConfigsEntry - 84, // 7: wg.cosmo.node.v1.Response.code:type_name -> wg.cosmo.common.EnumStatusCode - 16, // 8: wg.cosmo.node.v1.RegistrationInfo.account_limits:type_name -> wg.cosmo.node.v1.AccountLimits - 13, // 9: wg.cosmo.node.v1.SelfRegisterResponse.response:type_name -> wg.cosmo.node.v1.Response - 15, // 10: wg.cosmo.node.v1.SelfRegisterResponse.registrationInfo:type_name -> wg.cosmo.node.v1.RegistrationInfo - 20, // 11: wg.cosmo.node.v1.EngineConfiguration.datasource_configurations:type_name -> wg.cosmo.node.v1.DataSourceConfiguration - 27, // 12: wg.cosmo.node.v1.EngineConfiguration.field_configurations:type_name -> wg.cosmo.node.v1.FieldConfiguration - 28, // 13: wg.cosmo.node.v1.EngineConfiguration.type_configurations:type_name -> wg.cosmo.node.v1.TypeConfiguration - 78, // 14: wg.cosmo.node.v1.EngineConfiguration.string_storage:type_name -> wg.cosmo.node.v1.EngineConfiguration.StringStorageEntry - 2, // 15: wg.cosmo.node.v1.DataSourceConfiguration.kind:type_name -> wg.cosmo.node.v1.DataSourceKind - 29, // 16: wg.cosmo.node.v1.DataSourceConfiguration.root_nodes:type_name -> wg.cosmo.node.v1.TypeField - 29, // 17: wg.cosmo.node.v1.DataSourceConfiguration.child_nodes:type_name -> wg.cosmo.node.v1.TypeField - 36, // 18: wg.cosmo.node.v1.DataSourceConfiguration.custom_graphql:type_name -> wg.cosmo.node.v1.DataSourceCustom_GraphQL - 58, // 19: wg.cosmo.node.v1.DataSourceConfiguration.custom_static:type_name -> wg.cosmo.node.v1.DataSourceCustom_Static - 60, // 20: wg.cosmo.node.v1.DataSourceConfiguration.directives:type_name -> wg.cosmo.node.v1.DirectiveConfiguration - 32, // 21: wg.cosmo.node.v1.DataSourceConfiguration.keys:type_name -> wg.cosmo.node.v1.RequiredField - 32, // 22: wg.cosmo.node.v1.DataSourceConfiguration.provides:type_name -> wg.cosmo.node.v1.RequiredField - 32, // 23: wg.cosmo.node.v1.DataSourceConfiguration.requires:type_name -> wg.cosmo.node.v1.RequiredField - 57, // 24: wg.cosmo.node.v1.DataSourceConfiguration.custom_events:type_name -> wg.cosmo.node.v1.DataSourceCustomEvents - 33, // 25: wg.cosmo.node.v1.DataSourceConfiguration.entity_interfaces:type_name -> wg.cosmo.node.v1.EntityInterfaceConfiguration - 33, // 26: wg.cosmo.node.v1.DataSourceConfiguration.interface_objects:type_name -> wg.cosmo.node.v1.EntityInterfaceConfiguration - 21, // 27: wg.cosmo.node.v1.DataSourceConfiguration.cost_configuration:type_name -> wg.cosmo.node.v1.CostConfiguration - 22, // 28: wg.cosmo.node.v1.CostConfiguration.field_weights:type_name -> wg.cosmo.node.v1.FieldWeightConfiguration - 23, // 29: wg.cosmo.node.v1.CostConfiguration.list_sizes:type_name -> wg.cosmo.node.v1.FieldListSizeConfiguration - 79, // 30: wg.cosmo.node.v1.CostConfiguration.type_weights:type_name -> wg.cosmo.node.v1.CostConfiguration.TypeWeightsEntry - 80, // 31: wg.cosmo.node.v1.CostConfiguration.directive_argument_weights:type_name -> wg.cosmo.node.v1.CostConfiguration.DirectiveArgumentWeightsEntry - 81, // 32: wg.cosmo.node.v1.FieldWeightConfiguration.argument_weights:type_name -> wg.cosmo.node.v1.FieldWeightConfiguration.ArgumentWeightsEntry - 82, // 33: wg.cosmo.node.v1.FieldWeightConfiguration.directive_argument_weights:type_name -> wg.cosmo.node.v1.FieldWeightConfiguration.DirectiveArgumentWeightsEntry - 1, // 34: wg.cosmo.node.v1.ArgumentConfiguration.source_type:type_name -> wg.cosmo.node.v1.ArgumentSource - 25, // 35: wg.cosmo.node.v1.AuthorizationConfiguration.required_or_scopes:type_name -> wg.cosmo.node.v1.Scopes - 25, // 36: wg.cosmo.node.v1.AuthorizationConfiguration.required_or_scopes_by_or:type_name -> wg.cosmo.node.v1.Scopes - 24, // 37: wg.cosmo.node.v1.FieldConfiguration.arguments_configuration:type_name -> wg.cosmo.node.v1.ArgumentConfiguration - 26, // 38: wg.cosmo.node.v1.FieldConfiguration.authorization_configuration:type_name -> wg.cosmo.node.v1.AuthorizationConfiguration - 69, // 39: wg.cosmo.node.v1.FieldConfiguration.subscription_filter_condition:type_name -> wg.cosmo.node.v1.SubscriptionFilterCondition - 30, // 40: wg.cosmo.node.v1.FieldSetCondition.field_coordinates_path:type_name -> wg.cosmo.node.v1.FieldCoordinates - 31, // 41: wg.cosmo.node.v1.RequiredField.conditions:type_name -> wg.cosmo.node.v1.FieldSetCondition - 59, // 42: wg.cosmo.node.v1.FetchConfiguration.url:type_name -> wg.cosmo.node.v1.ConfigurationVariable - 7, // 43: wg.cosmo.node.v1.FetchConfiguration.method:type_name -> wg.cosmo.node.v1.HTTPMethod - 83, // 44: wg.cosmo.node.v1.FetchConfiguration.header:type_name -> wg.cosmo.node.v1.FetchConfiguration.HeaderEntry - 59, // 45: wg.cosmo.node.v1.FetchConfiguration.body:type_name -> wg.cosmo.node.v1.ConfigurationVariable - 61, // 46: wg.cosmo.node.v1.FetchConfiguration.query:type_name -> wg.cosmo.node.v1.URLQueryConfiguration - 63, // 47: wg.cosmo.node.v1.FetchConfiguration.mtls:type_name -> wg.cosmo.node.v1.MTLSConfiguration - 59, // 48: wg.cosmo.node.v1.FetchConfiguration.base_url:type_name -> wg.cosmo.node.v1.ConfigurationVariable - 59, // 49: wg.cosmo.node.v1.FetchConfiguration.path:type_name -> wg.cosmo.node.v1.ConfigurationVariable - 59, // 50: wg.cosmo.node.v1.FetchConfiguration.http_proxy_url:type_name -> wg.cosmo.node.v1.ConfigurationVariable - 34, // 51: wg.cosmo.node.v1.DataSourceCustom_GraphQL.fetch:type_name -> wg.cosmo.node.v1.FetchConfiguration - 64, // 52: wg.cosmo.node.v1.DataSourceCustom_GraphQL.subscription:type_name -> wg.cosmo.node.v1.GraphQLSubscriptionConfiguration - 65, // 53: wg.cosmo.node.v1.DataSourceCustom_GraphQL.federation:type_name -> wg.cosmo.node.v1.GraphQLFederationConfiguration - 66, // 54: wg.cosmo.node.v1.DataSourceCustom_GraphQL.upstream_schema:type_name -> wg.cosmo.node.v1.InternedString - 67, // 55: wg.cosmo.node.v1.DataSourceCustom_GraphQL.custom_scalar_type_fields:type_name -> wg.cosmo.node.v1.SingleTypeField - 37, // 56: wg.cosmo.node.v1.DataSourceCustom_GraphQL.grpc:type_name -> wg.cosmo.node.v1.GRPCConfiguration - 41, // 57: wg.cosmo.node.v1.GRPCConfiguration.mapping:type_name -> wg.cosmo.node.v1.GRPCMapping - 39, // 58: wg.cosmo.node.v1.GRPCConfiguration.plugin:type_name -> wg.cosmo.node.v1.PluginConfiguration - 38, // 59: wg.cosmo.node.v1.PluginConfiguration.image_reference:type_name -> wg.cosmo.node.v1.ImageReference - 44, // 60: wg.cosmo.node.v1.GRPCMapping.operation_mappings:type_name -> wg.cosmo.node.v1.OperationMapping - 45, // 61: wg.cosmo.node.v1.GRPCMapping.entity_mappings:type_name -> wg.cosmo.node.v1.EntityMapping - 47, // 62: wg.cosmo.node.v1.GRPCMapping.type_field_mappings:type_name -> wg.cosmo.node.v1.TypeFieldMapping - 50, // 63: wg.cosmo.node.v1.GRPCMapping.enum_mappings:type_name -> wg.cosmo.node.v1.EnumMapping - 42, // 64: wg.cosmo.node.v1.GRPCMapping.resolve_mappings:type_name -> wg.cosmo.node.v1.LookupMapping - 3, // 65: wg.cosmo.node.v1.LookupMapping.type:type_name -> wg.cosmo.node.v1.LookupType - 43, // 66: wg.cosmo.node.v1.LookupMapping.lookup_mapping:type_name -> wg.cosmo.node.v1.LookupFieldMapping - 48, // 67: wg.cosmo.node.v1.LookupFieldMapping.field_mapping:type_name -> wg.cosmo.node.v1.FieldMapping - 4, // 68: wg.cosmo.node.v1.OperationMapping.type:type_name -> wg.cosmo.node.v1.OperationType - 46, // 69: wg.cosmo.node.v1.EntityMapping.required_field_mappings:type_name -> wg.cosmo.node.v1.RequiredFieldMapping - 48, // 70: wg.cosmo.node.v1.RequiredFieldMapping.field_mapping:type_name -> wg.cosmo.node.v1.FieldMapping - 48, // 71: wg.cosmo.node.v1.TypeFieldMapping.field_mappings:type_name -> wg.cosmo.node.v1.FieldMapping - 49, // 72: wg.cosmo.node.v1.FieldMapping.argument_mappings:type_name -> wg.cosmo.node.v1.ArgumentMapping - 51, // 73: wg.cosmo.node.v1.EnumMapping.values:type_name -> wg.cosmo.node.v1.EnumValueMapping - 56, // 74: wg.cosmo.node.v1.NatsEventConfiguration.engine_event_configuration:type_name -> wg.cosmo.node.v1.EngineEventConfiguration - 52, // 75: wg.cosmo.node.v1.NatsEventConfiguration.stream_configuration:type_name -> wg.cosmo.node.v1.NatsStreamConfiguration - 56, // 76: wg.cosmo.node.v1.KafkaEventConfiguration.engine_event_configuration:type_name -> wg.cosmo.node.v1.EngineEventConfiguration - 56, // 77: wg.cosmo.node.v1.RedisEventConfiguration.engine_event_configuration:type_name -> wg.cosmo.node.v1.EngineEventConfiguration - 5, // 78: wg.cosmo.node.v1.EngineEventConfiguration.type:type_name -> wg.cosmo.node.v1.EventType - 53, // 79: wg.cosmo.node.v1.DataSourceCustomEvents.nats:type_name -> wg.cosmo.node.v1.NatsEventConfiguration - 54, // 80: wg.cosmo.node.v1.DataSourceCustomEvents.kafka:type_name -> wg.cosmo.node.v1.KafkaEventConfiguration - 55, // 81: wg.cosmo.node.v1.DataSourceCustomEvents.redis:type_name -> wg.cosmo.node.v1.RedisEventConfiguration - 59, // 82: wg.cosmo.node.v1.DataSourceCustom_Static.data:type_name -> wg.cosmo.node.v1.ConfigurationVariable - 6, // 83: wg.cosmo.node.v1.ConfigurationVariable.kind:type_name -> wg.cosmo.node.v1.ConfigurationVariableKind - 59, // 84: wg.cosmo.node.v1.HTTPHeader.values:type_name -> wg.cosmo.node.v1.ConfigurationVariable - 59, // 85: wg.cosmo.node.v1.MTLSConfiguration.key:type_name -> wg.cosmo.node.v1.ConfigurationVariable - 59, // 86: wg.cosmo.node.v1.MTLSConfiguration.cert:type_name -> wg.cosmo.node.v1.ConfigurationVariable - 59, // 87: wg.cosmo.node.v1.GraphQLSubscriptionConfiguration.url:type_name -> wg.cosmo.node.v1.ConfigurationVariable - 85, // 88: wg.cosmo.node.v1.GraphQLSubscriptionConfiguration.protocol:type_name -> wg.cosmo.common.GraphQLSubscriptionProtocol - 86, // 89: wg.cosmo.node.v1.GraphQLSubscriptionConfiguration.websocketSubprotocol:type_name -> wg.cosmo.common.GraphQLWebsocketSubprotocol - 69, // 90: wg.cosmo.node.v1.SubscriptionFilterCondition.and:type_name -> wg.cosmo.node.v1.SubscriptionFilterCondition - 68, // 91: wg.cosmo.node.v1.SubscriptionFilterCondition.in:type_name -> wg.cosmo.node.v1.SubscriptionFieldCondition - 69, // 92: wg.cosmo.node.v1.SubscriptionFilterCondition.not:type_name -> wg.cosmo.node.v1.SubscriptionFilterCondition - 69, // 93: wg.cosmo.node.v1.SubscriptionFilterCondition.or:type_name -> wg.cosmo.node.v1.SubscriptionFilterCondition - 71, // 94: wg.cosmo.node.v1.CacheWarmerOperations.operations:type_name -> wg.cosmo.node.v1.Operation - 72, // 95: wg.cosmo.node.v1.Operation.request:type_name -> wg.cosmo.node.v1.OperationRequest - 75, // 96: wg.cosmo.node.v1.Operation.client:type_name -> wg.cosmo.node.v1.ClientInfo - 73, // 97: wg.cosmo.node.v1.OperationRequest.extensions:type_name -> wg.cosmo.node.v1.Extension - 74, // 98: wg.cosmo.node.v1.Extension.persisted_query:type_name -> wg.cosmo.node.v1.PersistedQuery - 10, // 99: wg.cosmo.node.v1.FeatureFlagRouterExecutionConfigs.ConfigByFeatureFlagNameEntry.value:type_name -> wg.cosmo.node.v1.FeatureFlagRouterExecutionConfig - 62, // 100: wg.cosmo.node.v1.FetchConfiguration.HeaderEntry.value:type_name -> wg.cosmo.node.v1.HTTPHeader - 17, // 101: wg.cosmo.node.v1.NodeService.SelfRegister:input_type -> wg.cosmo.node.v1.SelfRegisterRequest - 18, // 102: wg.cosmo.node.v1.NodeService.SelfRegister:output_type -> wg.cosmo.node.v1.SelfRegisterResponse - 102, // [102:103] is the sub-list for method output_type - 101, // [101:102] is the sub-list for method input_type - 101, // [101:101] is the sub-list for extension type_name - 101, // [101:101] is the sub-list for extension extendee - 0, // [0:101] is the sub-list for field type_name + 82, // 6: wg.cosmo.node.v1.Response.code:type_name -> wg.cosmo.common.EnumStatusCode + 15, // 7: wg.cosmo.node.v1.RegistrationInfo.account_limits:type_name -> wg.cosmo.node.v1.AccountLimits + 12, // 8: wg.cosmo.node.v1.SelfRegisterResponse.response:type_name -> wg.cosmo.node.v1.Response + 14, // 9: wg.cosmo.node.v1.SelfRegisterResponse.registrationInfo:type_name -> wg.cosmo.node.v1.RegistrationInfo + 19, // 10: wg.cosmo.node.v1.EngineConfiguration.datasource_configurations:type_name -> wg.cosmo.node.v1.DataSourceConfiguration + 26, // 11: wg.cosmo.node.v1.EngineConfiguration.field_configurations:type_name -> wg.cosmo.node.v1.FieldConfiguration + 27, // 12: wg.cosmo.node.v1.EngineConfiguration.type_configurations:type_name -> wg.cosmo.node.v1.TypeConfiguration + 76, // 13: wg.cosmo.node.v1.EngineConfiguration.string_storage:type_name -> wg.cosmo.node.v1.EngineConfiguration.StringStorageEntry + 2, // 14: wg.cosmo.node.v1.DataSourceConfiguration.kind:type_name -> wg.cosmo.node.v1.DataSourceKind + 28, // 15: wg.cosmo.node.v1.DataSourceConfiguration.root_nodes:type_name -> wg.cosmo.node.v1.TypeField + 28, // 16: wg.cosmo.node.v1.DataSourceConfiguration.child_nodes:type_name -> wg.cosmo.node.v1.TypeField + 35, // 17: wg.cosmo.node.v1.DataSourceConfiguration.custom_graphql:type_name -> wg.cosmo.node.v1.DataSourceCustom_GraphQL + 57, // 18: wg.cosmo.node.v1.DataSourceConfiguration.custom_static:type_name -> wg.cosmo.node.v1.DataSourceCustom_Static + 59, // 19: wg.cosmo.node.v1.DataSourceConfiguration.directives:type_name -> wg.cosmo.node.v1.DirectiveConfiguration + 31, // 20: wg.cosmo.node.v1.DataSourceConfiguration.keys:type_name -> wg.cosmo.node.v1.RequiredField + 31, // 21: wg.cosmo.node.v1.DataSourceConfiguration.provides:type_name -> wg.cosmo.node.v1.RequiredField + 31, // 22: wg.cosmo.node.v1.DataSourceConfiguration.requires:type_name -> wg.cosmo.node.v1.RequiredField + 56, // 23: wg.cosmo.node.v1.DataSourceConfiguration.custom_events:type_name -> wg.cosmo.node.v1.DataSourceCustomEvents + 32, // 24: wg.cosmo.node.v1.DataSourceConfiguration.entity_interfaces:type_name -> wg.cosmo.node.v1.EntityInterfaceConfiguration + 32, // 25: wg.cosmo.node.v1.DataSourceConfiguration.interface_objects:type_name -> wg.cosmo.node.v1.EntityInterfaceConfiguration + 20, // 26: wg.cosmo.node.v1.DataSourceConfiguration.cost_configuration:type_name -> wg.cosmo.node.v1.CostConfiguration + 21, // 27: wg.cosmo.node.v1.CostConfiguration.field_weights:type_name -> wg.cosmo.node.v1.FieldWeightConfiguration + 22, // 28: wg.cosmo.node.v1.CostConfiguration.list_sizes:type_name -> wg.cosmo.node.v1.FieldListSizeConfiguration + 77, // 29: wg.cosmo.node.v1.CostConfiguration.type_weights:type_name -> wg.cosmo.node.v1.CostConfiguration.TypeWeightsEntry + 78, // 30: wg.cosmo.node.v1.CostConfiguration.directive_argument_weights:type_name -> wg.cosmo.node.v1.CostConfiguration.DirectiveArgumentWeightsEntry + 79, // 31: wg.cosmo.node.v1.FieldWeightConfiguration.argument_weights:type_name -> wg.cosmo.node.v1.FieldWeightConfiguration.ArgumentWeightsEntry + 80, // 32: wg.cosmo.node.v1.FieldWeightConfiguration.directive_argument_weights:type_name -> wg.cosmo.node.v1.FieldWeightConfiguration.DirectiveArgumentWeightsEntry + 1, // 33: wg.cosmo.node.v1.ArgumentConfiguration.source_type:type_name -> wg.cosmo.node.v1.ArgumentSource + 24, // 34: wg.cosmo.node.v1.AuthorizationConfiguration.required_or_scopes:type_name -> wg.cosmo.node.v1.Scopes + 24, // 35: wg.cosmo.node.v1.AuthorizationConfiguration.required_or_scopes_by_or:type_name -> wg.cosmo.node.v1.Scopes + 23, // 36: wg.cosmo.node.v1.FieldConfiguration.arguments_configuration:type_name -> wg.cosmo.node.v1.ArgumentConfiguration + 25, // 37: wg.cosmo.node.v1.FieldConfiguration.authorization_configuration:type_name -> wg.cosmo.node.v1.AuthorizationConfiguration + 68, // 38: wg.cosmo.node.v1.FieldConfiguration.subscription_filter_condition:type_name -> wg.cosmo.node.v1.SubscriptionFilterCondition + 29, // 39: wg.cosmo.node.v1.FieldSetCondition.field_coordinates_path:type_name -> wg.cosmo.node.v1.FieldCoordinates + 30, // 40: wg.cosmo.node.v1.RequiredField.conditions:type_name -> wg.cosmo.node.v1.FieldSetCondition + 58, // 41: wg.cosmo.node.v1.FetchConfiguration.url:type_name -> wg.cosmo.node.v1.ConfigurationVariable + 7, // 42: wg.cosmo.node.v1.FetchConfiguration.method:type_name -> wg.cosmo.node.v1.HTTPMethod + 81, // 43: wg.cosmo.node.v1.FetchConfiguration.header:type_name -> wg.cosmo.node.v1.FetchConfiguration.HeaderEntry + 58, // 44: wg.cosmo.node.v1.FetchConfiguration.body:type_name -> wg.cosmo.node.v1.ConfigurationVariable + 60, // 45: wg.cosmo.node.v1.FetchConfiguration.query:type_name -> wg.cosmo.node.v1.URLQueryConfiguration + 62, // 46: wg.cosmo.node.v1.FetchConfiguration.mtls:type_name -> wg.cosmo.node.v1.MTLSConfiguration + 58, // 47: wg.cosmo.node.v1.FetchConfiguration.base_url:type_name -> wg.cosmo.node.v1.ConfigurationVariable + 58, // 48: wg.cosmo.node.v1.FetchConfiguration.path:type_name -> wg.cosmo.node.v1.ConfigurationVariable + 58, // 49: wg.cosmo.node.v1.FetchConfiguration.http_proxy_url:type_name -> wg.cosmo.node.v1.ConfigurationVariable + 33, // 50: wg.cosmo.node.v1.DataSourceCustom_GraphQL.fetch:type_name -> wg.cosmo.node.v1.FetchConfiguration + 63, // 51: wg.cosmo.node.v1.DataSourceCustom_GraphQL.subscription:type_name -> wg.cosmo.node.v1.GraphQLSubscriptionConfiguration + 64, // 52: wg.cosmo.node.v1.DataSourceCustom_GraphQL.federation:type_name -> wg.cosmo.node.v1.GraphQLFederationConfiguration + 65, // 53: wg.cosmo.node.v1.DataSourceCustom_GraphQL.upstream_schema:type_name -> wg.cosmo.node.v1.InternedString + 66, // 54: wg.cosmo.node.v1.DataSourceCustom_GraphQL.custom_scalar_type_fields:type_name -> wg.cosmo.node.v1.SingleTypeField + 36, // 55: wg.cosmo.node.v1.DataSourceCustom_GraphQL.grpc:type_name -> wg.cosmo.node.v1.GRPCConfiguration + 40, // 56: wg.cosmo.node.v1.GRPCConfiguration.mapping:type_name -> wg.cosmo.node.v1.GRPCMapping + 38, // 57: wg.cosmo.node.v1.GRPCConfiguration.plugin:type_name -> wg.cosmo.node.v1.PluginConfiguration + 37, // 58: wg.cosmo.node.v1.PluginConfiguration.image_reference:type_name -> wg.cosmo.node.v1.ImageReference + 43, // 59: wg.cosmo.node.v1.GRPCMapping.operation_mappings:type_name -> wg.cosmo.node.v1.OperationMapping + 44, // 60: wg.cosmo.node.v1.GRPCMapping.entity_mappings:type_name -> wg.cosmo.node.v1.EntityMapping + 46, // 61: wg.cosmo.node.v1.GRPCMapping.type_field_mappings:type_name -> wg.cosmo.node.v1.TypeFieldMapping + 49, // 62: wg.cosmo.node.v1.GRPCMapping.enum_mappings:type_name -> wg.cosmo.node.v1.EnumMapping + 41, // 63: wg.cosmo.node.v1.GRPCMapping.resolve_mappings:type_name -> wg.cosmo.node.v1.LookupMapping + 3, // 64: wg.cosmo.node.v1.LookupMapping.type:type_name -> wg.cosmo.node.v1.LookupType + 42, // 65: wg.cosmo.node.v1.LookupMapping.lookup_mapping:type_name -> wg.cosmo.node.v1.LookupFieldMapping + 47, // 66: wg.cosmo.node.v1.LookupFieldMapping.field_mapping:type_name -> wg.cosmo.node.v1.FieldMapping + 4, // 67: wg.cosmo.node.v1.OperationMapping.type:type_name -> wg.cosmo.node.v1.OperationType + 45, // 68: wg.cosmo.node.v1.EntityMapping.required_field_mappings:type_name -> wg.cosmo.node.v1.RequiredFieldMapping + 47, // 69: wg.cosmo.node.v1.RequiredFieldMapping.field_mapping:type_name -> wg.cosmo.node.v1.FieldMapping + 47, // 70: wg.cosmo.node.v1.TypeFieldMapping.field_mappings:type_name -> wg.cosmo.node.v1.FieldMapping + 48, // 71: wg.cosmo.node.v1.FieldMapping.argument_mappings:type_name -> wg.cosmo.node.v1.ArgumentMapping + 50, // 72: wg.cosmo.node.v1.EnumMapping.values:type_name -> wg.cosmo.node.v1.EnumValueMapping + 55, // 73: wg.cosmo.node.v1.NatsEventConfiguration.engine_event_configuration:type_name -> wg.cosmo.node.v1.EngineEventConfiguration + 51, // 74: wg.cosmo.node.v1.NatsEventConfiguration.stream_configuration:type_name -> wg.cosmo.node.v1.NatsStreamConfiguration + 55, // 75: wg.cosmo.node.v1.KafkaEventConfiguration.engine_event_configuration:type_name -> wg.cosmo.node.v1.EngineEventConfiguration + 55, // 76: wg.cosmo.node.v1.RedisEventConfiguration.engine_event_configuration:type_name -> wg.cosmo.node.v1.EngineEventConfiguration + 5, // 77: wg.cosmo.node.v1.EngineEventConfiguration.type:type_name -> wg.cosmo.node.v1.EventType + 52, // 78: wg.cosmo.node.v1.DataSourceCustomEvents.nats:type_name -> wg.cosmo.node.v1.NatsEventConfiguration + 53, // 79: wg.cosmo.node.v1.DataSourceCustomEvents.kafka:type_name -> wg.cosmo.node.v1.KafkaEventConfiguration + 54, // 80: wg.cosmo.node.v1.DataSourceCustomEvents.redis:type_name -> wg.cosmo.node.v1.RedisEventConfiguration + 58, // 81: wg.cosmo.node.v1.DataSourceCustom_Static.data:type_name -> wg.cosmo.node.v1.ConfigurationVariable + 6, // 82: wg.cosmo.node.v1.ConfigurationVariable.kind:type_name -> wg.cosmo.node.v1.ConfigurationVariableKind + 58, // 83: wg.cosmo.node.v1.HTTPHeader.values:type_name -> wg.cosmo.node.v1.ConfigurationVariable + 58, // 84: wg.cosmo.node.v1.MTLSConfiguration.key:type_name -> wg.cosmo.node.v1.ConfigurationVariable + 58, // 85: wg.cosmo.node.v1.MTLSConfiguration.cert:type_name -> wg.cosmo.node.v1.ConfigurationVariable + 58, // 86: wg.cosmo.node.v1.GraphQLSubscriptionConfiguration.url:type_name -> wg.cosmo.node.v1.ConfigurationVariable + 83, // 87: wg.cosmo.node.v1.GraphQLSubscriptionConfiguration.protocol:type_name -> wg.cosmo.common.GraphQLSubscriptionProtocol + 84, // 88: wg.cosmo.node.v1.GraphQLSubscriptionConfiguration.websocketSubprotocol:type_name -> wg.cosmo.common.GraphQLWebsocketSubprotocol + 68, // 89: wg.cosmo.node.v1.SubscriptionFilterCondition.and:type_name -> wg.cosmo.node.v1.SubscriptionFilterCondition + 67, // 90: wg.cosmo.node.v1.SubscriptionFilterCondition.in:type_name -> wg.cosmo.node.v1.SubscriptionFieldCondition + 68, // 91: wg.cosmo.node.v1.SubscriptionFilterCondition.not:type_name -> wg.cosmo.node.v1.SubscriptionFilterCondition + 68, // 92: wg.cosmo.node.v1.SubscriptionFilterCondition.or:type_name -> wg.cosmo.node.v1.SubscriptionFilterCondition + 70, // 93: wg.cosmo.node.v1.CacheWarmerOperations.operations:type_name -> wg.cosmo.node.v1.Operation + 71, // 94: wg.cosmo.node.v1.Operation.request:type_name -> wg.cosmo.node.v1.OperationRequest + 74, // 95: wg.cosmo.node.v1.Operation.client:type_name -> wg.cosmo.node.v1.ClientInfo + 72, // 96: wg.cosmo.node.v1.OperationRequest.extensions:type_name -> wg.cosmo.node.v1.Extension + 73, // 97: wg.cosmo.node.v1.Extension.persisted_query:type_name -> wg.cosmo.node.v1.PersistedQuery + 10, // 98: wg.cosmo.node.v1.FeatureFlagRouterExecutionConfigs.ConfigByFeatureFlagNameEntry.value:type_name -> wg.cosmo.node.v1.FeatureFlagRouterExecutionConfig + 61, // 99: wg.cosmo.node.v1.FetchConfiguration.HeaderEntry.value:type_name -> wg.cosmo.node.v1.HTTPHeader + 16, // 100: wg.cosmo.node.v1.NodeService.SelfRegister:input_type -> wg.cosmo.node.v1.SelfRegisterRequest + 17, // 101: wg.cosmo.node.v1.NodeService.SelfRegister:output_type -> wg.cosmo.node.v1.SelfRegisterResponse + 101, // [101:102] is the sub-list for method output_type + 100, // [100:101] is the sub-list for method input_type + 100, // [100:100] is the sub-list for extension type_name + 100, // [100:100] is the sub-list for extension extendee + 0, // [0:100] is the sub-list for field type_name } func init() { file_wg_cosmo_node_v1_node_proto_init() } @@ -5288,23 +5234,23 @@ func file_wg_cosmo_node_v1_node_proto_init() { return } file_wg_cosmo_node_v1_node_proto_msgTypes[3].OneofWrappers = []any{} - file_wg_cosmo_node_v1_node_proto_msgTypes[5].OneofWrappers = []any{} + file_wg_cosmo_node_v1_node_proto_msgTypes[4].OneofWrappers = []any{} + file_wg_cosmo_node_v1_node_proto_msgTypes[9].OneofWrappers = []any{} file_wg_cosmo_node_v1_node_proto_msgTypes[10].OneofWrappers = []any{} - file_wg_cosmo_node_v1_node_proto_msgTypes[11].OneofWrappers = []any{} + file_wg_cosmo_node_v1_node_proto_msgTypes[13].OneofWrappers = []any{} file_wg_cosmo_node_v1_node_proto_msgTypes[14].OneofWrappers = []any{} - file_wg_cosmo_node_v1_node_proto_msgTypes[15].OneofWrappers = []any{} - file_wg_cosmo_node_v1_node_proto_msgTypes[19].OneofWrappers = []any{} - file_wg_cosmo_node_v1_node_proto_msgTypes[26].OneofWrappers = []any{} - file_wg_cosmo_node_v1_node_proto_msgTypes[31].OneofWrappers = []any{} - file_wg_cosmo_node_v1_node_proto_msgTypes[56].OneofWrappers = []any{} - file_wg_cosmo_node_v1_node_proto_msgTypes[61].OneofWrappers = []any{} + file_wg_cosmo_node_v1_node_proto_msgTypes[18].OneofWrappers = []any{} + file_wg_cosmo_node_v1_node_proto_msgTypes[25].OneofWrappers = []any{} + file_wg_cosmo_node_v1_node_proto_msgTypes[30].OneofWrappers = []any{} + file_wg_cosmo_node_v1_node_proto_msgTypes[55].OneofWrappers = []any{} + file_wg_cosmo_node_v1_node_proto_msgTypes[60].OneofWrappers = []any{} type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: unsafe.Slice(unsafe.StringData(file_wg_cosmo_node_v1_node_proto_rawDesc), len(file_wg_cosmo_node_v1_node_proto_rawDesc)), NumEnums: 8, - NumMessages: 76, + NumMessages: 74, NumExtensions: 0, NumServices: 1, }, diff --git a/connect/src/wg/cosmo/node/v1/node_pb.ts b/connect/src/wg/cosmo/node/v1/node_pb.ts index e109a08ab4..b50794f361 100644 --- a/connect/src/wg/cosmo/node/v1/node_pb.ts +++ b/connect/src/wg/cosmo/node/v1/node_pb.ts @@ -441,46 +441,6 @@ export class RouterConfig extends Message { } } -/** - * @generated from message wg.cosmo.node.v1.ActiveGraphs - */ -export class ActiveGraphs extends Message { - /** - * key = feature flag name, empty means base graph - * value = hash of engine_config - * - * @generated from field: map graphConfigs = 1; - */ - graphConfigs: { [key: string]: string } = {}; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "wg.cosmo.node.v1.ActiveGraphs"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "graphConfigs", kind: "map", K: 9 /* ScalarType.STRING */, V: {kind: "scalar", T: 9 /* ScalarType.STRING */} }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): ActiveGraphs { - return new ActiveGraphs().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): ActiveGraphs { - return new ActiveGraphs().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): ActiveGraphs { - return new ActiveGraphs().fromJsonString(jsonString, options); - } - - static equals(a: ActiveGraphs | PlainMessage | undefined, b: ActiveGraphs | PlainMessage | undefined): boolean { - return proto3.util.equals(ActiveGraphs, a, b); - } -} - /** * @generated from message wg.cosmo.node.v1.Response */ diff --git a/proto/wg/cosmo/node/v1/node.proto b/proto/wg/cosmo/node/v1/node.proto index 314615363d..af7bd79bb4 100644 --- a/proto/wg/cosmo/node/v1/node.proto +++ b/proto/wg/cosmo/node/v1/node.proto @@ -29,12 +29,6 @@ message RouterConfig { string compatibility_version = 5; } -message ActiveGraphs { - // key = feature flag name, empty means base graph - // value = hash of engine_config - map graphConfigs = 1; -} - message Response { wg.cosmo.common.EnumStatusCode code = 1; // details is an optional field which can be used to provide more details about the error. diff --git a/router/gen/proto/wg/cosmo/node/v1/node.pb.go b/router/gen/proto/wg/cosmo/node/v1/node.pb.go index a6bcd937fc..0384fac5a6 100644 --- a/router/gen/proto/wg/cosmo/node/v1/node.pb.go +++ b/router/gen/proto/wg/cosmo/node/v1/node.pb.go @@ -669,52 +669,6 @@ func (x *RouterConfig) GetCompatibilityVersion() string { return "" } -type ActiveGraphs struct { - state protoimpl.MessageState `protogen:"open.v1"` - // key = feature flag name, empty means base graph - // value = hash of engine_config - GraphConfigs map[string]string `protobuf:"bytes,1,rep,name=graphConfigs,proto3" json:"graphConfigs,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache -} - -func (x *ActiveGraphs) Reset() { - *x = ActiveGraphs{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[4] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *ActiveGraphs) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ActiveGraphs) ProtoMessage() {} - -func (x *ActiveGraphs) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[4] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use ActiveGraphs.ProtoReflect.Descriptor instead. -func (*ActiveGraphs) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{4} -} - -func (x *ActiveGraphs) GetGraphConfigs() map[string]string { - if x != nil { - return x.GraphConfigs - } - return nil -} - type Response struct { state protoimpl.MessageState `protogen:"open.v1"` Code common.EnumStatusCode `protobuf:"varint,1,opt,name=code,proto3,enum=wg.cosmo.common.EnumStatusCode" json:"code,omitempty"` @@ -726,7 +680,7 @@ type Response struct { func (x *Response) Reset() { *x = Response{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[5] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[4] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -738,7 +692,7 @@ func (x *Response) String() string { func (*Response) ProtoMessage() {} func (x *Response) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[5] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[4] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -751,7 +705,7 @@ func (x *Response) ProtoReflect() protoreflect.Message { // Deprecated: Use Response.ProtoReflect.Descriptor instead. func (*Response) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{5} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{4} } func (x *Response) GetCode() common.EnumStatusCode { @@ -778,7 +732,7 @@ type ResponseStatus struct { func (x *ResponseStatus) Reset() { *x = ResponseStatus{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[6] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[5] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -790,7 +744,7 @@ func (x *ResponseStatus) String() string { func (*ResponseStatus) ProtoMessage() {} func (x *ResponseStatus) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[6] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[5] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -803,7 +757,7 @@ func (x *ResponseStatus) ProtoReflect() protoreflect.Message { // Deprecated: Use ResponseStatus.ProtoReflect.Descriptor instead. func (*ResponseStatus) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{6} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{5} } func (x *ResponseStatus) GetCode() int32 { @@ -830,7 +784,7 @@ type RegistrationInfo struct { func (x *RegistrationInfo) Reset() { *x = RegistrationInfo{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[7] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -842,7 +796,7 @@ func (x *RegistrationInfo) String() string { func (*RegistrationInfo) ProtoMessage() {} func (x *RegistrationInfo) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[7] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[6] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -855,7 +809,7 @@ func (x *RegistrationInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use RegistrationInfo.ProtoReflect.Descriptor instead. func (*RegistrationInfo) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{7} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{6} } func (x *RegistrationInfo) GetAccountLimits() *AccountLimits { @@ -883,7 +837,7 @@ type AccountLimits struct { func (x *AccountLimits) Reset() { *x = AccountLimits{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[8] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -895,7 +849,7 @@ func (x *AccountLimits) String() string { func (*AccountLimits) ProtoMessage() {} func (x *AccountLimits) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[8] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[7] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -908,7 +862,7 @@ func (x *AccountLimits) ProtoReflect() protoreflect.Message { // Deprecated: Use AccountLimits.ProtoReflect.Descriptor instead. func (*AccountLimits) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{8} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{7} } func (x *AccountLimits) GetTraceSamplingRate() float32 { @@ -926,7 +880,7 @@ type SelfRegisterRequest struct { func (x *SelfRegisterRequest) Reset() { *x = SelfRegisterRequest{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[9] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -938,7 +892,7 @@ func (x *SelfRegisterRequest) String() string { func (*SelfRegisterRequest) ProtoMessage() {} func (x *SelfRegisterRequest) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[9] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[8] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -951,7 +905,7 @@ func (x *SelfRegisterRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SelfRegisterRequest.ProtoReflect.Descriptor instead. func (*SelfRegisterRequest) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{9} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{8} } type SelfRegisterResponse struct { @@ -964,7 +918,7 @@ type SelfRegisterResponse struct { func (x *SelfRegisterResponse) Reset() { *x = SelfRegisterResponse{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[10] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -976,7 +930,7 @@ func (x *SelfRegisterResponse) String() string { func (*SelfRegisterResponse) ProtoMessage() {} func (x *SelfRegisterResponse) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[10] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[9] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -989,7 +943,7 @@ func (x *SelfRegisterResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use SelfRegisterResponse.ProtoReflect.Descriptor instead. func (*SelfRegisterResponse) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{10} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{9} } func (x *SelfRegisterResponse) GetResponse() *Response { @@ -1021,7 +975,7 @@ type EngineConfiguration struct { func (x *EngineConfiguration) Reset() { *x = EngineConfiguration{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[11] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1033,7 +987,7 @@ func (x *EngineConfiguration) String() string { func (*EngineConfiguration) ProtoMessage() {} func (x *EngineConfiguration) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[11] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[10] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1046,7 +1000,7 @@ func (x *EngineConfiguration) ProtoReflect() protoreflect.Message { // Deprecated: Use EngineConfiguration.ProtoReflect.Descriptor instead. func (*EngineConfiguration) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{11} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{10} } func (x *EngineConfiguration) GetDefaultFlushInterval() int64 { @@ -1122,7 +1076,7 @@ type DataSourceConfiguration struct { func (x *DataSourceConfiguration) Reset() { *x = DataSourceConfiguration{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[12] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1134,7 +1088,7 @@ func (x *DataSourceConfiguration) String() string { func (*DataSourceConfiguration) ProtoMessage() {} func (x *DataSourceConfiguration) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[12] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[11] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1147,7 +1101,7 @@ func (x *DataSourceConfiguration) ProtoReflect() protoreflect.Message { // Deprecated: Use DataSourceConfiguration.ProtoReflect.Descriptor instead. func (*DataSourceConfiguration) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{12} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{11} } func (x *DataSourceConfiguration) GetKind() DataSourceKind { @@ -1274,7 +1228,7 @@ type CostConfiguration struct { func (x *CostConfiguration) Reset() { *x = CostConfiguration{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[13] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1286,7 +1240,7 @@ func (x *CostConfiguration) String() string { func (*CostConfiguration) ProtoMessage() {} func (x *CostConfiguration) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[13] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[12] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1299,7 +1253,7 @@ func (x *CostConfiguration) ProtoReflect() protoreflect.Message { // Deprecated: Use CostConfiguration.ProtoReflect.Descriptor instead. func (*CostConfiguration) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{13} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{12} } func (x *CostConfiguration) GetFieldWeights() []*FieldWeightConfiguration { @@ -1343,7 +1297,7 @@ type FieldWeightConfiguration struct { func (x *FieldWeightConfiguration) Reset() { *x = FieldWeightConfiguration{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[14] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1355,7 +1309,7 @@ func (x *FieldWeightConfiguration) String() string { func (*FieldWeightConfiguration) ProtoMessage() {} func (x *FieldWeightConfiguration) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[14] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[13] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1368,7 +1322,7 @@ func (x *FieldWeightConfiguration) ProtoReflect() protoreflect.Message { // Deprecated: Use FieldWeightConfiguration.ProtoReflect.Descriptor instead. func (*FieldWeightConfiguration) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{14} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{13} } func (x *FieldWeightConfiguration) GetTypeName() string { @@ -1420,7 +1374,7 @@ type FieldListSizeConfiguration struct { func (x *FieldListSizeConfiguration) Reset() { *x = FieldListSizeConfiguration{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[15] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1432,7 +1386,7 @@ func (x *FieldListSizeConfiguration) String() string { func (*FieldListSizeConfiguration) ProtoMessage() {} func (x *FieldListSizeConfiguration) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[15] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[14] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1445,7 +1399,7 @@ func (x *FieldListSizeConfiguration) ProtoReflect() protoreflect.Message { // Deprecated: Use FieldListSizeConfiguration.ProtoReflect.Descriptor instead. func (*FieldListSizeConfiguration) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{15} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{14} } func (x *FieldListSizeConfiguration) GetTypeName() string { @@ -1500,7 +1454,7 @@ type ArgumentConfiguration struct { func (x *ArgumentConfiguration) Reset() { *x = ArgumentConfiguration{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[16] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[15] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1512,7 +1466,7 @@ func (x *ArgumentConfiguration) String() string { func (*ArgumentConfiguration) ProtoMessage() {} func (x *ArgumentConfiguration) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[16] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[15] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1525,7 +1479,7 @@ func (x *ArgumentConfiguration) ProtoReflect() protoreflect.Message { // Deprecated: Use ArgumentConfiguration.ProtoReflect.Descriptor instead. func (*ArgumentConfiguration) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{16} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{15} } func (x *ArgumentConfiguration) GetName() string { @@ -1551,7 +1505,7 @@ type Scopes struct { func (x *Scopes) Reset() { *x = Scopes{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[17] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[16] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1563,7 +1517,7 @@ func (x *Scopes) String() string { func (*Scopes) ProtoMessage() {} func (x *Scopes) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[17] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[16] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1576,7 +1530,7 @@ func (x *Scopes) ProtoReflect() protoreflect.Message { // Deprecated: Use Scopes.ProtoReflect.Descriptor instead. func (*Scopes) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{17} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{16} } func (x *Scopes) GetRequiredAndScopes() []string { @@ -1597,7 +1551,7 @@ type AuthorizationConfiguration struct { func (x *AuthorizationConfiguration) Reset() { *x = AuthorizationConfiguration{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[18] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[17] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1609,7 +1563,7 @@ func (x *AuthorizationConfiguration) String() string { func (*AuthorizationConfiguration) ProtoMessage() {} func (x *AuthorizationConfiguration) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[18] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[17] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1622,7 +1576,7 @@ func (x *AuthorizationConfiguration) ProtoReflect() protoreflect.Message { // Deprecated: Use AuthorizationConfiguration.ProtoReflect.Descriptor instead. func (*AuthorizationConfiguration) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{18} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{17} } func (x *AuthorizationConfiguration) GetRequiresAuthentication() bool { @@ -1659,7 +1613,7 @@ type FieldConfiguration struct { func (x *FieldConfiguration) Reset() { *x = FieldConfiguration{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[19] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[18] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1671,7 +1625,7 @@ func (x *FieldConfiguration) String() string { func (*FieldConfiguration) ProtoMessage() {} func (x *FieldConfiguration) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[19] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[18] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1684,7 +1638,7 @@ func (x *FieldConfiguration) ProtoReflect() protoreflect.Message { // Deprecated: Use FieldConfiguration.ProtoReflect.Descriptor instead. func (*FieldConfiguration) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{19} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{18} } func (x *FieldConfiguration) GetTypeName() string { @@ -1732,7 +1686,7 @@ type TypeConfiguration struct { func (x *TypeConfiguration) Reset() { *x = TypeConfiguration{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[20] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[19] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1744,7 +1698,7 @@ func (x *TypeConfiguration) String() string { func (*TypeConfiguration) ProtoMessage() {} func (x *TypeConfiguration) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[20] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[19] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1757,7 +1711,7 @@ func (x *TypeConfiguration) ProtoReflect() protoreflect.Message { // Deprecated: Use TypeConfiguration.ProtoReflect.Descriptor instead. func (*TypeConfiguration) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{20} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{19} } func (x *TypeConfiguration) GetTypeName() string { @@ -1786,7 +1740,7 @@ type TypeField struct { func (x *TypeField) Reset() { *x = TypeField{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[21] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[20] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1798,7 +1752,7 @@ func (x *TypeField) String() string { func (*TypeField) ProtoMessage() {} func (x *TypeField) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[21] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[20] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1811,7 +1765,7 @@ func (x *TypeField) ProtoReflect() protoreflect.Message { // Deprecated: Use TypeField.ProtoReflect.Descriptor instead. func (*TypeField) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{21} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{20} } func (x *TypeField) GetTypeName() string { @@ -1852,7 +1806,7 @@ type FieldCoordinates struct { func (x *FieldCoordinates) Reset() { *x = FieldCoordinates{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[22] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[21] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1864,7 +1818,7 @@ func (x *FieldCoordinates) String() string { func (*FieldCoordinates) ProtoMessage() {} func (x *FieldCoordinates) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[22] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[21] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1877,7 +1831,7 @@ func (x *FieldCoordinates) ProtoReflect() protoreflect.Message { // Deprecated: Use FieldCoordinates.ProtoReflect.Descriptor instead. func (*FieldCoordinates) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{22} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{21} } func (x *FieldCoordinates) GetFieldName() string { @@ -1904,7 +1858,7 @@ type FieldSetCondition struct { func (x *FieldSetCondition) Reset() { *x = FieldSetCondition{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[23] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[22] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1916,7 +1870,7 @@ func (x *FieldSetCondition) String() string { func (*FieldSetCondition) ProtoMessage() {} func (x *FieldSetCondition) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[23] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[22] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1929,7 +1883,7 @@ func (x *FieldSetCondition) ProtoReflect() protoreflect.Message { // Deprecated: Use FieldSetCondition.ProtoReflect.Descriptor instead. func (*FieldSetCondition) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{23} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{22} } func (x *FieldSetCondition) GetFieldCoordinatesPath() []*FieldCoordinates { @@ -1959,7 +1913,7 @@ type RequiredField struct { func (x *RequiredField) Reset() { *x = RequiredField{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[24] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[23] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1971,7 +1925,7 @@ func (x *RequiredField) String() string { func (*RequiredField) ProtoMessage() {} func (x *RequiredField) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[24] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[23] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1984,7 +1938,7 @@ func (x *RequiredField) ProtoReflect() protoreflect.Message { // Deprecated: Use RequiredField.ProtoReflect.Descriptor instead. func (*RequiredField) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{24} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{23} } func (x *RequiredField) GetTypeName() string { @@ -2032,7 +1986,7 @@ type EntityInterfaceConfiguration struct { func (x *EntityInterfaceConfiguration) Reset() { *x = EntityInterfaceConfiguration{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[25] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[24] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2044,7 +1998,7 @@ func (x *EntityInterfaceConfiguration) String() string { func (*EntityInterfaceConfiguration) ProtoMessage() {} func (x *EntityInterfaceConfiguration) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[25] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[24] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2057,7 +2011,7 @@ func (x *EntityInterfaceConfiguration) ProtoReflect() protoreflect.Message { // Deprecated: Use EntityInterfaceConfiguration.ProtoReflect.Descriptor instead. func (*EntityInterfaceConfiguration) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{25} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{24} } func (x *EntityInterfaceConfiguration) GetInterfaceTypeName() string { @@ -2100,7 +2054,7 @@ type FetchConfiguration struct { func (x *FetchConfiguration) Reset() { *x = FetchConfiguration{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[26] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[25] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2112,7 +2066,7 @@ func (x *FetchConfiguration) String() string { func (*FetchConfiguration) ProtoMessage() {} func (x *FetchConfiguration) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[26] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[25] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2125,7 +2079,7 @@ func (x *FetchConfiguration) ProtoReflect() protoreflect.Message { // Deprecated: Use FetchConfiguration.ProtoReflect.Descriptor instead. func (*FetchConfiguration) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{26} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{25} } func (x *FetchConfiguration) GetUrl() *ConfigurationVariable { @@ -2209,7 +2163,7 @@ type StatusCodeTypeMapping struct { func (x *StatusCodeTypeMapping) Reset() { *x = StatusCodeTypeMapping{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[27] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[26] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2221,7 +2175,7 @@ func (x *StatusCodeTypeMapping) String() string { func (*StatusCodeTypeMapping) ProtoMessage() {} func (x *StatusCodeTypeMapping) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[27] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[26] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2234,7 +2188,7 @@ func (x *StatusCodeTypeMapping) ProtoReflect() protoreflect.Message { // Deprecated: Use StatusCodeTypeMapping.ProtoReflect.Descriptor instead. func (*StatusCodeTypeMapping) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{27} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{26} } func (x *StatusCodeTypeMapping) GetStatusCode() int64 { @@ -2272,7 +2226,7 @@ type DataSourceCustom_GraphQL struct { func (x *DataSourceCustom_GraphQL) Reset() { *x = DataSourceCustom_GraphQL{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[28] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[27] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2284,7 +2238,7 @@ func (x *DataSourceCustom_GraphQL) String() string { func (*DataSourceCustom_GraphQL) ProtoMessage() {} func (x *DataSourceCustom_GraphQL) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[28] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[27] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2297,7 +2251,7 @@ func (x *DataSourceCustom_GraphQL) ProtoReflect() protoreflect.Message { // Deprecated: Use DataSourceCustom_GraphQL.ProtoReflect.Descriptor instead. func (*DataSourceCustom_GraphQL) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{28} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{27} } func (x *DataSourceCustom_GraphQL) GetFetch() *FetchConfiguration { @@ -2353,7 +2307,7 @@ type GRPCConfiguration struct { func (x *GRPCConfiguration) Reset() { *x = GRPCConfiguration{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[29] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[28] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2365,7 +2319,7 @@ func (x *GRPCConfiguration) String() string { func (*GRPCConfiguration) ProtoMessage() {} func (x *GRPCConfiguration) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[29] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[28] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2378,7 +2332,7 @@ func (x *GRPCConfiguration) ProtoReflect() protoreflect.Message { // Deprecated: Use GRPCConfiguration.ProtoReflect.Descriptor instead. func (*GRPCConfiguration) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{29} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{28} } func (x *GRPCConfiguration) GetMapping() *GRPCMapping { @@ -2412,7 +2366,7 @@ type ImageReference struct { func (x *ImageReference) Reset() { *x = ImageReference{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[30] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[29] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2424,7 +2378,7 @@ func (x *ImageReference) String() string { func (*ImageReference) ProtoMessage() {} func (x *ImageReference) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[30] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[29] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2437,7 +2391,7 @@ func (x *ImageReference) ProtoReflect() protoreflect.Message { // Deprecated: Use ImageReference.ProtoReflect.Descriptor instead. func (*ImageReference) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{30} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{29} } func (x *ImageReference) GetRepository() string { @@ -2467,7 +2421,7 @@ type PluginConfiguration struct { func (x *PluginConfiguration) Reset() { *x = PluginConfiguration{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[31] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[30] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2479,7 +2433,7 @@ func (x *PluginConfiguration) String() string { func (*PluginConfiguration) ProtoMessage() {} func (x *PluginConfiguration) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[31] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[30] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2492,7 +2446,7 @@ func (x *PluginConfiguration) ProtoReflect() protoreflect.Message { // Deprecated: Use PluginConfiguration.ProtoReflect.Descriptor instead. func (*PluginConfiguration) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{31} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{30} } func (x *PluginConfiguration) GetName() string { @@ -2526,7 +2480,7 @@ type SSLConfiguration struct { func (x *SSLConfiguration) Reset() { *x = SSLConfiguration{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[32] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[31] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2538,7 +2492,7 @@ func (x *SSLConfiguration) String() string { func (*SSLConfiguration) ProtoMessage() {} func (x *SSLConfiguration) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[32] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[31] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2551,7 +2505,7 @@ func (x *SSLConfiguration) ProtoReflect() protoreflect.Message { // Deprecated: Use SSLConfiguration.ProtoReflect.Descriptor instead. func (*SSLConfiguration) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{32} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{31} } func (x *SSLConfiguration) GetEnabled() bool { @@ -2584,7 +2538,7 @@ type GRPCMapping struct { func (x *GRPCMapping) Reset() { *x = GRPCMapping{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[33] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[32] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2596,7 +2550,7 @@ func (x *GRPCMapping) String() string { func (*GRPCMapping) ProtoMessage() {} func (x *GRPCMapping) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[33] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[32] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2609,7 +2563,7 @@ func (x *GRPCMapping) ProtoReflect() protoreflect.Message { // Deprecated: Use GRPCMapping.ProtoReflect.Descriptor instead. func (*GRPCMapping) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{33} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{32} } func (x *GRPCMapping) GetVersion() int32 { @@ -2680,7 +2634,7 @@ type LookupMapping struct { func (x *LookupMapping) Reset() { *x = LookupMapping{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[34] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[33] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2692,7 +2646,7 @@ func (x *LookupMapping) String() string { func (*LookupMapping) ProtoMessage() {} func (x *LookupMapping) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[34] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[33] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2705,7 +2659,7 @@ func (x *LookupMapping) ProtoReflect() protoreflect.Message { // Deprecated: Use LookupMapping.ProtoReflect.Descriptor instead. func (*LookupMapping) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{34} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{33} } func (x *LookupMapping) GetType() LookupType { @@ -2756,7 +2710,7 @@ type LookupFieldMapping struct { func (x *LookupFieldMapping) Reset() { *x = LookupFieldMapping{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[35] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[34] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2768,7 +2722,7 @@ func (x *LookupFieldMapping) String() string { func (*LookupFieldMapping) ProtoMessage() {} func (x *LookupFieldMapping) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[35] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[34] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2781,7 +2735,7 @@ func (x *LookupFieldMapping) ProtoReflect() protoreflect.Message { // Deprecated: Use LookupFieldMapping.ProtoReflect.Descriptor instead. func (*LookupFieldMapping) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{35} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{34} } func (x *LookupFieldMapping) GetType() string { @@ -2817,7 +2771,7 @@ type OperationMapping struct { func (x *OperationMapping) Reset() { *x = OperationMapping{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[36] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[35] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2829,7 +2783,7 @@ func (x *OperationMapping) String() string { func (*OperationMapping) ProtoMessage() {} func (x *OperationMapping) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[36] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[35] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2842,7 +2796,7 @@ func (x *OperationMapping) ProtoReflect() protoreflect.Message { // Deprecated: Use OperationMapping.ProtoReflect.Descriptor instead. func (*OperationMapping) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{36} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{35} } func (x *OperationMapping) GetType() OperationType { @@ -2903,7 +2857,7 @@ type EntityMapping struct { func (x *EntityMapping) Reset() { *x = EntityMapping{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[37] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[36] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2915,7 +2869,7 @@ func (x *EntityMapping) String() string { func (*EntityMapping) ProtoMessage() {} func (x *EntityMapping) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[37] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[36] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2928,7 +2882,7 @@ func (x *EntityMapping) ProtoReflect() protoreflect.Message { // Deprecated: Use EntityMapping.ProtoReflect.Descriptor instead. func (*EntityMapping) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{37} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{36} } func (x *EntityMapping) GetTypeName() string { @@ -2996,7 +2950,7 @@ type RequiredFieldMapping struct { func (x *RequiredFieldMapping) Reset() { *x = RequiredFieldMapping{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[38] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[37] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3008,7 +2962,7 @@ func (x *RequiredFieldMapping) String() string { func (*RequiredFieldMapping) ProtoMessage() {} func (x *RequiredFieldMapping) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[38] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[37] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3021,7 +2975,7 @@ func (x *RequiredFieldMapping) ProtoReflect() protoreflect.Message { // Deprecated: Use RequiredFieldMapping.ProtoReflect.Descriptor instead. func (*RequiredFieldMapping) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{38} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{37} } func (x *RequiredFieldMapping) GetFieldMapping() *FieldMapping { @@ -3065,7 +3019,7 @@ type TypeFieldMapping struct { func (x *TypeFieldMapping) Reset() { *x = TypeFieldMapping{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[39] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[38] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3077,7 +3031,7 @@ func (x *TypeFieldMapping) String() string { func (*TypeFieldMapping) ProtoMessage() {} func (x *TypeFieldMapping) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[39] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[38] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3090,7 +3044,7 @@ func (x *TypeFieldMapping) ProtoReflect() protoreflect.Message { // Deprecated: Use TypeFieldMapping.ProtoReflect.Descriptor instead. func (*TypeFieldMapping) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{39} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{38} } func (x *TypeFieldMapping) GetType() string { @@ -3122,7 +3076,7 @@ type FieldMapping struct { func (x *FieldMapping) Reset() { *x = FieldMapping{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[40] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[39] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3134,7 +3088,7 @@ func (x *FieldMapping) String() string { func (*FieldMapping) ProtoMessage() {} func (x *FieldMapping) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[40] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[39] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3147,7 +3101,7 @@ func (x *FieldMapping) ProtoReflect() protoreflect.Message { // Deprecated: Use FieldMapping.ProtoReflect.Descriptor instead. func (*FieldMapping) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{40} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{39} } func (x *FieldMapping) GetOriginal() string { @@ -3184,7 +3138,7 @@ type ArgumentMapping struct { func (x *ArgumentMapping) Reset() { *x = ArgumentMapping{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[41] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[40] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3196,7 +3150,7 @@ func (x *ArgumentMapping) String() string { func (*ArgumentMapping) ProtoMessage() {} func (x *ArgumentMapping) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[41] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[40] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3209,7 +3163,7 @@ func (x *ArgumentMapping) ProtoReflect() protoreflect.Message { // Deprecated: Use ArgumentMapping.ProtoReflect.Descriptor instead. func (*ArgumentMapping) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{41} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{40} } func (x *ArgumentMapping) GetOriginal() string { @@ -3236,7 +3190,7 @@ type EnumMapping struct { func (x *EnumMapping) Reset() { *x = EnumMapping{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[42] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[41] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3248,7 +3202,7 @@ func (x *EnumMapping) String() string { func (*EnumMapping) ProtoMessage() {} func (x *EnumMapping) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[42] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[41] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3261,7 +3215,7 @@ func (x *EnumMapping) ProtoReflect() protoreflect.Message { // Deprecated: Use EnumMapping.ProtoReflect.Descriptor instead. func (*EnumMapping) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{42} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{41} } func (x *EnumMapping) GetType() string { @@ -3288,7 +3242,7 @@ type EnumValueMapping struct { func (x *EnumValueMapping) Reset() { *x = EnumValueMapping{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[43] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[42] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3300,7 +3254,7 @@ func (x *EnumValueMapping) String() string { func (*EnumValueMapping) ProtoMessage() {} func (x *EnumValueMapping) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[43] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[42] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3313,7 +3267,7 @@ func (x *EnumValueMapping) ProtoReflect() protoreflect.Message { // Deprecated: Use EnumValueMapping.ProtoReflect.Descriptor instead. func (*EnumValueMapping) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{43} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{42} } func (x *EnumValueMapping) GetOriginal() string { @@ -3341,7 +3295,7 @@ type NatsStreamConfiguration struct { func (x *NatsStreamConfiguration) Reset() { *x = NatsStreamConfiguration{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[44] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[43] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3353,7 +3307,7 @@ func (x *NatsStreamConfiguration) String() string { func (*NatsStreamConfiguration) ProtoMessage() {} func (x *NatsStreamConfiguration) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[44] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[43] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3366,7 +3320,7 @@ func (x *NatsStreamConfiguration) ProtoReflect() protoreflect.Message { // Deprecated: Use NatsStreamConfiguration.ProtoReflect.Descriptor instead. func (*NatsStreamConfiguration) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{44} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{43} } func (x *NatsStreamConfiguration) GetConsumerName() string { @@ -3401,7 +3355,7 @@ type NatsEventConfiguration struct { func (x *NatsEventConfiguration) Reset() { *x = NatsEventConfiguration{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[45] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[44] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3413,7 +3367,7 @@ func (x *NatsEventConfiguration) String() string { func (*NatsEventConfiguration) ProtoMessage() {} func (x *NatsEventConfiguration) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[45] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[44] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3426,7 +3380,7 @@ func (x *NatsEventConfiguration) ProtoReflect() protoreflect.Message { // Deprecated: Use NatsEventConfiguration.ProtoReflect.Descriptor instead. func (*NatsEventConfiguration) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{45} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{44} } func (x *NatsEventConfiguration) GetEngineEventConfiguration() *EngineEventConfiguration { @@ -3460,7 +3414,7 @@ type KafkaEventConfiguration struct { func (x *KafkaEventConfiguration) Reset() { *x = KafkaEventConfiguration{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[46] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[45] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3472,7 +3426,7 @@ func (x *KafkaEventConfiguration) String() string { func (*KafkaEventConfiguration) ProtoMessage() {} func (x *KafkaEventConfiguration) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[46] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[45] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3485,7 +3439,7 @@ func (x *KafkaEventConfiguration) ProtoReflect() protoreflect.Message { // Deprecated: Use KafkaEventConfiguration.ProtoReflect.Descriptor instead. func (*KafkaEventConfiguration) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{46} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{45} } func (x *KafkaEventConfiguration) GetEngineEventConfiguration() *EngineEventConfiguration { @@ -3512,7 +3466,7 @@ type RedisEventConfiguration struct { func (x *RedisEventConfiguration) Reset() { *x = RedisEventConfiguration{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[47] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[46] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3524,7 +3478,7 @@ func (x *RedisEventConfiguration) String() string { func (*RedisEventConfiguration) ProtoMessage() {} func (x *RedisEventConfiguration) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[47] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[46] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3537,7 +3491,7 @@ func (x *RedisEventConfiguration) ProtoReflect() protoreflect.Message { // Deprecated: Use RedisEventConfiguration.ProtoReflect.Descriptor instead. func (*RedisEventConfiguration) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{47} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{46} } func (x *RedisEventConfiguration) GetEngineEventConfiguration() *EngineEventConfiguration { @@ -3566,7 +3520,7 @@ type EngineEventConfiguration struct { func (x *EngineEventConfiguration) Reset() { *x = EngineEventConfiguration{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[48] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[47] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3578,7 +3532,7 @@ func (x *EngineEventConfiguration) String() string { func (*EngineEventConfiguration) ProtoMessage() {} func (x *EngineEventConfiguration) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[48] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[47] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3591,7 +3545,7 @@ func (x *EngineEventConfiguration) ProtoReflect() protoreflect.Message { // Deprecated: Use EngineEventConfiguration.ProtoReflect.Descriptor instead. func (*EngineEventConfiguration) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{48} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{47} } func (x *EngineEventConfiguration) GetProviderId() string { @@ -3633,7 +3587,7 @@ type DataSourceCustomEvents struct { func (x *DataSourceCustomEvents) Reset() { *x = DataSourceCustomEvents{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[49] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[48] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3645,7 +3599,7 @@ func (x *DataSourceCustomEvents) String() string { func (*DataSourceCustomEvents) ProtoMessage() {} func (x *DataSourceCustomEvents) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[49] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[48] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3658,7 +3612,7 @@ func (x *DataSourceCustomEvents) ProtoReflect() protoreflect.Message { // Deprecated: Use DataSourceCustomEvents.ProtoReflect.Descriptor instead. func (*DataSourceCustomEvents) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{49} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{48} } func (x *DataSourceCustomEvents) GetNats() []*NatsEventConfiguration { @@ -3691,7 +3645,7 @@ type DataSourceCustom_Static struct { func (x *DataSourceCustom_Static) Reset() { *x = DataSourceCustom_Static{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[50] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[49] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3703,7 +3657,7 @@ func (x *DataSourceCustom_Static) String() string { func (*DataSourceCustom_Static) ProtoMessage() {} func (x *DataSourceCustom_Static) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[50] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[49] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3716,7 +3670,7 @@ func (x *DataSourceCustom_Static) ProtoReflect() protoreflect.Message { // Deprecated: Use DataSourceCustom_Static.ProtoReflect.Descriptor instead. func (*DataSourceCustom_Static) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{50} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{49} } func (x *DataSourceCustom_Static) GetData() *ConfigurationVariable { @@ -3739,7 +3693,7 @@ type ConfigurationVariable struct { func (x *ConfigurationVariable) Reset() { *x = ConfigurationVariable{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[51] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[50] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3751,7 +3705,7 @@ func (x *ConfigurationVariable) String() string { func (*ConfigurationVariable) ProtoMessage() {} func (x *ConfigurationVariable) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[51] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[50] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3764,7 +3718,7 @@ func (x *ConfigurationVariable) ProtoReflect() protoreflect.Message { // Deprecated: Use ConfigurationVariable.ProtoReflect.Descriptor instead. func (*ConfigurationVariable) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{51} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{50} } func (x *ConfigurationVariable) GetKind() ConfigurationVariableKind { @@ -3812,7 +3766,7 @@ type DirectiveConfiguration struct { func (x *DirectiveConfiguration) Reset() { *x = DirectiveConfiguration{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[52] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[51] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3824,7 +3778,7 @@ func (x *DirectiveConfiguration) String() string { func (*DirectiveConfiguration) ProtoMessage() {} func (x *DirectiveConfiguration) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[52] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[51] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3837,7 +3791,7 @@ func (x *DirectiveConfiguration) ProtoReflect() protoreflect.Message { // Deprecated: Use DirectiveConfiguration.ProtoReflect.Descriptor instead. func (*DirectiveConfiguration) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{52} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{51} } func (x *DirectiveConfiguration) GetDirectiveName() string { @@ -3864,7 +3818,7 @@ type URLQueryConfiguration struct { func (x *URLQueryConfiguration) Reset() { *x = URLQueryConfiguration{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[53] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[52] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3876,7 +3830,7 @@ func (x *URLQueryConfiguration) String() string { func (*URLQueryConfiguration) ProtoMessage() {} func (x *URLQueryConfiguration) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[53] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[52] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3889,7 +3843,7 @@ func (x *URLQueryConfiguration) ProtoReflect() protoreflect.Message { // Deprecated: Use URLQueryConfiguration.ProtoReflect.Descriptor instead. func (*URLQueryConfiguration) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{53} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{52} } func (x *URLQueryConfiguration) GetName() string { @@ -3915,7 +3869,7 @@ type HTTPHeader struct { func (x *HTTPHeader) Reset() { *x = HTTPHeader{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[54] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[53] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3927,7 +3881,7 @@ func (x *HTTPHeader) String() string { func (*HTTPHeader) ProtoMessage() {} func (x *HTTPHeader) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[54] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[53] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3940,7 +3894,7 @@ func (x *HTTPHeader) ProtoReflect() protoreflect.Message { // Deprecated: Use HTTPHeader.ProtoReflect.Descriptor instead. func (*HTTPHeader) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{54} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{53} } func (x *HTTPHeader) GetValues() []*ConfigurationVariable { @@ -3961,7 +3915,7 @@ type MTLSConfiguration struct { func (x *MTLSConfiguration) Reset() { *x = MTLSConfiguration{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[55] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[54] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3973,7 +3927,7 @@ func (x *MTLSConfiguration) String() string { func (*MTLSConfiguration) ProtoMessage() {} func (x *MTLSConfiguration) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[55] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[54] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3986,7 +3940,7 @@ func (x *MTLSConfiguration) ProtoReflect() protoreflect.Message { // Deprecated: Use MTLSConfiguration.ProtoReflect.Descriptor instead. func (*MTLSConfiguration) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{55} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{54} } func (x *MTLSConfiguration) GetKey() *ConfigurationVariable { @@ -4024,7 +3978,7 @@ type GraphQLSubscriptionConfiguration struct { func (x *GraphQLSubscriptionConfiguration) Reset() { *x = GraphQLSubscriptionConfiguration{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[56] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[55] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4036,7 +3990,7 @@ func (x *GraphQLSubscriptionConfiguration) String() string { func (*GraphQLSubscriptionConfiguration) ProtoMessage() {} func (x *GraphQLSubscriptionConfiguration) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[56] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[55] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4049,7 +4003,7 @@ func (x *GraphQLSubscriptionConfiguration) ProtoReflect() protoreflect.Message { // Deprecated: Use GraphQLSubscriptionConfiguration.ProtoReflect.Descriptor instead. func (*GraphQLSubscriptionConfiguration) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{56} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{55} } func (x *GraphQLSubscriptionConfiguration) GetEnabled() bool { @@ -4097,7 +4051,7 @@ type GraphQLFederationConfiguration struct { func (x *GraphQLFederationConfiguration) Reset() { *x = GraphQLFederationConfiguration{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[57] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[56] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4109,7 +4063,7 @@ func (x *GraphQLFederationConfiguration) String() string { func (*GraphQLFederationConfiguration) ProtoMessage() {} func (x *GraphQLFederationConfiguration) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[57] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[56] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4122,7 +4076,7 @@ func (x *GraphQLFederationConfiguration) ProtoReflect() protoreflect.Message { // Deprecated: Use GraphQLFederationConfiguration.ProtoReflect.Descriptor instead. func (*GraphQLFederationConfiguration) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{57} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{56} } func (x *GraphQLFederationConfiguration) GetEnabled() bool { @@ -4149,7 +4103,7 @@ type InternedString struct { func (x *InternedString) Reset() { *x = InternedString{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[58] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[57] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4161,7 +4115,7 @@ func (x *InternedString) String() string { func (*InternedString) ProtoMessage() {} func (x *InternedString) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[58] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[57] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4174,7 +4128,7 @@ func (x *InternedString) ProtoReflect() protoreflect.Message { // Deprecated: Use InternedString.ProtoReflect.Descriptor instead. func (*InternedString) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{58} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{57} } func (x *InternedString) GetKey() string { @@ -4194,7 +4148,7 @@ type SingleTypeField struct { func (x *SingleTypeField) Reset() { *x = SingleTypeField{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[59] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[58] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4206,7 +4160,7 @@ func (x *SingleTypeField) String() string { func (*SingleTypeField) ProtoMessage() {} func (x *SingleTypeField) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[59] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[58] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4219,7 +4173,7 @@ func (x *SingleTypeField) ProtoReflect() protoreflect.Message { // Deprecated: Use SingleTypeField.ProtoReflect.Descriptor instead. func (*SingleTypeField) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{59} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{58} } func (x *SingleTypeField) GetTypeName() string { @@ -4246,7 +4200,7 @@ type SubscriptionFieldCondition struct { func (x *SubscriptionFieldCondition) Reset() { *x = SubscriptionFieldCondition{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[60] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[59] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4258,7 +4212,7 @@ func (x *SubscriptionFieldCondition) String() string { func (*SubscriptionFieldCondition) ProtoMessage() {} func (x *SubscriptionFieldCondition) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[60] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[59] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4271,7 +4225,7 @@ func (x *SubscriptionFieldCondition) ProtoReflect() protoreflect.Message { // Deprecated: Use SubscriptionFieldCondition.ProtoReflect.Descriptor instead. func (*SubscriptionFieldCondition) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{60} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{59} } func (x *SubscriptionFieldCondition) GetFieldPath() []string { @@ -4300,7 +4254,7 @@ type SubscriptionFilterCondition struct { func (x *SubscriptionFilterCondition) Reset() { *x = SubscriptionFilterCondition{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[61] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[60] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4312,7 +4266,7 @@ func (x *SubscriptionFilterCondition) String() string { func (*SubscriptionFilterCondition) ProtoMessage() {} func (x *SubscriptionFilterCondition) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[61] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[60] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4325,7 +4279,7 @@ func (x *SubscriptionFilterCondition) ProtoReflect() protoreflect.Message { // Deprecated: Use SubscriptionFilterCondition.ProtoReflect.Descriptor instead. func (*SubscriptionFilterCondition) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{61} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{60} } func (x *SubscriptionFilterCondition) GetAnd() []*SubscriptionFilterCondition { @@ -4365,7 +4319,7 @@ type CacheWarmerOperations struct { func (x *CacheWarmerOperations) Reset() { *x = CacheWarmerOperations{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[62] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[61] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4377,7 +4331,7 @@ func (x *CacheWarmerOperations) String() string { func (*CacheWarmerOperations) ProtoMessage() {} func (x *CacheWarmerOperations) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[62] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[61] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4390,7 +4344,7 @@ func (x *CacheWarmerOperations) ProtoReflect() protoreflect.Message { // Deprecated: Use CacheWarmerOperations.ProtoReflect.Descriptor instead. func (*CacheWarmerOperations) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{62} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{61} } func (x *CacheWarmerOperations) GetOperations() []*Operation { @@ -4410,7 +4364,7 @@ type Operation struct { func (x *Operation) Reset() { *x = Operation{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[63] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[62] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4422,7 +4376,7 @@ func (x *Operation) String() string { func (*Operation) ProtoMessage() {} func (x *Operation) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[63] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[62] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4435,7 +4389,7 @@ func (x *Operation) ProtoReflect() protoreflect.Message { // Deprecated: Use Operation.ProtoReflect.Descriptor instead. func (*Operation) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{63} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{62} } func (x *Operation) GetRequest() *OperationRequest { @@ -4463,7 +4417,7 @@ type OperationRequest struct { func (x *OperationRequest) Reset() { *x = OperationRequest{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[64] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[63] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4475,7 +4429,7 @@ func (x *OperationRequest) String() string { func (*OperationRequest) ProtoMessage() {} func (x *OperationRequest) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[64] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[63] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4488,7 +4442,7 @@ func (x *OperationRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use OperationRequest.ProtoReflect.Descriptor instead. func (*OperationRequest) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{64} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{63} } func (x *OperationRequest) GetOperationName() string { @@ -4521,7 +4475,7 @@ type Extension struct { func (x *Extension) Reset() { *x = Extension{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[65] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[64] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4533,7 +4487,7 @@ func (x *Extension) String() string { func (*Extension) ProtoMessage() {} func (x *Extension) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[65] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[64] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4546,7 +4500,7 @@ func (x *Extension) ProtoReflect() protoreflect.Message { // Deprecated: Use Extension.ProtoReflect.Descriptor instead. func (*Extension) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{65} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{64} } func (x *Extension) GetPersistedQuery() *PersistedQuery { @@ -4566,7 +4520,7 @@ type PersistedQuery struct { func (x *PersistedQuery) Reset() { *x = PersistedQuery{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[66] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[65] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4578,7 +4532,7 @@ func (x *PersistedQuery) String() string { func (*PersistedQuery) ProtoMessage() {} func (x *PersistedQuery) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[66] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[65] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4591,7 +4545,7 @@ func (x *PersistedQuery) ProtoReflect() protoreflect.Message { // Deprecated: Use PersistedQuery.ProtoReflect.Descriptor instead. func (*PersistedQuery) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{66} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{65} } func (x *PersistedQuery) GetSha256Hash() string { @@ -4618,7 +4572,7 @@ type ClientInfo struct { func (x *ClientInfo) Reset() { *x = ClientInfo{} - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[67] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[66] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4630,7 +4584,7 @@ func (x *ClientInfo) String() string { func (*ClientInfo) ProtoMessage() {} func (x *ClientInfo) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[67] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[66] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4643,7 +4597,7 @@ func (x *ClientInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use ClientInfo.ProtoReflect.Descriptor instead. func (*ClientInfo) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{67} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{66} } func (x *ClientInfo) GetName() string { @@ -4685,12 +4639,7 @@ const file_wg_cosmo_node_v1_node_proto_rawDesc = "" + "\tsubgraphs\x18\x03 \x03(\v2\x1a.wg.cosmo.node.v1.SubgraphR\tsubgraphs\x12j\n" + "\x14feature_flag_configs\x18\x04 \x01(\v23.wg.cosmo.node.v1.FeatureFlagRouterExecutionConfigsH\x00R\x12featureFlagConfigs\x88\x01\x01\x123\n" + "\x15compatibility_version\x18\x05 \x01(\tR\x14compatibilityVersionB\x17\n" + - "\x15_feature_flag_configs\"\xa5\x01\n" + - "\fActiveGraphs\x12T\n" + - "\fgraphConfigs\x18\x01 \x03(\v20.wg.cosmo.node.v1.ActiveGraphs.GraphConfigsEntryR\fgraphConfigs\x1a?\n" + - "\x11GraphConfigsEntry\x12\x10\n" + - "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + - "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\"j\n" + + "\x15_feature_flag_configs\"j\n" + "\bResponse\x123\n" + "\x04code\x18\x01 \x01(\x0e2\x1f.wg.cosmo.common.EnumStatusCodeR\x04code\x12\x1d\n" + "\adetails\x18\x02 \x01(\tH\x00R\adetails\x88\x01\x01B\n" + @@ -5081,7 +5030,7 @@ func file_wg_cosmo_node_v1_node_proto_rawDescGZIP() []byte { } var file_wg_cosmo_node_v1_node_proto_enumTypes = make([]protoimpl.EnumInfo, 8) -var file_wg_cosmo_node_v1_node_proto_msgTypes = make([]protoimpl.MessageInfo, 76) +var file_wg_cosmo_node_v1_node_proto_msgTypes = make([]protoimpl.MessageInfo, 74) var file_wg_cosmo_node_v1_node_proto_goTypes = []any{ (ArgumentRenderConfiguration)(0), // 0: wg.cosmo.node.v1.ArgumentRenderConfiguration (ArgumentSource)(0), // 1: wg.cosmo.node.v1.ArgumentSource @@ -5095,191 +5044,188 @@ var file_wg_cosmo_node_v1_node_proto_goTypes = []any{ (*FeatureFlagRouterExecutionConfigs)(nil), // 9: wg.cosmo.node.v1.FeatureFlagRouterExecutionConfigs (*FeatureFlagRouterExecutionConfig)(nil), // 10: wg.cosmo.node.v1.FeatureFlagRouterExecutionConfig (*RouterConfig)(nil), // 11: wg.cosmo.node.v1.RouterConfig - (*ActiveGraphs)(nil), // 12: wg.cosmo.node.v1.ActiveGraphs - (*Response)(nil), // 13: wg.cosmo.node.v1.Response - (*ResponseStatus)(nil), // 14: wg.cosmo.node.v1.ResponseStatus - (*RegistrationInfo)(nil), // 15: wg.cosmo.node.v1.RegistrationInfo - (*AccountLimits)(nil), // 16: wg.cosmo.node.v1.AccountLimits - (*SelfRegisterRequest)(nil), // 17: wg.cosmo.node.v1.SelfRegisterRequest - (*SelfRegisterResponse)(nil), // 18: wg.cosmo.node.v1.SelfRegisterResponse - (*EngineConfiguration)(nil), // 19: wg.cosmo.node.v1.EngineConfiguration - (*DataSourceConfiguration)(nil), // 20: wg.cosmo.node.v1.DataSourceConfiguration - (*CostConfiguration)(nil), // 21: wg.cosmo.node.v1.CostConfiguration - (*FieldWeightConfiguration)(nil), // 22: wg.cosmo.node.v1.FieldWeightConfiguration - (*FieldListSizeConfiguration)(nil), // 23: wg.cosmo.node.v1.FieldListSizeConfiguration - (*ArgumentConfiguration)(nil), // 24: wg.cosmo.node.v1.ArgumentConfiguration - (*Scopes)(nil), // 25: wg.cosmo.node.v1.Scopes - (*AuthorizationConfiguration)(nil), // 26: wg.cosmo.node.v1.AuthorizationConfiguration - (*FieldConfiguration)(nil), // 27: wg.cosmo.node.v1.FieldConfiguration - (*TypeConfiguration)(nil), // 28: wg.cosmo.node.v1.TypeConfiguration - (*TypeField)(nil), // 29: wg.cosmo.node.v1.TypeField - (*FieldCoordinates)(nil), // 30: wg.cosmo.node.v1.FieldCoordinates - (*FieldSetCondition)(nil), // 31: wg.cosmo.node.v1.FieldSetCondition - (*RequiredField)(nil), // 32: wg.cosmo.node.v1.RequiredField - (*EntityInterfaceConfiguration)(nil), // 33: wg.cosmo.node.v1.EntityInterfaceConfiguration - (*FetchConfiguration)(nil), // 34: wg.cosmo.node.v1.FetchConfiguration - (*StatusCodeTypeMapping)(nil), // 35: wg.cosmo.node.v1.StatusCodeTypeMapping - (*DataSourceCustom_GraphQL)(nil), // 36: wg.cosmo.node.v1.DataSourceCustom_GraphQL - (*GRPCConfiguration)(nil), // 37: wg.cosmo.node.v1.GRPCConfiguration - (*ImageReference)(nil), // 38: wg.cosmo.node.v1.ImageReference - (*PluginConfiguration)(nil), // 39: wg.cosmo.node.v1.PluginConfiguration - (*SSLConfiguration)(nil), // 40: wg.cosmo.node.v1.SSLConfiguration - (*GRPCMapping)(nil), // 41: wg.cosmo.node.v1.GRPCMapping - (*LookupMapping)(nil), // 42: wg.cosmo.node.v1.LookupMapping - (*LookupFieldMapping)(nil), // 43: wg.cosmo.node.v1.LookupFieldMapping - (*OperationMapping)(nil), // 44: wg.cosmo.node.v1.OperationMapping - (*EntityMapping)(nil), // 45: wg.cosmo.node.v1.EntityMapping - (*RequiredFieldMapping)(nil), // 46: wg.cosmo.node.v1.RequiredFieldMapping - (*TypeFieldMapping)(nil), // 47: wg.cosmo.node.v1.TypeFieldMapping - (*FieldMapping)(nil), // 48: wg.cosmo.node.v1.FieldMapping - (*ArgumentMapping)(nil), // 49: wg.cosmo.node.v1.ArgumentMapping - (*EnumMapping)(nil), // 50: wg.cosmo.node.v1.EnumMapping - (*EnumValueMapping)(nil), // 51: wg.cosmo.node.v1.EnumValueMapping - (*NatsStreamConfiguration)(nil), // 52: wg.cosmo.node.v1.NatsStreamConfiguration - (*NatsEventConfiguration)(nil), // 53: wg.cosmo.node.v1.NatsEventConfiguration - (*KafkaEventConfiguration)(nil), // 54: wg.cosmo.node.v1.KafkaEventConfiguration - (*RedisEventConfiguration)(nil), // 55: wg.cosmo.node.v1.RedisEventConfiguration - (*EngineEventConfiguration)(nil), // 56: wg.cosmo.node.v1.EngineEventConfiguration - (*DataSourceCustomEvents)(nil), // 57: wg.cosmo.node.v1.DataSourceCustomEvents - (*DataSourceCustom_Static)(nil), // 58: wg.cosmo.node.v1.DataSourceCustom_Static - (*ConfigurationVariable)(nil), // 59: wg.cosmo.node.v1.ConfigurationVariable - (*DirectiveConfiguration)(nil), // 60: wg.cosmo.node.v1.DirectiveConfiguration - (*URLQueryConfiguration)(nil), // 61: wg.cosmo.node.v1.URLQueryConfiguration - (*HTTPHeader)(nil), // 62: wg.cosmo.node.v1.HTTPHeader - (*MTLSConfiguration)(nil), // 63: wg.cosmo.node.v1.MTLSConfiguration - (*GraphQLSubscriptionConfiguration)(nil), // 64: wg.cosmo.node.v1.GraphQLSubscriptionConfiguration - (*GraphQLFederationConfiguration)(nil), // 65: wg.cosmo.node.v1.GraphQLFederationConfiguration - (*InternedString)(nil), // 66: wg.cosmo.node.v1.InternedString - (*SingleTypeField)(nil), // 67: wg.cosmo.node.v1.SingleTypeField - (*SubscriptionFieldCondition)(nil), // 68: wg.cosmo.node.v1.SubscriptionFieldCondition - (*SubscriptionFilterCondition)(nil), // 69: wg.cosmo.node.v1.SubscriptionFilterCondition - (*CacheWarmerOperations)(nil), // 70: wg.cosmo.node.v1.CacheWarmerOperations - (*Operation)(nil), // 71: wg.cosmo.node.v1.Operation - (*OperationRequest)(nil), // 72: wg.cosmo.node.v1.OperationRequest - (*Extension)(nil), // 73: wg.cosmo.node.v1.Extension - (*PersistedQuery)(nil), // 74: wg.cosmo.node.v1.PersistedQuery - (*ClientInfo)(nil), // 75: wg.cosmo.node.v1.ClientInfo - nil, // 76: wg.cosmo.node.v1.FeatureFlagRouterExecutionConfigs.ConfigByFeatureFlagNameEntry - nil, // 77: wg.cosmo.node.v1.ActiveGraphs.GraphConfigsEntry - nil, // 78: wg.cosmo.node.v1.EngineConfiguration.StringStorageEntry - nil, // 79: wg.cosmo.node.v1.CostConfiguration.TypeWeightsEntry - nil, // 80: wg.cosmo.node.v1.CostConfiguration.DirectiveArgumentWeightsEntry - nil, // 81: wg.cosmo.node.v1.FieldWeightConfiguration.ArgumentWeightsEntry - nil, // 82: wg.cosmo.node.v1.FieldWeightConfiguration.DirectiveArgumentWeightsEntry - nil, // 83: wg.cosmo.node.v1.FetchConfiguration.HeaderEntry - (common.EnumStatusCode)(0), // 84: wg.cosmo.common.EnumStatusCode - (common.GraphQLSubscriptionProtocol)(0), // 85: wg.cosmo.common.GraphQLSubscriptionProtocol - (common.GraphQLWebsocketSubprotocol)(0), // 86: wg.cosmo.common.GraphQLWebsocketSubprotocol + (*Response)(nil), // 12: wg.cosmo.node.v1.Response + (*ResponseStatus)(nil), // 13: wg.cosmo.node.v1.ResponseStatus + (*RegistrationInfo)(nil), // 14: wg.cosmo.node.v1.RegistrationInfo + (*AccountLimits)(nil), // 15: wg.cosmo.node.v1.AccountLimits + (*SelfRegisterRequest)(nil), // 16: wg.cosmo.node.v1.SelfRegisterRequest + (*SelfRegisterResponse)(nil), // 17: wg.cosmo.node.v1.SelfRegisterResponse + (*EngineConfiguration)(nil), // 18: wg.cosmo.node.v1.EngineConfiguration + (*DataSourceConfiguration)(nil), // 19: wg.cosmo.node.v1.DataSourceConfiguration + (*CostConfiguration)(nil), // 20: wg.cosmo.node.v1.CostConfiguration + (*FieldWeightConfiguration)(nil), // 21: wg.cosmo.node.v1.FieldWeightConfiguration + (*FieldListSizeConfiguration)(nil), // 22: wg.cosmo.node.v1.FieldListSizeConfiguration + (*ArgumentConfiguration)(nil), // 23: wg.cosmo.node.v1.ArgumentConfiguration + (*Scopes)(nil), // 24: wg.cosmo.node.v1.Scopes + (*AuthorizationConfiguration)(nil), // 25: wg.cosmo.node.v1.AuthorizationConfiguration + (*FieldConfiguration)(nil), // 26: wg.cosmo.node.v1.FieldConfiguration + (*TypeConfiguration)(nil), // 27: wg.cosmo.node.v1.TypeConfiguration + (*TypeField)(nil), // 28: wg.cosmo.node.v1.TypeField + (*FieldCoordinates)(nil), // 29: wg.cosmo.node.v1.FieldCoordinates + (*FieldSetCondition)(nil), // 30: wg.cosmo.node.v1.FieldSetCondition + (*RequiredField)(nil), // 31: wg.cosmo.node.v1.RequiredField + (*EntityInterfaceConfiguration)(nil), // 32: wg.cosmo.node.v1.EntityInterfaceConfiguration + (*FetchConfiguration)(nil), // 33: wg.cosmo.node.v1.FetchConfiguration + (*StatusCodeTypeMapping)(nil), // 34: wg.cosmo.node.v1.StatusCodeTypeMapping + (*DataSourceCustom_GraphQL)(nil), // 35: wg.cosmo.node.v1.DataSourceCustom_GraphQL + (*GRPCConfiguration)(nil), // 36: wg.cosmo.node.v1.GRPCConfiguration + (*ImageReference)(nil), // 37: wg.cosmo.node.v1.ImageReference + (*PluginConfiguration)(nil), // 38: wg.cosmo.node.v1.PluginConfiguration + (*SSLConfiguration)(nil), // 39: wg.cosmo.node.v1.SSLConfiguration + (*GRPCMapping)(nil), // 40: wg.cosmo.node.v1.GRPCMapping + (*LookupMapping)(nil), // 41: wg.cosmo.node.v1.LookupMapping + (*LookupFieldMapping)(nil), // 42: wg.cosmo.node.v1.LookupFieldMapping + (*OperationMapping)(nil), // 43: wg.cosmo.node.v1.OperationMapping + (*EntityMapping)(nil), // 44: wg.cosmo.node.v1.EntityMapping + (*RequiredFieldMapping)(nil), // 45: wg.cosmo.node.v1.RequiredFieldMapping + (*TypeFieldMapping)(nil), // 46: wg.cosmo.node.v1.TypeFieldMapping + (*FieldMapping)(nil), // 47: wg.cosmo.node.v1.FieldMapping + (*ArgumentMapping)(nil), // 48: wg.cosmo.node.v1.ArgumentMapping + (*EnumMapping)(nil), // 49: wg.cosmo.node.v1.EnumMapping + (*EnumValueMapping)(nil), // 50: wg.cosmo.node.v1.EnumValueMapping + (*NatsStreamConfiguration)(nil), // 51: wg.cosmo.node.v1.NatsStreamConfiguration + (*NatsEventConfiguration)(nil), // 52: wg.cosmo.node.v1.NatsEventConfiguration + (*KafkaEventConfiguration)(nil), // 53: wg.cosmo.node.v1.KafkaEventConfiguration + (*RedisEventConfiguration)(nil), // 54: wg.cosmo.node.v1.RedisEventConfiguration + (*EngineEventConfiguration)(nil), // 55: wg.cosmo.node.v1.EngineEventConfiguration + (*DataSourceCustomEvents)(nil), // 56: wg.cosmo.node.v1.DataSourceCustomEvents + (*DataSourceCustom_Static)(nil), // 57: wg.cosmo.node.v1.DataSourceCustom_Static + (*ConfigurationVariable)(nil), // 58: wg.cosmo.node.v1.ConfigurationVariable + (*DirectiveConfiguration)(nil), // 59: wg.cosmo.node.v1.DirectiveConfiguration + (*URLQueryConfiguration)(nil), // 60: wg.cosmo.node.v1.URLQueryConfiguration + (*HTTPHeader)(nil), // 61: wg.cosmo.node.v1.HTTPHeader + (*MTLSConfiguration)(nil), // 62: wg.cosmo.node.v1.MTLSConfiguration + (*GraphQLSubscriptionConfiguration)(nil), // 63: wg.cosmo.node.v1.GraphQLSubscriptionConfiguration + (*GraphQLFederationConfiguration)(nil), // 64: wg.cosmo.node.v1.GraphQLFederationConfiguration + (*InternedString)(nil), // 65: wg.cosmo.node.v1.InternedString + (*SingleTypeField)(nil), // 66: wg.cosmo.node.v1.SingleTypeField + (*SubscriptionFieldCondition)(nil), // 67: wg.cosmo.node.v1.SubscriptionFieldCondition + (*SubscriptionFilterCondition)(nil), // 68: wg.cosmo.node.v1.SubscriptionFilterCondition + (*CacheWarmerOperations)(nil), // 69: wg.cosmo.node.v1.CacheWarmerOperations + (*Operation)(nil), // 70: wg.cosmo.node.v1.Operation + (*OperationRequest)(nil), // 71: wg.cosmo.node.v1.OperationRequest + (*Extension)(nil), // 72: wg.cosmo.node.v1.Extension + (*PersistedQuery)(nil), // 73: wg.cosmo.node.v1.PersistedQuery + (*ClientInfo)(nil), // 74: wg.cosmo.node.v1.ClientInfo + nil, // 75: wg.cosmo.node.v1.FeatureFlagRouterExecutionConfigs.ConfigByFeatureFlagNameEntry + nil, // 76: wg.cosmo.node.v1.EngineConfiguration.StringStorageEntry + nil, // 77: wg.cosmo.node.v1.CostConfiguration.TypeWeightsEntry + nil, // 78: wg.cosmo.node.v1.CostConfiguration.DirectiveArgumentWeightsEntry + nil, // 79: wg.cosmo.node.v1.FieldWeightConfiguration.ArgumentWeightsEntry + nil, // 80: wg.cosmo.node.v1.FieldWeightConfiguration.DirectiveArgumentWeightsEntry + nil, // 81: wg.cosmo.node.v1.FetchConfiguration.HeaderEntry + (common.EnumStatusCode)(0), // 82: wg.cosmo.common.EnumStatusCode + (common.GraphQLSubscriptionProtocol)(0), // 83: wg.cosmo.common.GraphQLSubscriptionProtocol + (common.GraphQLWebsocketSubprotocol)(0), // 84: wg.cosmo.common.GraphQLWebsocketSubprotocol } var file_wg_cosmo_node_v1_node_proto_depIdxs = []int32{ - 76, // 0: wg.cosmo.node.v1.FeatureFlagRouterExecutionConfigs.config_by_feature_flag_name:type_name -> wg.cosmo.node.v1.FeatureFlagRouterExecutionConfigs.ConfigByFeatureFlagNameEntry - 19, // 1: wg.cosmo.node.v1.FeatureFlagRouterExecutionConfig.engine_config:type_name -> wg.cosmo.node.v1.EngineConfiguration + 75, // 0: wg.cosmo.node.v1.FeatureFlagRouterExecutionConfigs.config_by_feature_flag_name:type_name -> wg.cosmo.node.v1.FeatureFlagRouterExecutionConfigs.ConfigByFeatureFlagNameEntry + 18, // 1: wg.cosmo.node.v1.FeatureFlagRouterExecutionConfig.engine_config:type_name -> wg.cosmo.node.v1.EngineConfiguration 8, // 2: wg.cosmo.node.v1.FeatureFlagRouterExecutionConfig.subgraphs:type_name -> wg.cosmo.node.v1.Subgraph - 19, // 3: wg.cosmo.node.v1.RouterConfig.engine_config:type_name -> wg.cosmo.node.v1.EngineConfiguration + 18, // 3: wg.cosmo.node.v1.RouterConfig.engine_config:type_name -> wg.cosmo.node.v1.EngineConfiguration 8, // 4: wg.cosmo.node.v1.RouterConfig.subgraphs:type_name -> wg.cosmo.node.v1.Subgraph 9, // 5: wg.cosmo.node.v1.RouterConfig.feature_flag_configs:type_name -> wg.cosmo.node.v1.FeatureFlagRouterExecutionConfigs - 77, // 6: wg.cosmo.node.v1.ActiveGraphs.graphConfigs:type_name -> wg.cosmo.node.v1.ActiveGraphs.GraphConfigsEntry - 84, // 7: wg.cosmo.node.v1.Response.code:type_name -> wg.cosmo.common.EnumStatusCode - 16, // 8: wg.cosmo.node.v1.RegistrationInfo.account_limits:type_name -> wg.cosmo.node.v1.AccountLimits - 13, // 9: wg.cosmo.node.v1.SelfRegisterResponse.response:type_name -> wg.cosmo.node.v1.Response - 15, // 10: wg.cosmo.node.v1.SelfRegisterResponse.registrationInfo:type_name -> wg.cosmo.node.v1.RegistrationInfo - 20, // 11: wg.cosmo.node.v1.EngineConfiguration.datasource_configurations:type_name -> wg.cosmo.node.v1.DataSourceConfiguration - 27, // 12: wg.cosmo.node.v1.EngineConfiguration.field_configurations:type_name -> wg.cosmo.node.v1.FieldConfiguration - 28, // 13: wg.cosmo.node.v1.EngineConfiguration.type_configurations:type_name -> wg.cosmo.node.v1.TypeConfiguration - 78, // 14: wg.cosmo.node.v1.EngineConfiguration.string_storage:type_name -> wg.cosmo.node.v1.EngineConfiguration.StringStorageEntry - 2, // 15: wg.cosmo.node.v1.DataSourceConfiguration.kind:type_name -> wg.cosmo.node.v1.DataSourceKind - 29, // 16: wg.cosmo.node.v1.DataSourceConfiguration.root_nodes:type_name -> wg.cosmo.node.v1.TypeField - 29, // 17: wg.cosmo.node.v1.DataSourceConfiguration.child_nodes:type_name -> wg.cosmo.node.v1.TypeField - 36, // 18: wg.cosmo.node.v1.DataSourceConfiguration.custom_graphql:type_name -> wg.cosmo.node.v1.DataSourceCustom_GraphQL - 58, // 19: wg.cosmo.node.v1.DataSourceConfiguration.custom_static:type_name -> wg.cosmo.node.v1.DataSourceCustom_Static - 60, // 20: wg.cosmo.node.v1.DataSourceConfiguration.directives:type_name -> wg.cosmo.node.v1.DirectiveConfiguration - 32, // 21: wg.cosmo.node.v1.DataSourceConfiguration.keys:type_name -> wg.cosmo.node.v1.RequiredField - 32, // 22: wg.cosmo.node.v1.DataSourceConfiguration.provides:type_name -> wg.cosmo.node.v1.RequiredField - 32, // 23: wg.cosmo.node.v1.DataSourceConfiguration.requires:type_name -> wg.cosmo.node.v1.RequiredField - 57, // 24: wg.cosmo.node.v1.DataSourceConfiguration.custom_events:type_name -> wg.cosmo.node.v1.DataSourceCustomEvents - 33, // 25: wg.cosmo.node.v1.DataSourceConfiguration.entity_interfaces:type_name -> wg.cosmo.node.v1.EntityInterfaceConfiguration - 33, // 26: wg.cosmo.node.v1.DataSourceConfiguration.interface_objects:type_name -> wg.cosmo.node.v1.EntityInterfaceConfiguration - 21, // 27: wg.cosmo.node.v1.DataSourceConfiguration.cost_configuration:type_name -> wg.cosmo.node.v1.CostConfiguration - 22, // 28: wg.cosmo.node.v1.CostConfiguration.field_weights:type_name -> wg.cosmo.node.v1.FieldWeightConfiguration - 23, // 29: wg.cosmo.node.v1.CostConfiguration.list_sizes:type_name -> wg.cosmo.node.v1.FieldListSizeConfiguration - 79, // 30: wg.cosmo.node.v1.CostConfiguration.type_weights:type_name -> wg.cosmo.node.v1.CostConfiguration.TypeWeightsEntry - 80, // 31: wg.cosmo.node.v1.CostConfiguration.directive_argument_weights:type_name -> wg.cosmo.node.v1.CostConfiguration.DirectiveArgumentWeightsEntry - 81, // 32: wg.cosmo.node.v1.FieldWeightConfiguration.argument_weights:type_name -> wg.cosmo.node.v1.FieldWeightConfiguration.ArgumentWeightsEntry - 82, // 33: wg.cosmo.node.v1.FieldWeightConfiguration.directive_argument_weights:type_name -> wg.cosmo.node.v1.FieldWeightConfiguration.DirectiveArgumentWeightsEntry - 1, // 34: wg.cosmo.node.v1.ArgumentConfiguration.source_type:type_name -> wg.cosmo.node.v1.ArgumentSource - 25, // 35: wg.cosmo.node.v1.AuthorizationConfiguration.required_or_scopes:type_name -> wg.cosmo.node.v1.Scopes - 25, // 36: wg.cosmo.node.v1.AuthorizationConfiguration.required_or_scopes_by_or:type_name -> wg.cosmo.node.v1.Scopes - 24, // 37: wg.cosmo.node.v1.FieldConfiguration.arguments_configuration:type_name -> wg.cosmo.node.v1.ArgumentConfiguration - 26, // 38: wg.cosmo.node.v1.FieldConfiguration.authorization_configuration:type_name -> wg.cosmo.node.v1.AuthorizationConfiguration - 69, // 39: wg.cosmo.node.v1.FieldConfiguration.subscription_filter_condition:type_name -> wg.cosmo.node.v1.SubscriptionFilterCondition - 30, // 40: wg.cosmo.node.v1.FieldSetCondition.field_coordinates_path:type_name -> wg.cosmo.node.v1.FieldCoordinates - 31, // 41: wg.cosmo.node.v1.RequiredField.conditions:type_name -> wg.cosmo.node.v1.FieldSetCondition - 59, // 42: wg.cosmo.node.v1.FetchConfiguration.url:type_name -> wg.cosmo.node.v1.ConfigurationVariable - 7, // 43: wg.cosmo.node.v1.FetchConfiguration.method:type_name -> wg.cosmo.node.v1.HTTPMethod - 83, // 44: wg.cosmo.node.v1.FetchConfiguration.header:type_name -> wg.cosmo.node.v1.FetchConfiguration.HeaderEntry - 59, // 45: wg.cosmo.node.v1.FetchConfiguration.body:type_name -> wg.cosmo.node.v1.ConfigurationVariable - 61, // 46: wg.cosmo.node.v1.FetchConfiguration.query:type_name -> wg.cosmo.node.v1.URLQueryConfiguration - 63, // 47: wg.cosmo.node.v1.FetchConfiguration.mtls:type_name -> wg.cosmo.node.v1.MTLSConfiguration - 59, // 48: wg.cosmo.node.v1.FetchConfiguration.base_url:type_name -> wg.cosmo.node.v1.ConfigurationVariable - 59, // 49: wg.cosmo.node.v1.FetchConfiguration.path:type_name -> wg.cosmo.node.v1.ConfigurationVariable - 59, // 50: wg.cosmo.node.v1.FetchConfiguration.http_proxy_url:type_name -> wg.cosmo.node.v1.ConfigurationVariable - 34, // 51: wg.cosmo.node.v1.DataSourceCustom_GraphQL.fetch:type_name -> wg.cosmo.node.v1.FetchConfiguration - 64, // 52: wg.cosmo.node.v1.DataSourceCustom_GraphQL.subscription:type_name -> wg.cosmo.node.v1.GraphQLSubscriptionConfiguration - 65, // 53: wg.cosmo.node.v1.DataSourceCustom_GraphQL.federation:type_name -> wg.cosmo.node.v1.GraphQLFederationConfiguration - 66, // 54: wg.cosmo.node.v1.DataSourceCustom_GraphQL.upstream_schema:type_name -> wg.cosmo.node.v1.InternedString - 67, // 55: wg.cosmo.node.v1.DataSourceCustom_GraphQL.custom_scalar_type_fields:type_name -> wg.cosmo.node.v1.SingleTypeField - 37, // 56: wg.cosmo.node.v1.DataSourceCustom_GraphQL.grpc:type_name -> wg.cosmo.node.v1.GRPCConfiguration - 41, // 57: wg.cosmo.node.v1.GRPCConfiguration.mapping:type_name -> wg.cosmo.node.v1.GRPCMapping - 39, // 58: wg.cosmo.node.v1.GRPCConfiguration.plugin:type_name -> wg.cosmo.node.v1.PluginConfiguration - 38, // 59: wg.cosmo.node.v1.PluginConfiguration.image_reference:type_name -> wg.cosmo.node.v1.ImageReference - 44, // 60: wg.cosmo.node.v1.GRPCMapping.operation_mappings:type_name -> wg.cosmo.node.v1.OperationMapping - 45, // 61: wg.cosmo.node.v1.GRPCMapping.entity_mappings:type_name -> wg.cosmo.node.v1.EntityMapping - 47, // 62: wg.cosmo.node.v1.GRPCMapping.type_field_mappings:type_name -> wg.cosmo.node.v1.TypeFieldMapping - 50, // 63: wg.cosmo.node.v1.GRPCMapping.enum_mappings:type_name -> wg.cosmo.node.v1.EnumMapping - 42, // 64: wg.cosmo.node.v1.GRPCMapping.resolve_mappings:type_name -> wg.cosmo.node.v1.LookupMapping - 3, // 65: wg.cosmo.node.v1.LookupMapping.type:type_name -> wg.cosmo.node.v1.LookupType - 43, // 66: wg.cosmo.node.v1.LookupMapping.lookup_mapping:type_name -> wg.cosmo.node.v1.LookupFieldMapping - 48, // 67: wg.cosmo.node.v1.LookupFieldMapping.field_mapping:type_name -> wg.cosmo.node.v1.FieldMapping - 4, // 68: wg.cosmo.node.v1.OperationMapping.type:type_name -> wg.cosmo.node.v1.OperationType - 46, // 69: wg.cosmo.node.v1.EntityMapping.required_field_mappings:type_name -> wg.cosmo.node.v1.RequiredFieldMapping - 48, // 70: wg.cosmo.node.v1.RequiredFieldMapping.field_mapping:type_name -> wg.cosmo.node.v1.FieldMapping - 48, // 71: wg.cosmo.node.v1.TypeFieldMapping.field_mappings:type_name -> wg.cosmo.node.v1.FieldMapping - 49, // 72: wg.cosmo.node.v1.FieldMapping.argument_mappings:type_name -> wg.cosmo.node.v1.ArgumentMapping - 51, // 73: wg.cosmo.node.v1.EnumMapping.values:type_name -> wg.cosmo.node.v1.EnumValueMapping - 56, // 74: wg.cosmo.node.v1.NatsEventConfiguration.engine_event_configuration:type_name -> wg.cosmo.node.v1.EngineEventConfiguration - 52, // 75: wg.cosmo.node.v1.NatsEventConfiguration.stream_configuration:type_name -> wg.cosmo.node.v1.NatsStreamConfiguration - 56, // 76: wg.cosmo.node.v1.KafkaEventConfiguration.engine_event_configuration:type_name -> wg.cosmo.node.v1.EngineEventConfiguration - 56, // 77: wg.cosmo.node.v1.RedisEventConfiguration.engine_event_configuration:type_name -> wg.cosmo.node.v1.EngineEventConfiguration - 5, // 78: wg.cosmo.node.v1.EngineEventConfiguration.type:type_name -> wg.cosmo.node.v1.EventType - 53, // 79: wg.cosmo.node.v1.DataSourceCustomEvents.nats:type_name -> wg.cosmo.node.v1.NatsEventConfiguration - 54, // 80: wg.cosmo.node.v1.DataSourceCustomEvents.kafka:type_name -> wg.cosmo.node.v1.KafkaEventConfiguration - 55, // 81: wg.cosmo.node.v1.DataSourceCustomEvents.redis:type_name -> wg.cosmo.node.v1.RedisEventConfiguration - 59, // 82: wg.cosmo.node.v1.DataSourceCustom_Static.data:type_name -> wg.cosmo.node.v1.ConfigurationVariable - 6, // 83: wg.cosmo.node.v1.ConfigurationVariable.kind:type_name -> wg.cosmo.node.v1.ConfigurationVariableKind - 59, // 84: wg.cosmo.node.v1.HTTPHeader.values:type_name -> wg.cosmo.node.v1.ConfigurationVariable - 59, // 85: wg.cosmo.node.v1.MTLSConfiguration.key:type_name -> wg.cosmo.node.v1.ConfigurationVariable - 59, // 86: wg.cosmo.node.v1.MTLSConfiguration.cert:type_name -> wg.cosmo.node.v1.ConfigurationVariable - 59, // 87: wg.cosmo.node.v1.GraphQLSubscriptionConfiguration.url:type_name -> wg.cosmo.node.v1.ConfigurationVariable - 85, // 88: wg.cosmo.node.v1.GraphQLSubscriptionConfiguration.protocol:type_name -> wg.cosmo.common.GraphQLSubscriptionProtocol - 86, // 89: wg.cosmo.node.v1.GraphQLSubscriptionConfiguration.websocketSubprotocol:type_name -> wg.cosmo.common.GraphQLWebsocketSubprotocol - 69, // 90: wg.cosmo.node.v1.SubscriptionFilterCondition.and:type_name -> wg.cosmo.node.v1.SubscriptionFilterCondition - 68, // 91: wg.cosmo.node.v1.SubscriptionFilterCondition.in:type_name -> wg.cosmo.node.v1.SubscriptionFieldCondition - 69, // 92: wg.cosmo.node.v1.SubscriptionFilterCondition.not:type_name -> wg.cosmo.node.v1.SubscriptionFilterCondition - 69, // 93: wg.cosmo.node.v1.SubscriptionFilterCondition.or:type_name -> wg.cosmo.node.v1.SubscriptionFilterCondition - 71, // 94: wg.cosmo.node.v1.CacheWarmerOperations.operations:type_name -> wg.cosmo.node.v1.Operation - 72, // 95: wg.cosmo.node.v1.Operation.request:type_name -> wg.cosmo.node.v1.OperationRequest - 75, // 96: wg.cosmo.node.v1.Operation.client:type_name -> wg.cosmo.node.v1.ClientInfo - 73, // 97: wg.cosmo.node.v1.OperationRequest.extensions:type_name -> wg.cosmo.node.v1.Extension - 74, // 98: wg.cosmo.node.v1.Extension.persisted_query:type_name -> wg.cosmo.node.v1.PersistedQuery - 10, // 99: wg.cosmo.node.v1.FeatureFlagRouterExecutionConfigs.ConfigByFeatureFlagNameEntry.value:type_name -> wg.cosmo.node.v1.FeatureFlagRouterExecutionConfig - 62, // 100: wg.cosmo.node.v1.FetchConfiguration.HeaderEntry.value:type_name -> wg.cosmo.node.v1.HTTPHeader - 17, // 101: wg.cosmo.node.v1.NodeService.SelfRegister:input_type -> wg.cosmo.node.v1.SelfRegisterRequest - 18, // 102: wg.cosmo.node.v1.NodeService.SelfRegister:output_type -> wg.cosmo.node.v1.SelfRegisterResponse - 102, // [102:103] is the sub-list for method output_type - 101, // [101:102] is the sub-list for method input_type - 101, // [101:101] is the sub-list for extension type_name - 101, // [101:101] is the sub-list for extension extendee - 0, // [0:101] is the sub-list for field type_name + 82, // 6: wg.cosmo.node.v1.Response.code:type_name -> wg.cosmo.common.EnumStatusCode + 15, // 7: wg.cosmo.node.v1.RegistrationInfo.account_limits:type_name -> wg.cosmo.node.v1.AccountLimits + 12, // 8: wg.cosmo.node.v1.SelfRegisterResponse.response:type_name -> wg.cosmo.node.v1.Response + 14, // 9: wg.cosmo.node.v1.SelfRegisterResponse.registrationInfo:type_name -> wg.cosmo.node.v1.RegistrationInfo + 19, // 10: wg.cosmo.node.v1.EngineConfiguration.datasource_configurations:type_name -> wg.cosmo.node.v1.DataSourceConfiguration + 26, // 11: wg.cosmo.node.v1.EngineConfiguration.field_configurations:type_name -> wg.cosmo.node.v1.FieldConfiguration + 27, // 12: wg.cosmo.node.v1.EngineConfiguration.type_configurations:type_name -> wg.cosmo.node.v1.TypeConfiguration + 76, // 13: wg.cosmo.node.v1.EngineConfiguration.string_storage:type_name -> wg.cosmo.node.v1.EngineConfiguration.StringStorageEntry + 2, // 14: wg.cosmo.node.v1.DataSourceConfiguration.kind:type_name -> wg.cosmo.node.v1.DataSourceKind + 28, // 15: wg.cosmo.node.v1.DataSourceConfiguration.root_nodes:type_name -> wg.cosmo.node.v1.TypeField + 28, // 16: wg.cosmo.node.v1.DataSourceConfiguration.child_nodes:type_name -> wg.cosmo.node.v1.TypeField + 35, // 17: wg.cosmo.node.v1.DataSourceConfiguration.custom_graphql:type_name -> wg.cosmo.node.v1.DataSourceCustom_GraphQL + 57, // 18: wg.cosmo.node.v1.DataSourceConfiguration.custom_static:type_name -> wg.cosmo.node.v1.DataSourceCustom_Static + 59, // 19: wg.cosmo.node.v1.DataSourceConfiguration.directives:type_name -> wg.cosmo.node.v1.DirectiveConfiguration + 31, // 20: wg.cosmo.node.v1.DataSourceConfiguration.keys:type_name -> wg.cosmo.node.v1.RequiredField + 31, // 21: wg.cosmo.node.v1.DataSourceConfiguration.provides:type_name -> wg.cosmo.node.v1.RequiredField + 31, // 22: wg.cosmo.node.v1.DataSourceConfiguration.requires:type_name -> wg.cosmo.node.v1.RequiredField + 56, // 23: wg.cosmo.node.v1.DataSourceConfiguration.custom_events:type_name -> wg.cosmo.node.v1.DataSourceCustomEvents + 32, // 24: wg.cosmo.node.v1.DataSourceConfiguration.entity_interfaces:type_name -> wg.cosmo.node.v1.EntityInterfaceConfiguration + 32, // 25: wg.cosmo.node.v1.DataSourceConfiguration.interface_objects:type_name -> wg.cosmo.node.v1.EntityInterfaceConfiguration + 20, // 26: wg.cosmo.node.v1.DataSourceConfiguration.cost_configuration:type_name -> wg.cosmo.node.v1.CostConfiguration + 21, // 27: wg.cosmo.node.v1.CostConfiguration.field_weights:type_name -> wg.cosmo.node.v1.FieldWeightConfiguration + 22, // 28: wg.cosmo.node.v1.CostConfiguration.list_sizes:type_name -> wg.cosmo.node.v1.FieldListSizeConfiguration + 77, // 29: wg.cosmo.node.v1.CostConfiguration.type_weights:type_name -> wg.cosmo.node.v1.CostConfiguration.TypeWeightsEntry + 78, // 30: wg.cosmo.node.v1.CostConfiguration.directive_argument_weights:type_name -> wg.cosmo.node.v1.CostConfiguration.DirectiveArgumentWeightsEntry + 79, // 31: wg.cosmo.node.v1.FieldWeightConfiguration.argument_weights:type_name -> wg.cosmo.node.v1.FieldWeightConfiguration.ArgumentWeightsEntry + 80, // 32: wg.cosmo.node.v1.FieldWeightConfiguration.directive_argument_weights:type_name -> wg.cosmo.node.v1.FieldWeightConfiguration.DirectiveArgumentWeightsEntry + 1, // 33: wg.cosmo.node.v1.ArgumentConfiguration.source_type:type_name -> wg.cosmo.node.v1.ArgumentSource + 24, // 34: wg.cosmo.node.v1.AuthorizationConfiguration.required_or_scopes:type_name -> wg.cosmo.node.v1.Scopes + 24, // 35: wg.cosmo.node.v1.AuthorizationConfiguration.required_or_scopes_by_or:type_name -> wg.cosmo.node.v1.Scopes + 23, // 36: wg.cosmo.node.v1.FieldConfiguration.arguments_configuration:type_name -> wg.cosmo.node.v1.ArgumentConfiguration + 25, // 37: wg.cosmo.node.v1.FieldConfiguration.authorization_configuration:type_name -> wg.cosmo.node.v1.AuthorizationConfiguration + 68, // 38: wg.cosmo.node.v1.FieldConfiguration.subscription_filter_condition:type_name -> wg.cosmo.node.v1.SubscriptionFilterCondition + 29, // 39: wg.cosmo.node.v1.FieldSetCondition.field_coordinates_path:type_name -> wg.cosmo.node.v1.FieldCoordinates + 30, // 40: wg.cosmo.node.v1.RequiredField.conditions:type_name -> wg.cosmo.node.v1.FieldSetCondition + 58, // 41: wg.cosmo.node.v1.FetchConfiguration.url:type_name -> wg.cosmo.node.v1.ConfigurationVariable + 7, // 42: wg.cosmo.node.v1.FetchConfiguration.method:type_name -> wg.cosmo.node.v1.HTTPMethod + 81, // 43: wg.cosmo.node.v1.FetchConfiguration.header:type_name -> wg.cosmo.node.v1.FetchConfiguration.HeaderEntry + 58, // 44: wg.cosmo.node.v1.FetchConfiguration.body:type_name -> wg.cosmo.node.v1.ConfigurationVariable + 60, // 45: wg.cosmo.node.v1.FetchConfiguration.query:type_name -> wg.cosmo.node.v1.URLQueryConfiguration + 62, // 46: wg.cosmo.node.v1.FetchConfiguration.mtls:type_name -> wg.cosmo.node.v1.MTLSConfiguration + 58, // 47: wg.cosmo.node.v1.FetchConfiguration.base_url:type_name -> wg.cosmo.node.v1.ConfigurationVariable + 58, // 48: wg.cosmo.node.v1.FetchConfiguration.path:type_name -> wg.cosmo.node.v1.ConfigurationVariable + 58, // 49: wg.cosmo.node.v1.FetchConfiguration.http_proxy_url:type_name -> wg.cosmo.node.v1.ConfigurationVariable + 33, // 50: wg.cosmo.node.v1.DataSourceCustom_GraphQL.fetch:type_name -> wg.cosmo.node.v1.FetchConfiguration + 63, // 51: wg.cosmo.node.v1.DataSourceCustom_GraphQL.subscription:type_name -> wg.cosmo.node.v1.GraphQLSubscriptionConfiguration + 64, // 52: wg.cosmo.node.v1.DataSourceCustom_GraphQL.federation:type_name -> wg.cosmo.node.v1.GraphQLFederationConfiguration + 65, // 53: wg.cosmo.node.v1.DataSourceCustom_GraphQL.upstream_schema:type_name -> wg.cosmo.node.v1.InternedString + 66, // 54: wg.cosmo.node.v1.DataSourceCustom_GraphQL.custom_scalar_type_fields:type_name -> wg.cosmo.node.v1.SingleTypeField + 36, // 55: wg.cosmo.node.v1.DataSourceCustom_GraphQL.grpc:type_name -> wg.cosmo.node.v1.GRPCConfiguration + 40, // 56: wg.cosmo.node.v1.GRPCConfiguration.mapping:type_name -> wg.cosmo.node.v1.GRPCMapping + 38, // 57: wg.cosmo.node.v1.GRPCConfiguration.plugin:type_name -> wg.cosmo.node.v1.PluginConfiguration + 37, // 58: wg.cosmo.node.v1.PluginConfiguration.image_reference:type_name -> wg.cosmo.node.v1.ImageReference + 43, // 59: wg.cosmo.node.v1.GRPCMapping.operation_mappings:type_name -> wg.cosmo.node.v1.OperationMapping + 44, // 60: wg.cosmo.node.v1.GRPCMapping.entity_mappings:type_name -> wg.cosmo.node.v1.EntityMapping + 46, // 61: wg.cosmo.node.v1.GRPCMapping.type_field_mappings:type_name -> wg.cosmo.node.v1.TypeFieldMapping + 49, // 62: wg.cosmo.node.v1.GRPCMapping.enum_mappings:type_name -> wg.cosmo.node.v1.EnumMapping + 41, // 63: wg.cosmo.node.v1.GRPCMapping.resolve_mappings:type_name -> wg.cosmo.node.v1.LookupMapping + 3, // 64: wg.cosmo.node.v1.LookupMapping.type:type_name -> wg.cosmo.node.v1.LookupType + 42, // 65: wg.cosmo.node.v1.LookupMapping.lookup_mapping:type_name -> wg.cosmo.node.v1.LookupFieldMapping + 47, // 66: wg.cosmo.node.v1.LookupFieldMapping.field_mapping:type_name -> wg.cosmo.node.v1.FieldMapping + 4, // 67: wg.cosmo.node.v1.OperationMapping.type:type_name -> wg.cosmo.node.v1.OperationType + 45, // 68: wg.cosmo.node.v1.EntityMapping.required_field_mappings:type_name -> wg.cosmo.node.v1.RequiredFieldMapping + 47, // 69: wg.cosmo.node.v1.RequiredFieldMapping.field_mapping:type_name -> wg.cosmo.node.v1.FieldMapping + 47, // 70: wg.cosmo.node.v1.TypeFieldMapping.field_mappings:type_name -> wg.cosmo.node.v1.FieldMapping + 48, // 71: wg.cosmo.node.v1.FieldMapping.argument_mappings:type_name -> wg.cosmo.node.v1.ArgumentMapping + 50, // 72: wg.cosmo.node.v1.EnumMapping.values:type_name -> wg.cosmo.node.v1.EnumValueMapping + 55, // 73: wg.cosmo.node.v1.NatsEventConfiguration.engine_event_configuration:type_name -> wg.cosmo.node.v1.EngineEventConfiguration + 51, // 74: wg.cosmo.node.v1.NatsEventConfiguration.stream_configuration:type_name -> wg.cosmo.node.v1.NatsStreamConfiguration + 55, // 75: wg.cosmo.node.v1.KafkaEventConfiguration.engine_event_configuration:type_name -> wg.cosmo.node.v1.EngineEventConfiguration + 55, // 76: wg.cosmo.node.v1.RedisEventConfiguration.engine_event_configuration:type_name -> wg.cosmo.node.v1.EngineEventConfiguration + 5, // 77: wg.cosmo.node.v1.EngineEventConfiguration.type:type_name -> wg.cosmo.node.v1.EventType + 52, // 78: wg.cosmo.node.v1.DataSourceCustomEvents.nats:type_name -> wg.cosmo.node.v1.NatsEventConfiguration + 53, // 79: wg.cosmo.node.v1.DataSourceCustomEvents.kafka:type_name -> wg.cosmo.node.v1.KafkaEventConfiguration + 54, // 80: wg.cosmo.node.v1.DataSourceCustomEvents.redis:type_name -> wg.cosmo.node.v1.RedisEventConfiguration + 58, // 81: wg.cosmo.node.v1.DataSourceCustom_Static.data:type_name -> wg.cosmo.node.v1.ConfigurationVariable + 6, // 82: wg.cosmo.node.v1.ConfigurationVariable.kind:type_name -> wg.cosmo.node.v1.ConfigurationVariableKind + 58, // 83: wg.cosmo.node.v1.HTTPHeader.values:type_name -> wg.cosmo.node.v1.ConfigurationVariable + 58, // 84: wg.cosmo.node.v1.MTLSConfiguration.key:type_name -> wg.cosmo.node.v1.ConfigurationVariable + 58, // 85: wg.cosmo.node.v1.MTLSConfiguration.cert:type_name -> wg.cosmo.node.v1.ConfigurationVariable + 58, // 86: wg.cosmo.node.v1.GraphQLSubscriptionConfiguration.url:type_name -> wg.cosmo.node.v1.ConfigurationVariable + 83, // 87: wg.cosmo.node.v1.GraphQLSubscriptionConfiguration.protocol:type_name -> wg.cosmo.common.GraphQLSubscriptionProtocol + 84, // 88: wg.cosmo.node.v1.GraphQLSubscriptionConfiguration.websocketSubprotocol:type_name -> wg.cosmo.common.GraphQLWebsocketSubprotocol + 68, // 89: wg.cosmo.node.v1.SubscriptionFilterCondition.and:type_name -> wg.cosmo.node.v1.SubscriptionFilterCondition + 67, // 90: wg.cosmo.node.v1.SubscriptionFilterCondition.in:type_name -> wg.cosmo.node.v1.SubscriptionFieldCondition + 68, // 91: wg.cosmo.node.v1.SubscriptionFilterCondition.not:type_name -> wg.cosmo.node.v1.SubscriptionFilterCondition + 68, // 92: wg.cosmo.node.v1.SubscriptionFilterCondition.or:type_name -> wg.cosmo.node.v1.SubscriptionFilterCondition + 70, // 93: wg.cosmo.node.v1.CacheWarmerOperations.operations:type_name -> wg.cosmo.node.v1.Operation + 71, // 94: wg.cosmo.node.v1.Operation.request:type_name -> wg.cosmo.node.v1.OperationRequest + 74, // 95: wg.cosmo.node.v1.Operation.client:type_name -> wg.cosmo.node.v1.ClientInfo + 72, // 96: wg.cosmo.node.v1.OperationRequest.extensions:type_name -> wg.cosmo.node.v1.Extension + 73, // 97: wg.cosmo.node.v1.Extension.persisted_query:type_name -> wg.cosmo.node.v1.PersistedQuery + 10, // 98: wg.cosmo.node.v1.FeatureFlagRouterExecutionConfigs.ConfigByFeatureFlagNameEntry.value:type_name -> wg.cosmo.node.v1.FeatureFlagRouterExecutionConfig + 61, // 99: wg.cosmo.node.v1.FetchConfiguration.HeaderEntry.value:type_name -> wg.cosmo.node.v1.HTTPHeader + 16, // 100: wg.cosmo.node.v1.NodeService.SelfRegister:input_type -> wg.cosmo.node.v1.SelfRegisterRequest + 17, // 101: wg.cosmo.node.v1.NodeService.SelfRegister:output_type -> wg.cosmo.node.v1.SelfRegisterResponse + 101, // [101:102] is the sub-list for method output_type + 100, // [100:101] is the sub-list for method input_type + 100, // [100:100] is the sub-list for extension type_name + 100, // [100:100] is the sub-list for extension extendee + 0, // [0:100] is the sub-list for field type_name } func init() { file_wg_cosmo_node_v1_node_proto_init() } @@ -5288,23 +5234,23 @@ func file_wg_cosmo_node_v1_node_proto_init() { return } file_wg_cosmo_node_v1_node_proto_msgTypes[3].OneofWrappers = []any{} - file_wg_cosmo_node_v1_node_proto_msgTypes[5].OneofWrappers = []any{} + file_wg_cosmo_node_v1_node_proto_msgTypes[4].OneofWrappers = []any{} + file_wg_cosmo_node_v1_node_proto_msgTypes[9].OneofWrappers = []any{} file_wg_cosmo_node_v1_node_proto_msgTypes[10].OneofWrappers = []any{} - file_wg_cosmo_node_v1_node_proto_msgTypes[11].OneofWrappers = []any{} + file_wg_cosmo_node_v1_node_proto_msgTypes[13].OneofWrappers = []any{} file_wg_cosmo_node_v1_node_proto_msgTypes[14].OneofWrappers = []any{} - file_wg_cosmo_node_v1_node_proto_msgTypes[15].OneofWrappers = []any{} - file_wg_cosmo_node_v1_node_proto_msgTypes[19].OneofWrappers = []any{} - file_wg_cosmo_node_v1_node_proto_msgTypes[26].OneofWrappers = []any{} - file_wg_cosmo_node_v1_node_proto_msgTypes[31].OneofWrappers = []any{} - file_wg_cosmo_node_v1_node_proto_msgTypes[56].OneofWrappers = []any{} - file_wg_cosmo_node_v1_node_proto_msgTypes[61].OneofWrappers = []any{} + file_wg_cosmo_node_v1_node_proto_msgTypes[18].OneofWrappers = []any{} + file_wg_cosmo_node_v1_node_proto_msgTypes[25].OneofWrappers = []any{} + file_wg_cosmo_node_v1_node_proto_msgTypes[30].OneofWrappers = []any{} + file_wg_cosmo_node_v1_node_proto_msgTypes[55].OneofWrappers = []any{} + file_wg_cosmo_node_v1_node_proto_msgTypes[60].OneofWrappers = []any{} type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: unsafe.Slice(unsafe.StringData(file_wg_cosmo_node_v1_node_proto_rawDesc), len(file_wg_cosmo_node_v1_node_proto_rawDesc)), NumEnums: 8, - NumMessages: 76, + NumMessages: 74, NumExtensions: 0, NumServices: 1, }, diff --git a/router/pkg/controlplane/configpoller/split_config_poller.go b/router/pkg/controlplane/configpoller/split_config_poller.go index 2cd3a72c94..855a4b44e2 100644 --- a/router/pkg/controlplane/configpoller/split_config_poller.go +++ b/router/pkg/controlplane/configpoller/split_config_poller.go @@ -18,7 +18,8 @@ import ( // SplitConfigFetcher fetches individual graph configs from CDN using the split-config strategy. type SplitConfigFetcher interface { // FetchMapper fetches the mapper file listing all active graphs and their hashes. - FetchMapper(ctx context.Context) (*nodev1.ActiveGraphs, error) + // The returned has the flags name as key, and it's hash as value. + FetchMapper(ctx context.Context) (map[string]string, error) // FetchConfig fetches the router config for the given feature flag name. // featureFlagName="" fetches the base graph (manifest/latest.json). // featureFlagName="X" fetches the feature flag config (manifest/feature-flags/X.json). @@ -88,7 +89,7 @@ func computeCompositeVersion(graphConfigs map[string]string) string { } // fetchAndAssembleAll fetches every config listed in activeGraphs and assembles a full RouterConfig. -func (p *splitConfigPoller) fetchAndAssembleAll(ctx context.Context, activeGraphs *nodev1.ActiveGraphs) (*nodev1.RouterConfig, error) { +func (p *splitConfigPoller) fetchAndAssembleAll(ctx context.Context, activeGraphs map[string]string) (*nodev1.RouterConfig, error) { // Fetch base graph. baseConfig, err := p.fetcher.FetchConfig(ctx, "") if err != nil { @@ -103,7 +104,7 @@ func (p *splitConfigPoller) fetchAndAssembleAll(ctx context.Context, activeGraph } // Fetch feature flag configs. - for name := range activeGraphs.GetGraphConfigs() { + for name := range activeGraphs { if name == "" { continue // base graph already handled above } @@ -132,10 +133,8 @@ func (p *splitConfigPoller) GetRouterConfig(ctx context.Context) (*routerconfig. if err != nil { return nil, fmt.Errorf("failed to fetch mapper: %w", err) } - - graphConfigs := activeGraphs.GetGraphConfigs() - if len(graphConfigs) == 0 { - return nil, fmt.Errorf("mapper returned empty graph configs") + if len(activeGraphs) == 0 { + return nil, fmt.Errorf("empty graph configs") } config, err := p.fetchAndAssembleAll(ctx, activeGraphs) @@ -143,9 +142,9 @@ func (p *splitConfigPoller) GetRouterConfig(ctx context.Context) (*routerconfig. return nil, err } - p.knownHashes = graphConfigs + p.knownHashes = activeGraphs p.currentConfig = config - p.latestVersion = computeCompositeVersion(graphConfigs) + p.latestVersion = computeCompositeVersion(activeGraphs) response := &routerconfig.Response{ Config: config, @@ -166,18 +165,12 @@ func (p *splitConfigPoller) Subscribe(ctx context.Context, handler func(response return } - graphConfigs := activeGraphs.GetGraphConfigs() - if len(graphConfigs) == 0 { - p.logger.Warn("Mapper returned empty graph configs, keeping existing config") - return - } - - if _, ok := graphConfigs[""]; !ok { + if _, ok := activeGraphs[""]; !ok { p.logger.Warn("Mapper missing base graph entry, keeping existing config") return } - newVersion := computeCompositeVersion(graphConfigs) + newVersion := computeCompositeVersion(activeGraphs) if newVersion == p.latestVersion { p.logger.Debug("No changes detected in engine config, keeping existing config") return @@ -196,7 +189,7 @@ func (p *splitConfigPoller) Subscribe(ctx context.Context, handler func(response ChangedConfigs: make(map[string]struct{}), } - for name, hash := range graphConfigs { + for name, hash := range activeGraphs { if oldHash, exists := p.knownHashes[name]; !exists { changes.AddedConfigs[name] = struct{}{} } else if oldHash != hash { @@ -204,7 +197,7 @@ func (p *splitConfigPoller) Subscribe(ctx context.Context, handler func(response } } for name := range p.knownHashes { - if _, exists := graphConfigs[name]; !exists { + if _, exists := activeGraphs[name]; !exists { changes.RemovedConfigs[name] = struct{}{} } } @@ -278,7 +271,7 @@ func (p *splitConfigPoller) Subscribe(ctx context.Context, handler func(response // Only update internal state after the handler succeeds, // i.e. the newly created engine config is actually used by the graph server. - p.knownHashes = graphConfigs + p.knownHashes = activeGraphs p.currentConfig = patched p.latestVersion = newVersion }) diff --git a/router/pkg/controlplane/configpoller/split_config_poller_test.go b/router/pkg/controlplane/configpoller/split_config_poller_test.go index 620f09fb87..9edd766921 100644 --- a/router/pkg/controlplane/configpoller/split_config_poller_test.go +++ b/router/pkg/controlplane/configpoller/split_config_poller_test.go @@ -15,7 +15,7 @@ import ( // mockSplitFetcher is a controllable implementation of SplitConfigFetcher for tests. type mockSplitFetcher struct { - mapperResult *nodev1.ActiveGraphs + mapperResult map[string]string mapperErr error // configResults maps feature flag name -> result (use "" for base graph) configResults map[string]*nodev1.RouterConfig @@ -25,7 +25,7 @@ type mockSplitFetcher struct { fetchMapperCalls int } -func (m *mockSplitFetcher) FetchMapper(_ context.Context) (*nodev1.ActiveGraphs, error) { +func (m *mockSplitFetcher) FetchMapper(_ context.Context) (map[string]string, error) { m.fetchMapperCalls++ return m.mapperResult, m.mapperErr } @@ -51,10 +51,6 @@ func makeRouterConfig(version string) *nodev1.RouterConfig { } } -func makeActiveGraphs(entries map[string]string) *nodev1.ActiveGraphs { - return &nodev1.ActiveGraphs{GraphConfigs: entries} -} - // newTestPoller builds a splitConfigPoller wired to the given mock fetcher. // The polling interval is set long enough that Subscribe won't fire automatically in tests. func newTestPoller(fetcher SplitConfigFetcher) *splitConfigPoller { @@ -73,7 +69,7 @@ func newTestPoller(fetcher SplitConfigFetcher) *splitConfigPoller { func TestSplitGetRouterConfig_BaseOnly(t *testing.T) { baseCfg := makeRouterConfig("v1") mock := &mockSplitFetcher{ - mapperResult: makeActiveGraphs(map[string]string{"": "hash-base"}), + mapperResult: map[string]string{"": "hash-base"}, configResults: map[string]*nodev1.RouterConfig{"": baseCfg}, } @@ -92,10 +88,10 @@ func TestSplitGetRouterConfig_WithFeatureFlags(t *testing.T) { baseCfg := makeRouterConfig("v1") ffCfg := makeRouterConfig("ff-v1") mock := &mockSplitFetcher{ - mapperResult: makeActiveGraphs(map[string]string{ + mapperResult: map[string]string{ "": "hash-base", "ff1": "hash-ff1", - }), + }, configResults: map[string]*nodev1.RouterConfig{ "": baseCfg, "ff1": ffCfg, @@ -128,7 +124,7 @@ func TestSplitGetRouterConfig_MapperError(t *testing.T) { func TestSplitGetRouterConfig_EmptyMapper(t *testing.T) { mock := &mockSplitFetcher{ - mapperResult: makeActiveGraphs(map[string]string{}), + mapperResult: map[string]string{}, } p := newTestPoller(mock) _, err := p.GetRouterConfig(context.Background()) @@ -138,7 +134,7 @@ func TestSplitGetRouterConfig_EmptyMapper(t *testing.T) { func TestSplitGetRouterConfig_ConfigFetchError(t *testing.T) { mock := &mockSplitFetcher{ - mapperResult: makeActiveGraphs(map[string]string{"": "hash-base"}), + mapperResult: map[string]string{"": "hash-base"}, configErrors: map[string]error{"": errors.New("CDN unavailable")}, } p := newTestPoller(mock) @@ -172,7 +168,7 @@ func (c *capturingPoller) Subscribe(_ context.Context, fn func()) { func TestSplitSubscribe_NoChanges(t *testing.T) { baseCfg := makeRouterConfig("v1") mock := &mockSplitFetcher{ - mapperResult: makeActiveGraphs(map[string]string{"": "hash-base"}), + mapperResult: map[string]string{"": "hash-base"}, configResults: map[string]*nodev1.RouterConfig{"": baseCfg}, } @@ -198,7 +194,7 @@ func TestSplitSubscribe_BaseGraphChanged(t *testing.T) { newBase := makeRouterConfig("v2") mock := &mockSplitFetcher{ // Mapper now reports a new hash for the base graph. - mapperResult: makeActiveGraphs(map[string]string{"": "hash-base-new"}), + mapperResult: map[string]string{"": "hash-base-new"}, configResults: map[string]*nodev1.RouterConfig{"": newBase}, } @@ -226,10 +222,10 @@ func TestSplitSubscribe_SingleFFChanged(t *testing.T) { oldFF := makeRouterConfig("ff-v1") newFF := makeRouterConfig("ff-v2") mock := &mockSplitFetcher{ - mapperResult: makeActiveGraphs(map[string]string{ + mapperResult: map[string]string{ "": "hash-base", "ff1": "hash-ff1-new", - }), + }, configResults: map[string]*nodev1.RouterConfig{"ff1": newFF}, } @@ -266,10 +262,10 @@ func TestSplitSubscribe_FFAdded(t *testing.T) { baseCfg := makeRouterConfig("v1") newFF := makeRouterConfig("ff-v1") mock := &mockSplitFetcher{ - mapperResult: makeActiveGraphs(map[string]string{ + mapperResult: map[string]string{ "": "hash-base", "ff1": "hash-ff1", - }), + }, configResults: map[string]*nodev1.RouterConfig{"ff1": newFF}, } @@ -295,7 +291,7 @@ func TestSplitSubscribe_FFRemoved(t *testing.T) { oldFF := makeRouterConfig("ff-v1") mock := &mockSplitFetcher{ // Mapper no longer contains ff1. - mapperResult: makeActiveGraphs(map[string]string{"": "hash-base"}), + mapperResult: map[string]string{"": "hash-base"}, } p := newTestPoller(mock) @@ -330,10 +326,10 @@ func TestSplitSubscribe_MultipleChanges(t *testing.T) { oldFF1 := makeRouterConfig("ff1-v1") mock := &mockSplitFetcher{ // base changed, ff2 added, ff1 removed. - mapperResult: makeActiveGraphs(map[string]string{ + mapperResult: map[string]string{ "": "hash-base-new", "ff2": "hash-ff2", - }), + }, configResults: map[string]*nodev1.RouterConfig{ "": newBase, "ff2": newFF2, @@ -393,7 +389,7 @@ func TestSplitSubscribe_MapperFetchFailure(t *testing.T) { func TestSplitSubscribe_ConfigFetchFailure(t *testing.T) { baseCfg := makeRouterConfig("v1") mock := &mockSplitFetcher{ - mapperResult: makeActiveGraphs(map[string]string{"": "hash-base-new"}), + mapperResult: map[string]string{"": "hash-base-new"}, configErrors: map[string]error{"": errors.New("config fetch failed")}, } @@ -419,7 +415,7 @@ func TestSplitSubscribe_HandlerError_StateNotUpdated(t *testing.T) { baseCfg := makeRouterConfig("v1") newBase := makeRouterConfig("v2") mock := &mockSplitFetcher{ - mapperResult: makeActiveGraphs(map[string]string{"": "hash-base-new"}), + mapperResult: map[string]string{"": "hash-base-new"}, configResults: map[string]*nodev1.RouterConfig{"": newBase}, } diff --git a/router/pkg/routerconfig/cdn/split_fetcher.go b/router/pkg/routerconfig/cdn/split_fetcher.go index 1f39fbe85f..c250d1e957 100644 --- a/router/pkg/routerconfig/cdn/split_fetcher.go +++ b/router/pkg/routerconfig/cdn/split_fetcher.go @@ -8,6 +8,7 @@ import ( "crypto/sha256" "crypto/subtle" "encoding/base64" + "encoding/json" "errors" "fmt" "hash" @@ -20,7 +21,6 @@ import ( "github.com/wundergraph/cosmo/router/internal/jwt" "github.com/wundergraph/cosmo/router/pkg/execution_config" "go.uber.org/zap" - "google.golang.org/protobuf/encoding/protojson" ) // SplitFetcher fetches mapper and individual router configs from the CDN @@ -177,7 +177,7 @@ func (f *SplitFetcher) post(ctx context.Context, path string) ([]byte, error) { } // FetchMapper fetches the mapper file and returns the active graph configs and their hashes. -func (f *SplitFetcher) FetchMapper(ctx context.Context) (*nodev1.ActiveGraphs, error) { +func (f *SplitFetcher) FetchMapper(ctx context.Context) (map[string]string, error) { path, err := url.JoinPath("/", f.organizationID, f.federatedGraphID, "manifest/mapper.json") if err != nil { return nil, fmt.Errorf("could not join path: %w", err) @@ -187,13 +187,13 @@ func (f *SplitFetcher) FetchMapper(ctx context.Context) (*nodev1.ActiveGraphs, e return nil, fmt.Errorf("could not fetch mapper: %w", err) } - var activeGraphs nodev1.ActiveGraphs - ms := protojson.UnmarshalOptions{DiscardUnknown: true} - if err := ms.Unmarshal(body, &activeGraphs); err != nil { + var activeGraphs map[string]string + + if err := json.Unmarshal(body, &activeGraphs); err != nil { return nil, fmt.Errorf("could not unmarshal mapper: %w", err) } - return &activeGraphs, nil + return activeGraphs, nil } // FetchConfig fetches a single router config from CDN. diff --git a/router/pkg/routerconfig/cdn/split_fetcher_test.go b/router/pkg/routerconfig/cdn/split_fetcher_test.go index 19eb06aca0..ff9b2d8ddb 100644 --- a/router/pkg/routerconfig/cdn/split_fetcher_test.go +++ b/router/pkg/routerconfig/cdn/split_fetcher_test.go @@ -7,6 +7,7 @@ import ( "crypto/hmac" "crypto/sha256" "encoding/base64" + "encoding/json" "io" "net/http" "net/http/httptest" @@ -51,7 +52,7 @@ func newFetcher(t *testing.T, serverURL string, opts *cdn.Options) *cdn.SplitFet func marshalActiveGraphs(t *testing.T, configs map[string]string) []byte { t.Helper() - b, err := protojson.Marshal(&nodev1.ActiveGraphs{GraphConfigs: configs}) + b, err := json.Marshal(configs) require.NoError(t, err) return b } @@ -235,8 +236,8 @@ func TestFetchMapper_GzipEncoded(t *testing.T) { result, err := newFetcher(t, srv.URL, nil).FetchMapper(context.Background()) require.NoError(t, err) require.NotNil(t, result) - assert.Equal(t, "hash-base", result.GraphConfigs[""]) - assert.Equal(t, "hash-ff1", result.GraphConfigs["ff1"]) + assert.Equal(t, "hash-base", result[""]) + assert.Equal(t, "hash-ff1", result["ff1"]) } // ─── FetchMapper: parsing & URL path ───────────────────────────────────────── @@ -254,8 +255,8 @@ func TestFetchMapper_Success(t *testing.T) { result, err := newFetcher(t, srv.URL, nil).FetchMapper(context.Background()) require.NoError(t, err) require.NotNil(t, result) - assert.Equal(t, "hash-base", result.GraphConfigs[""]) - assert.Equal(t, "hash-ff1", result.GraphConfigs["ff1"]) + assert.Equal(t, "hash-base", result[""]) + assert.Equal(t, "hash-ff1", result["ff1"]) } func TestFetchMapper_InvalidJSON(t *testing.T) { From c4bd8ba65c26325a63153ab176dfc652afef695e Mon Sep 17 00:00:00 2001 From: Ludwig Bedacht Date: Fri, 8 May 2026 16:58:04 +0200 Subject: [PATCH 08/26] feat(router): add options to configure router config assembling in split config poller (#2844) --- docs-website/router/configuration.mdx | 25 +++ router/core/init_config_poller.go | 9 + router/core/router.go | 7 +- router/core/supervisor_instance.go | 9 +- router/pkg/config/config.go | 14 ++ router/pkg/config/config.schema.json | 17 ++ router/pkg/config/fixtures/full.yaml | 6 + .../pkg/config/testdata/config_defaults.json | 4 + router/pkg/config/testdata/config_full.json | 7 + .../configpoller/config_poller.go | 12 +- .../configpoller/split_config_poller.go | 31 ++++ .../configpoller/split_config_poller_test.go | 158 ++++++++++++++++++ router/pkg/errs/errors.go | 16 ++ router/pkg/routerconfig/cdn/client.go | 24 +-- router/pkg/routerconfig/cdn/split_fetcher.go | 11 +- .../routerconfig/cdn/split_fetcher_test.go | 7 +- router/pkg/routerconfig/s3/client.go | 6 +- 17 files changed, 323 insertions(+), 40 deletions(-) create mode 100644 router/pkg/errs/errors.go diff --git a/docs-website/router/configuration.mdx b/docs-website/router/configuration.mdx index 1c157274a0..77b270e66f 100644 --- a/docs-website/router/configuration.mdx +++ b/docs-website/router/configuration.mdx @@ -1282,6 +1282,31 @@ You can configure a fallback storage for fetching the execution config in the ev | EXECUTION_CONFIG_FALLBACK_STORAGE_PROVIDER_ID | execution_config.fallback_storage.provider_id | | The ID of the storage provider. The ID must match the ID of the storage provider in the `storage_providers` section. | | | EXECUTION_CONFIG_FALLBACK_STORAGE_OBJECT_PATH | execution_config.fallback_storage.object_path | | The path to the execution config in the storage provider. The path is used to download the execution config from the S3 bucket. | | +## Split Config Poller + +The split-config polling strategy assembles the final router execution config by fetching the base graph and each feature flag config as separate files from the CDN. These rules govern its behavior when individual feature flag files are missing or should be excluded entirely. They are only applied when the router is enrolled in split-config loading; with a custom storage provider the router falls back to the regular polling strategy and these rules have no effect. + +The base graph is always required. Skip and ignore rules apply to feature flags only. A missing or unfetchable base graph always aborts the poll cycle, regardless of these rules. + +### Example YAML config: + +```yaml config.yaml +version: "1" + +split_config_poller: + skip_missing_feature_flags: true + ignored_feature_flags: + - "experimental-checkout" + - "ab-test-foo" +``` + +### Split config poller options + +| Environment Variable | YAML | Required | Description | Default Value | +| ------------------------------------------------- | --------------------------------------------------- | ---------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------- | +| SPLIT_CONFIG_POLLER_SKIP_MISSING_FEATURE_FLAGS | split_config_poller.skip_missing_feature_flags | | Keep polling alive when a feature flag listed in the mapper cannot be fetched (responds with `file not found`). When false, a single missing feature flag aborts the poll cycle. | false | +| SPLIT_CONFIG_POLLER_IGNORED_FEATURE_FLAGS | split_config_poller.ignored_feature_flags | | Feature flag names to skip entirely during polling. Listed flags are not fetched even when present in the mapper, and are absent from the assembled execution config. | [] | + ## Traffic Shaping Configure rules for traffic shaping like maximum request body size, timeouts, retry behavior, etc. For more info, check this section in the docs: [Traffic shaping](/router/traffic-shaping) diff --git a/router/core/init_config_poller.go b/router/core/init_config_poller.go index 38de03c448..1a3aa5f26c 100644 --- a/router/core/init_config_poller.go +++ b/router/core/init_config_poller.go @@ -204,10 +204,19 @@ func newSplitConfigPoller(r *Router) (*configpoller.ConfigPoller, error) { return nil, fmt.Errorf("failed to create split config fetcher: %w", err) } + ignoredFeatureFlags := make(map[string]struct{}) + for _, featureFlag := range r.routerConfigPollerConfig.SplitConfigPoller.IgnoredFeatureFlags { + ignoredFeatureFlags[featureFlag] = struct{}{} + } + splitPoller := configpoller.NewSplitConfigPoller( fetcher, configpoller.WithSplitLogger(r.logger), configpoller.WithSplitPolling(r.routerConfigPollerConfig.PollInterval, r.routerConfigPollerConfig.PollJitter), + configpoller.WithConfigRules(configpoller.ConfigRules{ + SkipMissingFeatureFlags: r.routerConfigPollerConfig.SplitConfigPoller.SkipMissingFeatureFlags, + IgnoredFeatureFlags: ignoredFeatureFlags, + }), ) return &splitPoller, nil } diff --git a/router/core/router.go b/router/core/router.go index 4dc4a5a9fe..849dc356bc 100644 --- a/router/core/router.go +++ b/router/core/router.go @@ -157,9 +157,10 @@ type ( RouterConfigPollerConfig struct { config.ExecutionConfig - PollInterval time.Duration - PollJitter time.Duration - GraphSignKey string + PollInterval time.Duration + PollJitter time.Duration + GraphSignKey string + SplitConfigPoller config.SplitConfigPollerRules } ExecutionConfig struct { diff --git a/router/core/supervisor_instance.go b/router/core/supervisor_instance.go index 1fd8eb8acb..70abb409ae 100644 --- a/router/core/supervisor_instance.go +++ b/router/core/supervisor_instance.go @@ -172,10 +172,11 @@ func newRouter(ctx context.Context, params RouterResources, additionalOptions .. })) } else { options = append(options, WithConfigPollerConfig(&RouterConfigPollerConfig{ - GraphSignKey: cfg.Graph.SignKey, - PollInterval: cfg.PollInterval, - PollJitter: cfg.PollJitter, - ExecutionConfig: cfg.ExecutionConfig, + GraphSignKey: cfg.Graph.SignKey, + PollInterval: cfg.PollInterval, + PollJitter: cfg.PollJitter, + ExecutionConfig: cfg.ExecutionConfig, + SplitConfigPoller: cfg.SplitConfigPoller, })) } diff --git a/router/pkg/config/config.go b/router/pkg/config/config.go index 225f68c6b4..64d0fbb294 100644 --- a/router/pkg/config/config.go +++ b/router/pkg/config/config.go @@ -988,6 +988,19 @@ type ExecutionConfigFile struct { WatchInterval time.Duration `yaml:"watch_interval,omitempty" envDefault:"1s" env:"EXECUTION_CONFIG_FILE_WATCH_INTERVAL"` } +// SplitConfigPollerRules governs the behavior of the split-config polling strategy used to +// assemble the final router execution config. The split poller fetches the base graph and each +// feature flag config as separate files from the CDN. These rules apply when individual files +// are missing or should be excluded entirely. +type SplitConfigPollerRules struct { + // SkipMissingFeatureFlags keeps polling alive when a feature flag listed in the mapper cannot + // be fetched. When false (default), a single missing feature flag aborts the poll cycle. + SkipMissingFeatureFlags bool `yaml:"skip_missing_feature_flags" envDefault:"false" env:"SKIP_MISSING_FEATURE_FLAGS"` + // IgnoredFeatureFlags is the list of feature flag names to skip entirely during polling. + // Listed flags are not fetched even when present in the mapper. + IgnoredFeatureFlags []string `yaml:"ignored_feature_flags,omitempty" env:"IGNORED_FEATURE_FLAGS"` +} + type ExecutionConfig struct { File ExecutionConfigFile `yaml:"file,omitempty"` Storage ExecutionConfigStorage `yaml:"storage,omitempty" envPrefix:"EXECUTION_CONFIG_STORAGE_"` @@ -1305,6 +1318,7 @@ type Config struct { StorageProviders StorageProviders `yaml:"storage_providers" envPrefix:"STORAGE_PROVIDER_"` ExecutionConfig ExecutionConfig `yaml:"execution_config"` + SplitConfigPoller SplitConfigPollerRules `yaml:"split_config_poller" envPrefix:"SPLIT_CONFIG_POLLER_"` PersistedOperationsConfig PersistedOperationsConfig `yaml:"persisted_operations" envPrefix:"PERSISTED_OPERATIONS_"` AutomaticPersistedQueries AutomaticPersistedQueriesConfig `yaml:"automatic_persisted_queries"` ApolloCompatibilityFlags ApolloCompatibilityFlags `yaml:"apollo_compatibility_flags"` diff --git a/router/pkg/config/config.schema.json b/router/pkg/config/config.schema.json index 54fa556e93..9d0aa4111e 100644 --- a/router/pkg/config/config.schema.json +++ b/router/pkg/config/config.schema.json @@ -402,6 +402,23 @@ } ] }, + "split_config_poller": { + "type": "object", + "description": "Behavior overrides for the split-config polling strategy, which assembles the final router execution config by fetching the base graph and each feature flag config as separate files from the CDN. Only applied when the router is enrolled in split-config loading.", + "additionalProperties": false, + "properties": { + "skip_missing_feature_flags": { + "type": "boolean", + "default": false, + "description": "Skip feature flags that cannot be fetched instead of aborting the poll cycle. Use this when occasional feature flag fetch failures should not stop the router from picking up changes to other graphs." + }, + "ignored_feature_flags": { + "type": "array", + "items": { "type": "string" }, + "description": "Feature flag names to skip entirely during config polling. Listed flags are not fetched even when present in the mapper." + } + } + }, "graphql_metrics": { "type": "object", "additionalProperties": false, diff --git a/router/pkg/config/fixtures/full.yaml b/router/pkg/config/fixtures/full.yaml index eed7b3f973..1dbaa22ce9 100644 --- a/router/pkg/config/fixtures/full.yaml +++ b/router/pkg/config/fixtures/full.yaml @@ -534,6 +534,12 @@ execution_config: provider_id: s3 object_path: '5ef73d80-cae4-4d0e-98a7-1e9fa922c1a4/92c25b45-a75b-4954-b8f6-6592a9b203eb/routerconfigs/latest.json' +split_config_poller: + skip_missing_feature_flags: true + ignored_feature_flags: + - 'experimental-checkout' + - 'ab-test-foo' + router_config_path: 'latest.json' client_header: diff --git a/router/pkg/config/testdata/config_defaults.json b/router/pkg/config/testdata/config_defaults.json index d64a0b40fb..4f9422c091 100644 --- a/router/pkg/config/testdata/config_defaults.json +++ b/router/pkg/config/testdata/config_defaults.json @@ -548,6 +548,10 @@ "ObjectPath": "" } }, + "SplitConfigPoller": { + "SkipMissingFeatureFlags": false, + "IgnoredFeatureFlags": null + }, "PersistedOperationsConfig": { "Disabled": false, "LogUnknown": false, diff --git a/router/pkg/config/testdata/config_full.json b/router/pkg/config/testdata/config_full.json index fbc42cf002..e3be23b88a 100644 --- a/router/pkg/config/testdata/config_full.json +++ b/router/pkg/config/testdata/config_full.json @@ -993,6 +993,13 @@ "ObjectPath": "" } }, + "SplitConfigPoller": { + "SkipMissingFeatureFlags": true, + "IgnoredFeatureFlags": [ + "experimental-checkout", + "ab-test-foo" + ] + }, "PersistedOperationsConfig": { "Disabled": false, "LogUnknown": true, diff --git a/router/pkg/controlplane/configpoller/config_poller.go b/router/pkg/controlplane/configpoller/config_poller.go index 0c34bd2aa2..92a371acc4 100644 --- a/router/pkg/controlplane/configpoller/config_poller.go +++ b/router/pkg/controlplane/configpoller/config_poller.go @@ -5,6 +5,7 @@ import ( "errors" "time" + "github.com/wundergraph/cosmo/router/pkg/errs" "github.com/wundergraph/cosmo/router/pkg/routerconfig" "github.com/wundergraph/cosmo/router/pkg/controlplane" @@ -13,9 +14,6 @@ import ( type Option func(cp *configPoller) -var ErrConfigNotModified = errors.New("config not modified") -var ErrConfigNotFound = errors.New("config not found") - type ConfigPoller interface { // Subscribe subscribes to the config poller with a handler function that will be invoked // with the latest router config. If the handler takes longer than the poll interval @@ -68,7 +66,7 @@ func (c *configPoller) Subscribe(ctx context.Context, handler func(newConfig *ro cfg, err := c.getRouterConfig(ctx) if err != nil { - if errors.Is(err, ErrConfigNotModified) { + if errors.Is(err, errs.ErrConfigNotModified) { c.logger.Debug("No new router config available. Trying again ...", zap.String("poll_interval", c.pollInterval.String()), zap.String("fetch_time", time.Since(start).String()), @@ -135,11 +133,11 @@ func (c *configPoller) getRouterConfig(ctx context.Context) (*routerconfig.Respo return config, nil } - if errors.Is(err, ErrConfigNotModified) { + if errors.Is(err, errs.ErrConfigNotModified) { return nil, err } - if c.demoMode && c.fallbackConfigClient == nil && errors.Is(err, ErrConfigNotFound) { + if c.demoMode && c.fallbackConfigClient == nil && errors.Is(err, errs.ErrRouterConfigNotFound) { c.logger.Warn("The router is running in demo mode and no execution config has been found, using a demo execution config for testing purposes.") return &routerconfig.Response{Config: routerconfig.GetDefaultConfig()}, nil } @@ -151,7 +149,7 @@ func (c *configPoller) getRouterConfig(ctx context.Context) (*routerconfig.Respo c.logger.Warn("Failed to retrieve execution config. Attempting with fallback storage") config, err = (*c.fallbackConfigClient).RouterConfig(ctx, c.latestRouterConfigVersion, c.latestRouterConfigDate) - if c.demoMode && errors.Is(err, ErrConfigNotFound) { + if c.demoMode && errors.Is(err, errs.ErrRouterConfigNotFound) { return &routerconfig.Response{Config: routerconfig.GetDefaultConfig()}, nil } if err != nil { diff --git a/router/pkg/controlplane/configpoller/split_config_poller.go b/router/pkg/controlplane/configpoller/split_config_poller.go index 855a4b44e2..c900a8323e 100644 --- a/router/pkg/controlplane/configpoller/split_config_poller.go +++ b/router/pkg/controlplane/configpoller/split_config_poller.go @@ -2,6 +2,7 @@ package configpoller import ( "context" + "errors" "fmt" "maps" "slices" @@ -10,6 +11,7 @@ import ( "github.com/cespare/xxhash/v2" nodev1 "github.com/wundergraph/cosmo/router/gen/proto/wg/cosmo/node/v1" "github.com/wundergraph/cosmo/router/pkg/controlplane" + "github.com/wundergraph/cosmo/router/pkg/errs" "github.com/wundergraph/cosmo/router/pkg/routerconfig" "go.uber.org/zap" "google.golang.org/protobuf/proto" @@ -29,6 +31,11 @@ type SplitConfigFetcher interface { // SplitConfigPollerOption configures a splitConfigPoller. type SplitConfigPollerOption func(*splitConfigPoller) +type ConfigRules struct { + SkipMissingFeatureFlags bool + IgnoredFeatureFlags map[string]struct{} +} + type splitConfigPoller struct { logger *zap.Logger poller controlplane.Poller @@ -40,6 +47,7 @@ type splitConfigPoller struct { knownHashes map[string]string // name -> hash from last successful mapper fetch ("" = base) currentConfig *nodev1.RouterConfig // last successfully assembled full config latestVersion string // composite hash used for change detection + configRules ConfigRules // config rules to apply to the config } // NewSplitConfigPoller creates a ConfigPoller that uses the split-config strategy. @@ -73,6 +81,12 @@ func WithSplitPolling(interval time.Duration, jitter time.Duration) SplitConfigP } } +func WithConfigRules(rules ConfigRules) SplitConfigPollerOption { + return func(p *splitConfigPoller) { + p.configRules = rules + } +} + // computeCompositeVersion returns a deterministic version string derived from all mapper entries. func computeCompositeVersion(graphConfigs map[string]string) string { keys := make([]string, 0, len(graphConfigs)) @@ -103,20 +117,36 @@ func (p *splitConfigPoller) fetchAndAssembleAll(ctx context.Context, activeGraph CompatibilityVersion: baseConfig.CompatibilityVersion, } + hasIgnoredFeatureFlags := len(p.configRules.IgnoredFeatureFlags) > 0 + // Fetch feature flag configs. for name := range activeGraphs { if name == "" { continue // base graph already handled above } + + if hasIgnoredFeatureFlags { + if _, ok := p.configRules.IgnoredFeatureFlags[name]; ok { + p.logger.Info("Feature flag is ignored, skipping", zap.String("feature_flag", name)) + continue + } + } + ffConfig, err := p.fetcher.FetchConfig(ctx, name) if err != nil { + if p.configRules.SkipMissingFeatureFlags && errors.Is(err, errs.ErrFileNotFound) { + p.logger.Warn("Feature flag config not found, skipping", zap.String("feature_flag", name)) + continue + } return nil, fmt.Errorf("failed to fetch config for feature flag %q: %w", name, err) } + if assembled.FeatureFlagConfigs == nil { assembled.FeatureFlagConfigs = &nodev1.FeatureFlagRouterExecutionConfigs{ ConfigByFeatureFlagName: make(map[string]*nodev1.FeatureFlagRouterExecutionConfig), } } + assembled.FeatureFlagConfigs.ConfigByFeatureFlagName[name] = &nodev1.FeatureFlagRouterExecutionConfig{ EngineConfig: ffConfig.EngineConfig, Version: ffConfig.Version, @@ -133,6 +163,7 @@ func (p *splitConfigPoller) GetRouterConfig(ctx context.Context) (*routerconfig. if err != nil { return nil, fmt.Errorf("failed to fetch mapper: %w", err) } + if len(activeGraphs) == 0 { return nil, fmt.Errorf("empty graph configs") } diff --git a/router/pkg/controlplane/configpoller/split_config_poller_test.go b/router/pkg/controlplane/configpoller/split_config_poller_test.go index 9edd766921..c0b86fd66f 100644 --- a/router/pkg/controlplane/configpoller/split_config_poller_test.go +++ b/router/pkg/controlplane/configpoller/split_config_poller_test.go @@ -9,6 +9,7 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" nodev1 "github.com/wundergraph/cosmo/router/gen/proto/wg/cosmo/node/v1" + "github.com/wundergraph/cosmo/router/pkg/errs" "github.com/wundergraph/cosmo/router/pkg/routerconfig" "go.uber.org/zap" ) @@ -143,6 +144,163 @@ func TestSplitGetRouterConfig_ConfigFetchError(t *testing.T) { assert.Contains(t, err.Error(), "CDN unavailable") } +// ---- ConfigRules tests ---- + +func TestSplitGetRouterConfig_IgnoredFeatureFlag_NotFetched(t *testing.T) { + baseCfg := makeRouterConfig("v1") + activeCfg := makeRouterConfig("active-v1") + mock := &mockSplitFetcher{ + mapperResult: map[string]string{ + "": "hash-base", + "active": "hash-active", + "ignored": "hash-ignored", + }, + configResults: map[string]*nodev1.RouterConfig{ + "": baseCfg, + "active": activeCfg, + "ignored": makeRouterConfig("ignored-v1"), + }, + } + + p := newTestPoller(mock) + p.configRules = ConfigRules{ + IgnoredFeatureFlags: map[string]struct{}{"ignored": {}}, + } + + resp, err := p.GetRouterConfig(context.Background()) + require.NoError(t, err) + + require.NotNil(t, resp.Config.FeatureFlagConfigs) + assert.Contains(t, resp.Config.FeatureFlagConfigs.ConfigByFeatureFlagName, "active") + assert.NotContains(t, resp.Config.FeatureFlagConfigs.ConfigByFeatureFlagName, "ignored", + "ignored feature flag must not appear in the assembled config") + + assert.Contains(t, mock.fetchConfigCalls, "active") + assert.NotContains(t, mock.fetchConfigCalls, "ignored", + "ignored feature flag must not be fetched from the CDN") +} + +func TestSplitGetRouterConfig_AllFeatureFlagsIgnored(t *testing.T) { + baseCfg := makeRouterConfig("v1") + mock := &mockSplitFetcher{ + mapperResult: map[string]string{ + "": "hash-base", + "ff1": "hash-ff1", + "ff2": "hash-ff2", + }, + configResults: map[string]*nodev1.RouterConfig{"": baseCfg}, + } + + p := newTestPoller(mock) + p.configRules = ConfigRules{ + IgnoredFeatureFlags: map[string]struct{}{ + "ff1": {}, + "ff2": {}, + }, + } + + resp, err := p.GetRouterConfig(context.Background()) + require.NoError(t, err) + + assert.Nil(t, resp.Config.FeatureFlagConfigs, + "FeatureFlagConfigs should be nil when every feature flag is ignored") + assert.Equal(t, []string{""}, mock.fetchConfigCalls, + "only the base graph should be fetched when all feature flags are ignored") +} + +func TestSplitGetRouterConfig_SkipMissingFeatureFlag_FileNotFoundSkipped(t *testing.T) { + baseCfg := makeRouterConfig("v1") + availableCfg := makeRouterConfig("available-v1") + mock := &mockSplitFetcher{ + mapperResult: map[string]string{ + "": "hash-base", + "available": "hash-available", + "missing": "hash-missing", + }, + configResults: map[string]*nodev1.RouterConfig{ + "": baseCfg, + "available": availableCfg, + }, + configErrors: map[string]error{ + "missing": errs.ErrFileNotFound, + }, + } + + p := newTestPoller(mock) + p.configRules = ConfigRules{SkipMissingFeatureFlags: true} + + resp, err := p.GetRouterConfig(context.Background()) + require.NoError(t, err, "ErrFileNotFound must be tolerated when SkipMissingFeatureFlags is true") + + require.NotNil(t, resp.Config.FeatureFlagConfigs) + assert.Contains(t, resp.Config.FeatureFlagConfigs.ConfigByFeatureFlagName, "available") + assert.NotContains(t, resp.Config.FeatureFlagConfigs.ConfigByFeatureFlagName, "missing") +} + +func TestSplitGetRouterConfig_SkipMissingFeatureFlag_DisabledByDefault(t *testing.T) { + baseCfg := makeRouterConfig("v1") + mock := &mockSplitFetcher{ + mapperResult: map[string]string{ + "": "hash-base", + "missing": "hash-missing", + }, + configResults: map[string]*nodev1.RouterConfig{"": baseCfg}, + configErrors: map[string]error{"missing": errs.ErrFileNotFound}, + } + + p := newTestPoller(mock) + // SkipMissingFeatureFlags defaults to false. + + _, err := p.GetRouterConfig(context.Background()) + require.Error(t, err, "ErrFileNotFound must abort the poll when SkipMissingFeatureFlags is false") + assert.ErrorIs(t, err, errs.ErrFileNotFound) + assert.Contains(t, err.Error(), `"missing"`) +} + +func TestSplitGetRouterConfig_SkipMissingFeatureFlag_OnlyFileNotFoundSuppressed(t *testing.T) { + baseCfg := makeRouterConfig("v1") + transientErr := errors.New("transient CDN failure") + mock := &mockSplitFetcher{ + mapperResult: map[string]string{ + "": "hash-base", + "flaky": "hash-flaky", + }, + configResults: map[string]*nodev1.RouterConfig{"": baseCfg}, + configErrors: map[string]error{"flaky": transientErr}, + } + + p := newTestPoller(mock) + p.configRules = ConfigRules{SkipMissingFeatureFlags: true} + + _, err := p.GetRouterConfig(context.Background()) + require.Error(t, err, "non-ErrFileNotFound errors must propagate even with SkipMissingFeatureFlags enabled") + assert.ErrorIs(t, err, transientErr) + assert.NotErrorIs(t, err, errs.ErrFileNotFound) +} + +func TestSplitGetRouterConfig_BaseConfigCannotBeSkippedOrIgnored(t *testing.T) { + // The skip/ignore rules apply to feature flags only. A missing base config must always + // abort the poll, even when both rules are configured aggressively. + mock := &mockSplitFetcher{ + mapperResult: map[string]string{ + "": "hash-base", + "ff1": "hash-ff1", + }, + configErrors: map[string]error{"": errs.ErrFileNotFound}, + } + + p := newTestPoller(mock) + p.configRules = ConfigRules{ + SkipMissingFeatureFlags: true, + IgnoredFeatureFlags: map[string]struct{}{"": {}}, + } + + _, err := p.GetRouterConfig(context.Background()) + require.Error(t, err, "missing base config must always abort, regardless of skip/ignore rules") + assert.ErrorIs(t, err, errs.ErrFileNotFound) + assert.Contains(t, err.Error(), "base config") +} + // ---- Subscribe / polling tests ---- // pollOnce manually executes one poll iteration using the poller's internal logic. diff --git a/router/pkg/errs/errors.go b/router/pkg/errs/errors.go new file mode 100644 index 0000000000..35d2b4977f --- /dev/null +++ b/router/pkg/errs/errors.go @@ -0,0 +1,16 @@ +package errs + +import "errors" + +// config poller errors +var ( + ErrConfigNotModified = errors.New("config not modified") + ErrRouterConfigNotFound = errors.New("router config not found") +) + +// CDN errors +var ( + ErrMissingSignatureHeader = errors.New("signature header not found in CDN response") + ErrInvalidSignature = errors.New("invalid config signature, potential tampering detected") + ErrFileNotFound = errors.New("file not found") +) diff --git a/router/pkg/routerconfig/cdn/client.go b/router/pkg/routerconfig/cdn/client.go index 3bd8289aba..1986174bde 100644 --- a/router/pkg/routerconfig/cdn/client.go +++ b/router/pkg/routerconfig/cdn/client.go @@ -19,7 +19,7 @@ import ( "github.com/wundergraph/cosmo/router/internal/httpclient" "github.com/wundergraph/cosmo/router/internal/jwt" - "github.com/wundergraph/cosmo/router/pkg/controlplane/configpoller" + "github.com/wundergraph/cosmo/router/pkg/errs" "github.com/wundergraph/cosmo/router/pkg/routerconfig" "github.com/wundergraph/cosmo/router/pkg/execution_config" @@ -30,12 +30,6 @@ const ( sigResponseHeaderName = "X-Signature-SHA256" ) -var ( - ErrMissingSignatureHeader = errors.New("signature header not found in CDN response") - ErrInvalidSignature = errors.New("invalid config signature, potential tampering detected") - ErrConfigNotFound error = &routerConfigNotFoundError{} -) - type Options struct { Logger *zap.Logger SignatureKey string @@ -147,7 +141,7 @@ func (cdn *Client) getRouterConfig(ctx context.Context, version string, _ time.T if resp.StatusCode != http.StatusOK { if resp.StatusCode == http.StatusNotFound { - return nil, ErrConfigNotFound + return nil, errs.ErrRouterConfigNotFound } if resp.StatusCode == http.StatusUnauthorized { return nil, errors.New("could not authenticate against CDN") @@ -156,7 +150,7 @@ func (cdn *Client) getRouterConfig(ctx context.Context, version string, _ time.T return nil, errors.New("bad request") } if resp.StatusCode == http.StatusNotModified { - return nil, configpoller.ErrConfigNotModified + return nil, errs.ErrConfigNotModified } return nil, fmt.Errorf("unexpected status code when loading router config, statusCode: %d", resp.StatusCode) @@ -193,9 +187,9 @@ func (cdn *Client) getRouterConfig(ctx context.Context, version string, _ time.T if configSignature == "" { cdn.logger.Error( "Signature header not found in CDN response. Ensure that your Admission Controller was able to sign the config. Open the compositions page in the Studio to check the status of the last deployment", - zap.Error(ErrMissingSignatureHeader), + zap.Error(errs.ErrMissingSignatureHeader), ) - return nil, ErrMissingSignatureHeader + return nil, errs.ErrMissingSignatureHeader } // create a signature of the received config body @@ -214,9 +208,9 @@ func (cdn *Client) getRouterConfig(ctx context.Context, version string, _ time.T if subtle.ConstantTimeCompare(rawSignature, dataHmac) != 1 { cdn.logger.Error( "Invalid config signature, potential tampering detected. Ensure that your Admission Controller has signed the config correctly. Open the compositions page in the Studio to check the status of the last deployment", - zap.Error(ErrInvalidSignature), + zap.Error(errs.ErrInvalidSignature), ) - return nil, ErrInvalidSignature + return nil, errs.ErrInvalidSignature } cdn.logger.Info("Config signature validation successful", @@ -232,8 +226,8 @@ func (cdn *Client) RouterConfig(ctx context.Context, version string, modifiedSin res := &routerconfig.Response{} body, err := cdn.getRouterConfig(ctx, version, modifiedSince) - if err != nil && errors.Is(err, ErrConfigNotFound) { - return nil, configpoller.ErrConfigNotFound + if err != nil && errors.Is(err, errs.ErrFileNotFound) { + return nil, errs.ErrRouterConfigNotFound } else if err != nil { return nil, err } diff --git a/router/pkg/routerconfig/cdn/split_fetcher.go b/router/pkg/routerconfig/cdn/split_fetcher.go index c250d1e957..efab90ab9f 100644 --- a/router/pkg/routerconfig/cdn/split_fetcher.go +++ b/router/pkg/routerconfig/cdn/split_fetcher.go @@ -19,6 +19,7 @@ import ( nodev1 "github.com/wundergraph/cosmo/router/gen/proto/wg/cosmo/node/v1" "github.com/wundergraph/cosmo/router/internal/httpclient" "github.com/wundergraph/cosmo/router/internal/jwt" + "github.com/wundergraph/cosmo/router/pkg/errs" "github.com/wundergraph/cosmo/router/pkg/execution_config" "go.uber.org/zap" ) @@ -108,7 +109,7 @@ func (f *SplitFetcher) post(ctx context.Context, path string) ([]byte, error) { case http.StatusOK: // handled below case http.StatusNotFound: - return nil, ErrConfigNotFound + return nil, errs.ErrFileNotFound case http.StatusUnauthorized: return nil, errors.New("could not authenticate against CDN") case http.StatusBadRequest: @@ -143,9 +144,9 @@ func (f *SplitFetcher) post(ctx context.Context, path string) ([]byte, error) { if configSignature == "" { f.logger.Error( "Signature header not found in CDN response. Ensure that your Admission Controller was able to sign the config.", - zap.Error(ErrMissingSignatureHeader), + zap.Error(errs.ErrMissingSignatureHeader), ) - return nil, ErrMissingSignatureHeader + return nil, errs.ErrMissingSignatureHeader } if _, err := f.hash.Write(body); err != nil { @@ -162,9 +163,9 @@ func (f *SplitFetcher) post(ctx context.Context, path string) ([]byte, error) { if subtle.ConstantTimeCompare(rawSignature, dataHmac) != 1 { f.logger.Error( "Invalid config signature, potential tampering detected.", - zap.Error(ErrInvalidSignature), + zap.Error(errs.ErrInvalidSignature), ) - return nil, ErrInvalidSignature + return nil, errs.ErrInvalidSignature } f.logger.Info("Config signature validation successful", diff --git a/router/pkg/routerconfig/cdn/split_fetcher_test.go b/router/pkg/routerconfig/cdn/split_fetcher_test.go index ff9b2d8ddb..61e875384f 100644 --- a/router/pkg/routerconfig/cdn/split_fetcher_test.go +++ b/router/pkg/routerconfig/cdn/split_fetcher_test.go @@ -17,6 +17,7 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" nodev1 "github.com/wundergraph/cosmo/router/gen/proto/wg/cosmo/node/v1" + "github.com/wundergraph/cosmo/router/pkg/errs" "github.com/wundergraph/cosmo/router/pkg/routerconfig/cdn" "google.golang.org/protobuf/encoding/protojson" ) @@ -123,7 +124,7 @@ func TestFetchMapper_HTTPErrors(t *testing.T) { { name: "not found", statusCode: http.StatusNotFound, - wantErr: cdn.ErrConfigNotFound, + wantErr: errs.ErrFileNotFound, }, { name: "unauthorized", @@ -316,7 +317,7 @@ func TestFetchMapper_Signature(t *testing.T) { { name: "missing signature header", sigKey: sigKey, - wantErr: cdn.ErrMissingSignatureHeader, + wantErr: errs.ErrMissingSignatureHeader, }, { name: "invalid base64 in signature", @@ -328,7 +329,7 @@ func TestFetchMapper_Signature(t *testing.T) { name: "signature mismatch", sigKey: sigKey, respSig: wrongSig, - wantErr: cdn.ErrInvalidSignature, + wantErr: errs.ErrInvalidSignature, }, } diff --git a/router/pkg/routerconfig/s3/client.go b/router/pkg/routerconfig/s3/client.go index 31586ec153..75f9db0f51 100644 --- a/router/pkg/routerconfig/s3/client.go +++ b/router/pkg/routerconfig/s3/client.go @@ -15,7 +15,7 @@ import ( "github.com/minio/minio-go/v7" "github.com/minio/minio-go/v7/pkg/credentials" - "github.com/wundergraph/cosmo/router/pkg/controlplane/configpoller" + "github.com/wundergraph/cosmo/router/pkg/errs" "github.com/wundergraph/cosmo/router/pkg/execution_config" "github.com/wundergraph/cosmo/router/pkg/routerconfig" ) @@ -141,9 +141,9 @@ func (c Client) RouterConfig(ctx context.Context, _ string, modifiedSince time.T var minioErr minio.ErrorResponse if errors.As(err, &minioErr) { if minioErr.StatusCode == http.StatusNotModified { - return nil, configpoller.ErrConfigNotModified + return nil, errs.ErrConfigNotModified } else if minioErr.Code == "NoSuchKey" { - return nil, configpoller.ErrConfigNotFound + return nil, errs.ErrRouterConfigNotFound } } From e673a39e26e8f81ae979414e1d523592f03be014 Mon Sep 17 00:00:00 2001 From: Wilson Rivera Date: Fri, 8 May 2026 11:22:16 -0400 Subject: [PATCH 09/26] feat: split router config (#2834) --- .../migrations/0137_long_warbound.sql | 21 + .../migrations/meta/0137_snapshot.json | 8982 +++++++++++++++++ controlplane/migrations/meta/_journal.json | 7 + .../bufservices/contract/createContract.ts | 80 +- .../bufservices/contract/updateContract.ts | 154 +- .../feature-flag/createFeatureFlag.ts | 122 +- .../feature-flag/deleteFeatureFlag.ts | 147 +- .../feature-flag/enableFeatureFlag.ts | 117 +- .../feature-flag/updateFeatureFlag.ts | 139 +- .../federated-graph/createFederatedGraph.ts | 82 +- .../federated-graph/migrateFromApollo.ts | 39 +- .../federated-graph/moveFederatedGraph.ts | 64 +- .../federated-graph/updateFederatedGraph.ts | 109 +- .../core/bufservices/graph/recomposeGraph.ts | 45 +- .../setGraphRouterCompatibilityVersion.ts | 87 +- .../bufservices/monograph/publishMonograph.ts | 48 +- .../bufservices/monograph/updateMonograph.ts | 31 +- .../subgraph/deleteFederatedSubgraph.ts | 104 +- .../core/bufservices/subgraph/moveSubgraph.ts | 34 +- .../subgraph/publishFederatedSubgraph.ts | 120 +- .../bufservices/subgraph/updateSubgraph.ts | 67 +- controlplane/src/core/composition/composer.ts | 44 +- .../repositories/FeatureFlagRepository.ts | 10 +- .../repositories/FederatedGraphRepository.ts | 363 +- .../core/repositories/SubgraphRepository.ts | 215 +- .../src/core/services/CompositionService.ts | 1127 +++ controlplane/src/db/schema.ts | 19 + controlplane/src/types/index.ts | 26 +- .../feature-flag-integration-v2.test.ts | 1440 +++ .../feature-flag-integration.test.ts | 33 +- 30 files changed, 12460 insertions(+), 1416 deletions(-) create mode 100644 controlplane/migrations/0137_long_warbound.sql create mode 100644 controlplane/migrations/meta/0137_snapshot.json create mode 100644 controlplane/src/core/services/CompositionService.ts create mode 100644 controlplane/test/feature-flag/feature-flag-integration-v2.test.ts diff --git a/controlplane/migrations/0137_long_warbound.sql b/controlplane/migrations/0137_long_warbound.sql new file mode 100644 index 0000000000..977e919e21 --- /dev/null +++ b/controlplane/migrations/0137_long_warbound.sql @@ -0,0 +1,21 @@ +CREATE TABLE IF NOT EXISTS "router_config_hash" ( + "id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL, + "federated_graph_id" uuid NOT NULL, + "feature_flag_id" uuid, + "hash" text NOT NULL, + "created_at" timestamp DEFAULT now(), + "updated_at" timestamp, + CONSTRAINT "fed_graph_feature_flag_idx" UNIQUE NULLS NOT DISTINCT("federated_graph_id","feature_flag_id") +); +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "router_config_hash" ADD CONSTRAINT "router_config_hash_federated_graph_id_federated_graphs_id_fk" FOREIGN KEY ("federated_graph_id") REFERENCES "public"."federated_graphs"("id") ON DELETE cascade ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "router_config_hash" ADD CONSTRAINT "router_config_hash_feature_flag_id_feature_flags_id_fk" FOREIGN KEY ("feature_flag_id") REFERENCES "public"."feature_flags"("id") ON DELETE cascade ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; diff --git a/controlplane/migrations/meta/0137_snapshot.json b/controlplane/migrations/meta/0137_snapshot.json new file mode 100644 index 0000000000..3366249a27 --- /dev/null +++ b/controlplane/migrations/meta/0137_snapshot.json @@ -0,0 +1,8982 @@ +{ + "id": "6e36817e-24db-4cd7-9715-4fad10112819", + "prevId": "d474eefb-2a0d-4a07-8887-3260aee174d4", + "version": "7", + "dialect": "postgresql", + "tables": { + "public.api_key_permissions": { + "name": "api_key_permissions", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "api_key_id": { + "name": "api_key_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "permission": { + "name": "permission", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": { + "akp_api_key_id_idx": { + "name": "akp_api_key_id_idx", + "columns": [ + { + "expression": "api_key_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "api_key_permissions_api_key_id_api_keys_id_fk": { + "name": "api_key_permissions_api_key_id_api_keys_id_fk", + "tableFrom": "api_key_permissions", + "tableTo": "api_keys", + "columnsFrom": [ + "api_key_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.api_key_resources": { + "name": "api_key_resources", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "api_key_id": { + "name": "api_key_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "target_id": { + "name": "target_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "akr_api_key_id_idx": { + "name": "akr_api_key_id_idx", + "columns": [ + { + "expression": "api_key_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "akr_target_id_idx": { + "name": "akr_target_id_idx", + "columns": [ + { + "expression": "target_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "api_key_resources_api_key_id_api_keys_id_fk": { + "name": "api_key_resources_api_key_id_api_keys_id_fk", + "tableFrom": "api_key_resources", + "tableTo": "api_keys", + "columnsFrom": [ + "api_key_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "api_key_resources_target_id_targets_id_fk": { + "name": "api_key_resources_target_id_targets_id_fk", + "tableFrom": "api_key_resources", + "tableTo": "targets", + "columnsFrom": [ + "target_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.api_keys": { + "name": "api_keys", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "user_id": { + "name": "user_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "organization_id": { + "name": "organization_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "key": { + "name": "key", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "group_id": { + "name": "group_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "external": { + "name": "external", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "last_used_at": { + "name": "last_used_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "expires_at": { + "name": "expires_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "apikey_name_idx": { + "name": "apikey_name_idx", + "columns": [ + { + "expression": "name", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "organization_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + }, + "ak_user_id_idx": { + "name": "ak_user_id_idx", + "columns": [ + { + "expression": "user_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "ak_organization_id_idx": { + "name": "ak_organization_id_idx", + "columns": [ + { + "expression": "organization_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "api_keys_user_id_users_id_fk": { + "name": "api_keys_user_id_users_id_fk", + "tableFrom": "api_keys", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "api_keys_organization_id_organizations_id_fk": { + "name": "api_keys_organization_id_organizations_id_fk", + "tableFrom": "api_keys", + "tableTo": "organizations", + "columnsFrom": [ + "organization_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "api_keys_group_id_organization_groups_id_fk": { + "name": "api_keys_group_id_organization_groups_id_fk", + "tableFrom": "api_keys", + "tableTo": "organization_groups", + "columnsFrom": [ + "group_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "api_keys_key_unique": { + "name": "api_keys_key_unique", + "nullsNotDistinct": false, + "columns": [ + "key" + ] + } + }, + "checkConstraints": {} + }, + "public.audit_logs": { + "name": "audit_logs", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "organization_id": { + "name": "organization_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "organization_slug": { + "name": "organization_slug", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "action": { + "name": "action", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "audit_action": { + "name": "audit_action", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "auditable_type": { + "name": "auditable_type", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "auditable_display_name": { + "name": "auditable_display_name", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "target_id": { + "name": "target_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "target_type": { + "name": "target_type", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "target_display_name": { + "name": "target_display_name", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "target_namespace_id": { + "name": "target_namespace_id", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "target_namespace": { + "name": "target_namespace", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "actor_id": { + "name": "actor_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "actor_display_name": { + "name": "actor_display_name", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "actor_type": { + "name": "actor_type", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "api_key_name": { + "name": "api_key_name", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "auditlogs_organization_idx": { + "name": "auditlogs_organization_idx", + "columns": [ + { + "expression": "organization_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "auditlogs_created_at_idx": { + "name": "auditlogs_created_at_idx", + "columns": [ + { + "expression": "created_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.billing_plans": { + "name": "billing_plans", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "active": { + "name": "active", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "price": { + "name": "price", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "features": { + "name": "features", + "type": "json", + "primaryKey": false, + "notNull": true + }, + "stripe_price_id": { + "name": "stripe_price_id", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "weight": { + "name": "weight", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 0 + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.billing_subscriptions": { + "name": "billing_subscriptions", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "organization_id": { + "name": "organization_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "metadata": { + "name": "metadata", + "type": "json", + "primaryKey": false, + "notNull": true + }, + "status": { + "name": "status", + "type": "status", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "price_id": { + "name": "price_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "quantity": { + "name": "quantity", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "cancel_at_period_end": { + "name": "cancel_at_period_end", + "type": "boolean", + "primaryKey": false, + "notNull": true + }, + "cancel_at": { + "name": "cancel_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "canceled_at": { + "name": "canceled_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "current_period_start": { + "name": "current_period_start", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true + }, + "current_period_end": { + "name": "current_period_end", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "ended_at": { + "name": "ended_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "trial_start": { + "name": "trial_start", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "trial_end": { + "name": "trial_end", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "billsubs_organization_id_idx": { + "name": "billsubs_organization_id_idx", + "columns": [ + { + "expression": "organization_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "billing_subscriptions_organization_id_organizations_id_fk": { + "name": "billing_subscriptions_organization_id_organizations_id_fk", + "tableFrom": "billing_subscriptions", + "tableTo": "organizations", + "columnsFrom": [ + "organization_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.cache_warmer_operations": { + "name": "cache_warmer_operations", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "organization_id": { + "name": "organization_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "federated_graph_id": { + "name": "federated_graph_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "operation_content": { + "name": "operation_content", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "operation_hash": { + "name": "operation_hash", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "operation_persisted_id": { + "name": "operation_persisted_id", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "operation_name": { + "name": "operation_name", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "client_name": { + "name": "client_name", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "client_version": { + "name": "client_version", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "planning_time": { + "name": "planning_time", + "type": "real", + "primaryKey": false, + "notNull": false + }, + "is_manually_added": { + "name": "is_manually_added", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "created_by_id": { + "name": "created_by_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "cwo_organization_id_idx": { + "name": "cwo_organization_id_idx", + "columns": [ + { + "expression": "organization_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "cwo_federated_graph_id_idx": { + "name": "cwo_federated_graph_id_idx", + "columns": [ + { + "expression": "federated_graph_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "cwo_created_by_id_idx": { + "name": "cwo_created_by_id_idx", + "columns": [ + { + "expression": "created_by_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "cache_warmer_operations_organization_id_organizations_id_fk": { + "name": "cache_warmer_operations_organization_id_organizations_id_fk", + "tableFrom": "cache_warmer_operations", + "tableTo": "organizations", + "columnsFrom": [ + "organization_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "cache_warmer_operations_federated_graph_id_federated_graphs_id_fk": { + "name": "cache_warmer_operations_federated_graph_id_federated_graphs_id_fk", + "tableFrom": "cache_warmer_operations", + "tableTo": "federated_graphs", + "columnsFrom": [ + "federated_graph_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "cache_warmer_operations_created_by_id_users_id_fk": { + "name": "cache_warmer_operations_created_by_id_users_id_fk", + "tableFrom": "cache_warmer_operations", + "tableTo": "users", + "columnsFrom": [ + "created_by_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.contracts": { + "name": "contracts", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "source_federated_graph_id": { + "name": "source_federated_graph_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "downstream_federated_graph_id": { + "name": "downstream_federated_graph_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "exclude_tags": { + "name": "exclude_tags", + "type": "text[]", + "primaryKey": false, + "notNull": true + }, + "include_tags": { + "name": "include_tags", + "type": "text[]", + "primaryKey": false, + "notNull": true, + "default": "'{}'::text[]" + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "created_by_id": { + "name": "created_by_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "updated_by_id": { + "name": "updated_by_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "contracts_created_by_id_idx": { + "name": "contracts_created_by_id_idx", + "columns": [ + { + "expression": "created_by_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "contracts_updated_by_id_idx": { + "name": "contracts_updated_by_id_idx", + "columns": [ + { + "expression": "updated_by_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "contracts_downstream_federated_graph_id_idx": { + "name": "contracts_downstream_federated_graph_id_idx", + "columns": [ + { + "expression": "downstream_federated_graph_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "contracts_source_federated_graph_id_federated_graphs_id_fk": { + "name": "contracts_source_federated_graph_id_federated_graphs_id_fk", + "tableFrom": "contracts", + "tableTo": "federated_graphs", + "columnsFrom": [ + "source_federated_graph_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "contracts_downstream_federated_graph_id_federated_graphs_id_fk": { + "name": "contracts_downstream_federated_graph_id_federated_graphs_id_fk", + "tableFrom": "contracts", + "tableTo": "federated_graphs", + "columnsFrom": [ + "downstream_federated_graph_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "contracts_created_by_id_users_id_fk": { + "name": "contracts_created_by_id_users_id_fk", + "tableFrom": "contracts", + "tableTo": "users", + "columnsFrom": [ + "created_by_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "contracts_updated_by_id_users_id_fk": { + "name": "contracts_updated_by_id_users_id_fk", + "tableFrom": "contracts", + "tableTo": "users", + "columnsFrom": [ + "updated_by_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "federated_graph_source_downstream_id": { + "name": "federated_graph_source_downstream_id", + "nullsNotDistinct": false, + "columns": [ + "source_federated_graph_id", + "downstream_federated_graph_id" + ] + } + }, + "checkConstraints": {} + }, + "public.feature_flags_to_feature_subgraphs": { + "name": "feature_flags_to_feature_subgraphs", + "schema": "", + "columns": { + "feature_flag_id": { + "name": "feature_flag_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "feature_subgraph_id": { + "name": "feature_subgraph_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + } + }, + "indexes": { + "fffs_feature_flag_id_idx": { + "name": "fffs_feature_flag_id_idx", + "columns": [ + { + "expression": "feature_flag_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "fffs_feature_subgraph_id_idx": { + "name": "fffs_feature_subgraph_id_idx", + "columns": [ + { + "expression": "feature_subgraph_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "feature_flags_to_feature_subgraphs_feature_flag_id_feature_flags_id_fk": { + "name": "feature_flags_to_feature_subgraphs_feature_flag_id_feature_flags_id_fk", + "tableFrom": "feature_flags_to_feature_subgraphs", + "tableTo": "feature_flags", + "columnsFrom": [ + "feature_flag_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "feature_flags_to_feature_subgraphs_feature_subgraph_id_subgraphs_id_fk": { + "name": "feature_flags_to_feature_subgraphs_feature_subgraph_id_subgraphs_id_fk", + "tableFrom": "feature_flags_to_feature_subgraphs", + "tableTo": "subgraphs", + "columnsFrom": [ + "feature_subgraph_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "feature_flags_to_feature_subgraphs_feature_flag_id_feature_subgraph_id_pk": { + "name": "feature_flags_to_feature_subgraphs_feature_flag_id_feature_subgraph_id_pk", + "columns": [ + "feature_flag_id", + "feature_subgraph_id" + ] + } + }, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.feature_flags": { + "name": "feature_flags", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "organization_id": { + "name": "organization_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "namespace_id": { + "name": "namespace_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "labels": { + "name": "labels", + "type": "text[]", + "primaryKey": false, + "notNull": false + }, + "is_enabled": { + "name": "is_enabled", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "created_by": { + "name": "created_by", + "type": "uuid", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "ff_organization_id_idx": { + "name": "ff_organization_id_idx", + "columns": [ + { + "expression": "organization_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "ff_namespace_id_idx": { + "name": "ff_namespace_id_idx", + "columns": [ + { + "expression": "namespace_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "ff_created_by_idx": { + "name": "ff_created_by_idx", + "columns": [ + { + "expression": "created_by", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "feature_flags_organization_id_organizations_id_fk": { + "name": "feature_flags_organization_id_organizations_id_fk", + "tableFrom": "feature_flags", + "tableTo": "organizations", + "columnsFrom": [ + "organization_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "feature_flags_namespace_id_namespaces_id_fk": { + "name": "feature_flags_namespace_id_namespaces_id_fk", + "tableFrom": "feature_flags", + "tableTo": "namespaces", + "columnsFrom": [ + "namespace_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "feature_flags_created_by_users_id_fk": { + "name": "feature_flags_created_by_users_id_fk", + "tableFrom": "feature_flags", + "tableTo": "users", + "columnsFrom": [ + "created_by" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.feature_subgraphs_to_base_subgraphs": { + "name": "feature_subgraphs_to_base_subgraphs", + "schema": "", + "columns": { + "feature_subgraph_id": { + "name": "feature_subgraph_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "base_subgraph_id": { + "name": "base_subgraph_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + } + }, + "indexes": { + "fsbs_feature_subgraph_id_idx": { + "name": "fsbs_feature_subgraph_id_idx", + "columns": [ + { + "expression": "feature_subgraph_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "fsbs_base_subgraph_id_idx": { + "name": "fsbs_base_subgraph_id_idx", + "columns": [ + { + "expression": "base_subgraph_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "feature_subgraphs_to_base_subgraphs_feature_subgraph_id_subgraphs_id_fk": { + "name": "feature_subgraphs_to_base_subgraphs_feature_subgraph_id_subgraphs_id_fk", + "tableFrom": "feature_subgraphs_to_base_subgraphs", + "tableTo": "subgraphs", + "columnsFrom": [ + "feature_subgraph_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "feature_subgraphs_to_base_subgraphs_base_subgraph_id_subgraphs_id_fk": { + "name": "feature_subgraphs_to_base_subgraphs_base_subgraph_id_subgraphs_id_fk", + "tableFrom": "feature_subgraphs_to_base_subgraphs", + "tableTo": "subgraphs", + "columnsFrom": [ + "base_subgraph_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "feature_subgraphs_to_base_subgraphs_feature_subgraph_id_base_subgraph_id_pk": { + "name": "feature_subgraphs_to_base_subgraphs_feature_subgraph_id_base_subgraph_id_pk", + "columns": [ + "feature_subgraph_id", + "base_subgraph_id" + ] + } + }, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.federated_graph_clients": { + "name": "federated_graph_clients", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "federated_graph_id": { + "name": "federated_graph_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "created_by_id": { + "name": "created_by_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "updated_by_id": { + "name": "updated_by_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "fgc_created_by_id_idx": { + "name": "fgc_created_by_id_idx", + "columns": [ + { + "expression": "created_by_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "fgc_updated_by_id_idx": { + "name": "fgc_updated_by_id_idx", + "columns": [ + { + "expression": "updated_by_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "federated_graph_clients_federated_graph_id_federated_graphs_id_fk": { + "name": "federated_graph_clients_federated_graph_id_federated_graphs_id_fk", + "tableFrom": "federated_graph_clients", + "tableTo": "federated_graphs", + "columnsFrom": [ + "federated_graph_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "federated_graph_clients_created_by_id_users_id_fk": { + "name": "federated_graph_clients_created_by_id_users_id_fk", + "tableFrom": "federated_graph_clients", + "tableTo": "users", + "columnsFrom": [ + "created_by_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "federated_graph_clients_updated_by_id_users_id_fk": { + "name": "federated_graph_clients_updated_by_id_users_id_fk", + "tableFrom": "federated_graph_clients", + "tableTo": "users", + "columnsFrom": [ + "updated_by_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "federated_graph_client_name": { + "name": "federated_graph_client_name", + "nullsNotDistinct": false, + "columns": [ + "federated_graph_id", + "name" + ] + } + }, + "checkConstraints": {} + }, + "public.federated_graph_persisted_operations": { + "name": "federated_graph_persisted_operations", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "federated_graph_id": { + "name": "federated_graph_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "client_id": { + "name": "client_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "operation_id": { + "name": "operation_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "hash": { + "name": "hash", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "file_path": { + "name": "file_path", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "operation_names": { + "name": "operation_names", + "type": "text[]", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "operation_content": { + "name": "operation_content", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "created_by_id": { + "name": "created_by_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "updated_by_id": { + "name": "updated_by_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "fgpo_created_by_id_idx": { + "name": "fgpo_created_by_id_idx", + "columns": [ + { + "expression": "created_by_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "fgpo_updated_by_id_idx": { + "name": "fgpo_updated_by_id_idx", + "columns": [ + { + "expression": "updated_by_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "fgpo_client_id_idx": { + "name": "fgpo_client_id_idx", + "columns": [ + { + "expression": "client_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "federated_graph_persisted_operations_federated_graph_id_federated_graphs_id_fk": { + "name": "federated_graph_persisted_operations_federated_graph_id_federated_graphs_id_fk", + "tableFrom": "federated_graph_persisted_operations", + "tableTo": "federated_graphs", + "columnsFrom": [ + "federated_graph_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "federated_graph_persisted_operations_client_id_federated_graph_clients_id_fk": { + "name": "federated_graph_persisted_operations_client_id_federated_graph_clients_id_fk", + "tableFrom": "federated_graph_persisted_operations", + "tableTo": "federated_graph_clients", + "columnsFrom": [ + "client_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "federated_graph_persisted_operations_created_by_id_users_id_fk": { + "name": "federated_graph_persisted_operations_created_by_id_users_id_fk", + "tableFrom": "federated_graph_persisted_operations", + "tableTo": "users", + "columnsFrom": [ + "created_by_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "federated_graph_persisted_operations_updated_by_id_users_id_fk": { + "name": "federated_graph_persisted_operations_updated_by_id_users_id_fk", + "tableFrom": "federated_graph_persisted_operations", + "tableTo": "users", + "columnsFrom": [ + "updated_by_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "federated_graph_persisted_operations_file_path_unique": { + "name": "federated_graph_persisted_operations_file_path_unique", + "nullsNotDistinct": false, + "columns": [ + "file_path" + ] + }, + "federated_graph_operation_id": { + "name": "federated_graph_operation_id", + "nullsNotDistinct": false, + "columns": [ + "federated_graph_id", + "client_id", + "operation_id" + ] + } + }, + "checkConstraints": {} + }, + "public.federated_graphs": { + "name": "federated_graphs", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "routing_url": { + "name": "routing_url", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "target_id": { + "name": "target_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "composed_schema_version_id": { + "name": "composed_schema_version_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "admission_webhook_url": { + "name": "admission_webhook_url", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "admission_webhook_secret": { + "name": "admission_webhook_secret", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "supports_federation": { + "name": "supports_federation", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": true + }, + "router_compatibility_version": { + "name": "router_compatibility_version", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "'1'" + } + }, + "indexes": { + "fgs_target_id_idx": { + "name": "fgs_target_id_idx", + "columns": [ + { + "expression": "target_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "fgs_composed_schema_version_id_idx": { + "name": "fgs_composed_schema_version_id_idx", + "columns": [ + { + "expression": "composed_schema_version_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "federated_graphs_target_id_targets_id_fk": { + "name": "federated_graphs_target_id_targets_id_fk", + "tableFrom": "federated_graphs", + "tableTo": "targets", + "columnsFrom": [ + "target_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "federated_graphs_composed_schema_version_id_schema_versions_id_fk": { + "name": "federated_graphs_composed_schema_version_id_schema_versions_id_fk", + "tableFrom": "federated_graphs", + "tableTo": "schema_versions", + "columnsFrom": [ + "composed_schema_version_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.federated_graphs_to_feature_flag_schema_versions": { + "name": "federated_graphs_to_feature_flag_schema_versions", + "schema": "", + "columns": { + "federated_graph_id": { + "name": "federated_graph_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "base_composition_schema_version_id": { + "name": "base_composition_schema_version_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "composed_schema_version_id": { + "name": "composed_schema_version_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "feature_flag_id": { + "name": "feature_flag_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "fgffsv_federated_graph_id_idx": { + "name": "fgffsv_federated_graph_id_idx", + "columns": [ + { + "expression": "federated_graph_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "fgffsv_base_composition_schema_version_id_idx": { + "name": "fgffsv_base_composition_schema_version_id_idx", + "columns": [ + { + "expression": "base_composition_schema_version_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "fgffsv_composed_schema_version_id_idx": { + "name": "fgffsv_composed_schema_version_id_idx", + "columns": [ + { + "expression": "composed_schema_version_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "fgffsv_feature_flag_id_idx": { + "name": "fgffsv_feature_flag_id_idx", + "columns": [ + { + "expression": "feature_flag_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "federated_graphs_to_feature_flag_schema_versions_federated_graph_id_federated_graphs_id_fk": { + "name": "federated_graphs_to_feature_flag_schema_versions_federated_graph_id_federated_graphs_id_fk", + "tableFrom": "federated_graphs_to_feature_flag_schema_versions", + "tableTo": "federated_graphs", + "columnsFrom": [ + "federated_graph_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "federated_graphs_to_feature_flag_schema_versions_base_composition_schema_version_id_schema_versions_id_fk": { + "name": "federated_graphs_to_feature_flag_schema_versions_base_composition_schema_version_id_schema_versions_id_fk", + "tableFrom": "federated_graphs_to_feature_flag_schema_versions", + "tableTo": "schema_versions", + "columnsFrom": [ + "base_composition_schema_version_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "federated_graphs_to_feature_flag_schema_versions_composed_schema_version_id_schema_versions_id_fk": { + "name": "federated_graphs_to_feature_flag_schema_versions_composed_schema_version_id_schema_versions_id_fk", + "tableFrom": "federated_graphs_to_feature_flag_schema_versions", + "tableTo": "schema_versions", + "columnsFrom": [ + "composed_schema_version_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "federated_graphs_to_feature_flag_schema_versions_feature_flag_id_feature_flags_id_fk": { + "name": "federated_graphs_to_feature_flag_schema_versions_feature_flag_id_feature_flags_id_fk", + "tableFrom": "federated_graphs_to_feature_flag_schema_versions", + "tableTo": "feature_flags", + "columnsFrom": [ + "feature_flag_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "federated_graphs_to_feature_flag_schema_versions_federated_graph_id_base_composition_schema_version_id_composed_schema_version_id_pk": { + "name": "federated_graphs_to_feature_flag_schema_versions_federated_graph_id_base_composition_schema_version_id_composed_schema_version_id_pk", + "columns": [ + "federated_graph_id", + "base_composition_schema_version_id", + "composed_schema_version_id" + ] + } + }, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.field_grace_period": { + "name": "field_grace_period", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "subgraph_id": { + "name": "subgraph_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "organization_id": { + "name": "organization_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "namespace_id": { + "name": "namespace_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "path": { + "name": "path", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "expires_at": { + "name": "expires_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true + }, + "is_deprecated": { + "name": "is_deprecated", + "type": "boolean", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "unique_field_grace_period_idx": { + "name": "unique_field_grace_period_idx", + "columns": [ + { + "expression": "subgraph_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "namespace_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "organization_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "path", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "is_deprecated", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + }, + "fgp_subgraph_id_idx": { + "name": "fgp_subgraph_id_idx", + "columns": [ + { + "expression": "subgraph_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "fgp_organization_id_idx": { + "name": "fgp_organization_id_idx", + "columns": [ + { + "expression": "organization_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "fgp_namespace_id_idx": { + "name": "fgp_namespace_id_idx", + "columns": [ + { + "expression": "namespace_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "field_grace_period_subgraph_id_subgraphs_id_fk": { + "name": "field_grace_period_subgraph_id_subgraphs_id_fk", + "tableFrom": "field_grace_period", + "tableTo": "subgraphs", + "columnsFrom": [ + "subgraph_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "field_grace_period_organization_id_organizations_id_fk": { + "name": "field_grace_period_organization_id_organizations_id_fk", + "tableFrom": "field_grace_period", + "tableTo": "organizations", + "columnsFrom": [ + "organization_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "field_grace_period_namespace_id_namespaces_id_fk": { + "name": "field_grace_period_namespace_id_namespaces_id_fk", + "tableFrom": "field_grace_period", + "tableTo": "namespaces", + "columnsFrom": [ + "namespace_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.git_installations": { + "name": "git_installations", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "slug": { + "name": "slug", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "type": { + "name": "type", + "type": "git_installation_type", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "provider_account_id": { + "name": "provider_account_id", + "type": "bigint", + "primaryKey": false, + "notNull": true + }, + "provider_installation_id": { + "name": "provider_installation_id", + "type": "bigint", + "primaryKey": false, + "notNull": true + }, + "provider_name": { + "name": "provider_name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "oauth_token": { + "name": "oauth_token", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.graph_api_tokens": { + "name": "graph_api_tokens", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "organization_id": { + "name": "organization_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "federated_graph_id": { + "name": "federated_graph_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "token": { + "name": "token", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "created_by": { + "name": "created_by", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "graphApiToken_name_idx": { + "name": "graphApiToken_name_idx", + "columns": [ + { + "expression": "name", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "federated_graph_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + }, + "gat_organization_id_idx": { + "name": "gat_organization_id_idx", + "columns": [ + { + "expression": "organization_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "gat_federated_graph_id_idx": { + "name": "gat_federated_graph_id_idx", + "columns": [ + { + "expression": "federated_graph_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "gat_created_by_idx": { + "name": "gat_created_by_idx", + "columns": [ + { + "expression": "created_by", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "graph_api_tokens_organization_id_organizations_id_fk": { + "name": "graph_api_tokens_organization_id_organizations_id_fk", + "tableFrom": "graph_api_tokens", + "tableTo": "organizations", + "columnsFrom": [ + "organization_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "graph_api_tokens_federated_graph_id_federated_graphs_id_fk": { + "name": "graph_api_tokens_federated_graph_id_federated_graphs_id_fk", + "tableFrom": "graph_api_tokens", + "tableTo": "federated_graphs", + "columnsFrom": [ + "federated_graph_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "graph_api_tokens_created_by_users_id_fk": { + "name": "graph_api_tokens_created_by_users_id_fk", + "tableFrom": "graph_api_tokens", + "tableTo": "users", + "columnsFrom": [ + "created_by" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "graph_api_tokens_token_unique": { + "name": "graph_api_tokens_token_unique", + "nullsNotDistinct": false, + "columns": [ + "token" + ] + } + }, + "checkConstraints": {} + }, + "public.graph_composition_subgraphs": { + "name": "graph_composition_subgraphs", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "graph_composition_id": { + "name": "graph_composition_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "subgraph_id": { + "name": "subgraph_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "subgraph_target_id": { + "name": "subgraph_target_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "subgraph_name": { + "name": "subgraph_name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "schema_version_id": { + "name": "schema_version_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "change_type": { + "name": "change_type", + "type": "graph_composition_subgraph_change_type", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'unchanged'" + }, + "is_feature_subgraph": { + "name": "is_feature_subgraph", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "graphcompsub_graph_composition_id_idx": { + "name": "graphcompsub_graph_composition_id_idx", + "columns": [ + { + "expression": "graph_composition_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "graphcompsub_schema_version_id_idx": { + "name": "graphcompsub_schema_version_id_idx", + "columns": [ + { + "expression": "schema_version_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "graph_composition_subgraphs_graph_composition_id_graph_compositions_id_fk": { + "name": "graph_composition_subgraphs_graph_composition_id_graph_compositions_id_fk", + "tableFrom": "graph_composition_subgraphs", + "tableTo": "graph_compositions", + "columnsFrom": [ + "graph_composition_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "graph_composition_subgraphs_schema_version_id_schema_versions_id_fk": { + "name": "graph_composition_subgraphs_schema_version_id_schema_versions_id_fk", + "tableFrom": "graph_composition_subgraphs", + "tableTo": "schema_versions", + "columnsFrom": [ + "schema_version_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.graph_compositions": { + "name": "graph_compositions", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "schema_version_id": { + "name": "schema_version_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "is_composable": { + "name": "is_composable", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "composition_errors": { + "name": "composition_errors", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "composition_warnings": { + "name": "composition_warnings", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "router_config_signature": { + "name": "router_config_signature", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "deployment_error": { + "name": "deployment_error", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "admission_error": { + "name": "admission_error", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "created_by_id": { + "name": "created_by_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "created_by_email": { + "name": "created_by_email", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "is_feature_flag_composition": { + "name": "is_feature_flag_composition", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "router_compatibility_version": { + "name": "router_compatibility_version", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "'1'" + } + }, + "indexes": { + "graphcomp_schema_version_id_idx": { + "name": "graphcomp_schema_version_id_idx", + "columns": [ + { + "expression": "schema_version_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "graphcomp_created_by_id_idx": { + "name": "graphcomp_created_by_id_idx", + "columns": [ + { + "expression": "created_by_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "graph_compositions_schema_version_id_schema_versions_id_fk": { + "name": "graph_compositions_schema_version_id_schema_versions_id_fk", + "tableFrom": "graph_compositions", + "tableTo": "schema_versions", + "columnsFrom": [ + "schema_version_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "graph_compositions_created_by_id_users_id_fk": { + "name": "graph_compositions_created_by_id_users_id_fk", + "tableFrom": "graph_compositions", + "tableTo": "users", + "columnsFrom": [ + "created_by_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.graph_request_keys": { + "name": "graph_request_keys", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "organization_id": { + "name": "organization_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "federated_graph_id": { + "name": "federated_graph_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "privateKey": { + "name": "privateKey", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "publicKey": { + "name": "publicKey", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "grk_organization_id_idx": { + "name": "grk_organization_id_idx", + "columns": [ + { + "expression": "organization_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "grk_federated_graph_id_idx": { + "name": "grk_federated_graph_id_idx", + "columns": [ + { + "expression": "federated_graph_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "graph_request_keys_organization_id_organizations_id_fk": { + "name": "graph_request_keys_organization_id_organizations_id_fk", + "tableFrom": "graph_request_keys", + "tableTo": "organizations", + "columnsFrom": [ + "organization_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "graph_request_keys_federated_graph_id_federated_graphs_id_fk": { + "name": "graph_request_keys_federated_graph_id_federated_graphs_id_fk", + "tableFrom": "graph_request_keys", + "tableTo": "federated_graphs", + "columnsFrom": [ + "federated_graph_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "graph_request_keys_federated_graph_id_unique": { + "name": "graph_request_keys_federated_graph_id_unique", + "nullsNotDistinct": false, + "columns": [ + "federated_graph_id" + ] + }, + "graph_request_keys_privateKey_unique": { + "name": "graph_request_keys_privateKey_unique", + "nullsNotDistinct": false, + "columns": [ + "privateKey" + ] + }, + "graph_request_keys_publicKey_unique": { + "name": "graph_request_keys_publicKey_unique", + "nullsNotDistinct": false, + "columns": [ + "publicKey" + ] + } + }, + "checkConstraints": {} + }, + "public.linked_schema_checks": { + "name": "linked_schema_checks", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "schema_check_id": { + "name": "schema_check_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "linked_schema_check_id": { + "name": "linked_schema_check_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + } + }, + "indexes": { + "lsc_schema_check_id_linked_schema_check_id_unique": { + "name": "lsc_schema_check_id_linked_schema_check_id_unique", + "columns": [ + { + "expression": "schema_check_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "linked_schema_check_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + }, + "lsc_schema_check_id_idx": { + "name": "lsc_schema_check_id_idx", + "columns": [ + { + "expression": "schema_check_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "lsc_linked_schema_check_id_idx": { + "name": "lsc_linked_schema_check_id_idx", + "columns": [ + { + "expression": "linked_schema_check_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "linked_schema_checks_schema_check_id_schema_checks_id_fk": { + "name": "linked_schema_checks_schema_check_id_schema_checks_id_fk", + "tableFrom": "linked_schema_checks", + "tableTo": "schema_checks", + "columnsFrom": [ + "schema_check_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "linked_schema_checks_linked_schema_check_id_schema_checks_id_fk": { + "name": "linked_schema_checks_linked_schema_check_id_schema_checks_id_fk", + "tableFrom": "linked_schema_checks", + "tableTo": "schema_checks", + "columnsFrom": [ + "linked_schema_check_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.linked_subgraphs": { + "name": "linked_subgraphs", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "source_subgraph_id": { + "name": "source_subgraph_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "target_subgraph_id": { + "name": "target_subgraph_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "created_by_id": { + "name": "created_by_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "ls_source_subgraph_id_idx": { + "name": "ls_source_subgraph_id_idx", + "columns": [ + { + "expression": "source_subgraph_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "ls_target_subgraph_id_idx": { + "name": "ls_target_subgraph_id_idx", + "columns": [ + { + "expression": "target_subgraph_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "ls_created_by_id_idx": { + "name": "ls_created_by_id_idx", + "columns": [ + { + "expression": "created_by_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "linked_subgraphs_source_subgraph_id_subgraphs_id_fk": { + "name": "linked_subgraphs_source_subgraph_id_subgraphs_id_fk", + "tableFrom": "linked_subgraphs", + "tableTo": "subgraphs", + "columnsFrom": [ + "source_subgraph_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "linked_subgraphs_target_subgraph_id_subgraphs_id_fk": { + "name": "linked_subgraphs_target_subgraph_id_subgraphs_id_fk", + "tableFrom": "linked_subgraphs", + "tableTo": "subgraphs", + "columnsFrom": [ + "target_subgraph_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "linked_subgraphs_created_by_id_users_id_fk": { + "name": "linked_subgraphs_created_by_id_users_id_fk", + "tableFrom": "linked_subgraphs", + "tableTo": "users", + "columnsFrom": [ + "created_by_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "linked_subgraphs_source_subgraph_id_unique": { + "name": "linked_subgraphs_source_subgraph_id_unique", + "nullsNotDistinct": false, + "columns": [ + "source_subgraph_id" + ] + } + }, + "checkConstraints": {} + }, + "public.namespace_cache_warmer_config": { + "name": "namespace_cache_warmer_config", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "namespace_id": { + "name": "namespace_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "max_operations_count": { + "name": "max_operations_count", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "nscwc_namespace_id_idx": { + "name": "nscwc_namespace_id_idx", + "columns": [ + { + "expression": "namespace_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "namespace_cache_warmer_config_namespace_id_namespaces_id_fk": { + "name": "namespace_cache_warmer_config_namespace_id_namespaces_id_fk", + "tableFrom": "namespace_cache_warmer_config", + "tableTo": "namespaces", + "columnsFrom": [ + "namespace_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "namespace_cache_warmer_config_namespace_id_unique": { + "name": "namespace_cache_warmer_config_namespace_id_unique", + "nullsNotDistinct": false, + "columns": [ + "namespace_id" + ] + } + }, + "checkConstraints": {} + }, + "public.namespace_config": { + "name": "namespace_config", + "schema": "", + "columns": { + "namespace_id": { + "name": "namespace_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "enable_linting": { + "name": "enable_linting", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "enable_graph_pruning": { + "name": "enable_graph_pruning", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "enable_cache_warming": { + "name": "enable_cache_warming", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "checks_timeframe_in_days": { + "name": "checks_timeframe_in_days", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "enable_proposals": { + "name": "enable_proposals", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "enable_subgraph_check_extensions": { + "name": "enable_subgraph_check_extensions", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + } + }, + "indexes": {}, + "foreignKeys": { + "namespace_config_namespace_id_namespaces_id_fk": { + "name": "namespace_config_namespace_id_namespaces_id_fk", + "tableFrom": "namespace_config", + "tableTo": "namespaces", + "columnsFrom": [ + "namespace_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "unique_namespace": { + "name": "unique_namespace", + "nullsNotDistinct": false, + "columns": [ + "namespace_id" + ] + } + }, + "checkConstraints": {} + }, + "public.namespace_graph_pruning_check_config": { + "name": "namespace_graph_pruning_check_config", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "namespace_id": { + "name": "namespace_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "graph_pruning_rule": { + "name": "graph_pruning_rule", + "type": "graph_pruning_rules", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "severity_level": { + "name": "severity_level", + "type": "lint_severity", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "grace_period": { + "name": "grace_period", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "scheme_usage_check_period": { + "name": "scheme_usage_check_period", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "nsgpcc_namespace_id_idx": { + "name": "nsgpcc_namespace_id_idx", + "columns": [ + { + "expression": "namespace_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "namespace_graph_pruning_check_config_namespace_id_namespaces_id_fk": { + "name": "namespace_graph_pruning_check_config_namespace_id_namespaces_id_fk", + "tableFrom": "namespace_graph_pruning_check_config", + "tableTo": "namespaces", + "columnsFrom": [ + "namespace_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.namespace_lint_check_config": { + "name": "namespace_lint_check_config", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "namespace_id": { + "name": "namespace_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "lint_rule": { + "name": "lint_rule", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "severity_level": { + "name": "severity_level", + "type": "lint_severity", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "nslcc_namespace_id_idx": { + "name": "nslcc_namespace_id_idx", + "columns": [ + { + "expression": "namespace_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "namespace_lint_check_config_namespace_id_namespaces_id_fk": { + "name": "namespace_lint_check_config_namespace_id_namespaces_id_fk", + "tableFrom": "namespace_lint_check_config", + "tableTo": "namespaces", + "columnsFrom": [ + "namespace_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.namespace_proposal_config": { + "name": "namespace_proposal_config", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "namespace_id": { + "name": "namespace_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "check_severity_level": { + "name": "check_severity_level", + "type": "lint_severity", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "publish_severity_level": { + "name": "publish_severity_level", + "type": "lint_severity", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "namespace_proposal_config_namespace_id_namespaces_id_fk": { + "name": "namespace_proposal_config_namespace_id_namespaces_id_fk", + "tableFrom": "namespace_proposal_config", + "tableTo": "namespaces", + "columnsFrom": [ + "namespace_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "npc_namespace_id_idx": { + "name": "npc_namespace_id_idx", + "nullsNotDistinct": false, + "columns": [ + "namespace_id" + ] + } + }, + "checkConstraints": {} + }, + "public.namespace_subgraph_check_extensions_config": { + "name": "namespace_subgraph_check_extensions_config", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "namespace_id": { + "name": "namespace_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "endpoint": { + "name": "endpoint", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "secret_key": { + "name": "secret_key", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "include_composed_sdl": { + "name": "include_composed_sdl", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "include_linting_issues": { + "name": "include_linting_issues", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "include_pruning_issues": { + "name": "include_pruning_issues", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "include_schema_changes": { + "name": "include_schema_changes", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "include_affected_operations": { + "name": "include_affected_operations", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + } + }, + "indexes": { + "nsce_namespace_id_idx": { + "name": "nsce_namespace_id_idx", + "columns": [ + { + "expression": "namespace_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "namespace_subgraph_check_extensions_config_namespace_id_namespaces_id_fk": { + "name": "namespace_subgraph_check_extensions_config_namespace_id_namespaces_id_fk", + "tableFrom": "namespace_subgraph_check_extensions_config", + "tableTo": "namespaces", + "columnsFrom": [ + "namespace_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "namespace_subgraph_check_extensions_config_namespace_id_unique": { + "name": "namespace_subgraph_check_extensions_config_namespace_id_unique", + "nullsNotDistinct": false, + "columns": [ + "namespace_id" + ] + } + }, + "checkConstraints": {} + }, + "public.namespaces": { + "name": "namespaces", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "organization_id": { + "name": "organization_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "created_by": { + "name": "created_by", + "type": "uuid", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "ns_organization_id_idx": { + "name": "ns_organization_id_idx", + "columns": [ + { + "expression": "organization_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "ns_created_by_idx": { + "name": "ns_created_by_idx", + "columns": [ + { + "expression": "created_by", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "namespaces_organization_id_organizations_id_fk": { + "name": "namespaces_organization_id_organizations_id_fk", + "tableFrom": "namespaces", + "tableTo": "organizations", + "columnsFrom": [ + "organization_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "namespaces_created_by_users_id_fk": { + "name": "namespaces_created_by_users_id_fk", + "tableFrom": "namespaces", + "tableTo": "users", + "columnsFrom": [ + "created_by" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "unique_name": { + "name": "unique_name", + "nullsNotDistinct": false, + "columns": [ + "name", + "organization_id" + ] + } + }, + "checkConstraints": {} + }, + "public.oidc_providers": { + "name": "oidc_providers", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "organization_id": { + "name": "organization_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "alias": { + "name": "alias", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "endpoint": { + "name": "endpoint", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": { + "oidcp_organization_id_idx": { + "name": "oidcp_organization_id_idx", + "columns": [ + { + "expression": "organization_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "oidc_providers_organization_id_organizations_id_fk": { + "name": "oidc_providers_organization_id_organizations_id_fk", + "tableFrom": "oidc_providers", + "tableTo": "organizations", + "columnsFrom": [ + "organization_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "oidc_providers_alias_unique": { + "name": "oidc_providers_alias_unique", + "nullsNotDistinct": false, + "columns": [ + "alias" + ] + } + }, + "checkConstraints": {} + }, + "public.operation_change_overrides": { + "name": "operation_change_overrides", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "hash": { + "name": "hash", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "namespace_id": { + "name": "namespace_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "change_type": { + "name": "change_type", + "type": "schema_change_type", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "path": { + "name": "path", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "created_by": { + "name": "created_by", + "type": "uuid", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "hash_change_idx": { + "name": "hash_change_idx", + "columns": [ + { + "expression": "hash", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "namespace_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "change_type", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "path", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + }, + "oco_created_by_idx": { + "name": "oco_created_by_idx", + "columns": [ + { + "expression": "created_by", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "operation_change_overrides_created_by_users_id_fk": { + "name": "operation_change_overrides_created_by_users_id_fk", + "tableFrom": "operation_change_overrides", + "tableTo": "users", + "columnsFrom": [ + "created_by" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.operation_ignore_all_overrides": { + "name": "operation_ignore_all_overrides", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "hash": { + "name": "hash", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "namespace_id": { + "name": "namespace_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "created_by": { + "name": "created_by", + "type": "uuid", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "hash_namespace_ignore_idx": { + "name": "hash_namespace_ignore_idx", + "columns": [ + { + "expression": "hash", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "namespace_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + }, + "oiao_created_by_idx": { + "name": "oiao_created_by_idx", + "columns": [ + { + "expression": "created_by", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "operation_ignore_all_overrides_created_by_users_id_fk": { + "name": "operation_ignore_all_overrides_created_by_users_id_fk", + "tableFrom": "operation_ignore_all_overrides", + "tableTo": "users", + "columnsFrom": [ + "created_by" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.organization_billing": { + "name": "organization_billing", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "organization_id": { + "name": "organization_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "plan": { + "name": "plan", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "stripe_customer_id": { + "name": "stripe_customer_id", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "organization_billing_idx": { + "name": "organization_billing_idx", + "columns": [ + { + "expression": "organization_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + }, + "organization_billing_stripe_idx": { + "name": "organization_billing_stripe_idx", + "columns": [ + { + "expression": "stripe_customer_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "organization_billing_organization_id_organizations_id_fk": { + "name": "organization_billing_organization_id_organizations_id_fk", + "tableFrom": "organization_billing", + "tableTo": "organizations", + "columnsFrom": [ + "organization_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.organization_features": { + "name": "organization_features", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "organization_id": { + "name": "organization_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "feature": { + "name": "feature", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "enabled": { + "name": "enabled", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": true + }, + "limit": { + "name": "limit", + "type": "real", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "organization_feature_idx": { + "name": "organization_feature_idx", + "columns": [ + { + "expression": "organization_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "feature", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + }, + "orgf_organization_id_idx": { + "name": "orgf_organization_id_idx", + "columns": [ + { + "expression": "organization_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "organization_features_organization_id_organizations_id_fk": { + "name": "organization_features_organization_id_organizations_id_fk", + "tableFrom": "organization_features", + "tableTo": "organizations", + "columnsFrom": [ + "organization_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.organization_group_members": { + "name": "organization_group_members", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "organization_member_id": { + "name": "organization_member_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "group_id": { + "name": "group_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "organization_member_group_idx": { + "name": "organization_member_group_idx", + "columns": [ + { + "expression": "organization_member_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "group_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "organization_group_members_organization_member_id_organization_members_id_fk": { + "name": "organization_group_members_organization_member_id_organization_members_id_fk", + "tableFrom": "organization_group_members", + "tableTo": "organization_members", + "columnsFrom": [ + "organization_member_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "organization_group_members_group_id_organization_groups_id_fk": { + "name": "organization_group_members_group_id_organization_groups_id_fk", + "tableFrom": "organization_group_members", + "tableTo": "organization_groups", + "columnsFrom": [ + "group_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.organization_group_rule_namespaces": { + "name": "organization_group_rule_namespaces", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "rule_id": { + "name": "rule_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "namespace_id": { + "name": "namespace_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "organization_group_rule_namespaces_rule_id_organization_group_rules_id_fk": { + "name": "organization_group_rule_namespaces_rule_id_organization_group_rules_id_fk", + "tableFrom": "organization_group_rule_namespaces", + "tableTo": "organization_group_rules", + "columnsFrom": [ + "rule_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "organization_group_rule_namespaces_namespace_id_namespaces_id_fk": { + "name": "organization_group_rule_namespaces_namespace_id_namespaces_id_fk", + "tableFrom": "organization_group_rule_namespaces", + "tableTo": "namespaces", + "columnsFrom": [ + "namespace_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.organization_group_rule_targets": { + "name": "organization_group_rule_targets", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "rule_id": { + "name": "rule_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "target_id": { + "name": "target_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "organization_group_rule_targets_rule_id_organization_group_rules_id_fk": { + "name": "organization_group_rule_targets_rule_id_organization_group_rules_id_fk", + "tableFrom": "organization_group_rule_targets", + "tableTo": "organization_group_rules", + "columnsFrom": [ + "rule_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "organization_group_rule_targets_target_id_targets_id_fk": { + "name": "organization_group_rule_targets_target_id_targets_id_fk", + "tableFrom": "organization_group_rule_targets", + "tableTo": "targets", + "columnsFrom": [ + "target_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.organization_group_rules": { + "name": "organization_group_rules", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "group_id": { + "name": "group_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "role": { + "name": "role", + "type": "organization_role", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "organization_group_rules_group_id_organization_groups_id_fk": { + "name": "organization_group_rules_group_id_organization_groups_id_fk", + "tableFrom": "organization_group_rules", + "tableTo": "organization_groups", + "columnsFrom": [ + "group_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.organization_groups": { + "name": "organization_groups", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "organization_id": { + "name": "organization_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "builtin": { + "name": "builtin", + "type": "boolean", + "primaryKey": false, + "notNull": true + }, + "kc_group_id": { + "name": "kc_group_id", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "organization_groups_organization_id_organizations_id_fk": { + "name": "organization_groups_organization_id_organizations_id_fk", + "tableFrom": "organization_groups", + "tableTo": "organizations", + "columnsFrom": [ + "organization_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "organization_groups_kc_group_id_unique": { + "name": "organization_groups_kc_group_id_unique", + "nullsNotDistinct": false, + "columns": [ + "kc_group_id" + ] + } + }, + "checkConstraints": {} + }, + "public.organization_integrations": { + "name": "organization_integrations", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "organization_id": { + "name": "organization_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "events": { + "name": "events", + "type": "text[]", + "primaryKey": false, + "notNull": false + }, + "type": { + "name": "type", + "type": "integration_type", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "organization_integration_idx": { + "name": "organization_integration_idx", + "columns": [ + { + "expression": "organization_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "name", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + }, + "orgint_organization_id_idx": { + "name": "orgint_organization_id_idx", + "columns": [ + { + "expression": "organization_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "organization_integrations_organization_id_organizations_id_fk": { + "name": "organization_integrations_organization_id_organizations_id_fk", + "tableFrom": "organization_integrations", + "tableTo": "organizations", + "columnsFrom": [ + "organization_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.organization_invitation_groups": { + "name": "organization_invitation_groups", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "invitation_id": { + "name": "invitation_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "group_id": { + "name": "group_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + } + }, + "indexes": { + "org_inv_invitation_idx": { + "name": "org_inv_invitation_idx", + "columns": [ + { + "expression": "invitation_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "org_inv_group_id": { + "name": "org_inv_group_id", + "columns": [ + { + "expression": "group_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "organization_invitation_groups_invitation_id_organization_invitations_id_fk": { + "name": "organization_invitation_groups_invitation_id_organization_invitations_id_fk", + "tableFrom": "organization_invitation_groups", + "tableTo": "organization_invitations", + "columnsFrom": [ + "invitation_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "organization_invitation_groups_group_id_organization_groups_id_fk": { + "name": "organization_invitation_groups_group_id_organization_groups_id_fk", + "tableFrom": "organization_invitation_groups", + "tableTo": "organization_groups", + "columnsFrom": [ + "group_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.organization_invitations": { + "name": "organization_invitations", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "organization_id": { + "name": "organization_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "invited_by": { + "name": "invited_by", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "accepted": { + "name": "accepted", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "last_sent_at": { + "name": "last_sent_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "orginv_organization_id_idx": { + "name": "orginv_organization_id_idx", + "columns": [ + { + "expression": "organization_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "orginv_user_id_idx": { + "name": "orginv_user_id_idx", + "columns": [ + { + "expression": "user_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "orginv_invited_by_idx": { + "name": "orginv_invited_by_idx", + "columns": [ + { + "expression": "invited_by", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "organization_invitations_organization_id_organizations_id_fk": { + "name": "organization_invitations_organization_id_organizations_id_fk", + "tableFrom": "organization_invitations", + "tableTo": "organizations", + "columnsFrom": [ + "organization_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "organization_invitations_user_id_users_id_fk": { + "name": "organization_invitations_user_id_users_id_fk", + "tableFrom": "organization_invitations", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "organization_invitations_invited_by_users_id_fk": { + "name": "organization_invitations_invited_by_users_id_fk", + "tableFrom": "organization_invitations", + "tableTo": "users", + "columnsFrom": [ + "invited_by" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.organization_member_roles": { + "name": "organization_member_roles", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "organization_member_id": { + "name": "organization_member_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "role": { + "name": "role", + "type": "member_role", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + } + }, + "indexes": { + "organization_member_role_idx": { + "name": "organization_member_role_idx", + "columns": [ + { + "expression": "organization_member_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "role", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "organization_member_roles_organization_member_id_organization_members_id_fk": { + "name": "organization_member_roles_organization_member_id_organization_members_id_fk", + "tableFrom": "organization_member_roles", + "tableTo": "organization_members", + "columnsFrom": [ + "organization_member_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.organization_webhook_configs": { + "name": "organization_webhook_configs", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "organization_id": { + "name": "organization_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "endpoint": { + "name": "endpoint", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "key": { + "name": "key", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "events": { + "name": "events", + "type": "text[]", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "orgwc_organization_id_idx": { + "name": "orgwc_organization_id_idx", + "columns": [ + { + "expression": "organization_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "organization_webhook_configs_organization_id_organizations_id_fk": { + "name": "organization_webhook_configs_organization_id_organizations_id_fk", + "tableFrom": "organization_webhook_configs", + "tableTo": "organizations", + "columnsFrom": [ + "organization_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.organizations": { + "name": "organizations", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "slug": { + "name": "slug", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "invite_code": { + "name": "invite_code", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "user_id": { + "name": "user_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "kc_group_id": { + "name": "kc_group_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "is_deactivated": { + "name": "is_deactivated", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "deactivation_reason": { + "name": "deactivation_reason", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "deactivated_at": { + "name": "deactivated_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "queued_for_deletion_at": { + "name": "queued_for_deletion_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "queued_for_deletion_by": { + "name": "queued_for_deletion_by", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "orgs_created_by_idx": { + "name": "orgs_created_by_idx", + "columns": [ + { + "expression": "user_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "organizations_user_id_users_id_fk": { + "name": "organizations_user_id_users_id_fk", + "tableFrom": "organizations", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "organizations_slug_unique": { + "name": "organizations_slug_unique", + "nullsNotDistinct": false, + "columns": [ + "slug" + ] + }, + "organizations_kc_group_id_unique": { + "name": "organizations_kc_group_id_unique", + "nullsNotDistinct": false, + "columns": [ + "kc_group_id" + ] + } + }, + "checkConstraints": {} + }, + "public.organization_members": { + "name": "organization_members", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "user_id": { + "name": "user_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "organization_id": { + "name": "organization_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "active": { + "name": "active", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "organization_member_idx": { + "name": "organization_member_idx", + "columns": [ + { + "expression": "id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + }, + "unique_organization_member_idx": { + "name": "unique_organization_member_idx", + "columns": [ + { + "expression": "user_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "organization_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + }, + "orgm_organization_id_idx": { + "name": "orgm_organization_id_idx", + "columns": [ + { + "expression": "organization_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "organization_members_user_id_users_id_fk": { + "name": "organization_members_user_id_users_id_fk", + "tableFrom": "organization_members", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "organization_members_organization_id_organizations_id_fk": { + "name": "organization_members_organization_id_organizations_id_fk", + "tableFrom": "organization_members", + "tableTo": "organizations", + "columnsFrom": [ + "organization_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.playground_scripts": { + "name": "playground_scripts", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "organization_id": { + "name": "organization_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "created_by_id": { + "name": "created_by_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "title": { + "name": "title", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "''" + }, + "type": { + "name": "type", + "type": "playground_script_type", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "content": { + "name": "content", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "''" + } + }, + "indexes": { + "ps_organization_id_idx": { + "name": "ps_organization_id_idx", + "columns": [ + { + "expression": "organization_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "ps_created_by_id_idx": { + "name": "ps_created_by_id_idx", + "columns": [ + { + "expression": "created_by_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "playground_scripts_organization_id_organizations_id_fk": { + "name": "playground_scripts_organization_id_organizations_id_fk", + "tableFrom": "playground_scripts", + "tableTo": "organizations", + "columnsFrom": [ + "organization_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "playground_scripts_created_by_id_users_id_fk": { + "name": "playground_scripts_created_by_id_users_id_fk", + "tableFrom": "playground_scripts", + "tableTo": "users", + "columnsFrom": [ + "created_by_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.plugin_image_versions": { + "name": "plugin_image_versions", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "schema_version_id": { + "name": "schema_version_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "version": { + "name": "version", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "platform": { + "name": "platform", + "type": "text[]", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "plugin_image_versions_schema_version_id_schema_versions_id_fk": { + "name": "plugin_image_versions_schema_version_id_schema_versions_id_fk", + "tableFrom": "plugin_image_versions", + "tableTo": "schema_versions", + "columnsFrom": [ + "schema_version_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.proposal_checks": { + "name": "proposal_checks", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "schema_check_id": { + "name": "schema_check_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "proposal_id": { + "name": "proposal_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "pc_check_id_proposal_id_idx": { + "name": "pc_check_id_proposal_id_idx", + "columns": [ + { + "expression": "schema_check_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "proposal_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "proposal_checks_schema_check_id_schema_checks_id_fk": { + "name": "proposal_checks_schema_check_id_schema_checks_id_fk", + "tableFrom": "proposal_checks", + "tableTo": "schema_checks", + "columnsFrom": [ + "schema_check_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "proposal_checks_proposal_id_proposals_id_fk": { + "name": "proposal_checks_proposal_id_proposals_id_fk", + "tableFrom": "proposal_checks", + "tableTo": "proposals", + "columnsFrom": [ + "proposal_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.proposal_subgraphs": { + "name": "proposal_subgraphs", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "proposal_id": { + "name": "proposal_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "subgraph_id": { + "name": "subgraph_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "subgraph_name": { + "name": "subgraph_name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "schema_sdl": { + "name": "schema_sdl", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "is_deleted": { + "name": "is_deleted", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "is_new": { + "name": "is_new", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "is_published": { + "name": "is_published", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "current_schema_version_id": { + "name": "current_schema_version_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "labels": { + "name": "labels", + "type": "text[]", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "proposal_subgraphs_proposal_id_proposals_id_fk": { + "name": "proposal_subgraphs_proposal_id_proposals_id_fk", + "tableFrom": "proposal_subgraphs", + "tableTo": "proposals", + "columnsFrom": [ + "proposal_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "proposal_subgraphs_subgraph_id_subgraphs_id_fk": { + "name": "proposal_subgraphs_subgraph_id_subgraphs_id_fk", + "tableFrom": "proposal_subgraphs", + "tableTo": "subgraphs", + "columnsFrom": [ + "subgraph_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "proposal_subgraphs_current_schema_version_id_schema_versions_id_fk": { + "name": "proposal_subgraphs_current_schema_version_id_schema_versions_id_fk", + "tableFrom": "proposal_subgraphs", + "tableTo": "schema_versions", + "columnsFrom": [ + "current_schema_version_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "proposal_subgraph": { + "name": "proposal_subgraph", + "nullsNotDistinct": false, + "columns": [ + "proposal_id", + "subgraph_name" + ] + } + }, + "checkConstraints": {} + }, + "public.proposals": { + "name": "proposals", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "federated_graph_id": { + "name": "federated_graph_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "created_by_id": { + "name": "created_by_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "state": { + "name": "state", + "type": "proposal_state", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "origin": { + "name": "origin", + "type": "proposal_origin", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'INTERNAL'" + } + }, + "indexes": { + "pr_created_by_id_idx": { + "name": "pr_created_by_id_idx", + "columns": [ + { + "expression": "created_by_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "pr_federated_graph_id_idx": { + "name": "pr_federated_graph_id_idx", + "columns": [ + { + "expression": "federated_graph_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "proposals_federated_graph_id_federated_graphs_id_fk": { + "name": "proposals_federated_graph_id_federated_graphs_id_fk", + "tableFrom": "proposals", + "tableTo": "federated_graphs", + "columnsFrom": [ + "federated_graph_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "proposals_created_by_id_users_id_fk": { + "name": "proposals_created_by_id_users_id_fk", + "tableFrom": "proposals", + "tableTo": "users", + "columnsFrom": [ + "created_by_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "federated_graph_proposal_name": { + "name": "federated_graph_proposal_name", + "nullsNotDistinct": false, + "columns": [ + "federated_graph_id", + "name" + ] + } + }, + "checkConstraints": {} + }, + "public.protobuf_schema_versions": { + "name": "protobuf_schema_versions", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "schema_version_id": { + "name": "schema_version_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "proto_schema": { + "name": "proto_schema", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "proto_mappings": { + "name": "proto_mappings", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "proto_lock": { + "name": "proto_lock", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "protobuf_schema_versions_schema_version_id_schema_versions_id_fk": { + "name": "protobuf_schema_versions_schema_version_id_schema_versions_id_fk", + "tableFrom": "protobuf_schema_versions", + "tableTo": "schema_versions", + "columnsFrom": [ + "schema_version_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.router_config_hash": { + "name": "router_config_hash", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "federated_graph_id": { + "name": "federated_graph_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "feature_flag_id": { + "name": "feature_flag_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "hash": { + "name": "hash", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "router_config_hash_federated_graph_id_federated_graphs_id_fk": { + "name": "router_config_hash_federated_graph_id_federated_graphs_id_fk", + "tableFrom": "router_config_hash", + "tableTo": "federated_graphs", + "columnsFrom": [ + "federated_graph_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "router_config_hash_feature_flag_id_feature_flags_id_fk": { + "name": "router_config_hash_feature_flag_id_feature_flags_id_fk", + "tableFrom": "router_config_hash", + "tableTo": "feature_flags", + "columnsFrom": [ + "feature_flag_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "fed_graph_feature_flag_idx": { + "name": "fed_graph_feature_flag_idx", + "nullsNotDistinct": true, + "columns": [ + "federated_graph_id", + "feature_flag_id" + ] + } + }, + "checkConstraints": {} + }, + "public.schema_check_change_action": { + "name": "schema_check_change_action", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "schema_check_id": { + "name": "schema_check_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "change_type": { + "name": "change_type", + "type": "schema_change_type", + "typeSchema": "public", + "primaryKey": false, + "notNull": false + }, + "change_message": { + "name": "change_message", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "is_breaking": { + "name": "is_breaking", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "path": { + "name": "path", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "schema_check_subgraph_id": { + "name": "schema_check_subgraph_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "is_fed_graph_change": { + "name": "is_fed_graph_change", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + } + }, + "indexes": { + "scca_schema_check_id_idx": { + "name": "scca_schema_check_id_idx", + "columns": [ + { + "expression": "schema_check_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "schema_check_change_action_schema_check_id_schema_checks_id_fk": { + "name": "schema_check_change_action_schema_check_id_schema_checks_id_fk", + "tableFrom": "schema_check_change_action", + "tableTo": "schema_checks", + "columnsFrom": [ + "schema_check_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "schema_check_change_action_schema_check_subgraph_id_schema_check_subgraphs_id_fk": { + "name": "schema_check_change_action_schema_check_subgraph_id_schema_check_subgraphs_id_fk", + "tableFrom": "schema_check_change_action", + "tableTo": "schema_check_subgraphs", + "columnsFrom": [ + "schema_check_subgraph_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.schema_check_change_operation_usage": { + "name": "schema_check_change_operation_usage", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "schema_check_change_action_id": { + "name": "schema_check_change_action_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "hash": { + "name": "hash", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "type": { + "name": "type", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "first_seen_at": { + "name": "first_seen_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true + }, + "last_seen_at": { + "name": "last_seen_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true + }, + "federated_graph_id": { + "name": "federated_graph_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "is_safe_override": { + "name": "is_safe_override", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + } + }, + "indexes": { + "sccou_schema_check_change_action_id_idx": { + "name": "sccou_schema_check_change_action_id_idx", + "columns": [ + { + "expression": "schema_check_change_action_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "sccou_federated_graph_id_idx": { + "name": "sccou_federated_graph_id_idx", + "columns": [ + { + "expression": "federated_graph_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "schema_check_change_operation_usage_schema_check_change_action_id_schema_check_change_action_id_fk": { + "name": "schema_check_change_operation_usage_schema_check_change_action_id_schema_check_change_action_id_fk", + "tableFrom": "schema_check_change_operation_usage", + "tableTo": "schema_check_change_action", + "columnsFrom": [ + "schema_check_change_action_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "schema_check_change_operation_usage_federated_graph_id_federated_graphs_id_fk": { + "name": "schema_check_change_operation_usage_federated_graph_id_federated_graphs_id_fk", + "tableFrom": "schema_check_change_operation_usage", + "tableTo": "federated_graphs", + "columnsFrom": [ + "federated_graph_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.schema_check_composition": { + "name": "schema_check_composition", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "schema_check_id": { + "name": "schema_check_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "target_id": { + "name": "target_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "composition_errors": { + "name": "composition_errors", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "composition_warnings": { + "name": "composition_warnings", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "composed_schema_sdl": { + "name": "composed_schema_sdl", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "client_schema": { + "name": "client_schema", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "scc_schema_check_id_idx": { + "name": "scc_schema_check_id_idx", + "columns": [ + { + "expression": "schema_check_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "scc_target_id_idx": { + "name": "scc_target_id_idx", + "columns": [ + { + "expression": "target_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "schema_check_composition_schema_check_id_schema_checks_id_fk": { + "name": "schema_check_composition_schema_check_id_schema_checks_id_fk", + "tableFrom": "schema_check_composition", + "tableTo": "schema_checks", + "columnsFrom": [ + "schema_check_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "schema_check_composition_target_id_targets_id_fk": { + "name": "schema_check_composition_target_id_targets_id_fk", + "tableFrom": "schema_check_composition", + "tableTo": "targets", + "columnsFrom": [ + "target_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.schema_check_federated_graph_changes": { + "name": "schema_check_federated_graph_changes", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "schema_check_federated_graph_id": { + "name": "schema_check_federated_graph_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "schema_check_change_action_id": { + "name": "schema_check_change_action_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "scfgsc_schema_check_federated_graph_id_idx": { + "name": "scfgsc_schema_check_federated_graph_id_idx", + "columns": [ + { + "expression": "schema_check_federated_graph_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "scfgsc_schema_check_change_action_id_idx": { + "name": "scfgsc_schema_check_change_action_id_idx", + "columns": [ + { + "expression": "schema_check_change_action_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "scfgc_fed_graph_change_action_unique": { + "name": "scfgc_fed_graph_change_action_unique", + "columns": [ + { + "expression": "schema_check_federated_graph_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "schema_check_change_action_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "schema_check_federated_graph_changes_schema_check_federated_graph_id_schema_check_federated_graphs_id_fk": { + "name": "schema_check_federated_graph_changes_schema_check_federated_graph_id_schema_check_federated_graphs_id_fk", + "tableFrom": "schema_check_federated_graph_changes", + "tableTo": "schema_check_federated_graphs", + "columnsFrom": [ + "schema_check_federated_graph_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "schema_check_federated_graph_changes_schema_check_change_action_id_schema_check_change_action_id_fk": { + "name": "schema_check_federated_graph_changes_schema_check_change_action_id_schema_check_change_action_id_fk", + "tableFrom": "schema_check_federated_graph_changes", + "tableTo": "schema_check_change_action", + "columnsFrom": [ + "schema_check_change_action_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.schema_check_federated_graphs": { + "name": "schema_check_federated_graphs", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "check_id": { + "name": "check_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "federated_graph_id": { + "name": "federated_graph_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "traffic_check_days": { + "name": "traffic_check_days", + "type": "integer", + "primaryKey": false, + "notNull": true + } + }, + "indexes": { + "scfg_check_id_idx": { + "name": "scfg_check_id_idx", + "columns": [ + { + "expression": "check_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "scfg_federated_graph_id_idx": { + "name": "scfg_federated_graph_id_idx", + "columns": [ + { + "expression": "federated_graph_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "schema_check_federated_graphs_check_id_schema_checks_id_fk": { + "name": "schema_check_federated_graphs_check_id_schema_checks_id_fk", + "tableFrom": "schema_check_federated_graphs", + "tableTo": "schema_checks", + "columnsFrom": [ + "check_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "schema_check_federated_graphs_federated_graph_id_federated_graphs_id_fk": { + "name": "schema_check_federated_graphs_federated_graph_id_federated_graphs_id_fk", + "tableFrom": "schema_check_federated_graphs", + "tableTo": "federated_graphs", + "columnsFrom": [ + "federated_graph_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.schema_check_graph_pruning_action": { + "name": "schema_check_graph_pruning_action", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "schema_check_id": { + "name": "schema_check_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "graph_pruning_rule": { + "name": "graph_pruning_rule", + "type": "graph_pruning_rules", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "field_path": { + "name": "field_path", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "message": { + "name": "message", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "is_error": { + "name": "is_error", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "location": { + "name": "location", + "type": "json", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "federated_graph_id": { + "name": "federated_graph_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "schema_check_subgraph_id": { + "name": "schema_check_subgraph_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "scgpa_schema_check_id_idx": { + "name": "scgpa_schema_check_id_idx", + "columns": [ + { + "expression": "schema_check_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "scgpa_federated_graph_id_idx": { + "name": "scgpa_federated_graph_id_idx", + "columns": [ + { + "expression": "federated_graph_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "schema_check_graph_pruning_action_schema_check_id_schema_checks_id_fk": { + "name": "schema_check_graph_pruning_action_schema_check_id_schema_checks_id_fk", + "tableFrom": "schema_check_graph_pruning_action", + "tableTo": "schema_checks", + "columnsFrom": [ + "schema_check_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "schema_check_graph_pruning_action_federated_graph_id_federated_graphs_id_fk": { + "name": "schema_check_graph_pruning_action_federated_graph_id_federated_graphs_id_fk", + "tableFrom": "schema_check_graph_pruning_action", + "tableTo": "federated_graphs", + "columnsFrom": [ + "federated_graph_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "schema_check_graph_pruning_action_schema_check_subgraph_id_schema_check_subgraphs_id_fk": { + "name": "schema_check_graph_pruning_action_schema_check_subgraph_id_schema_check_subgraphs_id_fk", + "tableFrom": "schema_check_graph_pruning_action", + "tableTo": "schema_check_subgraphs", + "columnsFrom": [ + "schema_check_subgraph_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.schema_check_lint_action": { + "name": "schema_check_lint_action", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "schema_check_id": { + "name": "schema_check_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "lint_rule_type": { + "name": "lint_rule_type", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "message": { + "name": "message", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "is_error": { + "name": "is_error", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "location": { + "name": "location", + "type": "json", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "schema_check_subgraph_id": { + "name": "schema_check_subgraph_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "sclact_schema_check_id_idx": { + "name": "sclact_schema_check_id_idx", + "columns": [ + { + "expression": "schema_check_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "schema_check_lint_action_schema_check_id_schema_checks_id_fk": { + "name": "schema_check_lint_action_schema_check_id_schema_checks_id_fk", + "tableFrom": "schema_check_lint_action", + "tableTo": "schema_checks", + "columnsFrom": [ + "schema_check_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "schema_check_lint_action_schema_check_subgraph_id_schema_check_subgraphs_id_fk": { + "name": "schema_check_lint_action_schema_check_subgraph_id_schema_check_subgraphs_id_fk", + "tableFrom": "schema_check_lint_action", + "tableTo": "schema_check_subgraphs", + "columnsFrom": [ + "schema_check_subgraph_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.schema_check_proposal_match": { + "name": "schema_check_proposal_match", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "schema_check_id": { + "name": "schema_check_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "proposal_id": { + "name": "proposal_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "proposal_match": { + "name": "proposal_match", + "type": "boolean", + "primaryKey": false, + "notNull": true + } + }, + "indexes": { + "scpm_schema_check_id_idx": { + "name": "scpm_schema_check_id_idx", + "columns": [ + { + "expression": "schema_check_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "scpm_proposal_id_idx": { + "name": "scpm_proposal_id_idx", + "columns": [ + { + "expression": "proposal_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "schema_check_proposal_match_schema_check_id_schema_checks_id_fk": { + "name": "schema_check_proposal_match_schema_check_id_schema_checks_id_fk", + "tableFrom": "schema_check_proposal_match", + "tableTo": "schema_checks", + "columnsFrom": [ + "schema_check_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "schema_check_proposal_match_proposal_id_proposals_id_fk": { + "name": "schema_check_proposal_match_proposal_id_proposals_id_fk", + "tableFrom": "schema_check_proposal_match", + "tableTo": "proposals", + "columnsFrom": [ + "proposal_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "unique_schema_check_proposal_match": { + "name": "unique_schema_check_proposal_match", + "nullsNotDistinct": false, + "columns": [ + "schema_check_id", + "proposal_id" + ] + } + }, + "checkConstraints": {} + }, + "public.schema_check_subgraphs": { + "name": "schema_check_subgraphs", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "schema_check_id": { + "name": "schema_check_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "subgraph_id": { + "name": "subgraph_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "subgraph_name": { + "name": "subgraph_name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "proposed_subgraph_schema_sdl": { + "name": "proposed_subgraph_schema_sdl", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "is_deleted": { + "name": "is_deleted", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "is_new": { + "name": "is_new", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "namespace_id": { + "name": "namespace_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "labels": { + "name": "labels", + "type": "text[]", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "scs_schema_check_id_idx": { + "name": "scs_schema_check_id_idx", + "columns": [ + { + "expression": "schema_check_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "scs_subgraph_id_idx": { + "name": "scs_subgraph_id_idx", + "columns": [ + { + "expression": "subgraph_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "schema_check_subgraphs_schema_check_id_schema_checks_id_fk": { + "name": "schema_check_subgraphs_schema_check_id_schema_checks_id_fk", + "tableFrom": "schema_check_subgraphs", + "tableTo": "schema_checks", + "columnsFrom": [ + "schema_check_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "schema_check_subgraphs_subgraph_id_subgraphs_id_fk": { + "name": "schema_check_subgraphs_subgraph_id_subgraphs_id_fk", + "tableFrom": "schema_check_subgraphs", + "tableTo": "subgraphs", + "columnsFrom": [ + "subgraph_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "schema_check_subgraphs_namespace_id_namespaces_id_fk": { + "name": "schema_check_subgraphs_namespace_id_namespaces_id_fk", + "tableFrom": "schema_check_subgraphs", + "tableTo": "namespaces", + "columnsFrom": [ + "namespace_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.schema_check_subgraphs_federated_graphs": { + "name": "schema_check_subgraphs_federated_graphs", + "schema": "", + "columns": { + "schema_check_federated_graph_id": { + "name": "schema_check_federated_graph_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "schema_check_subgraph_id": { + "name": "schema_check_subgraph_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "scsfg_schema_check_subgraph_id_idx": { + "name": "scsfg_schema_check_subgraph_id_idx", + "columns": [ + { + "expression": "schema_check_subgraph_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "scsfg_schema_check_federated_graph_id_idx": { + "name": "scsfg_schema_check_federated_graph_id_idx", + "columns": [ + { + "expression": "schema_check_federated_graph_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "schema_check_subgraphs_federated_graphs_schema_check_federated_graph_id_schema_check_federated_graphs_id_fk": { + "name": "schema_check_subgraphs_federated_graphs_schema_check_federated_graph_id_schema_check_federated_graphs_id_fk", + "tableFrom": "schema_check_subgraphs_federated_graphs", + "tableTo": "schema_check_federated_graphs", + "columnsFrom": [ + "schema_check_federated_graph_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "schema_check_subgraphs_federated_graphs_schema_check_subgraph_id_schema_check_subgraphs_id_fk": { + "name": "schema_check_subgraphs_federated_graphs_schema_check_subgraph_id_schema_check_subgraphs_id_fk", + "tableFrom": "schema_check_subgraphs_federated_graphs", + "tableTo": "schema_check_subgraphs", + "columnsFrom": [ + "schema_check_subgraph_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.schema_checks": { + "name": "schema_checks", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "target_id": { + "name": "target_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "is_composable": { + "name": "is_composable", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "is_deleted": { + "name": "is_deleted", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "has_breaking_changes": { + "name": "has_breaking_changes", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "has_lint_errors": { + "name": "has_lint_errors", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "has_graph_pruning_errors": { + "name": "has_graph_pruning_errors", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "has_client_traffic": { + "name": "has_client_traffic", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "proposal_match": { + "name": "proposal_match", + "type": "proposal_match", + "typeSchema": "public", + "primaryKey": false, + "notNull": false + }, + "client_traffic_check_skipped": { + "name": "client_traffic_check_skipped", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "lint_skipped": { + "name": "lint_skipped", + "type": "boolean", + "primaryKey": false, + "notNull": false + }, + "graph_pruning_skipped": { + "name": "graph_pruning_skipped", + "type": "boolean", + "primaryKey": false, + "notNull": false + }, + "composition_skipped": { + "name": "composition_skipped", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "breaking_changes_skipped": { + "name": "breaking_changes_skipped", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "proposed_subgraph_schema_sdl": { + "name": "proposed_subgraph_schema_sdl", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "gh_details": { + "name": "gh_details", + "type": "json", + "primaryKey": false, + "notNull": false + }, + "forced_success": { + "name": "forced_success", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "vcs_context": { + "name": "vcs_context", + "type": "json", + "primaryKey": false, + "notNull": false + }, + "error_message": { + "name": "error_message", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "check_extension_delivery_id": { + "name": "check_extension_delivery_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "check_extension_error_message": { + "name": "check_extension_error_message", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "sc_target_id_idx": { + "name": "sc_target_id_idx", + "columns": [ + { + "expression": "target_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "schema_checks_target_id_targets_id_fk": { + "name": "schema_checks_target_id_targets_id_fk", + "tableFrom": "schema_checks", + "tableTo": "targets", + "columnsFrom": [ + "target_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "schema_checks_check_extension_delivery_id_webhook_deliveries_id_fk": { + "name": "schema_checks_check_extension_delivery_id_webhook_deliveries_id_fk", + "tableFrom": "schema_checks", + "tableTo": "webhook_deliveries", + "columnsFrom": [ + "check_extension_delivery_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.schema_versions": { + "name": "schema_versions", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "target_id": { + "name": "target_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "organization_id": { + "name": "organization_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "schema_sdl": { + "name": "schema_sdl", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "client_schema": { + "name": "client_schema", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "is_v2_graph": { + "name": "is_v2_graph", + "type": "boolean", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "sv_organization_id_idx": { + "name": "sv_organization_id_idx", + "columns": [ + { + "expression": "organization_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "sv_target_id_idx": { + "name": "sv_target_id_idx", + "columns": [ + { + "expression": "target_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "schema_versions_organization_id_organizations_id_fk": { + "name": "schema_versions_organization_id_organizations_id_fk", + "tableFrom": "schema_versions", + "tableTo": "organizations", + "columnsFrom": [ + "organization_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.schema_version_change_action": { + "name": "schema_version_change_action", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "schema_version_id": { + "name": "schema_version_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "change_type": { + "name": "change_type", + "type": "schema_change_type", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "change_message": { + "name": "change_message", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "path": { + "name": "path", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "svca_schema_version_id_idx": { + "name": "svca_schema_version_id_idx", + "columns": [ + { + "expression": "schema_version_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "schema_version_change_action_schema_version_id_schema_versions_id_fk": { + "name": "schema_version_change_action_schema_version_id_schema_versions_id_fk", + "tableFrom": "schema_version_change_action", + "tableTo": "schema_versions", + "columnsFrom": [ + "schema_version_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.sessions": { + "name": "sessions", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "user_id": { + "name": "user_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "access_token": { + "name": "access_token", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "refresh_token": { + "name": "refresh_token", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "id_token": { + "name": "id_token", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "expires_at": { + "name": "expires_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "sessions_user_id_idx": { + "name": "sessions_user_id_idx", + "columns": [ + { + "expression": "user_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "sessions_user_id_users_id_fk": { + "name": "sessions_user_id_users_id_fk", + "tableFrom": "sessions", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "sessions_user_id_unique": { + "name": "sessions_user_id_unique", + "nullsNotDistinct": false, + "columns": [ + "user_id" + ] + } + }, + "checkConstraints": {} + }, + "public.slack_installations": { + "name": "slack_installations", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "organization_id": { + "name": "organization_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "slack_organization_id": { + "name": "slack_organization_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "slack_organization_name": { + "name": "slack_organization_name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "slack_channel_id": { + "name": "slack_channel_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "slack_channel_name": { + "name": "slack_channel_name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "slack_user_id": { + "name": "slack_user_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "access_token": { + "name": "access_token", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "slack_installations_idx": { + "name": "slack_installations_idx", + "columns": [ + { + "expression": "organization_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "slack_organization_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "slack_channel_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + }, + "slackinst_organization_id_idx": { + "name": "slackinst_organization_id_idx", + "columns": [ + { + "expression": "organization_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "slack_installations_organization_id_organizations_id_fk": { + "name": "slack_installations_organization_id_organizations_id_fk", + "tableFrom": "slack_installations", + "tableTo": "organizations", + "columnsFrom": [ + "organization_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.slack_integration_configs": { + "name": "slack_integration_configs", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "integration_id": { + "name": "integration_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "endpoint": { + "name": "endpoint", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": { + "slackintconf_integration_id_idx": { + "name": "slackintconf_integration_id_idx", + "columns": [ + { + "expression": "integration_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "slack_integration_configs_integration_id_organization_integrations_id_fk": { + "name": "slack_integration_configs_integration_id_organization_integrations_id_fk", + "tableFrom": "slack_integration_configs", + "tableTo": "organization_integrations", + "columnsFrom": [ + "integration_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.slack_schema_update_event_configs": { + "name": "slack_schema_update_event_configs", + "schema": "", + "columns": { + "slack_integration_config_id": { + "name": "slack_integration_config_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "federated_graph_id": { + "name": "federated_graph_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + } + }, + "indexes": { + "slacksuec_slack_integration_config_id_idx": { + "name": "slacksuec_slack_integration_config_id_idx", + "columns": [ + { + "expression": "slack_integration_config_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "slacksuec_federated_graph_id_idx": { + "name": "slacksuec_federated_graph_id_idx", + "columns": [ + { + "expression": "federated_graph_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "slack_schema_update_event_configs_slack_integration_config_id_slack_integration_configs_id_fk": { + "name": "slack_schema_update_event_configs_slack_integration_config_id_slack_integration_configs_id_fk", + "tableFrom": "slack_schema_update_event_configs", + "tableTo": "slack_integration_configs", + "columnsFrom": [ + "slack_integration_config_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "slack_schema_update_event_configs_federated_graph_id_federated_graphs_id_fk": { + "name": "slack_schema_update_event_configs_federated_graph_id_federated_graphs_id_fk", + "tableFrom": "slack_schema_update_event_configs", + "tableTo": "federated_graphs", + "columnsFrom": [ + "federated_graph_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "slack_schema_update_event_configs_slack_integration_config_id_federated_graph_id_pk": { + "name": "slack_schema_update_event_configs_slack_integration_config_id_federated_graph_id_pk", + "columns": [ + "slack_integration_config_id", + "federated_graph_id" + ] + } + }, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.subgraph_members": { + "name": "subgraph_members", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "user_id": { + "name": "user_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "subgraph_id": { + "name": "subgraph_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "unique_subgraph_member_idx": { + "name": "unique_subgraph_member_idx", + "columns": [ + { + "expression": "user_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "subgraph_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + }, + "sm_user_id_idx": { + "name": "sm_user_id_idx", + "columns": [ + { + "expression": "user_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "sm_subgraph_id_idx": { + "name": "sm_subgraph_id_idx", + "columns": [ + { + "expression": "subgraph_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "subgraph_members_user_id_users_id_fk": { + "name": "subgraph_members_user_id_users_id_fk", + "tableFrom": "subgraph_members", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "subgraph_members_subgraph_id_subgraphs_id_fk": { + "name": "subgraph_members_subgraph_id_subgraphs_id_fk", + "tableFrom": "subgraph_members", + "tableTo": "subgraphs", + "columnsFrom": [ + "subgraph_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.subgraphs": { + "name": "subgraphs", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "routing_url": { + "name": "routing_url", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "subscription_url": { + "name": "subscription_url", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "subscription_protocol": { + "name": "subscription_protocol", + "type": "subscription_protocol", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'ws'" + }, + "websocket_subprotocol": { + "name": "websocket_subprotocol", + "type": "websocket_subprotocol", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'auto'" + }, + "schema_version_id": { + "name": "schema_version_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "target_id": { + "name": "target_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "is_feature_subgraph": { + "name": "is_feature_subgraph", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "is_event_driven_graph": { + "name": "is_event_driven_graph", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "type": { + "name": "type", + "type": "subgraph_type", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'standard'" + } + }, + "indexes": { + "subgraphs_target_id_idx": { + "name": "subgraphs_target_id_idx", + "columns": [ + { + "expression": "target_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "subgraphs_schema_version_id_idx": { + "name": "subgraphs_schema_version_id_idx", + "columns": [ + { + "expression": "schema_version_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "subgraphs_schema_version_id_schema_versions_id_fk": { + "name": "subgraphs_schema_version_id_schema_versions_id_fk", + "tableFrom": "subgraphs", + "tableTo": "schema_versions", + "columnsFrom": [ + "schema_version_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "subgraphs_target_id_targets_id_fk": { + "name": "subgraphs_target_id_targets_id_fk", + "tableFrom": "subgraphs", + "tableTo": "targets", + "columnsFrom": [ + "target_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.federated_subgraphs": { + "name": "federated_subgraphs", + "schema": "", + "columns": { + "federated_graph_id": { + "name": "federated_graph_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "subgraph_id": { + "name": "subgraph_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + } + }, + "indexes": { + "fs_federated_graph_id_idx": { + "name": "fs_federated_graph_id_idx", + "columns": [ + { + "expression": "federated_graph_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "fs_subgraph_id_idx": { + "name": "fs_subgraph_id_idx", + "columns": [ + { + "expression": "subgraph_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "federated_subgraphs_federated_graph_id_federated_graphs_id_fk": { + "name": "federated_subgraphs_federated_graph_id_federated_graphs_id_fk", + "tableFrom": "federated_subgraphs", + "tableTo": "federated_graphs", + "columnsFrom": [ + "federated_graph_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "federated_subgraphs_subgraph_id_subgraphs_id_fk": { + "name": "federated_subgraphs_subgraph_id_subgraphs_id_fk", + "tableFrom": "federated_subgraphs", + "tableTo": "subgraphs", + "columnsFrom": [ + "subgraph_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "federated_subgraphs_federated_graph_id_subgraph_id_pk": { + "name": "federated_subgraphs_federated_graph_id_subgraph_id_pk", + "columns": [ + "federated_graph_id", + "subgraph_id" + ] + } + }, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.target_label_matchers": { + "name": "target_label_matchers", + "schema": "", + "columns": { + "target_id": { + "name": "target_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "label_matcher": { + "name": "label_matcher", + "type": "text[]", + "primaryKey": false, + "notNull": true + } + }, + "indexes": { + "tlm_target_id_idx": { + "name": "tlm_target_id_idx", + "columns": [ + { + "expression": "target_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "target_label_matchers_target_id_targets_id_fk": { + "name": "target_label_matchers_target_id_targets_id_fk", + "tableFrom": "target_label_matchers", + "tableTo": "targets", + "columnsFrom": [ + "target_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.targets": { + "name": "targets", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "type": { + "name": "type", + "type": "target_type", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "labels": { + "name": "labels", + "type": "text[]", + "primaryKey": false, + "notNull": false + }, + "organization_id": { + "name": "organization_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "created_by": { + "name": "created_by", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "readme": { + "name": "readme", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "namespace_id": { + "name": "namespace_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + } + }, + "indexes": { + "organization_name_idx": { + "name": "organization_name_idx", + "columns": [ + { + "expression": "organization_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "type", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "name", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "namespace_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + }, + "targets_organization_id_idx": { + "name": "targets_organization_id_idx", + "columns": [ + { + "expression": "organization_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "targets_created_by_idx": { + "name": "targets_created_by_idx", + "columns": [ + { + "expression": "created_by", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "targets_namespace_id_idx": { + "name": "targets_namespace_id_idx", + "columns": [ + { + "expression": "namespace_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "targets_organization_id_organizations_id_fk": { + "name": "targets_organization_id_organizations_id_fk", + "tableFrom": "targets", + "tableTo": "organizations", + "columnsFrom": [ + "organization_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "targets_created_by_users_id_fk": { + "name": "targets_created_by_users_id_fk", + "tableFrom": "targets", + "tableTo": "users", + "columnsFrom": [ + "created_by" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "targets_namespace_id_namespaces_id_fk": { + "name": "targets_namespace_id_namespaces_id_fk", + "tableFrom": "targets", + "tableTo": "namespaces", + "columnsFrom": [ + "namespace_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.users": { + "name": "users", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true + }, + "email": { + "name": "email", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "active": { + "name": "active", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": true + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "users_email_unique": { + "name": "users_email_unique", + "nullsNotDistinct": false, + "columns": [ + "email" + ] + } + }, + "checkConstraints": {} + }, + "public.webhook_deliveries": { + "name": "webhook_deliveries", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "created_by_id": { + "name": "created_by_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "organization_id": { + "name": "organization_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "type": { + "name": "type", + "type": "webhook_delivery_type", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "endpoint": { + "name": "endpoint", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "event_name": { + "name": "event_name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "payload": { + "name": "payload", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "request_headers": { + "name": "request_headers", + "type": "json", + "primaryKey": false, + "notNull": true + }, + "response_headers": { + "name": "response_headers", + "type": "json", + "primaryKey": false, + "notNull": false + }, + "response_status_code": { + "name": "response_status_code", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "response_error_code": { + "name": "response_error_code", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "error_message": { + "name": "error_message", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "response_body": { + "name": "response_body", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "retry_count": { + "name": "retry_count", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 0 + }, + "duration": { + "name": "duration", + "type": "real", + "primaryKey": false, + "notNull": true, + "default": 0 + }, + "original_delivery_id": { + "name": "original_delivery_id", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "webhd_organization_id_idx": { + "name": "webhd_organization_id_idx", + "columns": [ + { + "expression": "organization_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "webhd_created_by_id_idx": { + "name": "webhd_created_by_id_idx", + "columns": [ + { + "expression": "created_by_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "webhook_deliveries_created_by_id_users_id_fk": { + "name": "webhook_deliveries_created_by_id_users_id_fk", + "tableFrom": "webhook_deliveries", + "tableTo": "users", + "columnsFrom": [ + "created_by_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "webhook_deliveries_organization_id_organizations_id_fk": { + "name": "webhook_deliveries_organization_id_organizations_id_fk", + "tableFrom": "webhook_deliveries", + "tableTo": "organizations", + "columnsFrom": [ + "organization_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.webhook_graph_schema_update": { + "name": "webhook_graph_schema_update", + "schema": "", + "columns": { + "webhook_id": { + "name": "webhook_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "federated_graph_id": { + "name": "federated_graph_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + } + }, + "indexes": { + "wgsu_webhook_id_idx": { + "name": "wgsu_webhook_id_idx", + "columns": [ + { + "expression": "webhook_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "wgsu_federated_graph_id_idx": { + "name": "wgsu_federated_graph_id_idx", + "columns": [ + { + "expression": "federated_graph_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "webhook_graph_schema_update_webhook_id_organization_webhook_configs_id_fk": { + "name": "webhook_graph_schema_update_webhook_id_organization_webhook_configs_id_fk", + "tableFrom": "webhook_graph_schema_update", + "tableTo": "organization_webhook_configs", + "columnsFrom": [ + "webhook_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "webhook_graph_schema_update_federated_graph_id_federated_graphs_id_fk": { + "name": "webhook_graph_schema_update_federated_graph_id_federated_graphs_id_fk", + "tableFrom": "webhook_graph_schema_update", + "tableTo": "federated_graphs", + "columnsFrom": [ + "federated_graph_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "webhook_graph_schema_update_webhook_id_federated_graph_id_pk": { + "name": "webhook_graph_schema_update_webhook_id_federated_graph_id_pk", + "columns": [ + "webhook_id", + "federated_graph_id" + ] + } + }, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.webhook_proposal_state_update": { + "name": "webhook_proposal_state_update", + "schema": "", + "columns": { + "webhook_id": { + "name": "webhook_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "federated_graph_id": { + "name": "federated_graph_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + } + }, + "indexes": { + "wpsu_webhook_id_idx": { + "name": "wpsu_webhook_id_idx", + "columns": [ + { + "expression": "webhook_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "wpsu_federated_graph_id_idx": { + "name": "wpsu_federated_graph_id_idx", + "columns": [ + { + "expression": "federated_graph_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "webhook_proposal_state_update_webhook_id_organization_webhook_configs_id_fk": { + "name": "webhook_proposal_state_update_webhook_id_organization_webhook_configs_id_fk", + "tableFrom": "webhook_proposal_state_update", + "tableTo": "organization_webhook_configs", + "columnsFrom": [ + "webhook_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "webhook_proposal_state_update_federated_graph_id_federated_graphs_id_fk": { + "name": "webhook_proposal_state_update_federated_graph_id_federated_graphs_id_fk", + "tableFrom": "webhook_proposal_state_update", + "tableTo": "federated_graphs", + "columnsFrom": [ + "federated_graph_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "webhook_proposal_state_update_webhook_id_federated_graph_id_pk": { + "name": "webhook_proposal_state_update_webhook_id_federated_graph_id_pk", + "columns": [ + "webhook_id", + "federated_graph_id" + ] + } + }, + "uniqueConstraints": {}, + "checkConstraints": {} + } + }, + "enums": { + "public.git_installation_type": { + "name": "git_installation_type", + "schema": "public", + "values": [ + "PERSONAL", + "ORGANIZATION" + ] + }, + "public.graph_composition_subgraph_change_type": { + "name": "graph_composition_subgraph_change_type", + "schema": "public", + "values": [ + "added", + "removed", + "updated", + "unchanged" + ] + }, + "public.graph_pruning_rules": { + "name": "graph_pruning_rules", + "schema": "public", + "values": [ + "UNUSED_FIELDS", + "DEPRECATED_FIELDS", + "REQUIRE_DEPRECATION_BEFORE_DELETION" + ] + }, + "public.integration_type": { + "name": "integration_type", + "schema": "public", + "values": [ + "slack" + ] + }, + "public.lint_severity": { + "name": "lint_severity", + "schema": "public", + "values": [ + "warn", + "error" + ] + }, + "public.member_role": { + "name": "member_role", + "schema": "public", + "values": [ + "admin", + "developer", + "viewer" + ] + }, + "public.organization_role": { + "name": "organization_role", + "schema": "public", + "values": [ + "organization-admin", + "organization-developer", + "organization-viewer", + "organization-apikey-manager", + "namespace-admin", + "namespace-viewer", + "graph-admin", + "graph-viewer", + "subgraph-admin", + "subgraph-publisher", + "subgraph-checker", + "subgraph-viewer" + ] + }, + "public.playground_script_type": { + "name": "playground_script_type", + "schema": "public", + "values": [ + "pre-flight", + "pre-operation", + "post-operation" + ] + }, + "public.proposal_match": { + "name": "proposal_match", + "schema": "public", + "values": [ + "success", + "warn", + "error" + ] + }, + "public.proposal_origin": { + "name": "proposal_origin", + "schema": "public", + "values": [ + "INTERNAL", + "EXTERNAL" + ] + }, + "public.proposal_state": { + "name": "proposal_state", + "schema": "public", + "values": [ + "DRAFT", + "APPROVED", + "PUBLISHED", + "CLOSED" + ] + }, + "public.schema_change_type": { + "name": "schema_change_type", + "schema": "public", + "values": [ + "FIELD_ARGUMENT_DESCRIPTION_CHANGED", + "FIELD_ARGUMENT_DEFAULT_CHANGED", + "FIELD_ARGUMENT_TYPE_CHANGED", + "DIRECTIVE_REMOVED", + "DIRECTIVE_ADDED", + "DIRECTIVE_DESCRIPTION_CHANGED", + "DIRECTIVE_LOCATION_ADDED", + "DIRECTIVE_LOCATION_REMOVED", + "DIRECTIVE_ARGUMENT_ADDED", + "DIRECTIVE_ARGUMENT_REMOVED", + "DIRECTIVE_ARGUMENT_DESCRIPTION_CHANGED", + "DIRECTIVE_ARGUMENT_DEFAULT_VALUE_CHANGED", + "DIRECTIVE_ARGUMENT_TYPE_CHANGED", + "ENUM_VALUE_REMOVED", + "ENUM_VALUE_ADDED", + "ENUM_VALUE_DESCRIPTION_CHANGED", + "ENUM_VALUE_DEPRECATION_REASON_CHANGED", + "ENUM_VALUE_DEPRECATION_REASON_ADDED", + "ENUM_VALUE_DEPRECATION_REASON_REMOVED", + "FIELD_REMOVED", + "FIELD_ADDED", + "FIELD_DESCRIPTION_CHANGED", + "FIELD_DESCRIPTION_ADDED", + "FIELD_DESCRIPTION_REMOVED", + "FIELD_DEPRECATION_ADDED", + "FIELD_DEPRECATION_REMOVED", + "FIELD_DEPRECATION_REASON_CHANGED", + "FIELD_DEPRECATION_REASON_ADDED", + "FIELD_DEPRECATION_REASON_REMOVED", + "FIELD_TYPE_CHANGED", + "FIELD_ARGUMENT_ADDED", + "FIELD_ARGUMENT_REMOVED", + "INPUT_FIELD_REMOVED", + "INPUT_FIELD_ADDED", + "INPUT_FIELD_DESCRIPTION_ADDED", + "INPUT_FIELD_DESCRIPTION_REMOVED", + "INPUT_FIELD_DESCRIPTION_CHANGED", + "INPUT_FIELD_DEFAULT_VALUE_CHANGED", + "INPUT_FIELD_TYPE_CHANGED", + "OBJECT_TYPE_INTERFACE_ADDED", + "OBJECT_TYPE_INTERFACE_REMOVED", + "SCHEMA_QUERY_TYPE_CHANGED", + "SCHEMA_MUTATION_TYPE_CHANGED", + "SCHEMA_SUBSCRIPTION_TYPE_CHANGED", + "TYPE_REMOVED", + "TYPE_ADDED", + "TYPE_KIND_CHANGED", + "TYPE_DESCRIPTION_CHANGED", + "TYPE_DESCRIPTION_REMOVED", + "TYPE_DESCRIPTION_ADDED", + "UNION_MEMBER_REMOVED", + "UNION_MEMBER_ADDED", + "DIRECTIVE_USAGE_UNION_MEMBER_ADDED", + "DIRECTIVE_USAGE_UNION_MEMBER_REMOVED", + "DIRECTIVE_USAGE_ENUM_ADDED", + "DIRECTIVE_USAGE_ENUM_REMOVED", + "DIRECTIVE_USAGE_ENUM_VALUE_ADDED", + "DIRECTIVE_USAGE_ENUM_VALUE_REMOVED", + "DIRECTIVE_USAGE_INPUT_OBJECT_ADDED", + "DIRECTIVE_USAGE_INPUT_OBJECT_REMOVED", + "DIRECTIVE_USAGE_FIELD_ADDED", + "DIRECTIVE_USAGE_FIELD_REMOVED", + "DIRECTIVE_USAGE_SCALAR_ADDED", + "DIRECTIVE_USAGE_SCALAR_REMOVED", + "DIRECTIVE_USAGE_OBJECT_ADDED", + "DIRECTIVE_USAGE_OBJECT_REMOVED", + "DIRECTIVE_USAGE_INTERFACE_ADDED", + "DIRECTIVE_USAGE_INTERFACE_REMOVED", + "DIRECTIVE_USAGE_ARGUMENT_DEFINITION_ADDED", + "DIRECTIVE_USAGE_ARGUMENT_DEFINITION_REMOVED", + "DIRECTIVE_USAGE_SCHEMA_ADDED", + "DIRECTIVE_USAGE_SCHEMA_REMOVED", + "DIRECTIVE_USAGE_FIELD_DEFINITION_ADDED", + "DIRECTIVE_USAGE_FIELD_DEFINITION_REMOVED", + "DIRECTIVE_USAGE_INPUT_FIELD_DEFINITION_ADDED", + "DIRECTIVE_USAGE_INPUT_FIELD_DEFINITION_REMOVED" + ] + }, + "public.subgraph_type": { + "name": "subgraph_type", + "schema": "public", + "values": [ + "standard", + "grpc_plugin", + "grpc_service" + ] + }, + "public.subscription_protocol": { + "name": "subscription_protocol", + "schema": "public", + "values": [ + "ws", + "sse", + "sse_post" + ] + }, + "public.status": { + "name": "status", + "schema": "public", + "values": [ + "incomplete", + "incomplete_expired", + "trialing", + "active", + "past_due", + "canceled", + "unpaid", + "paused" + ] + }, + "public.target_type": { + "name": "target_type", + "schema": "public", + "values": [ + "federated", + "subgraph" + ] + }, + "public.webhook_delivery_type": { + "name": "webhook_delivery_type", + "schema": "public", + "values": [ + "webhook", + "slack", + "admission", + "check-extension" + ] + }, + "public.websocket_subprotocol": { + "name": "websocket_subprotocol", + "schema": "public", + "values": [ + "auto", + "graphql-ws", + "graphql-transport-ws" + ] + } + }, + "schemas": {}, + "sequences": {}, + "views": {}, + "_meta": { + "columns": {}, + "schemas": {}, + "tables": {} + } +} \ No newline at end of file diff --git a/controlplane/migrations/meta/_journal.json b/controlplane/migrations/meta/_journal.json index 20203a0544..c9beddc313 100644 --- a/controlplane/migrations/meta/_journal.json +++ b/controlplane/migrations/meta/_journal.json @@ -960,6 +960,13 @@ "when": 1772187315878, "tag": "0136_eminent_vermin", "breakpoints": true + }, + { + "idx": 137, + "version": "7", + "when": 1778091023284, + "tag": "0137_long_warbound", + "breakpoints": true } ] } \ No newline at end of file diff --git a/controlplane/src/core/bufservices/contract/createContract.ts b/controlplane/src/core/bufservices/contract/createContract.ts index 2f28c3ec1d..93fa200ca4 100644 --- a/controlplane/src/core/bufservices/contract/createContract.ts +++ b/controlplane/src/core/bufservices/contract/createContract.ts @@ -1,13 +1,7 @@ import { PlainMessage } from '@bufbuild/protobuf'; import { HandlerContext } from '@connectrpc/connect'; import { EnumStatusCode } from '@wundergraph/cosmo-connect/dist/common/common_pb'; -import { - CompositionError, - CompositionWarning, - CreateContractRequest, - CreateContractResponse, - DeploymentError, -} from '@wundergraph/cosmo-connect/dist/platform/v1/platform_pb'; +import { CreateContractRequest, CreateContractResponse } from '@wundergraph/cosmo-connect/dist/platform/v1/platform_pb'; import { isValidUrl } from '@wundergraph/cosmo-shared'; import { COMPOSITION_IGNORE_EXTERNAL_KEYS_FEATURE_ID } from '../../../types/index.js'; import { PublicError, UnauthorizedError } from '../../errors/errors.js'; @@ -18,6 +12,7 @@ import { DefaultNamespace, NamespaceRepository } from '../../repositories/Namesp import { OrganizationRepository } from '../../repositories/OrganizationRepository.js'; import type { RouterOptions } from '../../routes.js'; import { enrichLogger, getLogger, handleError, isValidGraphName, isValidSchemaTags } from '../../util.js'; +import { CompositionService } from '../../services/CompositionService.js'; export function createContract( opts: RouterOptions, @@ -77,7 +72,6 @@ export function createContract( } req.excludeTags = [...new Set(req.excludeTags)]; - if (!isValidSchemaTags(req.excludeTags)) { throw new PublicError(EnumStatusCode.ERR, `Provided exclude tags are invalid`); } @@ -100,7 +94,6 @@ export function createContract( } const count = await fedGraphRepo.count(); - const feature = await orgRepo.getFeature({ organizationId: authContext.organizationId, featureId: 'federated-graphs', @@ -111,7 +104,6 @@ export function createContract( }); const limit = feature?.limit === -1 ? undefined : feature?.limit; - if (limit && count >= limit) { throw new PublicError( EnumStatusCode.ERR_LIMIT_REACHED, @@ -190,55 +182,31 @@ export function createContract( targetNamespaceDisplayName: contractGraph.namespace, }); - const compositionErrors: PlainMessage[] = []; - const deploymentErrors: PlainMessage[] = []; - const compositionWarnings: PlainMessage[] = []; - - const composition = await fedGraphRepo.composeAndDeployGraphs({ - actorId: authContext.userId, - admissionConfig: { - cdnBaseUrl: opts.cdnBaseUrl, - webhookJWTSecret: opts.admissionWebhookJWTSecret, - }, - blobStorage: opts.blobStorage, - chClient: opts.chClient!, - compositionOptions: { - ignoreExternalKeys: ignoreExternalKeysFeature?.enabled ?? false, - disableResolvabilityValidation: req.disableResolvabilityValidation, - }, - federatedGraphs: [{ ...contractGraph, contract }], - webhookProxyUrl: opts.webhookProxyUrl, - }); - - compositionErrors.push(...composition.compositionErrors); - deploymentErrors.push(...composition.deploymentErrors); - compositionWarnings.push(...composition.compositionWarnings); - - if (compositionErrors.length > 0) { - return { - response: { - code: EnumStatusCode.ERR_SUBGRAPH_COMPOSITION_FAILED, - }, - compositionErrors, - compositionWarnings, - deploymentErrors: [], - }; - } - - if (deploymentErrors.length > 0) { - return { - response: { - code: EnumStatusCode.ERR_DEPLOYMENT_FAILED, - }, - compositionErrors: [], - compositionWarnings, - deploymentErrors, - }; - } + const compositionService = new CompositionService( + tx, + authContext.organizationId, + logger, + { cdnBaseUrl: opts.cdnBaseUrl, webhookJWTSecret: opts.admissionWebhookJWTSecret }, + opts.blobStorage, + opts.chClient, + opts.webhookProxyUrl, + req.disableResolvabilityValidation, + ); + + const { deploymentErrors, compositionErrors, compositionWarnings } = + await compositionService.composeAndDeployFederatedGraph({ + actorId: authContext.userId, + federatedGraph: { ...contractGraph, contract }, + }); return { response: { - code: EnumStatusCode.OK, + code: + compositionErrors.length > 0 + ? EnumStatusCode.ERR_SUBGRAPH_COMPOSITION_FAILED + : deploymentErrors.length > 0 + ? EnumStatusCode.ERR_DEPLOYMENT_FAILED + : EnumStatusCode.OK, }, compositionErrors, compositionWarnings, diff --git a/controlplane/src/core/bufservices/contract/updateContract.ts b/controlplane/src/core/bufservices/contract/updateContract.ts index 11ff2f418a..06bda62af1 100644 --- a/controlplane/src/core/bufservices/contract/updateContract.ts +++ b/controlplane/src/core/bufservices/contract/updateContract.ts @@ -2,23 +2,16 @@ import { PlainMessage } from '@bufbuild/protobuf'; import { HandlerContext } from '@connectrpc/connect'; import { EnumStatusCode } from '@wundergraph/cosmo-connect/dist/common/common_pb'; import { OrganizationEventName } from '@wundergraph/cosmo-connect/dist/notifications/events_pb'; -import { - CompositionError, - CompositionWarning, - DeploymentError, - UpdateContractRequest, - UpdateContractResponse, -} from '@wundergraph/cosmo-connect/dist/platform/v1/platform_pb'; -import { COMPOSITION_IGNORE_EXTERNAL_KEYS_FEATURE_ID } from '../../../types/index.js'; +import { UpdateContractRequest, UpdateContractResponse } from '@wundergraph/cosmo-connect/dist/platform/v1/platform_pb'; import { AuditLogRepository } from '../../repositories/AuditLogRepository.js'; import { ContractRepository } from '../../repositories/ContractRepository.js'; import { FederatedGraphRepository } from '../../repositories/FederatedGraphRepository.js'; import { DefaultNamespace } from '../../repositories/NamespaceRepository.js'; -import { OrganizationRepository } from '../../repositories/OrganizationRepository.js'; import type { RouterOptions } from '../../routes.js'; import { enrichLogger, getLogger, handleError, isValidSchemaTags } from '../../util.js'; import { OrganizationWebhookService } from '../../webhooks/OrganizationWebhookService.js'; import { UnauthorizedError } from '../../errors/errors.js'; +import { CompositionService } from '../../services/CompositionService.js'; export function updateContract( opts: RouterOptions, @@ -34,8 +27,6 @@ export function updateContract( logger = enrichLogger(ctx, logger, authContext); const fedGraphRepo = new FederatedGraphRepository(logger, opts.db, authContext.organizationId); - const contractRepo = new ContractRepository(logger, opts.db, authContext.organizationId); - const orgRepo = new OrganizationRepository(logger, opts.db, opts.billingDefaultPlanId); const auditLogRepo = new AuditLogRepository(opts.db); const orgWebhooks = new OrganizationWebhookService( opts.db, @@ -120,81 +111,57 @@ export function updateContract( }; } - const ignoreExternalKeys = - ( - await orgRepo.getFeature({ - organizationId: authContext.organizationId, - featureId: COMPOSITION_IGNORE_EXTERNAL_KEYS_FEATURE_ID, - }) - )?.enabled ?? false; - - const updatedContractDetails = await contractRepo.update({ - id: graph.contract.id, - excludeTags: req.excludeTags, - includeTags: req.includeTags, - actorId: authContext.userId, - }); - - await fedGraphRepo.update({ - targetId: graph.targetId, - // if the routingUrl is not provided, it will be set to an empty string. - // As the routing url wont be updated in this case. - routingUrl: req.routingUrl || '', - updatedBy: authContext.userId, - readme: req.readme, - blobStorage: opts.blobStorage, - namespaceId: graph.namespaceId, - admissionWebhookURL: req.admissionWebhookUrl, - admissionWebhookSecret: req.admissionWebhookSecret, - admissionConfig: { - cdnBaseUrl: opts.cdnBaseUrl, - jwtSecret: opts.admissionWebhookJWTSecret, - }, - labelMatchers: [], - chClient: opts.chClient!, - compositionOptions: { - disableResolvabilityValidation: req.disableResolvabilityValidation, - ignoreExternalKeys, - }, - webhookProxyUrl: opts.webhookProxyUrl, - }); - - const compositionErrors: PlainMessage[] = []; - const deploymentErrors: PlainMessage[] = []; - const compositionWarnings: PlainMessage[] = []; - - const composition = await fedGraphRepo.composeAndDeployGraphs({ - actorId: authContext.userId, - admissionConfig: { - cdnBaseUrl: opts.cdnBaseUrl, - webhookJWTSecret: opts.admissionWebhookJWTSecret, - }, - blobStorage: opts.blobStorage, - chClient: opts.chClient!, - compositionOptions: { - disableResolvabilityValidation: req.disableResolvabilityValidation, - ignoreExternalKeys, - }, - federatedGraphs: [ - { - ...graph, + const { deploymentErrors, compositionErrors, compositionWarnings } = await opts.db.transaction(async (tx) => { + const contractRepo = new ContractRepository(logger, tx, authContext.organizationId); + const fedGraphRepo = new FederatedGraphRepository(logger, tx, authContext.organizationId); + const compositionService = new CompositionService( + tx, + authContext.organizationId, + logger, + { cdnBaseUrl: opts.cdnBaseUrl, webhookJWTSecret: opts.admissionWebhookJWTSecret }, + opts.blobStorage, + opts.chClient, + opts.webhookProxyUrl, + req.disableResolvabilityValidation, + ); + + // Update the contract details + const updatedContractDetails = await contractRepo.update({ + id: graph.contract!.id, + excludeTags: req.excludeTags, + includeTags: req.includeTags, + actorId: authContext.userId, + }); + + // Update the federated graph details + await fedGraphRepo.update({ + compositionService, + targetId: graph.targetId, + // if the routingUrl is not provided, it will be set to an empty string. + // As the routing url wont be updated in this case. + routingUrl: req.routingUrl || '', + updatedBy: authContext.userId, + readme: req.readme, + namespaceId: graph.namespaceId, + admissionWebhookURL: req.admissionWebhookUrl, + admissionWebhookSecret: req.admissionWebhookSecret, + labelMatchers: [], + }); + + // Compose the contract + return await compositionService.composeAndDeployFederatedGraph({ + actorId: authContext.userId, + federatedGraph: { + ...graph!, routingUrl: req.routingUrl || graph.routingUrl, admissionWebhookURL: req.admissionWebhookUrl || graph.admissionWebhookURL, admissionWebhookSecret: req.admissionWebhookSecret || graph.admissionWebhookSecret, readme: req.readme || graph.readme, - contract: { - ...graph.contract, - ...updatedContractDetails, - }, + contract: { ...graph.contract!, ...updatedContractDetails }, }, - ], - webhookProxyUrl: opts.webhookProxyUrl, + }); }); - compositionErrors.push(...composition.compositionErrors); - deploymentErrors.push(...composition.deploymentErrors); - compositionWarnings.push(...composition.compositionWarnings); - await auditLogRepo.addAuditLog({ organizationId: authContext.organizationId, organizationSlug: authContext.organizationSlug, @@ -230,31 +197,14 @@ export function updateContract( authContext.userId, ); - if (compositionErrors.length > 0) { - return { - response: { - code: EnumStatusCode.ERR_SUBGRAPH_COMPOSITION_FAILED, - }, - compositionErrors, - deploymentErrors: [], - compositionWarnings, - }; - } - - if (deploymentErrors.length > 0) { - return { - response: { - code: EnumStatusCode.ERR_DEPLOYMENT_FAILED, - }, - compositionErrors: [], - deploymentErrors, - compositionWarnings, - }; - } - return { response: { - code: EnumStatusCode.OK, + code: + compositionErrors.length > 0 + ? EnumStatusCode.ERR_SUBGRAPH_COMPOSITION_FAILED + : deploymentErrors.length > 0 + ? EnumStatusCode.ERR_DEPLOYMENT_FAILED + : EnumStatusCode.OK, }, deploymentErrors, compositionErrors, diff --git a/controlplane/src/core/bufservices/feature-flag/createFeatureFlag.ts b/controlplane/src/core/bufservices/feature-flag/createFeatureFlag.ts index bdd5fd6ad5..dc5213bb86 100644 --- a/controlplane/src/core/bufservices/feature-flag/createFeatureFlag.ts +++ b/controlplane/src/core/bufservices/feature-flag/createFeatureFlag.ts @@ -1,24 +1,18 @@ import { PlainMessage } from '@bufbuild/protobuf'; import { HandlerContext } from '@connectrpc/connect'; import { EnumStatusCode } from '@wundergraph/cosmo-connect/dist/common/common_pb'; -import { OrganizationEventName } from '@wundergraph/cosmo-connect/dist/notifications/events_pb'; import { - CompositionError, - CompositionWarning, CreateFeatureFlagRequest, CreateFeatureFlagResponse, - DeploymentError, } from '@wundergraph/cosmo-connect/dist/platform/v1/platform_pb'; -import { COMPOSITION_IGNORE_EXTERNAL_KEYS_FEATURE_ID } from '../../../types/index.js'; import { AuditLogRepository } from '../../repositories/AuditLogRepository.js'; import { FeatureFlagRepository } from '../../repositories/FeatureFlagRepository.js'; -import { FederatedGraphRepository } from '../../repositories/FederatedGraphRepository.js'; import { DefaultNamespace, NamespaceRepository } from '../../repositories/NamespaceRepository.js'; import { OrganizationRepository } from '../../repositories/OrganizationRepository.js'; import type { RouterOptions } from '../../routes.js'; import { enrichLogger, getLogger, handleError, isValidLabels } from '../../util.js'; -import { OrganizationWebhookService } from '../../webhooks/OrganizationWebhookService.js'; import { UnauthorizedError } from '../../errors/errors.js'; +import { CompositionService } from '../../services/CompositionService.js'; export function createFeatureFlag( opts: RouterOptions, @@ -34,16 +28,8 @@ export function createFeatureFlag( const featureFlagRepo = new FeatureFlagRepository(logger, opts.db, authContext.organizationId); const namespaceRepo = new NamespaceRepository(opts.db, authContext.organizationId); const orgRepo = new OrganizationRepository(logger, opts.db, opts.billingDefaultPlanId); - const orgWebhooks = new OrganizationWebhookService( - opts.db, - authContext.organizationId, - opts.logger, - opts.billingDefaultPlanId, - opts.webhookProxyUrl, - ); req.namespace = req.namespace || DefaultNamespace; - if (authContext.organizationDeactivated) { throw new UnauthorizedError(); } @@ -75,7 +61,6 @@ export function createFeatureFlag( if (limit !== undefined && limit !== null) { const count = await featureFlagRepo.count(authContext.organizationId); - if (count >= limit) { return { response: { @@ -149,7 +134,6 @@ export function createFeatureFlag( } const auditLogRepo = new AuditLogRepository(opts.db); - const featureFlag = await featureFlagRepo.createFeatureFlag({ namespaceId: namespace.id, name: req.name, @@ -186,94 +170,50 @@ export function createFeatureFlag( }; } - const federatedGraphs = await featureFlagRepo.getFederatedGraphsByFeatureFlag({ + const createdFeatureFlag = await featureFlagRepo.getFeatureFlagById({ featureFlagId: featureFlag.id, namespaceId: namespace.id, - excludeDisabled: true, - }); - const ignoreExternalKeysFeature = await orgRepo.getFeature({ - organizationId: authContext.organizationId, - featureId: COMPOSITION_IGNORE_EXTERNAL_KEYS_FEATURE_ID, + includeSubgraphs: true, }); - const compositionErrors: PlainMessage[] = []; - const deploymentErrors: PlainMessage[] = []; - const compositionWarnings: PlainMessage[] = []; - - await opts.db.transaction(async (tx) => { - const fedGraphRepo = new FederatedGraphRepository(logger, tx, authContext.organizationId); - - const composition = await fedGraphRepo.composeAndDeployGraphs({ - actorId: authContext.userId, - admissionConfig: { - cdnBaseUrl: opts.cdnBaseUrl, - webhookJWTSecret: opts.admissionWebhookJWTSecret, - }, - blobStorage: opts.blobStorage, - chClient: opts.chClient!, - compositionOptions: { - disableResolvabilityValidation: req.disableResolvabilityValidation, - ignoreExternalKeys: ignoreExternalKeysFeature?.enabled ?? false, - }, - federatedGraphs, - webhookProxyUrl: opts.webhookProxyUrl, - }); - - compositionErrors.push(...composition.compositionErrors); - deploymentErrors.push(...composition.deploymentErrors); - compositionWarnings.push(...composition.compositionWarnings); - }); - - for (const graph of federatedGraphs) { - const hasErrors = - compositionErrors.some((error) => error.federatedGraphName === graph.name) || - deploymentErrors.some((error) => error.federatedGraphName === graph.name); - orgWebhooks.send( - { - eventName: OrganizationEventName.FEDERATED_GRAPH_SCHEMA_UPDATED, - payload: { - federated_graph: { - id: graph.id, - name: graph.name, - namespace: graph.namespace, - }, - organization: { - id: authContext.organizationId, - slug: authContext.organizationSlug, - }, - errors: hasErrors, - actor_id: authContext.userId, - }, - }, - authContext.userId, - ); - } - - if (compositionErrors.length > 0) { + if (!createdFeatureFlag) { return { response: { - code: EnumStatusCode.ERR_SUBGRAPH_COMPOSITION_FAILED, + code: EnumStatusCode.ERR_NOT_FOUND, + details: `Feature flag "${featureFlag.name}" was not found after creation.`, }, - compositionErrors, + compositionErrors: [], deploymentErrors: [], - compositionWarnings, + compositionWarnings: [], }; } - if (deploymentErrors.length > 0) { - return { - response: { - code: EnumStatusCode.ERR_DEPLOYMENT_FAILED, - }, - compositionErrors: [], - deploymentErrors, - compositionWarnings, - }; - } + const { deploymentErrors, compositionErrors, compositionWarnings } = await opts.db.transaction((tx) => { + const compositionService = new CompositionService( + tx, + authContext.organizationId, + logger, + { cdnBaseUrl: opts.cdnBaseUrl, webhookJWTSecret: opts.admissionWebhookJWTSecret }, + opts.blobStorage, + opts.chClient, + opts.webhookProxyUrl, + req.disableResolvabilityValidation, + ); + + return compositionService.composeAndDeployFeatureFlag({ + actorId: authContext.userId, + featureFlag: createdFeatureFlag, + }); + }); return { response: { - code: EnumStatusCode.OK, + code: + compositionErrors.length > 0 + ? EnumStatusCode.ERR_SUBGRAPH_COMPOSITION_FAILED + : deploymentErrors.length > 0 + ? EnumStatusCode.ERR_DEPLOYMENT_FAILED + : EnumStatusCode.OK, }, compositionErrors, deploymentErrors, diff --git a/controlplane/src/core/bufservices/feature-flag/deleteFeatureFlag.ts b/controlplane/src/core/bufservices/feature-flag/deleteFeatureFlag.ts index 089cae5d45..54c7e9fa6b 100644 --- a/controlplane/src/core/bufservices/feature-flag/deleteFeatureFlag.ts +++ b/controlplane/src/core/bufservices/feature-flag/deleteFeatureFlag.ts @@ -1,24 +1,17 @@ import { PlainMessage } from '@bufbuild/protobuf'; import { HandlerContext } from '@connectrpc/connect'; import { EnumStatusCode } from '@wundergraph/cosmo-connect/dist/common/common_pb'; -import { OrganizationEventName } from '@wundergraph/cosmo-connect/dist/notifications/events_pb'; import { - CompositionError, - CompositionWarning, DeleteFeatureFlagRequest, DeleteFeatureFlagResponse, - DeploymentError, } from '@wundergraph/cosmo-connect/dist/platform/v1/platform_pb'; -import { COMPOSITION_IGNORE_EXTERNAL_KEYS_FEATURE_ID } from '../../../types/index.js'; import { AuditLogRepository } from '../../repositories/AuditLogRepository.js'; import { FeatureFlagRepository } from '../../repositories/FeatureFlagRepository.js'; -import { FederatedGraphRepository } from '../../repositories/FederatedGraphRepository.js'; import { DefaultNamespace, NamespaceRepository } from '../../repositories/NamespaceRepository.js'; -import { OrganizationRepository } from '../../repositories/OrganizationRepository.js'; import type { RouterOptions } from '../../routes.js'; import { enrichLogger, getLogger, handleError } from '../../util.js'; -import { OrganizationWebhookService } from '../../webhooks/OrganizationWebhookService.js'; import { UnauthorizedError } from '../../errors/errors.js'; +import { CompositionService } from '../../services/CompositionService.js'; export function deleteFeatureFlag( opts: RouterOptions, @@ -33,17 +26,8 @@ export function deleteFeatureFlag( const featureFlagRepo = new FeatureFlagRepository(logger, opts.db, authContext.organizationId); const namespaceRepo = new NamespaceRepository(opts.db, authContext.organizationId); - const orgRepo = new OrganizationRepository(logger, opts.db, opts.billingDefaultPlanId); - const orgWebhooks = new OrganizationWebhookService( - opts.db, - authContext.organizationId, - opts.logger, - opts.billingDefaultPlanId, - opts.webhookProxyUrl, - ); req.namespace = req.namespace || DefaultNamespace; - if (authContext.organizationDeactivated) { throw new UnauthorizedError(); } @@ -82,44 +66,32 @@ export function deleteFeatureFlag( throw new UnauthorizedError(); } - // Collect the federated graph DTOs that have the feature flag enabled because they will be re-composed - const federatedGraphs = await featureFlagRepo.getFederatedGraphsByFeatureFlag({ - featureFlagId: featureFlag.id, - namespaceId: namespace.id, - // if deleting when already disabled, there are no compositions to be done. - excludeDisabled: true, - }); + const { deploymentErrors, compositionErrors, compositionWarnings } = await opts.db.transaction(async (tx) => { + const auditLogRepo = new AuditLogRepository(tx); + const featureFlagRepo = new FeatureFlagRepository(logger, tx, authContext.organizationId); + const compositionService = new CompositionService( + tx, + authContext.organizationId, + logger, + { cdnBaseUrl: opts.cdnBaseUrl, webhookJWTSecret: opts.admissionWebhookJWTSecret }, + opts.blobStorage, + opts.chClient, + opts.webhookProxyUrl, + req.disableResolvabilityValidation, + ); - /* Check that the user is authorized to delete the feature flag - * The user must have authorization for each related federated graph - * */ - for (const federatedGraph of federatedGraphs) { - // check if the user is authorized to perform the action - await opts.authorizer.authorize({ - db: opts.db, - graph: { - targetId: federatedGraph.targetId, - targetType: 'federatedGraph', + const result = await compositionService.deleteFeatureFlag({ + actorId: authContext.userId, + featureFlag, + authorize(graph) { + return opts.authorizer.authorize({ + db: tx, + graph: { targetId: graph.targetId, targetType: 'federatedGraph' }, + headers: ctx.requestHeader, + authContext, + }); }, - headers: ctx.requestHeader, - authContext, }); - } - - const ignoreExternalKeysFeature = await orgRepo.getFeature({ - organizationId: authContext.organizationId, - featureId: COMPOSITION_IGNORE_EXTERNAL_KEYS_FEATURE_ID, - }); - - const compositionErrors: PlainMessage[] = []; - const deploymentErrors: PlainMessage[] = []; - const compositionWarnings: PlainMessage[] = []; - - await opts.db.transaction(async (tx) => { - const fedGraphRepo = new FederatedGraphRepository(logger, tx, authContext.organizationId); - const auditLogRepo = new AuditLogRepository(tx); - - await featureFlagRepo.delete(featureFlag.id); await auditLogRepo.addAuditLog({ organizationId: authContext.organizationId, @@ -136,74 +108,17 @@ export function deleteFeatureFlag( targetNamespaceDisplayName: namespace.name, }); - const composition = await fedGraphRepo.composeAndDeployGraphs({ - actorId: authContext.userId, - admissionConfig: { - cdnBaseUrl: opts.cdnBaseUrl, - webhookJWTSecret: opts.admissionWebhookJWTSecret, - }, - blobStorage: opts.blobStorage, - chClient: opts.chClient!, - compositionOptions: { - disableResolvabilityValidation: req.disableResolvabilityValidation, - ignoreExternalKeys: ignoreExternalKeysFeature?.enabled ?? false, - }, - federatedGraphs, - webhookProxyUrl: opts.webhookProxyUrl, - }); - - compositionErrors.push(...composition.compositionErrors); - deploymentErrors.push(...composition.deploymentErrors); - compositionWarnings.push(...composition.compositionWarnings); + return result; }); - for (const graph of federatedGraphs) { - orgWebhooks.send( - { - eventName: OrganizationEventName.FEDERATED_GRAPH_SCHEMA_UPDATED, - payload: { - federated_graph: { - id: graph.id, - name: graph.name, - namespace: graph.namespace, - }, - organization: { - id: authContext.organizationId, - slug: authContext.organizationSlug, - }, - errors: compositionErrors.length > 0 || deploymentErrors.length > 0, - actor_id: authContext.userId, - }, - }, - authContext.userId, - ); - } - - if (compositionErrors.length > 0) { - return { - response: { - code: EnumStatusCode.ERR_SUBGRAPH_COMPOSITION_FAILED, - }, - compositionErrors, - deploymentErrors: [], - compositionWarnings, - }; - } - - if (deploymentErrors.length > 0) { - return { - response: { - code: EnumStatusCode.ERR_DEPLOYMENT_FAILED, - }, - compositionErrors: [], - deploymentErrors, - compositionWarnings, - }; - } - return { response: { - code: EnumStatusCode.OK, + code: + compositionErrors.length > 0 + ? EnumStatusCode.ERR_SUBGRAPH_COMPOSITION_FAILED + : deploymentErrors.length > 0 + ? EnumStatusCode.ERR_DEPLOYMENT_FAILED + : EnumStatusCode.OK, }, compositionErrors, deploymentErrors, diff --git a/controlplane/src/core/bufservices/feature-flag/enableFeatureFlag.ts b/controlplane/src/core/bufservices/feature-flag/enableFeatureFlag.ts index 909932ce44..83d0b596df 100644 --- a/controlplane/src/core/bufservices/feature-flag/enableFeatureFlag.ts +++ b/controlplane/src/core/bufservices/feature-flag/enableFeatureFlag.ts @@ -1,24 +1,17 @@ import { PlainMessage } from '@bufbuild/protobuf'; import { HandlerContext } from '@connectrpc/connect'; import { EnumStatusCode } from '@wundergraph/cosmo-connect/dist/common/common_pb'; -import { OrganizationEventName } from '@wundergraph/cosmo-connect/dist/notifications/events_pb'; import { - CompositionError, - CompositionWarning, - DeploymentError, EnableFeatureFlagRequest, EnableFeatureFlagResponse, } from '@wundergraph/cosmo-connect/dist/platform/v1/platform_pb'; -import { COMPOSITION_IGNORE_EXTERNAL_KEYS_FEATURE_ID } from '../../../types/index.js'; import { AuditLogRepository } from '../../repositories/AuditLogRepository.js'; import { FeatureFlagRepository } from '../../repositories/FeatureFlagRepository.js'; -import { FederatedGraphRepository } from '../../repositories/FederatedGraphRepository.js'; import { DefaultNamespace, NamespaceRepository } from '../../repositories/NamespaceRepository.js'; -import { OrganizationRepository } from '../../repositories/OrganizationRepository.js'; import type { RouterOptions } from '../../routes.js'; import { enrichLogger, getLogger, handleError } from '../../util.js'; -import { OrganizationWebhookService } from '../../webhooks/OrganizationWebhookService.js'; import { UnauthorizedError } from '../../errors/errors.js'; +import { CompositionService } from '../../services/CompositionService.js'; export function enableFeatureFlag( opts: RouterOptions, @@ -33,18 +26,9 @@ export function enableFeatureFlag( const featureFlagRepo = new FeatureFlagRepository(logger, opts.db, authContext.organizationId); const namespaceRepo = new NamespaceRepository(opts.db, authContext.organizationId); - const orgRepo = new OrganizationRepository(logger, opts.db, opts.billingDefaultPlanId); const auditLogRepo = new AuditLogRepository(opts.db); - const orgWebhooks = new OrganizationWebhookService( - opts.db, - authContext.organizationId, - opts.logger, - opts.billingDefaultPlanId, - opts.webhookProxyUrl, - ); req.namespace = req.namespace || DefaultNamespace; - if (authContext.organizationDeactivated) { throw new UnauthorizedError(); } @@ -101,67 +85,25 @@ export function enableFeatureFlag( isEnabled: req.enabled, }); - const federatedGraphs = await featureFlagRepo.getFederatedGraphsByFeatureFlag({ - featureFlagId: featureFlag.id, - namespaceId: namespace.id, - // fetch the federated graphs based on the state that has just been set for the feature flag above - excludeDisabled: req.enabled, - }); - const ignoreExternalKeysFeature = await orgRepo.getFeature({ - organizationId: authContext.organizationId, - featureId: COMPOSITION_IGNORE_EXTERNAL_KEYS_FEATURE_ID, - }); - - const compositionErrors: PlainMessage[] = []; - const deploymentErrors: PlainMessage[] = []; - const compositionWarnings: PlainMessage[] = []; - - await opts.db.transaction(async (tx) => { - const fedGraphRepo = new FederatedGraphRepository(logger, tx, authContext.organizationId); + const { deploymentErrors, compositionErrors, compositionWarnings } = await opts.db.transaction((tx) => { + const compositionService = new CompositionService( + tx, + authContext.organizationId, + logger, + { cdnBaseUrl: opts.cdnBaseUrl, webhookJWTSecret: opts.admissionWebhookJWTSecret }, + opts.blobStorage, + opts.chClient, + opts.webhookProxyUrl, + req.disableResolvabilityValidation, + ); - const composition = await fedGraphRepo.composeAndDeployGraphs({ + return compositionService.composeAndDeployFeatureFlag({ actorId: authContext.userId, - admissionConfig: { - cdnBaseUrl: opts.cdnBaseUrl, - webhookJWTSecret: opts.admissionWebhookJWTSecret, - }, - blobStorage: opts.blobStorage, - chClient: opts.chClient!, - compositionOptions: { - disableResolvabilityValidation: req.disableResolvabilityValidation, - ignoreExternalKeys: ignoreExternalKeysFeature?.enabled ?? false, - }, - federatedGraphs, - webhookProxyUrl: opts.webhookProxyUrl, + featureFlag, + isEnabled: req.enabled, }); - - compositionErrors.push(...composition.compositionErrors); - deploymentErrors.push(...composition.deploymentErrors); - compositionWarnings.push(...composition.compositionWarnings); }); - for (const graph of federatedGraphs) { - orgWebhooks.send( - { - eventName: OrganizationEventName.FEDERATED_GRAPH_SCHEMA_UPDATED, - payload: { - federated_graph: { - id: graph.id, - name: graph.name, - namespace: graph.namespace, - }, - organization: { - id: authContext.organizationId, - slug: authContext.organizationSlug, - }, - errors: compositionErrors.length > 0 || deploymentErrors.length > 0, - actor_id: authContext.userId, - }, - }, - authContext.userId, - ); - } - await auditLogRepo.addAuditLog({ organizationId: authContext.organizationId, organizationSlug: authContext.organizationSlug, @@ -177,31 +119,14 @@ export function enableFeatureFlag( targetNamespaceDisplayName: featureFlag.namespace, }); - if (compositionErrors.length > 0) { - return { - response: { - code: EnumStatusCode.ERR_SUBGRAPH_COMPOSITION_FAILED, - }, - compositionErrors, - deploymentErrors: [], - compositionWarnings, - }; - } - - if (deploymentErrors.length > 0) { - return { - response: { - code: EnumStatusCode.ERR_DEPLOYMENT_FAILED, - }, - compositionErrors: [], - deploymentErrors, - compositionWarnings, - }; - } - return { response: { - code: EnumStatusCode.OK, + code: + compositionErrors.length > 0 + ? EnumStatusCode.ERR_SUBGRAPH_COMPOSITION_FAILED + : deploymentErrors.length > 0 + ? EnumStatusCode.ERR_DEPLOYMENT_FAILED + : EnumStatusCode.OK, }, compositionErrors, deploymentErrors, diff --git a/controlplane/src/core/bufservices/feature-flag/updateFeatureFlag.ts b/controlplane/src/core/bufservices/feature-flag/updateFeatureFlag.ts index a8e5c671da..9dadf61443 100644 --- a/controlplane/src/core/bufservices/feature-flag/updateFeatureFlag.ts +++ b/controlplane/src/core/bufservices/feature-flag/updateFeatureFlag.ts @@ -1,24 +1,17 @@ import { PlainMessage } from '@bufbuild/protobuf'; import { HandlerContext } from '@connectrpc/connect'; import { EnumStatusCode } from '@wundergraph/cosmo-connect/dist/common/common_pb'; -import { OrganizationEventName } from '@wundergraph/cosmo-connect/dist/notifications/events_pb'; import { - CompositionError, - CompositionWarning, - DeploymentError, UpdateFeatureFlagRequest, UpdateFeatureFlagResponse, } from '@wundergraph/cosmo-connect/dist/platform/v1/platform_pb'; -import { COMPOSITION_IGNORE_EXTERNAL_KEYS_FEATURE_ID, FederatedGraphDTO } from '../../../types/index.js'; import { AuditLogRepository } from '../../repositories/AuditLogRepository.js'; import { FeatureFlagRepository } from '../../repositories/FeatureFlagRepository.js'; -import { FederatedGraphRepository } from '../../repositories/FederatedGraphRepository.js'; import { DefaultNamespace, NamespaceRepository } from '../../repositories/NamespaceRepository.js'; -import { OrganizationRepository } from '../../repositories/OrganizationRepository.js'; import type { RouterOptions } from '../../routes.js'; import { enrichLogger, getLogger, handleError, isValidLabels } from '../../util.js'; -import { OrganizationWebhookService } from '../../webhooks/OrganizationWebhookService.js'; import { UnauthorizedError } from '../../errors/errors.js'; +import { CompositionService } from '../../services/CompositionService.js'; export function updateFeatureFlag( opts: RouterOptions, @@ -33,14 +26,6 @@ export function updateFeatureFlag( const featureFlagRepo = new FeatureFlagRepository(logger, opts.db, authContext.organizationId); const namespaceRepo = new NamespaceRepository(opts.db, authContext.organizationId); - const orgRepo = new OrganizationRepository(logger, opts.db, opts.billingDefaultPlanId); - const orgWebhooks = new OrganizationWebhookService( - opts.db, - authContext.organizationId, - opts.logger, - opts.billingDefaultPlanId, - opts.webhookProxyUrl, - ); req.namespace = req.namespace || DefaultNamespace; @@ -112,21 +97,12 @@ export function updateFeatureFlag( } const auditLogRepo = new AuditLogRepository(opts.db); - - const allFederatedGraphsToCompose: FederatedGraphDTO[] = []; - const allFederatedGraphIdsToCompose = new Set(); - const prevFederatedGraphs = await featureFlagRepo.getFederatedGraphsByFeatureFlag({ featureFlagId: featureFlagDTO.id, namespaceId: namespace.id, excludeDisabled: true, }); - for (const prevFederatedGraph of prevFederatedGraphs) { - allFederatedGraphIdsToCompose.add(prevFederatedGraph.id); - allFederatedGraphsToCompose.push(prevFederatedGraph); - } - await featureFlagRepo.updateFeatureFlag({ featureFlag: featureFlagDTO, labels: req.labels, @@ -149,102 +125,51 @@ export function updateFeatureFlag( targetNamespaceDisplayName: namespace.name, }); - const newFederatedGraphs = await featureFlagRepo.getFederatedGraphsByFeatureFlag({ + const updatedFeatureFlag = await featureFlagRepo.getFeatureFlagById({ featureFlagId: featureFlagDTO.id, namespaceId: namespace.id, - excludeDisabled: true, - }); - - for (const newFederatedGraph of newFederatedGraphs) { - if (allFederatedGraphIdsToCompose.has(newFederatedGraph.id)) { - continue; - } - allFederatedGraphsToCompose.push(newFederatedGraph); - } - - const ignoreExternalKeysFeature = await orgRepo.getFeature({ - organizationId: authContext.organizationId, - featureId: COMPOSITION_IGNORE_EXTERNAL_KEYS_FEATURE_ID, - }); - - const compositionErrors: PlainMessage[] = []; - const deploymentErrors: PlainMessage[] = []; - const compositionWarnings: PlainMessage[] = []; - - await opts.db.transaction(async (tx) => { - const fedGraphRepo = new FederatedGraphRepository(logger, tx, authContext.organizationId); - - const composition = await fedGraphRepo.composeAndDeployGraphs({ - actorId: authContext.userId, - admissionConfig: { - cdnBaseUrl: opts.cdnBaseUrl, - webhookJWTSecret: opts.admissionWebhookJWTSecret, - }, - blobStorage: opts.blobStorage, - chClient: opts.chClient!, - compositionOptions: { - disableResolvabilityValidation: req.disableResolvabilityValidation, - ignoreExternalKeys: ignoreExternalKeysFeature?.enabled ?? false, - }, - federatedGraphs: allFederatedGraphsToCompose, - webhookProxyUrl: opts.webhookProxyUrl, - }); - - compositionErrors.push(...composition.compositionErrors); - deploymentErrors.push(...composition.deploymentErrors); - compositionWarnings.push(...composition.compositionWarnings); + includeSubgraphs: true, }); - for (const graph of allFederatedGraphsToCompose) { - const hasErrors = - compositionErrors.some((error) => error.federatedGraphName === graph.name) || - deploymentErrors.some((error) => error.federatedGraphName === graph.name); - orgWebhooks.send( - { - eventName: OrganizationEventName.FEDERATED_GRAPH_SCHEMA_UPDATED, - payload: { - federated_graph: { - id: graph.id, - name: graph.name, - namespace: graph.namespace, - }, - organization: { - id: authContext.organizationId, - slug: authContext.organizationSlug, - }, - errors: hasErrors, - actor_id: authContext.userId, - }, - }, - authContext.userId, - ); - } - - if (compositionErrors.length > 0) { + if (!updatedFeatureFlag) { return { response: { - code: EnumStatusCode.ERR_SUBGRAPH_COMPOSITION_FAILED, + code: EnumStatusCode.ERR_NOT_FOUND, + details: `Feature flag "${featureFlagDTO.name}" was not found after updating.`, }, - compositionErrors, + compositionErrors: [], deploymentErrors: [], - compositionWarnings, + compositionWarnings: [], }; } - if (deploymentErrors.length > 0) { - return { - response: { - code: EnumStatusCode.ERR_DEPLOYMENT_FAILED, - }, - compositionErrors: [], - deploymentErrors, - compositionWarnings, - }; - } + const { deploymentErrors, compositionErrors, compositionWarnings } = await opts.db.transaction((tx) => { + const compositionService = new CompositionService( + tx, + authContext.organizationId, + logger, + { cdnBaseUrl: opts.cdnBaseUrl, webhookJWTSecret: opts.admissionWebhookJWTSecret }, + opts.blobStorage, + opts.chClient, + opts.webhookProxyUrl, + req.disableResolvabilityValidation, + ); + + return compositionService.composeAndDeployFeatureFlag({ + actorId: authContext.userId, + featureFlag: updatedFeatureFlag, + prevFederatedGraphs, + }); + }); return { response: { - code: EnumStatusCode.OK, + code: + compositionErrors.length > 0 + ? EnumStatusCode.ERR_SUBGRAPH_COMPOSITION_FAILED + : deploymentErrors.length > 0 + ? EnumStatusCode.ERR_DEPLOYMENT_FAILED + : EnumStatusCode.OK, }, compositionErrors, deploymentErrors, diff --git a/controlplane/src/core/bufservices/federated-graph/createFederatedGraph.ts b/controlplane/src/core/bufservices/federated-graph/createFederatedGraph.ts index 771fd5419e..605743c38b 100644 --- a/controlplane/src/core/bufservices/federated-graph/createFederatedGraph.ts +++ b/controlplane/src/core/bufservices/federated-graph/createFederatedGraph.ts @@ -3,14 +3,10 @@ import { HandlerContext } from '@connectrpc/connect'; import { EnumStatusCode } from '@wundergraph/cosmo-connect/dist/common/common_pb'; import { OrganizationEventName } from '@wundergraph/cosmo-connect/dist/notifications/events_pb'; import { - CompositionError, - CompositionWarning, CreateFederatedGraphRequest, CreateFederatedGraphResponse, - DeploymentError, } from '@wundergraph/cosmo-connect/dist/platform/v1/platform_pb'; import { isValidUrl } from '@wundergraph/cosmo-shared'; -import { COMPOSITION_IGNORE_EXTERNAL_KEYS_FEATURE_ID } from '../../../types/index.js'; import { AuditLogRepository } from '../../repositories/AuditLogRepository.js'; import { FederatedGraphRepository } from '../../repositories/FederatedGraphRepository.js'; import { DefaultNamespace, NamespaceRepository } from '../../repositories/NamespaceRepository.js'; @@ -20,6 +16,7 @@ import type { RouterOptions } from '../../routes.js'; import { enrichLogger, getLogger, handleError, isValidGraphName, isValidLabelMatchers } from '../../util.js'; import { OrganizationWebhookService } from '../../webhooks/OrganizationWebhookService.js'; import { UnauthorizedError } from '../../errors/errors.js'; +import { CompositionService } from '../../services/CompositionService.js'; export function createFederatedGraph( opts: RouterOptions, @@ -130,14 +127,12 @@ export function createFederatedGraph( } const count = await fedGraphRepo.count(); - const feature = await orgRepo.getFeature({ organizationId: authContext.organizationId, featureId: 'federated-graphs', }); const limit = feature?.limit === -1 ? undefined : feature?.limit; - if (limit && count >= limit) { return { response: { @@ -212,37 +207,19 @@ export function createFederatedGraph( }; } - const ignoreExternalKeysFeature = await orgRepo.getFeature({ - organizationId: authContext.organizationId, - featureId: COMPOSITION_IGNORE_EXTERNAL_KEYS_FEATURE_ID, - }); - - const compositionErrors: PlainMessage[] = []; - const deploymentErrors: PlainMessage[] = []; - const compositionWarnings: PlainMessage[] = []; - - await opts.db.transaction(async (tx) => { - const fedGraphRepo = new FederatedGraphRepository(logger, tx, authContext.organizationId); + const { deploymentErrors, compositionErrors, compositionWarnings } = await opts.db.transaction((tx) => { + const compositionService = new CompositionService( + tx, + authContext.organizationId, + logger, + { cdnBaseUrl: opts.cdnBaseUrl, webhookJWTSecret: opts.admissionWebhookJWTSecret }, + opts.blobStorage, + opts.chClient, + opts.webhookProxyUrl, + req.disableResolvabilityValidation, + ); - const composition = await fedGraphRepo.composeAndDeployGraphs({ - actorId: authContext.userId, - admissionConfig: { - cdnBaseUrl: opts.cdnBaseUrl, - webhookJWTSecret: opts.admissionWebhookJWTSecret, - }, - blobStorage: opts.blobStorage, - chClient: opts.chClient!, - compositionOptions: { - disableResolvabilityValidation: req.disableResolvabilityValidation, - ignoreExternalKeys: ignoreExternalKeysFeature?.enabled ?? false, - }, - federatedGraphs: [federatedGraph], - webhookProxyUrl: opts.webhookProxyUrl, - }); - - compositionErrors.push(...composition.compositionErrors); - deploymentErrors.push(...composition.deploymentErrors); - compositionWarnings.push(...composition.compositionWarnings); + return compositionService.composeAndDeployFederatedGraph({ actorId: authContext.userId, federatedGraph }); }); orgWebhooks.send( @@ -265,34 +242,17 @@ export function createFederatedGraph( authContext.userId, ); - if (compositionErrors.length > 0) { - return { - response: { - code: EnumStatusCode.ERR_SUBGRAPH_COMPOSITION_FAILED, - }, - compositionErrors, - deploymentErrors: [], - compositionWarnings, - }; - } - - if (deploymentErrors.length > 0) { - return { - response: { - code: EnumStatusCode.ERR_DEPLOYMENT_FAILED, - }, - compositionErrors: [], - deploymentErrors, - compositionWarnings, - }; - } - return { response: { - code: EnumStatusCode.OK, + code: + compositionErrors.length > 0 + ? EnumStatusCode.ERR_SUBGRAPH_COMPOSITION_FAILED + : deploymentErrors.length > 0 + ? EnumStatusCode.ERR_DEPLOYMENT_FAILED + : EnumStatusCode.OK, }, - compositionErrors: [], - deploymentErrors: [], + compositionErrors, + deploymentErrors, compositionWarnings, }; }); diff --git a/controlplane/src/core/bufservices/federated-graph/migrateFromApollo.ts b/controlplane/src/core/bufservices/federated-graph/migrateFromApollo.ts index 9b1934bbf4..b8e321e86f 100644 --- a/controlplane/src/core/bufservices/federated-graph/migrateFromApollo.ts +++ b/controlplane/src/core/bufservices/federated-graph/migrateFromApollo.ts @@ -6,7 +6,7 @@ import { MigrateFromApolloRequest, MigrateFromApolloResponse, } from '@wundergraph/cosmo-connect/dist/platform/v1/platform_pb'; -import { COMPOSITION_IGNORE_EXTERNAL_KEYS_FEATURE_ID, GraphApiKeyJwtPayload } from '../../../types/index.js'; +import { GraphApiKeyJwtPayload } from '../../../types/index.js'; import { audiences, signJwtHS256 } from '../../crypto/jwt.js'; import { AuditLogRepository } from '../../repositories/AuditLogRepository.js'; import { FederatedGraphRepository } from '../../repositories/FederatedGraphRepository.js'; @@ -19,6 +19,7 @@ import ApolloMigrator from '../../services/ApolloMigrator.js'; import { enrichLogger, getLogger, handleError } from '../../util.js'; import { OrganizationWebhookService } from '../../webhooks/OrganizationWebhookService.js'; import { UnauthorizedError } from '../../errors/errors.js'; +import { CompositionService } from '../../services/CompositionService.js'; export function migrateFromApollo( opts: RouterOptions, @@ -77,7 +78,6 @@ export function migrateFromApollo( } const user = await userRepo.byId(authContext.userId || ''); - const apolloMigrator = new ApolloMigrator({ apiKey: req.apiKey, organizationSlug: org.slug, @@ -99,7 +99,6 @@ export function migrateFromApollo( } const graphDetails = await apolloMigrator.fetchGraphDetails({ graphID: graph.id }); - if (!graphDetails.success) { return { response: { @@ -132,14 +131,7 @@ export function migrateFromApollo( } } - const ignoreExternalKeysFeature = await orgRepo.getFeature({ - organizationId: authContext.organizationId, - featureId: COMPOSITION_IGNORE_EXTERNAL_KEYS_FEATURE_ID, - }); - await opts.db.transaction(async (tx) => { - const fedGraphRepo = new FederatedGraphRepository(logger, tx, authContext.organizationId); - const federatedGraph = await apolloMigrator.migrateGraphFromApollo({ fedGraph: { name: graph.name, @@ -153,21 +145,18 @@ export function migrateFromApollo( namespaceId: namespace.id, }); - await fedGraphRepo.composeAndDeployGraphs({ - federatedGraphs: [federatedGraph], - actorId: authContext.userId, - blobStorage: opts.blobStorage, - admissionConfig: { - cdnBaseUrl: opts.cdnBaseUrl, - webhookJWTSecret: opts.admissionWebhookJWTSecret, - }, - chClient: opts.chClient!, - compositionOptions: { - disableResolvabilityValidation: true, - ignoreExternalKeys: ignoreExternalKeysFeature?.enabled ?? false, - }, - webhookProxyUrl: opts.webhookProxyUrl, - }); + const compositionService = new CompositionService( + tx, + authContext.organizationId, + logger, + { cdnBaseUrl: opts.cdnBaseUrl, webhookJWTSecret: opts.admissionWebhookJWTSecret }, + opts.blobStorage, + opts.chClient, + opts.webhookProxyUrl, + true, + ); + + await compositionService.composeAndDeployFederatedGraph({ actorId: authContext.userId, federatedGraph }); }); const migratedGraph = await fedGraphRepo.byName(graph.name, req.namespace); diff --git a/controlplane/src/core/bufservices/federated-graph/moveFederatedGraph.ts b/controlplane/src/core/bufservices/federated-graph/moveFederatedGraph.ts index 9a543561b1..0bb782f2bd 100644 --- a/controlplane/src/core/bufservices/federated-graph/moveFederatedGraph.ts +++ b/controlplane/src/core/bufservices/federated-graph/moveFederatedGraph.ts @@ -17,6 +17,7 @@ import type { RouterOptions } from '../../routes.js'; import { enrichLogger, getLogger, handleError } from '../../util.js'; import { OrganizationWebhookService } from '../../webhooks/OrganizationWebhookService.js'; import { UnauthorizedError } from '../../errors/errors.js'; +import { CompositionService } from '../../services/CompositionService.js'; export function moveFederatedGraph( opts: RouterOptions, @@ -113,6 +114,17 @@ export function moveFederatedGraph( throw new UnauthorizedError(); } + const compositionService = new CompositionService( + tx, + authContext.organizationId, + logger, + { cdnBaseUrl: opts.cdnBaseUrl, webhookJWTSecret: opts.admissionWebhookJWTSecret }, + opts.blobStorage, + opts.chClient, + opts.webhookProxyUrl, + req.disableResolvabilityValidation, + ); + const { compositionErrors, deploymentErrors, compositionWarnings } = await fedGraphRepo.move( { targetId: graph.targetId, @@ -120,14 +132,7 @@ export function moveFederatedGraph( updatedBy: authContext.userId, federatedGraph: graph, }, - opts.blobStorage, - { - cdnBaseUrl: opts.cdnBaseUrl, - jwtSecret: opts.admissionWebhookJWTSecret, - }, - opts.chClient!, - undefined, - opts.webhookProxyUrl, + compositionService, ); const allDeploymentErrors: PlainMessage[] = []; @@ -141,7 +146,6 @@ export function moveFederatedGraph( const movedGraphs = [graph]; const contracts = await contractRepo.bySourceFederatedGraphId(graph.id); - for (const contract of contracts) { const contractGraph = await fedGraphRepo.byId(contract.downstreamFederatedGraphId); if (!contractGraph) { @@ -160,14 +164,7 @@ export function moveFederatedGraph( federatedGraph: contractGraph, skipDeployment: compositionErrors.length > 0, }, - opts.blobStorage, - { - cdnBaseUrl: opts.cdnBaseUrl, - jwtSecret: opts.admissionWebhookJWTSecret, - }, - opts.chClient!, - undefined, - opts.webhookProxyUrl, + compositionService, ); allCompositionErrors.push(...contractErrors); @@ -219,34 +216,17 @@ export function moveFederatedGraph( ); } - if (allCompositionErrors.length > 0) { - return { - response: { - code: EnumStatusCode.ERR_SUBGRAPH_COMPOSITION_FAILED, - }, - deploymentErrors: [], - compositionErrors: allCompositionErrors, - compositionWarnings: allCompositionWarnings, - }; - } - - if (allDeploymentErrors.length > 0) { - return { - response: { - code: EnumStatusCode.ERR_DEPLOYMENT_FAILED, - }, - deploymentErrors: allDeploymentErrors, - compositionErrors: [], - compositionWarnings: allCompositionWarnings, - }; - } - return { response: { - code: EnumStatusCode.OK, + code: + allCompositionErrors.length > 0 + ? EnumStatusCode.ERR_SUBGRAPH_COMPOSITION_FAILED + : allDeploymentErrors.length > 0 + ? EnumStatusCode.ERR_DEPLOYMENT_FAILED + : EnumStatusCode.OK, }, - compositionErrors: [], - deploymentErrors: [], + compositionErrors: allCompositionErrors, + deploymentErrors: allDeploymentErrors, compositionWarnings: allCompositionWarnings, }; }); diff --git a/controlplane/src/core/bufservices/federated-graph/updateFederatedGraph.ts b/controlplane/src/core/bufservices/federated-graph/updateFederatedGraph.ts index dccc4106bf..375183dd9b 100644 --- a/controlplane/src/core/bufservices/federated-graph/updateFederatedGraph.ts +++ b/controlplane/src/core/bufservices/federated-graph/updateFederatedGraph.ts @@ -3,22 +3,18 @@ import { HandlerContext } from '@connectrpc/connect'; import { EnumStatusCode } from '@wundergraph/cosmo-connect/dist/common/common_pb'; import { OrganizationEventName } from '@wundergraph/cosmo-connect/dist/notifications/events_pb'; import { - CompositionError, - CompositionWarning, - DeploymentError, UpdateFederatedGraphRequest, UpdateFederatedGraphResponse, } from '@wundergraph/cosmo-connect/dist/platform/v1/platform_pb'; import { isValidUrl } from '@wundergraph/cosmo-shared'; -import { COMPOSITION_IGNORE_EXTERNAL_KEYS_FEATURE_ID } from '../../../types/index.js'; import { AuditLogRepository } from '../../repositories/AuditLogRepository.js'; import { FederatedGraphRepository } from '../../repositories/FederatedGraphRepository.js'; import { DefaultNamespace } from '../../repositories/NamespaceRepository.js'; -import { OrganizationRepository } from '../../repositories/OrganizationRepository.js'; import type { RouterOptions } from '../../routes.js'; import { enrichLogger, getLogger, handleError, isValidLabelMatchers } from '../../util.js'; import { OrganizationWebhookService } from '../../webhooks/OrganizationWebhookService.js'; import { UnauthorizedError } from '../../errors/errors.js'; +import { CompositionService } from '../../services/CompositionService.js'; export function updateFederatedGraph( opts: RouterOptions, @@ -32,7 +28,6 @@ export function updateFederatedGraph( logger = enrichLogger(ctx, logger, authContext); const fedGraphRepo = new FederatedGraphRepository(logger, opts.db, authContext.organizationId); - const orgRepo = new OrganizationRepository(logger, opts.db, opts.billingDefaultPlanId); const auditLogRepo = new AuditLogRepository(opts.db); const orgWebhooks = new OrganizationWebhookService( opts.db, @@ -110,50 +105,33 @@ export function updateFederatedGraph( }; } - const ignoreExternalKeysFeature = await orgRepo.getFeature({ - organizationId: authContext.organizationId, - featureId: COMPOSITION_IGNORE_EXTERNAL_KEYS_FEATURE_ID, - }); - - const deploymentErrors: PlainMessage[] = []; - let compositionErrors: PlainMessage[] = []; - const compositionWarnings: PlainMessage[] = []; + const result = await opts.db.transaction((tx) => { + const compositionService = new CompositionService( + tx, + authContext.organizationId, + logger, + { cdnBaseUrl: opts.cdnBaseUrl, webhookJWTSecret: opts.admissionWebhookJWTSecret }, + opts.blobStorage, + opts.chClient, + opts.webhookProxyUrl, + req.disableResolvabilityValidation, + ); - const result = await fedGraphRepo.update({ - admissionConfig: { - cdnBaseUrl: opts.cdnBaseUrl, - jwtSecret: opts.admissionWebhookJWTSecret, - }, - admissionWebhookSecret: req.admissionWebhookSecret, - admissionWebhookURL: req.admissionWebhookURL, - blobStorage: opts.blobStorage, - chClient: opts.chClient!, - compositionOptions: { - disableResolvabilityValidation: req.disableResolvabilityValidation, - ignoreExternalKeys: ignoreExternalKeysFeature?.enabled ?? false, - }, - labelMatchers: req.labelMatchers, - namespaceId: federatedGraph.namespaceId, - readme: req.readme, - routingUrl: req.routingUrl, - targetId: federatedGraph.targetId, - unsetLabelMatchers: req.unsetLabelMatchers, - updatedBy: authContext.userId, - webhookProxyUrl: opts.webhookProxyUrl, + const fedGraphRepo = new FederatedGraphRepository(logger, tx, authContext.organizationId); + return fedGraphRepo.update({ + compositionService, + admissionWebhookSecret: req.admissionWebhookSecret, + admissionWebhookURL: req.admissionWebhookURL, + labelMatchers: req.labelMatchers, + namespaceId: federatedGraph.namespaceId, + readme: req.readme, + routingUrl: req.routingUrl, + targetId: federatedGraph.targetId, + unsetLabelMatchers: req.unsetLabelMatchers, + updatedBy: authContext.userId, + }); }); - if (result?.deploymentErrors) { - deploymentErrors.push(...result.deploymentErrors); - } - - if (result?.compositionErrors) { - compositionErrors = result.compositionErrors; - } - - if (result?.compositionWarnings) { - compositionWarnings.push(...result.compositionWarnings); - } - await auditLogRepo.addAuditLog({ organizationId: authContext.organizationId, organizationSlug: authContext.organizationSlug, @@ -184,7 +162,7 @@ export function updateFederatedGraph( id: authContext.organizationId, slug: authContext.organizationSlug, }, - errors: compositionErrors.length > 0 || deploymentErrors.length > 0, + errors: result.compositionErrors.length > 0 || result.deploymentErrors.length > 0, actor_id: authContext.userId, }, }, @@ -192,35 +170,18 @@ export function updateFederatedGraph( ); } - if (compositionErrors.length > 0) { - return { - response: { - code: EnumStatusCode.ERR_SUBGRAPH_COMPOSITION_FAILED, - }, - deploymentErrors: [], - compositionErrors, - compositionWarnings, - }; - } - - if (deploymentErrors.length > 0) { - return { - response: { - code: EnumStatusCode.ERR_DEPLOYMENT_FAILED, - }, - deploymentErrors, - compositionErrors: [], - compositionWarnings, - }; - } - return { response: { - code: EnumStatusCode.OK, + code: + result && result.compositionErrors.length > 0 + ? EnumStatusCode.ERR_SUBGRAPH_COMPOSITION_FAILED + : result && result.deploymentErrors.length > 0 + ? EnumStatusCode.ERR_DEPLOYMENT_FAILED + : EnumStatusCode.OK, }, - compositionErrors: [], - deploymentErrors: [], - compositionWarnings, + compositionErrors: result?.compositionErrors || [], + deploymentErrors: result?.deploymentErrors || [], + compositionWarnings: result?.compositionWarnings || [], }; }); } diff --git a/controlplane/src/core/bufservices/graph/recomposeGraph.ts b/controlplane/src/core/bufservices/graph/recomposeGraph.ts index 88665d0dd0..20a4336173 100644 --- a/controlplane/src/core/bufservices/graph/recomposeGraph.ts +++ b/controlplane/src/core/bufservices/graph/recomposeGraph.ts @@ -5,14 +5,14 @@ import { OrganizationEventName } from '@wundergraph/cosmo-connect/dist/notificat import { RecomposeGraphRequest, RecomposeGraphResponse } from '@wundergraph/cosmo-connect/dist/platform/v1/platform_pb'; import { FederatedGraphRepository } from '../../repositories/FederatedGraphRepository.js'; import { DefaultNamespace } from '../../repositories/NamespaceRepository.js'; -import { OrganizationRepository } from '../../repositories/OrganizationRepository.js'; import type { RouterOptions } from '../../routes.js'; import { clamp, enrichLogger, getLogger, handleError } from '../../util.js'; import { OrganizationWebhookService } from '../../webhooks/OrganizationWebhookService.js'; import { UnauthorizedError } from '../../errors/errors.js'; -import { AuthContext, COMPOSITION_IGNORE_EXTERNAL_KEYS_FEATURE_ID, FederatedGraphDTO } from '../../../types/index.js'; +import { AuthContext, FederatedGraphDTO } from '../../../types/index.js'; import { AuditLogRepository } from '../../repositories/AuditLogRepository.js'; import { maxRowLimitForChecks } from '../../constants.js'; +import { CompositionService } from '../../services/CompositionService.js'; export function recomposeGraph( opts: RouterOptions, @@ -33,8 +33,6 @@ export function recomposeGraph( opts.webhookProxyUrl, ); const federatedGraphRepo = new FederatedGraphRepository(logger, opts.db, authContext.organizationId); - const orgRepo = new OrganizationRepository(logger, opts.db, opts.billingDefaultPlanId); - if (authContext.organizationDeactivated) { throw new UnauthorizedError(); } @@ -69,30 +67,20 @@ export function recomposeGraph( authContext, }); - const ignoreExternalKeys = - ( - await orgRepo.getFeature({ - organizationId: authContext.organizationId, - featureId: COMPOSITION_IGNORE_EXTERNAL_KEYS_FEATURE_ID, - }) - )?.enabled ?? false; - - const { compositionErrors, compositionWarnings, deploymentErrors } = - await federatedGraphRepo.composeAndDeployGraphs({ - actorId: authContext.userId, - admissionConfig: { - cdnBaseUrl: opts.cdnBaseUrl, - webhookJWTSecret: opts.admissionWebhookJWTSecret, - }, - blobStorage: opts.blobStorage, - chClient: opts.chClient!, - compositionOptions: { - disableResolvabilityValidation: req.disableResolvabilityValidation, - ignoreExternalKeys, - }, - federatedGraphs: [graph], - webhookProxyUrl: opts.webhookProxyUrl, - }); + const { compositionErrors, compositionWarnings, deploymentErrors } = await opts.db.transaction((tx) => { + const compositionService = new CompositionService( + tx, + authContext.organizationId, + logger, + { cdnBaseUrl: opts.cdnBaseUrl, webhookJWTSecret: opts.admissionWebhookJWTSecret }, + opts.blobStorage, + opts.chClient, + opts.webhookProxyUrl, + req.disableResolvabilityValidation, + ); + + return compositionService.composeAndDeployFederatedGraph({ actorId: authContext.userId, federatedGraph: graph }); + }); sendOrgWebhooks({ authContext, @@ -103,7 +91,6 @@ export function recomposeGraph( }); const auditLogRepo = new AuditLogRepository(opts.db); - await auditLogRepo.addAuditLog({ organizationId: authContext.organizationId, organizationSlug: authContext.organizationSlug, diff --git a/controlplane/src/core/bufservices/graph/setGraphRouterCompatibilityVersion.ts b/controlplane/src/core/bufservices/graph/setGraphRouterCompatibilityVersion.ts index 8b7cc66b4a..f0114dc864 100644 --- a/controlplane/src/core/bufservices/graph/setGraphRouterCompatibilityVersion.ts +++ b/controlplane/src/core/bufservices/graph/setGraphRouterCompatibilityVersion.ts @@ -6,15 +6,14 @@ import { SetGraphRouterCompatibilityVersionResponse, } from '@wundergraph/cosmo-connect/dist/platform/v1/platform_pb'; import { ROUTER_COMPATIBILITY_VERSIONS, SupportedRouterCompatibilityVersion } from '@wundergraph/composition'; -import { COMPOSITION_IGNORE_EXTERNAL_KEYS_FEATURE_ID } from '../../../types/index.js'; import { FederatedGraphRepository } from '../../repositories/FederatedGraphRepository.js'; import { DefaultNamespace } from '../../repositories/NamespaceRepository.js'; -import { OrganizationRepository } from '../../repositories/OrganizationRepository.js'; import type { RouterOptions } from '../../routes.js'; import { enrichLogger, getLogger, handleError } from '../../util.js'; import { AuditLogRepository } from '../../repositories/AuditLogRepository.js'; import { SubgraphRepository } from '../../repositories/SubgraphRepository.js'; import { UnauthorizedError } from '../../errors/errors.js'; +import { CompositionService } from '../../services/CompositionService.js'; export function setGraphRouterCompatibilityVersion( opts: RouterOptions, @@ -32,8 +31,6 @@ export function setGraphRouterCompatibilityVersion( } const fedGraphRepo = new FederatedGraphRepository(logger, opts.db, authContext.organizationId); - const orgRepo = new OrganizationRepository(logger, opts.db, opts.billingDefaultPlanId); - req.namespace = req.namespace || DefaultNamespace; const federatedGraph = await fedGraphRepo.byName(req.name, req.namespace); @@ -113,18 +110,11 @@ export function setGraphRouterCompatibilityVersion( }; } - const ignoreExternalKeysFeature = await orgRepo.getFeature({ - organizationId: authContext.organizationId, - featureId: COMPOSITION_IGNORE_EXTERNAL_KEYS_FEATURE_ID, - }); - - await opts.db.transaction(async (tx) => { + const { deploymentErrors, compositionErrors, compositionWarnings } = await opts.db.transaction(async (tx) => { const fedGraphRepo = new FederatedGraphRepository(logger, tx, authContext.organizationId); - await fedGraphRepo.updateRouterCompatibilityVersion(federatedGraph.id, version); - const auditLogRepo = new AuditLogRepository(opts.db); - + const auditLogRepo = new AuditLogRepository(tx); await auditLogRepo.addAuditLog({ organizationId: authContext.organizationId, organizationSlug: authContext.organizationSlug, @@ -140,58 +130,37 @@ export function setGraphRouterCompatibilityVersion( targetNamespaceDisplayName: federatedGraph.namespace, }); - const composition = await fedGraphRepo.composeAndDeployGraphs({ - actorId: authContext.userId, - admissionConfig: { - cdnBaseUrl: opts.cdnBaseUrl, - webhookJWTSecret: opts.admissionWebhookJWTSecret, - }, - blobStorage: opts.blobStorage, - chClient: opts.chClient!, - compositionOptions: { - disableResolvabilityValidation: req.disableResolvabilityValidation, - ignoreExternalKeys: ignoreExternalKeysFeature?.enabled ?? false, - }, - federatedGraphs: [federatedGraph], - webhookProxyUrl: opts.webhookProxyUrl, - }); - - if (composition.compositionErrors.length > 0) { - return { - response: { - code: EnumStatusCode.ERR_SUBGRAPH_COMPOSITION_FAILED, - }, - previousVersion: federatedGraph.routerCompatibilityVersion, - newVersion: federatedGraph.routerCompatibilityVersion, - compositionErrors: composition.compositionErrors, - compositionWarnings: composition.compositionWarnings, - deploymentErrors: composition.deploymentErrors, - }; - } - - if (composition.deploymentErrors.length > 0) { - return { - response: { - code: EnumStatusCode.ERR_DEPLOYMENT_FAILED, - }, - previousVersion: federatedGraph.routerCompatibilityVersion, - newVersion: federatedGraph.routerCompatibilityVersion, - compositionErrors: composition.compositionErrors, - compositionWarnings: composition.compositionWarnings, - deploymentErrors: composition.deploymentErrors, - }; - } + const compositionService = new CompositionService( + tx, + authContext.organizationId, + logger, + { cdnBaseUrl: opts.cdnBaseUrl, webhookJWTSecret: opts.admissionWebhookJWTSecret }, + opts.blobStorage, + opts.chClient, + opts.webhookProxyUrl, + req.disableResolvabilityValidation, + ); + + return await compositionService.composeAndDeployFederatedGraph({ actorId: authContext.userId, federatedGraph }); }); return { response: { - code: EnumStatusCode.OK, + code: + compositionErrors.length > 0 + ? EnumStatusCode.ERR_SUBGRAPH_COMPOSITION_FAILED + : deploymentErrors.length > 0 + ? EnumStatusCode.ERR_DEPLOYMENT_FAILED + : EnumStatusCode.OK, }, previousVersion: federatedGraph.routerCompatibilityVersion, - newVersion: version, - compositionErrors: [], - compositionWarnings: [], - deploymentErrors: [], + newVersion: + compositionErrors.length > 0 || deploymentErrors.length > 0 + ? federatedGraph.routerCompatibilityVersion + : version, + compositionErrors, + compositionWarnings, + deploymentErrors, }; }); } diff --git a/controlplane/src/core/bufservices/monograph/publishMonograph.ts b/controlplane/src/core/bufservices/monograph/publishMonograph.ts index fb77261cad..2a9270eccf 100644 --- a/controlplane/src/core/bufservices/monograph/publishMonograph.ts +++ b/controlplane/src/core/bufservices/monograph/publishMonograph.ts @@ -15,6 +15,7 @@ import type { RouterOptions } from '../../routes.js'; import { enrichLogger, getLogger, handleError } from '../../util.js'; import { OrganizationWebhookService } from '../../webhooks/OrganizationWebhookService.js'; import { UnauthorizedError } from '../../errors/errors.js'; +import { CompositionService } from '../../services/CompositionService.js'; export function publishMonograph( opts: RouterOptions, @@ -139,26 +140,33 @@ export function publishMonograph( authContext, }); - const { compositionErrors, updatedFederatedGraphs, deploymentErrors, compositionWarnings } = - await subgraphRepo.update( - { - targetId: subgraphs[0].targetId, - labels: [], - unsetLabels: false, - schemaSDL: subgraphSchemaSDL, - updatedBy: authContext.userId, - namespaceId: namespace.id, - isV2Graph, - }, - opts.blobStorage, - { - cdnBaseUrl: opts.cdnBaseUrl, - webhookJWTSecret: opts.admissionWebhookJWTSecret, - }, - opts.chClient!, - undefined, - opts.webhookProxyUrl, - ); + const { deploymentErrors, compositionErrors, compositionWarnings, updatedFederatedGraphs } = + await opts.db.transaction((tx) => { + const subgraphRepo = new SubgraphRepository(logger, tx, authContext.organizationId); + const compositionService = new CompositionService( + tx, + authContext.organizationId, + logger, + { cdnBaseUrl: opts.cdnBaseUrl, webhookJWTSecret: opts.admissionWebhookJWTSecret }, + opts.blobStorage, + opts.chClient!, + opts.webhookProxyUrl, + false, + ); + + return subgraphRepo.update( + { + targetId: subgraphs[0].targetId, + labels: [], + unsetLabels: false, + schemaSDL: subgraphSchemaSDL, + updatedBy: authContext.userId, + namespaceId: namespace.id, + isV2Graph, + }, + compositionService, + ); + }); for (const graph of updatedFederatedGraphs) { orgWebhooks.send( diff --git a/controlplane/src/core/bufservices/monograph/updateMonograph.ts b/controlplane/src/core/bufservices/monograph/updateMonograph.ts index a41eb51be5..cee8113a1f 100644 --- a/controlplane/src/core/bufservices/monograph/updateMonograph.ts +++ b/controlplane/src/core/bufservices/monograph/updateMonograph.ts @@ -21,6 +21,7 @@ import { } from '../../util.js'; import { OrganizationWebhookService } from '../../webhooks/OrganizationWebhookService.js'; import { UnauthorizedError } from '../../errors/errors.js'; +import { CompositionService } from '../../services/CompositionService.js'; export function updateMonograph( opts: RouterOptions, @@ -135,25 +136,32 @@ export function updateMonograph( authContext, }); + const compositionService = new CompositionService( + tx, + authContext.organizationId, + logger, + { cdnBaseUrl: opts.cdnBaseUrl, webhookJWTSecret: opts.admissionWebhookJWTSecret }, + opts.blobStorage, + opts.chClient!, + opts.webhookProxyUrl, + false, + ); + + // Update the federated graph await fedGraphRepo.update({ + compositionService, targetId: graph.targetId, labelMatchers: [], routingUrl: req.routingUrl, updatedBy: authContext.userId, readme: req.readme, - blobStorage: opts.blobStorage, namespaceId: graph.namespaceId, unsetLabelMatchers: false, - admissionConfig: { - cdnBaseUrl: opts.cdnBaseUrl, - jwtSecret: opts.admissionWebhookJWTSecret, - }, admissionWebhookURL: req.admissionWebhookURL, admissionWebhookSecret: req.admissionWebhookSecret, - chClient: opts.chClient!, - webhookProxyUrl: opts.webhookProxyUrl, }); + // Update the subgraph await subgraphRepo.update( { targetId: subgraph.targetId, @@ -169,14 +177,7 @@ export function updateMonograph( readme: req.readme, namespaceId: subgraph.namespaceId, }, - opts.blobStorage, - { - cdnBaseUrl: opts.cdnBaseUrl, - webhookJWTSecret: opts.admissionWebhookJWTSecret, - }, - opts.chClient!, - undefined, - opts.webhookProxyUrl, + compositionService, ); await auditLogRepo.addAuditLog({ diff --git a/controlplane/src/core/bufservices/subgraph/deleteFederatedSubgraph.ts b/controlplane/src/core/bufservices/subgraph/deleteFederatedSubgraph.ts index 68addc14ec..5f7ed057c4 100644 --- a/controlplane/src/core/bufservices/subgraph/deleteFederatedSubgraph.ts +++ b/controlplane/src/core/bufservices/subgraph/deleteFederatedSubgraph.ts @@ -6,18 +6,18 @@ import { DeleteFederatedSubgraphRequest, DeleteFederatedSubgraphResponse, } from '@wundergraph/cosmo-connect/dist/platform/v1/platform_pb'; -import { COMPOSITION_IGNORE_EXTERNAL_KEYS_FEATURE_ID } from '../../../types/index.js'; +import { FeatureFlagDTO } from '../../../types/index.js'; import { AuditLogRepository } from '../../repositories/AuditLogRepository.js'; import { FeatureFlagRepository } from '../../repositories/FeatureFlagRepository.js'; import { FederatedGraphRepository } from '../../repositories/FederatedGraphRepository.js'; import { DefaultNamespace, NamespaceRepository } from '../../repositories/NamespaceRepository.js'; -import { OrganizationRepository } from '../../repositories/OrganizationRepository.js'; import { SubgraphRepository } from '../../repositories/SubgraphRepository.js'; import type { RouterOptions } from '../../routes.js'; import { enrichLogger, getFederatedGraphRouterCompatibilityVersion, getLogger, handleError } from '../../util.js'; import { OrganizationWebhookService } from '../../webhooks/OrganizationWebhookService.js'; import { ProposalRepository } from '../../repositories/ProposalRepository.js'; import { UnauthorizedError } from '../../errors/errors.js'; +import { CompositionService } from '../../services/CompositionService.js'; export function deleteFederatedSubgraph( opts: RouterOptions, @@ -34,7 +34,6 @@ export function deleteFederatedSubgraph( const proposalRepo = new ProposalRepository(opts.db, authContext.organizationId); const namespaceRepo = new NamespaceRepository(opts.db, authContext.organizationId); const fedGraphRepo = new FederatedGraphRepository(logger, opts.db, authContext.organizationId); - const orgRepo = new OrganizationRepository(logger, opts.db, opts.billingDefaultPlanId); const orgWebhooks = new OrganizationWebhookService( opts.db, authContext.organizationId, @@ -125,11 +124,6 @@ export function deleteFederatedSubgraph( } } - const ignoreExternalKeysFeature = await orgRepo.getFeature({ - organizationId: authContext.organizationId, - featureId: COMPOSITION_IGNORE_EXTERNAL_KEYS_FEATURE_ID, - }); - const { affectedFederatedGraphs, compositionErrors, deploymentErrors, compositionWarnings } = await opts.db.transaction(async (tx) => { const fedGraphRepo = new FederatedGraphRepository(logger, tx, authContext.organizationId); @@ -137,11 +131,29 @@ export function deleteFederatedSubgraph( const featureFlagRepo = new FeatureFlagRepository(logger, tx, authContext.organizationId); const auditLogRepo = new AuditLogRepository(tx); + const affectedFeatureFlags: FeatureFlagDTO[] = []; + let labels = subgraph.labels; if (subgraph.isFeatureSubgraph) { const baseSubgraph = await featureFlagRepo.getBaseSubgraphByFeatureSubgraphId({ id: subgraph.id }); if (baseSubgraph) { labels = baseSubgraph.labels; + const enabledFeatureFlags = await featureFlagRepo.getFeatureFlagsByBaseSubgraphId({ + baseSubgraphId: baseSubgraph.id, + namespaceId: namespace.id, + excludeDisabled: true, + }); + + for (const enabledFeatureFlag of enabledFeatureFlags) { + const featureFlag = await featureFlagRepo.getFeatureFlagById({ + featureFlagId: enabledFeatureFlag.id, + namespaceId: namespace.id, + }); + + if (featureFlag) { + affectedFeatureFlags.push(featureFlag); + } + } } } else { await featureFlagRepo.deleteFeatureSubgraphsByBaseSubgraphId({ @@ -177,21 +189,32 @@ export function deleteFederatedSubgraph( // Recompose and deploy all affected federated graphs and their respective contracts. // Collects all composition and deployment errors if any. - const { compositionErrors, deploymentErrors, compositionWarnings } = await fedGraphRepo.composeAndDeployGraphs({ - actorId: authContext.userId, - admissionConfig: { - webhookJWTSecret: opts.admissionWebhookJWTSecret, - cdnBaseUrl: opts.cdnBaseUrl, - }, - blobStorage: opts.blobStorage, - chClient: opts.chClient!, - compositionOptions: { - disableResolvabilityValidation: req.disableResolvabilityValidation, - ignoreExternalKeys: ignoreExternalKeysFeature?.enabled ?? false, - }, - federatedGraphs: affectedFederatedGraphs, - webhookProxyUrl: opts.webhookProxyUrl, - }); + const compositionService = new CompositionService( + tx, + authContext.organizationId, + logger, + { cdnBaseUrl: opts.cdnBaseUrl, webhookJWTSecret: opts.admissionWebhookJWTSecret }, + opts.blobStorage, + opts.chClient, + opts.webhookProxyUrl, + req.disableResolvabilityValidation, + ); + + if (subgraph.isFeatureSubgraph) { + // To avoid having to re-fetch the feature flags for v2, we are just going to update the feature flag + // reference to remove the deleted feature subgraph, that way, we have an up-to-date view of the feature flag + for (const featureFlag of affectedFeatureFlags) { + featureFlag.featureSubgraphs = featureFlag.featureSubgraphs.filter((fs) => fs.id !== subgraph.id); + } + } + + const { deploymentErrors, compositionErrors, compositionWarnings } = + await compositionService.recomposeAndDeployAffected({ + actorId: authContext.userId, + affectedFederatedGraphs, + affectedFeatureFlags, + isFeatureSubgraph: subgraph.isFeatureSubgraph, + }); // Re-fetch the federated graphs to get the updated composedSchemaVersionId const refreshedGraphs = await Promise.all(affectedFederatedGraphs.map((g) => fedGraphRepo.byId(g.id))); @@ -289,36 +312,17 @@ export function deleteFederatedSubgraph( } } - if (compositionErrors.length > 0) { - return { - response: { - code: EnumStatusCode.ERR_SUBGRAPH_COMPOSITION_FAILED, - }, - deploymentErrors: [], - compositionErrors, - compositionWarnings, - proposalMatchMessage, - }; - } - - if (deploymentErrors.length > 0) { - return { - response: { - code: EnumStatusCode.ERR_DEPLOYMENT_FAILED, - }, - deploymentErrors, - compositionErrors: [], - compositionWarnings, - proposalMatchMessage, - }; - } - return { response: { - code: EnumStatusCode.OK, + code: + compositionErrors.length > 0 + ? EnumStatusCode.ERR_SUBGRAPH_COMPOSITION_FAILED + : deploymentErrors.length > 0 + ? EnumStatusCode.ERR_DEPLOYMENT_FAILED + : EnumStatusCode.OK, }, - deploymentErrors: [], - compositionErrors: [], + deploymentErrors, + compositionErrors, compositionWarnings, proposalMatchMessage, }; diff --git a/controlplane/src/core/bufservices/subgraph/moveSubgraph.ts b/controlplane/src/core/bufservices/subgraph/moveSubgraph.ts index bb44085e68..2405bc5148 100644 --- a/controlplane/src/core/bufservices/subgraph/moveSubgraph.ts +++ b/controlplane/src/core/bufservices/subgraph/moveSubgraph.ts @@ -3,16 +3,15 @@ import { HandlerContext } from '@connectrpc/connect'; import { EnumStatusCode } from '@wundergraph/cosmo-connect/dist/common/common_pb'; import { OrganizationEventName } from '@wundergraph/cosmo-connect/dist/notifications/events_pb'; import { MoveGraphRequest, MoveGraphResponse } from '@wundergraph/cosmo-connect/dist/platform/v1/platform_pb'; -import { COMPOSITION_IGNORE_EXTERNAL_KEYS_FEATURE_ID } from '../../../types/index.js'; import { PublicError } from '../../errors/errors.js'; import { AuditLogRepository } from '../../repositories/AuditLogRepository.js'; import { FeatureFlagRepository } from '../../repositories/FeatureFlagRepository.js'; import { NamespaceRepository } from '../../repositories/NamespaceRepository.js'; -import { OrganizationRepository } from '../../repositories/OrganizationRepository.js'; import { SubgraphRepository } from '../../repositories/SubgraphRepository.js'; import type { RouterOptions } from '../../routes.js'; import { enrichLogger, getLogger, handleError } from '../../util.js'; import { OrganizationWebhookService } from '../../webhooks/OrganizationWebhookService.js'; +import { CompositionService } from '../../services/CompositionService.js'; export function moveSubgraph( opts: RouterOptions, @@ -27,7 +26,6 @@ export function moveSubgraph( const subgraphRepo = new SubgraphRepository(logger, opts.db, authContext.organizationId); const featureFlagRepo = new FeatureFlagRepository(logger, opts.db, authContext.organizationId); - const orgRepo = new OrganizationRepository(logger, opts.db, opts.billingDefaultPlanId); const orgWebhooks = new OrganizationWebhookService( opts.db, authContext.organizationId, @@ -86,11 +84,6 @@ export function moveSubgraph( authContext, }); - const ignoreExternalKeysFeature = await orgRepo.getFeature({ - organizationId: authContext.organizationId, - featureId: COMPOSITION_IGNORE_EXTERNAL_KEYS_FEATURE_ID, - }); - const { compositionErrors, updatedFederatedGraphs, deploymentErrors, compositionWarnings } = await opts.db.transaction(async (tx) => { const auditLogRepo = new AuditLogRepository(tx); @@ -110,7 +103,18 @@ export function moveSubgraph( throw new PublicError(EnumStatusCode.ERR_NOT_FOUND, `Could not find namespace ${req.newNamespace}`); } - const { compositionErrors, updatedFederatedGraphs, deploymentErrors, compositionWarnings } = + const compositionService = new CompositionService( + tx, + authContext.organizationId, + logger, + { cdnBaseUrl: opts.cdnBaseUrl, webhookJWTSecret: opts.admissionWebhookJWTSecret }, + opts.blobStorage, + opts.chClient, + opts.webhookProxyUrl, + req.disableResolvabilityValidation, + ); + + const { deploymentErrors, compositionErrors, compositionWarnings, updatedFederatedGraphs } = await subgraphRepo.move( { currentNamespaceId: subgraph.namespaceId, @@ -120,17 +124,7 @@ export function moveSubgraph( targetId: subgraph.targetId, updatedBy: authContext.userId, }, - opts.blobStorage, - { - cdnBaseUrl: opts.cdnBaseUrl, - jwtSecret: opts.admissionWebhookJWTSecret, - }, - opts.chClient!, - { - disableResolvabilityValidation: req.disableResolvabilityValidation, - ignoreExternalKeys: ignoreExternalKeysFeature?.enabled ?? false, - }, - opts.webhookProxyUrl, + compositionService, ); await auditLogRepo.addAuditLog({ diff --git a/controlplane/src/core/bufservices/subgraph/publishFederatedSubgraph.ts b/controlplane/src/core/bufservices/subgraph/publishFederatedSubgraph.ts index 3b8b71fb81..59ca3c36e7 100644 --- a/controlplane/src/core/bufservices/subgraph/publishFederatedSubgraph.ts +++ b/controlplane/src/core/bufservices/subgraph/publishFederatedSubgraph.ts @@ -9,7 +9,6 @@ import { } from '@wundergraph/cosmo-connect/dist/platform/v1/platform_pb'; import { isValidUrl } from '@wundergraph/cosmo-shared'; import { maxRowLimitForChecks } from '../../constants.js'; -import { COMPOSITION_IGNORE_EXTERNAL_KEYS_FEATURE_ID } from '../../../types/index.js'; import { buildSchema } from '../../composition/composition.js'; import { UnauthorizedError } from '../../errors/errors.js'; import { AuditLogRepository } from '../../repositories/AuditLogRepository.js'; @@ -37,6 +36,7 @@ import { isValidPluginVersion, } from '../../util.js'; import { OrganizationWebhookService } from '../../webhooks/OrganizationWebhookService.js'; +import { CompositionService } from '../../services/CompositionService.js'; export function publishFederatedSubgraph( opts: RouterOptions, @@ -72,11 +72,6 @@ export function publishFederatedSubgraph( throw new UnauthorizedError(); } - const ignoreExternalKeysFeature = await orgRepo.getFeature({ - organizationId: authContext.organizationId, - featureId: COMPOSITION_IGNORE_EXTERNAL_KEYS_FEATURE_ID, - }); - const subgraphSchemaSDL = req.schema; const namespace = await namespaceRepo.byName(req.namespace); if (!namespace) { @@ -566,47 +561,51 @@ export function publishFederatedSubgraph( } } - const { compositionErrors, updatedFederatedGraphs, deploymentErrors, subgraphChanged, compositionWarnings } = - await subgraphRepo.update( - { - targetId: subgraph.targetId, - labels: subgraph.labels, - unsetLabels: false, - schemaSDL: subgraphSchemaSDL, - updatedBy: authContext.userId, - namespaceId: namespace.id, - isV2Graph, - proto: - subgraph.type === 'grpc_plugin' - ? { - schema: req.proto?.schema || '', - mappings: req.proto?.mappings || '', - lock: req.proto?.lock || '', - pluginData: { - platforms: req.proto?.platforms || [], - version: req.proto?.version || '', - }, - } - : subgraph.type === 'grpc_service' + const { deploymentErrors, compositionErrors, compositionWarnings, updatedFederatedGraphs, subgraphChanged } = + await opts.db.transaction((tx) => { + const subgraphRepo = new SubgraphRepository(logger, tx, authContext.organizationId); + const compositionService = new CompositionService( + tx, + authContext.organizationId, + logger, + { cdnBaseUrl: opts.cdnBaseUrl, webhookJWTSecret: opts.admissionWebhookJWTSecret }, + opts.blobStorage, + opts.chClient, + opts.webhookProxyUrl, + req.disableResolvabilityValidation, + ); + + return subgraphRepo.update( + { + targetId: subgraph.targetId, + labels: subgraph.labels, + unsetLabels: false, + schemaSDL: subgraphSchemaSDL, + updatedBy: authContext.userId, + namespaceId: namespace.id, + isV2Graph, + proto: + subgraph.type === 'grpc_plugin' ? { schema: req.proto?.schema || '', mappings: req.proto?.mappings || '', lock: req.proto?.lock || '', + pluginData: { + platforms: req.proto?.platforms || [], + version: req.proto?.version || '', + }, } - : undefined, - }, - opts.blobStorage, - { - cdnBaseUrl: opts.cdnBaseUrl, - webhookJWTSecret: opts.admissionWebhookJWTSecret, - }, - opts.chClient!, - { - disableResolvabilityValidation: req.disableResolvabilityValidation, - ignoreExternalKeys: ignoreExternalKeysFeature?.enabled ?? false, - }, - opts.webhookProxyUrl, - ); + : subgraph.type === 'grpc_service' + ? { + schema: req.proto?.schema || '', + mappings: req.proto?.mappings || '', + lock: req.proto?.lock || '', + } + : undefined, + }, + compositionService, + ); + }); // if this subgraph is part of a proposal, mark the proposal subgraph as published // and if all proposal subgraphs are published, collect proposal details for the webhook @@ -756,38 +755,17 @@ export function publishFederatedSubgraph( deploymentErrors: deploymentErrors.length, }; - if (compositionErrors.length > 0) { - return { - response: { - code: EnumStatusCode.ERR_SUBGRAPH_COMPOSITION_FAILED, - }, - compositionErrors: boundedCompositionErrors, - compositionWarnings: boundedCompositionWarnings, - deploymentErrors: [], - proposalMatchMessage, - counts, - }; - } - - if (deploymentErrors.length > 0) { - return { - response: { - code: EnumStatusCode.ERR_DEPLOYMENT_FAILED, - }, - compositionErrors: [], - deploymentErrors: boundedDeploymentErrors, - compositionWarnings: boundedCompositionWarnings, - proposalMatchMessage, - counts, - }; - } - return { response: { - code: EnumStatusCode.OK, + code: + compositionErrors.length > 0 + ? EnumStatusCode.ERR_SUBGRAPH_COMPOSITION_FAILED + : deploymentErrors.length > 0 + ? EnumStatusCode.ERR_DEPLOYMENT_FAILED + : EnumStatusCode.OK, }, - compositionErrors: [], - deploymentErrors: [], + deploymentErrors: boundedDeploymentErrors, + compositionErrors: boundedCompositionErrors, hasChanged: subgraphChanged, compositionWarnings: boundedCompositionWarnings, proposalMatchMessage, diff --git a/controlplane/src/core/bufservices/subgraph/updateSubgraph.ts b/controlplane/src/core/bufservices/subgraph/updateSubgraph.ts index 5849b4b211..f0124d8f4d 100644 --- a/controlplane/src/core/bufservices/subgraph/updateSubgraph.ts +++ b/controlplane/src/core/bufservices/subgraph/updateSubgraph.ts @@ -8,10 +8,8 @@ import { UpdateSubgraphResponse, } from '@wundergraph/cosmo-connect/dist/platform/v1/platform_pb'; import { isValidUrl } from '@wundergraph/cosmo-shared'; -import { COMPOSITION_IGNORE_EXTERNAL_KEYS_FEATURE_ID } from '../../../types/index.js'; import { AuditLogRepository } from '../../repositories/AuditLogRepository.js'; import { DefaultNamespace } from '../../repositories/NamespaceRepository.js'; -import { OrganizationRepository } from '../../repositories/OrganizationRepository.js'; import { SubgraphRepository } from '../../repositories/SubgraphRepository.js'; import type { RouterOptions } from '../../routes.js'; import { @@ -26,6 +24,7 @@ import { } from '../../util.js'; import { OrganizationWebhookService } from '../../webhooks/OrganizationWebhookService.js'; import { UnauthorizedError } from '../../errors/errors.js'; +import { CompositionService } from '../../services/CompositionService.js'; export function updateSubgraph( opts: RouterOptions, @@ -39,7 +38,6 @@ export function updateSubgraph( logger = enrichLogger(ctx, logger, authContext); const subgraphRepo = new SubgraphRepository(logger, opts.db, authContext.organizationId); - const orgRepo = new OrganizationRepository(logger, opts.db, opts.billingDefaultPlanId); const auditLogRepo = new AuditLogRepository(opts.db); const orgWebhooks = new OrganizationWebhookService( opts.db, @@ -189,39 +187,38 @@ export function updateSubgraph( throw new UnauthorizedError(); } - const ignoreExternalKeysFeature = await orgRepo.getFeature({ - organizationId: authContext.organizationId, - featureId: COMPOSITION_IGNORE_EXTERNAL_KEYS_FEATURE_ID, - }); + const { deploymentErrors, compositionErrors, compositionWarnings, updatedFederatedGraphs } = + await opts.db.transaction((tx) => { + const subgraphRepo = new SubgraphRepository(logger, tx, authContext.organizationId); + const compositionService = new CompositionService( + tx, + authContext.organizationId, + logger, + { cdnBaseUrl: opts.cdnBaseUrl, webhookJWTSecret: opts.admissionWebhookJWTSecret }, + opts.blobStorage, + opts.chClient, + opts.webhookProxyUrl, + req.disableResolvabilityValidation, + ); - const { compositionErrors, updatedFederatedGraphs, deploymentErrors, compositionWarnings } = - await subgraphRepo.update( - { - targetId: subgraph.targetId, - labels: req.labels, - unsetLabels: req.unsetLabels ?? false, - subscriptionUrl: req.subscriptionUrl, - routingUrl: req.routingUrl, - subscriptionProtocol: - req.subscriptionProtocol === undefined ? undefined : formatSubscriptionProtocol(req.subscriptionProtocol), - websocketSubprotocol: - req.websocketSubprotocol === undefined ? undefined : formatWebsocketSubprotocol(req.websocketSubprotocol), - updatedBy: authContext.userId, - readme: req.readme, - namespaceId: subgraph.namespaceId, - }, - opts.blobStorage, - { - cdnBaseUrl: opts.cdnBaseUrl, - webhookJWTSecret: opts.admissionWebhookJWTSecret, - }, - opts.chClient!, - { - disableResolvabilityValidation: req.disableResolvabilityValidation, - ignoreExternalKeys: ignoreExternalKeysFeature?.enabled ?? false, - }, - opts.webhookProxyUrl, - ); + return subgraphRepo.update( + { + targetId: subgraph.targetId, + labels: req.labels, + unsetLabels: req.unsetLabels ?? false, + subscriptionUrl: req.subscriptionUrl, + routingUrl: req.routingUrl, + subscriptionProtocol: + req.subscriptionProtocol === undefined ? undefined : formatSubscriptionProtocol(req.subscriptionProtocol), + websocketSubprotocol: + req.websocketSubprotocol === undefined ? undefined : formatWebsocketSubprotocol(req.websocketSubprotocol), + updatedBy: authContext.userId, + readme: req.readme, + namespaceId: subgraph.namespaceId, + }, + compositionService, + ); + }); await auditLogRepo.addAuditLog({ organizationId: authContext.organizationId, diff --git a/controlplane/src/core/composition/composer.ts b/controlplane/src/core/composition/composer.ts index 50056960f2..24f5d5c8f8 100644 --- a/controlplane/src/core/composition/composer.ts +++ b/controlplane/src/core/composition/composer.ts @@ -51,6 +51,7 @@ export function getRouterCompatibilityVersionPath(routerCompatibilityVersion: st } } } + export type CompositionResult = { compositions: DeserializedComposedGraph[]; }; @@ -137,6 +138,7 @@ export type CheckSubgraph = { // will be used only for new subgraphs labels?: Label[]; }; + @traced export class Composer { constructor( @@ -195,6 +197,7 @@ export class Composer { admissionWebhookSecret, actorId, routerCompatibilityVersion, + pathOverride, }: { routerConfig: RouterConfig; blobStorage: BlobStorage; @@ -209,28 +212,38 @@ export class Composer { admissionWebhookSecret?: string; actorId: string; routerCompatibilityVersion: string; + pathOverride?: { ready: string; draft: string }; }): Promise<{ errors: ComposeDeploymentError[]; }> { const routerConfigJsonStringBytes = Buffer.from(routerConfig.toJsonString(), 'utf8'); const errors: ComposeDeploymentError[] = []; - let versionPath = ''; - if (routerCompatibilityVersion !== ROUTER_COMPATIBILITY_VERSION_ONE) { - if (ROUTER_COMPATIBILITY_VERSIONS.has(routerCompatibilityVersion as SupportedRouterCompatibilityVersion)) { - versionPath = `${routerCompatibilityVersion}/`; - } else { - errors.push( - new RouterConfigUploadError(`Invalid router compatibility version "${routerCompatibilityVersion}".`), - ); - return { - errors, - }; + let s3PathDraft: string; + let s3PathReady: string; + + if (pathOverride?.ready && pathOverride?.draft) { + s3PathDraft = pathOverride.draft; + s3PathReady = pathOverride.ready; + } else { + let versionPath = ''; + if (routerCompatibilityVersion !== ROUTER_COMPATIBILITY_VERSION_ONE) { + if (ROUTER_COMPATIBILITY_VERSIONS.has(routerCompatibilityVersion as SupportedRouterCompatibilityVersion)) { + versionPath = `${routerCompatibilityVersion}/`; + } else { + errors.push( + new RouterConfigUploadError(`Invalid router compatibility version "${routerCompatibilityVersion}".`), + ); + return { + errors, + }; + } } + + // CDN path and bucket path are the same in this case + s3PathDraft = `${organizationId}/${federatedGraphId}/routerconfigs/draft.json`; + s3PathReady = `${organizationId}/${federatedGraphId}/routerconfigs/${versionPath}latest.json`; } - // CDN path and bucket path are the same in this case - const s3PathDraft = `${organizationId}/${federatedGraphId}/routerconfigs/draft.json`; - const s3PathReady = `${organizationId}/${federatedGraphId}/routerconfigs/${versionPath}latest.json`; // The signature will be added by the admission webhook let signatureSha256: undefined | string; @@ -357,6 +370,7 @@ export class Composer { federatedGraphAdmissionWebhookURL, federatedGraphAdmissionWebhookSecret, actorId, + pathOverride, }: { admissionConfig: { jwtSecret: string; @@ -371,6 +385,7 @@ export class Composer { federatedGraphAdmissionWebhookURL?: string; federatedGraphAdmissionWebhookSecret?: string; actorId: string; + pathOverride?: { ready: string; draft: string }; }) { const baseRouterConfig = this.composeRouterConfigWithFeatureFlags({ featureFlagRouterExecutionConfigByFeatureFlagName, @@ -409,6 +424,7 @@ export class Composer { }, actorId, routerCompatibilityVersion: federatedGraph.routerCompatibilityVersion, + pathOverride, }); return { diff --git a/controlplane/src/core/repositories/FeatureFlagRepository.ts b/controlplane/src/core/repositories/FeatureFlagRepository.ts index 921a027388..e7033f541b 100644 --- a/controlplane/src/core/repositories/FeatureFlagRepository.ts +++ b/controlplane/src/core/repositories/FeatureFlagRepository.ts @@ -734,16 +734,16 @@ export class FeatureFlagRepository { includeContracts?: boolean; }): Promise { const federatedGraphs: FederatedGraphDTO[] = []; - const featureSubraphsOfFeatureFlag = await this.getFeatureSubgraphsByFeatureFlagId({ + const featureSubgraphsOfFeatureFlag = await this.getFeatureSubgraphsByFeatureFlagId({ featureFlagId, namespaceId, }); - if (featureSubraphsOfFeatureFlag.length === 0) { + if (featureSubgraphsOfFeatureFlag.length === 0) { return []; } - const baseSubgraphIds = featureSubraphsOfFeatureFlag.map((f) => f.baseSubgraphId); + const baseSubgraphIds = featureSubgraphsOfFeatureFlag.map((f) => f.baseSubgraphId); - // fetches the federated graphs which contains all the base subgraphs of the feature subgraphs + // fetches the federated graphs which contain all the base subgraphs of the feature subgraphs const federatedGraphIds = await this.db .select({ federatedGraphId: subgraphsToFederatedGraph.federatedGraphId, @@ -1042,6 +1042,7 @@ export class FeatureFlagRepository { } const baseSubgraphNamesOfFeatureFlags = featureSubgraphsByFlag.map((ff) => ff.baseSubgraphName); + // check if all base subgraphs of feature flags are one of the base subgraphs of this composition const isSubset = baseSubgraphNamesOfFeatureFlags.every((name) => baseSubgraphNames.includes(name)); if (!isSubset) { @@ -1124,6 +1125,7 @@ export class FeatureFlagRepository { baseSubgraphNames: baseCompositionSubgraphs.map((baseSubgraph) => baseSubgraph.name), excludeDisabled: true, }); + for (const flag of enabledFeatureFlags) { if (featureFlagToComposeByFlagId.has(flag.id)) { continue; diff --git a/controlplane/src/core/repositories/FederatedGraphRepository.ts b/controlplane/src/core/repositories/FederatedGraphRepository.ts index d04d57ae25..9e9d93efe5 100644 --- a/controlplane/src/core/repositories/FederatedGraphRepository.ts +++ b/controlplane/src/core/repositories/FederatedGraphRepository.ts @@ -53,6 +53,7 @@ import { GraphApiKeyDTO, Label, RouterRequestKeysDTO, + ComposeAndDeployResult, } from '../../types/index.js'; import { BlobStorage } from '../blobstorage/index.js'; import { @@ -75,6 +76,7 @@ import { unsuccessfulBaseCompositionError } from '../errors/errors.js'; import { ClickHouseClient } from '../clickhouse/index.js'; import { RBACEvaluator } from '../services/RBACEvaluator.js'; import { traced } from '../tracing.js'; +import type { CompositionService } from '../services/CompositionService.js'; import { ContractRepository } from './ContractRepository.js'; import { FeatureFlagRepository, SubgraphsToCompose } from './FeatureFlagRepository.js'; import { GraphCompositionRepository } from './GraphCompositionRepository.js'; @@ -187,160 +189,132 @@ export class FederatedGraphRepository { }); } - public update(data: { - admissionConfig: { - jwtSecret: string; - cdnBaseUrl: string; - }; - blobStorage: BlobStorage; + public async update({ + compositionService, + ...data + }: { + compositionService: CompositionService; labelMatchers: string[]; namespaceId: string; routingUrl: string; targetId: string; updatedBy: string; - chClient: ClickHouseClient; admissionWebhookSecret?: string; admissionWebhookURL?: string; - compositionOptions?: CompositionOptions; readme?: string; unsetAdmissionWebhookURL?: boolean; unsetLabelMatchers?: boolean; - webhookProxyUrl?: string; - }): Promise< - | { - compositionErrors: PlainMessage[]; - deploymentErrors: PlainMessage[]; - compositionWarnings: PlainMessage[]; - } - | undefined - > { + }): Promise { const routingUrl = normalizeURL(data.routingUrl); - return this.db.transaction(async (tx) => { - const fedGraphRepo = new FederatedGraphRepository(this.logger, tx, this.organizationId); - const subgraphRepo = new SubgraphRepository(this.logger, tx, this.organizationId); - const targetRepo = new TargetRepository(tx, this.organizationId); - const contractRepo = new ContractRepository(this.logger, tx, this.organizationId); - - const federatedGraph = await fedGraphRepo.byTargetId(data.targetId); - if (!federatedGraph) { - throw new Error(`Federated graph not found`); - } - - // Update routing URL when changed. (Is required) - if (routingUrl && federatedGraph.routingUrl !== routingUrl) { - await tx.update(federatedGraphs).set({ routingUrl }).where(eq(federatedGraphs.id, federatedGraph.id)).execute(); - } - - // Update admission webhook URL when changed. (Is optional) - if (data.admissionWebhookURL !== undefined && federatedGraph.admissionWebhookURL !== data.admissionWebhookURL) { - const admissionWebhookURL = data.admissionWebhookURL ? normalizeURL(data.admissionWebhookURL) : ''; - - await tx - .update(federatedGraphs) - .set({ admissionWebhookURL: admissionWebhookURL || null }) - .where(eq(federatedGraphs.id, federatedGraph.id)) - .execute(); - } - - if (data.admissionWebhookSecret !== undefined) { - await tx - .update(federatedGraphs) - .set({ admissionWebhookSecret: data.admissionWebhookSecret || null }) - .where(eq(federatedGraphs.id, federatedGraph.id)) - .execute(); - } - - // Update the readme of the fed graph. (Is optional) - if (data.readme !== undefined) { - await targetRepo.updateReadmeOfTarget({ id: data.targetId, readme: data.readme }); - } + const fedGraphRepo = new FederatedGraphRepository(this.logger, this.db, this.organizationId); + const subgraphRepo = new SubgraphRepository(this.logger, this.db, this.organizationId); + const targetRepo = new TargetRepository(this.db, this.organizationId); + const contractRepo = new ContractRepository(this.logger, this.db, this.organizationId); + + const federatedGraph = await fedGraphRepo.byTargetId(data.targetId); + if (!federatedGraph) { + throw new Error(`Federated graph not found`); + } - const haveLabelMatchersChanged = checkIfLabelMatchersChanged({ - isContract: !!federatedGraph.contract, - currentLabelMatchers: federatedGraph.labelMatchers, - newLabelMatchers: data.labelMatchers, - unsetLabelMatchers: data.unsetLabelMatchers, - }); + // Update routing URL when changed. (Is required) + if (routingUrl && federatedGraph.routingUrl !== routingUrl) { + await this.db + .update(federatedGraphs) + .set({ routingUrl }) + .where(eq(federatedGraphs.id, federatedGraph.id)) + .execute(); + } - // Update label matchers (Is optional) - if (haveLabelMatchersChanged) { - const labelMatchers = data.unsetLabelMatchers ? [] : normalizeLabelMatchers(data.labelMatchers); + // Update admission webhook URL when changed. (Is optional) + if (data.admissionWebhookURL !== undefined && federatedGraph.admissionWebhookURL !== data.admissionWebhookURL) { + const admissionWebhookURL = data.admissionWebhookURL ? normalizeURL(data.admissionWebhookURL) : ''; - const contracts = await contractRepo.bySourceFederatedGraphId(federatedGraph.id); + await this.db + .update(federatedGraphs) + .set({ admissionWebhookURL: admissionWebhookURL || null }) + .where(eq(federatedGraphs.id, federatedGraph.id)) + .execute(); + } - const subgraphs = await subgraphRepo.byGraphLabelMatchers({ - labelMatchers, - namespaceId: data.namespaceId, - }); + if (data.admissionWebhookSecret !== undefined) { + await this.db + .update(federatedGraphs) + .set({ admissionWebhookSecret: data.admissionWebhookSecret || null }) + .where(eq(federatedGraphs.id, federatedGraph.id)) + .execute(); + } - const graphAndContracts = [federatedGraph, ...contracts.map((c) => c.downstreamFederatedGraph)]; + // Update the readme of the fed graph. (Is optional) + if (data.readme !== undefined) { + await targetRepo.updateReadmeOfTarget({ id: data.targetId, readme: data.readme }); + } - for (const graph of graphAndContracts) { - await tx.delete(schema.targetLabelMatchers).where(eq(schema.targetLabelMatchers.targetId, graph.targetId)); + const haveLabelMatchersChanged = checkIfLabelMatchersChanged({ + isContract: !!federatedGraph.contract, + currentLabelMatchers: federatedGraph.labelMatchers, + newLabelMatchers: data.labelMatchers, + unsetLabelMatchers: data.unsetLabelMatchers, + }); - if (labelMatchers.length > 0) { - await tx - .insert(schema.targetLabelMatchers) - .values( - labelMatchers.map((labelMatcher) => ({ - targetId: graph.targetId, - labelMatcher: labelMatcher.split(','), - })), - ) - .execute(); - } + // Update label matchers (Is optional) + if (!haveLabelMatchersChanged) { + return undefined; + } - let deleteCondition: SQL | undefined = eq( - schema.subgraphsToFederatedGraph.federatedGraphId, - graph.id, - ); + const labelMatchers = data.unsetLabelMatchers ? [] : normalizeLabelMatchers(data.labelMatchers); + const contracts = await contractRepo.bySourceFederatedGraphId(federatedGraph.id); + const subgraphs = await subgraphRepo.byGraphLabelMatchers({ + labelMatchers, + namespaceId: data.namespaceId, + }); - // we do this conditionally because notInArray cannot take empty value - if (subgraphs.length > 0) { - deleteCondition = and( - deleteCondition, - notInArray( - schema.subgraphsToFederatedGraph.subgraphId, - subgraphs.map((subgraph) => subgraph.id), - ), - ); - } + const graphAndContracts = [federatedGraph, ...contracts.map((c) => c.downstreamFederatedGraph)]; + for (const graph of graphAndContracts) { + await this.db.delete(schema.targetLabelMatchers).where(eq(schema.targetLabelMatchers.targetId, graph.targetId)); - await tx.delete(schema.subgraphsToFederatedGraph).where(deleteCondition); + if (labelMatchers.length > 0) { + await this.db + .insert(schema.targetLabelMatchers) + .values( + labelMatchers.map((labelMatcher) => ({ + targetId: graph.targetId, + labelMatcher: labelMatcher.split(','), + })), + ) + .execute(); + } - if (subgraphs.length > 0) { - await tx - .insert(schema.subgraphsToFederatedGraph) - .values( - subgraphs.map((sg) => ({ - subgraphId: sg.id, - federatedGraphId: graph.id, - })), - ) - .onConflictDoNothing() - .execute(); - } - } + let deleteCondition: SQL | undefined = eq(schema.subgraphsToFederatedGraph.federatedGraphId, graph.id); - const { compositionErrors, deploymentErrors, compositionWarnings } = await fedGraphRepo.composeAndDeployGraphs({ - federatedGraphs: [federatedGraph], - blobStorage: data.blobStorage, - admissionConfig: { - webhookJWTSecret: data.admissionConfig.jwtSecret, - cdnBaseUrl: data.admissionConfig.cdnBaseUrl, - }, - actorId: data.updatedBy, - chClient: data.chClient, - compositionOptions: data.compositionOptions, - webhookProxyUrl: data.webhookProxyUrl, - }); + // we do this conditionally because notInArray cannot take empty value + if (subgraphs.length > 0) { + deleteCondition = and( + deleteCondition, + notInArray( + schema.subgraphsToFederatedGraph.subgraphId, + subgraphs.map((subgraph) => subgraph.id), + ), + ); + } - return { - compositionErrors, - deploymentErrors, - compositionWarnings, - }; + await this.db.delete(schema.subgraphsToFederatedGraph).where(deleteCondition); + if (subgraphs.length > 0) { + await this.db + .insert(schema.subgraphsToFederatedGraph) + .values( + subgraphs.map((sg) => ({ + subgraphId: sg.id, + federatedGraphId: graph.id, + })), + ) + .onConflictDoNothing() + .execute(); } + } + + return await compositionService.composeAndDeployFederatedGraph({ + actorId: data.updatedBy, + federatedGraph, }); } @@ -351,7 +325,7 @@ export class FederatedGraphRepository { .where(and(eq(targets.id, targetId), eq(schema.targets.organizationId, this.organizationId))); } - public move( + public async move( data: { targetId: string; newNamespaceId: string; @@ -359,102 +333,61 @@ export class FederatedGraphRepository { federatedGraph: FederatedGraphDTO; skipDeployment?: boolean; }, - blobStorage: BlobStorage, - admissionConfig: { - jwtSecret: string; - cdnBaseUrl: string; - }, - chClient: ClickHouseClient, - compositionOptions?: CompositionOptions, - webhookProxyUrl?: string, - ): Promise<{ - compositionErrors: PlainMessage[]; - deploymentErrors: PlainMessage[]; - compositionWarnings: PlainMessage[]; - }> { - return this.db.transaction(async (tx) => { - const fedGraphRepo = new FederatedGraphRepository(this.logger, tx, this.organizationId); - const subgraphRepo = new SubgraphRepository(this.logger, tx, this.organizationId); - - await tx.update(targets).set({ namespaceId: data.newNamespaceId }).where(eq(targets.id, data.targetId)); - - // Delete all mappings because we will deal with new subgraphs in new namespace - await tx - .delete(schema.subgraphsToFederatedGraph) - .where(eq(schema.subgraphsToFederatedGraph.federatedGraphId, data.federatedGraph.id)); + compositionService: CompositionService, + ): Promise { + const fedGraphRepo = new FederatedGraphRepository(this.logger, this.db, this.organizationId); + const subgraphRepo = new SubgraphRepository(this.logger, this.db, this.organizationId); - const newNamespaceSubgraphs = await subgraphRepo.byGraphLabelMatchers({ - labelMatchers: data.federatedGraph.labelMatchers, - namespaceId: data.newNamespaceId, - }); + await this.db.update(targets).set({ namespaceId: data.newNamespaceId }).where(eq(targets.id, data.targetId)); - // insert new mappings - if (newNamespaceSubgraphs.length > 0) { - await tx - .insert(schema.subgraphsToFederatedGraph) - .values( - newNamespaceSubgraphs.map((sg) => ({ - subgraphId: sg.id, - federatedGraphId: data.federatedGraph.id, - })), - ) - .onConflictDoNothing() - .execute(); - } + // Delete all mappings because we will deal with new subgraphs in new namespace + await this.db + .delete(schema.subgraphsToFederatedGraph) + .where(eq(schema.subgraphsToFederatedGraph.federatedGraphId, data.federatedGraph.id)); - if (data.skipDeployment) { - return { - compositionErrors: [], - deploymentErrors: [], - compositionWarnings: [], - }; - } + const newNamespaceSubgraphs = await subgraphRepo.byGraphLabelMatchers({ + labelMatchers: data.federatedGraph.labelMatchers, + namespaceId: data.newNamespaceId, + }); - // Handle Contract Deployment - if (data.federatedGraph.contract) { - const movedContractGraph = await fedGraphRepo.byId(data.federatedGraph.id); - if (!movedContractGraph) { - throw new Error('Could not find contract after moving'); - } + // insert new mappings + if (newNamespaceSubgraphs.length > 0) { + await this.db + .insert(schema.subgraphsToFederatedGraph) + .values( + newNamespaceSubgraphs.map((sg) => ({ + subgraphId: sg.id, + federatedGraphId: data.federatedGraph.id, + })), + ) + .onConflictDoNothing() + .execute(); + } - const composition = await this.composeAndDeployGraphs({ - actorId: data.updatedBy, - admissionConfig: { - cdnBaseUrl: admissionConfig.cdnBaseUrl, - webhookJWTSecret: admissionConfig.jwtSecret, - }, - blobStorage, - chClient, - compositionOptions, - federatedGraphs: [movedContractGraph], - webhookProxyUrl, - }); + if (data.skipDeployment) { + return { + compositionErrors: [], + deploymentErrors: [], + compositionWarnings: [], + }; + } - return { - compositionErrors: composition.compositionErrors, - deploymentErrors: composition.deploymentErrors, - compositionWarnings: composition.compositionWarnings, - }; + // Handle Contract Deployment + if (data.federatedGraph.contract) { + const movedContractGraph = await fedGraphRepo.byId(data.federatedGraph.id); + if (!movedContractGraph) { + throw new Error('Could not find contract after moving'); } - const composition = await fedGraphRepo.composeAndDeployGraphs({ - federatedGraphs: [data.federatedGraph], + return await compositionService.composeAndDeployFederatedGraph({ actorId: data.updatedBy, - blobStorage, - admissionConfig: { - cdnBaseUrl: admissionConfig.cdnBaseUrl, - webhookJWTSecret: admissionConfig.jwtSecret, - }, - chClient, - compositionOptions, - webhookProxyUrl, + federatedGraph: movedContractGraph, }); + } - return { - compositionErrors: composition.compositionErrors, - deploymentErrors: composition.deploymentErrors, - compositionWarnings: composition.compositionWarnings, - }; + return await compositionService.composeAndDeployFederatedGraph({ + actorId: data.updatedBy, + federatedGraph: data.federatedGraph, }); } diff --git a/controlplane/src/core/repositories/SubgraphRepository.ts b/controlplane/src/core/repositories/SubgraphRepository.ts index 18c073319c..031a5162da 100644 --- a/controlplane/src/core/repositories/SubgraphRepository.ts +++ b/controlplane/src/core/repositories/SubgraphRepository.ts @@ -33,6 +33,7 @@ import { users, } from '../../db/schema.js'; import { + FeatureFlagDTO, FederatedGraphDTO, GetChecksResponse, Label, @@ -47,6 +48,7 @@ import { SubgraphDTO, SubgraphListFilterOptions, SubgraphMemberDTO, + ComposeAndDeployResult, } from '../../types/index.js'; import { BlobStorage } from '../blobstorage/index.js'; import { ClickHouseClient } from '../clickhouse/index.js'; @@ -67,6 +69,7 @@ import { } from '../util.js'; import { OrganizationWebhookService } from '../webhooks/OrganizationWebhookService.js'; import { traced } from '../tracing.js'; +import type { CompositionService } from '../services/CompositionService.js'; import { ContractRepository } from './ContractRepository.js'; import { FeatureFlagRepository } from './FeatureFlagRepository.js'; import { FederatedGraphRepository } from './FederatedGraphRepository.js'; @@ -243,26 +246,20 @@ export class SubgraphRepository { readme?: string; proto?: ProtoSubgraph; }, - blobStorage: BlobStorage, - admissionConfig: { - webhookJWTSecret: string; - cdnBaseUrl: string; - }, - chClient: ClickHouseClient, - compositionOptions?: CompositionOptions, - webhookProxyUrl?: string, - ): Promise<{ - compositionErrors: PlainMessage[]; - compositionWarnings: PlainMessage[]; - deploymentErrors: PlainMessage[]; - updatedFederatedGraphs: FederatedGraphDTO[]; - subgraphChanged: boolean; - }> { + compositionService: CompositionService, + ): Promise< + ComposeAndDeployResult & { + updatedFederatedGraphs: FederatedGraphDTO[]; + subgraphChanged: boolean; + } + > { const deploymentErrors: PlainMessage[] = []; const compositionErrors: PlainMessage[] = []; const compositionWarnings: PlainMessage[] = []; + // The collection of federated graphs that will be potentially re-composed const updatedFederatedGraphs: FederatedGraphDTO[] = []; + const updatedFeatureFlagIds = new Set(); let subgraphChanged = false; let labelChanged = false; @@ -274,7 +271,13 @@ export class SubgraphRepository { const subgraph = await subgraphRepo.byTargetId(data.targetId); if (!subgraph) { - return { compositionErrors, updatedFederatedGraphs, compositionWarnings }; + return { + deploymentErrors: [], + compositionErrors: [], + compositionWarnings: [], + updatedFederatedGraphs, + subgraphChanged: false, + }; } // TODO: avoid downloading the schema use hash instead @@ -286,6 +289,7 @@ export class SubgraphRepository { isV2Graph: data.isV2Graph, proto: data.proto, }); + if (!updatedSubgraph) { throw new Error(`The subgraph "${subgraph.name}" was not found.`); } @@ -294,13 +298,7 @@ export class SubgraphRepository { if (data.routingUrl !== undefined && data.routingUrl !== subgraph.routingUrl) { subgraphChanged = true; const url = normalizeURL(data.routingUrl); - await tx - .update(subgraphs) - .set({ - routingUrl: url, - }) - .where(eq(subgraphs.id, subgraph.id)) - .execute(); + await tx.update(subgraphs).set({ routingUrl: url }).where(eq(subgraphs.id, subgraph.id)).execute(); } if (data.subscriptionUrl !== undefined && data.subscriptionUrl !== subgraph.subscriptionUrl) { @@ -308,9 +306,7 @@ export class SubgraphRepository { const url = normalizeURL(data.subscriptionUrl); await tx .update(subgraphs) - .set({ - subscriptionUrl: url || null, - }) + .set({ subscriptionUrl: url || null }) .where(eq(subgraphs.id, subgraph.id)) .execute(); } @@ -363,8 +359,7 @@ export class SubgraphRepository { // add them to the updatedFederatedGraphs array without duplicates for (const federatedGraph of newFederatedGraphs) { - const exists = updatedFederatedGraphs.find((g) => g.name === federatedGraph.name); - if (!exists) { + if (!updatedFederatedGraphs.some((g) => g.id === federatedGraph.id)) { updatedFederatedGraphs.push(federatedGraph); } } @@ -419,12 +414,14 @@ export class SubgraphRepository { labels: baseSubgraph[0].labels?.map?.((l) => splitLabel(l)) ?? [], namespaceId: data.namespaceId, }); + for (const federatedGraphDTO of federatedGraphDTOs) { // Retrieve all the subgraphs that compose the federated graph to retrieve the feature flags const subgraphs = await subgraphRepo.listByFederatedGraph({ federatedGraphTargetId: federatedGraphDTO.targetId, published: true, }); + const enabledFeatureFlags = await featureFlagRepo.getFeatureFlagsByBaseSubgraphIdAndLabelMatchers({ baseSubgraphId: baseSubgraph[0].id, namespaceId: data.namespaceId, @@ -432,27 +429,30 @@ export class SubgraphRepository { baseSubgraphNames: subgraphs.map((subgraph) => subgraph.name), excludeDisabled: true, }); + // If an enabled feature flag includes the feature graph that has just been published, push it to the array if (enabledFeatureFlags.length > 0) { - const exists = updatedFederatedGraphs.find((g) => g.name === federatedGraphDTO.name); - if (!exists) { + if (!updatedFederatedGraphs.some((g) => g.id === federatedGraphDTO.id)) { updatedFederatedGraphs.push(federatedGraphDTO); } + + for (const featureFlag of enabledFeatureFlags) { + updatedFeatureFlagIds.add(featureFlag.id); + } } } } // Generate a new router config for non-feature graphs upon routing/subscription urls and labels changes } else if (subgraphChanged || labelChanged) { // find all federated graphs that use this subgraph (with old labels). We need evaluate them again. - // When labels change, graphs which matched with old labels may no longer match with new ones + // When labels change, graphs which matched with old labels may no longer match with new ones const affectedGraphs = await fedGraphRepo.bySubgraphLabels({ labels: subgraph.labels, namespaceId: data.namespaceId, }); for (const graph of affectedGraphs) { - const exists = updatedFederatedGraphs.find((g) => g.name === graph.name); - if (!exists) { + if (!updatedFederatedGraphs.some((g) => g.id === graph.id)) { updatedFederatedGraphs.push(graph); } } @@ -463,27 +463,37 @@ export class SubgraphRepository { await targetRepo.updateReadmeOfTarget({ id: data.targetId, readme: data.readme }); } - if (updatedFederatedGraphs.length === 0) { + if (updatedFederatedGraphs.length === 0 && updatedFeatureFlagIds.size === 0) { return; } - const { - compositionErrors: cErrors, - deploymentErrors: dErrors, - compositionWarnings: cWarnings, - } = await fedGraphRepo.composeAndDeployGraphs({ - blobStorage, - admissionConfig, + const updatedFeatureFlags: FeatureFlagDTO[] = []; + if (updatedFeatureFlagIds.size > 0) { + const featureFlagRepo = new FeatureFlagRepository(this.logger, tx, this.organizationId); + for (const featureFlagId of updatedFeatureFlagIds) { + const featureFlag = await featureFlagRepo.getFeatureFlagById({ + namespaceId: data.namespaceId, + featureFlagId, + }); + + if (!featureFlag) { + throw new Error(`Feature flag with ID ${featureFlagId} not found in namespace ${data.namespaceId}`); + } + + updatedFeatureFlags.push(featureFlag); + } + } + + const result = await compositionService.recomposeAndDeployAffected({ actorId: data.updatedBy, - chClient, - compositionOptions, - federatedGraphs: updatedFederatedGraphs.filter((g) => !g.contract), - webhookProxyUrl, + affectedFederatedGraphs: updatedFederatedGraphs.filter((graph) => !graph.contract), + affectedFeatureFlags: updatedFeatureFlags, + isFeatureSubgraph: subgraph.isFeatureSubgraph, }); - compositionErrors.push(...cErrors); - deploymentErrors.push(...dErrors); - compositionWarnings.push(...cWarnings); + deploymentErrors.push(...result.deploymentErrors); + compositionErrors.push(...result.compositionErrors); + compositionWarnings.push(...result.compositionWarnings); // Re-fetch the federated graphs to get the updated composedSchemaVersionId const refreshedGraphs = await Promise.all(updatedFederatedGraphs.map((g) => fedGraphRepo.byId(g.id))); @@ -504,7 +514,7 @@ export class SubgraphRepository { }; } - public move( + public async move( data: { targetId: string; subgraphId: string; @@ -513,80 +523,61 @@ export class SubgraphRepository { currentNamespaceId: string; newNamespaceId: string; }, - blobStorage: BlobStorage, - admissionConfig: { - jwtSecret: string; - cdnBaseUrl: string; - }, - chClient: ClickHouseClient, - compositionOptions?: CompositionOptions, - webhookProxyUrl?: string, - ): Promise<{ - compositionErrors: PlainMessage[]; - updatedFederatedGraphs: FederatedGraphDTO[]; - deploymentErrors: PlainMessage[]; - compositionWarnings: PlainMessage[]; - }> { - return this.db.transaction(async (tx) => { - const updatedFederatedGraphs: FederatedGraphDTO[] = []; - - const fedGraphRepo = new FederatedGraphRepository(this.logger, tx, this.organizationId); + compositionService: CompositionService, + ): Promise { + const updatedFederatedGraphs: FederatedGraphDTO[] = []; - updatedFederatedGraphs.push( - ...(await fedGraphRepo.bySubgraphLabels({ labels: data.subgraphLabels, namespaceId: data.currentNamespaceId })), - ); + const fedGraphRepo = new FederatedGraphRepository(this.logger, this.db, this.organizationId); + updatedFederatedGraphs.push( + ...(await fedGraphRepo.bySubgraphLabels({ labels: data.subgraphLabels, namespaceId: data.currentNamespaceId })), + ); - await tx.update(targets).set({ namespaceId: data.newNamespaceId }).where(eq(targets.id, data.targetId)); + await this.db.update(targets).set({ namespaceId: data.newNamespaceId }).where(eq(targets.id, data.targetId)); - // Delete all mappings with this subgraph. We will create new mappings with federated graphs in new namespace - await tx - .delete(schema.subgraphsToFederatedGraph) - .where(eq(schema.subgraphsToFederatedGraph.subgraphId, data.subgraphId)); + // Delete all mappings with this subgraph. We will create new mappings with federated graphs in new namespace + await this.db + .delete(schema.subgraphsToFederatedGraph) + .where(eq(schema.subgraphsToFederatedGraph.subgraphId, data.subgraphId)); - const newFederatedGraphs = await fedGraphRepo.bySubgraphLabels({ - labels: data.subgraphLabels, - namespaceId: data.newNamespaceId, - }); - updatedFederatedGraphs.push(...newFederatedGraphs); + const newFederatedGraphs = await fedGraphRepo.bySubgraphLabels({ + labels: data.subgraphLabels, + namespaceId: data.newNamespaceId, + }); - // insert new mappings - if (newFederatedGraphs.length > 0) { - await tx - .insert(schema.subgraphsToFederatedGraph) - .values( - newFederatedGraphs.map((fg) => ({ - federatedGraphId: fg.id, - subgraphId: data.subgraphId, - })), - ) - .onConflictDoNothing() - .execute(); - } + updatedFederatedGraphs.push(...newFederatedGraphs); + + // Insert new mappings + if (newFederatedGraphs.length > 0) { + await this.db + .insert(schema.subgraphsToFederatedGraph) + .values( + newFederatedGraphs.map((fg) => ({ + federatedGraphId: fg.id, + subgraphId: data.subgraphId, + })), + ) + .onConflictDoNothing() + .execute(); + } - const { compositionErrors, deploymentErrors, compositionWarnings } = await fedGraphRepo.composeAndDeployGraphs({ - federatedGraphs: updatedFederatedGraphs.filter((g) => !g.contract), - blobStorage, - admissionConfig: { - webhookJWTSecret: admissionConfig.jwtSecret, - cdnBaseUrl: admissionConfig.cdnBaseUrl, - }, + const { deploymentErrors, compositionErrors, compositionWarnings } = + await compositionService.recomposeAndDeployAffected({ actorId: data.updatedBy, - chClient, - compositionOptions, - webhookProxyUrl, + affectedFederatedGraphs: updatedFederatedGraphs, + affectedFeatureFlags: [], // Feature subgraphs cannot be moved + isFeatureSubgraph: false, }); - // Re-fetch the federated graphs to get the updated composedSchemaVersionId - const refreshedGraphs = await Promise.all(updatedFederatedGraphs.map((g) => fedGraphRepo.byId(g.id))); - for (let i = 0; i < updatedFederatedGraphs.length; i++) { - const refreshedGraph = refreshedGraphs[i]; - if (refreshedGraph) { - updatedFederatedGraphs[i] = refreshedGraph; - } + // Re-fetch the federated graphs to get the updated composedSchemaVersionId + const refreshedGraphs = await Promise.all(updatedFederatedGraphs.map((g) => fedGraphRepo.byId(g.id))); + for (let i = 0; i < updatedFederatedGraphs.length; i++) { + const refreshedGraph = refreshedGraphs[i]; + if (refreshedGraph) { + updatedFederatedGraphs[i] = refreshedGraph; } + } - return { compositionErrors, updatedFederatedGraphs, deploymentErrors, compositionWarnings }; - }); + return { compositionErrors, updatedFederatedGraphs, deploymentErrors, compositionWarnings }; } public addSchemaVersion(data: { diff --git a/controlplane/src/core/services/CompositionService.ts b/controlplane/src/core/services/CompositionService.ts new file mode 100644 index 0000000000..5fd32af116 --- /dev/null +++ b/controlplane/src/core/services/CompositionService.ts @@ -0,0 +1,1127 @@ +/* eslint-disable no-labels */ +import { createHash, randomUUID } from 'node:crypto'; +import { JsonObject, PlainMessage } from '@bufbuild/protobuf'; +import { FeatureFlagRouterExecutionConfig, RouterConfig } from '@wundergraph/cosmo-connect/dist/node/v1/node_pb'; +import { DeploymentError } from '@wundergraph/cosmo-connect/dist/platform/v1/platform_pb'; +import { and, eq, inArray } from 'drizzle-orm'; +import { PostgresJsDatabase } from 'drizzle-orm/postgres-js'; +import { FastifyBaseLogger } from 'fastify'; +import { parse } from 'graphql'; +import { + CompositionOptions, + ROUTER_COMPATIBILITY_VERSION_ONE, + ROUTER_COMPATIBILITY_VERSIONS, + SupportedRouterCompatibilityVersion, +} from '@wundergraph/composition'; +import * as schema from '../../db/schema.js'; +import { + ComposeAndDeployResult, + COMPOSITION_IGNORE_EXTERNAL_KEYS_FEATURE_ID, + FeatureFlagDTO, + FederatedGraphAndCompositionResults, + FederatedGraphDTO, + OrganizationFeatures, + SPLIT_CONFIG_LOADING_FEATURE_ID, +} from '../../types/index.js'; +import { BlobStorage } from '../blobstorage/index.js'; +import { + BaseCompositionData, + Composer, + ContractBaseCompositionData, + routerConfigToFeatureFlagExecutionConfig, + RouterConfigUploadError, +} from '../composition/composer.js'; +import { + composeGraphsInWorker, + deserializeComposedGraphArtifact, + DeserializedComposedGraph, + deserializeRouterExecutionConfig, +} from '../composition/composeGraphs.pool.js'; +import { unsuccessfulBaseCompositionError } from '../errors/errors.js'; +import { ClickHouseClient } from '../clickhouse/index.js'; +import { traced } from '../tracing.js'; +import { FederatedGraphRepository } from '../repositories/FederatedGraphRepository.js'; +import { OrganizationRepository } from '../repositories/OrganizationRepository.js'; +import { ComposeGraphsTaskResultItem } from '../composition/composeGraphs.types.js'; +import { AdmissionError } from './AdmissionWebhookController.js'; +import { ContractRepository } from './../repositories/ContractRepository.js'; +import { FeatureFlagRepository, SubgraphsToCompose } from './../repositories/FeatureFlagRepository.js'; +import { GraphCompositionRepository } from './../repositories/GraphCompositionRepository.js'; +import { SubgraphRepository } from './../repositories/SubgraphRepository.js'; + +@traced +export class CompositionService { + constructor( + private db: PostgresJsDatabase, + private organizationId: string, + private logger: FastifyBaseLogger, + private admissionConfig: { + webhookJWTSecret: string; + cdnBaseUrl: string; + }, + private blobStorage: BlobStorage, + private chClient: ClickHouseClient | undefined, + private webhookProxyUrl: string | undefined, + private disableResolvabilityValidation: boolean | undefined, + ) {} + + public async composeAndDeployFederatedGraph({ + actorId, + federatedGraph, + }: { + actorId: string; + federatedGraph: FederatedGraphDTO; + }): Promise { + const orgFeatures = await this.#getOrganizationFeatures(); + const compositionOptions: CompositionOptions = { + disableResolvabilityValidation: this.disableResolvabilityValidation, + ignoreExternalKeys: orgFeatures.ignoreExternalKeys, + }; + + if (!orgFeatures.splitConfigLoading) { + return this.#legacyComposeAndDeploy({ + actorId, + federatedGraphs: [federatedGraph], + compositionOptions, + }); + } + + const subgraphRepo = new SubgraphRepository(this.logger, this.db, this.organizationId); + const contractRepo = new ContractRepository(this.logger, this.db, this.organizationId); + + const result: ComposeAndDeployResult = { + deploymentErrors: [], + compositionErrors: [], + compositionWarnings: [], + }; + + // Get published subgraphs for recomposition of the federated graph + const subgraphs = await subgraphRepo.listByFederatedGraph({ + federatedGraphTargetId: federatedGraph.targetId, + published: true, + }); + + const contracts = await contractRepo.bySourceFederatedGraphId(federatedGraph.id); + const tagOptionsByContractName = contracts.map((contract) => ({ + contractName: contract.downstreamFederatedGraph.target.name, + excludeTags: contract.excludeTags, + includeTags: contract.includeTags, + })); + + const { results } = await composeGraphsInWorker({ + federatedGraph, + subgraphsToCompose: [ + { + subgraphs, + isFeatureFlagComposition: false, + featureFlagName: '', + featureFlagId: '', + }, + ], + tagOptionsByContractName, + compositionOptions, + }); + + await this.#handleCompositionResultsAndDeploy({ + actorId, + graphAndCompositionResults: [{ federatedGraph, results }], + result, + splitConfig: true, + }); + + return result; + } + + public async composeAndDeployFeatureFlag({ + actorId, + featureFlag, + isEnabled, + prevFederatedGraphs, + }: { + actorId: string; + featureFlag: FeatureFlagDTO; + isEnabled?: boolean; + prevFederatedGraphs?: FederatedGraphDTO[]; + }): Promise { + const orgFeatures = await this.#getOrganizationFeatures(); + const enabled = isEnabled ?? featureFlag.isEnabled; + if (!orgFeatures.splitConfigLoading) { + return await this.#legacyComposeAndDeployFeatureFlag({ + actorId, + featureFlag, + enabled, + orgFeatures, + prevFederatedGraphs, + }); + } + + const result: ComposeAndDeployResult = { + deploymentErrors: [], + compositionErrors: [], + compositionWarnings: [], + }; + + const featureFlagRepo = new FeatureFlagRepository(this.logger, this.db, this.organizationId); + const federatedGraphs = await featureFlagRepo.getFederatedGraphsByFeatureFlag({ + featureFlagId: featureFlag.id, + namespaceId: featureFlag.namespaceId, + excludeDisabled: enabled, + includeContracts: true, + }); + + // If the feature flag belonged to one or more federated graphs, we need to delete the router config for the + // graphs that are no longer associated with the feature flag + if (prevFederatedGraphs && prevFederatedGraphs.length > 0) { + const federatedGraphsToDeleteFrom: FederatedGraphDTO[] = []; + for (const graph of prevFederatedGraphs) { + if (!federatedGraphs.some((g) => g.id === graph.id)) { + federatedGraphsToDeleteFrom.push(graph); + } + } + + const deleteErrors = await this.#deleteFeatureFlagConfigs(featureFlag, federatedGraphsToDeleteFrom); + if (deleteErrors.length > 0) { + result.deploymentErrors.push(...deleteErrors); + return result; + } + } + + if (federatedGraphs.length === 0) { + // The feature flag is not associated with any federated graphs + return result; + } + + if (!enabled) { + // The feature flag is disabled; instead of recomposing, we are just going to delete the router configuration + // from the federated graphs the feature flag is associated with + const deleteError = await this.#deleteFeatureFlagConfigs(featureFlag, federatedGraphs); + result.deploymentErrors.push(...deleteError); + return result; + } + + const subgraphRepo = new SubgraphRepository(this.logger, this.db, this.organizationId); + const compositionOptions: CompositionOptions = { + disableResolvabilityValidation: this.disableResolvabilityValidation, + ignoreExternalKeys: orgFeatures.ignoreExternalKeys, + }; + + const graphAndCompositionResults: FederatedGraphAndCompositionResults[] = []; + for (const graph of federatedGraphs) { + // Get published subgraphs for recomposition of the federated graph + const subgraphs = await subgraphRepo.listByFederatedGraph({ + federatedGraphTargetId: graph.targetId, + published: true, + }); + + const baseCompositionSubgraphs = subgraphs.map((s) => ({ + name: s.name, + url: s.routingUrl, + definitions: parse(s.schemaSDL), + })); + + const subgraphsToCompose = featureFlagRepo.getFeatureFlagRelatedSubgraphsToCompose( + new Map([[featureFlag.id, featureFlag]]), + baseCompositionSubgraphs, + subgraphs, + [], + ); + + const { results } = await composeGraphsInWorker({ + federatedGraph: graph, + subgraphsToCompose: subgraphsToCompose.map((s) => ({ + subgraphs: s.subgraphs, + isFeatureFlagComposition: s.isFeatureFlagComposition, + featureFlagName: s.featureFlagName, + featureFlagId: s.featureFlagId, + })), + /** + * Do not recompose contracts of a base graph; if the feature flag also belongs to a contract, the + * contract will be itself added to the `federatedGraphs` array. + * + * Consequently, if `graph` is a contract, pass the tag data through to the feature flag composition. + */ + tagOptionsByContractName: graph.contract + ? [ + { + contractName: graph.name, + excludeTags: graph.contract.excludeTags, + includeTags: graph.contract.includeTags, + }, + ] + : [], + compositionOptions, + }); + + graphAndCompositionResults.push({ federatedGraph: graph, results }); + } + + await this.#handleCompositionResultsAndDeploy({ + actorId, + graphAndCompositionResults, + result, + isFeatureFlagComposition: true, + splitConfig: true, + }); + + return result; + } + + public async deleteFeatureFlag({ + actorId, + featureFlag, + authorize, + }: { + actorId: string; + featureFlag: FeatureFlagDTO; + authorize: (graph: FederatedGraphDTO) => Promise; + }): Promise { + const orgFeatures = await this.#getOrganizationFeatures(); + const featureFlagRepo = new FeatureFlagRepository(this.logger, this.db, this.organizationId); + + // Collect the federated graph DTOs that have the feature flag enabled because they will be re-composed + const federatedGraphs = await featureFlagRepo.getFederatedGraphsByFeatureFlag({ + featureFlagId: featureFlag.id, + namespaceId: featureFlag.namespaceId, + // if deleting when already disabled, there are no compositions to be done. + excludeDisabled: true, + includeContracts: orgFeatures.splitConfigLoading, + }); + + // Check that the user is authorized to delete the feature flag. + // The user must have authorization for each related federated graph + for (const federatedGraph of federatedGraphs) { + // Check if the user is authorized to perform the action + await authorize(federatedGraph); + } + + /** + * We need to have the actual deletion here because the legacy implementation needs the feature flag to be + * deleted before composition; however, v2 needs it to happen after we know the graphs the feature flag is applied + * to because, instead of recomposing everything, we just remove the feature flag composition. + */ + await featureFlagRepo.delete(featureFlag.id); + + if (!orgFeatures.splitConfigLoading) { + return await this.#legacyComposeAndDeploy({ + actorId, + federatedGraphs, + compositionOptions: { + disableResolvabilityValidation: this.disableResolvabilityValidation, + ignoreExternalKeys: orgFeatures.ignoreExternalKeys, + }, + }); + } + + return { + deploymentErrors: await this.#deleteFeatureFlagConfigs(featureFlag, federatedGraphs), + compositionErrors: [], + compositionWarnings: [], + }; + } + + async recomposeAndDeployAffected({ + actorId, + affectedFederatedGraphs, + affectedFeatureFlags, + isFeatureSubgraph, + }: { + actorId: string; + affectedFederatedGraphs: FederatedGraphDTO[]; + affectedFeatureFlags: FeatureFlagDTO[]; + isFeatureSubgraph: boolean; + }): Promise { + const orgFeatures = await this.#getOrganizationFeatures(); + if (!orgFeatures.splitConfigLoading) { + return await this.#legacyComposeAndDeploy({ + actorId, + federatedGraphs: affectedFederatedGraphs, + compositionOptions: { + disableResolvabilityValidation: this.disableResolvabilityValidation, + ignoreExternalKeys: orgFeatures.ignoreExternalKeys, + }, + }); + } + + const result: ComposeAndDeployResult = { + deploymentErrors: [], + compositionErrors: [], + compositionWarnings: [], + }; + + // Compose all affected federated graphs only when the subgraph we are updating is not a feature subgraph + // as these should not affect federated graphs + if (!isFeatureSubgraph) { + for (const federatedGraph of affectedFederatedGraphs) { + const { deploymentErrors, compositionErrors, compositionWarnings } = await this.composeAndDeployFederatedGraph({ + actorId, + federatedGraph, + }); + + result.deploymentErrors.push(...deploymentErrors); + result.compositionErrors.push(...compositionErrors); + result.compositionWarnings.push(...compositionWarnings); + } + } + + // Compose all affected feature flags + for (const featureFlag of affectedFeatureFlags) { + const { deploymentErrors, compositionErrors, compositionWarnings } = await this.composeAndDeployFeatureFlag({ + actorId, + featureFlag, + isEnabled: true, + }); + + result.deploymentErrors.push(...deploymentErrors); + result.compositionErrors.push(...compositionErrors); + result.compositionWarnings.push(...compositionWarnings); + } + + return result; + } + + async #getOrganizationFeatures(): Promise { + const orgRepo = new OrganizationRepository(this.logger, this.db); + const ignoreExternalKeysFeature = await orgRepo.getFeature({ + organizationId: this.organizationId, + featureId: COMPOSITION_IGNORE_EXTERNAL_KEYS_FEATURE_ID, + }); + + const splitConfigFeature = await orgRepo.getFeature({ + organizationId: this.organizationId, + featureId: SPLIT_CONFIG_LOADING_FEATURE_ID, + }); + + return { + ignoreExternalKeys: ignoreExternalKeysFeature?.enabled ?? false, + splitConfigLoading: splitConfigFeature?.enabled ?? false, + }; + } + + async #legacyComposeAndDeploy({ + actorId, + federatedGraphs, + compositionOptions, + }: { + actorId: string; + federatedGraphs: FederatedGraphDTO[]; + compositionOptions?: CompositionOptions; + }): Promise { + const result: ComposeAndDeployResult = { + deploymentErrors: [], + compositionErrors: [], + compositionWarnings: [], + }; + + if (federatedGraphs.length === 0) { + return result; + } + + const subgraphRepo = new SubgraphRepository(this.logger, this.db, this.organizationId); + const contractRepo = new ContractRepository(this.logger, this.db, this.organizationId); + const featureFlagRepo = new FeatureFlagRepository(this.logger, this.db, this.organizationId); + + const graphAndCompositionResults: FederatedGraphAndCompositionResults[] = []; + for (const graph of federatedGraphs) { + // Get published subgraphs for recomposition of the federated graph + const subgraphs = await subgraphRepo.listByFederatedGraph({ + federatedGraphTargetId: graph.targetId, + published: true, + }); + + const contracts = await contractRepo.bySourceFederatedGraphId(graph.id); + const tagOptionsByContractName = contracts.map((contract) => ({ + contractName: contract.downstreamFederatedGraph.target.name, + excludeTags: contract.excludeTags, + includeTags: contract.includeTags, + })); + + const baseCompositionSubgraphs = subgraphs.map((s) => ({ + name: s.name, + url: s.routingUrl, + definitions: parse(s.schemaSDL), + })); + + // Collects the base graph and applicable feature flag-related graphs + const allSubgraphsToCompose: SubgraphsToCompose[] = await featureFlagRepo.getSubgraphsToCompose({ + baseSubgraphs: subgraphs, + baseCompositionSubgraphs, + fedGraphLabelMatchers: graph.labelMatchers, + }); + + const { results } = await composeGraphsInWorker({ + federatedGraph: graph, + subgraphsToCompose: allSubgraphsToCompose.map((g) => ({ + subgraphs: g.subgraphs, + isFeatureFlagComposition: g.isFeatureFlagComposition, + featureFlagName: g.featureFlagName, + featureFlagId: g.featureFlagId, + })), + tagOptionsByContractName, + compositionOptions, + }); + + graphAndCompositionResults.push({ federatedGraph: graph, results }); + } + + await this.#handleCompositionResultsAndDeploy({ actorId, graphAndCompositionResults, result }); + return result; + } + + async #legacyComposeAndDeployFeatureFlag({ + actorId, + featureFlag, + enabled, + orgFeatures, + prevFederatedGraphs, + }: { + actorId: string; + featureFlag: FeatureFlagDTO; + enabled: boolean; + orgFeatures: OrganizationFeatures; + prevFederatedGraphs?: FederatedGraphDTO[]; + }) { + const featureFlagRepo = new FeatureFlagRepository(this.logger, this.db, this.organizationId); + const currentGraphs = await featureFlagRepo.getFederatedGraphsByFeatureFlag({ + featureFlagId: featureFlag.id, + namespaceId: featureFlag.namespaceId, + excludeDisabled: enabled, + }); + + const allFederatedGraphIdsToCompose = new Set(); + const allFederatedGraphsToCompose: FederatedGraphDTO[] = []; + for (const graph of [...(prevFederatedGraphs ?? []), ...currentGraphs]) { + if (!allFederatedGraphIdsToCompose.has(graph.id)) { + allFederatedGraphIdsToCompose.add(graph.id); + allFederatedGraphsToCompose.push(graph); + } + } + + return await this.#legacyComposeAndDeploy({ + actorId, + federatedGraphs: allFederatedGraphsToCompose, + compositionOptions: { + disableResolvabilityValidation: this.disableResolvabilityValidation, + ignoreExternalKeys: orgFeatures.ignoreExternalKeys, + }, + }); + } + + #getManifestBasePath(federatedGraphId: string): string { + return `${this.organizationId}/${federatedGraphId}/manifest`; + } + + #getLatestPath(graph: FederatedGraphDTO): string | undefined { + let versionPath = ''; + if (graph.routerCompatibilityVersion !== ROUTER_COMPATIBILITY_VERSION_ONE) { + if (ROUTER_COMPATIBILITY_VERSIONS.has(graph.routerCompatibilityVersion as SupportedRouterCompatibilityVersion)) { + versionPath = `${graph.routerCompatibilityVersion}/`; + } else { + return undefined; + } + } + + return `${versionPath}latest.json`; + } + + async #updateMapperForFederatedGraph(federatedGraphId: string): Promise { + const routerHashesForGraph = await this.db + .select({ + id: schema.routerConfigHash.id, + hash: schema.routerConfigHash.hash, + featureFlagName: schema.featureFlags.name, + }) + .from(schema.routerConfigHash) + .leftJoin(schema.featureFlags, eq(schema.featureFlags.id, schema.routerConfigHash.featureFlagId)) + .execute(); + + // Load hashes from database + const mapper = new Map(); + for (const routerHash of routerHashesForGraph) { + mapper.set(routerHash.featureFlagName ?? '', routerHash.hash); + } + + // Serialize the mapper + const serializableMapper: Record = {}; + for (const [key, value] of mapper) { + serializableMapper[key] = value; + } + + // Serialize the mapper content and generate the file signature + const mapperVersion = randomUUID(); + const mapperContent = JSON.stringify(serializableMapper); + const signatureSha256 = createHash('sha256').update(mapperVersion).update(mapperContent).digest('hex'); + + // Upload the mapper file to the CDN + await this.blobStorage.putObject({ + key: `${this.#getManifestBasePath(federatedGraphId)}/mapper.json`, + body: Buffer.from(mapperContent, 'utf8'), + contentType: 'application/json; charset=utf-8', + metadata: { + version: mapperVersion, + 'signature-sha256': signatureSha256, + }, + }); + } + + async #deleteFeatureFlagConfigs( + featureFlag: FeatureFlagDTO, + federatedGraphs: FederatedGraphDTO[], + ): Promise[]> { + if (federatedGraphs.length === 0) { + return []; + } + + // First, we need to delete all the hashes from the database, so we can correctly update the mapper files + await this.db + .delete(schema.routerConfigHash) + .where( + and( + eq(schema.routerConfigHash.featureFlagId, featureFlag.id), + inArray( + schema.routerConfigHash.federatedGraphId, + federatedGraphs.map((graph) => graph.id), + ), + ), + ) + .execute(); + + // Then, we can proceed with deleting the router config for the feature flag and update the mapper files + const deploymentErrors: PlainMessage[] = []; + await Promise.all( + federatedGraphs.map(async (graph) => { + try { + await this.blobStorage.deleteObject({ + key: `${this.#getManifestBasePath(graph.id)}/feature-flags/${featureFlag.name}.json`, + }); + + await this.#updateMapperForFederatedGraph(graph.id); + } catch (err) { + if (err instanceof Error) { + deploymentErrors.push({ + message: err.message, + namespace: graph.namespace, + federatedGraphName: graph.name, + }); + } + } + }), + ); + + return deploymentErrors; + } + + async #handleCompositionResult({ + actorId, + federatedGraph, + compositionResult, + result, + composer, + baseCompositionData, + }: { + actorId: string; + federatedGraph: FederatedGraphDTO; + compositionResult: ComposeGraphsTaskResultItem; + result: ComposeAndDeployResult; + composer: Composer; + baseCompositionData: BaseCompositionData; + }): Promise<{ + baseCompositionFailed: boolean; + federatedSchemaVersionId: string; + baseComposedGraph: DeserializedComposedGraph; + routerExecutionConfig: RouterConfig | undefined; + }> { + if (!compositionResult.base.success) { + // Collect all composition errors + result.compositionErrors.push( + ...compositionResult.base.errors.map((message) => ({ + federatedGraphName: federatedGraph.name, + namespace: federatedGraph.namespace, + message, + featureFlag: compositionResult.featureFlagName || '', + })), + ); + } + + // Collect all composition warnings + result.compositionWarnings.push( + ...compositionResult.base.warnings.map((warning) => ({ + federatedGraphName: federatedGraph.name, + namespace: federatedGraph.namespace, + message: warning.message, + featureFlag: compositionResult.featureFlagName || '', + })), + ); + + if (!compositionResult.isFeatureFlagComposition && !compositionResult.base.success && !federatedGraph.contract) { + result.compositionErrors.push(unsuccessfulBaseCompositionError(federatedGraph.name, federatedGraph.namespace)); + } + + const federatedSchemaVersionId = randomUUID(); + const baseComposedGraph = deserializeComposedGraphArtifact(federatedGraph, compositionResult.base); + let routerExecutionConfig: RouterConfig | undefined; + if (compositionResult.base.success) { + if (!compositionResult.base.routerExecutionConfigJson) { + throw new Error( + `Successful composition for federated graph "${federatedGraph.name}" does not contain a router execution config.`, + ); + } + + routerExecutionConfig = deserializeRouterExecutionConfig(compositionResult.base.routerExecutionConfigJson); + } + + if (routerExecutionConfig) { + routerExecutionConfig.version = federatedSchemaVersionId; + } + + const baseComposition = await composer.saveComposition({ + composedGraph: baseComposedGraph, + composedById: actorId, + isFeatureFlagComposition: compositionResult.isFeatureFlagComposition, + federatedSchemaVersionId, + routerExecutionConfig, + featureFlagId: compositionResult.featureFlagId, + }); + + if (!compositionResult.base.success || !baseComposition.schemaVersionId) { + /* + * If the base composition failed to compose or deploy, return to the parent loop, because + * contracts are not composed if the base composition fails. + */ + if (!compositionResult.isFeatureFlagComposition) { + return { + baseCompositionFailed: true, + federatedSchemaVersionId, + baseComposedGraph, + routerExecutionConfig, + }; + } + + // Record the feature flag composition to upload (if there are no errors) + } else if (compositionResult.isFeatureFlagComposition) { + if (!routerExecutionConfig) { + throw new Error( + `Successful feature flag composition for federated graph "${federatedGraph.name}" does not contain a router execution config.`, + ); + } + + baseCompositionData.featureFlagRouterExecutionConfigByFeatureFlagName.set( + compositionResult.featureFlagName, + routerConfigToFeatureFlagExecutionConfig(routerExecutionConfig), + ); + + // Otherwise, this is the base composition, so store the schema version id + } else { + if (!routerExecutionConfig) { + throw new Error( + `Successful composition for federated graph "${federatedGraph.name}" does not contain a router execution config.`, + ); + } + + baseCompositionData.schemaVersionId = baseComposition.schemaVersionId; + baseCompositionData.routerExecutionConfig = routerExecutionConfig; + } + + return { + baseCompositionFailed: false, + federatedSchemaVersionId, + baseComposedGraph, + routerExecutionConfig, + }; + } + + async #handleCompositionResultsAndDeploy({ + actorId, + graphAndCompositionResults, + result, + isFeatureFlagComposition = false, + splitConfig = false, + }: { + actorId: string; + graphAndCompositionResults: FederatedGraphAndCompositionResults[]; + result: ComposeAndDeployResult; + isFeatureFlagComposition?: boolean; + splitConfig?: boolean; + }): Promise { + const fedGraphRepo = new FederatedGraphRepository(this.logger, this.db, this.organizationId); + const composer = new Composer( + this.logger, + this.db, + fedGraphRepo, + new SubgraphRepository(this.logger, this.db, this.organizationId), + new ContractRepository(this.logger, this.db, this.organizationId), + new GraphCompositionRepository(this.logger, this.db), + this.chClient, + this.webhookProxyUrl, + ); + + parentLoop: for (const { federatedGraph, results } of graphAndCompositionResults) { + /* + * baseCompositionData contains the router execution config and the schema version ID for the source graph + * base composition (not a contract or feature flag composition) + */ + const baseCompositionData: BaseCompositionData = { + featureFlagRouterExecutionConfigByFeatureFlagName: new Map(), + }; + + /* + * Map of the contract base composition schema version ID, router execution config, + * and any feature flag schema version IDs by contract ID + */ + const contractBaseCompositionDataByContractId = new Map(); + + for (const compositionResult of results) { + const { baseCompositionFailed } = await this.#handleCompositionResult({ + actorId, + federatedGraph, + compositionResult, + result, + composer, + baseCompositionData, + }); + + if (baseCompositionFailed) { + continue parentLoop; + } + + // If there are no contracts, there is nothing further to do + if (compositionResult.contracts.length === 0) { + continue; + } + + for (const { contractName, artifact } of compositionResult.contracts) { + const contractGraph = await fedGraphRepo.byName(contractName, federatedGraph.namespace); + if (!contractGraph) { + throw new Error(`The contract graph "${contractName}" was not found.`); + } + + if (!artifact.success) { + result.compositionErrors.push( + ...artifact.errors.map((message) => ({ + federatedGraphName: contractGraph.name, + namespace: contractGraph.namespace, + message, + featureFlag: compositionResult.featureFlagName, + })), + ); + } + + result.compositionWarnings.push( + ...artifact.warnings.map((warning) => ({ + federatedGraphName: contractGraph.name, + namespace: contractGraph.namespace, + message: warning.message, + featureFlag: compositionResult.featureFlagName, + })), + ); + + const contractSchemaVersionId = randomUUID(); + const contractComposedGraph = deserializeComposedGraphArtifact(contractGraph, artifact); + let contractRouterExecutionConfig; + if (artifact.success) { + if (!artifact.routerExecutionConfigJson) { + throw new Error( + `Successful contract composition for federated graph "${contractGraph.name}" does not contain a router execution config.`, + ); + } + + contractRouterExecutionConfig = deserializeRouterExecutionConfig(artifact.routerExecutionConfigJson); + if (!contractRouterExecutionConfig) { + throw new Error( + `Successful contract composition for federated graph "${contractGraph.name}" did not produce a router execution config.`, + ); + } + + contractRouterExecutionConfig.version = contractSchemaVersionId; + } + + const contractComposition = await composer.saveComposition({ + composedGraph: contractComposedGraph, + composedById: actorId, + isFeatureFlagComposition: compositionResult.isFeatureFlagComposition, + federatedSchemaVersionId: contractSchemaVersionId, + routerExecutionConfig: contractRouterExecutionConfig, + featureFlagId: compositionResult.featureFlagId, + }); + + if (!artifact.success || !contractComposition.schemaVersionId) { + continue; + } + + if (!contractRouterExecutionConfig) { + throw new Error( + `Successful contract composition for federated graph "${contractGraph.name}" did not produce a router execution config.`, + ); + } + + /* + * If the base composition for which this contract has been made is NOT a feature flag composition, + * it must be the contract base composition, which must always be uploaded. + * The base composition is always the first item in the subgraphsToCompose array. + */ + if (!compositionResult.isFeatureFlagComposition) { + contractBaseCompositionDataByContractId.set(contractGraph.id, { + schemaVersionId: contractComposition.schemaVersionId, + routerExecutionConfig: contractRouterExecutionConfig, + featureFlagRouterExecutionConfigByFeatureFlagName: new Map(), + }); + + continue; + } + + /* + * If the contract has a feature flag, get the current array feature flag versions (or set a new one), + * and then push the current schema version to the array + */ + const existingContractBaseCompositionData = contractBaseCompositionDataByContractId.get(contractGraph.id); + + /* + * If the existingContractSchemaVersions is undefined, it means the contract base composition failed. + * In this case, simply continue, because when iterating a feature flag for the source graph composition, + * there may not be any errors for the feature flag. + */ + if (!existingContractBaseCompositionData) { + continue; + } + + existingContractBaseCompositionData.featureFlagRouterExecutionConfigByFeatureFlagName.set( + compositionResult.featureFlagName, + routerConfigToFeatureFlagExecutionConfig(contractRouterExecutionConfig), + ); + } + } + + // Validate composition result + const graph = await fedGraphRepo.byId(federatedGraph.id); + if (!graph) { + throw new Error(`Fatal: The federated graph "${federatedGraph.name}" was not found.`); + } + + if (isFeatureFlagComposition) { + await this.#deployFeatureFlags( + actorId, + graph, + baseCompositionData.featureFlagRouterExecutionConfigByFeatureFlagName, + composer, + result, + ); + } else { + if (!baseCompositionData.routerExecutionConfig) { + throw new Error( + `Fatal: The latest router execution config for federated graph "${federatedGraph.name}" was not generated.`, + ); + } + + if (!baseCompositionData.schemaVersionId) { + throw new Error( + `Fatal: The latest base composition for federated graph "${federatedGraph.name}" was not found.`, + ); + } + + await this.#deployGraph({ + actorId, + routerExecutionConfig: baseCompositionData.routerExecutionConfig, + graph, + schemaVersionId: baseCompositionData.schemaVersionId, + featureFlagRouterExecutionConfigByFeatureFlagName: + baseCompositionData.featureFlagRouterExecutionConfigByFeatureFlagName, + composer, + result, + splitConfig, + }); + } + + // Handle contracts + for (const [ + contractId, + { featureFlagRouterExecutionConfigByFeatureFlagName, schemaVersionId, routerExecutionConfig }, + ] of contractBaseCompositionDataByContractId) { + const contractDTO = await fedGraphRepo.byId(contractId); + if (!contractDTO) { + throw new Error(`Unexpected: Contract graph with id "${contractId}" not found after latest composition`); + } + + await this.#deployGraph({ + actorId, + routerExecutionConfig, + graph: contractDTO, + schemaVersionId, + featureFlagRouterExecutionConfigByFeatureFlagName, + composer, + result, + splitConfig, + }); + + if (splitConfig) { + await this.#updateMapperForFederatedGraph(federatedGraph.id); + } + } + + // + if (splitConfig) { + await this.#updateMapperForFederatedGraph(federatedGraph.id); + } + } + } + + async #deployGraph({ + actorId, + routerExecutionConfig, + graph, + schemaVersionId, + featureFlagRouterExecutionConfigByFeatureFlagName, + composer, + result, + splitConfig, + }: { + actorId: string; + routerExecutionConfig: RouterConfig; + graph: FederatedGraphDTO; + schemaVersionId: string; + featureFlagRouterExecutionConfigByFeatureFlagName: Map; + composer: Composer; + result: ComposeAndDeployResult; + splitConfig: boolean; + }) { + const manifestBasePath = this.#getManifestBasePath(graph.id); + const readyPathOverride = this.#getLatestPath(graph); + if (readyPathOverride) { + const { errors: uploadErrors } = await composer.composeAndUploadRouterConfig({ + admissionConfig: { + cdnBaseUrl: this.admissionConfig.cdnBaseUrl, + jwtSecret: this.admissionConfig.webhookJWTSecret, + }, + baseCompositionRouterExecutionConfig: routerExecutionConfig, + baseCompositionSchemaVersionId: schemaVersionId, + blobStorage: this.blobStorage, + featureFlagRouterExecutionConfigByFeatureFlagName: splitConfig + ? new Map() // Do not populate feature flags when the router config is being split + : featureFlagRouterExecutionConfigByFeatureFlagName, + federatedGraphId: graph.id, + organizationId: this.organizationId, + federatedGraphAdmissionWebhookURL: graph.admissionWebhookURL, + federatedGraphAdmissionWebhookSecret: graph.admissionWebhookSecret, + actorId, + pathOverride: splitConfig + ? { + ready: `${manifestBasePath}/${readyPathOverride}`, + draft: `${manifestBasePath}/draft.json`, + } + : undefined, + }); + + if (splitConfig) { + await this.#saveRouterConfigHash(graph.id, undefined, routerExecutionConfig); + } + + result.deploymentErrors.push( + ...uploadErrors + .filter((e) => e instanceof AdmissionError || e instanceof RouterConfigUploadError) + .map((e) => ({ + federatedGraphName: graph.name, + namespace: graph.namespace, + message: e.message ?? '', + })), + ); + } else { + result.deploymentErrors.push({ + message: `Invalid router compatibility version "${graph.routerCompatibilityVersion}".`, + federatedGraphName: graph.name, + namespace: graph.namespace, + }); + } + + if (splitConfig && featureFlagRouterExecutionConfigByFeatureFlagName.size > 0) { + await this.#deployFeatureFlags( + actorId, + graph, + featureFlagRouterExecutionConfigByFeatureFlagName, + composer, + result, + ); + } + } + + async #deployFeatureFlags( + actorId: string, + graph: FederatedGraphDTO, + featureFlagRouterExecutionConfigByFeatureFlagName: Map, + composer: Composer, + result: ComposeAndDeployResult, + ): Promise { + const baseManifestPath = this.#getManifestBasePath(graph.id); + for (const [ + featureFlagName, + featureFlagRouterExecutionConfig, + ] of featureFlagRouterExecutionConfigByFeatureFlagName.entries()) { + const routerExecutionConfig = RouterConfig.fromJson({ + ...(featureFlagRouterExecutionConfig.toJson() as JsonObject), + compatibilityVersion: graph.routerCompatibilityVersion, + }); + + const { errors: uploadErrors } = await composer.composeAndUploadRouterConfig({ + admissionConfig: { + cdnBaseUrl: this.admissionConfig.cdnBaseUrl, + jwtSecret: this.admissionConfig.webhookJWTSecret, + }, + baseCompositionRouterExecutionConfig: routerExecutionConfig, + baseCompositionSchemaVersionId: '', + blobStorage: this.blobStorage, + featureFlagRouterExecutionConfigByFeatureFlagName: new Map(), + federatedGraphId: graph.id, + organizationId: this.organizationId, + federatedGraphAdmissionWebhookURL: graph.admissionWebhookURL, + federatedGraphAdmissionWebhookSecret: graph.admissionWebhookSecret, + actorId, + pathOverride: { + ready: `${baseManifestPath}/feature-flags/${featureFlagName}.json`, + draft: `${baseManifestPath}/feature-flags/${featureFlagName}.draft.json`, + }, + }); + + await this.#saveRouterConfigHash(graph.id, featureFlagName, routerExecutionConfig); + result.deploymentErrors.push( + ...uploadErrors + .filter((e) => e instanceof AdmissionError || e instanceof RouterConfigUploadError) + .map((e) => ({ + federatedGraphName: graph.name, + namespace: graph.namespace, + message: e.message ?? '', + })), + ); + } + } + + async #saveRouterConfigHash( + federatedGraphId: string, + featureFlagName: string | undefined, + routerConfig: RouterConfig, + ): Promise { + const hash = createHash('sha256').update(routerConfig.toJsonString()).digest('hex'); + + let featureFlag: { id: string } | undefined; + if (featureFlagName) { + const results = await this.db + .select({ id: schema.featureFlags.id }) + .from(schema.featureFlags) + .where( + and( + eq(schema.featureFlags.organizationId, this.organizationId), + eq(schema.featureFlags.name, featureFlagName), + ), + ) + .limit(1) + .execute(); + + featureFlag = results[0]; + } + + await this.db + .insert(schema.routerConfigHash) + .values({ federatedGraphId, featureFlagId: featureFlag?.id ?? null, hash }) + .onConflictDoUpdate({ + target: [schema.routerConfigHash.federatedGraphId, schema.routerConfigHash.featureFlagId], + set: { hash, updatedAt: new Date() }, + }) + .execute(); + } +} diff --git a/controlplane/src/db/schema.ts b/controlplane/src/db/schema.ts index 80d68dd9cf..8c39ba0bf3 100644 --- a/controlplane/src/db/schema.ts +++ b/controlplane/src/db/schema.ts @@ -2638,3 +2638,22 @@ export const namespaceSubgraphCheckExtensionConfig = pgTable( }; }, ); + +export const routerConfigHash = pgTable( + 'router_config_hash', + { + id: uuid('id').primaryKey().defaultRandom(), + federatedGraphId: uuid('federated_graph_id') + .notNull() + .references(() => federatedGraphs.id, { onDelete: 'cascade' }), + featureFlagId: uuid('feature_flag_id').references(() => featureFlags.id, { onDelete: 'cascade' }), + hash: text('hash').notNull(), + createdAt: timestamp('created_at').defaultNow(), + updatedAt: timestamp('updated_at'), + }, + (t) => { + return { + graphFlagIndex: unique('fed_graph_feature_flag_idx').on(t.federatedGraphId, t.featureFlagId).nullsNotDistinct(), + }; + }, +); diff --git a/controlplane/src/types/index.ts b/controlplane/src/types/index.ts index d438237876..463f73e2b2 100644 --- a/controlplane/src/types/index.ts +++ b/controlplane/src/types/index.ts @@ -1,9 +1,17 @@ -import { LintSeverity } from '@wundergraph/cosmo-connect/dist/platform/v1/platform_pb'; +import { + CompositionError, + CompositionWarning, + DeploymentError, + LintSeverity, +} from '@wundergraph/cosmo-connect/dist/platform/v1/platform_pb'; import { JWTPayload } from 'jose'; +import { PlainMessage } from '@bufbuild/protobuf'; import { DBSubgraphType, GraphPruningRuleEnum, OrganizationRole, ProposalMatch, ProposalOrigin } from '../db/models.js'; import { RBACEvaluator } from '../core/services/RBACEvaluator.js'; +import { ComposeGraphsTaskResultItem } from '../core/composition/composeGraphs.types.js'; export const COMPOSITION_IGNORE_EXTERNAL_KEYS_FEATURE_ID = 'composition-ignore-external-keys'; +export const SPLIT_CONFIG_LOADING_FEATURE_ID = 'split-config-loading'; export type FeatureIds = | 'users' @@ -806,3 +814,19 @@ export interface ProposalSubgraphDTO { isNew: boolean; labels: Label[]; } + +export interface ComposeAndDeployResult { + deploymentErrors: PlainMessage[]; + compositionErrors: PlainMessage[]; + compositionWarnings: PlainMessage[]; +} + +export interface OrganizationFeatures { + ignoreExternalKeys: boolean; + splitConfigLoading: boolean; +} + +export interface FederatedGraphAndCompositionResults { + federatedGraph: FederatedGraphDTO; + results: ComposeGraphsTaskResultItem[]; +} diff --git a/controlplane/test/feature-flag/feature-flag-integration-v2.test.ts b/controlplane/test/feature-flag/feature-flag-integration-v2.test.ts new file mode 100644 index 0000000000..0696aec6b8 --- /dev/null +++ b/controlplane/test/feature-flag/feature-flag-integration-v2.test.ts @@ -0,0 +1,1440 @@ +import fs from 'node:fs'; +import { join } from 'node:path'; +import { afterAll, afterEach, beforeAll, beforeEach, describe, expect, test, vi } from 'vitest'; +import { EnumStatusCode } from '@wundergraph/cosmo-connect/dist/common/common_pb'; +import { afterAllSetup, beforeAllSetup, genID } from '../../src/core/test-util.js'; +import { Label } from '../../src/types/index.js'; +import { unsuccessfulBaseCompositionError } from '../../src/core/errors/errors.js'; +import { + assertExecutionConfigSubgraphNames, + assertFeatureFlagExecutionConfig, + assertNumberOfCompositions, + createAndPublishSubgraph, + createFeatureFlag, + createFederatedGraph, + createNamespace, + createThenPublishFeatureSubgraph, + DEFAULT_SUBGRAPH_URL_TWO, + deleteFeatureFlag, + featureFlagIntegrationTestSetUp, + getDebugTestOptions, + GraphNameAndKey, + SetupTest, + toggleFeatureFlag, +} from '../test-util.js'; +import { ClickHouseClient } from '../../src/core/clickhouse/index.js'; + +// Change to true to enable a longer timeout +const isDebugMode = true; +let dbname = ''; + +vi.mock('../src/core/clickhouse/index.js', () => { + const ClickHouseClient = vi.fn(); + ClickHouseClient.prototype.queryPromise = vi.fn(); + + return { ClickHouseClient }; +}); + +describe('Feature flag integration tests v2', () => { + let chClient: ClickHouseClient; + + beforeEach(() => { + chClient = new ClickHouseClient(); + }); + + afterEach(() => { + vi.clearAllMocks(); + }); + + beforeAll(async () => { + dbname = await beforeAllSetup(); + }); + + afterAll(async () => { + await afterAllSetup(dbname); + }); + + test( + 'that a feature flag that is enabled upon creation can be disabled and re-enabled (default namespace with labels)', + getDebugTestOptions(isDebugMode), + async (testContext) => { + const { client, server, blobStorage } = await SetupTest({ + dbname, + chClient, + enabledFeatures: ['split-config-loading'], + }); + testContext.onTestFinished(() => server.close()); + + const labels = [{ key: 'team', value: 'A' }]; + const baseGraphName = genID('baseFederatedGraphName'); + const federatedGraphResponse = await featureFlagIntegrationTestSetUp( + client, + [ + { name: 'users', hasFeatureSubgraph: true }, + { name: 'products', hasFeatureSubgraph: true }, + ], + baseGraphName, + labels, + ); + + expect(blobStorage.keys()).toHaveLength(2); + const key = blobStorage.keys()[0]; + const mapperKey = blobStorage.keys()[1]; + expect(key).toContain(`${federatedGraphResponse.graph!.id}/manifest/latest.json`); + expect(mapperKey).toContain(`${federatedGraphResponse.graph!.id}/manifest/mapper.json`); + + await assertFeatureFlagExecutionConfig(blobStorage, key, false); + + // The base composition + await assertNumberOfCompositions(client, baseGraphName, 1); + + const featureFlagName = genID('flag'); + await createFeatureFlag(client, featureFlagName, labels, ['users-feature', 'products-feature'], 'default', true); + + expect(blobStorage.keys()).toHaveLength(3); + const ffKey = blobStorage.keys().at(-1); + expect(ffKey).toContain(`${federatedGraphResponse.graph!.id}/manifest/feature-flags/${featureFlagName}.json`); + + // The base recomposition and the feature flag composition + await assertNumberOfCompositions(client, baseGraphName, 2); + + await assertFeatureFlagExecutionConfig(blobStorage, key, false); + await toggleFeatureFlag(client, featureFlagName, false); + + expect(blobStorage.keys()).toHaveLength(2); + + // Another base recomposition to remove the feature flag + await assertNumberOfCompositions(client, baseGraphName, 2); + await assertFeatureFlagExecutionConfig(blobStorage, key, false); + await toggleFeatureFlag(client, featureFlagName, true); + + // Another base recomposition and the feature flag composition + await assertNumberOfCompositions(client, baseGraphName, 3); + await assertFeatureFlagExecutionConfig(blobStorage, key, false); + + expect(blobStorage.keys()).toHaveLength(3); + }, + ); + + test( + 'that a feature flag that is enabled upon creation can be disabled and re-enabled (namespace without labels)', + getDebugTestOptions(isDebugMode), + async (testContext) => { + const { client, server, blobStorage } = await SetupTest({ + dbname, + chClient, + enabledFeatures: ['split-config-loading'], + }); + testContext.onTestFinished(() => server.close()); + + const labels: Array