0
0
mirror of https://github.com/bpg/terraform-provider-proxmox.git synced 2025-06-30 10:33:46 +00:00

fix: search for vm in cluster resources before calling node api (#393)

* (fix) search for vm in cluster resources before calling node api

* (lint) search for vm in cluster resources before calling node api

* cleanup redundant error checks

---------

Co-authored-by: michalg91 <michal.gawrys@g2a.com>
Co-authored-by: Pavel Boldyrev <627562+bpg@users.noreply.github.com>
This commit is contained in:
michalg91 2023-07-01 16:45:40 +02:00 committed by GitHub
parent 03eaf72767
commit 99fda9cbcd
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 92 additions and 1 deletions

View File

@ -94,3 +94,47 @@ func (c *Client) GetVMID(ctx context.Context) (*int, error) {
return nil, errors.New("unable to determine the next available VM identifier")
}
// GetClusterResources retrieves current resources for cluster.
func (c *Client) GetClusterResources(ctx context.Context, resourceType string) ([]*ResourcesListResponseData, error) {
reqBody := &ResourcesListRequestBody{
Type: resourceType,
}
resBody := &ResourcesListBody{}
err := c.DoRequest(ctx, http.MethodGet, "cluster/resources", reqBody, resBody)
if err != nil {
return nil, fmt.Errorf("failed to get resources list of type (\"%s\") for cluster: %w", resourceType, err)
}
if resBody.Data == nil {
return nil, api.ErrNoDataObjectInResponse
}
return resBody.Data, nil
}
// GetClusterResourcesVM retrieves current VM resources for cluster.
func (c *Client) GetClusterResourcesVM(ctx context.Context) ([]*ResourcesListResponseData, error) {
return c.GetClusterResources(ctx, "vm")
}
// GetVMNodeName gets node for specified vmID.
func (c *Client) GetVMNodeName(ctx context.Context, vmID int) (*string, error) {
allClusterVM, err := c.GetClusterResourcesVM(ctx)
if err != nil {
return nil, err
}
if allClusterVM == nil {
return nil, api.ErrNoDataObjectInResponse
}
for _, v := range allClusterVM {
if v.VMID == vmID {
return &v.NodeName, nil
}
}
return nil, errors.New("unable to determine node name for VM identifier")
}

View File

@ -19,3 +19,37 @@ type NextIDRequestBody struct {
type NextIDResponseBody struct {
Data *types.CustomInt `json:"data,omitempty"`
}
// ResourcesListBody contains the body from a cluste resource list response.
type ResourcesListBody struct {
Data []*ResourcesListResponseData `json:"data,omitempty"`
}
// ResourcesListRequestBody contains the body params to cluster resource list request.
type ResourcesListRequestBody struct {
Type string `json:"type" url:"type"`
}
// ResourcesListResponseData contains the data from a cluster resource list body response.
type ResourcesListResponseData struct {
Type string `json:"type"`
ID string `json:"id"`
CgroupMode int `json:"cgroup-mode,omitempty"`
Content int `json:"content,omitempty"`
CPU float64 `json:"cpu,omitempty"`
Disk int `json:"disk,omitempty"`
HaState string `json:"hastate,omitempty"`
Level string `json:"level,omitempty"`
MaxCPU float64 `json:"maxcpu,omitempty"`
MaxDisk int `json:"maxdisk,omitempty"`
MaxMem int `json:"maxmem,omitempty"`
Mem int `json:"mem,omitempty"`
Name string `json:"name,omitempty"`
NodeName string `json:"node,omitempty"`
PluginType string `json:"plugintype,omitempty"`
PoolName string `json:"poolname,omitempty"`
Status string `json:"status,omitempty"`
Storage string `json:"storage,omitempty"`
Uptime int `json:"uptime,omitempty"`
VMID int `json:"vmid,omitempty"`
}

View File

@ -3035,12 +3035,25 @@ func vmRead(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Dia
return diag.FromErr(err)
}
nodeName := d.Get(mkResourceVirtualEnvironmentVMNodeName).(string)
vmID, err := strconv.Atoi(d.Id())
if err != nil {
return diag.FromErr(err)
}
vmNodeName, err := api.Cluster().GetVMNodeName(ctx, vmID)
if err != nil {
return diag.FromErr(err)
}
if vmNodeName != d.Get(mkResourceVirtualEnvironmentVMNodeName) {
err = d.Set(mkResourceVirtualEnvironmentVMNodeName, vmNodeName)
if err != nil {
return diag.FromErr(err)
}
}
nodeName := d.Get(mkResourceVirtualEnvironmentVMNodeName).(string)
vmAPI := api.Node(nodeName).VM(vmID)
// Retrieve the entire configuration in order to compare it to the state.