Skip to content

Commit 52b77c1

Browse files
authored
fix(publicip): Add infrastructure for creating Public IP's (#1797)
# Description Adding azure infrastructure for creating public IP's ## Checklist - [x] I have read the [contributing documentation](https://retina.sh/docs/Contributing/overview). - [x] I signed and signed-off the commits (`git commit -S -s ...`). See [this documentation](https://docs.github.com/en/authentication/managing-commit-signature-verification/about-commit-signature-verification) on signing commits. - [x] I have correctly attributed the author(s) of the code. - [x] I have tested the changes locally. - [x] I have followed the project's style guidelines. - [x] I have updated the documentation, if necessary. - [x] I have added tests, if applicable. <img width="1263" height="386" alt="image" src="https://github.com/user-attachments/assets/816fe56e-f2f4-4ba3-844d-8980241bdfd2" /> --- Please refer to the [CONTRIBUTING.md](../CONTRIBUTING.md) file for more information on how to contribute to this project. --------- Signed-off-by: mereta <mereta.degutyte@hotmail.co.uk>
1 parent a24a3ba commit 52b77c1

5 files changed

Lines changed: 169 additions & 0 deletions

File tree

go.mod

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -265,6 +265,7 @@ require (
265265
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/containerservice/armcontainerservice/v4 v4.8.0
266266
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/dashboard/armdashboard v1.2.0
267267
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/monitor/armmonitor v0.11.0
268+
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/network/armnetwork v1.1.0
268269
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/network/armnetwork/v5 v5.2.0
269270
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources v1.2.0
270271
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/storage/armstorage v1.8.1
@@ -473,6 +474,7 @@ require (
473474
github.com/google/go-github/v62 v62.0.0 // indirect
474475
github.com/google/go-querystring v1.1.0 // indirect
475476
github.com/google/ko v0.15.4 // indirect
477+
github.com/google/pprof v0.0.0-20250403155104-27863c87afa6 // indirect
476478
github.com/google/rpmpack v0.6.1-0.20240329070804-c2247cbb881a // indirect
477479
github.com/google/s2a-go v0.1.9 // indirect
478480
github.com/google/safetext v0.0.0-20220905092116-b49f7bc46da2 // indirect

go.sum

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,8 @@ github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/containerservice/armcontai
8383
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/containerservice/armcontainerservice/v6 v6.6.0/go.mod h1:OWKfCmX4X3Vp2w7GSx1LZn8566tOHJBA6K0IAUVNYx0=
8484
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/dashboard/armdashboard v1.2.0 h1:MRPU8Bge2f9tkfG3PCr4vEnqXl8XOSjlhuK3l+8Hvkc=
8585
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/dashboard/armdashboard v1.2.0/go.mod h1:xYrOYxajQvXMlp6M1E3amlaqPDXspyJxmjqTsGo6Jmw=
86+
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/internal v1.0.0 h1:lMW1lD/17LUA5z1XTURo7LcVG2ICBPlyMHjIUrcFZNQ=
87+
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/internal v1.0.0/go.mod h1:ceIuwmxDWptoW3eCqSXlnPsZFKh4X+R38dWPv7GS9Vs=
8688
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/internal/v2 v2.0.0 h1:PTFGRSlMKCQelWwxUyYVEUqseBJVemLyqWJjvMyt0do=
8789
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/internal/v2 v2.0.0/go.mod h1:LRr2FzBTQlONPPa5HREE5+RjSCTXl7BwOvYOaWTqCaI=
8890
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/internal/v3 v3.1.0 h1:2qsIIvxVT+uE6yrNldntJKlLRgxGbZ85kgtz5SNBhMw=
@@ -95,6 +97,8 @@ github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/monitor/armmonitor v0.11.0
9597
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/monitor/armmonitor v0.11.0/go.mod h1:jj6P8ybImR+5topJ+eH6fgcemSFBmU6/6bFF8KkwuDI=
9698
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/msi/armmsi v1.2.0 h1:z4YeiSXxnUI+PqB46Yj6MZA3nwb1CcJIkEMDrzUd8Cs=
9799
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/msi/armmsi v1.2.0/go.mod h1:rko9SzMxcMk0NJsNAxALEGaTYyy79bNRwxgJfrH0Spw=
100+
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/network/armnetwork v1.1.0 h1:QM6sE5k2ZT/vI5BEe0r7mqjsUSnhVBFbOsVkEuaEfiA=
101+
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/network/armnetwork v1.1.0/go.mod h1:243D9iHbcQXoFUtgHJwL7gl2zx1aDuDMjvBZVGr2uW0=
98102
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/network/armnetwork/v5 v5.2.0 h1:qBlqTo40ARdI7Pmq+enBiTnejZk2BF+PHgktgG8k3r8=
99103
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/network/armnetwork/v5 v5.2.0/go.mod h1:UmyOatRyQodVpp55Jr5WJmnkmVW4wKfo85uHFmMEjfM=
100104
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/network/armnetwork/v6 v6.2.0 h1:HYGD75g0bQ3VO/Omedm54v4LrD3B1cGImuRF3AJ5wLo=
@@ -768,6 +772,7 @@ github.com/google/ko v0.15.4/go.mod h1:ZkcmfV91Xt6ZzOBHc/cXXGYnqWdNWDVy/gHoUU9sj
768772
github.com/google/martian/v3 v3.3.3 h1:DIhPTQrbPkgs2yJYdXU/eNACCG5DVQjySNRNlflZ9Fc=
769773
github.com/google/martian/v3 v3.3.3/go.mod h1:iEPrYcgCF7jA9OtScMFQyAlZZ4YXTKEtJ1E6RWzmBA0=
770774
github.com/google/pprof v0.0.0-20250403155104-27863c87afa6 h1:BHT72Gu3keYf3ZEu2J0b1vyeLSOYI8bm5wbJM/8yDe8=
775+
github.com/google/pprof v0.0.0-20250403155104-27863c87afa6/go.mod h1:boTsfXsheKC2y+lKOCMpSfarhxDeIzfZG1jqGcPl3cA=
771776
github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
772777
github.com/google/renameio/v2 v2.0.0 h1:UifI23ZTGY8Tt29JbYFiuyIU3eX+RNFtUwefq9qAhxg=
773778
github.com/google/renameio/v2 v2.0.0/go.mod h1:BtmJXm5YlszgC+TD4HOEEUFgkJP3nLxehU6hfe7jRt4=

test/e2e/framework/azure/create-cluster-with-npm.go

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ type CreateNPMCluster struct {
3535
PodCidr string
3636
DNSServiceIP string
3737
ServiceCidr string
38+
PublicIPs []string
3839
}
3940

4041
func (c *CreateNPMCluster) Prevalidate() error {
@@ -100,6 +101,29 @@ func (c *CreateNPMCluster) Run() error {
100101
NodeOSUpgradeChannel: to.Ptr(armcontainerservice.NodeOSUpgradeChannelNodeImage),
101102
}
102103

104+
if len(c.PublicIPs) > 0 {
105+
publicIPIDs := make([]*armcontainerservice.ResourceReference, 0, len(c.PublicIPs))
106+
107+
for _, ipID := range c.PublicIPs {
108+
fmt.Printf("Adding Public IP ID: %s\n", ipID)
109+
publicIPIDs = append(publicIPIDs, &armcontainerservice.ResourceReference{
110+
ID: to.Ptr(ipID),
111+
})
112+
}
113+
114+
for _, ip := range c.PublicIPs {
115+
fmt.Printf("Public IP ID: %s\n", ip)
116+
}
117+
118+
if npmCluster.Properties.NetworkProfile.LoadBalancerProfile == nil {
119+
npmCluster.Properties.NetworkProfile.LoadBalancerProfile = &armcontainerservice.ManagedClusterLoadBalancerProfile{
120+
OutboundIPs: &armcontainerservice.ManagedClusterLoadBalancerProfileOutboundIPs{
121+
PublicIPs: publicIPIDs,
122+
},
123+
}
124+
}
125+
}
126+
103127
// Deploy cluster
104128
cred, err := azidentity.NewAzureCLICredential(nil)
105129
if err != nil {
Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
package azure
2+
3+
import (
4+
"context"
5+
"fmt"
6+
"log"
7+
"time"
8+
9+
"github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime"
10+
"github.com/Azure/azure-sdk-for-go/sdk/azcore/to"
11+
"github.com/Azure/azure-sdk-for-go/sdk/azidentity"
12+
"github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/network/armnetwork"
13+
)
14+
15+
type CreatePublicIP struct {
16+
SubscriptionID string
17+
ResourceGroupName string
18+
Location string
19+
ClusterName string
20+
IPVersion string
21+
IPPrefix string
22+
}
23+
24+
func (c *CreatePublicIP) Prevalidate() error {
25+
return nil
26+
}
27+
28+
func (c *CreatePublicIP) Stop() error {
29+
return nil
30+
}
31+
32+
func (c *CreatePublicIP) Run() error {
33+
cred, err := azidentity.NewDefaultAzureCredential(nil)
34+
if err != nil {
35+
log.Fatal(err)
36+
}
37+
38+
ctx, cancel := context.WithTimeout(context.Background(), clusterTimeout)
39+
defer cancel()
40+
41+
publicIPClient, err := armnetwork.NewPublicIPAddressesClient(c.SubscriptionID, cred, nil)
42+
if err != nil {
43+
return fmt.Errorf("%w: failed to create public IP client", err)
44+
}
45+
46+
publicIPParams := armnetwork.PublicIPAddress{
47+
Location: to.Ptr(c.Location),
48+
SKU: &armnetwork.PublicIPAddressSKU{
49+
Name: to.Ptr(armnetwork.PublicIPAddressSKUNameStandard),
50+
Tier: to.Ptr(armnetwork.PublicIPAddressSKUTierRegional),
51+
},
52+
Properties: &armnetwork.PublicIPAddressPropertiesFormat{
53+
PublicIPAllocationMethod: to.Ptr(armnetwork.IPAllocationMethodStatic),
54+
PublicIPAddressVersion: to.Ptr(armnetwork.IPVersion(c.IPVersion)),
55+
IPTags: []*armnetwork.IPTag{
56+
{
57+
IPTagType: to.Ptr("FirstPartyUsage"),
58+
Tag: to.Ptr("/NonProd"),
59+
},
60+
},
61+
},
62+
}
63+
64+
var version string
65+
switch c.IPVersion {
66+
case string(armnetwork.IPVersionIPv4):
67+
version = "v4"
68+
case string(armnetwork.IPVersionIPv6):
69+
version = "v6"
70+
default:
71+
return fmt.Errorf("%w: invalid IP version: %s", err, c.IPVersion)
72+
}
73+
74+
ipName := fmt.Sprintf("%s-%s-%s", c.IPPrefix, c.ClusterName, version)
75+
76+
poller, err := publicIPClient.BeginCreateOrUpdate(ctx, c.ResourceGroupName, ipName, publicIPParams, nil)
77+
if err != nil {
78+
return fmt.Errorf("%w: failed to create public IP address", err)
79+
}
80+
81+
notifychan := make(chan struct{})
82+
go func() {
83+
_, err = poller.PollUntilDone(ctx, &runtime.PollUntilDoneOptions{
84+
Frequency: 5 * time.Second,
85+
})
86+
if err != nil {
87+
log.Printf("failed to create Public IP - %s : %v\n", ipName, err)
88+
} else {
89+
log.Printf("Public IP %s created\n", ipName)
90+
}
91+
close(notifychan)
92+
}()
93+
94+
ticker := time.NewTicker(30 * time.Second)
95+
defer ticker.Stop()
96+
for {
97+
select {
98+
case <-ctx.Done():
99+
return fmt.Errorf("failed to create Public IP: %w", ctx.Err())
100+
case <-ticker.C:
101+
log.Printf("waiting for Public IP %s to be ready...\n", ipName)
102+
case <-notifychan:
103+
if err != nil {
104+
return fmt.Errorf("received notification, failed to create public IP address: %w", err)
105+
}
106+
return nil
107+
}
108+
}
109+
}

test/e2e/jobs/jobs.go

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
package retina
22

33
import (
4+
"fmt"
5+
6+
"github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/network/armnetwork"
47
"github.com/microsoft/retina/test/e2e/common"
58
"github.com/microsoft/retina/test/e2e/framework/azure"
69
"github.com/microsoft/retina/test/e2e/framework/generic"
@@ -15,9 +18,15 @@ import (
1518
"github.com/microsoft/retina/test/e2e/scenarios/windows"
1619
)
1720

21+
const IPPrefix = "serviceTaggedIp"
22+
1823
func CreateTestInfra(subID, rg, clusterName, location, kubeConfigFilePath string, createInfra bool) *types.Job {
1924
job := types.NewJob("Create e2e test infrastructure")
2025

26+
publicIPID := fmt.Sprintf("/subscriptions/%s/resourceGroups/%s/providers/Microsoft.Network/publicIPAddresses", subID, clusterName)
27+
publicIPv4FullName := fmt.Sprintf("%s/%s-%s-v4", publicIPID, IPPrefix, clusterName)
28+
publicIPv6FullName := fmt.Sprintf("%s/%s-%s-v6", publicIPID, IPPrefix, clusterName)
29+
2130
if createInfra {
2231
job.AddStep(&azure.CreateResourceGroup{
2332
SubscriptionID: subID,
@@ -35,11 +44,31 @@ func CreateTestInfra(subID, rg, clusterName, location, kubeConfigFilePath string
3544
SubnetAddressSpace: "10.0.0.0/12",
3645
}, nil)
3746

47+
job.AddStep(&azure.CreatePublicIP{
48+
ClusterName: clusterName,
49+
IPVersion: string(armnetwork.IPVersionIPv4),
50+
IPPrefix: IPPrefix,
51+
}, &types.StepOptions{
52+
SkipSavingParametersToJob: true,
53+
})
54+
55+
job.AddStep(&azure.CreatePublicIP{
56+
ClusterName: clusterName,
57+
IPVersion: string(armnetwork.IPVersionIPv6),
58+
IPPrefix: IPPrefix,
59+
}, &types.StepOptions{
60+
SkipSavingParametersToJob: true,
61+
})
62+
3863
job.AddStep(&azure.CreateNPMCluster{
3964
ClusterName: clusterName,
4065
PodCidr: "10.128.0.0/9",
4166
DNSServiceIP: "192.168.0.10",
4267
ServiceCidr: "192.168.0.0/28",
68+
PublicIPs: []string{
69+
publicIPv4FullName,
70+
publicIPv6FullName,
71+
},
4372
}, nil)
4473

4574
job.AddStep(&azure.GetAKSKubeConfig{

0 commit comments

Comments
 (0)