};
Collections: {
ForwardSlashNameSubstitution: string;
+ ManagedProperties?: {
+ [key: string]: {
+ Function: string,
+ Value: string,
+ Protected?: boolean,
+ }
+ }
+ };
+ Volumes: {
+ [key: string]: {
+ StorageClasses: {
+ [key: string]: boolean;
+ }
+ }
};
}
export class Config {
- baseUrl: string;
- keepWebServiceUrl: string;
- remoteHosts: {
+ baseUrl!: string;
+ keepWebServiceUrl!: string;
+ keepWebInlineServiceUrl!: string;
+ remoteHosts!: {
[key: string]: string
};
- rootUrl: string;
- uuidPrefix: string;
- websocketUrl: string;
- workbenchUrl: string;
- workbench2Url: string;
- vocabularyUrl: string;
- fileViewersConfigUrl: string;
- loginCluster: string;
- clusterConfig: ClusterConfigJSON;
- apiRevision: number;
+ rootUrl!: string;
+ uuidPrefix!: string;
+ websocketUrl!: string;
+ workbenchUrl!: string;
+ workbench2Url!: string;
+ vocabularyUrl!: string;
+ fileViewersConfigUrl!: string;
+ loginCluster!: string;
+ clusterConfig!: ClusterConfigJSON;
+ apiRevision!: number;
}
-export const buildConfig = (clusterConfigJSON: ClusterConfigJSON): Config => {
+export const buildConfig = (clusterConfig: ClusterConfigJSON): Config => {
+ const clusterConfigJSON = removeTrailingSlashes(clusterConfig);
const config = new Config();
config.rootUrl = clusterConfigJSON.Services.Controller.ExternalURL;
config.baseUrl = `${config.rootUrl}/${ARVADOS_API_PATH}`;
config.workbench2Url = clusterConfigJSON.Services.Workbench2.ExternalURL;
config.workbenchUrl = clusterConfigJSON.Services.Workbench1.ExternalURL;
config.keepWebServiceUrl = clusterConfigJSON.Services.WebDAVDownload.ExternalURL;
+ config.keepWebInlineServiceUrl = clusterConfigJSON.Services.WebDAV.ExternalURL;
config.loginCluster = clusterConfigJSON.Login.LoginCluster;
config.clusterConfig = clusterConfigJSON;
config.apiRevision = 0;
return config;
};
+export const getStorageClasses = (config: Config): string[] => {
+ const classes: Set<string> = new Set();
+ const volumes = config.clusterConfig.Volumes;
+ Object.keys(volumes).forEach(v => {
+ Object.keys(volumes[v].StorageClasses || {}).forEach(sc => {
+ if (volumes[v].StorageClasses[sc]) {
+ classes.add(sc);
+ }
+ });
+ });
+ return Array.from(classes);
+};
+
const getApiRevision = async (apiUrl: string) => {
try {
const dd = (await Axios.get<any>(`${apiUrl}/${DISCOVERY_DOC_PATH}`)).data;
const removeTrailingSlashes = (config: ClusterConfigJSON): ClusterConfigJSON => {
const svcs: any = {};
- Object.keys(config.Services).map((s) => {
+ Object.keys(config.Services).forEach((s) => {
svcs[s] = config.Services[s];
if (svcs[s].hasOwnProperty('ExternalURL')) {
svcs[s].ExternalURL = svcs[s].ExternalURL.replace(/\/+$/, '');
}
});
- return {...config, Services: svcs};
+ return { ...config, Services: svcs };
};
export const fetchConfig = () => {
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 clusterConfigJSON = removeTrailingSlashes(response.data);
- const apiRevision = await getApiRevision(clusterConfigJSON.Services.Controller.ExternalURL);
- const config = { ...buildConfig(clusterConfigJSON), apiRevision };
+ 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}`);
fileViewerConfigUrl = workbenchConfig.FILE_VIEWERS_CONFIG_URL;
}
else {
- fileViewerConfigUrl = clusterConfigJSON.Workbench.FileViewersConfigURL || "/file-viewers-example.json";
+ fileViewerConfigUrl = config.clusterConfig.Workbench.FileViewersConfigURL || "/file-viewers-example.json";
}
config.fileViewersConfigUrl = fileViewerConfigUrl;
vocabularyUrl = workbenchConfig.VOCABULARY_URL;
}
else {
- vocabularyUrl = clusterConfigJSON.Workbench.VocabularyURL || "/vocabulary-example.json";
+ vocabularyUrl = config.clusterConfig.Workbench.VocabularyURL || "/vocabulary-example.json";
}
config.vocabularyUrl = vocabularyUrl;
Collections: {
ForwardSlashNameSubstitution: "",
},
+ Volumes: {},
...config
});
export const mockConfig = (config: Partial<Config>): Config => ({
baseUrl: "",
keepWebServiceUrl: "",
+ keepWebInlineServiceUrl: "",
remoteHosts: {},
rootUrl: "",
uuidPrefix: "",