prefix execution space name with karmada-es- (#61)

This commit is contained in:
Hanbo Li 2020-12-08 11:12:28 +08:00 committed by GitHub
parent e9d590264b
commit 4d2e1de9e9
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 173 additions and 37 deletions

View File

@ -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
}

View File

@ -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

View File

@ -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 {

View File

@ -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 (

26
pkg/util/names/names.go Normal file
View File

@ -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
}

View File

@ -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)
}
})
}
}