Example #1
0
    def test_create_pool_set_owner(self):
        pool_name = data_setup.unique_name(u'mypool%s')
        owner = data_setup.create_user()
        run_client(['bkr', 'pool-create',
                    '--owner', owner.user_name,
                    pool_name])
        with session.begin():
            p = SystemPool.by_name(pool_name)
            self.assertFalse(p.owning_group)
            self.assertTrue(p.owning_user.user_name,
                            owner.user_name)

        pool_name = data_setup.unique_name(u'mypool%s')

        owning_group = data_setup.create_group()
        run_client(['bkr', 'pool-create',
                    '--owning-group', owning_group.group_name,
                    pool_name])
        with session.begin():
            p = SystemPool.by_name(pool_name)
            self.assertTrue(p.owning_group, owning_group)
            self.assertFalse(p.owning_user)

        # specifying both should error out
        try:
            run_client(['bkr', 'pool-create',
                        '--owner', owner.user_name,
                        '--owning-group', owning_group.group_name,
                    pool_name])
            self.fail('Must error out')
        except ClientError as e:
            self.assertIn('Only one of owner or owning-group must be specified',
                          e.stderr_output)
Example #2
0
def create_pool():
    """
    Creates a new system pool in Beaker. The request must be 
    :mimetype:`application/x-www-form-urlencoded` or 
    :mimetype:`application/json`.

    :jsonparam string name: Name for the system pool.
    :jsonparam string description: Description of the system pool.
    :jsonparam object owner: JSON object containing a ``user_name`` key or
      ``group_name`` key identifying the owner for the system pool.

    :status 201: The system pool was successfully created.
    """
    owner = None
    description = None
    u = identity.current.user
    if request.json:
        if 'name' not in request.json:
            raise BadRequest400('Missing pool name key')
        new_name = request.json['name']
        if 'owner' in request.json:
            owner = request.json['owner']
        if 'description' in request.json:
            description = request.json['description']
    elif request.form:
        if 'name' not in request.form:
            raise BadRequest400('Missing pool name parameter')
        new_name = request.form['name']
        if 'owner' in request.form:
            owner = request.form['owner']
        if 'description' in request.form:
            description = request.form['description']
    else:
        raise UnsupportedMediaType415
    with convert_internal_errors():
        if SystemPool.query.filter(SystemPool.name == new_name).count() != 0:
            raise Conflict409('System pool with name %r already exists' %
                              new_name)
        pool = SystemPool(name=new_name, description=description)
        session.add(pool)
        if owner:
            owner, owner_type = _get_owner(owner)
            if owner_type == 'user':
                pool.owning_user = owner
            else:
                pool.owning_group = owner
        else:
            pool.owning_user = u
        # new systems pool are visible to everybody by default
        pool.access_policy = SystemAccessPolicy()
        pool.access_policy.add_rule(SystemPermission.view, everybody=True)
        pool.record_activity(user=u,
                             service=u'HTTP',
                             action=u'Created',
                             field=u'Pool',
                             new=unicode(pool))
    response = jsonify(pool.__json__())
    response.status_code = 201
    response.headers.add('Location', absolute_url(pool.href))
    return response
