Skip to content

Commit 7dc8964

Browse files
author
Aiden Keating
committed
INTLY-2346 openshift 4 support
1 parent 67f16be commit 7dc8964

21 files changed

+908
-254
lines changed

package.json

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,16 @@
55
"proxy": "http://localhost:5001/",
66
"dependencies": {
77
"@fortawesome/fontawesome-free": "5.7.2",
8-
"@patternfly/react-core": "3.73.0",
98
"@patternfly/patternfly": "2.20.2",
9+
"@patternfly/react-core": "3.73.0",
1010
"asciidoctor.js": "1.5.7",
1111
"axios": "0.18.0",
1212
"body-parser": "^1.18.3",
1313
"classnames": "2.2.5",
1414
"client-oauth2": "4.2.1",
1515
"detect-browser": "3.0.0",
1616
"express": "4.16.3",
17+
"express-http-proxy": "^1.5.1",
1718
"express-prometheus-middleware": "^0.6.1",
1819
"i": "0.3.6",
1920
"i18next": "11.6.0",
@@ -85,7 +86,7 @@
8586
"watch:css": "yarn build:css && node-sass-chokidar --include-path ./src --include-path ./node_modules src/styles/index.scss -o src/styles/.css --watch --recursive",
8687
"build:js": "react-scripts build",
8788
"start": "node server.js",
88-
"start:dev": "FUSE_URL=http://localhost:3006 LAUNCHER_URL=http://localhost:3006 ENMASSE_URL=http://localhost:3006 CHE_URL=http://localhost:3006 APICURIO_URL=http://localhost:3006 OPENSHIFT_OAUTHCLIENT_ID=\"tutorial-web-app\" run-p -l watch:css start:local start:server",
89+
"start:dev": "FUSE_URL=http://localhost:3006 LAUNCHER_URL=http://localhost:3006 ENMASSE_URL=http://localhost:3006 CHE_URL=http://localhost:3006 APICURIO_URL=http://localhost:3006 run-p -l watch:css start:local start:server",
8990
"start:local": "react-scripts start",
9091
"start:server": "nodemon --watch server.js --exec 'node server.js'",
9192
"commit:hash": "echo REACT_APP_UI_COMMIT_HASH=$(git rev-list -1 --all) > .env",

server.js

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,22 @@ const promMid = require('express-prometheus-middleware');
1313
const Prometheus = require('prom-client');
1414
const querystring = require('querystring');
1515
const flattenDeep = require('lodash.flattendeep');
16+
const proxy = require('express-http-proxy');
1617
const { sync, closeConnection, getUserWalkthroughs, setUserWalkthroughs, validUrl } = require('./model');
1718

19+
const OPENSHIFT_PROXY_PATH = '/proxy/openshift';
20+
1821
const app = express();
1922

2023
const adoc = asciidoctor();
2124

2225
app.use(bodyParser.json());
26+
app.use(OPENSHIFT_PROXY_PATH, proxy(`https://${process.env.OPENSHIFT_API}`, {
27+
proxyReqOptDecorator: function(proxyReqOpts, _) {
28+
proxyReqOpts.rejectUnauthorized = false
29+
return proxyReqOpts;
30+
}
31+
}));
2332

2433
// prometheus metrics endpoint
2534
app.use(
@@ -30,6 +39,7 @@ app.use(
3039
})
3140
);
3241

42+
const openshiftVersion = process.env.OPENSHIFT_VERSION || '3';
3343
const port = process.env.PORT || 5001;
3444
const configPath = process.env.SERVER_EXTRA_CONFIG_FILE || '/etc/webapp/customServerConfig.json';
3545

@@ -487,10 +497,15 @@ function getWalkthroughHeader(basePath) {
487497
});
488498
}
489499

