From 964b7f2cea81f087bbaddc94c9eeb08bab945742 Mon Sep 17 00:00:00 2001 From: Michal Klobukowski Date: Mon, 20 Aug 2018 09:47:41 +0200 Subject: [PATCH] Obtain configuration from discovery endpoint Feature #14078 Arvados-DCO-1.1-Signed-off-by: Michal Klobukowski --- .env | 1 - src/common/config.ts | 102 +++++++++++++++++++++++++--- src/services/services.ts | 6 +- src/store/auth/auth-actions.test.ts | 7 +- src/store/auth/auth-reducer.test.ts | 3 +- 5 files changed, 101 insertions(+), 18 deletions(-) diff --git a/.env b/.env index df56fb28..ed397c5c 100644 --- a/.env +++ b/.env @@ -4,5 +4,4 @@ REACT_APP_ARVADOS_CONFIG_URL=/config.json REACT_APP_ARVADOS_API_HOST=qr1hi.arvadosapi.com -REACT_APP_ARVADOS_KEEP_WEB_HOST=collections.qr1hi.arvadosapi.com HTTPS=true \ No newline at end of file diff --git a/src/common/config.ts b/src/common/config.ts index 759a2015..061f9c00 100644 --- a/src/common/config.ts +++ b/src/common/config.ts @@ -7,8 +7,48 @@ import Axios from "axios"; export const CONFIG_URL = process.env.REACT_APP_ARVADOS_CONFIG_URL || "/config.json"; export interface Config { - apiHost: string; - keepWebHost: string; + auth: {}; + basePath: string; + baseUrl: string; + batchPath: string; + blobSignatureTtl: number; + crunchLimitLogBytesPerJob: number; + crunchLogBytesPerEvent: number; + crunchLogPartialLineThrottlePeriod: number; + crunchLogSecondsBetweenEvents: number; + crunchLogThrottleBytes: number; + crunchLogThrottleLines: number; + crunchLogThrottlePeriod: number; + defaultCollectionReplication: number; + defaultTrashLifetime: number; + description: string; + discoveryVersion: string; + dockerImageFormats: string[]; + documentationLink: string; + generatedAt: string; + gitUrl: string; + id: string; + keepWebServiceUrl: string; + kind: string; + maxRequestSize: number; + name: string; + packageVersion: string; + parameters: {}; + protocol: string; + remoteHosts: string; + remoteHostsViaDNS: boolean; + resources: {}; + revision: string; + rootUrl: string; + schemas: {}; + servicePath: string; + sourceVersion: string; + source_version: string; + title: string; + uuidPrefix: string; + version: string; + websocketUrl: string; + workbenchUrl: string; } export const fetchConfig = () => { @@ -16,22 +56,62 @@ export const fetchConfig = () => { .get(CONFIG_URL + "?nocache=" + (new Date()).getTime()) .then(response => response.data) .catch(() => Promise.resolve(getDefaultConfig())) - .then(mapConfig); + .then(config => Axios.get(getDiscoveryURL(config.API_HOST))) + .then(response => response.data); }; +export const mockConfig = (config: Partial): Config => ({ + auth: {}, + basePath: '', + baseUrl: '', + batchPath: '', + blobSignatureTtl: 0, + crunchLimitLogBytesPerJob: 0, + crunchLogBytesPerEvent: 0, + crunchLogPartialLineThrottlePeriod: 0, + crunchLogSecondsBetweenEvents: 0, + crunchLogThrottleBytes: 0, + crunchLogThrottleLines: 0, + crunchLogThrottlePeriod: 0, + defaultCollectionReplication: 0, + defaultTrashLifetime: 0, + description: '', + discoveryVersion: '', + dockerImageFormats: [], + documentationLink: '', + generatedAt: '', + gitUrl: '', + id: '', + keepWebServiceUrl: '', + kind: '', + maxRequestSize: 0, + name: '', + packageVersion: '', + parameters: {}, + protocol: '', + remoteHosts: '', + remoteHostsViaDNS: false, + resources: {}, + revision: '', + rootUrl: '', + schemas: {}, + servicePath: '', + sourceVersion: '', + source_version: '', + title: '', + uuidPrefix: '', + version: '', + websocketUrl: '', + workbenchUrl: '', + ...config +}); + interface ConfigJSON { API_HOST: string; - KEEP_WEB_HOST: string; } -const mapConfig = (config: ConfigJSON): Config => ({ - apiHost: addProtocol(config.API_HOST), - keepWebHost: addProtocol(config.KEEP_WEB_HOST) -}); - const getDefaultConfig = (): ConfigJSON => ({ API_HOST: process.env.REACT_APP_ARVADOS_API_HOST || "", - KEEP_WEB_HOST: process.env.REACT_APP_ARVADOS_KEEP_WEB_HOST || "" }); -const addProtocol = (url: string) => `${window.location.protocol}//${url}`; +const getDiscoveryURL = (apiHost: string) => `${window.location.protocol}//${apiHost}/discovery/v1/apis/arvados/v1/rest`; diff --git a/src/services/services.ts b/src/services/services.ts index 61dd3992..8ddc3f47 100644 --- a/src/services/services.ts +++ b/src/services/services.ts @@ -19,12 +19,12 @@ export type ServiceRepository = ReturnType; export const createServices = (config: Config) => { const apiClient = Axios.create(); - apiClient.defaults.baseURL = `${config.apiHost}/arvados/v1`; + apiClient.defaults.baseURL = config.baseUrl; const webdavClient = new WebDAV(); - webdavClient.defaults.baseURL = config.keepWebHost; + webdavClient.defaults.baseURL = config.keepWebServiceUrl; - const authService = new AuthService(apiClient, config.apiHost); + const authService = new AuthService(apiClient, config.rootUrl); const keepService = new KeepService(apiClient); const groupsService = new GroupsService(apiClient); const projectService = new ProjectService(apiClient); diff --git a/src/store/auth/auth-actions.test.ts b/src/store/auth/auth-actions.test.ts index 217a27cc..4ac48a0b 100644 --- a/src/store/auth/auth-actions.test.ts +++ b/src/store/auth/auth-actions.test.ts @@ -17,15 +17,16 @@ import 'jest-localstorage-mock'; import { createServices } from "~/services/services"; import { configureStore, RootStore } from "../store"; import createBrowserHistory from "history/createBrowserHistory"; +import { mockConfig } from '~/common/config'; describe('auth-actions', () => { let reducer: (state: AuthState | undefined, action: AuthAction) => any; let store: RootStore; beforeEach(() => { - store = configureStore(createBrowserHistory(), createServices({ apiHost: "/arvados/v1", keepWebHost: "" })); + store = configureStore(createBrowserHistory(), createServices(mockConfig({}))); localStorage.clear(); - reducer = authReducer(createServices({ apiHost: "/arvados/v1", keepWebHost: "" })); + reducer = authReducer(createServices(mockConfig({}))); }); it('should initialise state with user and api token from local storage', () => { @@ -72,3 +73,5 @@ describe('auth-actions', () => { }); */ }); + + diff --git a/src/store/auth/auth-reducer.test.ts b/src/store/auth/auth-reducer.test.ts index 8eeb7c3c..2b1920a6 100644 --- a/src/store/auth/auth-reducer.test.ts +++ b/src/store/auth/auth-reducer.test.ts @@ -7,13 +7,14 @@ import { AuthAction, authActions } from "./auth-action"; import 'jest-localstorage-mock'; import { createServices } from "~/services/services"; +import { mockConfig } from '~/common/config'; describe('auth-reducer', () => { let reducer: (state: AuthState | undefined, action: AuthAction) => any; beforeAll(() => { localStorage.clear(); - reducer = authReducer(createServices({ apiHost: "/arvados/v1", keepWebHost: "" })); + reducer = authReducer(createServices(mockConfig({}))); }); it('should correctly initialise state', () => { -- 2.30.2