Skip to content

Fix/network area and network missing label selector #627

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 3 commits into from
Feb 24, 2025
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
4 changes: 4 additions & 0 deletions docs/stackit_beta_network-area_create.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,9 @@ stackit beta network-area create [flags]

Create a network area with name "network-area-3" in organization with ID "xxx" with network ranges, transfer network and additional options
$ stackit beta network-area create --name network-area-3 --organization-id xxx --network-ranges "1.1.1.0/24,192.123.1.0/24" --transfer-network "192.160.0.0/24" --default-prefix-length 25 --max-prefix-length 29 --min-prefix-length 24

Create a network area with name "network-area-1" in organization with ID "xxx" with network ranges and a transfer network and labels "key=value,key1=value1"
$ stackit beta network-area create --name network-area-1 --organization-id xxx --network-ranges "1.1.1.0/24,192.123.1.0/24" --transfer-network "192.160.0.0/24" --labels key=value,key1=value1
```

### Options
Expand All @@ -29,6 +32,7 @@ stackit beta network-area create [flags]
--default-prefix-length int The default prefix length for networks in the network area
--dns-name-servers strings List of DNS name server IPs
-h, --help Help for "stackit beta network-area create"
--labels stringToString Labels are key-value string pairs which can be attached to a network-area. E.g. '--labels key1=value1,key2=value2,...' (default [])
--max-prefix-length int The maximum prefix length for networks in the network area
--min-prefix-length int The minimum prefix length for networks in the network area
-n, --name string Network area name
Expand Down
4 changes: 4 additions & 0 deletions docs/stackit_beta_network-area_list.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,12 +21,16 @@ stackit beta network-area list [flags]

Lists up to 10 network areas of organization "xxx"
$ stackit beta network-area list --organization-id xxx --limit 10

Lists all network areas of organization "xxx" which contains the label yyy
$ stackit beta network-area list --organization-id xxx --label-selector yyy
```

### Options

```
-h, --help Help for "stackit beta network-area list"
--label-selector string Filter by label
--limit int Maximum number of entries to list
--organization-id string Organization ID
```
Expand Down
1 change: 1 addition & 0 deletions docs/stackit_beta_network-area_update.md
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ stackit beta network-area update AREA_ID [flags]
--default-prefix-length int The default prefix length for networks in the network area
--dns-name-servers strings List of DNS name server IPs
-h, --help Help for "stackit beta network-area update"
--labels stringToString Labels are key-value string pairs which can be attached to a network-area. E.g. '--labels key1=value1,key2=value2,...' (default [])
--max-prefix-length int The maximum prefix length for networks in the network area
--min-prefix-length int The minimum prefix length for networks in the network area
-n, --name string Network area name
Expand Down
4 changes: 4 additions & 0 deletions docs/stackit_beta_network_create.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,9 @@ stackit beta network create [flags]
Create a network with name "network-1" and no gateway
$ stackit beta network create --name network-1 --no-ipv4-gateway

Create a network with name "network-1" and labels "key=value,key1=value1"
$ stackit beta network create --name network-1 --labels key=value,key1=value1

Create an IPv4 network with name "network-1" with DNS name servers, a prefix and a gateway
$ stackit beta network create --name network-1 --ipv4-dns-name-servers "1.1.1.1,8.8.8.8,9.9.9.9" --ipv4-prefix "10.1.2.0/24" --ipv4-gateway "10.1.2.3"

Expand All @@ -41,6 +44,7 @@ stackit beta network create [flags]
--ipv6-gateway string The IPv6 gateway of a network. If not specified, the first IP of the network will be assigned as the gateway
--ipv6-prefix string The IPv6 prefix of the network (CIDR)
--ipv6-prefix-length int The prefix length of the IPv6 network
--labels stringToString Labels are key-value string pairs which can be attached to a network. E.g. '--labels key1=value1,key2=value2,...' (default [])
-n, --name string Network name
--no-ipv4-gateway If set to true, the network doesn't have an IPv4 gateway
--no-ipv6-gateway If set to true, the network doesn't have an IPv6 gateway
Expand Down
8 changes: 6 additions & 2 deletions docs/stackit_beta_network_list.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,13 +21,17 @@ stackit beta network list [flags]

Lists up to 10 networks
$ stackit beta network list --limit 10

