feat: kubesphere 4.0 (#6115)
* feat: kubesphere 4.0 Signed-off-by: ci-bot <ci-bot@kubesphere.io> * feat: kubesphere 4.0 Signed-off-by: ci-bot <ci-bot@kubesphere.io> --------- Signed-off-by: ci-bot <ci-bot@kubesphere.io> Co-authored-by: ks-ci-bot <ks-ci-bot@example.com> Co-authored-by: joyceliu <joyceliu@yunify.com>
This commit is contained in:
committed by
GitHub
parent
b5015ec7b9
commit
447a51f08b
@@ -1,55 +1,40 @@
|
||||
//go:build exclude
|
||||
|
||||
/*
|
||||
Copyright 2020 KubeSphere Authors
|
||||
* Please refer to the LICENSE file in the root directory of the project.
|
||||
* https://github.com/kubesphere/kubesphere/blob/master/LICENSE
|
||||
*/
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
*/
|
||||
// TODO test failed
|
||||
|
||||
package v1alpha1
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"context"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"net/url"
|
||||
"testing"
|
||||
|
||||
"github.com/google/go-cmp/cmp"
|
||||
runtimefakeclient "sigs.k8s.io/controller-runtime/pkg/client/fake"
|
||||
|
||||
"kubesphere.io/kubesphere/pkg/scheme"
|
||||
|
||||
appsv1 "k8s.io/api/apps/v1"
|
||||
corev1 "k8s.io/api/core/v1"
|
||||
"k8s.io/apimachinery/pkg/api/errors"
|
||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||
"k8s.io/cli-runtime/pkg/printers"
|
||||
"k8s.io/client-go/kubernetes"
|
||||
k8s "k8s.io/client-go/kubernetes"
|
||||
k8sfake "k8s.io/client-go/kubernetes/fake"
|
||||
"k8s.io/client-go/tools/clientcmd"
|
||||
"sigs.k8s.io/controller-runtime/pkg/envtest"
|
||||
|
||||
"kubesphere.io/api/cluster/v1alpha1"
|
||||
|
||||
"kubesphere.io/kubesphere/pkg/client/clientset/versioned/fake"
|
||||
"kubesphere.io/kubesphere/pkg/constants"
|
||||
"kubesphere.io/kubesphere/pkg/informers"
|
||||
"kubesphere.io/kubesphere/pkg/utils/k8sutil"
|
||||
)
|
||||
|
||||
const (
|
||||
proxyAddress = "http://139.198.121.121:8080"
|
||||
agentImage = "kubesphere/tower:v1.0"
|
||||
proxyService = "tower.kubesphere-system.svc"
|
||||
)
|
||||
|
||||
var cluster = &v1alpha1.Cluster{
|
||||
ObjectMeta: metav1.ObjectMeta{
|
||||
Name: "gondor",
|
||||
@@ -62,31 +47,6 @@ var cluster = &v1alpha1.Cluster{
|
||||
},
|
||||
}
|
||||
|
||||
var service = &corev1.Service{
|
||||
ObjectMeta: metav1.ObjectMeta{
|
||||
Name: "tower",
|
||||
Namespace: "kubesphere-system",
|
||||
},
|
||||
Spec: corev1.ServiceSpec{
|
||||
Ports: []corev1.ServicePort{
|
||||
{
|
||||
Port: 8080,
|
||||
Protocol: corev1.ProtocolTCP,
|
||||
},
|
||||
},
|
||||
},
|
||||
Status: corev1.ServiceStatus{
|
||||
LoadBalancer: corev1.LoadBalancerStatus{
|
||||
Ingress: []corev1.LoadBalancerIngress{
|
||||
{
|
||||
IP: "139.198.121.121",
|
||||
Hostname: "foo.bar",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
var hostMap = map[string]string{
|
||||
"kubesphere.yaml": `
|
||||
monitoring:
|
||||
@@ -96,8 +56,6 @@ authentication:
|
||||
oauthOptions:
|
||||
accessTokenMaxAge: 0s
|
||||
accessTokenInactivityTimeout: 0s
|
||||
multicluster:
|
||||
clusterRole: host
|
||||
`,
|
||||
}
|
||||
|
||||
@@ -106,12 +64,10 @@ var memberMap = map[string]string{
|
||||
monitoring:
|
||||
endpoint: http://prometheus-operated.kubesphere-monitoring-system.svc:9090
|
||||
authentication:
|
||||
jwtSecret: sQh3JOqNbmci6Gu94TeV10AY7ipltwjp
|
||||
jwtSecret: sQh3JOqNbmci6Gu94TeV10AY7ipltwj
|
||||
oauthOptions:
|
||||
accessTokenMaxAge: 0s
|
||||
accessTokenInactivityTimeout: 0s
|
||||
multicluster:
|
||||
clusterRole: member
|
||||
`,
|
||||
}
|
||||
|
||||
@@ -178,134 +134,6 @@ var ksApiserverDeploy = `
|
||||
}
|
||||
}`
|
||||
|
||||
var expected = `apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
metadata:
|
||||
creationTimestamp: null
|
||||
name: cluster-agent
|
||||
namespace: kubesphere-system
|
||||
spec:
|
||||
selector:
|
||||
matchLabels:
|
||||
app: agent
|
||||
app.kubernetes.io/part-of: tower
|
||||
strategy: {}
|
||||
template:
|
||||
metadata:
|
||||
creationTimestamp: null
|
||||
labels:
|
||||
app: agent
|
||||
app.kubernetes.io/part-of: tower
|
||||
spec:
|
||||
containers:
|
||||
- command:
|
||||
- /agent
|
||||
- --name=gondor
|
||||
- --token=randomtoken
|
||||
- --proxy-server=http://139.198.121.121:8080
|
||||
- --keepalive=10s
|
||||
- --kubesphere-service=ks-apiserver.kubesphere-system.svc:80
|
||||
- --kubernetes-service=kubernetes.default.svc:443
|
||||
- --v=0
|
||||
image: kubesphere/tower:v1.0
|
||||
name: agent
|
||||
resources:
|
||||
limits:
|
||||
cpu: "1"
|
||||
memory: 200M
|
||||
requests:
|
||||
cpu: 100m
|
||||
memory: 100M
|
||||
serviceAccountName: kubesphere
|
||||
status: {}
|
||||
`
|
||||
|
||||
func TestGeranteAgentDeployment(t *testing.T) {
|
||||
k8sclient := k8sfake.NewSimpleClientset(service)
|
||||
ksclient := fake.NewSimpleClientset(cluster)
|
||||
|
||||
informersFactory := informers.NewInformerFactories(k8sclient, ksclient, nil, nil, nil, nil)
|
||||
|
||||
informersFactory.KubernetesSharedInformerFactory().Core().V1().Services().Informer().GetIndexer().Add(service)
|
||||
informersFactory.KubeSphereSharedInformerFactory().Cluster().V1alpha1().Clusters().Informer().GetIndexer().Add(cluster)
|
||||
|
||||
directConnectionCluster := cluster.DeepCopy()
|
||||
directConnectionCluster.Spec.Connection.Type = v1alpha1.ConnectionTypeDirect
|
||||
|
||||
var testCases = []struct {
|
||||
description string
|
||||
expectingError bool
|
||||
expectedError error
|
||||
cluster *v1alpha1.Cluster
|
||||
expected string
|
||||
}{
|
||||
{
|
||||
description: "test normal case",
|
||||
expectingError: false,
|
||||
expected: expected,
|
||||
cluster: cluster,
|
||||
},
|
||||
{
|
||||
description: "test direct connection cluster",
|
||||
expectingError: true,
|
||||
expectedError: errClusterConnectionIsNotProxy,
|
||||
cluster: directConnectionCluster,
|
||||
},
|
||||
}
|
||||
|
||||
for _, testCase := range testCases {
|
||||
|
||||
t.Run(testCase.description, func(t *testing.T) {
|
||||
h := newHandler(ksclient, informersFactory.KubernetesSharedInformerFactory(),
|
||||
informersFactory.KubeSphereSharedInformerFactory(),
|
||||
proxyService,
|
||||
"",
|
||||
agentImage)
|
||||
|
||||
var buf bytes.Buffer
|
||||
|
||||
err := h.populateProxyAddress()
|
||||
if err != nil {
|
||||
t.Error(err)
|
||||
}
|
||||
|
||||
err = h.generateDefaultDeployment(testCase.cluster, &buf)
|
||||
if testCase.expectingError {
|
||||
if err == nil {
|
||||
t.Fatalf("expecting error %v, got nil", testCase.expectedError)
|
||||
} else if err != testCase.expectedError {
|
||||
t.Fatalf("expecting error %v, got %v", testCase.expectedError, err)
|
||||
}
|
||||
}
|
||||
|
||||
if diff := cmp.Diff(testCase.expected, buf.String()); len(diff) != 0 {
|
||||
t.Errorf("%T, got +, expected -, %s", testCase.expected, diff)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func TestInnerGenerateAgentDeployment(t *testing.T) {
|
||||
h := &handler{
|
||||
proxyAddress: proxyAddress,
|
||||
agentImage: agentImage,
|
||||
yamlPrinter: &printers.YAMLPrinter{},
|
||||
}
|
||||
|
||||
var buf bytes.Buffer
|
||||
|
||||
err := h.generateDefaultDeployment(cluster, &buf)
|
||||
|
||||
if err != nil {
|
||||
t.Error(err)
|
||||
}
|
||||
|
||||
if diff := cmp.Diff(buf.String(), expected); len(diff) != 0 {
|
||||
t.Error(diff)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
var base64EncodedKubeConfig = `
|
||||
apiVersion: v1
|
||||
clusters:
|
||||
@@ -329,19 +157,10 @@ users:
|
||||
`
|
||||
|
||||
func TestValidateKubeConfig(t *testing.T) {
|
||||
k8sclient := k8sfake.NewSimpleClientset(service)
|
||||
ksclient := fake.NewSimpleClientset(cluster)
|
||||
|
||||
informersFactory := informers.NewInformerFactories(k8sclient, ksclient, nil, nil, nil, nil)
|
||||
|
||||
informersFactory.KubernetesSharedInformerFactory().Core().V1().Services().Informer().GetIndexer().Add(service)
|
||||
informersFactory.KubeSphereSharedInformerFactory().Cluster().V1alpha1().Clusters().Informer().GetIndexer().Add(cluster)
|
||||
|
||||
h := newHandler(ksclient, informersFactory.KubernetesSharedInformerFactory(),
|
||||
informersFactory.KubeSphereSharedInformerFactory(),
|
||||
proxyService,
|
||||
"",
|
||||
agentImage)
|
||||
client := runtimefakeclient.NewClientBuilder().
|
||||
WithScheme(scheme.Scheme).
|
||||
Build()
|
||||
h := newHandler(client)
|
||||
|
||||
config, err := k8sutil.LoadKubeConfigFromBytes([]byte(base64EncodedKubeConfig))
|
||||
if err != nil {
|
||||
@@ -388,20 +207,11 @@ func TestValidateKubeConfig(t *testing.T) {
|
||||
}
|
||||
|
||||
func TestValidateMemberClusterConfiguration(t *testing.T) {
|
||||
k8sclient := k8sfake.NewSimpleClientset(service)
|
||||
ksclient := fake.NewSimpleClientset(cluster)
|
||||
client := runtimefakeclient.NewClientBuilder().
|
||||
WithScheme(scheme.Scheme).
|
||||
Build()
|
||||
|
||||
informersFactory := informers.NewInformerFactories(k8sclient, ksclient, nil, nil, nil, nil)
|
||||
|
||||
informersFactory.KubernetesSharedInformerFactory().Core().V1().Services().Informer().GetIndexer().Add(service)
|
||||
informersFactory.KubeSphereSharedInformerFactory().Cluster().V1alpha1().Clusters().Informer().GetIndexer().Add(cluster)
|
||||
informersFactory.KubernetesSharedInformerFactory().Core().V1().ConfigMaps().Informer().GetIndexer().Add(hostCm)
|
||||
|
||||
h := newHandler(ksclient, informersFactory.KubernetesSharedInformerFactory(),
|
||||
informersFactory.KubeSphereSharedInformerFactory(),
|
||||
proxyService,
|
||||
"",
|
||||
agentImage)
|
||||
h := newHandler(client)
|
||||
|
||||
config, err := k8sutil.LoadKubeConfigFromBytes([]byte(base64EncodedKubeConfig))
|
||||
if err != nil {
|
||||
@@ -441,10 +251,19 @@ func TestValidateMemberClusterConfiguration(t *testing.T) {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
addMemberClusterResource(memberCm, t)
|
||||
if err = h.validateMemberClusterConfiguration(clientSet); err != nil {
|
||||
addMemberClusterResource(hostCm, t)
|
||||
|
||||
err = h.validateMemberClusterConfiguration(clientSet)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
addMemberClusterResource(memberCm, t)
|
||||
err = h.validateMemberClusterConfiguration(clientSet)
|
||||
if err == nil {
|
||||
t.Fatal()
|
||||
}
|
||||
t.Log(err)
|
||||
}
|
||||
|
||||
func addMemberClusterResource(targetCm *corev1.ConfigMap, t *testing.T) {
|
||||
|
||||
Reference in New Issue
Block a user