refactor: refactor cmd status (#236)

Co-authored-by: wencaiwulue <895703375@qq.com>
This commit is contained in:
naison
2024-04-30 22:02:48 +08:00
committed by GitHub
parent 706afb348d
commit ca18dab08f
13 changed files with 1336 additions and 397 deletions

View File

@@ -50,6 +50,8 @@ func (svr *Server) Clone(req *rpc.CloneRequest, resp rpc.Daemon_CloneServer) err
fmt.Fprint(out, msg.Message)
} else if code := status.Code(err); code == codes.DeadlineExceeded || code == codes.Canceled {
return nil
} else if code := status.Code(err); code == codes.AlreadyExists {
return fmt.Errorf("already connect to cluster, needs to disconnect it first")
} else {
return err
}
@@ -57,11 +59,12 @@ func (svr *Server) Clone(req *rpc.CloneRequest, resp rpc.Daemon_CloneServer) err
log.SetOutput(out)
options := &handler.CloneOptions{
Namespace: req.Namespace,
Headers: req.Headers,
Workloads: req.Workloads,
ExtraRouteInfo: *handler.ParseExtraRouteFromRPC(req.ExtraRoute),
Engine: config.Engine(req.Engine),
Namespace: req.Namespace,
Headers: req.Headers,
Workloads: req.Workloads,
ExtraRouteInfo: *handler.ParseExtraRouteFromRPC(req.ExtraRoute),
Engine: config.Engine(req.Engine),
OriginKubeconfigPath: req.OriginKubeconfigPath,
TargetKubeconfig: req.TargetKubeconfig,
TargetNamespace: req.TargetNamespace,
@@ -69,6 +72,7 @@ func (svr *Server) Clone(req *rpc.CloneRequest, resp rpc.Daemon_CloneServer) err
TargetImage: req.TargetImage,
TargetRegistry: req.TargetRegistry,
IsChangeTargetRegistry: req.IsChangeTargetRegistry,
TargetWorkloadNames: map[string]string{},
}
file, err := util.ConvertToTempKubeconfigFile([]byte(req.KubeconfigBytes))
if err != nil {

View File

@@ -2,7 +2,13 @@ package action
import (
"context"
"strings"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"sigs.k8s.io/yaml"
"github.com/wencaiwulue/kubevpn/v2/pkg/config"
"github.com/wencaiwulue/kubevpn/v2/pkg/controlplane"
"github.com/wencaiwulue/kubevpn/v2/pkg/daemon/rpc"
"github.com/wencaiwulue/kubevpn/v2/pkg/handler"
"github.com/wencaiwulue/kubevpn/v2/pkg/util"
@@ -22,7 +28,13 @@ func (svr *Server) Status(ctx context.Context, req *rpc.StatusRequest) (*rpc.Sta
if len(req.ClusterIDs) != 0 {
for _, clusterID := range req.ClusterIDs {
if svr.connect.GetClusterID() == clusterID {
list = append(list, genStatus(svr.connect, ModeFull, 0))
status := genStatus(svr.connect, ModeFull, 0)
var err error
status.ProxyList, status.CloneList, err = gen(svr.connect, svr.clone)
if err != nil {
return nil, err
}
list = append(list, status)
}
for i, options := range svr.secondaryConnect {
if options.GetClusterID() == clusterID {
@@ -32,7 +44,13 @@ func (svr *Server) Status(ctx context.Context, req *rpc.StatusRequest) (*rpc.Sta
}
} else {
if svr.connect != nil {
list = append(list, genStatus(svr.connect, ModeFull, 0))
status := genStatus(svr.connect, ModeFull, 0)
var err error
status.ProxyList, status.CloneList, err = gen(svr.connect, svr.clone)
if err != nil {
return nil, err
}
list = append(list, status)
}
for i, options := range svr.secondaryConnect {
@@ -60,3 +78,73 @@ func genStatus(connect *handler.ConnectOptions, mode string, index int32) *rpc.S
}
return &info
}
func gen(connect *handler.ConnectOptions, clone *handler.CloneOptions) ([]*rpc.Proxy, []*rpc.Clone, error) {
var proxyList []*rpc.Proxy
if connect != nil && connect.GetClientset() != nil {
mapInterface := connect.GetClientset().CoreV1().ConfigMaps(connect.Namespace)
configMap, err := mapInterface.Get(context.Background(), config.ConfigMapPodTrafficManager, metav1.GetOptions{})
if err != nil {
return nil, nil, err
}
var v = make([]*controlplane.Virtual, 0)
if str, ok := configMap.Data[config.KeyEnvoy]; ok {
if err = yaml.Unmarshal([]byte(str), &v); err != nil {
return nil, nil, err
}
}
for _, virtual := range v {
// deployments.apps.ry-server --> deployments.apps/ry-server
lastIndex := strings.LastIndex(virtual.Uid, ".")
virtual.Uid = virtual.Uid[:lastIndex] + "/" + virtual.Uid[lastIndex+1:]
var proxyRule []*rpc.ProxyRule
for _, rule := range virtual.Rules {
proxyRule = append(proxyRule, &rpc.ProxyRule{
Headers: rule.Headers,
LocalTunIPv4: rule.LocalTunIPv4,
LocalTunIPv6: rule.LocalTunIPv6,
CurrentDevice: connect.GetLocalTunIPv4() == rule.LocalTunIPv4,
PortMap: rule.PortMap,
})
}
proxyList = append(proxyList, &rpc.Proxy{
ClusterID: connect.GetClusterID(),
Cluster: util.GetKubeconfigCluster(connect.GetFactory()),
Kubeconfig: connect.OriginKubeconfigPath,
Namespace: connect.Namespace,
Workload: virtual.Uid,
RuleList: proxyRule,
})
}
}
var cloneList []*rpc.Clone
if clone != nil {
for _, workload := range clone.Workloads {
var clusterID, cluster, kubeconfig, namespace string
if connect != nil {
clusterID = connect.GetClusterID()
cluster = util.GetKubeconfigCluster(connect.GetFactory())
kubeconfig = connect.OriginKubeconfigPath
namespace = connect.Namespace
}
cloneList = append(cloneList, &rpc.Clone{
ClusterID: clusterID,
Cluster: cluster,
Kubeconfig: kubeconfig,
Namespace: namespace,
Workload: workload,
RuleList: []*rpc.CloneRule{
{
DstCluster: util.GetKubeconfigCluster(clone.GetFactory()),
Headers: clone.Headers,
DstWorkload: clone.TargetWorkloadNames[workload],
DstKubeconfig: clone.TargetKubeconfig,
DstNamespace: clone.TargetNamespace,
},
},
})
}
}
return proxyList, cloneList, nil
}

File diff suppressed because it is too large Load Diff

View File

@@ -152,6 +152,43 @@ message Status {
string Namespace = 6;
string Status = 7;
string Netif = 8;
repeated Proxy ProxyList = 9;
repeated Clone CloneList = 10;
}
message Proxy {
string ClusterID = 1;
string Cluster = 2;
string Kubeconfig = 3;
string Namespace = 4;
string Workload = 5;
repeated ProxyRule RuleList = 6;
}
message ProxyRule {
map<string, string> Headers = 1;
string LocalTunIPv4 = 2;
string LocalTunIPv6 = 3;
bool CurrentDevice = 4;
map<int32, int32> PortMap = 5;
}
message Clone {
string ClusterID = 1;
string Cluster = 2;
string Kubeconfig = 3;
string Namespace = 4;
string Workload = 5;
repeated CloneRule RuleList = 6;
}
message CloneRule {
map<string, string> Headers = 6;
string DstClusterID = 9;
string DstCluster = 10;
string DstKubeconfig = 11;
string DstNamespace = 12;
string DstWorkload = 13;
}
message VersionRequest {

View File

@@ -109,7 +109,7 @@ func (option *Options) Main(ctx context.Context, c *containerConfig) error {
return sort.Reverse(podutils.ActivePods(pods))
}
label := labels.SelectorFromSet(templateSpec.Labels).String()
firstPod, _, err := polymorphichelpers.GetFirstPod(clientSet.CoreV1(), option.Namespace, label, time.Second*60, sortBy)
firstPod, _, err := polymorphichelpers.GetFirstPod(clientSet.CoreV1(), option.Namespace, label, time.Second*5, sortBy)
if err != nil {
log.Errorf("get first running pod from k8s: %v", err)
return err

View File

@@ -40,7 +40,7 @@ func (c *ConnectOptions) Cleanup() {
return
}
log.Info("prepare to exit, cleaning up")
ctx, cancel := context.WithTimeout(context.Background(), time.Second*5)
ctx, cancel := context.WithTimeout(context.Background(), time.Second*10)
defer cancel()
var ips []net.IP
if c.localTunIPv4 != nil && c.localTunIPv4.IP != nil {
@@ -77,7 +77,7 @@ func (c *ConnectOptions) Cleanup() {
}
}
// leave proxy resources
err := c.LeaveProxyResources(context.Background())
err := c.LeaveProxyResources(ctx)
if err != nil {
log.Errorf("leave proxy resources error: %v", err)
}

View File

@@ -53,9 +53,12 @@ type CloneOptions struct {
TargetImage string
TargetRegistry string
IsChangeTargetRegistry bool
TargetWorkloadNames map[string]string
isSame bool
OriginKubeconfigPath string
targetClientset *kubernetes.Clientset
targetRestclient *rest.RESTClient
targetConfig *rest.Config
@@ -86,6 +89,7 @@ func (d *CloneOptions) InitClient(f cmdutil.Factory) (err error) {
// init target info
if len(d.TargetKubeconfig) == 0 {
d.TargetKubeconfig = d.OriginKubeconfigPath
d.targetFactory = d.factory
d.targetClientset = d.clientset
d.targetConfig = d.config
@@ -155,6 +159,7 @@ func (d *CloneOptions) DoClone(ctx context.Context) error {
}
originName := u.GetName()
u.SetName(fmt.Sprintf("%s-clone-%s", u.GetName(), newUUID.String()[:5]))
d.TargetWorkloadNames[workload] = u.GetName()
// if is another cluster, needs to set volume and set env
if !d.isSame {
if err = d.setVolume(u); err != nil {
@@ -795,3 +800,7 @@ func (d *CloneOptions) Cleanup(workloads ...string) error {
func (d *CloneOptions) addRollbackFunc(f func() error) {
d.rollbackFuncList = append(d.rollbackFuncList, f)
}
func (d *CloneOptions) GetFactory() cmdutil.Factory {
return d.factory
}

View File

@@ -11,6 +11,7 @@ import (
"os"
"os/exec"
"reflect"
"sort"
"strconv"
"strings"
"sync"
@@ -42,6 +43,7 @@ import (
cmdutil "k8s.io/kubectl/pkg/cmd/util"
"k8s.io/kubectl/pkg/polymorphichelpers"
"k8s.io/kubectl/pkg/scheme"
"k8s.io/kubectl/pkg/util/podutils"
"k8s.io/utils/pointer"
"github.com/wencaiwulue/kubevpn/v2/pkg/config"
@@ -250,6 +252,9 @@ func (c *ConnectOptions) portForward(ctx context.Context, portPair []string) err
func() {
defer time.Sleep(time.Second * 2)
sortBy := func(pods []*v1.Pod) sort.Interface { return sort.Reverse(podutils.ActivePods(pods)) }
label := fields.OneTermEqualSelector("app", config.ConfigMapPodTrafficManager).String()
_, _, _ = polymorphichelpers.GetFirstPod(c.clientset.CoreV1(), c.Namespace, label, time.Second*30, sortBy)
podList, err := c.GetRunningPodList(ctx)
if err != nil {
time.Sleep(time.Second * 2)
@@ -1183,9 +1188,9 @@ func (c *ConnectOptions) heartbeats(ctx context.Context) {
func (c *ConnectOptions) Equal(a *ConnectOptions) bool {
return c.Engine == a.Engine &&
reflect.DeepEqual(c.ExtraRouteInfo.ExtraDomain, a.ExtraRouteInfo.ExtraDomain) &&
reflect.DeepEqual(c.ExtraRouteInfo.ExtraCIDR, a.ExtraRouteInfo.ExtraCIDR) &&
reflect.DeepEqual(c.ExtraRouteInfo.ExtraNodeIP, a.ExtraRouteInfo.ExtraNodeIP)
sets.New[string](c.ExtraRouteInfo.ExtraDomain...).HasAll(a.ExtraRouteInfo.ExtraDomain...) &&
sets.New[string](c.ExtraRouteInfo.ExtraCIDR...).HasAll(c.ExtraRouteInfo.ExtraCIDR...) &&
(reflect.DeepEqual(c.ExtraRouteInfo.ExtraNodeIP, a.ExtraRouteInfo.ExtraNodeIP) || c.ExtraRouteInfo.ExtraNodeIP == true)
}
func (c *ConnectOptions) GetTunDeviceName() (string, error) {