Skip to content

Commit e69b757

Browse files
committed
fix: nil pointer dereferences in private cluster reconciliation
Fixes two nil pointer dereference issues when creating/reconciling private GKE clusters with PSC (no controlPlaneCidrBlock): 1. Initialize NetworkConfig before accessing DefaultEnablePrivateNodes (reconcile.go:229-240) - based on PR kubernetes-sigs#1503 2. Initialize DesiredControlPlaneEndpointsConfig.IpEndpointsConfig before assigning AuthorizedNetworksConfig in checkDiffAndPrepareUpdate (reconcile.go:520-525) Related issues: - kubernetes-sigs#1497 - kubernetes-sigs#1503
1 parent e6e3646 commit e69b757

File tree

1 file changed

+16
-9
lines changed

1 file changed

+16
-9
lines changed

cloud/services/container/clusters/reconcile.go

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -291,27 +291,28 @@ func (s *Service) createCluster(ctx context.Context, log *logr.Logger) error {
291291
}
292292

293293
if cn.PrivateCluster != nil {
294-
cluster.PrivateClusterConfig = &containerpb.PrivateClusterConfig{}
295-
296294
enablePublicEndpoint := !cn.PrivateCluster.EnablePrivateEndpoint
297295
cluster.ControlPlaneEndpointsConfig.IpEndpointsConfig.EnablePublicEndpoint = &enablePublicEndpoint
298-
299296
if cn.PrivateCluster.EnablePrivateEndpoint {
300297
cluster.ControlPlaneEndpointsConfig.IpEndpointsConfig.AuthorizedNetworksConfig = &containerpb.MasterAuthorizedNetworksConfig{
301298
Enabled: true,
302299
}
303300
}
304-
305-
cluster.NetworkConfig.DefaultEnablePrivateNodes = &cn.PrivateCluster.EnablePrivateNodes
306-
307-
cluster.PrivateClusterConfig.MasterIpv4CidrBlock = cn.PrivateCluster.ControlPlaneCidrBlock
308-
cluster.ControlPlaneEndpointsConfig.IpEndpointsConfig.GlobalAccess = &cn.PrivateCluster.ControlPlaneGlobalAccess
309-
310301
cluster.NetworkConfig = &containerpb.NetworkConfig{
311302
DefaultSnatStatus: &containerpb.DefaultSnatStatus{
312303
Disabled: cn.PrivateCluster.DisableDefaultSNAT,
313304
},
314305
}
306+
307+
cluster.NetworkConfig.DefaultEnablePrivateNodes = &cn.PrivateCluster.EnablePrivateNodes
308+
309+
cluster.PrivateClusterConfig = &containerpb.PrivateClusterConfig{
310+
MasterIpv4CidrBlock: cn.PrivateCluster.ControlPlaneCidrBlock,
311+
// EnablePrivateNodes is deprecated but GCP SDK raises an error if the value
312+
// of this field is different from the value of NetworkConfig.DefaultEnablePrivateNodes
313+
EnablePrivateNodes: cn.PrivateCluster.EnablePrivateNodes,
314+
}
315+
cluster.ControlPlaneEndpointsConfig.IpEndpointsConfig.GlobalAccess = &cn.PrivateCluster.ControlPlaneGlobalAccess
315316
}
316317
}
317318

@@ -516,6 +517,12 @@ func (s *Service) checkDiffAndPrepareUpdate(existingCluster *containerpb.Cluster
516517
desiredMasterAuthorizedNetworksConfig := convertToSdkMasterAuthorizedNetworksConfig(s.scope.GCPManagedControlPlane.Spec.MasterAuthorizedNetworksConfig)
517518
if !compareMasterAuthorizedNetworksConfig(desiredMasterAuthorizedNetworksConfig, existingCluster.GetControlPlaneEndpointsConfig().GetIpEndpointsConfig().GetAuthorizedNetworksConfig()) {
518519
needUpdate = true
520+
if clusterUpdate.DesiredControlPlaneEndpointsConfig == nil {
521+
clusterUpdate.DesiredControlPlaneEndpointsConfig = &containerpb.ControlPlaneEndpointsConfig{}
522+
}
523+
if clusterUpdate.DesiredControlPlaneEndpointsConfig.IpEndpointsConfig == nil {
524+
clusterUpdate.DesiredControlPlaneEndpointsConfig.IpEndpointsConfig = &containerpb.ControlPlaneEndpointsConfig_IPEndpointsConfig{}
525+
}
519526
clusterUpdate.DesiredControlPlaneEndpointsConfig.IpEndpointsConfig.AuthorizedNetworksConfig = desiredMasterAuthorizedNetworksConfig
520527
log.V(2).Info("Master authorized networks config update required", "current", existingCluster.GetControlPlaneEndpointsConfig().GetIpEndpointsConfig().GetAuthorizedNetworksConfig(), "desired", desiredMasterAuthorizedNetworksConfig)
521528
}

0 commit comments

Comments
 (0)