summaryrefslogtreecommitdiff
path: root/kpov_judge/create_disk_images.py
diff options
context:
space:
mode:
Diffstat (limited to 'kpov_judge/create_disk_images.py')
-rwxr-xr-xkpov_judge/create_disk_images.py42
1 files changed, 22 insertions, 20 deletions
diff --git a/kpov_judge/create_disk_images.py b/kpov_judge/create_disk_images.py
index d28ef1d..c9d433f 100755
--- a/kpov_judge/create_disk_images.py
+++ b/kpov_judge/create_disk_images.py
@@ -13,13 +13,13 @@ import subprocess
import fcntl
from util import write_default_config
-def get_prepare_disks(db, task_id):
- prepare_disks_source = db.prepare_disks.find_one({'task_id':task_id})['source']
+def get_prepare_disks(db, class_id, task_id):
+ prepare_disks_source = db.prepare_disks.find_one({'class_id': class_id, 'task_id':task_id})['source']
prepare_disks_code = compile(prepare_disks_source, 'prepare_disks.py', 'exec')
exec(prepare_disks_code)
return prepare_disks
-def create_snapshot(task_id, student_id, disk_name, overwrite = True, cow = False):
+def create_snapshot(class_id, task_id, student_id, disk_name, overwrite = True, cow = False):
print(os.path.join(settings.DISK_TEMPLATE_PATH, disk_name) + '.*')
template_paths = glob.glob(os.path.join(settings.DISK_TEMPLATE_PATH, disk_name) + '.*')
filtered_paths = filter((lambda x: os.path.splitext(x)[1] == '.' + settings.STUDENT_DISK_FORMAT), template_paths)
@@ -28,11 +28,11 @@ def create_snapshot(task_id, student_id, disk_name, overwrite = True, cow = Fals
else:
template_path = template_paths[0]
if cow:
- d = os.path.join(student_id, task_id, disk_name) + os.path.splitext(template_path)[1]
+ d = os.path.join(student_id, class_id, task_id, disk_name) + os.path.splitext(template_path)[1]
else:
- d = os.path.join(student_id, task_id, disk_name) + '.qcow2'
+ d = os.path.join(student_id, class_id, task_id, disk_name) + '.qcow2'
try:
- os.makedirs(os.path.join(settings.STUDENT_DISK_PATH, student_id, task_id))
+ os.makedirs(os.path.join(settings.STUDENT_DISK_PATH, student_id, class_id, task_id))
except:
pass
disk_file = os.path.join(settings.STUDENT_DISK_PATH, d)
@@ -61,7 +61,7 @@ def publish_snapshot(d):
if __name__ == '__main__':
if len(sys.argv) != 1:
print "Usage: {0}"
- print "Create the neccessarry disk images"
+ print "Create the pending disk images"
db = pymongo.MongoClient(settings.DB_HOST).kpov
try:
db.authenticate(settings.USERNAME, settings.PASSWORD)
@@ -69,26 +69,26 @@ if __name__ == '__main__':
print str(e)
dev_prefix = settings.GUESTFS_DEV_PREFIX
l = db.student_computers.find({"disk_urls": {"$exists": False}})
- computers_by_task_student = dict()
+ computers_by_class_task_student = dict()
for computer in l:
- student_id, task_id = computer['student_id'], computer['task_id']
- if (task_id, student_id) not in computers_by_task_student:
- computers_by_task_student[(task_id, student_id)] = list()
- computers_by_task_student[(task_id, student_id)].append(computer)
- for (task_id, student_id), computers in computers_by_task_student.iteritems():
- print "Creating", task_id, " for ", student_id
- l = db.student_computers.find_one({'task_id': task_id, 'student_id':student_id, "disk_urls": {"$exists": False}})
+ student_id, task_id, class_id = computer['student_id'], computer['task_id'], computer['class_id']
+ if (class_id, task_id, student_id) not in computers_by_class_task_student:
+ computers_by_class_task_student[(class_id, task_id, student_id)] = list()
+ computers_by_class_task_student[(class_id, task_id, student_id)].append(computer)
+ for (class_id, task_id, student_id), computers in computers_by_class_task_student.items():
+ print "Creating {}/{} for {}".format(class_id, task_id, student_id)
+ l = db.student_computers.find_one({'class_id': class_id, 'task_id': task_id, 'student_id':student_id, "disk_urls": {"$exists": False}})
if l is None:
continue
lock_file = os.path.join(settings.STUDENT_LOCKFILE_PATH,
- '{0}-{1}.lock'.format(student_id, task_id))
+ '{0}-{1}-{2}.lock'.format(student_id, class_id, task_id))
lock_fp = open(lock_file, 'w')
try:
fcntl.lockf(lock_fp, fcntl.LOCK_EX | fcntl.LOCK_NB)
except IOError:
continue
- task_params = db.task_params.find_one({'task_id': task_id, 'student_id': student_id})['params']
- prepare_disks = get_prepare_disks(db, task_id)
+ task_params = db.task_params.find_one({'class_id': class_id, 'task_id': task_id, 'student_id': student_id})['params']
+ prepare_disks = get_prepare_disks(db, class_id, task_id)
# tule odpri, ustvari snapshote za vajo
templates = dict()
all_disks = dict()
@@ -104,7 +104,7 @@ if __name__ == '__main__':
g = guestfs.GuestFS()
for disk in computer['disks']:
lock_fp.write("register " + disk['name'] + '\n')
- snap = create_snapshot(task_id, student_id, disk['name'],
+ snap = create_snapshot(class_id, task_id, student_id, disk['name'],
cow = settings.STUDENT_DISK_COW)
snap_file = os.path.join(settings.STUDENT_DISK_PATH, snap)
if 'options' in disk:
@@ -149,9 +149,10 @@ if __name__ == '__main__':
lock_fp.write("preparing disks\n")
global_params = {
'task_name': task_id,
+ 'class_id': class_id,
'username': student_id}
if 'TASK_URL' in vars(settings):
- global_params['task_url'] = settings.TASK_URL
+ global_params['task_url'] = settings.TASK_URL + '/' + class_id + '/'
prepare_disks(templates, task_params, global_params)
# pospravi za seboj.
lock_fp.write("unmounting\n")
@@ -171,6 +172,7 @@ if __name__ == '__main__':
"disk_urls": {"$exists": False},
'student_id': student_id,
'task_id': task_id,
+ 'class_id': class_id,
'name': comp_name},
{'$set': { 'disk_urls': disk_urls }})
# print "done for ", student_id, task_id