Example #3
0
    def test_delete_system_pool(self):
        with session.begin():
            system = data_setup.create_system()
            random_user = data_setup.create_user(password='******')
            pool_owner = data_setup.create_user(password='******')
            pool_name = data_setup.unique_name('mypool%s')
            pool = data_setup.create_system_pool(name=pool_name,
                                                 owning_user=pool_owner,
                                                 systems=[system])
            pool.access_policy.add_rule(user=self.user,
                                        permission=SystemPermission.edit_system)
            system.active_access_policy = pool.access_policy

        unicode_pool = unicode(pool)
        self.assertIn(pool, system.pools)
        self.assertTrue(system.active_access_policy.grants
                        (self.user, SystemPermission.edit_system))
        # first as a random user
        s = requests.Session()
        s.post(get_server_base() + 'login', data={'user_name': random_user.user_name,
                                                  'password': '******'}).raise_for_status()
        response = s.delete(get_server_base() + 'pools/%s/' % pool_name)
        self.assertEquals(response.status_code, 403)

        # now as the pool owner
        s = requests.Session()
        s.post(get_server_base() + 'login', data={'user_name': pool_owner.user_name,
                                                  'password': '******'}).raise_for_status()
        response = s.delete(get_server_base() + 'pools/%s/' % pool_name)
        response.raise_for_status()
        with session.begin():
            session.expire_all()
            with self.assertRaises(NoResultFound):
                SystemPool.by_name(pool_name)

            self.assertNotIn(pool, system.pools)
            self.assertFalse(system.active_access_policy.grants
                             (self.user, SystemPermission.edit_system))

            self.assertEquals(system.activity[-1].field_name, 'Pool')
            self.assertEquals(system.activity[-1].action, 'Removed')
            self.assertEquals(system.activity[-1].old_value, unicode_pool)

            self.assertEquals(system.activity[-2].field_name, 'Active Access Policy')
            self.assertEquals(system.activity[-2].old_value, 'Pool policy: %s' % pool_name)
            self.assertEquals(system.activity[-2].new_value, 'Custom access policy')

            self.assertEquals(1, Activity.query
                              .filter(Activity.field_name == u'Pool')
                              .filter(Activity.action == u'Deleted')
                              .filter(Activity.old_value == pool_name).count(),
                              'Expected to find activity record for pool deletion')
Example #4
0
 def test_create_system_pool(self):
     s = requests.Session()
     s.post(get_server_base() + 'login',
            data={
                'user_name': self.owner.user_name,
                'password': '******'
            }).raise_for_status()
     data = {
         'name': 'newtest',
         'description': 'newtestdesciprtion',
     }
     response = post_json(get_server_base() + 'pools/',
                          session=s,
                          data=data)
     self.assertEquals(response.status_code, 201)
     self.assertEquals(response.json()['name'], data['name'])
     self.assertEquals(response.json()['description'], data['description'])
     self.assertEquals(response.headers['Location'],
                       get_server_base() + 'pools/newtest/')
     with session.begin():
         pool = SystemPool.by_name('newtest')
         self.assertEquals(pool.name, 'newtest')
         self.assertEquals(pool.description, 'newtestdesciprtion')
         self.assertEquals(pool.owner.user_name, self.owner.user_name)
         self.assertEquals(pool.access_policy.rules[0].everybody, True)
Example #5
0
 def _from_csv(cls, system, data, csv_type, log):
     """
     Import data from CSV file into system.pool
     """
     if 'pool' in data and data['pool']:
         try:
             pool = SystemPool.by_name(data['pool'])
         except InvalidRequestError:
             log.append('%s: pool does not exist' % data['pool'])
             return False
         deleted = False
         if 'deleted' in data:
             deleted = smart_bool(data['deleted'])
         if deleted:
             if pool in system.pools:
                 system.record_activity(user=identity.current.user,
                                        service=u'CSV',
                                        action=u'Removed',
                                        field=u'pool',
                                        old=u'%s' % pool,
                                        new=u'')
                 system.pools.remove(pool)
         else:
             if pool not in system.pools:
                 system.pools.append(pool)
                 system.record_activity(user=identity.current.user,
                                        service=u'CSV',
                                        action=u'Added',
                                        field=u'pool',
                                        old=u'',
                                        new=u'%s' % pool)
     else:
         log.append("%s: pool can't be empty!" % system.fqdn)
         return False
     return True
Example #6
0
 def _from_csv(cls,system,data,csv_type,log):
     """
     Import data from CSV file into system.pool
     """
     if 'pool' in data and data['pool']:
         try:
             pool = SystemPool.by_name(data['pool'])
         except InvalidRequestError:
             log.append('%s: pool does not exist' % data['pool'])
             return False
         deleted = False
         if 'deleted' in data:
             deleted = smart_bool(data['deleted'])
         if deleted:
             if pool in system.pools:
                 system.record_activity(user=identity.current.user, service=u'CSV',
                         action=u'Removed', field=u'pool',
                         old=u'%s' % pool, new=u'')
                 system.pools.remove(pool)
         else:
             if pool not in system.pools:
                 system.pools.append(pool)
                 system.record_activity(user=identity.current.user, service=u'CSV',
                                        action=u'Added', field=u'pool', old=u'', new=u'%s' % pool)
     else:
         log.append("%s: pool can't be empty!" % system.fqdn)
         return False
     return True
