diff --git a/CHANGELOG.md b/CHANGELOG.md index 29286c638..43659715e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,8 @@ * What's New * [ziti#192 CAs default to 10yr expiration](https://github.com/openziti/ziti/issues/192) - + * Allow specifying edge config file when using ziti-fabric-test loop2 + # Release 0.16.2 * What's New diff --git a/ziti-fabric-test/subcmd/loop2/dialer.go b/ziti-fabric-test/subcmd/loop2/dialer.go index ccb5e1978..1ca8561ad 100644 --- a/ziti-fabric-test/subcmd/loop2/dialer.go +++ b/ziti-fabric-test/subcmd/loop2/dialer.go @@ -19,12 +19,13 @@ package loop2 import ( "fmt" "github.com/michaelquigley/pfxlog" - "github.com/openziti/ziti/ziti-fabric-test/subcmd/loop2/pb" "github.com/openziti/fabric/router/xgress_transport" "github.com/openziti/foundation/identity/dotziti" "github.com/openziti/foundation/identity/identity" "github.com/openziti/foundation/transport" "github.com/openziti/sdk-golang/ziti" + "github.com/openziti/sdk-golang/ziti/config" + "github.com/openziti/ziti/ziti-fabric-test/subcmd/loop2/pb" "github.com/spf13/cobra" "net" "strings" @@ -32,25 +33,41 @@ import ( ) func init() { - dialerCmd.Flags().StringVarP(&dialerCmdIdentity, "identity", "i", "default", ".ziti/identities.yml name") - dialerCmd.Flags().StringVarP(&dialerCmdEndpoint, "endpoint", "e", "tls:127.0.0.1:7001", "Endpoint address") - dialerCmd.Flags().BoolVarP(&dialerCmdDirect, "direct", "d", false, "Transmit direct (no ingress)") - dialerCmd.Flags().StringVarP(&dialerCmdService, "service", "s", "loop", "Service name for ingress") - loop2Cmd.AddCommand(dialerCmd) + dialerCmd := newDialerCmd() + loop2Cmd.AddCommand(dialerCmd.cmd) } -var dialerCmd = &cobra.Command{ - Use: "dialer ", - Short: "Start loop2 dialer", - Args: cobra.ExactArgs(1), - Run: dialer, +type dialerCmd struct { + cmd *cobra.Command + identity string + endpoint string + direct bool + service string + edgeConfigFile string } -var dialerCmdIdentity string -var dialerCmdEndpoint string -var dialerCmdDirect bool -var dialerCmdService string -func dialer(_ *cobra.Command, args []string) { +func newDialerCmd() *dialerCmd { + result := &dialerCmd{ + cmd: &cobra.Command{ + Use: "dialer ", + Short: "Start loop2 dialer", + Args: cobra.ExactArgs(1), + }, + } + + result.cmd.Run = result.run + + flags := result.cmd.Flags() + flags.StringVarP(&result.identity, "identity", "i", "default", ".ziti/identities.yml name") + flags.StringVarP(&result.endpoint, "endpoint", "e", "tls:127.0.0.1:7001", "Endpoint address") + flags.BoolVarP(&result.direct, "direct", "d", false, "Transmit direct (no ingress)") + flags.StringVarP(&result.service, "service", "s", "loop", "Service name for ingress") + flags.StringVarP(&result.edgeConfigFile, "config-file", "c", "", "Edge SDK config file") + + return result +} + +func (cmd *dialerCmd) run(_ *cobra.Command, args []string) { log := pfxlog.Logger() scenario, err := LoadScenario(args[0]) @@ -70,30 +87,41 @@ func dialer(_ *cobra.Command, args []string) { go func() { var conn net.Conn - if strings.HasPrefix(dialerCmdEndpoint, "edge:") { - context := ziti.NewContext() - service := strings.TrimPrefix(dialerCmdEndpoint, "edge:") + if strings.HasPrefix(cmd.endpoint, "edge:") { + + var context ziti.Context + if cmd.edgeConfigFile != "" { + zitiCfg, err := config.NewFromFile(cmd.edgeConfigFile) + if err != nil { + log.Fatalf("failed to load ziti configuration from %s: %v", cmd.edgeConfigFile, err) + } + context = ziti.NewContextWithConfig(zitiCfg) + } else { + context = ziti.NewContext() + } + + service := strings.TrimPrefix(cmd.endpoint, "edge:") conn, err = context.Dial(service) if err != nil { panic(err) } } else { - endpoint, err := transport.ParseAddress(dialerCmdEndpoint) + endpoint, err := transport.ParseAddress(cmd.endpoint) if err != nil { panic(err) } - _, id, err := dotziti.LoadIdentity(dialerCmdIdentity) + _, id, err := dotziti.LoadIdentity(cmd.identity) if err != nil { panic(err) } - if dialerCmdDirect { + if cmd.direct { if conn, err = dialDirect(endpoint, id); err != nil { panic(err) } } else { - serviceId := &identity.TokenId{Token: dialerCmdService} + serviceId := &identity.TokenId{Token: cmd.service} if conn, err = dialIngress(endpoint, id, serviceId); err != nil { panic(err) } diff --git a/ziti-fabric-test/subcmd/loop2/listener.go b/ziti-fabric-test/subcmd/loop2/listener.go index 5aa2f6e87..143b07d64 100644 --- a/ziti-fabric-test/subcmd/loop2/listener.go +++ b/ziti-fabric-test/subcmd/loop2/listener.go @@ -22,6 +22,7 @@ import ( "github.com/openziti/foundation/identity/identity" "github.com/openziti/foundation/transport" "github.com/openziti/sdk-golang/ziti" + "github.com/openziti/sdk-golang/ziti/config" "github.com/openziti/ziti/ziti-fabric-test/subcmd/loop2/pb" "github.com/spf13/cobra" "net" @@ -29,45 +30,71 @@ import ( ) func init() { - listenerCmd.Flags().StringVarP(&listenerCmdIdentity, "identity", "i", "default", ".ziti/identities.yml name") - listenerCmd.Flags().StringVarP(&listenerCmdBindAddress, "bind", "b", "tcp:127.0.0.1:8171", "Listener bind address") - loop2Cmd.AddCommand(listenerCmd) + listenerCmd := newListenerCmd() + loop2Cmd.AddCommand(listenerCmd.cmd) } -var listenerCmd = &cobra.Command{ - Use: "listener", - Short: "Start loop2 listener", - Args: cobra.ExactArgs(0), - Run: listener, +type listenerCmd struct { + cmd *cobra.Command + identity string + bindAddress string + edgeConfigFile string } -var listenerCmdIdentity string -var listenerCmdBindAddress string -func listener(_ *cobra.Command, _ []string) { - if strings.HasPrefix(listenerCmdBindAddress, "edge") { - listenEdge() +func newListenerCmd() *listenerCmd { + result := &listenerCmd{ + cmd: &cobra.Command{ + Use: "listener", + Short: "Start loop2 listener", + Args: cobra.ExactArgs(0), + }, + } + + result.cmd.Run = result.run + + flags := result.cmd.Flags() + flags.StringVarP(&result.identity, "identity", "i", "default", ".ziti/identities.yml name") + flags.StringVarP(&result.bindAddress, "bind", "b", "tcp:127.0.0.1:8171", "Listener bind address") + flags.StringVarP(&result.edgeConfigFile, "config-file", "c", "", "Edge SDK config file") + + return result +} + +func (cmd *listenerCmd) run(_ *cobra.Command, _ []string) { + if strings.HasPrefix(cmd.bindAddress, "edge") { + cmd.listenEdge() } else { - _, id, err := dotziti.LoadIdentity(listenerCmdIdentity) + _, id, err := dotziti.LoadIdentity(cmd.identity) if err != nil { panic(err) } - bindAddress, err := transport.ParseAddress(listenerCmdBindAddress) + bindAddress, err := transport.ParseAddress(cmd.bindAddress) if err != nil { panic(err) } - listen(bindAddress, id) + cmd.listen(bindAddress, id) } } -func listenEdge() { - log := pfxlog.ContextLogger(dialerCmdEndpoint) +func (cmd *listenerCmd) listenEdge() { + log := pfxlog.ContextLogger(cmd.bindAddress) defer log.Error("exited") log.Info("started") - context := ziti.NewContext() - service := strings.TrimPrefix(dialerCmdEndpoint, "edge:") + var context ziti.Context + if cmd.edgeConfigFile != "" { + zitiCfg, err := config.NewFromFile(cmd.edgeConfigFile) + if err != nil { + log.Fatalf("failed to load ziti configuration from %s: %v", cmd.edgeConfigFile, err) + } + context = ziti.NewContextWithConfig(zitiCfg) + } else { + context = ziti.NewContext() + } + + service := strings.TrimPrefix(cmd.bindAddress, "edge:") listener, err := context.Listen(service) if err != nil { panic(err) @@ -77,12 +104,12 @@ func listenEdge() { if conn, err := listener.Accept(); err != nil { panic(err) } else { - go handle(conn, dialerCmdEndpoint) + go cmd.handle(conn, cmd.bindAddress) } } } -func listen(bind transport.Address, i *identity.TokenId) { +func (cmd *listenerCmd) listen(bind transport.Address, i *identity.TokenId) { log := pfxlog.ContextLogger(bind.String()) defer log.Error("exited") log.Info("started") @@ -97,7 +124,7 @@ func listen(bind transport.Address, i *identity.TokenId) { select { case peer := <-incoming: if peer != nil { - go handle(peer.Conn(), peer.Detail().String()) + go cmd.handle(peer.Conn(), peer.Detail().String()) } else { return } @@ -105,7 +132,7 @@ func listen(bind transport.Address, i *identity.TokenId) { } } -func handle(conn net.Conn, context string) { +func (cmd *listenerCmd) handle(conn net.Conn, context string) { log := pfxlog.ContextLogger(context) if proto, err := newProtocol(conn); err == nil { if test, err := proto.rxTest(); err == nil {