def test_revoke_access(self):
        usr1 = models.CassandraUser('usr1')
        usr2 = models.CassandraUser('usr1', 'password')
        db1 = models.CassandraSchema('db1')
        db2 = models.CassandraSchema('db2')

        self.manager.revoke_access(self.context, usr1.name, None, db1.name)
        self.manager.revoke_access(self.context, usr2.name, None, db2.name)
        self.conn.execute.assert_has_calls([
            call(self.__REVOKE_FORMAT, (db1.name, usr1.name)),
            call(self.__REVOKE_FORMAT, (db2.name, usr2.name))
        ])
    def test_create_database(self):
        db1 = models.CassandraSchema('db1')
        db2 = models.CassandraSchema('db2')
        db3 = models.CassandraSchema(self._get_random_name(32))

        self.manager.create_database(self.context,
                                     self._serialize_collection(db1, db2, db3))
        self.conn.execute.assert_has_calls([
            call(self.__CREATE_DB_FORMAT, (db1.name, )),
            call(self.__CREATE_DB_FORMAT, (db2.name, )),
            call(self.__CREATE_DB_FORMAT, (db3.name, ))
        ])
    def test_list_databases(self):
        db1 = models.CassandraSchema('db1')
        db2 = models.CassandraSchema('db2')
        db3 = models.CassandraSchema(self._get_random_name(32))

        with patch.object(self.admin,
                          self.__N_GAK,
                          return_value={db1, db2, db3}):
            found = self.manager.list_databases(self.context)
            self.assertEqual(2, len(found))
            self.assertEqual(3, len(found[0]))
            self.assertIsNone(found[1])
            self.assertIn(db1.serialize(), found[0])
            self.assertIn(db2.serialize(), found[0])
            self.assertIn(db3.serialize(), found[0])

        with patch.object(self.admin, self.__N_GAK, return_value=set()):
            found = self.manager.list_databases(self.context)
            self.assertEqual(([], None), found)
    def test_grant_access(self):
        usr1 = models.CassandraUser('usr1')
        usr2 = models.CassandraUser('usr1', 'password')
        db1 = models.CassandraSchema('db1')
        db2 = models.CassandraSchema('db2')
        db3 = models.CassandraSchema('db3')

        self.manager.grant_access(self.context, usr1.name, None,
                                  [db1.name, db2.name])
        self.manager.grant_access(self.context, usr2.name, None, [db3.name])

        expected = []
        for modifier in self.__ACCESS_MODIFIERS:
            expected.append(
                call(self.__GRANT_FORMAT, (modifier, db1.name, usr1.name)))
            expected.append(
                call(self.__GRANT_FORMAT, (modifier, db3.name, usr2.name)))

        self.conn.execute.assert_has_calls(expected, any_order=True)
    def test_rename_user(self, ks_deserializer):
        usr = models.CassandraUser('usr')
        db1 = models.CassandraSchema('db1').serialize()
        db2 = models.CassandraSchema('db2').serialize()
        usr.databases.append(db1)
        usr.databases.append(db2)

        new_user = models.CassandraUser('new_user')
        with patch(self.__N_CAU, return_value=new_user):
            with patch.object(self.admin, self.__N_BU, return_value=usr):
                with patch.object(self.admin, self.__N_CU) as create:
                    with patch.object(self.admin, self.__N_GFA) as grant:
                        with patch.object(self.admin, self.__N_DU) as drop:
                            usr_attrs = {'name': 'user', 'password': '******'}
                            self.manager.update_attributes(
                                self.context, usr.name, None, usr_attrs)
                            create.assert_called_once_with(ANY, new_user)
                            grant.assert_has_calls(
                                [call(ANY, db1, ANY),
                                 call(ANY, db2, ANY)])
                            drop.assert_called_once_with(ANY, usr)
    def test_get_listed_users(self):
        usr1 = models.CassandraUser(self._get_random_name(1025))
        usr2 = models.CassandraUser(self._get_random_name(1025))
        usr3 = models.CassandraUser(self._get_random_name(1025))
        db1 = models.CassandraSchema('db1')
        db2 = models.CassandraSchema('db2')
        usr1.databases.append(db1.serialize())
        usr3.databases.append(db2.serialize())

        rv_1 = NonCallableMagicMock()
        rv_1.configure_mock(name=usr1.name, super=False)
        rv_2 = NonCallableMagicMock()
        rv_2.configure_mock(name=usr2.name, super=False)
        rv_3 = NonCallableMagicMock()
        rv_3.configure_mock(name=usr3.name, super=True)

        with patch.object(self.conn,
                          'execute',
                          return_value=iter([rv_1, rv_2, rv_3])):
            with patch.object(self.admin,
                              '_get_acl',
                              return_value={
                                  usr1.name: {
                                      db1.name: {'SELECT'},
                                      db2.name: {}
                                  },
                                  usr3.name: {
                                      db2.name: {'SELECT'}
                                  }
                              }):
                usrs = self.manager.list_users(self.context)
                self.conn.execute.assert_has_calls([
                    call(self.__LIST_USR_FORMAT),
                ],
                                                   any_order=True)
                self.assertIn(usr1.serialize(), usrs[0])
                self.assertIn(usr2.serialize(), usrs[0])
                self.assertIn(usr3.serialize(), usrs[0])
    def test_list_access(self):
        usr1 = models.CassandraUser('usr1')
        usr2 = models.CassandraUser('usr2')
        usr3 = models.CassandraUser(self._get_random_name(1025), 'password')
        db1 = models.CassandraSchema('db1').serialize()
        db2 = models.CassandraSchema('db2').serialize()
        usr2.databases.append(db1)
        usr3.databases.append(db1)
        usr3.databases.append(db2)

        with patch.object(self.admin,
                          self.__N_GLU,
                          return_value={usr1, usr2, usr3}):
            usr1_dbs = self.manager.list_access(self.context, usr1.name, None)
            usr2_dbs = self.manager.list_access(self.context, usr2.name, None)
            usr3_dbs = self.manager.list_access(self.context, usr3.name, None)
            self.assertEqual([], usr1_dbs)
            self.assertEqual([db1], usr2_dbs)
            self.assertEqual([db1, db2], usr3_dbs)

        with patch.object(self.admin, self.__N_GLU, return_value=set()):
            with ExpectedException(exception.UserNotFound):
                self.manager.list_access(self.context, usr3.name, None)
    def test_get_acl(self):
        r0 = NonCallableMagicMock(username='******',
                                  resource='<all keyspaces>',
                                  permission='SELECT')
        r1 = NonCallableMagicMock(username='******',
                                  resource='<keyspace ks1>',
                                  permission='SELECT')
        r2 = NonCallableMagicMock(username='******',
                                  resource='<keyspace ks2>',
                                  permission='SELECT')
        r3 = NonCallableMagicMock(username='******',
                                  resource='<keyspace ks2>',
                                  permission='ALTER')
        r4 = NonCallableMagicMock(username='******',
                                  resource='<table ks2.t1>',
                                  permission='SELECT')
        r5 = NonCallableMagicMock(username='******',
                                  resource='',
                                  permission='ALTER')
        r6 = NonCallableMagicMock(username='******',
                                  resource='<keyspace ks2>',
                                  permission='')
        r7 = NonCallableMagicMock(username='******', resource='', permission='')
        r8 = NonCallableMagicMock(username='******',
                                  resource='<keyspace ks1>',
                                  permission='DELETE')
        r9 = NonCallableMagicMock(username='******',
                                  resource='<all keyspaces>',
                                  permission='UPDATE')
        r10 = NonCallableMagicMock(username='******',
                                   resource='<keyspace ks1>',
                                   permission='DELETE')

        available_ks = {
            models.CassandraSchema('ks1'),
            models.CassandraSchema('ks2'),
            models.CassandraSchema('ks3')
        }

        mock_result_set = [r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, r9, r9, r10]
        execute_mock = MagicMock(return_value=mock_result_set)
        mock_client = MagicMock(execute=execute_mock)

        with patch.object(self.admin, self.__N_GAK,
                          return_value=available_ks) as gak_mock:
            acl = self.admin._get_acl(mock_client)
            execute_mock.assert_called_once_with(
                self.__LIST_PERMISSIONS_FORMAT)
            gak_mock.assert_called_once_with(mock_client)

            self.assertEqual(
                {
                    'user1': {
                        'ks1': {'SELECT'},
                        'ks2': {'SELECT'},
                        'ks3': {'SELECT'}
                    },
                    'user2': {
                        'ks1': {'SELECT'},
                        'ks2': {'SELECT', 'ALTER'}
                    },
                    'user3': {
                        'ks1': {'DELETE'}
                    },
                    'user4': {
                        'ks1': {'UPDATE', 'DELETE'},
                        'ks2': {'UPDATE'},
                        'ks3': {'UPDATE'}
                    }
                }, acl)

        mock_result_set = [r1, r2, r3]
        execute_mock = MagicMock(return_value=mock_result_set)
        mock_client = MagicMock(execute=execute_mock)

        with patch.object(self.admin, self.__N_GAK,
                          return_value=available_ks) as gak_mock:
            acl = self.admin._get_acl(mock_client, username='******')
            execute_mock.assert_called_once_with(
                self.__LIST_PERMISSIONS_OF_FORMAT.format('user2'))
            gak_mock.assert_not_called()

            self.assertEqual(
                {'user2': {
                    'ks1': {'SELECT'},
                    'ks2': {'SELECT', 'ALTER'}
                }}, acl)

        mock_result_set = []
        execute_mock = MagicMock(return_value=mock_result_set)
        mock_client = MagicMock(execute=execute_mock)

        with patch.object(self.admin, self.__N_GAK,
                          return_value=available_ks) as gak_mock:
            acl = self.admin._get_acl(mock_client, username='******')
            execute_mock.assert_called_once_with(
                self.__LIST_PERMISSIONS_OF_FORMAT.format('nonexisting'))
            gak_mock.assert_not_called()

            self.assertEqual({}, acl)
 def test_delete_database(self):
     db = models.CassandraSchema(self._get_random_name(32))
     self.manager.delete_database(self.context, db.serialize())
     self.conn.execute.assert_called_once_with(self.__DROP_DB_FORMAT,
                                               (db.name, ))
 def test_keyspace_validation(self):
     valid_name = self._get_random_name(32)
     db = models.CassandraSchema(valid_name)
     self.assertEqual(valid_name, db.name)
     with ExpectedException(ValueError):
         models.CassandraSchema(self._get_random_name(33))