mirror of https://github.com/dapr/go-sdk.git
ci: standard linter config (#199)
Signed-off-by: Long <long0dai@foxmail.com>
This commit is contained in:
parent
994f9b69f2
commit
de5cf935fb
|
|
@ -11,6 +11,10 @@ jobs:
|
||||||
build:
|
build:
|
||||||
name: Test and Lint on Push
|
name: Test and Lint on Push
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
env:
|
||||||
|
GOVER: 1.17
|
||||||
|
GOLANGCILINT_VER: v1.31
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
|
|
||||||
- name: Setup
|
- name: Setup
|
||||||
|
|
@ -41,8 +45,6 @@ jobs:
|
||||||
uses: codecov/codecov-action@v1
|
uses: codecov/codecov-action@v1
|
||||||
|
|
||||||
- name: Lint
|
- name: Lint
|
||||||
uses: golangci/golangci-lint-action@v2
|
uses: golangci/golangci-lint-action@v2.2.1
|
||||||
with:
|
with:
|
||||||
version: v1.33
|
version: ${{ env.GOLANGCILINT_VER }}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,255 @@
|
||||||
|
# options for analysis running
|
||||||
|
run:
|
||||||
|
# default concurrency is a available CPU number
|
||||||
|
concurrency: 4
|
||||||
|
|
||||||
|
# timeout for analysis, e.g. 30s, 5m, default is 1m
|
||||||
|
deadline: 10m
|
||||||
|
|
||||||
|
# exit code when at least one issue was found, default is 1
|
||||||
|
issues-exit-code: 1
|
||||||
|
|
||||||
|
# include test files or not, default is true
|
||||||
|
tests: true
|
||||||
|
|
||||||
|
# list of build tags, all linters use it. Default is empty list.
|
||||||
|
#build-tags:
|
||||||
|
# - mytag
|
||||||
|
|
||||||
|
# which dirs to skip: they won't be analyzed;
|
||||||
|
# can use regexp here: generated.*, regexp is applied on full path;
|
||||||
|
# default value is empty list, but next dirs are always skipped independently
|
||||||
|
# from this option's value:
|
||||||
|
# third_party$, testdata$, examples$, Godeps$, builtin$
|
||||||
|
skip-dirs:
|
||||||
|
- ^pkg.*client.*clientset.*versioned.*
|
||||||
|
- ^pkg.*client.*informers.*externalversions.*
|
||||||
|
- ^pkg.*proto.*
|
||||||
|
|
||||||
|
# which files to skip: they will be analyzed, but issues from them
|
||||||
|
# won't be reported. Default value is empty list, but there is
|
||||||
|
# no need to include all autogenerated files, we confidently recognize
|
||||||
|
# autogenerated files. If it's not please let us know.
|
||||||
|
skip-files:
|
||||||
|
# - ".*\\.my\\.go$"
|
||||||
|
# - lib/bad.go
|
||||||
|
|
||||||
|
# output configuration options
|
||||||
|
output:
|
||||||
|
# colored-line-number|line-number|json|tab|checkstyle, default is "colored-line-number"
|
||||||
|
format: tab
|
||||||
|
|
||||||
|
# print lines of code with issue, default is true
|
||||||
|
print-issued-lines: true
|
||||||
|
|
||||||
|
# print linter name in the end of issue text, default is true
|
||||||
|
print-linter-name: true
|
||||||
|
|
||||||
|
|
||||||
|
# all available settings of specific linters
|
||||||
|
linters-settings:
|
||||||
|
errcheck:
|
||||||
|
# report about not checking of errors in type assetions: `a := b.(MyStruct)`;
|
||||||
|
# default is false: such cases aren't reported by default.
|
||||||
|
check-type-assertions: false
|
||||||
|
|
||||||
|
# report about assignment of errors to blank identifier: `num, _ := strconv.Atoi(numStr)`;
|
||||||
|
# default is false: such cases aren't reported by default.
|
||||||
|
check-blank: false
|
||||||
|
|
||||||
|
# [deprecated] comma-separated list of pairs of the form pkg:regex
|
||||||
|
# the regex is used to ignore names within pkg. (default "fmt:.*").
|
||||||
|
# see https://github.com/kisielk/errcheck#the-deprecated-method for details
|
||||||
|
ignore: fmt:.*,io/ioutil:^Read.*
|
||||||
|
|
||||||
|
# path to a file containing a list of functions to exclude from checking
|
||||||
|
# see https://github.com/kisielk/errcheck#excluding-functions for details
|
||||||
|
exclude:
|
||||||
|
|
||||||
|
funlen:
|
||||||
|
lines: 60
|
||||||
|
statements: 40
|
||||||
|
|
||||||
|
govet:
|
||||||
|
# report about shadowed variables
|
||||||
|
check-shadowing: true
|
||||||
|
|
||||||
|
# settings per analyzer
|
||||||
|
settings:
|
||||||
|
printf: # analyzer name, run `go tool vet help` to see all analyzers
|
||||||
|
funcs: # run `go tool vet help printf` to see available settings for `printf` analyzer
|
||||||
|
- (github.com/golangci/golangci-lint/pkg/logutils.Log).Infof
|
||||||
|
- (github.com/golangci/golangci-lint/pkg/logutils.Log).Warnf
|
||||||
|
- (github.com/golangci/golangci-lint/pkg/logutils.Log).Errorf
|
||||||
|
- (github.com/golangci/golangci-lint/pkg/logutils.Log).Fatalf
|
||||||
|
|
||||||
|
# enable or disable analyzers by name
|
||||||
|
enable:
|
||||||
|
- atomicalign
|
||||||
|
enable-all: false
|
||||||
|
disable:
|
||||||
|
- shadow
|
||||||
|
disable-all: false
|
||||||
|
golint:
|
||||||
|
# minimal confidence for issues, default is 0.8
|
||||||
|
min-confidence: 0.8
|
||||||
|
gofmt:
|
||||||
|
# simplify code: gofmt with `-s` option, true by default
|
||||||
|
simplify: true
|
||||||
|
goimports:
|
||||||
|
# put imports beginning with prefix after 3rd-party packages;
|
||||||
|
# it's a comma-separated list of prefixes
|
||||||
|
local-prefixes: github.com/dapr/
|
||||||
|
gocyclo:
|
||||||
|
# minimal code complexity to report, 30 by default (but we recommend 10-20)
|
||||||
|
min-complexity: 10
|
||||||
|
gocognit:
|
||||||
|
# minimal code complexity to report, 30 by default (but we recommend 10-20)
|
||||||
|
min-complexity: 10
|
||||||
|
maligned:
|
||||||
|
# print struct with more effective memory layout or not, false by default
|
||||||
|
suggest-new: true
|
||||||
|
dupl:
|
||||||
|
# tokens count to trigger issue, 150 by default
|
||||||
|
threshold: 100
|
||||||
|
goconst:
|
||||||
|
# minimal length of string constant, 3 by default
|
||||||
|
min-len: 3
|
||||||
|
# minimal occurrences count to trigger, 3 by default
|
||||||
|
min-occurrences: 5
|
||||||
|
depguard:
|
||||||
|
list-type: blacklist
|
||||||
|
include-go-root: false
|
||||||
|
packages:
|
||||||
|
- github.com/Sirupsen/logrus
|
||||||
|
packages-with-error-messages:
|
||||||
|
# specify an error message to output when a blacklisted package is used
|
||||||
|
github.com/Sirupsen/logrus: "must use github.com/dapr/kit/logger"
|
||||||
|
misspell:
|
||||||
|
# Correct spellings using locale preferences for US or UK.
|
||||||
|
# Default is to use a neutral variety of English.
|
||||||
|
# Setting locale to US will correct the British spelling of 'colour' to 'color'.
|
||||||
|
locale: default
|
||||||
|
ignore-words:
|
||||||
|
- someword
|
||||||
|
lll:
|
||||||
|
# max line length, lines longer will be reported. Default is 120.
|
||||||
|
# '\t' is counted as 1 character by default, and can be changed with the tab-width option
|
||||||
|
line-length: 120
|
||||||
|
# tab width in spaces. Default to 1.
|
||||||
|
tab-width: 1
|
||||||
|
unused:
|
||||||
|
# treat code as a program (not a library) and report unused exported identifiers; default is false.
|
||||||
|
# XXX: if you enable this setting, unused will report a lot of false-positives in text editors:
|
||||||
|
# if it's called for subdir of a project it can't find funcs usages. All text editor integrations
|
||||||
|
# with golangci-lint call it on a directory with the changed file.
|
||||||
|
check-exported: false
|
||||||
|
unparam:
|
||||||
|
# Inspect exported functions, default is false. Set to true if no external program/library imports your code.
|
||||||
|
# XXX: if you enable this setting, unparam will report a lot of false-positives in text editors:
|
||||||
|
# if it's called for subdir of a project it can't find external interfaces. All text editor integrations
|
||||||
|
# with golangci-lint call it on a directory with the changed file.
|
||||||
|
check-exported: false
|
||||||
|
nakedret:
|
||||||
|
# make an issue if func has more lines of code than this setting and it has naked returns; default is 30
|
||||||
|
max-func-lines: 30
|
||||||
|
prealloc:
|
||||||
|
# XXX: we don't recommend using this linter before doing performance profiling.
|
||||||
|
# For most programs usage of prealloc will be a premature optimization.
|
||||||
|
|
||||||
|
# Report preallocation suggestions only on simple loops that have no returns/breaks/continues/gotos in them.
|
||||||
|
# True by default.
|
||||||
|
simple: true
|
||||||
|
range-loops: true # Report preallocation suggestions on range loops, true by default
|
||||||
|
for-loops: false # Report preallocation suggestions on for loops, false by default
|
||||||
|
gocritic:
|
||||||
|
# Which checks should be enabled; can't be combined with 'disabled-checks';
|
||||||
|
# See https://go-critic.github.io/overview#checks-overview
|
||||||
|
# To check which checks are enabled run `GL_DEBUG=gocritic golangci-lint run`
|
||||||
|
# By default list of stable checks is used.
|
||||||
|
enabled-checks:
|
||||||
|
|
||||||
|
# Which checks should be disabled; can't be combined with 'enabled-checks'; default is empty
|
||||||
|
disabled-checks:
|
||||||
|
- regexpMust
|
||||||
|
- rangeValCopy
|
||||||
|
- hugeParam
|
||||||
|
- ifElseChain
|
||||||
|
- singleCaseSwitch
|
||||||
|
- exitAfterDefer
|
||||||
|
|
||||||
|
# Enable multiple checks by tags, run `GL_DEBUG=gocritic golangci-lint run` to see all tags and checks.
|
||||||
|
# Empty list by default. See https://github.com/go-critic/go-critic#usage -> section "Tags".
|
||||||
|
enabled-tags:
|
||||||
|
- performance
|
||||||
|
|
||||||
|
settings: # settings passed to gocritic
|
||||||
|
captLocal: # must be valid enabled check name
|
||||||
|
paramsOnly: true
|
||||||
|
godox:
|
||||||
|
# report any comments starting with keywords, this is useful for TODO or FIXME comments that
|
||||||
|
# might be left in the code accidentally and should be resolved before merging
|
||||||
|
keywords: # default keywords are TODO, BUG, and FIXME, these can be overwritten by this setting
|
||||||
|
- NOTE
|
||||||
|
- OPTIMIZE # marks code that should be optimized before merging
|
||||||
|
- HACK # marks hack-arounds that should be removed before merging
|
||||||
|
godot:
|
||||||
|
exclude:
|
||||||
|
- 'nosec'
|
||||||
|
capital: false
|
||||||
|
scope: all
|
||||||
|
dogsled:
|
||||||
|
# checks assignments with too many blank identifiers; default is 2
|
||||||
|
max-blank-identifiers: 2
|
||||||
|
|
||||||
|
whitespace:
|
||||||
|
multi-if: false # Enforces newlines (or comments) after every multi-line if statement
|
||||||
|
multi-func: false # Enforces newlines (or comments) after every multi-line function signature
|
||||||
|
|
||||||
|
wsl:
|
||||||
|
# If true append is only allowed to be cuddled if appending value is
|
||||||
|
# matching variables, fields or types on line above. Default is true.
|
||||||
|
strict-append: true
|
||||||
|
# Allow calls and assignments to be cuddled as long as the lines have any
|
||||||
|
# matching variables, fields or types. Default is true.
|
||||||
|
allow-assign-and-call: true
|
||||||
|
# Allow multiline assignments to be cuddled. Default is true.
|
||||||
|
allow-multiline-assign: true
|
||||||
|
# Allow case blocks to end with a whitespace.
|
||||||
|
allow-case-traling-whitespace: true
|
||||||
|
# Allow declarations (var) to be cuddled.
|
||||||
|
allow-cuddle-declarations: false
|
||||||
|
|
||||||
|
linters:
|
||||||
|
fast: false
|
||||||
|
enable-all: true
|
||||||
|
disable:
|
||||||
|
# TODO Enforce the below linters later
|
||||||
|
- dupl
|
||||||
|
- errcheck
|
||||||
|
- funlen
|
||||||
|
- gochecknoglobals
|
||||||
|
- gochecknoinits
|
||||||
|
- gocyclo
|
||||||
|
- gocognit
|
||||||
|
- godox
|
||||||
|
- interfacer
|
||||||
|
- lll
|
||||||
|
- maligned
|
||||||
|
- scopelint
|
||||||
|
- unparam
|
||||||
|
- wsl
|
||||||
|
- gomnd
|
||||||
|
- testpackage
|
||||||
|
- goerr113
|
||||||
|
- nestif
|
||||||
|
- nlreturn
|
||||||
|
- exhaustive
|
||||||
|
- noctx
|
||||||
|
- gci
|
||||||
|
issues:
|
||||||
|
exclude-rules:
|
||||||
|
- path: .*_test.go
|
||||||
|
linters:
|
||||||
|
- godot
|
||||||
|
|
||||||
|
|
@ -3,11 +3,12 @@ package client
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
|
||||||
pb "github.com/dapr/go-sdk/dapr/proto/runtime/v1"
|
|
||||||
"github.com/pkg/errors"
|
"github.com/pkg/errors"
|
||||||
|
|
||||||
|
pb "github.com/dapr/go-sdk/dapr/proto/runtime/v1"
|
||||||
)
|
)
|
||||||
|
|
||||||
// InvokeBindingRequest represents binding invocation request
|
// InvokeBindingRequest represents binding invocation request.
|
||||||
type InvokeBindingRequest struct {
|
type InvokeBindingRequest struct {
|
||||||
// Name is name of binding to invoke.
|
// Name is name of binding to invoke.
|
||||||
Name string
|
Name string
|
||||||
|
|
@ -19,7 +20,7 @@ type InvokeBindingRequest struct {
|
||||||
Metadata map[string]string
|
Metadata map[string]string
|
||||||
}
|
}
|
||||||
|
|
||||||
// BindingEvent represents the binding event handler input
|
// BindingEvent represents the binding event handler input.
|
||||||
type BindingEvent struct {
|
type BindingEvent struct {
|
||||||
// Data is the input bindings sent
|
// Data is the input bindings sent
|
||||||
Data []byte
|
Data []byte
|
||||||
|
|
@ -29,7 +30,7 @@ type BindingEvent struct {
|
||||||
|
|
||||||
// InvokeBinding invokes specific operation on the configured Dapr binding.
|
// InvokeBinding invokes specific operation on the configured Dapr binding.
|
||||||
// This method covers input, output, and bi-directional bindings.
|
// This method covers input, output, and bi-directional bindings.
|
||||||
func (c *GRPCClient) InvokeBinding(ctx context.Context, in *InvokeBindingRequest) (out *BindingEvent, err error) {
|
func (c *GRPCClient) InvokeBinding(ctx context.Context, in *InvokeBindingRequest) (*BindingEvent, error) {
|
||||||
if in == nil {
|
if in == nil {
|
||||||
return nil, errors.New("binding invocation required")
|
return nil, errors.New("binding invocation required")
|
||||||
}
|
}
|
||||||
|
|
@ -52,14 +53,14 @@ func (c *GRPCClient) InvokeBinding(ctx context.Context, in *InvokeBindingRequest
|
||||||
return nil, errors.Wrapf(err, "error invoking binding %s/%s", in.Name, in.Operation)
|
return nil, errors.Wrapf(err, "error invoking binding %s/%s", in.Name, in.Operation)
|
||||||
}
|
}
|
||||||
|
|
||||||
out = &BindingEvent{}
|
|
||||||
|
|
||||||
if resp != nil {
|
if resp != nil {
|
||||||
out.Data = resp.Data
|
return &BindingEvent{
|
||||||
out.Metadata = resp.Metadata
|
Data: resp.Data,
|
||||||
|
Metadata: resp.Metadata,
|
||||||
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
return
|
return nil, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// InvokeOutputBinding invokes configured Dapr binding with data (allows nil).InvokeOutputBinding
|
// InvokeOutputBinding invokes configured Dapr binding with data (allows nil).InvokeOutputBinding
|
||||||
|
|
|
||||||
|
|
@ -42,5 +42,4 @@ func TestInvokeBinding(t *testing.T) {
|
||||||
assert.NotNil(t, out)
|
assert.NotNil(t, out)
|
||||||
assert.Equal(t, "test", string(out.Data))
|
assert.Equal(t, "test", string(out.Data))
|
||||||
})
|
})
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -19,8 +19,8 @@ const (
|
||||||
daprPortDefault = "50001"
|
daprPortDefault = "50001"
|
||||||
daprPortEnvVarName = "DAPR_GRPC_PORT"
|
daprPortEnvVarName = "DAPR_GRPC_PORT"
|
||||||
traceparentKey = "traceparent"
|
traceparentKey = "traceparent"
|
||||||
apiTokenKey = "dapr-api-token"
|
apiTokenKey = "dapr-api-token" /* #nosec */
|
||||||
apiTokenEnvVarName = "DAPR_API_TOKEN"
|
apiTokenEnvVarName = "DAPR_API_TOKEN" /* #nosec */
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
|
|
@ -175,14 +175,14 @@ func (c *GRPCClient) Close() {
|
||||||
}
|
}
|
||||||
|
|
||||||
// WithAuthToken sets Dapr API token on the instantiated client.
|
// WithAuthToken sets Dapr API token on the instantiated client.
|
||||||
// Allows empty string to reset token on existing client
|
// Allows empty string to reset token on existing client.
|
||||||
func (c *GRPCClient) WithAuthToken(token string) {
|
func (c *GRPCClient) WithAuthToken(token string) {
|
||||||
c.mux.Lock()
|
c.mux.Lock()
|
||||||
c.authToken = token
|
c.authToken = token
|
||||||
c.mux.Unlock()
|
c.mux.Unlock()
|
||||||
}
|
}
|
||||||
|
|
||||||
// WithTraceID adds existing trace ID to the outgoing context
|
// WithTraceID adds existing trace ID to the outgoing context.
|
||||||
func (c *GRPCClient) WithTraceID(ctx context.Context, id string) context.Context {
|
func (c *GRPCClient) WithTraceID(ctx context.Context, id string) context.Context {
|
||||||
if id == "" {
|
if id == "" {
|
||||||
return ctx
|
return ctx
|
||||||
|
|
@ -196,7 +196,7 @@ func (c *GRPCClient) withAuthToken(ctx context.Context) context.Context {
|
||||||
if c.authToken == "" {
|
if c.authToken == "" {
|
||||||
return ctx
|
return ctx
|
||||||
}
|
}
|
||||||
return metadata.NewOutgoingContext(ctx, metadata.Pairs(apiTokenKey, string(c.authToken)))
|
return metadata.NewOutgoingContext(ctx, metadata.Pairs(apiTokenKey, c.authToken))
|
||||||
}
|
}
|
||||||
|
|
||||||
// Shutdown the sidecar.
|
// Shutdown the sidecar.
|
||||||
|
|
|
||||||
|
|
@ -23,9 +23,7 @@ const (
|
||||||
testBufSize = 1024 * 1024
|
testBufSize = 1024 * 1024
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var testClient Client
|
||||||
testClient Client
|
|
||||||
)
|
|
||||||
|
|
||||||
func TestMain(m *testing.M) {
|
func TestMain(m *testing.M) {
|
||||||
ctx := context.Background()
|
ctx := context.Background()
|
||||||
|
|
@ -72,7 +70,6 @@ func TestShutdown(t *testing.T) {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
func getTestClient(ctx context.Context) (client Client, closer func()) {
|
func getTestClient(ctx context.Context) (client Client, closer func()) {
|
||||||
s := grpc.NewServer()
|
s := grpc.NewServer()
|
||||||
pb.RegisterDaprServer(s, &testDaprServer{
|
pb.RegisterDaprServer(s, &testDaprServer{
|
||||||
|
|
|
||||||
|
|
@ -5,13 +5,14 @@ import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
v1 "github.com/dapr/go-sdk/dapr/proto/common/v1"
|
|
||||||
pb "github.com/dapr/go-sdk/dapr/proto/runtime/v1"
|
|
||||||
anypb "github.com/golang/protobuf/ptypes/any"
|
anypb "github.com/golang/protobuf/ptypes/any"
|
||||||
"github.com/pkg/errors"
|
"github.com/pkg/errors"
|
||||||
|
|
||||||
|
v1 "github.com/dapr/go-sdk/dapr/proto/common/v1"
|
||||||
|
pb "github.com/dapr/go-sdk/dapr/proto/runtime/v1"
|
||||||
)
|
)
|
||||||
|
|
||||||
// DataContent the service invocation content
|
// DataContent the service invocation content.
|
||||||
type DataContent struct {
|
type DataContent struct {
|
||||||
// Data is the input data
|
// Data is the input data
|
||||||
Data []byte
|
Data []byte
|
||||||
|
|
@ -97,7 +98,7 @@ func (c *GRPCClient) InvokeMethodWithContent(ctx context.Context, appID, methodN
|
||||||
}
|
}
|
||||||
|
|
||||||
// InvokeMethodWithCustomContent invokes service with custom content (struct + content type).
|
// InvokeMethodWithCustomContent invokes service with custom content (struct + content type).
|
||||||
func (c *GRPCClient) InvokeMethodWithCustomContent(ctx context.Context, appID, methodName, verb string, contentType string, content interface{}) (out []byte, err error) {
|
func (c *GRPCClient) InvokeMethodWithCustomContent(ctx context.Context, appID, methodName, verb string, contentType string, content interface{}) ([]byte, error) {
|
||||||
if err := hasRequiredInvokeArgs(appID, methodName, verb); err != nil {
|
if err := hasRequiredInvokeArgs(appID, methodName, verb); err != nil {
|
||||||
return nil, errors.Wrap(err, "missing required parameter")
|
return nil, errors.Wrap(err, "missing required parameter")
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -4,8 +4,9 @@ import (
|
||||||
"context"
|
"context"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
v1 "github.com/dapr/go-sdk/dapr/proto/common/v1"
|
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
|
|
||||||
|
v1 "github.com/dapr/go-sdk/dapr/proto/common/v1"
|
||||||
)
|
)
|
||||||
|
|
||||||
type _testStructwithText struct {
|
type _testStructwithText struct {
|
||||||
|
|
|
||||||
|
|
@ -4,8 +4,9 @@ import (
|
||||||
"context"
|
"context"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
|
|
||||||
pb "github.com/dapr/go-sdk/dapr/proto/runtime/v1"
|
|
||||||
"github.com/pkg/errors"
|
"github.com/pkg/errors"
|
||||||
|
|
||||||
|
pb "github.com/dapr/go-sdk/dapr/proto/runtime/v1"
|
||||||
)
|
)
|
||||||
|
|
||||||
// PublishEvent publishes data onto specific pubsub topic.
|
// PublishEvent publishes data onto specific pubsub topic.
|
||||||
|
|
@ -41,7 +42,6 @@ func (c *GRPCClient) PublishEventfromCustomContent(ctx context.Context, pubsubNa
|
||||||
}
|
}
|
||||||
|
|
||||||
bytes, err := json.Marshal(data)
|
bytes, err := json.Marshal(data)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return errors.WithMessage(err, "error serializing input struct")
|
return errors.WithMessage(err, "error serializing input struct")
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -3,8 +3,9 @@ package client
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
|
||||||
pb "github.com/dapr/go-sdk/dapr/proto/runtime/v1"
|
|
||||||
"github.com/pkg/errors"
|
"github.com/pkg/errors"
|
||||||
|
|
||||||
|
pb "github.com/dapr/go-sdk/dapr/proto/runtime/v1"
|
||||||
)
|
)
|
||||||
|
|
||||||
// GetSecret retrieves preconfigured secret from specified store using key.
|
// GetSecret retrieves preconfigured secret from specified store using key.
|
||||||
|
|
|
||||||
|
|
@ -4,10 +4,11 @@ import (
|
||||||
"context"
|
"context"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
v1 "github.com/dapr/go-sdk/dapr/proto/common/v1"
|
|
||||||
pb "github.com/dapr/go-sdk/dapr/proto/runtime/v1"
|
|
||||||
"github.com/golang/protobuf/ptypes/duration"
|
"github.com/golang/protobuf/ptypes/duration"
|
||||||
"github.com/pkg/errors"
|
"github.com/pkg/errors"
|
||||||
|
|
||||||
|
v1 "github.com/dapr/go-sdk/dapr/proto/common/v1"
|
||||||
|
pb "github.com/dapr/go-sdk/dapr/proto/runtime/v1"
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
|
|
@ -31,7 +32,7 @@ const (
|
||||||
StateOperationTypeUpsert OperationType = 1
|
StateOperationTypeUpsert OperationType = 1
|
||||||
// StateOperationTypeDelete represents delete operation type value.
|
// StateOperationTypeDelete represents delete operation type value.
|
||||||
StateOperationTypeDelete OperationType = 2
|
StateOperationTypeDelete OperationType = 2
|
||||||
// UndefinedType represents undefined type value
|
// UndefinedType represents undefined type value.
|
||||||
UndefinedType = "undefined"
|
UndefinedType = "undefined"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
@ -44,12 +45,12 @@ type (
|
||||||
OperationType int
|
OperationType int
|
||||||
)
|
)
|
||||||
|
|
||||||
// GetPBConsistency get consistency pb value
|
// GetPBConsistency get consistency pb value.
|
||||||
func (s StateConsistency) GetPBConsistency() v1.StateOptions_StateConsistency {
|
func (s StateConsistency) GetPBConsistency() v1.StateOptions_StateConsistency {
|
||||||
return v1.StateOptions_StateConsistency(s)
|
return v1.StateOptions_StateConsistency(s)
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetPBConcurrency get concurrency pb value
|
// GetPBConcurrency get concurrency pb value.
|
||||||
func (s StateConcurrency) GetPBConcurrency() v1.StateOptions_StateConcurrency {
|
func (s StateConcurrency) GetPBConcurrency() v1.StateOptions_StateConcurrency {
|
||||||
return v1.StateOptions_StateConcurrency(s)
|
return v1.StateOptions_StateConcurrency(s)
|
||||||
}
|
}
|
||||||
|
|
@ -69,39 +70,37 @@ func (o OperationType) String() string {
|
||||||
}
|
}
|
||||||
|
|
||||||
// String returns the string value of the StateConsistency.
|
// String returns the string value of the StateConsistency.
|
||||||
func (c StateConsistency) String() string {
|
func (s StateConsistency) String() string {
|
||||||
names := [...]string{
|
names := [...]string{
|
||||||
UndefinedType,
|
UndefinedType,
|
||||||
"strong",
|
"strong",
|
||||||
"eventual",
|
"eventual",
|
||||||
}
|
}
|
||||||
if c < StateConsistencyStrong || c > StateConsistencyEventual {
|
if s < StateConsistencyStrong || s > StateConsistencyEventual {
|
||||||
return UndefinedType
|
return UndefinedType
|
||||||
}
|
}
|
||||||
|
|
||||||
return names[c]
|
return names[s]
|
||||||
}
|
}
|
||||||
|
|
||||||
// String returns the string value of the StateConcurrency.
|
// String returns the string value of the StateConcurrency.
|
||||||
func (c StateConcurrency) String() string {
|
func (s StateConcurrency) String() string {
|
||||||
names := [...]string{
|
names := [...]string{
|
||||||
UndefinedType,
|
UndefinedType,
|
||||||
"first-write",
|
"first-write",
|
||||||
"last-write",
|
"last-write",
|
||||||
}
|
}
|
||||||
if c < StateConcurrencyFirstWrite || c > StateConcurrencyLastWrite {
|
if s < StateConcurrencyFirstWrite || s > StateConcurrencyLastWrite {
|
||||||
return UndefinedType
|
return UndefinedType
|
||||||
}
|
}
|
||||||
|
|
||||||
return names[c]
|
return names[s]
|
||||||
}
|
}
|
||||||
|
|
||||||
var (
|
var stateOptionDefault = &v1.StateOptions{
|
||||||
stateOptionDefault = &v1.StateOptions{
|
|
||||||
Concurrency: v1.StateOptions_CONCURRENCY_LAST_WRITE,
|
Concurrency: v1.StateOptions_CONCURRENCY_LAST_WRITE,
|
||||||
Consistency: v1.StateOptions_CONSISTENCY_STRONG,
|
Consistency: v1.StateOptions_CONSISTENCY_STRONG,
|
||||||
}
|
}
|
||||||
)
|
|
||||||
|
|
||||||
// StateOperation is a collection of StateItems with a store name.
|
// StateOperation is a collection of StateItems with a store name.
|
||||||
type StateOperation struct {
|
type StateOperation struct {
|
||||||
|
|
@ -138,7 +137,7 @@ type SetStateItem struct {
|
||||||
// DeleteStateItem represents a single state to be deleted.
|
// DeleteStateItem represents a single state to be deleted.
|
||||||
type DeleteStateItem SetStateItem
|
type DeleteStateItem SetStateItem
|
||||||
|
|
||||||
// ETag represents an versioned record information
|
// ETag represents an versioned record information.
|
||||||
type ETag struct {
|
type ETag struct {
|
||||||
Value string
|
Value string
|
||||||
}
|
}
|
||||||
|
|
@ -149,17 +148,17 @@ type StateOptions struct {
|
||||||
Consistency StateConsistency
|
Consistency StateConsistency
|
||||||
}
|
}
|
||||||
|
|
||||||
// StateOption StateOptions's function type
|
// StateOption StateOptions's function type.
|
||||||
type StateOption func(*StateOptions)
|
type StateOption func(*StateOptions)
|
||||||
|
|
||||||
// WithConcurrency set StateOptions's Concurrency
|
// WithConcurrency set StateOptions's Concurrency.
|
||||||
func WithConcurrency(concurrency StateConcurrency) StateOption {
|
func WithConcurrency(concurrency StateConcurrency) StateOption {
|
||||||
return func(so *StateOptions) {
|
return func(so *StateOptions) {
|
||||||
so.Concurrency = concurrency
|
so.Concurrency = concurrency
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// WithConsistency set StateOptions's consistency
|
// WithConsistency set StateOptions's consistency.
|
||||||
func WithConsistency(consistency StateConsistency) StateOption {
|
func WithConsistency(consistency StateConsistency) StateOption {
|
||||||
return func(so *StateOptions) {
|
return func(so *StateOptions) {
|
||||||
so.Consistency = consistency
|
so.Consistency = consistency
|
||||||
|
|
@ -212,7 +211,7 @@ func toProtoDuration(d time.Duration) *duration.Duration {
|
||||||
secs := nanos / 1e9
|
secs := nanos / 1e9
|
||||||
nanos -= secs * 1e9
|
nanos -= secs * 1e9
|
||||||
return &duration.Duration{
|
return &duration.Duration{
|
||||||
Seconds: int64(secs),
|
Seconds: secs,
|
||||||
Nanos: int32(nanos),
|
Nanos: int32(nanos),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -247,9 +246,9 @@ func (c *GRPCClient) ExecuteStateTransaction(ctx context.Context, storeName stri
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// SaveState saves the raw data into store, default options: strong, last-write
|
// SaveState saves the raw data into store, default options: strong, last-write.
|
||||||
func (c *GRPCClient) SaveState(ctx context.Context, storeName, key string, data []byte, so ...StateOption) error {
|
func (c *GRPCClient) SaveState(ctx context.Context, storeName, key string, data []byte, so ...StateOption) error {
|
||||||
var stateOptions = new(StateOptions)
|
stateOptions := new(StateOptions)
|
||||||
for _, o := range so {
|
for _, o := range so {
|
||||||
o(stateOptions)
|
o(stateOptions)
|
||||||
}
|
}
|
||||||
|
|
@ -332,7 +331,7 @@ func (c *GRPCClient) GetState(ctx context.Context, storeName, key string) (item
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetStateWithConsistency retrieves state from specific store using provided state consistency.
|
// GetStateWithConsistency retrieves state from specific store using provided state consistency.
|
||||||
func (c *GRPCClient) GetStateWithConsistency(ctx context.Context, storeName, key string, meta map[string]string, sc StateConsistency) (item *StateItem, err error) {
|
func (c *GRPCClient) GetStateWithConsistency(ctx context.Context, storeName, key string, meta map[string]string, sc StateConsistency) (*StateItem, error) {
|
||||||
if err := hasRequiredStateArgs(storeName, key); err != nil {
|
if err := hasRequiredStateArgs(storeName, key); err != nil {
|
||||||
return nil, errors.Wrap(err, "missing required arguments")
|
return nil, errors.Wrap(err, "missing required arguments")
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -5,8 +5,14 @@ import (
|
||||||
"testing"
|
"testing"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
v1 "github.com/dapr/go-sdk/dapr/proto/common/v1"
|
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
|
|
||||||
|
v1 "github.com/dapr/go-sdk/dapr/proto/common/v1"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
testData = "test"
|
||||||
|
testStore = "store"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestTypes(t *testing.T) {
|
func TestTypes(t *testing.T) {
|
||||||
|
|
@ -19,7 +25,7 @@ func TestTypes(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestDurationConverter(t *testing.T) {
|
func TestDurationConverter(t *testing.T) {
|
||||||
d := time.Duration(10 * time.Second)
|
d := 10 * time.Second
|
||||||
pd := toProtoDuration(d)
|
pd := toProtoDuration(d)
|
||||||
assert.NotNil(t, pd)
|
assert.NotNil(t, pd)
|
||||||
assert.Equal(t, pd.Seconds, int64(10))
|
assert.Equal(t, pd.Seconds, int64(10))
|
||||||
|
|
@ -39,8 +45,8 @@ func TestStateOptionsConverter(t *testing.T) {
|
||||||
// go test -timeout 30s ./client -count 1 -run ^TestSaveState$
|
// go test -timeout 30s ./client -count 1 -run ^TestSaveState$
|
||||||
func TestSaveState(t *testing.T) {
|
func TestSaveState(t *testing.T) {
|
||||||
ctx := context.Background()
|
ctx := context.Background()
|
||||||
data := "test"
|
data := testData
|
||||||
store := "test"
|
store := testStore
|
||||||
key := "key1"
|
key := "key1"
|
||||||
|
|
||||||
t.Run("save data", func(t *testing.T) {
|
t.Run("save data", func(t *testing.T) {
|
||||||
|
|
@ -87,8 +93,8 @@ func TestSaveState(t *testing.T) {
|
||||||
// go test -timeout 30s ./client -count 1 -run ^TestDeleteState$
|
// go test -timeout 30s ./client -count 1 -run ^TestDeleteState$
|
||||||
func TestDeleteState(t *testing.T) {
|
func TestDeleteState(t *testing.T) {
|
||||||
ctx := context.Background()
|
ctx := context.Background()
|
||||||
data := "test"
|
data := testData
|
||||||
store := "test"
|
store := testStore
|
||||||
key := "key1"
|
key := "key1"
|
||||||
|
|
||||||
t.Run("delete not exist data", func(t *testing.T) {
|
t.Run("delete not exist data", func(t *testing.T) {
|
||||||
|
|
@ -165,8 +171,8 @@ func TestDeleteState(t *testing.T) {
|
||||||
|
|
||||||
func TestDeleteBulkState(t *testing.T) {
|
func TestDeleteBulkState(t *testing.T) {
|
||||||
ctx := context.Background()
|
ctx := context.Background()
|
||||||
data := "test"
|
data := testData
|
||||||
store := "test"
|
store := testStore
|
||||||
keys := []string{"key1", "key2", "key3"}
|
keys := []string{"key1", "key2", "key3"}
|
||||||
|
|
||||||
t.Run("delete not exist data", func(t *testing.T) {
|
t.Run("delete not exist data", func(t *testing.T) {
|
||||||
|
|
@ -273,7 +279,7 @@ func TestDeleteBulkState(t *testing.T) {
|
||||||
func TestStateTransactions(t *testing.T) {
|
func TestStateTransactions(t *testing.T) {
|
||||||
ctx := context.Background()
|
ctx := context.Background()
|
||||||
data := `{ "message": "test" }`
|
data := `{ "message": "test" }`
|
||||||
store := "test"
|
store := testStore
|
||||||
meta := map[string]string{}
|
meta := map[string]string{}
|
||||||
keys := []string{"k1", "k2", "k3"}
|
keys := []string{"k1", "k2", "k3"}
|
||||||
adds := make([]*StateOperation, 0)
|
adds := make([]*StateOperation, 0)
|
||||||
|
|
@ -341,5 +347,4 @@ func TestStateTransactions(t *testing.T) {
|
||||||
assert.NotNil(t, items)
|
assert.NotNil(t, items)
|
||||||
assert.Len(t, items, 0)
|
assert.Len(t, items, 0)
|
||||||
})
|
})
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@ package common
|
||||||
|
|
||||||
import "context"
|
import "context"
|
||||||
|
|
||||||
// Service represents Dapr callback service
|
// Service represents Dapr callback service.
|
||||||
type Service interface {
|
type Service interface {
|
||||||
// AddServiceInvocationHandler appends provided service invocation handler with its name to the service.
|
// AddServiceInvocationHandler appends provided service invocation handler with its name to the service.
|
||||||
AddServiceInvocationHandler(name string, fn func(ctx context.Context, in *InvocationEvent) (out *Content, err error)) error
|
AddServiceInvocationHandler(name string, fn func(ctx context.Context, in *InvocationEvent) (out *Content, err error)) error
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
package common
|
package common
|
||||||
|
|
||||||
// TopicEvent is the content of the inbound topic message
|
// TopicEvent is the content of the inbound topic message.
|
||||||
type TopicEvent struct {
|
type TopicEvent struct {
|
||||||
// ID identifies the event.
|
// ID identifies the event.
|
||||||
ID string `json:"id"`
|
ID string `json:"id"`
|
||||||
|
|
@ -23,7 +23,7 @@ type TopicEvent struct {
|
||||||
PubsubName string `json:"pubsubname"`
|
PubsubName string `json:"pubsubname"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// InvocationEvent represents the input and output of binding invocation
|
// InvocationEvent represents the input and output of binding invocation.
|
||||||
type InvocationEvent struct {
|
type InvocationEvent struct {
|
||||||
// Data is the payload that the input bindings sent.
|
// Data is the payload that the input bindings sent.
|
||||||
Data []byte `json:"data"`
|
Data []byte `json:"data"`
|
||||||
|
|
@ -37,7 +37,7 @@ type InvocationEvent struct {
|
||||||
QueryString string `json:"-"`
|
QueryString string `json:"-"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// Content is a generic data content
|
// Content is a generic data content.
|
||||||
type Content struct {
|
type Content struct {
|
||||||
// Data is the payload that the input bindings sent.
|
// Data is the payload that the input bindings sent.
|
||||||
Data []byte `json:"data"`
|
Data []byte `json:"data"`
|
||||||
|
|
@ -47,7 +47,7 @@ type Content struct {
|
||||||
DataTypeURL string `json:"typeUrl,omitempty"`
|
DataTypeURL string `json:"typeUrl,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// BindingEvent represents the binding event handler input
|
// BindingEvent represents the binding event handler input.
|
||||||
type BindingEvent struct {
|
type BindingEvent struct {
|
||||||
// Data is the input bindings sent
|
// Data is the input bindings sent
|
||||||
Data []byte `json:"data"`
|
Data []byte `json:"data"`
|
||||||
|
|
@ -55,7 +55,7 @@ type BindingEvent struct {
|
||||||
Metadata map[string]string `json:"metadata,omitempty"`
|
Metadata map[string]string `json:"metadata,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// Subscription represents single topic subscription
|
// Subscription represents single topic subscription.
|
||||||
type Subscription struct {
|
type Subscription struct {
|
||||||
// PubsubName is name of the pub/sub this message came from
|
// PubsubName is name of the pub/sub this message came from
|
||||||
PubsubName string `json:"pubsubname"`
|
PubsubName string `json:"pubsubname"`
|
||||||
|
|
@ -68,15 +68,15 @@ type Subscription struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
const (
|
const (
|
||||||
// SubscriptionResponseStatusSuccess means message is processed successfully
|
// SubscriptionResponseStatusSuccess means message is processed successfully.
|
||||||
SubscriptionResponseStatusSuccess = "SUCCESS"
|
SubscriptionResponseStatusSuccess = "SUCCESS"
|
||||||
// SubscriptionResponseStatusRetry means message to be retried by Dapr
|
// SubscriptionResponseStatusRetry means message to be retried by Dapr.
|
||||||
SubscriptionResponseStatusRetry = "RETRY"
|
SubscriptionResponseStatusRetry = "RETRY"
|
||||||
// SubscriptionResponseStatusDrop means warning is logged and message is dropped
|
// SubscriptionResponseStatusDrop means warning is logged and message is dropped.
|
||||||
SubscriptionResponseStatusDrop = "DROP"
|
SubscriptionResponseStatusDrop = "DROP"
|
||||||
)
|
)
|
||||||
|
|
||||||
// SubscriptionResponse represents the response handling hint from subscriber to Dapr
|
// SubscriptionResponse represents the response handling hint from subscriber to Dapr.
|
||||||
type SubscriptionResponse struct {
|
type SubscriptionResponse struct {
|
||||||
Status string `json:"status"`
|
Status string `json:"status"`
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -4,13 +4,14 @@ import (
|
||||||
"context"
|
"context"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
pb "github.com/dapr/go-sdk/dapr/proto/runtime/v1"
|
|
||||||
"github.com/dapr/go-sdk/service/common"
|
|
||||||
"github.com/golang/protobuf/ptypes/empty"
|
"github.com/golang/protobuf/ptypes/empty"
|
||||||
"github.com/pkg/errors"
|
"github.com/pkg/errors"
|
||||||
|
|
||||||
|
pb "github.com/dapr/go-sdk/dapr/proto/runtime/v1"
|
||||||
|
"github.com/dapr/go-sdk/service/common"
|
||||||
)
|
)
|
||||||
|
|
||||||
// AddBindingInvocationHandler appends provided binding invocation handler with its name to the service
|
// AddBindingInvocationHandler appends provided binding invocation handler with its name to the service.
|
||||||
func (s *Server) AddBindingInvocationHandler(name string, fn func(ctx context.Context, in *common.BindingEvent) (out []byte, err error)) error {
|
func (s *Server) AddBindingInvocationHandler(name string, fn func(ctx context.Context, in *common.BindingEvent) (out []byte, err error)) error {
|
||||||
if name == "" {
|
if name == "" {
|
||||||
return fmt.Errorf("binding name required")
|
return fmt.Errorf("binding name required")
|
||||||
|
|
@ -23,7 +24,7 @@ func (s *Server) AddBindingInvocationHandler(name string, fn func(ctx context.Co
|
||||||
}
|
}
|
||||||
|
|
||||||
// ListInputBindings is called by Dapr to get the list of bindings the app will get invoked by. In this example, we are telling Dapr
|
// ListInputBindings is called by Dapr to get the list of bindings the app will get invoked by. In this example, we are telling Dapr
|
||||||
// To invoke our app with a binding named storage
|
// To invoke our app with a binding named storage.
|
||||||
func (s *Server) ListInputBindings(ctx context.Context, in *empty.Empty) (*pb.ListInputBindingsResponse, error) {
|
func (s *Server) ListInputBindings(ctx context.Context, in *empty.Empty) (*pb.ListInputBindingsResponse, error) {
|
||||||
list := make([]string, 0)
|
list := make([]string, 0)
|
||||||
for k := range s.bindingHandlers {
|
for k := range s.bindingHandlers {
|
||||||
|
|
@ -35,7 +36,7 @@ func (s *Server) ListInputBindings(ctx context.Context, in *empty.Empty) (*pb.Li
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// OnBindingEvent gets invoked every time a new event is fired from a registered binding. The message carries the binding name, a payload and optional metadata
|
// OnBindingEvent gets invoked every time a new event is fired from a registered binding. The message carries the binding name, a payload and optional metadata.
|
||||||
func (s *Server) OnBindingEvent(ctx context.Context, in *pb.BindingEventRequest) (*pb.BindingEventResponse, error) {
|
func (s *Server) OnBindingEvent(ctx context.Context, in *pb.BindingEventRequest) (*pb.BindingEventResponse, error) {
|
||||||
if in == nil {
|
if in == nil {
|
||||||
return nil, errors.New("nil binding event request")
|
return nil, errors.New("nil binding event request")
|
||||||
|
|
|
||||||
|
|
@ -5,10 +5,11 @@ import (
|
||||||
"errors"
|
"errors"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/dapr/go-sdk/dapr/proto/runtime/v1"
|
|
||||||
"github.com/dapr/go-sdk/service/common"
|
|
||||||
"github.com/golang/protobuf/ptypes/empty"
|
"github.com/golang/protobuf/ptypes/empty"
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
|
|
||||||
|
"github.com/dapr/go-sdk/dapr/proto/runtime/v1"
|
||||||
|
"github.com/dapr/go-sdk/service/common"
|
||||||
)
|
)
|
||||||
|
|
||||||
func testBindingHandler(ctx context.Context, in *common.BindingEvent) (out []byte, err error) {
|
func testBindingHandler(ctx context.Context, in *common.BindingEvent) (out []byte, err error) {
|
||||||
|
|
|
||||||
|
|
@ -4,13 +4,14 @@ import (
|
||||||
"context"
|
"context"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
cpb "github.com/dapr/go-sdk/dapr/proto/common/v1"
|
|
||||||
cc "github.com/dapr/go-sdk/service/common"
|
|
||||||
"github.com/golang/protobuf/ptypes/any"
|
"github.com/golang/protobuf/ptypes/any"
|
||||||
"github.com/pkg/errors"
|
"github.com/pkg/errors"
|
||||||
|
|
||||||
|
cpb "github.com/dapr/go-sdk/dapr/proto/common/v1"
|
||||||
|
cc "github.com/dapr/go-sdk/service/common"
|
||||||
)
|
)
|
||||||
|
|
||||||
// AddServiceInvocationHandler appends provided service invocation handler with its method to the service
|
// AddServiceInvocationHandler appends provided service invocation handler with its method to the service.
|
||||||
func (s *Server) AddServiceInvocationHandler(method string, fn func(ctx context.Context, in *cc.InvocationEvent) (our *cc.Content, err error)) error {
|
func (s *Server) AddServiceInvocationHandler(method string, fn func(ctx context.Context, in *cc.InvocationEvent) (our *cc.Content, err error)) error {
|
||||||
if method == "" {
|
if method == "" {
|
||||||
return fmt.Errorf("servie name required")
|
return fmt.Errorf("servie name required")
|
||||||
|
|
@ -22,7 +23,7 @@ func (s *Server) AddServiceInvocationHandler(method string, fn func(ctx context.
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// OnInvoke gets invoked when a remote service has called the app through Dapr
|
// OnInvoke gets invoked when a remote service has called the app through Dapr.
|
||||||
func (s *Server) OnInvoke(ctx context.Context, in *cpb.InvokeRequest) (*cpb.InvokeResponse, error) {
|
func (s *Server) OnInvoke(ctx context.Context, in *cpb.InvokeRequest) (*cpb.InvokeResponse, error) {
|
||||||
if in == nil {
|
if in == nil {
|
||||||
return nil, errors.New("nil invoke request")
|
return nil, errors.New("nil invoke request")
|
||||||
|
|
|
||||||
|
|
@ -4,11 +4,12 @@ import (
|
||||||
"context"
|
"context"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/dapr/go-sdk/dapr/proto/common/v1"
|
|
||||||
cc "github.com/dapr/go-sdk/service/common"
|
|
||||||
"github.com/pkg/errors"
|
"github.com/pkg/errors"
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
"google.golang.org/protobuf/types/known/anypb"
|
"google.golang.org/protobuf/types/known/anypb"
|
||||||
|
|
||||||
|
"github.com/dapr/go-sdk/dapr/proto/common/v1"
|
||||||
|
cc "github.com/dapr/go-sdk/service/common"
|
||||||
)
|
)
|
||||||
|
|
||||||
func testInvokeHandler(ctx context.Context, in *cc.InvocationEvent) (out *cc.Content, err error) {
|
func testInvokeHandler(ctx context.Context, in *cc.InvocationEvent) (out *cc.Content, err error) {
|
||||||
|
|
|
||||||
|
|
@ -6,9 +6,10 @@ import (
|
||||||
|
|
||||||
"github.com/pkg/errors"
|
"github.com/pkg/errors"
|
||||||
|
|
||||||
|
"google.golang.org/grpc"
|
||||||
|
|
||||||
pb "github.com/dapr/go-sdk/dapr/proto/runtime/v1"
|
pb "github.com/dapr/go-sdk/dapr/proto/runtime/v1"
|
||||||
"github.com/dapr/go-sdk/service/common"
|
"github.com/dapr/go-sdk/service/common"
|
||||||
"google.golang.org/grpc"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// NewService creates new Service.
|
// NewService creates new Service.
|
||||||
|
|
|
||||||
|
|
@ -4,13 +4,14 @@ import (
|
||||||
"context"
|
"context"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
pb "github.com/dapr/go-sdk/dapr/proto/runtime/v1"
|
|
||||||
"github.com/dapr/go-sdk/service/common"
|
|
||||||
"github.com/golang/protobuf/ptypes/empty"
|
"github.com/golang/protobuf/ptypes/empty"
|
||||||
"github.com/pkg/errors"
|
"github.com/pkg/errors"
|
||||||
|
|
||||||
|
pb "github.com/dapr/go-sdk/dapr/proto/runtime/v1"
|
||||||
|
"github.com/dapr/go-sdk/service/common"
|
||||||
)
|
)
|
||||||
|
|
||||||
// AddTopicEventHandler appends provided event handler with topic name to the service
|
// AddTopicEventHandler appends provided event handler with topic name to the service.
|
||||||
func (s *Server) AddTopicEventHandler(sub *common.Subscription, fn func(ctx context.Context, e *common.TopicEvent) (retry bool, err error)) error {
|
func (s *Server) AddTopicEventHandler(sub *common.Subscription, fn func(ctx context.Context, e *common.TopicEvent) (retry bool, err error)) error {
|
||||||
if sub == nil {
|
if sub == nil {
|
||||||
return errors.New("subscription required")
|
return errors.New("subscription required")
|
||||||
|
|
|
||||||
|
|
@ -5,10 +5,11 @@ import (
|
||||||
"errors"
|
"errors"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/dapr/go-sdk/dapr/proto/runtime/v1"
|
|
||||||
"github.com/dapr/go-sdk/service/common"
|
|
||||||
"github.com/golang/protobuf/ptypes/empty"
|
"github.com/golang/protobuf/ptypes/empty"
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
|
|
||||||
|
"github.com/dapr/go-sdk/dapr/proto/runtime/v1"
|
||||||
|
"github.com/dapr/go-sdk/service/common"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestTopicErrors(t *testing.T) {
|
func TestTopicErrors(t *testing.T) {
|
||||||
|
|
@ -65,7 +66,7 @@ func TestTopic(t *testing.T) {
|
||||||
|
|
||||||
t.Run("topic event for wrong topic", func(t *testing.T) {
|
t.Run("topic event for wrong topic", func(t *testing.T) {
|
||||||
in := &runtime.TopicEventRequest{
|
in := &runtime.TopicEventRequest{
|
||||||
Topic: "invlid",
|
Topic: "invalid",
|
||||||
}
|
}
|
||||||
_, err := server.OnTopicEvent(ctx, in)
|
_, err := server.OnTopicEvent(ctx, in)
|
||||||
assert.Error(t, err)
|
assert.Error(t, err)
|
||||||
|
|
|
||||||
|
|
@ -10,7 +10,7 @@ import (
|
||||||
"github.com/dapr/go-sdk/service/common"
|
"github.com/dapr/go-sdk/service/common"
|
||||||
)
|
)
|
||||||
|
|
||||||
// AddBindingInvocationHandler appends provided binding invocation handler with its route to the service
|
// AddBindingInvocationHandler appends provided binding invocation handler with its route to the service.
|
||||||
func (s *Server) AddBindingInvocationHandler(route string, fn func(ctx context.Context, in *common.BindingEvent) (out []byte, err error)) error {
|
func (s *Server) AddBindingInvocationHandler(route string, fn func(ctx context.Context, in *common.BindingEvent) (out []byte, err error)) error {
|
||||||
if route == "" {
|
if route == "" {
|
||||||
return fmt.Errorf("binding route required")
|
return fmt.Errorf("binding route required")
|
||||||
|
|
|
||||||
|
|
@ -8,8 +8,9 @@ import (
|
||||||
"strings"
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/dapr/go-sdk/service/common"
|
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
|
|
||||||
|
"github.com/dapr/go-sdk/service/common"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestBindingHandlerWithoutHandler(t *testing.T) {
|
func TestBindingHandlerWithoutHandler(t *testing.T) {
|
||||||
|
|
|
||||||
|
|
@ -10,7 +10,7 @@ import (
|
||||||
"github.com/dapr/go-sdk/service/common"
|
"github.com/dapr/go-sdk/service/common"
|
||||||
)
|
)
|
||||||
|
|
||||||
// AddServiceInvocationHandler appends provided service invocation handler with its route to the service
|
// AddServiceInvocationHandler appends provided service invocation handler with its route to the service.
|
||||||
func (s *Server) AddServiceInvocationHandler(route string, fn func(ctx context.Context, in *common.InvocationEvent) (out *common.Content, err error)) error {
|
func (s *Server) AddServiceInvocationHandler(route string, fn func(ctx context.Context, in *common.InvocationEvent) (out *common.Content, err error)) error {
|
||||||
if route == "" {
|
if route == "" {
|
||||||
return fmt.Errorf("service route required")
|
return fmt.Errorf("service route required")
|
||||||
|
|
@ -63,5 +63,3 @@ func (s *Server) AddServiceInvocationHandler(route string, fn func(ctx context.C
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -9,8 +9,9 @@ import (
|
||||||
"strings"
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/dapr/go-sdk/service/common"
|
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
|
|
||||||
|
"github.com/dapr/go-sdk/service/common"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestInvocationHandlerWithoutHandler(t *testing.T) {
|
func TestInvocationHandlerWithoutHandler(t *testing.T) {
|
||||||
|
|
|
||||||
|
|
@ -6,12 +6,12 @@ import (
|
||||||
"github.com/dapr/go-sdk/service/common"
|
"github.com/dapr/go-sdk/service/common"
|
||||||
)
|
)
|
||||||
|
|
||||||
// NewService creates new Service
|
// NewService creates new Service.
|
||||||
func NewService(address string) common.Service {
|
func NewService(address string) common.Service {
|
||||||
return newServer(address, nil)
|
return newServer(address, nil)
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewServiceWithMux creates new Service with existing http mux
|
// NewServiceWithMux creates new Service with existing http mux.
|
||||||
func NewServiceWithMux(address string, mux *http.ServeMux) common.Service {
|
func NewServiceWithMux(address string, mux *http.ServeMux) common.Service {
|
||||||
return newServer(address, mux)
|
return newServer(address, mux)
|
||||||
}
|
}
|
||||||
|
|
@ -27,14 +27,14 @@ func newServer(address string, mux *http.ServeMux) *Server {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Server is the HTTP server wrapping mux many Dapr helpers
|
// Server is the HTTP server wrapping mux many Dapr helpers.
|
||||||
type Server struct {
|
type Server struct {
|
||||||
address string
|
address string
|
||||||
mux *http.ServeMux
|
mux *http.ServeMux
|
||||||
topicSubscriptions []*common.Subscription
|
topicSubscriptions []*common.Subscription
|
||||||
}
|
}
|
||||||
|
|
||||||
// Start starts the HTTP handler. Blocks while serving
|
// Start starts the HTTP handler. Blocks while serving.
|
||||||
func (s *Server) Start() error {
|
func (s *Server) Start() error {
|
||||||
s.registerSubscribeHandler()
|
s.registerSubscribeHandler()
|
||||||
server := http.Server{
|
server := http.Server{
|
||||||
|
|
@ -44,7 +44,7 @@ func (s *Server) Start() error {
|
||||||
return server.ListenAndServe()
|
return server.ListenAndServe()
|
||||||
}
|
}
|
||||||
|
|
||||||
// Stop stops previously started HTTP service
|
// Stop stops previously started HTTP service.
|
||||||
func (s *Server) Stop() error {
|
func (s *Server) Stop() error {
|
||||||
// TODO: implement service stop
|
// TODO: implement service stop
|
||||||
return nil
|
return nil
|
||||||
|
|
|
||||||
|
|
@ -21,6 +21,7 @@ func TestSettingOptions(t *testing.T) {
|
||||||
w := httptest.NewRecorder()
|
w := httptest.NewRecorder()
|
||||||
setOptions(w, req)
|
setOptions(w, req)
|
||||||
resp := w.Result()
|
resp := w.Result()
|
||||||
|
defer resp.Body.Close()
|
||||||
assert.NotNil(t, resp)
|
assert.NotNil(t, resp)
|
||||||
assert.Equal(t, "*", resp.Header.Get("Access-Control-Allow-Origin"))
|
assert.Equal(t, "*", resp.Header.Get("Access-Control-Allow-Origin"))
|
||||||
assert.Equal(t, "POST,OPTIONS", resp.Header.Get("Access-Control-Allow-Methods"))
|
assert.Equal(t, "POST,OPTIONS", resp.Header.Get("Access-Control-Allow-Methods"))
|
||||||
|
|
@ -31,7 +32,8 @@ func TestSettingOptions(t *testing.T) {
|
||||||
func testRequest(t *testing.T, s *Server, r *http.Request, expectedStatusCode int) {
|
func testRequest(t *testing.T, s *Server, r *http.Request, expectedStatusCode int) {
|
||||||
rr := httptest.NewRecorder()
|
rr := httptest.NewRecorder()
|
||||||
s.mux.ServeHTTP(rr, r)
|
s.mux.ServeHTTP(rr, r)
|
||||||
rez := rr.Result()
|
resp := rr.Result()
|
||||||
assert.NotNil(t, rez)
|
defer resp.Body.Close()
|
||||||
assert.Equal(t, expectedStatusCode, rez.StatusCode)
|
assert.NotNil(t, resp)
|
||||||
|
assert.Equal(t, expectedStatusCode, resp.StatusCode)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -13,13 +13,13 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
// PubSubHandlerSuccessStatusCode is the successful ack code for pubsub event appcallback response
|
// PubSubHandlerSuccessStatusCode is the successful ack code for pubsub event appcallback response.
|
||||||
PubSubHandlerSuccessStatusCode int = http.StatusOK
|
PubSubHandlerSuccessStatusCode int = http.StatusOK
|
||||||
|
|
||||||
// PubSubHandlerRetryStatusCode is the error response code (nack) pubsub event appcallback response
|
// PubSubHandlerRetryStatusCode is the error response code (nack) pubsub event appcallback response.
|
||||||
PubSubHandlerRetryStatusCode int = http.StatusInternalServerError
|
PubSubHandlerRetryStatusCode int = http.StatusInternalServerError
|
||||||
|
|
||||||
// PubSubHandlerDropStatusCode is the pubsub event appcallback response code indicating that Dapr should drop that message
|
// PubSubHandlerDropStatusCode is the pubsub event appcallback response code indicating that Dapr should drop that message.
|
||||||
PubSubHandlerDropStatusCode int = http.StatusSeeOther
|
PubSubHandlerDropStatusCode int = http.StatusSeeOther
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
@ -34,7 +34,7 @@ func (s *Server) registerSubscribeHandler() {
|
||||||
s.mux.HandleFunc("/dapr/subscribe", f)
|
s.mux.HandleFunc("/dapr/subscribe", f)
|
||||||
}
|
}
|
||||||
|
|
||||||
// AddTopicEventHandler appends provided event handler with it's name to the service
|
// AddTopicEventHandler appends provided event handler with it's name to the service.
|
||||||
func (s *Server) AddTopicEventHandler(sub *common.Subscription, fn func(ctx context.Context, e *common.TopicEvent) (retry bool, err error)) error {
|
func (s *Server) AddTopicEventHandler(sub *common.Subscription, fn func(ctx context.Context, e *common.TopicEvent) (retry bool, err error)) error {
|
||||||
if sub == nil {
|
if sub == nil {
|
||||||
return errors.New("subscription required")
|
return errors.New("subscription required")
|
||||||
|
|
|
||||||
|
|
@ -8,8 +8,9 @@ import (
|
||||||
"strings"
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/dapr/go-sdk/service/common"
|
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
|
|
||||||
|
"github.com/dapr/go-sdk/service/common"
|
||||||
)
|
)
|
||||||
|
|
||||||
func testTopicFunc(ctx context.Context, e *common.TopicEvent) (retry bool, err error) {
|
func testTopicFunc(ctx context.Context, e *common.TopicEvent) (retry bool, err error) {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue