You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

81 lines
2.6 KiB

import {AsyncPipe, Awaitable, Controller, Inject, Injectable, Maybe, QueryRow, Safe} from '@extollo/lib'
import {DataSourceController} from '../../../cobalt'
import {HostGroup} from '../../../models/HostGroup.model'
import {Provisioner} from '../../../services/Provisioner.service'
@Injectable()
export class HostGroups extends Controller implements DataSourceController {
@Inject()
protected readonly provisioner!: Provisioner
read(): Awaitable<QueryRow[]> {
return HostGroup.query<HostGroup>()
.orderBy('name')
.get()
.collect()
.then(x => x.mapCall('toCobalt').awaitAll())
.then(x => x.all())
}
readOne(id: any): Awaitable<Maybe<QueryRow>> {
return HostGroup.query<HostGroup>()
.whereKey(id)
.first()
.then(x => x?.toCobalt())
}
insert(row: QueryRow): Awaitable<QueryRow> {
const hosts = row.hosts
if ( !Array.isArray(hosts) || !hosts.every(i => typeof i === 'string') ) {
throw new Error('Invalid hosts: must be number[]')
}
return AsyncPipe.wrap(this.request.makeNew<HostGroup>(HostGroup))
.peek(g => g.name = (new Safe(row.name)).string())
.peek(g => g.save())
.peek(g => g.setHosts(hosts))
.tap(g => g.toCobalt())
.resolve()
}
async update(id: any, row: QueryRow): Promise<QueryRow> {
const hosts = row.hosts
if ( !Array.isArray(hosts) || !hosts.every(i => typeof i === 'string') ) {
throw new Error('Invalid hosts: must be number[]')
}
const hostGroup = await HostGroup.query<HostGroup>()
.whereKey(id)
.first()
if ( !hostGroup ) {
throw new Error('Invalid host group ID.')
}
hostGroup.name = (new Safe(row.name)).string()
await hostGroup.save()
await hostGroup.setHosts(hosts)
return hostGroup.toCobalt()
}
async delete(id: any): Promise<void> {
HostGroup.query<HostGroup>()
.whereKey(id)
.delete()
}
async getPVEHosts(): Promise<QueryRow[]> {
return AsyncPipe.wrap(this.provisioner)
.tap(p => p.getApi())
.tap(api => api.nodes.$get())
.tap(nodes =>
nodes.map(node => ({
pveHost: node.id || node.node,
pveDisplay: `${node.node} (CPUs: ${node.maxcpu}, RAM: ${Math.floor((node.maxmem || 0) / 1000000000)})`
}))
)
.resolve()
}
}