240 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			Go
		
	
	
	
			
		
		
	
	
			240 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			Go
		
	
	
	
package keys
 | 
						|
 | 
						|
import (
 | 
						|
	"fmt"
 | 
						|
	"testing"
 | 
						|
 | 
						|
	corev1 "k8s.io/api/core/v1"
 | 
						|
	rbacv1 "k8s.io/api/rbac/v1"
 | 
						|
	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 | 
						|
)
 | 
						|
 | 
						|
var (
 | 
						|
	secretObj = &corev1.Secret{
 | 
						|
		TypeMeta: metav1.TypeMeta{
 | 
						|
			Kind:       "Secret",
 | 
						|
			APIVersion: "v1",
 | 
						|
		},
 | 
						|
		ObjectMeta: metav1.ObjectMeta{
 | 
						|
			Namespace: "foo",
 | 
						|
			Name:      "bar",
 | 
						|
		},
 | 
						|
	}
 | 
						|
	nodeObj = &corev1.Node{
 | 
						|
		TypeMeta: metav1.TypeMeta{
 | 
						|
			Kind:       "Node",
 | 
						|
			APIVersion: "v1",
 | 
						|
		},
 | 
						|
		ObjectMeta: metav1.ObjectMeta{
 | 
						|
			Namespace: "foo",
 | 
						|
			Name:      "bar",
 | 
						|
		},
 | 
						|
	}
 | 
						|
	roleObj = &rbacv1.Role{
 | 
						|
		TypeMeta: metav1.TypeMeta{
 | 
						|
			Kind:       "Role",
 | 
						|
			APIVersion: "v1",
 | 
						|
		},
 | 
						|
		ObjectMeta: metav1.ObjectMeta{
 | 
						|
			Namespace: "foo",
 | 
						|
			Name:      "bar",
 | 
						|
		},
 | 
						|
	}
 | 
						|
	clusterRoleObj = &rbacv1.ClusterRole{
 | 
						|
		TypeMeta: metav1.TypeMeta{
 | 
						|
			Kind:       "Role",
 | 
						|
			APIVersion: "v1",
 | 
						|
		},
 | 
						|
		ObjectMeta: metav1.ObjectMeta{
 | 
						|
			Namespace: "foo",
 | 
						|
			Name:      "bar",
 | 
						|
		},
 | 
						|
	}
 | 
						|
)
 | 
						|
 | 
						|
