Skip to content

Commit

Permalink
add license monitor
Browse files Browse the repository at this point in the history
  • Loading branch information
yxxchange committed Jun 29, 2023
1 parent e694bc8 commit 8dfaa44
Show file tree
Hide file tree
Showing 14 changed files with 432 additions and 169 deletions.
5 changes: 5 additions & 0 deletions controllers/cloud/PROJECT
Original file line number Diff line number Diff line change
Expand Up @@ -41,4 +41,9 @@ resources:
kind: CloudClient
path: github.com/labring/sealos/controllers/cloud/api/v1
version: v1
- controller: true
domain: sealos.io
group: cloud
kind: LicenseMonitor
version: v1
version: "3"
1 change: 1 addition & 0 deletions controllers/cloud/api/v1/license_types.go
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ import (

// LicenseSpec defines the desired state of License
type LicenseSpec struct {
UID string `json:"uid,omitempty"`
Token string `json:"token,omitempty"`
Key string `json:"key,omitempty"`
}
Expand Down
12 changes: 10 additions & 2 deletions controllers/cloud/cmd/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -25,15 +25,16 @@ import (

_ "k8s.io/client-go/plugin/pkg/client/auth"

cloudv1 "github.com/labring/sealos/controllers/cloud/api/v1"
"github.com/labring/sealos/controllers/cloud/internal/controller"
ntf "github.com/labring/sealos/controllers/common/notification/api/v1"
"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/healthz"
"sigs.k8s.io/controller-runtime/pkg/log/zap"

cloudv1 "github.com/labring/sealos/controllers/cloud/api/v1"
"github.com/labring/sealos/controllers/cloud/internal/controller"
//+kubebuilder:scaffold:imports
)

Expand Down Expand Up @@ -125,6 +126,13 @@ func main() {
setupLog.Error(err, "unable to create controller", "controller", "CloudClient")
os.Exit(1)
}
if err = (&controller.LicenseMonitorReconciler{
Client: mgr.GetClient(),
Scheme: mgr.GetScheme(),
}).SetupWithManager(mgr); err != nil {
setupLog.Error(err, "unable to create controller", "controller", "LicenseMonitor")
os.Exit(1)
}
//+kubebuilder:scaffold:builder

if err := mgr.AddHealthzCheck("healthz", healthz.Ping); err != nil {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,8 @@ spec:
type: string
token:
type: string
uid:
type: string
type: object
status:
description: LicenseStatus defines the observed state of License
Expand Down
36 changes: 21 additions & 15 deletions controllers/cloud/internal/controller/cloudclient_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -35,10 +35,9 @@ import (
// CloudClientReconciler reconciles a CloudClient object
type CloudClientReconciler struct {
client.Client
Scheme *runtime.Scheme
Users cloud.UserCategory
logger logr.Logger
configPath string
Scheme *runtime.Scheme
Users cloud.UserCategory
logger logr.Logger
}

//+kubebuilder:rbac:groups=cloud.sealos.io,resources=cloudclients,verbs=get;list;watch;create;update;patch;delete
Expand All @@ -62,25 +61,32 @@ func (r *CloudClientReconciler) Reconcile(ctx context.Context, req ctrl.Request)
r.logger.Error(err.Concat(": "), "failed to get users info")
return ctrl.Result{}, err.Concat(": ")
}
var clusterSecret corev1.Secret
var config, err = util.ReadConfigFile(r.configPath, r.logger)
if err != nil {
return ctrl.Result{}, err
}
var secret corev1.Secret
var configMap corev1.ConfigMap

r.logger.Info("Try to get the cloud secret resource...")
resource := util.NewImportanctResource(&clusterSecret, types.NamespacedName{Namespace: cloud.Namespace, Name: cloud.SecretName})
if em := util.GetImportantResource(ctx, r.Client, &resource); em != nil {
resource1 := util.NewImportanctResource(&secret, types.NamespacedName{Namespace: cloud.Namespace, Name: cloud.SecretName})
resource2 := util.NewImportanctResource(&configMap, types.NamespacedName{Namespace: cloud.Namespace, Name: cloud.ConfigName})
if em := util.GetImportantResource(ctx, r.Client, &resource1); em != nil {
r.logger.Error(em.Concat(": "), "GetImportantResource error, corev1.Secret")
return ctrl.Result{}, em.Concat(": ")
}
if value, ok := clusterSecret.Labels["registered"]; ok && value == "true" {
if em := util.GetImportantResource(ctx, r.Client, &resource2); em != nil {
r.logger.Error(em.Concat(": "), "GetImportantResource error, corev1.ConfigMap")
return ctrl.Result{}, em.Concat(": ")
}
var config, err = util.ReadConfigFromConfigMap(cloud.ConfigName, &configMap)
if err != nil {
return ctrl.Result{}, err
}

if value, ok := secret.Labels["registered"]; ok && value == cloud.TRUE {
r.logger.Info("Cluster has registered...")
} else {
r.logger.Info("Try to register and start the cloud module...")
}

rasd := util.NewRegisterAndStartData(ctx, r.Client, &clusterSecret, r.Users, config, r.logger)
rasd := util.NewRegisterAndStartData(ctx, r.Client, &secret, r.Users, config, r.logger)
em := util.RegisterAndStart(rasd)
if em != nil {
r.logger.Error(em.Concat(": "), "failed to register and start")
Expand All @@ -92,15 +98,15 @@ func (r *CloudClientReconciler) Reconcile(ctx context.Context, req ctrl.Request)

// SetupWithManager sets up the controller with the Manager.
func (r *CloudClientReconciler) SetupWithManager(mgr ctrl.Manager) error {
r.configPath = util.ConfigPath
r.Users = cloud.UserCategory{}
r.logger = ctrl.Log.WithName("CloudClientReconcile")

nameFilter := cloud.CloudStartName
namespaceFilter := cloud.Namespace
Predicates := predicate.NewPredicateFuncs(func(obj client.Object) bool {
return obj.GetName() == nameFilter &&
obj.GetNamespace() == namespaceFilter
obj.GetNamespace() == namespaceFilter &&
obj.GetLabels()[cloud.ExternalNetworkAccessLabel] == cloud.Enabled
})

return ctrl.NewControllerManagedBy(mgr).
Expand Down
25 changes: 11 additions & 14 deletions controllers/cloud/internal/controller/cloudsync_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -41,8 +41,6 @@ type CloudSyncReconciler struct {
logger logr.Logger
needSync bool
syncCache cloud.SyncResponse

configPath string
}

//+kubebuilder:rbac:groups=cloud.sealos.io,resources=cloudsyncs,verbs=get;list;watch;create;update;patch;delete
Expand All @@ -66,27 +64,26 @@ func (r *CloudSyncReconciler) Reconcile(ctx context.Context, req ctrl.Request) (
var sync cloud.SyncRequest
var resp cloud.SyncResponse
var configmap corev1.ConfigMap
r.logger.Info("Start to get the CloudSync URL...")
config, err = util.ReadConfigFile(r.configPath, r.logger)
if err != nil {
r.logger.Error(err, "failed to read config")
return ctrl.Result{}, err
}
url := config.CloudSyncURL

r.logger.Info("Start to get resources that need sync...")
resource1 := util.NewImportanctResource(&secret, types.NamespacedName{Namespace: cloud.Namespace, Name: cloud.SecretName})
resource2 := util.NewImportanctResource(&configmap, types.NamespacedName{Namespace: cloud.Namespace, Name: cloud.ConfigName})
em := util.GetImportantResource(ctx, r.Client, &resource1)
if em != nil {
r.logger.Error(em.Concat(": "), "failed to get resource secret")
r.logger.Error(em.Concat(": "), "GetImportantResource error, corev1.Secret")
return ctrl.Result{}, em.Concat(": ")
}
em = util.GetImportantResource(ctx, r.Client, &resource2)
if em != nil {
r.logger.Error(em.Concat(": "), "failed to get resource configmap")
r.logger.Error(em.Concat(": "), "GetImportantResource error, corev1.ConfigMap")
return ctrl.Result{}, em.Concat(": ")
}

config, err = util.ReadConfigFromConfigMap(cloud.ConfigName, &configmap)
if err != nil {
r.logger.Error(err, "failed to read config")
return ctrl.Result{}, err
}
url := config.CloudSyncURL
sync.UID = string(secret.Data["uid"])
if r.needSync {
r.logger.Info("Start to communicate with cloud...")
Expand Down Expand Up @@ -121,14 +118,14 @@ func (r *CloudSyncReconciler) Reconcile(ctx context.Context, req ctrl.Request) (

// SetupWithManager sets up the controller with the Manager.
func (r *CloudSyncReconciler) SetupWithManager(mgr ctrl.Manager) error {
r.configPath = util.ConfigPath
r.logger = ctrl.Log.WithName("CloudSyncReconcile")
r.needSync = true
Predicate := predicate.NewPredicateFuncs(func(object client.Object) bool {
return object.GetName() == cloud.ClientStartName &&
object.GetNamespace() == cloud.Namespace &&
object.GetLabels() != nil &&
object.GetLabels()["isRead"] == util.FALSE
object.GetLabels()[cloud.IsRead] == cloud.FALSE &&
object.GetLabels()[cloud.ExternalNetworkAccessLabel] == cloud.Enabled
})
return ctrl.NewControllerManagedBy(mgr).
For(&cloudv1.CloudClient{}, builder.WithPredicates(Predicate)).
Expand Down
30 changes: 20 additions & 10 deletions controllers/cloud/internal/controller/collector_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -40,9 +40,8 @@ import (
// CollectorReconciler reconciles a Collector object
type CollectorReconciler struct {
client.Client
Scheme *runtime.Scheme
logger logr.Logger
configPath string
Scheme *runtime.Scheme
logger logr.Logger
}

//+kubebuilder:rbac:groups=cloud.sealos.io,resources=collectors,verbs=get;list;watch;create;update;patch;delete
Expand All @@ -61,15 +60,28 @@ type CollectorReconciler struct {
func (r *CollectorReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {
r.logger.Info("Enter CollectorReconcile", "namespace:", req.Namespace, "name", req.Name)

config, err := util.ReadConfigFile(r.configPath, r.logger)
var secret corev1.Secret
var configMap corev1.ConfigMap
resource1 := util.NewImportanctResource(&secret, types.NamespacedName{Namespace: cloud.Namespace, Name: cloud.SecretName})
resource2 := util.NewImportanctResource(&configMap, types.NamespacedName{Namespace: cloud.Namespace, Name: cloud.SecretName})

em := util.GetImportantResource(ctx, r.Client, &resource1)
if em != nil {
r.logger.Error(em.Concat(": "), "GetImportantResource error, corev1.Secret")
return ctrl.Result{}, em.Concat(": ")
}
em = util.GetImportantResource(ctx, r.Client, &resource2)
if em != nil {
r.logger.Error(em.Concat(": "), "GetImportantResource error, corev1.ConfigMap")
return ctrl.Result{}, em.Concat(": ")
}

config, err := util.ReadConfigFromConfigMap(cloud.ConfigName, &configMap)
if err != nil {
r.logger.Error(err, "failed to read config")
return ctrl.Result{}, err
}

var secret corev1.Secret
resource := util.NewImportanctResource(&secret, types.NamespacedName{Namespace: cloud.Namespace, Name: cloud.SecretName})

r.logger.Info("Start to get the node info of the cluster")
clusterResource := cloud.NewClusterResource()
totalNodesResource := cloud.NewTotalNodesResource(`\w+\.com/gpu`)
Expand Down Expand Up @@ -104,7 +116,6 @@ func (r *CollectorReconciler) Reconcile(ctx context.Context, req ctrl.Request) (
clusterResource.Memory = totalNodesResource.TotalMemory.String()
clusterResource.Disk = totalNodesResource.TotalPVCapacity.String()

util.GetImportantResource(ctx, r.Client, &resource)
collector := cloud.CollectorInfo{
UID: string(secret.Data["uid"]),
InfoType: cloud.ResourceOnCluster,
Expand All @@ -127,14 +138,13 @@ func (r *CollectorReconciler) Reconcile(ctx context.Context, req ctrl.Request) (

// SetupWithManager sets up the controller with the Manager.
func (r *CollectorReconciler) SetupWithManager(mgr ctrl.Manager) error {
r.configPath = util.ConfigPath
r.logger = ctrl.Log.WithName("CollectorReconcile")

Predicate := predicate.NewPredicateFuncs(func(object client.Object) bool {
return object.GetName() == cloud.ClientStartName &&
object.GetNamespace() == cloud.Namespace &&
object.GetLabels() != nil &&
object.GetLabels()["isRead"] == util.FALSE
object.GetLabels()[cloud.IsRead] == cloud.FALSE
})
return ctrl.NewControllerManagedBy(mgr).
For(&cloudv1.CloudClient{}, builder.WithPredicates(Predicate)).
Expand Down
Loading

0 comments on commit 8dfaa44

Please sign in to comment.