def test_usandsconf_dbgen_cos_indirect(topology_st, set_log_file_and_ldif): """Test ldifgen (formerly dbgen) tool to create a COS definition :id: ab4b799e-e801-432a-a61d-badad2628201 :setup: Standalone instance :steps: 1. Create DS instance 2. Run ldifgen to generate ldif with indirect COS definition 3. Import generated ldif to database 4. Check it was properly imported :expectedresults: 1. Success 2. Success 3. Success 4. Success """ LDAP_RESULT = 'adding new entry "cn=My_Postal_Def_indirect,ou=cos indirect definitions,dc=example,dc=com"' standalone = topology_st.standalone args = FakeArgs() args.type = 'indirect' args.NAME = 'My_Postal_Def_indirect' args.parent = 'ou=cos indirect definitions,dc=example,dc=com' args.create_parent = True args.cos_specifier = 'businessCategory' args.cos_attr = ['postalcode', 'telephonenumber'] args.cos_template = None args.ldif_file = ldif_file content_list = [ 'Generating LDIF with the following options:', 'NAME={}'.format(args.NAME), 'type={}'.format(args.type), 'parent={}'.format(args.parent), 'create-parent={}'.format( args.create_parent), 'cos-specifier={}'.format(args.cos_specifier), 'cos-attr={}'.format(args.cos_attr), 'ldif-file={}'.format(args.ldif_file), 'Writing LDIF', 'Successfully created LDIF file: {}'.format(args.ldif_file) ] log.info('Run ldifgen to create COS definition ldif') dbgen_create_cos_def(standalone, log, args) log.info('Check if file exists') assert os.path.exists(ldif_file) check_value_in_log_and_reset(content_list) # Groups, COS, Roles and modification ldifs are designed to be used by ldapmodify, not ldif2db run_ldapmodify_from_file(standalone, ldif_file, LDAP_RESULT) log.info('Check that COS definition is imported') cos_def = CosIndirectDefinitions(standalone, args.parent) assert cos_def.exists(args.NAME) new_cos = cos_def.get(args.NAME) assert new_cos.present('cosIndirectSpecifier', args.cos_specifier) assert new_cos.present('cosAttribute', args.cos_attr[0]) assert new_cos.present('cosAttribute', args.cos_attr[1])
def test_indirect_template_scale(topology_st): """Test that cos templates can be added at a reasonable scale :id: 7cbcdf22-1f9c-4222-9e76-685fe374fc20 :steps: 1. Enable COS plugin 2. Create the test user 3. Add an indirect cos template 4. Add a cos template 5. Add the user to the cos template and assert it works. 6. Add 25,000 templates to the database 7. Search the user. It should not exceed THRESHOLD. :expected results: 1. It is enabled. 2. It is created. 3. Is is created. 4. It is created. 5. It is valid. 6. They are created. 7. It is fast. """ cos_plugin = ClassOfServicePlugin(topology_st.standalone) cos_plugin.enable() topology_st.standalone.restart() # Now create, the indirect specifier, and a user to template onto. users = UserAccounts(topology_st.standalone, DEFAULT_SUFFIX) user = users.create(properties=TEST_USER_PROPERTIES) cos_inds = CosIndirectDefinitions(topology_st.standalone, DEFAULT_SUFFIX) cos_ind = cos_inds.create(properties={ 'cn' : 'cosIndirectDef', 'cosIndirectSpecifier': 'seeAlso', 'cosAttribute': [ 'ou merge-schemes', 'description merge-schemes', 'postalCode merge-schemes', ], }) ous = OrganisationalUnits(topology_st.standalone, DEFAULT_SUFFIX) ou_temp = ous.create(properties={'ou': 'templates'}) cos_temps = OUCosTemplates(topology_st.standalone, ou_temp.dn) cos_temp_u = cos_temps.create(properties={ 'ou' : 'ou_temp_u', 'description' : 'desc_temp_u', 'postalCode': '0' }) # Edit the user to add the seeAlso ... user.set('seeAlso', cos_temp_u.dn) # Now create 25,0000 templates, they *don't* need to apply to the user though! for i in range(1, 25001): cos_temp_u = cos_temps.create(properties={ 'ou' : 'ou_temp_%s' % i, 'description' : 'desc_temp_%s' % i, 'postalCode': '%s' % i }) if i % 500 == 0: start_time = time.monotonic() u_search = users.get('testuser') attrs = u_search.get_attr_vals_utf8('postalCode') end_time = time.monotonic() diff_time = end_time - start_time assert diff_time < THRESHOLD if i == 10000: # Now add our user to this template also. user.add('seeAlso', cos_temp_u.dn) start_time = time.monotonic() attrs_after = u_search.get_attr_vals_utf8('postalCode') end_time = time.monotonic() diff_time = end_time - start_time assert(set(attrs) < set(attrs_after)) assert diff_time < THRESHOLD
def get_cos_indirect_defs(self): return CosIndirectDefinitions(self._instance, self._dn).list()