1
- package aks
1
+ package networks
2
2
3
3
import (
4
4
"context"
@@ -19,14 +19,13 @@ import (
19
19
"sync"
20
20
)
21
21
22
- // NewSyncAKSCmd creates a new cobra command for syncing AKS clusters
23
- func NewSyncAKSCmd () * cobra.Command {
22
+ func NewSyncNetworksCmd () * cobra.Command {
24
23
var subscriptionID string
25
24
var name string
26
25
27
26
cmd := & cobra.Command {
28
- Use : "aks " ,
29
- Short : "Sync Azure Kubernetes Service networks into Ctrlplane" ,
27
+ Use : "networks " ,
28
+ Short : "Sync Azure Virtual Networks into Ctrlplane" ,
30
29
Example : heredoc .Doc (`
31
30
# Make sure Azure credentials are configured via environment variables or Azure CLI
32
31
@@ -75,21 +74,21 @@ func runSync(subscriptionID, name *string) func(cmd *cobra.Command, args []strin
75
74
tenantID = getTenantIDFromEnv ()
76
75
}
77
76
78
- log .Info ("Syncing all AKS clusters " , "subscriptionID" , * subscriptionID , "tenantID" , tenantID )
77
+ log .Info ("Syncing all Networks " , "subscriptionID" , * subscriptionID , "tenantID" , tenantID )
79
78
80
79
resources , err := processNetworks (ctx , cred , * subscriptionID , tenantID )
81
80
if err != nil {
82
81
return err
83
82
}
84
83
85
84
if len (resources ) == 0 {
86
- log .Info ("No AKS clusters found" )
85
+ log .Info ("No Networks found" )
87
86
return nil
88
87
}
89
88
90
89
// If name is not provided, use subscription ID
91
90
if * name == "" {
92
- * name = fmt .Sprintf ("azure-aks -%s" , * subscriptionID )
91
+ * name = fmt .Sprintf ("azure-networks -%s" , * subscriptionID )
93
92
}
94
93
95
94
// Upsert resources to Ctrlplane
@@ -157,7 +156,7 @@ func getDefaultSubscriptionID(ctx context.Context, cred azcore.TokenCredential)
157
156
func processNetworks (
158
157
ctx context.Context , cred azcore.TokenCredential , subscriptionID string , tenantID string ,
159
158
) ([]api.CreateResource , error ) {
160
- var resources []api.CreateResource
159
+ var allResources []api.CreateResource
161
160
var resourceGroups []common.ResourceGroupInfo
162
161
var mu sync.Mutex
163
162
var wg sync.WaitGroup
@@ -184,20 +183,20 @@ func processNetworks(
184
183
page , err := pager .NextPage (ctx )
185
184
if err != nil {
186
185
mu .Lock ()
187
- syncErrors = append (syncErrors , fmt .Errorf ("failed to list AKS clusters : %w" , err ))
186
+ syncErrors = append (syncErrors , fmt .Errorf ("failed to list networks : %w" , err ))
188
187
mu .Unlock ()
189
188
}
190
189
for _ , network := range page .Value {
191
- resource , err := processNetwork (ctx , network , resourceGroup , subscriptionID , tenantID )
190
+ resources , err := processNetwork (ctx , network , resourceGroup , subscriptionID , tenantID )
192
191
if err != nil {
193
- log .Error ("Failed to process AKS cluster " , "name" , * network .Name , "error" , err )
192
+ log .Error ("Failed to process network " , "name" , * network .Name , "error" , err )
194
193
mu .Lock ()
195
- syncErrors = append (syncErrors , fmt .Errorf ("cluster %s: %w" , * network .Name , err ))
194
+ syncErrors = append (syncErrors , fmt .Errorf ("network %s: %w" , * network .Name , err ))
196
195
mu .Unlock ()
197
196
return
198
197
}
199
198
mu .Lock ()
200
- resources = append (resources , resource )
199
+ allResources = append (allResources , resources ... )
201
200
mu .Unlock ()
202
201
}
203
202
}
@@ -211,23 +210,23 @@ func processNetworks(
211
210
// Continue with the clusters that succeeded
212
211
}
213
212
214
- log .Info ("Found AKS clusters " , "count" , len (resources ))
215
- return resources , nil
213
+ log .Info ("Found network resources " , "count" , len (allResources ))
214
+ return allResources , nil
216
215
}
217
216
218
217
func processNetwork (
219
218
_ context.Context , network * armnetwork.VirtualNetwork , resourceGroup string , subscriptionID string , tenantID string ,
220
219
) ([]api.CreateResource , error ) {
221
220
resources := make ([]api.CreateResource , 0 )
222
221
networkName := network .Name
223
- metadata := initNetworkMetadata (network , subscriptionID , resourceGroup , tenantID )
222
+ metadata := initNetworkMetadata (network , resourceGroup , subscriptionID , tenantID )
224
223
225
224
// Build console URL
226
- consoleUrl := getVirtualNetworkConsoleUrl (subscriptionID , resourceGroup , * networkName )
225
+ consoleUrl := getVirtualNetworkConsoleUrl (resourceGroup , subscriptionID , * networkName )
227
226
metadata [kinds .CtrlplaneMetadataLinks ] = fmt .Sprintf ("{ \" Azure Portal\" : \" %s\" }" , consoleUrl )
228
227
229
228
resources = append (resources , api.CreateResource {
230
- Version : "ctrlplane.dev/vpc /v1" ,
229
+ Version : "ctrlplane.dev/network /v1" ,
231
230
Kind : "AzureNetwork" ,
232
231
Name : * networkName ,
233
232
Identifier : * network .ID ,
@@ -248,23 +247,49 @@ func processNetwork(
248
247
Metadata : metadata ,
249
248
})
250
249
for _ , subnet := range network .Properties .Subnets {
251
- if res , err := processSubnet (networkName , subnet , resourceGroup , subscriptionID , tenantID ); err != nil {
250
+ if res , err := processSubnet (network , subnet , resourceGroup , subscriptionID , tenantID ); err != nil {
252
251
return nil , err
253
252
} else {
254
253
resources = append (resources , res )
255
254
}
256
255
}
256
+ return resources , nil
257
257
}
258
258
259
259
func processSubnet (
260
- networkName * string , subnet * armnetwork.Subnet , resourceGroup string , subscriptionID string , tenantID string ,
260
+ network * armnetwork. VirtualNetwork , subnet * armnetwork.Subnet , resourceGroup string , subscriptionID string , tenantID string ,
261
261
) (api.CreateResource , error ) {
262
+ metadata := initSubnetMetadata (network , subnet , resourceGroup , subscriptionID , tenantID )
263
+ networkName := network .Name
264
+ subnetName := subnet .Name
262
265
266
+ // Build console URL
267
+ consoleUrl := getSubnetConsoleUrl (resourceGroup , subscriptionID , * networkName )
268
+ metadata [kinds .CtrlplaneMetadataLinks ] = fmt .Sprintf ("{ \" Azure Portal\" : \" %s\" }" , consoleUrl )
269
+
270
+ return api.CreateResource {
271
+ Version : "ctrlplane.dev/network/subnet/v1" ,
272
+ Kind : "AzureSubnet" ,
273
+ Name : * subnetName ,
274
+ Identifier : * subnet .ID ,
275
+ Config : map [string ]any {
276
+ // Common cross-provider options
277
+ "name" : subnetName ,
278
+ "type" : "subnet" ,
279
+ "id" : subnet .ID ,
280
+
281
+ // Provider-specific implementation details
282
+ "azureSubnet" : map [string ]any {
283
+ "type" : subnet .Type ,
284
+ "purpose" : subnet .Properties .Purpose ,
285
+ "state" : subnet .Properties .ProvisioningState ,
286
+ },
287
+ },
288
+ Metadata : metadata ,
289
+ }, nil
263
290
}
264
291
265
- func initNetworkMetadata (
266
- network * armnetwork.VirtualNetwork , subscriptionID , resourceGroup string , tenantID string ,
267
- ) map [string ]string {
292
+ func initNetworkMetadata (network * armnetwork.VirtualNetwork , resourceGroup , subscriptionID , tenantID string ) map [string ]string {
268
293
269
294
metadata := map [string ]string {
270
295
"azure/subscription" : subscriptionID ,
@@ -274,7 +299,7 @@ func initNetworkMetadata(
274
299
"azure/location" : * network .Location ,
275
300
"azure/status" : string (* network .Properties .ProvisioningState ),
276
301
"azure/id" : * network .ID ,
277
- "azure/console-url" : getVirtualNetworkConsoleUrl (subscriptionID , resourceGroup , * network .Name ),
302
+ "azure/console-url" : getVirtualNetworkConsoleUrl (resourceGroup , subscriptionID , * network .Name ),
278
303
}
279
304
280
305
// Tags
@@ -289,9 +314,7 @@ func initNetworkMetadata(
289
314
return metadata
290
315
}
291
316
292
- func initSubnetMetadata (
293
- network * armnetwork.VirtualNetwork , subnet * armnetwork.Subnet , subscriptionID , resourceGroup string , tenantID string ,
294
- ) map [string ]string {
317
+ func initSubnetMetadata (network * armnetwork.VirtualNetwork , subnet * armnetwork.Subnet , resourceGroup , subscriptionID , tenantID string ) map [string ]string {
295
318
296
319
metadata := map [string ]string {
297
320
"azure/subscription" : subscriptionID ,
@@ -301,7 +324,7 @@ func initSubnetMetadata(
301
324
"azure/location" : * network .Location ,
302
325
"azure/status" : string (* subnet .Properties .ProvisioningState ),
303
326
"azure/id" : * subnet .ID ,
304
- "azure/console-url" : getSubnetConsoleUrl (subscriptionID , resourceGroup , * network .Name ),
327
+ "azure/console-url" : getSubnetConsoleUrl (resourceGroup , subscriptionID , * network .Name ),
305
328
}
306
329
307
330
// Tags
@@ -316,7 +339,7 @@ func initSubnetMetadata(
316
339
return metadata
317
340
}
318
341
319
- func getVirtualNetworkConsoleUrl (subscriptionID , resourceGroup , networkName string ) string {
342
+ func getVirtualNetworkConsoleUrl (resourceGroup , subscriptionID , networkName string ) string {
320
343
return fmt .Sprintf (
321
344
"https://portal.azure.com/#@/resource/subscriptions/%s/resourceGroups/%s/providers/Microsoft.Network/virtualNetworks/%s" ,
322
345
subscriptionID ,
@@ -325,7 +348,7 @@ func getVirtualNetworkConsoleUrl(subscriptionID, resourceGroup, networkName stri
325
348
)
326
349
}
327
350
328
- func getSubnetConsoleUrl (subscriptionID , resourceGroup , networkName string ) string {
351
+ func getSubnetConsoleUrl (resourceGroup , subscriptionID , networkName string ) string {
329
352
return fmt .Sprintf (
330
353
"https://portal.azure.com/#@/resource/subscriptions/%s/resourceGroups/%s/providers/Microsoft.Network/virtualNetworks/%s/subnets" ,
331
354
subscriptionID ,
@@ -336,7 +359,7 @@ func getSubnetConsoleUrl(subscriptionID, resourceGroup, networkName string) stri
336
359
337
360
func upsertToCtrlplane (ctx context.Context , resources []api.CreateResource , subscriptionID , name * string ) error {
338
361
if * name == "" {
339
- * name = fmt .Sprintf ("azure-aks -%s" , * subscriptionID )
362
+ * name = fmt .Sprintf ("azure-networks -%s" , * subscriptionID )
340
363
}
341
364
342
365
apiURL := viper .GetString ("url" )
0 commit comments