import { formatDate } from "~/common/formatters";
import { unionize, ofType, UnionOf } from "~/common/unionize";
import { VirtualMachinesLoginsResource } from '~/models/virtual-machines';
+import { FilterBuilder } from "~/services/api/filter-builder";
+import { ListResults } from "~/services/common-service/common-resource-service";
export const virtualMachinesActions = unionize({
SET_REQUESTED_DATE: ofType<string>(),
- SET_VIRTUAL_MACHINES: ofType<any>(),
- SET_LOGINS: ofType<VirtualMachinesLoginsResource[]>()
+ SET_VIRTUAL_MACHINES: ofType<ListResults<any>>(),
+ SET_LOGINS: ofType<VirtualMachinesLoginsResource[]>(),
+ SET_LINKS: ofType<ListResults<any>>()
});
export type VirtualMachineActions = UnionOf<typeof virtualMachinesActions>;
async (dispatch: Dispatch, getState: () => RootState, services: ServiceRepository) => {
dispatch<any>(loadRequestedDate());
const virtualMachines = await services.virtualMachineService.list();
+ const virtualMachinesUuids = virtualMachines.items.map(it => it.uuid);
+ const links = await services.linkService.list({
+ filters: new FilterBuilder()
+ .addIn("headUuid", virtualMachinesUuids)
+ .getFilters()
+ });
dispatch(virtualMachinesActions.SET_VIRTUAL_MACHINES(virtualMachines));
+ dispatch(virtualMachinesActions.SET_LINKS(links));
// const logins = await services.virtualMachineService.logins(virtualMachines.items[0].uuid);
// console.log(logins);
// const getAllLogins = await services.virtualMachineService.getAllLogins();
date: string;
virtualMachines: ListResults<any>;
logins: VirtualMachinesLoginsResource[];
+ links: ListResults<any>;
}
const initialState: VirtualMachines = {
itemsAvailable: 0,
items: []
},
- logins: []
+ logins: [],
+ links: {
+ kind: '',
+ offset: 0,
+ limit: 0,
+ itemsAvailable: 0,
+ items: []
+ }
};
export const virtualMachinesReducer = (state = initialState, action: VirtualMachineActions): VirtualMachines =>
SET_REQUESTED_DATE: date => ({ ...state, date }),
SET_VIRTUAL_MACHINES: virtualMachines => ({ ...state, virtualMachines }),
SET_LOGINS: logins => ({ ...state, logins }),
+ SET_LINKS: links => ({ ...state, links }),
default: () => state
});
import { ListResults } from '~/services/common-service/common-resource-service';
import { HelpIcon } from '~/components/icon/icon';
import { VirtualMachinesLoginsResource } from '~/models/virtual-machines';
+import { Routes } from '~/routes/routes';
type CssRules = 'button' | 'codeSnippet' | 'link' | 'linkIcon' | 'icon';
return {
requestedDate: state.virtualMachines.date,
virtualMachines: state.virtualMachines.virtualMachines,
- logins: state.virtualMachines.logins
+ logins: state.virtualMachines.logins,
+ links: state.virtualMachines.links
};
};
requestedDate: string;
virtualMachines: ListResults<any>;
logins: VirtualMachinesLoginsResource[];
+ links: ListResults<any>;
}
interface VirtualMachinesPanelActionProps {
}
render() {
- const { classes, saveRequestedDate, requestedDate, virtualMachines, logins } = this.props;
+ const { classes, saveRequestedDate, requestedDate, virtualMachines, logins, links } = this.props;
return (
<Grid container spacing={16}>
{cardContentWithNoVirtualMachines(requestedDate, saveRequestedDate, classes)}
- {virtualMachines.itemsAvailable > 0 && cardContentWithVirtualMachines(virtualMachines, classes)}
+ {virtualMachines.itemsAvailable > 0 && links.itemsAvailable > 0 && cardContentWithVirtualMachines(virtualMachines, links, classes)}
{cardSSHSection(classes)}
</Grid>
);
const login = 'pawelkowalczyk';
-const cardContentWithVirtualMachines = (virtualMachines: ListResults<any>, classes: any) =>
+const cardContentWithVirtualMachines = (virtualMachines: ListResults<any>, links: ListResults<any>, classes: any) =>
<Grid item xs={12}>
<Card>
<CardContent>
{virtualMachines.items.map((it, index) =>
<TableRow key={index}>
<TableCell>{it.hostname}</TableCell>
- <TableCell>{login}</TableCell>
- <TableCell>ssh {login}@shell.arvados</TableCell>
+ <TableCell>{getUsername(links, it)}</TableCell>
+ <TableCell>ssh {getUsername(links, it)}@shell.arvados</TableCell>
<TableCell>
- <a href={`https://workbench.c97qk.arvadosapi.com${it.href}/webshell/${login}`} target="_blank" className={classes.link}>
- Log in as {login}
+ <a href={`https://workbench.c97qk.arvadosapi.com${it.href}/webshell/${getUsername(links, it)}`} target="_blank" className={classes.link}>
+ Log in as {getUsername(links, it)}
</a>
</TableCell>
</TableRow>
</Card>
</Grid>;
-// dodac link do ssh panelu jak juz bedzie
+const getUsername = (links: ListResults<any>, virtualMachine: any) => {
+ const link = links.items.find((item: any) => item.headUuid === virtualMachine.uuid);
+ return link.properties.username || undefined;
+};
+
const cardSSHSection = (classes: any) =>
<Grid item xs={12}>
<Card>
<CardContent>
<Typography variant="body2">
- In order to access virtual machines using SSH, <Link to='' className={classes.link}>add an SSH key to your account</Link> and add a section like this to your SSH configuration file ( ~/.ssh/config):
+ In order to access virtual machines using SSH, <Link to={Routes.SSH_KEYS} className={classes.link}>add an SSH key to your account</Link> and add a section like this to your SSH configuration file ( ~/.ssh/config):
</Typography>
<DefaultCodeSnippet
className={classes.codeSnippet}