2024-06-20 01:43:25 +00:00
|
|
|
#!/usr/bin/env node
|
|
|
|
|
|
|
|
import dotenv from 'dotenv'
|
2024-06-20 23:23:01 +00:00
|
|
|
import { join } from 'node:path'
|
|
|
|
dotenv.config({ path: join(import.meta.dirname, '../../.env') })
|
2024-06-20 01:43:25 +00:00
|
|
|
|
|
|
|
const apiV2Base = 'https://api.vultr.com/v2'
|
|
|
|
|
|
|
|
|
|
|
|
if (!process.env.VULTR_API_KEY) throw new Error('VULTR_API_KEY is missing in env');
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
async function deleteOrphanedLoadBalancers() {
|
|
|
|
console.log('getting load balancers')
|
|
|
|
const loadBalancersRes = await fetch(`${apiV2Base}/load-balancers`, {
|
|
|
|
method: 'GET',
|
|
|
|
headers: {
|
|
|
|
'authorization': `Bearer ${process.env.VULTR_API_KEY}`
|
|
|
|
}
|
|
|
|
})
|
|
|
|
const loadBalancerJson = await loadBalancersRes.json()
|
|
|
|
const orphanedLoadBalancers = loadBalancerJson.load_balancers.filter((lb) => (lb.instances.length === 0))
|
|
|
|
console.log(`found ${orphanedLoadBalancers.length} orphaned load balancers.`)
|
|
|
|
console.log('waiting 1 second')
|
|
|
|
await new Promise((resolve) => { setTimeout(resolve, 1000) })
|
|
|
|
|
|
|
|
for (const lb of orphanedLoadBalancers) {
|
|
|
|
console.log(`deleting load balancer ${lb.id}`)
|
|
|
|
|
|
|
|
const deleteLoadBalancerRes = await fetch(`https://api.vultr.com/v2/load-balancers/${lb.id}`, {
|
|
|
|
method: 'DELETE',
|
|
|
|
headers: {
|
|
|
|
'Authorization': `Bearer ${process.env.VULTR_API_KEY}`
|
|
|
|
}
|
|
|
|
})
|
|
|
|
|
|
|
|
console.log('waiting 1 second')
|
|
|
|
await new Promise((resolve) => { setTimeout(resolve, 1000) })
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
async function deleteOrphanedBlockStorage() {
|
|
|
|
console.log('getting block storage')
|
|
|
|
|
|
|
|
const blocksRes = await fetch(`${apiV2Base}/blocks`, {
|
|
|
|
method: 'GET',
|
|
|
|
headers: {
|
|
|
|
'authorization': `Bearer ${process.env.VULTR_API_KEY}`
|
|
|
|
}
|
|
|
|
})
|
|
|
|
const blocksJson = await blocksRes.json()
|
|
|
|
|
|
|
|
const orphanedBlocks = blocksJson.blocks.filter((b) => b.attached_to_instance === '')
|
|
|
|
console.log(`found ${orphanedBlocks.length} orphaned block storages`)
|
|
|
|
|
|
|
|
console.log('waiting 1 second')
|
|
|
|
await new Promise((resolve) => { setTimeout(resolve, 1000) })
|
|
|
|
for (const block of orphanedBlocks) {
|
|
|
|
console.log(`deleting block ${block.id}`)
|
|
|
|
|
|
|
|
const deleteBlocksRes = await fetch(`${apiV2Base}/blocks/${block.id}`, {
|
|
|
|
method: 'DELETE',
|
|
|
|
headers: {
|
|
|
|
'Authorization': `Bearer ${process.env.VULTR_API_KEY}`
|
|
|
|
}
|
|
|
|
})
|
|
|
|
|
|
|
|
console.log('waiting 1 second')
|
|
|
|
await new Promise((resolve) => { setTimeout(resolve, 1000) })
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
async function main() {
|
|
|
|
await deleteOrphanedLoadBalancers()
|
|
|
|
await deleteOrphanedBlockStorage()
|
|
|
|
}
|
|
|
|
|
|
|
|
main()
|