Пример #1
0
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
Пример #2
0
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
Пример #3
0
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")
Пример #4
0
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")
Пример #5
0
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
Пример #6
0
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
Пример #7
0
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
Пример #8
0
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")
Пример #9
0
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")
Пример #10
0
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
Пример #11
0
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
Пример #12
0
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
Пример #13
0
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
Пример #14
0
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