diff --git a/cmd/kubevpn/cmds/connect.go b/cmd/kubevpn/cmds/connect.go index e6850943..978b72fb 100644 --- a/cmd/kubevpn/cmds/connect.go +++ b/cmd/kubevpn/cmds/connect.go @@ -64,6 +64,7 @@ func CmdConnect(f cmdutil.Factory) *cobra.Command { } cmd.Flags().BoolVar(&config.Debug, "debug", false, "enable debug mode or not, true or false") cmd.Flags().StringVar(&config.Image, "image", config.Image, "use this image to startup container") + cmd.Flags().StringArrayVar(&connect.ExtraCIDR, "extra-cidr", []string{}, "Extra cidr string, eg: --extra-cidr 192.168.0.159/24 --extra-cidr 192.168.1.160/32") addSshFlag(cmd, sshConf) return cmd diff --git a/cmd/kubevpn/cmds/dev.go b/cmd/kubevpn/cmds/dev.go index 8f9314b5..4a325c9a 100644 --- a/cmd/kubevpn/cmds/dev.go +++ b/cmd/kubevpn/cmds/dev.go @@ -33,6 +33,7 @@ func CmdDev(f cmdutil.Factory) *cobra.Command { Volumes: opts.NewListOpts(nil), ExtraHosts: opts.NewListOpts(nil), NoProxy: false, + ExtraCIDR: []string{}, } var sshConf = &util.SshConfig{} cmd := &cobra.Command{ @@ -74,6 +75,7 @@ func CmdDev(f cmdutil.Factory) *cobra.Command { connect := handler.ConnectOptions{ Headers: devOptions.Headers, Workloads: args, + ExtraCIDR: devOptions.ExtraCIDR, } if devOptions.ParentContainer != "" { @@ -97,9 +99,9 @@ func CmdDev(f cmdutil.Factory) *cobra.Command { if err := connect.InitClient(f); err != nil { return err } - err2 := connect.PreCheckResource() - if err2 != nil { - return err2 + err := connect.PreCheckResource() + if err != nil { + return err } if len(connect.Workloads) > 1 { @@ -121,12 +123,12 @@ func CmdDev(f cmdutil.Factory) *cobra.Command { handler.Cleanup(syscall.SIGQUIT) select {} }() - if err := connect.DoConnect(); err != nil { + if err = connect.DoConnect(); err != nil { log.Errorln(err) return err } devOptions.Namespace = connect.Namespace - err := devOptions.Main(context.Background()) + err = devOptions.Main(context.Background()) if err != nil { log.Errorln(err) } @@ -139,6 +141,7 @@ func CmdDev(f cmdutil.Factory) *cobra.Command { cmd.Flags().BoolVar(&devOptions.NoProxy, "no-proxy", false, "Whether proxy remote workloads traffic into local or not, true: just startup container on local without inject containers to intercept traffic, false: intercept traffic and forward to local") cmdutil.AddContainerVarFlags(cmd, &devOptions.ContainerName, devOptions.ContainerName) cmdutil.CheckErr(cmd.RegisterFlagCompletionFunc("container", completion.ContainerCompletionFunc(f))) + cmd.Flags().StringArrayVar(&devOptions.ExtraCIDR, "extra-cidr", []string{}, "Extra cidr string, eg: --extra-cidr 192.168.0.159/24 --extra-cidr 192.168.1.160/32") // docker options cmd.Flags().Var(&devOptions.ExtraHosts, "add-host", "Add a custom host-to-IP mapping (host:ip)") diff --git a/cmd/kubevpn/cmds/duplicate.go b/cmd/kubevpn/cmds/duplicate.go index cbd0b6f9..b2181cff 100644 --- a/cmd/kubevpn/cmds/duplicate.go +++ b/cmd/kubevpn/cmds/duplicate.go @@ -80,6 +80,7 @@ func CmdDuplicate(f cmdutil.Factory) *cobra.Command { connectOptions := handler.ConnectOptions{ Namespace: duplicateOptions.Namespace, Workloads: args, + ExtraCIDR: duplicateOptions.ExtraCIDR, } if err := connectOptions.InitClient(f); err != nil { return err @@ -110,6 +111,8 @@ func CmdDuplicate(f cmdutil.Factory) *cobra.Command { cmd.Flags().StringToStringVarP(&duplicateOptions.Headers, "headers", "H", map[string]string{}, "Traffic with special headers with reverse it to duplicate workloads, you should startup your service after reverse workloads successfully, If not special, redirect all traffic to duplicate workloads, format is k=v, like: k1=v1,k2=v2") cmd.Flags().BoolVar(&config.Debug, "debug", false, "Enable debug mode or not, true or false") cmd.Flags().StringVar(&config.Image, "image", config.Image, "Use this image to startup container") + cmd.Flags().StringArrayVar(&duplicateOptions.ExtraCIDR, "extra-cidr", []string{}, "Extra cidr string, eg: --extra-cidr 192.168.0.159/24 --extra-cidr 192.168.1.160/32") + cmd.Flags().StringVar(&duplicateOptions.TargetImage, "target-image", "", "Duplicate container use this image to startup container, if not special, use origin origin image") cmd.Flags().StringVar(&duplicateOptions.TargetContainer, "target-container", "", "Duplicate container use special image to startup this container, if not special, use origin origin image") cmd.Flags().StringVar(&duplicateOptions.TargetNamespace, "target-namespace", "", "Duplicate workloads in this namespace, if not special, use origin namespace") diff --git a/cmd/kubevpn/cmds/proxy.go b/cmd/kubevpn/cmds/proxy.go index 9ff29803..a7a66686 100644 --- a/cmd/kubevpn/cmds/proxy.go +++ b/cmd/kubevpn/cmds/proxy.go @@ -93,6 +93,7 @@ func CmdProxy(f cmdutil.Factory) *cobra.Command { cmd.Flags().StringToStringVarP(&connect.Headers, "headers", "H", map[string]string{}, "Traffic with special headers with reverse it to local PC, you should startup your service after reverse workloads successfully, If not special, redirect all traffic to local PC, format is k=v, like: k1=v1,k2=v2") cmd.Flags().BoolVar(&config.Debug, "debug", false, "Enable debug mode or not, true or false") cmd.Flags().StringVar(&config.Image, "image", config.Image, "Use this image to startup container") + cmd.Flags().StringArrayVar(&connect.ExtraCIDR, "extra-cidr", []string{}, "Extra cidr string, eg: --extra-cidr 192.168.0.159/24 --extra-cidr 192.168.1.160/32") addSshFlag(cmd, sshConf) cmd.ValidArgsFunction = utilcomp.ResourceTypeAndNameCompletionFunc(f) diff --git a/pkg/dev/main.go b/pkg/dev/main.go index 61f00003..88d61ee2 100644 --- a/pkg/dev/main.go +++ b/pkg/dev/main.go @@ -38,6 +38,7 @@ type Options struct { Factory cmdutil.Factory ContainerName string NoProxy bool + ExtraCIDR []string // docker options Platform string diff --git a/pkg/handler/connect.go b/pkg/handler/connect.go index e5e4b21e..622463f2 100644 --- a/pkg/handler/connect.go +++ b/pkg/handler/connect.go @@ -47,9 +47,11 @@ import ( ) type ConnectOptions struct { - Namespace string - Headers map[string]string - Workloads []string + Namespace string + Headers map[string]string + Workloads []string + ExtraCIDR []string + clientset *kubernetes.Clientset restclient *rest.RESTClient config *rest.Config @@ -255,6 +257,14 @@ func (c *ConnectOptions) startLocalTunServe(ctx context.Context, forwardAddress for _, ipNet := range c.cidrs { list.Insert(ipNet.String()) } + // add extra-cidr + for _, s := range c.ExtraCIDR { + _, _, err = net.ParseCIDR(s) + if err != nil { + return fmt.Errorf("invalid extra-cidr %s, err: %v", s, err) + } + list.Insert(s) + } r := core.Route{ ServeNodes: []string{ fmt.Sprintf("tun:/127.0.0.1:8422?net=%s&route=%s", c.localTunIP.String(), strings.Join(list.UnsortedList(), ",")), diff --git a/pkg/handler/duplicate.go b/pkg/handler/duplicate.go index 09a3da9f..acb34b05 100644 --- a/pkg/handler/duplicate.go +++ b/pkg/handler/duplicate.go @@ -41,6 +41,7 @@ type DuplicateOptions struct { Namespace string Headers map[string]string Workloads []string + ExtraCIDR []string TargetKubeconfig string TargetNamespace string @@ -646,8 +647,31 @@ func (d *DuplicateOptions) setEnv(u *unstructured.Unstructured) error { } // todo replace origin registry with special registry for pulling image -func (d *DuplicateOptions) replaceRegistry(u *unstructured.Unstructured) { - if d.TargetRegistry != "" { - +func (d *DuplicateOptions) replaceRegistry(u *unstructured.Unstructured) error { + if d.TargetRegistry == "" { + return nil } + + temp, path, err := util.GetPodTemplateSpecPath(u) + if err != nil { + return err + } + + //for i, container := range temp.Spec.InitContainers { + // if container.Image + //} + + var marshal []byte + if marshal, err = json.Marshal(temp.Spec); err != nil { + return err + } + var content map[string]interface{} + if err = json.Unmarshal(marshal, &content); err != nil { + return err + } + if err = unstructured.SetNestedField(u.Object, content, append(path, "spec")...); err != nil { + return err + } + + return nil } diff --git a/pkg/handler/function_test.go b/pkg/handler/function_test.go index fd5793d7..49392714 100644 --- a/pkg/handler/function_test.go +++ b/pkg/handler/function_test.go @@ -13,6 +13,7 @@ import ( "testing" "time" + "github.com/docker/distribution/reference" log "github.com/sirupsen/logrus" corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -299,3 +300,19 @@ func init() { log.Fatal(err) } } + +func TestName(t *testing.T) { + name := "alpine@sha256:b733d4a32c4da6a00a84df2ca32791bb03df95400243648d8c539e7b4cce329c" + named, err := reference.ParseNormalizedNamed(name) + if err != nil { + t.Error(err) + } + named = reference.TagNameOnly(named) + domain := reference.Domain(named) + path := reference.Path(named) + tagged, ok := named.(reference.Tagged) + if !ok { + t.Fail() + } + fmt.Println(domain, path, tagged) +}