Example #7
0
def create_pool():
    """
    Creates a new system pool in Beaker. The request must be 
    :mimetype:`application/x-www-form-urlencoded` or 
    :mimetype:`application/json`.

    :jsonparam string name: Name for the system pool.
    :jsonparam string description: Description of the system pool.
    :jsonparam object owner: JSON object containing a ``user_name`` key or
      ``group_name`` key identifying the owner for the system pool.

    :status 201: The system pool was successfully created.
    """
    owner = None
    description = None
    u = identity.current.user
    if request.json:
        if 'name' not in request.json:
            raise BadRequest400('Missing pool name key')
        new_name = request.json['name']
        if 'owner' in request.json:
            owner =  request.json['owner']
        if 'description' in request.json:
            description = request.json['description']
    elif request.form:
        if 'name' not in request.form:
            raise BadRequest400('Missing pool name parameter')
        new_name = request.form['name']
        if 'owner' in request.form:
            owner =  request.form['owner']
        if 'description' in request.form:
            description = request.form['description']
    else:
        raise UnsupportedMediaType415
    with convert_internal_errors():
        if SystemPool.query.filter(SystemPool.name == new_name).count() != 0:
            raise Conflict409('System pool with name %r already exists' % new_name)
        pool = SystemPool(name=new_name, description=description)
        session.add(pool)
        if owner:
            owner, owner_type = _get_owner(owner)
            if owner_type == 'user':
                pool.owning_user = owner
            else:
                pool.owning_group = owner
        else:
            pool.owning_user = u
        # new systems pool are visible to everybody by default
        pool.access_policy = SystemAccessPolicy()
        pool.access_policy.add_rule(SystemPermission.view, everybody=True)
        pool.record_activity(user=u, service=u'HTTP',
                     action=u'Created', field=u'Pool',
                     new=unicode(pool))
    response = jsonify(pool.__json__())
    response.status_code = 201
    response.headers.add('Location', absolute_url(pool.href))
    return response
Example #8
0
    def test_create_pool_set_description(self):
        pool_name = data_setup.unique_name('mypool%s')
        run_client(
            ['bkr', 'pool-create', '--description', 'My Pool', pool_name])

        with session.begin():
            pool = SystemPool.by_name(pool_name)
            self.assertEquals(pool.description, 'My Pool')
Example #9
0
def create_system_pool(name=None, description='A system Pool',
                       owning_group=None, owning_user=None, systems=[]):
    if owning_group and owning_user:
        raise ValueError('Must supply either an owning user or an owning group')
    if not owning_group and not owning_user:
        owning_user = create_user()
    if name is None:
        name = unique_name(u'test-system-pool-%s')
    pool = SystemPool(name=name, description=description,
                      owning_group=owning_group,
                      owning_user=owning_user,
                      systems=systems)
    pool.access_policy = SystemAccessPolicy()
    pool.access_policy.add_rule(SystemPermission.view, everybody=True)
    session.add(pool)
    log.debug('Created System Pool %s', pool.name)
    return pool
Example #10
0
def create_system_pool(name=None, description=u'A system Pool',
                       owning_group=None, owning_user=None, systems=[]):
    if owning_group and owning_user:
        raise ValueError('Must supply either an owning user or an owning group')
    if not owning_group and not owning_user:
        owning_user = create_user()
    if name is None:
        name = unique_name(u'test-system-pool-%s')
    pool = SystemPool(name=name, description=description,
                      owning_group=owning_group,
                      owning_user=owning_user,
                      systems=systems)
    pool.access_policy = SystemAccessPolicy()
    pool.access_policy.add_rule(SystemPermission.view, everybody=True)
    session.add(pool)
    log.debug('Created System Pool %s', pool.name)
    return pool
Example #11
0
    def test_create_pool_set_description(self):
        pool_name = data_setup.unique_name(u'mypool%s')
        run_client(['bkr', 'pool-create',
                    '--description', 'My Pool',
                    pool_name])

        with session.begin():
            pool = SystemPool.by_name(pool_name)
            self.assertEquals(pool.description, 'My Pool')
