1#!/usr/bin/env python3
2"""Measure a disposable Windows clone through completed desktop provisioning."""
3import argparse
4import json
5import time
6import vms
7
8parser = argparse.ArgumentParser(description=__doc__)
9parser.add_argument('preset')
10parser.add_argument('name')
11args = parser.parse_args()
12spec = {'name': args.name, 'description': 'Disposable Win10 provisioning benchmark', 'image': args.preset,
13 'vcpus': 4, 'memory': 4 * 2**30, 'disk': 64 * 2**30, 'autostart': False, 'start': True,
14 'mode': 'preset', 'firmware': 'uefi', 'platform': 'windows', 'owner': 'fixture-user', 'username': 'fixture'}
15vms.validate('create', spec)
16started = time.monotonic()
17print(json.dumps({'event': 'requested', 'timestamp': time.time(), 'name': args.name}), flush=True)
18vms.create(spec)
19print(json.dumps({'event': 'created', 'seconds': round(time.monotonic() - started, 2)}), flush=True)
20previous = None
21while time.monotonic() - started < 120:
22 stage = vms.windows_setup(args.name)
23 if stage != previous:
24 print(json.dumps({'event': stage, 'seconds': round(time.monotonic() - started, 2)}), flush=True)
25 previous = stage
26 if stage == 'failed':
27 raise RuntimeError('Guest provisioning failed; inspect C:\\Snowglobe\\setup.log.')
28 if stage == 'ready':
29 if time.monotonic() - started >= 60:
30 raise RuntimeError('Completed provisioning exceeded 60 seconds.')
31 break
32 time.sleep(.5)
33else:
34 raise TimeoutError('Guest provisioning did not finish.')