--- /dev/null
+# Copyright 2019 Nokia
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+import inspect
+import six
+from flask import request
+from flask_restful import reqparse
+from werkzeug.exceptions import BadRequest
+
+from yarf.baseresource import BaseResource
+
+class RequestArgument(object):
+ """ More advanced arguments
+ Parameters:
+ name: Name of the argument
+ default: The default value if not defined
+ validate: function pointer to a validation function that will
+ be called to validate the argument.
+ The function should return tuple containing
+ status: (boolean) True if validation passed
+ False if not
+ reason: (string) Setting the reasoning for the
+ failure
+ typeof: The typeof the argument. The argument will be converted
+ to the type you define. Should be a function pointer
+ """
+ def __init__(self, name, default=None, validate=None, typeof=lambda x: six.text_type(x)):
+ self.argument_class = reqparse.Argument(name=name, default=default, type=typeof)
+ if validate and inspect.isfunction(validate):
+ self.validate_func = validate
+ else:
+ self.validate_func = None
+ self.name = name
+
+ def validate(self, value):
+ if not self.validate_func:
+ return
+ status, reason = self.validate_func(value)
+ if not status:
+ raise BadRequest(description=reason)
+
+class RestResource(BaseResource):
+ """ Class from which the plugins should inherit
+ Variables:
+ extra_wrappers: are function wrappers that will
+ be executed when any function is
+ executed by the frame (for example
+ get)
+ parser_arguments: Are the arguments that can be defined
+ if you need arguments for your plugin
+ these arguments can be fetched with
+ get_args
+ """
+ extra_wrappers = []
+ parser_arguments = []
+ endpoints = None
+ int_arg_class = RequestArgument
+
+ """ Function to get arguments from request
+ The function will call validate to the
+ arguments if they are of type RequestArgument
+ Returns: A dictionary of the arguments
+ """
+ @classmethod
+ def get_args(cls):
+ args = cls.parser.parse_args()
+ for arg in args.keys():
+ for parg in cls.parser_arguments:
+ if isinstance(parg, cls.int_arg_class) and parg.name == arg:
+ parg.validate(args[arg])
+ return args
+
+ @classmethod
+ def get_token(cls):
+ token = ""
+ try:
+ token = request.headers.get("X-Auth-Token", type=str)
+ except KeyError as err:
+ cls.logger.info("Failed to get auth token from request.")
+ return token
+