fileViewersConfigUrl: string;
loginCluster: string;
clusterConfig: ClusterConfigJSON;
+ apiRevision: number;
}
export const buildConfig = (clusterConfigJSON: ClusterConfigJSON): Config => {
config.keepWebServiceUrl = clusterConfigJSON.Services.WebDAVDownload.ExternalURL;
config.loginCluster = clusterConfigJSON.Login.LoginCluster;
config.clusterConfig = clusterConfigJSON;
+ config.apiRevision = 0;
mapRemoteHosts(clusterConfigJSON, config);
return config;
};
+const getApiRevision = async (apiUrl: string) => {
+ try {
+ const dd = (await Axios.get<any>(`${apiUrl}/${DISCOVERY_DOC_PATH}`)).data;
+ return parseInt(dd.revision, 10) || 0;
+ } catch {
+ console.warn("Unable to get API Revision number, defaulting to zero. Some features may not work properly.");
+ return 0;
+ }
+};
+
export const fetchConfig = () => {
return Axios
.get<WorkbenchConfig>(WORKBENCH_CONFIG_URL + "?nocache=" + (new Date()).getTime())
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(response => {
+ return Axios.get<ClusterConfigJSON>(getClusterConfigURL(workbenchConfig.API_HOST)).then(async response => {
const clusterConfigJSON = response.data;
- const config = buildConfig(clusterConfigJSON);
+ const apiRevision = await getApiRevision(clusterConfigJSON.Services.Controller.ExternalURL);
+ const config = {...buildConfig(clusterConfigJSON), 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}`);
fileViewersConfigUrl: "",
loginCluster: "",
clusterConfig: mockClusterConfigJSON({}),
+ apiRevision: 0,
...config
});
import * as jsSHA from "jssha";
const getClusterConfig = async (origin: string): Promise<Config | null> => {
- // Try the new public config endpoint
+ let configFromDD: Config | undefined;
try {
- const config = (await Axios.get<ClusterConfigJSON>(`${origin}/${CLUSTER_CONFIG_PATH}`)).data;
- return buildConfig(config);
- } catch { }
-
- // Fall back to discovery document
- try {
- const config = (await Axios.get<any>(`${origin}/${DISCOVERY_DOC_PATH}`)).data;
- return {
- baseUrl: normalizeURLPath(config.baseUrl),
- keepWebServiceUrl: config.keepWebServiceUrl,
- remoteHosts: config.remoteHosts,
- rootUrl: config.rootUrl,
- uuidPrefix: config.uuidPrefix,
- websocketUrl: config.websocketUrl,
- workbenchUrl: config.workbenchUrl,
- workbench2Url: config.workbench2Url,
+ const dd = (await Axios.get<any>(`${origin}/${DISCOVERY_DOC_PATH}`)).data;
+ configFromDD = {
+ baseUrl: normalizeURLPath(dd.baseUrl),
+ keepWebServiceUrl: dd.keepWebServiceUrl,
+ remoteHosts: dd.remoteHosts,
+ rootUrl: dd.rootUrl,
+ uuidPrefix: dd.uuidPrefix,
+ websocketUrl: dd.websocketUrl,
+ workbenchUrl: dd.workbenchUrl,
+ workbench2Url: dd.workbench2Url,
loginCluster: "",
vocabularyUrl: "",
fileViewersConfigUrl: "",
- clusterConfig: mockClusterConfigJSON({})
+ clusterConfig: mockClusterConfigJSON({}),
+ apiRevision: parseInt(dd.revision, 10),
};
} catch { }
+ // Try the new public config endpoint
+ try {
+ const config = (await Axios.get<ClusterConfigJSON>(`${origin}/${CLUSTER_CONFIG_PATH}`)).data;
+ return {...buildConfig(config), apiRevision: configFromDD ? configFromDD.apiRevision : 0};
+ } catch { }
+
+ // Fall back to discovery document
+ if (configFromDD !== undefined) {
+ return configFromDD;
+ }
+
return null;
};
dispatch(authActions.UPDATE_SESSION({ ...session, status: SessionStatus.BEING_VALIDATED }));
session.loggedIn = false;
- const setupSession = (baseUrl: string, user: User, token: string) => {
+ const setupSession = (baseUrl: string, user: User, token: string, apiRevision: number) => {
session.baseUrl = baseUrl;
session.token = token;
session.email = user.email;
session.uuid = user.uuid;
session.name = getUserFullname(user);
session.loggedIn = true;
+ session.apiRevision = apiRevision;
};
let fail: Error | null = null;
dispatch(authActions.REMOTE_CLUSTER_CONFIG({ config }));
try {
const { user, token } = await validateCluster(config, session.token);
- setupSession(config.baseUrl, user, token);
+ setupSession(config.baseUrl, user, token, config.apiRevision);
} catch (e) {
fail = new Error(`Getting current user for ${session.remoteHost}: ${e.message}`);
try {
const { user, token } = await validateCluster(config, activeSession.token);
- setupSession(config.baseUrl, user, token);
+ setupSession(config.baseUrl, user, token, config.apiRevision);
fail = null;
} catch (e2) {
if (e.message === invalidV2Token) {
baseUrl: config.baseUrl,
clusterId: config.uuidPrefix,
remoteHost,
- token
+ token,
+ apiRevision: config.apiRevision,
};
if (sessions.find(s => s.clusterId === config.uuidPrefix)) {