Skip to content

Commit 3dcaba4

Browse files
committed
Onboard: Labels for network-area
Signed-off-by: Alexander Dahmen <alexander.dahmen@inovex.de>
1 parent ca7fa42 commit 3dcaba4

File tree

7 files changed

+104
-3
lines changed

7 files changed

+104
-3
lines changed

internal/cmd/beta/network-area/create/create.go

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ const (
2929
defaultPrefixLengthFlag = "default-prefix-length"
3030
maxPrefixLengthFlag = "max-prefix-length"
3131
minPrefixLengthFlag = "min-prefix-length"
32+
labelFlag = "labels"
3233
)
3334

3435
type inputModel struct {
@@ -41,6 +42,7 @@ type inputModel struct {
4142
DefaultPrefixLength *int64
4243
MaxPrefixLength *int64
4344
MinPrefixLength *int64
45+
Labels *map[string]string
4446
}
4547

4648
func NewCmd(p *print.Printer) *cobra.Command {
@@ -62,6 +64,10 @@ func NewCmd(p *print.Printer) *cobra.Command {
6264
`Create a network area with name "network-area-3" in organization with ID "xxx" with network ranges, transfer network and additional options`,
6365
`$ 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`,
6466
),
67+
examples.NewExample(
68+
`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"`,
69+
`$ 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`,
70+
),
6571
),
6672
RunE: func(cmd *cobra.Command, _ []string) error {
6773
ctx := context.Background()
@@ -119,6 +125,7 @@ func configureFlags(cmd *cobra.Command) {
119125
cmd.Flags().Int64(defaultPrefixLengthFlag, 0, "The default prefix length for networks in the network area")
120126
cmd.Flags().Int64(maxPrefixLengthFlag, 0, "The maximum prefix length for networks in the network area")
121127
cmd.Flags().Int64(minPrefixLengthFlag, 0, "The minimum prefix length for networks in the network area")
128+
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,...'")
122129

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

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

172+
var labelsMap *map[string]interface{}
173+
if model.Labels != nil && len(*model.Labels) > 0 {
174+
// convert map[string]string to map[string]interface{}
175+
labelsMap = utils.Ptr(map[string]interface{}{})
176+
for k, v := range *model.Labels {
177+
(*labelsMap)[k] = v
178+
}
179+
}
180+
164181
payload := iaas.CreateNetworkAreaPayload{
165-
Name: model.Name,
182+
Name: model.Name,
183+
Labels: labelsMap,
166184
AddressFamily: &iaas.CreateAreaAddressFamily{
167185
Ipv4: &iaas.CreateAreaIPv4{
168186
DefaultNameservers: model.DnsNameServers,

internal/cmd/beta/network-area/create/create_test.go

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]st
3131
defaultPrefixLengthFlag: "24",
3232
maxPrefixLengthFlag: "24",
3333
minPrefixLengthFlag: "24",
34+
labelFlag: "key=value",
3435
}
3536
for _, mod := range mods {
3637
mod(flagValues)
@@ -51,6 +52,9 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel {
5152
DefaultPrefixLength: utils.Ptr(int64(24)),
5253
MaxPrefixLength: utils.Ptr(int64(24)),
5354
MinPrefixLength: utils.Ptr(int64(24)),
55+
Labels: utils.Ptr(map[string]string{
56+
"key": "value",
57+
}),
5458
}
5559
for _, mod := range mods {
5660
mod(model)
@@ -70,6 +74,9 @@ func fixtureRequest(mods ...func(request *iaas.ApiCreateNetworkAreaRequest)) iaa
7074
func fixturePayload(mods ...func(payload *iaas.CreateNetworkAreaPayload)) iaas.CreateNetworkAreaPayload {
7175
payload := iaas.CreateNetworkAreaPayload{
7276
Name: utils.Ptr("example-network-area-name"),
77+
Labels: utils.Ptr(map[string]interface{}{
78+
"key": "value",
79+
}),
7380
AddressFamily: &iaas.CreateAreaAddressFamily{
7481
Ipv4: &iaas.CreateAreaIPv4{
7582
DefaultNameservers: utils.Ptr([]string{"1.1.1.0", "1.1.2.0"}),
@@ -171,6 +178,16 @@ func TestParseInput(t *testing.T) {
171178
}),
172179
isValid: false,
173180
},
181+
{
182+
description: "labels missing",
183+
flagValues: fixtureFlagValues(func(flagValues map[string]string) {
184+
delete(flagValues, labelFlag)
185+
}),
186+
expectedModel: fixtureInputModel(func(model *inputModel) {
187+
model.Labels = nil
188+
}),
189+
isValid: true,
190+
},
174191
}
175192

176193
for _, tt := range tests {

internal/cmd/beta/network-area/describe/describe.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -196,6 +196,14 @@ func outputResult(p *print.Printer, outputFormat string, networkArea *iaas.Netwo
196196
table.AddSeparator()
197197
}
198198
}
199+
if networkArea.Labels != nil && len(*networkArea.Labels) > 0 {
200+
var labels []string
201+
for key, value := range *networkArea.Labels {
202+
labels = append(labels, fmt.Sprintf("%s: %s", key, value))
203+
}
204+
table.AddRow("LABELS", strings.Join(labels, "\n"))
205+
table.AddSeparator()
206+
}
199207
if len(attachedProjects) > 0 {
200208
table.AddRow("ATTACHED PROJECTS IDS", strings.Join(attachedProjects, "\n"))
201209
table.AddSeparator()

internal/cmd/beta/network-area/list/list.go

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,12 +24,14 @@ import (
2424
const (
2525
limitFlag = "limit"
2626
organizationIdFlag = "organization-id"
27+
labelSelectorFlag = "label-selector"
2728
)
2829

2930
type inputModel struct {
3031
*globalflags.GlobalFlagModel
3132
Limit *int64
3233
OrganizationId *string
34+
LabelSelector *string
3335
}
3436

3537
func NewCmd(p *print.Printer) *cobra.Command {
@@ -51,6 +53,10 @@ func NewCmd(p *print.Printer) *cobra.Command {
5153
`Lists up to 10 network areas of organization "xxx"`,
5254
"$ stackit beta network-area list --organization-id xxx --limit 10",
5355
),
56+
examples.NewExample(
57+
`Lists all network areas of organization "xxx" which contains the label yyy`,
58+
"$ stackit beta network-area list --organization-id xxx --label-selector yyy",
59+
),
5460
),
5561
RunE: func(cmd *cobra.Command, _ []string) error {
5662
ctx := context.Background()
@@ -104,6 +110,7 @@ func NewCmd(p *print.Printer) *cobra.Command {
104110
func configureFlags(cmd *cobra.Command) {
105111
cmd.Flags().Int64(limitFlag, 0, "Maximum number of entries to list")
106112
cmd.Flags().Var(flags.UUIDFlag(), organizationIdFlag, "Organization ID")
113+
cmd.Flags().String(labelSelectorFlag, "", "Filter by label")
107114

108115
err := flags.MarkFlagsRequired(cmd, organizationIdFlag)
109116
cobra.CheckErr(err)
@@ -123,6 +130,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) {
123130
GlobalFlagModel: globalFlags,
124131
Limit: limit,
125132
OrganizationId: flags.FlagToStringPointer(p, cmd, organizationIdFlag),
133+
LabelSelector: flags.FlagToStringPointer(p, cmd, labelSelectorFlag),
126134
}
127135

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

140148
func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APIClient) iaas.ApiListNetworkAreasRequest {
141-
return apiClient.ListNetworkAreas(ctx, *model.OrganizationId)
149+
req := apiClient.ListNetworkAreas(ctx, *model.OrganizationId)
150+
if model.LabelSelector != nil {
151+
req = req.LabelSelector(*model.LabelSelector)
152+
}
153+
return req
142154
}
143155

144156
func outputResult(p *print.Printer, outputFormat string, networkAreas []iaas.NetworkArea) error {

internal/cmd/beta/network-area/list/list_test.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,13 @@ type testCtxKey struct{}
1919
var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo")
2020
var testClient = &iaas.APIClient{}
2121
var testOrganizationId = uuid.NewString()
22+
var testLabelSelector = "foo=bar"
2223

2324
func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string {
2425
flagValues := map[string]string{
2526
organizationIdFlag: testOrganizationId,
2627
limitFlag: "10",
28+
labelSelectorFlag: testLabelSelector,
2729
}
2830
for _, mod := range mods {
2931
mod(flagValues)
@@ -38,6 +40,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel {
3840
},
3941
OrganizationId: &testOrganizationId,
4042
Limit: utils.Ptr(int64(10)),
43+
LabelSelector: utils.Ptr(testLabelSelector),
4144
}
4245
for _, mod := range mods {
4346
mod(model)
@@ -47,6 +50,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel {
4750

4851
func fixtureRequest(mods ...func(request *iaas.ApiListNetworkAreasRequest)) iaas.ApiListNetworkAreasRequest {
4952
request := testClient.ListNetworkAreas(testCtx, testOrganizationId)
53+
request = request.LabelSelector(testLabelSelector)
5054
for _, mod := range mods {
5155
mod(&request)
5256
}
@@ -111,6 +115,16 @@ func TestParseInput(t *testing.T) {
111115
}),
112116
isValid: false,
113117
},
118+
{
119+
description: "label selector empty",
120+
flagValues: fixtureFlagValues(func(flagValues map[string]string) {
121+
flagValues[labelSelectorFlag] = ""
122+
}),
123+
isValid: true,
124+
expectedModel: fixtureInputModel(func(inputModel *inputModel) {
125+
inputModel.LabelSelector = utils.Ptr("")
126+
}),
127+
},
114128
}
115129

116130
for _, tt := range tests {

internal/cmd/beta/network-area/update/update.go

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ const (
3030
defaultPrefixLengthFlag = "default-prefix-length"
3131
maxPrefixLengthFlag = "max-prefix-length"
3232
minPrefixLengthFlag = "min-prefix-length"
33+
labelFlag = "labels"
3334
)
3435

3536
type inputModel struct {
@@ -41,6 +42,7 @@ type inputModel struct {
4142
DefaultPrefixLength *int64
4243
MaxPrefixLength *int64
4344
MinPrefixLength *int64
45+
Labels *map[string]string
4446
}
4547

4648
func NewCmd(p *print.Printer) *cobra.Command {
@@ -109,6 +111,7 @@ func configureFlags(cmd *cobra.Command) {
109111
cmd.Flags().Int64(defaultPrefixLengthFlag, 0, "The default prefix length for networks in the network area")
110112
cmd.Flags().Int64(maxPrefixLengthFlag, 0, "The maximum prefix length for networks in the network area")
111113
cmd.Flags().Int64(minPrefixLengthFlag, 0, "The minimum prefix length for networks in the network area")
114+
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,...'")
112115

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

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

152+
var labelsMap *map[string]interface{}
153+
if model.Labels != nil && len(*model.Labels) > 0 {
154+
// convert map[string]string to map[string]interface{}
155+
labelsMap = utils.Ptr(map[string]interface{}{})
156+
for k, v := range *model.Labels {
157+
(*labelsMap)[k] = v
158+
}
159+
}
160+
148161
payload := iaas.PartialUpdateNetworkAreaPayload{
149-
Name: model.Name,
162+
Name: model.Name,
163+
Labels: labelsMap,
150164
AddressFamily: &iaas.UpdateAreaAddressFamily{
151165
Ipv4: &iaas.UpdateAreaIPv4{
152166
DefaultNameservers: model.DnsNameServers,

internal/cmd/beta/network-area/update/update_test.go

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]st
4040
defaultPrefixLengthFlag: "24",
4141
maxPrefixLengthFlag: "24",
4242
minPrefixLengthFlag: "24",
43+
labelFlag: "key=value",
4344
}
4445
for _, mod := range mods {
4546
mod(flagValues)
@@ -59,6 +60,9 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel {
5960
DefaultPrefixLength: utils.Ptr(int64(24)),
6061
MaxPrefixLength: utils.Ptr(int64(24)),
6162
MinPrefixLength: utils.Ptr(int64(24)),
63+
Labels: utils.Ptr(map[string]string{
64+
"key": "value",
65+
}),
6266
}
6367
for _, mod := range mods {
6468
mod(model)
@@ -78,6 +82,9 @@ func fixtureRequest(mods ...func(request *iaas.ApiPartialUpdateNetworkAreaReques
7882
func fixturePayload(mods ...func(payload *iaas.PartialUpdateNetworkAreaPayload)) iaas.PartialUpdateNetworkAreaPayload {
7983
payload := iaas.PartialUpdateNetworkAreaPayload{
8084
Name: utils.Ptr("example-network-area-name"),
85+
Labels: utils.Ptr(map[string]interface{}{
86+
"key": "value",
87+
}),
8188
AddressFamily: &iaas.UpdateAreaAddressFamily{
8289
Ipv4: &iaas.UpdateAreaIPv4{
8390
DefaultNameservers: utils.Ptr([]string{"1.1.1.0", "1.1.2.0"}),
@@ -183,6 +190,17 @@ func TestParseInput(t *testing.T) {
183190
}),
184191
isValid: false,
185192
},
193+
{
194+
description: "labels missing",
195+
argValues: fixtureArgValues(),
196+
flagValues: fixtureFlagValues(func(flagValues map[string]string) {
197+
delete(flagValues, labelFlag)
198+
}),
199+
expectedModel: fixtureInputModel(func(model *inputModel) {
200+
model.Labels = nil
201+
}),
202+
isValid: true,
203+
},
186204
}
187205

188206
for _, tt := range tests {

0 commit comments

Comments
 (0)