dev-data.py 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476
  1. #!/usr/bin/env python
  2. """ Populate the pagure db with some dev data. """
  3. from __future__ import print_function, unicode_literals
  4. import argparse
  5. import os
  6. import sys
  7. from sqlalchemy import create_engine, MetaData
  8. import pagure
  9. import tests
  10. from pagure.lib import create_session
  11. '''
  12. Usage:
  13. python dev-data.py --init
  14. python dev-data.py --clean
  15. python dev-data.py --populate
  16. python dev-data.py --all
  17. '''
  18. _config = pagure.config.reload_config()
  19. def init_database():
  20. DB_URL = _config['DB_URL']
  21. # create the table if it doesnt exist
  22. pagure.lib.model.create_tables(
  23. DB_URL,
  24. _config.get('PATH_ALEMBIC_INI', None),
  25. acls=_config.get('ACLS', {}),
  26. debug=True)
  27. engine = create_engine('%s' % DB_URL, echo=True)
  28. metadata = MetaData(engine)
  29. metadata.reflect(bind=engine)
  30. return engine, metadata
  31. def empty_dev_db(metadata, engine):
  32. print('')
  33. print('')
  34. print('WARNING: Deleting all data from ', _config['DB_URL'])
  35. # Dangerous: this will wipe the data from the table but keep the schema
  36. print('')
  37. response = raw_input('Do you want to continue yes or no? ')
  38. if 'yes'.startswith(response.lower()):
  39. for tbl in reversed(metadata.sorted_tables):
  40. if tbl.fullname != 'acls':
  41. engine.execute(tbl.delete())
  42. def insert_data(session, username, user_email):
  43. _config['EMAIL_SEND'] = False
  44. _config['TESTING'] = True
  45. ######################################
  46. # tags
  47. item = pagure.lib.model.Tag(
  48. tag='tag1',
  49. )
  50. session.add(item)
  51. session.commit()
  52. ######################################
  53. # Users
  54. # Create a couple of users
  55. item = pagure.lib.model.User(
  56. user='pingou',
  57. fullname='PY C',
  58. password='foo',
  59. default_email='bar@pingou.com',
  60. )
  61. session.add(item)
  62. session.commit()
  63. item = pagure.lib.model.User(
  64. user='foo',
  65. fullname='foo bar',
  66. password='foo',
  67. default_email='foo@bar.com',
  68. )
  69. session.add(item)
  70. session.commit()
  71. item = pagure.lib.model.User(
  72. user=username,
  73. fullname=username,
  74. password='foo',
  75. default_email=user_email,
  76. )
  77. session.add(item)
  78. session.commit()
  79. ######################################
  80. # pagure_group
  81. item = pagure.lib.model.PagureGroup(
  82. group_name='admin',
  83. user_id=1,
  84. display_name='admin',
  85. description='Admin Group',
  86. )
  87. session.add(item)
  88. session.commit()
  89. # Add a couple of groups so that we can list them
  90. item = pagure.lib.model.PagureGroup(
  91. group_name='group',
  92. group_type='user',
  93. user_id=1, # pingou
  94. display_name='group group',
  95. description='this is a group group',
  96. )
  97. session.add(item)
  98. session.commit()
  99. item = pagure.lib.model.PagureGroup(
  100. group_name='rel-eng',
  101. group_type='user',
  102. user_id=1, # pingou
  103. display_name='Release Engineering',
  104. description='The group of release engineers',
  105. )
  106. session.add(item)
  107. session.commit()
  108. ######################################
  109. # projects
  110. import shutil
  111. # delete folder from local instance to start from a clean slate
  112. if os.path.exists(pagure.APP.config['GIT_FOLDER']):
  113. shutil.rmtree(_config['GIT_FOLDER'])
  114. tests.create_projects(session)
  115. tests.create_projects_git(_config['GIT_FOLDER'], bare=True)
  116. tests.add_content_git_repo(
  117. os.path.join(_config['GIT_FOLDER'], 'test.git'))
  118. tests.add_readme_git_repo(
  119. os.path.join(_config['GIT_FOLDER'], 'test.git'))
  120. # Add some content to the git repo
  121. tests.add_content_git_repo(
  122. os.path.join(_config['GIT_FOLDER'], 'forks', 'pingou',
  123. 'test.git'))
  124. tests.add_readme_git_repo(
  125. os.path.join(_config['GIT_FOLDER'], 'forks', 'pingou',
  126. 'test.git'))
  127. tests.add_commit_git_repo(
  128. os.path.join(_config['GIT_FOLDER'], 'forks', 'pingou',
  129. 'test.git'), ncommits=10)
  130. ######################################
  131. # user_emails
  132. item = pagure.lib.model.UserEmail(
  133. user_id=1,
  134. email='bar@pingou.com')
  135. session.add(item)
  136. item = pagure.lib.model.UserEmail(
  137. user_id=1,
  138. email='foo@pingou.com')
  139. session.add(item)
  140. item = pagure.lib.model.UserEmail(
  141. user_id=2,
  142. email='foo@bar.com')
  143. session.add(item)
  144. item = pagure.lib.model.UserEmail(
  145. user_id=3,
  146. email=user_email)
  147. session.add(item)
  148. session.commit()
  149. ######################################
  150. # user_emails_pending
  151. user = pagure.lib.search_user(session, username='pingou')
  152. email_pend = pagure.lib.model.UserEmailPending(
  153. user_id=user.id,
  154. email='foo@fp.o',
  155. token='abcdef',
  156. )
  157. session.add(email_pend)
  158. session.commit()
  159. ######################################
  160. # issues
  161. # Add an issue and tag it so that we can list them
  162. item = pagure.lib.model.Issue(
  163. id=1,
  164. uid='foobar',
  165. project_id=1,
  166. title='Problem with jenkins build',
  167. content='For some reason the tests fail at line:24',
  168. user_id=1, # pingou
  169. )
  170. session.add(item)
  171. session.commit()
  172. item = pagure.lib.model.Issue(
  173. id=2,
  174. uid='foobar2',
  175. project_id=1,
  176. title='Unit tests failing',
  177. content='Need to fix code for the unit tests to '
  178. 'pass so jenkins build can complete.',
  179. user_id=1, # pingou
  180. )
  181. session.add(item)
  182. session.commit()
  183. user = pagure.lib.search_user(session, username=username)
  184. item = pagure.lib.model.Issue(
  185. id=3,
  186. uid='foobar3',
  187. project_id=1,
  188. title='Segfault during execution',
  189. content='Index out of bounds for variable i?',
  190. user_id=user.id, # current user
  191. )
  192. session.add(item)
  193. session.commit()
  194. ######################################
  195. # pagure_user_group
  196. group = pagure.lib.search_groups(session, pattern=None,
  197. group_name="rel-eng", group_type=None)
  198. user = pagure.lib.search_user(session, username='pingou')
  199. item = pagure.lib.model.PagureUserGroup(
  200. user_id=user.id,
  201. group_id=group.id
  202. )
  203. session.add(item)
  204. session.commit()
  205. user = pagure.lib.search_user(session, username=username)
  206. group = pagure.lib.search_groups(session, pattern=None,
  207. group_name="admin", group_type=None)
  208. item = pagure.lib.model.PagureUserGroup(
  209. user_id=user.id,
  210. group_id=group.id
  211. )
  212. session.add(item)
  213. session.commit()
  214. user = pagure.lib.search_user(session, username='foo')
  215. group = pagure.lib.search_groups(session, pattern=None,
  216. group_name="group", group_type=None)
  217. item = pagure.lib.model.PagureUserGroup(
  218. user_id=user.id,
  219. group_id=group.id
  220. )
  221. session.add(item)
  222. session.commit()
  223. ######################################
  224. # projects_groups
  225. group = pagure.lib.search_groups(session, pattern=None,
  226. group_name="rel-eng", group_type=None)
  227. repo = pagure.lib.get_authorized_project(session, 'test')
  228. item = pagure.lib.model.ProjectGroup(
  229. project_id=repo.id,
  230. group_id=group.id
  231. )
  232. session.add(item)
  233. session.commit()
  234. group = pagure.lib.search_groups(session, pattern=None,
  235. group_name="admin", group_type=None)
  236. repo = pagure.lib.get_authorized_project(session, 'test2')
  237. item = pagure.lib.model.ProjectGroup(
  238. project_id=repo.id,
  239. group_id=group.id
  240. )
  241. session.add(item)
  242. session.commit()
  243. ######################################
  244. # pull_requests
  245. repo = pagure.lib.get_authorized_project(session, 'test')
  246. forked_repo = pagure.lib.get_authorized_project(session, 'test')
  247. req = pagure.lib.new_pull_request(
  248. session=session,
  249. repo_from=forked_repo,
  250. branch_from='master',
  251. repo_to=repo,
  252. branch_to='master',
  253. title='Fixing code for unittest',
  254. user=username,
  255. requestfolder=None,
  256. )
  257. session.commit()
  258. ######################################
  259. # tokens
  260. tests.create_tokens(session)
  261. ######################################
  262. # user_projects
  263. user = pagure.lib.search_user(session, username='foo')
  264. repo = pagure.lib.get_authorized_project(session, 'test')
  265. item = pagure.lib.model.ProjectUser(
  266. project_id=repo.id,
  267. user_id=user.id
  268. )
  269. session.add(item)
  270. session.commit()
  271. user = pagure.lib.search_user(session, username=username)
  272. repo = pagure.lib.get_authorized_project(session, 'test2')
  273. item = pagure.lib.model.ProjectUser(
  274. project_id=repo.id,
  275. user_id=user.id
  276. )
  277. session.add(item)
  278. session.commit()
  279. ######################################
  280. # issue_comments
  281. item = pagure.lib.model.IssueComment(
  282. user_id=1,
  283. issue_uid='foobar',
  284. comment='We may need to adjust the unittests instead of the code.',
  285. )
  286. session.add(item)
  287. session.commit()
  288. ######################################
  289. # issue_to_issue
  290. repo = pagure.lib.get_authorized_project(session, 'test')
  291. all_issues = pagure.lib.search_issues(session, repo)
  292. pagure.lib.add_issue_dependency(session, all_issues[0],
  293. all_issues[1], 'pingou',
  294. _config['GIT_FOLDER'])
  295. ######################################
  296. # pull_request_comments
  297. user = pagure.lib.search_user(session, username='pingou')
  298. # only 1 pull request available atm
  299. pr = pagure.lib.get_pull_request_of_user(session, "pingou")[0]
  300. item = pagure.lib.model.PullRequestComment(
  301. pull_request_uid=pr.uid,
  302. user_id=user.id,
  303. comment="+1 for me. Btw, could you rebase before you merge?",
  304. notification=0
  305. )
  306. session.add(item)
  307. session.commit()
  308. ######################################
  309. # pull_request_flags
  310. user = pagure.lib.search_user(session, username='pingou')
  311. # only 1 pull request available atm
  312. pr = pagure.lib.get_pull_request_of_user(session, "pingou")[0]
  313. item = pagure.lib.model.PullRequestFlag(
  314. uid="random_pr_flag_uid",
  315. pull_request_uid=pr.uid,
  316. user_id=user.id,
  317. username=user.user,
  318. percent=80,
  319. comment="Jenkins build passes",
  320. url=str(pr.id)
  321. )
  322. session.add(item)
  323. session.commit()
  324. ######################################
  325. # tags_issues
  326. repo = pagure.lib.get_authorized_project(session, 'test')
  327. issues = pagure.lib.search_issues(session, repo)
  328. item = pagure.lib.model.TagIssue(
  329. issue_uid=issues[0].uid,
  330. tag='Blocker',
  331. )
  332. session.add(item)
  333. session.commit()
  334. ######################################
  335. # tokens_acls
  336. tests.create_tokens_acl(session)
  337. ######################################
  338. # Fork a project
  339. # delete fork data
  340. fork_proj_location = "forks/foo/test.git"
  341. try:
  342. shutil.rmtree(os.path.join(_config['GIT_FOLDER'],
  343. fork_proj_location))
  344. except:
  345. print('git folder already deleted')
  346. try:
  347. shutil.rmtree(os.path.join(_config['DOCS_FOLDER'],
  348. fork_proj_location))
  349. except:
  350. print('docs folder already deleted')
  351. try:
  352. shutil.rmtree(os.path.join(_config['TICKETS_FOLDER'],
  353. fork_proj_location))
  354. except:
  355. print('tickets folder already deleted')
  356. try:
  357. shutil.rmtree(os.path.join(_config['REQUESTS_FOLDER'],
  358. fork_proj_location))
  359. except:
  360. print('requests folder already deleted')
  361. repo = pagure.lib.get_authorized_project(session, 'test')
  362. result = pagure.lib.fork_project(session, 'foo', repo,
  363. _config['GIT_FOLDER'],
  364. _config['DOCS_FOLDER'],
  365. _config['TICKETS_FOLDER'],
  366. _config['REQUESTS_FOLDER'])
  367. if result == 'Repo "test" cloned to "foo/test"':
  368. session.commit()
  369. if __name__ == "__main__":
  370. desc = "Run the dev database initialization/insertion/deletion " \
  371. "script for db located " + str(_config['DB_URL'])
  372. parser = argparse.ArgumentParser(prog="dev-data", description=desc)
  373. parser.add_argument('-i', '--init', action="store_true",
  374. help="Create the dev db")
  375. parser.add_argument('-p', '--populate', action="store_true",
  376. help="Add test data to the db")
  377. parser.add_argument('-d', '--delete', action="store_true",
  378. help="Wipe the dev db")
  379. parser.add_argument('-a', '--all', action="store_true",
  380. help="Create, Wipe, Populate the dev db")
  381. args = parser.parse_args()
  382. # forcing the user to choose
  383. if not any(vars(args).values()):
  384. parser.error('No arguments provided.')
  385. if args.init or args.delete or args.all:
  386. eng, meta = init_database()
  387. if args.delete or args.all:
  388. empty_dev_db(meta, eng)
  389. if args.populate or args.all:
  390. session = create_session(_config['DB_URL'])
  391. invalid_option = ['pingou', 'bar@pingou.com', 'foo', 'foo@bar.com']
  392. print("")
  393. user_name = raw_input(
  394. "Enter your username so we can add you into the test data: ")
  395. while user_name in invalid_option:
  396. print("Reserved names: " + str(invalid_option))
  397. user_name = raw_input(
  398. "Enter your username so we can add you into the test data: ")
  399. if not user_name.replace(" ", ""):
  400. user_name = 'pythagoras'
  401. print("")
  402. user_email = raw_input("Enter your user email: ")
  403. while user_email in invalid_option:
  404. print("Reserved names: " + str(invalid_option))
  405. user_email = raw_input("Enter your user email: ")
  406. if not user_email.replace(" ", ""):
  407. user_email = 'pythagoras@math.com'
  408. insert_data(session, user_name, user_email)