@eclipse-che/che-e2e 7.100.0-next-45d4d3d → 7.100.0-next-e4e067d

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.
@@ -0,0 +1,137 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ /** *******************************************************************
4
+ * copyright (c) 2025 Red Hat, Inc.
5
+ *
6
+ * This program and the accompanying materials are made
7
+ * available under the terms of the Eclipse Public License 2.0
8
+ * which is available at https://www.eclipse.org/legal/epl-2.0/
9
+ *
10
+ * SPDX-License-Identifier: EPL-2.0
11
+ **********************************************************************/
12
+ const chai_1 = require("chai");
13
+ const inversify_config_1 = require("../../configs/inversify.config");
14
+ const inversify_types_1 = require("../../configs/inversify.types");
15
+ const BASE_TEST_CONSTANTS_1 = require("../../constants/BASE_TEST_CONSTANTS");
16
+ const WorkspaceHandlingTests_1 = require("../../tests-library/WorkspaceHandlingTests");
17
+ const MochaHooks_1 = require("../MochaHooks");
18
+ suite(`Test podman build container functionality ${BASE_TEST_CONSTANTS_1.BASE_TEST_CONSTANTS.TEST_ENVIRONMENT}`, function () {
19
+ const projectAndFileTests = inversify_config_1.e2eContainer.get(inversify_types_1.CLASSES.ProjectAndFileTests);
20
+ const workspaceHandlingTests = inversify_config_1.e2eContainer.get(inversify_types_1.CLASSES.WorkspaceHandlingTests);
21
+ const loginTests = inversify_config_1.e2eContainer.get(inversify_types_1.CLASSES.LoginTests);
22
+ const browserTabsUtil = inversify_config_1.e2eContainer.get(inversify_types_1.CLASSES.BrowserTabsUtil);
23
+ const testWorkspaceUtil = inversify_config_1.e2eContainer.get(inversify_types_1.TYPES.WorkspaceUtil);
24
+ const dashboard = inversify_config_1.e2eContainer.get(inversify_types_1.CLASSES.Dashboard);
25
+ const shellExecutor = inversify_config_1.e2eContainer.get(inversify_types_1.CLASSES.ShellExecutor);
26
+ let kubernetesCommandLineToolsExecutor;
27
+ let workspaceName = '';
28
+ let originalBuildCapabilitiesSetting = '';
29
+ let devSpacesNamespace = '';
30
+ let cheClusterName = '';
31
+ const buildPushScript = `
32
+ export ARCH=$(uname -m)
33
+ export DATE=$(date +"%m%d%y")
34
+ export USER=$(oc whoami)
35
+ export TKN=$(oc whoami -t)
36
+ export REG="image-registry.openshift-image-registry.svc:5000"
37
+ export PROJECT=$(oc project -q)
38
+ export IMG="\${REG}/\${PROJECT}/hello:\${DATE}"
39
+
40
+ # Create test directory and Dockerfile
41
+ mkdir -p /projects/dockerfile-test
42
+ cd /projects/dockerfile-test
43
+
44
+ cat > Dockerfile << EOF
45
+ FROM registry.access.redhat.com/ubi8/ubi-minimal:latest
46
+ RUN echo "Hello from Kubedock!" > /hello.txt
47
+ CMD ["cat", "/hello.txt"]
48
+ EOF
49
+
50
+ podman login --tls-verify=false --username "\${USER}" --password "\${TKN}" "\${REG}"
51
+ podman build -t "\${IMG}" .
52
+ podman push --tls-verify=false "\${IMG}"
53
+ `;
54
+ const runTestScript = `
55
+ export DATE=$(date +"%m%d%y")
56
+ export REG="image-registry.openshift-image-registry.svc:5000"
57
+ export PROJECT=$(oc project -q)
58
+ export IMG="\${REG}/\${PROJECT}/hello:\${DATE}"
59
+
60
+ oc delete pod test-hello-pod --ignore-not-found
61
+ oc run test-hello-pod --restart=Never --image="\${IMG}"
62
+
63
+ if ! oc wait --for=jsonpath='{.status.phase}'=Succeeded pod/test-hello-pod --timeout=60s; then
64
+ PHASE=$(oc get pod test-hello-pod -o jsonpath='{.status.phase}')
65
+ if [[ "$PHASE" == "Failed" ]]; then
66
+ oc describe pod test-hello-pod
67
+ exit 1
68
+ fi
69
+ fi
70
+
71
+ oc logs test-hello-pod
72
+ `;
73
+ suiteSetup('Setup DevSpaces with container build capabilities enabled', function () {
74
+ kubernetesCommandLineToolsExecutor = inversify_config_1.e2eContainer.get(inversify_types_1.CLASSES.KubernetesCommandLineToolsExecutor);
75
+ kubernetesCommandLineToolsExecutor.loginToOcp();
76
+ // get the namespace where DevSpaces is installed
77
+ const getDevSpacesNamespaceCommand = 'oc get checluster --all-namespaces -o jsonpath="{.items[0].metadata.namespace}"';
78
+ devSpacesNamespace = shellExecutor.executeCommand(getDevSpacesNamespaceCommand).stdout.trim();
79
+ // get the name of the CheCluster
80
+ const getCheClusterNameCommand = `oc get checluster -n ${devSpacesNamespace} -o jsonpath='{.items[0].metadata.name}'`;
81
+ cheClusterName = shellExecutor.executeCommand(getCheClusterNameCommand).stdout.trim();
82
+ // get the original value of disableContainerBuildCapabilities
83
+ const getOriginalSettingCommand = `oc get checluster/${cheClusterName} -n ${devSpacesNamespace} -o jsonpath='{.spec.devEnvironments.disableContainerBuildCapabilities}'`;
84
+ originalBuildCapabilitiesSetting = shellExecutor.executeCommand(getOriginalSettingCommand).stdout.trim();
85
+ // patch the CheCluster to enable container build capabilities
86
+ const patchCommand = `oc patch checluster/${cheClusterName} -n ${devSpacesNamespace} --type=merge -p '{"spec":{"devEnvironments":{"disableContainerBuildCapabilities":false}}}'`;
87
+ const patchResult = shellExecutor.executeCommand(patchCommand);
88
+ (0, chai_1.expect)(patchResult.code).to.equal(0, 'Failed to patch CheCluster to enable container build capabilities');
89
+ });
90
+ suiteSetup('Login into DevSpaces', async function () {
91
+ await loginTests.loginIntoChe();
92
+ });
93
+ test('Create and open new Empty Workspace', async function () {
94
+ await dashboard.waitPage();
95
+ await workspaceHandlingTests.createAndOpenWorkspace('Empty Workspace');
96
+ await workspaceHandlingTests.obtainWorkspaceNameFromStartingPage();
97
+ workspaceName = WorkspaceHandlingTests_1.WorkspaceHandlingTests.getWorkspaceName();
98
+ (0, chai_1.expect)(workspaceName, 'Workspace name was not detected').not.empty;
99
+ (0, MochaHooks_1.registerRunningWorkspace)(workspaceName);
100
+ });
101
+ test('Wait for workspace readiness', async function () {
102
+ await projectAndFileTests.waitWorkspaceReadinessForCheCodeEditor();
103
+ });
104
+ test('Build and push container image from workspace', function () {
105
+ kubernetesCommandLineToolsExecutor = inversify_config_1.e2eContainer.get(inversify_types_1.CLASSES.KubernetesCommandLineToolsExecutor);
106
+ kubernetesCommandLineToolsExecutor.workspaceName = workspaceName;
107
+ kubernetesCommandLineToolsExecutor.loginToOcp();
108
+ kubernetesCommandLineToolsExecutor.getPodAndContainerNames();
109
+ kubernetesCommandLineToolsExecutor.execInContainerCommand(buildPushScript);
110
+ });
111
+ test('Verify container image can be used in a pod', function () {
112
+ const runTestScriptOutput = kubernetesCommandLineToolsExecutor.execInContainerCommand(runTestScript);
113
+ (0, chai_1.expect)(runTestScriptOutput.stdout).to.include('Hello from Kubedock!', 'Expected "Hello from Kubedock!" message not found in logs');
114
+ });
115
+ suiteTeardown('Open dashboard and close all other tabs', async function () {
116
+ await dashboard.openDashboard();
117
+ await browserTabsUtil.closeAllTabsExceptCurrent();
118
+ });
119
+ suiteTeardown('Stop and delete the workspace by API', async function () {
120
+ await testWorkspaceUtil.stopAndDeleteWorkspaceByName(workspaceName);
121
+ });
122
+ suiteTeardown('Unregister running workspace', function () {
123
+ (0, MochaHooks_1.registerRunningWorkspace)('');
124
+ });
125
+ suiteTeardown('Restore DevSpaces container build capabilities setting', function () {
126
+ kubernetesCommandLineToolsExecutor = inversify_config_1.e2eContainer.get(inversify_types_1.CLASSES.KubernetesCommandLineToolsExecutor);
127
+ kubernetesCommandLineToolsExecutor.loginToOcp();
128
+ // default to false if value wasn't found
129
+ const validSetting = ['true', 'false'].includes(originalBuildCapabilitiesSetting)
130
+ ? originalBuildCapabilitiesSetting
131
+ : 'false';
132
+ const restorePatchCommand = `oc patch checluster/${cheClusterName} -n ${devSpacesNamespace} --type=merge -p '{"spec":{"devEnvironments":{"disableContainerBuildCapabilities":${validSetting}}}}'`;
133
+ const restorePatchResult = shellExecutor.executeCommand(restorePatchCommand);
134
+ (0, chai_1.expect)(restorePatchResult.code).to.equal(0, 'Failed to restore CheCluster container build capabilities setting');
135
+ });
136
+ });
137
+ //# sourceMappingURL=BuildPushRunPodmanContainerAPI.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BuildPushRunPodmanContainerAPI.spec.js","sourceRoot":"","sources":["../../../specs/api/BuildPushRunPodmanContainerAPI.spec.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@eclipse-che/che-e2e",
3
- "version": "7.100.0-next-45d4d3d",
3
+ "version": "7.100.0-next-e4e067d",
4
4
  "description": "",
