chemlab 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (536) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +4 -0
  3. data/.rspec +3 -0
  4. data/.rspec_parallel +5 -0
  5. data/Dockerfile +68 -0
  6. data/Gemfile +23 -0
  7. data/Gemfile.lock +137 -0
  8. data/README.md +201 -0
  9. data/Rakefile +47 -0
  10. data/bin/qa +7 -0
  11. data/bin/test +3 -0
  12. data/chemlab.gemspec +43 -0
  13. data/knapsack/master_report.json +54 -0
  14. data/lib/chemlab.rb +5 -0
  15. data/lib/chemlab/version.rb +5 -0
  16. data/qa.rb +513 -0
  17. data/qa/ce/strategy.rb +21 -0
  18. data/qa/ee.rb +234 -0
  19. data/qa/ee/fixtures/gpg/admin.asc +0 -0
  20. data/qa/ee/fixtures/secure_license_files/.gitlab-ci.yml +12 -0
  21. data/qa/ee/fixtures/secure_license_files/gl-license-management-report.json +24 -0
  22. data/qa/ee/fixtures/secure_premade_reports/.gitlab-ci.yml +61 -0
  23. data/qa/ee/fixtures/secure_premade_reports/gl-container-scanning-report.json +105 -0
  24. data/qa/ee/fixtures/secure_premade_reports/gl-dast-report.json +1 -0
  25. data/qa/ee/fixtures/secure_premade_reports/gl-dependency-scanning-report.json +226 -0
  26. data/qa/ee/fixtures/secure_premade_reports/gl-license-management-report.json +42 -0
  27. data/qa/ee/fixtures/secure_premade_reports/gl-sast-report.json +152 -0
  28. data/qa/ee/fixtures/secure_premade_reports/yarn.lock +10024 -0
  29. data/qa/ee/page/admin/geo/nodes/new.rb +36 -0
  30. data/qa/ee/page/admin/geo/nodes/show.rb +23 -0
  31. data/qa/ee/page/admin/license.rb +41 -0
  32. data/qa/ee/page/admin/menu.rb +55 -0
  33. data/qa/ee/page/admin/monitoring/audit_log.rb +27 -0
  34. data/qa/ee/page/admin/overview/groups/edit.rb +27 -0
  35. data/qa/ee/page/admin/settings/component/elasticsearch.rb +38 -0
  36. data/qa/ee/page/admin/settings/component/email.rb +35 -0
  37. data/qa/ee/page/admin/settings/integration.rb +25 -0
  38. data/qa/ee/page/admin/settings/preferences.rb +25 -0
  39. data/qa/ee/page/admin/settings/templates.rb +40 -0
  40. data/qa/ee/page/component/design_management.rb +80 -0
  41. data/qa/ee/page/component/issue_board/show.rb +154 -0
  42. data/qa/ee/page/component/license_management.rb +62 -0
  43. data/qa/ee/page/component/secure_report.rb +38 -0
  44. data/qa/ee/page/component/web_ide/web_terminal_panel.rb +58 -0
  45. data/qa/ee/page/dashboard/projects.rb +54 -0
  46. data/qa/ee/page/file/show.rb +49 -0
  47. data/qa/ee/page/group/contribution_analytics.rb +29 -0
  48. data/qa/ee/page/group/epic/index.rb +46 -0
  49. data/qa/ee/page/group/epic/show.rb +74 -0
  50. data/qa/ee/page/group/issues_analytics.rb +33 -0
  51. data/qa/ee/page/group/members.rb +19 -0
  52. data/qa/ee/page/group/menu.rb +117 -0
  53. data/qa/ee/page/group/roadmap.rb +34 -0
  54. data/qa/ee/page/group/saml_sso_sign_in.rb +22 -0
  55. data/qa/ee/page/group/saml_sso_sign_up.rb +34 -0
  56. data/qa/ee/page/group/secure/show.rb +24 -0
  57. data/qa/ee/page/group/settings/general.rb +112 -0
  58. data/qa/ee/page/group/settings/ldap_sync.rb +38 -0
  59. data/qa/ee/page/group/settings/saml_sso.rb +93 -0
  60. data/qa/ee/page/insights/show.rb +51 -0
  61. data/qa/ee/page/main/banner.rb +19 -0
  62. data/qa/ee/page/merge_request/new.rb +74 -0
  63. data/qa/ee/page/merge_request/show.rb +326 -0
  64. data/qa/ee/page/profile/menu.rb +15 -0
  65. data/qa/ee/page/project/issue/index.rb +46 -0
  66. data/qa/ee/page/project/issue/show.rb +97 -0
  67. data/qa/ee/page/project/menu.rb +17 -0
  68. data/qa/ee/page/project/milestone/show.rb +41 -0
  69. data/qa/ee/page/project/new.rb +56 -0
  70. data/qa/ee/page/project/operations/kubernetes/show.rb +50 -0
  71. data/qa/ee/page/project/operations/metrics/show.rb +101 -0
  72. data/qa/ee/page/project/packages/index.rb +30 -0
  73. data/qa/ee/page/project/packages/show.rb +29 -0
  74. data/qa/ee/page/project/path_locks/index.rb +30 -0
  75. data/qa/ee/page/project/pipeline/show.rb +34 -0
  76. data/qa/ee/page/project/secure/dependency_list.rb +19 -0
  77. data/qa/ee/page/project/secure/show.rb +17 -0
  78. data/qa/ee/page/project/settings/ci_cd.rb +25 -0
  79. data/qa/ee/page/project/settings/integrations.rb +21 -0
  80. data/qa/ee/page/project/settings/license_compliance.rb +67 -0
  81. data/qa/ee/page/project/settings/merge_request.rb +27 -0
  82. data/qa/ee/page/project/settings/mirroring_repositories.rb +30 -0
  83. data/qa/ee/page/project/settings/protected_branches.rb +37 -0
  84. data/qa/ee/page/project/settings/push_rules.rb +82 -0
  85. data/qa/ee/page/project/settings/repository.rb +27 -0
  86. data/qa/ee/page/project/settings/services/jenkins.rb +56 -0
  87. data/qa/ee/page/project/show.rb +35 -0
  88. data/qa/ee/page/project/sub_menus/packages.rb +27 -0
  89. data/qa/ee/page/project/sub_menus/project.rb +21 -0
  90. data/qa/ee/page/project/sub_menus/repository.rb +29 -0
  91. data/qa/ee/page/project/sub_menus/security_compliance.rb +44 -0
  92. data/qa/ee/page/project/sub_menus/settings.rb +42 -0
  93. data/qa/ee/page/project/wiki/show.rb +31 -0
  94. data/qa/ee/resource/board/base_board.rb +26 -0
  95. data/qa/ee/resource/board/board_list/group/board_list.rb +57 -0
  96. data/qa/ee/resource/board/board_list/project/assignee_board_list.rb +23 -0
  97. data/qa/ee/resource/board/board_list/project/base_board_list.rb +50 -0
  98. data/qa/ee/resource/board/board_list/project/label_board_list.rb +28 -0
  99. data/qa/ee/resource/board/board_list/project/milestone_board_list.rb +28 -0
  100. data/qa/ee/resource/board/group_board.rb +25 -0
  101. data/qa/ee/resource/board/project_board.rb +25 -0
  102. data/qa/ee/resource/epic.rb +60 -0
  103. data/qa/ee/resource/geo/node.rb +31 -0
  104. data/qa/ee/resource/group_label.rb +50 -0
  105. data/qa/ee/resource/license.rb +21 -0
  106. data/qa/ee/resource/project_milestone.rb +20 -0
  107. data/qa/ee/resource/settings/elasticsearch.rb +60 -0
  108. data/qa/ee/runtime/env.rb +30 -0
  109. data/qa/ee/runtime/geo.rb +28 -0
  110. data/qa/ee/runtime/saml.rb +37 -0
  111. data/qa/ee/scenario/test/geo.rb +211 -0
  112. data/qa/ee/scenario/test/integration/elasticsearch.rb +15 -0
  113. data/qa/ee/scenario/test/integration/group_saml.rb +17 -0
  114. data/qa/ee/scenario/test/sanity/selectors.rb +17 -0
  115. data/qa/ee/strategy.rb +28 -0
  116. data/qa/fixtures/auto_devops_rack/Dockerfile +9 -0
  117. data/qa/fixtures/auto_devops_rack/Gemfile +3 -0
  118. data/qa/fixtures/auto_devops_rack/Gemfile.lock +15 -0
  119. data/qa/fixtures/auto_devops_rack/Rakefile +7 -0
  120. data/qa/fixtures/auto_devops_rack/config.ru +1 -0
  121. data/qa/fixtures/ldap/admin/1_add_nodes.ldif +7 -0
  122. data/qa/fixtures/ldap/admin/2_add_users.ldif +63 -0
  123. data/qa/fixtures/ldap/admin/3_add_groups.ldif +16 -0
  124. data/qa/fixtures/ldap/non_admin/1_add_nodes.ldif +7 -0
  125. data/qa/fixtures/ldap/non_admin/2_add_users.ldif +61 -0
  126. data/qa/fixtures/ldap/non_admin/3_add_groups.ldif +16 -0
  127. data/qa/fixtures/monitored_auto_devops/.gitlab-ci.yml +337 -0
  128. data/qa/flow/login.rb +39 -0
  129. data/qa/flow/project.rb +19 -0
  130. data/qa/flow/saml.rb +72 -0
  131. data/qa/flow/user.rb +26 -0
  132. data/qa/git/location.rb +34 -0
  133. data/qa/git/repository.rb +269 -0
  134. data/qa/page/admin/menu.rb +110 -0
  135. data/qa/page/admin/new_session.rb +22 -0
  136. data/qa/page/admin/overview/groups/edit.rb +23 -0
  137. data/qa/page/admin/overview/groups/index.rb +32 -0
  138. data/qa/page/admin/overview/groups/show.rb +21 -0
  139. data/qa/page/admin/overview/users/index.rb +35 -0
  140. data/qa/page/admin/overview/users/show.rb +31 -0
  141. data/qa/page/admin/settings/component/account_and_limit.rb +26 -0
  142. data/qa/page/admin/settings/component/ip_limits.rb +30 -0
  143. data/qa/page/admin/settings/component/outbound_requests.rb +33 -0
  144. data/qa/page/admin/settings/component/performance_bar.rb +27 -0
  145. data/qa/page/admin/settings/component/repository_storage.rb +26 -0
  146. data/qa/page/admin/settings/general.rb +23 -0
  147. data/qa/page/admin/settings/metrics_and_profiling.rb +23 -0
  148. data/qa/page/admin/settings/network.rb +30 -0
  149. data/qa/page/admin/settings/repository.rb +23 -0
  150. data/qa/page/alert/auto_devops_alert.rb +13 -0
  151. data/qa/page/base.rb +348 -0
  152. data/qa/page/component/breadcrumbs.rb +19 -0
  153. data/qa/page/component/ci_badge_link.rb +49 -0
  154. data/qa/page/component/clone_panel.rb +38 -0
  155. data/qa/page/component/confirm_modal.rb +25 -0
  156. data/qa/page/component/dropdown_filter.rb +16 -0
  157. data/qa/page/component/dropzone.rb +33 -0
  158. data/qa/page/component/groups_filter.rb +37 -0
  159. data/qa/page/component/issuable/common.rb +31 -0
  160. data/qa/page/component/lazy_loader.rb +15 -0
  161. data/qa/page/component/legacy_clone_panel.rb +47 -0
  162. data/qa/page/component/note.rb +84 -0
  163. data/qa/page/component/select2.rb +48 -0
  164. data/qa/page/component/users_select.rb +14 -0
  165. data/qa/page/component/web_ide/alert.rb +27 -0
  166. data/qa/page/dashboard/groups.rb +34 -0
  167. data/qa/page/dashboard/projects.rb +37 -0
  168. data/qa/page/dashboard/snippet/index.rb +21 -0
  169. data/qa/page/dashboard/snippet/new.rb +70 -0
  170. data/qa/page/dashboard/snippet/show.rb +63 -0
  171. data/qa/page/dashboard/welcome.rb +17 -0
  172. data/qa/page/element.rb +55 -0
  173. data/qa/page/file/edit.rb +13 -0
  174. data/qa/page/file/form.rb +49 -0
  175. data/qa/page/file/shared/commit_button.rb +25 -0
  176. data/qa/page/file/shared/commit_message.rb +21 -0
  177. data/qa/page/file/shared/editor.rb +33 -0
  178. data/qa/page/file/show.rb +36 -0
  179. data/qa/page/group/menu.rb +52 -0
  180. data/qa/page/group/new.rb +37 -0
  181. data/qa/page/group/settings/general.rb +115 -0
  182. data/qa/page/group/show.rb +74 -0
  183. data/qa/page/group/sub_menus/common.rb +27 -0
  184. data/qa/page/group/sub_menus/members.rb +45 -0
  185. data/qa/page/issuable/sidebar.rb +27 -0
  186. data/qa/page/label/index.rb +34 -0
  187. data/qa/page/label/new.rb +32 -0
  188. data/qa/page/layout/banner.rb +19 -0
  189. data/qa/page/layout/performance_bar.rb +41 -0
  190. data/qa/page/main/login.rb +181 -0
  191. data/qa/page/main/menu.rb +150 -0
  192. data/qa/page/main/oauth.rb +21 -0
  193. data/qa/page/main/sign_up.rb +37 -0
  194. data/qa/page/main/terms.rb +21 -0
  195. data/qa/page/mattermost/login.rb +28 -0
  196. data/qa/page/mattermost/main.rb +15 -0
  197. data/qa/page/merge_request/new.rb +68 -0
  198. data/qa/page/merge_request/show.rb +232 -0
  199. data/qa/page/profile/emails.rb +29 -0
  200. data/qa/page/profile/menu.rb +52 -0
  201. data/qa/page/profile/password.rb +23 -0
  202. data/qa/page/profile/personal_access_tokens.rb +67 -0
  203. data/qa/page/profile/ssh_keys.rb +42 -0
  204. data/qa/page/profile/two_factor_auth.rb +17 -0
  205. data/qa/page/project/activity.rb +17 -0
  206. data/qa/page/project/branches/show.rb +56 -0
  207. data/qa/page/project/commit/show.rb +32 -0
  208. data/qa/page/project/fork/new.rb +19 -0
  209. data/qa/page/project/import/github.rb +78 -0
  210. data/qa/page/project/issue/index.rb +71 -0
  211. data/qa/page/project/issue/new.rb +35 -0
  212. data/qa/page/project/issue/show.rb +168 -0
  213. data/qa/page/project/job/show.rb +53 -0
  214. data/qa/page/project/menu.rb +43 -0
  215. data/qa/page/project/milestone/index.rb +19 -0
  216. data/qa/page/project/milestone/new.rb +29 -0
  217. data/qa/page/project/new.rb +76 -0
  218. data/qa/page/project/operations/environments/index.rb +21 -0
  219. data/qa/page/project/operations/environments/show.rb +23 -0
  220. data/qa/page/project/operations/kubernetes/add.rb +21 -0
  221. data/qa/page/project/operations/kubernetes/add_existing.rb +46 -0
  222. data/qa/page/project/operations/kubernetes/index.rb +25 -0
  223. data/qa/page/project/operations/kubernetes/show.rb +81 -0
  224. data/qa/page/project/operations/metrics/show.rb +87 -0
  225. data/qa/page/project/pipeline/index.rb +43 -0
  226. data/qa/page/project/pipeline/show.rb +76 -0
  227. data/qa/page/project/settings/advanced.rb +75 -0
  228. data/qa/page/project/settings/auto_devops.rb +21 -0
  229. data/qa/page/project/settings/ci_cd.rb +39 -0
  230. data/qa/page/project/settings/ci_variables.rb +56 -0
  231. data/qa/page/project/settings/common.rb +13 -0
  232. data/qa/page/project/settings/deploy_keys.rb +69 -0
  233. data/qa/page/project/settings/deploy_tokens.rb +64 -0
  234. data/qa/page/project/settings/main.rb +60 -0
  235. data/qa/page/project/settings/members.rb +62 -0
  236. data/qa/page/project/settings/merge_request.rb +32 -0
  237. data/qa/page/project/settings/mirroring_repositories.rb +132 -0
  238. data/qa/page/project/settings/protected_branches.rb +72 -0
  239. data/qa/page/project/settings/repository.rb +55 -0
  240. data/qa/page/project/settings/runners.rb +37 -0
  241. data/qa/page/project/settings/visibility_features_permissions.rb +26 -0
  242. data/qa/page/project/show.rb +165 -0
  243. data/qa/page/project/sub_menus/ci_cd.rb +27 -0
  244. data/qa/page/project/sub_menus/common.rb +19 -0
  245. data/qa/page/project/sub_menus/issues.rb +63 -0
  246. data/qa/page/project/sub_menus/operations.rb +58 -0
  247. data/qa/page/project/sub_menus/project.rb +29 -0
  248. data/qa/page/project/sub_menus/repository.rb +48 -0
  249. data/qa/page/project/sub_menus/settings.rb +81 -0
  250. data/qa/page/project/web_ide/edit.rb +139 -0
  251. data/qa/page/project/wiki/edit.rb +21 -0
  252. data/qa/page/project/wiki/git_access.rb +13 -0
  253. data/qa/page/project/wiki/new.rb +61 -0
  254. data/qa/page/project/wiki/show.rb +31 -0
  255. data/qa/page/search/results.rb +55 -0
  256. data/qa/page/settings/common.rb +26 -0
  257. data/qa/page/sub_menus/common.rb +50 -0
  258. data/qa/page/validatable.rb +21 -0
  259. data/qa/page/validator.rb +52 -0
  260. data/qa/page/view.rb +59 -0
  261. data/qa/resource/api_fabricator.rb +137 -0
  262. data/qa/resource/base.rb +170 -0
  263. data/qa/resource/ci_variable.rb +57 -0
  264. data/qa/resource/deploy_key.rb +39 -0
  265. data/qa/resource/deploy_token.rb +48 -0
  266. data/qa/resource/events/base.rb +42 -0
  267. data/qa/resource/events/project.rb +25 -0
  268. data/qa/resource/file.rb +63 -0
  269. data/qa/resource/fork.rb +92 -0
  270. data/qa/resource/group.rb +83 -0
  271. data/qa/resource/issue.rb +61 -0
  272. data/qa/resource/kubernetes_cluster/base.rb +40 -0
  273. data/qa/resource/kubernetes_cluster/project_cluster.rb +72 -0
  274. data/qa/resource/label.rb +61 -0
  275. data/qa/resource/members.rb +36 -0
  276. data/qa/resource/merge_request.rb +105 -0
  277. data/qa/resource/merge_request_from_fork.rb +33 -0
  278. data/qa/resource/personal_access_token.rb +31 -0
  279. data/qa/resource/project.rb +179 -0
  280. data/qa/resource/project_imported_from_github.rb +31 -0
  281. data/qa/resource/project_member.rb +35 -0
  282. data/qa/resource/project_milestone.rb +34 -0
  283. data/qa/resource/protected_branch.rb +76 -0
  284. data/qa/resource/repository/commit.rb +81 -0
  285. data/qa/resource/repository/project_push.rb +44 -0
  286. data/qa/resource/repository/push.rb +113 -0
  287. data/qa/resource/repository/wiki_push.rb +38 -0
  288. data/qa/resource/runner.rb +75 -0
  289. data/qa/resource/sandbox.rb +79 -0
  290. data/qa/resource/settings/hashed_storage.rb +26 -0
  291. data/qa/resource/snippet.rb +30 -0
  292. data/qa/resource/ssh_key.rb +57 -0
  293. data/qa/resource/tag.rb +30 -0
  294. data/qa/resource/user.rb +150 -0
  295. data/qa/resource/user_gpg.rb +46 -0
  296. data/qa/resource/visibility.rb +17 -0
  297. data/qa/resource/wiki.rb +48 -0
  298. data/qa/runtime/address.rb +29 -0
  299. data/qa/runtime/api/client.rb +90 -0
  300. data/qa/runtime/api/request.rb +49 -0
  301. data/qa/runtime/application_settings.rb +46 -0
  302. data/qa/runtime/browser.rb +220 -0
  303. data/qa/runtime/env.rb +330 -0
  304. data/qa/runtime/feature.rb +87 -0
  305. data/qa/runtime/fixtures.rb +43 -0
  306. data/qa/runtime/gpg.rb +37 -0
  307. data/qa/runtime/ip_address.rb +33 -0
  308. data/qa/runtime/key/base.rb +38 -0
  309. data/qa/runtime/key/ecdsa.rb +13 -0
  310. data/qa/runtime/key/ed25519.rb +13 -0
  311. data/qa/runtime/key/rsa.rb +13 -0
  312. data/qa/runtime/logger.rb +24 -0
  313. data/qa/runtime/mail_hog.rb +15 -0
  314. data/qa/runtime/namespace.rb +27 -0
  315. data/qa/runtime/path.rb +13 -0
  316. data/qa/runtime/release.rb +40 -0
  317. data/qa/runtime/scenario.rb +38 -0
  318. data/qa/runtime/search.rb +124 -0
  319. data/qa/runtime/user.rb +57 -0
  320. data/qa/scenario/actable.rb +25 -0
  321. data/qa/scenario/bootable.rb +53 -0
  322. data/qa/scenario/shared_attributes.rb +14 -0
  323. data/qa/scenario/template.rb +64 -0
  324. data/qa/scenario/test/instance.rb +36 -0
  325. data/qa/scenario/test/instance/all.rb +18 -0
  326. data/qa/scenario/test/instance/smoke.rb +20 -0
  327. data/qa/scenario/test/integration/github.rb +20 -0
  328. data/qa/scenario/test/integration/instance_saml.rb +13 -0
  329. data/qa/scenario/test/integration/kubernetes.rb +13 -0
  330. data/qa/scenario/test/integration/ldap_no_server.rb +13 -0
  331. data/qa/scenario/test/integration/ldap_no_tls.rb +13 -0
  332. data/qa/scenario/test/integration/ldap_tls.rb +13 -0
  333. data/qa/scenario/test/integration/mattermost.rb +26 -0
  334. data/qa/scenario/test/integration/object_storage.rb +13 -0
  335. data/qa/scenario/test/integration/smtp.rb +13 -0
  336. data/qa/scenario/test/sanity/framework.rb +19 -0
  337. data/qa/scenario/test/sanity/selectors.rb +61 -0
  338. data/qa/service/cluster_provider/base.rb +41 -0
  339. data/qa/service/cluster_provider/gcloud.rb +115 -0
  340. data/qa/service/cluster_provider/k3d.rb +134 -0
  341. data/qa/service/cluster_provider/k3s.rb +94 -0
  342. data/qa/service/cluster_provider/minikube.rb +26 -0
  343. data/qa/service/docker_run/base.rb +47 -0
  344. data/qa/service/docker_run/gitlab_runner.rb +58 -0
  345. data/qa/service/docker_run/jenkins.rb +43 -0
  346. data/qa/service/docker_run/k3s.rb +46 -0
  347. data/qa/service/docker_run/ldap.rb +41 -0
  348. data/qa/service/docker_run/maven.rb +44 -0
  349. data/qa/service/docker_run/node_js.rb +38 -0
  350. data/qa/service/docker_run/saml_idp.rb +69 -0
  351. data/qa/service/kubernetes_cluster.rb +107 -0
  352. data/qa/service/omnibus.rb +23 -0
  353. data/qa/service/shellout.rb +31 -0
  354. data/qa/specs/features/api/1_manage/.gitkeep +0 -0
  355. data/qa/specs/features/api/1_manage/rate_limits_spec.rb +17 -0
  356. data/qa/specs/features/api/1_manage/users_spec.rb +35 -0
  357. data/qa/specs/features/api/2_plan/.gitkeep +0 -0
  358. data/qa/specs/features/api/2_plan/closes_issue_via_pushing_a_commit_spec.rb +48 -0
  359. data/qa/specs/features/api/3_create/repository/files_spec.rb +106 -0
  360. data/qa/specs/features/api/3_create/repository/project_archive_compare_spec.rb +74 -0
  361. data/qa/specs/features/api/4_verify/.gitkeep +0 -0
  362. data/qa/specs/features/api/5_package/.gitkeep +0 -0
  363. data/qa/specs/features/api/6_release/.gitkeep +0 -0
  364. data/qa/specs/features/api/7_configure/.gitkeep +0 -0
  365. data/qa/specs/features/browser_ui/1_manage/group/create_group_with_mattermost_team_spec.rb +20 -0
  366. data/qa/specs/features/browser_ui/1_manage/group/transfer_project_spec.rb +56 -0
  367. data/qa/specs/features/browser_ui/1_manage/login/log_in_spec.rb +25 -0
  368. data/qa/specs/features/browser_ui/1_manage/login/log_into_gitlab_via_ldap_spec.rb +15 -0
  369. data/qa/specs/features/browser_ui/1_manage/login/log_into_mattermost_via_gitlab_spec.rb +20 -0
  370. data/qa/specs/features/browser_ui/1_manage/login/login_via_instance_wide_saml_sso_spec.rb +19 -0
  371. data/qa/specs/features/browser_ui/1_manage/login/register_spec.rb +27 -0
  372. data/qa/specs/features/browser_ui/1_manage/project/add_project_member_spec.rb +24 -0
  373. data/qa/specs/features/browser_ui/1_manage/project/create_project_spec.rb +23 -0
  374. data/qa/specs/features/browser_ui/1_manage/project/dashboard_images_spec.rb +57 -0
  375. data/qa/specs/features/browser_ui/1_manage/project/import_github_repo_spec.rb +117 -0
  376. data/qa/specs/features/browser_ui/1_manage/project/view_project_activity_spec.rb +22 -0
  377. data/qa/specs/features/browser_ui/2_plan/email/trigger_email_notification_spec.rb +46 -0
  378. data/qa/specs/features/browser_ui/2_plan/issue/check_mentions_for_xss_spec.rb +45 -0
  379. data/qa/specs/features/browser_ui/2_plan/issue/collapse_comments_in_discussions_spec.rb +35 -0
  380. data/qa/specs/features/browser_ui/2_plan/issue/comment_issue_spec.rb +29 -0
  381. data/qa/specs/features/browser_ui/2_plan/issue/create_issue_spec.rb +40 -0
  382. data/qa/specs/features/browser_ui/2_plan/issue/export_as_csv_spec.rb +40 -0
  383. data/qa/specs/features/browser_ui/2_plan/issue/filter_issue_comments_spec.rb +36 -0
  384. data/qa/specs/features/browser_ui/2_plan/issue/issue_suggestions_spec.rb +28 -0
  385. data/qa/specs/features/browser_ui/2_plan/issue/mentions_spec.rb +35 -0
  386. data/qa/specs/features/browser_ui/3_create/merge_request/create_merge_request_spec.rb +64 -0
  387. data/qa/specs/features/browser_ui/3_create/merge_request/merge_merge_request_from_fork_spec.rb +26 -0
  388. data/qa/specs/features/browser_ui/3_create/merge_request/rebase_merge_request_spec.rb +49 -0
  389. data/qa/specs/features/browser_ui/3_create/merge_request/squash_merge_request_spec.rb +52 -0
  390. data/qa/specs/features/browser_ui/3_create/merge_request/view_merge_request_diff_patch_spec.rb +35 -0
  391. data/qa/specs/features/browser_ui/3_create/repository/add_file_template_spec.rb +68 -0
  392. data/qa/specs/features/browser_ui/3_create/repository/add_list_delete_branches_spec.rb +88 -0
  393. data/qa/specs/features/browser_ui/3_create/repository/add_ssh_key_spec.rb +30 -0
  394. data/qa/specs/features/browser_ui/3_create/repository/clone_spec.rb +51 -0
  395. data/qa/specs/features/browser_ui/3_create/repository/create_edit_delete_file_via_web_spec.rb +58 -0
  396. data/qa/specs/features/browser_ui/3_create/repository/move_project_create_fork_spec.rb +53 -0
  397. data/qa/specs/features/browser_ui/3_create/repository/protocol_v2_push_http_spec.rb +48 -0
  398. data/qa/specs/features/browser_ui/3_create/repository/protocol_v2_push_ssh_spec.rb +74 -0
  399. data/qa/specs/features/browser_ui/3_create/repository/push_http_private_token_spec.rb +34 -0
  400. data/qa/specs/features/browser_ui/3_create/repository/push_mirroring_over_http_spec.rb +43 -0
  401. data/qa/specs/features/browser_ui/3_create/repository/push_over_http_file_size_spec.rb +81 -0
  402. data/qa/specs/features/browser_ui/3_create/repository/push_over_http_spec.rb +44 -0
  403. data/qa/specs/features/browser_ui/3_create/repository/push_protected_branch_spec.rb +63 -0
  404. data/qa/specs/features/browser_ui/3_create/repository/use_ssh_key_spec.rb +37 -0
  405. data/qa/specs/features/browser_ui/3_create/repository/user_views_commit_diff_patch_spec.rb +66 -0
  406. data/qa/specs/features/browser_ui/3_create/snippet/create_snippet_spec.rb +29 -0
  407. data/qa/specs/features/browser_ui/3_create/web_ide/add_file_template_spec.rb +69 -0
  408. data/qa/specs/features/browser_ui/3_create/web_ide/review_merge_request_spec.rb +43 -0
  409. data/qa/specs/features/browser_ui/3_create/wiki/create_edit_clone_push_wiki_spec.rb +42 -0
  410. data/qa/specs/features/browser_ui/4_verify/ci_variable/add_remove_ci_variable_spec.rb +60 -0
  411. data/qa/specs/features/browser_ui/4_verify/pipeline/create_and_process_pipeline_spec.rb +89 -0
  412. data/qa/specs/features/browser_ui/4_verify/runner/register_runner_spec.rb +34 -0
  413. data/qa/specs/features/browser_ui/5_package/.gitkeep +0 -0
  414. data/qa/specs/features/browser_ui/6_release/deploy_key/add_deploy_key_spec.rb +28 -0
  415. data/qa/specs/features/browser_ui/6_release/deploy_key/clone_using_deploy_key_spec.rb +102 -0
  416. data/qa/specs/features/browser_ui/6_release/deploy_token/add_deploy_token_spec.rb +22 -0
  417. data/qa/specs/features/browser_ui/6_release/pipeline/parent_child_pipelines_dependent_relationship_spec.rb +122 -0
  418. data/qa/specs/features/browser_ui/6_release/pipeline/parent_child_pipelines_independent_relationship_spec.rb +121 -0
  419. data/qa/specs/features/browser_ui/7_configure/auto_devops/create_project_with_auto_devops_spec.rb +147 -0
  420. data/qa/specs/features/browser_ui/7_configure/kubernetes/kubernetes_integration_spec.rb +38 -0
  421. data/qa/specs/features/browser_ui/8_monitor/apm/dashboards_spec.rb +97 -0
  422. data/qa/specs/features/browser_ui/non_devops/performance_bar_spec.rb +38 -0
  423. data/qa/specs/features/ee/api/1_manage/.gitkeep +0 -0
  424. data/qa/specs/features/ee/api/2_plan/.gitkeep +0 -0
  425. data/qa/specs/features/ee/api/2_plan/epics_milestone_dates_spec.rb +173 -0
  426. data/qa/specs/features/ee/api/3_create/.gitkeep +0 -0
  427. data/qa/specs/features/ee/api/4_verify/.gitkeep +0 -0
  428. data/qa/specs/features/ee/api/5_package/.gitkeep +0 -0
  429. data/qa/specs/features/ee/api/6_release/.gitkeep +0 -0
  430. data/qa/specs/features/ee/api/7_configure/.gitkeep +0 -0
  431. data/qa/specs/features/ee/api/enablement/elasticsearch/advanced_global_advanced_syntax_search_spec.rb +70 -0
  432. data/qa/specs/features/ee/api/enablement/elasticsearch/elasticsearch_api_spec.rb +84 -0
  433. data/qa/specs/features/ee/api/geo/geo_nodes_spec.rb +91 -0
  434. data/qa/specs/features/ee/browser_ui/1_manage/.gitkeep +0 -0
  435. data/qa/specs/features/ee/browser_ui/1_manage/group/group_audit_logs_1_spec.rb +155 -0
  436. data/qa/specs/features/ee/browser_ui/1_manage/group/group_audit_logs_2_spec.rb +103 -0
  437. data/qa/specs/features/ee/browser_ui/1_manage/group/group_file_template_spec.rb +141 -0
  438. data/qa/specs/features/ee/browser_ui/1_manage/group/group_ldap_sync_spec.rb +183 -0
  439. data/qa/specs/features/ee/browser_ui/1_manage/group/group_saml_enforced_sso_spec.rb +115 -0
  440. data/qa/specs/features/ee/browser_ui/1_manage/group/group_saml_group_managed_accounts_spec.rb +178 -0
  441. data/qa/specs/features/ee/browser_ui/1_manage/group/group_saml_non_enforced_sso_spec.rb +87 -0
  442. data/qa/specs/features/ee/browser_ui/1_manage/group/restrict_by_ip_address_spec.rb +107 -0
  443. data/qa/specs/features/ee/browser_ui/1_manage/insights/default_insights_spec.rb +48 -0
  444. data/qa/specs/features/ee/browser_ui/1_manage/instance/instance_audit_logs_spec.rb +124 -0
  445. data/qa/specs/features/ee/browser_ui/1_manage/ldap/admin_ldap_sync_spec.rb +63 -0
  446. data/qa/specs/features/ee/browser_ui/1_manage/project/project_audit_logs_spec.rb +127 -0
  447. data/qa/specs/features/ee/browser_ui/1_manage/project/project_templates_spec.rb +165 -0
  448. data/qa/specs/features/ee/browser_ui/2_plan/.gitkeep +0 -0
  449. data/qa/specs/features/ee/browser_ui/2_plan/burndown_chart/burndown_chart_spec.rb +46 -0
  450. data/qa/specs/features/ee/browser_ui/2_plan/custom_email/custom_email_spec.rb +28 -0
  451. data/qa/specs/features/ee/browser_ui/2_plan/epic/epics_management_spec.rb +96 -0
  452. data/qa/specs/features/ee/browser_ui/2_plan/epic/promote_issue_to_epic_spec.rb +40 -0
  453. data/qa/specs/features/ee/browser_ui/2_plan/epic/roadmap_spec.rb +31 -0
  454. data/qa/specs/features/ee/browser_ui/2_plan/issue_boards/configurable_issue_board_spec.rb +28 -0
  455. data/qa/specs/features/ee/browser_ui/2_plan/issue_boards/configure_issue_board_by_label_spec.rb +44 -0
  456. data/qa/specs/features/ee/browser_ui/2_plan/issue_boards/create_group_issue_board_spec.rb +31 -0
  457. data/qa/specs/features/ee/browser_ui/2_plan/issue_boards/focus_mode_spec.rb +28 -0
  458. data/qa/specs/features/ee/browser_ui/2_plan/issue_boards/group_issue_boards_spec.rb +48 -0
  459. data/qa/specs/features/ee/browser_ui/2_plan/issue_boards/project_issue_boards_spec.rb +103 -0
  460. data/qa/specs/features/ee/browser_ui/2_plan/issue_boards/read_only_board_configuration_spec.rb +37 -0
  461. data/qa/specs/features/ee/browser_ui/2_plan/issue_boards/sum_of_issues_weights_spec.rb +40 -0
  462. data/qa/specs/features/ee/browser_ui/2_plan/issues_analytics/issues_analytics_spec.rb +35 -0
  463. data/qa/specs/features/ee/browser_ui/2_plan/issues_weight/issue_weight_visualization_spec.rb +46 -0
  464. data/qa/specs/features/ee/browser_ui/2_plan/multiple_assignees_for_issues/four_assignees_spec.rb +45 -0
  465. data/qa/specs/features/ee/browser_ui/2_plan/multiple_assignees_for_issues/more_than_four_assignees_spec.rb +70 -0
  466. data/qa/specs/features/ee/browser_ui/2_plan/related_issues/related_issues_spec.rb +50 -0
  467. data/qa/specs/features/ee/browser_ui/2_plan/scoped_labels/editing_scoped_labels_spec.rb +58 -0
  468. data/qa/specs/features/ee/browser_ui/3_create/.gitkeep +0 -0
  469. data/qa/specs/features/ee/browser_ui/3_create/contribution_analytics_spec.rb +53 -0
  470. data/qa/specs/features/ee/browser_ui/3_create/design_management_spec.rb +29 -0
  471. data/qa/specs/features/ee/browser_ui/3_create/jenkins/jenkins_build_status_spec.rb +158 -0
  472. data/qa/specs/features/ee/browser_ui/3_create/merge_request/add_batch_comments_in_merge_request_spec.rb +80 -0
  473. data/qa/specs/features/ee/browser_ui/3_create/merge_request/approval_rules_spec.rb +97 -0
  474. data/qa/specs/features/ee/browser_ui/3_create/repository/assign_code_owners_spec.rb +83 -0
  475. data/qa/specs/features/ee/browser_ui/3_create/repository/code_owners_spec.rb +75 -0
  476. data/qa/specs/features/ee/browser_ui/3_create/repository/file_locking_spec.rb +161 -0
  477. data/qa/specs/features/ee/browser_ui/3_create/repository/pull_mirroring_over_http_spec.rb +52 -0
  478. data/qa/specs/features/ee/browser_ui/3_create/repository/pull_mirroring_over_ssh_with_key_spec.rb +71 -0
  479. data/qa/specs/features/ee/browser_ui/3_create/repository/push_rules_spec.rb +202 -0
  480. data/qa/specs/features/ee/browser_ui/3_create/repository/restrict_push_protected_branch_spec.rb +120 -0
  481. data/qa/specs/features/ee/browser_ui/3_create/web_ide/web_terminal_spec.rb +80 -0
  482. data/qa/specs/features/ee/browser_ui/4_verify/.gitkeep +0 -0
  483. data/qa/specs/features/ee/browser_ui/5_package/.gitkeep +0 -0
  484. data/qa/specs/features/ee/browser_ui/5_package/maven_repository_spec.rb +102 -0
  485. data/qa/specs/features/ee/browser_ui/5_package/npm_registry_spec.rb +75 -0
  486. data/qa/specs/features/ee/browser_ui/6_release/.gitkeep +0 -0
  487. data/qa/specs/features/ee/browser_ui/6_release/multi-project_pipelines_spec.rb +98 -0
  488. data/qa/specs/features/ee/browser_ui/6_release/pipelines_for_merged_results_and_merge_trains_spec.rb +137 -0
  489. data/qa/specs/features/ee/browser_ui/7_configure/.gitkeep +0 -0
  490. data/qa/specs/features/ee/browser_ui/8_monitor/.gitkeep +0 -0
  491. data/qa/specs/features/ee/browser_ui/8_monitor/apm/metrics_spec.rb +68 -0
  492. data/qa/specs/features/ee/browser_ui/8_monitor/health/alerting_spec.rb +106 -0
  493. data/qa/specs/features/ee/browser_ui/8_monitor/health/cluster_health_spec.rb +52 -0
  494. data/qa/specs/features/ee/browser_ui/enablement/elasticsearch/elasticsearch_reindexing_spec.rb +78 -0
  495. data/qa/specs/features/ee/browser_ui/geo/attachment_replication_spec.rb +63 -0
  496. data/qa/specs/features/ee/browser_ui/geo/database_delete_replication_spec.rb +60 -0
  497. data/qa/specs/features/ee/browser_ui/geo/http_push_spec.rb +121 -0
  498. data/qa/specs/features/ee/browser_ui/geo/http_push_to_secondary_spec.rb +174 -0
  499. data/qa/specs/features/ee/browser_ui/geo/rename_replication_spec.rb +75 -0
  500. data/qa/specs/features/ee/browser_ui/geo/ssh_push_spec.rb +151 -0
  501. data/qa/specs/features/ee/browser_ui/geo/ssh_push_to_secondary_spec.rb +189 -0
  502. data/qa/specs/features/ee/browser_ui/geo/wiki_http_push_spec.rb +68 -0
  503. data/qa/specs/features/ee/browser_ui/geo/wiki_http_push_to_secondary_spec.rb +105 -0
  504. data/qa/specs/features/ee/browser_ui/geo/wiki_ssh_push_spec.rb +93 -0
  505. data/qa/specs/features/ee/browser_ui/geo/wiki_ssh_push_to_secondary_spec.rb +110 -0
  506. data/qa/specs/features/ee/browser_ui/secure/create_merge_request_with_secure_spec.rb +79 -0
  507. data/qa/specs/features/ee/browser_ui/secure/license_compliance_spec.rb +98 -0
  508. data/qa/specs/features/ee/browser_ui/secure/merge_request_license_widget_spec.rb +134 -0
  509. data/qa/specs/features/ee/browser_ui/secure/security_reports_spec.rb +143 -0
  510. data/qa/specs/features/ee/browser_ui/secure/vulnerability_management_spec.rb +101 -0
  511. data/qa/specs/features/sanity/framework_spec.rb +21 -0
  512. data/qa/specs/helpers/quarantine.rb +84 -0
  513. data/qa/specs/loop_runner.rb +21 -0
  514. data/qa/specs/parallel_runner.rb +33 -0
  515. data/qa/specs/runner.rb +78 -0
  516. data/qa/support/api.rb +71 -0
  517. data/qa/support/dates.rb +21 -0
  518. data/qa/support/page/logging.rb +178 -0
  519. data/qa/support/repeater.rb +65 -0
  520. data/qa/support/retrier.rb +64 -0
  521. data/qa/support/wait_for_requests.rb +25 -0
  522. data/qa/support/waiter.rb +39 -0
  523. data/qa/tools/delete_subgroups.rb +66 -0
  524. data/qa/tools/delete_test_ssh_keys.rb +61 -0
  525. data/qa/tools/generate_perf_testdata.rb +301 -0
  526. data/qa/tools/revoke_all_personal_access_tokens.rb +44 -0
  527. data/qa/vendor/jenkins/page/base.rb +24 -0
  528. data/qa/vendor/jenkins/page/configure.rb +48 -0
  529. data/qa/vendor/jenkins/page/configure_job.rb +72 -0
  530. data/qa/vendor/jenkins/page/last_job_console.rb +44 -0
  531. data/qa/vendor/jenkins/page/login.rb +31 -0
  532. data/qa/vendor/jenkins/page/new_credentials.rb +50 -0
  533. data/qa/vendor/jenkins/page/new_job.rb +38 -0
  534. data/qa/vendor/saml_idp/page/base.rb +14 -0
  535. data/qa/vendor/saml_idp/page/login.rb +31 -0
  536. metadata +835 -0
