pipelines/frontend/server/handlers/index-html.ts

96 lines
3.1 KiB
TypeScript

// Copyright 2019 The Kubeflow Authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
import { Handler } from 'express';
import * as fs from 'fs';
import * as path from 'path';
import { Deployments } from '../configs';
const DEFAULT_FLAG = 'window.KFP_FLAGS.DEPLOYMENT=null';
const KUBEFLOW_CLIENT_PLACEHOLDER = '<script id="kubeflow-client-placeholder"></script>';
const DEFAULT_HIDE_SIDENAV_FLAG = 'window.KFP_FLAGS.HIDE_SIDENAV=null';
/**
* Returns a handler which retrieve and modify the index.html.
* @param options.staticDir serve the static resources in this folder.
* @param options.deployment whether this is a kubeflow deployment.
*/
export function getIndexHTMLHandler(options: {
staticDir: string;
deployment: Deployments;
hideSideNav: boolean;
}): Handler {
const content = replaceRuntimeContent(
loadIndexHtml(options.staticDir),
options.deployment,
options.hideSideNav,
);
return function handleIndexHtml(_, res) {
if (content) {
res.contentType('text/html');
res.send(content);
} else {
res.sendStatus(404);
}
};
}
function loadIndexHtml(staticDir: string) {
const filepath = path.resolve(staticDir, 'index.html');
const content = fs.readFileSync(filepath).toString();
// sanity checking
if (!content.includes(DEFAULT_FLAG)) {
throw new Error(
`Error: cannot find default flag: '${DEFAULT_FLAG}' in index html. Its content: '${content}'.`,
);
}
if (!content.includes(KUBEFLOW_CLIENT_PLACEHOLDER)) {
throw new Error(
`Error: cannot find kubeflow client placeholder: '${KUBEFLOW_CLIENT_PLACEHOLDER}' in index html. Its content: '${content}'.`,
);
}
if (!content.includes(DEFAULT_HIDE_SIDENAV_FLAG)) {
throw new Error(
`Error: cannot find flag: '${DEFAULT_HIDE_SIDENAV_FLAG}' in index html. Its content: '${content}'.`,
);
}
return content;
}
function replaceRuntimeContent(
content: string | undefined,
deployment: Deployments,
hideSideNav: boolean,
) {
let contentSafe = content;
if (contentSafe && deployment === Deployments.KUBEFLOW) {
contentSafe = contentSafe
.replace(DEFAULT_FLAG, 'window.KFP_FLAGS.DEPLOYMENT="KUBEFLOW"')
.replace(
KUBEFLOW_CLIENT_PLACEHOLDER,
`<script id="kubeflow-client-placeholder" src="/dashboard_lib.bundle.js"></script>`,
);
}
if (contentSafe && deployment === Deployments.MARKETPLACE) {
contentSafe = contentSafe.replace(DEFAULT_FLAG, 'window.KFP_FLAGS.DEPLOYMENT="MARKETPLACE"');
}
if (contentSafe) {
contentSafe = contentSafe.replace(
DEFAULT_HIDE_SIDENAV_FLAG,
`window.KFP_FLAGS.HIDE_SIDENAV=${hideSideNav.toString()}`,
);
}
return contentSafe;
}