Skip to content

Commit 1c23009

Browse files
authored
Merge pull request #4921 from jparrill/backport_r2.4/OCPBUGS-29391
[release-2.4] 🐛 fix: Fix instance PrivateDNSName when domain-name is set in dhcpOpts
2 parents 3ee30c2 + 362a226 commit 1c23009

18 files changed

+442
-1
lines changed

cmd/clusterawsadm/cloudformation/bootstrap/cluster_api_controller.go

+1
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,7 @@ func (t Template) ControllersPolicy() *iamv1.PolicyDocument {
131131
"ec2:DescribeSecurityGroups",
132132
"ec2:DescribeSubnets",
133133
"ec2:DescribeVpcs",
134+
"ec2:DescribeDhcpOptions",
134135
"ec2:DescribeVpcAttribute",
135136
"ec2:DescribeVpcEndpoints",
136137
"ec2:DescribeVolumes",

cmd/clusterawsadm/cloudformation/bootstrap/fixtures/customsuffix.yaml

+1
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,7 @@ Resources:
190190
- ec2:DescribeSecurityGroups
191191
- ec2:DescribeSubnets
192192
- ec2:DescribeVpcs
193+
- ec2:DescribeDhcpOptions
193194
- ec2:DescribeVpcAttribute
194195
- ec2:DescribeVpcEndpoints
195196
- ec2:DescribeVolumes

cmd/clusterawsadm/cloudformation/bootstrap/fixtures/default.yaml

+1
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,7 @@ Resources:
190190
- ec2:DescribeSecurityGroups
191191
- ec2:DescribeSubnets
192192
- ec2:DescribeVpcs
193+
- ec2:DescribeDhcpOptions
193194
- ec2:DescribeVpcAttribute
194195
- ec2:DescribeVpcEndpoints
195196
- ec2:DescribeVolumes

cmd/clusterawsadm/cloudformation/bootstrap/fixtures/with_all_secret_backends.yaml

+1
Original file line numberDiff line numberDiff line change
@@ -196,6 +196,7 @@ Resources:
196196
- ec2:DescribeSecurityGroups
197197
- ec2:DescribeSubnets
198198
- ec2:DescribeVpcs
199+
- ec2:DescribeDhcpOptions
199200
- ec2:DescribeVpcAttribute
200201
- ec2:DescribeVpcEndpoints
201202
- ec2:DescribeVolumes

cmd/clusterawsadm/cloudformation/bootstrap/fixtures/with_allow_assume_role.yaml

+1
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,7 @@ Resources:
190190
- ec2:DescribeSecurityGroups
191191
- ec2:DescribeSubnets
192192
- ec2:DescribeVpcs
193+
- ec2:DescribeDhcpOptions
193194
- ec2:DescribeVpcAttribute
194195
- ec2:DescribeVpcEndpoints
195196
- ec2:DescribeVolumes

cmd/clusterawsadm/cloudformation/bootstrap/fixtures/with_bootstrap_user.yaml

+1
Original file line numberDiff line numberDiff line change
@@ -196,6 +196,7 @@ Resources:
196196
- ec2:DescribeSecurityGroups
197197
- ec2:DescribeSubnets
198198
- ec2:DescribeVpcs
199+
- ec2:DescribeDhcpOptions
199200
- ec2:DescribeVpcAttribute
200201
- ec2:DescribeVpcEndpoints
201202
- ec2:DescribeVolumes

cmd/clusterawsadm/cloudformation/bootstrap/fixtures/with_custom_bootstrap_user.yaml

+1
Original file line numberDiff line numberDiff line change
@@ -196,6 +196,7 @@ Resources:
196196
- ec2:DescribeSecurityGroups
197197
- ec2:DescribeSubnets
198198
- ec2:DescribeVpcs
199+
- ec2:DescribeDhcpOptions
199200
- ec2:DescribeVpcAttribute
200201
- ec2:DescribeVpcEndpoints
201202
- ec2:DescribeVolumes

cmd/clusterawsadm/cloudformation/bootstrap/fixtures/with_different_instance_profiles.yaml

+1
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,7 @@ Resources:
190190
- ec2:DescribeSecurityGroups
191191
- ec2:DescribeSubnets
192192
- ec2:DescribeVpcs
193+
- ec2:DescribeDhcpOptions
193194
- ec2:DescribeVpcAttribute
194195
- ec2:DescribeVpcEndpoints
195196
- ec2:DescribeVolumes

cmd/clusterawsadm/cloudformation/bootstrap/fixtures/with_eks_console.yaml

+1
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,7 @@ Resources:
190190
- ec2:DescribeSecurityGroups
191191
- ec2:DescribeSubnets
192192
- ec2:DescribeVpcs
193+
- ec2:DescribeDhcpOptions
193194
- ec2:DescribeVpcAttribute
194195
- ec2:DescribeVpcEndpoints
195196
- ec2:DescribeVolumes

cmd/clusterawsadm/cloudformation/bootstrap/fixtures/with_eks_default_roles.yaml

+1
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,7 @@ Resources:
190190
- ec2:DescribeSecurityGroups
191191
- ec2:DescribeSubnets
192192
- ec2:DescribeVpcs
193+
- ec2:DescribeDhcpOptions
193194
- ec2:DescribeVpcAttribute
194195
- ec2:DescribeVpcEndpoints
195196
- ec2:DescribeVolumes

cmd/clusterawsadm/cloudformation/bootstrap/fixtures/with_eks_disable.yaml

+1
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,7 @@ Resources:
190190
- ec2:DescribeSecurityGroups
191191
- ec2:DescribeSubnets
192192
- ec2:DescribeVpcs
193+
- ec2:DescribeDhcpOptions
193194
- ec2:DescribeVpcAttribute
194195
- ec2:DescribeVpcEndpoints
195196
- ec2:DescribeVolumes

cmd/clusterawsadm/cloudformation/bootstrap/fixtures/with_eks_kms_prefix.yaml

+1
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,7 @@ Resources:
190190
- ec2:DescribeSecurityGroups
191191
- ec2:DescribeSubnets
192192
- ec2:DescribeVpcs
193+
- ec2:DescribeDhcpOptions
193194
- ec2:DescribeVpcAttribute
194195
- ec2:DescribeVpcEndpoints
195196
- ec2:DescribeVolumes

cmd/clusterawsadm/cloudformation/bootstrap/fixtures/with_extra_statements.yaml

+1
Original file line numberDiff line numberDiff line change
@@ -196,6 +196,7 @@ Resources:
196196
- ec2:DescribeSecurityGroups
197197
- ec2:DescribeSubnets
198198
- ec2:DescribeVpcs
199+
- ec2:DescribeDhcpOptions
199200
- ec2:DescribeVpcAttribute
200201
- ec2:DescribeVpcEndpoints
201202
- ec2:DescribeVolumes

cmd/clusterawsadm/cloudformation/bootstrap/fixtures/with_s3_bucket.yaml

+1
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,7 @@ Resources:
190190
- ec2:DescribeSecurityGroups
191191
- ec2:DescribeSubnets
192192
- ec2:DescribeVpcs
193+
- ec2:DescribeDhcpOptions
193194
- ec2:DescribeVpcAttribute
194195
- ec2:DescribeVpcEndpoints
195196
- ec2:DescribeVolumes

cmd/clusterawsadm/cloudformation/bootstrap/fixtures/with_ssm_secret_backend.yaml

+1
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,7 @@ Resources:
190190
- ec2:DescribeSecurityGroups
191191
- ec2:DescribeSubnets
192192
- ec2:DescribeVpcs
193+
- ec2:DescribeDhcpOptions
193194
- ec2:DescribeVpcAttribute
194195
- ec2:DescribeVpcEndpoints
195196
- ec2:DescribeVolumes

controllers/awsmachine_controller_test.go

+8
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,10 @@ func TestAWSMachineReconcilerIntegrationTests(t *testing.T) {
114114
}}})
115115
g.Expect(err).To(BeNil())
116116
cs.Cluster = &clusterv1.Cluster{ObjectMeta: metav1.ObjectMeta{Name: "test-cluster"}}
117+
cs.AWSCluster.Spec.NetworkSpec.VPC = infrav1.VPCSpec{
118+
ID: "vpc-exists",
119+
CidrBlock: "10.0.0.0/16",
120+
}
117121
cs.AWSCluster.Status.Network.APIServerELB.DNSName = DNSName
118122
cs.AWSCluster.Spec.ControlPlaneLoadBalancer = &infrav1.AWSLoadBalancerSpec{
119123
LoadBalancerType: infrav1.LoadBalancerTypeClassic,
@@ -283,6 +287,10 @@ func TestAWSMachineReconcilerIntegrationTests(t *testing.T) {
283287
g.Expect(err).To(BeNil())
284288
cs.Cluster = &clusterv1.Cluster{ObjectMeta: metav1.ObjectMeta{Name: "test-cluster"}}
285289
cs.AWSCluster.Status.Network.APIServerELB.DNSName = DNSName
290+
cs.AWSCluster.Spec.NetworkSpec.VPC = infrav1.VPCSpec{
291+
ID: "vpc-exists",
292+
CidrBlock: "10.0.0.0/16",
293+
}
286294
cs.AWSCluster.Spec.ControlPlaneLoadBalancer = &infrav1.AWSLoadBalancerSpec{
287295
LoadBalancerType: infrav1.LoadBalancerTypeClassic,
288296
}

pkg/cloud/services/ec2/instances.go

+62
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import (
2525

2626
"github.com/aws/aws-sdk-go/aws"
2727
"github.com/aws/aws-sdk-go/service/ec2"
28+
"github.com/aws/aws-sdk-go/service/ec2/ec2iface"
2829
"github.com/pkg/errors"
2930
"k8s.io/utils/ptr"
3031

@@ -913,6 +914,8 @@ func (s *Service) SDKToInstance(v *ec2.Instance) (*infrav1.Instance, error) {
913914

914915
func (s *Service) getInstanceAddresses(instance *ec2.Instance) []clusterv1.MachineAddress {
915916
addresses := []clusterv1.MachineAddress{}
917+
// Check if the DHCP Option Set has domain name set
918+
domainName := s.GetDHCPOptionSetDomainName(s.EC2Client, instance.VpcId)
916919
for _, eni := range instance.NetworkInterfaces {
917920
privateDNSAddress := clusterv1.MachineAddress{
918921
Type: clusterv1.MachineInternalDNS,
@@ -922,8 +925,18 @@ func (s *Service) getInstanceAddresses(instance *ec2.Instance) []clusterv1.Machi
922925
Type: clusterv1.MachineInternalIP,
923926
Address: aws.StringValue(eni.PrivateIpAddress),
924927
}
928+
925929
addresses = append(addresses, privateDNSAddress, privateIPAddress)
926930

931+
if domainName != nil {
932+
// Add secondary private DNS Name with domain name set in DHCP Option Set
933+
additionalPrivateDNSAddress := clusterv1.MachineAddress{
934+
Type: clusterv1.MachineInternalDNS,
935+
Address: fmt.Sprintf("%s.%s", strings.Split(privateDNSAddress.Address, ".")[0], *domainName),
936+
}
937+
addresses = append(addresses, additionalPrivateDNSAddress)
938+
}
939+
927940
// An elastic IP is attached if association is non nil pointer
928941
if eni.Association != nil {
929942
publicDNSAddress := clusterv1.MachineAddress{
@@ -937,6 +950,7 @@ func (s *Service) getInstanceAddresses(instance *ec2.Instance) []clusterv1.Machi
937950
addresses = append(addresses, publicDNSAddress, publicIPAddress)
938951
}
939952
}
953+
940954
return addresses
941955
}
942956

@@ -1035,6 +1049,54 @@ func (s *Service) ModifyInstanceMetadataOptions(instanceID string, options *infr
10351049
return nil
10361050
}
10371051

1052+
// GetDHCPOptionSetDomainName returns the domain DNS name for the VPC from the DHCP Options.
1053+
func (s *Service) GetDHCPOptionSetDomainName(ec2client ec2iface.EC2API, vpcID *string) *string {
1054+
log := s.scope.GetLogger()
1055+
1056+
if vpcID == nil {
1057+
log.Info("vpcID is nil, skipping DHCP Option Set discovery")
1058+
return nil
1059+
}
1060+
1061+
vpcInput := &ec2.DescribeVpcsInput{
1062+
VpcIds: []*string{vpcID},
1063+
}
1064+
1065+
vpcResult, err := ec2client.DescribeVpcs(vpcInput)
1066+
if err != nil {
1067+
log.Info("failed to describe VPC, skipping DHCP Option Set discovery", "vpcID", *vpcID, "Error", err.Error())
1068+
return nil
1069+
}
1070+
1071+
dhcpInput := &ec2.DescribeDhcpOptionsInput{
1072+
DhcpOptionsIds: []*string{vpcResult.Vpcs[0].DhcpOptionsId},
1073+
}
1074+
1075+
dhcpResult, err := ec2client.DescribeDhcpOptions(dhcpInput)
1076+
if err != nil {
1077+
log.Error(err, "failed to describe DHCP Options Set", "DhcpOptionsSet", *dhcpResult)
1078+
return nil
1079+
}
1080+
1081+
for _, dhcpConfig := range dhcpResult.DhcpOptions[0].DhcpConfigurations {
1082+
if *dhcpConfig.Key == "domain-name" {
1083+
if len(dhcpConfig.Values) == 0 {
1084+
return nil
1085+
}
1086+
domainName := dhcpConfig.Values[0].Value
1087+
// default domainName is 'ec2.internal' in us-east-1 and 'region.compute.internal' in the other regions.
1088+
if (s.scope.Region() == "us-east-1" && *domainName == "ec2.internal") ||
1089+
(s.scope.Region() != "us-east-1" && *domainName == fmt.Sprintf("%s.compute.internal", s.scope.Region())) {
1090+
return nil
1091+
}
1092+
1093+
return domainName
1094+
}
1095+
}
1096+
1097+
return nil
1098+
}
1099+
10381100
// filterGroups filters a list for a string.
10391101
func filterGroups(list []string, strToFilter string) (newList []string) {
10401102
for _, item := range list {

0 commit comments

Comments
 (0)