Files

66 lines
2.2 KiB
YAML

apiVersion: quai.dev/v1beta1
kind: ResourceType
metadata:
name: vm
title: Virtual machine (Terraform)
description: One YAML file per VM under envs/<env>/vms/. Each environment is a Terraform stack that turns those files into module instances.
icon: server
category: Compute
version: 1.0.0
tags: [terraform, brownfield]
spec:
locate:
strategy: file
path: envs/{env}/vms/{name}.yaml
params:
- name: env
title: Environment
type: enum
discover: true # offer the environments that exist in the repository
- name: name
title: VM name
description: Becomes the file name and the Terraform for_each key.
pattern: "[a-z][a-z0-9-]{1,30}"
# The contract CI validates every VM file against; the form is generated from it.
schema: catalog/schemas/vm.schema.json
generate: { kind: identity }
ownership: { field: owner }
stack: envs/{env}
address: module.vm["{name}"]
deletion: approval
ui:
order: [description, template, cpu, memory_gb, disks, network, backup, backup_policy, tags]
fields:
template: { immutable: true }
network.vlan: { immutable: true }
backup_policy: { visibleIf: "has(inputs.backup) && inputs.backup" }
approval:
rules:
- name: cost
when: params.env == 'prod' && plan.cost.monthlyDelta > 500
approvers: [group:finops]
- name: production
when: params.env == 'prod'
approvers: [group:platform-admins]
- name: large-vm
# Only when a VM becomes large, not on every change to an already large one.
when: inputs.cpu > 8 && !(has(previous.cpu) && previous.cpu > 8)
approvers: [group:finops]
actions:
- name: resize
title: Resize
icon: maximize
inputs:
- { name: cpu, title: vCPUs, type: integer, min: 1, max: 32, required: true }
- { name: memory_gb, title: Memory (GB), type: integer, min: 1, max: 256, required: true }
set:
cpu: ${{ action.cpu }}
memory_gb: ${{ action.memory_gb }}
- name: extend-disk
title: Extend system disk
icon: hard-drive
inputs:
- { name: size_gb, title: Size (GB), type: integer, min: 10, max: 4096, required: true }
set:
disks.0.size_gb: ${{ action.size_gb }}