Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add support for glesys_server backupschedules #210

Merged
merged 1 commit into from
Oct 9, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
40 changes: 40 additions & 0 deletions docs/resources/server.md
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,37 @@ resource "glesys_server" "kvm" {
}
}

# KVM with backups_schedule

resource "glesys_server" "kvm" {
datacenter = "Stockholm"
memory = 1024
storage = 20
cpu = 1
bandwidth = 100

hostname = "www1"

platform = "KVM"
template = "debian-11"

user {
username = "alice"
publickeys = [
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAINOCh8br7CwZDMGmINyJgBip943QXgkf7XdXrDMJf5Dl [email protected]",
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIOfN4dBsS2p1UX+DP6RicdxAYCCeRK8mzCldCS0W9A+5 [email protected]"
]
password = "hunter4!"
}
backups_schedule {
frequency = "daily"
retention = 7
}
backups_schedule {
frequency = "weekly"
retention = 4
}
}
# Advanced example using variables
# Set some variables
variable "datacenter" {
Expand Down Expand Up @@ -154,6 +185,7 @@ Examples can be found in the [GleSYS API - Cloud config documentation](https://g

### Optional

- `backups_schedule` (Block Set) KVM Server backup schedule definition. (see [below for nested schema](#nestedblock--backups_schedule))
- `campaigncode` (String) Campaigncode used during creation for possible discount
- `cloudconfig` (String) Cloudconfig used to provision server using a provided cloud-config mustache template.
- `cloudconfigparams` (Map of String) Cloudconfigparams is used to provide additional parameters to the template in `cloudconfig` using a map. This can be set using a Terraform Local Value.
Expand All @@ -174,6 +206,14 @@ Examples can be found in the [GleSYS API - Cloud config documentation](https://g
- `isrunning` (Boolean) Server running state
- `network_adapters` (List of Object) Network adapters associated with the server. `glesys_networkadapter` (see [below for nested schema](#nestedatt--network_adapters))

<a id="nestedblock--backups_schedule"></a>
### Nested Schema for `backups_schedule`

Required:

- `frequency` (String)
- `retention` (Number)


<a id="nestedblock--user"></a>
### Nested Schema for `user`
Expand Down
31 changes: 31 additions & 0 deletions examples/resources/glesys_server/resource.tf
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,37 @@ resource "glesys_server" "kvm" {
}
}

# KVM with backups_schedule

resource "glesys_server" "kvm" {
datacenter = "Stockholm"
memory = 1024
storage = 20
cpu = 1
bandwidth = 100

hostname = "www1"

platform = "KVM"
template = "debian-11"

user {
username = "alice"
publickeys = [
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAINOCh8br7CwZDMGmINyJgBip943QXgkf7XdXrDMJf5Dl [email protected]",
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIOfN4dBsS2p1UX+DP6RicdxAYCCeRK8mzCldCS0W9A+5 [email protected]"
]
password = "hunter4!"
}
backups_schedule {
frequency = "daily"
retention = 7
}
backups_schedule {
frequency = "weekly"
retention = 4
}
}
# Advanced example using variables
# Set some variables
variable "datacenter" {
Expand Down
62 changes: 62 additions & 0 deletions glesys/resource_glesys_server.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import (
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/retry"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation"
)

func resourceGlesysServer() *schema.Resource {
Expand Down Expand Up @@ -194,6 +195,25 @@ func resourceGlesysServer() *schema.Resource {
},
},
},

"backups_schedule": {
Type: schema.TypeSet,
Optional: true,
Description: "KVM Server backup schedule definition.",
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"frequency": {
Type: schema.TypeString,
Required: true,
ValidateFunc: validation.StringInSlice([]string{"daily", "weekly"}, false),
},
"retention": {
Type: schema.TypeInt,
Required: true,
},
},
},
},
},
}
}
Expand Down Expand Up @@ -222,6 +242,22 @@ func expandUsers(config []interface{}) ([]glesys.User, error) {
return users, nil
}

func expandBackupSchedules(config []interface{}) ([]glesys.ServerBackupSchedule, error) {
schedules := make([]glesys.ServerBackupSchedule, 0, len(config))

for _, rawSchedule := range config {
schedule := rawSchedule.(map[string]interface{})

s := glesys.ServerBackupSchedule{
Frequency: schedule["frequency"].(string),
Numberofimagestokeep: schedule["retention"].(int),
}

schedules = append(schedules, s)
}
return schedules, nil
}

func buildServerParamStruct(d *schema.ResourceData) *glesys.CreateServerParams {
opts := glesys.CreateServerParams{
Bandwidth: d.Get("bandwidth").(int),
Expand Down Expand Up @@ -252,6 +288,12 @@ func resourceGlesysServerCreate(ctx context.Context, d *schema.ResourceData, m i
// Setup server parameters
srv := buildServerParamStruct(d)

backupsList, err := expandBackupSchedules(d.Get("backups_schedule").(*schema.Set).List())
if err != nil {
return diag.Errorf("Error when expanding backup schedules: %v", err)
}
srv.Backup = backupsList

// Setup users for server creation
usersList, err := expandUsers(d.Get("user").(*schema.Set).List())
if err != nil {
Expand Down Expand Up @@ -329,6 +371,19 @@ func resourceGlesysServerRead(ctx context.Context, d *schema.ResourceData, m int
}
d.Set("extra_disks", diskIDs)

var backupSchedules []map[string]interface{}
for _, bs := range srv.Backup.Schedules {
schedule := map[string]interface{}{
"frequency": bs.Frequency,
"retention": bs.Numberofimagestokeep,
}
backupSchedules = append(backupSchedules, schedule)
}

if err := d.Set("backups_schedule", backupSchedules); err != nil {
return diag.Errorf("unable to set backups_schedule, read value %v", err)
}

var adapters []map[string]interface{}
netAdapters, _ := client.Servers.NetworkAdapters(ctx, d.Id())
for _, v := range *netAdapters {
Expand Down Expand Up @@ -374,6 +429,13 @@ func resourceGlesysServerUpdate(ctx context.Context, d *schema.ResourceData, m i
if d.HasChange("storage") {
opts.Storage = d.Get("storage").(int)
}
if d.HasChange("backups_schedule") {
backupsList, err := expandBackupSchedules(d.Get("backups_schedule").(*schema.Set).List())
if err != nil {
diag.Errorf("Error updating backups_schedule: %s", err)
}
opts.Backup = backupsList
}
_, err := client.Servers.Edit(ctx, d.Id(), opts)
if err != nil {
return diag.Errorf("Error updating instance: %s", err)
Expand Down
49 changes: 49 additions & 0 deletions glesys/resource_glesys_server_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,30 @@ func TestAccServerVMware_basic(t *testing.T) {
})
}

func TestAccServerKVM_BackupSchedule(t *testing.T) {
rName := acctest.RandomWithPrefix("tf-srv-kvm")

name := "glesys_server.test"
resource.UnitTest(t, resource.TestCase{
PreCheck: func() { testAccPreCheck(t) },
Providers: testGlesysProviders,
Steps: []resource.TestStep{
{
Config: testAccGlesysServerBase_KVM_BackupSchedule(rName),
Check: resource.ComposeTestCheckFunc(
resource.TestCheckResourceAttr(name, "hostname", rName),
resource.TestCheckResourceAttr(name, "datacenter", "Falkenberg"),
resource.TestCheckResourceAttr(name, "platform", "KVM"),
resource.TestCheckResourceAttr(name, "backups_schedule.0.frequency", "daily"),
resource.TestCheckResourceAttr(name, "backups_schedule.0.retention", "3"),
resource.TestCheckResourceAttrSet(name, "ipv4_address"),
resource.TestCheckResourceAttrSet(name, "ipv6_address"),
),
},
},
})
}

func testAccGlesysServerBase_VMware(name string) string {
return fmt.Sprintf(`
resource "glesys_server" "test" {
Expand All @@ -95,3 +119,28 @@ func testAccGlesysServerBase_VMware(name string) string {
}
} `, name)
}

func testAccGlesysServerBase_KVM_BackupSchedule(name string) string {
return fmt.Sprintf(`
resource "glesys_server" "test" {
hostname = "%s"
datacenter = "Falkenberg"
platform = "KVM"
bandwidth = 100
cpu = 1
memory = 1024
storage = 10
template = "Debian 12 (Bookworm)"

user {
username = "acctestuser"
publickeys = ["ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAINOCh8br7CwZDMGmINyJgBip943QXgkf7XdXrDMJf5Dl acctestuser@example-host"]
password = "hunter123!"
}

backups_schedule {
frequency = "daily"
retention = 3
}
} `, name)
}