5
5
  "main": "dist/index.js",
6
6
  "scripts": {
@@ -0,0 +1,164 @@
1
+ /** *******************************************************************
2
+ * copyright (c) 2025 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
+ **********************************************************************/
10
+ import { expect } from 'chai';
11
+ import { e2eContainer } from '../../configs/inversify.config';
12
+ import { CLASSES, TYPES } from '../../configs/inversify.types';
13
+ import { BASE_TEST_CONSTANTS } from '../../constants/BASE_TEST_CONSTANTS';
14
+ import { WorkspaceHandlingTests } from '../../tests-library/WorkspaceHandlingTests';
15
+ import { ProjectAndFileTests } from '../../tests-library/ProjectAndFileTests';
16
+ import { LoginTests } from '../../tests-library/LoginTests';
17
+ import { registerRunningWorkspace } from '../MochaHooks';
18
+ import { BrowserTabsUtil } from '../../utils/BrowserTabsUtil';
19
+ import { KubernetesCommandLineToolsExecutor } from '../../utils/KubernetesCommandLineToolsExecutor';
20
+ import { ShellString } from 'shelljs';
21
+ import { ITestWorkspaceUtil } from '../../utils/workspace/ITestWorkspaceUtil';
22
+ import { Dashboard } from '../../pageobjects/dashboard/Dashboard';
23
+ import { ShellExecutor } from '../../utils/ShellExecutor';
24
+
25
+ suite(`Test podman build container functionality ${BASE_TEST_CONSTANTS.TEST_ENVIRONMENT}`, function (): void {
26
+ const projectAndFileTests: ProjectAndFileTests = e2eContainer.get(CLASSES.ProjectAndFileTests);
27
+ const workspaceHandlingTests: WorkspaceHandlingTests = e2eContainer.get(CLASSES.WorkspaceHandlingTests);
28
+ const loginTests: LoginTests = e2eContainer.get(CLASSES.LoginTests);
29
+ const browserTabsUtil: BrowserTabsUtil = e2eContainer.get(CLASSES.BrowserTabsUtil);
30
+ const testWorkspaceUtil: ITestWorkspaceUtil = e2eContainer.get(TYPES.WorkspaceUtil);
31
+ const dashboard: Dashboard = e2eContainer.get(CLASSES.Dashboard);
32
+ const shellExecutor: ShellExecutor = e2eContainer.get(CLASSES.ShellExecutor);
33
+
34
+ let kubernetesCommandLineToolsExecutor: KubernetesCommandLineToolsExecutor;
35
+ let workspaceName: string = '';
36
+ let originalBuildCapabilitiesSetting: string = '';
37
+ let devSpacesNamespace: string = '';
38
+ let cheClusterName: string = '';
39
+
40
+ const buildPushScript: string = `
41
+ export ARCH=$(uname -m)
42
+ export DATE=$(date +"%m%d%y")
43
+ export USER=$(oc whoami)
44
+ export TKN=$(oc whoami -t)
45
+ export REG="image-registry.openshift-image-registry.svc:5000"
46
+ export PROJECT=$(oc project -q)
47
+ export IMG="\${REG}/\${PROJECT}/hello:\${DATE}"
48
+
49
+ # Create test directory and Dockerfile
50
+ mkdir -p /projects/dockerfile-test
51
+ cd /projects/dockerfile-test
52
+
53
+ cat > Dockerfile << EOF
54
+ FROM registry.access.redhat.com/ubi8/ubi-minimal:latest
55
+ RUN echo "Hello from Kubedock!" > /hello.txt
56
+ CMD ["cat", "/hello.txt"]
57
+ EOF
58
+
59
+ podman login --tls-verify=false --username "\${USER}" --password "\${TKN}" "\${REG}"
60
+ podman build -t "\${IMG}" .
61
+ podman push --tls-verify=false "\${IMG}"
62
+ `;
63
+
64
+ const runTestScript: string = `
65
+ export DATE=$(date +"%m%d%y")
66
+ export REG="image-registry.openshift-image-registry.svc:5000"
67
+ export PROJECT=$(oc project -q)
68
+ export IMG="\${REG}/\${PROJECT}/hello:\${DATE}"
69
+
70
+ oc delete pod test-hello-pod --ignore-not-found
71
+ oc run test-hello-pod --restart=Never --image="\${IMG}"
72
+
73
+ if ! oc wait --for=jsonpath='{.status.phase}'=Succeeded pod/test-hello-pod --timeout=60s; then
74
+ PHASE=$(oc get pod test-hello-pod -o jsonpath='{.status.phase}')
75
+ if [[ "$PHASE" == "Failed" ]]; then
76
+ oc describe pod test-hello-pod
77
+ exit 1
78
+ fi
79
+ fi
80
+
81
+ oc logs test-hello-pod
82
+ `;
83
+
84
+ suiteSetup('Setup DevSpaces with container build capabilities enabled', function (): void {
85
+ kubernetesCommandLineToolsExecutor = e2eContainer.get(CLASSES.KubernetesCommandLineToolsExecutor);
86
+ kubernetesCommandLineToolsExecutor.loginToOcp();
87
+
88
+ // get the namespace where DevSpaces is installed
89
+ const getDevSpacesNamespaceCommand: string = 'oc get checluster --all-namespaces -o jsonpath="{.items[0].metadata.namespace}"';
90
+ devSpacesNamespace = shellExecutor.executeCommand(getDevSpacesNamespaceCommand).stdout.trim();
91
+
92
+ // get the name of the CheCluster
93
+ const getCheClusterNameCommand: string = `oc get checluster -n ${devSpacesNamespace} -o jsonpath='{.items[0].metadata.name}'`;
94
+ cheClusterName = shellExecutor.executeCommand(getCheClusterNameCommand).stdout.trim();
95
+
96
+ // get the original value of disableContainerBuildCapabilities
97
+ const getOriginalSettingCommand: string = `oc get checluster/${cheClusterName} -n ${devSpacesNamespace} -o jsonpath='{.spec.devEnvironments.disableContainerBuildCapabilities}'`;
98
+ originalBuildCapabilitiesSetting = shellExecutor.executeCommand(getOriginalSettingCommand).stdout.trim();
99
+
100
+ // patch the CheCluster to enable container build capabilities
101
+ const patchCommand: string = `oc patch checluster/${cheClusterName} -n ${devSpacesNamespace} --type=merge -p '{"spec":{"devEnvironments":{"disableContainerBuildCapabilities":false}}}'`;
102
+ const patchResult: ShellString = shellExecutor.executeCommand(patchCommand);
103
+
104
+ expect(patchResult.code).to.equal(0, 'Failed to patch CheCluster to enable container build capabilities');
105
+ });
106
+
107
+ suiteSetup('Login into DevSpaces', async function (): Promise<void> {
108
+ await loginTests.loginIntoChe();
109
+ });
110
+
111
+ test('Create and open new Empty Workspace', async function (): Promise<void> {
112
+ await dashboard.waitPage();
113
+ await workspaceHandlingTests.createAndOpenWorkspace('Empty Workspace');
114
+ await workspaceHandlingTests.obtainWorkspaceNameFromStartingPage();
115
+ workspaceName = WorkspaceHandlingTests.getWorkspaceName();
116
+ expect(workspaceName, 'Workspace name was not detected').not.empty;
117
+ registerRunningWorkspace(workspaceName);
118
+ });
119
+
120
+ test('Wait for workspace readiness', async function (): Promise<void> {
121
+ await projectAndFileTests.waitWorkspaceReadinessForCheCodeEditor();
122
+ });
123
+
124
+ test('Build and push container image from workspace', function (): void {
125
+ kubernetesCommandLineToolsExecutor = e2eContainer.get(CLASSES.KubernetesCommandLineToolsExecutor);
126
+ kubernetesCommandLineToolsExecutor.workspaceName = workspaceName;
127
+ kubernetesCommandLineToolsExecutor.loginToOcp();
128
+ kubernetesCommandLineToolsExecutor.getPodAndContainerNames();
129
+ kubernetesCommandLineToolsExecutor.execInContainerCommand(buildPushScript);
130
+ });
131
+
132
+ test('Verify container image can be used in a pod', function (): void {
133
+ const runTestScriptOutput: ShellString = kubernetesCommandLineToolsExecutor.execInContainerCommand(runTestScript);
134
+ expect(runTestScriptOutput.stdout).to.include('Hello from Kubedock!', 'Expected "Hello from Kubedock!" message not found in logs');
135
+ });
136
+
137
+ suiteTeardown('Open dashboard and close all other tabs', async function (): Promise<void> {
138
+ await dashboard.openDashboard();
139
+ await browserTabsUtil.closeAllTabsExceptCurrent();
140
+ });
141
+
142
+ suiteTeardown('Stop and delete the workspace by API', async function (): Promise<void> {
143
+ await testWorkspaceUtil.stopAndDeleteWorkspaceByName(workspaceName);
144
+ });
145
+
146
+ suiteTeardown('Unregister running workspace', function (): void {
147
+ registerRunningWorkspace('');
148
+ });
149
+
150
+ suiteTeardown('Restore DevSpaces container build capabilities setting', function (): void {
151
+ kubernetesCommandLineToolsExecutor = e2eContainer.get(CLASSES.KubernetesCommandLineToolsExecutor);
152
+ kubernetesCommandLineToolsExecutor.loginToOcp();
153
+
154
+ // default to false if value wasn't found
155
+ const validSetting: string = ['true', 'false'].includes(originalBuildCapabilitiesSetting)
156
+ ? originalBuildCapabilitiesSetting
157
+ : 'false';
158
+
159
+ const restorePatchCommand: string = `oc patch checluster/${cheClusterName} -n ${devSpacesNamespace} --type=merge -p '{"spec":{"devEnvironments":{"disableContainerBuildCapabilities":${validSetting}}}}'`;
160
+ const restorePatchResult: ShellString = shellExecutor.executeCommand(restorePatchCommand);
161
+
162
+ expect(restorePatchResult.code).to.equal(0, 'Failed to restore CheCluster container build capabilities setting');
163
+ });
164
+ });