@eclipse-che/che-e2e 7.73.0 → 7.74.0-dev-41d1364

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 (222) hide show
  1. package/.eslintignore +10 -0
  2. package/.eslintrc.js +183 -0
  3. package/.prettierignore +10 -0
  4. package/.prettierrc.json +10 -0
  5. package/README.md +47 -47
  6. package/configs/inversify.config.ts +14 -10
  7. package/configs/inversify.types.ts +29 -29
  8. package/configs/mocharc.ts +21 -24
  9. package/constants/API_TEST_CONSTANTS.ts +67 -0
  10. package/constants/BASE_TEST_CONSTANTS.ts +80 -0
  11. package/constants/CHROME_DRIVER_CONSTANTS.ts +54 -0
  12. package/constants/FACTORY_TEST_CONSTANTS.ts +61 -0
  13. package/constants/MONACO_CONSTANTS.ts +25 -0
  14. package/constants/OAUTH_CONSTANTS.ts +67 -0
  15. package/constants/PLUGIN_TEST_CONSTANTS.ts +15 -0
  16. package/constants/REPORTER_CONSTANTS.ts +53 -0
  17. package/constants/TIMEOUT_CONSTANTS.ts +131 -0
  18. package/dist/configs/inversify.config.js +14 -8
  19. package/dist/configs/inversify.config.js.map +1 -1
  20. package/dist/configs/inversify.types.js +2 -2
  21. package/dist/configs/inversify.types.js.map +1 -1
  22. package/dist/configs/mocharc.js +13 -16
  23. package/dist/configs/mocharc.js.map +1 -1
  24. package/dist/constants/{APITestConstants.js → API_TEST_CONSTANTS.js} +13 -13
  25. package/dist/constants/API_TEST_CONSTANTS.js.map +1 -0
  26. package/dist/constants/{BaseTestConstants.js → BASE_TEST_CONSTANTS.js} +17 -16
  27. package/dist/constants/BASE_TEST_CONSTANTS.js.map +1 -0
  28. package/dist/constants/{ChromeDriverConstants.js → CHROME_DRIVER_CONSTANTS.js} +14 -14
  29. package/dist/constants/CHROME_DRIVER_CONSTANTS.js.map +1 -0
  30. package/dist/constants/{FactoryTestConstants.js → FACTORY_TEST_CONSTANTS.js} +15 -14
  31. package/dist/constants/FACTORY_TEST_CONSTANTS.js.map +1 -0
  32. package/dist/constants/{MonacoConstants.js → MONACO_CONSTANTS.js} +8 -8
  33. package/dist/constants/MONACO_CONSTANTS.js.map +1 -0
  34. package/dist/constants/{OAuthConstants.js → OAUTH_CONSTANTS.js} +15 -15
  35. package/dist/constants/OAUTH_CONSTANTS.js.map +1 -0
  36. package/dist/constants/{PluginsTestConstants.js → PLUGIN_TEST_CONSTANTS.js} +7 -7
  37. package/dist/constants/PLUGIN_TEST_CONSTANTS.js.map +1 -0
  38. package/dist/constants/{ReporterConstants.js → REPORTER_CONSTANTS.js} +13 -13
  39. package/dist/constants/REPORTER_CONSTANTS.js.map +1 -0
  40. package/dist/constants/{TimeoutConstants.js → TIMEOUT_CONSTANTS.js} +24 -24
  41. package/dist/constants/TIMEOUT_CONSTANTS.js.map +1 -0
  42. package/dist/driver/ChromeDriver.js +12 -16
  43. package/dist/driver/ChromeDriver.js.map +1 -1
  44. package/dist/index.js +9 -9
  45. package/dist/index.js.map +1 -1
  46. package/dist/pageobjects/dashboard/CreateWorkspace.js +18 -18
  47. package/dist/pageobjects/dashboard/CreateWorkspace.js.map +1 -1
  48. package/dist/pageobjects/dashboard/Dashboard.js +27 -27
  49. package/dist/pageobjects/dashboard/Dashboard.js.map +1 -1
  50. package/dist/pageobjects/dashboard/Workspaces.js +42 -42
  51. package/dist/pageobjects/dashboard/Workspaces.js.map +1 -1
  52. package/dist/pageobjects/dashboard/workspace-details/WorkspaceDetails.js +44 -33
  53. package/dist/pageobjects/dashboard/workspace-details/WorkspaceDetails.js.map +1 -1
  54. package/dist/pageobjects/git-providers/OauthPage.js +37 -35
  55. package/dist/pageobjects/git-providers/OauthPage.js.map +1 -1
  56. package/dist/pageobjects/ide/CheCodeLocatorLoader.js +10 -10
  57. package/dist/pageobjects/ide/CheCodeLocatorLoader.js.map +1 -1
  58. package/dist/pageobjects/login/interfaces/ICheLoginPage.js +2 -2
  59. package/dist/pageobjects/login/interfaces/IOcpLoginPage.js +2 -2
  60. package/dist/pageobjects/login/kubernetes/DexLoginPage.js +10 -10
  61. package/dist/pageobjects/login/kubernetes/DexLoginPage.js.map +1 -1
  62. package/dist/pageobjects/login/kubernetes/KubernetesLoginPage.js +6 -6
  63. package/dist/pageobjects/login/kubernetes/KubernetesLoginPage.js.map +1 -1
  64. package/dist/pageobjects/login/openshift/OcpLoginPage.js +23 -23
  65. package/dist/pageobjects/login/openshift/OcpLoginPage.js.map +1 -1
  66. package/dist/pageobjects/login/openshift/OcpRedHatLoginPage.js +7 -7
  67. package/dist/pageobjects/login/openshift/OcpRedHatLoginPage.js.map +1 -1
  68. package/dist/pageobjects/login/openshift/OcpUserLoginPage.js +7 -7
  69. package/dist/pageobjects/login/openshift/OcpUserLoginPage.js.map +1 -1
  70. package/dist/pageobjects/login/openshift/RedHatLoginPage.js +11 -11
  71. package/dist/pageobjects/login/openshift/RedHatLoginPage.js.map +1 -1
  72. package/dist/pageobjects/login/openshift/RegularUserOcpCheLoginPage.js +10 -10
  73. package/dist/pageobjects/login/openshift/RegularUserOcpCheLoginPage.js.map +1 -1
  74. package/dist/pageobjects/openshift/OcpApplicationPage.js +7 -7
  75. package/dist/pageobjects/openshift/OcpApplicationPage.js.map +1 -1
  76. package/dist/pageobjects/openshift/OcpImportFromGitPage.js +9 -9
  77. package/dist/pageobjects/openshift/OcpImportFromGitPage.js.map +1 -1
  78. package/dist/pageobjects/openshift/OcpMainPage.js +15 -15
  79. package/dist/pageobjects/openshift/OcpMainPage.js.map +1 -1
  80. package/dist/specs/MochaHooks.js +27 -24
  81. package/dist/specs/MochaHooks.js.map +1 -1
  82. package/dist/specs/SmokeTest.spec.js +17 -13
  83. package/dist/specs/SmokeTest.spec.js.map +1 -1
  84. package/dist/specs/api/ContainerOverridesAPI.spec.js +10 -1
  85. package/dist/specs/api/ContainerOverridesAPI.spec.js.map +1 -1
  86. package/dist/specs/api/DevfileAcceptanceTestAPI.spec.js +31 -18
  87. package/dist/specs/api/DevfileAcceptanceTestAPI.spec.js.map +1 -1
  88. package/dist/specs/api/EmptyWorkspaceAPI.spec.js +18 -12
  89. package/dist/specs/api/EmptyWorkspaceAPI.spec.js.map +1 -1
  90. package/dist/specs/api/PodOverridesAPI.spec.js +12 -2
  91. package/dist/specs/api/PodOverridesAPI.spec.js.map +1 -1
  92. package/dist/specs/dashboard-samples/EmptyWorkspace.spec.js +12 -8
  93. package/dist/specs/dashboard-samples/EmptyWorkspace.spec.js.map +1 -1
  94. package/dist/specs/dashboard-samples/Quarkus.spec.js +13 -9
  95. package/dist/specs/dashboard-samples/Quarkus.spec.js.map +1 -1
  96. package/dist/specs/dashboard-samples/RecommendedExtensions.spec.js +47 -43
  97. package/dist/specs/dashboard-samples/RecommendedExtensions.spec.js.map +1 -1
  98. package/dist/specs/devconsole-intergration/DevConsoleIntegration.spec.js +17 -10
  99. package/dist/specs/devconsole-intergration/DevConsoleIntegration.spec.js.map +1 -1
  100. package/dist/specs/factory/Factory.spec.js +28 -26
  101. package/dist/specs/factory/Factory.spec.js.map +1 -1
  102. package/dist/specs/factory/NoSetupRepoFactory.spec.js +41 -36
  103. package/dist/specs/factory/NoSetupRepoFactory.spec.js.map +1 -1
  104. package/dist/specs/factory/RefusedOAuthFactory.spec.js +37 -35
  105. package/dist/specs/factory/RefusedOAuthFactory.spec.js.map +1 -1
  106. package/dist/specs/miscellaneous/PredefinedNamespace.spec.js +18 -5
  107. package/dist/specs/miscellaneous/PredefinedNamespace.spec.js.map +1 -1
  108. package/dist/tests-library/LoginTests.js +7 -7
  109. package/dist/tests-library/LoginTests.js.map +1 -1
  110. package/dist/tests-library/ProjectAndFileTests.js +9 -7
  111. package/dist/tests-library/ProjectAndFileTests.js.map +1 -1
  112. package/dist/tests-library/WorkspaceHandlingTests.js +61 -78
  113. package/dist/tests-library/WorkspaceHandlingTests.js.map +1 -1
  114. package/dist/utils/BrowserTabsUtil.js +29 -24
  115. package/dist/utils/BrowserTabsUtil.js.map +1 -1
  116. package/dist/utils/CheReporter.js +44 -44
  117. package/dist/utils/CheReporter.js.map +1 -1
  118. package/dist/utils/DevWorkspaceConfigurationHelper.js +19 -10
  119. package/dist/utils/DevWorkspaceConfigurationHelper.js.map +1 -1
  120. package/dist/utils/DevfilesRegistryHelper.js +25 -19
  121. package/dist/utils/DevfilesRegistryHelper.js.map +1 -1
  122. package/dist/utils/DriverHelper.js +126 -128
  123. package/dist/utils/DriverHelper.js.map +1 -1
  124. package/dist/utils/KubernetesCommandLineToolsExecutor.js +53 -46
  125. package/dist/utils/KubernetesCommandLineToolsExecutor.js.map +1 -1
  126. package/dist/utils/Logger.js +62 -39
  127. package/dist/utils/Logger.js.map +1 -1
  128. package/dist/utils/ScreenCatcher.js +18 -12
  129. package/dist/utils/ScreenCatcher.js.map +1 -1
  130. package/dist/utils/ShellExecutor.js +9 -0
  131. package/dist/utils/ShellExecutor.js.map +1 -1
  132. package/dist/utils/StringUtil.js +17 -9
  133. package/dist/utils/StringUtil.js.map +1 -1
  134. package/dist/utils/request-handlers/CheApiRequestHandler.js +36 -34
  135. package/dist/utils/request-handlers/CheApiRequestHandler.js.map +1 -1
  136. package/dist/utils/request-handlers/headers/CheMultiuserAuthorizationHeaderHandler.js +10 -6
  137. package/dist/utils/request-handlers/headers/CheMultiuserAuthorizationHeaderHandler.js.map +1 -1
  138. package/dist/utils/request-handlers/headers/IAuthorizationHeaderHandler.js +2 -2
  139. package/dist/utils/workspace/ApiUrlResolver.js +5 -5
  140. package/dist/utils/workspace/ApiUrlResolver.js.map +1 -1
  141. package/dist/utils/workspace/ITestWorkspaceUtil.js +2 -2
  142. package/dist/utils/workspace/TestWorkspaceUtil.js +36 -30
  143. package/dist/utils/workspace/TestWorkspaceUtil.js.map +1 -1
  144. package/dist/utils/workspace/WorkspaceStatus.js +2 -2
  145. package/dist/utils/workspace/WorkspaceStatus.js.map +1 -1
  146. package/driver/ChromeDriver.ts +45 -51
  147. package/driver/IDriver.ts +3 -3
  148. package/index.ts +9 -9
  149. package/package.json +59 -49
  150. package/pageobjects/dashboard/CreateWorkspace.ts +65 -56
  151. package/pageobjects/dashboard/Dashboard.ts +101 -100
  152. package/pageobjects/dashboard/Workspaces.ts +197 -166
  153. package/pageobjects/dashboard/workspace-details/WorkspaceDetails.ts +151 -127
  154. package/pageobjects/git-providers/OauthPage.ts +177 -166
  155. package/pageobjects/ide/CheCodeLocatorLoader.ts +49 -46
  156. package/pageobjects/login/interfaces/ICheLoginPage.ts +3 -3
  157. package/pageobjects/login/interfaces/IOcpLoginPage.ts +3 -3
  158. package/pageobjects/login/kubernetes/DexLoginPage.ts +32 -31
  159. package/pageobjects/login/kubernetes/KubernetesLoginPage.ts +16 -15
  160. package/pageobjects/login/openshift/OcpLoginPage.ts +62 -55
  161. package/pageobjects/login/openshift/OcpRedHatLoginPage.ts +30 -25
  162. package/pageobjects/login/openshift/OcpUserLoginPage.ts +16 -19
  163. package/pageobjects/login/openshift/RedHatLoginPage.ts +49 -44
  164. package/pageobjects/login/openshift/RegularUserOcpCheLoginPage.ts +39 -35
  165. package/pageobjects/openshift/OcpApplicationPage.ts +21 -20
  166. package/pageobjects/openshift/OcpImportFromGitPage.ts +70 -68
  167. package/pageobjects/openshift/OcpMainPage.ts +69 -68
  168. package/resources/pod-overrides-airgap.yaml +37 -0
  169. package/specs/MochaHooks.ts +59 -50
  170. package/specs/SmokeTest.spec.ts +43 -36
  171. package/specs/api/ContainerOverridesAPI.spec.ts +33 -26
  172. package/specs/api/DevfileAcceptanceTestAPI.spec.ts +107 -94
  173. package/specs/api/EmptyWorkspaceAPI.spec.ts +62 -57
  174. package/specs/api/PodOverridesAPI.spec.ts +42 -32
  175. package/specs/dashboard-samples/EmptyWorkspace.spec.ts +31 -27
  176. package/specs/dashboard-samples/Quarkus.spec.ts +34 -30
  177. package/specs/dashboard-samples/RecommendedExtensions.spec.ts +192 -170
  178. package/specs/devconsole-intergration/DevConsoleIntegration.spec.ts +62 -55
  179. package/specs/factory/Factory.spec.ts +178 -166
  180. package/specs/factory/NoSetupRepoFactory.spec.ts +227 -210
  181. package/specs/factory/RefusedOAuthFactory.spec.ts +219 -203
  182. package/specs/miscellaneous/PredefinedNamespace.spec.ts +64 -50
  183. package/tests-library/LoginTests.ts +34 -32
  184. package/tests-library/ProjectAndFileTests.ts +21 -18
  185. package/tests-library/WorkspaceHandlingTests.ts +98 -108
  186. package/tsconfig.json +15 -15
  187. package/utils/BrowserTabsUtil.ts +104 -98
  188. package/utils/CheReporter.ts +142 -148
  189. package/utils/DevWorkspaceConfigurationHelper.ts +70 -61
  190. package/utils/DevfilesRegistryHelper.ts +67 -58
  191. package/utils/DriverHelper.ts +726 -701
  192. package/utils/KubernetesCommandLineToolsExecutor.ts +196 -172
  193. package/utils/Logger.ts +104 -75
  194. package/utils/ScreenCatcher.ts +59 -48
  195. package/utils/ShellExecutor.ts +19 -11
  196. package/utils/StringUtil.ts +40 -32
  197. package/utils/request-handlers/CheApiRequestHandler.ts +92 -87
  198. package/utils/request-handlers/headers/CheMultiuserAuthorizationHeaderHandler.ts +32 -21
  199. package/utils/request-handlers/headers/IAuthorizationHeaderHandler.ts +3 -3
  200. package/utils/workspace/ApiUrlResolver.ts +31 -26
  201. package/utils/workspace/ITestWorkspaceUtil.ts +31 -31
  202. package/utils/workspace/TestWorkspaceUtil.ts +153 -142
  203. package/utils/workspace/WorkspaceStatus.ts +5 -5
  204. package/constants/APITestConstants.ts +0 -56
  205. package/constants/BaseTestConstants.ts +0 -65
  206. package/constants/ChromeDriverConstants.ts +0 -46
  207. package/constants/FactoryTestConstants.ts +0 -51
  208. package/constants/MonacoConstants.ts +0 -22
  209. package/constants/OAuthConstants.ts +0 -57
  210. package/constants/PluginsTestConstants.ts +0 -15
  211. package/constants/ReporterConstants.ts +0 -45
  212. package/constants/TimeoutConstants.ts +0 -113
  213. package/dist/constants/APITestConstants.js.map +0 -1
  214. package/dist/constants/BaseTestConstants.js.map +0 -1
  215. package/dist/constants/ChromeDriverConstants.js.map +0 -1
  216. package/dist/constants/FactoryTestConstants.js.map +0 -1
  217. package/dist/constants/MonacoConstants.js.map +0 -1
  218. package/dist/constants/OAuthConstants.js.map +0 -1
  219. package/dist/constants/PluginsTestConstants.js.map +0 -1
  220. package/dist/constants/ReporterConstants.js.map +0 -1
  221. package/dist/constants/TimeoutConstants.js.map +0 -1
  222. package/tslint.json +0 -126
