From f6c23817a6e5304f9a7d35623a0788324d81f2ec Mon Sep 17 00:00:00 2001 From: Jian Qiu Date: Tue, 26 Dec 2023 20:43:37 +0800 Subject: [PATCH] fix: backport network avaialble addresses (#19112) Co-authored-by: Qiu Jian --- cmd/climc/shell/compute/networks.go | 1 + pkg/apis/compute/network.go | 8 ++++++++ pkg/compute/models/networks.go | 22 ++++++++++++++++++++++ 3 files changed, 31 insertions(+) diff --git a/cmd/climc/shell/compute/networks.go b/cmd/climc/shell/compute/networks.go index c389369ca3..f97b3be8f7 100644 --- a/cmd/climc/shell/compute/networks.go +++ b/cmd/climc/shell/compute/networks.go @@ -43,6 +43,7 @@ func init() { cmd.Get("change-owner-candidate-domains", &compute_options.NetworkIdOptions{}) cmd.Perform("set-class-metadata", &options.ResourceMetadataOptions{}) cmd.Perform("switch-wire", &compute_options.NetworkSwitchWireOptions{}) + cmd.Get("available-addresses", &compute_options.NetworkIdOptions{}) type NetworkShareOptions struct { ID string `help:"ID or Name of the zone to show"` diff --git a/pkg/apis/compute/network.go b/pkg/apis/compute/network.go index c761d24e78..1e54b6dd6a 100644 --- a/pkg/apis/compute/network.go +++ b/pkg/apis/compute/network.go @@ -425,6 +425,14 @@ type GetNetworkAddressesOutput struct { Addresses []SNetworkUsedAddress `json:"addresses"` } +type GetNetworkAvailableAddressesInput struct { +} + +type GetNetworkAvailableAddressesOutput struct { + // IP子网地址记录 + Addresses []string `json:"addresses"` +} + type NetworkSetBgpTypeInput struct { apis.Meta diff --git a/pkg/compute/models/networks.go b/pkg/compute/models/networks.go index 65b8fcef89..6932cf008c 100644 --- a/pkg/compute/models/networks.go +++ b/pkg/compute/models/networks.go @@ -2886,6 +2886,28 @@ func (network *SNetwork) GetDetailsAddresses(ctx context.Context, userCred mccli return output, nil } +func (network *SNetwork) GetDetailsAvailableAddresses( + ctx context.Context, + userCred mcclient.TokenCredential, + input api.GetNetworkAvailableAddressesInput, +) (api.GetNetworkAvailableAddressesOutput, error) { + var availables []string + addrTable := network.GetUsedAddresses() + recentUsedAddrTable := GuestnetworkManager.getRecentlyReleasedIPAddresses(network.Id, network.getAllocTimoutDuration()) + addrRange := network.getIPRange() + for addr := addrRange.StartIp(); addr <= addrRange.EndIp(); addr = addr.StepUp() { + addrStr := addr.String() + if _, ok := addrTable[addrStr]; !ok { + if _, ok := recentUsedAddrTable[addrStr]; !ok { + availables = append(availables, addrStr) + } + } + } + return api.GetNetworkAvailableAddressesOutput{ + Addresses: availables, + }, nil +} + // 同步接入云IP子网状态 // 本地IDC不支持此操作 func (net *SNetwork) PerformSyncstatus(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, input *api.NetworkSyncInput) (jsonutils.JSONObject, error) {