Skip to content

Commit cc6e0eb

Browse files
committed
Add gateway_id for cloud gateways
1 parent 7178ca5 commit cc6e0eb

12 files changed

Lines changed: 400 additions & 108 deletions

File tree

gateway/configs/config-template.toml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,9 @@ api_port = 9090
99
xds_port = 18000
1010
# Graceful shutdown timeout
1111
shutdown_timeout = "15s"
12+
# Unique identifier for the gateway instance (used in persistent storage)
13+
# It is recommended to use a uuid_v7 for this to improve db efficiency.
14+
gateway_id = "platform-gateway-id"
1215

1316
[controller.admin_server]
1417
# Dedicated admin/debug HTTP server for config dump and xDS sync endpoints

gateway/configs/config.toml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@ enabled_publishers = ["moesif"]
77
[analytics.publishers.moesif]
88
application_id = "<MOESIF_APPLICATION_ID>"
99

10+
[gateway_controller.server]
11+
gateway_id = "platform-gateway-id"
12+
1013
[router]
1114
gateway_host = "*"
1215

gateway/gateway-controller/cmd/controller/main.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ func toBackendConfig(cfg *config.Config) storage.BackendConfig {
6161
ConnMaxIdleTime: pg.ConnMaxIdleTime,
6262
ApplicationName: pg.ApplicationName,
6363
},
64+
GatewayID: cfg.GatewayController.Server.GatewayID,
6465
}
6566
}
6667

gateway/gateway-controller/pkg/config/config.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,7 @@ type ServerConfig struct {
176176
APIPort int `koanf:"api_port"`
177177
XDSPort int `koanf:"xds_port"`
178178
ShutdownTimeout time.Duration `koanf:"shutdown_timeout"`
179+
GatewayID string `koanf:"gateway_id"`
179180
}
180181

181182
// AdminServerConfig holds controller admin HTTP server configuration.

gateway/gateway-controller/pkg/storage/factory.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ type BackendConfig struct {
3131
Type string
3232
SQLitePath string
3333
Postgres PostgresConnectionConfig
34+
GatewayID string
3435
}
3536

3637
// NewStorage creates the configured persistent storage backend.
@@ -45,7 +46,7 @@ func NewStorage(cfg BackendConfig, logger *slog.Logger) (Storage, error) {
4546
return nil, err
4647
}
4748

48-
store := newSQLStore(backend.db, backend.logger, "sqlite")
49+
store := newSQLStore(backend.db, backend.logger, "sqlite", cfg.GatewayID)
4950
store.rebindQuery = func(query string) string { return query }
5051
store.isConfigUniqueViolation = isUniqueConstraintError
5152
store.isCertificateUniqueViolation = isCertificateUniqueConstraintError
@@ -59,7 +60,7 @@ func NewStorage(cfg BackendConfig, logger *slog.Logger) (Storage, error) {
5960
return nil, err
6061
}
6162

62-
store := newSQLStore(backend.db, backend.logger, "postgres")
63+
store := newSQLStore(backend.db, backend.logger, "postgres", cfg.GatewayID)
6364
store.rebindQuery = func(query string) string { return sqlx.Rebind(sqlx.DOLLAR, query) }
6465
store.isConfigUniqueViolation = isPostgresUniqueConstraintError
6566
store.isCertificateUniqueViolation = isPostgresCertificateUniqueConstraintError

gateway/gateway-controller/pkg/storage/gateway-controller-db.postgres.sql

Lines changed: 63 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
-- PostgreSQL Schema for Gateway-Controller API Configurations
2-
-- Version: 6
2+
-- Version: 8
33