@@ -1,182 +1,206 @@
1
+ /** *******************************************************************
2
+ * copyright (c) 2023 Red Hat, Inc.
3
+ *
4
+ * This program and the accompanying materials are made
5
+ * available under the terms of the Eclipse Public License 2.0
6
+ * which is available at https://www.eclipse.org/legal/epl-2.0/
7
+ *
8
+ * SPDX-License-Identifier: EPL-2.0
9
+ **********************************************************************/
1
10
  import { echo, exec, ShellString } from 'shelljs';
2
11
  import { Logger } from './Logger';
3
12
  import { ShellExecutor } from './ShellExecutor';
4
13
  import * as path from 'path';
5
- import { APITestConstants, KubernetesCommandLineTool } from '../constants/APITestConstants';
6
- import { BaseTestConstants } from '../constants/BaseTestConstants';
7
- import { OAuthConstants } from '../constants/OAuthConstants';
14
+ import { API_TEST_CONSTANTS, KubernetesCommandLineTool } from '../constants/API_TEST_CONSTANTS';
15
+ import { BASE_TEST_CONSTANTS } from '../constants/BASE_TEST_CONSTANTS';
16
+ import { OAUTH_CONSTANTS } from '../constants/OAUTH_CONSTANTS';
8
17
 
9
18
  export class KubernetesCommandLineToolsExecutor extends ShellExecutor {
10
- private static container: string;
11
- private static pod: string;
12
- private readonly namespace: string;
13
- private readonly workspaceName: string | undefined;
14
- private readonly KUBERNETES_COMMAND_LINE_TOOL: string = APITestConstants.TS_API_TEST_KUBERNETES_COMMAND_LINE_TOOL;
15
-
16
- constructor(_workspaceName?: string, _namespace?: string) {
17
- super();
18
- this.workspaceName = _workspaceName;
19
- this.namespace = this.setNamespace(_namespace);
20
- }
21
-
22
- get getWorkspaceName(): string {
23
- return <string>this.workspaceName;
24
- }
25
-
26
- get getNamespace(): string {
27
- return this.namespace;
28
- }
29
-
30
- // login to Openshift cluster with username and password
31
- loginToOcp(): void {
32
- if (this.KUBERNETES_COMMAND_LINE_TOOL === KubernetesCommandLineTool.OC) {
33
- Logger.debug(`${this.getLoggingName(this.loginToOcp.name)}: Login to the "OC" client.`);
34
- const url: string = this.getServerUrl();
35
- if (this.isUserLoggedIn()) {
36
- Logger.debug(`${this.getLoggingName(this.loginToOcp.name)}: User already logged`);
37
- } else {
38
- Logger.debug(`${this.getLoggingName(this.loginToOcp.name)}: Login ${url}, ${OAuthConstants.TS_SELENIUM_OCP_USERNAME}`);
39
- exec(`oc login --server=${url} -u=${OAuthConstants.TS_SELENIUM_OCP_USERNAME} -p=${OAuthConstants.TS_SELENIUM_OCP_PASSWORD} --insecure-skip-tls-verify`);
40
- }
41
- } else {
42
- Logger.debug(`${this.getLoggingName(this.loginToOcp.name)}: doesn't support login command`);
43
- }
44
- }
45
-
46
- getContainerName(): string {
47
- Logger.debug(`${this.getLoggingName(this.getContainerName.name)}: Get container name.`);
48
- const output: ShellString = ShellExecutor.execWithLog(`${(this.KUBERNETES_COMMAND_LINE_TOOL)} get ${(KubernetesCommandLineToolsExecutor.pod)} -o jsonpath='{.spec.containers[*].name}' -n ${this.namespace}`);
49
- echo('\n');
50
- return output.stderr ? output.stderr : output.stdout;
51
- }
52
-
53
- getWorkspacePodName(): string {
54
- Logger.debug(`${this.getLoggingName(this.getWorkspacePodName.name)}: Get workspace pod name.`);
55
- const output: ShellString = ShellExecutor.execWithLog(`${(this.KUBERNETES_COMMAND_LINE_TOOL)} get pod -l controller.devfile.io/devworkspace_name=${this.workspaceName} -n ${this.namespace} -o name`);
56
- return output.stderr ? output.stderr : output.stdout.replace('\n', '');
57
- }
58
-
59
- deleteDevWorkspace(): void {
60
- Logger.debug(`${this.getLoggingName(this.deleteDevWorkspace.name)}: Delete '${this.workspaceName}' workspace`);
61
- ShellExecutor.execWithLog(`${(this.KUBERNETES_COMMAND_LINE_TOOL)} patch dw ${this.workspaceName} -n ${this.namespace} -p '{ "metadata": { "finalizers": null }}' --type merge || true`);
62
- ShellExecutor.execWithLog(`${(this.KUBERNETES_COMMAND_LINE_TOOL)} delete dw ${this.workspaceName} -n ${this.namespace} || true`);
63
- ShellExecutor.execWithLog(`${(this.KUBERNETES_COMMAND_LINE_TOOL)} delete dwt ${BaseTestConstants.TS_SELENIUM_EDITOR}-${this.workspaceName} -n ${this.namespace} || true`);
64
- }
65
-
66
- applyAndWaitDevWorkspace(yamlConfiguration: string): ShellString {
67
- if (this.KUBERNETES_COMMAND_LINE_TOOL === KubernetesCommandLineTool.KUBECTL) {
68
- this.createNamespace();
69
- }
70
- this.applyYamlConfigurationAsStringOutput(yamlConfiguration);
71
- return this.waitDevWorkspace();
72
- }
73
-
74
- executeCommand(commandToExecute: string, container: string = KubernetesCommandLineToolsExecutor.container): ShellString {
75
- Logger.debug(`${this.getLoggingName(this.executeCommand.name)}:`);
76
- return ShellExecutor.execWithLog(`${(this.KUBERNETES_COMMAND_LINE_TOOL)} exec -i ${KubernetesCommandLineToolsExecutor.pod} -n ${this.namespace} -c ${container} -- sh -c '${commandToExecute}'`);
77
- }
78
-
79
- applyYamlConfigurationAsStringOutput(yamlConfiguration: string): ShellString {
80
- Logger.debug(`${this.getLoggingName(this.applyYamlConfigurationAsStringOutput.name)}:`);
81
- return ShellExecutor.execWithLog(`cat <<EOF | ${this.KUBERNETES_COMMAND_LINE_TOOL} apply -n ${this.namespace} -f - \n` +
82
- yamlConfiguration + '\n' +
83
- 'EOF');
84
- }
85
-
86
- applyYamlConfigurationAsFile(pathToFile: string): void {
87
- Logger.debug(`${this.getLoggingName(this.applyYamlConfigurationAsFile.name)}:`);
88
- ShellExecutor.execWithLog(`${this.KUBERNETES_COMMAND_LINE_TOOL} apply -n ${this.namespace} -f "${path.resolve(pathToFile)}"`);
89
- }
90
-
91
- getDevWorkspaceYamlConfiguration(): ShellString {
92
- Logger.debug(`${this.getLoggingName(this.getDevWorkspaceYamlConfiguration.name)}:`);
93
- return ShellExecutor.execWithLog(`${this.KUBERNETES_COMMAND_LINE_TOOL} get dw ${this.workspaceName} -n ${this.namespace} -o yaml`);
94
- }
95
-
96
- waitDevWorkspace(timeout: number = 360): ShellString {
97
- Logger.debug(`${this.getLoggingName(this.waitDevWorkspace.name)}: Wait till workspace ready.`);
98
- const output: ShellString = ShellExecutor.execWithLog(`${(this.KUBERNETES_COMMAND_LINE_TOOL)} wait -n ${this.namespace} --for=condition=Ready dw ${this.workspaceName} --timeout=${timeout}s`);
99
- this.getPodAndContainerNames();
100
- return output;
101
- }
102
-
103
- createNamespace(): void {
104
- Logger.debug(`${this.getLoggingName(this.createNamespace.name)}: Create namespace "${this.namespace}".`);
105
- ShellExecutor.execWithLog(`${this.KUBERNETES_COMMAND_LINE_TOOL} create namespace ${this.namespace}`);
106
- }
107
-
108
- createProject(projectName: string): void {
109
- Logger.debug(`${this.getLoggingName(this.createProject.name)}: Create new project "${projectName}".`);
110
- ShellExecutor.execWithLog(`${this.KUBERNETES_COMMAND_LINE_TOOL} new-project ${projectName} -n ${this.namespace}`);
111
- }
112
-
113
- deleteProject(projectName: string): void {
114
- Logger.debug(`${this.getLoggingName(this.deleteProject.name)}: Delete "${projectName}".`);
115
- ShellExecutor.execWithLog(`${this.KUBERNETES_COMMAND_LINE_TOOL} delete project ${projectName} -n ${this.namespace}`);
116
- }
117
-
118
- private getPodAndContainerNames(): void {
119
- KubernetesCommandLineToolsExecutor.pod = this.getWorkspacePodName();
120
- KubernetesCommandLineToolsExecutor.container = this.getContainerName();
121
- }
122
-
123
- private isUserLoggedIn(): boolean {
124
- const whoamiCommandOutput: ShellString = ShellExecutor.execWithLog('oc whoami && oc whoami --show-server=true');
125
-
126
- return whoamiCommandOutput.stdout.includes(OAuthConstants.TS_SELENIUM_OCP_USERNAME) && whoamiCommandOutput.stdout.includes(this.getServerUrl());
127
- }
128
-
129
- private getLoggingName(methodName: string): string {
130
- return `${this.constructor.name}.${methodName} - ${(this.KUBERNETES_COMMAND_LINE_TOOL)}`;
131
- }
132
-
133
- private setNamespace(_namespace: string | undefined): string {
134
- _namespace = _namespace !== undefined ? _namespace
135
- : BaseTestConstants.TS_SELENIUM_BASE_URL.includes('devspaces') ? OAuthConstants.TS_SELENIUM_OCP_USERNAME + '-devspaces'
136
- : BaseTestConstants.TS_SELENIUM_BASE_URL.includes('che') ? OAuthConstants.TS_SELENIUM_OCP_USERNAME + '-che'
137
- : 'default';
138
- return _namespace;
139
- }
140
-
141
- private getServerUrl(): string {
142
- Logger.debug(`${this.getLoggingName(this.getServerUrl.name)}: Get server api url.`);
143
- return BaseTestConstants.TS_SELENIUM_BASE_URL.replace('devspaces.apps', 'api') + ':6443';
144
- }
19
+ private static container: string;
20
+ private static pod: string;
21
+ private readonly namespace: string;
22
+ private readonly workspaceName: string | undefined;
23
+ private readonly KUBERNETES_COMMAND_LINE_TOOL: string = API_TEST_CONSTANTS.TS_API_TEST_KUBERNETES_COMMAND_LINE_TOOL;
24
+
25
+ constructor(_workspaceName?: string, _namespace?: string) {
26
+ super();
27
+ this.workspaceName = _workspaceName;
28
+ this.namespace = this.setNamespace(_namespace);
29
+ }
30
+
31
+ get getWorkspaceName(): string {
32
+ return <string>this.workspaceName;
33
+ }
34
+
35
+ get getNamespace(): string {
36
+ return this.namespace;
37
+ }
38
+
39
+ // login to Openshift cluster with username and password
40
+ loginToOcp(): void {
41
+ if (this.KUBERNETES_COMMAND_LINE_TOOL === KubernetesCommandLineTool.OC) {
42
+ Logger.debug(`${this.KUBERNETES_COMMAND_LINE_TOOL} - login to the "OC" client.`);
43
+ const url: string = this.getServerUrl();
44
+ if (this.isUserLoggedIn()) {
45
+ Logger.debug(`${this.KUBERNETES_COMMAND_LINE_TOOL} - user already logged`);
46
+ } else {
47
+ Logger.debug(`${this.KUBERNETES_COMMAND_LINE_TOOL} - login ${url}, ${OAUTH_CONSTANTS.TS_SELENIUM_OCP_USERNAME}`);
48
+ exec(
49
+ `oc login --server=${url} -u=${OAUTH_CONSTANTS.TS_SELENIUM_OCP_USERNAME} -p=${OAUTH_CONSTANTS.TS_SELENIUM_OCP_PASSWORD} --insecure-skip-tls-verify`
50
+ );
51
+ }
52
+ } else {
53
+ Logger.debug(`${this.KUBERNETES_COMMAND_LINE_TOOL} - doesn't support login command`);
54
+ }
55
+ }
56
+
57
+ getContainerName(): string {
58
+ Logger.debug(`${this.KUBERNETES_COMMAND_LINE_TOOL} - get container name.`);
59
+ const output: ShellString = ShellExecutor.execWithLog(
60
+ `${this.KUBERNETES_COMMAND_LINE_TOOL} get ${KubernetesCommandLineToolsExecutor.pod} -o jsonpath='{.spec.containers[*].name}' -n ${this.namespace}`
61
+ );
62
+ echo('\n');
63
+ return output.stderr ? output.stderr : output.stdout;
64
+ }
65
+
66
+ getWorkspacePodName(): string {
67
+ Logger.debug(`${this.KUBERNETES_COMMAND_LINE_TOOL} - get workspace pod name.`);
68
+ const output: ShellString = ShellExecutor.execWithLog(
69
+ `${this.KUBERNETES_COMMAND_LINE_TOOL} get pod -l controller.devfile.io/devworkspace_name=${this.workspaceName} -n ${this.namespace} -o name`
70
+ );
71
+ return output.stderr ? output.stderr : output.stdout.replace('\n', '');
72
+ }
73
+
74
+ deleteDevWorkspace(): void {
75
+ Logger.debug(`${this.KUBERNETES_COMMAND_LINE_TOOL} - delete '${this.workspaceName}' workspace`);
76
+ ShellExecutor.execWithLog(
77
+ `${this.KUBERNETES_COMMAND_LINE_TOOL} patch dw ${this.workspaceName} -n ${this.namespace} -p '{ "metadata": { "finalizers": null }}' --type merge || true`
78
+ );
79
+ ShellExecutor.execWithLog(`${this.KUBERNETES_COMMAND_LINE_TOOL} delete dw ${this.workspaceName} -n ${this.namespace} || true`);
80
+ ShellExecutor.execWithLog(
81
+ `${this.KUBERNETES_COMMAND_LINE_TOOL} delete dwt ${BASE_TEST_CONSTANTS.TS_SELENIUM_EDITOR}-${this.workspaceName} -n ${this.namespace} || true`
82
+ );
83
+ }
84
+
85
+ applyAndWaitDevWorkspace(yamlConfiguration: string): ShellString {
86
+ if (this.KUBERNETES_COMMAND_LINE_TOOL === KubernetesCommandLineTool.KUBECTL) {
87
+ this.createNamespace();
88
+ }
89
+ this.applyYamlConfigurationAsStringOutput(yamlConfiguration);
90
+ return this.waitDevWorkspace();
91
+ }
92
+
93
+ executeCommand(commandToExecute: string, container: string = KubernetesCommandLineToolsExecutor.container): ShellString {
94
+ Logger.debug(`${this.KUBERNETES_COMMAND_LINE_TOOL}`);
95
+ return ShellExecutor.execWithLog(
96
+ `${this.KUBERNETES_COMMAND_LINE_TOOL} exec -i ${KubernetesCommandLineToolsExecutor.pod} -n ${this.namespace} -c ${container} -- sh -c '${commandToExecute}'`
97
+ );
98
+ }
99
+
100
+ applyYamlConfigurationAsStringOutput(yamlConfiguration: string): ShellString {
101
+ Logger.debug(`${this.KUBERNETES_COMMAND_LINE_TOOL}`);
102
+ return ShellExecutor.execWithLog(
103
+ `cat <<EOF | ${this.KUBERNETES_COMMAND_LINE_TOOL} apply -n ${this.namespace} -f - \n` + yamlConfiguration + '\n' + 'EOF'
104
+ );
105
+ }
106
+
107
+ applyYamlConfigurationAsFile(pathToFile: string): void {
108
+ Logger.debug(`${this.KUBERNETES_COMMAND_LINE_TOOL}`);
109
+ ShellExecutor.execWithLog(`${this.KUBERNETES_COMMAND_LINE_TOOL} apply -n ${this.namespace} -f "${path.resolve(pathToFile)}"`);
110
+ }
111
+
112
+ getDevWorkspaceYamlConfiguration(): ShellString {
113
+ Logger.debug(`${this.KUBERNETES_COMMAND_LINE_TOOL}`);
114
+ return ShellExecutor.execWithLog(`${this.KUBERNETES_COMMAND_LINE_TOOL} get dw ${this.workspaceName} -n ${this.namespace} -o yaml`);
115
+ }
116
+
117
+ waitDevWorkspace(timeout: number = 360): ShellString {
118
+ Logger.debug(`${this.KUBERNETES_COMMAND_LINE_TOOL} - wait till workspace ready.`);
119
+ const output: ShellString = ShellExecutor.execWithLog(
120
+ `${this.KUBERNETES_COMMAND_LINE_TOOL} wait -n ${this.namespace} --for=condition=Ready dw ${this.workspaceName} --timeout=${timeout}s`
121
+ );
122
+ this.getPodAndContainerNames();
123
+ return output;
124
+ }
125
+
126
+ createNamespace(): void {
127
+ Logger.debug(`${this.KUBERNETES_COMMAND_LINE_TOOL} - create namespace "${this.namespace}".`);
128
+ ShellExecutor.execWithLog(`${this.KUBERNETES_COMMAND_LINE_TOOL} create namespace ${this.namespace}`);
129
+ }
130
+
131
+ createProject(projectName: string): void {
132
+ Logger.debug(`${this.KUBERNETES_COMMAND_LINE_TOOL} - create new project "${projectName}".`);
133
+ ShellExecutor.execWithLog(`${this.KUBERNETES_COMMAND_LINE_TOOL} new-project ${projectName} -n ${this.namespace}`);
134
+ }
135
+
136
+ deleteProject(projectName: string): void {
137
+ Logger.debug(`${this.KUBERNETES_COMMAND_LINE_TOOL} - delete "${projectName}".`);
138
+ ShellExecutor.execWithLog(`${this.KUBERNETES_COMMAND_LINE_TOOL} delete project ${projectName} -n ${this.namespace}`);
139
+ }
140
+
141
+ private getPodAndContainerNames(): void {
142
+ KubernetesCommandLineToolsExecutor.pod = this.getWorkspacePodName();
143
+ KubernetesCommandLineToolsExecutor.container = this.getContainerName();
144
+ }
145
+
146
+ private isUserLoggedIn(): boolean {
147
+ const whoamiCommandOutput: ShellString = ShellExecutor.execWithLog('oc whoami && oc whoami --show-server=true');
148
+
149
+ return (
150
+ whoamiCommandOutput.stdout.includes(OAUTH_CONSTANTS.TS_SELENIUM_OCP_USERNAME) &&
151
+ whoamiCommandOutput.stdout.includes(this.getServerUrl())
152
+ );
153
+ }
154
+
155
+ private setNamespace(_namespace: string | undefined): string {
156
+ _namespace =
157
+ _namespace !== undefined
158
+ ? _namespace
159
+ : BASE_TEST_CONSTANTS.TS_SELENIUM_BASE_URL.includes('devspaces')
160
+ ? OAUTH_CONSTANTS.TS_SELENIUM_OCP_USERNAME + '-devspaces'
161
+ : BASE_TEST_CONSTANTS.TS_SELENIUM_BASE_URL.includes('che')
162
+ ? OAUTH_CONSTANTS.TS_SELENIUM_OCP_USERNAME + '-che'
163
+ : 'default';
164
+ return _namespace;
165
+ }
166
+
167
+ private getServerUrl(): string {
168
+ Logger.debug(`${this.KUBERNETES_COMMAND_LINE_TOOL} - get server api url.`);
169
+ return BASE_TEST_CONSTANTS.TS_SELENIUM_BASE_URL.replace('devspaces.apps', 'api') + ':6443';
170
+ }
145
171
  }
