diff --git a/openstack/cce/v3/clusters/requests.go b/openstack/cce/v3/clusters/requests.go index d6c509578..dfd9e965b 100644 --- a/openstack/cce/v3/clusters/requests.go +++ b/openstack/cce/v3/clusters/requests.go @@ -191,6 +191,44 @@ func Update(c *golangsdk.ServiceClient, id string, opts UpdateOptsBuilder) (r Up return } +type DeleteOpts struct { + ErrorStatus string `q:"errorStatus"` + DeleteEfs string `q:"delete_efs"` + DeleteENI string `q:"delete_eni"` + DeleteEvs string `q:"delete_evs"` + DeleteNet string `q:"delete_net"` + DeleteObs string `q:"delete_obs"` + DeleteSfs string `q:"delete_sfs"` +} + +type DeleteOptsBuilder interface { + ToDeleteQuery() (string, error) +} + +func (opts DeleteOpts) ToDeleteQuery() (string, error) { + q, err := golangsdk.BuildQueryString(opts) + return q.String(), err +} + +// DeleteWithOpts will permanently delete a particular cluster based on its unique ID, +// and can delete associated resources based on DeleteOpts. +func DeleteWithOpts(c *golangsdk.ServiceClient, id string, opts DeleteOptsBuilder) (r DeleteResult) { + url := resourceURL(c, id) + if opts != nil { + var query string + query, r.Err = opts.ToDeleteQuery() + if r.Err != nil { + return + } + url += query + } + _, r.Err = c.Delete(url, &golangsdk.RequestOpts{ + OkCodes: []int{200}, + MoreHeaders: RequestOpts.MoreHeaders, JSONBody: nil, + }) + return +} + // Delete will permanently delete a particular cluster based on its unique ID. func Delete(c *golangsdk.ServiceClient, id string) (r DeleteResult) { _, r.Err = c.Delete(resourceURL(c, id), &golangsdk.RequestOpts{ diff --git a/openstack/cce/v3/clusters/testing/requests_test.go b/openstack/cce/v3/clusters/testing/requests_test.go index cbc44f96b..2c3b3aa23 100644 --- a/openstack/cce/v3/clusters/testing/requests_test.go +++ b/openstack/cce/v3/clusters/testing/requests_test.go @@ -208,3 +208,24 @@ func TestDeleteV3Cluster(t *testing.T) { th.AssertNoErr(t, err) } + +func TestDeleteWithOptsV3Cluster(t *testing.T) { + th.SetupHTTP() + defer th.TeardownHTTP() + + th.Mux.HandleFunc("/api/v3/projects/c59fd21fd2a94963b822d8985b884673/clusters/daa97872-59d7-11e8-a787-0255ac101f54", func(w http.ResponseWriter, r *http.Request) { + th.TestMethod(t, r, "DELETE") + th.TestHeader(t, r, "X-Auth-Token", fake.TokenID) + w.WriteHeader(http.StatusOK) + }) + options := clusters.DeleteOpts{ + DeleteEfs: "true", + DeleteENI: "true", + DeleteEvs: "true", + DeleteNet: "true", + DeleteObs: "true", + DeleteSfs: "true", + } + err := clusters.DeleteWithOpts(fake.ServiceClient(), "daa97872-59d7-11e8-a787-0255ac101f54", options).ExtractErr() + th.AssertNoErr(t, err) +}