Merge branch '18284-vm-listing' into main. Closes #18284
authorStephen Smith <stephen@curii.com>
Mon, 14 Feb 2022 15:31:50 +0000 (10:31 -0500)
committerStephen Smith <stephen@curii.com>
Mon, 14 Feb 2022 15:31:50 +0000 (10:31 -0500)
Arvados-DCO-1.1-Signed-off-by: Stephen Smith <stephen@curii.com>

1  2 
src/store/workbench/workbench-actions.ts
src/views-components/data-explorer/renderers.tsx

index 03d65f62817e120567e3d27152f5f418caddd15b,58d8d5f15fac47d4d8938167e77a1a9004e5ab76..98508f752ead17acf5fe461582a9f128c9af4462
@@@ -100,6 -100,7 +100,7 @@@ import { loadAllProcessesPanel, allProc
  import { allProcessesPanelColumns } from 'views/all-processes-panel/all-processes-panel';
  import { collectionPanelFilesAction } from '../collection-panel/collection-panel-files/collection-panel-files-actions';
  import { createTree } from 'models/tree';
+ import { AdminMenuIcon } from 'components/icon/icon';
  
  export const WORKBENCH_LOADING_SCREEN = 'workbenchLoadingScreen';
  
@@@ -194,34 -195,35 +195,34 @@@ export const loadProject = (uuid: strin
          async (dispatch: Dispatch<any>, getState: () => RootState, services: ServiceRepository) => {
              const userUuid = getUserUuid(getState());
              dispatch(setIsProjectPanelTrashed(false));
 -            if (userUuid) {
 -                if (extractUuidKind(uuid) === ResourceKind.USER && userUuid !== uuid) {
 -                    // Load another users home projects
 -                    dispatch(finishLoadingProject(uuid));
 -                } else if (userUuid !== uuid) {
 -                    const match = await loadGroupContentsResource({ uuid, userUuid, services });
 -                    match({
 -                        OWNED: async project => {
 -                            await dispatch(activateSidePanelTreeItem(uuid));
 -                            dispatch<any>(setSidePanelBreadcrumbs(uuid));
 -                            dispatch(finishLoadingProject(project));
 -                        },
 -                        SHARED: project => {
 -                            dispatch<any>(setSharedWithMeBreadcrumbs(uuid));
 -                            dispatch(activateSidePanelTreeItem(uuid));
 -                            dispatch(finishLoadingProject(project));
 -                        },
 -                        TRASHED: project => {
 -                            dispatch<any>(setTrashBreadcrumbs(uuid));
 -                            dispatch(setIsProjectPanelTrashed(true));
 -                            dispatch(activateSidePanelTreeItem(SidePanelTreeCategory.TRASH));
 -                            dispatch(finishLoadingProject(project));
 -                        }
 -                    });
 -                } else {
 -                    await dispatch(activateSidePanelTreeItem(userUuid));
 -                    dispatch<any>(setSidePanelBreadcrumbs(userUuid));
 -                    dispatch(finishLoadingProject(userUuid));
 -                }
 +            if (!userUuid) {
 +                return;
 +            }
 +            if (extractUuidKind(uuid) === ResourceKind.USER && userUuid !== uuid) {
 +                // Load another users home projects
 +                dispatch(finishLoadingProject(uuid));
 +            } else if (userUuid !== uuid) {
 +                await dispatch(finishLoadingProject(uuid));
 +                const match = await loadGroupContentsResource({ uuid, userUuid, services });
 +                match({
 +                    OWNED: async () => {
 +                        await dispatch(activateSidePanelTreeItem(uuid));
 +                        dispatch<any>(setSidePanelBreadcrumbs(uuid));
 +                    },
 +                    SHARED: async () => {
 +                        await dispatch(activateSidePanelTreeItem(uuid));
 +                        dispatch<any>(setSharedWithMeBreadcrumbs(uuid));
 +                    },
 +                    TRASHED: async () => {
 +                        await dispatch(activateSidePanelTreeItem(SidePanelTreeCategory.TRASH));
 +                        dispatch<any>(setTrashBreadcrumbs(uuid));
 +                        dispatch(setIsProjectPanelTrashed(true));
 +                    }
 +                });
 +            } else {
 +                await dispatch(finishLoadingProject(userUuid));
 +                await dispatch(activateSidePanelTreeItem(userUuid));
 +                dispatch<any>(setSidePanelBreadcrumbs(userUuid));
              }
          });
  
@@@ -491,6 -493,12 +492,12 @@@ export const loadVirtualMachines = hand
          dispatch(setBreadcrumbs([{ label: 'Virtual Machines' }]));
      });
  
