prefix execution space name with karmada-es- (#61)
This commit is contained in:
parent
e9d590264b
commit
4d2e1de9e9
|
|
@ -17,6 +17,7 @@ import (
|
|||
"github.com/huawei-cloudnative/karmada/pkg/apis/propagationstrategy/v1alpha1"
|
||||
"github.com/huawei-cloudnative/karmada/pkg/controllers/util"
|
||||
karmadaclientset "github.com/huawei-cloudnative/karmada/pkg/generated/clientset/versioned"
|
||||
"github.com/huawei-cloudnative/karmada/pkg/util/names"
|
||||
)
|
||||
|
||||
// ControllerName is the controller name that will be used when reporting events.
|
||||
|
|
@ -143,28 +144,33 @@ func (c *PropagationBindingController) ensurePropagationWork(workload *unstructu
|
|||
},
|
||||
}
|
||||
|
||||
for _, clusterNameMirrorNamespace := range clusterNames {
|
||||
workGetResult, err := c.KarmadaClient.PropagationstrategyV1alpha1().PropagationWorks(clusterNameMirrorNamespace).Get(context.TODO(), propagationWork.Name, metav1.GetOptions{})
|
||||
for _, clusterName := range clusterNames {
|
||||
executionSpace, err := names.GenerateExecutionSpaceName(clusterName)
|
||||
if err != nil {
|
||||
klog.Errorf("Failed to generate execution space name for propagationWork %s/%s. Error: %v", executionSpace, propagationWork.Name, err)
|
||||
return err
|
||||
}
|
||||
workGetResult, err := c.KarmadaClient.PropagationstrategyV1alpha1().PropagationWorks(executionSpace).Get(context.TODO(), propagationWork.Name, metav1.GetOptions{})
|
||||
if err != nil && apierrors.IsNotFound(err) {
|
||||
_, err := c.KarmadaClient.PropagationstrategyV1alpha1().PropagationWorks(clusterNameMirrorNamespace).Create(context.TODO(), &propagationWork, metav1.CreateOptions{})
|
||||
_, err := c.KarmadaClient.PropagationstrategyV1alpha1().PropagationWorks(executionSpace).Create(context.TODO(), &propagationWork, metav1.CreateOptions{})
|
||||
if err != nil {
|
||||
klog.Errorf("Failed to create propagationWork %s/%s. Error: %v", clusterNameMirrorNamespace, propagationWork.Name, err)
|
||||
klog.Errorf("Failed to create propagationWork %s/%s. Error: %v", executionSpace, propagationWork.Name, err)
|
||||
return err
|
||||
}
|
||||
klog.Infof("Create propagationWork %s/%s successfully", clusterNameMirrorNamespace, propagationWork.Name)
|
||||
klog.Infof("Create propagationWork %s/%s successfully", executionSpace, propagationWork.Name)
|
||||
continue
|
||||
} else if err != nil && !apierrors.IsNotFound(err) {
|
||||
klog.Errorf("Failed to get propagationWork %s/%s. Error: %v", clusterNameMirrorNamespace, propagationWork.Name, err)
|
||||
klog.Errorf("Failed to get propagationWork %s/%s. Error: %v", executionSpace, propagationWork.Name, err)
|
||||
return err
|
||||
}
|
||||
workGetResult.Spec = propagationWork.Spec
|
||||
workGetResult.ObjectMeta.OwnerReferences = propagationWork.ObjectMeta.OwnerReferences
|
||||
_, err = c.KarmadaClient.PropagationstrategyV1alpha1().PropagationWorks(clusterNameMirrorNamespace).Update(context.TODO(), workGetResult, metav1.UpdateOptions{})
|
||||
_, err = c.KarmadaClient.PropagationstrategyV1alpha1().PropagationWorks(executionSpace).Update(context.TODO(), workGetResult, metav1.UpdateOptions{})
|
||||
if err != nil {
|
||||
klog.Errorf("Failed to update propagationWork %s/%s. Error: %v", clusterNameMirrorNamespace, propagationWork.Name, err)
|
||||
klog.Errorf("Failed to update propagationWork %s/%s. Error: %v", executionSpace, propagationWork.Name, err)
|
||||
return err
|
||||
}
|
||||
klog.Infof("Update propagationWork %s/%s successfully", clusterNameMirrorNamespace, propagationWork.Name)
|
||||
klog.Infof("Update propagationWork %s/%s successfully", executionSpace, propagationWork.Name)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
|
|
|||
|
|
@ -18,8 +18,9 @@ import (
|
|||
|
||||
"github.com/huawei-cloudnative/karmada/pkg/apis/membercluster/v1alpha1"
|
||||
propagationstrategy "github.com/huawei-cloudnative/karmada/pkg/apis/propagationstrategy/v1alpha1"
|
||||
"github.com/huawei-cloudnative/karmada/pkg/controllers/util"
|
||||
karmadaclientset "github.com/huawei-cloudnative/karmada/pkg/generated/clientset/versioned"
|
||||
"github.com/huawei-cloudnative/karmada/pkg/util"
|
||||
"github.com/huawei-cloudnative/karmada/pkg/util/names"
|
||||
"github.com/huawei-cloudnative/karmada/pkg/util/restmapper"
|
||||
)
|
||||
|
||||
|
|
@ -119,10 +120,16 @@ func (c *Controller) isResourceApplied(propagationWorkStatus *propagationstrateg
|
|||
}
|
||||
|
||||
func (c *Controller) deletePropagationWork(propagationWork *propagationstrategy.PropagationWork) error {
|
||||
// TODO(RainbowMango): retrieve member cluster from the local cache instead of a real request to API server.
|
||||
memberCluster, err := c.KarmadaClient.MemberclusterV1alpha1().MemberClusters(memberClusterNS).Get(context.TODO(), propagationWork.Namespace, v1.GetOptions{})
|
||||
executionSpace, err := names.GetMemberClusterName(propagationWork.Namespace)
|
||||
if err != nil {
|
||||
klog.Errorf("Failed to get status of the given member cluster %s", propagationWork.Namespace)
|
||||
klog.Errorf("Failed to get member cluster name for propagationWork %s/%s", propagationWork.Namespace, propagationWork.Name)
|
||||
return err
|
||||
}
|
||||
|
||||
// TODO(RainbowMango): retrieve member cluster from the local cache instead of a real request to API server.
|
||||
memberCluster, err := c.KarmadaClient.MemberclusterV1alpha1().MemberClusters(memberClusterNS).Get(context.TODO(), executionSpace, v1.GetOptions{})
|
||||
if err != nil {
|
||||
klog.Errorf("Failed to get status of the given member cluster %s", executionSpace)
|
||||
return err
|
||||
}
|
||||
|
||||
|
|
@ -155,10 +162,16 @@ func (c *Controller) deletePropagationWork(propagationWork *propagationstrategy.
|
|||
}
|
||||
|
||||
func (c *Controller) dispatchPropagationWork(propagationWork *propagationstrategy.PropagationWork) error {
|
||||
// TODO(RainbowMango): retrieve member cluster from the local cache instead of a real request to API server.
|
||||
memberCluster, err := c.KarmadaClient.MemberclusterV1alpha1().MemberClusters(memberClusterNS).Get(context.TODO(), propagationWork.Namespace, v1.GetOptions{})
|
||||
executionSpace, err := names.GetMemberClusterName(propagationWork.Namespace)
|
||||
if err != nil {
|
||||
klog.Errorf("Failed to get status of the given member cluster %s", propagationWork.Namespace)
|
||||
klog.Errorf("Failed to get member cluster name for propagationWork %s/%s", propagationWork.Namespace, propagationWork.Name)
|
||||
return err
|
||||
}
|
||||
|
||||
// TODO(RainbowMango): retrieve member cluster from the local cache instead of a real request to API server.
|
||||
memberCluster, err := c.KarmadaClient.MemberclusterV1alpha1().MemberClusters(memberClusterNS).Get(context.TODO(), executionSpace, v1.GetOptions{})
|
||||
if err != nil {
|
||||
klog.Errorf("Failed to get status of the given member cluster %s", executionSpace)
|
||||
return err
|
||||
}
|
||||
|
||||
|
|
@ -177,8 +190,8 @@ func (c *Controller) dispatchPropagationWork(propagationWork *propagationstrateg
|
|||
}
|
||||
|
||||
// syncToMemberClusters ensures that the state of the given object is synchronized to member clusters.
|
||||
func (c *Controller) syncToMemberClusters(membercluster *v1alpha1.MemberCluster, propagationWork *propagationstrategy.PropagationWork) error {
|
||||
memberClusterDynamicClient, err := util.NewClusterDynamicClientSet(membercluster, c.KubeClientSet)
|
||||
func (c *Controller) syncToMemberClusters(memberCluster *v1alpha1.MemberCluster, propagationWork *propagationstrategy.PropagationWork) error {
|
||||
memberClusterDynamicClient, err := util.NewClusterDynamicClientSet(memberCluster, c.KubeClientSet)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
|
@ -195,13 +208,13 @@ func (c *Controller) syncToMemberClusters(membercluster *v1alpha1.MemberCluster,
|
|||
if applied {
|
||||
err = c.updateResource(memberClusterDynamicClient, workload)
|
||||
if err != nil {
|
||||
klog.Errorf("Failed to update resource in the given member cluster %s, err is %v", membercluster.Name, err)
|
||||
klog.Errorf("Failed to update resource in the given member cluster %s, err is %v", memberCluster.Name, err)
|
||||
return err
|
||||
}
|
||||
} else {
|
||||
err = c.createResource(memberClusterDynamicClient, workload)
|
||||
if err != nil {
|
||||
klog.Errorf("Failed to create resource in the given member cluster %s, err is %v", membercluster.Name, err)
|
||||
klog.Errorf("Failed to create resource in the given member cluster %s, err is %v", memberCluster.Name, err)
|
||||
return err
|
||||
}
|
||||
|
||||
|
|
@ -235,14 +248,14 @@ func (c *Controller) deleteResource(memberClusterDynamicClient *util.DynamicClus
|
|||
}
|
||||
|
||||
// createResource create resource in member cluster
|
||||
func (c *Controller) createResource(memberclusterDynamicClient *util.DynamicClusterClient, workload *unstructured.Unstructured) error {
|
||||
func (c *Controller) createResource(memberClusterDynamicClient *util.DynamicClusterClient, workload *unstructured.Unstructured) error {
|
||||
dynamicResource, err := restmapper.GetGroupVersionResource(c.RESTMapper, workload.GroupVersionKind())
|
||||
if err != nil {
|
||||
klog.Errorf("Failed to create resource(%s/%s) as mapping GVK to GVR failed: %v", workload.GetNamespace(), workload.GetName(), err)
|
||||
return err
|
||||
}
|
||||
|
||||
_, err = memberclusterDynamicClient.DynamicClientSet.Resource(dynamicResource).Namespace(workload.GetNamespace()).Create(context.TODO(), workload, v1.CreateOptions{})
|
||||
_, err = memberClusterDynamicClient.DynamicClientSet.Resource(dynamicResource).Namespace(workload.GetNamespace()).Create(context.TODO(), workload, v1.CreateOptions{})
|
||||
if err != nil {
|
||||
if apierrors.IsAlreadyExists(err) {
|
||||
return nil
|
||||
|
|
@ -254,14 +267,14 @@ func (c *Controller) createResource(memberclusterDynamicClient *util.DynamicClus
|
|||
}
|
||||
|
||||
// updateResource update resource in member cluster
|
||||
func (c *Controller) updateResource(memberclusterDynamicClient *util.DynamicClusterClient, workload *unstructured.Unstructured) error {
|
||||
func (c *Controller) updateResource(memberClusterDynamicClient *util.DynamicClusterClient, workload *unstructured.Unstructured) error {
|
||||
dynamicResource, err := restmapper.GetGroupVersionResource(c.RESTMapper, workload.GroupVersionKind())
|
||||
if err != nil {
|
||||
klog.Errorf("Failed to update resource(%s/%s) as mapping GVK to GVR failed: %v", workload.GetNamespace(), workload.GetName(), err)
|
||||
return err
|
||||
}
|
||||
|
||||
_, err = memberclusterDynamicClient.DynamicClientSet.Resource(dynamicResource).Namespace(workload.GetNamespace()).Update(context.TODO(), workload, v1.UpdateOptions{})
|
||||
_, err = memberClusterDynamicClient.DynamicClientSet.Resource(dynamicResource).Namespace(workload.GetNamespace()).Update(context.TODO(), workload, v1.UpdateOptions{})
|
||||
if err != nil {
|
||||
klog.Errorf("Failed to update resource %v, err is %v ", workload.GetName(), err)
|
||||
return err
|
||||
|
|
|
|||
|
|
@ -18,6 +18,7 @@ import (
|
|||
"sigs.k8s.io/controller-runtime/pkg/client"
|
||||
|
||||
"github.com/huawei-cloudnative/karmada/pkg/apis/membercluster/v1alpha1"
|
||||
"github.com/huawei-cloudnative/karmada/pkg/util/names"
|
||||
)
|
||||
|
||||
const (
|
||||
|
|
@ -109,8 +110,12 @@ func (c *Controller) removeMemberCluster(memberCluster *v1alpha1.MemberCluster)
|
|||
|
||||
// removeExecutionSpace delete the given execution space
|
||||
func (c *Controller) removeExecutionSpace(memberCluster *v1alpha1.MemberCluster) error {
|
||||
// todo: executionSpace := "karmada-es-" + memberCluster.Name
|
||||
executionSpace := memberCluster.Name
|
||||
executionSpace, err := names.GenerateExecutionSpaceName(memberCluster.Name)
|
||||
if err != nil {
|
||||
klog.Errorf("Failed to generate execution space name for member cluster %s, err is %v", memberCluster.Name, err)
|
||||
return err
|
||||
}
|
||||
|
||||
if err := c.KubeClientSet.CoreV1().Namespaces().Delete(context.TODO(), executionSpace, v1.DeleteOptions{}); err != nil {
|
||||
klog.Errorf("Error while deleting namespace %s: %s", executionSpace, err)
|
||||
return err
|
||||
|
|
@ -120,9 +125,13 @@ func (c *Controller) removeExecutionSpace(memberCluster *v1alpha1.MemberCluster)
|
|||
|
||||
// ensureRemoveExecutionSpace make sure the given execution space has been deleted
|
||||
func (c *Controller) ensureRemoveExecutionSpace(memberCluster *v1alpha1.MemberCluster) (bool, error) {
|
||||
// todo: executionSpace := "karmada-es-" + memberCluster.Name
|
||||
executionSpace := memberCluster.Name
|
||||
_, err := c.KubeClientSet.CoreV1().Namespaces().Get(context.TODO(), executionSpace, v1.GetOptions{})
|
||||
executionSpace, err := names.GenerateExecutionSpaceName(memberCluster.Name)
|
||||
if err != nil {
|
||||
klog.Errorf("Failed to generate execution space name for member cluster %s, err is %v", memberCluster.Name, err)
|
||||
return false, err
|
||||
}
|
||||
|
||||
_, err = c.KubeClientSet.CoreV1().Namespaces().Get(context.TODO(), executionSpace, v1.GetOptions{})
|
||||
if apierrors.IsNotFound(err) {
|
||||
return false, nil
|
||||
}
|
||||
|
|
@ -167,22 +176,26 @@ func (c *Controller) ensureFinalizer(memberCluster *v1alpha1.MemberCluster) (boo
|
|||
}
|
||||
|
||||
// createExecutionSpace create member cluster execution space when member cluster joined
|
||||
func (c *Controller) createExecutionSpace(membercluster *v1alpha1.MemberCluster) error {
|
||||
// todo: executionSpace := "karmada-es-" + membercluster.Name
|
||||
executionSpace := membercluster.Name
|
||||
func (c *Controller) createExecutionSpace(memberCluster *v1alpha1.MemberCluster) error {
|
||||
executionSpace, err := names.GenerateExecutionSpaceName(memberCluster.Name)
|
||||
if err != nil {
|
||||
klog.Errorf("Failed to generate execution space name for member cluster %s, err is %v", memberCluster.Name, err)
|
||||
return err
|
||||
}
|
||||
|
||||
// create member cluster execution space when member cluster joined
|
||||
_, err := c.KubeClientSet.CoreV1().Namespaces().Get(context.TODO(), executionSpace, v1.GetOptions{})
|
||||
_, err = c.KubeClientSet.CoreV1().Namespaces().Get(context.TODO(), executionSpace, v1.GetOptions{})
|
||||
if err != nil {
|
||||
if apierrors.IsNotFound(err) {
|
||||
memberclusterES := &corev1.Namespace{
|
||||
memberClusterES := &corev1.Namespace{
|
||||
ObjectMeta: v1.ObjectMeta{
|
||||
Name: executionSpace,
|
||||
Labels: map[string]string{executionSpaceLabelKey: executionSpaceLabelValue},
|
||||
},
|
||||
}
|
||||
_, err = c.KubeClientSet.CoreV1().Namespaces().Create(context.TODO(), memberclusterES, v1.CreateOptions{})
|
||||
_, err = c.KubeClientSet.CoreV1().Namespaces().Create(context.TODO(), memberClusterES, v1.CreateOptions{})
|
||||
if err != nil {
|
||||
klog.Errorf("Failed to create execution space for membercluster %v", membercluster.Name)
|
||||
klog.Errorf("Failed to create execution space for membercluster %v", memberCluster.Name)
|
||||
return err
|
||||
}
|
||||
} else {
|
||||
|
|
|
|||
|
|
@ -10,7 +10,7 @@ import (
|
|||
"sigs.k8s.io/controller-runtime/pkg/client"
|
||||
|
||||
"github.com/huawei-cloudnative/karmada/pkg/apis/membercluster/v1alpha1"
|
||||
"github.com/huawei-cloudnative/karmada/pkg/controllers/util"
|
||||
"github.com/huawei-cloudnative/karmada/pkg/util"
|
||||
)
|
||||
|
||||
const (
|
||||
|
|
|
|||
|
|
@ -0,0 +1,26 @@
|
|||
package names
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"strings"
|
||||
)
|
||||
|
||||
// executionSpacePrefix is the prefix of execution space
|
||||
const executionSpacePrefix = "karmada-es-"
|
||||
|
||||
// GenerateExecutionSpaceName generates execution space name for the given member cluster
|
||||
func GenerateExecutionSpaceName(memberClusterName string) (string, error) {
|
||||
if memberClusterName == "" {
|
||||
return "", fmt.Errorf("the member cluster name is empty")
|
||||
}
|
||||
executionSpace := executionSpacePrefix + memberClusterName
|
||||
return executionSpace, nil
|
||||
}
|
||||
|
||||
// GetMemberClusterName returns member cluster name for the given execution space
|
||||
func GetMemberClusterName(executionSpaceName string) (string, error) {
|
||||
if !strings.HasPrefix(executionSpaceName, executionSpacePrefix) {
|
||||
return "", fmt.Errorf("the execution space name is in wrong format")
|
||||
}
|
||||
return strings.TrimPrefix(executionSpaceName, executionSpacePrefix), nil
|
||||
}
|
||||
|
|
@ -0,0 +1,78 @@
|
|||
package names
|
||||
|
||||
import "testing"
|
||||
|
||||
func TestGenerateExecutionSpaceName(t *testing.T) {
|
||||
type args struct {
|
||||
memberClusterName string
|
||||
}
|
||||
tests := []struct {
|
||||
name string
|
||||
args args
|
||||
want string
|
||||
wantErr bool
|
||||
}{
|
||||
{name: "normal cluster name",
|
||||
args: args{memberClusterName: "member-cluster-normal"},
|
||||
want: "karmada-es-member-cluster-normal",
|
||||
wantErr: false,
|
||||
},
|
||||
{name: "empty member cluster name",
|
||||
args: args{memberClusterName: ""},
|
||||
want: "",
|
||||
wantErr: true,
|
||||
},
|
||||
}
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
got, err := GenerateExecutionSpaceName(tt.args.memberClusterName)
|
||||
if (err != nil) != tt.wantErr {
|
||||
t.Errorf("GenerateExecutionSpaceName() error = %v, wantErr %v", err, tt.wantErr)
|
||||
return
|
||||
}
|
||||
if got != tt.want {
|
||||
t.Errorf("GenerateExecutionSpaceName() got = %v, want %v", got, tt.want)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func TestGetMemberClusterName(t *testing.T) {
|
||||
type args struct {
|
||||
executionSpaceName string
|
||||
}
|
||||
tests := []struct {
|
||||
name string
|
||||
args args
|
||||
want string
|
||||
wantErr bool
|
||||
}{
|
||||
{name: "normal execution space name",
|
||||
args: args{executionSpaceName: "karmada-es-member-cluster-normal"},
|
||||
want: "member-cluster-normal",
|
||||
wantErr: false,
|
||||
},
|
||||
{name: "invalid member cluster",
|
||||
args: args{executionSpaceName: "invalid"},
|
||||
want: "",
|
||||
wantErr: true,
|
||||
},
|
||||
{name: "empty execution space name",
|
||||
args: args{executionSpaceName: ""},
|
||||
want: "",
|
||||
wantErr: true,
|
||||
},
|
||||
}
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
got, err := GetMemberClusterName(tt.args.executionSpaceName)
|
||||
if (err != nil) != tt.wantErr {
|
||||
t.Errorf("GetMemberClusterName() error = %v, wantErr %v", err, tt.wantErr)
|
||||
return
|
||||
}
|
||||
if got != tt.want {
|
||||
t.Errorf("GetMemberClusterName() got = %v, want %v", got, tt.want)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue