Repository: go-kratos/kratos
Pull request #2380 (2022-09-17 02:26:41)

cleanup: replace grpc resolver.Target deprecated field
<!--
🎉 Thanks for sending a pull request to Kratos! Here are some tips for you:

1. If this is your first time contributing to Kratos, please read our contribution guide: https://go-kratos.dev/en/docs/community/contribution/
2. Ensure you have added or ran the appropriate tests and lint for your PR, please use `make lint` and `make test` before filing your PR, use `make clean` to tidy your go mod.
3. If the PR is unfinished, you may need to mark it as a WIP(Work In Progress) PR or draft PR
4. Please use a semantic commits format title, such as `<type>[optional scope]: <description>`, see: https://go-kratos.dev/docs/community/contribution#type
5. at the same time, please note that similar work should be submitted in one PR as far as possible to reduce the workload of reviewers. Do not split a work into multiple PR unless it should.
-->

<!--
🎉 感谢您向 Kratos 发送 PR 请求！以下是一些提示：
如果这是你第一次为 Kratos 贡献，请阅读我们的贡献指南：https://go-kratos.dev/en/docs/community/contribution/
2、确保您已经为您的 PR 添加或运行了适当的测试和lint，请在提交PR之前使用“make lint”和“make test”，使用“make clean”整理您的 go.mod。
3、如果请购单未完成，您可能需要将其标记为 WIP（在制品）PR 或 draft PR
4、请使用语义提交格式标题，如“<类型>[可选范围]：<说明>`，请参阅：https://go-kratos.dev/docs/community/contribution#type
5. 同时请注意，同类的工作请尽量在一个PR中提交，以减轻 review 者的工作负担，不要把一项工作拆分成很多个PR，除非它应该这样做。
-->

<!--
-->

#### Description (what this PR does / why we need it):
<!--
* The description should include the motivation for this PR or contrast this with previous behavior
-->
replace grpc resolver.Target deprecated field

#### Which issue(s) this PR fixes (resolves / be part of):
<!--
* Automatically closes linked issue when PR is merged.
* If your PR is not fully resolved the issue, please use `part of #<issue number>` instead.

Usage: `fixes/resolves #<issue number>`, or `fixes/resolves (paste link of issue)`.
-->


#### Other special notes for the reviewers:
<!--
* Somethings that need extra attention for the reviewers
* Some additional notes, TODO list, etc.
-->
<img width="672" alt="image" src="https://user-images.githubusercontent.com/27986239/190836893-9f0949be-c535-4534-a182-986bc6e8e85a.png">


