Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
163 changes: 6 additions & 157 deletions internal/cmd/network-area/create/create.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,23 +3,19 @@ package create
import (
"context"
"fmt"
"strings"

"github.com/stackitcloud/stackit-cli/internal/pkg/types"

iaas "github.com/stackitcloud/stackit-sdk-go/services/iaas/v2api"
wait "github.com/stackitcloud/stackit-sdk-go/services/iaas/v2api/wait"

"github.com/stackitcloud/stackit-cli/internal/pkg/args"
cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors"
"github.com/stackitcloud/stackit-cli/internal/pkg/examples"
"github.com/stackitcloud/stackit-cli/internal/pkg/flags"
"github.com/stackitcloud/stackit-cli/internal/pkg/globalflags"
"github.com/stackitcloud/stackit-cli/internal/pkg/print"
"github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/client"
rmClient "github.com/stackitcloud/stackit-cli/internal/pkg/services/resourcemanager/client"
rmUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/resourcemanager/utils"
"github.com/stackitcloud/stackit-cli/internal/pkg/spinner"
"github.com/stackitcloud/stackit-cli/internal/pkg/utils"

"github.com/spf13/cobra"
Expand All @@ -28,40 +24,14 @@ import (
const (
nameFlag = "name"
organizationIdFlag = "organization-id"
// Deprecated: dnsNameServersFlag is deprecated, because with iaas v2 the create endpoint for network area was separated, remove this after April 2026.
dnsNameServersFlag = "dns-name-servers"
// Deprecated: networkRangesFlag is deprecated, because with iaas v2 the create endpoint for network area was separated, remove this after April 2026.
networkRangesFlag = "network-ranges"
// Deprecated: transferNetworkFlag is deprecated, because with iaas v2 the create endpoint for network area was separated, remove this after April 2026.
transferNetworkFlag = "transfer-network"
// Deprecated: defaultPrefixLengthFlag is deprecated, because with iaas v2 the create endpoint for network area was separated, remove this after April 2026.
defaultPrefixLengthFlag = "default-prefix-length"
// Deprecated: maxPrefixLengthFlag is deprecated, because with iaas v2 the create endpoint for network area was separated, remove this after April 2026.
maxPrefixLengthFlag = "max-prefix-length"
// Deprecated: minPrefixLengthFlag is deprecated, because with iaas v2 the create endpoint for network area was separated, remove this after April 2026.
minPrefixLengthFlag = "min-prefix-length"
labelFlag = "labels"

deprecationMessage = "Deprecated and will be removed after April 2026. Use instead the new command `$ stackit network-area region` to configure these options for a network area."
labelFlag = "labels"
)

type inputModel struct {
*globalflags.GlobalFlagModel
Name string
OrganizationId string
// Deprecated: DnsNameServers is deprecated, because with iaas v2 the create endpoint for network area was separated, remove this after April 2026.
DnsNameServers *[]string
// Deprecated: NetworkRanges is deprecated, because with iaas v2 the create endpoint for network area was separated, remove this after April 2026.
NetworkRanges *[]string
// Deprecated: TransferNetwork is deprecated, because with iaas v2 the create endpoint for network area was separated, remove this after April 2026.
TransferNetwork *string
// Deprecated: DefaultPrefixLength is deprecated, because with iaas v2 the create endpoint for network area was separated, remove this after April 2026.
DefaultPrefixLength *int64
// Deprecated: MaxPrefixLength is deprecated, because with iaas v2 the create endpoint for network area was separated, remove this after April 2026.
MaxPrefixLength *int64
// Deprecated: MinPrefixLength is deprecated, because with iaas v2 the create endpoint for network area was separated, remove this after April 2026.
MinPrefixLength *int64
Labels map[string]any
Labels map[string]any
}

// NetworkAreaResponses is a workaround, to keep the two responses of the iaas v2 api together for the json and yaml output
Expand Down Expand Up @@ -134,29 +104,6 @@ func NewCmd(params *types.CmdParams) *cobra.Command {
NetworkArea: *resp,
}

if hasDeprecatedFlagsSet(model) {
deprecatedFlags := getConfiguredDeprecatedFlags(model)
params.Printer.Warn("the flags %q are deprecated and will be removed after April 2026. Use `$ stackit network-area region` to configure these options for a network area.\n", strings.Join(deprecatedFlags, ","))
if resp == nil || resp.Id == nil {
return fmt.Errorf("create network area: empty response")
}
reqNetworkArea := buildRequestNetworkAreaRegion(ctx, model, *resp.Id, apiClient)
respNetworkArea, err := reqNetworkArea.Execute()
if err != nil {
return fmt.Errorf("create network area region: %w", err)
}
if !model.Async {
err := spinner.Run(params.Printer, "Create network area region", func() error {
_, err = wait.CreateNetworkAreaRegionWaitHandler(ctx, apiClient.DefaultAPI, model.OrganizationId, *resp.Id, model.Region).WaitWithContext(ctx)
return err
})
if err != nil {
return fmt.Errorf("wait for creating network area region %w", err)
}
}
responses.RegionalArea = respNetworkArea
}

return outputResult(params.Printer, model.OutputFormat, orgLabel, responses)
},
}
Expand All @@ -168,78 +115,19 @@ func configureFlags(cmd *cobra.Command) {
cmd.Flags().StringP(nameFlag, "n", "", "Network area name")
cmd.Flags().Var(flags.UUIDFlag(), organizationIdFlag, "Organization ID")
cmd.Flags().StringToString(labelFlag, nil, "Labels are key-value string pairs which can be attached to a network-area. E.g. '--labels key1=value1,key2=value2,...'")
cmd.Flags().StringSlice(dnsNameServersFlag, nil, "List of DNS name server IPs")
cmd.Flags().Var(flags.CIDRSliceFlag(), networkRangesFlag, "List of network ranges")
cmd.Flags().Var(flags.CIDRFlag(), transferNetworkFlag, "Transfer network in CIDR notation")
cmd.Flags().Int64(defaultPrefixLengthFlag, 0, "The default prefix length for networks in the network area")
cmd.Flags().Int64(maxPrefixLengthFlag, 0, "The maximum prefix length for networks in the network area")
cmd.Flags().Int64(minPrefixLengthFlag, 0, "The minimum prefix length for networks in the network area")

cobra.CheckErr(cmd.Flags().MarkDeprecated(dnsNameServersFlag, deprecationMessage))
cobra.CheckErr(cmd.Flags().MarkDeprecated(networkRangesFlag, deprecationMessage))
cobra.CheckErr(cmd.Flags().MarkDeprecated(transferNetworkFlag, deprecationMessage))
cobra.CheckErr(cmd.Flags().MarkDeprecated(defaultPrefixLengthFlag, deprecationMessage))
cobra.CheckErr(cmd.Flags().MarkDeprecated(maxPrefixLengthFlag, deprecationMessage))
cobra.CheckErr(cmd.Flags().MarkDeprecated(minPrefixLengthFlag, deprecationMessage))

cmd.MarkFlagsRequiredTogether(networkRangesFlag, transferNetworkFlag)

err := flags.MarkFlagsRequired(cmd, nameFlag, organizationIdFlag)
cobra.CheckErr(err)
}

