...

Source file src/edge-infra.dev/pkg/f8n/gcp/k8s/controllers/dennis/controller.go

Documentation: edge-infra.dev/pkg/f8n/gcp/k8s/controllers/dennis

     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  

View as plain text