basic_test.py 49 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179
  1. # --- BEGIN COPYRIGHT BLOCK ---
  2. # Copyright (C) 2019 Red Hat, Inc.
  3. # All rights reserved.
  4. #
  5. # License: GPL (version 3 or any later version).
  6. # See LICENSE for details.
  7. # --- END COPYRIGHT BLOCK ---
  8. """
  9. Will test AutoMememer Plugin with AotoMember Task and Retro Changelog
  10. """
  11. import os
  12. import pytest
  13. import time
  14. import re
  15. from lib389.topologies import topology_m1 as topo
  16. from lib389.idm.organizationalunit import OrganizationalUnits
  17. from lib389.idm.domain import Domain
  18. from lib389.idm.posixgroup import PosixGroups
  19. from lib389.plugins import AutoMembershipPlugin, AutoMembershipDefinitions, \
  20. MemberOfPlugin, AutoMembershipRegexRules, AutoMembershipDefinition, RetroChangelogPlugin
  21. from lib389.backend import Backends
  22. from lib389.config import Config
  23. from lib389._constants import DEFAULT_SUFFIX
  24. from lib389.idm.user import UserAccounts
  25. from lib389.idm.group import Groups, Group, UniqueGroup, nsAdminGroups, nsAdminGroup
  26. from lib389.tasks import Tasks, AutomemberRebuildMembershipTask, ExportTask
  27. from lib389.utils import ds_is_older
  28. from lib389.paths import Paths
  29. import ldap
  30. pytestmark = pytest.mark.tier1
  31. BASE_SUFF = "dc=autoMembers,dc=com"
  32. TEST_BASE = "dc=testAutoMembers,dc=com"
  33. BASE_REPL = "dc=replAutoMembers,dc=com"
  34. SUBSUFFIX = f'dc=SubSuffix,{BASE_SUFF}'
  35. PLUGIN_AUTO = "cn=Auto Membership Plugin,cn=plugins,cn=config"
  36. REPMANDN = "cn=ReplManager"
  37. CACHE_SIZE = '-1'
  38. CACHEMEM_SIZE = '10485760'
  39. AUTO_MEM_SCOPE_TEST = f'ou=Employees,{TEST_BASE}'
  40. AUTO_MEM_SCOPE_BASE = f'ou=Employees,{BASE_SUFF}'
  41. def add_base_entries(topo):
  42. """
  43. Will create suffix
  44. """
  45. for suffix, backend_name in [(BASE_SUFF, 'AutoMembers'), (SUBSUFFIX, 'SubAutoMembers'),
  46. (TEST_BASE, 'testAutoMembers'), (BASE_REPL, 'ReplAutoMembers'),
  47. ("dc=SubSuffix,{}".format(BASE_REPL), 'ReplSubAutoMembers')]:
  48. Backends(topo.ms["master1"]).create(properties={
  49. 'cn': backend_name,
  50. 'nsslapd-suffix': suffix,
  51. 'nsslapd-CACHE_SIZE': CACHE_SIZE,
  52. 'nsslapd-CACHEMEM_SIZE': CACHEMEM_SIZE})
  53. Domain(topo.ms["master1"], suffix).create(properties={
  54. 'dc': suffix.split('=')[1].split(',')[0],
  55. 'aci': [
  56. f'(targetattr="userPassword")(version 3.0;aci "Replication Manager '
  57. f'Access";allow (write,compare) userdn="ldap:///{REPMANDN},cn=config";)',
  58. f'(target ="ldap:///{suffix}")(targetattr !="cn||sn||uid") (version 3.0;'
  59. f'acl "Group Permission";allow (write) '
  60. f'(groupdn = "ldap:///cn=GroupMgr,{suffix}");)',
  61. f'(target ="ldap:///{suffix}")(targetattr !="userPassword")(version 3.0;acl '
  62. f'"Anonym-read access"; allow (read,search,compare)(userdn="ldap:///anyone");)'
  63. ]
  64. })
  65. for suffix, ou_cn in [(BASE_SUFF, 'userGroups'),
  66. (BASE_SUFF, 'Employees'),
  67. (BASE_SUFF, 'TaskEmployees'),
  68. (TEST_BASE, 'Employees')]:
  69. OrganizationalUnits(topo.ms["master1"], suffix).create(properties={'ou': ou_cn})
  70. def add_user(topo, user_id, suffix, uid_no, gid_no, role_usr):
  71. """
  72. Will create entries with nsAdminGroup objectclass
  73. """
  74. objectclasses = ['top', 'person', 'posixaccount', 'inetuser',
  75. 'nsMemberOf', 'nsAccount', 'nsAdminGroup']
  76. if ds_is_older('1.4.0'):
  77. objectclasses.remove('nsAccount')
  78. user = nsAdminGroups(topo.ms["master1"], suffix, rdn=None).create(properties={
  79. 'cn': user_id,
  80. 'sn': user_id,
  81. 'uid': user_id,
  82. 'homeDirectory': '/home/{}'.format(user_id),
  83. 'loginShell': '/bin/bash',
  84. 'uidNumber': uid_no,
  85. 'gidNumber': gid_no,
  86. 'objectclass': objectclasses,
  87. 'nsAdminGroupName': role_usr,
  88. 'seeAlso': 'uid={},{}'.format(user_id, suffix),
  89. 'entrydn': 'uid={},{}'.format(user_id, suffix)
  90. })
  91. return user
  92. def check_groups(topo, group_dn, user_dn, member):
  93. """
  94. Will check MEMBATTR
  95. """
  96. return bool(Group(topo.ms["master1"], group_dn).present(member, user_dn))
  97. def add_group(topo, suffix, group_id):
  98. """
  99. Will create groups
  100. """
  101. Groups(topo.ms["master1"], suffix, rdn=None).create(properties={
  102. 'cn': group_id
  103. })
  104. def number_memberof(topo, user, number):
  105. """
  106. Function to check if the memberOf attribute is present.
  107. """
  108. return len(nsAdminGroup(topo.ms["master1"], user).get_attr_vals_utf8('memberOf')) == number
  109. def add_group_entries(topo):
  110. """
  111. Will create multiple entries needed for this test script
  112. """
  113. for suffix, group in [(SUBSUFFIX, 'subsuffGroups'),
  114. (SUBSUFFIX, 'Employees'),
  115. (TEST_BASE, 'testuserGroups'),
  116. ("dc=SubSuffix,{}".format(BASE_REPL), 'replsubGroups'),
  117. (BASE_REPL, 'replsubGroups')]:
  118. add_group(topo, suffix, group)
  119. for group_cn in ['SubDef1', 'SubDef2', 'SubDef3', 'SubDef4', 'SubDef5']:
  120. add_group(topo, BASE_REPL, group_cn)
  121. for user in ['Managers', 'Contractors', 'Interns', 'Visitors']:
  122. add_group(topo, "cn=replsubGroups,{}".format(BASE_REPL), user)
  123. for ou_ou, group_cn in [("ou=userGroups,{}".format(BASE_SUFF), 'SuffDef1'),
  124. ("ou=userGroups,{}".format(BASE_SUFF), 'SuffDef2'),
  125. ("ou=userGroups,{}".format(BASE_SUFF), 'SuffDef3'),
  126. ("ou=userGroups,{}".format(BASE_SUFF), 'SuffDef4'),
  127. ("ou=userGroups,{}".format(BASE_SUFF), 'SuffDef5'),
  128. ("ou=userGroups,{}".format(BASE_SUFF), 'Contractors'),
  129. ("ou=userGroups,{}".format(BASE_SUFF), 'Managers'),
  130. ("CN=testuserGroups,{}".format(TEST_BASE), 'TestDef1'),
  131. ("CN=testuserGroups,{}".format(TEST_BASE), 'TestDef2'),
  132. ("CN=testuserGroups,{}".format(TEST_BASE), 'TestDef3'),
  133. ("CN=testuserGroups,{}".format(TEST_BASE), 'TestDef4'),
  134. ("CN=testuserGroups,{}".format(TEST_BASE), 'TestDef5')]:
  135. add_group(topo, ou_ou, group_cn)
  136. for ou_ou, group_cn, grp_no in [(SUBSUFFIX, 'SubDef1', '111'),
  137. (SUBSUFFIX, 'SubDef2', '222'),
  138. (SUBSUFFIX, 'SubDef3', '333'),
  139. (SUBSUFFIX, 'SubDef4', '444'),
  140. (SUBSUFFIX, 'SubDef5', '555'),
  141. ('cn=subsuffGroups,{}'.format(SUBSUFFIX),
  142. 'Managers', '666'),
  143. ('cn=subsuffGroups,{}'.format(SUBSUFFIX),
  144. 'Contractors', '999')]:
  145. PosixGroups(topo.ms["master1"], ou_ou, rdn=None).create(properties={
  146. 'cn': group_cn,
  147. 'gidNumber': grp_no
  148. })
  149. def add_member_attr(topo, group_dn, user_dn, member):
  150. """
  151. Will add members to groups
  152. """
  153. Group(topo.ms["master1"], group_dn).add(member, user_dn)
  154. def change_grp_objclass(new_object, member, type_of):
  155. """
  156. Will change objectClass
  157. """
  158. try:
  159. type_of.remove(member, None)
  160. except ldap.NO_SUCH_ATTRIBUTE:
  161. pass
  162. type_of.ensure_state(properties={
  163. 'cn': type_of.get_attr_val_utf8('cn'),
  164. 'objectClass': ['top', 'nsMemberOf', new_object]
  165. })
  166. @pytest.fixture(scope="module")
  167. def _create_all_entries(topo):
  168. """
  169. Fixture module that will create required entries for test cases.
  170. """
  171. add_base_entries(topo)
  172. add_group_entries(topo)
  173. auto = AutoMembershipPlugin(topo.ms["master1"])
  174. auto.add("nsslapd-pluginConfigArea", "cn=autoMembersPlugin,{}".format(BASE_REPL))
  175. MemberOfPlugin(topo.ms["master1"]).enable()
  176. automembers_definitions = AutoMembershipDefinitions(topo.ms["master1"])
  177. automembers_definitions.create(properties={
  178. 'cn': 'userGroups',
  179. 'autoMemberScope': f'ou=Employees,{BASE_SUFF}',
  180. 'autoMemberFilter': "objectclass=posixAccount",
  181. 'autoMemberDefaultGroup': [
  182. f'cn=SuffDef1,ou=userGroups,{BASE_SUFF}',
  183. f'cn=SuffDef2,ou=userGroups,{BASE_SUFF}',
  184. f'cn=SuffDef3,ou=userGroups,{BASE_SUFF}',
  185. f'cn=SuffDef4,ou=userGroups,{BASE_SUFF}',
  186. f'cn=SuffDef5,ou=userGroups,{BASE_SUFF}'
  187. ],
  188. 'autoMemberGroupingAttr': 'member:dn',
  189. })
  190. automembers_definitions.create(properties={
  191. 'cn': 'subsuffGroups',
  192. 'autoMemberScope': f'ou=Employees,{BASE_SUFF}',
  193. 'autoMemberFilter': "objectclass=posixAccount",
  194. 'autoMemberDefaultGroup': [
  195. f'cn=SubDef1,dc=subSuffix,{BASE_SUFF}',
  196. f'cn=SubDef2,dc=subSuffix,{BASE_SUFF}',
  197. f'cn=SubDef3,dc=subSuffix,{BASE_SUFF}',
  198. f'cn=SubDef4,dc=subSuffix,{BASE_SUFF}',
  199. f'cn=SubDef5,dc=subSuffix,{BASE_SUFF}',
  200. ],
  201. 'autoMemberGroupingAttr': 'memberuid:dn',
  202. })
  203. automembers_regex_usergroup = AutoMembershipRegexRules(topo.ms["master1"],
  204. f'cn=userGroups,{auto.dn}')
  205. automembers_regex_usergroup.create(properties={
  206. 'cn': 'Managers',
  207. 'description': f'Group placement for Managers',
  208. 'autoMemberTargetGroup': [f'cn=Managers,ou=userGroups,{BASE_SUFF}'],
  209. 'autoMemberInclusiveRegex': [
  210. "gidNumber=^9",
  211. "nsAdminGroupName=^Manager",
  212. ],
  213. "autoMemberExclusiveRegex": [
  214. "gidNumber=^[6-8]",
  215. "nsAdminGroupName=^Junior$",
  216. ],
  217. })
  218. automembers_regex_usergroup.create(properties={
  219. 'cn': 'Contractors',
  220. 'description': f'Group placement for Contractors',
  221. 'autoMemberTargetGroup': [f'cn=Contractors,ou=userGroups,{BASE_SUFF}'],
  222. 'autoMemberInclusiveRegex': [
  223. "gidNumber=^1",
  224. "nsAdminGroupName=Contractor",
  225. ],
  226. "autoMemberExclusiveRegex": [
  227. "gidNumber=^[2-4]",
  228. "nsAdminGroupName=^Employee$",
  229. ],
  230. })
  231. automembers_regex_sub = AutoMembershipRegexRules(topo.ms["master1"],
  232. f'cn=subsuffGroups,{auto.dn}')
  233. automembers_regex_sub.create(properties={
  234. 'cn': 'Managers',
  235. 'description': f'Group placement for Managers',
  236. 'autoMemberTargetGroup': [f'cn=Managers,cn=subsuffGroups,dc=subSuffix,{BASE_SUFF}'],
  237. 'autoMemberInclusiveRegex': [
  238. "gidNumber=^[1-4]..3$",
  239. "uidNumber=^5.5$",
  240. "nsAdminGroupName=^Manager$|^Supervisor$",
  241. ],
  242. "autoMemberExclusiveRegex": [
  243. "gidNumber=^[6-8].0$",
  244. "uidNumber=^999$",
  245. "nsAdminGroupName=^Junior$",
  246. ],
  247. })
  248. automembers_regex_sub.create(properties={
  249. 'cn': 'Contractors',
  250. 'description': f'Group placement for Contractors',
  251. 'autoMemberTargetGroup': [f'cn=Contractors,cn=subsuffGroups,dc=SubSuffix,{BASE_SUFF}'],
  252. 'autoMemberInclusiveRegex': [
  253. "gidNumber=^[5-9].3$",
  254. "uidNumber=^8..5$",
  255. "nsAdminGroupName=^Contract|^Temporary$",
  256. ],
  257. "autoMemberExclusiveRegex": [
  258. "gidNumber=^[2-4]00$",
  259. "uidNumber=^[1,3,8]99$",
  260. "nsAdminGroupName=^Employee$",
  261. ],
  262. })
  263. for cn_name, ou_name in [('testuserGroups', 'Employees'), ('hostGroups', 'HostEntries')]:
  264. automembers_definitions.create(properties={
  265. 'cn': cn_name,
  266. 'autoMemberScope': f'ou={ou_name},dc=testautoMembers,dc=com',
  267. 'autoMemberFilter': "objectclass=posixAccount",
  268. 'autoMemberDefaultGroup': [
  269. f'cn=TestDef1,cn={cn_name},dc=testautoMembers,dc=com',
  270. f'cn=TestDef2,cn={cn_name},dc=testautoMembers,dc=com',
  271. f'cn=TestDef3,cn={cn_name},dc=testautoMembers,dc=com',
  272. f'cn=TestDef4,cn={cn_name},dc=testautoMembers,dc=com',
  273. f'cn=TestDef5,cn={cn_name},dc=testautoMembers,dc=com',
  274. ],
  275. 'autoMemberGroupingAttr': 'member:dn',
  276. })
  277. topo.ms["master1"].restart()
  278. def test_disable_the_plug_in(topo, _create_all_entries):
  279. """Plug-in and check the status
  280. :id: 4feee76c-e7ff-11e8-836e-8c16451d917b
  281. :setup: Instance with replication
  282. :steps:
  283. 1. Disable the plug-in and check the status
  284. 2. Enable the plug-in and check the status
  285. :expected results:
  286. 1. Should success
  287. 2. Should success
  288. """
  289. instance_auto = AutoMembershipPlugin(topo.ms["master1"])
  290. instance_auto.disable()
  291. assert not instance_auto.status()
  292. instance_auto.enable()
  293. assert instance_auto.status()
  294. def test_custom_config_area(topo, _create_all_entries):
  295. """Custom config area
  296. :id: 4fefb8cc-e7ff-11e8-92fd-8c16451d917b
  297. :setup: Instance with replication
  298. :steps:
  299. 1. Check whether the plugin can be configured for custom config area
  300. 2. After adding custom config area can be removed
  301. :expected results:
  302. 1. Should success
  303. 2. Should success
  304. """
  305. instance_auto = AutoMembershipPlugin(topo.ms["master1"])
  306. instance_auto.replace("nsslapd-pluginConfigArea", DEFAULT_SUFFIX)
  307. assert instance_auto.get_attr_val_utf8("nsslapd-pluginConfigArea")
  308. instance_auto.remove("nsslapd-pluginConfigArea", DEFAULT_SUFFIX)
  309. assert not instance_auto.get_attr_val_utf8("nsslapd-pluginConfigArea")
  310. @pytest.mark.bz834053
  311. def test_ability_to_control_behavior_of_modifiers_name(topo, _create_all_entries):
  312. """Control behaviour of modifier's name
  313. :id: 4ff16370-e7ff-11e8-838d-8c16451d917b
  314. :setup: Instance with replication
  315. :steps:
  316. 1. Turn on 'nsslapd-plugin-binddn-tracking'
  317. 2. Add an user
  318. 3. Check the creatorsname in the user entry
  319. 4. Check the internalCreatorsname in the user entry
  320. 5. Check the modifiersname in the user entry
  321. 6. Check the internalModifiersname in the user entry
  322. 7. Unset nsslapd-plugin-binddn-tracking attribute under
  323. cn=config and delete the test enteries
  324. :expected results:
  325. 1. Should success
  326. 2. Should success
  327. 3. Should success
  328. 4. Should success
  329. 5. Should success
  330. 6. Should success
  331. 7. Should success
  332. """
  333. instance1 = topo.ms["master1"]
  334. configure = Config(instance1)
  335. configure.replace('nsslapd-plugin-binddn-tracking', 'on')
  336. instance1.restart()
  337. assert configure.get_attr_val_utf8('nsslapd-plugin-binddn-tracking') == 'on'
  338. user = add_user(topo, "User_autoMembers_05", "ou=Employees,{}".format(TEST_BASE),
  339. "19", "18", "Supervisor")
  340. # search the User DN name for the creatorsname in user entry
  341. assert user.get_attr_val_utf8('creatorsname') == 'cn=directory manager'
  342. # search the User DN name for the internalCreatorsname in user entry
  343. assert user.get_attr_val_utf8('internalCreatorsname') == \
  344. 'cn=ldbm database,cn=plugins,cn=config'
  345. # search the modifiersname in the user entry
  346. assert user.get_attr_val_utf8('modifiersname') == 'cn=directory manager'
  347. # search the internalModifiersname in the user entry
  348. assert user.get_attr_val_utf8('internalModifiersname') == \
  349. 'cn=MemberOf Plugin,cn=plugins,cn=config'
  350. # unset nsslapd-plugin-binddn-tracking attribute
  351. configure.replace('nsslapd-plugin-binddn-tracking', 'off')
  352. instance1.restart()
  353. # deleting test enteries of automember05 test case
  354. user.delete()
  355. def test_posixaccount_objectclass_automemberdefaultgroup(topo, _create_all_entries):
  356. """Verify the PosixAccount user
  357. :id: 4ff0f642-e7ff-11e8-ac88-8c16451d917b
  358. :setup: Instance with replication
  359. :steps:
  360. 1. Add users with PosixAccount ObjectClass
  361. 2. Verify the same user added as a member to autoMemberDefaultGroup
  362. :expected results:
  363. 1. Should success
  364. 2. Should success
  365. """
  366. test_id = "autoMembers_05"
  367. default_group = "cn=TestDef1,CN=testuserGroups,{}".format(TEST_BASE)
  368. user = add_user(topo, "User_{}".format(test_id), AUTO_MEM_SCOPE_TEST, "19", "18", "Supervisor")
  369. assert check_groups(topo, default_group, user.dn, "member")
  370. user.delete()
  371. with pytest.raises(AssertionError):
  372. assert check_groups(topo, default_group, user.dn, "member")
  373. def test_duplicated_member_attributes_added_when_the_entry_is_re_created(topo, _create_all_entries):
  374. """Checking whether duplicated member attributes added when the entry is re-created
  375. :id: 4ff2afaa-e7ff-11e8-8a92-8c16451d917b
  376. :setup: Instance with replication
  377. :steps:
  378. 1. Create a user
  379. 2. It should present as member in all automember groups
  380. 3. Delete use
  381. 4. It should not present as member in all automember groups
  382. 5. Recreate same user
  383. 6. It should present as member in all automember groups
  384. :expected results:
  385. 1. Should success
  386. 2. Should success
  387. 3. Should success
  388. 4. Should success
  389. 5. Should success
  390. 6. Should success
  391. """
  392. test_id = "autoMembers_06"
  393. default_group = "cn=TestDef1,CN=testuserGroups,{}".format(TEST_BASE)
  394. user = add_user(topo, "User_{}".format(test_id), AUTO_MEM_SCOPE_TEST, "19", "16", "Supervisor")
  395. assert check_groups(topo, default_group, user.dn, "member")
  396. user.delete()
  397. with pytest.raises(AssertionError):
  398. assert check_groups(topo, default_group, user.dn, "member")
  399. user = add_user(topo, "User_{}".format(test_id), AUTO_MEM_SCOPE_TEST, "19", "15", "Supervisor")
  400. assert check_groups(topo, default_group, user.dn, "member")
  401. user.delete()
  402. def test_multi_valued_automemberdefaultgroup_for_hostgroups(topo, _create_all_entries):
  403. """Multi-valued autoMemberDefaultGroup
  404. :id: 4ff32a02-e7ff-11e8-99a1-8c16451d917b
  405. :setup: Instance with replication
  406. :steps:
  407. 1. Create a user
  408. 2. Check user is present in all Automember Groups as member
  409. 3. Delete the user
  410. 4. Check user is not present in all Automember Groups
  411. :expected results:
  412. 1. Should success
  413. 2. Should success
  414. 3. Should success
  415. 4. Should success
  416. """
  417. test_id = "autoMembers_07"
  418. default_group1 = "cn=TestDef1,CN=testuserGroups,{}".format(TEST_BASE)
  419. default_group2 = "cn=TestDef2,CN=testuserGroups,{}".format(TEST_BASE)
  420. default_group3 = "cn=TestDef3,CN=testuserGroups,{}".format(TEST_BASE)
  421. user = add_user(topo, "User_{}".format(test_id), AUTO_MEM_SCOPE_TEST, "19", "14", "TestEngr")
  422. for grp in [default_group1, default_group2, default_group3]:
  423. assert check_groups(topo, grp, user.dn, "member")
  424. user.delete()
  425. with pytest.raises(AssertionError):
  426. assert check_groups(topo, default_group1, user.dn, "member")
  427. def test_plugin_creates_member_attributes_of_the_automemberdefaultgroup(topo, _create_all_entries):
  428. """Checking whether plugin creates member attributes if it already
  429. exists for some of the autoMemberDefaultGroup
  430. :id: 4ff3ba76-e7ff-11e8-9846-8c16451d917b
  431. :setup: Instance with replication
  432. :steps:
  433. 1. Add a non existing user to some groups as member
  434. 2. Then Create the user
  435. 3. Check the same user is present to other groups also as member
  436. :expected results:
  437. 1. Should success
  438. 2. Should success
  439. 3. Should success
  440. """
  441. test_id = "autoMembers_08"
  442. default_group1 = "cn=TestDef1,CN=testuserGroups,{}".format(TEST_BASE)
  443. default_group2 = "cn=TestDef5,CN=testuserGroups,{}".format(TEST_BASE)
  444. default_group3 = "cn=TestDef3,CN=testuserGroups,{}".format(TEST_BASE)
  445. add_member_attr(topo,
  446. "cn=TestDef2,CN=testuserGroups,{}".format(TEST_BASE),
  447. "uid=User_{},{}".format(test_id, AUTO_MEM_SCOPE_TEST), "member")
  448. add_member_attr(topo,
  449. "cn=TestDef4,CN=testuserGroups,{}".format(TEST_BASE),
  450. "uid=User_{},{}".format(test_id, AUTO_MEM_SCOPE_TEST), "member")
  451. user = add_user(topo, "User_{}".format(test_id), AUTO_MEM_SCOPE_TEST, "19", "14", "TestEngr")
  452. for grp in [default_group1, default_group2, default_group3]:
  453. assert check_groups(topo, grp, user.dn, "member")
  454. user.delete()
  455. def test_multi_valued_automemberdefaultgroup_with_uniquemember(topo, _create_all_entries):
  456. """Multi-valued autoMemberDefaultGroup with uniquemember attributes
  457. :id: 4ff4461c-e7ff-11e8-8124-8c16451d917b
  458. :setup: Instance with replication
  459. :steps:
  460. 1. Modify automember config entry to use uniquemember
  461. 2. Change object class for all groups which is used for automember grouping
  462. 3. Add user uniquemember attributes
  463. 4. Check uniqueMember attribute in groups
  464. 5. Revert the changes done above
  465. :expected results:
  466. 1. Should success
  467. 2. Should success
  468. 3. Should success
  469. 4. Should success
  470. 5. Should success
  471. """
  472. test_id = "autoMembers_09"
  473. instance = topo.ms["master1"]
  474. auto = AutoMembershipPlugin(topo.ms["master1"])
  475. # Modify automember config entry to use uniquemember: cn=testuserGroups,PLUGIN_AUTO
  476. AutoMembershipDefinition(
  477. instance, "cn=testuserGroups,{}".format(auto.dn)).replace('autoMemberGroupingAttr',
  478. "uniquemember: dn")
  479. instance.restart()
  480. default_group1 = "cn=TestDef1,CN=testuserGroups,{}".format(TEST_BASE)
  481. default_group2 = "cn=TestDef2,CN=testuserGroups,{}".format(TEST_BASE)
  482. default_group3 = "cn=TestDef3,CN=testuserGroups,{}".format(TEST_BASE)
  483. default_group4 = "cn=TestDef4,CN=testuserGroups,{}".format(TEST_BASE)
  484. default_group5 = "cn=TestDef5,CN=testuserGroups,{}".format(TEST_BASE)
  485. for grp in (default_group1, default_group2, default_group3, default_group4, default_group5):
  486. instance_of_group = Group(topo.ms["master1"], grp)
  487. change_grp_objclass("groupOfUniqueNames", "member", instance_of_group)
  488. # Add user: uid=User_{test_id}, AutoMemScope
  489. user = add_user(topo, "User_{}".format(test_id), AUTO_MEM_SCOPE_TEST, "19", "14", "New")
  490. # Checking groups...
  491. assert user.dn.lower() in UniqueGroup(topo.ms["master1"],
  492. default_group1).get_attr_val_utf8("uniqueMember")
  493. # Delete user uid=User_{test_id},AutoMemScope
  494. user.delete()
  495. # Change the automember config back to using \"member\"
  496. AutoMembershipDefinition(
  497. instance, "cn=testuserGroups,{}".format(auto.dn)).replace('autoMemberGroupingAttr',
  498. "member: dn")
  499. for grp in [default_group1, default_group2, default_group3, default_group4, default_group5]:
  500. instance_of_group = UniqueGroup(topo.ms["master1"], grp)
  501. change_grp_objclass("groupOfNames", "uniquemember", instance_of_group)
  502. topo.ms["master1"].restart()
  503. def test_invalid_automembergroupingattr_member(topo, _create_all_entries):
  504. """Invalid autoMemberGroupingAttr-member
  505. :id: 4ff4b598-e7ff-11e8-a3a3-8c16451d917b
  506. :setup: Instance with replication
  507. :steps:
  508. 1. Change object class for one group which is used for automember grouping
  509. 2. Try to add user with invalid parameter
  510. 3. Check member attribute on other groups
  511. 4. Check member attribute on group where object class was changed
  512. 5. Revert the object class where it was changed
  513. :expected results:
  514. 1. Should success
  515. 2. Should fail (ldap.UNWILLING_TO_PERFORM)
  516. 3. Should success
  517. 4. Should fail (AssertionError)
  518. 5. Should success
  519. """
  520. test_id = "autoMembers_10"
  521. default_group = "cn=TestDef1,CN=testuserGroups,{}".format(TEST_BASE)
  522. instance_of_group = Group(topo.ms["master1"], default_group)
  523. change_grp_objclass("groupOfUniqueNames", "member", instance_of_group)
  524. with pytest.raises(ldap.UNWILLING_TO_PERFORM):
  525. add_user(topo, "User_{}".format(test_id), AUTO_MEM_SCOPE_TEST, "19", "20", "Invalid")
  526. with pytest.raises(AssertionError):
  527. assert check_groups(topo, default_group,
  528. "uid=User_{},{}".format(test_id, AUTO_MEM_SCOPE_TEST), "member")
  529. change_grp_objclass("groupOfNames", "uniquemember", instance_of_group)
  530. def test_valid_and_invalid_automembergroupingattr(topo, _create_all_entries):
  531. """Valid and invalid autoMemberGroupingAttr
  532. :id: 4ff4fad0-e7ff-11e8-9cbd-8c16451d917b
  533. :setup: Instance with replication
  534. :steps:
  535. 1. Change object class for some groups which is used for automember grouping
  536. 2. Try to add user with invalid parameter
  537. 3. Check member attribute on other groups
  538. 4. Check member attribute on groups where object class was changed
  539. 5. Revert the object class where it was changed
  540. :expected results:
  541. 1. Should success
  542. 2. Should fail (ldap.UNWILLING_TO_PERFORM)
  543. 3. Should success
  544. 4. Should fail (AssertionError)
  545. 5. Should success
  546. """
  547. test_id = "autoMembers_11"
  548. default_group_1 = "cn=TestDef1,CN=testuserGroups,{}".format(TEST_BASE)
  549. default_group_2 = "cn=TestDef2,CN=testuserGroups,{}".format(TEST_BASE)
  550. default_group_3 = "cn=TestDef3,CN=testuserGroups,{}".format(TEST_BASE)
  551. default_group_4 = "cn=TestDef4,CN=testuserGroups,{}".format(TEST_BASE)
  552. default_group_5 = "cn=TestDef5,CN=testuserGroups,{}".format(TEST_BASE)
  553. grp_4_5 = [default_group_4, default_group_5]
  554. for grp in grp_4_5:
  555. instance_of_group = Group(topo.ms["master1"], grp)
  556. change_grp_objclass("groupOfUniqueNames", "member", instance_of_group)
  557. with pytest.raises(ldap.UNWILLING_TO_PERFORM):
  558. add_user(topo, "User_{}".format(test_id), AUTO_MEM_SCOPE_TEST, "19", "24", "MixUsers")
  559. for grp in [default_group_1, default_group_2, default_group_3]:
  560. assert not check_groups(topo, grp, "cn=User_{},{}".format(test_id,
  561. AUTO_MEM_SCOPE_TEST), "member")
  562. for grp in grp_4_5:
  563. with pytest.raises(AssertionError):
  564. assert check_groups(topo, grp, "cn=User_{},{}".format(test_id,
  565. AUTO_MEM_SCOPE_TEST), "member")
  566. for grp in grp_4_5:
  567. instance_of_group = Group(topo.ms["master1"], grp)
  568. change_grp_objclass("groupOfNames", "uniquemember", instance_of_group)
  569. def test_add_regular_expressions_for_user_groups_and_check_for_member_attribute_after_adding_users(
  570. topo, _create_all_entries):
  571. """Regular expressions for user groups
  572. :id: 4ff53fc2-e7ff-11e8-9a18-8c16451d917b
  573. :setup: Instance with replication
  574. :steps:
  575. 1. Add user with a match with regular expressions for user groups
  576. 2. check for member attribute after adding users
  577. :expected results:
  578. 1. Should success
  579. 2. Should success
  580. """
  581. test_id = "autoMembers_12"
  582. default_group = f'cn=SuffDef1,ou=userGroups,{BASE_SUFF}'
  583. user = add_user(topo, "User_{}".format(test_id), AUTO_MEM_SCOPE_BASE, "19", "0", "HR")
  584. assert check_groups(topo, default_group, user.dn, "member")
  585. assert number_memberof(topo, user.dn, 5)
  586. user.delete()
  587. LIST_FOR_PARAMETERIZATION = [
  588. ("autoMembers_22", "5288", "5289", "Contractor", "5291", "5292", "Contractors"),
  589. ("autoMembers_21", "1161", "1162", "Contractor", "1162", "1163", "Contractors"),
  590. ("autoMembers_20", "1188", "1189", "CEO", "1191", "1192", "Contractors"),
  591. ("autoMembers_15", "9288", "9289", "Manager", "9291", "9292", "Managers"),
  592. ("autoMembers_14", "561", "562", "Manager", "562", "563", "Managers"),
  593. ("autoMembers_13", "9788", "9789", "VPEngg", "9392", "9393", "Managers")]
  594. @pytest.mark.parametrize("testid, uid, gid, role, uid2, gid2, m_grp", LIST_FOR_PARAMETERIZATION)
  595. def test_matching_gid_role_inclusive_regular_expression(topo, _create_all_entries,
  596. testid, uid, gid, role, uid2, gid2, m_grp):
  597. """Matching gid nos and Role for the Inclusive regular expression
  598. :id: 4ff71ce8-e7ff-11e8-b69b-8c16451d917b
  599. :parametrized: yes
  600. :setup: Instance with replication
  601. :steps:
  602. 1. Create users with matching gid nos and Role for the Inclusive regular expression
  603. 2. It will be filtered with gidNumber, uidNumber and nsAdminGroupName
  604. 3. It will a match for contract_grp
  605. :expected results:
  606. 1. Should success
  607. 2. Should success
  608. 3. Should success
  609. """
  610. contract_grp = f'cn={m_grp},ou=userGroups,{BASE_SUFF}'
  611. user1 = add_user(topo, "User_{}".format(testid), AUTO_MEM_SCOPE_BASE, uid, gid, role)
  612. user2 = add_user(topo, "SecondUser_{}".format(testid), AUTO_MEM_SCOPE_BASE,
  613. uid2, gid2, role)
  614. for user_dn in [user1.dn, user2.dn]:
  615. assert check_groups(topo, contract_grp, user_dn, "member")
  616. assert number_memberof(topo, user1.dn, 1)
  617. for user in [user1, user2]:
  618. user.delete()
  619. LIST_FOR_PARAMETERIZATION = [
  620. ("autoMembers_26", "5788", "5789", "Intern", "Contractors", "SuffDef1", 5),
  621. ("autoMembers_25", "9788", "9789", "Employee", "Contractors", "Managers", 1),
  622. ("autoMembers_24", "1110", "1111", "Employee", "Contractors", "SuffDef1", 5),
  623. ("autoMembers_23", "2788", "2789", "Contractor", "Contractors", "SuffDef1", 5),
  624. ("autoMembers_19", "5788", "5789", "HRManager", "Managers", "SuffDef1", 5),
  625. ("autoMembers_18", "6788", "6789", "Junior", "Managers", "SuffDef1", 5),
  626. ("autoMembers_17", "562", "563", "Junior", "Managers", "SuffDef1", 5),
  627. ("autoMembers_16", "6788", "6789", "Manager", "Managers", "SuffDef1", 5)]
  628. @pytest.mark.parametrize("testid, uid, gid, role, c_grp, m_grp, number", LIST_FOR_PARAMETERIZATION)
  629. def test_gid_and_role_inclusive_exclusive_regular_expression(topo, _create_all_entries,
  630. testid, uid, gid, role,
  631. c_grp, m_grp, number):
  632. """Matching gid nos and Role for the Inclusive and Exclusive regular expression
  633. :id: 4ff7d160-e7ff-11e8-8fbc-8c16451d917b
  634. :parametrized: yes
  635. :setup: Instance with replication
  636. :steps:
  637. 1. Create user with not matching gid nos and Role for
  638. the Inclusive and Exclusive regular expression
  639. 2. It will be filtered with gidNumber, uidNumber and nsAdminGroupName
  640. 3. It will not match for contract_grp(Exclusive regular expression)
  641. 4. It will match for default_group(Inclusive regular expression)
  642. :expected results:
  643. 1. Should success
  644. 2. Should success
  645. 3. Should success
  646. 4. Should success
  647. """
  648. contract_grp = f'cn={c_grp},ou=userGroups,{BASE_SUFF}'
  649. default_group = f'cn={m_grp},ou=userGroups,{BASE_SUFF}'
  650. user = add_user(topo, "User_{}".format(testid), AUTO_MEM_SCOPE_BASE, uid, gid, role)
  651. with pytest.raises(AssertionError):
  652. assert check_groups(topo, contract_grp, user.dn, "member")
  653. check_groups(topo, default_group, user.dn, "member")
  654. assert number_memberof(topo, user.dn, number)
  655. user.delete()
  656. LIST_FOR_PARAMETERIZATION = [
  657. ("autoMembers_32", "555", "720", "Employee", "SubDef1", "SubDef3"),
  658. ("autoMembers_31", "515", "200", "Junior", "SubDef1", "SubDef5"),
  659. ("autoMembers_30", "999", "400", "Supervisor", "SubDef1", "SubDef2"),
  660. ("autoMembers_28", "555", "3663", "ContractHR", "Contractors,cn=subsuffGroups",
  661. "Managers,cn=subsuffGroups")]
  662. @pytest.mark.parametrize("testid, uid, gid, role, c_grp, m_grp", LIST_FOR_PARAMETERIZATION)
  663. def test_managers_contractors_exclusive_regex_rules_member_uid(topo, _create_all_entries,
  664. testid, uid, gid, role,
  665. c_grp, m_grp):
  666. """Match both managers and contractors exclusive regex rules
  667. :id: 4ff8be18-e7ff-11e8-94aa-8c16451d917b
  668. :parametrized: yes
  669. :setup: Instance with replication
  670. :steps:
  671. 1. Add Users to match both managers and contractors exclusive regex rules,
  672. memberUid created in Default grp
  673. 2. It will be filtered with gidNumber, uidNumber and nsAdminGroupName
  674. 3. It will match for default_group1 and default_group2(Inclusive regular expression)
  675. :expected results:
  676. 1. Should success
  677. 2. Should success
  678. 3. Should success
  679. """
  680. default_group1 = f'cn={c_grp},{SUBSUFFIX}'
  681. default_group2 = f'cn={m_grp},{SUBSUFFIX}'
  682. user = add_user(topo, "User_{}".format(testid), AUTO_MEM_SCOPE_BASE, uid, gid, role)
  683. for group in [default_group1, default_group2]:
  684. assert check_groups(topo, group, user.dn, "memberuid")
  685. user.delete()
  686. LIST_FOR_PARAMETERIZATION = [
  687. ("autoMembers_27", "595", "690", "ContractHR", "Managers", "Contractors"),
  688. ("autoMembers_29", "8195", "2753", "Employee", "Contractors", "Managers"),
  689. ("autoMembers_33", "545", "3333", "Supervisor", "Contractors", "Managers"),
  690. ("autoMembers_34", "8195", "693", "Temporary", "Managers", "Contractors")]
  691. @pytest.mark.parametrize("testid, uid, gid, role, c_grp, m_grp", LIST_FOR_PARAMETERIZATION)
  692. def test_managers_inclusive_regex_rule(topo, _create_all_entries,
  693. testid, uid, gid, role, c_grp, m_grp):
  694. """Match managers inclusive regex rule, and no
  695. inclusive/exclusive Contractors regex rules
  696. :id: 4ff8d862-e7ff-11e8-b688-8c16451d917b
  697. :parametrized: yes
  698. :setup: Instance with replication
  699. :steps:
  700. 1. Add User to match managers inclusive regex rule, and no
  701. inclusive/exclusive Contractors regex rules
  702. 2. It will be filtered with gidNumber, uidNumber and nsAdminGroupName(Supervisor)
  703. 3. It will match for managers_grp(Inclusive regular expression)
  704. 4. It will not match for contract_grp(Exclusive regular expression)
  705. :expected results:
  706. 1. Should success
  707. 2. Should success
  708. 3. Should success
  709. 4. Should success
  710. """
  711. contract_grp = f'cn={c_grp},cn=subsuffGroups,{SUBSUFFIX}'
  712. managers_grp = f'cn={m_grp},cn=subsuffGroups,{SUBSUFFIX}'
  713. user = add_user(topo, "User_{}".format(testid), AUTO_MEM_SCOPE_BASE, uid, gid, role)
  714. check_groups(topo, managers_grp, user.dn, "memberuid")
  715. with pytest.raises(AssertionError):
  716. assert check_groups(topo, contract_grp, user.dn, "memberuid")
  717. user.delete()
  718. def test_reject_invalid_config_and_we_donot_deadlock_the_server(topo, _create_all_entries):
  719. """Verify DS reject invalid config, and we don't deadlock the server
  720. :id: 4ff90c38-e7ff-11e8-b72a-8c16451d917b
  721. :setup: Instance with replication
  722. :steps:
  723. 1. Verify DS reject invalid config,
  724. 2. This operation don't deadlock the server
  725. :expected results:
  726. 1. Should success
  727. 2. Should success
  728. """
  729. # Changing config area to dc=automembers,dc=com
  730. instance = AutoMembershipPlugin(topo.ms["master1"])
  731. instance.replace("nsslapd-pluginConfigArea", BASE_SUFF)
  732. topo.ms["master1"] .restart()
  733. # Attempting to add invalid config...
  734. automembers = AutoMembershipDefinitions(topo.ms["master1"], BASE_SUFF)
  735. with pytest.raises(ldap.UNWILLING_TO_PERFORM):
  736. automembers.create(properties={
  737. 'cn': 'userGroups',
  738. "autoMemberScope": BASE_SUFF,
  739. "autoMemberFilter": "objectclass=posixAccount",
  740. "autoMemberDefaultGroup": f'cn=SuffDef1,ou=userGroups,{BASE_SUFF}',
  741. "autoMemberGroupingAttr": "member: dn"
  742. })
  743. # Verify server is still working
  744. automembers = AutoMembershipRegexRules(topo.ms["master1"],
  745. f'cn=userGroups,cn=Auto Membership Plugin,'
  746. f'cn=plugins,cn=config')
  747. with pytest.raises(ldap.ALREADY_EXISTS):
  748. automembers.create(properties={
  749. 'cn': 'Managers',
  750. 'description': f'Group placement for Managers',
  751. 'autoMemberTargetGroup': [f'cn=Managers,ou=userGroups,{BASE_SUFF}'],
  752. 'autoMemberInclusiveRegex': [
  753. "gidNumber=^9",
  754. "nsAdminGroupName=^Manager",
  755. ],
  756. })
  757. # Adding first user...
  758. for uid in range(300, 302):
  759. UserAccounts(topo.ms["master1"], BASE_SUFF, rdn=None).create_test_user(uid=uid, gid=uid)
  760. # Adding this line code to remove the automembers plugin configuration.
  761. instance.remove("nsslapd-pluginConfigArea", BASE_SUFF)
  762. topo.ms["master1"] .restart()
  763. @pytest.fixture(scope="module")
  764. def _startuptask(topo):
  765. """
  766. Fixture module that will change required entries for test cases.
  767. """
  768. for Configs in ["cn=Managers,cn=subsuffGroups",
  769. "cn=Contractors,cn=subsuffGroups",
  770. "cn=testuserGroups",
  771. "cn=subsuffGroups",
  772. "cn=hostGroups"]:
  773. AutoMembershipDefinition(topo.ms["master1"], f'{Configs},{PLUGIN_AUTO}').delete()
  774. AutoMembershipDefinition(topo.ms["master1"], "cn=userGroups,{}".format(PLUGIN_AUTO)).replace(
  775. 'autoMemberScope', 'ou=TaskEmployees,dc=autoMembers,dc=com')
  776. topo.ms['master1'].restart()
  777. @pytest.fixture(scope="function")
  778. def _fixture_for_build_task(request, topo):
  779. def finof():
  780. master = topo.ms['master1']
  781. auto_mem_scope = "ou=TaskEmployees,{}".format(BASE_SUFF)
  782. for user in nsAdminGroups(master, auto_mem_scope, rdn=None).list():
  783. user.delete()
  784. request.addfinalizer(finof)
  785. def bulk_check_groups(topo, GROUP_DN, MEMBATTR, TOTAL_MEM):
  786. assert len(nsAdminGroup(topo, GROUP_DN).get_attr_vals_utf8(MEMBATTR)) == TOTAL_MEM
  787. def test_automemtask_re_build_task(topo, _create_all_entries, _startuptask, _fixture_for_build_task):
  788. """
  789. :id: 4ff973a8-e7ff-11e8-a89b-8c16451d917b
  790. :setup: 4 Instances with replication
  791. :steps:
  792. 1. Add 10 users and enable autoMembers plug-in
  793. 2. Run automembers re-build task to create the member attributes
  794. 3. Search for any error logs
  795. :expected results:
  796. 1. Success
  797. 2. Success
  798. 3. Success
  799. """
  800. master = topo.ms['master1']
  801. testid = "autoMemTask_01"
  802. auto_mem_scope = "ou=TaskEmployees,{}".format(BASE_SUFF)
  803. managers_grp = "cn=Managers,ou=userGroups,{}".format(BASE_SUFF)
  804. contract_grp = "cn=Contractors,ou=userGroups,{}".format(BASE_SUFF)
  805. user_rdn = "User_{}".format(testid)
  806. # make sure the retro changelog is disabled
  807. RetroChangelogPlugin(master).disable()
  808. AutoMembershipPlugin(master).disable()
  809. master.restart()
  810. for i in range(10):
  811. add_user(topo, "{}{}".format(user_rdn, str(i)), auto_mem_scope, str(1188), str(1189), "Manager")
  812. for grp in (managers_grp, contract_grp):
  813. with pytest.raises(AssertionError):
  814. assert check_groups(topo, grp, f'uid=User_autoMemTask_010,{auto_mem_scope}', 'member')
  815. AutoMembershipPlugin(master).enable()
  816. master.restart()
  817. error_string = "automember_rebuild_task_thread"
  818. AutomemberRebuildMembershipTask(master).create(properties={
  819. 'basedn': auto_mem_scope,
  820. 'filter': "objectClass=posixAccount"
  821. })
  822. # Search for any error logs
  823. assert not master.searchErrorsLog(error_string)
  824. for grp in (managers_grp, contract_grp):
  825. bulk_check_groups(master, grp, "member", 10)
  826. def ldif_check_groups(USERS_DN, MEMBATTR, TOTAL_MEM, LDIF_FILE):
  827. study = open('{}'.format(LDIF_FILE), 'r')
  828. study_ready = study.read()
  829. assert len(re.findall("{}: {}".format(MEMBATTR, USERS_DN.lower()), study_ready)) == TOTAL_MEM
  830. def check_file_exists(export_ldif):
  831. count = 0
  832. while not os.path.exists(export_ldif) and count < 3:
  833. time.sleep(1)
  834. count += 1
  835. count = 0
  836. while (os.stat(export_ldif).st_size == 0) and count < 3:
  837. time.sleep(1)
  838. count += 1
  839. if os.path.exists(export_ldif) and os.stat(export_ldif).st_size != 0:
  840. return True
  841. else:
  842. return False
  843. def test_automemtask_export_task(topo, _create_all_entries, _startuptask, _fixture_for_build_task):
  844. """
  845. :id: 4ff98b18-e7ff-11e8-872a-8c16451d917b
  846. :setup: 4 Instances with replication
  847. :steps:
  848. 1. Add 10 users and enable autoMembers plug-in
  849. 2. Run automembers export task to create an ldif file with member attributes
  850. :expected results:
  851. 1. Success
  852. 2. Success
  853. """
  854. master = topo.ms['master1']
  855. p = Paths('master1')
  856. testid = "autoMemTask_02"
  857. auto_mem_scope = "ou=TaskEmployees,{}".format(BASE_SUFF)
  858. managers_grp = "cn=Managers,ou=userGroups,{}".format(BASE_SUFF)
  859. user_rdn = "User_{}".format(testid)
  860. # Disabling plugin
  861. AutoMembershipPlugin(master).disable()
  862. master.restart()
  863. for i in range(10):
  864. add_user(topo, "{}{}".format(user_rdn, str(i)), auto_mem_scope, str(2788), str(2789), "Manager")
  865. with pytest.raises(AssertionError):
  866. bulk_check_groups(master, managers_grp, "member", 10)
  867. AutoMembershipPlugin(master).enable()
  868. master.restart()
  869. export_ldif = p.backup_dir + "/Out_Export_02.ldif"
  870. if os.path.exists(export_ldif):
  871. os.remove(export_ldif)
  872. exp_task = Tasks(master)
  873. exp_task.automemberExport(suffix=auto_mem_scope, fstr='objectclass=posixAccount', ldif_out=export_ldif)
  874. check_file_exists(export_ldif)
  875. ldif_check_groups("cn={}".format(user_rdn), "member", 10, export_ldif)
  876. os.remove(export_ldif)
  877. def test_automemtask_mapping(topo, _create_all_entries, _startuptask, _fixture_for_build_task):
  878. """
  879. :id: 4ff9a206-e7ff-11e8-bf59-8c16451d917b
  880. :setup: 4 Instances with replication
  881. :steps:
  882. 1. Add 10 users and enable autoMembers plug-in
  883. 2. Run automembers Mapping task with input/output ldif files
  884. :expected results:
  885. 1. Should success
  886. 2. Should success
  887. """
  888. master = topo.ms['master1']
  889. p = Paths('master1')
  890. testid = "autoMemTask_02"
  891. auto_mem_scope = "ou=TaskEmployees,{}".format(BASE_SUFF)
  892. user_rdn = "User_{}".format(testid)
  893. export_ldif = p.backup_dir+"/Out_Export_02.ldif"
  894. output_ldif3 = p.backup_dir+"/Output_03.ldif"
  895. for file in [export_ldif, output_ldif3]:
  896. if os.path.exists(file):
  897. os.remove(file)
  898. for i in range(10):
  899. add_user(topo, "{}{}".format(user_rdn, str(i)), auto_mem_scope, str(2788), str(2789), "Manager")
  900. ExportTask(master).export_suffix_to_ldif(ldiffile=export_ldif, suffix=BASE_SUFF)
  901. check_file_exists(export_ldif)
  902. map_task = Tasks(master)
  903. map_task.automemberMap(ldif_in=export_ldif, ldif_out=output_ldif3)
  904. check_file_exists(output_ldif3)
  905. ldif_check_groups("cn={}".format(user_rdn), "member", 10, output_ldif3)
  906. for file in [export_ldif, output_ldif3]:
  907. os.remove(file)
  908. def test_automemtask_re_build(topo, _create_all_entries, _startuptask, _fixture_for_build_task):
  909. """
  910. :id: 4ff9b944-e7ff-11e8-ad35-8c16451d917b
  911. :setup: 4 Instances with replication
  912. :steps:
  913. 1. Add 10 users with inetOrgPerson object class
  914. 2. Run automembers re-build task to create the member attributes, exp to FAIL
  915. :expected results:
  916. 1. Should success
  917. 2. Should not success
  918. """
  919. master = topo.ms['master1']
  920. testid = "autoMemTask_04"
  921. auto_mem_scope = "ou=TaskEmployees,{}".format(BASE_SUFF)
  922. managers_grp = "cn=Managers,ou=userGroups,{}".format(BASE_SUFF)
  923. user_rdn = "User_{}".format(testid)
  924. # Disabling plugin
  925. AutoMembershipPlugin(master).disable()
  926. master.restart()
  927. for number in range(10):
  928. add_user(topo, f'{user_rdn}{number}', auto_mem_scope, str(number), str(number), "Manager")
  929. with pytest.raises(AssertionError):
  930. bulk_check_groups(master, managers_grp, "member", 10)
  931. # Enabling plugin
  932. AutoMembershipPlugin(master).enable()
  933. master.restart()
  934. AutomemberRebuildMembershipTask(master).create(properties={
  935. 'basedn': auto_mem_scope,
  936. 'filter': "objectClass=inetOrgPerson"
  937. })
  938. with pytest.raises(AssertionError):
  939. bulk_check_groups(master, managers_grp, "member", 10)
  940. def test_automemtask_export(topo, _create_all_entries, _startuptask, _fixture_for_build_task):
  941. """
  942. :id: 4ff9cf74-e7ff-11e8-b712-8c16451d917b
  943. :setup: 4 Instances with replication
  944. :steps:
  945. 1. Add 10 users with inetOrgPerson objectClass
  946. 2. Run automembers export task to create an ldif file with member attributes, exp to FAIL
  947. :expected results:
  948. 1. Should success
  949. 2. Should not success
  950. """
  951. master = topo.ms['master1']
  952. p = Paths('master1')
  953. testid = "autoMemTask_05"
  954. auto_mem_scope = "ou=TaskEmployees,{}".format(BASE_SUFF)
  955. managers_grp = "cn=Managers,ou=userGroups,{}".format(BASE_SUFF)
  956. user_rdn = "User_{}".format(testid)
  957. # Disabling plugin
  958. AutoMembershipPlugin(master).disable()
  959. master.restart()
  960. for number in range(10):
  961. add_user(topo, f'{user_rdn}{number}', auto_mem_scope, str(number), str(number), "Manager")
  962. with pytest.raises(AssertionError):
  963. bulk_check_groups(master, managers_grp, "member", 10)
  964. # Enabling plugin
  965. AutoMembershipPlugin(master).enable()
  966. master.restart()
  967. export_ldif = p.backup_dir + "/Out_Export_02.ldif"
  968. if os.path.exists(export_ldif):
  969. os.remove(export_ldif)
  970. exp_task = Tasks(master)
  971. exp_task.automemberExport(suffix=auto_mem_scope, fstr='objectclass=inetOrgPerson', ldif_out=export_ldif)
  972. check_file_exists(export_ldif)
  973. with pytest.raises(AssertionError):
  974. ldif_check_groups("uid={}".format(user_rdn), "member", 10, export_ldif)
  975. os.remove(export_ldif)
  976. def test_automemtask_run_re_build(topo, _create_all_entries, _startuptask, _fixture_for_build_task):
  977. """
  978. :id: 4ff9e5c2-e7ff-11e8-943e-8c16451d917b
  979. :setup: 4 Instances with replication
  980. :steps:
  981. 1. Add 10 users with inetOrgPerson obj class
  982. 2. Change plugin config
  983. 3. Enable plug-in and run re-build task to create the member attributes
  984. :expected results:
  985. 1. Should success
  986. 2. Should success
  987. 3. Should success
  988. """
  989. master = topo.ms['master1']
  990. p = Paths('master1')
  991. testid = "autoMemTask_06"
  992. auto_mem_scope = "ou=TaskEmployees,{}".format(BASE_SUFF)
  993. managers_grp = "cn=Managers,ou=userGroups,{}".format(BASE_SUFF)
  994. user_rdn = "User_{}".format(testid)
  995. # Disabling plugin
  996. AutoMembershipPlugin(master).disable()
  997. master.restart()
  998. for number in range(10):
  999. add_user(topo, f'{user_rdn}{number}', auto_mem_scope, '111', '111', "Manager")
  1000. for user in nsAdminGroups(master, auto_mem_scope, rdn=None).list():
  1001. user.add('objectclass', 'inetOrgPerson')
  1002. AutoMembershipDefinition(master,
  1003. f'cn=userGroups,{PLUGIN_AUTO}').replace('autoMemberFilter',
  1004. "objectclass=inetOrgPerson")
  1005. master.restart()
  1006. with pytest.raises(AssertionError):
  1007. bulk_check_groups(master, managers_grp, "member", 10)
  1008. AutoMembershipPlugin(master).enable()
  1009. master.restart()
  1010. AutomemberRebuildMembershipTask(master).create(properties={
  1011. 'basedn': auto_mem_scope,
  1012. 'filter': "objectClass=inetOrgPerson"})
  1013. time.sleep(2)
  1014. bulk_check_groups(master, managers_grp, "member", 10)
  1015. AutoMembershipDefinition(master,
  1016. f'cn=userGroups,{PLUGIN_AUTO}').replace('autoMemberFilter',
  1017. "objectclass=posixAccount")
  1018. master.restart()
  1019. def test_automemtask_run_export(topo, _create_all_entries, _startuptask, _fixture_for_build_task):
  1020. """
  1021. :id: 4ff9fba2-e7ff-11e8-a5ec-8c16451d917b
  1022. :setup: 4 Instances with replication
  1023. :steps:
  1024. 1. Add 10 users with inetOrgPerson objectClass
  1025. 2. change plugin config
  1026. 3. Run export task to create an ldif file with member attributes
  1027. :expected results:
  1028. 1. Should success
  1029. 2. Should success
  1030. 3. Should success
  1031. """
  1032. master = topo.ms['master1']
  1033. p = Paths('master1')
  1034. testid = "autoMemTask_07"
  1035. auto_mem_scope = "ou=TaskEmployees,{}".format(BASE_SUFF)
  1036. managers_grp = "cn=Managers,ou=userGroups,{}".format(BASE_SUFF)
  1037. user_rdn = "User_{}".format(testid)
  1038. # Disabling plugin
  1039. AutoMembershipPlugin(master).disable()
  1040. master.restart()
  1041. for number in range(10):
  1042. add_user(topo, f'{user_rdn}{number}', auto_mem_scope, '222', '222', "Manager")
  1043. for user in nsAdminGroups(master, auto_mem_scope, rdn=None).list():
  1044. user.add('objectclass', 'inetOrgPerson')
  1045. AutoMembershipDefinition(master, f'cn=userGroups,{PLUGIN_AUTO}').replace('autoMemberFilter',
  1046. "objectclass=inetOrgPerson")
  1047. master.restart()
  1048. # Enabling plugin
  1049. AutoMembershipPlugin(master).enable()
  1050. master.restart()
  1051. with pytest.raises(AssertionError):
  1052. bulk_check_groups(master, managers_grp, "member", 10)
  1053. export_ldif = p.backup_dir + "/Out_Export_02.ldif"
  1054. if os.path.exists(export_ldif):
  1055. os.remove(export_ldif)
  1056. exp_task = Tasks(master)
  1057. exp_task.automemberExport(suffix=auto_mem_scope, fstr='objectclass=inetOrgPerson', ldif_out=export_ldif)
  1058. check_file_exists(export_ldif)
  1059. ldif_check_groups("cn={}".format(user_rdn), "member", 10, export_ldif)
  1060. AutoMembershipDefinition(master, f'cn=userGroups,{PLUGIN_AUTO}').\
  1061. replace('autoMemberFilter', "objectclass=posixAccount")
  1062. if __name__ == "__main__":
  1063. CURRENT_FILE = os.path.realpath(__file__)
  1064. pytest.main("-s -v %s" % CURRENT_FILE)