-
Notifications
You must be signed in to change notification settings - Fork 582
Expand file tree
/
Copy path34904400_velero_backup_restore_tables.up.sql
More file actions
259 lines (218 loc) · 13.4 KB
/
Copy path34904400_velero_backup_restore_tables.up.sql
File metadata and controls
259 lines (218 loc) · 13.4 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
-- Velero Backup & ClusterBackupRestore Integration - Final Schema
-- This migration creates all tables for Velero backup and restore functionality
-- with merged location tables and JSONB configuration/status fields
-- =====================================================
-- Backup Location Tables (Unified)
-- =====================================================
-- Unified backup location table (storage + snapshot locations)
CREATE SEQUENCE IF NOT EXISTS id_seq_cluster_backup_location;
CREATE TABLE IF NOT EXISTS cluster_backup_location (
id INTEGER NOT NULL DEFAULT nextval('id_seq_cluster_backup_location'::regclass),
name VARCHAR(255) NOT NULL,
location_type VARCHAR(20) NOT NULL, -- 'storage' or 'snapshot'
provider VARCHAR(100) NOT NULL,
-- Storage location specific fields (NULL for snapshot locations)
bucket VARCHAR(255),
prefix VARCHAR(255),
is_default BOOLEAN DEFAULT false,
-- Common fields
config JSONB,
ca_cert BYTEA,
access_mode VARCHAR(20), -- 'readwrite', 'readonly'
backup_sync_period VARCHAR(255), -- e.g., "30s"
validation_frequency VARCHAR(255), -- e.g., "10m"
-- Credential fields
credential_type VARCHAR(20), -- 'existing_secret', 'create_secret'
credential_secret_name VARCHAR(255),
credential_secret_key VARCHAR(255),
credential_secret_data TEXT,
active BOOLEAN NOT NULL DEFAULT true,
created_on TIMESTAMPTZ NOT NULL,
created_by INTEGER NOT NULL,
updated_on TIMESTAMPTZ NOT NULL,
updated_by INTEGER NOT NULL,
CONSTRAINT pk_cluster_backup_location PRIMARY KEY (id),
CONSTRAINT chk_cluster_backup_location_type CHECK (location_type IN ('storage', 'snapshot'))
);
-- Unique index on name and location_type
CREATE UNIQUE INDEX idx_cluster_backup_location_name_type ON cluster_backup_location(name, location_type) WHERE active = true;
-- Indexes for faster querying
CREATE INDEX idx_cluster_backup_location_type ON cluster_backup_location(location_type);
CREATE INDEX idx_cluster_backup_location_active ON cluster_backup_location(active);
-- Unified location status table
CREATE SEQUENCE IF NOT EXISTS id_seq_cluster_backup_location_status;
CREATE TABLE IF NOT EXISTS cluster_backup_location_status (
id INTEGER NOT NULL DEFAULT nextval('id_seq_cluster_backup_location_status'::regclass),
cluster_backup_location_id INTEGER NOT NULL,
cluster_id INTEGER NOT NULL,
location_type VARCHAR(20) NOT NULL, -- 'storage' or 'snapshot'
phase VARCHAR(50),
last_synced_time TIMESTAMPTZ,
last_validation_time TIMESTAMPTZ,
message TEXT,
created_on TIMESTAMPTZ NOT NULL,
updated_on TIMESTAMPTZ NOT NULL,
CONSTRAINT pk_cluster_backup_location_status PRIMARY KEY (id),
CONSTRAINT fk_cluster_backup_location_status_location FOREIGN KEY (cluster_backup_location_id) REFERENCES cluster_backup_location(id) ON DELETE CASCADE,
CONSTRAINT fk_cluster_backup_location_status_cluster FOREIGN KEY (cluster_id) REFERENCES cluster(id),
CONSTRAINT uq_cluster_backup_location_status UNIQUE (cluster_backup_location_id, cluster_id)
);
CREATE INDEX idx_cluster_backup_location_status_location_id ON cluster_backup_location_status(cluster_backup_location_id);
CREATE INDEX idx_cluster_backup_location_status_cluster_id ON cluster_backup_location_status(cluster_id);
-- =====================================================
-- Backup Tables
-- =====================================================
-- Backup table with JSONB configuration
CREATE SEQUENCE IF NOT EXISTS id_seq_cluster_backup;
CREATE TABLE IF NOT EXISTS cluster_backup (
id INTEGER NOT NULL DEFAULT nextval('id_seq_cluster_backup'::regclass),
cluster_id INTEGER NOT NULL,
name VARCHAR(255) NOT NULL,
description VARCHAR(300),
storage_location_id INTEGER NOT NULL,
snapshot_location_ids INTEGER[],
cluster_backup_schedule_id INTEGER,
configuration JSONB NOT NULL,
configuration_version INTEGER NOT NULL DEFAULT 1,
active BOOLEAN NOT NULL DEFAULT true,
created_on TIMESTAMPTZ NOT NULL,
created_by INTEGER NOT NULL,
updated_on TIMESTAMPTZ NOT NULL,
updated_by INTEGER NOT NULL,
CONSTRAINT pk_cluster_backup PRIMARY KEY (id),
CONSTRAINT fk_cluster_backup_cluster FOREIGN KEY (cluster_id) REFERENCES cluster(id),
CONSTRAINT fk_cluster_backup_storage_location FOREIGN KEY (storage_location_id) REFERENCES cluster_backup_location(id)
);
-- Unique index on name and cluster_id
CREATE UNIQUE INDEX idx_cluster_backup_name_cluster ON cluster_backup(name, cluster_id) WHERE active = true;
-- Indexes for faster querying
CREATE INDEX idx_cluster_backup_cluster_id ON cluster_backup(cluster_id);
CREATE INDEX idx_cluster_backup_storage_location_id ON cluster_backup(storage_location_id);
CREATE INDEX idx_cluster_backup_schedule_id ON cluster_backup(cluster_backup_schedule_id);
CREATE INDEX idx_cluster_backup_active ON cluster_backup(active);
CREATE INDEX idx_cluster_backup_configuration ON cluster_backup USING gin(configuration);
-- Backup status table with JSONB status_detail
CREATE SEQUENCE IF NOT EXISTS id_seq_cluster_backup_status;
CREATE TABLE IF NOT EXISTS cluster_backup_status (
id INTEGER NOT NULL DEFAULT nextval('id_seq_cluster_backup_status'::regclass),
cluster_backup_id INTEGER NOT NULL,
phase VARCHAR(50),
status_detail JSONB,
status_detail_version INTEGER NOT NULL DEFAULT 1,
created_on TIMESTAMPTZ NOT NULL,
updated_on TIMESTAMPTZ NOT NULL,
started_on TIMESTAMPTZ,
finished_on TIMESTAMPTZ,
expires_at TIMESTAMPTZ,
CONSTRAINT pk_cluster_backup_status PRIMARY KEY (id),
CONSTRAINT fk_cluster_backup_status_backup FOREIGN KEY (cluster_backup_id) REFERENCES cluster_backup(id) ON DELETE CASCADE,
CONSTRAINT uq_cluster_backup_status UNIQUE (cluster_backup_id)
);
CREATE INDEX idx_cluster_backup_status_cluster_backup_id ON cluster_backup_status(cluster_backup_id);
CREATE INDEX idx_cluster_backup_status_detail ON cluster_backup_status USING gin(status_detail);
-- =====================================================
-- Schedule Tables
-- =====================================================
-- Schedule table with JSONB configuration
CREATE SEQUENCE IF NOT EXISTS id_seq_cluster_backup_schedule;
CREATE TABLE IF NOT EXISTS cluster_backup_schedule (
id INTEGER NOT NULL DEFAULT nextval('id_seq_cluster_backup_schedule'::regclass),
cluster_id INTEGER NOT NULL,
name VARCHAR(255) NOT NULL,
description VARCHAR(300),
schedule VARCHAR(100) NOT NULL, -- Cron expression
storage_location_id INTEGER NOT NULL,
snapshot_location_ids INTEGER[],
configuration JSONB NOT NULL,
configuration_version INTEGER NOT NULL DEFAULT 1,
paused BOOLEAN NOT NULL DEFAULT false,
use_owner_references_in_backup BOOLEAN,
skip_immediately BOOLEAN,
active BOOLEAN NOT NULL DEFAULT true,
created_on TIMESTAMPTZ NOT NULL,
created_by INTEGER NOT NULL,
updated_on TIMESTAMPTZ NOT NULL,
updated_by INTEGER NOT NULL,
CONSTRAINT pk_cluster_backup_schedule PRIMARY KEY (id),
CONSTRAINT fk_cluster_backup_schedule_cluster FOREIGN KEY (cluster_id) REFERENCES cluster(id),
CONSTRAINT fk_cluster_backup_schedule_storage_location FOREIGN KEY (storage_location_id) REFERENCES cluster_backup_location(id)
);
-- Unique index on name and cluster_id
CREATE UNIQUE INDEX idx_cluster_backup_schedule_name_cluster ON cluster_backup_schedule(name, cluster_id) WHERE active = true;
-- Indexes for faster querying
CREATE INDEX idx_cluster_backup_schedule_cluster_id ON cluster_backup_schedule(cluster_id);
CREATE INDEX idx_cluster_backup_schedule_storage_location_id ON cluster_backup_schedule(storage_location_id);
CREATE INDEX idx_cluster_backup_schedule_active ON cluster_backup_schedule(active);
CREATE INDEX idx_cluster_backup_schedule_configuration ON cluster_backup_schedule USING gin(configuration);
-- Add foreign key from backup to schedule
ALTER TABLE cluster_backup
ADD CONSTRAINT fk_cluster_backup_schedule
FOREIGN KEY (cluster_backup_schedule_id)
REFERENCES cluster_backup_schedule(id);
-- Schedule status table with JSONB status_detail
CREATE SEQUENCE IF NOT EXISTS id_seq_cluster_backup_schedule_status;
CREATE TABLE IF NOT EXISTS cluster_backup_schedule_status (
id INTEGER NOT NULL DEFAULT nextval('id_seq_cluster_backup_schedule_status'::regclass),
cluster_backup_schedule_id INTEGER NOT NULL,
phase VARCHAR(50),
last_backup_time TIMESTAMPTZ,
status_detail JSONB,
status_detail_version INTEGER NOT NULL DEFAULT 1,
created_on TIMESTAMPTZ NOT NULL,
updated_on TIMESTAMPTZ NOT NULL,
CONSTRAINT pk_cluster_backup_schedule_status PRIMARY KEY (id),
CONSTRAINT fk_cluster_backup_schedule_status_schedule FOREIGN KEY (cluster_backup_schedule_id) REFERENCES cluster_backup_schedule(id) ON DELETE CASCADE,
CONSTRAINT uq_cluster_backup_schedule_status UNIQUE (cluster_backup_schedule_id)
);
CREATE INDEX idx_cluster_backup_schedule_status_schedule_id ON cluster_backup_schedule_status(cluster_backup_schedule_id);
CREATE INDEX idx_cluster_backup_schedule_status_detail ON cluster_backup_schedule_status USING gin(status_detail);
-- =====================================================
-- ClusterBackupRestore Tables
-- =====================================================
-- ClusterBackupRestore table with JSONB configuration
CREATE SEQUENCE IF NOT EXISTS id_seq_cluster_backup_restore;
CREATE TABLE IF NOT EXISTS cluster_backup_restore (
id INTEGER NOT NULL DEFAULT nextval('id_seq_cluster_backup_restore'::regclass),
cluster_id INTEGER NOT NULL,
name VARCHAR(255) NOT NULL,
description VARCHAR(300),
cluster_backup_id INTEGER,
cluster_backup_schedule_id INTEGER,
configuration JSONB NOT NULL,
configuration_version INTEGER NOT NULL DEFAULT 1,
active BOOLEAN NOT NULL DEFAULT true,
created_on TIMESTAMPTZ NOT NULL,
created_by INTEGER NOT NULL,
updated_on TIMESTAMPTZ NOT NULL,
updated_by INTEGER NOT NULL,
CONSTRAINT pk_cluster_backup_restore PRIMARY KEY (id),
CONSTRAINT fk_cluster_backup_restore_cluster FOREIGN KEY (cluster_id) REFERENCES cluster(id),
CONSTRAINT fk_cluster_backup_restore_backup FOREIGN KEY (cluster_backup_id) REFERENCES cluster_backup(id),
CONSTRAINT fk_cluster_backup_restore_schedule FOREIGN KEY (cluster_backup_schedule_id) REFERENCES cluster_backup_schedule(id)
);
-- Unique index on name and cluster_id
CREATE UNIQUE INDEX idx_cluster_backup_restore_name_cluster ON cluster_backup_restore(name, cluster_id) WHERE active = true;
-- Indexes for faster querying
CREATE INDEX idx_cluster_backup_restore_cluster_id ON cluster_backup_restore(cluster_id);
CREATE INDEX idx_cluster_backup_restore_cluster_backup_id ON cluster_backup_restore(cluster_backup_id);
CREATE INDEX idx_cluster_backup_restore_cluster_backup_schedule_id ON cluster_backup_restore(cluster_backup_schedule_id);
CREATE INDEX idx_cluster_backup_restore_active ON cluster_backup_restore(active);
CREATE INDEX idx_cluster_backup_restore_configuration ON cluster_backup_restore USING gin(configuration);
-- ClusterBackupRestore status table with JSONB status_detail
CREATE SEQUENCE IF NOT EXISTS id_seq_cluster_backup_restore_status;
CREATE TABLE IF NOT EXISTS cluster_backup_restore_status (
id INTEGER NOT NULL DEFAULT nextval('id_seq_cluster_backup_restore_status'::regclass),
cluster_backup_restore_id INTEGER NOT NULL,
phase VARCHAR(50),
status_detail JSONB,
status_detail_version INTEGER NOT NULL DEFAULT 1,
created_on TIMESTAMPTZ NOT NULL,
updated_on TIMESTAMPTZ NOT NULL,
started_on TIMESTAMPTZ,
finished_on TIMESTAMPTZ,
CONSTRAINT pk_cluster_backup_restore_status PRIMARY KEY (id),
CONSTRAINT fk_cluster_backup_restore_status_restore FOREIGN KEY (cluster_backup_restore_id) REFERENCES cluster_backup_restore(id) ON DELETE CASCADE,
CONSTRAINT uq_cluster_backup_restore_status UNIQUE (cluster_backup_restore_id)
);
CREATE INDEX idx_cluster_backup_restore_status_restore_id ON cluster_backup_restore_status(cluster_backup_restore_id);
CREATE INDEX idx_cluster_backup_restore_status_detail ON cluster_backup_restore_status USING gin(status_detail);