codecov-commenter: # [Codecov](https://codecov.io/gh/go-kratos/kratos/pull/2380?src=pr&el=h1&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-kratos) Report
> Merging [#2380](https://codecov.io/gh/go-kratos/kratos/pull/2380?src=pr&el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-kratos) (b968480) into [main](https://codecov.io/gh/go-kratos/kratos/commit/7f2666be9f86e1a37b1e16656e34c234b22deb30?el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-kratos) (7f2666b) will **not change** coverage.
> The diff coverage is `n/a`.

```diff
@@           Coverage Diff           @@
##             main    #2380   +/-   ##
=======================================
  Coverage   85.38%   85.38%           
=======================================
  Files          88       88           
  Lines        3778     3778           
=======================================
  Hits         3226     3226           
  Misses        385      385           
  Partials      167      167           
```



Help us with your feedback. Take ten seconds to tell us [how you rate us](https://about.codecov.io/nps?utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-kratos). Have a feature suggestion? [Share it here.](https://app.codecov.io/gh/feedback/?utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-kratos)


Patch:
diff --git a/.github/ISSUE_TEMPLATE/feature-request.md b/.github/ISSUE_TEMPLATE/feature-request.md
index c8cc2f81..eeaf2427 100644
--- a/.github/ISSUE_TEMPLATE/feature-request.md
+++ b/.github/ISSUE_TEMPLATE/feature-request.md
@@ -43,7 +43,7 @@ example:
 ### Requirements description of the feature
 <!--
 example:
-    The event interface should be added to Kratos. The interface should contain subscribers and publishers, and the message body should contain key value heade
+    The event interface should be added to Kratos. The interface should contain subscribers and publishers, and the message body should contain key value head
 -->
 ### References
 <!--
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 4048a5df..b0f9ceca 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -1,7 +1,7 @@
 The kratos community wants to be helped by a wide range of developers, so you'd like to take a few minutes to read this guide before you mention the problem or pull request.
 
-## Reportings Bug or Fixing Bugs
-We use github issues to manage issues. If you want to submit , first make sure you've searched for existing issues, pull requests and read our [FAQ](https://go-kratos.dev/docs/intro/faq).
+## Reporting Bug or Fixing Bugs
+We use GitHub issues to manage issues. If you want to submit , first make sure you've searched for existing issues, pull requests and read our [FAQ](https://go-kratos.dev/docs/intro/faq).
 
 When submitting a bug report, use the issue template we provide to clearly describe the problems encountered and how to reproduce, and if convenient it is best to provide a minimal reproduce repository.
 
@@ -16,9 +16,9 @@ After the function is implemented, a merge request will be initiated to associat
 After the merge is completed, Close all issues.
 
 ## How to submit code
-If you've never submitted code on github, follow these steps:
+If you've never submitted code on GitHub, follow these steps:
 
-- First, please fork items to your github account
+- First, please fork items to your GitHub account
 - Then create a new feature branch based on the main branch and name it features such as feature-log 
 - Write code
 - Submit code to the far end branch
diff --git a/cmd/protoc-gen-go-http/http.go b/cmd/protoc-gen-go-http/http.go
index cebbb6b1..d8827722 100644
--- a/cmd/protoc-gen-go-http/http.go
+++ b/cmd/protoc-gen-go-http/http.go
@@ -255,8 +255,8 @@ func camelCaseVars(s string) string {
 // drop the underscore and convert the letter to upper case.
 // There is a remote possibility of this rewrite causing a name collision,
 // but it's so remote we're prepared to pretend it's nonexistent - since the
-// C++ generator lowercases names, it's extremely unlikely to have two fields
-// with different capitalizations.
+// C++ generator lowercase names, it's extremely unlikely to have two fields
+// with different capitalization.
 // In short, _my_field_name_2 becomes XMyFieldName_2.
 func camelCase(s string) string {
 	if s == "" {
diff --git a/contrib/config/etcd/README.md b/contrib/config/etcd/README.md
index c6f3f1bd..d7668745 100644
--- a/contrib/config/etcd/README.md
+++ b/contrib/config/etcd/README.md
@@ -10,7 +10,7 @@ import (
 	"google.golang.org/grpc"
 )
 
-// create a etcd client
+// create an etcd client
 client, err := clientv3.New(clientv3.Config{
     Endpoints:   []string{"127.0.0.1:2379"},
     DialTimeout: time.Second,
diff --git a/contrib/log/aliyun/aliyun.go b/contrib/log/aliyun/aliyun.go
index 53fdefde..1be5f764 100644
--- a/contrib/log/aliyun/aliyun.go
+++ b/contrib/log/aliyun/aliyun.go
@@ -11,7 +11,7 @@ import (
 	"google.golang.org/protobuf/proto"
 )
 
-// Log see more detail https://github.com/aliyun/aliyun-log-go-sdk
+// Logger see more detail https://github.com/aliyun/aliyun-log-go-sdk
 type Logger interface {
 	log.Logger
 	GetProducer() *producer.Producer
diff --git a/contrib/metrics/datadog/options.go b/contrib/metrics/datadog/options.go
index d07d418f..ffb9bd80 100644
--- a/contrib/metrics/datadog/options.go
+++ b/contrib/metrics/datadog/options.go
@@ -2,7 +2,7 @@ package datadog
 
 import "github.com/DataDog/datadog-go/statsd"
 
-// Option is doatadog option.
+// Option is datadog option.
 type Option func(*options)
 
 type options struct {
diff --git a/contrib/registry/consul/client.go b/contrib/registry/consul/client.go
index 1b39975a..55425dff 100644
--- a/contrib/registry/consul/client.go
+++ b/contrib/registry/consul/client.go
@@ -173,7 +173,7 @@ func (c *Client) Register(_ context.Context, svc *registry.ServiceInstance, enab
 	return nil
 }
 
-// Deregister deregister service by service ID
+// Deregister service by service ID
 func (c *Client) Deregister(_ context.Context, serviceID string) error {
 	c.cancel()
 	return c.cli.Agent().ServiceDeregister(serviceID)
diff --git a/contrib/registry/discovery/discovery.go b/contrib/registry/discovery/discovery.go
index dfff0a97..32f3f67c 100644
--- a/contrib/registry/discovery/discovery.go
+++ b/contrib/registry/discovery/discovery.go
@@ -308,7 +308,7 @@ func (d *Discovery) cancel(ins *discoveryInstance) (err error) {
 func (d *Discovery) broadcast(apps map[string]*disInstancesInfo) {
 	for appID, v := range apps {
 		var count int
-		// v maybe nil in old version(less than v1.1) Discovery,check incase of panic
+		// v maybe nil in old version(less than v1.1) Discovery, check in case of panic
 		if v == nil {
 			continue
 		}
diff --git a/contrib/registry/etcd/registry.go b/contrib/registry/etcd/registry.go
index 945b76a0..76c114a0 100644
--- a/contrib/registry/etcd/registry.go
+++ b/contrib/registry/etcd/registry.go
@@ -153,7 +153,7 @@ func (r *Registry) heartBeat(ctx context.Context, leaseID clientv3.LeaseID, key
 	for {
 		if curLeaseID == 0 {
 			// try to registerWithKV
-			retreat := []int{}
+			var retreat []int
 			for retryCnt := 0; retryCnt < r.opts.maxRetry; retryCnt++ {
 				if ctx.Err() != nil {
 					return
diff --git a/contrib/registry/eureka/eureka.go b/contrib/registry/eureka/eureka.go
index ee82d850..a5c1201e 100644
--- a/contrib/registry/eureka/eureka.go
+++ b/contrib/registry/eureka/eureka.go
@@ -28,7 +28,7 @@ func NewAPI(ctx context.Context, client *Client, refreshInterval time.Duration)
 		refreshInterval: refreshInterval,
 	}
 
-	// 首次广播一次
+	// it is required to broadcast for the first time
 	e.broadcast()
 
 	go e.refresh(ctx)
@@ -93,7 +93,7 @@ func (e *API) Register(ctx context.Context, serviceName string, endpoints ...End
 	return nil
 }
 
-// Deregister 中的ctx 和 register ctx 是同一个
+// Deregister ctx is the same as register ctx
 func (e *API) Deregister(ctx context.Context, endpoints []Endpoint) error {
 	for _, ep := range endpoints {
 		if err := e.cli.Deregister(ctx, ep.AppID, ep.InstanceID); err != nil {
@@ -121,7 +121,7 @@ func (e *API) GetService(ctx context.Context, serverName string) []Instance {
 		return ins
 	}
 
-	// 如果不再allinstances 中可以尝试再单独获取一次
+	// if not in allInstances of API, you can try to obtain it separately again
 	return e.cli.FetchAppUpInstances(ctx, appID)
 }
 
diff --git a/contrib/registry/kubernetes/registry.go b/contrib/registry/kubernetes/registry.go
index 6f08157d..25390362 100644
--- a/contrib/registry/kubernetes/registry.go
+++ b/contrib/registry/kubernetes/registry.go
@@ -299,7 +299,7 @@ func (iter *Iterator) Next() ([]*registry.ServiceInstance, error) {
 	}
 }
 
-// Close is used to close the iterator
+// Stop is used to close the iterator
 func (iter *Iterator) Stop() error {
 	select {
 	case <-iter.stopCh:
diff --git a/encoding/form/proto_decode.go b/encoding/form/proto_decode.go
index 2856bef5..47affee1 100644
--- a/encoding/form/proto_decode.go
+++ b/encoding/form/proto_decode.go
@@ -52,7 +52,7 @@ func populateFieldValues(v protoreflect.Message, fieldPath []string, values []st
 
 		if fd.Message() == nil || fd.Cardinality() == protoreflect.Repeated {
 			if fd.IsMap() && len(fieldPath) > 1 {
-				// post sub field
+				// post subfield
 				return populateMapField(fd, v.Mutable(fd).Map(), []string{fieldPath[1]}, values)
 			}
 			return fmt.Errorf("invalid path: %q is not a message", fieldName)
diff --git a/errors/types.go b/errors/types.go
index e3d033b0..6a57f32a 100644
--- a/errors/types.go
+++ b/errors/types.go
@@ -17,7 +17,7 @@ func Unauthorized(reason, message string) *Error {
 	return New(401, reason, message)
 }
 
-// IsUnauthorized determines if err is an error which indicates a Unauthorized error.
+// IsUnauthorized determines if err is an error which indicates an Unauthorized error.
 // It supports wrapped errors.
 func IsUnauthorized(err error) bool {
 	return Code(err) == 401
@@ -67,18 +67,18 @@ func IsInternalServer(err error) bool {
 	return Code(err) == 500
 }
 
-// ServiceUnavailable new ServiceUnavailable error that is mapped to a HTTP 503 response.
+// ServiceUnavailable new ServiceUnavailable error that is mapped to an HTTP 503 response.
 func ServiceUnavailable(reason, message string) *Error {
 	return New(503, reason, message)
 }
 
-// IsServiceUnavailable determines if err is an error which indicates a Unavailable error.
+// IsServiceUnavailable determines if err is an error which indicates an Unavailable error.
 // It supports wrapped errors.
 func IsServiceUnavailable(err error) bool {
 	return Code(err) == 503
 }
 
-// GatewayTimeout new GatewayTimeout error that is mapped to a HTTP 504 response.
+// GatewayTimeout new GatewayTimeout error that is mapped to an HTTP 504 response.
 func GatewayTimeout(reason, message string) *Error {
 	return New(504, reason, message)
 }
@@ -89,7 +89,7 @@ func IsGatewayTimeout(err error) bool {
 	return Code(err) == 504
 }
 
-// ClientClosed new ClientClosed error that is mapped to a HTTP 499 response.
+// ClientClosed new ClientClosed error that is mapped to an HTTP 499 response.
 func ClientClosed(reason, message string) *Error {
 	return New(499, reason, message)
 }
diff --git a/internal/group/group.go b/internal/group/group.go
index bb9d0568..c97496d1 100644
--- a/internal/group/group.go
+++ b/internal/group/group.go
@@ -33,7 +33,7 @@ func (g *Group) Get(key string) interface{} {
 	}
 	g.RUnlock()
 
-	// slowpath for group don`t have specified key value
+	// slow path for group don`t have specified key value
 	g.Lock()
 	defer g.Unlock()
 	v, ok = g.vals[key]
diff --git a/log/helper_writer.go b/log/helper_writer.go
index 5ab45802..4d5e68b8 100644
--- a/log/helper_writer.go
+++ b/log/helper_writer.go
@@ -9,7 +9,7 @@ type writerWrapper struct {
 
 type WriterOptionFn func(w *writerWrapper)
 
-// WithWriteLevel set writerWrapper level.
+// WithWriterLevel set writerWrapper level.
 func WithWriterLevel(level Level) WriterOptionFn {
 	return func(w *writerWrapper) {
 		w.level = level
diff --git a/middleware/circuitbreaker/circuitbreaker.go b/middleware/circuitbreaker/circuitbreaker.go
index 1b4fa08f..c7ab178e 100644
--- a/middleware/circuitbreaker/circuitbreaker.go
+++ b/middleware/circuitbreaker/circuitbreaker.go
@@ -46,8 +46,8 @@ func Client(opts ...Option) middleware.Middleware {
 			breaker := opt.group.Get(info.Operation()).(circuitbreaker.CircuitBreaker)
 			if err := breaker.Allow(); err != nil {
 				// rejected
-				// NOTE: when client reject requets locally,
-				// continue add counter let the drop ratio higher.
+				// NOTE: when client reject requests locally,
+				// continue to add counter let the drop ratio higher.
 				breaker.MarkFailed()
 				return nil, ErrNotAllowed
 			}
diff --git a/middleware/logging/logging.go b/middleware/logging/logging.go
index d050da9a..6f292242 100644
--- a/middleware/logging/logging.go
+++ b/middleware/logging/logging.go
@@ -47,7 +47,7 @@ func Server(logger log.Logger) middleware.Middleware {
 	}
 }
 
-// Client is an client logging middleware.
+// Client is a client logging middleware.
 func Client(logger log.Logger) middleware.Middleware {
 	return func(handler middleware.Handler) middleware.Handler {
 		return func(ctx context.Context, req interface{}) (reply interface{}, err error) {
diff --git a/middleware/tracing/span.go b/middleware/tracing/span.go
index 38bb35f4..7edb914e 100644
--- a/middleware/tracing/span.go
+++ b/middleware/tracing/span.go
@@ -18,10 +18,12 @@ import (
 )
 
 func setClientSpan(ctx context.Context, span trace.Span, m interface{}) {
-	attrs := []attribute.KeyValue{}
-	var remote string
-	var operation string
-	var rpcKind string
+	var (
+		attrs     []attribute.KeyValue
+		remote    string
+		operation string
+		rpcKind   string
+	)
 	tr, ok := transport.FromClientContext(ctx)
 	if ok {
 		operation = tr.Operation()
diff --git a/registry/registry.go b/registry/registry.go
index 84df37b6..7046bafc 100644
--- a/registry/registry.go
+++ b/registry/registry.go
@@ -39,7 +39,7 @@ type ServiceInstance struct {
 	Version string `json:"version"`
 	// Metadata is the kv pair metadata associated with the service instance.
 	Metadata map[string]string `json:"metadata"`
-	// Endpoints is endpoint addresses of the service instance.
+	// Endpoints are endpoint addresses of the service instance.
 	// schema:
 	//   http://127.0.0.1:8000?isSecure=false
 	//   grpc://127.0.0.1:9000?isSecure=false
diff --git a/selector/random/random.go b/selector/random/random.go
index 3af52d41..1ab7c979 100644
--- a/selector/random/random.go
+++ b/selector/random/random.go
@@ -24,7 +24,7 @@ type options struct{}
 // Balancer is a random balancer.
 type Balancer struct{}
 
-// New an random selector.
+// New a random selector.
 func New(opts ...Option) selector.Selector {
 	return NewBuilder(opts...).Build()
 }
diff --git a/transport/grpc/balancer.go b/transport/grpc/balancer.go
index 2047eb0d..948b736b 100644
--- a/transport/grpc/balancer.go
+++ b/transport/grpc/balancer.go
@@ -87,7 +87,7 @@ func (p *balancerPicker) Pick(info balancer.PickInfo) (balancer.PickResult, erro
 	}, nil
 }
 
-// Trailer is a grpc trailder MD.
+// Trailer is a grpc trailer MD.
 type Trailer metadata.MD
 
 // Get get a grpc trailer value.
diff --git a/transport/http/client.go b/transport/http/client.go
index c0ad5ee3..de9a3138 100644
--- a/transport/http/client.go
+++ b/transport/http/client.go
@@ -196,7 +196,7 @@ func NewClient(ctx context.Context, opts ...ClientOption) (*Client, error) {
 	}, nil
 }
 
-// Invoke makes an rpc call procedure for remote service.
+// Invoke makes a rpc call procedure for remote service.
 func (client *Client) Invoke(ctx context.Context, method, path string, args interface{}, reply interface{}, opts ...CallOption) error {
 	var (
 		contentType string
diff --git a/transport/http/filter.go b/transport/http/filter.go
index ba7602f3..43bec807 100644
--- a/transport/http/filter.go
+++ b/transport/http/filter.go
@@ -2,7 +2,7 @@ package http
 
 import "net/http"
 
-// FilterFunc is a function which receives an http.Handler and returns another http.Handler.
+// FilterFunc is a function which receives a http.Handler and returns another http.Handler.
 type FilterFunc func(http.Handler) http.Handler
 
 // FilterChain returns a FilterFunc that specifies the chained handler for HTTP Router.
diff --git a/transport/http/status/status.go b/transport/http/status/status.go
index 2f6a717f..bab99304 100644
--- a/transport/http/status/status.go
+++ b/transport/http/status/status.go
@@ -27,7 +27,7 @@ type statusConverter struct{}
 // DefaultConverter default converter.
 var DefaultConverter Converter = statusConverter{}
 
-// ToGRPCCode converts a HTTP error code into the corresponding gRPC response status.
+// ToGRPCCode converts an HTTP error code into the corresponding gRPC response status.
 // See: https://github.com/googleapis/googleapis/blob/master/google/rpc/code.proto
 func (c statusConverter) ToGRPCCode(code int) codes.Code {
 	switch code {


Test patch:
diff --git a/encoding/encoding_test.go b/encoding/encoding_test.go
index d2886567..1d79ebbd 100644
--- a/encoding/encoding_test.go
+++ b/encoding/encoding_test.go
@@ -63,7 +63,7 @@ func TestRegisterCodec(t *testing.T) {
 	}
 }
 
-// PanicTestFunc defines a func that should be passed to the assert.Panics and assert.NotPanics
+// PanicTestFunc defines a func that should be passed to assert.Panics and assert.NotPanics
 // methods, and represents a simple func that takes no arguments, and returns nothing.
 type PanicTestFunc func()
 
diff --git a/log/global_test.go b/log/global_test.go
index 16aa6773..8ee15705 100644
--- a/log/global_test.go
+++ b/log/global_test.go
@@ -48,7 +48,7 @@ func TestGlobalLog(t *testing.T) {
 		},
 	}
 
-	expected := []string{}
+	var expected []string
 	for _, tc := range testCases {
 		msg := fmt.Sprintf(tc.content[0].(string), tc.content[1:]...)
 		switch tc.level {
diff --git a/middleware/metadata/metadata_test.go b/middleware/metadata/metadata_test.go
index d0190b67..e46a94f5 100644
--- a/middleware/metadata/metadata_test.go
+++ b/middleware/metadata/metadata_test.go
@@ -134,6 +134,6 @@ func Test_WithPropagatedPrefix(t *testing.T) {
 	WithPropagatedPrefix("something", "another")(o)
 
 	if len(o.prefix) != 2 {
-		t.Error("The prefix must be overrided.")
+		t.Error("The prefix must be overridden.")
 	}
 }
diff --git a/selector/selector_test.go b/selector/selector_test.go
index bcc08264..ca30fc0a 100644
--- a/selector/selector_test.go
+++ b/selector/selector_test.go
@@ -277,7 +277,7 @@ func TestNoPick(t *testing.T) {
 	}
 }
 
-func TestGolobal(t *testing.T) {
+func TestGlobalSelector(t *testing.T) {
 	builder := DefaultBuilder{
 		Node:     &mockWeightedNodeBuilder{},
 		Balancer: &mockBalancerBuilder{},
diff --git a/transport/grpc/resolver/discovery/builder_test.go b/transport/grpc/resolver/discovery/builder_test.go
index 11541cb7..770f12f1 100644
--- a/transport/grpc/resolver/discovery/builder_test.go
+++ b/transport/grpc/resolver/discovery/builder_test.go
@@ -2,6 +2,7 @@ package discovery
 
 import (
 	"context"
+	"net/url"
 	"reflect"
 	"testing"
 	"time"
@@ -74,8 +75,10 @@ func TestBuilder_Build(t *testing.T) {
 	b := NewBuilder(&mockDiscovery{}, DisableDebugLog())
 	_, err := b.Build(
 		resolver.Target{
-			Scheme:   resolver.GetDefaultScheme(),
-			Endpoint: "gprc://authority/endpoint",
+			URL: url.URL{
+				Scheme: resolver.GetDefaultScheme(),
+				Path:   "grpc://authority/endpoint",
+			},
 		},
 		&mockConn{},
 		resolver.BuildOptions{},
@@ -87,8 +90,10 @@ func TestBuilder_Build(t *testing.T) {
 	timeoutBuilder := NewBuilder(&mockDiscovery{}, WithTimeout(0))
 	_, err = timeoutBuilder.Build(
 		resolver.Target{
-			Scheme:   resolver.GetDefaultScheme(),
-			Endpoint: "gprc://authority/endpoint",
+			URL: url.URL{
+				Scheme: resolver.GetDefaultScheme(),
+				Path:   "grpc://authority/endpoint",
+			},
 		},
 		&mockConn{},
 		resolver.BuildOptions{},