}
export interface ClusterConfigJSON {
+ API: {
+ UnfreezeProjectRequiresAdmin: boolean
+ },
ClusterID: string;
RemoteClusters: {
[key: string]: {
}
};
Workbench: {
+ DisableSharingURLsUI: boolean;
ArvadosDocsite: string;
- VocabularyURL: string;
FileViewersConfigURL: string;
WelcomePageHTML: string;
InactivePageHTML: string;
SSHHelpPageHTML: string;
SSHHelpHostSuffix: string;
SiteName: string;
+ IdleTimeout: string;
};
Login: {
LoginCluster: string;
};
Collections: {
ForwardSlashNameSubstitution: string;
+ ManagedProperties?: {
+ [key: string]: {
+ Function: string,
+ Value: string,
+ Protected?: boolean,
+ }
+ },
+ TrustAllContent: 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(['default']);
+ 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;
- let vocabularyUrl;
if (workbenchConfig.VOCABULARY_URL !== undefined) {
- warnLocalConfig("VOCABULARY_URL");
- vocabularyUrl = workbenchConfig.VOCABULARY_URL;
- }
- else {
- vocabularyUrl = clusterConfigJSON.Workbench.VocabularyURL || "/vocabulary-example.json";
+ 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 = vocabularyUrl;
+ config.vocabularyUrl = getVocabularyURL(workbenchConfig.API_HOST);
return { config, apiHost: workbenchConfig.API_HOST };
});
};
export const mockClusterConfigJSON = (config: Partial<ClusterConfigJSON>): ClusterConfigJSON => ({
+ API: {
+ UnfreezeProjectRequiresAdmin: false,
+ },
ClusterID: "",
RemoteClusters: {},
Services: {
WebShell: { ExternalURL: "" },
},
Workbench: {
+ DisableSharingURLsUI: false,
ArvadosDocsite: "",
- VocabularyURL: "",
FileViewersConfigURL: "",
WelcomePageHTML: "",
InactivePageHTML: "",
SSHHelpPageHTML: "",
SSHHelpHostSuffix: "",
SiteName: "",
+ IdleTimeout: "0s",
},
Login: {
LoginCluster: "",
Enable: false,
},
Test: {
- Enable: false;
- }
+ Enable: false,
+ },
},
Collections: {
ForwardSlashNameSubstitution: "",
+ TrustAllContent: false,
},
+ Volumes: {},
...config
});
export const mockConfig = (config: Partial<Config>): Config => ({
baseUrl: "",
keepWebServiceUrl: "",
+ keepWebInlineServiceUrl: "",
remoteHosts: {},
rootUrl: "",
uuidPrefix: "",
export const ARVADOS_API_PATH = "arvados/v1";
export const CLUSTER_CONFIG_PATH = "arvados/v1/config";
+export const VOCABULARY_PATH = "arvados/v1/vocabulary";
export const DISCOVERY_DOC_PATH = "discovery/v1/apis/arvados/v1/rest";
-export const getClusterConfigURL = (apiHost: string) => `${window.location.protocol}//${apiHost}/${CLUSTER_CONFIG_PATH}?nocache=${(new Date()).getTime()}`;
+export const getClusterConfigURL = (apiHost: string) => `https://${apiHost}/${CLUSTER_CONFIG_PATH}?nocache=${(new Date()).getTime()}`;
+export const getVocabularyURL = (apiHost: string) => `https://${apiHost}/${VOCABULARY_PATH}?nocache=${(new Date()).getTime()}`;