From 08e750cee8ca4fd3f85ce585c637888b4bd5935e Mon Sep 17 00:00:00 2001 From: Vladimir Krumshtein Date: Fri, 10 Jan 2025 12:52:01 +0100 Subject: [PATCH] chore: add drp_machine_set_pool resource --- drpv4/provider.go | 23 +++-- drpv4/resource_drp_machine.go | 16 +-- drpv4/resource_drp_machine_set_pool.go | 137 +++++++++++++++++++++++++ 3 files changed, 150 insertions(+), 26 deletions(-) create mode 100644 drpv4/resource_drp_machine_set_pool.go diff --git a/drpv4/provider.go b/drpv4/provider.go index 8c09b7a..cf85d03 100644 --- a/drpv4/provider.go +++ b/drpv4/provider.go @@ -22,17 +22,18 @@ func Provider() *schema.Provider { return &schema.Provider{ ResourcesMap: map[string]*schema.Resource{ - "drp_machine": resourceMachine(), - "drp_param": resourceParam(), - "drp_template": resourceTemplate(), - "drp_task": resourceTask(), - "drp_stage": resourceStage(), - "drp_workflow": resourceWorkflow(), - "drp_subnet": resourceSubnet(), - "drp_reservation": resourceReservation(), - "drp_pool": resourcePool(), - "drp_profile": resourceProfile(), - "drp_profile_param": resourceProfileParam(), + "drp_machine": resourceMachine(), + "drp_machine_set_pool": resourceMachinePool(), + "drp_param": resourceParam(), + "drp_template": resourceTemplate(), + "drp_task": resourceTask(), + "drp_stage": resourceStage(), + "drp_workflow": resourceWorkflow(), + "drp_subnet": resourceSubnet(), + "drp_reservation": resourceReservation(), + "drp_pool": resourcePool(), + "drp_profile": resourceProfile(), + "drp_profile_param": resourceProfileParam(), }, // note yet, but potentially pools, params and profiles diff --git a/drpv4/resource_drp_machine.go b/drpv4/resource_drp_machine.go index ad18d08..b3d653c 100644 --- a/drpv4/resource_drp_machine.go +++ b/drpv4/resource_drp_machine.go @@ -10,7 +10,6 @@ import ( "strings" "time" - "github.com/VictorLowther/jsonpatch2" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "gitlab.com/rackn/provision/v4/models" ) @@ -155,24 +154,11 @@ func resourceMachineAllocate(d *schema.ResourceData, m interface{}) error { parms["pool/filter"] = filters.([]interface{}) } - requuid := cc.session.Req().Get().UrlFor("machines", "Address=", d.Get("address").(string)) - mruuid := []*models.Machine{} - if err := requuid.Do(&mruuid); err != nil { - log.Printf("[DEBUG] Get error %+v | %+v", err, requuid) - return fmt.Errorf("error getting machine UUID for address %s: %s", d.Get("address").(string), err) - } - patch := jsonpatch2.Patch{{Op: "replace", Path: "/Pool", Value: pool}} - reqm := cc.session.Req().Patch(patch).UrlFor("machines", string(mruuid[0].Uuid)) - mr := []*models.Machine{} - if err := reqm.Do(&mr); err != nil { - log.Printf("[DEBUG] POST error %+v | %+v", err, reqm) - return fmt.Errorf("error set pool %s: %s", pool, err) - } pr := []*models.PoolResult{} req := cc.session.Req().Post(parms).UrlFor("pools", pool, "allocateMachines") if err := req.Do(&pr); err != nil { log.Printf("[DEBUG] POST error %+v | %+v", err, req) - return fmt.Errorf("error allocated from pool %s: %s", pool, err) + return fmt.Errorf("Error allocated from pool %s: %s", pool, err) } mc := pr[0] log.Printf("[DEBUG] Allocated %s machine %s (%s)", mc.Status, mc.Name, mc.Uuid) diff --git a/drpv4/resource_drp_machine_set_pool.go b/drpv4/resource_drp_machine_set_pool.go new file mode 100644 index 0000000..bdaa9dc --- /dev/null +++ b/drpv4/resource_drp_machine_set_pool.go @@ -0,0 +1,137 @@ +package drpv4 + +/* + * Copyright RackN 2020 + */ + +import ( + "fmt" + "log" + "time" + + "github.com/VictorLowther/jsonpatch2" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" + "gitlab.com/rackn/provision/v4/models" +) + +func resourceMachinePool() *schema.Resource { + r := &schema.Resource{ + Create: resourceMachineSetPool, + Read: resourceMachineGetPool, + Update: resourceMachineSetPoolUpdate, + Delete: resourceMachineSetPoolDelete, + + Schema: map[string]*schema.Schema{ + + "pool": &schema.Schema{ + Type: schema.TypeString, + Default: "default", + Description: "Which pool to add machine to", + Optional: true, + }, + "machineName": &schema.Schema{ + Type: schema.TypeString, + Description: "Machine Name", + ForceNew: true, + }, + + // Machine.Address + "address": &schema.Schema{ + Type: schema.TypeString, + Description: "Returns Digital Rebar Machine.Address", + Computed: true, + }, + }, + + Timeouts: &schema.ResourceTimeout{ + Create: schema.DefaultTimeout(25 * time.Minute), + Update: schema.DefaultTimeout(10 * time.Minute), + Delete: schema.DefaultTimeout(10 * time.Minute), + }, + } + + return r +} + +func resourceMachineSetPool(d *schema.ResourceData, m interface{}) error { + log.Println("[DEBUG] [resourceMachineAllocate] Allocating new drp_machine") + cc := m.(*Config) + + pool := d.Get("pool").(string) + if pool == "" { + pool = "default" + } + d.Set("pool", pool) + name := d.Get("machineName").(string) + + requuid := cc.session.Req().Get().UrlFor("machines", "Name=", name) + mruuid := []*models.Machine{} + if err := requuid.Do(&mruuid); err != nil { + log.Printf("[DEBUG] Get error %+v | %+v", err, requuid) + return fmt.Errorf("error getting machine UUID for address %s: %s", name, err) + } + patch := jsonpatch2.Patch{{Op: "replace", Path: "/Pool", Value: pool}} + reqm := cc.session.Req().Patch(patch).UrlFor("machines", string(mruuid[0].Uuid)) + mr := []*models.Machine{} + if err := reqm.Do(&mr); err != nil { + log.Printf("[DEBUG] POST error %+v | %+v", err, reqm) + return fmt.Errorf("error set pool %s: %s", pool, err) + } + + d.Set("address", mr[0].Address) + d.SetId(string(mr[0].Uuid)) + return resourceMachineGetPool(d, m) +} + +func resourceMachineGetPool(d *schema.ResourceData, m interface{}) error { + log.Println("[DEBUG] [resourceMachineGetPool] Reading drp_machine") + cc := m.(*Config) + uuid := d.Id() + log.Printf("[DEBUG] Reading machine %s", uuid) + mo, err := cc.session.GetModel("machines", uuid) + if err != nil { + log.Printf("[ERROR] [resourceMachineRead] Unable to get machine: %s", uuid) + return fmt.Errorf("Unable to get machine %s", uuid) + } + machineObject := mo.(*models.Machine) + d.Set("address", machineObject.Address.String()) + + return nil +} + +func resourceMachineSetPoolUpdate(d *schema.ResourceData, m interface{}) error { + log.Println("[DEBUG] [resourceMachineUpdate] Updating drp_machine") + cc := m.(*Config) + + // at this time there are no updates + log.Printf("[DEBUG] Config %v", cc) + + return resourceMachineGetPool(d, m) +} + +func resourceMachineSetPoolDelete(d *schema.ResourceData, m interface{}) error { + log.Println("[DEBUG] [resourceMachineRelease] Releasing machine_set_pool") + cc := m.(*Config) + + uuid := d.Id() + if uuid == "" { + return fmt.Errorf("Requires Uuid from id") + } + log.Printf("[DEBUG] Releasing %s ", uuid) + + patch := jsonpatch2.Patch{{Op: "replace", Path: "/Pool", Value: "default"}} + reqm := cc.session.Req().Patch(patch).UrlFor("machines", uuid) + mr := []*models.Machine{} + if err := reqm.Do(&mr); err != nil { + log.Printf("[DEBUG] POST error %+v | %+v", err, reqm) + return fmt.Errorf("error set pool %s: %s", "default", err) + } + + mc := mr[0] + if mc.Pool == "default" { + d.SetId("") + return nil + } else { + return fmt.Errorf("Could not set default pool for %s", uuid) + } +}