Exemplo n.º 1
0
class TestBackupController(trove_testtools.TestCase):
    def setUp(self):
        super(TestBackupController, self).setUp()
        self.uuid = "d6338c9c-3cc8-4313-b98f-13cc0684cf15"
        self.invalid_uuid = "ead-edsa-e23-sdf-23"
        self.controller = BackupController()
        self.context = context.TroveContext(project_id=str(uuid.uuid4()))
        util.init_db()

    def tearDown(self):
        super(TestBackupController, self).tearDown()
        backups = models.DBBackup.find_all(tenant_id=self.context.project_id)
        for backup in backups:
            backup.delete()

    def test_validate_create_complete(self):
        body = {"backup": {"instance": self.uuid, "name": "testback-backup"}}
        schema = self.controller.get_schema('create', body)
        validator = jsonschema.Draft4Validator(schema)
        self.assertTrue(validator.is_valid(body))

    def test_validate_create_with_blankname(self):
        body = {"backup": {"instance": self.uuid, "name": ' '}}
        schema = self.controller.get_schema('create', body)
        validator = jsonschema.Draft4Validator(schema)
        self.assertFalse(validator.is_valid(body))
        errors = sorted(validator.iter_errors(body), key=lambda e: e.path)
        self.assertEqual(1, len(errors))
        self.assertIn("' ' does not match '^.*[0-9a-zA-Z]+.*$'",
                      errors[0].message)

    def test_validate_create_with_invalidname(self):
        body = {"backup": {"instance": self.uuid, "name": '$#@&?'}}
        schema = self.controller.get_schema('create', body)
        validator = jsonschema.Draft4Validator(schema)
        self.assertFalse(validator.is_valid(body))
        errors = sorted(validator.iter_errors(body), key=lambda e: e.path)
        self.assertEqual(1, len(errors))
        self.assertIn("'$#@&?' does not match '^.*[0-9a-zA-Z]+.*$'",
                      errors[0].message)

    def test_validate_create_invalid_uuid(self):
        body = {
            "backup": {
                "instance": self.invalid_uuid,
                "name": "testback-backup"
            }
        }
        schema = self.controller.get_schema('create', body)
        validator = jsonschema.Draft4Validator(schema)
        self.assertFalse(validator.is_valid(body))
        errors = sorted(validator.iter_errors(body), key=lambda e: e.path)
        self.assertThat(
            errors[0].message,
            Equals("'%s' does not match '%s'" %
                   (self.invalid_uuid, apischema.uuid['pattern'])))

    def test_validate_create_incremental(self):
        body = {
            "backup": {
                "instance": self.uuid,
                "name": "testback-backup",
                "parent_id": self.uuid
            }
        }
        schema = self.controller.get_schema('create', body)
        validator = jsonschema.Draft4Validator(schema)
        self.assertTrue(validator.is_valid(body))

    def test_invalid_parent_id(self):
        body = {
            "backup": {
                "instance": self.uuid,
                "name": "testback-backup",
                "parent_id": self.invalid_uuid
            }
        }
        schema = self.controller.get_schema('create', body)
        validator = jsonschema.Draft4Validator(schema)
        self.assertFalse(validator.is_valid(body))
        errors = sorted(validator.iter_errors(body), key=lambda e: e.path)
        self.assertThat(
            errors[0].message,
            Equals("'%s' does not match '%s'" %
                   (self.invalid_uuid, apischema.uuid['pattern'])))

    def test_list_by_project(self):
        req = mock.MagicMock(GET={'project_id': self.context.project_id},
                             environ={wsgi.CONTEXT_KEY: self.context},
                             url='http://localhost')
        instance_id = str(uuid.uuid4())
        backup_name = str(uuid.uuid4())
        location = 'https://object-storage.com/tenant/database_backups/backup'
        models.DBBackup.create(tenant_id=self.context.project_id,
                               name=backup_name,
                               state=state.BackupState.NEW,
                               instance_id=instance_id,
                               deleted=False,
                               size=2.0,
                               location=location)

        res = self.controller.index(req, 'fake_tenant_id')

        self.assertEqual(200, res.status)
        backups = res.data(None)['backups']
        self.assertGreaterEqual(len(backups), 1)
        our_backup = None
        for backup in backups:
            if backup['name'] == backup_name:
                our_backup = backup
                break
        self.assertIsNotNone(our_backup)
        expected = {
            'name': backup_name,
            'locationRef': location,
            'instance_id': instance_id,
            'size': 2.0,
            'status': 'NEW',
        }
        self.assertTrue(
            set(expected.items()).issubset(set(our_backup.items())))

        # Get backups of unknown project
        req = mock.MagicMock(GET={'project_id': str(uuid.uuid4())},
                             environ={wsgi.CONTEXT_KEY: self.context},
                             url='http://localhost')

        res = self.controller.index(req, 'fake_tenant_id')

        self.assertEqual(200, res.status)
        backups = res.data(None)['backups']
        self.assertEqual(0, len(backups))