def create_volume(email, name, description, blocksize, **attrs): caller_user = _check_authenticated(attrs) # user must exist user = read_user(email) if user is None: raise Exception("No such user '%s'" % email) # a user can only create volumes for herself (admin can for anyone) if caller_user.owner_id != user.owner_id and not caller_user.is_admin: raise Exception("Caller cannot create Volumes for other users") # check quota for this user user_volume_ids = list_accessible_volumes(email, caller_user=caller_user, projection=['volume_id']) if len(user_volume_ids) > user.get_volume_quota(): raise Exception("User '%s' has exceeded Volume quota %s" % (email, user.get_volume_quota())) new_volume_key = Volume.Create(user, blocksize=blocksize, name=name, description=description, **attrs) if new_volume_key != None: # create succeed. Make a root directory volume = new_volume_key.get() MSEntry.MakeRoot(user.owner_id, volume) return new_volume_key.get() else: raise Exception("Failed to create Volume")
rc = verify_data(user.public_key, root_inode_nosig, root_inode_sig) if not rc: raise Exception("Root inode not signed by user '%s'" % (user.email)) # finally, verify that the name is *not* numeric tmp = None try: tmp = int(volume_cert.name) except: pass if tmp is not None: raise Exception("Invalid volume name '%s'" % volume_cert.name) new_volume_key = Volume.Create(user, volume_cert) if new_volume_key is not None: volume = new_volume_key.get() # put the root inode MSEntry.MakeRoot(user.owner_id, volume, volume_cert.root) # put the cert bundle VolumeCertBundle.Put(volume.volume_id, cert_bundle_bin) return volume else: raise Exception("Failed to create Volume")