Skip to content

Commit 726240d

Browse files
fix deletion of precreated security groups (#76)
fix deletion of precreated security groups Sometimes security groups was still there after machine deletion Reviewed-by: Artem Lifshits
1 parent d82aa6e commit 726240d

File tree

6 files changed

+51
-16
lines changed

6 files changed

+51
-16
lines changed

driver/compute.go

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -168,14 +168,28 @@ func (d *Driver) deleteInstance() error {
168168
if err := d.initComputeV2(); err != nil {
169169
return err
170170
}
171+
sGroups, err := d.client.GetInstanceSG(d.InstanceID)
172+
if err != nil {
173+
return fmt.Errorf("failed to get ECS security groups: %s", err)
174+
}
171175
if err := d.client.DeleteInstance(d.InstanceID); err != nil {
172176
return fmt.Errorf("failed to delete instance: %s", logHTTP500(err))
173177
}
174-
err := d.client.WaitForInstanceStatus(d.InstanceID, "")
178+
err = d.client.WaitForInstanceStatus(d.InstanceID, "")
175179
switch err.(type) {
176180
case golangsdk.ErrDefault404:
177181
default:
178182
return fmt.Errorf("failed to wait for instance status after deletion: %s", logHTTP500(err))
179183
}
184+
for _, group := range sGroups {
185+
if group.Description == services.DefaultSecurityGroupDescription {
186+
if err := d.client.DeleteSecurityGroup(group.ID); err != nil {
187+
return fmt.Errorf("failed to delete security group: %s", logHTTP500(err))
188+
}
189+
if err := d.client.WaitForGroupDeleted(group.ID); err != nil {
190+
return fmt.Errorf("failed to wait for security group status after deletion: %s", logHTTP500(err))
191+
}
192+
}
193+
}
180194
return nil
181195
}

driver/network.go

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package opentelekomcloud
33
import (
44
"fmt"
55

6+
"github.com/hashicorp/go-multierror"
67
"github.com/opentelekomcloud/docker-machine-opentelekomcloud/driver/services"
78
golangsdk "github.com/opentelekomcloud/gophertelekomcloud"
89
)
@@ -148,18 +149,21 @@ func (d *Driver) deleteSubnet() error {
148149
}
149150

150151
func (d *Driver) deleteSecGroups() error {
152+
mErr := &multierror.Error{}
151153
if err := d.initComputeV2(); err != nil {
152154
return err
153155
}
154156
id := d.ManagedSecurityGroupID
155157
if id == "" {
156158
return nil
157159
}
158-
if err := d.client.DeleteSecurityGroup(id); err != nil {
159-
return fmt.Errorf("failed to delete security group: %s", logHTTP500(err))
160-
}
161-
if err := d.client.WaitForGroupDeleted(id); err != nil {
162-
return fmt.Errorf("failed to wait for security group status after deletion: %s", logHTTP500(err))
160+
if d.client.SecurityGroupExist(id) {
161+
if err := d.client.DeleteSecurityGroup(id); err != nil {
162+
mErr = multierror.Append(mErr, logHTTP500(err))
163+
}
164+
if err := d.client.WaitForGroupDeleted(id); err != nil {
165+
mErr = multierror.Append(mErr, logHTTP500(err))
166+
}
163167
}
164-
return nil
168+
return mErr.ErrorOrNil()
165169
}

driver/opentelekomcloud_test.go

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -238,9 +238,6 @@ func TestDriver_CreateWithExistingSecGroups(t *testing.T) {
238238
newSG := utils.RandomString(10, "nsg-")
239239
sg, err := preDriver.client.CreateSecurityGroup(newSG, services.PortRange{From: 24})
240240
assert.NoError(t, err)
241-
defer func() {
242-
assert.NoError(t, preDriver.client.DeleteSecurityGroup(sg.ID))
243-
}()
244241

245242
driver, err := newDriverFromFlags(
246243
map[string]interface{}{

driver/services/compute.go

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,9 @@ import (
2121

2222
// Instance statuses
2323
const (
24-
InstanceStatusStopped = "SHUTOFF"
25-
InstanceStatusRunning = "ACTIVE"
24+
InstanceStatusStopped = "SHUTOFF"
25+
InstanceStatusRunning = "ACTIVE"
26+
DefaultSecurityGroupDescription = "Automatically created by docker-machine for OTC"
2627
)
2728

2829
// InitCompute initializes Compute v2 service
@@ -141,6 +142,19 @@ func (c *Client) DeleteInstance(instanceID string) error {
141142
return servers.Delete(c.ComputeV2, instanceID).Err
142143
}
143144

145+
// GetInstanceSG get details of ECS instance security groups
146+
func (c *Client) GetInstanceSG(instanceID string) ([]secgroups.SecurityGroup, error) {
147+
allPages, err := secgroups.ListByServer(c.ComputeV2, instanceID).AllPages()
148+
if err != nil {
149+
return nil, err
150+
}
151+
securityGroups, err := secgroups.ExtractSecurityGroups(allPages)
152+
if err != nil {
153+
return nil, err
154+
}
155+
return securityGroups, nil
156+
}
157+
144158
// FindInstance returns instance ID by instance Name
145159
func (c *Client) FindInstance(name string) (string, error) {
146160
listOpts := servers.ListOpts{Name: name}
@@ -306,7 +320,7 @@ type PortRange struct {
306320
func (c *Client) CreateSecurityGroup(securityGroupName string, ports ...PortRange) (*secgroups.SecurityGroup, error) {
307321
opts := secgroups.CreateOpts{
308322
Name: securityGroupName,
309-
Description: "Automatically created by docker-machine for OTC",
323+
Description: DefaultSecurityGroupDescription,
310324
}
311325
sg, err := secgroups.Create(c.ComputeV2, opts).Extract()
312326
if err != nil {
@@ -364,6 +378,12 @@ func (c *Client) FindSecurityGroups(secGroups []string) ([]string, error) {
364378
return secGroupIDs, nil
365379
}
366380

381+
// SecurityGroupExist check if security group still exist
382+
func (c *Client) SecurityGroupExist(id string) bool {
383+
err := secgroups.Get(c.ComputeV2, id).Err
384+
return err == nil
385+
}
386+
367387
// DeleteSecurityGroup deletes managed security group
368388
func (c *Client) DeleteSecurityGroup(securityGroupID string) error {
369389
return secgroups.Delete(c.ComputeV2, securityGroupID).Err

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ go 1.14
44

55
require (
66
github.com/apparentlymart/go-cidr v1.1.0
7-
github.com/docker/docker v20.10.24+incompatible // indirect
7+
github.com/docker/docker v20.10.27+incompatible // indirect
88
github.com/docker/machine v0.16.2
99
github.com/getlantern/deepcopy v0.0.0-20160317154340-7f45deb8130a
1010
github.com/hashicorp/go-multierror v1.1.0

go.sum

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@ github.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ
77
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
88
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
99
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
10-
github.com/docker/docker v20.10.24+incompatible h1:Ugvxm7a8+Gz6vqQYQQ2W7GYq5EUPaAiuPgIfVyI3dYE=
11-
github.com/docker/docker v20.10.24+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=
10+
github.com/docker/docker v20.10.27+incompatible h1:Id/ZooynV4ZlD6xX20RCd3SR0Ikn7r4QZDa2ECK2TgA=
11+
github.com/docker/docker v20.10.27+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=
1212
github.com/docker/machine v0.16.2 h1:jyF9k3Zg+oIGxxSdYKPScyj3HqFZ6FjgA/3sblcASiU=
1313
github.com/docker/machine v0.16.2/go.mod h1:I8mPNDeK1uH+JTcUU7X0ZW8KiYz0jyAgNaeSJ1rCfDI=
1414
github.com/getlantern/deepcopy v0.0.0-20160317154340-7f45deb8130a h1:yU/FENpkHYISWsQrbr3pcZOBj0EuRjPzNc1+dTCLu44=

0 commit comments

Comments
 (0)