def setUp(self):
     _start_time = time.time()
     self.api_url = f"https://{os.environ['API_HOST']}/v1"
     self.upload_config = UploadConfig()
     self.auth_headers = {'Api-Key': self.upload_config.api_key}
     self.deployment_stage = os.environ['DEPLOYMENT_STAGE']
     self.upload_area_uuid = "deadbeef-dead-dead-dead-%012d" % random.randint(
         0, 999999999999)
     self.verbose = True
     _end_time = time.time()
     print(f"Total startup time: {_end_time - _start_time} seconds.")
Пример #2
0
 def setUp(self):
     self.test_start_time = time.time()
     self.upload_config = UploadConfig()
     self.upload_client = UploadService(
         deployment_stage=os.environ['DEPLOYMENT_STAGE'],
         api_token=self.upload_config.api_key)
     self.upload_area_uuid = "deadbeef-dead-dead-dead-%012d" % random.randint(
         0, 999999999999)
     print("")
     self._execute_create_upload_area()
     print("\tstartup time: %0.02f seconds." %
           (time.time() - self.test_start_time))
Пример #3
0
    def test_call_without_auth_setup(self):
        upload_config = UploadConfig()
        upload_config.__class__._config = {}

        client = client_for_test_api_server()

        response = client.post(f"/v1/area/{str(uuid.uuid4())}",
                               headers={'Api-Key': 'foo'})

        self.assertEqual(500, response.status_code)
        self.assertIn("api_key is not in secrets",
                      response.data.decode('utf8'))
 def setUp(self):
     super().setUp()
     # Environment
     self.environment = {
         'CSUM_DOCKER_IMAGE': 'bogoimage',
         'API_HOST': 'bogohost'
     }
     self.environmentor = EnvironmentSetup(self.environment)
     self.environmentor.enter()
     # Setup authentication
     self.authentication_header = {'Api-Key': UploadConfig().api_key}
     # Setup app
     self.client = client_for_test_api_server()
Пример #5
0
    def setUp(self):
        # Common Environment
        if os.environ['DEPLOYMENT_STAGE'] in ['local', 'test']:
            self.deployment_stage = os.environ['DEPLOYMENT_STAGE']
        else:
            self.deployment_stage = 'test'
        self.environment = {'DEPLOYMENT_STAGE': self.deployment_stage}
        self.common_environmentor = EnvironmentSetup(self.environment)
        self.common_environmentor.enter()

        # UploadConfig
        self.upload_config = UploadConfig()
        self.upload_config.set(self.__class__.BOGO_CONFIG)

        # AuthConfig
        self.upload_auth_config = UploadOutgoingIngestAuthConfig()
        self.upload_auth_config.set(
            self.__class__.UPLOAD_OUTGOING_INGEST_AUTH_CONFIG)

        # UploadVersion
        self.upload_version = UploadVersion()
        self.upload_version.set({"upload_service_version": "0"})
