diff --git a/proxmox.go b/proxmox.go index 9ca0e6f..b2e1d3a 100644 --- a/proxmox.go +++ b/proxmox.go @@ -340,21 +340,75 @@ func (p *Plugin) Update(ctx context.Context, req *resource.UpdateRequest) (*reso // Delete removes a resource. func (p *Plugin) Delete(ctx context.Context, req *resource.DeleteRequest) (*resource.DeleteResult, error) { - // TODO: Implement resource deletion - // - // 1. Use req.NativeID to identify the resource - // 2. Parse req.TargetConfig for provider credentials - // 3. Call your provider's API to delete the resource - // 4. Return ProgressResult with status + config, err := parseTargetConfig(req.TargetConfig) + if err != nil { + log.Println(err.Error()) + return &resource.DeleteResult{ + ProgressResult: &resource.ProgressResult{ + Operation: resource.OperationCreate, + OperationStatus: resource.OperationStatusFailure, + ErrorCode: resource.OperationErrorCodeInternalFailure, + StatusMessage: err.Error(), + }, + }, err + } + + username, token, err := getCredentials() + if err != nil { + log.Println(err.Error()) + return &resource.DeleteResult{ + ProgressResult: &resource.ProgressResult{ + Operation: resource.OperationCreate, + OperationStatus: resource.OperationStatusFailure, + ErrorCode: resource.OperationErrorCodeInternalFailure, + StatusMessage: err.Error(), + }, + }, err + } + + client := &http.Client{} + + url := config.URL + "/api2/json/nodes/" + config.NODE + "/lxc/" + req.NativeID + + request, err := http.NewRequest("DELETE", url, nil) + request.Header.Set("Authorization", "PVEAPIToken="+username+"="+token) + + resp, err := client.Do(request) + + if err != nil { + return &resource.DeleteResult{ + ProgressResult: &resource.ProgressResult{ + Operation: resource.OperationCreate, + OperationStatus: resource.OperationStatusFailure, + ErrorCode: resource.OperationErrorCodeInternalFailure, + StatusMessage: err.Error(), + }, + }, err + } + + body, err := io.ReadAll(resp.Body) + if err != nil { + return &resource.DeleteResult{ + ProgressResult: &resource.ProgressResult{ + Operation: resource.OperationCreate, + OperationStatus: resource.OperationStatusFailure, + ErrorCode: resource.OperationErrorCodeInternalFailure, + StatusMessage: err.Error(), + }, + }, err + } + + log.Println("Response StatusCode: ", resp.Status) + log.Println("Response Body: ", string(body)) return &resource.DeleteResult{ ProgressResult: &resource.ProgressResult{ - Operation: resource.OperationDelete, - OperationStatus: resource.OperationStatusFailure, - ErrorCode: resource.OperationErrorCodeInternalFailure, - StatusMessage: "Delete not implemented", + Operation: resource.OperationCreate, + OperationStatus: resource.OperationStatusSuccess, + NativeID: req.NativeID, }, - }, ErrNotImplemented + }, nil + } // Status checks the progress of an async operation. diff --git a/proxmox_test.go b/proxmox_test.go index 928a182..5f0e5f8 100644 --- a/proxmox_test.go +++ b/proxmox_test.go @@ -152,3 +152,55 @@ func TestUpdate(t *testing.T) { require.Equal(t, "testlxc-updated", props["hostname"], "hostname should have changed") // test if update has happened } + +func TestDelete(t *testing.T) { + ctx := context.Background() + plugin := &Plugin{} + + username, token, err := getCredentials() + if err != nil { + t.Skip(err) + } + + config, err := parseTargetConfig(testTargetConfig()) + if err != nil { + t.Skip(err) + } + + result, err := plugin.Delete(ctx, &resource.DeleteRequest{ + ResourceType: "PROXMOX::Service::LXC", + TargetConfig: testTargetConfig(), + NativeID: "200", + }) + + require.NoError(t, err, "Create should not return error") + require.NotNil(t, result.ProgressResult, "Create should return ProgressResult") + + require.Eventually(t, func() bool { + client := &http.Client{} + + var props StatusGeneralResponse + + request, err := http.NewRequest("GET", config.URL+"/api2/json/nodes/"+config.NODE+"/lxc", nil) + if err != nil { + t.Logf("Something unexpected happened") + return false + } + request.Header.Set("Authorization", "PVEAPIToken="+username+"="+token) + + resp, err := client.Do(request) + + data, err := io.ReadAll(resp.Body) + + json.Unmarshal(data, &props) + + for i := 0; i < len(props.Data); i++ { + lxccontainer := props.Data[i] + if lxccontainer.VMID == 200 { + return false + } + } + + return true + }, 10*time.Second, time.Second, "Create operation should complete successfully") +} diff --git a/types.go b/types.go index 5b64f57..91cf4ea 100644 --- a/types.go +++ b/types.go @@ -28,6 +28,12 @@ type UpdateRequest struct { TargetConfig json.RawMessage } +type DeleteRequest struct { + NativeID string + ResourceType string + TargetConfig json.RawMessage +} + type StatusLXCGeneral struct { Status string `json:"status"` NetIn int `json:"netin"`