From 0d6370c5e29e8cd682631ee27c27e41ce03fa57c Mon Sep 17 00:00:00 2001 From: "gasperfele@fri1.uni-lj.si" Date: Thu, 29 Mar 2018 22:08:42 +0000 Subject: Fix some more instances of missing class_id git-svn-id: https://svn.lusy.fri.uni-lj.si/kpov-public-svn/kpov-public@424 5cf9fbd1-b2bc-434c-b4b7-e852f4f63414 --- kpov_judge/create_disk_images.py | 42 +++++++++++++++++++++------------------- 1 file changed, 22 insertions(+), 20 deletions(-) (limited to 'kpov_judge/create_disk_images.py') 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 -- cgit v1.2.1