Initial commit: MetaVox loadtest playbook
Ansible playbook voor het opzetten van een MetaVox loadtest omgeving: - 50 teamfolders met 10.000 bestanden elk (500K totaal) - 100 metadata velddefinities (10 teamfolder + 90 file-level) - 3-niveau mappenstructuur (10 hoofdmappen x 3 submappen) - ~43M metadata records via directe MySQL inserts - Geoptimaliseerde database indexes (7 redundante indexes gedropt) Gebruikt directe filesystem writes en MySQL inserts i.p.v. WebDAV/API voor maximale performance. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
80
templates/cleanup_metadata.py.j2
Normal file
80
templates/cleanup_metadata.py.j2
Normal file
@@ -0,0 +1,80 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
MetaVox Metadata Cleanup Script
|
||||
Verwijdert metadata-velddefinities via de OCS API.
|
||||
"""
|
||||
|
||||
import json
|
||||
import sys
|
||||
import time
|
||||
import requests
|
||||
from requests.auth import HTTPBasicAuth
|
||||
|
||||
NC_URL = "{{ nextcloud_url }}"
|
||||
NC_USER = "{{ nextcloud_admin_user }}"
|
||||
NC_PASS = "{{ nextcloud_admin_password }}"
|
||||
TIMEOUT = {{ http_timeout }}
|
||||
|
||||
WEB_API_BASE = f"{NC_URL}/index.php/apps/metavox/api"
|
||||
OCS_BASE = f"{NC_URL}/ocs/v2.php/apps/metavox/api/v1"
|
||||
|
||||
AUTH = HTTPBasicAuth(NC_USER, NC_PASS)
|
||||
HEADERS = {
|
||||
"OCS-APIRequest": "true",
|
||||
"Accept": "application/json",
|
||||
}
|
||||
|
||||
TF_FIELDS = json.loads("""{{ teamfolder_metadata_fields | to_json }}""")
|
||||
FILE_FIELDS = json.loads("""{{ file_metadata_fields | to_json }}""")
|
||||
|
||||
FIELD_NAMES_TO_DELETE = set(f["name"] for f in TF_FIELDS + FILE_FIELDS)
|
||||
|
||||
|
||||
def get_all_fields():
|
||||
url = f"{OCS_BASE}/groupfolder-fields"
|
||||
try:
|
||||
resp = requests.get(url, auth=AUTH, headers=HEADERS, timeout=TIMEOUT)
|
||||
if resp.status_code == 200:
|
||||
data = resp.json()
|
||||
if "ocs" in data and "data" in data["ocs"]:
|
||||
return data["ocs"]["data"]
|
||||
except Exception as e:
|
||||
print(f"[ERROR] Ophalen velden: {e}")
|
||||
return []
|
||||
|
||||
|
||||
def delete_field(field_id):
|
||||
url = f"{WEB_API_BASE}/groupfolder-fields/{field_id}"
|
||||
try:
|
||||
resp = requests.delete(url, auth=AUTH, headers=HEADERS, timeout=TIMEOUT)
|
||||
return resp.status_code in [200, 204, 404]
|
||||
except Exception as e:
|
||||
print(f" [ERROR] Verwijderen veld {field_id}: {e}")
|
||||
return False
|
||||
|
||||
|
||||
def main():
|
||||
print("MetaVox Metadata Cleanup")
|
||||
print("=" * 40)
|
||||
|
||||
fields = get_all_fields()
|
||||
print(f"Gevonden: {len(fields)} velden totaal")
|
||||
|
||||
deleted = 0
|
||||
skipped = 0
|
||||
for field in fields:
|
||||
fname = field.get("field_name", "")
|
||||
fid = field.get("id")
|
||||
if fname in FIELD_NAMES_TO_DELETE and fid:
|
||||
if delete_field(fid):
|
||||
deleted += 1
|
||||
else:
|
||||
print(f" [FAIL] Kon veld '{fname}' (id={fid}) niet verwijderen")
|
||||
else:
|
||||
skipped += 1
|
||||
|
||||
print(f"\n{deleted} velden deleted, {skipped} overgeslagen")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
Reference in New Issue
Block a user