VirtualBox

source: vbox/trunk/src/VBox/ValidationKit/testmanager/db/tmdb-r19-testboxes-3.pgsql@ 78138

Last change on this file since 78138 was 76553, checked in by vboxsync, 6 years ago

scm --update-copyright-year

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 14.5 KB
Line 
1-- $Id: tmdb-r19-testboxes-3.pgsql 76553 2019-01-01 01:45:53Z vboxsync $
2--- @file
3-- VBox Test Manager Database - Adds sComment and fRawMode to TestBoxes and
4-- moves the strings to separate table.
5--
6
7--
8-- Copyright (C) 2013-2019 Oracle Corporation
9--
10-- This file is part of VirtualBox Open Source Edition (OSE), as
11-- available from http://www.virtualbox.org. This file is free software;
12-- you can redistribute it and/or modify it under the terms of the GNU
13-- General Public License (GPL) as published by the Free Software
14-- Foundation, in version 2 as it comes in the "COPYING" file of the
15-- VirtualBox OSE distribution. VirtualBox OSE is distributed in the
16-- hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
17--
18-- The contents of this file may alternatively be used under the terms
19-- of the Common Development and Distribution License Version 1.0
20-- (CDDL) only, as it comes in the "COPYING.CDDL" file of the
21-- VirtualBox OSE distribution, in which case the provisions of the
22-- CDDL are applicable instead of those of the GPL.
23--
24-- You may elect to license modified versions of this file under the
25-- terms and conditions of either the GPL or the CDDL or both.
26--
27
28--
29-- Cleanup after failed runs.
30--
31DROP TABLE IF EXISTS OldTestBoxes;
32
33-- Die on error from now on.
34\set ON_ERROR_STOP 1
35\set AUTOCOMMIT 0
36
37-- Sanity check that we haven't already run this script.
38SELECT 'done conversion already?', COUNT(sReport) FROM TestBoxes WHERE tsExpire = 'infinity'::TIMESTAMP;
39
40-- Total grid lock.
41LOCK TABLE TestBoxStatuses IN ACCESS EXCLUSIVE MODE;
42LOCK TABLE TestSets IN ACCESS EXCLUSIVE MODE;
43LOCK TABLE TestBoxes IN ACCESS EXCLUSIVE MODE;
44LOCK TABLE SchedGroupMembers IN ACCESS EXCLUSIVE MODE;
45
46\d+ TestBoxes;
47
48--
49-- Rename the table, drop foreign keys refering to it, and drop constrains
50-- within the table itself. The latter is mostly for naming and we do it
51-- up front in case the database we're running against has different names
52-- due to previous conversions.
53--
54ALTER TABLE TestBoxes RENAME TO OldTestBoxes;
55
56ALTER TABLE OldTestBoxes DROP CONSTRAINT testboxes_ccpus_check;
57ALTER TABLE OldTestBoxes DROP CONSTRAINT testboxes_check;
58ALTER TABLE OldTestBoxes DROP CONSTRAINT testboxes_cmbmemory_check;
59ALTER TABLE OldTestBoxes DROP CONSTRAINT testboxes_cmbscratch_check;
60ALTER TABLE OldTestBoxes DROP CONSTRAINT testboxes_pctscaletimeout_check;
61
62ALTER TABLE TestBoxStatuses DROP CONSTRAINT TestBoxStatuses_idGenTestBox_fkey;
63ALTER TABLE TestSets DROP CONSTRAINT TestSets_idGenTestBox_fkey;
64
65ALTER TABLE OldTestBoxes DROP CONSTRAINT testboxes_pkey;
66ALTER TABLE OldTestBoxes DROP CONSTRAINT testboxes_idgentestbox_key;
67
68DROP INDEX IF EXISTS TestBoxesUuidIdx;
69DROP INDEX IF EXISTS TestBoxesExpireEffectiveIdx;
70
71-- This output should be free of index, constraints and references from other tables.
72\d+ OldTestBoxes;
73
74--
75-- Create the two new tables before starting data migration (don't want to spend time
76-- on converting strings just to find a typo in the TestBoxes create table syntax).
77--
78CREATE SEQUENCE TestBoxStrTabIdSeq
79 START 1
80 INCREMENT BY 1
81 NO MAXVALUE
82 NO MINVALUE
83 CACHE 1;
84CREATE TABLE TestBoxStrTab (
85 --- The ID of this string.
86 idStr INTEGER PRIMARY KEY DEFAULT NEXTVAL('TestBoxStrTabIdSeq'),
87 --- The string value.
88 sValue text NOT NULL,
89 --- Creation time stamp.
90 tsCreated TIMESTAMP WITH TIME ZONE DEFAULT current_timestamp NOT NULL
91);
92
93CREATE TABLE TestBoxes (
94 --- The fixed testbox ID.
95 -- This is assigned when the testbox is created and will never change.
96 idTestBox INTEGER DEFAULT NEXTVAL('TestBoxIdSeq') NOT NULL,
97 --- When this row starts taking effect (inclusive).
98 tsEffective TIMESTAMP WITH TIME ZONE DEFAULT current_timestamp NOT NULL,
99 --- When this row stops being tsEffective (exclusive).
100 tsExpire TIMESTAMP WITH TIME ZONE DEFAULT TIMESTAMP WITH TIME ZONE 'infinity' NOT NULL,
101 --- The user id of the one who created/modified this entry.
102 -- When modified automatically by the testbox, NULL is used.
103 -- Non-unique foreign key: Users(uid)
104 uidAuthor INTEGER DEFAULT NULL,
105 --- Generation ID for this row.
106 -- This is primarily for referencing by TestSets.
107 idGenTestBox INTEGER UNIQUE DEFAULT NEXTVAL('TestBoxGenIdSeq') NOT NULL,
108
109 --- The testbox IP.
110 -- This is from the webserver point of view and automatically updated on
111 -- SIGNON. The test setup doesn't permit for IP addresses to change while
112 -- the testbox is operational, because this will break gang tests.
113 ip inet NOT NULL,
114 --- The system or firmware UUID.
115 -- This uniquely identifies the testbox when talking to the server. After
116 -- SIGNON though, the testbox will also provide idTestBox and ip to
117 -- establish its identity beyond doubt.
118 uuidSystem uuid NOT NULL,
119 --- The testbox name.
120 -- Usually similar to the DNS name.
121 sName text NOT NULL,
122 --- Optional testbox description.
123 -- Intended for describing the box as well as making other relevant notes.
124 idStrDescription INTEGER REFERENCES TestBoxStrTab(idStr) DEFAULT NULL,
125
126 --- Reference to the scheduling group that this testbox is a member of.
127 -- Non-unique foreign key: SchedGroups(idSchedGroup)
128 -- A testbox is always part of a group, the default one nothing else.
129 idSchedGroup INTEGER DEFAULT 1 NOT NULL,
130
131 --- Indicates whether this testbox is enabled.
132 -- A testbox gets disabled when we're doing maintenance, debugging a issue
133 -- that happens only on that testbox, or some similar stuff. This is an
134 -- alternative to deleting the testbox.
135 fEnabled BOOLEAN DEFAULT NULL,
136
137 --- The kind of lights-out-management.
138 enmLomKind LomKind_T DEFAULT 'none'::LomKind_T NOT NULL,
139 --- The IP adress of the lights-out-management.
140 -- This can be NULL if enmLomKind is 'none', otherwise it must contain a valid address.
141 ipLom inet DEFAULT NULL,
142
143 --- Timeout scale factor, given as a percent.
144 -- This is a crude adjustment of the test case timeout for slower hardware.
145 pctScaleTimeout smallint DEFAULT 100 NOT NULL CHECK (pctScaleTimeout > 10 AND pctScaleTimeout < 20000),
146
147 --- Change comment or similar.
148 idStrComment INTEGER REFERENCES TestBoxStrTab(idStr) DEFAULT NULL,
149
150 --- @name Scheduling properties (reported by testbox script).
151 -- @{
152 --- Same abbrieviations as kBuild, see KBUILD_OSES.
153 idStrOs INTEGER REFERENCES TestBoxStrTab(idStr) DEFAULT NULL,
154 --- Informational, no fixed format.
155 idStrOsVersion INTEGER REFERENCES TestBoxStrTab(idStr) DEFAULT NULL,
156 --- Same as CPUID reports (GenuineIntel, AuthenticAMD, CentaurHauls, ...).
157 idStrCpuVendor INTEGER REFERENCES TestBoxStrTab(idStr) DEFAULT NULL,
158 --- Same as kBuild - x86, amd64, ... See KBUILD_ARCHES.
159 idStrCpuArch INTEGER REFERENCES TestBoxStrTab(idStr) DEFAULT NULL,
160 --- The CPU name if available.
161 idStrCpuName INTEGER REFERENCES TestBoxStrTab(idStr) DEFAULT NULL,
162 --- Number identifying the CPU family/model/stepping/whatever.
163 -- For x86 and AMD64 type CPUs, this will on the following format:
164 -- (EffFamily << 24) | (EffModel << 8) | Stepping.
165 lCpuRevision bigint DEFAULT NULL,
166 --- Number of CPUs, CPU cores and CPU threads.
167 cCpus smallint DEFAULT NULL CHECK (cCpus IS NULL OR cCpus > 0),
168 --- Set if capable of hardware virtualization.
169 fCpuHwVirt boolean DEFAULT NULL,
170 --- Set if capable of nested paging.
171 fCpuNestedPaging boolean DEFAULT NULL,
172 --- Set if CPU capable of 64-bit (VBox) guests.
173 fCpu64BitGuest boolean DEFAULT NULL,
174 --- Set if chipset with usable IOMMU (VT-d / AMD-Vi).
175 fChipsetIoMmu boolean DEFAULT NULL,
176 --- Set if the test box does raw-mode tests.
177 fRawMode boolean DEFAULT NULL,
178 --- The (approximate) memory size in megabytes (rounded down to nearest 4 MB).
179 cMbMemory bigint DEFAULT NULL CHECK (cMbMemory IS NULL OR cMbMemory > 0),
180 --- The amount of scratch space in megabytes (rounded down to nearest 64 MB).
181 cMbScratch bigint DEFAULT NULL CHECK (cMbScratch IS NULL OR cMbScratch >= 0),
182 --- Free form hardware and software report field.
183 idStrReport INTEGER REFERENCES TestBoxStrTab(idStr) DEFAULT NULL,
184 --- @}
185
186 --- The testbox script revision number, serves the purpose of a version number.
187 -- Probably good to have when scheduling upgrades as well for status purposes.
188 iTestBoxScriptRev INTEGER DEFAULT 0 NOT NULL,
189 --- The python sys.hexversion (layed out as of 2.7).
190 -- Good to know which python versions we need to support.
191 iPythonHexVersion INTEGER DEFAULT NULL,
192
193 --- Pending command.
194 -- @note We put it here instead of in TestBoxStatuses to get history.
195 enmPendingCmd TestBoxCmd_T DEFAULT 'none'::TestBoxCmd_T NOT NULL,
196
197 PRIMARY KEY (idTestBox, tsExpire),
198
199 --- Nested paging requires hardware virtualization.
200 CHECK (fCpuNestedPaging IS NULL OR (fCpuNestedPaging <> TRUE OR fCpuHwVirt = TRUE))
201);
202
203-- Convenience view that simplifies querying a lot.
204CREATE VIEW TestBoxesWithStrings AS
205 SELECT TestBoxes.*,
206 Str1.sValue AS sDescription,
207 Str2.sValue AS sComment,
208 Str3.sValue AS sOs,
209 Str4.sValue AS sOsVersion,
210 Str5.sValue AS sCpuVendor,
211 Str6.sValue AS sCpuArch,
212 Str7.sValue AS sCpuName,
213 Str8.sValue AS sReport
214 FROM TestBoxes
215 LEFT OUTER JOIN TestBoxStrTab Str1 ON idStrDescription = Str1.idStr
216 LEFT OUTER JOIN TestBoxStrTab Str2 ON idStrComment = Str2.idStr
217 LEFT OUTER JOIN TestBoxStrTab Str3 ON idStrOs = Str3.idStr
218 LEFT OUTER JOIN TestBoxStrTab Str4 ON idStrOsVersion = Str4.idStr
219 LEFT OUTER JOIN TestBoxStrTab Str5 ON idStrCpuVendor = Str5.idStr
220 LEFT OUTER JOIN TestBoxStrTab Str6 ON idStrCpuArch = Str6.idStr
221 LEFT OUTER JOIN TestBoxStrTab Str7 ON idStrCpuName = Str7.idStr
222 LEFT OUTER JOIN TestBoxStrTab Str8 ON idStrReport = Str8.idStr;
223
224
225--
226-- Populate the string table.
227--
228
229--- Empty string with ID 0.
230INSERT INTO TestBoxStrTab (idStr, sValue) VALUES (0, '');
231
232INSERT INTO TestBoxStrTab (sValue)
233( SELECT DISTINCT sDescription FROM OldTestBoxes WHERE sDescription IS NOT NULL
234) UNION ( SELECT DISTINCT sOs FROM OldTestBoxes WHERE sOs IS NOT NULL
235) UNION ( SELECT DISTINCT sOsVersion FROM OldTestBoxes WHERE sOsVersion IS NOT NULL
236) UNION ( SELECT DISTINCT sCpuVendor FROM OldTestBoxes WHERE sCpuVendor IS NOT NULL
237) UNION ( SELECT DISTINCT sCpuArch FROM OldTestBoxes WHERE sCpuArch IS NOT NULL
238) UNION ( SELECT DISTINCT sCpuName FROM OldTestBoxes WHERE sCpuName IS NOT NULL
239) UNION ( SELECT DISTINCT sReport FROM OldTestBoxes WHERE sReport IS NOT NULL );
240
241-- Index and analyze the string table as we'll be using it a lot below already.
242CREATE INDEX TestBoxStrTabNameIdx ON TestBoxStrTab USING hash (sValue);
243ANALYZE VERBOSE TestBoxStrTab;
244
245SELECT MAX(idStr) FROM TestBoxStrTab;
246SELECT pg_total_relation_size('TestBoxStrTab');
247
248
249--
250-- Populate the test box table.
251--
252
253INSERT INTO TestBoxes (
254 idTestBox, -- 0
255 tsEffective, -- 1
256 tsExpire, -- 2
257 uidAuthor, -- 3
258 idGenTestBox, -- 4
259 ip, -- 5
260 uuidSystem, -- 6
261 sName, -- 7
262 idStrDescription, -- 8
263 idSchedGroup, -- 9
264 fEnabled, -- 10
265 enmLomKind, -- 11
266 ipLom, -- 12
267 pctScaleTimeout, -- 13
268 idStrComment, -- 14
269 idStrOs, -- 15
270 idStrOsVersion, -- 16
271 idStrCpuVendor, -- 17
272 idStrCpuArch, -- 18
273 idStrCpuName, -- 19
274 lCpuRevision, -- 20
275 cCpus, -- 21
276 fCpuHwVirt, -- 22
277 fCpuNestedPaging, -- 23
278 fCpu64BitGuest, -- 24
279 fChipsetIoMmu, -- 25
280 fRawMode, -- 26
281 cMbMemory, -- 27
282 cMbScratch, -- 28
283 idStrReport, -- 29
284 iTestBoxScriptRev, -- 30
285 iPythonHexVersion, -- 31
286 enmPendingCmd -- 32
287 )
288SELECT idTestBox,
289 tsEffective,
290 tsExpire,
291 uidAuthor,
292 idGenTestBox,
293 ip,
294 uuidSystem,
295 sName,
296 st1.idStr,
297 idSchedGroup,
298 fEnabled,
299 enmLomKind,
300 ipLom,
301 pctScaleTimeout,
302 NULL,
303 st2.idStr,
304 st3.idStr,
305 st4.idStr,
306 st5.idStr,
307 st6.idStr,
308 lCpuRevision,
309 cCpus,
310 fCpuHwVirt,
311 fCpuNestedPaging,
312 fCpu64BitGuest,
313 fChipsetIoMmu,
314 NULL,
315 cMbMemory,
316 cMbScratch,
317 st7.idStr,
318 iTestBoxScriptRev,
319 iPythonHexVersion,
320 enmPendingCmd
321FROM OldTestBoxes
322 LEFT OUTER JOIN TestBoxStrTab st1 ON sDescription = st1.sValue
323 LEFT OUTER JOIN TestBoxStrTab st2 ON sOs = st2.sValue
324 LEFT OUTER JOIN TestBoxStrTab st3 ON sOsVersion = st3.sValue
325 LEFT OUTER JOIN TestBoxStrTab st4 ON sCpuVendor = st4.sValue
326 LEFT OUTER JOIN TestBoxStrTab st5 ON sCpuArch = st5.sValue
327 LEFT OUTER JOIN TestBoxStrTab st6 ON sCpuName = st6.sValue
328 LEFT OUTER JOIN TestBoxStrTab st7 ON sReport = st7.sValue;
329
330-- Restore indexes.
331CREATE UNIQUE INDEX TestBoxesUuidIdx ON TestBoxes (uuidSystem, tsExpire DESC);
332CREATE INDEX TestBoxesExpireEffectiveIdx ON TestBoxes (tsExpire DESC, tsEffective ASC);
333
334-- Restore foreign key references to the table.
335ALTER TABLE TestBoxStatuses ADD CONSTRAINT TestBoxStatuses_idGenTestBox_fkey
336 FOREIGN KEY (idGenTestBox) REFERENCES TestBoxes(idGenTestBox);
337ALTER TABLE TestSets ADD CONSTRAINT TestSets_idGenTestBox_fkey
338 FOREIGN KEY (idGenTestBox) REFERENCES TestBoxes(idGenTestBox);
339
340-- Drop the old table.
341DROP TABLE OldTestBoxes;
342
343COMMIT;
344
345\d TestBoxes;
346
Note: See TracBrowser for help on using the repository browser.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette