apiVersion: quai.dev/v1beta1 kind: Blueprint metadata: name: linux-vm title: Linux virtual machine description: A VM in the Terraform repository, sized from t-shirt sizes. The vRA classic, now a pull request. icon: server category: Compute version: 2.0.0 owners: [team:platform] tags: [terraform, vm] spec: inputs: type: object required: [environment, name, os, size] additionalProperties: false properties: environment: { type: string, title: Environment, enum: [dev, test, prod], default: dev } name: { type: string, title: VM name, pattern: "^[a-z][a-z0-9-]{1,30}$" } os: type: string title: Operating system enum: [ubuntu-24.04, rhel-9] default: ubuntu-24.04 size: type: string title: Size description: small = 2 vCPU / 4 GB, medium = 4 / 16, large = 16 / 64 enum: [small, medium, large] default: small diskGb: { type: integer, title: System disk (GB), minimum: 20, maximum: 2048, default: 50 } vlan: { type: integer, title: VLAN, enum: [110, 120, 130], default: 110 } ui: order: [environment, name, os, size, diskGb, vlan] fields: os: { immutable: true } resources: - id: vm type: { name: vm } # a type in this repository params: env: ${{ inputs.environment }} name: ${{ inputs.name }} values: template: ${{ inputs.os }} cpu: "${{ inputs.size == 'small' ? 2 : inputs.size == 'medium' ? 4 : 16 }}" memory_gb: "${{ inputs.size == 'small' ? 4 : inputs.size == 'medium' ? 16 : 64 }}" disks: [{ size_gb: "${{ inputs.diskGb }}", tier: standard }] network: { vlan: "${{ inputs.vlan }}" } backup: ${{ inputs.environment == 'prod' }} approval: rules: - name: large-vm-cost when: inputs.size == 'large' approvers: [group:finops] actions: - name: resize title: Resize icon: maximize description: Change the VM size. The VM restarts to apply it. inputs: - { name: size, title: New size, type: enum, options: [small, medium, large], required: true } apply: vm: values: cpu: "${{ action.size == 'small' ? 2 : action.size == 'medium' ? 4 : 16 }}" memory_gb: "${{ action.size == 'small' ? 4 : action.size == 'medium' ? 16 : 64 }}"