Skip to content

Commit bbc22b2

Browse files
Merge pull request #8045 from rna-afk/capz_dns
CORS-3071: Create DNS entries for CAPZ implementation
2 parents 6372dde + e3c6bdb commit bbc22b2

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

60 files changed

+6488
-239
lines changed

go.mod

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,12 @@ require (
77
cloud.google.com/go/storage v1.38.0
88
github.com/AlecAivazis/survey/v2 v2.3.5
99
github.com/Azure/azure-sdk-for-go v68.0.0+incompatible
10-
github.com/Azure/azure-sdk-for-go/sdk/azcore v1.9.0-beta.1
10+
github.com/Azure/azure-sdk-for-go/sdk/azcore v1.9.0
1111
github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.4.0
1212
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v4 v4.1.0
13+
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/dns/armdns v1.2.0
1314
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/network/armnetwork v1.0.0
15+
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/privatedns/armprivatedns v1.2.0
1416
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resourcegraph/armresourcegraph v0.8.2
1517
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources v1.1.1
1618
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/storage/armstorage v1.2.0
@@ -125,7 +127,7 @@ require (
125127
cloud.google.com/go/compute v1.24.0 // indirect
126128
cloud.google.com/go/compute/metadata v0.2.3 // indirect
127129
cloud.google.com/go/iam v1.1.6 // indirect
128-
github.com/Azure/azure-sdk-for-go/sdk/internal v1.3.0 // indirect
130+
github.com/Azure/azure-sdk-for-go/sdk/internal v1.5.0 // indirect
129131
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v5 v5.2.0 // indirect
130132
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/containerservice/armcontainerservice/v4 v4.3.0 // indirect
131133
github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 // indirect

go.sum

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1168,12 +1168,12 @@ github.com/AlecAivazis/survey/v2 v2.3.5 h1:A8cYupsAZkjaUmhtTYv3sSqc7LO5mp1XDfqe5
11681168
github.com/AlecAivazis/survey/v2 v2.3.5/go.mod h1:4AuI9b7RjAR+G7v9+C4YSlX/YL3K3cWNXgWXOhllqvI=
11691169
github.com/Azure/azure-sdk-for-go v68.0.0+incompatible h1:fcYLmCpyNYRnvJbPerq7U0hS+6+I79yEDJBqVNcqUzU=
11701170
github.com/Azure/azure-sdk-for-go v68.0.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc=
1171-
github.com/Azure/azure-sdk-for-go/sdk/azcore v1.9.0-beta.1 h1:ODs3brnqQM99Tq1PffODpAViYv3Bf8zOg464MU7p5ew=
1172-
github.com/Azure/azure-sdk-for-go/sdk/azcore v1.9.0-beta.1/go.mod h1:3Ug6Qzto9anB6mGlEdgYMDF5zHQ+wwhEaYR4s17PHMw=
1171+
github.com/Azure/azure-sdk-for-go/sdk/azcore v1.9.0 h1:fb8kj/Dh4CSwgsOzHeZY4Xh68cFVbzXx+ONXGMY//4w=
1172+
github.com/Azure/azure-sdk-for-go/sdk/azcore v1.9.0/go.mod h1:uReU2sSxZExRPBAg3qKzmAucSi51+SP1OhohieR821Q=
11731173
github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.4.0 h1:BMAjVKJM0U/CYF27gA0ZMmXGkOcvfFtD0oHVZ1TIPRI=
11741174
github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.4.0/go.mod h1:1fXstnBMas5kzG+S3q8UoJcmyU6nUeunJcMDHcRYHhs=
1175-
github.com/Azure/azure-sdk-for-go/sdk/internal v1.3.0 h1:sXr+ck84g/ZlZUOZiNELInmMgOsuGwdjjVkEIde0OtY=
1176-
github.com/Azure/azure-sdk-for-go/sdk/internal v1.3.0/go.mod h1:okt5dMMTOFjX/aovMlrjvvXoPMBVSPzk9185BT0+eZM=
1175+
github.com/Azure/azure-sdk-for-go/sdk/internal v1.5.0 h1:d81/ng9rET2YqdVkVwkb6EXeRrLJIwyGnJcAlAWKwhs=
1176+
github.com/Azure/azure-sdk-for-go/sdk/internal v1.5.0/go.mod h1:s4kgfzA0covAXNicZHDMN58jExvcng2mC/DepXiF1EI=
11771177
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v3 v3.0.1 h1:H3g2mkmu105ON0c/Gqx3Bm+bzoIijLom8LmV9Gjn7X0=
11781178
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v3 v3.0.1/go.mod h1:EAc3kjhZf9soch7yLID8PeKcE6VfKvQTllSBHYVdXd8=
11791179
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v4 v4.1.0 h1:Vjq3Uy3JAU1DTxbA+uX6BegIhgO2pyFltbfbmDa9KdI=
@@ -1182,12 +1182,18 @@ github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v5 v5.2
11821182
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v5 v5.2.0/go.mod h1:c3iwOnL5Xq5K9ZOvxBrfZYD4pBDNTGK5b7ptkHN6SDs=
11831183
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/containerservice/armcontainerservice/v4 v4.3.0 h1:U73ZEM5QTwb7x/VrXLTi+sb6Aw9DqFJxOpWuj+pDPfk=
11841184
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/containerservice/armcontainerservice/v4 v4.3.0/go.mod h1:WpiaNrHqgIy+P5gTYbOA/JuMmxq7uq8onUvVBybjIlI=
1185+
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/dns/armdns v1.2.0 h1:lpOxwrQ919lCZoNCd69rVt8u1eLZuMORrGXqy8sNf3c=
1186+
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/dns/armdns v1.2.0/go.mod h1:fSvRkb8d26z9dbL40Uf/OO6Vo9iExtZK3D0ulRV+8M0=
11851187
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/internal v1.1.2 h1:mLY+pNLjCUeKhgnAJWAKhEUQM+RJQo2H1fuGSw1Ky1E=
11861188
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/internal v1.1.2/go.mod h1:FbdwsQ2EzwvXxOPcMFYO8ogEc9uMMIj3YkmCdXdAFmk=
1189+
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/internal/v2 v2.0.0 h1:PTFGRSlMKCQelWwxUyYVEUqseBJVemLyqWJjvMyt0do=
1190+
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/internal/v2 v2.0.0/go.mod h1:LRr2FzBTQlONPPa5HREE5+RjSCTXl7BwOvYOaWTqCaI=
11871191
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/managementgroups/armmanagementgroups v1.0.0 h1:pPvTJ1dY0sA35JOeFq6TsY2xj6Z85Yo23Pj4wCCvu4o=
11881192
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/managementgroups/armmanagementgroups v1.0.0/go.mod h1:mLfWfj8v3jfWKsL9G4eoBoXVcsqcIUTapmdKy7uGOp0=
11891193
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/network/armnetwork v1.0.0 h1:nBy98uKOIfun5z6wx6jwWLrULcM0+cjBalBFZlEZ7CA=
11901194
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/network/armnetwork v1.0.0/go.mod h1:243D9iHbcQXoFUtgHJwL7gl2zx1aDuDMjvBZVGr2uW0=
1195+
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/privatedns/armprivatedns v1.2.0 h1:9Eih8XcEeQnFD0ntMlUDleKMzfeCeUfa+VbnDCI4AZs=
1196+
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/privatedns/armprivatedns v1.2.0/go.mod h1:wGPyTi+aURdqPAGMZDQqnNs9IrShADF8w2WZb6bKeq0=
11911197
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resourcegraph/armresourcegraph v0.8.2 h1:f9lam+D19V0TDn17+aFhrVhWPpfsF5zaGHeqDGJZAVc=
11921198
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resourcegraph/armresourcegraph v0.8.2/go.mod h1:29c9+gYpdWhyC4TPANZBPlgoWllMDhguL2AIByPYQtk=
11931199
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources v1.1.1 h1:7CBQ+Ei8SP2c6ydQTGCCrS35bDxgTMfoP2miAwK++OU=

pkg/asset/manifests/azure/cluster.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,9 @@ func GenerateClusterAssets(installConfig *installconfig.InstallConfig, clusterID
5555
},
5656
},
5757
NetworkSpec: capz.NetworkSpec{
58+
NetworkClassSpec: capz.NetworkClassSpec{
59+
PrivateDNSZoneName: installConfig.Config.ClusterDomain(),
60+
},
5861
Vnet: capz.VnetSpec{
5962
ID: installConfig.Config.Azure.VirtualNetwork,
6063
VnetClassSpec: capz.VnetClassSpec{
@@ -63,6 +66,15 @@ func GenerateClusterAssets(installConfig *installconfig.InstallConfig, clusterID
6366
},
6467
},
6568
},
69+
APIServerLB: capz.LoadBalancerSpec{
70+
Name: fmt.Sprintf("%s-internal", clusterID.InfraID),
71+
BackendPool: capz.BackendPool{
72+
Name: fmt.Sprintf("%s-internal", clusterID.InfraID),
73+
},
74+
LoadBalancerClassSpec: capz.LoadBalancerClassSpec{
75+
Type: capz.Internal,
76+
},
77+
},
6678
Subnets: capz.Subnets{
6779
{
6880
SubnetClassSpec: capz.SubnetClassSpec{

pkg/infrastructure/azure/azure.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package azure
22

33
import (
4+
"context"
5+
46
"github.com/openshift/installer/pkg/infrastructure/clusterapi"
57
azuretypes "github.com/openshift/installer/pkg/types/azure"
68
)
@@ -12,3 +14,8 @@ type Provider struct{}
1214

1315
// Name gives the name of the provider, Azure.
1416
func (*Provider) Name() string { return azuretypes.Name }
17+
18+
// InfraReady sets the DNS currently after the ignition is done.
19+
func (p *Provider) InfraReady(ctx context.Context, in clusterapi.InfraReadyInput) error {
20+
return createDNSEntries(ctx, in)
21+
}

pkg/infrastructure/azure/dns.go

Lines changed: 196 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,196 @@
1+
package azure
2+
3+
import (
4+
"context"
5+
"fmt"
6+
7+
"github.com/Azure/azure-sdk-for-go/sdk/azidentity"
8+
"github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/dns/armdns"
9+
"github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/privatedns/armprivatedns"
10+
"k8s.io/utils/ptr"
11+
capz "sigs.k8s.io/cluster-api-provider-azure/api/v1beta1"
12+
"sigs.k8s.io/controller-runtime/pkg/client"
13+
14+
"github.com/openshift/installer/pkg/asset/manifests/capiutils"
15+
"github.com/openshift/installer/pkg/infrastructure/clusterapi"
16+
"github.com/openshift/installer/pkg/types"
17+
)
18+
19+
type recordListType string
20+
21+
const (
22+
cname recordListType = "Cname"
23+
arecord recordListType = "ARecord"
24+
aaaarecord recordListType = "AaaaRecord"
25+
)
26+
27+
type recordList struct {
28+
Name string
29+
RecordType armdns.RecordType
30+
RecordSet armdns.RecordSet
31+
}
32+
33+
type recordPrivateList struct {
34+
Name string
35+
RecordType armprivatedns.RecordType
36+
RecordSet armprivatedns.RecordSet
37+
}
38+
39+
// Create DNS entries for azure.
40+
func createDNSEntries(ctx context.Context, in clusterapi.InfraReadyInput) error {
41+
private := in.InstallConfig.Config.Publish == types.InternalPublishingStrategy
42+
baseDomainResourceGroup := in.InstallConfig.Config.Azure.BaseDomainResourceGroupName
43+
zone := in.InstallConfig.Config.BaseDomain
44+
privatezone := in.InstallConfig.Config.ClusterDomain()
45+
apiExternalName := fmt.Sprintf("api.%s", in.InstallConfig.Config.ObjectMeta.Name)
46+
47+
resourceGroup := fmt.Sprintf("%s-rg", in.InfraID)
48+
if in.InstallConfig.Config.Azure.ResourceGroupName != "" {
49+
resourceGroup = in.InstallConfig.Config.Azure.ResourceGroupName
50+
}
51+
azureTags := make(map[string]*string)
52+
for k, v := range in.InstallConfig.Config.Azure.UserTags {
53+
azureTags[k] = ptr.To(v)
54+
}
55+
azureCluster := &capz.AzureCluster{}
56+
key := client.ObjectKey{
57+
Name: in.InfraID,
58+
Namespace: capiutils.Namespace,
59+
}
60+
if err := in.Client.Get(ctx, key, azureCluster); err != nil && azureCluster != nil {
61+
return fmt.Errorf("failed to get Azure cluster: %w", err)
62+
}
63+
64+
if len(azureCluster.Spec.NetworkSpec.APIServerLB.FrontendIPs) == 0 {
65+
return fmt.Errorf("failed to get Azure cluster LB frontend IPs")
66+
}
67+
ipIlb := azureCluster.Spec.NetworkSpec.APIServerLB.FrontendIPs[0].PrivateIPAddress
68+
// useIPv6 := false
69+
// for _, network := range in.InstallConfig.Config.Networking.ServiceNetwork {
70+
// if network.IP.To4() == nil {
71+
// useIPv6 = true
72+
// }
73+
// }
74+
75+
privateRecords := []recordPrivateList{}
76+
ttl := int64(300)
77+
recordType := arecord
78+
// if useIPv6 {
79+
// recordType = aaaarecord
80+
// }
81+
privateRecords = append(privateRecords, createPrivateRecordSet("api-int", azureTags, ttl, recordType, ipIlb, ""))
82+
privateRecords = append(privateRecords, createPrivateRecordSet("api", azureTags, ttl, recordType, ipIlb, ""))
83+
84+
session, err := in.InstallConfig.Azure.Session()
85+
if err != nil {
86+
return fmt.Errorf("failed to create session: %w", err)
87+
}
88+
subscriptionID := session.Credentials.SubscriptionID
89+
tokenCreds, err := azidentity.NewClientSecretCredential(session.Credentials.TenantID, session.Credentials.ClientID, session.Credentials.ClientSecret, nil)
90+
if err != nil {
91+
return fmt.Errorf("failed to create identity: %w", err)
92+
}
93+
recordSetClient, err := armdns.NewRecordSetsClient(subscriptionID, tokenCreds, nil)
94+
if err != nil {
95+
return fmt.Errorf("failed to create public record client: %w", err)
96+
}
97+
privateRecordSetClient, err := armprivatedns.NewRecordSetsClient(subscriptionID, tokenCreds, nil)
98+
if err != nil {
99+
return fmt.Errorf("failed to create private record client: %w", err)
100+
}
101+
102+
// Create the records for api and api-int in the private zone and api.<clustername> for public zone.
103+
// CAPI currently creates a record called "apiserver" instead of "api" so creating "api" for the installer in the private zone.
104+
if !private {
105+
cnameRecordName := apiExternalName
106+
// apiExternalNameV6 := fmt.Sprintf("v6-api.%s", infraID)
107+
// if useIPv6 {
108+
// cnameRecordName = apiExternalNameV6
109+
// }
110+
// TODO: Populate with public LB FQDN. Placeholder text as value.
111+
publicRecords := createRecordSet(cnameRecordName, azureTags, ttl, cname, "", in.InstallConfig.Config.ClusterDomain())
112+
_, err = recordSetClient.CreateOrUpdate(ctx, baseDomainResourceGroup, zone, publicRecords.Name, publicRecords.RecordType, publicRecords.RecordSet, nil)
113+
if err != nil {
114+
return fmt.Errorf("failed to create public record set: %w", err)
115+
}
116+
}
117+
118+
for _, record := range privateRecords {
119+
_, err = privateRecordSetClient.CreateOrUpdate(ctx, resourceGroup, privatezone, record.RecordType, record.Name, record.RecordSet, nil)
120+
if err != nil {
121+
return fmt.Errorf("failed to create private record set: %w", err)
122+
}
123+
}
124+
125+
return nil
126+
}
127+
128+
func createPrivateRecordSet(lbType string, azureTags map[string]*string, ttl int64, rType recordListType, ipAddress string, recordName string) (record recordPrivateList) {
129+
record = recordPrivateList{
130+
Name: lbType,
131+
RecordSet: armprivatedns.RecordSet{
132+
Properties: &armprivatedns.RecordSetProperties{
133+
TTL: &ttl,
134+
Metadata: azureTags,
135+
},
136+
},
137+
}
138+
139+
switch rType {
140+
case cname:
141+
record.RecordType = armprivatedns.RecordTypeCNAME
142+
record.RecordSet.Properties.CnameRecord = &armprivatedns.CnameRecord{
143+
Cname: &recordName,
144+
}
145+
case arecord:
146+
record.RecordType = armprivatedns.RecordTypeA
147+
record.RecordSet.Properties.ARecords = []*armprivatedns.ARecord{
148+
{
149+
IPv4Address: &ipAddress,
150+
},
151+
}
152+
case aaaarecord:
153+
record.RecordType = armprivatedns.RecordTypeAAAA
154+
record.RecordSet.Properties.AaaaRecords = []*armprivatedns.AaaaRecord{
155+
{
156+
IPv6Address: &ipAddress,
157+
},
158+
}
159+
}
160+
return record
161+
}
162+
163+
func createRecordSet(lbType string, azureTags map[string]*string, ttl int64, rType recordListType, ipAddress string, recordName string) (record recordList) {
164+
record = recordList{
165+
Name: lbType,
166+
RecordSet: armdns.RecordSet{
167+
Properties: &armdns.RecordSetProperties{
168+
TTL: &ttl,
169+
Metadata: azureTags,
170+
},
171+
},
172+
}
173+
174+
switch rType {
175+
case cname:
176+
record.RecordType = armdns.RecordTypeCNAME
177+
record.RecordSet.Properties.CnameRecord = &armdns.CnameRecord{
178+
Cname: &recordName,
179+
}
180+
case arecord:
181+
record.RecordType = armdns.RecordTypeA
182+
record.RecordSet.Properties.ARecords = []*armdns.ARecord{
183+
{
184+
IPv4Address: &ipAddress,
185+
},
186+
}
187+
case aaaarecord:
188+
record.RecordType = armdns.RecordTypeAAAA
189+
record.RecordSet.Properties.AaaaRecords = []*armdns.AaaaRecord{
190+
{
191+
IPv6Address: &ipAddress,
192+
},
193+
}
194+
}
195+
return record
196+
}

vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/CHANGELOG.md

Lines changed: 23 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/arm/client.go

Lines changed: 5 additions & 11 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/arm/runtime/policy_register_rp.go

Lines changed: 3 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/arm/runtime/policy_trace_namespace.go

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)