import * as plugins from '../plugins.js'; /** * BareMetal represents an actual physical server */ @plugins.smartdata.Manager() export class BareMetal extends plugins.smartdata.SmartDataDbDoc< BareMetal, plugins.servezoneInterfaces.data.IBareMetal > { // STATIC public static async createFromHetznerServer( hetznerServerArg: plugins.hetznercloud.HetznerServer, ) { const newBareMetal = new BareMetal(); newBareMetal.id = plugins.smartunique.shortId(8); const data: plugins.servezoneInterfaces.data.IBareMetal['data'] = { hostname: hetznerServerArg.data.name, primaryIp: hetznerServerArg.data.public_net.ipv4.ip, provider: 'hetzner', location: hetznerServerArg.data.datacenter.name, specs: { cpuModel: hetznerServerArg.data.server_type.cpu_type, cpuCores: hetznerServerArg.data.server_type.cores, memoryGB: hetznerServerArg.data.server_type.memory, storageGB: hetznerServerArg.data.server_type.disk, storageType: 'nvme', }, powerState: hetznerServerArg.data.status === 'running' ? 'on' : 'off', osInfo: { name: 'Debian', version: '12', }, assignedNodeIds: [], providerMetadata: { hetznerServerId: hetznerServerArg.data.id, hetznerServerName: hetznerServerArg.data.name, }, }; Object.assign(newBareMetal, { data }); await newBareMetal.save(); return newBareMetal; } // INSTANCE @plugins.smartdata.unI() public id: string; @plugins.smartdata.svDb() public data: plugins.servezoneInterfaces.data.IBareMetal['data']; constructor() { super(); } public async assignNode(nodeId: string) { if (!this.data.assignedNodeIds.includes(nodeId)) { this.data.assignedNodeIds.push(nodeId); await this.save(); } } public async removeNode(nodeId: string) { this.data.assignedNodeIds = this.data.assignedNodeIds.filter(id => id !== nodeId); await this.save(); } public async updatePowerState(state: 'on' | 'off' | 'unknown') { this.data.powerState = state; await this.save(); } public async powerOn(): Promise { // TODO: Implement IPMI power on if (this.data.ipmiAddress && this.data.ipmiCredentials) { // Implement IPMI power on command console.log(`Powering on BareMetal ${this.id} via IPMI`); await this.updatePowerState('on'); return true; } return false; } public async powerOff(): Promise { // TODO: Implement IPMI power off if (this.data.ipmiAddress && this.data.ipmiCredentials) { // Implement IPMI power off command console.log(`Powering off BareMetal ${this.id} via IPMI`); await this.updatePowerState('off'); return true; } return false; } public async reset(): Promise { // TODO: Implement IPMI reset if (this.data.ipmiAddress && this.data.ipmiCredentials) { // Implement IPMI reset command console.log(`Resetting BareMetal ${this.id} via IPMI`); return true; } return false; } }