diff --git a/pkg/tsdb/mssql/proxy.go b/pkg/tsdb/mssql/proxy.go index 03264dc9076..bf91b2f780d 100644 --- a/pkg/tsdb/mssql/proxy.go +++ b/pkg/tsdb/mssql/proxy.go @@ -14,6 +14,10 @@ type HostTransportDialer struct { Host string } +func (m HostTransportDialer) HostName() string { + return m.Host +} + func (m HostTransportDialer) DialContext(ctx context.Context, network string, addr string) (conn net.Conn, err error) { return m.Dialer.DialContext(ctx, network, addr) } diff --git a/pkg/tsdb/mssql/proxy_test.go b/pkg/tsdb/mssql/proxy_test.go index 53cd84a3eb3..9f7ee106747 100644 --- a/pkg/tsdb/mssql/proxy_test.go +++ b/pkg/tsdb/mssql/proxy_test.go @@ -13,6 +13,7 @@ import ( ) type testDialer struct { + Host string } func (d *testDialer) Dial(network, addr string) (c net.Conn, err error) { @@ -20,18 +21,50 @@ func (d *testDialer) Dial(network, addr string) (c net.Conn, err error) { } func (d *testDialer) DialContext(ctx context.Context, network, address string) (net.Conn, error) { + hostWithPort := d.HostName() + ":1433" + if address != hostWithPort { + return nil, fmt.Errorf("test-dialer: address does not match hostname") + } return nil, fmt.Errorf("test-dialer: DialContext is not functional") } +func (d *testDialer) HostName() string { + return d.Host +} + var _ proxy.Dialer = (&testDialer{}) func TestMSSQLProxyDriver(t *testing.T) { - cnnstr := "server=127.0.0.1;port=1433;user id=sa;password=yourStrong(!)Password;database=db" - t.Run("Connector should use dialer context that routes through the socks proxy to db", func(t *testing.T) { + host := "127.0.0.1" + cnnstr := fmt.Sprintf("server=%s;port=1433;user id=sa;password=yourStrong(!)Password;database=db", host) connector, err := mssql.NewConnector(cnnstr) require.NoError(t, err) - dialer, err := newMSSQLProxyDialer("127.0.0.1", &testDialer{}) + + td := testDialer{ + Host: host, + } + dialer, err := newMSSQLProxyDialer("%s", &td) + require.NoError(t, err) + + connector.Dialer = (dialer) + + db := sql.OpenDB(connector) + err = db.Ping() + + require.Contains(t, err.Error(), "test-dialer: DialContext is not functional") + }) + + t.Run("Connector should use hostname rather than attempting to resolve IP", func(t *testing.T) { + host := "www.grafana.com" + cnnstr := fmt.Sprintf("server=%s;port=1433;user id=sa;password=yourStrong(!)Password;database=db", host) + connector, err := mssql.NewConnector(cnnstr) + require.NoError(t, err) + + td := testDialer{ + Host: host, + } + dialer, err := newMSSQLProxyDialer(host, &td) require.NoError(t, err) connector.Dialer = (dialer)