Utilisation et contraintes
Un adaptateur reconnaît la ResourceKey exacte d’un objet et renvoie sa définition de composant. Renvoyez null pour les autres objets. Un nom d’affichage identique ne suffit jamais.
NebulaHardware
package dev.nebulastorage.api.hardware
import dev.nebulastorage.api.resource.ResourceKey
import dev.nebulastorage.api.resource.ResourceTypeId
import java.util.Collections
enum class HardwareKind { MOTHERBOARD, CPU, RAM, DRIVE, NIC, PSU, EXPANSION }
/** Power is FE/t at the initial 1 FE/W conversion. Memory is a logical plan budget, in bytes. */
class HardwareDefinition private constructor(
val profile: HardwareProfile,
val kind: HardwareKind, val idlePower: Long, val computePower: Long,
val operationCost: Long, val memory: Long, val supplyPower: Long,
capacities: Map<ResourceTypeId, Long>, slots: Map<HardwareKind, Int>
) {
constructor(kind: HardwareKind, idlePower: Long = 0, computePower: Long = 0,
operationCost: Long = 0, memory: Long = 0, supplyPower: Long = 0,
capacities: Map<ResourceTypeId, Long> = emptyMap(), slots: Map<HardwareKind, Int> = emptyMap()) :
this(HardwareProfile(), kind, idlePower, computePower, operationCost, memory, supplyPower, capacities, slots)
constructor(kind: HardwareKind, profile: HardwareProfile, idlePower: Long = 0, computePower: Long = 0,
operationCost: Long = 0, memory: Long = 0, supplyPower: Long = 0,
capacities: Map<ResourceTypeId, Long> = emptyMap(), slots: Map<HardwareKind, Int> = emptyMap()) :
this(profile, kind, idlePower, computePower, operationCost, memory, supplyPower, capacities, slots)
val capacities: Map<ResourceTypeId, Long> = Collections.unmodifiableMap(capacities.toMap())
val slots: Map<HardwareKind, Int> = Collections.unmodifiableMap(slots.toMap())
init {
require(listOf(idlePower, computePower, operationCost, supplyPower).all { it in 0..1_000_000_000L })
require(memory in 0..(1L shl 50))
require(capacities.values.all { it >= 0 } && slots.values.all { it in 0..64 })
require(kind == HardwareKind.CPU || computePower == 0L && operationCost == 0L)
require(kind != HardwareKind.CPU || computePower > 0 && operationCost > 0)
require(kind == HardwareKind.RAM || memory == 0L)
require(kind == HardwareKind.PSU || supplyPower == 0L)
require(kind == HardwareKind.DRIVE || capacities.isEmpty())
require(kind == HardwareKind.MOTHERBOARD || slots.isEmpty())
require(HardwareKind.MOTHERBOARD !in slots)
require(profile.io == null || kind == HardwareKind.DRIVE)
require(profile.networkBandwidth == null || kind == HardwareKind.NIC)
}
}
fun interface NebulaHardwareAdapter {
/** Resolve the exact immutable item key, including components; null means unsupported. Called on the server thread. */
fun describe(item: ResourceKey): HardwareDefinition?
}
Source
src/main/kotlin/dev/nebulastorage/api/hardware/NebulaHardware.kt; editorial/fr.json
43b4d12d69e6033c24fa8c39dac383ef2429b446