44
-- Main table for deployments
55
CREATE TABLE IF NOT EXISTS deployments (
66
id TEXT PRIMARY KEY,
7+
gateway_id TEXT NOT NULL DEFAULT 'platform-gateway-id',
78
display_name TEXT NOT NULL,
89
version TEXT NOT NULL,
910
context TEXT NOT NULL,
@@ -14,17 +15,18 @@ CREATE TABLE IF NOT EXISTS deployments (
1415
updated_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP,
1516
deployed_at TIMESTAMPTZ,
1617
deployed_version BIGINT NOT NULL DEFAULT 0,
17-
UNIQUE(display_name, version)
18+
UNIQUE(display_name, version, gateway_id)
1819
);
1920

20-
CREATE INDEX IF NOT EXISTS idx_name_version ON deployments(display_name, version);
2121
CREATE INDEX IF NOT EXISTS idx_status ON deployments(status);
2222
CREATE INDEX IF NOT EXISTS idx_context ON deployments(context);
2323
CREATE INDEX IF NOT EXISTS idx_kind ON deployments(kind);
24+
CREATE INDEX IF NOT EXISTS idx_deployments_gateway_id ON deployments(gateway_id);
2425

2526
-- Table for custom TLS certificates
2627
CREATE TABLE IF NOT EXISTS certificates (
2728
id TEXT PRIMARY KEY,
29+
gateway_id TEXT NOT NULL DEFAULT 'platform-gateway-id',
2830
name TEXT NOT NULL UNIQUE,
2931
certificate BYTEA NOT NULL,
3032
subject TEXT NOT NULL,
@@ -38,6 +40,7 @@ CREATE TABLE IF NOT EXISTS certificates (
3840

3941
CREATE INDEX IF NOT EXISTS idx_cert_name ON certificates(name);
4042
CREATE INDEX IF NOT EXISTS idx_cert_expiry ON certificates(not_after);
43+
CREATE INDEX IF NOT EXISTS idx_certificates_gateway_id ON certificates(gateway_id);
4144

4245
-- Table for deployment-specific configurations
4346
CREATE TABLE IF NOT EXISTS deployment_configs (
@@ -50,17 +53,20 @@ CREATE TABLE IF NOT EXISTS deployment_configs (
5053
-- LLM Provider Templates table
5154
CREATE TABLE IF NOT EXISTS llm_provider_templates (
5255
id TEXT PRIMARY KEY,
56+
gateway_id TEXT NOT NULL DEFAULT 'platform-gateway-id',
5357
handle TEXT NOT NULL UNIQUE,
5458
configuration TEXT NOT NULL,
5559
created_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP,
5660
updated_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP
5761
);
5862

5963
CREATE INDEX IF NOT EXISTS idx_template_handle ON llm_provider_templates(handle);
64+
CREATE INDEX IF NOT EXISTS idx_llm_provider_templates_gateway_id ON llm_provider_templates(gateway_id);
6065

6166
-- Table for API keys
6267
CREATE TABLE IF NOT EXISTS api_keys (
6368
id TEXT PRIMARY KEY,
69+
gateway_id TEXT NOT NULL DEFAULT 'platform-gateway-id',
6470
name TEXT NOT NULL,
6571
api_key TEXT NOT NULL UNIQUE,
6672
masked_api_key TEXT NOT NULL,
@@ -78,7 +84,7 @@ CREATE TABLE IF NOT EXISTS api_keys (
7884
index_key TEXT NULL,
7985
display_name TEXT NOT NULL DEFAULT '',
8086
FOREIGN KEY (apiId) REFERENCES deployments(id) ON DELETE CASCADE,
81-
UNIQUE (apiId, name)
87+
UNIQUE (apiId, name, gateway_id)
8288
);
8389

8490
CREATE INDEX IF NOT EXISTS idx_api_key ON api_keys(api_key);
@@ -89,10 +95,63 @@ CREATE INDEX IF NOT EXISTS idx_created_by ON api_keys(created_by);
8995
CREATE INDEX IF NOT EXISTS idx_api_key_source ON api_keys(source);
9096
CREATE INDEX IF NOT EXISTS idx_api_key_external_ref ON api_keys(external_ref_id);
9197
CREATE INDEX IF NOT EXISTS idx_api_key_index_key ON api_keys(index_key);
98+
CREATE INDEX IF NOT EXISTS idx_api_keys_gateway_id ON api_keys(gateway_id);
9299
CREATE UNIQUE INDEX IF NOT EXISTS idx_unique_external_api_key
93100
ON api_keys(apiId, index_key)
94101
WHERE source = 'external' AND index_key IS NOT NULL;
95102

103+
-- Migration-safe column additions for existing deployments
104+
ALTER TABLE deployments ADD COLUMN IF NOT EXISTS gateway_id TEXT NOT NULL DEFAULT 'platform-gateway-id';
105+
ALTER TABLE certificates ADD COLUMN IF NOT EXISTS gateway_id TEXT NOT NULL DEFAULT 'platform-gateway-id';
106+
ALTER TABLE llm_provider_templates ADD COLUMN IF NOT EXISTS gateway_id TEXT NOT NULL DEFAULT 'platform-gateway-id';
107+
ALTER TABLE api_keys ADD COLUMN IF NOT EXISTS gateway_id TEXT NOT NULL DEFAULT 'platform-gateway-id';
108+
109+
ALTER TABLE deployments ALTER COLUMN gateway_id SET DEFAULT 'platform-gateway-id';
110+
UPDATE deployments SET gateway_id = 'platform-gateway-id' WHERE gateway_id IS NULL;
111+
ALTER TABLE deployments ALTER COLUMN gateway_id SET NOT NULL;
112+
113+
ALTER TABLE certificates ALTER COLUMN gateway_id SET DEFAULT 'platform-gateway-id';
114+
UPDATE certificates SET gateway_id = 'platform-gateway-id' WHERE gateway_id IS NULL;
115+
ALTER TABLE certificates ALTER COLUMN gateway_id SET NOT NULL;
116+
117+
ALTER TABLE llm_provider_templates ALTER COLUMN gateway_id SET DEFAULT 'platform-gateway-id';
118+
UPDATE llm_provider_templates SET gateway_id = 'platform-gateway-id' WHERE gateway_id IS NULL;
119+
ALTER TABLE llm_provider_templates ALTER COLUMN gateway_id SET NOT NULL;
120+
121+
ALTER TABLE api_keys ALTER COLUMN gateway_id SET DEFAULT 'platform-gateway-id';
122+
UPDATE api_keys SET gateway_id = 'platform-gateway-id' WHERE gateway_id IS NULL;
123+
ALTER TABLE api_keys ALTER COLUMN gateway_id SET NOT NULL;
124+
125+
ALTER TABLE deployments DROP CONSTRAINT IF EXISTS deployments_display_name_version_key;
126+
ALTER TABLE api_keys DROP CONSTRAINT IF EXISTS api_keys_apiid_name_key;
127+
128+
DO $$
129+
BEGIN
130+
IF NOT EXISTS (
131+
SELECT 1 FROM pg_constraint WHERE conname = 'deployments_display_name_version_gateway_id_key'
132+
) THEN
133+
ALTER TABLE deployments
134+
ADD CONSTRAINT deployments_display_name_version_gateway_id_key
135+
UNIQUE (display_name, version, gateway_id);
136+
END IF;
137+
END $$;
138+
139+
DO $$
140+
BEGIN
141+
IF NOT EXISTS (
142+
SELECT 1 FROM pg_constraint WHERE conname = 'api_keys_apiid_name_gateway_id_key'
143+
) THEN
144+
ALTER TABLE api_keys
145+
ADD CONSTRAINT api_keys_apiid_name_gateway_id_key
146+
UNIQUE (apiId, name, gateway_id);
147+
END IF;
148+
END $$;
149+
150+
CREATE INDEX IF NOT EXISTS idx_deployments_gateway_id ON deployments(gateway_id);
151+
CREATE INDEX IF NOT EXISTS idx_certificates_gateway_id ON certificates(gateway_id);
152+
CREATE INDEX IF NOT EXISTS idx_llm_provider_templates_gateway_id ON llm_provider_templates(gateway_id);
153+
CREATE INDEX IF NOT EXISTS idx_api_keys_gateway_id ON api_keys(gateway_id);
154+
96155
-- Schema migration metadata
97156
CREATE TABLE IF NOT EXISTS schema_migrations (
98157
id INTEGER PRIMARY KEY,

gateway/gateway-controller/pkg/storage/gateway-controller-db.sql

Lines changed: 26 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@ CREATE TABLE IF NOT EXISTS deployments (
77
-- Primary identifier (UUID)
88
id TEXT PRIMARY KEY,
99

10+
-- Gateway identifier
11+
gateway_id TEXT NOT NULL DEFAULT 'platform-gateway-id',
12+
1013
-- Extracted fields for fast querying
1114
display_name TEXT NOT NULL,
1215
version TEXT NOT NULL,
@@ -26,12 +29,10 @@ CREATE TABLE IF NOT EXISTS deployments (
2629
deployed_version INTEGER NOT NULL DEFAULT 0,
2730

2831
-- Composite unique constraint (API display_name + version must be unique)
29-
UNIQUE(display_name, version)
32+
UNIQUE(display_name, version, gateway_id)
3033
);
3134

3235
-- Indexes for fast lookups
33-
-- Composite index for display_name+version lookups (most common query)
34-
CREATE INDEX IF NOT EXISTS idx_name_version ON deployments(display_name, version);
3536

3637
-- Filter by deployment status (translator queries pending configs)
3738
CREATE INDEX IF NOT EXISTS idx_status ON deployments(status);
@@ -42,6 +43,9 @@ CREATE INDEX IF NOT EXISTS idx_context ON deployments(context);
4243
-- Filter by API type (reporting/analytics)
4344
CREATE INDEX IF NOT EXISTS idx_kind ON deployments(kind);
4445

46+
-- Filter by gateway
47+
CREATE INDEX IF NOT EXISTS idx_deployments_gateway_id ON deployments(gateway_id);
48+
4549
-- Note: Policy definitions are no longer stored in the database.
4650
-- They are loaded from files at controller startup (see policies/ directory).
4751
-- The policy_definitions table has been removed as of schema version 3.
@@ -50,6 +54,9 @@ CREATE INDEX IF NOT EXISTS idx_kind ON deployments(kind);
5054
CREATE TABLE IF NOT EXISTS certificates (
5155
-- Primary identifier (UUID)
5256
id TEXT PRIMARY KEY,
57+
58+
-- Gateway identifier
59+
gateway_id TEXT NOT NULL DEFAULT 'platform-gateway-id',
5360

5461
-- Human-readable name for the certificate
5562
name TEXT NOT NULL UNIQUE,
@@ -75,6 +82,9 @@ CREATE INDEX IF NOT EXISTS idx_cert_name ON certificates(name);
7582
-- Index for expiry tracking
7683
CREATE INDEX IF NOT EXISTS idx_cert_expiry ON certificates(not_after);
7784

85+
-- Filter by gateway
86+
CREATE INDEX IF NOT EXISTS idx_certificates_gateway_id ON certificates(gateway_id);
87+
7888

7989
-- Table for deployment-specific configurations
8090
CREATE TABLE IF NOT EXISTS deployment_configs (
@@ -89,6 +99,9 @@ CREATE TABLE IF NOT EXISTS llm_provider_templates (
8999
-- Primary identifier (UUID)
90100
id TEXT PRIMARY KEY,
91101

102+
-- Gateway identifier
103+
gateway_id TEXT NOT NULL DEFAULT 'platform-gateway-id',
104+
92105
-- Template handle (must be unique)
93106
handle TEXT NOT NULL UNIQUE,
94107

@@ -103,11 +116,17 @@ CREATE TABLE IF NOT EXISTS llm_provider_templates (
103116
-- Index for fast name lookups
104117
CREATE INDEX IF NOT EXISTS idx_template_handle ON llm_provider_templates(handle);
105118

119+
-- Filter by gateway
120+
CREATE INDEX IF NOT EXISTS idx_llm_provider_templates_gateway_id ON llm_provider_templates(gateway_id);
121+
106122
-- Table for API keys
107123
CREATE TABLE IF NOT EXISTS api_keys (
108124
-- Primary identifier (UUID)
109125
id TEXT PRIMARY KEY,
110126

127+
-- Gateway identifier
128+
gateway_id TEXT NOT NULL DEFAULT 'platform-gateway-id',
129+
111130
-- Human-readable name for the API key
112131
name TEXT NOT NULL,
113132

@@ -153,7 +172,7 @@ CREATE TABLE IF NOT EXISTS api_keys (
153172
FOREIGN KEY (apiId) REFERENCES deployments(id) ON DELETE CASCADE,
154173

155174
-- Composite unique constraint (handle + api key name must be unique)
156-
UNIQUE (apiId, name)
175+
UNIQUE (apiId, name, gateway_id)
157176
);
158177

159178
-- Indexes for API key lookups
@@ -165,9 +184,10 @@ CREATE INDEX IF NOT EXISTS idx_created_by ON api_keys(created_by);
165184
CREATE INDEX IF NOT EXISTS idx_api_key_source ON api_keys(source);
166185
CREATE INDEX IF NOT EXISTS idx_api_key_external_ref ON api_keys(external_ref_id);
167186
CREATE INDEX IF NOT EXISTS idx_api_key_index_key ON api_keys(index_key);
187+
CREATE INDEX IF NOT EXISTS idx_api_keys_gateway_id ON api_keys(gateway_id);
168188
CREATE UNIQUE INDEX IF NOT EXISTS idx_unique_external_api_key
169189
ON api_keys(apiId, index_key)
170190
WHERE source = 'external' AND index_key IS NOT NULL;
171191

172-
-- Set schema version to 7 (deployments status CHECK constraint includes 'undeployed')
173-
PRAGMA user_version = 7;
192+
-- Set schema version to 8 (add gateway_id column)
193+
PRAGMA user_version = 8;

gateway/gateway-controller/pkg/storage/postgres.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ import (
3939
var postgresSchemaSQL string
4040

4141
const (
42-
postgresSchemaVersion = 6
42+
postgresSchemaVersion = 7
4343
postgresSchemaLockID = int64(749251473)
4444
pgUniqueViolationCode = "23505"
4545
)

0 commit comments

Comments
 (0)