Example #12
0
    def test_delete_pool(self):
        with session.begin():
            pool_name = data_setup.unique_name(u'mypool%s')
            data_setup.create_system_pool(name=pool_name)
        run_client(['bkr', 'pool-delete', pool_name])

        with session.begin():
            session.expire_all()
            with self.assertRaises(NoResultFound):
                SystemPool.by_name(pool_name)

        # attempt to delete non-existent pool
        try:
            run_client(['bkr', 'pool-delete', pool_name])
            self.fail()
        except ClientError as e:
            self.assertIn('System pool %s does not exist' % pool_name,
                          e.stderr_output)
Example #13
0
    def test_delete_pool(self):
        with session.begin():
            pool_name = data_setup.unique_name('mypool%s')
            data_setup.create_system_pool(name=pool_name)
        run_client(['bkr', 'pool-delete', pool_name])

        with session.begin():
            session.expire_all()
            with self.assertRaises(NoResultFound):
                SystemPool.by_name(pool_name)

        # attempt to delete non-existent pool
        try:
            run_client(['bkr', 'pool-delete', pool_name])
            self.fail()
        except ClientError as e:
            self.assertIn('System pool %s does not exist' % pool_name,
                          e.stderr_output)
Example #14
0
 def test_create_pool(self):
     b = self.browser
     login(b)
     b.get(get_server_base() + 'pools/')
     b.find_element_by_xpath('//button[normalize-space(string(.))="Create"]')\
         .click()
     modal = b.find_element_by_class_name('modal')
     modal.find_element_by_name('name').send_keys('inflatable')
     modal.find_element_by_tag_name('form').submit()
     b.find_element_by_xpath('//title[text()="inflatable"]')
     with session.begin():
         pool = SystemPool.by_name(u'inflatable')
         self.assertEquals(pool.owner, User.by_user_name(data_setup.ADMIN_USER))
Example #15
0
 def test_create_pool(self):
     b = self.browser
     login(b)
     b.get(get_server_base() + 'pools/')
     b.find_element_by_xpath('//button[normalize-space(string(.))="Create"]')\
         .click()
     modal = b.find_element_by_class_name('modal')
     modal.find_element_by_name('name').send_keys('inflatable')
     modal.find_element_by_tag_name('form').submit()
     b.find_element_by_xpath('//title[text()="inflatable"]')
     with session.begin():
         pool = SystemPool.by_name(u'inflatable')
         self.assertEquals(pool.owner,
                           User.by_user_name(data_setup.ADMIN_USER))
Example #16
0
    def test_create_pool_defaults(self):
        pool_name = data_setup.unique_name(u'mypool%s')
        run_client(['bkr', 'pool-create', pool_name])

        with session.begin():
            pool = SystemPool.by_name(pool_name)
            self.assertFalse(pool.description)
            self.assertFalse(pool.owning_group)
            self.assertTrue(pool.owning_user.user_name, "admin")
            self.assertEquals(pool.activity[-1].field_name, u'Pool')
            self.assertEquals(pool.activity[-1].action, u'Created')
            self.assertEquals(pool.activity[-1].new_value, pool_name)
        # duplicate
        try:
            run_client(['bkr', 'pool-create', pool_name])
            self.fail('Must fail')
        except ClientError as e:
            self.assertIn("System pool with name u'%s' already exists" % pool_name,
                          e.stderr_output)
Example #17
0
 def test_create_system_pool(self):
     s = requests.Session()
     s.post(get_server_base() + 'login', data={'user_name': self.owner.user_name,
                                               'password': '******'}).raise_for_status()
     data = {
         'name': 'newtest',
         'description': 'newtestdesciprtion',
     }
     response = post_json(get_server_base() + 'pools/', session=s, data=data)
     self.assertEquals(response.status_code, 201)
     self.assertEquals(response.json()['name'], data['name'])
     self.assertEquals(response.json()['description'], data['description'])
     self.assertEquals(response.headers['Location'],
             get_server_base() + 'pools/newtest/')
     with session.begin():
         pool = SystemPool.by_name('newtest')
         self.assertEquals(pool.name, 'newtest')
         self.assertEquals(pool.description, 'newtestdesciprtion')
         self.assertEquals(pool.owner.user_name, self.owner.user_name)
         self.assertEquals(pool.access_policy.rules[0].everybody, True)
