package xserver import ( "context" "fmt" "os" "github.com/go-logr/logr" kruntime "k8s.io/apimachinery/pkg/runtime" utilruntime "k8s.io/apimachinery/pkg/util/runtime" clientgoscheme "k8s.io/client-go/kubernetes/scheme" ctrl "sigs.k8s.io/controller-runtime" "edge-infra.dev/pkg/k8s/runtime/controller" "edge-infra.dev/pkg/sds/display/constants" "edge-infra.dev/pkg/sds/display/displaymanager/manager" xorgmanager "edge-infra.dev/pkg/sds/display/displaymanager/manager/xorg" ) const ( hostnameEnvvar = "HOSTNAME" healthzCheckAddress = ":8082" ) var errHostnameEnvvarNotSet = fmt.Errorf("%s envvar is not set", hostnameEnvvar) var scheme = kruntime.NewScheme() func init() { utilruntime.Must(clientgoscheme.AddToScheme(scheme)) } func Run(ctx context.Context, opts ...controller.Option) error { log := ctrl.LoggerFrom(ctx).WithName(constants.XServerName) mgr, err := createManager(opts...) if err != nil { log.Error(err, "unable to create manager") return err } hostname := os.Getenv(hostnameEnvvar) if hostname == "" { log.Error(errHostnameEnvvarNotSet, "unable to find hostname") return errHostnameEnvvarNotSet } displayManager := xorgmanager.NewXorgDisplayManager(hostname, mgr.GetClient(), log) configChan := make(configChannel) if err := registerComponentsWithManager(mgr, displayManager, configChan, log); err != nil { log.Error(err, "unable to setup components with manager") return err } if err := mgr.Start(ctx); err != nil { log.Error(err, "xserver received an error") return err } return nil } func createManager(opts ...controller.Option) (ctrl.Manager, error) { mgrCfg, mgrOpts := controller.ProcessOptions(opts...) mgrOpts.Scheme = scheme mgrOpts.HealthProbeBindAddress = healthzCheckAddress return ctrl.NewManager(mgrCfg, mgrOpts) } func registerComponentsWithManager(mgr ctrl.Manager, displayManager manager.DisplayManager, configChan configChannel, log logr.Logger) error { r, err := NewXServerRunnable(displayManager, configChan, mgr.GetClient(), log) if err != nil { return err } if err := r.SetupWithManager(mgr); err != nil { return err } c := NewConfigController(displayManager.Hostname(), configChan, mgr.GetClient()) return c.SetupWithManager(mgr) }