Ejemplo n.º 1
0
 def test_validate_request_data_incorrect_start_date(self):
     request = RequestFactory().post(
         path="/datacube_accuracy_api/",
         data=format_request_body(
             provider="blah-blah",
             start_time="invalid",  # invalid start format
             end_time="2016-01-02T00:00",
             action=utils.ACTION_CHECK,
             environment=utils.ENVIRONMENT_NEXT_STAGING,
             cube=utils.CUBE_DAILY,
             url_dimension=utils.URL_DIMENSION_YES))
     # overriding data attribute as mismatch between WSGIRequest and Django request in APIViews
     request.data = request.POST
     """
     # self.assertRaises(ValueError, utils.validate_request_data(request))
     try:
         utils.validate_request_data(request)
         self.assertFalse(True)
     except ValueError:
         self.assertTrue(True)
     """
     with self.assertRaisesMessage(
             ValueError,
             "Incorrect start_time format in request body. Please provide \'%Y-%m-%dT%H:%M\'"
     ):
         utils.validate_request_data(request)
Ejemplo n.º 2
0
def register():
    """
    Endpoint for registering a new repositor.

    Registers new information and
    updates existing repo information.
    """
    resp_dict = {
        "data": [],
        "success": True,
        "summary": "{} successfully registered"
    }
    input_json = request.get_json()
    validated_data = validate_request_data(input_json)
    if not validated_data[0]:
        resp_dict["success"] = False
        resp_dict["summary"] = validated_data[1]
        return flask.jsonify(resp_dict), 404
    try:
        status = DatabaseIngestion.store_record(input_json)
        resp_dict["data"] = status
    except Exception as e:
        resp_dict["success"] = False
        resp_dict["summary"] = "Database Ingestion Failure due to" + e
        return flask.jsonify(resp_dict), 500

    status = scan_repo(input_json)
    if status is not True:
        resp_dict["success"] = False
        resp_dict["summary"] = "New Repo Scan Initializtion Failure"
        return flask.jsonify(resp_dict), 500
    rep_summary = resp_dict["summary"].format(input_json['git_url'])
    resp_dict["summary"] = rep_summary
    return flask.jsonify(resp_dict), 200
Ejemplo n.º 3
0
    def post(self, request, format=None):
        try:
            utils.validate_request_data(request)
        except ValueError as e:
            response_data = dict()
            # standard format to be followed for custom exceptions
            response_data[
                'message'] = "Exception : " + e.__class__.__name__ + " :- " + e.__str__(
                )
            utils.LOGGER.error("Validation during validation: " +
                               response_data['message'])
            return Response(response_data, status=status.HTTP_400_BAD_REQUEST)
        finally:
            pass

        # process the request as per action value passed in body
        return utils.process_request(request)
Ejemplo n.º 4
0
 def test_validate_request_data(self):
     request = RequestFactory().post(
         path="/datacube_accuracy_api/",
         data=format_request_body(
             provider="blah-blah",
             start_time="2016-01-01T00:00",
             end_time="2016-01-02T00:00",
             action=utils.ACTION_CHECK,
             environment=utils.ENVIRONMENT_NEXT_STAGING,
             cube=utils.CUBE_DAILY,
             url_dimension=utils.URL_DIMENSION_YES))
     # overriding data attribute as mismatch between WSGIRequest and Django request in APIViews
     request.data = request.POST
     try:
         utils.validate_request_data(request)
     except ValueError:
         self.assertTrue(False)