func hasDeprecatedFlagsSet(model *inputModel) bool {
deprecatedFlags := getConfiguredDeprecatedFlags(model)
return len(deprecatedFlags) > 0
}

func getConfiguredDeprecatedFlags(model *inputModel) []string {
var result []string
if model.DnsNameServers != nil {
result = append(result, dnsNameServersFlag)
}
if model.NetworkRanges != nil {
result = append(result, networkRangesFlag)
}
if model.TransferNetwork != nil {
result = append(result, transferNetworkFlag)
}
if model.DefaultPrefixLength != nil {
result = append(result, defaultPrefixLengthFlag)
}
if model.MaxPrefixLength != nil {
result = append(result, maxPrefixLengthFlag)
}
if model.MinPrefixLength != nil {
result = append(result, minPrefixLengthFlag)
}
return result
}

func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) {
globalFlags := globalflags.Parse(p, cmd)

model := inputModel{
GlobalFlagModel: globalFlags,
Name: flags.FlagToStringValue(p, cmd, nameFlag),
OrganizationId: flags.FlagToStringValue(p, cmd, organizationIdFlag),
DnsNameServers: flags.FlagToStringSlicePointer(p, cmd, dnsNameServersFlag),
NetworkRanges: flags.FlagToStringSlicePointer(p, cmd, networkRangesFlag),
TransferNetwork: flags.FlagToStringPointer(p, cmd, transferNetworkFlag),
DefaultPrefixLength: flags.FlagToInt64Pointer(p, cmd, defaultPrefixLengthFlag),
MaxPrefixLength: flags.FlagToInt64Pointer(p, cmd, maxPrefixLengthFlag),
MinPrefixLength: flags.FlagToInt64Pointer(p, cmd, minPrefixLengthFlag),
Labels: flags.FlagToStringToAny(p, cmd, labelFlag),
}

// Check if any of the deprecated **optional** fields are set and if no of the associated deprecated **required** fields is set.
hasAllRequiredRegionalAreaFieldsSet := model.NetworkRanges != nil && model.TransferNetwork != nil
hasOptionalRegionalAreaFieldsSet := model.DnsNameServers != nil || model.DefaultPrefixLength != nil || model.MaxPrefixLength != nil || model.MinPrefixLength != nil
if hasOptionalRegionalAreaFieldsSet && !hasAllRequiredRegionalAreaFieldsSet {
return nil, &cliErr.MultipleFlagsAreMissing{
MissingFlags: []string{networkRangesFlag, transferNetworkFlag},
SetFlags: []string{dnsNameServersFlag, defaultPrefixLengthFlag, minPrefixLengthFlag, maxPrefixLengthFlag},
}
GlobalFlagModel: globalFlags,
Name: flags.FlagToStringValue(p, cmd, nameFlag),
OrganizationId: flags.FlagToStringValue(p, cmd, organizationIdFlag),
Labels: flags.FlagToStringToAny(p, cmd, labelFlag),
}

p.DebugInputModel(model)
Expand All @@ -257,45 +145,6 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APICli
return req.CreateNetworkAreaPayload(payload)
}