@@ -0,0 +1,151 @@
1
+ # frozen_string_literal: true
2
+
3
+ module QA
4
+ context 'Geo', :orchestrated, :geo do
5
+ describe 'GitLab SSH push' do
6
+ let(:file_name) { 'README.md' }
7
+
8
+ context 'regular git commit' do
9
+ it "is replicated to the secondary" do
10
+ key_title = "key for ssh tests #{Time.now.to_f}"
11
+ file_content = 'This is a Geo project! Commit from primary.'
12
+ project = nil
13
+ key = nil
14
+
15
+ QA::Flow::Login.while_signed_in(address: :geo_primary) do
16
+ # Create a new SSH key for the user
17
+ key = Resource::SSHKey.fabricate_via_api! do |resource|
18
+ resource.title = key_title
19
+ end
20
+
21
+ # Create a new Project
22
+ project = Resource::Project.fabricate_via_api! do |project|
23
+ project.name = 'geo-project'
24
+ project.description = 'Geo test project'
25
+ end
26
+
27
+ # Perform a git push over SSH directly to the primary
28
+ Resource::Repository::ProjectPush.fabricate! do |push|
29
+ push.ssh_key = key
30
+ push.project = project
31
+ push.file_name = file_name
32
+ push.file_content = "# #{file_content}"
33
+ push.commit_message = 'Add README.md'
34
+ end.project.visit!
35
+
36
+ # Validate git push worked and file exists with content
37
+ Page::Project::Show.perform do |show|
38
+ show.wait_for_repository_replication
39
+
40
+ expect(page).to have_content(file_name)
41
+ expect(page).to have_content(file_content)
42
+ end
43
+ end
44
+
45
+ QA::Runtime::Logger.debug('Visiting the secondary geo node')
46
+
47
+ QA::Flow::Login.while_signed_in(address: :geo_secondary) do
48
+ EE::Page::Main::Banner.perform do |banner|
49
+ expect(banner).to have_secondary_read_only_banner
50
+ end
51
+
52
+ # Ensure the SSH key has replicated
53
+ Page::Main::Menu.act { click_settings_link }
54
+ Page::Profile::Menu.act { click_ssh_keys }
55
+
56
+ expect(page).to have_content(key_title)
57
+ expect(page).to have_content(key.md5_fingerprint)
58
+
59
+ # Ensure project has replicated
60
+ Page::Main::Menu.perform { |menu| menu.go_to_projects }
61
+ Page::Dashboard::Projects.perform do |dashboard|
62
+ dashboard.wait_for_project_replication(project.name)
63
+ dashboard.go_to_project(project.name)
64
+ end
65
+
66
+ # Validate the content has been sync'd from the primary
67
+ Page::Project::Show.perform do |show|
68
+ show.wait_for_repository_replication_with(file_content)
69
+
70
+ expect(page).to have_content(file_name)
71
+ expect(page).to have_content(file_content)
72
+ end
73
+ end
74
+ end
75
+ end
76
+
77
+ context 'git-lfs commit' do
78
+ it "is replicated to the secondary" do
79
+ key_title = "key for ssh tests #{Time.now.to_f}"
80
+ file_content = 'The rendered file could not be displayed because it is stored in LFS.'
81
+ project = nil
82
+ key = nil
83
+
84
+ QA::Flow::Login.while_signed_in(address: :geo_primary) do
85
+ # Create a new SSH key for the user
86
+ key = Resource::SSHKey.fabricate_via_api! do |resource|
87
+ resource.title = key_title
88
+ end
89
+
90
+ # Create a new Project
91
+ project = Resource::Project.fabricate_via_api! do |project|
92
+ project.name = 'geo-project'
93
+ project.description = 'Geo test project'
94
+ end
95
+
96
+ # Perform a git push over SSH directly to the primary
97
+ push = Resource::Repository::ProjectPush.fabricate! do |push|
98
+ push.use_lfs = true
99
+ push.ssh_key = key
100
+ push.project = project
101
+ push.file_name = file_name
102
+ push.file_content = "# #{file_content}"
103
+ push.commit_message = 'Add README.md'
104
+ end
105
+
106
+ expect(push.output).to match(/Locking support detected on remote/)
107
+
108
+ # Validate git push worked and file exists with content
109
+ push.project.visit!
110
+ Page::Project::Show.perform do |show|
111
+ show.wait_for_repository_replication
112
+
113
+ expect(page).to have_content(file_name)
114
+ expect(page).to have_content(file_content)
115
+ end
116
+ end
117
+
118
+ QA::Runtime::Logger.debug('Visiting the secondary geo node')
119
+
120
+ QA::Flow::Login.while_signed_in(address: :geo_secondary) do
121
+ EE::Page::Main::Banner.perform do |banner|
122
+ expect(banner).to have_secondary_read_only_banner
123
+ end
124
+
125
+ # Ensure the SSH key has replicated
126
+ Page::Main::Menu.act { click_settings_link }
127
+ Page::Profile::Menu.act { click_ssh_keys }
128
+
129
+ expect(page).to have_content(key_title)
130
+ expect(page).to have_content(key.md5_fingerprint)
131
+
132
+ # Ensure project has replicated
133
+ Page::Main::Menu.perform { |menu| menu.go_to_projects }
134
+ Page::Dashboard::Projects.perform do |dashboard|
135
+ dashboard.wait_for_project_replication(project.name)
136
+ dashboard.go_to_project(project.name)
137
+ end
138
+
139
+ # Validate the content has been sync'd from the primary
140
+ Page::Project::Show.perform do |show|
141
+ show.wait_for_repository_replication_with(file_name)
142
+
143
+ expect(page).to have_content(file_name)
144
+ expect(page).to have_content(file_content)
145
+ end
146
+ end
147
+ end
148
+ end
149
+ end
150
+ end
151
+ end
@@ -0,0 +1,189 @@
1
+ # frozen_string_literal: true
2
+
3
+ module QA
4
+ context 'Geo', :orchestrated, :geo do
5
+ describe 'GitLab SSH push to secondary' do
6
+ let(:file_content_primary) { 'This is a Geo project! Commit from primary.' }
7
+ let(:file_content_secondary) { 'This is a Geo project! Commit from secondary.' }
8
+
9
+ context 'regular git commit' do
10
+ it 'is proxied to the primary and ultimately replicated to the secondary' do
11
+ file_name = 'README.md'
12
+ key_title = "key for ssh tests #{Time.now.to_f}"
13
+ project = nil
14
+ key = nil
15
+
16
+ QA::Flow::Login.while_signed_in(address: :geo_primary) do
17
+ # Create a new SSH key for the user
18
+ key = Resource::SSHKey.fabricate_via_api! do |resource|
19
+ resource.title = key_title
20
+ end
21
+
22
+ # Create a new Project
23
+ project = Resource::Project.fabricate_via_api! do |project|
24
+ project.name = 'geo-project'
25
+ project.description = 'Geo test project'
26
+ end
27
+
28
+ # Perform a git push over SSH directly to the primary
29
+ #
30
+ # This push is required to ensure we have the primary credentials
31
+ # written out to the .netrc
32
+ Resource::Repository::ProjectPush.fabricate! do |push|
33
+ push.ssh_key = key
34
+ push.project = project
35
+ push.file_name = file_name
36
+ push.file_content = "# #{file_content_primary}"
37
+ push.commit_message = "Add #{file_name}"
38
+ end
39
+ project.visit!
40
+ end
41
+
42
+ QA::Runtime::Logger.debug('Visiting the secondary geo node')
43
+
44
+ QA::Flow::Login.while_signed_in(address: :geo_secondary) do
45
+ EE::Page::Main::Banner.perform do |banner|
46
+ expect(banner).to have_secondary_read_only_banner
47
+ end
48
+
49
+ # Ensure the SSH key has replicated
50
+ Page::Main::Menu.perform(&:click_settings_link)
51
+ Page::Profile::Menu.perform do |menu|
52
+ menu.click_ssh_keys
53
+ menu.wait_for_key_to_replicate(key_title)
54
+ end
55
+
56
+ expect(page).to have_content(key_title)
57
+ expect(page).to have_content(key.md5_fingerprint)
58
+
59
+ # Ensure project has replicated
60
+ Page::Main::Menu.perform(&:go_to_projects)
61
+ Page::Dashboard::Projects.perform do |dashboard|
62
+ dashboard.wait_for_project_replication(project.name)
63
+ dashboard.go_to_project(project.name)
64
+ end
65
+
66
+ # Grab the SSH URI for the secondary and store as 'location'
67
+ location = Page::Project::Show.perform do |project_page|
68
+ project_page.wait_for_repository_replication
69
+ project_page.repository_clone_ssh_location
70
+ end
71
+
72
+ # Perform a git push over SSH at the secondary
73
+ push = Resource::Repository::Push.fabricate! do |push|
74
+ push.new_branch = false
75
+ push.ssh_key = key
76
+ push.repository_ssh_uri = location.uri
77
+ push.file_name = file_name
78
+ push.file_content = "# #{file_content_secondary}"
79
+ push.commit_message = "Update #{file_name}"
80
+ end
81
+
82
+ # Remove ssh:// from the URI to ensure we can match accurately
83
+ # as ssh:// can appear depending on how GitLab is configured.
84
+ ssh_uri = project.repository_ssh_location.git_uri.to_s.gsub(%r{ssh://}, '')
85
+
86
+ expect(push.output).to match(%r{This request to a Geo secondary node will be forwarded to the.*Geo primary node:.*#{ssh_uri}}m)
87
+
88
+ # Validate git push worked and new content is visible
89
+ Page::Project::Show.perform do |show|
90
+ show.wait_for_repository_replication_with(file_content_secondary)
91
+
92
+ expect(page).to have_content(file_content_secondary)
93
+ end
94
+ end
95
+ end
96
+ end
97
+
98
+ context 'git-lfs commit' do
99
+ it 'is proxied to the primary and ultimately replicated to the secondary' do
100
+ key_title = "key for ssh tests #{Time.now.to_f}"
101
+ file_name_primary = 'README.md'
102
+ file_name_secondary = 'README_MORE.md'
103
+ project = nil
104
+ key = nil
105
+
106
+ QA::Flow::Login.while_signed_in(address: :geo_primary) do
107
+ # Create a new SSH key for the user
108
+ key = Resource::SSHKey.fabricate_via_api! do |resource|
109
+ resource.title = key_title
110
+ end
111
+
112
+ # Create a new Project
113
+ project = Resource::Project.fabricate_via_api! do |project|
114
+ project.name = 'geo-project'
115
+ project.description = 'Geo test project'
116
+ end
117
+
118
+ # Perform a git push over SSH directly to the primary
119
+ #
120
+ # This push is required to ensure we have the primary credentials
121
+ # written out to the .netrc
122
+ Resource::Repository::Push.fabricate! do |push|
123
+ push.use_lfs = true
124
+ push.ssh_key = key
125
+ push.repository_ssh_uri = project.repository_ssh_location.uri
126
+ push.file_name = file_name_primary
127
+ push.file_content = "# #{file_content_primary}"
128
+ push.commit_message = "Add #{file_name_primary}"
129
+ end
130
+ end
131
+
132
+ QA::Runtime::Logger.debug('Visiting the secondary geo node')
133
+
134
+ QA::Flow::Login.while_signed_in(address: :geo_secondary) do
135
+ EE::Page::Main::Banner.perform do |banner|
136
+ expect(banner).to have_secondary_read_only_banner
137
+ end
138
+
139
+ # Ensure the SSH key has replicated
140
+ Page::Main::Menu.perform(&:click_settings_link)
141
+ Page::Profile::Menu.perform do |menu|
142
+ menu.click_ssh_keys
143
+ menu.wait_for_key_to_replicate(key_title)
144
+ end
145
+
146
+ expect(page).to have_content(key_title)
147
+ expect(page).to have_content(key.md5_fingerprint)
148
+
149
+ # Ensure project has replicated
150
+ Page::Main::Menu.perform(&:go_to_projects)
151
+ Page::Dashboard::Projects.perform do |dashboard|
152
+ dashboard.wait_for_project_replication(project.name)
153
+ dashboard.go_to_project(project.name)
154
+ end
155
+
156
+ # Grab the SSH URI for the secondary and store as 'location'
157
+ location = Page::Project::Show.perform do |project_page|
158
+ project_page.wait_for_repository_replication
159
+ project_page.repository_clone_ssh_location
160
+ end
161
+
162
+ # Perform a git push over SSH at the secondary
163
+ push = Resource::Repository::Push.fabricate! do |push|
164
+ push.use_lfs = true
165
+ push.new_branch = false
166
+ push.ssh_key = key
167
+ push.repository_ssh_uri = location.uri
168
+ push.file_name = file_name_secondary
169
+ push.file_content = "# #{file_content_secondary}"
170
+ push.commit_message = "Add #{file_name_secondary}"
171
+ end
172
+
173
+ ssh_uri = project.repository_ssh_location.git_uri.to_s.gsub(%r{ssh://}, '')
174
+ expect(push.output).to match(%r{This request to a Geo secondary node will be forwarded to the.*Geo primary node:.*#{ssh_uri}}m)
175
+ expect(push.output).to match(/Locking support detected on remote "#{location.uri}"/)
176
+
177
+ # Validate git push worked and new content is visible
178
+ Page::Project::Show.perform do |show|
179
+ show.wait_for_repository_replication_with(file_name_secondary)
180
+ show.refresh
181
+
182
+ expect(page).to have_content(file_name_secondary)
183
+ end
184
+ end
185
+ end
186
+ end
187
+ end
188
+ end
189
+ end
@@ -0,0 +1,68 @@
1
+ # frozen_string_literal: true
2
+
3
+ module QA
4
+ context 'Geo', :orchestrated, :geo do
5
+ describe 'GitLab wiki HTTP push' do
6
+ context 'wiki commit' do
7
+ it 'is replicated to the secondary node' do
8
+ wiki_title = 'Geo Replication Wiki'
9
+ wiki_content = 'This tests replication of wikis via HTTP'
10
+ push_content = 'This is from the Geo wiki push!'
11
+ project_name = "geo-wiki-project-#{SecureRandom.hex(8)}"
12
+
13
+ # Create new wiki and push wiki commit
14
+ QA::Flow::Login.while_signed_in(address: :geo_primary) do
15
+ project = Resource::Project.fabricate_via_api! do |project|
16
+ project.name = project_name
17
+ project.description = 'Geo project for wiki repo test'
18
+ end
19
+
20
+ wiki = Resource::Wiki.fabricate! do |wiki|
21
+ wiki.project = project
22
+ wiki.title = wiki_title
23
+ wiki.content = wiki_content
24
+ wiki.message = 'First commit'
25
+ end
26
+
27
+ expect(page).to have_content(wiki_content)
28
+
29
+ Resource::Repository::WikiPush.fabricate! do |push|
30
+ push.wiki = wiki
31
+ push.file_name = 'Home.md'
32
+ push.file_content = push_content
33
+ push.commit_message = 'Update Home.md'
34
+ end
35
+
36
+ Page::Project::Menu.perform(&:click_wiki)
37
+ expect(page).to have_content(push_content)
38
+ end
39
+
40
+ # Validate that wiki is synced on secondary node
41
+ QA::Runtime::Logger.debug('Visiting the secondary geo node')
42
+
43
+ QA::Flow::Login.while_signed_in(address: :geo_secondary) do
44
+ EE::Page::Main::Banner.perform do |banner|
45
+ expect(banner).to have_secondary_read_only_banner
46
+ end
47
+
48
+ Page::Main::Menu.perform do |menu|
49
+ menu.go_to_projects
50
+ end
51
+
52
+ Page::Dashboard::Projects.perform do |dashboard|
53
+ dashboard.wait_for_project_replication(project_name)
54
+ dashboard.go_to_project(project_name)
55
+ end
56
+
57
+ Page::Project::Menu.perform(&:click_wiki)
58
+
59
+ Page::Project::Wiki::Show.perform do |show|
60
+ expect(page).to have_content(wiki_title)
61
+ expect(page).to have_content(push_content)
62
+ end
63
+ end
64
+ end
65
+ end
66
+ end
67
+ end
68
+ end
@@ -0,0 +1,105 @@
1
+ # frozen_string_literal: true
2
+
3
+ module QA
4
+ # https://gitlab.com/gitlab-org/gitlab/issues/35706
5
+ context 'Geo', :orchestrated, :geo do
6
+ describe 'GitLab Geo Wiki HTTP push secondary' do
7
+ let(:wiki_content) { 'This tests wiki pushes via HTTP to secondary.' }
8
+ let(:push_content_primary) { 'This is from the Geo wiki push to primary!' }
9
+ let(:push_content_secondary) { 'This is from the Geo wiki push to secondary!' }
10
+ let(:project_name) { "geo-wiki-project-#{SecureRandom.hex(8)}" }
11
+ let(:git_push_http_path_prefix) { '/-/push_from_secondary' }
12
+
13
+ wiki = nil
14
+
15
+ before do
16
+ QA::Flow::Login.while_signed_in(address: :geo_primary) do
17
+ # Create a new project and wiki
18
+ project = Resource::Project.fabricate_via_api! do |project|
19
+ project.name = project_name
20
+ project.description = 'Geo test project'
21
+ end
22
+
23
+ wiki = Resource::Wiki.fabricate! do |wiki|
24
+ wiki.project = project
25
+ wiki.title = 'Geo wiki'
26
+ wiki.content = wiki_content
27
+ wiki.message = 'First wiki commit'
28
+ end
29
+
30
+ expect(wiki).to have_content(wiki_content)
31
+
32
+ # Perform a git push over HTTP directly to the primary
33
+ # This push is required to ensure we have the primary credentials
34
+ # written out to the .netrc
35
+ Resource::Repository::WikiPush.fabricate! do |push|
36
+ push.wiki = wiki
37
+ push.file_name = 'Readme.md'
38
+ push.file_content = push_content_primary
39
+ push.commit_message = 'Update Readme.md'
40
+ end
41
+ end
42
+ end
43
+
44
+ it 'is redirected to the primary and ultimately replicated to the secondary' do
45
+ QA::Runtime::Logger.debug('Visiting the secondary geo node')
46
+
47
+ QA::Flow::Login.while_signed_in(address: :geo_secondary) do
48
+ EE::Page::Main::Banner.perform do |banner|
49
+ expect(banner).to have_secondary_read_only_banner
50
+ end
51
+
52
+ Page::Main::Menu.perform(&:go_to_projects)
53
+
54
+ Page::Dashboard::Projects.perform do |dashboard|
55
+ dashboard.wait_for_project_replication(project_name)
56
+ dashboard.go_to_project(project_name)
57
+ end
58
+
59
+ Page::Project::Menu.perform(&:click_wiki)
60
+
61
+ # Grab the HTTP URI for the secondary node and store as 'secondary_location'
62
+ Page::Project::Wiki::Show.perform do |show|
63
+ show.wait_for_repository_replication
64
+ show.click_clone_repository
65
+ end
66
+
67
+ secondary_location = Page::Project::Wiki::GitAccess.perform do |git_access|
68
+ git_access.choose_repository_clone_http
69
+ git_access.repository_location
70
+ end
71
+
72
+ # Perform a git push over HTTP to the secondary node
73
+ push = Resource::Repository::WikiPush.fabricate! do |push|
74
+ push.wiki = wiki
75
+ push.repository_http_uri = secondary_location.uri
76
+ push.file_name = 'Home.md'
77
+ push.file_content = push_content_secondary
78
+ push.commit_message = 'Update Home.md'
79
+ end
80
+
81
+ # Check that the git cli produces the 'warning: redirecting to..(primary node)' output
82
+ primary_uri = wiki.repository_http_location.uri
83
+ primary_uri.user = nil
84
+
85
+ # The secondary inserts a special path prefix.
86
+ # See `Gitlab::Geo::GitPushHttp::PATH_PREFIX`.
87
+ path = File.join(git_push_http_path_prefix, '\d+', primary_uri.path)
88
+ absolute_path = primary_uri.to_s.sub(primary_uri.path, path)
89
+
90
+ expect(push.output).to match(/warning: redirecting to #{absolute_path}/)
91
+
92
+ # Validate git push worked and new content is visible
93
+ Page::Project::Menu.perform(&:click_wiki)
94
+
95
+ Page::Project::Wiki::Show.perform do |show|
96
+ show.wait_for_repository_replication_with(push_content_secondary)
97
+ show.refresh
98
+
99
+ expect(show).to have_content(push_content_secondary)
100
+ end
101
+ end
102
+ end
103
+ end
104
+ end
105
+ end