146
172
 
173
+ // eslint-disable-next-line no-redeclare
147
174
  export namespace KubernetesCommandLineToolsExecutor {
148
- export class ContainerTerminal extends KubernetesCommandLineToolsExecutor {
149
- constructor(cluster: KubernetesCommandLineToolsExecutor) {
150
- super(cluster.getWorkspaceName, cluster.getNamespace);
151
- }
152
-
153
- ls(path: string = ''): ShellString {
154
- return this.executeCommand('ls ' + path);
155
- }
156
-
157
- pwd(): ShellString {
158
- return this.executeCommand('pwd');
159
- }
160
-
161
- cd(path: string): ShellString {
162
- return this.executeCommand('cd ' + path);
163
- }
164
-
165
- gitClone(repository: string): ShellString {
166
- return this.executeCommand('git clone ' + repository);
167
- }
168
-
169
- removeFolder(path: string): ShellString {
170
- return this.executeCommand('rm -rf ' + path);
171
- }
172
-
173
- getEnvValue(envName: string): string {
174
- envName = envName.replace(/[${}]/g, '');
175
- const output: ShellString = this.executeCommand(`env | grep ${envName}`);
176
- return output.stderr ? output.stderr :
177
- output.stdout
178
- .substring(output.stdout.lastIndexOf('=') + 1)
179
- .replace('\n', '');
180
- }
181
- }
175
+ export class ContainerTerminal extends KubernetesCommandLineToolsExecutor {
176
+ constructor(cluster: KubernetesCommandLineToolsExecutor) {
177
+ super(cluster.getWorkspaceName, cluster.getNamespace);
178
+ }
179
+
180
+ ls(path: string = ''): ShellString {
181
+ return this.executeCommand('ls ' + path);
182
+ }
183
+
184
+ pwd(): ShellString {
185
+ return this.executeCommand('pwd');
186
+ }
187
+
188
+ cd(path: string): ShellString {
189
+ return this.executeCommand('cd ' + path);
190
+ }
191
+
192
+ gitClone(repository: string): ShellString {
193
+ return this.executeCommand('git clone ' + repository);
194
+ }
195
+
196
+ removeFolder(path: string): ShellString {
197
+ return this.executeCommand('rm -rf ' + path);
198
+ }
199
+
200
+ getEnvValue(envName: string): string {
201
+ envName = envName.replace(/[${}]/g, '');
202
+ const output: ShellString = this.executeCommand(`env | grep ${envName}`);
203
+ return output.stderr ? output.stderr : output.stdout.substring(output.stdout.lastIndexOf('=') + 1).replace('\n', '');
204
+ }
205
+ }
182
206
  }
