1 // Copyright (C) The Arvados Authors. All rights reserved.
3 // SPDX-License-Identifier: AGPL-3.0
5 import { matchPath } from 'react-router';
6 import { ResourceKind, RESOURCE_UUID_PATTERN, extractUuidKind, COLLECTION_PDH_REGEX } from '~/models/resource';
7 import { getProjectUrl } from '~/models/project';
8 import { getCollectionUrl } from '~/models/collection';
9 import { Config } from '~/common/config';
10 import { Session } from "~/models/session";
12 export interface FederationConfig {
14 remoteHostsConfig: { [key: string]: Config };
18 export const Routes = {
21 FED_LOGIN: '/fedtoken',
22 ADD_SESSION: '/add-session',
23 PROJECTS: `/projects/:id(${RESOURCE_UUID_PATTERN})`,
24 COLLECTIONS: `/collections/:id(${RESOURCE_UUID_PATTERN})`,
25 PROCESSES: `/processes/:id(${RESOURCE_UUID_PATTERN})`,
26 FAVORITES: '/favorites',
28 PROCESS_LOGS: `/process-logs/:id(${RESOURCE_UUID_PATTERN})`,
29 REPOSITORIES: '/repositories',
30 SHARED_WITH_ME: '/shared-with-me',
31 RUN_PROCESS: '/run-process',
32 VIRTUAL_MACHINES_ADMIN: '/virtual-machines-admin',
33 VIRTUAL_MACHINES_USER: '/virtual-machines-user',
34 WORKFLOWS: '/workflows',
35 SEARCH_RESULTS: '/search-results',
36 SSH_KEYS_ADMIN: `/ssh-keys-admin`,
37 SSH_KEYS_USER: `/ssh-keys-user`,
38 SITE_MANAGER: `/site-manager`,
39 MY_ACCOUNT: '/my-account',
40 LINK_ACCOUNT: '/link_account',
41 KEEP_SERVICES: `/keep-services`,
42 COMPUTE_NODES: `/nodes`,
44 API_CLIENT_AUTHORIZATIONS: `/api_client_authorizations`,
46 GROUP_DETAILS: `/group/:id(${RESOURCE_UUID_PATTERN})`,
48 PUBLIC_FAVORITES: '/public-favorites',
49 COLLECTIONS_CONTENT_ADDRESS: '/collections/:id',
52 export const getResourceUrl = (uuid: string) => {
53 const kind = extractUuidKind(uuid);
55 case ResourceKind.PROJECT:
56 return getProjectUrl(uuid);
57 case ResourceKind.USER:
58 return getProjectUrl(uuid);
59 case ResourceKind.COLLECTION:
60 return getCollectionUrl(uuid);
61 case ResourceKind.PROCESS:
62 return getProcessUrl(uuid);
68 export const getNavUrl = (uuid: string, config: FederationConfig) => {
69 const path = getResourceUrl(uuid) || "";
70 const cls = uuid.substr(0, 5);
71 if (cls === config.localCluster || extractUuidKind(uuid) === ResourceKind.USER || COLLECTION_PDH_REGEX.exec(uuid)) {
73 } else if (config.remoteHostsConfig[cls]) {
75 if (config.remoteHostsConfig[cls].workbench2Url) {
76 /* NOTE: wb2 presently doesn't support passing api_token
77 to arbitrary page to set credentials, only through
78 api-token route. So for navigation to work, user needs
79 to already be logged in. In the future we want to just
80 request the records and display in the current
81 workbench instance making this redirect unnecessary. */
82 u = new URL(config.remoteHostsConfig[cls].workbench2Url);
84 u = new URL(config.remoteHostsConfig[cls].workbenchUrl);
85 u.search = "api_token=" + config.sessions.filter((s) => s.clusterId === cls)[0].token;
95 export const getProcessUrl = (uuid: string) => `/processes/${uuid}`;
97 export const getProcessLogUrl = (uuid: string) => `/process-logs/${uuid}`;
99 export const getGroupUrl = (uuid: string) => `/group/${uuid}`;
101 export interface ResourceRouteParams {
105 export const matchRootRoute = (route: string) =>
106 matchPath(route, { path: Routes.ROOT, exact: true });
108 export const matchFavoritesRoute = (route: string) =>
109 matchPath(route, { path: Routes.FAVORITES });
111 export const matchTrashRoute = (route: string) =>
112 matchPath(route, { path: Routes.TRASH });
114 export const matchProjectRoute = (route: string) =>
115 matchPath<ResourceRouteParams>(route, { path: Routes.PROJECTS });
117 export const matchCollectionRoute = (route: string) =>
118 matchPath<ResourceRouteParams>(route, { path: Routes.COLLECTIONS });
120 export const matchProcessRoute = (route: string) =>
121 matchPath<ResourceRouteParams>(route, { path: Routes.PROCESSES });
123 export const matchProcessLogRoute = (route: string) =>
124 matchPath<ResourceRouteParams>(route, { path: Routes.PROCESS_LOGS });
126 export const matchSharedWithMeRoute = (route: string) =>
127 matchPath(route, { path: Routes.SHARED_WITH_ME });
129 export const matchRunProcessRoute = (route: string) =>
130 matchPath(route, { path: Routes.RUN_PROCESS });
132 export const matchWorkflowRoute = (route: string) =>
133 matchPath<ResourceRouteParams>(route, { path: Routes.WORKFLOWS });
135 export const matchSearchResultsRoute = (route: string) =>
136 matchPath<ResourceRouteParams>(route, { path: Routes.SEARCH_RESULTS });
138 export const matchUserVirtualMachineRoute = (route: string) =>
139 matchPath<ResourceRouteParams>(route, { path: Routes.VIRTUAL_MACHINES_USER });
141 export const matchAdminVirtualMachineRoute = (route: string) =>
142 matchPath<ResourceRouteParams>(route, { path: Routes.VIRTUAL_MACHINES_ADMIN });
144 export const matchRepositoriesRoute = (route: string) =>
145 matchPath<ResourceRouteParams>(route, { path: Routes.REPOSITORIES });
147 export const matchSshKeysUserRoute = (route: string) =>
148 matchPath(route, { path: Routes.SSH_KEYS_USER });
150 export const matchSshKeysAdminRoute = (route: string) =>
151 matchPath(route, { path: Routes.SSH_KEYS_ADMIN });
153 export const matchSiteManagerRoute = (route: string) =>
154 matchPath(route, { path: Routes.SITE_MANAGER });
156 export const matchMyAccountRoute = (route: string) =>
157 matchPath(route, { path: Routes.MY_ACCOUNT });
159 export const matchLinkAccountRoute = (route: string) =>
160 matchPath(route, { path: Routes.LINK_ACCOUNT });
162 export const matchKeepServicesRoute = (route: string) =>
163 matchPath(route, { path: Routes.KEEP_SERVICES });
165 export const matchTokenRoute = (route: string) =>
166 matchPath(route, { path: Routes.TOKEN });
168 export const matchFedTokenRoute = (route: string) =>
169 matchPath(route, { path: Routes.FED_LOGIN });
171 export const matchUsersRoute = (route: string) =>
172 matchPath(route, { path: Routes.USERS });
174 export const matchComputeNodesRoute = (route: string) =>
175 matchPath(route, { path: Routes.COMPUTE_NODES });
177 export const matchApiClientAuthorizationsRoute = (route: string) =>
178 matchPath(route, { path: Routes.API_CLIENT_AUTHORIZATIONS });
180 export const matchGroupsRoute = (route: string) =>
181 matchPath(route, { path: Routes.GROUPS });
183 export const matchGroupDetailsRoute = (route: string) =>
184 matchPath<ResourceRouteParams>(route, { path: Routes.GROUP_DETAILS });
186 export const matchLinksRoute = (route: string) =>
187 matchPath(route, { path: Routes.LINKS });
189 export const matchPublicFavoritesRoute = (route: string) =>
190 matchPath(route, { path: Routes.PUBLIC_FAVORITES });
192 export const matchCollectionsContentAddressRoute = (route: string) =>
193 matchPath(route, { path: Routes.COLLECTIONS_CONTENT_ADDRESS });