Skip to content

Commit 5ff4e74

Browse files
committed
chore: extend smoke script for purge-backups
Also mark purge-backups smoke complete in TODO.md and sync uv.lock version.
1 parent 773e896 commit 5ff4e74

3 files changed

Lines changed: 130 additions & 2 deletions

File tree

TODO.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
- [ ] **Final smoke runs**
2323
- [x] Promotion verify-before-promote + rollback (`scripts/release_smoke.sh`)
2424
- [x] Worker API mode dry-run with token (`scripts/release_smoke.sh`)
25-
- [ ] `purge-backups` dry-run then apply on known-old promoted items
25+
- [x] `purge-backups` dry-run then apply (smoke: temp DB + promoted files)
2626

2727
## High Priority
2828

scripts/release_smoke.sh

Lines changed: 128 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,4 +118,132 @@ uv run mediaforce run "$TMP_ROOT" \
118118

119119
kill "$WEB_PID" >/dev/null 2>&1 || true
120120

121+
echo "[smoke] Purge backups (DB-driven)"
122+
123+
PURGE_LIB_DIR="$TMP_ROOT/purge/library"
124+
PURGE_TRANSCODE_DIR="$TMP_ROOT/purge/transcode"
125+
mkdir -p "$PURGE_LIB_DIR" "$PURGE_TRANSCODE_DIR"
126+
127+
PURGE_SOURCE="$PURGE_LIB_DIR/purge-source.mp4"
128+
PURGE_ENCODED="$PURGE_TRANSCODE_DIR/purge-source.AV1.mp4"
129+
130+
ffmpeg -y \
131+
-f lavfi -i testsrc2=size=640x360:rate=30 \
132+
-f lavfi -i sine=frequency=220:sample_rate=44100 \
133+
-t 10 \
134+
-c:v libx264 -pix_fmt yuv420p -preset veryfast \
135+
-c:a aac -shortest \
136+
"$PURGE_SOURCE" >/dev/null 2>&1
137+
138+
ffmpeg -y -i "$PURGE_SOURCE" -t 10 \
139+
-c:v libaom-av1 -cpu-used 8 -b:v 1M -minrate 1M -maxrate 1M -bufsize 2M -row-mt 1 \
140+
-c:a aac -b:a 96k \
141+
"$PURGE_ENCODED" >/dev/null 2>&1
142+
143+
export PURGE_SOURCE PURGE_ENCODED PURGE_LIB_DIR
144+
145+
PROMOTE_JSON="$(
146+
uv run python - <<-'PY'
147+
import json
148+
import logging
149+
import os
150+
import pathlib
151+
from mediaforce.services.promote import promote_encoded_file_atomic
152+
153+
source = pathlib.Path(os.environ["PURGE_SOURCE"])
154+
encoded = pathlib.Path(os.environ["PURGE_ENCODED"])
155+
dest = pathlib.Path(os.environ["PURGE_LIB_DIR"]) / encoded.name
156+
157+
logger = logging.getLogger("mediaforce.smoke")
158+
logger.handlers.clear()
159+
logger.addHandler(logging.NullHandler())
160+
logger.propagate = False
161+
logger.setLevel(logging.CRITICAL)
162+
163+
result, rollback_state = promote_encoded_file_atomic(
164+
source_path=source,
165+
encoded_path=encoded,
166+
dest_path=dest,
167+
dry_run=False,
168+
move_original_to_backup=True,
169+
rename_sidecars=False,
170+
verify=True,
171+
logger=logger,
172+
)
173+
174+
assert rollback_state is not None
175+
assert result.backup_source_path is not None
176+
177+
print(
178+
json.dumps(
179+
{
180+
"source": str(source),
181+
"dest": str(result.dest_path),
182+
"backup": str(result.backup_source_path),
183+
},
184+
ensure_ascii=False,
185+
)
186+
)
187+
PY
188+
)"
189+
190+
export PROMOTE_JSON
191+
192+
PURGE_SOURCE_PATH="$(python -c 'import json,os; print(json.loads(os.environ["PROMOTE_JSON"])["source"])')"
193+
PURGE_PROMOTED_PATH="$(python -c 'import json,os; print(json.loads(os.environ["PROMOTE_JSON"])["dest"])')"
194+
PURGE_BACKUP_PATH="$(python -c 'import json,os; print(json.loads(os.environ["PROMOTE_JSON"])["backup"])')"
195+
196+
export PURGE_SOURCE_PATH PURGE_PROMOTED_PATH PURGE_BACKUP_PATH
197+
198+
HOME_OVERRIDE="$TMP_ROOT/home"
199+
mkdir -p "$HOME_OVERRIDE"
200+
201+
HOME="$HOME_OVERRIDE" uv run python - <<'PY'
202+
import os
203+
from datetime import datetime, timedelta
204+
from pathlib import Path
205+
206+
from sqlmodel import Session
207+
208+
from mediaforce.db.models import EncodeResult, ensure_schema, init_engine
209+
210+
db = Path.home() / ".config" / "mediaforce" / "mediaforce.db"
211+
engine = init_engine(str(db))
212+
ensure_schema(engine)
213+
214+
promoted_at = (datetime.now() - timedelta(days=1)).isoformat()
215+
216+
with Session(engine) as session:
217+
session.add(
218+
EncodeResult(
219+
source_id=1,
220+
source_path=os.environ["PURGE_SOURCE_PATH"],
221+
output_path=os.environ["PURGE_PROMOTED_PATH"],
222+
output_size_bytes=1234,
223+
tier="good",
224+
crf=28,
225+
preset=5,
226+
film_grain=8,
227+
promoted=True,
228+
promoted_at=promoted_at,
229+
promoted_path=os.environ["PURGE_PROMOTED_PATH"],
230+
source_backup_path=os.environ["PURGE_BACKUP_PATH"],
231+
)
232+
)
233+
session.commit()
234+
PY
235+
236+
HOME="$HOME_OVERRIDE" uv run mediaforce purge-backups --older-than-days 0 --limit 10 >/dev/null
237+
HOME="$HOME_OVERRIDE" uv run mediaforce purge-backups --older-than-days 0 --limit 10 --apply >/dev/null
238+
239+
if [ -f "$PURGE_BACKUP_PATH" ]; then
240+
echo "[smoke] purge-backups failed: backup still exists at $PURGE_BACKUP_PATH" >&2
241+
exit 1
242+
fi
243+
244+
if [ ! -f "$PURGE_PROMOTED_PATH" ]; then
245+
echo "[smoke] purge-backups failed: promoted missing at $PURGE_PROMOTED_PATH" >&2
246+
exit 1
247+
fi
248+
121249
echo "[smoke] OK"

uv.lock

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)