+ export const loadVirtualMachinesAdmin = handleFirstTimeLoad(
+     async (dispatch: Dispatch<any>) => {
+         await dispatch(loadVirtualMachinesPanel());
+         dispatch(setBreadcrumbs([{ label: 'Virtual Machines Admin', icon: AdminMenuIcon }]));
+     });
  export const loadRepositories = handleFirstTimeLoad(
      async (dispatch: Dispatch<any>) => {
          await dispatch(loadRepositoriesPanel());
index 47c1eaa9fb73e7a85212b5e1bdc180350a111688,ce6c02ca2cc29d589a3e954ead70fc4192874fd4..a2acaca4525e6bceb6d65f869dae09f986412c21
@@@ -35,6 -35,7 +35,7 @@@ import { formatPermissionLevel } from '
  import { PermissionLevel } from 'models/permission';
  import { openPermissionEditContextMenu } from 'store/context-menu/context-menu-actions';
  import { getUserUuid } from 'common/getuser';
+ import { VirtualMachinesResource } from 'models/virtual-machines';
  
  const renderName = (dispatch: Dispatch, item: GroupContentsResource) => {
  
@@@ -271,15 -272,37 +272,37 @@@ export const ResourceIsAdmin = connect
      }, { toggleIsAdmin }
  )(renderIsAdmin);
  
- const renderUsername = (item: { username: string }) =>
-     <Typography noWrap>{item.username}</Typography>;
+ const renderUsername = (item: { username: string, uuid: string }) =>
+     <Typography noWrap>{item.username || item.uuid}</Typography>;
  
  export const ResourceUsername = connect(
      (state: RootState, props: { uuid: string }) => {
          const resource = getResource<UserResource>(props.uuid)(state.resources);
-         return resource || { username: '' };
+         return resource || { username: '', uuid: props.uuid };
      })(renderUsername);
  
+ // Virtual machine resource
+ const renderHostname = (item: { hostname: string }) =>
+     <Typography noWrap>{item.hostname}</Typography>;
+ export const VirtualMachineHostname = connect(
+     (state: RootState, props: { uuid: string }) => {
+         const resource = getResource<VirtualMachinesResource>(props.uuid)(state.resources);
+         return resource || { hostname: '' };
+     })(renderHostname);
+ const renderVirtualMachineLogin = (login: {user: string}) =>
+     <Typography noWrap>{login.user}</Typography>
+ export const VirtualMachineLogin = connect(
+     (state: RootState, props: { linkUuid: string }) => {
+         const permission = getResource<LinkResource>(props.linkUuid)(state.resources);
+         const user = getResource<UserResource>(permission?.tailUuid || '')(state.resources);
+         return {user: user?.username || permission?.tailUuid || ''};
+     })(renderVirtualMachineLogin);
  // Common methods
  const renderCommonData = (data: string) =>
      <Typography noWrap>{data}</Typography>;
@@@ -319,7 -342,7 +342,7 @@@ const clusterColors = 
  export const ResourceCluster = (props: { uuid: string }) => {
      const CLUSTER_ID_LENGTH = 5;
      const pos = props.uuid.length > CLUSTER_ID_LENGTH ? props.uuid.indexOf('-') : 5;
 -    const clusterId = pos >= CLUSTER_ID_LENGTH ? props.uuid.substr(0, pos) : '';
 +    const clusterId = pos >= CLUSTER_ID_LENGTH ? props.uuid.substring(0, pos) : '';
      const ci = pos >= CLUSTER_ID_LENGTH ? (((((
          (props.uuid.charCodeAt(0) * props.uuid.charCodeAt(1))
          + props.uuid.charCodeAt(2))