package main import ( "context" "errors" "flag" "os" "path/filepath" "github.com/go-logr/logr" "github.com/peterbourgon/ff/v3" dsapi "edge-infra.dev/pkg/edge/datasync/apis/v1alpha1" "edge-infra.dev/pkg/edge/datasync/datasyncinit" "edge-infra.dev/pkg/lib/logging" "k8s.io/apimachinery/pkg/runtime" utilruntime "k8s.io/apimachinery/pkg/util/runtime" clientgoscheme "k8s.io/client-go/kubernetes/scheme" "k8s.io/client-go/rest" "k8s.io/client-go/tools/clientcmd" "k8s.io/client-go/util/homedir" "sigs.k8s.io/controller-runtime/pkg/client" ) func main() { ctx := context.Background() log := logging.NewLogger().WithName("datasyncinit") flags := flag.NewFlagSet("datasyncinit", flag.ExitOnError) cfg := &datasyncinit.Config{} cfg.BindFlags(flags) if err := ff.Parse(flags, os.Args[1:], ff.WithEnvVarNoPrefix(), ff.WithIgnoreUndefined(true)); err != nil { log.Error(err, "error parsing cmd arguments or env variables") } if err := cfg.Validate(); err != nil { log.Error(err, "invalid config for workload initialization") os.Exit(1) } log = log.WithValues("config", cfg) log.Info("Workload initialization started") config, err := rest.InClusterConfig() if errors.Is(err, rest.ErrNotInCluster) { config, err = clientcmd.BuildConfigFromFlags("", filepath.Join(homedir.HomeDir(), ".kube", "config")) if err != nil { log.Error(err, "fail to get local config") os.Exit(1) } } else if err != nil { log.Error(err, "fail to get in-cluster config") os.Exit(1) } cl, err := client.NewWithWatch(config, client.Options{Scheme: createScheme()}) if err != nil { log.Error(err, "fail to create new k8 client") os.Exit(1) } ctx = logr.NewContext(ctx, log) if err = datasyncinit.InitializeWorkload(ctx, cl, cfg); err != nil { os.Exit(1) } } func createScheme() *runtime.Scheme { scheme := runtime.NewScheme() utilruntime.Must(clientgoscheme.AddToScheme(scheme)) utilruntime.Must(dsapi.AddToScheme(scheme)) return scheme }