diff --git a/api/v1alpha1/xlinecluster_types.go b/api/v1alpha1/xlinecluster_types.go index f6df2e2..769a735 100644 --- a/api/v1alpha1/xlinecluster_types.go +++ b/api/v1alpha1/xlinecluster_types.go @@ -180,11 +180,13 @@ type XlineClusterStatus struct { type XlineClusterOprStage string const ( - StageXlineScriptCM XlineClusterOprStage = "Xline/ScriptCM" - StageXlineConfigMap XlineClusterOprStage = "Xline/ConfigMap" - StageXlineService XlineClusterOprStage = "Xline/Service" - StageXlineStatefulSet XlineClusterOprStage = "Xline/Statefulset" - StageComplete XlineClusterOprStage = "complete" + StageXlineScriptCM XlineClusterOprStage = "Xline/ScriptCM" + StageXlineConfigMap XlineClusterOprStage = "Xline/ConfigMap" + StageXlineService XlineClusterOprStage = "Xline/Service" + StageXlineDiscoveryService XlineClusterOprStage = "Xline/DiscoveryService" + StageXlineDiscoveryDeploy XlineClusterOprStage = "Xline/DiscoveryDeploy" + StageXlineStatefulSet XlineClusterOprStage = "Xline/Statefulset" + StageComplete XlineClusterOprStage = "complete" ) // XlineClusterRecStatus represents XlineCluster reconcile status diff --git a/config/rbac/role.yaml b/config/rbac/role.yaml index 874b316..3c5618a 100644 --- a/config/rbac/role.yaml +++ b/config/rbac/role.yaml @@ -4,6 +4,18 @@ kind: ClusterRole metadata: name: manager-role rules: +- apiGroups: + - apps + resources: + - deployments + verbs: + - create + - delete + - get + - list + - patch + - update + - watch - apiGroups: - apps resources: diff --git a/internal/controller/xlinecluster_controller.go b/internal/controller/xlinecluster_controller.go index 067b750..0f8cda8 100644 --- a/internal/controller/xlinecluster_controller.go +++ b/internal/controller/xlinecluster_controller.go @@ -39,6 +39,7 @@ type XlineClusterReconciler struct { //+kubebuilder:rbac:groups=xline.io.datenlord.com,resources=xlineclusters/finalizers,verbs=update //+kubebuilder:rbac:groups=core,resources=services,verbs=get;list;watch;create;update;patch;delete //+kubebuilder:rbac:groups=apps,resources=statefulsets,verbs=get;list;watch;create;update;patch;delete +//+kubebuilder:rbac:groups=apps,resources=deployments,verbs=get;list;watch;create;update;patch;delete //+kubebuilder:rbac:groups=core,resources=pods,verbs=get;list;watch //+kubebuilder:rbac:groups=core,resources=configmaps,verbs=get;list;watch;create;update;patch;delete //+kubebuilder:rbac:groups=core,resources=secrets,verbs=get;list;watch diff --git a/internal/reconciler/cluster_reconciler.go b/internal/reconciler/cluster_reconciler.go index e494ad7..d586c0c 100644 --- a/internal/reconciler/cluster_reconciler.go +++ b/internal/reconciler/cluster_reconciler.go @@ -68,6 +68,18 @@ func (r *ClusterStageRecResult) AsXlineClusterRecStatus() xapi.XlineClusterRecSt // reconcile xline cluster resources. func (r *XlineClusterReconciler) recXlineResources() ClusterStageRecResult { + // create an xline discovery service + discoverySvc := tran.MakeDiscoveryService(r.CR, r.Schema) + if err := r.CreateOrUpdate(discoverySvc, &corev1.Service{}); err != nil { + return clusterStageFail(xapi.StageXlineDiscoveryService, err) + } + + // create an xline discovery deployment + discoveryDeploy := tran.MakeDiscoveryDeployment(r.CR, r.Schema) + if err := r.CreateOrUpdate(discoveryDeploy, &appv1.Deployment{}); err != nil { + return clusterStageFail(xapi.StageXlineDiscoveryDeploy, err) + } + // create an xline script cm script := tran.MakeScriptCM(r.CR, r.Schema) if err := r.CreateOrUpdate(script, &corev1.ConfigMap{}); err != nil { diff --git a/internal/transformer/xlinecluster_resource.go b/internal/transformer/xlinecluster_resource.go index f9f848b..455caa4 100644 --- a/internal/transformer/xlinecluster_resource.go +++ b/internal/transformer/xlinecluster_resource.go @@ -11,17 +11,23 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/types" + "k8s.io/utils/pointer" "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" ) const ( - XlinePort = 2379 + XlinePort = 2379 + DiscoveryPort = 10086 ) func GetXlineInstanceLabels(xlineClusterName types.NamespacedName) map[string]string { return MakeResourceLabels(xlineClusterName.Name) } +func GetXlineDiscoveryLabels(xlineClusterName types.NamespacedName) map[string]string { + return MakeResourceLabels(fmt.Sprintf("%s-discovery", xlineClusterName.Name)) +} + func GetMemberTopology(cr *xapi.XlineCluster) string { replicas := int(cr.Spec.Replicas) members := make([]string, replicas) @@ -64,6 +70,73 @@ func getConfigInfo(cr *xapi.XlineCluster) []corev1.EnvFromSource { } } +func MakeDiscoveryService(cr *xapi.XlineCluster, scheme *runtime.Scheme) *corev1.Service { + svcLabel := GetXlineDiscoveryLabels(cr.ObjKey()) + service := &corev1.Service{ + ObjectMeta: metav1.ObjectMeta{ + Name: fmt.Sprintf("%s-discovery", cr.Name), + Namespace: cr.Namespace, + }, + Spec: corev1.ServiceSpec{ + Ports: []corev1.ServicePort{ + { + Name: "discovery-port", + Port: DiscoveryPort, + }, + }, + Selector: svcLabel, + }, + } + _ = controllerutil.SetOwnerReference(cr, service, scheme) + return service +} + +func MakeDiscoveryDeployment(cr *xapi.XlineCluster, scheme *runtime.Scheme) *appv1.Deployment { + discoveryLabel := GetXlineDiscoveryLabels(cr.ObjKey()) + podSpec := corev1.PodSpec{ + Containers: []corev1.Container{ + { + Name: "xline-discovery", + Image: "phoenix500526/discovery:v0.1.1", + Command: []string{ + "/usr/local/bin/discovery", + }, + Ports: []corev1.ContainerPort{ + { + ContainerPort: DiscoveryPort, + }, + }, + Env: []corev1.EnvVar{ + {Name: "XC_NAME", Value: cr.Name}, + }, + }, + }, + // ServiceAccountName: "my-service-account", + } + + deploy := &appv1.Deployment{ + ObjectMeta: metav1.ObjectMeta{ + Name: cr.Name, + Namespace: cr.Namespace, + }, + Spec: appv1.DeploymentSpec{ + Replicas: pointer.Int32(1), + Selector: &metav1.LabelSelector{ + MatchLabels: discoveryLabel, + }, + Template: corev1.PodTemplateSpec{ + ObjectMeta: metav1.ObjectMeta{ + Labels: discoveryLabel, + }, + Spec: podSpec, + }, + }, + } + + _ = controllerutil.SetOwnerReference(cr, deploy, scheme) + return deploy +} + func MakeService(cr *xapi.XlineCluster, scheme *runtime.Scheme) *corev1.Service { svcLabel := GetXlineInstanceLabels(cr.ObjKey()) service := &corev1.Service{