Skip to content

Commit 6db6f73

Browse files
elastic ip release fix (#77)
elastic ip release fix Reviewed-by: Sergei Martynov Reviewed-by: Artem Lifshits
1 parent 726240d commit 6db6f73

File tree

3 files changed

+40
-8
lines changed

3 files changed

+40
-8
lines changed

driver/compute.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import (
1010
"github.com/opentelekomcloud/docker-machine-opentelekomcloud/driver/ssh"
1111
golangsdk "github.com/opentelekomcloud/gophertelekomcloud"
1212
"github.com/opentelekomcloud/gophertelekomcloud/openstack/ecs/v1/cloudservers"
13+
"github.com/opentelekomcloud/gophertelekomcloud/openstack/networking/v1/eips"
1314
)
1415

1516
func (d *Driver) initCompute() error {
@@ -172,6 +173,11 @@ func (d *Driver) deleteInstance() error {
172173
if err != nil {
173174
return fmt.Errorf("failed to get ECS security groups: %s", err)
174175
}
176+
elasticIP, err := d.client.GetServerEIP(d.InstanceID)
177+
if err != nil {
178+
return fmt.Errorf("failed to get ECS elastic ip: %s", err)
179+
}
180+
175181
if err := d.client.DeleteInstance(d.InstanceID); err != nil {
176182
return fmt.Errorf("failed to delete instance: %s", logHTTP500(err))
177183
}
@@ -191,5 +197,13 @@ func (d *Driver) deleteInstance() error {
191197
}
192198
}
193199
}
200+
if d.ElasticIP.DriverManaged && elasticIP != "" {
201+
if err := d.client.ReleaseEIP(eips.ListOpts{
202+
PublicAddress: elasticIP,
203+
}); err != nil {
204+
return fmt.Errorf("failed to delete floating IP: %s", logHTTP500(err))
205+
}
206+
d.ElasticIP.Value = ""
207+
}
194208
return nil
195209
}

driver/opentelekomcloud.go

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -213,35 +213,35 @@ func (d *Driver) Stop() error {
213213

214214
// Remove the server
215215
func (d *Driver) Remove() error {
216-
var errs error
216+
mErr := &multierror.Error{}
217217
if err := d.Authenticate(); err != nil {
218218
return err
219219
}
220220
if err := d.deleteInstance(); err != nil {
221-
errs = multierror.Append(errs, err)
221+
mErr = multierror.Append(mErr, err)
222222
}
223223
if d.KeyPairName.DriverManaged {
224224
if err := d.client.DeleteKeyPair(d.KeyPairName.Value); err != nil {
225-
errs = multierror.Append(errs, fmt.Errorf("failed to delete key pair: %s", logHTTP500(err)))
225+
mErr = multierror.Append(mErr, fmt.Errorf("failed to delete key pair: %s", logHTTP500(err)))
226226
}
227227
}
228228
if d.ElasticIP.DriverManaged && d.ElasticIP.Value != "" {
229229
if err := d.client.ReleaseEIP(eips.ListOpts{
230230
PublicAddress: d.ElasticIP.Value,
231231
}); err != nil {
232-
errs = multierror.Append(errs, fmt.Errorf("failed to delete floating IP: %s", logHTTP500(err)))
232+
mErr = multierror.Append(mErr, fmt.Errorf("failed to delete floating IP: %s", logHTTP500(err)))
233233
}
234234
}
235235
if err := d.deleteSubnet(); err != nil {
236-
errs = multierror.Append(errs, err)
236+
mErr = multierror.Append(mErr, err)
237237
}
238238
if err := d.deleteSecGroups(); err != nil {
239-
errs = multierror.Append(errs, err)
239+
mErr = multierror.Append(mErr, err)
240240
}
241241
if err := d.deleteVPC(); err != nil {
242-
errs = multierror.Append(errs, err)
242+
mErr = multierror.Append(mErr, err)
243243
}
244-
return errs
244+
return mErr.ErrorOrNil()
245245
}
246246

247247
// Restart the server

driver/services/compute.go

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -481,3 +481,21 @@ func (c *Client) CreateServerGroup(opts *servergroups.CreateOpts) (*servergroups
481481
func (c *Client) DeleteServerGroup(id string) error {
482482
return servergroups.Delete(c.ComputeV2, id).Err
483483
}
484+
485+
// GetServerEIP - get floating ip by instance ID
486+
func (c *Client) GetServerEIP(id string) (string, error) {
487+
server, err := servers.Get(c.ComputeV2, id).Extract()
488+
if err != nil {
489+
return "", err
490+
}
491+
floatingIp := ""
492+
for _, ips := range server.Addresses {
493+
for _, ip := range ips.([]interface{}) {
494+
address := ip.(map[string]interface{})
495+
if address["OS-EXT-IPS:type"] == "floating" {
496+
floatingIp = address["addr"].(string)
497+
}
498+
}
499+
}
500+
return floatingIp, nil
501+
}

0 commit comments

Comments
 (0)