package/utils/Logger.ts CHANGED
@@ -1,5 +1,5 @@
1
- /*********************************************************************
2
- * Copyright (c) 2019-2023 Red Hat, Inc.
1
+ /** *******************************************************************
2
+ * copyright (c) 2019-2023 Red Hat, Inc.
3
3
  *
4
4
  * This program and the accompanying materials are made
5
5
  * available under the terms of the Eclipse Public License 2.0
@@ -7,85 +7,114 @@
7
7
  *
8
8
  * SPDX-License-Identifier: EPL-2.0
9
9
  **********************************************************************/
10
- import { ReporterConstants } from '../constants/ReporterConstants';
10
+ import { REPORTER_CONSTANTS } from '../constants/REPORTER_CONSTANTS';
11
11
 
12
12
  export abstract class Logger {
13
+ /**
14
+ * uses for logging of fatal errors.
15
+ * @param text log text
16
+ * @param indentLevel log level
17
+ */
18
+ static error(text: string = '', indentLevel: number = 1): void {
19
+ const callerInfo: string = this.getCallerInfo();
20
+ const logLevelSymbol: string = '[ERROR] ';
21
+ this.logText(indentLevel, logLevelSymbol, `${this.getFullMessage(callerInfo, text)}`);
22
+ }
13
23
 
14
- /**
15
- * Uses for logging of fatal errors.
16
- * @param text log text
17
- * @param indentLevel log level
18
- */
19
- static error(text: string, indentLevel: number = 1): void {
20
- this.logText(indentLevel, `[ERROR] ${text}`);
21
- }
24
+ /**
25
+ * uses for logging of recoverable errors and general warnings.
26
+ * @param text log text
27
+ * @param indentLevel log level
28
+ */
29
+ static warn(text: string = '', indentLevel: number = 1): void {
30
+ if (REPORTER_CONSTANTS.TS_SELENIUM_LOG_LEVEL === 'ERROR') {
31
+ return;
32
+ }
33
+ const callerInfo: string = this.getCallerInfo();
34
+ const logLevelSymbol: string = '[WARN] ';
35
+ this.logText(indentLevel, logLevelSymbol, `${this.getFullMessage(callerInfo, text)}`);
36
+ }
22
37
 
23
- /**
24
- * Uses for logging of recoverable errors and general warnings.
25
- * @param text log text
26
- * @param indentLevel log level
27
- */
28
- static warn(text: string, indentLevel: number = 1): void {
29
- if (ReporterConstants.TS_SELENIUM_LOG_LEVEL === 'ERROR') {
30
- return;
31
- }
32
- this.logText(indentLevel, `[WARN] ${text}`);
33
- }
38
+ /**
39
+ * uses for logging of the public methods of the pageobjects.
40
+ * @param text log text
41
+ * @param indentLevel log level
42
+ */
43
+ static info(text: string = '', indentLevel: number = 3): void {
44
+ if (REPORTER_CONSTANTS.TS_SELENIUM_LOG_LEVEL === 'ERROR' || REPORTER_CONSTANTS.TS_SELENIUM_LOG_LEVEL === 'WARN') {
45
+ return;
46
+ }
47
+ const callerInfo: string = this.getCallerInfo();
48
+ const logLevelSymbol: string = '• ';
49
+ this.logText(indentLevel, logLevelSymbol, `${this.getFullMessage(callerInfo, text)}`);
50
+ }
34
51
 
35
- /**
36
- * Uses for logging of the public methods of the pageobjects.
37
- * @param text log text
38
- * @param indentLevel log level
39
- */
40
- static info(text: string, indentLevel: number = 3): void {
41
- if (ReporterConstants.TS_SELENIUM_LOG_LEVEL === 'ERROR' ||
42
- ReporterConstants.TS_SELENIUM_LOG_LEVEL === 'WARN') {
43
- return;
44
- }
45
- this.logText(indentLevel, `• ${text}`);
46
- }
52
+ /**
53
+ * uses for logging of the public methods of the pageobjects.
54
+ * @param text log text
55
+ * @param indentLevel log level
56
+ */
57
+ static debug(text: string = '', indentLevel: number = 5): void {
58
+ if (
59
+ REPORTER_CONSTANTS.TS_SELENIUM_LOG_LEVEL === 'ERROR' ||
60
+ REPORTER_CONSTANTS.TS_SELENIUM_LOG_LEVEL === 'WARN' ||
61
+ REPORTER_CONSTANTS.TS_SELENIUM_LOG_LEVEL === 'INFO'
62
+ ) {
63
+ return;
64
+ }
65
+ const callerInfo: string = this.getCallerInfo();
66
+ const logLevelSymbol: string = '▼ ';
67
+ this.logText(indentLevel, logLevelSymbol, `${this.getFullMessage(callerInfo, text)}`);
68
+ }
47
69
 
48
- /**
49
- * Uses for logging of the public methods of the pageobjects.
50
- * @param text log text
51
- * @param indentLevel log level
52
- */
53
- static debug(text: string, indentLevel: number = 5): void {
54
- if (ReporterConstants.TS_SELENIUM_LOG_LEVEL === 'ERROR' ||
55
- ReporterConstants.TS_SELENIUM_LOG_LEVEL === 'WARN' ||
56
- ReporterConstants.TS_SELENIUM_LOG_LEVEL === 'INFO') {
57
- return;
58
- }
59
- this.logText(indentLevel, `▼ ${text}`);
60
- }
70
+ /**
71
+ * uses for logging of the public methods of the {@link DriverHelper} or
72
+ * private methods inside of pageobjects.
73
+ * @param text log text
74
+ * @param indentLevel log level
75
+ */
76
+ static trace(text: string = '', indentLevel: number = 6): void {
77
+ if (
78
+ REPORTER_CONSTANTS.TS_SELENIUM_LOG_LEVEL === 'ERROR' ||
79
+ REPORTER_CONSTANTS.TS_SELENIUM_LOG_LEVEL === 'WARN' ||
80
+ REPORTER_CONSTANTS.TS_SELENIUM_LOG_LEVEL === 'INFO' ||
81
+ REPORTER_CONSTANTS.TS_SELENIUM_LOG_LEVEL === 'DEBUG'
82
+ ) {
83
+ return;
84
+ }
85
+ const callerInfo: string = this.getCallerInfo();
86
+ const logLevelSymbol: string = '‣ ';
87
+ this.logText(indentLevel, logLevelSymbol, `${this.getFullMessage(callerInfo, text)}`);
88
+ }
61
89
 
62
- /**
63
- * Uses for logging of the public methods of the {@link DriverHelper} or
64
- * private methods inside of pageobjects.
65
- * @param text log text
66
- * @param indentLevel log level
67
- */
68
- static trace(text: string, indentLevel: number = 6): void {
69
- if (ReporterConstants.TS_SELENIUM_LOG_LEVEL === 'ERROR' ||
70
- ReporterConstants.TS_SELENIUM_LOG_LEVEL === 'WARN' ||
71
- ReporterConstants.TS_SELENIUM_LOG_LEVEL === 'INFO' ||
72
- ReporterConstants.TS_SELENIUM_LOG_LEVEL === 'DEBUG') {
73
- return;
74
- }
75
- this.logText(indentLevel, `‣ ${text}`);
76
- }
90
+ private static getFullMessage(callerInfo: string, text: string): string {
91
+ return `${callerInfo}${this.separator(text, callerInfo)}${text}`;
92
+ }
77
93
 
78
- private static logText(messageIndentationLevel: number, text: string): void {
79
- // start group for every level
80
- for (let i: number = 0; i < messageIndentationLevel; i++) {
81
- console.group();
82
- }
83
- // print the trimmed text
84
- // if multiline, the message should be properly padded
85
- console.log(text);
86
- // end group for every level
87
- for (let i: number = 0; i < messageIndentationLevel; i++) {
88
- console.groupEnd();
89
- }
90
- }
94
+ private static logText(messageIndentationLevel: number, logLevelSymbol: string, text: string): void {
95
+ if (text) {
96
+ // start group for every level
97
+ for (let i: number = 0; i < messageIndentationLevel; i++) {
98
+ console.group();
99
+ }
100
+ // print the trimmed text
101
+ // if multiline, the message should be properly padded
102
+ console.log(logLevelSymbol + text);
103
+ // end group for every level
104
+ for (let i: number = 0; i < messageIndentationLevel; i++) {
105
+ console.groupEnd();
106
+ }
107
+ }
108
+ }
109
+
110
+ private static getCallerInfo(): string {
111
+ const e: Error = new Error();
112
+ const stack: string[] = e.stack ? e.stack.split('\n') : [];
113
+ // " at functionName ( ..." => "functionName"
114
+ return stack[3].includes('.<anonymous') ? '' : stack[3].replace(/^\s+at\s+(.+?)\s.+/g, '$1');
115
+ }
116
+
117
+ private static separator(text: string, caller: string): string {
118
+ return text ? (caller ? ' - ' : '') : '';
119
+ }
91
120
  }