treewide: replace bool-to-boolptr helpers with k8s.io/utils/ptr.To

Change-Id: I90419ddfe087291f41f7f2f3589263e56c15470a
Reviewed-on: https://review.monogon.dev/c/monogon/+/3675
Tested-by: Jenkins CI
Reviewed-by: Lorenz Brun <lorenz@monogon.tech>
diff --git a/metropolis/cli/metroctl/BUILD.bazel b/metropolis/cli/metroctl/BUILD.bazel
index 10aaa9c..43805df 100644
--- a/metropolis/cli/metroctl/BUILD.bazel
+++ b/metropolis/cli/metroctl/BUILD.bazel
@@ -59,6 +59,7 @@
         "@io_bazel_rules_go//go/runfiles:go_default_library",
         "@io_k8s_apimachinery//pkg/apis/meta/v1:meta",
         "@io_k8s_client_go//pkg/apis/clientauthentication/v1:clientauthentication",
+        "@io_k8s_utils//ptr",
         "@org_golang_google_grpc//:grpc",
         "@org_golang_google_protobuf//proto",
         "@org_golang_google_protobuf//types/known/fieldmaskpb",
diff --git a/metropolis/cli/metroctl/cmd_node_set.go b/metropolis/cli/metroctl/cmd_node_set.go
index bdba8a9..4211aca 100644
--- a/metropolis/cli/metroctl/cmd_node_set.go
+++ b/metropolis/cli/metroctl/cmd_node_set.go
@@ -9,6 +9,7 @@
 	"strings"
 
 	"github.com/spf13/cobra"
+	"k8s.io/utils/ptr"
 
 	"source.monogon.dev/metropolis/proto/api"
 )
@@ -39,7 +40,6 @@
 		role := strings.ToLower(args[0])
 		nodes := args[1:]
 
