Skip to content

Commit d92d465

Browse files
committed
feat(renterd): bulk rescan hosts
1 parent c4dee5a commit d92d465

File tree

5 files changed

+86
-0
lines changed

5 files changed

+86
-0
lines changed
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import { useMemo } from 'react'
2+
import { useContracts } from '../../../contexts/contracts'
3+
import { BulkRescanHosts } from '../../bulkActions/BulkRescanHosts'
4+
5+
export function ContractsRescanHosts() {
6+
const { multiSelect } = useContracts()
7+
8+
const publicKeys = useMemo(
9+
() =>
10+
Object.entries(multiSelect.selection).map(([_, item]) => item.hostKey),
11+
[multiSelect.selection]
12+
)
13+
14+
return <BulkRescanHosts multiSelect={multiSelect} publicKeys={publicKeys} />
15+
}

apps/renterd/components/Contracts/ContractsBulkMenu/index.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import { ContractsAddBlocklist } from './ContractsAddBlocklist'
55
import { ContractsAddAllowlist } from './ContractsAddAllowlist'
66
import { ContractsRemoveBlocklist } from './ContractsRemoveBlocklist'
77
import { ContractsRemoveAllowlist } from './ContractsRemoveAllowlist'
8+
import { ContractsRescanHosts } from './ContractsRescanHosts'
89

910
export function ContractsBulkMenu() {
1011
const { multiSelect } = useContracts()
@@ -19,6 +20,7 @@ export function ContractsBulkMenu() {
1920
<ContractsRemoveAllowlist />
2021
<ContractsRemoveBlocklist />
2122
</div>
23+
<ContractsRescanHosts />
2224
<ContractsBulkDelete />
2325
</MultiSelectionMenu>
2426
)
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import { useMemo } from 'react'
2+
import { BulkRescanHosts } from '../../bulkActions/BulkRescanHosts'
3+
import { useHosts } from '../../../contexts/hosts'
4+
5+
export function HostsRescan() {
6+
const { multiSelect } = useHosts()
7+
8+
const publicKeys = useMemo(
9+
() =>
10+
Object.entries(multiSelect.selection).map(([_, item]) => item.publicKey),
11+
[multiSelect.selection]
12+
)
13+
14+
return <BulkRescanHosts multiSelect={multiSelect} publicKeys={publicKeys} />
15+
}

apps/renterd/components/Hosts/HostsBulkMenu/index.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import { HostsAddAllowlist } from './HostsAddAllowlist'
55
import { HostsRemoveBlocklist } from './HostsRemoveBlocklist'
66
import { HostsRemoveAllowlist } from './HostsRemoveAllowlist'
77
import { useHosts } from '../../../contexts/hosts'
8+
import { HostsRescan } from './HostsRescan'
89

910
export function HostsBulkMenu() {
1011
const { multiSelect } = useHosts()
@@ -19,6 +20,7 @@ export function HostsBulkMenu() {
1920
<HostsRemoveAllowlist />
2021
<HostsRemoveBlocklist />
2122
</div>
23+
<HostsRescan />
2224
<HostsResetLostSectorCount />
2325
</MultiSelectionMenu>
2426
)
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
import {
2+
Button,
3+
handleBatchOperation,
4+
MultiSelect,
5+
MultiSelectRow,
6+
} from '@siafoundation/design-system'
7+
import { DataView16 } from '@siafoundation/react-icons'
8+
import { useHostScan } from '@siafoundation/renterd-react'
9+
import { useCallback } from 'react'
10+
import { pluralize, secondsInMilliseconds } from '@siafoundation/units'
11+
12+
export function BulkRescanHosts<T extends MultiSelectRow>({
13+
multiSelect,
14+
publicKeys,
15+
}: {
16+
multiSelect: MultiSelect<T>
17+
publicKeys: string[]
18+
}) {
19+
const scan = useHostScan()
20+
const scanAll = useCallback(async () => {
21+
await handleBatchOperation(
22+
publicKeys.map((publicKey) =>
23+
scan.post({
24+
params: {
25+
hostkey: publicKey,
26+
},
27+
payload: {
28+
timeout: secondsInMilliseconds(30),
29+
},
30+
})
31+
),
32+
{
33+
toastError: ({ successCount, errorCount, totalCount }) => ({
34+
title: `Rescanning ${pluralize(successCount, 'host')}`,
35+
body: `Error starting rescan for ${errorCount}/${totalCount} of total hosts.`,
36+
}),
37+
toastSuccess: ({ totalCount }) => ({
38+
title: `Rescanning ${pluralize(totalCount, 'host')}`,
39+
}),
40+
after: () => {
41+
multiSelect.deselectAll()
42+
},
43+
}
44+
)
45+
}, [multiSelect, publicKeys, scan])
46+
47+
return (
48+
<Button aria-label="rescan hosts" tip="Rescan hosts" onClick={scanAll}>
49+
<DataView16 />
50+
</Button>
51+
)
52+
}

0 commit comments

Comments
 (0)