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)
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
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')
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)
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
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
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')
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
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
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')
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)
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)
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))
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)
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)
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)
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)
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')