diff --git a/driver/compute.go b/driver/compute.go index e604cdd..694cc6a 100644 --- a/driver/compute.go +++ b/driver/compute.go @@ -10,6 +10,7 @@ import ( "github.com/opentelekomcloud/docker-machine-opentelekomcloud/driver/ssh" golangsdk "github.com/opentelekomcloud/gophertelekomcloud" "github.com/opentelekomcloud/gophertelekomcloud/openstack/ecs/v1/cloudservers" + "github.com/opentelekomcloud/gophertelekomcloud/openstack/networking/v1/eips" ) func (d *Driver) initCompute() error { @@ -172,6 +173,11 @@ func (d *Driver) deleteInstance() error { if err != nil { return fmt.Errorf("failed to get ECS security groups: %s", err) } + elasticIP, err := d.client.GetServerEIP(d.InstanceID) + if err != nil { + return fmt.Errorf("failed to get ECS elastic ip: %s", err) + } + if err := d.client.DeleteInstance(d.InstanceID); err != nil { return fmt.Errorf("failed to delete instance: %s", logHTTP500(err)) } @@ -191,5 +197,13 @@ func (d *Driver) deleteInstance() error { } } } + if d.ElasticIP.DriverManaged && elasticIP != "" { + if err := d.client.ReleaseEIP(eips.ListOpts{ + PublicAddress: elasticIP, + }); err != nil { + return fmt.Errorf("failed to delete floating IP: %s", logHTTP500(err)) + } + d.ElasticIP.Value = "" + } return nil } diff --git a/driver/opentelekomcloud.go b/driver/opentelekomcloud.go index 8c314b3..8ced6a8 100644 --- a/driver/opentelekomcloud.go +++ b/driver/opentelekomcloud.go @@ -213,35 +213,35 @@ func (d *Driver) Stop() error { // Remove the server func (d *Driver) Remove() error { - var errs error + mErr := &multierror.Error{} if err := d.Authenticate(); err != nil { return err } if err := d.deleteInstance(); err != nil { - errs = multierror.Append(errs, err) + mErr = multierror.Append(mErr, err) } if d.KeyPairName.DriverManaged { if err := d.client.DeleteKeyPair(d.KeyPairName.Value); err != nil { - errs = multierror.Append(errs, fmt.Errorf("failed to delete key pair: %s", logHTTP500(err))) + mErr = multierror.Append(mErr, fmt.Errorf("failed to delete key pair: %s", logHTTP500(err))) } } if d.ElasticIP.DriverManaged && d.ElasticIP.Value != "" { if err := d.client.ReleaseEIP(eips.ListOpts{ PublicAddress: d.ElasticIP.Value, }); err != nil { - errs = multierror.Append(errs, fmt.Errorf("failed to delete floating IP: %s", logHTTP500(err))) + mErr = multierror.Append(mErr, fmt.Errorf("failed to delete floating IP: %s", logHTTP500(err))) } } if err := d.deleteSubnet(); err != nil { - errs = multierror.Append(errs, err) + mErr = multierror.Append(mErr, err) } if err := d.deleteSecGroups(); err != nil { - errs = multierror.Append(errs, err) + mErr = multierror.Append(mErr, err) } if err := d.deleteVPC(); err != nil { - errs = multierror.Append(errs, err) + mErr = multierror.Append(mErr, err) } - return errs + return mErr.ErrorOrNil() } // Restart the server diff --git a/driver/services/compute.go b/driver/services/compute.go index 8f7e313..6df8914 100644 --- a/driver/services/compute.go +++ b/driver/services/compute.go @@ -481,3 +481,21 @@ func (c *Client) CreateServerGroup(opts *servergroups.CreateOpts) (*servergroups func (c *Client) DeleteServerGroup(id string) error { return servergroups.Delete(c.ComputeV2, id).Err } + +// GetServerEIP - get floating ip by instance ID +func (c *Client) GetServerEIP(id string) (string, error) { + server, err := servers.Get(c.ComputeV2, id).Extract() + if err != nil { + return "", err + } + floatingIp := "" + for _, ips := range server.Addresses { + for _, ip := range ips.([]interface{}) { + address := ip.(map[string]interface{}) + if address["OS-EXT-IPS:type"] == "floating" { + floatingIp = address["addr"].(string) + } + } + } + return floatingIp, nil +}