@eclipse-che/che-e2e 7.100.0-next-c3e2cc3 → 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.
- package/constants/REPORTER_CONSTANTS.ts +1 -1
- package/dist/constants/REPORTER_CONSTANTS.js +1 -1
- package/dist/constants/REPORTER_CONSTANTS.js.map +1 -1
- package/dist/specs/api/BuildPushRunPodmanContainerAPI.spec.js +137 -0
- package/dist/specs/api/BuildPushRunPodmanContainerAPI.spec.js.map +1 -0
- package/package.json +1 -1
- package/specs/api/BuildPushRunPodmanContainerAPI.spec.ts +164 -0
|
@@ -140,7 +140,7 @@ export const REPORTER_CONSTANTS: {
|
|
|
140
140
|
if (process.env.RP_ENDPOINT !== '') {
|
|
141
141
|
return process.env.RP_ENDPOINT;
|
|
142
142
|
}
|
|
143
|
-
return 'https://reportportal-crw.apps.ocp-
|
|
143
|
+
return 'https://reportportal-crw.apps.dno.ocp-hub.prod.psi.redhat.com/api/v1';
|
|
144
144
|
},
|
|
145
145
|
|
|
146
146
|
/**
|
|
@@ -103,7 +103,7 @@ exports.REPORTER_CONSTANTS = {
|
|
|
103
103
|
if (process.env.RP_ENDPOINT !== '') {
|
|
104
104
|
return process.env.RP_ENDPOINT;
|
|
105
105
|
}
|
|
106
|
-
return 'https://reportportal-crw.apps.ocp-
|
|
106
|
+
return 'https://reportportal-crw.apps.dno.ocp-hub.prod.psi.redhat.com/api/v1';
|
|
107
107
|
},
|
|
108
108
|
/**
|
|
109
109
|
* use personal project to save launch, if false launch will be sent to devspaces or che project, true by default
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"REPORTER_CONSTANTS.js","sourceRoot":"","sources":["../../constants/REPORTER_CONSTANTS.ts"],"names":[],"mappings":";;;AAAA;;;;;;;;wEAQwE;AACxE,+DAA4D;AAC5D,uDAAoD;AAEvC,QAAA,kBAAkB,GAsB3B;IACH;;OAEG;IACH,mCAAmC,EAAE,OAAO,CAAC,GAAG,CAAC,mCAAmC,IAAI,oBAAoB;IAE5G;;OAEG;IACH,qCAAqC,EAAE,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,qCAAqC,CAAC,IAAI,IAAI;IAExG;;OAEG;IACH,yBAAyB,EAAE,OAAO,CAAC,GAAG,CAAC,yBAAyB,IAAI,UAAU;IAE9E;;OAEG;IACH,gCAAgC,EAAE,OAAO,CAAC,GAAG,CAAC,gCAAgC,KAAK,MAAM;IAEzF;;OAEG;IACH,8BAA8B,EAAE,OAAO,CAAC,GAAG,CAAC,8BAA8B,KAAK,OAAO;IAEtF;;OAEG;IACH,qBAAqB,EAAE,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,OAAO;IAEnE;;OAEG;IACH,mCAAmC,EAAE,OAAO,CAAC,GAAG,CAAC,mCAAmC,KAAK,MAAM;IAE/F;;OAEG;IACH,uBAAuB,EAAE,OAAO,CAAC,GAAG,CAAC,uBAAuB,KAAK,MAAM;IAEvE;;OAEG;IACH,mBAAmB,EAAE,OAAO,CAAC,GAAG,CAAC,mBAAmB,KAAK,MAAM;IAE/D;;OAEG;IACH,eAAe,EAAE,OAAO,CAAC,GAAG,CAAC,eAAe,KAAK,MAAM;IAEvD;;OAEG;IACH,iBAAiB,EAAE,GAAW,EAAE;QAC/B,IAAI,SAAS,GAAW,2BAA2B,CAAC;QACpD,IAAI,0BAAkB,CAAC,eAAe,EAAE;YACvC,SAAS,IAAI,uBAAuB,CAAC;SACrC;QACD,IAAI,0BAAkB,CAAC,uBAAuB,EAAE;YAC/C,SAAS,IAAI,eAAe,CAAC;SAC7B;QACD,IAAI,0BAAkB,CAAC,mBAAmB,EAAE;YAC3C,SAAS,IAAI,+BAA+B,CAAC;SAC7C;QACD,OAAO,SAAS,CAAC;IAClB,CAAC;IAED;;OAEG;IACH,UAAU,EAAE,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,EAAE;IAExC;;OAEG;IACH,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,EAAE;IAEnF;;OAEG;IACH,cAAc,EAAE,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,YAAY,iCAAe,CAAC,eAAe,EAAE;IAE3F;;OAEG;IACH,aAAa,EAAE,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,SAAS;IAErD;;OAEG;IACH,QAAQ,EAAE,GAAY,EAAE,CAAC,CAAC,CAAC,0BAAkB,CAAC,aAAa;IAE3D;;OAEG;IACH,kBAAkB,EAAE,OAAO,CAAC,GAAG,CAAC,kBAAkB,KAAK,OAAO;IAE9D;;OAEG;IACH,WAAW,EAAE,GAAuB,EAAE;QACrC,IAAI,OAAO,CAAC,GAAG,CAAC,6BAA6B,EAAE;YAC9C,OAAO,8BAA8B,CAAC;SACtC;QACD,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,KAAK,EAAE,EAAE;YACnC,OAAO,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC;SAC/B;QACD,OAAO,
|
|
1
|
+
{"version":3,"file":"REPORTER_CONSTANTS.js","sourceRoot":"","sources":["../../constants/REPORTER_CONSTANTS.ts"],"names":[],"mappings":";;;AAAA;;;;;;;;wEAQwE;AACxE,+DAA4D;AAC5D,uDAAoD;AAEvC,QAAA,kBAAkB,GAsB3B;IACH;;OAEG;IACH,mCAAmC,EAAE,OAAO,CAAC,GAAG,CAAC,mCAAmC,IAAI,oBAAoB;IAE5G;;OAEG;IACH,qCAAqC,EAAE,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,qCAAqC,CAAC,IAAI,IAAI;IAExG;;OAEG;IACH,yBAAyB,EAAE,OAAO,CAAC,GAAG,CAAC,yBAAyB,IAAI,UAAU;IAE9E;;OAEG;IACH,gCAAgC,EAAE,OAAO,CAAC,GAAG,CAAC,gCAAgC,KAAK,MAAM;IAEzF;;OAEG;IACH,8BAA8B,EAAE,OAAO,CAAC,GAAG,CAAC,8BAA8B,KAAK,OAAO;IAEtF;;OAEG;IACH,qBAAqB,EAAE,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,OAAO;IAEnE;;OAEG;IACH,mCAAmC,EAAE,OAAO,CAAC,GAAG,CAAC,mCAAmC,KAAK,MAAM;IAE/F;;OAEG;IACH,uBAAuB,EAAE,OAAO,CAAC,GAAG,CAAC,uBAAuB,KAAK,MAAM;IAEvE;;OAEG;IACH,mBAAmB,EAAE,OAAO,CAAC,GAAG,CAAC,mBAAmB,KAAK,MAAM;IAE/D;;OAEG;IACH,eAAe,EAAE,OAAO,CAAC,GAAG,CAAC,eAAe,KAAK,MAAM;IAEvD;;OAEG;IACH,iBAAiB,EAAE,GAAW,EAAE;QAC/B,IAAI,SAAS,GAAW,2BAA2B,CAAC;QACpD,IAAI,0BAAkB,CAAC,eAAe,EAAE;YACvC,SAAS,IAAI,uBAAuB,CAAC;SACrC;QACD,IAAI,0BAAkB,CAAC,uBAAuB,EAAE;YAC/C,SAAS,IAAI,eAAe,CAAC;SAC7B;QACD,IAAI,0BAAkB,CAAC,mBAAmB,EAAE;YAC3C,SAAS,IAAI,+BAA+B,CAAC;SAC7C;QACD,OAAO,SAAS,CAAC;IAClB,CAAC;IAED;;OAEG;IACH,UAAU,EAAE,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,EAAE;IAExC;;OAEG;IACH,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,EAAE;IAEnF;;OAEG;IACH,cAAc,EAAE,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,YAAY,iCAAe,CAAC,eAAe,EAAE;IAE3F;;OAEG;IACH,aAAa,EAAE,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,SAAS;IAErD;;OAEG;IACH,QAAQ,EAAE,GAAY,EAAE,CAAC,CAAC,CAAC,0BAAkB,CAAC,aAAa;IAE3D;;OAEG;IACH,kBAAkB,EAAE,OAAO,CAAC,GAAG,CAAC,kBAAkB,KAAK,OAAO;IAE9D;;OAEG;IACH,WAAW,EAAE,GAAuB,EAAE;QACrC,IAAI,OAAO,CAAC,GAAG,CAAC,6BAA6B,EAAE;YAC9C,OAAO,8BAA8B,CAAC;SACtC;QACD,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,KAAK,EAAE,EAAE;YACnC,OAAO,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC;SAC/B;QACD,OAAO,sEAAsE,CAAC;IAC/E,CAAC;IAED;;OAEG;IACH,eAAe,EAAE,OAAO,CAAC,GAAG,CAAC,eAAe,KAAK,OAAO;IAExD;;OAEG;IACH,UAAU,EAAE,GAAW,EAAE;QACxB,MAAM,OAAO,GAAW,0BAAkB,CAAC,eAAe;YACzD,CAAC,CAAC,GAAG,0BAAkB,CAAC,OAAO,WAAW;YAC1C,CAAC,CAAC,yCAAmB,CAAC,wBAAwB,EAAE,CAAC;QAClD,OAAO,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,OAAO,CAAC;IAC1C,CAAC;IAED,YAAY,EAAE,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,sBAAsB;CAChE,CAAC"}
|
|
@@ -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
|
@@ -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
|
+
});
|