-		opt := func(v bool) *bool { return &v }
 		for _, node := range nodes {
 			req := &api.UpdateNodeRolesRequest{
 				Node: &api.UpdateNodeRolesRequest_Id{
@@ -48,11 +48,11 @@
 			}
 			switch role {
 			case "kubernetescontroller", "kc":
-				req.KubernetesController = opt(true)
+				req.KubernetesController = ptr.To(true)
 			case "kubernetesworker", "kw":
-				req.KubernetesWorker = opt(true)
+				req.KubernetesWorker = ptr.To(true)
 			case "consensusmember", "cm":
-				req.ConsensusMember = opt(true)
+				req.ConsensusMember = ptr.To(true)
 			default:
 				return fmt.Errorf("unknown role: %s", role)
 			}
@@ -84,7 +84,6 @@
 		role := strings.ToLower(args[0])
 		nodes := args[1:]
 
-		opt := func(v bool) *bool { return &v }
 		for _, node := range nodes {
 			req := &api.UpdateNodeRolesRequest{
 				Node: &api.UpdateNodeRolesRequest_Id{
@@ -94,11 +93,11 @@
 
 			switch role {
 			case "kubernetescontroller", "kc":
-				req.KubernetesController = opt(false)
+				req.KubernetesController = ptr.To(false)
 			case "kubernetesworker", "kw":
-				req.KubernetesWorker = opt(false)
+				req.KubernetesWorker = ptr.To(false)
 			case "consensusmember", "cm":
-				req.ConsensusMember = opt(false)
+				req.ConsensusMember = ptr.To(false)
 			default:
 				return fmt.Errorf("unknown role: %s. Must be one of: KubernetesController, KubernetesWorker, ConsensusMember", role)
 			}
diff --git a/metropolis/node/core/curator/BUILD.bazel b/metropolis/node/core/curator/BUILD.bazel
index 86d2629..fffb664 100644
--- a/metropolis/node/core/curator/BUILD.bazel
+++ b/metropolis/node/core/curator/BUILD.bazel
@@ -91,6 +91,7 @@
         "@com_github_google_go_cmp//cmp",
         "@io_etcd_go_etcd_client_v3//:client",
         "@io_etcd_go_etcd_tests_v3//integration",
+        "@io_k8s_utils//ptr",
         "@org_golang_google_grpc//:grpc",
         "@org_golang_google_grpc//grpclog",
         "@org_golang_google_grpc//test/bufconn",
diff --git a/metropolis/node/core/curator/impl_leader_test.go b/metropolis/node/core/curator/impl_leader_test.go
index 6550a30..2951191 100644
--- a/metropolis/node/core/curator/impl_leader_test.go
+++ b/metropolis/node/core/curator/impl_leader_test.go
@@ -25,6 +25,7 @@
 	"google.golang.org/protobuf/proto"
 	"google.golang.org/protobuf/testing/protocmp"
 	"google.golang.org/protobuf/types/known/timestamppb"
+	"k8s.io/utils/ptr"
 
 	common "source.monogon.dev/metropolis/node"
 	"source.monogon.dev/metropolis/node/core/consensus"
@@ -285,7 +286,7 @@
 
 type fakeLeaderOption struct {
 	// icc is the initial cluster configuration to be set when bootstrapping the
-	//fake cluster. If not set, uses system defaults.
+	// fake cluster. If not set, uses system defaults.
 	icc    *cpb.ClusterConfiguration
 	labels map[string]string
 }
@@ -1199,28 +1200,27 @@
 
 	// Define the test payloads. Each role is optional, and will be updated
 	// only if it's not nil, and its value differs from the current state.
-	opt := func(v bool) *bool { return &v }
 	ue := []*apb.UpdateNodeRolesRequest{
 		&apb.UpdateNodeRolesRequest{
 			Node: &apb.UpdateNodeRolesRequest_Pubkey{
 				Pubkey: tn[0].pubkey,
 			},
-			KubernetesWorker: opt(false),
-			ConsensusMember:  opt(false),
+			KubernetesWorker: ptr.To(false),
+			ConsensusMember:  ptr.To(false),
 		},
 		&apb.UpdateNodeRolesRequest{
 			Node: &apb.UpdateNodeRolesRequest_Pubkey{
 				Pubkey: tn[1].pubkey,
 			},
-			KubernetesWorker: opt(false),
-			ConsensusMember:  opt(true),
+			KubernetesWorker: ptr.To(false),
+			ConsensusMember:  ptr.To(true),
 		},
 		&apb.UpdateNodeRolesRequest{
 			Node: &apb.UpdateNodeRolesRequest_Pubkey{
 				Pubkey: tn[2].pubkey,
 			},
-			KubernetesWorker: opt(true),
-			ConsensusMember:  opt(true),
+			KubernetesWorker: ptr.To(true),
+			ConsensusMember:  ptr.To(true),
 		},
 		&apb.UpdateNodeRolesRequest{
 			Node: &apb.UpdateNodeRolesRequest_Pubkey{
@@ -1274,14 +1274,14 @@
 			Node: &apb.UpdateNodeRolesRequest_Pubkey{
 				Pubkey: tn[0].pubkey,
 			},
-			KubernetesController: opt(true),
-			ConsensusMember:      opt(false),
+			KubernetesController: ptr.To(true),
+			ConsensusMember:      ptr.To(false),
 		},
 		&apb.UpdateNodeRolesRequest{
 			Node: &apb.UpdateNodeRolesRequest_Pubkey{
 				Pubkey: tn[0].pubkey,
 			},
-			KubernetesController: opt(true),
+			KubernetesController: ptr.To(true),
 			ConsensusMember:      nil,
 		},
 	}
diff --git a/metropolis/node/kubernetes/BUILD.bazel b/metropolis/node/kubernetes/BUILD.bazel
index 15eec36..16f773c 100644
--- a/metropolis/node/kubernetes/BUILD.bazel
+++ b/metropolis/node/kubernetes/BUILD.bazel
@@ -69,6 +69,7 @@
         "@io_k8s_kubernetes//pkg/features",
         "@io_k8s_kubernetes//plugin/pkg/admission/security/podsecurity",
         "@io_k8s_pod_security_admission//admission/api/v1:api",
+        "@io_k8s_utils//ptr",
         "@org_golang_google_grpc//:grpc",
         "@org_golang_google_grpc//codes",
         "@org_golang_google_grpc//status",
diff --git a/metropolis/node/kubernetes/kubelet.go b/metropolis/node/kubernetes/kubelet.go
index 9845b3b..16fb520 100644
--- a/metropolis/node/kubernetes/kubelet.go
+++ b/metropolis/node/kubernetes/kubelet.go
@@ -27,12 +27,12 @@
 
 	v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	kubeletconfig "k8s.io/kubelet/config/v1beta1"
+	"k8s.io/utils/ptr"
 
 	ipb "source.monogon.dev/metropolis/node/core/curator/proto/api"
 
 	"source.monogon.dev/metropolis/node/core/localstorage"
 	"source.monogon.dev/metropolis/node/kubernetes/pki"
-	"source.monogon.dev/metropolis/node/kubernetes/reconciler"
 	"source.monogon.dev/osbase/fileargs"
 	"source.monogon.dev/osbase/supervisor"
 )
@@ -99,10 +99,10 @@
 		},
 		// TODO(q3k): move reconciler.False to a generic package, fix the following references.
 		ClusterDomain:                s.ClusterDomain,
-		EnableControllerAttachDetach: reconciler.False(),
+		EnableControllerAttachDetach: ptr.To(false),
 		HairpinMode:                  "none",
-		MakeIPTablesUtilChains:       reconciler.False(), // We don't have iptables
-		FailSwapOn:                   reconciler.False(),
+		MakeIPTablesUtilChains:       ptr.To(false), // We don't have iptables
+		FailSwapOn:                   ptr.To(false),
 		MemorySwap: kubeletconfig.MemorySwapConfiguration{
 			// Only allow burstable pods to use swap
 			SwapBehavior: "LimitedSwap",
diff --git a/metropolis/node/kubernetes/reconciler/BUILD.bazel b/metropolis/node/kubernetes/reconciler/BUILD.bazel
index 1616787..3e66db3 100644
--- a/metropolis/node/kubernetes/reconciler/BUILD.bazel
+++ b/metropolis/node/kubernetes/reconciler/BUILD.bazel
@@ -35,6 +35,7 @@
         "@io_k8s_apimachinery//pkg/api/validation",
         "@io_k8s_apimachinery//pkg/apis/meta/v1:meta",
         "@io_k8s_client_go//kubernetes",
+        "@io_k8s_utils//ptr",
         "@org_golang_google_protobuf//proto",
     ],
 )
diff --git a/metropolis/node/kubernetes/reconciler/reconciler.go b/metropolis/node/kubernetes/reconciler/reconciler.go
index 523b31b..b791341 100644
--- a/metropolis/node/kubernetes/reconciler/reconciler.go
+++ b/metropolis/node/kubernetes/reconciler/reconciler.go
@@ -41,16 +41,6 @@
 	"source.monogon.dev/osbase/supervisor"
 )
 
-// True is a sad workaround for all the pointer booleans in K8s specs
-func True() *bool {
-	val := true
-	return &val
-}
-func False() *bool {
-	val := false
-	return &val
-}
-
 const (
 	// BuiltinLabelKey is used as a k8s label to mark built-in objects (ie.,
 	// managed by the reconciler)
diff --git a/metropolis/node/kubernetes/reconciler/resources_csi.go b/metropolis/node/kubernetes/reconciler/resources_csi.go
index 06eb3ac..a1ca29f 100644
--- a/metropolis/node/kubernetes/reconciler/resources_csi.go
+++ b/metropolis/node/kubernetes/reconciler/resources_csi.go
@@ -22,6 +22,7 @@
 	storage "k8s.io/api/storage/v1"
 	meta "k8s.io/apimachinery/pkg/apis/meta/v1"
 	"k8s.io/client-go/kubernetes"
+	"k8s.io/utils/ptr"
 )
 
 // TODO(q3k): this is duplicated with
@@ -70,13 +71,13 @@
 				Labels: builtinLabels(nil),
 			},
 			Spec: storage.CSIDriverSpec{
-				AttachRequired:       False(),
-				PodInfoOnMount:       False(),
+				AttachRequired:       ptr.To(false),
+				PodInfoOnMount:       ptr.To(false),
 				VolumeLifecycleModes: []storage.VolumeLifecycleMode{storage.VolumeLifecyclePersistent},
-				StorageCapacity:      False(),
+				StorageCapacity:      ptr.To(false),
 				FSGroupPolicy:        &fsGroupPolicy,
-				RequiresRepublish:    False(),
-				SELinuxMount:         False(),
+				RequiresRepublish:    ptr.To(false),
+				SELinuxMount:         ptr.To(false),
 			},
 		},
 	}
diff --git a/metropolis/node/kubernetes/reconciler/resources_storageclass.go b/metropolis/node/kubernetes/reconciler/resources_storageclass.go
index 9be81fb..b3afc13 100644
--- a/metropolis/node/kubernetes/reconciler/resources_storageclass.go
+++ b/metropolis/node/kubernetes/reconciler/resources_storageclass.go
@@ -23,6 +23,7 @@
 	storage "k8s.io/api/storage/v1"
 	meta "k8s.io/apimachinery/pkg/apis/meta/v1"
 	"k8s.io/client-go/kubernetes"
+	"k8s.io/utils/ptr"
 )
 
 var reclaimPolicyDelete = core.PersistentVolumeReclaimDelete
@@ -71,7 +72,7 @@
 						"It is backed by XFS.",
 				},
 			},
-			AllowVolumeExpansion: True(),
+			AllowVolumeExpansion: ptr.To(true),
 			Provisioner:          csiProvisionerName,
 			ReclaimPolicy:        &reclaimPolicyDelete,
 			VolumeBindingMode:    &waitForConsumerBinding,