Lists all networks which contains the label xxx
$ tackit beta network list --label-selector xxx
```

### Options

```
-h, --help Help for "stackit beta network list"
--limit int Maximum number of entries to list
-h, --help Help for "stackit beta network list"
--label-selector string Filter by label
--limit int Maximum number of entries to list
```

### Options inherited from parent commands
Expand Down
1 change: 1 addition & 0 deletions docs/stackit_beta_network_update.md
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ stackit beta network update NETWORK_ID [flags]
--ipv4-gateway string The IPv4 gateway of a network. If not specified, the first IP of the network will be assigned as the gateway
--ipv6-dns-name-servers strings List of DNS name servers for IPv6. Nameservers cannot be defined for routed networks
--ipv6-gateway string The IPv6 gateway of a network. If not specified, the first IP of the network will be assigned as the gateway
--labels stringToString Labels are key-value string pairs which can be attached to a network. E.g. '--labels key1=value1,key2=value2,...' (default [])
-n, --name string Network name
--no-ipv4-gateway If set to true, the network doesn't have an IPv4 gateway
--no-ipv6-gateway If set to true, the network doesn't have an IPv6 gateway
Expand Down
20 changes: 19 additions & 1 deletion internal/cmd/beta/network-area/create/create.go
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ const (
defaultPrefixLengthFlag = "default-prefix-length"
maxPrefixLengthFlag = "max-prefix-length"
minPrefixLengthFlag = "min-prefix-length"
labelFlag = "labels"
)

type inputModel struct {
Expand All @@ -41,6 +42,7 @@ type inputModel struct {
DefaultPrefixLength *int64
MaxPrefixLength *int64
MinPrefixLength *int64
Labels *map[string]string
}

func NewCmd(p *print.Printer) *cobra.Command {
Expand All @@ -62,6 +64,10 @@ func NewCmd(p *print.Printer) *cobra.Command {
`Create a network area with name "network-area-3" in organization with ID "xxx" with network ranges, transfer network and additional options`,
`$ stackit beta network-area create --name network-area-3 --organization-id xxx --network-ranges "1.1.1.0/24,192.123.1.0/24" --transfer-network "192.160.0.0/24" --default-prefix-length 25 --max-prefix-length 29 --min-prefix-length 24`,
),
examples.NewExample(
`Create a network area with name "network-area-1" in organization with ID "xxx" with network ranges and a transfer network and labels "key=value,key1=value1"`,
`$ stackit beta network-area create --name network-area-1 --organization-id xxx --network-ranges "1.1.1.0/24,192.123.1.0/24" --transfer-network "192.160.0.0/24" --labels key=value,key1=value1`,
),
),
RunE: func(cmd *cobra.Command, _ []string) error {
ctx := context.Background()
Expand Down Expand Up @@ -119,6 +125,7 @@ func configureFlags(cmd *cobra.Command) {
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")
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,...'")

err := flags.MarkFlagsRequired(cmd, nameFlag, organizationIdFlag, networkRangesFlag, transferNetworkFlag)
cobra.CheckErr(err)
Expand All @@ -137,6 +144,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) {
DefaultPrefixLength: flags.FlagToInt64Pointer(p, cmd, defaultPrefixLengthFlag),
MaxPrefixLength: flags.FlagToInt64Pointer(p, cmd, maxPrefixLengthFlag),
MinPrefixLength: flags.FlagToInt64Pointer(p, cmd, minPrefixLengthFlag),
Labels: flags.FlagToStringToStringPointer(p, cmd, labelFlag),
}

if p.IsVerbosityDebug() {
Expand All @@ -161,8 +169,18 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APICli
}
}

var labelsMap *map[string]interface{}
if model.Labels != nil && len(*model.Labels) > 0 {
// convert map[string]string to map[string]interface{}
labelsMap = utils.Ptr(map[string]interface{}{})
for k, v := range *model.Labels {
(*labelsMap)[k] = v
}
}

payload := iaas.CreateNetworkAreaPayload{
Name: model.Name,
Name: model.Name,
Labels: labelsMap,
AddressFamily: &iaas.CreateAreaAddressFamily{
Ipv4: &iaas.CreateAreaIPv4{
DefaultNameservers: model.DnsNameServers,
Expand Down
17 changes: 17 additions & 0 deletions internal/cmd/beta/network-area/create/create_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]st
defaultPrefixLengthFlag: "24",
maxPrefixLengthFlag: "24",
minPrefixLengthFlag: "24",
labelFlag: "key=value",
}
for _, mod := range mods {
mod(flagValues)
Expand All @@ -51,6 +52,9 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel {
DefaultPrefixLength: utils.Ptr(int64(24)),
MaxPrefixLength: utils.Ptr(int64(24)),
MinPrefixLength: utils.Ptr(int64(24)),
Labels: utils.Ptr(map[string]string{
"key": "value",
}),
}
for _, mod := range mods {
mod(model)
Expand All @@ -70,6 +74,9 @@ func fixtureRequest(mods ...func(request *iaas.ApiCreateNetworkAreaRequest)) iaa
func fixturePayload(mods ...func(payload *iaas.CreateNetworkAreaPayload)) iaas.CreateNetworkAreaPayload {
payload := iaas.CreateNetworkAreaPayload{
Name: utils.Ptr("example-network-area-name"),
Labels: utils.Ptr(map[string]interface{}{
"key": "value",
}),
AddressFamily: &iaas.CreateAreaAddressFamily{
Ipv4: &iaas.CreateAreaIPv4{
DefaultNameservers: utils.Ptr([]string{"1.1.1.0", "1.1.2.0"}),
Expand Down Expand Up @@ -171,6 +178,16 @@ func TestParseInput(t *testing.T) {
}),
isValid: false,
},
{
description: "labels missing",
flagValues: fixtureFlagValues(func(flagValues map[string]string) {
delete(flagValues, labelFlag)
}),
expectedModel: fixtureInputModel(func(model *inputModel) {
model.Labels = nil
}),
isValid: true,
},
}

for _, tt := range tests {
Expand Down
8 changes: 8 additions & 0 deletions internal/cmd/beta/network-area/describe/describe.go
Original file line number Diff line number Diff line change
Expand Up @@ -196,6 +196,14 @@ func outputResult(p *print.Printer, outputFormat string, networkArea *iaas.Netwo
table.AddSeparator()
}
}
if networkArea.Labels != nil && len(*networkArea.Labels) > 0 {
var labels []string
for key, value := range *networkArea.Labels {
labels = append(labels, fmt.Sprintf("%s: %s", key, value))
}
table.AddRow("LABELS", strings.Join(labels, "\n"))
table.AddSeparator()
}
if len(attachedProjects) > 0 {
table.AddRow("ATTACHED PROJECTS IDS", strings.Join(attachedProjects, "\n"))
table.AddSeparator()
Expand Down
14 changes: 13 additions & 1 deletion internal/cmd/beta/network-area/list/list.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,12 +24,14 @@ import (
const (
limitFlag = "limit"
organizationIdFlag = "organization-id"
labelSelectorFlag = "label-selector"
)

type inputModel struct {
*globalflags.GlobalFlagModel
Limit *int64
OrganizationId *string
LabelSelector *string
}

func NewCmd(p *print.Printer) *cobra.Command {
Expand All @@ -51,6 +53,10 @@ func NewCmd(p *print.Printer) *cobra.Command {
`Lists up to 10 network areas of organization "xxx"`,
"$ stackit beta network-area list --organization-id xxx --limit 10",
),
examples.NewExample(
`Lists all network areas of organization "xxx" which contains the label yyy`,
"$ stackit beta network-area list --organization-id xxx --label-selector yyy",
),
),
RunE: func(cmd *cobra.Command, _ []string) error {
ctx := context.Background()
Expand Down Expand Up @@ -104,6 +110,7 @@ func NewCmd(p *print.Printer) *cobra.Command {
func configureFlags(cmd *cobra.Command) {
cmd.Flags().Int64(limitFlag, 0, "Maximum number of entries to list")
cmd.Flags().Var(flags.UUIDFlag(), organizationIdFlag, "Organization ID")
cmd.Flags().String(labelSelectorFlag, "", "Filter by label")

err := flags.MarkFlagsRequired(cmd, organizationIdFlag)
cobra.CheckErr(err)
Expand All @@ -123,6 +130,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) {
GlobalFlagModel: globalFlags,
Limit: limit,
OrganizationId: flags.FlagToStringPointer(p, cmd, organizationIdFlag),
LabelSelector: flags.FlagToStringPointer(p, cmd, labelSelectorFlag),
}

if p.IsVerbosityDebug() {
Expand All @@ -138,7 +146,11 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) {
}

func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APIClient) iaas.ApiListNetworkAreasRequest {
return apiClient.ListNetworkAreas(ctx, *model.OrganizationId)
req := apiClient.ListNetworkAreas(ctx, *model.OrganizationId)
if model.LabelSelector != nil {
req = req.LabelSelector(*model.LabelSelector)
}
return req
}

func outputResult(p *print.Printer, outputFormat string, networkAreas []iaas.NetworkArea) error {
Expand Down
14 changes: 14 additions & 0 deletions internal/cmd/beta/network-area/list/list_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,11 +19,13 @@ type testCtxKey struct{}
var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo")
var testClient = &iaas.APIClient{}
var testOrganizationId = uuid.NewString()
var testLabelSelector = "foo=bar"

func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string {
flagValues := map[string]string{
organizationIdFlag: testOrganizationId,
limitFlag: "10",
labelSelectorFlag: testLabelSelector,
}
for _, mod := range mods {
mod(flagValues)
Expand All @@ -38,6 +40,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel {
},
OrganizationId: &testOrganizationId,
Limit: utils.Ptr(int64(10)),
LabelSelector: utils.Ptr(testLabelSelector),
}
for _, mod := range mods {
mod(model)
Expand All @@ -47,6 +50,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel {

func fixtureRequest(mods ...func(request *iaas.ApiListNetworkAreasRequest)) iaas.ApiListNetworkAreasRequest {
request := testClient.ListNetworkAreas(testCtx, testOrganizationId)
request = request.LabelSelector(testLabelSelector)
for _, mod := range mods {
mod(&request)
}
Expand Down Expand Up @@ -111,6 +115,16 @@ func TestParseInput(t *testing.T) {
}),
isValid: false,
},
{
description: "label selector empty",
flagValues: fixtureFlagValues(func(flagValues map[string]string) {
flagValues[labelSelectorFlag] = ""
}),
isValid: true,
expectedModel: fixtureInputModel(func(inputModel *inputModel) {
inputModel.LabelSelector = utils.Ptr("")
}),
},
}

for _, tt := range tests {
Expand Down
16 changes: 15 additions & 1 deletion internal/cmd/beta/network-area/update/update.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ const (
defaultPrefixLengthFlag = "default-prefix-length"
maxPrefixLengthFlag = "max-prefix-length"
minPrefixLengthFlag = "min-prefix-length"
labelFlag = "labels"
)

type inputModel struct {
Expand All @@ -41,6 +42,7 @@ type inputModel struct {
DefaultPrefixLength *int64
MaxPrefixLength *int64
MinPrefixLength *int64
Labels *map[string]string
}

func NewCmd(p *print.Printer) *cobra.Command {
Expand Down Expand Up @@ -109,6 +111,7 @@ func configureFlags(cmd *cobra.Command) {
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")
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,...'")

err := flags.MarkFlagsRequired(cmd, organizationIdFlag)
cobra.CheckErr(err)
Expand All @@ -128,6 +131,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu
DefaultPrefixLength: flags.FlagToInt64Pointer(p, cmd, defaultPrefixLengthFlag),
MaxPrefixLength: flags.FlagToInt64Pointer(p, cmd, maxPrefixLengthFlag),
MinPrefixLength: flags.FlagToInt64Pointer(p, cmd, minPrefixLengthFlag),
Labels: flags.FlagToStringToStringPointer(p, cmd, labelFlag),
}

if p.IsVerbosityDebug() {
Expand All @@ -145,8 +149,18 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu
func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APIClient) iaas.ApiPartialUpdateNetworkAreaRequest {
req := apiClient.PartialUpdateNetworkArea(ctx, *model.OrganizationId, model.AreaId)

var labelsMap *map[string]interface{}
if model.Labels != nil && len(*model.Labels) > 0 {
// convert map[string]string to map[string]interface{}
labelsMap = utils.Ptr(map[string]interface{}{})
for k, v := range *model.Labels {
(*labelsMap)[k] = v
}
}

payload := iaas.PartialUpdateNetworkAreaPayload{
Name: model.Name,
Name: model.Name,
Labels: labelsMap,
AddressFamily: &iaas.UpdateAreaAddressFamily{
Ipv4: &iaas.UpdateAreaIPv4{
DefaultNameservers: model.DnsNameServers,
Expand Down
Loading
Loading