mirror of
https://github.com/kubenetworks/kubevpn.git
synced 2025-12-24 11:51:13 +08:00
refactor: refactor cmd status (#236)
Co-authored-by: wencaiwulue <895703375@qq.com>
This commit is contained in:
@@ -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 {
|
||||
|
||||
@@ -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
@@ -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 {
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user