Files
calypso/frontend/src/api/tape.ts
2025-12-27 14:13:27 +00:00

170 lines
4.8 KiB
TypeScript

import apiClient from './client'
// ============================================================================
// Types
// ============================================================================
export interface PhysicalTapeLibrary {
id: string
name: string
serial_number: string
vendor: string
model: string
changer_device_path: string
changer_stable_path: string
slot_count: number
drive_count: number
is_active: boolean
discovered_at: string
last_inventory_at?: string
created_at: string
updated_at: string
}
export interface VirtualTapeLibrary {
id: string
name: string
mhvtl_library_id: number
storage_path: string
vendor?: string
slot_count: number
drive_count: number
is_active: boolean
created_at: string
updated_at: string
}
export interface TapeDrive {
id: string
library_id: string
drive_number: number
device_path?: string
status: string
current_tape_id?: string
created_at: string
updated_at: string
}
export interface VirtualTape {
id: string
library_id: string
barcode: string
slot_number: number
size_bytes: number
status: string
created_at: string
updated_at: string
}
export interface CreateVTLRequest {
name: string
slot_count: number
drive_count: number
storage_path?: string
}
export interface CreateTapeRequest {
barcode: string
size_bytes: number
}
export interface LoadTapeRequest {
drive_id: string
tape_id: string
}
export interface UnloadTapeRequest {
drive_id: string
}
// ============================================================================
// Physical Tape Libraries
// ============================================================================
export const physicalTapeAPI = {
listLibraries: async (): Promise<PhysicalTapeLibrary[]> => {
const response = await apiClient.get('/tape/physical/libraries')
return response.data.libraries || []
},
getLibrary: async (id: string): Promise<PhysicalTapeLibrary> => {
const response = await apiClient.get(`/tape/physical/libraries/${id}`)
return response.data.library
},
discoverLibraries: async (): Promise<{ task_id: string }> => {
const response = await apiClient.post('/tape/physical/libraries/discover')
return response.data
},
performInventory: async (id: string): Promise<{ task_id: string }> => {
const response = await apiClient.post(`/tape/physical/libraries/${id}/inventory`)
return response.data
},
loadTape: async (libraryId: string, data: LoadTapeRequest): Promise<{ task_id: string }> => {
const response = await apiClient.post(`/tape/physical/libraries/${libraryId}/load`, data)
return response.data
},
unloadTape: async (libraryId: string, data: UnloadTapeRequest): Promise<{ task_id: string }> => {
const response = await apiClient.post(`/tape/physical/libraries/${libraryId}/unload`, data)
return response.data
},
}
// ============================================================================
// Virtual Tape Libraries (VTL)
// ============================================================================
export const vtlAPI = {
listLibraries: async (): Promise<VirtualTapeLibrary[]> => {
const response = await apiClient.get('/tape/vtl/libraries')
return response.data.libraries || []
},
getLibrary: async (id: string): Promise<{
library: VirtualTapeLibrary
drives: TapeDrive[]
tapes: VirtualTape[]
}> => {
const response = await apiClient.get(`/tape/vtl/libraries/${id}`)
return response.data
},
createLibrary: async (data: CreateVTLRequest): Promise<VirtualTapeLibrary> => {
const response = await apiClient.post('/tape/vtl/libraries', data)
return response.data.library
},
deleteLibrary: async (id: string): Promise<void> => {
await apiClient.delete(`/tape/vtl/libraries/${id}`)
},
getLibraryDrives: async (id: string): Promise<TapeDrive[]> => {
const response = await apiClient.get(`/tape/vtl/libraries/${id}/drives`)
return response.data.drives || []
},
getLibraryTapes: async (id: string): Promise<VirtualTape[]> => {
const response = await apiClient.get(`/tape/vtl/libraries/${id}/tapes`)
return response.data.tapes || []
},
createTape: async (libraryId: string, data: CreateTapeRequest): Promise<VirtualTape> => {
const response = await apiClient.post(`/tape/vtl/libraries/${libraryId}/tapes`, data)
return response.data.tape
},
loadTape: async (libraryId: string, data: LoadTapeRequest): Promise<{ task_id: string }> => {
const response = await apiClient.post(`/tape/vtl/libraries/${libraryId}/load`, data)
return response.data
},
unloadTape: async (libraryId: string, data: UnloadTapeRequest): Promise<{ task_id: string }> => {
const response = await apiClient.post(`/tape/vtl/libraries/${libraryId}/unload`, data)
return response.data
},
}