Add Exoscale zone Module (#87)
parent
b6ec1d85a7
commit
24bf54d1bb
@ -0,0 +1 @@
|
|||||||
|
<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 68.03 68.03"><defs><style>.cls-1{fill:#da291c;}</style></defs><title>Artboard 1</title><polygon class="cls-1" points="34.02 13.31 11.27 52.72 14.52 52.72 34.02 18.94 34.02 24.57 17.77 52.72 21.02 52.72 34.02 30.2 34.02 35.83 24.27 52.72 27.52 52.72 34.02 41.46 34.02 47.09 30.77 52.72 34.02 52.72 34.02 52.72 56.77 52.72 34.02 13.31"/></svg>
|
After Width: | Height: | Size: 427 B |
Binary file not shown.
After Width: | Height: | Size: 28 KiB |
Binary file not shown.
After Width: | Height: | Size: 21 KiB |
Binary file not shown.
After Width: | Height: | Size: 27 KiB |
@ -0,0 +1,93 @@
|
|||||||
|
---
|
||||||
|
display_name: exoscale-zone
|
||||||
|
description: A parameter with human zone names and icons
|
||||||
|
icon: ../.icons/exoscale.svg
|
||||||
|
maintainer_github: WhizUs
|
||||||
|
verified: false
|
||||||
|
tags: [helper, parameter, zones, regions, exoscale]
|
||||||
|
---
|
||||||
|
|
||||||
|
# exoscale-zone
|
||||||
|
|
||||||
|
A parameter with all Exoscale zones. This allows developers to select
|
||||||
|
the zone closest to them.
|
||||||
|
|
||||||
|
Customize the preselected parameter value:
|
||||||
|
|
||||||
|
```hcl
|
||||||
|
module "exoscale-zone" {
|
||||||
|
source = "https://registry.coder.com/modules/exoscale-zone"
|
||||||
|
default = "ch-dk-2"
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
data "exoscale_compute_template" "my_template" {
|
||||||
|
zone = module.exoscale-zone.value
|
||||||
|
name = "Linux Ubuntu 22.04 LTS 64-bit"
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "exoscale_compute_instance" "instance" {
|
||||||
|
zone = module.exoscale-zone.value
|
||||||
|
....
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
## Examples
|
||||||
|
|
||||||
|
### Customize zones
|
||||||
|
|
||||||
|
Change the display name and icon for a zone using the corresponding maps:
|
||||||
|
|
||||||
|
```hcl
|
||||||
|
module "exoscale-zone" {
|
||||||
|
source = "https://registry.coder.com/modules/exoscale-zone"
|
||||||
|
default = "at-vie-1"
|
||||||
|
custom_names = {
|
||||||
|
"at-vie-1": "Home Vienna"
|
||||||
|
}
|
||||||
|
custom_icons = {
|
||||||
|
"at-vie-1": "/emojis/1f3e0.png"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
data "exoscale_compute_template" "my_template" {
|
||||||
|
zone = module.exoscale-zone.value
|
||||||
|
name = "Linux Ubuntu 22.04 LTS 64-bit"
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "exoscale_compute_instance" "instance" {
|
||||||
|
zone = module.exoscale-zone.value
|
||||||
|
....
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
### Exclude regions
|
||||||
|
|
||||||
|
Hide the Switzerland zones Geneva and Zurich
|
||||||
|
|
||||||
|
```hcl
|
||||||
|
module "exoscale-zone" {
|
||||||
|
source = "https://registry.coder.com/modules/exoscale-zone"
|
||||||
|
exclude = [ "ch-gva-2", "ch-dk-2" ]
|
||||||
|
}
|
||||||
|
|
||||||
|
data "exoscale_compute_template" "my_template" {
|
||||||
|
zone = module.exoscale-zone.value
|
||||||
|
name = "Linux Ubuntu 22.04 LTS 64-bit"
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "exoscale_compute_instance" "instance" {
|
||||||
|
zone = module.exoscale-zone.value
|
||||||
|
....
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
## Related templates
|
||||||
|
|
||||||
|
An exoscale sample template will be delivered soon.
|
@ -0,0 +1,25 @@
|
|||||||
|
import { describe, expect, it } from "bun:test";
|
||||||
|
import {
|
||||||
|
executeScriptInContainer,
|
||||||
|
runTerraformApply,
|
||||||
|
runTerraformInit,
|
||||||
|
testRequiredVariables,
|
||||||
|
} from "../test";
|
||||||
|
|
||||||
|
describe("exoscale-zone", async () => {
|
||||||
|
await runTerraformInit(import.meta.dir);
|
||||||
|
|
||||||
|
testRequiredVariables(import.meta.dir, {});
|
||||||
|
|
||||||
|
it("default output", async () => {
|
||||||
|
const state = await runTerraformApply(import.meta.dir, {});
|
||||||
|
expect(state.outputs.value.value).toBe("");
|
||||||
|
});
|
||||||
|
|
||||||
|
it("customized default", async () => {
|
||||||
|
const state = await runTerraformApply(import.meta.dir, {
|
||||||
|
default: "at-vie-1",
|
||||||
|
});
|
||||||
|
expect(state.outputs.value.value).toBe("at-vie-1");
|
||||||
|
});
|
||||||
|
});
|
@ -0,0 +1,110 @@
|
|||||||
|
terraform {
|
||||||
|
required_version = ">= 1.0"
|
||||||
|
|
||||||
|
required_providers {
|
||||||
|
coder = {
|
||||||
|
source = "coder/coder"
|
||||||
|
version = ">= 0.12"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "display_name" {
|
||||||
|
default = "Exoscale Region"
|
||||||
|
description = "The display name of the parameter."
|
||||||
|
type = string
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "description" {
|
||||||
|
default = "The region to deploy workspace infrastructure."
|
||||||
|
description = "The description of the parameter."
|
||||||
|
type = string
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "default" {
|
||||||
|
default = ""
|
||||||
|
description = "The default region to use if no region is specified."
|
||||||
|
type = string
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "mutable" {
|
||||||
|
default = false
|
||||||
|
description = "Whether the parameter can be changed after creation."
|
||||||
|
type = bool
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "custom_names" {
|
||||||
|
default = {}
|
||||||
|
description = "A map of custom display names for region IDs."
|
||||||
|
type = map(string)
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "custom_icons" {
|
||||||
|
default = {}
|
||||||
|
description = "A map of custom icons for region IDs."
|
||||||
|
type = map(string)
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "exclude" {
|
||||||
|
default = []
|
||||||
|
description = "A list of region IDs to exclude."
|
||||||
|
type = list(string)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
locals {
|
||||||
|
# This is a static list because the zones don't change _that_
|
||||||
|
# frequently and including the `exoscale_zones` data source requires
|
||||||
|
# the provider, which requires a zone.
|
||||||
|
# https://www.exoscale.com/datacenters/
|
||||||
|
zones = {
|
||||||
|
"de-fra-1" = {
|
||||||
|
name = "Frankfurt - Germany"
|
||||||
|
icon = "/emojis/1f1e9-1f1ea.png"
|
||||||
|
}
|
||||||
|
"at-vie-1" = {
|
||||||
|
name = "Vienna 1 - Austria"
|
||||||
|
icon = "/emojis/1f1e6-1f1f9.png"
|
||||||
|
}
|
||||||
|
"at-vie-2" = {
|
||||||
|
name = "Vienna 2 - Austria"
|
||||||
|
icon = "/emojis/1f1e6-1f1f9.png"
|
||||||
|
}
|
||||||
|
"ch-gva-2" = {
|
||||||
|
name = "Geneva - Switzerland"
|
||||||
|
icon = "/emojis/1f1e8-1f1ed.png"
|
||||||
|
}
|
||||||
|
"ch-dk-2" = {
|
||||||
|
name = "Zurich - Switzerland"
|
||||||
|
icon = "/emojis/1f1e8-1f1ed.png"
|
||||||
|
}
|
||||||
|
"bg-sof-1" = {
|
||||||
|
name = "Sofia - Bulgaria"
|
||||||
|
icon = "/emojis/1f1e7-1f1ec.png"
|
||||||
|
}
|
||||||
|
"de-muc-1" = {
|
||||||
|
name = "Munich - Germany"
|
||||||
|
icon = "/emojis/1f1e9-1f1ea.png"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
data "coder_parameter" "zone" {
|
||||||
|
name = "exoscale_zone"
|
||||||
|
display_name = var.display_name
|
||||||
|
description = var.description
|
||||||
|
default = var.default == "" ? null : var.default
|
||||||
|
mutable = var.mutable
|
||||||
|
dynamic "option" {
|
||||||
|
for_each = { for k, v in local.zones : k => v if !(contains(var.exclude, k)) }
|
||||||
|
content {
|
||||||
|
name = try(var.custom_names[option.key], option.value.name)
|
||||||
|
icon = try(var.custom_icons[option.key], option.value.icon)
|
||||||
|
value = option.key
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
output "value" {
|
||||||
|
value = data.coder_parameter.zone.value
|
||||||
|
}
|
Loading…
Reference in New Issue