Upgrading to Beaker 0.10¶
These notes describe the steps needed to upgrade your Beaker installation from version 0.9 to version 0.10.
Before proceeding with this upgrade, ensure that you have a CSV file to re-create your Virtual system records in case you need to roll back. If you don’t already have one, use Beaker’s CSV export feature. If you don’t have any Virtual system records, ignore this step.
Database changes¶
Bug #%s835367: running createrepo all the time is inefficient¶
There was a change in how we generate repodata so the existing repodata directory must be deleted.
rm -rf /var/www/beaker/rpms/repodata
We also need to drop the task.oldrpm column, but first get a list of old RPMs to be deleted:
mysql $CREDENTIALS beaker -B -N \
-e 'SELECT oldrpm FROM task WHERE oldrpm IS NOT NULL;' \
>oldrpms.txt
The RPMs in this list should not be deleted immediately since some existing recipes may refer to them and will try to install them. Delete them a few days after upgrading.
Now you can run the following SQL to drop the column:
ALTER TABLE task DROP oldrpm;
To roll back, delete the repodata directory again:
rm -rf /var/www/beaker/rpms/repodata
and restore the dropped column (but we won’t have the old data to restore):
ALTER TABLE task
ADD COLUMN oldrpm VARCHAR(2048) DEFAULT NULL;
Remove system_id from watchdog table¶
Run the following SQL:
ALTER TABLE watchdog
DROP FOREIGN KEY watchdog_ibfk_4, -- system_id FK
DROP COLUMN system_id;
To roll back, run the following SQL:
ALTER TABLE watchdog
ADD COLUMN system_id INT AFTER id;
UPDATE watchdog
INNER JOIN recipe ON watchdog.recipe_id = recipe.id
SET watchdog.system_id = recipe.system_id;
ALTER TABLE watchdog
MODIFY system_id INT NOT NULL,
ADD CONSTRAINT watchdog_system_id_fk
FOREIGN KEY (system_id) REFERENCES system (id);
Remove recipe_role and recipe_task_role tables¶
Run the following SQL:
DROP TABLE recipe_role;
DROP TABLE recipe_task_role;
To roll back, run beaker-init to recreate the recipe_role and recipe_task_role tables, then run the following SQL to populate them:
INSERT INTO recipe_role (id, recipe_id, role, system_id)
SELECT NULL, id, role, system_id
FROM recipe;
INSERT INTO recipe_task_role (id, recipe_task_id, role, system_id)
SELECT NULL, recipe_task.id, recipe.role, recipe.system_id
FROM recipe_task
INNER JOIN recipe ON recipe_task.recipe_id = recipe.id;
New tables recipe_resource, system_resource, guest_resource (#%s655009)¶
Note
An earlier version of this document (prior to Beaker 0.10.5) used a different query for populating the guest_resource table which was not correct, see #%s882740 for details and corrective action.
First run beaker-init to create the new tables, and then run the following SQL to populate them.
INSERT INTO recipe_resource (id, recipe_id, type, fqdn)
SELECT NULL, recipe.id, 'system', system.fqdn
FROM recipe
INNER JOIN system ON recipe.system_id = system.id
WHERE system.type != 'Virtual';
INSERT INTO system_resource (id, system_id, reservation_id)
SELECT recipe_resource.id, recipe.system_id, recipe.reservation_id
FROM recipe
INNER JOIN recipe_resource ON recipe_resource.recipe_id = recipe.id
AND recipe_resource.type = 'system';
INSERT INTO recipe_resource (id, recipe_id, type, fqdn)
SELECT NULL, recipe.id, 'guest', system.fqdn
FROM recipe
INNER JOIN system ON recipe.system_id = system.id
INNER JOIN machine_guest_map ON machine_guest_map.guest_recipe_id = recipe.id
INNER JOIN recipe parent ON machine_guest_map.machine_recipe_id = parent.id
WHERE system.type = 'Virtual'
AND parent.status NOT IN ('New', 'Processed', 'Queued');
INSERT INTO guest_resource (id)
SELECT recipe_resource.id
FROM recipe
INNER JOIN recipe_resource ON recipe_resource.recipe_id = recipe.id
AND recipe_resource.type = 'guest';
-- set guest recipes back to Queued, if their host is Queued
DELETE FROM watchdog
USING watchdog
INNER JOIN recipe ON watchdog.recipe_id = recipe.id
INNER JOIN machine_guest_map ON machine_guest_map.guest_recipe_id = recipe.id
INNER JOIN recipe parent ON machine_guest_map.machine_recipe_id = parent.id
WHERE parent.status = 'Queued' AND recipe.status != parent.status;
UPDATE recipe
INNER JOIN machine_guest_map ON machine_guest_map.guest_recipe_id = recipe.id
INNER JOIN recipe parent ON machine_guest_map.machine_recipe_id = parent.id
SET recipe.status = 'Queued'
WHERE parent.status = 'Queued' AND recipe.status != parent.status;
ALTER TABLE recipe
DROP FOREIGN KEY recipe_ibfk_4, -- system_id FK
DROP COLUMN system_id,
DROP FOREIGN KEY recipe_reservation_id_fk,
DROP COLUMN reservation_id;
DELETE FROM reservation
USING reservation
INNER JOIN system ON reservation.system_id = system.id
WHERE system.type = 'Virtual';
DELETE FROM system_status_duration
USING system_status_duration
INNER JOIN system ON system_status_duration.system_id = system.id
WHERE system.type = 'Virtual';
DELETE FROM system_activity
USING system_activity
INNER JOIN system ON system_activity.system_id = system.id
WHERE system.type = 'Virtual';
DELETE FROM activity
USING activity
LEFT JOIN system_activity ON activity.id = system_activity.id
WHERE type = 'system_activity' AND system_activity.id IS NULL;
DELETE FROM system
WHERE type = 'Virtual';
ALTER TABLE system
CHANGE type type ENUM('Machine', 'Resource', 'Laptop', 'Prototype') NOT NULL;
To roll back, first restore the dropped columns:
ALTER TABLE recipe
ADD COLUMN system_id INT DEFAULT NULL AFTER distro_tree_id,
ADD CONSTRAINT recipe_system_id_fk
FOREIGN KEY (system_id) REFERENCES system (id),
ADD COLUMN reservation_id INT DEFAULT NULL AFTER autopick_random,
ADD CONSTRAINT recipe_reservation_id_fk
FOREIGN KEY (reservation_id) REFERENCES reservation (id);
ALTER TABLE system
CHANGE type type ENUM('Machine', 'Virtual', 'Resource', 'Laptop', 'Prototype') NOT NULL;
Then use the CSV file you saved to re-create your Virtual system records (if you had any). Then run the following SQL to populate the restored columns:
UPDATE recipe
INNER JOIN recipe_resource ON recipe_resource.recipe_id = recipe.id
INNER JOIN system_resource ON recipe_resource.id = system_resource.id
SET recipe.system_id = system_resource.system_id,
recipe.reservation_id = system_resource.reservation_id;
UPDATE recipe
INNER JOIN recipe_resource ON recipe_resource.recipe_id = recipe.id
INNER JOIN guest_resource ON recipe_resource.id = guest_resource.id
INNER JOIN system ON recipe_resource.fqdn = system.fqdn
SET recipe.system_id = system.id;
Support virtualization managers¶
Run the following SQL:
ALTER TABLE recipe
ADD COLUMN virt_status
ENUM('Possible','Precluded','Succeeded','Skipped','Failed')
NOT NULL DEFAULT 'Possible',
ADD INDEX (virt_status);
To roll back, run the following SQL:
ALTER TABLE recipe
DROP COLUMN virt_status;