1 /* 2 Package dennis provides a simple K8s controller for automatically creating 3 DNSRecordSets in response to ComputeAddress resources, based on annotation 4 values. 5 6 DNS records are created according to annotations on a ComputeAddress object. 7 Example: 8 9 apiVersion: compute.cnrm.cloud.google.com/v1beta1 10 kind: ComputeAddress 11 metadata: 12 name: dev0-ip 13 labels: 14 platform.edge.ncr.com/component: dev0 15 annotations: 16 cnrm.cloud.google.com/deletion-policy: abandon 17 dns.edge.ncr.com/name: "dev0.edge-preprod.dev." 18 dns.edge.ncr.com/managed-zone: "infra/edge-preprod-dns-managed-zone" 19 dns.edge.ncr.com/dns-project-id: "ret-edge-pltf-preprod-infra" 20 dns.edge.ncr.com/external: "true" 21 22 dns.edge.ncr.com/name: 23 24 A FQDN. Creates a Type A DNS record mapping the ComputeAddress to the value of 25 this annotation. Represented as a DNSRecordSet. 26 27 dns.edge.ncr.com/managed-zone: 28 29 The namespace/name formatted reference to the DNSManagedZone object that this record 30 will be in. 31 32 dns.edge.ncr.com/dns-project-id: 33 34 The GCP project where the DNS Managed Zone exists, and where the DNS Record will be created 35 36 dns.edge.ncr.com/external: 37 38 If external is false, it is assumed that the names refer to DNSManagedZone resouces on the cluster. 39 If true, the dns-project-id will be used as a reference to a non-k8s-resource DNS Managed Zone in GCP. 40 41 dns.edge.ncr.com/record-configs: 42 43 Record config is a JSON string containing structured configuration. Supports the same options as individual 44 annotations but allows for outputting multiple DNSRecordSets for a single ComputeAddress 45 46 '[ 47 { 48 "name": string, 49 "managed-zone": string, 50 "dns-project-id": string, 51 "external": string 52 } 53 ]' 54 */ 55 package dennis 56 57 import ( 58 "k8s.io/apimachinery/pkg/runtime" 59 utilruntime "k8s.io/apimachinery/pkg/util/runtime" 60 61 compute "github.com/GoogleCloudPlatform/k8s-config-connector/pkg/clients/generated/apis/compute/v1beta1" 62 dns "github.com/GoogleCloudPlatform/k8s-config-connector/pkg/clients/generated/apis/dns/v1beta1" 63 "github.com/go-logr/logr" 64 clientgoscheme "k8s.io/client-go/kubernetes/scheme" 65 ctrl "sigs.k8s.io/controller-runtime" 66 67 "edge-infra.dev/pkg/k8s/runtime/controller" 68 "edge-infra.dev/pkg/lib/logging" 69 ) 70 71 // Run creates the manager, sets up the controller, and then starts 72 // everything. It returns the created manager for testing purposes 73 func Run(o ...controller.Option) error { 74 mgr, log, err := create(o...) 75 if err != nil { 76 return err 77 } 78 79 log.Info("starting manager") 80 if err := mgr.Start(ctrl.SetupSignalHandler()); err != nil { 81 log.Error(err, "problem running manager") 82 return err 83 } 84 85 return nil 86 } 87 88 // create wires up the reconciler(s) with a created manager and returns the 89 // manager + setup logger 90 func create(o ...controller.Option) (ctrl.Manager, logr.Logger, error) { 91 ctrl.SetLogger(logging.NewLogger().Logger) 92 log := ctrl.Log.WithName("setup") 93 94 cfg, opts := controller.ProcessOptions(o...) 95 opts.LeaderElectionID = "183sas2df.recordboi.com" 96 opts.Scheme = createScheme() 97 98 mgr, err := ctrl.NewManager(cfg, opts) 99 if err != nil { 100 log.Error(err, "failed to create manager") 101 return nil, logr.Logger{}, err 102 } 103 104 if err = (&ComputeAddressReconciler{ 105 Client: mgr.GetClient(), 106 Log: ctrl.Log.WithName("dennis-controller"), 107 Name: "dennis-controller", 108 }).SetupWithManager(mgr); err != nil { 109 log.Error(err, "failed to create controller and set up with manager") 110 return nil, logr.Logger{}, err 111 } 112 113 return mgr, log, nil 114 } 115 116 func createScheme() *runtime.Scheme { 117 scheme := runtime.NewScheme() 118 119 utilruntime.Must(clientgoscheme.AddToScheme(scheme)) 120 utilruntime.Must(compute.AddToScheme(scheme)) 121 utilruntime.Must(dns.AddToScheme(scheme)) 122 123 return scheme 124 } 125