104 lines
3.0 KiB
TypeScript
104 lines
3.0 KiB
TypeScript
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<boolean> {
|
|
// 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<boolean> {
|
|
// 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<boolean> {
|
|
// 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;
|
|
}
|
|
} |