Skip to content

Commit

Permalink
feat: add fallback dialing support (#739)
Browse files Browse the repository at this point in the history
* feat: add fallback dialing support

Signed-off-by: dovholuknf <46322585+dovholuknf@users.noreply.github.com>

* fix: remove unused import

Signed-off-by: dovholuknf <46322585+dovholuknf@users.noreply.github.com>

* fix: update mock with mockery

Signed-off-by: dovholuknf <46322585+dovholuknf@users.noreply.github.com>

* fix: fix tests

Signed-off-by: dovholuknf <46322585+dovholuknf@users.noreply.github.com>

* fix: fix tests again. remove unused field

Signed-off-by: dovholuknf <46322585+dovholuknf@users.noreply.github.com>

---------

Signed-off-by: dovholuknf <46322585+dovholuknf@users.noreply.github.com>
  • Loading branch information
dovholuknf authored Jul 24, 2024
1 parent 5dc0b86 commit bb94832
Show file tree
Hide file tree
Showing 8 changed files with 74 additions and 11 deletions.
2 changes: 2 additions & 0 deletions bootstrap/handlers/clients.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ package handlers
import (
"context"
"fmt"
"net"
"sync"
"time"

Expand Down Expand Up @@ -76,6 +77,7 @@ func (cb *ClientsBootstrap) BootstrapHandler(
return false
} else {
sp.SetHttpTransport(rt) //only need to set the transport when using SecretProviderExt
sp.SetFallbackDialer(&net.Dialer{})
}

if !serviceInfo.UseMessageBus {
Expand Down
2 changes: 2 additions & 0 deletions bootstrap/handlers/clients_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -211,6 +211,7 @@ func TestClientsBootstrapHandler(t *testing.T) {

secProviderExt := &mocks.SecretProviderExt{}
secProviderExt.On("SetHttpTransport", mock.Anything, mock.Anything).Return(nil)
secProviderExt.On("SetFallbackDialer", mock.Anything, mock.Anything).Return(nil)
secProviderExt.On("IsZeroTrustEnabled", mock.Anything, mock.Anything).Return(false)

dic := di.NewContainer(di.ServiceConstructorMap{
Expand Down Expand Up @@ -336,6 +337,7 @@ func TestCommandMessagingClientErrors(t *testing.T) {

secProviderExt := &mocks.SecretProviderExt{}
secProviderExt.On("SetHttpTransport", mock.Anything, mock.Anything).Return(nil)
secProviderExt.On("SetFallbackDialer", mock.Anything, mock.Anything).Return(nil)
secProviderExt.On("IsZeroTrustEnabled", mock.Anything, mock.Anything).Return(false)

dic := di.NewContainer(di.ServiceConstructorMap{
Expand Down
29 changes: 28 additions & 1 deletion bootstrap/interfaces/mocks/SecretProviderExt.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

7 changes: 7 additions & 0 deletions bootstrap/interfaces/secret.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
package interfaces

import (
"net"
"net/http"
"time"
)
Expand Down Expand Up @@ -78,6 +79,12 @@ type SecretProviderExt interface {
// SetHttpTransport sets the http.RoundTripper to be used by http-based clients
SetHttpTransport(rt http.RoundTripper)

// FallbackDialer returns the dialer to use to establish connections when there is no zero trust service found/authorized
FallbackDialer() *net.Dialer

// SetFallbackDialer sets the dialer to use to establish connections when there is no zero trust service found/authorized
SetFallbackDialer(dialer *net.Dialer)

// IsZeroTrustEnabled returns whether zero trust principles are enabled
IsZeroTrustEnabled() bool

Expand Down
9 changes: 9 additions & 0 deletions bootstrap/secret/insecure.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ import (
"github.com/edgexfoundry/go-mod-bootstrap/v3/bootstrap/container"
"github.com/edgexfoundry/go-mod-bootstrap/v3/di"
"github.com/edgexfoundry/go-mod-core-contracts/v3/errors"
"net"
"net/http"
"strings"
"time"
Expand Down Expand Up @@ -262,3 +263,11 @@ func (p *InsecureProvider) IsZeroTrustEnabled() bool {
func (p *InsecureProvider) EnableZeroTrust() {
//empty on purpose
}

func (p *InsecureProvider) FallbackDialer() *net.Dialer {
return &net.Dialer{}
}

func (p *InsecureProvider) SetFallbackDialer(_ *net.Dialer) {
//empty on purpose
}
9 changes: 0 additions & 9 deletions bootstrap/secret/jwtprovider.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,22 +15,13 @@ import (

type jwtSecretProvider struct {
secretProvider interfaces.SecretProviderExt
roundTripper_a http.RoundTripper
}

func NewJWTSecretProvider(secretProvider interfaces.SecretProviderExt) clientinterfaces.AuthenticationInjector {
return &jwtSecretProvider{
secretProvider: secretProvider,
}
}
func NewJWTSecretProviderWithRT(secretProvider interfaces.SecretProviderExt, roundTripper_b http.RoundTripper) clientinterfaces.AuthenticationInjector {
j := &jwtSecretProvider{
secretProvider: secretProvider,
roundTripper_a: roundTripper_b,
}
secretProvider.SetHttpTransport(roundTripper_b)
return j
}

func (self *jwtSecretProvider) AddAuthenticationData(req *http.Request) error {
if self.secretProvider == nil {
Expand Down
14 changes: 14 additions & 0 deletions bootstrap/secret/secure.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ import (
"context"
"errors"
"fmt"
"net"
"net/http"
"os"
"strings"
Expand Down Expand Up @@ -69,6 +70,7 @@ type SecureProvider struct {
securityRuntimeSecretTokenDuration gometrics.Timer
securityGetSecretDuration gometrics.Timer
httpRoundTripper http.RoundTripper
fallbackDialer *net.Dialer
zeroTrustEnabled bool
}

Expand Down Expand Up @@ -500,6 +502,18 @@ func (p *SecureProvider) SetHttpTransport(rt http.RoundTripper) {
}
}

func (p *SecureProvider) FallbackDialer() *net.Dialer {
return p.fallbackDialer
}

func (p *SecureProvider) SetFallbackDialer(dialer *net.Dialer) {
if p.fallbackDialer == nil {
p.fallbackDialer = dialer
} else {
p.lc.Warnf("refusing to override fallbackDialer, already set")
}
}

func (p *SecureProvider) IsZeroTrustEnabled() bool {
return p.zeroTrustEnabled
}
Expand Down
13 changes: 12 additions & 1 deletion bootstrap/zerotrust/zerotrust.go
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,14 @@ func HttpTransportFromClient(secretProvider interfaces.SecretProviderExt, client
return roundTripper, nil
}

type ZitiDialer struct {
underlayDialer *net.Dialer
}

func (z ZitiDialer) Dial(network, address string) (net.Conn, error) {
return z.underlayDialer.Dial(network, address)
}

func createZitifiedTransport(secretProvider interfaces.SecretProviderExt, ozController string) (http.RoundTripper, error) {
jwt, errJwt := secretProvider.GetSelfJWT()
if errJwt != nil {
Expand All @@ -87,9 +95,12 @@ func createZitifiedTransport(secretProvider interfaces.SecretProviderExt, ozCont
zitiContexts := ziti.NewSdkCollection()
zitiContexts.Add(ctx)

fallback := &ZitiDialer{
underlayDialer: secretProvider.FallbackDialer(),
}
zitiTransport := http.DefaultTransport.(*http.Transport).Clone() // copy default transport
zitiTransport.DialContext = func(ctx context.Context, network, addr string) (net.Conn, error) {
dialer := zitiContexts.NewDialerWithFallback(ctx /*&net.Dialer{}*/, nil)
dialer := zitiContexts.NewDialerWithFallback(ctx, fallback)
return dialer.Dial(network, addr)
}
return zitiTransport, nil
Expand Down

0 comments on commit bb94832

Please sign in to comment.