500+
function isOpenShift4() {
501+
return `${process.env.OPENSHIFT_VERSION}` === '4';
502+
}
503+
490504
function getMockConfigData() {
491505
return `window.OPENSHIFT_CONFIG = {
492506
masterUri: 'mock-openshift-console-url',
493507
integreatlyVersion: '${process.env.INTEGREATLY_VERSION || ''}',
508+
openshiftVersion: ${openshiftVersion},
494509
threescaleWildcardDomain: '${process.env.THREESCALE_WILDCARD_DOMAIN || ''}',
495510
optionalWatchServices: [],
496511
optionalProvisionServices: [],
@@ -609,22 +624,26 @@ function getConfigData(req) {
609624
process.env.OPENSHIFT_OAUTH_HOST = process.env.OPENSHIFT_HOST;
610625
}
611626

627+
const masterUri = isOpenShift4() ? OPENSHIFT_PROXY_PATH : `https://${process.env.OPENSHIFT_HOST}`;
628+
const wssMasterUri = isOpenShift4() ? OPENSHIFT_PROXY_PATH : `wss://${process.env.OPENSHIFT_HOST}`;
629+
612630
return `window.OPENSHIFT_CONFIG = {
613631
clientId: '${process.env.OPENSHIFT_OAUTHCLIENT_ID}',
614632
accessTokenUri: 'https://${process.env.OPENSHIFT_OAUTH_HOST}/oauth/token',
615633
authorizationUri: 'https://${process.env.OPENSHIFT_OAUTH_HOST}/oauth/authorize',
616634
redirectUri: '${redirectHost}/oauth/callback',
617635
scopes: ['user:full'],
618-
masterUri: 'https://${process.env.OPENSHIFT_HOST}',
619-
wssMasterUri: 'wss://${process.env.OPENSHIFT_HOST}',
636+
masterUri: '${masterUri}',
637+
wssMasterUri: '${wssMasterUri}',
620638
ssoLogoutUri: 'https://${
621639
process.env.SSO_ROUTE
622640
}/auth/realms/openshift/protocol/openid-connect/logout?redirect_uri=${logoutRedirectUri}',
623641
threescaleWildcardDomain: '${process.env.THREESCALE_WILDCARD_DOMAIN || ''}',
624642
integreatlyVersion: '${process.env.INTEGREATLY_VERSION || ''}',
625643
clusterType: '${process.env.CLUSTER_TYPE || ''}',
626644
optionalWatchServices: ${JSON.stringify(arrayFromString(process.env.OPTIONAL_WATCH_SERVICES || '', ','))},
627-
optionalProvisionServices: ${JSON.stringify(arrayFromString(process.env.OPTIONAL_PROVISION_SERVICES || '', ','))}
645+
optionalProvisionServices: ${JSON.stringify(arrayFromString(process.env.OPTIONAL_PROVISION_SERVICES || '', ','))},
646+
openshiftVersion: ${openshiftVersion}
628647
};`;
629648
}
630649

src/common/docsHelpers.js

Lines changed: 28 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { DEFAULT_SERVICES, getDashboardUrl } from '../common/serviceInstanceHelpers';
22
import { buildValidProjectNamespaceName, cleanUsername } from './openshiftHelpers';
33
import { KIND_ROUTE } from '../services/openshiftServices';
4+
import { SERVICE_TYPES } from '../redux/constants/middlewareConstants';
45