Пример #6
0
    def __init__(self):
        self.env = os.environ['DEPLOYMENT_STAGE']
        self.db = UploadDB()
        logger.debug(
            f"Running a health check for {self.env}. Results will be posted in #upload-service"
        )
        self.webhook = UploadConfig().slack_webhook

        self.stale_checksum_job_count_query = "SELECT COUNT(*) FROM checksum " \
                                              "WHERE status='CHECKSUMMING' " \
                                              "AND created_at > CURRENT_DATE - interval '4 weeks' " \
                                              "AND updated_at > CURRENT_TIMESTAMP - interval '2 hours'"
        self.stale_validation_job_count_query = "SELECT COUNT(*) FROM validation " \
                                                "WHERE status='VALIDATING' " \
                                                "AND created_at > CURRENT_DATE - interval '4 weeks' " \
                                                "AND updated_at > CURRENT_TIMESTAMP - interval '2 hours'"
        self.scheduled_checksum_job_count_query = "SELECT COUNT(*) FROM checksum " \
                                                  "WHERE status='SCHEDULED' " \
                                                  "AND created_at > CURRENT_DATE - interval '4 weeks' " \
                                                  "AND updated_at > CURRENT_TIMESTAMP - interval '2 hours'"
        self.scheduled_validation_job_count_query = "SELECT COUNT(*) FROM validation " \
                                                    "WHERE status='SCHEDULED' " \
                                                    "AND created_at > CURRENT_DATE - interval '4 weeks' " \
                                                    "AND updated_at > CURRENT_TIMESTAMP - interval '2 hours'"
        self.undeleted_areas_count_query = "SELECT COUNT(*) FROM upload_area " \
                                           "WHERE created_at > CURRENT_DATE - interval '4 weeks' " \
                                           "AND status != 'DELETED'"
        self.failed_checksum_count_query = "SELECT COUNT(*) FROM checksum " \
                                           "WHERE status='FAILED' " \
                                           "AND updated_at >= NOW() - '1 day'::INTERVAL"
        self.failed_validation_count_query = "SELECT COUNT(*) FROM validation " \
                                             "WHERE status='FAILED' " \
                                             "AND updated_at >= NOW() - '1 day'::INTERVAL"
        self.deadletter_metric_queries = [{
            'Id': 'visible_messages',
            'MetricStat': {
                'Metric': {
                    'Namespace':
                    'AWS/SQS',
                    'MetricName':
                    'ApproximateNumberOfMessagesVisible',
                    'Dimensions': [{
                        'Name':
                        'QueueName',
                        'Value':
                        f'dcp-upload-pre-csum-deadletter-queue-{self.env}'
                    }]
                },
                'Period': 90000,
                'Stat': 'Average'
            }
        }, {
            'Id': 'received_messages',
            'MetricStat': {
                'Metric': {
                    'Namespace':
                    'AWS/SQS',
                    'MetricName':
                    'NumberOfMessagesReceived',
                    'Dimensions': [{
                        'Name':
                        'QueueName',
                        'Value':
                        f'dcp-upload-pre-csum-deadletter-queue-{self.env}'
                    }]
                },
                'Period': 90000,
                'Stat': 'Average'
            }
        }]
        self.lambda_error_queries = [{
            'Id': 'upload_api_lambda_errors',
            'MetricStat': {
                'Metric': {
                    'Namespace':
                    'AWS/Lambda',
                    'MetricName':
                    'Errors',
                    'Dimensions': [{
                        'Name': 'FunctionName',
                        'Value': f'upload-api-{self.env}'
                    }]
                },
                'Period': 90000,
                'Stat': 'Sum'
            }
        }, {
            'Id': 'checksum_daemon_lambda_errors',
            'MetricStat': {
                'Metric': {
                    'Namespace':
                    'AWS/Lambda',
                    'MetricName':
                    'Errors',
                    'Dimensions': [{
                        'Name': 'FunctionName',
                        'Value': f'dcp-upload-csum-{self.env}'
                    }]
                },
                'Period': 90000,
                'Stat': 'Sum'
            }
        }]
Пример #7
0
class UploadTestCase(unittest.TestCase):

    BOGO_CONFIG = {
        'bucket_name': 'bogobucket',
        'csum_job_q_arn': 'bogo_arn',
        'csum_upload_q_url': 'bogo_url',
        'area_deletion_q_url': 'delete_sqs_url',
        'csum_job_role_arn': 'bogo_role_arn',
        'upload_submitter_role_arn': 'bogo_submitter_role_arn',
        'slack_webhook': 'bogo_slack_url',
        'area_deletion_lambda_name': 'delete_lambda_name',
        'staging_bucket_arn': 'staging_bucket_arn',
        'ingest_api_host': 'test_ingest_api_host',
        'validation_q_url': 'test_validation_q_url'
    }

    TEST_SERVICE_CREDS = {
        'client_email': 'test_client_email',
        'private_key_id': 'test_private_key_id',
        'private_key': 'test_private_key'
    }

    UPLOAD_OUTGOING_INGEST_AUTH_CONFIG = {
        'gcp_service_acct_creds':
        base64.b64encode(json.dumps(TEST_SERVICE_CREDS).encode()),
        'dcp_auth0_audience':
        'test_dcp_auth0_audience'
    }

    def setUp(self):
        # Common Environment
        if os.environ['DEPLOYMENT_STAGE'] in ['local', 'test']:
            self.deployment_stage = os.environ['DEPLOYMENT_STAGE']
        else:
            self.deployment_stage = 'test'
        self.environment = {'DEPLOYMENT_STAGE': self.deployment_stage}
        self.common_environmentor = EnvironmentSetup(self.environment)
        self.common_environmentor.enter()

        # UploadConfig
        self.upload_config = UploadConfig()
        self.upload_config.set(self.__class__.BOGO_CONFIG)

        # AuthConfig
        self.upload_auth_config = UploadOutgoingIngestAuthConfig()
        self.upload_auth_config.set(
            self.__class__.UPLOAD_OUTGOING_INGEST_AUTH_CONFIG)

        # UploadVersion
        self.upload_version = UploadVersion()
        self.upload_version.set({"upload_service_version": "0"})

    def tearDown(self):
        self.common_environmentor.exit()

    def create_upload_area(self,
                           area_uuid=None,
                           status='UNLOCKED',
                           db_session=None):
        area_uuid = area_uuid or str(uuid.uuid4())
        db_session = db_session or DBSessionMaker().session()
        db_area = DbUploadArea(uuid=area_uuid,
                               bucket_name=self.upload_config.bucket_name,
                               status=status)
        db_session.add(db_area)
        db_session.commit()
        return db_area