func TestClusterWideKeyFunc(t *testing.T) {
 | 
						|
	tests := []struct {
 | 
						|
		name         string
 | 
						|
		object       interface{}
 | 
						|
		expectErr    bool
 | 
						|
		expectKeyStr string
 | 
						|
	}{
 | 
						|
		{
 | 
						|
			name:         "namespace scoped resource in core group",
 | 
						|
			object:       secretObj,
 | 
						|
			expectErr:    false,
 | 
						|
			expectKeyStr: "v1, kind=Secret, foo/bar",
 | 
						|
		},
 | 
						|
		{
 | 
						|
			name:         "cluster scoped resource in core group",
 | 
						|
			object:       nodeObj,
 | 
						|
			expectErr:    false,
 | 
						|
			expectKeyStr: "v1, kind=Node, foo/bar",
 | 
						|
		},
 | 
						|
		{
 | 
						|
			name:         "namespace scoped resource not in core group",
 | 
						|
			object:       roleObj,
 | 
						|
			expectErr:    false,
 | 
						|
			expectKeyStr: "v1, kind=Role, foo/bar",
 | 
						|
		},
 | 
						|
		{
 | 
						|
			name:         "cluster scoped resource not in core group",
 | 
						|
			object:       clusterRoleObj,
 | 
						|
			expectErr:    false,
 | 
						|
			expectKeyStr: "v1, kind=Role, foo/bar",
 | 
						|
		},
 | 
						|
		{
 | 
						|
			name:      "non runtime object should be error",
 | 
						|
			object:    "non-runtime-object",
 | 
						|
			expectErr: true,
 | 
						|
		},
 | 
						|
		{
 | 
						|
			name:      "nil object should be error",
 | 
						|
			object:    nil,
 | 
						|
			expectErr: true,
 | 
						|
		},
 | 
						|
	}
 | 
						|
 | 
						|
	for _, test := range tests {
 | 
						|
		tc := test
 | 
						|
		t.Run(tc.name, func(t *testing.T) {
 | 
						|
			key, err := ClusterWideKeyFunc(tc.object)
 | 
						|
			if err != nil {
 | 
						|
				if tc.expectErr == false {
 | 
						|
					t.Fatalf("not expect error but error happed: %v", err)
 | 
						|
				}
 | 
						|
 | 
						|
				return
 | 
						|
			}
 | 
						|
 | 
						|
			if key.String() != tc.expectKeyStr {
 | 
						|
				t.Fatalf("expect key string: %s, but got: %s", tc.expectKeyStr, key.String())
 | 
						|
			}
 | 
						|
		})
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
func TestFederatedKeyFunc(t *testing.T) {
 | 
						|
	tests := []struct {
 | 
						|
		name         string
 | 
						|
		object       interface{}
 | 
						|
		cluster      string
 | 
						|
		expectErr    bool
 | 
						|
		expectKeyStr string
 | 
						|
	}{
 | 
						|
		{
 | 
						|
			name:         "namespace scoped resource in core group",
 | 
						|
			object:       secretObj,
 | 
						|
			cluster:      "member1",
 | 
						|
			expectErr:    false,
 | 
						|
			expectKeyStr: "cluster=member1, v1, kind=Secret, foo/bar",
 | 
						|
		},
 | 
						|
		{
 | 
						|
			name:         "cluster scoped resource in core group",
 | 
						|
			object:       nodeObj,
 | 
						|
			cluster:      "member1",
 | 
						|
			expectErr:    false,
 | 
						|
			expectKeyStr: "cluster=member1, v1, kind=Node, foo/bar",
 | 
						|
		},
 | 
						|
		{
 | 
						|
			name:         "namespace scoped resource not in core group",
 | 
						|
			object:       roleObj,
 | 
						|
			cluster:      "member1",
 | 
						|
			expectErr:    false,
 | 
						|
			expectKeyStr: "cluster=member1, v1, kind=Role, foo/bar",
 | 
						|
		},
 | 
						|
		{
 | 
						|
			name:         "cluster scoped resource not in core group",
 | 
						|
			object:       clusterRoleObj,
 | 
						|
			cluster:      "member1",
 | 
						|
			expectErr:    false,
 | 
						|
			expectKeyStr: "cluster=member1, v1, kind=Role, foo/bar",
 | 
						|
		},
 | 
						|
		{
 | 
						|
			name:      "non runtime object should be error",
 | 
						|
			object:    "non-runtime-object",
 | 
						|
			cluster:   "member1",
 | 
						|
			expectErr: true,
 | 
						|
		},
 | 
						|
		{
 | 
						|
			name:      "nil object should be error",
 | 
						|
			object:    nil,
 | 
						|
			cluster:   "member1",
 | 
						|
			expectErr: true,
 | 
						|
		},
 | 
						|
		{
 | 
						|
			name:      "empty cluster name should be error",
 | 
						|
			object:    clusterRoleObj,
 | 
						|
			cluster:   "",
 | 
						|
			expectErr: true,
 | 
						|
		},
 | 
						|
	}
 | 
						|
 | 
						|
	for _, test := range tests {
 | 
						|
		tc := test
 | 
						|
		t.Run(tc.name, func(t *testing.T) {
 | 
						|
			key, err := FederatedKeyFunc(tc.cluster, tc.object)
 | 
						|
			if err != nil {
 | 
						|
				if tc.expectErr == false {
 | 
						|
					t.Fatalf("not expect error but got: %v", err)
 | 
						|
				}
 | 
						|
				return
 | 
						|
			}
 | 
						|
 | 
						|
			if key.String() != tc.expectKeyStr {
 | 
						|
				t.Fatalf("expect key string: %s, but got: %s", tc.expectKeyStr, key.String())
 | 
						|
			}
 | 
						|
		})
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
func ExampleClusterWideKey_String() {
 | 
						|
	key := ClusterWideKey{
 | 
						|
		Group:     "apps",
 | 
						|
		Version:   "v1",
 | 
						|
		Kind:      "Namespace",
 | 
						|
		Namespace: "default",
 | 
						|
		Name:      "foo",
 | 
						|
	}
 | 
						|
	pKey := &key
 | 
						|
	fmt.Printf("%s\n", key)
 | 
						|
	fmt.Printf("%v\n", key)
 | 
						|
	fmt.Printf("%s\n", key.String())
 | 
						|
	fmt.Printf("%s\n", pKey)
 | 
						|
	fmt.Printf("%v\n", pKey)
 | 
						|
	fmt.Printf("%s\n", pKey.String())
 | 
						|
	// Output:
 | 
						|
	// apps/v1, kind=Namespace, default/foo
 | 
						|
	// apps/v1, kind=Namespace, default/foo
 | 
						|
	// apps/v1, kind=Namespace, default/foo
 | 
						|
	// apps/v1, kind=Namespace, default/foo
 | 
						|
	// apps/v1, kind=Namespace, default/foo
 | 
						|
	// apps/v1, kind=Namespace, default/foo
 | 
						|
}
 | 
						|
 | 
						|
func ExampleFederatedKey_String() {
 | 
						|
	key := FederatedKey{
 | 
						|
		Cluster: "karamda",
 | 
						|
		ClusterWideKey: ClusterWideKey{
 | 
						|
			Group:     "apps",
 | 
						|
			Version:   "v1",
 | 
						|
			Kind:      "Namespace",
 | 
						|
			Namespace: "default",
 | 
						|
			Name:      "foo"},
 | 
						|
	}
 | 
						|
	pKey := &key
 | 
						|
	fmt.Printf("%s\n", key)
 | 
						|
	fmt.Printf("%v\n", key)
 | 
						|
	fmt.Printf("%s\n", key.String())
 | 
						|
	fmt.Printf("%s\n", pKey)
 | 
						|
	fmt.Printf("%v\n", pKey)
 | 
						|
	fmt.Printf("%s\n", pKey.String())
 | 
						|
	// Output:
 | 
						|
	// cluster=karamda, apps/v1, kind=Namespace, default/foo
 | 
						|
	// cluster=karamda, apps/v1, kind=Namespace, default/foo
 | 
						|
	// cluster=karamda, apps/v1, kind=Namespace, default/foo
 | 
						|
	// cluster=karamda, apps/v1, kind=Namespace, default/foo
 | 
						|
	// cluster=karamda, apps/v1, kind=Namespace, default/foo
 | 
						|
	// cluster=karamda, apps/v1, kind=Namespace, default/foo
 | 
						|
}
 |