From 41820a8d4ded2b8f652016b637f84ab34811f905 Mon Sep 17 00:00:00 2001 From: Qu Xuan Date: Sat, 4 Jan 2020 18:18:08 +0800 Subject: [PATCH] fix: openstack eip dissociate optimized --- pkg/compute/models/elasticips.go | 12 ++++++++++++ pkg/compute/models/guest_actions.go | 12 ++++++++++++ pkg/multicloud/openstack/eip.go | 13 ++++++++++++- pkg/multicloud/openstack/port.go | 9 +++++++++ pkg/multicloud/openstack/shell/port.go | 13 +++++++++++++ 5 files changed, 58 insertions(+), 1 deletion(-) diff --git a/pkg/compute/models/elasticips.go b/pkg/compute/models/elasticips.go index 09e128d44e..0669dfd8e5 100644 --- a/pkg/compute/models/elasticips.go +++ b/pkg/compute/models/elasticips.go @@ -875,6 +875,18 @@ func (self *SElasticip) PerformAssociate(ctx context.Context, userCred mcclient. return nil, httperrors.NewInvalidStatusError("cannot associate server in status %s", server.Status) } + if len(self.NetworkId) > 0 { + gns, err := server.GetNetworks("") + if err != nil { + return nil, httperrors.NewGeneralError(errors.Wrap(err, "GetNetworks")) + } + for _, gn := range gns { + if gn.NetworkId == self.NetworkId { + return nil, httperrors.NewInputParameterError("cannot associate eip with same network") + } + } + } + serverRegion := server.getRegion() if serverRegion == nil { return nil, httperrors.NewInputParameterError("server region is not found???") diff --git a/pkg/compute/models/guest_actions.go b/pkg/compute/models/guest_actions.go index 96e66747b1..c69a880f73 100644 --- a/pkg/compute/models/guest_actions.go +++ b/pkg/compute/models/guest_actions.go @@ -2808,6 +2808,18 @@ func (self *SGuest) PerformAssociateEip(ctx context.Context, userCred mcclient.T return nil, httperrors.NewInputParameterError("cannot associate eip and instance in different region") } + if len(eip.NetworkId) > 0 { + gns, err := self.GetNetworks("") + if err != nil { + return nil, httperrors.NewGeneralError(errors.Wrap(err, "GetNetworks")) + } + for _, gn := range gns { + if gn.NetworkId == eip.NetworkId { + return nil, httperrors.NewInputParameterError("cannot associate eip with same network") + } + } + } + eipZone := eip.GetZone() if eipZone != nil { insZone := self.getZone() diff --git a/pkg/multicloud/openstack/eip.go b/pkg/multicloud/openstack/eip.go index 20c24399bd..2ca482d217 100644 --- a/pkg/multicloud/openstack/eip.go +++ b/pkg/multicloud/openstack/eip.go @@ -179,7 +179,18 @@ func (eip *SEipAddress) GetAssociationType() string { } func (eip *SEipAddress) GetAssociationExternalId() string { - return eip.PortDetails.DeviceId + if len(eip.PortDetails.DeviceId) > 0 { + return eip.PortDetails.DeviceId + } + if len(eip.PortId) > 0 { + port, err := eip.region.GetPort(eip.PortId) + if err != nil { + log.Errorf("failed to get eip port %s info", port.DeviceID) + return "" + } + return port.DeviceID + } + return "" } func (eip *SEipAddress) GetBillingType() string { diff --git a/pkg/multicloud/openstack/port.go b/pkg/multicloud/openstack/port.go index e260e18619..222ddff47a 100644 --- a/pkg/multicloud/openstack/port.go +++ b/pkg/multicloud/openstack/port.go @@ -161,6 +161,15 @@ func (region *SRegion) GetINetworkInterfaces() ([]cloudprovider.ICloudNetworkInt return ret, nil } +func (region *SRegion) GetPort(portId string) (*SPort, error) { + _, resp, err := region.Get("network", "/v2.0/ports/"+portId, "", nil) + if err != nil { + return nil, err + } + port := &SPort{} + return port, resp.Unmarshal(port, "port") +} + func (region *SRegion) GetPorts(macAddress string) ([]SPort, error) { base := fmt.Sprintf("/v2.0/ports") params := url.Values{} diff --git a/pkg/multicloud/openstack/shell/port.go b/pkg/multicloud/openstack/shell/port.go index 889b239d57..ab6123c53a 100644 --- a/pkg/multicloud/openstack/shell/port.go +++ b/pkg/multicloud/openstack/shell/port.go @@ -32,4 +32,17 @@ func init() { return nil }) + type PortIdOptions struct { + ID string + } + + shellutils.R(&PortIdOptions{}, "port-show", "Show port", func(cli *openstack.SRegion, args *PortIdOptions) error { + port, err := cli.GetPort(args.ID) + if err != nil { + return err + } + printObject(port) + return nil + }) + }