56
const getDocsForWalkthrough = (walkthroughId, middlewareServices, walkthroughResources) => {
67
if (window.OPENSHIFT_CONFIG.mockData) {
@@ -17,16 +18,27 @@ const getDocsForWalkthrough = (walkthroughId, middlewareServices, walkthroughRes
1718
return Object.assign({}, middlewareAttrs, walkthroughAttrs, userAttrs, { 'walkthrough-id': walkthroughId });
1819
};
1920

20-
const getUserAttrs = (walkthroughId, username) => ({
21-
'openshift-host': window.OPENSHIFT_CONFIG.masterUri,
22-
'project-namespace': buildValidProjectNamespaceName(username, 'shared'),
23-
'walkthrough-namespace': buildValidProjectNamespaceName(
24-
username,
25-
walkthroughId || buildValidProjectNamespaceName(username, 'shared')
26-
),
27-
'user-username': username,
28-
'user-sanitized-username': cleanUsername(username)
29-
});
21+
const getUserAttrs = (walkthroughId, username) => {
22+
let attrs = {
23+
'openshift-host': window.OPENSHIFT_CONFIG.masterUri
24+
};
25+
if (username) {
26+
attrs = Object.assign({}, attrs, {
27+
'project-namespace': buildValidProjectNamespaceName(username, 'shared'),
28+
'user-username': username,
29+
'user-sanitized-username': cleanUsername(username)
30+
});
31+
}
32+
if (!!username && !!walkthroughId) {
33+
attrs = Object.assign({}, attrs, {
34+
'walkthrough-namespace': buildValidProjectNamespaceName(
35+
username,
36+
walkthroughId || buildValidProjectNamespaceName(username, 'shared')
37+
)
38+
});
39+
}
40+
return attrs;
41+
};
3042

3143
const getWalkthroughSpecificAttrs = (walkthroughId, walkthroughResources) =>
3244
Object.keys(walkthroughResources[walkthroughId] || {}).reduce((acc, resId) => {
@@ -76,7 +88,12 @@ const getMiddlewareServiceAttrs = middlewareServices => {
7688
});
7789
}
7890

79-
return output;
91+
// Allow OpenShift 4 service additionalAttributes to be exposed
92+
const additionalAttrsList = Object.values(middlewareServices.data)
93+
.filter(svc => svc.type === SERVICE_TYPES.PROVISIONED_SERVICE)
94+
.map(svc => svc.additionalAttributes || {});
95+
96+
return Object.assign({}, output, ...additionalAttrsList);
8097
};
8198

8299
const getUrlFromMiddlewareServices = (middlewareServices, serviceName) => {

src/common/openshiftHelpers.js

Lines changed: 33 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,21 @@ const NAMESPACE_USERNAME_LENGTH = 10;
88
// The length of the hash appended to the end of the namespace.
99
const NAMESPACE_HASH_LENGTH = 4;
1010

11+
// OpenShift versions
12+
const V4 = '4';
13+
const V3 = '3';
14+
15+
/**
16+
* Retrieve the OpenShift version that should be set on the window.
17+
*/
18+
const getOpenShiftVersion = (defaultTo = V3) => `${window.OPENSHIFT_CONFIG.openshiftVersion}` || defaultTo;
19+
20+
const isOpenShift4 = () => getOpenShiftVersion() === V4;
21+
const isOpenShift3 = () => getOpenShiftVersion() === V3;
22+
23+
const getMasterUri = () => window.OPENSHIFT_CONFIG.masterUri;
24+
const getWSMasterUri = () => window.OPENSHIFT_CONFIG.wssMasterUri;
25+
1126
/**
1227
* Same as `buildValidProjectNamespaceName`, but with a hardcoded suffix
1328
*/
@@ -45,11 +60,17 @@ const buildValidNamespaceDisplayName = (username, suffix) => `${username} - ${su
4560
* Get a sanitized version of a username, so it can be used to name OpenShift.
4661
* @param {string} username The username to sanitize.
4762
*/
48-
const cleanUsername = username =>
49-
username
63+
const cleanUsername = username => {
64+
let sanitizedUsername = username
5065
.replace(/@/g, '-')
5166
.replace(/\./g, '-')
52-
.replace(/\s/g, '-');
67+
.replace(/\s/g, '-')
68+
.replace(/:/g, '-');
69+
if (sanitizedUsername.startsWith('kube-') || sanitizedUsername.startsWith('openshift-')) {
70+
sanitizedUsername = `user-${sanitizedUsername}`;
71+
}
72+
return sanitizedUsername;
73+
};
5374

5475
const trimmedHash = (namespace, length) =>
5576
shajs('sha256')
@@ -94,7 +115,7 @@ const findOrCreateOpenshiftResource = (
94115
if (resourceToCreateDef && resourceToCreateObj) {
95116
return create(resourceToCreateDef, resourceToCreateObj);
96117
}
97-
create(resourceDef, resourceToFind);
118+
return create(resourceDef, resourceToFind);
98119
}
99120
return Promise.resolve(foundResource);
100121
});
@@ -107,5 +128,12 @@ export {
107128
cleanUsername,
108129
buildValidNamespaceDisplayName,
109130
getUsersSharedNamespaceName,
110-
getUsersSharedNamespaceDisplayName
131+
getUsersSharedNamespaceDisplayName,
132+
getOpenShiftVersion,
133+
isOpenShift4,
134+
isOpenShift3,
135+
getMasterUri,
136+
getWSMasterUri,
137+
V3,
138+
V4
111139
};

src/common/openshiftResourceDefinitions.js

Lines changed: 44 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,43 @@ const messagingUserDef = namespace => ({
5757
version: 'v1beta1',
5858
group: 'user.enmasse.io'
5959
});
60+
const syndesisDef = namespace => ({
61+
name: 'syndesises',
62+
namespace,
63+
version: 'v1alpha1',
64+
group: 'syndesis.io'
65+
});
66+
const packageManifestDef = namespace => ({
67+
name: 'packagemanifests',
68+
namespace,
69+
version: 'v1',
70+
group: 'packages.operators.coreos.com'
71+
});
72+
const catalogSourceConfigDef = namespace => ({
73+
kind: 'CatalogSourceConfig',
74+
name: 'catalogsourceconfigs',
75+
namespace,
76+
version: 'v1',
77+
group: 'operators.coreos.com'
78+
});
79+
const operatorGroupDef = namespace => ({
80+
name: 'operatorgroups',
81+
namespace,
82+
version: 'v1',
83+
group: 'operators.coreos.com'
84+
});
85+
const subscriptionDef = namespace => ({
86+
name: 'subscriptions',
87+
namespace,
88+
version: 'v1alpha1',
89+
group: 'operators.coreos.com'
90+
});
91+
const csvDef = namespace => ({
92+
name: 'clusterserviceversions',
93+
namespace,
94+
version: 'v1alpha1',
95+
group: 'operators.coreos.com'
96+
});
6097

6198
export {
6299
namespaceRequestDef,
@@ -69,5 +106,11 @@ export {
69106
serviceDef,
70107
secretDef,
71108
addressSpaceDef,
72-
messagingUserDef
109+
messagingUserDef,
110+
syndesisDef,
111+
packageManifestDef,
112+
catalogSourceConfigDef,
113+
operatorGroupDef,
114+
subscriptionDef,
115+
csvDef
73116
};

src/common/serviceInstanceHelpers.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,7 @@ const findService = (svcName, svcList) => {
135135
return null;
136136
}
137137
return svcList.find(svc => {
138-
if (svc.type === SERVICE_TYPES.PROVISIONED_SERVICE) {
138+
if (svc.type === SERVICE_TYPES.PROVISIONED_SERVICE && svc.name === svcName) {
139139
return svc;
140140
}
141141
return get(svc, 'spec.clusterServiceClassExternalName') === svcName;

src/components/installedAppsView/InstalledAppsView.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,10 @@ class InstalledAppsView extends React.Component {
175175
}
176176

177177
handleLaunchClicked(svc) {
178+
if (svc.type === SERVICE_TYPES.PROVISIONED_SERVICE) {
179+
this.props.handleLaunch(svc.name);
180+
return;
181+
}
178182
this.props.handleLaunch(svc.spec.clusterServiceClassExternalName);
179183
}
180184

0 commit comments

Comments
 (0)