Example #18
0
 def filter(self, joins):
     op = self.op_table[self.get_xml_attr('op', unicode, '==')]
     value = self.get_xml_attr('value', unicode, None)
     if value:
         # - '==' - search for system which is member of given pool
         # - '!=' - search for system which is not member of given pool
         try:
             pool = SystemPool.by_name(value)
         except NoResultFound:
             return (joins, None)
         if op == '__eq__':
             query = System.pools.any(SystemPool.id == pool.id)
         else:
             query = not_(System.pools.any(SystemPool.id == pool.id))
     else:
         # - '!=' - search for system which is member of any pool
         # - '==' - search for system which is not member of any pool
         if op == '__eq__':
             query = System.pools == None
         else:
             query = System.pools != None
     return (joins, query)
Example #19
0
 def filter(self, joins):
     op = self.op_table[self.get_xml_attr('op', unicode, '==')]
     value = self.get_xml_attr('value', unicode, None)
     if value:
         # - '==' - search for system which is member of given pool
         # - '!=' - search for system which is not member of given pool
         try:
             pool = SystemPool.by_name(value)
         except NoResultFound:
             return (joins, None)
         if op == '__eq__':
             query = System.pools.any(SystemPool.id == pool.id)
         else:
             query = not_(System.pools.any(SystemPool.id == pool.id))
     else:
         # - '!=' - search for system which is member of any pool
         # - '==' - search for system which is not member of any pool
         if op == '__eq__':
             query = System.pools == None
         else:
             query = System.pools != None
     return (joins, query)
Example #20
0
def _get_pool_by_name(pool_name, lockmode=False):
    """Get system pool by name, reporting HTTP 404 if the system pool is not found"""
    try:
        return SystemPool.by_name(pool_name, lockmode)
    except NoResultFound:
        raise NotFound404('System pool %s does not exist' % pool_name)
Example #21
0
def _get_pool_by_name(pool_name, lockmode=False):
    """Get system pool by name, reporting HTTP 404 if the system pool is not found"""
    try:
        return SystemPool.by_name(pool_name, lockmode)
    except NoResultFound:
        raise NotFound404('System pool %s does not exist' % pool_name)
Example #22
0
    def test_delete_system_pool(self):
        with session.begin():
            system = data_setup.create_system()
            random_user = data_setup.create_user(password='******')
            pool_owner = data_setup.create_user(password='******')
            pool_name = data_setup.unique_name('mypool%s')
            pool = data_setup.create_system_pool(name=pool_name,
                                                 owning_user=pool_owner,
                                                 systems=[system])
            pool.access_policy.add_rule(
                user=self.user, permission=SystemPermission.edit_system)
            system.active_access_policy = pool.access_policy

        unicode_pool = unicode(pool)
        self.assertIn(pool, system.pools)
        self.assertTrue(
            system.active_access_policy.grants(self.user,
                                               SystemPermission.edit_system))
        # first as a random user
        s = requests.Session()
        s.post(get_server_base() + 'login',
               data={
                   'user_name': random_user.user_name,
                   'password': '******'
               }).raise_for_status()
        response = s.delete(get_server_base() + 'pools/%s/' % pool_name)
        self.assertEquals(response.status_code, 403)

        # now as the pool owner
        s = requests.Session()
        s.post(get_server_base() + 'login',
               data={
                   'user_name': pool_owner.user_name,
                   'password': '******'
               }).raise_for_status()
        response = s.delete(get_server_base() + 'pools/%s/' % pool_name)
        response.raise_for_status()
        with session.begin():
            session.expire_all()
            with self.assertRaises(NoResultFound):
                SystemPool.by_name(pool_name)

            self.assertNotIn(pool, system.pools)
            self.assertFalse(
                system.active_access_policy.grants(
                    self.user, SystemPermission.edit_system))

            self.assertEquals(system.activity[-1].field_name, 'Pool')
            self.assertEquals(system.activity[-1].action, 'Removed')
            self.assertEquals(system.activity[-1].old_value, unicode_pool)

            self.assertEquals(system.activity[-2].field_name,
                              'Active Access Policy')
            self.assertEquals(system.activity[-2].old_value,
                              'Pool policy: %s' % pool_name)
            self.assertEquals(system.activity[-2].new_value,
                              'Custom access policy')

            self.assertEquals(
                1,
                Activity.query.filter(Activity.field_name == u'Pool').filter(
                    Activity.action == u'Deleted').filter(
                        Activity.old_value == pool_name).count(),
                'Expected to find activity record for pool deletion')