+ return Axios.get<WorkbenchConfig>(
+ WORKBENCH_CONFIG_URL + '?nocache=' + new Date().getTime()
+ )
+ .then((response) => response.data)
+ .catch(() => {
+ console.warn(
+ `There was an exception getting the Workbench config file at ${WORKBENCH_CONFIG_URL}. Using defaults instead.`
+ );
+ return Promise.resolve(getDefaultConfig());
+ })
+ .then((workbenchConfig) => {
+ if (workbenchConfig.API_HOST === undefined) {
+ throw new Error(
+ `Unable to start Workbench. API_HOST is undefined in ${WORKBENCH_CONFIG_URL} or the environment.`
+ );
+ }
+ return Axios.get<ClusterConfigJSON>(
+ getClusterConfigURL(workbenchConfig.API_HOST)
+ ).then(async (response) => {
+ const apiRevision = await getApiRevision(
+ response.data.Services.Controller.ExternalURL.replace(/\/+$/, '')
+ );
+ const config = { ...buildConfig(response.data), apiRevision };
+ const warnLocalConfig = (varName: string) =>
+ console.warn(
+ `A value for ${varName} was found in ${WORKBENCH_CONFIG_URL}. To use the Arvados centralized configuration instead, \
+remove the entire ${varName} entry from ${WORKBENCH_CONFIG_URL}`
+ );
+
+ // Check if the workbench config has an entry for vocabulary and file viewer URLs
+ // If so, use these values (even if it is an empty string), but print a console warning.
+ // Otherwise, use the cluster config.
+ let fileViewerConfigUrl;
+ if (workbenchConfig.FILE_VIEWERS_CONFIG_URL !== undefined) {
+ warnLocalConfig('FILE_VIEWERS_CONFIG_URL');
+ fileViewerConfigUrl = workbenchConfig.FILE_VIEWERS_CONFIG_URL;
+ } else {
+ fileViewerConfigUrl =
+ config.clusterConfig.Workbench.FileViewersConfigURL ||
+ '/file-viewers-example.json';
+ }
+ config.fileViewersConfigUrl = fileViewerConfigUrl;
+
+ if (workbenchConfig.VOCABULARY_URL !== undefined) {
+ console.warn(
+ `A value for VOCABULARY_URL was found in ${WORKBENCH_CONFIG_URL}. It will be ignored as the cluster already provides its own endpoint, you can safely remove it.`
+ );
+ }
+ config.vocabularyUrl = getVocabularyURL(workbenchConfig.API_HOST);
+
+ return { config, apiHost: workbenchConfig.API_HOST };
+ });
+ });
+};
+
+// Maps remote cluster hosts and removes the default RemoteCluster entry
+export const mapRemoteHosts = (
+ clusterConfigJSON: ClusterConfigJSON,
+ config: Config
+) => {
+ config.remoteHosts = {};
+ Object.keys(clusterConfigJSON.RemoteClusters).forEach((k) => {
+ config.remoteHosts[k] = clusterConfigJSON.RemoteClusters[k].Host;
+ });
+ delete config.remoteHosts['*'];
+};
+
+export const mockClusterConfigJSON = (
+ config: Partial<ClusterConfigJSON>
+): ClusterConfigJSON => ({
+ API: {
+ UnfreezeProjectRequiresAdmin: false,
+ MaxItemsPerResponse: 1000,
+ },
+ ClusterID: '',
+ RemoteClusters: {},
+ Services: {
+ Controller: { ExternalURL: '' },
+ Workbench1: { ExternalURL: '' },
+ Workbench2: { ExternalURL: '' },
+ Websocket: { ExternalURL: '' },
+ WebDAV: { ExternalURL: '' },
+ WebDAVDownload: { ExternalURL: '' },
+ WebShell: { ExternalURL: '' },
+ Workbench: {
+ DisableSharingURLsUI: false,
+ ArvadosDocsite: "",
+ FileViewersConfigURL: "",
+ WelcomePageHTML: "",
+ InactivePageHTML: "",
+ SSHHelpPageHTML: "",
+ SSHHelpHostSuffix: "",
+ SiteName: "",
+ IdleTimeout: "0s"
+ },
+ },
+ Workbench: {
+ DisableSharingURLsUI: false,
+ ArvadosDocsite: '',
+ FileViewersConfigURL: '',
+ WelcomePageHTML: '',
+ InactivePageHTML: '',
+ SSHHelpPageHTML: '',
+ SSHHelpHostSuffix: '',
+ SiteName: '',
+ IdleTimeout: '0s',
+ BannerUUID: "",
+ UserProfileFormFields: {},
+ UserProfileFormMessage: '',
+ },
+ Login: {
+ LoginCluster: '',
+ Google: {
+ Enable: false,
+ },
+ LDAP: {
+ Enable: false,
+ },
+ OpenIDConnect: {
+ Enable: false,
+ },
+ PAM: {
+ Enable: false,
+ },
+ SSO: {
+ Enable: false,
+ },
+ Test: {
+ Enable: false,
+ },
+ },
+ Collections: {
+ ForwardSlashNameSubstitution: '',
+ TrustAllContent: false,
+ },
+ Volumes: {},
+ Users: {
+ AnonymousUserToken: ""
+ },
+ ...config,
+});
+
+export const mockConfig = (config: Partial<Config>): Config => ({
+ baseUrl: '',
+ keepWebServiceUrl: '',
+ keepWebInlineServiceUrl: '',
+ remoteHosts: {},
+ rootUrl: '',
+ uuidPrefix: '',
+ websocketUrl: '',
+ workbenchUrl: '',
+ workbench2Url: '',
+ vocabularyUrl: '',
+ fileViewersConfigUrl: '',
+ loginCluster: '',
+ clusterConfig: mockClusterConfigJSON({}),
+ apiRevision: 0,
+ ...config,
+});
+
+const getDefaultConfig = (): WorkbenchConfig => {
+ let apiHost = '';
+ const envHost = process.env.REACT_APP_ARVADOS_API_HOST;
+ if (envHost !== undefined) {
+ console.warn(`Using default API host ${envHost}.`);
+ apiHost = envHost;
+ } else {
+ console.warn(
+ `No API host was found in the environment. Workbench may not be able to communicate with Arvados components.`
+ );
+ }
+ return {
+ API_HOST: apiHost,
+ VOCABULARY_URL: undefined,
+ FILE_VIEWERS_CONFIG_URL: undefined,
+ };