diff --git a/housekeeper/operator/housekeeper-controller/controllers/update_controller.go b/housekeeper/operator/housekeeper-controller/controllers/update_controller.go new file mode 100644 index 0000000000000000000000000000000000000000..d491836bc234f996ce2af1dab27f0f6f2529971b --- /dev/null +++ b/housekeeper/operator/housekeeper-controller/controllers/update_controller.go @@ -0,0 +1,82 @@ +/* +Copyright 2023 KylinSoft Co., Ltd. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package controllers + +import ( + "context" + "os" + + "github.com/sirupsen/logrus" + housekeeperiov1alpha1 "housekeeper.io/operator/api/v1alpha1" + "housekeeper.io/pkg/common" + "housekeeper.io/pkg/connection" + + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/client-go/kubernetes" + ctrl "sigs.k8s.io/controller-runtime" + "sigs.k8s.io/controller-runtime/pkg/client" + "sigs.k8s.io/controller-runtime/pkg/log" + "sigs.k8s.io/controller-runtime/pkg/manager" +) + +// UpdateReconciler reconciles a Update object +type UpdateReconciler struct { + client.Client + Scheme *runtime.Scheme + KubeClientSet kubernetes.Interface + Connection *connection.Client + HostName string +} + +//+kubebuilder:rbac:groups=housekeeper.io,resources=updates,verbs=get;list;watch;create;update;patch;delete +//+kubebuilder:rbac:groups=housekeeper.io,resources=updates/status,verbs=get;update;patch +//+kubebuilder:rbac:groups=housekeeper.io,resources=updates/finalizers,verbs=update + +// Reconcile is part of the main kubernetes reconciliation loop which aims to +// move the current state of the cluster closer to the desired state. +// TODO(user): Modify the Reconcile function to compare the state specified by +// the Update object against the actual cluster state, and then +// perform operations to make the cluster state reflect the state specified by +// the user. +// +// For more details, check Reconcile and its Result here: +// - https://pkg.go.dev/sigs.k8s.io/controller-runtime@v0.13.0/pkg/reconcile +func NewUpdateReconciler(mgr manager.Manager) *UpdateReconciler { + kubeClientSet, err := kubernetes.NewForConfig(mgr.GetConfig()) + if err != nil { + logrus.Errorf("failed to build the kubernetes clientset: %v", err) + } + reconciler := &UpdateReconciler{ + Client: mgr.GetClient(), + Scheme: mgr.GetScheme(), + KubeClientSet: kubeClientSet, + HostName: os.Getenv("NODE_NAME"), + } + return reconciler +} + +func (r *UpdateReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) { + _ = log.FromContext(ctx) + return common.RequeueAfter, nil +} + +// SetupWithManager sets up the controller with the Manager. +func (r *UpdateReconciler) SetupWithManager(mgr ctrl.Manager) error { + return ctrl.NewControllerManagedBy(mgr). + For(&housekeeperiov1alpha1.Update{}). + Complete(r) +} diff --git a/housekeeper/operator/housekeeper-controller/main.go b/housekeeper/operator/housekeeper-controller/main.go new file mode 100644 index 0000000000000000000000000000000000000000..dec60a6ee27c78a6ac8aac56b94c673ba564668c --- /dev/null +++ b/housekeeper/operator/housekeeper-controller/main.go @@ -0,0 +1,83 @@ +/* +Copyright 2023 KylinSoft Co., Ltd. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package main + +import ( + "flag" + "os" + "path/filepath" + + // Import all Kubernetes client auth plugins (e.g. Azure, GCP, OIDC, etc.) + // to ensure that exec-entrypoint and run can make use of them. + "github.com/sirupsen/logrus" + _ "k8s.io/client-go/plugin/pkg/client/auth" + + "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" + "sigs.k8s.io/controller-runtime/pkg/log/zap" + + housekeeperiov1alpha1 "housekeeper.io/operator/api/v1alpha1" + "housekeeper.io/operator/housekeeper-controller/controllers" + "housekeeper.io/pkg/connection" + "housekeeper.io/pkg/constants" + "housekeeper.io/pkg/version" + //+kubebuilder:scaffold:imports +) + +var scheme = runtime.NewScheme() + +func init() { + utilruntime.Must(clientgoscheme.AddToScheme(scheme)) + + utilruntime.Must(housekeeperiov1alpha1.AddToScheme(scheme)) + //+kubebuilder:scaffold:scheme +} + +func main() { + var err error + opts := zap.Options{} + opts.BindFlags(flag.CommandLine) + flag.Parse() + + ctrl.SetLogger(zap.New(zap.UseFlagOptions(&opts))) + + mgr, err := ctrl.NewManager(ctrl.GetConfigOrDie(), ctrl.Options{ + Scheme: scheme, + HealthProbeBindAddress: "0", + }) + if err != nil { + logrus.Errorf("unable to start manager: %v", err) + os.Exit(1) + } + + reconciler := controllers.NewUpdateReconciler(mgr) + if reconciler.Connection, err = connection.New("unix://" + filepath.Join(constants.SockDir, constants.SockName)); err != nil { + logrus.Errorf("unable running housekeeper-controller: %v", err) + } + if err = reconciler.SetupWithManager(mgr); err != nil { + logrus.Error(err, "unable to create controller", "controller", "Update") + os.Exit(1) + } + + logrus.Info("starting housekeeper-controller manager version:", version.Version) + if err := mgr.Start(ctrl.SetupSignalHandler()); err != nil { + logrus.Errorf("problem running housekeeper-controller manager: %v", err) + os.Exit(1) + } +}