hetznercloud/ts/classes.server.ts

84 lines
2.5 KiB
TypeScript
Raw Normal View History

2024-01-29 20:08:05 +00:00
import type { HetznerAccount } from './classes.account.js';
import * as plugins from './hetznercloud.plugins.js';
import * as types from './types.js';
export class HetznerServer {
// STATIC
2024-02-17 20:55:25 +00:00
public static async create(
hetznerAccountRefArg: HetznerAccount,
optionsArg: {
name: string;
2024-02-18 00:17:15 +00:00
type: types.THetznerCloudServerName;
location: types.THetznerCloudLocationName;
2024-02-18 22:23:20 +00:00
labels?: {[key: string]: string},
userData?: string,
2024-02-17 20:55:25 +00:00
}
) {
2024-01-29 20:08:05 +00:00
const server = new HetznerServer(hetznerAccountRefArg);
const createServerUrl = '/servers';
2024-02-17 20:55:25 +00:00
const createServerPayload: types.TServerCreateRequestBody = {
name: optionsArg.name,
image: 'ubuntu-22.04',
2024-02-18 00:17:15 +00:00
server_type: optionsArg.type,
2024-02-17 20:55:25 +00:00
start_after_create: true,
2024-02-17 20:58:10 +00:00
labels: optionsArg.labels || {} as any,
2024-02-17 20:55:25 +00:00
location: optionsArg.location,
2024-02-18 22:23:20 +00:00
user_data: optionsArg.userData || '',
2024-02-17 20:55:25 +00:00
public_net: {
enable_ipv4: true,
enable_ipv6: true,
},
};
const response = await server.hetznerAccountRef.request(
'POST',
createServerUrl,
createServerPayload
);
2024-01-29 20:08:05 +00:00
server.data = (response.body as types.TServerCreateResponseBody).server;
return server;
}
2024-01-29 20:14:05 +00:00
public static async getServers(hetznerAccountRefArg: HetznerAccount) {
const serversGetUrl = '/servers';
const response = await hetznerAccountRefArg.request('GET', serversGetUrl, {});
2024-02-17 20:55:25 +00:00
const serversDataArray = (response.body as types.TServersGetResponseBody).servers;
2024-01-29 20:14:05 +00:00
const servers: HetznerServer[] = [];
for (const serverData of serversDataArray) {
const server = new HetznerServer(hetznerAccountRefArg);
server.data = serverData;
servers.push(server);
}
return servers;
}
2024-02-18 22:41:50 +00:00
public static async getServersByLabel(hetznerAccountRefArg: HetznerAccount, labelObject: {[key: string]: string}) {
2024-02-18 22:23:20 +00:00
const servers = await HetznerServer.getServers(hetznerAccountRefArg);
2024-02-18 22:41:50 +00:00
const results: HetznerServer[] = [];
2024-02-18 22:23:20 +00:00
for (const server of servers) {
2024-02-18 22:41:50 +00:00
let isMatch = true;
for (const key in labelObject) {
if (server.data.labels[key] !== labelObject[key]) {
isMatch = false;
}
}
if (isMatch) {
results.push(server);
2024-02-18 22:23:20 +00:00
}
}
2024-02-18 22:41:50 +00:00
return results;
2024-02-18 22:23:20 +00:00
}
2024-01-29 20:08:05 +00:00
// INSTANCE
public hetznerAccountRef: HetznerAccount;
public data: types.IServer;
constructor(hetznerAccountRefArg: HetznerAccount) {
this.hetznerAccountRef = hetznerAccountRefArg;
}
public async delete() {
await this.hetznerAccountRef.request('DELETE', `/servers/${this.data.id}`, {});
}
}