func buildRequestNetworkAreaRegion(ctx context.Context, model *inputModel, networkAreaId string, apiClient *iaas.APIClient) iaas.ApiCreateNetworkAreaRegionRequest {
req := apiClient.DefaultAPI.CreateNetworkAreaRegion(ctx, model.OrganizationId, networkAreaId, model.Region)

var networkRanges []iaas.NetworkRange
if model.NetworkRanges != nil {
networkRanges = make([]iaas.NetworkRange, len(*model.NetworkRanges))
for i, networkRange := range *model.NetworkRanges {
networkRanges[i] = iaas.NetworkRange{
Prefix: networkRange,
}
}
}

ipv4 := &iaas.RegionalAreaIPv4{
NetworkRanges: networkRanges,
}
if model.DnsNameServers != nil {
ipv4.DefaultNameservers = *model.DnsNameServers
}
if model.TransferNetwork != nil {
ipv4.TransferNetwork = *model.TransferNetwork
}
if model.DefaultPrefixLength != nil {
ipv4.DefaultPrefixLen = *model.DefaultPrefixLength
}
if model.MaxPrefixLength != nil {
ipv4.MaxPrefixLen = *model.MaxPrefixLength
}
if model.MinPrefixLength != nil {
ipv4.MinPrefixLen = *model.MinPrefixLength
}

payload := iaas.CreateNetworkAreaRegionPayload{
Ipv4: ipv4,
}

return req.CreateNetworkAreaRegionPayload(payload)
}

func outputResult(p *print.Printer, outputFormat, orgLabel string, responses *NetworkAreaResponses) error {
if responses == nil {
return fmt.Errorf("network area is nil")
Expand Down
Loading
Loading