diff --git a/canary/looper.go b/canary/looper.go index 81d9ad63..d382eb7b 100644 --- a/canary/looper.go +++ b/canary/looper.go @@ -16,6 +16,8 @@ type LooperOptions struct { MaxDwell time.Duration MinPacing time.Duration MaxPacing time.Duration + TargetName string + BindAddress string } type LooperResults struct { diff --git a/canary/privateHttpLooper.go b/canary/privateHttpLooper.go index b3f5d715..775eed53 100644 --- a/canary/privateHttpLooper.go +++ b/canary/privateHttpLooper.go @@ -19,15 +19,17 @@ import ( ) type PrivateHttpLooper struct { - id uint - acc *sdk.Access - opt *LooperOptions - root env_core.Root - shr *sdk.Share - listener edge.Listener - abort bool - done chan struct{} - results *LooperResults + id uint + target string + bindAddress string + acc *sdk.Access + opt *LooperOptions + root env_core.Root + shr *sdk.Share + listener edge.Listener + abort bool + done chan struct{} + results *LooperResults } func NewPrivateHttpLooper(id uint, opt *LooperOptions, root env_core.Root) *PrivateHttpLooper { @@ -74,10 +76,14 @@ func (l *PrivateHttpLooper) Results() *LooperResults { } func (l *PrivateHttpLooper) startup() error { + target := "canary.PrivateHttpLooper" + if l.opt.TargetName != "" { + target = l.opt.TargetName + } shr, err := sdk.CreateShare(l.root, &sdk.ShareRequest{ ShareMode: sdk.PrivateShareMode, BackendMode: sdk.ProxyBackendMode, - Target: "canary.PrivateHttpLooper", + Target: target, PermissionMode: sdk.ClosedPermissionMode, }) if err != nil { @@ -85,8 +91,13 @@ func (l *PrivateHttpLooper) startup() error { } l.shr = shr + bindAddress := "" + if l.opt.BindAddress != "" { + bindAddress = l.opt.BindAddress + } acc, err := sdk.CreateAccess(l.root, &sdk.AccessRequest{ - ShareToken: shr.Token, + ShareToken: shr.Token, + BindAddress: bindAddress, }) if err != nil { return err @@ -156,7 +167,7 @@ func (l *PrivateHttpLooper) iterate() { l.results.StartTime = time.Now() defer func() { l.results.StopTime = time.Now() }() - for i := uint(0); i < l.opt.Iterations; i++ { + for i := uint(0); i < l.opt.Iterations && !l.abort; i++ { if i > 0 && i%l.opt.StatusInterval == 0 { logrus.Infof("#%d: iteration %d", l.id, i) } diff --git a/cmd/zrok/testCanaryPrivateProxy.go b/cmd/zrok/testCanaryPrivateProxy.go index cb3db67d..6c3402a8 100644 --- a/cmd/zrok/testCanaryPrivateProxy.go +++ b/cmd/zrok/testCanaryPrivateProxy.go @@ -30,6 +30,8 @@ type testCanaryPrivateProxy struct { maxDwell time.Duration minPacing time.Duration maxPacing time.Duration + targetName string + bindAddress string } func newTestCanaryPrivateProxy() *testCanaryPrivateProxy { @@ -52,6 +54,8 @@ func newTestCanaryPrivateProxy() *testCanaryPrivateProxy { cmd.Flags().DurationVar(&command.maxDwell, "max-dwell", 1*time.Second, "Maximum dwell time") cmd.Flags().DurationVar(&command.minPacing, "min-pacing", 0, "Minimum pacing time") cmd.Flags().DurationVar(&command.maxPacing, "max-pacing", 0, "Maximum pacing time") + cmd.Flags().StringVar(&command.targetName, "target-name", "", "Metadata describing the virtual target") + cmd.Flags().StringVar(&command.bindAddress, "bind-address", "", "Metadata describing the virtual bind address") return command } @@ -84,6 +88,8 @@ func (cmd *testCanaryPrivateProxy) run(_ *cobra.Command, _ []string) { MaxDwell: cmd.maxDwell, MinPacing: cmd.minPacing, MaxPacing: cmd.maxPacing, + TargetName: cmd.targetName, + BindAddress: cmd.bindAddress, } looper := canary.NewPrivateHttpLooper(i, looperOpts, root) loopers = append(loopers, looper) diff --git a/controller/access.go b/controller/access.go index 15ad155c..3f7811d1 100644 --- a/controller/access.go +++ b/controller/access.go @@ -81,7 +81,11 @@ func (h *accessHandler) Handle(params share.AccessParams, principal *rest_model_ return share.NewAccessInternalServerError() } - if _, err := str.CreateFrontend(envId, &store.Frontend{PrivateShareId: &shr.Id, Token: feToken, ZId: envZId, PermissionMode: store.ClosedPermissionMode}, trx); err != nil { + fe := &store.Frontend{PrivateShareId: &shr.Id, Token: feToken, ZId: envZId, PermissionMode: store.ClosedPermissionMode} + if params.Body.BindAddress != "" { + fe.BindAddress = ¶ms.Body.BindAddress + } + if _, err := str.CreateFrontend(envId, fe, trx); err != nil { logrus.Errorf("error creating frontend record for user '%v': %v", principal.Email, err) return share.NewAccessInternalServerError() } diff --git a/sdk/golang/sdk/access.go b/sdk/golang/sdk/access.go index fd7068c9..3f8aeb5b 100644 --- a/sdk/golang/sdk/access.go +++ b/sdk/golang/sdk/access.go @@ -5,6 +5,7 @@ import ( "github.com/openziti/zrok/environment/env_core" "github.com/openziti/zrok/rest_client_zrok/share" "github.com/pkg/errors" + "github.com/sirupsen/logrus" ) func CreateAccess(root env_core.Root, request *AccessRequest) (*Access, error) { @@ -15,6 +16,10 @@ func CreateAccess(root env_core.Root, request *AccessRequest) (*Access, error) { out := share.NewAccessParams() out.Body.ShareToken = request.ShareToken out.Body.EnvZID = root.Environment().ZitiIdentity + if request.BindAddress != "" { + out.Body.BindAddress = request.BindAddress + logrus.Infof("requesting bind address '%v'", out.Body.BindAddress) + } zrok, err := root.Client() if err != nil { diff --git a/sdk/golang/sdk/model.go b/sdk/golang/sdk/model.go index ed10cc7f..195face5 100644 --- a/sdk/golang/sdk/model.go +++ b/sdk/golang/sdk/model.go @@ -50,7 +50,8 @@ type Share struct { } type AccessRequest struct { - ShareToken string + ShareToken string + BindAddress string } type Access struct {