pipelines/frontend/mock-backend/mock-api-server.ts

73 lines
2.2 KiB
TypeScript

// Copyright 2018 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 express from 'express';
import proxy from 'http-proxy-middleware';
import mockApiMiddleware from './mock-api-middleware';
const app = express();
const port = process.argv[2] || 3001;
// Uncomment the following line to get 1000ms delay to all requests
// app.use((req, res, next) => { setTimeout(next, 1000); });
app.use((_: any, res: any, next: any) => {
res.header('Access-Control-Allow-Origin', '*');
res.header('Access-Control-Allow-Headers', 'X-Requested-With, content-type');
res.header('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, PUT, DELETE');
next();
});
export const HACK_FIX_HPM_PARTIAL_RESPONSE_HEADERS = {
Connection: 'keep-alive',
};
// To enable porting MLMD to mock backend, run following command:
// kubectl port-forward svc/metadata-envoy-service 9090:9090
/** Proxy metadata requests to the Envoy instance which will handle routing to the metadata gRPC server */
app.all(
'/ml_metadata.*',
proxy({
changeOrigin: true,
onProxyReq: proxyReq => {
console.log('Metadata proxied request: ', (proxyReq as any).path);
},
headers: HACK_FIX_HPM_PARTIAL_RESPONSE_HEADERS,
target: getAddress({ host: 'localhost', port: '9090' }),
}),
);
mockApiMiddleware(app as any);
app.listen(port, () => {
// tslint:disable-next-line:no-console
console.log('Server listening at http://localhost:' + port);
});
export function getAddress({
host,
port,
namespace,
schema = 'http',
}: {
host: string;
port?: string | number;
namespace?: string;
schema?: string;
}) {
namespace = namespace ? `.${namespace}` : '';
port = port ? `:${port}` : '';
return `${schema}://${host}${namespace}${port}`;
}