def create_objectclass(): swift = createConnection(request) internal_data = InternalStorageManager(swift) try: class_definition = xform_header_names_on_classdef(request.json.get("objectClass")) class_name = class_definition.get("name") class_schema = class_definition.get("schema") except AttributeError: raise HttpError("malformed request", 400) if not class_name or not class_schema: raise HttpError("class name or class schema definition missing", 400) class_names = internal_data.get_keys(INTERNALOCNAME) if class_name in class_names: raise HttpError("class already exists", 422) try: Draft4Validator(CLASS_SCHEMA, format_checker=FormatChecker()).validate(class_definition) except ValidationError as e: raise HttpError("invalid class definition: {}".format(e), 400) internal_data.store_data(INTERNALOCNAME, class_name, json.dumps(class_definition)) return "", 201
def get_objectclass(class_name): swift = createConnection(request) internal_data = InternalStorageManager(swift) class_def = internal_data.get_data(INTERNALOCNAME, class_name) if not class_def: raise HttpError("class does not exist", 404) return Response(class_def, mimetype="application/json")
def delete_objectclass(class_name): swift = createConnection(request) internal_data = InternalStorageManager(swift) class_def = internal_data.get_data(INTERNALOCNAME, class_name) if not class_def: raise HttpError("class does not exist", 404) internal_data.remove_data(INTERNALOCNAME, class_name) return "", 204
def change_container(container_name): swift = createConnection(request) # TODO: check schema validity since somebody else could store a rouge class definition in the object store (via direct interfacing with the object store) try: container_definition = request.json.get("container") container_name = container_definition.get("name") except AttributeError: raise HttpError("malformed request", 400) if not container_name: raise HttpError("container name is missing", 400) containers = swift.get_container_list()[1] if container_name not in [ container.get("name") for container in containers ]: raise HttpError("container does not exist", 404) container_metadata = {} # object class try: class_name = container_definition.get("objectClass") internal_data = InternalStorageManager(swift) class_definition = internal_data.get_data(INTERNALOCNAME, class_name) if class_name: if class_definition is None: raise HttpError("class does not exist", 404) container_metadata[OBJECTCLASSFIELD] = class_name except AttributeError: pass # ignore empty or missing class definition # selected fields try: internal_fields = container_definition.get("mdfi") # print(internal_fields) if (internal_fields != None): container_metadata["x-container-meta-mdfi"] = json.dumps( internal_fields) except AttributeError: pass # ignore empty or missing class definition try: fields = container_definition.get("mdf") # print(fields) if (fields != None): container_metadata["x-container-meta-mdf"] = json.dumps(fields) except AttributeError: pass # ignore empty or missing class definition swift.create_container(container_name, container_metadata) return "", 201
def get_objectclasses(): swift = createConnection(request) internal_data = InternalStorageManager(swift) class_names = internal_data.get_keys(INTERNALOCNAME) for k in class_names: value = internal_data.get_data(INTERNALOCNAME, k) # TODO validate if invalid remove key # class_names.append(json.loads(value).get("name")) # log.debug("encountered invalid class definition stored in object store. key: {}, value: {}".format(k, value)) resp = {} resp["metadata"] = {"classCount": len(class_names)} resp["classes"] = class_names return Response(json.dumps(resp, sort_keys=True), mimetype="application/json")
def create_object(container_name): swift = createConnection(request) # returns werkzeug.datastructures.FileStorage i.e. file-like # Underlying stream is either BytesIO for small files or _TemporaryFileWrapper for large files file = request.files["objectName"] object_name = file.filename headers = {} retentionDate = request.form["retentionDate"] if retentionDate: try: dateutil.parser.parse(retentionDate) headers[RETENTIONFIELD] = retentionDate except Exception as e: log.debug( "invalid date format for form parameter retentionDate: {}". format(retentionDate)) raise HttpError( "invalid date format for form parameter retentionDate: {}". format(retentionDate), 400) class_metadata_json = request.form["metadata"] if class_metadata_json: class_metadata = json.loads(class_metadata_json) class_name = swift.get_container_metadata(container_name).get( OBJECTCLASSFIELD) if class_name: internal_data = InternalStorageManager(swift) class_definition = json.loads( internal_data.get_data(INTERNALOCNAME, class_name)) Draft4Validator( class_definition, format_checker=FormatChecker()).validate(class_metadata) for field in class_metadata.keys(): val = class_metadata[field] if val is not None: field_header = xform_header_names(field) xformed_class_name = xform_header_names(class_name) headers["X-Object-Meta-Class-" + xformed_class_name + "-" + field_header] = class_metadata[field] swift.object_upload(object_name, container_name, file, headers, as_stream=False) return "", 201
def change_container(container_name): swift = createConnection(request) # TODO: check schema validity since somebody else could store a rouge class definition in the object store (via direct interfacing with the object store) try: container_definition = request.json.get("container") container_name = container_definition.get("name") except AttributeError: raise HttpError("malformed request", 400) if not container_name: raise HttpError("container name is missing", 400) containers = swift.get_container_list()[1] if container_name not in [container.get("name") for container in containers]: raise HttpError("container does not exist", 404) container_metadata = {} # object class try: class_name = container_definition.get("objectClass") internal_data = InternalStorageManager(swift) class_definition = internal_data.get_data(INTERNALOCNAME, class_name) if class_name: if class_definition is None: raise HttpError("class does not exist", 404) container_metadata[OBJECTCLASSFIELD] = class_name except AttributeError: pass # ignore empty or missing class definition # selected fields try: internal_fields = container_definition.get("mdfi") # print(internal_fields) if (internal_fields != None): container_metadata["x-container-meta-mdfi"] = json.dumps(internal_fields) except AttributeError: pass # ignore empty or missing class definition try: fields = container_definition.get("mdf") # print(fields) if (fields != None): container_metadata["x-container-meta-mdf"] = json.dumps(fields) except AttributeError: pass # ignore empty or missing class definition swift.create_container(container_name, container_metadata) return "", 201
def create_container(): swift = createConnection(request) internal_data = InternalStorageManager(swift) # TODO: check schema validity since somebody else could store a rouge class definition in the object store (via direct interfacing with the object store) try: container_definition = request.json.get("container") container_name = container_definition.get("name") container_sdos = container_definition.get("sdos", False) except AttributeError: raise HttpError("malformed request", 400) if not container_name: raise HttpError("container name is missing", 400) if "/" in container_name: raise HttpError( "Container name contains '/'. This is only allowed in object names.", 400) containers = swift.get_container_list()[1] if container_name in [container.get("name") for container in containers]: raise HttpError("container already exists", 422) container_metadata = {} if container_sdos: container_metadata["x-container-meta-sdos"] = True try: class_name = container_definition.get("objectClass") class_definition = internal_data.get_data(INTERNALOCNAME, class_name) if class_name: if class_definition is None: raise HttpError("class does not exist", 404) container_metadata = {OBJECTCLASSFIELD: class_name} except AttributeError: pass # ignore empty or missing class definition swift.create_container(container_name, container_metadata) return "", 201
def create_container(): swift = createConnection(request) internal_data = InternalStorageManager(swift) # TODO: check schema validity since somebody else could store a rouge class definition in the object store (via direct interfacing with the object store) try: container_definition = request.json.get("container") container_name = container_definition.get("name") container_sdos = container_definition.get("sdos", False) except AttributeError: raise HttpError("malformed request", 400) if not container_name: raise HttpError("container name is missing", 400) if "/" in container_name: raise HttpError("Container name contains '/'. This is only allowed in object names.", 400) containers = swift.get_container_list()[1] if container_name in [container.get("name") for container in containers]: raise HttpError("container already exists", 422) container_metadata = {} if container_sdos: container_metadata["x-container-meta-sdos"] = True try: class_name = container_definition.get("objectClass") class_definition = internal_data.get_data(INTERNALOCNAME, class_name) if class_name: if class_definition is None: raise HttpError("class does not exist", 404) container_metadata = {OBJECTCLASSFIELD: class_name} except AttributeError: pass # ignore empty or missing class definition swift.create_container(container_name, container_metadata) return "", 201
def create_object(container_name): swift = createConnection(request) # returns werkzeug.datastructures.FileStorage i.e. file-like # Underlying stream is either BytesIO for small files or _TemporaryFileWrapper for large files file = request.files["objectName"] object_name = file.filename headers = {} retentionDate = request.form["retentionDate"] if retentionDate: try: dateutil.parser.parse(retentionDate) headers[RETENTIONFIELD] = retentionDate except Exception as e: log.debug( "invalid date format for form parameter retentionDate: {}".format(retentionDate)) raise HttpError( "invalid date format for form parameter retentionDate: {}".format(retentionDate), 400) class_metadata_json = request.form["metadata"] if class_metadata_json: class_metadata = json.loads(class_metadata_json) class_name = swift.get_container_metadata(container_name).get(OBJECTCLASSFIELD) if class_name: internal_data = InternalStorageManager(swift) class_definition = json.loads(internal_data.get_data(INTERNALOCNAME, class_name)) Draft4Validator(class_definition, format_checker=FormatChecker()).validate(class_metadata) for field in class_metadata.keys(): val = class_metadata[field] if val is not None: field_header = xform_header_names(field) xformed_class_name = xform_header_names(class_name) headers["X-Object-Meta-Class-" + xformed_class_name + "-" + field_header] = class_metadata[field] swift.object_upload(object_name, container_name, file, headers, as_stream=False) return "", 201