...

Source file src/edge-infra.dev/pkg/sds/interlock/internal/config/config.go

Documentation: edge-infra.dev/pkg/sds/interlock/internal/config

     1  package config
     2  
     3  import (
     4  	"flag"
     5  	"fmt"
     6  	"time"
     7  
     8  	"github.com/spf13/afero"
     9  	corev1 "k8s.io/api/core/v1"
    10  	"k8s.io/apimachinery/pkg/fields"
    11  	"k8s.io/apimachinery/pkg/runtime"
    12  	utilruntime "k8s.io/apimachinery/pkg/util/runtime"
    13  	clientgoscheme "k8s.io/client-go/kubernetes/scheme"
    14  	"k8s.io/client-go/rest"
    15  	"sigs.k8s.io/controller-runtime/pkg/cache"
    16  	ctrlclient "sigs.k8s.io/controller-runtime/pkg/client"
    17  
    18  	"edge-infra.dev/pkg/edge/info"
    19  	kuberetryclient "edge-infra.dev/pkg/sds/lib/k8s/retryclient"
    20  	kubeclienttypes "edge-infra.dev/pkg/sds/lib/k8s/retryclient/types"
    21  )
    22  
    23  type Config struct {
    24  	KubeRetryClient kubeclienttypes.Retrier
    25  	Cache           cache.Cache
    26  	Fs              afero.Fs
    27  }
    28  
    29  func (cf *Config) BindFlags(flags *flag.FlagSet) {
    30  	flags.StringVar(
    31  		&info.EdgeConfigMapNS,
    32  		"edge-configmap-namespace",
    33  		info.DefaultEdgeConfigMapNS,
    34  		"Optionally override edge info config map namespace. This is mainly useful for integration tests which run in a shared cluster.",
    35  	)
    36  }
    37  
    38  func New(fs afero.Fs) (*Config, error) {
    39  	client, err := newKubeClient()
    40  	if err != nil {
    41  		return nil, err
    42  	}
    43  	reader, err := newKubeReader()
    44  	if err != nil {
    45  		return nil, err
    46  	}
    47  	cfg := &Config{
    48  		KubeRetryClient: kuberetryclient.New(client, reader, kuberetryclient.Config{}),
    49  		Cache:           reader,
    50  		Fs:              fs,
    51  	}
    52  	return cfg, nil
    53  }
    54  
    55  // newKubeClient creates a new Kubernetes client without read cache.
    56  func newKubeClient() (ctrlclient.Client, error) {
    57  	config, err := rest.InClusterConfig()
    58  	if err != nil {
    59  		return nil, fmt.Errorf("unable to load in-cluster config: %v", err)
    60  	}
    61  
    62  	opts := ctrlclient.Options{
    63  		Scheme: createScheme(),
    64  	}
    65  	return ctrlclient.New(config, opts)
    66  }
    67  
    68  // newKubeReader creates a new Kubernetes client with read cache.
    69  func newKubeReader() (cache.Cache, error) {
    70  	config, err := rest.InClusterConfig()
    71  	if err != nil {
    72  		return nil, fmt.Errorf("unable to load in-cluster config: %v", err)
    73  	}
    74  	resync := 1 * time.Hour
    75  	opts := cache.Options{
    76  		Scheme:     createScheme(),
    77  		SyncPeriod: &resync,
    78  		ByObject: map[ctrlclient.Object]cache.ByObject{
    79  			&corev1.ConfigMap{}: {
    80  				Field: fields.SelectorFromSet(fields.Set{
    81  					"metadata.name":      info.EdgeConfigMapName,
    82  					"metadata.namespace": info.EdgeConfigMapNS,
    83  				}),
    84  			},
    85  		},
    86  	}
    87  	return cache.New(config, opts)
    88  }
    89  
    90  // createScheme creates a new scheme with the EtcdMember type registered
    91  func createScheme() *runtime.Scheme {
    92  	scheme := runtime.NewScheme()
    93  	utilruntime.Must(clientgoscheme.AddToScheme(scheme))
    94  	return scheme
    95  }
    96  

View as plain text