Ejemplo n.º 5
0
 def test_validate_request_data_incorrect_cube(self):
     request = RequestFactory().post(
         path="/datacube_accuracy_api/",
         data=format_request_body(
             provider="blah-blah",
             start_time="2016-01-01T00:00",
             end_time="2016-01-02T00:00",
             action=utils.ACTION_CHECK,
             environment=utils.ENVIRONMENT_NEXT_STAGING,
             cube="some incorrect value",
             url_dimension=utils.URL_DIMENSION_YES))
     # overriding data attribute as mismatch between WSGIRequest and Django request in APIViews
     request.data = request.POST
     with self.assertRaisesMessage(ValueError,
                                   "Incorrect 'cube' : " + "some incorrect value" + " value. Should be either " \
                                   + utils.CUBE_MIN_15 + "/" + utils.CUBE_DAILY + "/" + utils.CUBE_WEEKLY):
         utils.validate_request_data(request)
Ejemplo n.º 6
0
 def test_validate_request_data_incorrect_date_range(self):
     request = RequestFactory().post(
         path="/datacube_accuracy_api/",
         data=format_request_body(
             provider="blah-blah",
             start_time="2016-01-02T00:00",
             end_time="2016-01-01T00:00",
             action=utils.ACTION_CHECK,
             environment=utils.ENVIRONMENT_NEXT_STAGING,
             cube=utils.CUBE_DAILY,
             url_dimension=utils.URL_DIMENSION_YES))
     # overriding data attribute as mismatch between WSGIRequest and Django request in APIViews
     request.data = request.POST
     with self.assertRaisesMessage(
             ValueError,
             "start_time:2016-01-02T00:00 is greater than end_time:2016-01-01T00:00"
             " in request body"):
         utils.validate_request_data(request)
Ejemplo n.º 7
0
def register():
    """
    Endpoint for registering a new repository.

    Registers new information and
    updates existing repo information.
    """
    resp_dict = {"success": True, "summary": ""}
    input_json = request.get_json()
    if request.content_type != 'application/json':
        resp_dict["success"] = False
        resp_dict["summary"] = "Set content type to application/json"
        return flask.jsonify(resp_dict), 400

    validated_data = validate_request_data(input_json)
    if not validated_data[0]:
        resp_dict["success"] = False
        resp_dict["summary"] = validated_data[1]
        return flask.jsonify(resp_dict), 404

    try:
        repo_info = DatabaseIngestion.get_info(input_json.get('git-url'))
        if repo_info.get('is_valid'):
            data = repo_info.get('data')
            # Update the record to reflect new git_sha if any.
            DatabaseIngestion.update_data(input_json)
        else:
            try:
                # First time ingestion
                DatabaseIngestion.store_record(input_json)
                status = scan_repo(input_json)
                if status is not True:
                    resp_dict["success"] = False
                    resp_dict[
                        "summary"] = "New Repo Scan Initialization Failure"
                    return flask.jsonify(resp_dict), 500

                resp_dict["summary"] = "Repository {} with commit-hash {} " \
                                       "has been successfully registered. " \
                                       "Please check back for report after some time." \
                    .format(input_json.get('git-url'),
                            input_json.get('git-sha'))

                return flask.jsonify(resp_dict), 200
            except Exception as e:
                resp_dict["success"] = False
                resp_dict["summary"] = "Database Ingestion Failure due to: {}" \
                    .format(e)
                return flask.jsonify(resp_dict), 500
    except Exception as e:
        resp_dict["success"] = False
        resp_dict["summary"] = "Cannot get information about repository {} " \
                               "due to {}" \
            .format(input_json.get('git-url'), e)
        return flask.jsonify(resp_dict), 500

    # Scan the repository irrespective of report is available or not.
    status = scan_repo(input_json)
    if status is not True:
        resp_dict["success"] = False
        resp_dict["summary"] = "New Repo Scan Initialization Failure"
        return flask.jsonify(resp_dict), 500

    resp_dict.update({
        "summary":
        "Repository {} was already registered, but no report for "
        "commit-hash {} was found. Please check back later.".format(
            input_json.get('git-url'), input_json.get('git-sha')),
        "last_scanned_at":
        data['last_scanned_at'],
        "last_scan_report":
        None
    })

    return flask.jsonify(resp_dict), 200