Dateien
Hetzner-Backup/v2_adminpanel/migrate_existing_licenses.sql
2025-06-09 04:09:59 +02:00

263 Zeilen
9.4 KiB
SQL

-- Migration Script für bestehende Lizenzen
-- Setzt Default-Werte für Resource Counts
-- Stand: 2025-06-09
-- ====================================
-- Prüfe ob Migration notwendig ist
-- ====================================
DO $$
DECLARE
licenses_without_resources INT;
total_licenses INT;
BEGIN
-- Zähle Lizenzen ohne Resource-Count Werte
SELECT COUNT(*) INTO licenses_without_resources
FROM licenses
WHERE domain_count IS NULL
OR ipv4_count IS NULL
OR phone_count IS NULL;
SELECT COUNT(*) INTO total_licenses FROM licenses;
IF licenses_without_resources > 0 THEN
RAISE NOTICE 'Migration notwendig für % von % Lizenzen', licenses_without_resources, total_licenses;
ELSE
RAISE NOTICE 'Keine Migration notwendig - alle Lizenzen haben bereits Resource Counts';
RETURN;
END IF;
END $$;
-- ====================================
-- Setze Default Resource Counts
-- ====================================
-- Vollversionen erhalten standardmäßig je 2 Ressourcen
UPDATE licenses
SET domain_count = COALESCE(domain_count, 2),
ipv4_count = COALESCE(ipv4_count, 2),
phone_count = COALESCE(phone_count, 2)
WHERE license_type = 'full'
AND (domain_count IS NULL OR ipv4_count IS NULL OR phone_count IS NULL);
-- Testversionen erhalten standardmäßig je 1 Ressource
UPDATE licenses
SET domain_count = COALESCE(domain_count, 1),
ipv4_count = COALESCE(ipv4_count, 1),
phone_count = COALESCE(phone_count, 1)
WHERE license_type = 'test'
AND (domain_count IS NULL OR ipv4_count IS NULL OR phone_count IS NULL);
-- Inaktive Lizenzen erhalten 0 Ressourcen
UPDATE licenses
SET domain_count = COALESCE(domain_count, 0),
ipv4_count = COALESCE(ipv4_count, 0),
phone_count = COALESCE(phone_count, 0)
WHERE is_active = FALSE
AND (domain_count IS NULL OR ipv4_count IS NULL OR phone_count IS NULL);
-- ====================================
-- Erstelle Resource-Zuweisungen für bestehende aktive Lizenzen
-- ====================================
DO $$
DECLARE
license_rec RECORD;
resource_rec RECORD;
resources_assigned INT := 0;
resources_needed INT;
BEGIN
-- Durchlaufe alle aktiven Lizenzen mit Resource Counts > 0
FOR license_rec IN
SELECT id, domain_count, ipv4_count, phone_count
FROM licenses
WHERE is_active = TRUE
AND (domain_count > 0 OR ipv4_count > 0 OR phone_count > 0)
ORDER BY created_at
LOOP
-- Domains zuweisen
resources_needed := license_rec.domain_count;
FOR i IN 1..resources_needed LOOP
-- Finde eine verfügbare Domain
SELECT id INTO resource_rec
FROM resource_pools
WHERE resource_type = 'domain'
AND status = 'available'
ORDER BY RANDOM()
LIMIT 1;
IF resource_rec.id IS NOT NULL THEN
-- Weise Resource zu
UPDATE resource_pools
SET status = 'allocated',
allocated_to_license = license_rec.id,
status_changed_at = NOW(),
status_changed_by = 'migration'
WHERE id = resource_rec.id;
-- Erstelle Zuordnung
INSERT INTO license_resources (license_id, resource_id, assigned_by)
VALUES (license_rec.id, resource_rec.id, 'migration');
-- Historie eintragen
INSERT INTO resource_history (resource_id, license_id, action, action_by, details)
VALUES (resource_rec.id, license_rec.id, 'allocated', 'migration',
'{"reason": "Migration bestehender Lizenzen"}'::jsonb);
resources_assigned := resources_assigned + 1;
END IF;
END LOOP;
-- IPv4-Adressen zuweisen
resources_needed := license_rec.ipv4_count;
FOR i IN 1..resources_needed LOOP
SELECT id INTO resource_rec
FROM resource_pools
WHERE resource_type = 'ipv4'
AND status = 'available'
ORDER BY RANDOM()
LIMIT 1;
IF resource_rec.id IS NOT NULL THEN
UPDATE resource_pools
SET status = 'allocated',
allocated_to_license = license_rec.id,
status_changed_at = NOW(),
status_changed_by = 'migration'
WHERE id = resource_rec.id;
INSERT INTO license_resources (license_id, resource_id, assigned_by)
VALUES (license_rec.id, resource_rec.id, 'migration');
INSERT INTO resource_history (resource_id, license_id, action, action_by, details)
VALUES (resource_rec.id, license_rec.id, 'allocated', 'migration',
'{"reason": "Migration bestehender Lizenzen"}'::jsonb);
resources_assigned := resources_assigned + 1;
END IF;
END LOOP;
-- Telefonnummern zuweisen
resources_needed := license_rec.phone_count;
FOR i IN 1..resources_needed LOOP
SELECT id INTO resource_rec
FROM resource_pools
WHERE resource_type = 'phone'
AND status = 'available'
ORDER BY RANDOM()
LIMIT 1;
IF resource_rec.id IS NOT NULL THEN
UPDATE resource_pools
SET status = 'allocated',
allocated_to_license = license_rec.id,
status_changed_at = NOW(),
status_changed_by = 'migration'
WHERE id = resource_rec.id;
INSERT INTO license_resources (license_id, resource_id, assigned_by)
VALUES (license_rec.id, resource_rec.id, 'migration');
INSERT INTO resource_history (resource_id, license_id, action, action_by, details)
VALUES (resource_rec.id, license_rec.id, 'allocated', 'migration',
'{"reason": "Migration bestehender Lizenzen"}'::jsonb);
resources_assigned := resources_assigned + 1;
END IF;
END LOOP;
END LOOP;
RAISE NOTICE 'Migration abgeschlossen: % Ressourcen wurden zugewiesen', resources_assigned;
END $$;
-- ====================================
-- Abschlussbericht
-- ====================================
DO $$
DECLARE
v_total_licenses INT;
v_licenses_with_resources INT;
v_total_resources_assigned INT;
v_domains_assigned INT;
v_ipv4_assigned INT;
v_phones_assigned INT;
BEGIN
-- Statistiken sammeln
SELECT COUNT(*) INTO v_total_licenses FROM licenses;
SELECT COUNT(*) INTO v_licenses_with_resources
FROM licenses
WHERE id IN (SELECT DISTINCT license_id FROM license_resources WHERE is_active = TRUE);
SELECT COUNT(*) INTO v_total_resources_assigned
FROM license_resources
WHERE is_active = TRUE;
SELECT COUNT(*) INTO v_domains_assigned
FROM resource_pools
WHERE resource_type = 'domain' AND status = 'allocated';
SELECT COUNT(*) INTO v_ipv4_assigned
FROM resource_pools
WHERE resource_type = 'ipv4' AND status = 'allocated';
SELECT COUNT(*) INTO v_phones_assigned
FROM resource_pools
WHERE resource_type = 'phone' AND status = 'allocated';
-- Bericht ausgeben
RAISE NOTICE '';
RAISE NOTICE '========================================';
RAISE NOTICE 'MIGRATION ABGESCHLOSSEN';
RAISE NOTICE '========================================';
RAISE NOTICE 'Lizenzen gesamt: %', v_total_licenses;
RAISE NOTICE 'Lizenzen mit Ressourcen: %', v_licenses_with_resources;
RAISE NOTICE '';
RAISE NOTICE 'Zugewiesene Ressourcen:';
RAISE NOTICE '- Domains: %', v_domains_assigned;
RAISE NOTICE '- IPv4-Adressen: %', v_ipv4_assigned;
RAISE NOTICE '- Telefonnummern: %', v_phones_assigned;
RAISE NOTICE '- Gesamt: %', v_total_resources_assigned;
RAISE NOTICE '========================================';
-- Warnungen ausgeben
IF EXISTS (
SELECT 1 FROM licenses l
WHERE l.is_active = TRUE
AND (l.domain_count > 0 OR l.ipv4_count > 0 OR l.phone_count > 0)
AND NOT EXISTS (
SELECT 1 FROM license_resources lr
WHERE lr.license_id = l.id AND lr.is_active = TRUE
)
) THEN
RAISE WARNING 'ACHTUNG: Einige aktive Lizenzen konnten keine Ressourcen erhalten (möglicherweise nicht genug verfügbar)';
-- Liste betroffene Lizenzen auf
FOR v_total_licenses IN
SELECT l.id FROM licenses l
WHERE l.is_active = TRUE
AND (l.domain_count > 0 OR l.ipv4_count > 0 OR l.phone_count > 0)
AND NOT EXISTS (
SELECT 1 FROM license_resources lr
WHERE lr.license_id = l.id AND lr.is_active = TRUE
)
LOOP
RAISE WARNING 'Lizenz ID % hat keine Ressourcen erhalten', v_total_licenses;
END LOOP;
END IF;
END $$;
-- ====================================
-- Audit Log Eintrag für Migration
-- ====================================
INSERT INTO audit_log (
timestamp,
username,
action,
entity_type,
additional_info
) VALUES (
NOW(),
'system',
'MIGRATION',
'licenses',
'Resource Pool Migration für bestehende Lizenzen durchgeführt'
);