diff --git a/.github/workflows/integration-blog.yml b/.github/workflows/integration-blog.yml new file mode 100644 index 0000000..94f5fab --- /dev/null +++ b/.github/workflows/integration-blog.yml @@ -0,0 +1,56 @@ +name: Blog integration tests +on: [push] + +jobs: + + test: + name: Blog integration tests + runs-on: ubuntu-latest + steps: + - name: Set up Go 1.13 + uses: actions/setup-go@v2 + with: + go-version: 1.13 + id: go + + - name: Install Protoc + uses: arduino/setup-protoc@master + + - name: Check out this code + uses: actions/checkout@v2 + with: + path: services + + - name: Check out micro code + uses: actions/checkout@v2 + with: + repository: 'micro/micro' + path: 'micro' + ref: '20cabee1960e6abe8b59d8f178ddf66ad5da1097' + + - name: Enable caching + uses: actions/cache@v2 + with: + path: ~/go/pkg/mod + key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }} + restore-keys: | + ${{ runner.os }}-go- + + - name: Install micro + working-directory: micro + run: | + go run . init --profile=ci --output=profile.go + go mod edit -replace github.com/micro/micro/plugin/etcd/v3=./plugin/etcd + go mod edit -replace github.com/micro/micro/profile/ci/v3=./profile/ci + go mod edit -replace google.golang.org/grpc=google.golang.org/grpc@v1.26.0 + go install + + - name: Build container + run: | + bash services/test/image/test-docker.sh + + - name: Test Blog services + working-directory: services/test/integration + run: | + go clean -testcache && GOMAXPROCS=4 go test -timeout 15m --tags=blog -v ./... + diff --git a/README.md b/README.md index 22919c3..d3c2432 100644 --- a/README.md +++ b/README.md @@ -8,6 +8,7 @@ Services provides a home for real world examples for using Micro v3. - [blog](blog) - A blog app composed as micro services - [helloworld](helloworld) - A simple helloworld service +- [test](test) - A set of sample test services for Micro ## Usage diff --git a/blog/README.md b/blog/README.md index e05d238..491f29e 100644 --- a/blog/README.md +++ b/blog/README.md @@ -5,3 +5,47 @@ This is a full end to end example of writing a multi-service blog application ## Usage Check out the [blog tutorial](https://m3o.dev/tutorials/building-a-blog) on the developer docs. + +## How it works + +### Present + +The blog services are designed so a user can deploy them to their own micro namespace, write content with their Micro account with commands like + +```sh +micro posts save --id=7 --tags=News,Finance --title="Breaking News" --content="The stock market has just crashed" +``` + +and display content on their frontend by consuming the API: + +```sh +curl -H "Authorization: Bearer $MICRO_API_TOKEN" "Micro-Namespace: $NAMESPACE" https://api.m3o.com/tags/list + + +{ + "tags": [ + { + "type": "post-tag", + "slug": "news", + "title": "News", + "count": "3" + } + ] +] +``` + +There are no comments provided yet, just posts and tags. +Access is governed by auth rules, ie. Posts List, Tags List is open, Posts Save requires a Micro login. + +### Future possibilities + +#### Enable non Micro users to write posts, comments + +If we provide a user/login service (markedly different from auth, it can be a simple session based auth) to enable non Micro users to register, the following can be done: + +- A user (let's call the user Alice from this point) launches posts, tags, login service in their namespace. +- Alice opens up said endpoints +- People (let's call them Yoga Pants Co and Drone Inc) hosting JS and HTML on Netlify or Github Pages could create accounts in the services hosted by Alice. In this way, Alice, by having a Micro account becomes a headless CMS provider. Multiple blogs can be created on top of Alice's service instances. + +Questions: +- How will Yoga Pants Co or Drone Inc pay Alice or M3O for the costs of their backend hosting? \ No newline at end of file diff --git a/blog/posts/Makefile b/blog/posts/Makefile index 4709608..d85170d 100644 --- a/blog/posts/Makefile +++ b/blog/posts/Makefile @@ -5,7 +5,7 @@ MODIFY=Mgithub.com/micro/go-micro/api/proto/api.proto=github.com/micro/go-micro/ .PHONY: proto proto: - protoc --proto_path=. --micro_out=${MODIFY}:. --go_out=${MODIFY}:. proto/post/post.proto + protoc --proto_path=. --micro_out=${MODIFY}:. --go_out=${MODIFY}:. proto/posts/posts.proto .PHONY: build diff --git a/blog/posts/handler/posts.go b/blog/posts/handler/posts.go index 092eabe..9ec3e00 100644 --- a/blog/posts/handler/posts.go +++ b/blog/posts/handler/posts.go @@ -8,7 +8,6 @@ import ( "time" "github.com/micro/go-micro/v3/errors" - gostore "github.com/micro/go-micro/v3/store" "github.com/micro/micro/v3/service/logger" "github.com/micro/micro/v3/service/store" @@ -32,7 +31,7 @@ type Post struct { Content string `json:"content"` CreateTimestamp int64 `json:"create_timestamp"` UpdateTimestamp int64 `json:"update_timestamp"` - TagNames []string `json:"tagNames"` + Tags []string `json:"tags"` } type Posts struct { @@ -40,23 +39,23 @@ type Posts struct { } func (p *Posts) Save(ctx context.Context, req *posts.SaveRequest, rsp *posts.SaveResponse) error { - if len(req.Post.Id) == 0 || len(req.Post.Title) == 0 || len(req.Post.Content) == 0 { + if len(req.Id) == 0 || len(req.Title) == 0 || len(req.Content) == 0 { return errors.BadRequest("posts.save.input-check", "Id, title or content is missing") } // read by post - records, err := store.Read(fmt.Sprintf("%v:%v", idPrefix, req.Post.Id)) - if err != nil && err != gostore.ErrNotFound { + records, err := store.Read(fmt.Sprintf("%v:%v", idPrefix, req.Id)) + if err != nil && err != store.ErrNotFound { return errors.InternalServerError("posts.save.store-id-read", "Failed to read post by id: %v", err.Error()) } - postSlug := slug.Make(req.Post.Title) + postSlug := slug.Make(req.Title) // If no existing record is found, create a new one if len(records) == 0 { post := &Post{ - ID: req.Post.Id, - Title: req.Post.Title, - Content: req.Post.Content, - TagNames: req.Post.TagNames, + ID: req.Id, + Title: req.Title, + Content: req.Content, + Tags: req.Tags, Slug: postSlug, CreateTimestamp: time.Now().Unix(), } @@ -73,18 +72,18 @@ func (p *Posts) Save(ctx context.Context, req *posts.SaveRequest, rsp *posts.Sav return errors.InternalServerError("posts.save.unmarshal", "Failed to unmarshal old post: %v", err.Error()) } post := &Post{ - ID: req.Post.Id, - Title: req.Post.Title, - Content: req.Post.Content, + ID: req.Id, + Title: req.Title, + Content: req.Content, Slug: postSlug, - TagNames: req.Post.TagNames, + Tags: req.Tags, CreateTimestamp: oldPost.CreateTimestamp, UpdateTimestamp: time.Now().Unix(), } // Check if slug exists recordsBySlug, err := store.Read(fmt.Sprintf("%v:%v", slugPrefix, postSlug)) - if err != nil && err != gostore.ErrNotFound { + if err != nil && err != store.ErrNotFound { return errors.InternalServerError("posts.save.store-read", "Failed to read post by slug: %v", err.Error()) } otherSlugPost := &Post{} @@ -105,7 +104,7 @@ func (p *Posts) savePost(ctx context.Context, oldPost, post *Post) error { return err } - err = store.Write(&gostore.Record{ + err = store.Write(&store.Record{ Key: fmt.Sprintf("%v:%v", idPrefix, post.ID), Value: bytes, }) @@ -119,14 +118,14 @@ func (p *Posts) savePost(ctx context.Context, oldPost, post *Post) error { return err } } - err = store.Write(&gostore.Record{ + err = store.Write(&store.Record{ Key: fmt.Sprintf("%v:%v", slugPrefix, post.Slug), Value: bytes, }) if err != nil { return err } - err = store.Write(&gostore.Record{ + err = store.Write(&store.Record{ Key: fmt.Sprintf("%v:%v", timeStampPrefix, math.MaxInt64-post.CreateTimestamp), Value: bytes, }) @@ -134,8 +133,8 @@ func (p *Posts) savePost(ctx context.Context, oldPost, post *Post) error { return err } if oldPost == nil { - for _, tagName := range post.TagNames { - _, err := p.Tags.IncreaseCount(ctx, &tags.IncreaseCountRequest{ + for _, tagName := range post.Tags { + _, err := p.Tags.Add(ctx, &tags.AddRequest{ ParentID: post.ID, Type: tagType, Title: tagName, @@ -146,7 +145,7 @@ func (p *Posts) savePost(ctx context.Context, oldPost, post *Post) error { } return nil } - return p.diffTags(ctx, post.ID, oldPost.TagNames, post.TagNames) + return p.diffTags(ctx, post.ID, oldPost.Tags, post.Tags) } func (p *Posts) diffTags(ctx context.Context, parentID string, oldTagNames, newTagNames []string) error { @@ -161,7 +160,7 @@ func (p *Posts) diffTags(ctx context.Context, parentID string, oldTagNames, newT for i := range oldTags { _, stillThere := newTags[i] if !stillThere { - _, err := p.Tags.DecreaseCount(ctx, &tags.DecreaseCountRequest{ + _, err := p.Tags.Remove(ctx, &tags.RemoveRequest{ ParentID: parentID, Type: tagType, Title: i, @@ -174,13 +173,13 @@ func (p *Posts) diffTags(ctx context.Context, parentID string, oldTagNames, newT for i := range newTags { _, newlyAdded := oldTags[i] if newlyAdded { - _, err := p.Tags.IncreaseCount(ctx, &tags.IncreaseCountRequest{ + _, err := p.Tags.Add(ctx, &tags.AddRequest{ ParentID: parentID, Type: tagType, Title: i, }) if err != nil { - logger.Errorf("Error increasing count for tag '%v' with type '%v' for parent '%v'", i, tagType, parentID) + logger.Errorf("Error increasing count for tag '%v' with type '%v' for parent '%v': %v", i, tagType, parentID, err) } } } @@ -188,7 +187,7 @@ func (p *Posts) diffTags(ctx context.Context, parentID string, oldTagNames, newT } func (p *Posts) Query(ctx context.Context, req *pb.QueryRequest, rsp *pb.QueryResponse) error { - var records []*gostore.Record + var records []*store.Record var err error if len(req.Slug) > 0 { key := fmt.Sprintf("%v:%v", slugPrefix, req.Slug) @@ -218,11 +217,11 @@ func (p *Posts) Query(ctx context.Context, req *pb.QueryRequest, rsp *pb.QueryRe return errors.InternalServerError("posts.save.unmarshal", "Failed to unmarshal old post: %v", err.Error()) } rsp.Posts[i] = &pb.Post{ - Id: postRecord.ID, - Title: postRecord.Title, - Slug: postRecord.Slug, - Content: postRecord.Content, - TagNames: postRecord.TagNames, + Id: postRecord.ID, + Title: postRecord.Title, + Slug: postRecord.Slug, + Content: postRecord.Content, + Tags: postRecord.Tags, } } return nil @@ -231,7 +230,7 @@ func (p *Posts) Query(ctx context.Context, req *pb.QueryRequest, rsp *pb.QueryRe func (p *Posts) Delete(ctx context.Context, req *pb.DeleteRequest, rsp *pb.DeleteResponse) error { logger.Info("Received Post.Delete request") records, err := store.Read(fmt.Sprintf("%v:%v", idPrefix, req.Id)) - if err != nil && err != gostore.ErrNotFound { + if err != nil && err != store.ErrNotFound { return err } if len(records) == 0 { diff --git a/blog/posts/proto/posts/post.pb.go b/blog/posts/proto/posts/posts.pb.go similarity index 68% rename from blog/posts/proto/posts/post.pb.go rename to blog/posts/proto/posts/posts.pb.go index a0a5bf4..d3fd945 100644 --- a/blog/posts/proto/posts/post.pb.go +++ b/blog/posts/proto/posts/posts.pb.go @@ -1,5 +1,5 @@ // Code generated by protoc-gen-go. DO NOT EDIT. -// source: blog/posts/proto/posts/post.proto +// source: proto/posts/posts.proto package posts @@ -25,8 +25,10 @@ type Post struct { Title string `protobuf:"bytes,2,opt,name=title,proto3" json:"title,omitempty"` Slug string `protobuf:"bytes,3,opt,name=slug,proto3" json:"slug,omitempty"` Content string `protobuf:"bytes,4,opt,name=content,proto3" json:"content,omitempty"` - Timestamp int64 `protobuf:"varint,5,opt,name=timestamp,proto3" json:"timestamp,omitempty"` - TagNames []string `protobuf:"bytes,6,rep,name=tagNames,proto3" json:"tagNames,omitempty"` + Created int64 `protobuf:"varint,5,opt,name=created,proto3" json:"created,omitempty"` + Updated int64 `protobuf:"varint,6,opt,name=updated,proto3" json:"updated,omitempty"` + Author string `protobuf:"bytes,7,opt,name=author,proto3" json:"author,omitempty"` + Tags []string `protobuf:"bytes,8,rep,name=tags,proto3" json:"tags,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -36,7 +38,7 @@ func (m *Post) Reset() { *m = Post{} } func (m *Post) String() string { return proto.CompactTextString(m) } func (*Post) ProtoMessage() {} func (*Post) Descriptor() ([]byte, []int) { - return fileDescriptor_2d32cca1c2f74735, []int{0} + return fileDescriptor_a1e4efc789192621, []int{0} } func (m *Post) XXX_Unmarshal(b []byte) error { @@ -85,16 +87,30 @@ func (m *Post) GetContent() string { return "" } -func (m *Post) GetTimestamp() int64 { +func (m *Post) GetCreated() int64 { if m != nil { - return m.Timestamp + return m.Created } return 0 } -func (m *Post) GetTagNames() []string { +func (m *Post) GetUpdated() int64 { if m != nil { - return m.TagNames + return m.Updated + } + return 0 +} + +func (m *Post) GetAuthor() string { + if m != nil { + return m.Author + } + return "" +} + +func (m *Post) GetTags() []string { + if m != nil { + return m.Tags } return nil } @@ -112,7 +128,7 @@ func (m *QueryRequest) Reset() { *m = QueryRequest{} } func (m *QueryRequest) String() string { return proto.CompactTextString(m) } func (*QueryRequest) ProtoMessage() {} func (*QueryRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2d32cca1c2f74735, []int{1} + return fileDescriptor_a1e4efc789192621, []int{1} } func (m *QueryRequest) XXX_Unmarshal(b []byte) error { @@ -165,7 +181,7 @@ func (m *QueryResponse) Reset() { *m = QueryResponse{} } func (m *QueryResponse) String() string { return proto.CompactTextString(m) } func (*QueryResponse) ProtoMessage() {} func (*QueryResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_2d32cca1c2f74735, []int{2} + return fileDescriptor_a1e4efc789192621, []int{2} } func (m *QueryResponse) XXX_Unmarshal(b []byte) error { @@ -194,7 +210,12 @@ func (m *QueryResponse) GetPosts() []*Post { } type SaveRequest struct { - Post *Post `protobuf:"bytes,1,opt,name=post,proto3" json:"post,omitempty"` + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + Title string `protobuf:"bytes,2,opt,name=title,proto3" json:"title,omitempty"` + Slug string `protobuf:"bytes,3,opt,name=slug,proto3" json:"slug,omitempty"` + Content string `protobuf:"bytes,4,opt,name=content,proto3" json:"content,omitempty"` + Timestamp int64 `protobuf:"varint,5,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + Tags []string `protobuf:"bytes,6,rep,name=tags,proto3" json:"tags,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -204,7 +225,7 @@ func (m *SaveRequest) Reset() { *m = SaveRequest{} } func (m *SaveRequest) String() string { return proto.CompactTextString(m) } func (*SaveRequest) ProtoMessage() {} func (*SaveRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2d32cca1c2f74735, []int{3} + return fileDescriptor_a1e4efc789192621, []int{3} } func (m *SaveRequest) XXX_Unmarshal(b []byte) error { @@ -225,15 +246,50 @@ func (m *SaveRequest) XXX_DiscardUnknown() { var xxx_messageInfo_SaveRequest proto.InternalMessageInfo -func (m *SaveRequest) GetPost() *Post { +func (m *SaveRequest) GetId() string { if m != nil { - return m.Post + return m.Id + } + return "" +} + +func (m *SaveRequest) GetTitle() string { + if m != nil { + return m.Title + } + return "" +} + +func (m *SaveRequest) GetSlug() string { + if m != nil { + return m.Slug + } + return "" +} + +func (m *SaveRequest) GetContent() string { + if m != nil { + return m.Content + } + return "" +} + +func (m *SaveRequest) GetTimestamp() int64 { + if m != nil { + return m.Timestamp + } + return 0 +} + +func (m *SaveRequest) GetTags() []string { + if m != nil { + return m.Tags } return nil } type SaveResponse struct { - Post *Post `protobuf:"bytes,1,opt,name=post,proto3" json:"post,omitempty"` + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -243,7 +299,7 @@ func (m *SaveResponse) Reset() { *m = SaveResponse{} } func (m *SaveResponse) String() string { return proto.CompactTextString(m) } func (*SaveResponse) ProtoMessage() {} func (*SaveResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_2d32cca1c2f74735, []int{4} + return fileDescriptor_a1e4efc789192621, []int{4} } func (m *SaveResponse) XXX_Unmarshal(b []byte) error { @@ -264,11 +320,11 @@ func (m *SaveResponse) XXX_DiscardUnknown() { var xxx_messageInfo_SaveResponse proto.InternalMessageInfo -func (m *SaveResponse) GetPost() *Post { +func (m *SaveResponse) GetId() string { if m != nil { - return m.Post + return m.Id } - return nil + return "" } type DeleteRequest struct { @@ -282,7 +338,7 @@ func (m *DeleteRequest) Reset() { *m = DeleteRequest{} } func (m *DeleteRequest) String() string { return proto.CompactTextString(m) } func (*DeleteRequest) ProtoMessage() {} func (*DeleteRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2d32cca1c2f74735, []int{5} + return fileDescriptor_a1e4efc789192621, []int{5} } func (m *DeleteRequest) XXX_Unmarshal(b []byte) error { @@ -320,7 +376,7 @@ func (m *DeleteResponse) Reset() { *m = DeleteResponse{} } func (m *DeleteResponse) String() string { return proto.CompactTextString(m) } func (*DeleteResponse) ProtoMessage() {} func (*DeleteResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_2d32cca1c2f74735, []int{6} + return fileDescriptor_a1e4efc789192621, []int{6} } func (m *DeleteResponse) XXX_Unmarshal(b []byte) error { @@ -351,30 +407,33 @@ func init() { proto.RegisterType((*DeleteResponse)(nil), "posts.DeleteResponse") } -func init() { proto.RegisterFile("blog/posts/proto/posts/post.proto", fileDescriptor_2d32cca1c2f74735) } - -var fileDescriptor_2d32cca1c2f74735 = []byte{ - // 343 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x92, 0x4d, 0x4e, 0xc3, 0x30, - 0x10, 0x85, 0x71, 0xf3, 0x03, 0x9d, 0xfe, 0x08, 0x4d, 0x0b, 0xb2, 0x22, 0xa4, 0xa6, 0x59, 0x65, - 0x95, 0x8a, 0x82, 0xc4, 0x05, 0x58, 0xa3, 0x62, 0x4e, 0x90, 0x52, 0xb7, 0x8a, 0x94, 0xd4, 0xa1, - 0x9e, 0x22, 0x71, 0x0f, 0x2e, 0xc1, 0x2d, 0x51, 0xec, 0x24, 0xb4, 0xd9, 0xb0, 0xf3, 0xfb, 0xec, - 0x79, 0xf3, 0x66, 0x12, 0x98, 0xaf, 0x73, 0xb5, 0x5b, 0x94, 0x4a, 0x93, 0x5e, 0x94, 0x07, 0x45, - 0xaa, 0x39, 0x2b, 0x4d, 0x89, 0x01, 0xe8, 0x19, 0x12, 0x7d, 0x33, 0x70, 0x57, 0x4a, 0x13, 0x8e, - 0xa1, 0x97, 0x6d, 0x38, 0x0b, 0x59, 0xdc, 0x17, 0xbd, 0x6c, 0x83, 0x53, 0xf0, 0x28, 0xa3, 0x5c, - 0xf2, 0x9e, 0x41, 0x56, 0x20, 0x82, 0xab, 0xf3, 0xe3, 0x8e, 0x3b, 0x06, 0x9a, 0x33, 0x72, 0xb8, - 0x7c, 0x57, 0x7b, 0x92, 0x7b, 0xe2, 0xae, 0xc1, 0x8d, 0xc4, 0x3b, 0xe8, 0x53, 0x56, 0x48, 0x4d, - 0x69, 0x51, 0x72, 0x2f, 0x64, 0xb1, 0x23, 0xfe, 0x00, 0x06, 0x70, 0x45, 0xe9, 0xee, 0x25, 0x2d, - 0xa4, 0xe6, 0x7e, 0xe8, 0xc4, 0x7d, 0xd1, 0xea, 0x68, 0x05, 0xc3, 0xd7, 0xa3, 0x3c, 0x7c, 0x09, - 0xf9, 0x71, 0x94, 0x9a, 0xda, 0xbe, 0xec, 0xa4, 0xef, 0x2d, 0xf8, 0x6a, 0xbb, 0xd5, 0x92, 0x4c, - 0x44, 0x47, 0xd4, 0xaa, 0x4a, 0x9e, 0x67, 0x45, 0x46, 0x26, 0xa4, 0x23, 0xac, 0x88, 0x96, 0x30, - 0xaa, 0x1d, 0x75, 0xa9, 0xf6, 0x5a, 0xe2, 0x1c, 0xec, 0x0a, 0x38, 0x0b, 0x9d, 0x78, 0xb0, 0x1c, - 0x24, 0x46, 0x25, 0xd5, 0x32, 0x44, 0xbd, 0x9c, 0x04, 0x06, 0x6f, 0xe9, 0xa7, 0x6c, 0x42, 0xcc, - 0xc0, 0xad, 0xb8, 0x09, 0xd1, 0x29, 0x30, 0x17, 0xd1, 0x02, 0x86, 0xf6, 0x7d, 0xdd, 0xe2, 0xdf, - 0x82, 0x19, 0x8c, 0x9e, 0x65, 0x2e, 0xa9, 0x6d, 0xd1, 0xf9, 0x0a, 0xd1, 0x35, 0x8c, 0x9b, 0x07, - 0xd6, 0x73, 0xf9, 0xc3, 0xc0, 0xab, 0x1c, 0x34, 0x3e, 0x82, 0x67, 0x26, 0xc2, 0x49, 0x6d, 0x7c, - 0xba, 0xb1, 0x60, 0x7a, 0x0e, 0x6d, 0x75, 0x74, 0x81, 0xf7, 0xe0, 0x56, 0x19, 0x11, 0xeb, 0xfb, - 0x93, 0x01, 0x83, 0xc9, 0x19, 0x6b, 0x4b, 0x9e, 0xc0, 0xb7, 0x21, 0xb0, 0x31, 0x3d, 0x0b, 0x1d, - 0xdc, 0x74, 0x68, 0x53, 0xb8, 0xf6, 0xcd, 0xaf, 0xf6, 0xf0, 0x1b, 0x00, 0x00, 0xff, 0xff, 0xd5, - 0xd2, 0x06, 0xac, 0x8f, 0x02, 0x00, 0x00, +func init() { + proto.RegisterFile("proto/posts/posts.proto", fileDescriptor_a1e4efc789192621) +} + +var fileDescriptor_a1e4efc789192621 = []byte{ + // 363 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xb4, 0x52, 0x5d, 0x4e, 0xf3, 0x30, + 0x10, 0xfc, 0xd2, 0xfc, 0xf4, 0xeb, 0xf6, 0x47, 0x68, 0x5b, 0xc0, 0xaa, 0x10, 0x94, 0x3c, 0xf5, + 0xa9, 0x88, 0x82, 0xc4, 0x05, 0x38, 0x40, 0x09, 0x27, 0x08, 0xd4, 0x2d, 0x91, 0xd2, 0x26, 0xc4, + 0x0e, 0x12, 0xe7, 0xe0, 0x14, 0x5c, 0x81, 0xd3, 0x61, 0xaf, 0xed, 0x92, 0x56, 0xe2, 0x91, 0x97, + 0x68, 0x67, 0x36, 0x1e, 0xcf, 0x4c, 0x02, 0xa7, 0x65, 0x55, 0xc8, 0xe2, 0xaa, 0x2c, 0x84, 0x14, + 0xe6, 0x39, 0x23, 0x06, 0x43, 0x02, 0xf1, 0x97, 0x07, 0xc1, 0x42, 0x4d, 0x38, 0x80, 0x56, 0xb6, + 0x64, 0xde, 0xc4, 0x9b, 0x76, 0x12, 0x35, 0xe1, 0x08, 0x42, 0x99, 0xc9, 0x9c, 0xb3, 0x16, 0x51, + 0x06, 0x20, 0x42, 0x20, 0xf2, 0x7a, 0xcd, 0x7c, 0x22, 0x69, 0x46, 0x06, 0xed, 0xe7, 0x62, 0x2b, + 0xf9, 0x56, 0xb2, 0x80, 0x68, 0x07, 0x69, 0x53, 0xf1, 0x54, 0xf2, 0x25, 0x0b, 0xd5, 0xc6, 0x4f, + 0x1c, 0xd4, 0x9b, 0xba, 0x5c, 0xd2, 0x26, 0x32, 0x1b, 0x0b, 0xf1, 0x04, 0xa2, 0xb4, 0x96, 0x2f, + 0x45, 0xc5, 0xda, 0x24, 0x66, 0x91, 0xbe, 0x59, 0xa6, 0x6b, 0xc1, 0xfe, 0x4f, 0x7c, 0x7d, 0xb3, + 0x9e, 0xe3, 0x05, 0xf4, 0x1e, 0x6a, 0x5e, 0xbd, 0x27, 0xfc, 0xb5, 0xe6, 0x2a, 0x83, 0x73, 0xe7, + 0x35, 0xdc, 0x29, 0xbd, 0x62, 0xb5, 0x12, 0x5c, 0x52, 0x10, 0x3f, 0xb1, 0x48, 0xe7, 0xcb, 0xb3, + 0x4d, 0x26, 0x29, 0x8a, 0x9f, 0x18, 0x10, 0xcf, 0xa1, 0x6f, 0x15, 0x45, 0x59, 0x6c, 0x05, 0xc7, + 0x4b, 0x30, 0x45, 0x29, 0x4d, 0x7f, 0xda, 0x9d, 0x77, 0x67, 0xa6, 0x43, 0x5d, 0x59, 0x62, 0x2b, + 0xfc, 0xf0, 0xa0, 0xfb, 0x98, 0xbe, 0x71, 0xe7, 0xe2, 0x2f, 0x9a, 0x3c, 0x83, 0x8e, 0xcc, 0x36, + 0x4a, 0x3d, 0xdd, 0x94, 0xb6, 0xcb, 0x1f, 0x62, 0xd7, 0x4d, 0xd4, 0xe8, 0xe6, 0x1c, 0x7a, 0xc6, + 0x94, 0x0d, 0x72, 0xe0, 0x2a, 0xbe, 0x80, 0xfe, 0x3d, 0xcf, 0xb9, 0xfc, 0xcd, 0x76, 0x7c, 0x04, + 0x03, 0xf7, 0x82, 0x91, 0x98, 0x7f, 0x7a, 0x10, 0xea, 0xe0, 0x02, 0x6f, 0x21, 0xa4, 0x9a, 0x70, + 0x68, 0xfb, 0x68, 0x7e, 0x86, 0xf1, 0x68, 0x9f, 0x34, 0xa7, 0xe3, 0x7f, 0x78, 0x0d, 0x81, 0xb6, + 0x84, 0x68, 0xf7, 0x8d, 0xd2, 0xc6, 0xc3, 0x3d, 0x6e, 0x77, 0xe4, 0x0e, 0x22, 0x63, 0x02, 0x9d, + 0xe8, 0x9e, 0xe9, 0xf1, 0xf1, 0x01, 0xeb, 0x0e, 0x3e, 0x45, 0xf4, 0x97, 0xdf, 0x7c, 0x07, 0x00, + 0x00, 0xff, 0xff, 0xed, 0x03, 0x8f, 0x37, 0x00, 0x03, 0x00, 0x00, } diff --git a/blog/posts/proto/posts/post.pb.micro.go b/blog/posts/proto/posts/posts.pb.micro.go similarity index 95% rename from blog/posts/proto/posts/post.pb.micro.go rename to blog/posts/proto/posts/posts.pb.micro.go index d3269b1..5d724cf 100644 --- a/blog/posts/proto/posts/post.pb.micro.go +++ b/blog/posts/proto/posts/posts.pb.micro.go @@ -1,5 +1,5 @@ // Code generated by protoc-gen-micro. DO NOT EDIT. -// source: blog/posts/proto/posts/post.proto +// source: proto/posts/posts.proto package posts @@ -11,9 +11,9 @@ import ( import ( context "context" - api "github.com/micro/go-micro/v3/api" - client "github.com/micro/go-micro/v3/client" - server "github.com/micro/go-micro/v3/server" + api "github.com/micro/micro/v3/service/api" + client "github.com/micro/micro/v3/service/client" + server "github.com/micro/micro/v3/service/server" ) // Reference imports to suppress errors if they are not otherwise used. diff --git a/blog/posts/proto/posts/post.proto b/blog/posts/proto/posts/posts.proto similarity index 73% rename from blog/posts/proto/posts/post.proto rename to blog/posts/proto/posts/posts.proto index 4831a06..1ef0992 100644 --- a/blog/posts/proto/posts/post.proto +++ b/blog/posts/proto/posts/posts.proto @@ -14,8 +14,10 @@ message Post { string title = 2; string slug = 3; string content = 4; - int64 timestamp = 5; - repeated string tagNames = 6; + int64 created = 5; + int64 updated = 6; + string author = 7; + repeated string tags = 8; } message QueryRequest { @@ -29,17 +31,21 @@ message QueryResponse { } message SaveRequest { - Post post = 1; + string id = 1; + string title = 2; + string slug = 3; + string content = 4; + int64 timestamp = 5; + repeated string tags = 6; } message SaveResponse { - Post post = 1; + string id = 1; } message DeleteRequest { string id = 1; } -message DeleteResponse { -} +message DeleteResponse {} diff --git a/blog/tags/Makefile b/blog/tags/Makefile index 4de82c4..4444e1f 100644 --- a/blog/tags/Makefile +++ b/blog/tags/Makefile @@ -5,7 +5,7 @@ MODIFY=Mgithub.com/micro/go-micro/api/proto/api.proto=github.com/micro/go-micro/ .PHONY: proto proto: - protoc --proto_path=. --micro_out=${MODIFY}:. --go_out=${MODIFY}:. proto/tag/tag.proto + protoc --proto_path=. --micro_out=${MODIFY}:. --go_out=${MODIFY}:. proto/tags.proto .PHONY: build diff --git a/blog/tags/handler/tags.go b/blog/tags/handler/tags.go index 5689bb2..5acfb55 100644 --- a/blog/tags/handler/tags.go +++ b/blog/tags/handler/tags.go @@ -8,100 +8,128 @@ import ( "github.com/gosimple/slug" "github.com/micro/go-micro/v3/errors" - gostore "github.com/micro/go-micro/v3/store" "github.com/micro/micro/v3/service/logger" "github.com/micro/micro/v3/service/store" pb "github.com/micro/services/blog/tags/proto" ) const ( - parentPrefix = "parent" - typePrefix = "type" + slugPrefix = "bySlug" + parentPrefix = "byParent" + typePrefix = "byType" + tagCountPrefix = "tagCount" ) type Tag struct { - ParentID string `json:"parentID"` - Title string `json:"title"` - Slug string `json:"slug"` - Type string `json:"type"` - Count int64 `json:"count"` + Title string `json:"title"` + Slug string `json:"slug"` + Type string `json:"type"` + Count int64 `json:"count"` } type Tags struct{} -func (t *Tags) IncreaseCount(ctx context.Context, req *pb.IncreaseCountRequest, rsp *pb.IncreaseCountResponse) error { +func (t *Tags) Add(ctx context.Context, req *pb.AddRequest, rsp *pb.AddResponse) error { if len(req.ParentID) == 0 || len(req.Type) == 0 { return errors.BadRequest("tags.increasecount.input-check", "parent id and type is required") } tagSlug := slug.Make(req.GetTitle()) - parentID := fmt.Sprintf("%v:%v:%v", parentPrefix, req.GetParentID(), tagSlug) + key := fmt.Sprintf("%v:%v", slugPrefix, tagSlug) // read by parent ID + slug, the record is identical in boths places anyway - records, err := store.Read(parentID) - if err != nil && err != gostore.ErrNotFound { + records, err := store.Read(key) + if err != nil && err != store.ErrNotFound { return err } + var tag *Tag // If no existing record is found, create a new one if len(records) == 0 { - tag := &Tag{ - ParentID: req.GetParentID(), - Title: req.GetTitle(), - Type: req.Type, - Slug: tagSlug, - Count: 1, + tag = &Tag{ + Title: req.GetTitle(), + Type: req.Type, + Slug: tagSlug, + } + } else { + record := records[0] + tag = &Tag{} + err = json.Unmarshal(record.Value, tag) + if err != nil { + return err } - return t.saveTag(tag) } - record := records[0] - tag := &Tag{} - err = json.Unmarshal(record.Value, tag) + + // increase tag count + err = store.Write(&store.Record{ + Key: fmt.Sprintf("%v:%v:%v", tagCountPrefix, tag.Slug, req.GetParentID()), + Value: nil, + }) + if err != nil { + return err + } + + oldTagCount := tag.Count + // get tag count + recs, err := store.List(store.Prefix(fmt.Sprintf("%v:%v", tagCountPrefix, tag.Slug)), store.Limit(1000)) + if err != nil { + return err + } + + tag.Count = int64(len(recs)) + if tag.Count == oldTagCount { + return fmt.Errorf("Tag count for tag %v is unchanged, was: %v, now: %v", tagSlug, oldTagCount, tag.Count) + } + tagJSON, err := json.Marshal(tag) + if err != nil { + return err + } + err = store.Write(&store.Record{ + Key: fmt.Sprintf("%v:%v:%v", parentPrefix, req.GetParentID(), tag.Slug), + Value: tagJSON, + }) if err != nil { return err } - tag.Count++ return t.saveTag(tag) } func (t *Tags) saveTag(tag *Tag) error { tagSlug := slug.Make(tag.Title) - parentID := fmt.Sprintf("%v:%v:%v", parentPrefix, tag.ParentID, tagSlug) - typeID := fmt.Sprintf("%v:%v:%v", typePrefix, tag.Type, tagSlug) + key := fmt.Sprintf("%v:%v", slugPrefix, tagSlug) + typeKey := fmt.Sprintf("%v:%v:%v", typePrefix, tag.Type, tagSlug) bytes, err := json.Marshal(tag) if err != nil { return err } - // write parentId:slug to enable prefix listing based on parent - err = store.Write(&gostore.Record{ - Key: parentID, + // write parentId:slug to enable prefix listing based on type + err = store.Write(&store.Record{ + Key: key, Value: bytes, }) if err != nil { return err } - - // write type:slug to enable prefix listing based on parent - return store.Write(&gostore.Record{ - Key: typeID, + return store.Write(&store.Record{ + Key: typeKey, Value: bytes, }) } -func (t *Tags) DecreaseCount(ctx context.Context, req *pb.DecreaseCountRequest, rsp *pb.DecreaseCountResponse) error { +func (t *Tags) Remove(ctx context.Context, req *pb.RemoveRequest, rsp *pb.RemoveResponse) error { if len(req.ParentID) == 0 || len(req.Type) == 0 { return errors.BadRequest("tags.decreaseecount.input-check", "parent id and type is required") } tagSlug := slug.Make(req.GetTitle()) - parentID := fmt.Sprintf("%v:%v:%v", parentPrefix, req.GetParentID(), tagSlug) + parentKey := fmt.Sprintf("%v:%v:%v", parentPrefix, req.GetParentID(), tagSlug) // read by parent ID + slug, the record is identical in boths places anyway - records, err := store.Read(parentID) - if err != nil && err != gostore.ErrNotFound { + records, err := store.Read(parentKey) + if err != nil && err != store.ErrNotFound { return err } @@ -116,11 +144,19 @@ func (t *Tags) DecreaseCount(ctx context.Context, req *pb.DecreaseCountRequest, if err != nil { return err } - if tag.Count == 0 { - // return error? - return nil + + // decrease tag count + err = store.Delete(fmt.Sprintf("%v:%v:%v", tagCountPrefix, tag.Slug, req.GetParentID())) + if err != nil { + return err } - tag.Count-- + + // get tag count + recs, err := store.List(store.Prefix(fmt.Sprintf("%v:%v", tagCountPrefix, tag.Slug)), store.Limit(1000)) + if err != nil { + return err + } + tag.Count = int64(len(recs)) return t.saveTag(tag) } @@ -139,6 +175,7 @@ func (t *Tags) List(ctx context.Context, req *pb.ListRequest, rsp *pb.ListRespon if err != nil { return err } + rsp.Tags = make([]*pb.Tag, len(records)) for i, record := range records { tagRecord := &Tag{} @@ -147,23 +184,23 @@ func (t *Tags) List(ctx context.Context, req *pb.ListRequest, rsp *pb.ListRespon return err } rsp.Tags[i] = &pb.Tag{ - ParentID: tagRecord.ParentID, - Title: tagRecord.Title, - Type: tagRecord.Type, - Slug: tagRecord.Slug, - Count: tagRecord.Count, + Title: tagRecord.Title, + Type: tagRecord.Type, + Slug: tagRecord.Slug, + Count: tagRecord.Count, } } + return nil } func (t *Tags) Update(ctx context.Context, req *pb.UpdateRequest, rsp *pb.UpdateResponse) error { - if len(req.ParentID) == 0 || len(req.Type) == 0 { - return errors.BadRequest("tags.update.input-check", "parent id and type is required") + if len(req.Title) == 0 || len(req.Type) == 0 { + return errors.BadRequest("tags.update.input-check", "title and type is required") } tagSlug := slug.Make(req.GetTitle()) - parentID := fmt.Sprintf("%v:%v:%v", parentPrefix, req.GetParentID(), tagSlug) + parentID := fmt.Sprintf("%v:%v", slugPrefix, tagSlug) // read by parent ID + slug, the record is identical in boths places anyway records, err := store.Read(parentID) diff --git a/blog/tags/proto/tags.pb.go b/blog/tags/proto/tags.pb.go index 67aec90..81feb23 100644 --- a/blog/tags/proto/tags.pb.go +++ b/blog/tags/proto/tags.pb.go @@ -1,5 +1,5 @@ // Code generated by protoc-gen-go. DO NOT EDIT. -// source: blog/tags/proto/tags.proto +// source: proto/tags.proto package tags @@ -21,13 +21,12 @@ var _ = math.Inf const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package type Tag struct { - // The id of the parent object - ParentID string `protobuf:"bytes,1,opt,name=parentID,proto3" json:"parentID,omitempty"` // Type is useful for namespacing and listing across parents, // ie. list tags for posts, customers etc. - Type string `protobuf:"bytes,2,opt,name=type,proto3" json:"type,omitempty"` - Slug string `protobuf:"bytes,3,opt,name=slug,proto3" json:"slug,omitempty"` - Title string `protobuf:"bytes,4,opt,name=title,proto3" json:"title,omitempty"` + Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` + Slug string `protobuf:"bytes,2,opt,name=slug,proto3" json:"slug,omitempty"` + Title string `protobuf:"bytes,3,opt,name=title,proto3" json:"title,omitempty"` + Description string `protobuf:"bytes,4,opt,name=description,proto3" json:"description,omitempty"` Count int64 `protobuf:"varint,5,opt,name=count,proto3" json:"count,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` @@ -38,7 +37,7 @@ func (m *Tag) Reset() { *m = Tag{} } func (m *Tag) String() string { return proto.CompactTextString(m) } func (*Tag) ProtoMessage() {} func (*Tag) Descriptor() ([]byte, []int) { - return fileDescriptor_3298e21a718ae8a1, []int{0} + return fileDescriptor_53c4e9b325a9c45b, []int{0} } func (m *Tag) XXX_Unmarshal(b []byte) error { @@ -59,13 +58,6 @@ func (m *Tag) XXX_DiscardUnknown() { var xxx_messageInfo_Tag proto.InternalMessageInfo -func (m *Tag) GetParentID() string { - if m != nil { - return m.ParentID - } - return "" -} - func (m *Tag) GetType() string { if m != nil { return m.Type @@ -87,6 +79,13 @@ func (m *Tag) GetTitle() string { return "" } +func (m *Tag) GetDescription() string { + if m != nil { + return m.Description + } + return "" +} + func (m *Tag) GetCount() int64 { if m != nil { return m.Count @@ -94,7 +93,7 @@ func (m *Tag) GetCount() int64 { return 0 } -type IncreaseCountRequest struct { +type AddRequest struct { ParentID string `protobuf:"bytes,1,opt,name=parentID,proto3" json:"parentID,omitempty"` Type string `protobuf:"bytes,2,opt,name=type,proto3" json:"type,omitempty"` Title string `protobuf:"bytes,3,opt,name=title,proto3" json:"title,omitempty"` @@ -103,84 +102,84 @@ type IncreaseCountRequest struct { XXX_sizecache int32 `json:"-"` } -func (m *IncreaseCountRequest) Reset() { *m = IncreaseCountRequest{} } -func (m *IncreaseCountRequest) String() string { return proto.CompactTextString(m) } -func (*IncreaseCountRequest) ProtoMessage() {} -func (*IncreaseCountRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_3298e21a718ae8a1, []int{1} +func (m *AddRequest) Reset() { *m = AddRequest{} } +func (m *AddRequest) String() string { return proto.CompactTextString(m) } +func (*AddRequest) ProtoMessage() {} +func (*AddRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_53c4e9b325a9c45b, []int{1} } -func (m *IncreaseCountRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_IncreaseCountRequest.Unmarshal(m, b) +func (m *AddRequest) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_AddRequest.Unmarshal(m, b) } -func (m *IncreaseCountRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_IncreaseCountRequest.Marshal(b, m, deterministic) +func (m *AddRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_AddRequest.Marshal(b, m, deterministic) } -func (m *IncreaseCountRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_IncreaseCountRequest.Merge(m, src) +func (m *AddRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_AddRequest.Merge(m, src) } -func (m *IncreaseCountRequest) XXX_Size() int { - return xxx_messageInfo_IncreaseCountRequest.Size(m) +func (m *AddRequest) XXX_Size() int { + return xxx_messageInfo_AddRequest.Size(m) } -func (m *IncreaseCountRequest) XXX_DiscardUnknown() { - xxx_messageInfo_IncreaseCountRequest.DiscardUnknown(m) +func (m *AddRequest) XXX_DiscardUnknown() { + xxx_messageInfo_AddRequest.DiscardUnknown(m) } -var xxx_messageInfo_IncreaseCountRequest proto.InternalMessageInfo +var xxx_messageInfo_AddRequest proto.InternalMessageInfo -func (m *IncreaseCountRequest) GetParentID() string { +func (m *AddRequest) GetParentID() string { if m != nil { return m.ParentID } return "" } -func (m *IncreaseCountRequest) GetType() string { +func (m *AddRequest) GetType() string { if m != nil { return m.Type } return "" } -func (m *IncreaseCountRequest) GetTitle() string { +func (m *AddRequest) GetTitle() string { if m != nil { return m.Title } return "" } -type IncreaseCountResponse struct { +type AddResponse struct { XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } -func (m *IncreaseCountResponse) Reset() { *m = IncreaseCountResponse{} } -func (m *IncreaseCountResponse) String() string { return proto.CompactTextString(m) } -func (*IncreaseCountResponse) ProtoMessage() {} -func (*IncreaseCountResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_3298e21a718ae8a1, []int{2} +func (m *AddResponse) Reset() { *m = AddResponse{} } +func (m *AddResponse) String() string { return proto.CompactTextString(m) } +func (*AddResponse) ProtoMessage() {} +func (*AddResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_53c4e9b325a9c45b, []int{2} } -func (m *IncreaseCountResponse) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_IncreaseCountResponse.Unmarshal(m, b) +func (m *AddResponse) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_AddResponse.Unmarshal(m, b) } -func (m *IncreaseCountResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_IncreaseCountResponse.Marshal(b, m, deterministic) +func (m *AddResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_AddResponse.Marshal(b, m, deterministic) } -func (m *IncreaseCountResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_IncreaseCountResponse.Merge(m, src) +func (m *AddResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_AddResponse.Merge(m, src) } -func (m *IncreaseCountResponse) XXX_Size() int { - return xxx_messageInfo_IncreaseCountResponse.Size(m) +func (m *AddResponse) XXX_Size() int { + return xxx_messageInfo_AddResponse.Size(m) } -func (m *IncreaseCountResponse) XXX_DiscardUnknown() { - xxx_messageInfo_IncreaseCountResponse.DiscardUnknown(m) +func (m *AddResponse) XXX_DiscardUnknown() { + xxx_messageInfo_AddResponse.DiscardUnknown(m) } -var xxx_messageInfo_IncreaseCountResponse proto.InternalMessageInfo +var xxx_messageInfo_AddResponse proto.InternalMessageInfo -type DecreaseCountRequest struct { +type RemoveRequest struct { ParentID string `protobuf:"bytes,1,opt,name=parentID,proto3" json:"parentID,omitempty"` Type string `protobuf:"bytes,2,opt,name=type,proto3" json:"type,omitempty"` Title string `protobuf:"bytes,3,opt,name=title,proto3" json:"title,omitempty"` @@ -189,87 +188,87 @@ type DecreaseCountRequest struct { XXX_sizecache int32 `json:"-"` } -func (m *DecreaseCountRequest) Reset() { *m = DecreaseCountRequest{} } -func (m *DecreaseCountRequest) String() string { return proto.CompactTextString(m) } -func (*DecreaseCountRequest) ProtoMessage() {} -func (*DecreaseCountRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_3298e21a718ae8a1, []int{3} +func (m *RemoveRequest) Reset() { *m = RemoveRequest{} } +func (m *RemoveRequest) String() string { return proto.CompactTextString(m) } +func (*RemoveRequest) ProtoMessage() {} +func (*RemoveRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_53c4e9b325a9c45b, []int{3} } -func (m *DecreaseCountRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_DecreaseCountRequest.Unmarshal(m, b) +func (m *RemoveRequest) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_RemoveRequest.Unmarshal(m, b) } -func (m *DecreaseCountRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_DecreaseCountRequest.Marshal(b, m, deterministic) +func (m *RemoveRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_RemoveRequest.Marshal(b, m, deterministic) } -func (m *DecreaseCountRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_DecreaseCountRequest.Merge(m, src) +func (m *RemoveRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_RemoveRequest.Merge(m, src) } -func (m *DecreaseCountRequest) XXX_Size() int { - return xxx_messageInfo_DecreaseCountRequest.Size(m) +func (m *RemoveRequest) XXX_Size() int { + return xxx_messageInfo_RemoveRequest.Size(m) } -func (m *DecreaseCountRequest) XXX_DiscardUnknown() { - xxx_messageInfo_DecreaseCountRequest.DiscardUnknown(m) +func (m *RemoveRequest) XXX_DiscardUnknown() { + xxx_messageInfo_RemoveRequest.DiscardUnknown(m) } -var xxx_messageInfo_DecreaseCountRequest proto.InternalMessageInfo +var xxx_messageInfo_RemoveRequest proto.InternalMessageInfo -func (m *DecreaseCountRequest) GetParentID() string { +func (m *RemoveRequest) GetParentID() string { if m != nil { return m.ParentID } return "" } -func (m *DecreaseCountRequest) GetType() string { +func (m *RemoveRequest) GetType() string { if m != nil { return m.Type } return "" } -func (m *DecreaseCountRequest) GetTitle() string { +func (m *RemoveRequest) GetTitle() string { if m != nil { return m.Title } return "" } -type DecreaseCountResponse struct { +type RemoveResponse struct { XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } -func (m *DecreaseCountResponse) Reset() { *m = DecreaseCountResponse{} } -func (m *DecreaseCountResponse) String() string { return proto.CompactTextString(m) } -func (*DecreaseCountResponse) ProtoMessage() {} -func (*DecreaseCountResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_3298e21a718ae8a1, []int{4} +func (m *RemoveResponse) Reset() { *m = RemoveResponse{} } +func (m *RemoveResponse) String() string { return proto.CompactTextString(m) } +func (*RemoveResponse) ProtoMessage() {} +func (*RemoveResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_53c4e9b325a9c45b, []int{4} } -func (m *DecreaseCountResponse) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_DecreaseCountResponse.Unmarshal(m, b) +func (m *RemoveResponse) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_RemoveResponse.Unmarshal(m, b) } -func (m *DecreaseCountResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_DecreaseCountResponse.Marshal(b, m, deterministic) +func (m *RemoveResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_RemoveResponse.Marshal(b, m, deterministic) } -func (m *DecreaseCountResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_DecreaseCountResponse.Merge(m, src) +func (m *RemoveResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_RemoveResponse.Merge(m, src) } -func (m *DecreaseCountResponse) XXX_Size() int { - return xxx_messageInfo_DecreaseCountResponse.Size(m) +func (m *RemoveResponse) XXX_Size() int { + return xxx_messageInfo_RemoveResponse.Size(m) } -func (m *DecreaseCountResponse) XXX_DiscardUnknown() { - xxx_messageInfo_DecreaseCountResponse.DiscardUnknown(m) +func (m *RemoveResponse) XXX_DiscardUnknown() { + xxx_messageInfo_RemoveResponse.DiscardUnknown(m) } -var xxx_messageInfo_DecreaseCountResponse proto.InternalMessageInfo +var xxx_messageInfo_RemoveResponse proto.InternalMessageInfo type UpdateRequest struct { - ParentID string `protobuf:"bytes,1,opt,name=parentID,proto3" json:"parentID,omitempty"` - Type string `protobuf:"bytes,2,opt,name=type,proto3" json:"type,omitempty"` - Title string `protobuf:"bytes,3,opt,name=title,proto3" json:"title,omitempty"` + Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` + Title string `protobuf:"bytes,2,opt,name=title,proto3" json:"title,omitempty"` + Description string `protobuf:"bytes,3,opt,name=description,proto3" json:"description,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -279,7 +278,7 @@ func (m *UpdateRequest) Reset() { *m = UpdateRequest{} } func (m *UpdateRequest) String() string { return proto.CompactTextString(m) } func (*UpdateRequest) ProtoMessage() {} func (*UpdateRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_3298e21a718ae8a1, []int{5} + return fileDescriptor_53c4e9b325a9c45b, []int{5} } func (m *UpdateRequest) XXX_Unmarshal(b []byte) error { @@ -300,13 +299,6 @@ func (m *UpdateRequest) XXX_DiscardUnknown() { var xxx_messageInfo_UpdateRequest proto.InternalMessageInfo -func (m *UpdateRequest) GetParentID() string { - if m != nil { - return m.ParentID - } - return "" -} - func (m *UpdateRequest) GetType() string { if m != nil { return m.Type @@ -321,6 +313,13 @@ func (m *UpdateRequest) GetTitle() string { return "" } +func (m *UpdateRequest) GetDescription() string { + if m != nil { + return m.Description + } + return "" +} + type UpdateResponse struct { XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` @@ -331,7 +330,7 @@ func (m *UpdateResponse) Reset() { *m = UpdateResponse{} } func (m *UpdateResponse) String() string { return proto.CompactTextString(m) } func (*UpdateResponse) ProtoMessage() {} func (*UpdateResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_3298e21a718ae8a1, []int{6} + return fileDescriptor_53c4e9b325a9c45b, []int{6} } func (m *UpdateResponse) XXX_Unmarshal(b []byte) error { @@ -368,7 +367,7 @@ func (m *ListRequest) Reset() { *m = ListRequest{} } func (m *ListRequest) String() string { return proto.CompactTextString(m) } func (*ListRequest) ProtoMessage() {} func (*ListRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_3298e21a718ae8a1, []int{7} + return fileDescriptor_53c4e9b325a9c45b, []int{7} } func (m *ListRequest) XXX_Unmarshal(b []byte) error { @@ -428,7 +427,7 @@ func (m *ListResponse) Reset() { *m = ListResponse{} } func (m *ListResponse) String() string { return proto.CompactTextString(m) } func (*ListResponse) ProtoMessage() {} func (*ListResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_3298e21a718ae8a1, []int{8} + return fileDescriptor_53c4e9b325a9c45b, []int{8} } func (m *ListResponse) XXX_Unmarshal(b []byte) error { @@ -458,40 +457,43 @@ func (m *ListResponse) GetTags() []*Tag { func init() { proto.RegisterType((*Tag)(nil), "tags.Tag") - proto.RegisterType((*IncreaseCountRequest)(nil), "tags.IncreaseCountRequest") - proto.RegisterType((*IncreaseCountResponse)(nil), "tags.IncreaseCountResponse") - proto.RegisterType((*DecreaseCountRequest)(nil), "tags.DecreaseCountRequest") - proto.RegisterType((*DecreaseCountResponse)(nil), "tags.DecreaseCountResponse") + proto.RegisterType((*AddRequest)(nil), "tags.AddRequest") + proto.RegisterType((*AddResponse)(nil), "tags.AddResponse") + proto.RegisterType((*RemoveRequest)(nil), "tags.RemoveRequest") + proto.RegisterType((*RemoveResponse)(nil), "tags.RemoveResponse") proto.RegisterType((*UpdateRequest)(nil), "tags.UpdateRequest") proto.RegisterType((*UpdateResponse)(nil), "tags.UpdateResponse") proto.RegisterType((*ListRequest)(nil), "tags.ListRequest") proto.RegisterType((*ListResponse)(nil), "tags.ListResponse") } -func init() { proto.RegisterFile("blog/tags/proto/tags.proto", fileDescriptor_3298e21a718ae8a1) } - -var fileDescriptor_3298e21a718ae8a1 = []byte{ - // 341 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x53, 0x41, 0x4f, 0x32, 0x31, - 0x10, 0x65, 0xd9, 0x42, 0x60, 0xf8, 0xf8, 0xa2, 0x23, 0xc6, 0xa6, 0xc6, 0x84, 0xec, 0x89, 0x8b, - 0x90, 0x60, 0xfc, 0x05, 0x72, 0xc1, 0x78, 0xda, 0xc0, 0xcd, 0x4b, 0xc1, 0xa6, 0x21, 0xc1, 0xdd, - 0x95, 0x76, 0x13, 0xfd, 0x03, 0xfe, 0x6e, 0xd3, 0xe9, 0xee, 0x86, 0x25, 0x7b, 0xd1, 0xe8, 0x6d, - 0xe6, 0x4d, 0xfb, 0xde, 0x4c, 0xdf, 0x14, 0xc4, 0x66, 0x9f, 0xea, 0x99, 0x95, 0xda, 0xcc, 0xb2, - 0x43, 0x6a, 0x53, 0x0a, 0xa7, 0x14, 0x22, 0x73, 0x71, 0x94, 0x43, 0xb8, 0x92, 0x1a, 0x05, 0xf4, - 0x32, 0x79, 0x50, 0x89, 0x5d, 0x2e, 0x78, 0x30, 0x0e, 0x26, 0xfd, 0xb8, 0xca, 0x11, 0x81, 0xd9, - 0x8f, 0x4c, 0xf1, 0x36, 0xe1, 0x14, 0x3b, 0xcc, 0xec, 0x73, 0xcd, 0x43, 0x8f, 0xb9, 0x18, 0x47, - 0xd0, 0xb1, 0x3b, 0xbb, 0x57, 0x9c, 0x11, 0xe8, 0x13, 0x87, 0x6e, 0xd3, 0x3c, 0xb1, 0xbc, 0x33, - 0x0e, 0x26, 0x61, 0xec, 0x93, 0xe8, 0x19, 0x46, 0xcb, 0x64, 0x7b, 0x50, 0xd2, 0xa8, 0x07, 0x07, - 0xc4, 0xea, 0x2d, 0x57, 0xc6, 0x7e, 0xbb, 0x8f, 0x4a, 0x33, 0x3c, 0xd2, 0x8c, 0xae, 0xe0, 0xf2, - 0x84, 0xdd, 0x64, 0x69, 0x62, 0x94, 0x93, 0x5d, 0xa8, 0xbf, 0x94, 0x3d, 0x61, 0x2f, 0x64, 0xd7, - 0x30, 0x5c, 0x67, 0x2f, 0xd2, 0xaa, 0xdf, 0xd5, 0x3b, 0x83, 0xff, 0x25, 0x6d, 0x21, 0x94, 0xc3, - 0xe0, 0x69, 0x67, 0x7e, 0x3c, 0x96, 0x80, 0xde, 0xeb, 0x2e, 0xa1, 0xde, 0x49, 0x29, 0x8c, 0xab, - 0x9c, 0x6a, 0xf2, 0xdd, 0xd7, 0x58, 0x51, 0x2b, 0xf2, 0xe8, 0x16, 0xfe, 0x79, 0x59, 0xdf, 0x06, - 0xde, 0x00, 0x2d, 0x17, 0x0f, 0xc6, 0xe1, 0x64, 0x30, 0xef, 0x4f, 0x69, 0xeb, 0x56, 0x52, 0xc7, - 0x04, 0xcf, 0x3f, 0xdb, 0xc0, 0x56, 0x52, 0x1b, 0x7c, 0x84, 0x61, 0xcd, 0x27, 0x14, 0xfe, 0x68, - 0xd3, 0x6a, 0x88, 0xeb, 0xc6, 0x5a, 0x31, 0x78, 0xcb, 0x71, 0xd5, 0x1e, 0xbf, 0xe4, 0x6a, 0xf2, - 0xbb, 0xe4, 0x6a, 0x76, 0xab, 0x85, 0x33, 0x60, 0x6e, 0x1e, 0x3c, 0xf7, 0xc7, 0x8e, 0x9e, 0x54, - 0xe0, 0x31, 0x54, 0x5d, 0xb8, 0x87, 0xae, 0x77, 0x02, 0x2f, 0x7c, 0xbd, 0x66, 0xb7, 0x18, 0xd5, - 0xc1, 0xf2, 0xda, 0xa6, 0x4b, 0x3f, 0xf1, 0xee, 0x2b, 0x00, 0x00, 0xff, 0xff, 0xa9, 0xd1, 0x76, - 0x1f, 0xa7, 0x03, 0x00, 0x00, +func init() { + proto.RegisterFile("proto/tags.proto", fileDescriptor_53c4e9b325a9c45b) +} + +var fileDescriptor_53c4e9b325a9c45b = []byte{ + // 357 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xac, 0x53, 0x41, 0x4b, 0xf3, 0x40, + 0x10, 0x6d, 0xbb, 0x69, 0xf9, 0x3a, 0xf9, 0x2a, 0x75, 0xec, 0x21, 0x04, 0x84, 0x92, 0x53, 0x0f, + 0xda, 0x42, 0xc5, 0x1f, 0x20, 0x7a, 0x11, 0x3c, 0x05, 0x7b, 0xf2, 0x14, 0x9b, 0xa5, 0x04, 0xda, + 0x24, 0x76, 0x37, 0xa2, 0xf8, 0x33, 0xfd, 0x43, 0x66, 0x67, 0x37, 0xeb, 0x46, 0x8b, 0x07, 0xf1, + 0x36, 0xf3, 0x26, 0x3b, 0xef, 0xed, 0x7b, 0x1b, 0x18, 0x97, 0xfb, 0x42, 0x16, 0x0b, 0x99, 0x6c, + 0xc4, 0x9c, 0x4a, 0xf4, 0x54, 0x1d, 0xbd, 0x01, 0xbb, 0x4f, 0x36, 0x88, 0xe0, 0xc9, 0xd7, 0x92, + 0x07, 0xdd, 0x69, 0x77, 0x36, 0x8c, 0xa9, 0x56, 0x98, 0xd8, 0x56, 0x9b, 0xa0, 0xa7, 0x31, 0x55, + 0xe3, 0x04, 0xfa, 0x32, 0x93, 0x5b, 0x1e, 0x30, 0x02, 0x75, 0x83, 0x53, 0xf0, 0x53, 0x2e, 0xd6, + 0xfb, 0xac, 0x94, 0x59, 0x91, 0x07, 0x1e, 0xcd, 0x5c, 0x48, 0x9d, 0x5b, 0x17, 0x55, 0x2e, 0x83, + 0x7e, 0x3d, 0x63, 0xb1, 0x6e, 0xa2, 0x18, 0xe0, 0x2a, 0x4d, 0x63, 0xfe, 0x54, 0x71, 0x21, 0x31, + 0x84, 0x7f, 0x65, 0xb2, 0xe7, 0xb9, 0xbc, 0xbd, 0x31, 0x3a, 0x6c, 0x6f, 0xf5, 0xf5, 0x1c, 0x7d, + 0x07, 0xb5, 0x44, 0x23, 0xf0, 0x69, 0xa7, 0x28, 0x8b, 0x5c, 0xf0, 0x68, 0x05, 0xa3, 0x98, 0xef, + 0x8a, 0x67, 0xfe, 0xb7, 0x2c, 0x63, 0x38, 0x6a, 0xd6, 0x1a, 0xa2, 0x07, 0x18, 0xad, 0xca, 0x34, + 0x91, 0x96, 0xe8, 0x90, 0xa5, 0x76, 0x59, 0xef, 0x07, 0xfb, 0xd8, 0x37, 0xfb, 0x14, 0x5d, 0xb3, + 0xdc, 0xd0, 0x55, 0xe0, 0xdf, 0x65, 0x42, 0xfe, 0xf6, 0x56, 0xf5, 0xf7, 0xbb, 0x2c, 0xbf, 0xa6, + 0x48, 0x18, 0x45, 0x62, 0x7b, 0x9a, 0x25, 0x2f, 0x7a, 0xe6, 0x99, 0x99, 0xe9, 0xa3, 0x73, 0xf8, + 0xaf, 0x69, 0xb5, 0x0c, 0x3c, 0x05, 0x7a, 0x46, 0x35, 0x27, 0x9b, 0xf9, 0xcb, 0xe1, 0x9c, 0xde, + 0x57, 0xfd, 0xa0, 0x62, 0x82, 0x97, 0xef, 0x5d, 0xf0, 0xea, 0x4e, 0xe0, 0x19, 0xb0, 0x3a, 0x15, + 0x1c, 0xeb, 0x0f, 0x3e, 0x43, 0x0f, 0x8f, 0x1d, 0xc4, 0x5c, 0xad, 0x83, 0x97, 0x30, 0xd0, 0xee, + 0xe2, 0x89, 0x1e, 0xb7, 0x22, 0x0c, 0x27, 0x6d, 0xd0, 0x1e, 0x5b, 0x80, 0xa7, 0xc4, 0xa1, 0xd9, + 0xe9, 0xf8, 0x13, 0xa2, 0x0b, 0xb9, 0x3c, 0xda, 0xd6, 0x86, 0xa7, 0x95, 0x60, 0xc3, 0xf3, 0xc5, + 0xf9, 0xce, 0xe3, 0x80, 0x7e, 0xa0, 0x8b, 0x8f, 0x00, 0x00, 0x00, 0xff, 0xff, 0xdd, 0x86, 0xfc, + 0x24, 0x54, 0x03, 0x00, 0x00, } diff --git a/blog/tags/proto/tags.pb.micro.go b/blog/tags/proto/tags.pb.micro.go index 8692dfc..f544aae 100644 --- a/blog/tags/proto/tags.pb.micro.go +++ b/blog/tags/proto/tags.pb.micro.go @@ -1,5 +1,5 @@ // Code generated by protoc-gen-micro. DO NOT EDIT. -// source: blog/tags/proto/tags.proto +// source: proto/tags.proto package tags @@ -11,9 +11,9 @@ import ( import ( context "context" - api "github.com/micro/go-micro/v3/api" - client "github.com/micro/go-micro/v3/client" - server "github.com/micro/go-micro/v3/server" + api "github.com/micro/micro/v3/service/api" + client "github.com/micro/micro/v3/service/client" + server "github.com/micro/micro/v3/service/server" ) // Reference imports to suppress errors if they are not otherwise used. @@ -42,12 +42,13 @@ func NewTagsEndpoints() []*api.Endpoint { // Client API for Tags service type TagsService interface { - // Increase count creates the tag or bumps the counter - IncreaseCount(ctx context.Context, in *IncreaseCountRequest, opts ...client.CallOption) (*IncreaseCountResponse, error) - // Decreases the counter - DecreaseCount(ctx context.Context, in *DecreaseCountRequest, opts ...client.CallOption) (*DecreaseCountResponse, error) + // Add a tag to a parent + Add(ctx context.Context, in *AddRequest, opts ...client.CallOption) (*AddResponse, error) + // Remove a tag from a parent + Remove(ctx context.Context, in *RemoveRequest, opts ...client.CallOption) (*RemoveResponse, error) + // List tags by List(ctx context.Context, in *ListRequest, opts ...client.CallOption) (*ListResponse, error) - // Change properties of a tag, currently only the title + // Change properties of a tag, currently only the title and description Update(ctx context.Context, in *UpdateRequest, opts ...client.CallOption) (*UpdateResponse, error) } @@ -63,9 +64,9 @@ func NewTagsService(name string, c client.Client) TagsService { } } -func (c *tagsService) IncreaseCount(ctx context.Context, in *IncreaseCountRequest, opts ...client.CallOption) (*IncreaseCountResponse, error) { - req := c.c.NewRequest(c.name, "Tags.IncreaseCount", in) - out := new(IncreaseCountResponse) +func (c *tagsService) Add(ctx context.Context, in *AddRequest, opts ...client.CallOption) (*AddResponse, error) { + req := c.c.NewRequest(c.name, "Tags.Add", in) + out := new(AddResponse) err := c.c.Call(ctx, req, out, opts...) if err != nil { return nil, err @@ -73,9 +74,9 @@ func (c *tagsService) IncreaseCount(ctx context.Context, in *IncreaseCountReques return out, nil } -func (c *tagsService) DecreaseCount(ctx context.Context, in *DecreaseCountRequest, opts ...client.CallOption) (*DecreaseCountResponse, error) { - req := c.c.NewRequest(c.name, "Tags.DecreaseCount", in) - out := new(DecreaseCountResponse) +func (c *tagsService) Remove(ctx context.Context, in *RemoveRequest, opts ...client.CallOption) (*RemoveResponse, error) { + req := c.c.NewRequest(c.name, "Tags.Remove", in) + out := new(RemoveResponse) err := c.c.Call(ctx, req, out, opts...) if err != nil { return nil, err @@ -106,19 +107,20 @@ func (c *tagsService) Update(ctx context.Context, in *UpdateRequest, opts ...cli // Server API for Tags service type TagsHandler interface { - // Increase count creates the tag or bumps the counter - IncreaseCount(context.Context, *IncreaseCountRequest, *IncreaseCountResponse) error - // Decreases the counter - DecreaseCount(context.Context, *DecreaseCountRequest, *DecreaseCountResponse) error + // Add a tag to a parent + Add(context.Context, *AddRequest, *AddResponse) error + // Remove a tag from a parent + Remove(context.Context, *RemoveRequest, *RemoveResponse) error + // List tags by List(context.Context, *ListRequest, *ListResponse) error - // Change properties of a tag, currently only the title + // Change properties of a tag, currently only the title and description Update(context.Context, *UpdateRequest, *UpdateResponse) error } func RegisterTagsHandler(s server.Server, hdlr TagsHandler, opts ...server.HandlerOption) error { type tags interface { - IncreaseCount(ctx context.Context, in *IncreaseCountRequest, out *IncreaseCountResponse) error - DecreaseCount(ctx context.Context, in *DecreaseCountRequest, out *DecreaseCountResponse) error + Add(ctx context.Context, in *AddRequest, out *AddResponse) error + Remove(ctx context.Context, in *RemoveRequest, out *RemoveResponse) error List(ctx context.Context, in *ListRequest, out *ListResponse) error Update(ctx context.Context, in *UpdateRequest, out *UpdateResponse) error } @@ -133,12 +135,12 @@ type tagsHandler struct { TagsHandler } -func (h *tagsHandler) IncreaseCount(ctx context.Context, in *IncreaseCountRequest, out *IncreaseCountResponse) error { - return h.TagsHandler.IncreaseCount(ctx, in, out) +func (h *tagsHandler) Add(ctx context.Context, in *AddRequest, out *AddResponse) error { + return h.TagsHandler.Add(ctx, in, out) } -func (h *tagsHandler) DecreaseCount(ctx context.Context, in *DecreaseCountRequest, out *DecreaseCountResponse) error { - return h.TagsHandler.DecreaseCount(ctx, in, out) +func (h *tagsHandler) Remove(ctx context.Context, in *RemoveRequest, out *RemoveResponse) error { + return h.TagsHandler.Remove(ctx, in, out) } func (h *tagsHandler) List(ctx context.Context, in *ListRequest, out *ListResponse) error { diff --git a/blog/tags/proto/tags.proto b/blog/tags/proto/tags.proto index 370a5a4..b381671 100644 --- a/blog/tags/proto/tags.proto +++ b/blog/tags/proto/tags.proto @@ -3,46 +3,46 @@ syntax = "proto3"; package tags; service Tags { - // Increase count creates the tag or bumps the counter - rpc IncreaseCount(IncreaseCountRequest) returns (IncreaseCountResponse) {} - // Decreases the counter - rpc DecreaseCount(DecreaseCountRequest) returns (DecreaseCountResponse) {} + // Add a tag to a parent + rpc Add(AddRequest) returns (AddResponse) {} + // Remove a tag from a parent + rpc Remove(RemoveRequest) returns (RemoveResponse) {} + // List tags by rpc List(ListRequest) returns (ListResponse) {} - // Change properties of a tag, currently only the title + // Change properties of a tag, currently only the title and description rpc Update(UpdateRequest) returns (UpdateResponse){} } message Tag { - // The id of the parent object - string parentID = 1; // Type is useful for namespacing and listing across parents, // ie. list tags for posts, customers etc. - string type = 2; - string slug = 3; - string title = 4; + string type = 1; + string slug = 2; + string title = 3; + string description = 4; int64 count = 5; } -message IncreaseCountRequest { +message AddRequest { string parentID = 1; string type = 2; string title = 3; } -message IncreaseCountResponse{} +message AddResponse{} -message DecreaseCountRequest{ +message RemoveRequest { string parentID = 1; string type = 2; string title = 3; } -message DecreaseCountResponse{} +message RemoveResponse{} message UpdateRequest { - string parentID = 1; - string type = 2; - string title = 3; + string type = 1; + string title = 2; + string description = 3; } message UpdateResponse{} diff --git a/logger/go.mod b/logger/go.mod deleted file mode 100644 index 885913f..0000000 --- a/logger/go.mod +++ /dev/null @@ -1,21 +0,0 @@ -module logger - -go 1.13 - -replace google.golang.org/grpc => google.golang.org/grpc v1.26.0 - -replace github.com/micro/micro/v3 => ../../.. - -require ( - github.com/bwmarrin/discordgo v0.20.2 // indirect - github.com/cpuguy83/go-md2man/v2 v2.0.0 // indirect - github.com/forestgiant/sliceutil v0.0.0-20160425183142-94783f95db6c // indirect - github.com/go-git/go-git/v5 v5.1.0 // indirect - github.com/go-telegram-bot-api/telegram-bot-api v4.6.4+incompatible // indirect - github.com/lucas-clemente/quic-go v0.14.1 // indirect - github.com/micro/go-micro/v3 v3.0.0-beta.2.0.20200910150737-d2728b498ca8 - github.com/micro/micro/v3 v3.0.0-00010101000000-000000000000 - github.com/nlopes/slack v0.6.1-0.20191106133607-d06c2a2b3249 // indirect - github.com/technoweenie/multipartstreamer v1.0.1 // indirect - gopkg.in/telegram-bot-api.v4 v4.6.4 // indirect -) diff --git a/logger/go.sum b/logger/go.sum deleted file mode 100644 index dca5818..0000000 --- a/logger/go.sum +++ /dev/null @@ -1,783 +0,0 @@ -cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= -cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= -cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= -cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= -cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= -cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= -cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= -cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= -cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= -contrib.go.opencensus.io/exporter/ocagent v0.4.12/go.mod h1:450APlNTSR6FrvC3CTRqYosuDstRB9un7SOx2k/9ckA= -dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -github.com/Azure/azure-sdk-for-go v32.4.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= -github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= -github.com/Azure/go-autorest/autorest v0.1.0/go.mod h1:AKyIcETwSUFxIcs/Wnq/C+kwCtlEYGUVd7FPNb2slmg= -github.com/Azure/go-autorest/autorest v0.5.0/go.mod h1:9HLKlQjVBH6U3oDfsXOeVc56THsLPw1L03yban4xThw= -github.com/Azure/go-autorest/autorest/adal v0.1.0/go.mod h1:MeS4XhScH55IST095THyTxElntu7WqB7pNbZo8Q5G3E= -github.com/Azure/go-autorest/autorest/adal v0.2.0/go.mod h1:MeS4XhScH55IST095THyTxElntu7WqB7pNbZo8Q5G3E= -github.com/Azure/go-autorest/autorest/azure/auth v0.1.0/go.mod h1:Gf7/i2FUpyb/sGBLIFxTBzrNzBo7aPXXE3ZVeDRwdpM= -github.com/Azure/go-autorest/autorest/azure/cli v0.1.0/go.mod h1:Dk8CUAt/b/PzkfeRsWzVG9Yj3ps8mS8ECztu43rdU8U= -github.com/Azure/go-autorest/autorest/date v0.1.0/go.mod h1:plvfp3oPSKwf2DNjlBjWF/7vwR+cUD/ELuzDCXwHUVA= -github.com/Azure/go-autorest/autorest/mocks v0.1.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= -github.com/Azure/go-autorest/autorest/to v0.2.0/go.mod h1:GunWKJp1AEqgMaGLV+iocmRAJWqST1wQYhyyjXJ3SJc= -github.com/Azure/go-autorest/autorest/validation v0.1.0/go.mod h1:Ha3z/SqBeaalWQvokg3NZAlQTalVMtOIAs1aGK7G6u8= -github.com/Azure/go-autorest/logger v0.1.0/go.mod h1:oExouG+K6PryycPJfVSxi/koC6LSNgds39diKLz7Vrc= -github.com/Azure/go-autorest/tracing v0.1.0/go.mod h1:ROEEAFwXycQw7Sn3DXNtEedEvdeRAgDr0izn4z5Ij88= -github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/DataDog/datadog-go v2.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= -github.com/Microsoft/go-winio v0.4.15-0.20190919025122-fc70bd9a86b5/go.mod h1:tTuCMEN+UleMWgg9dVx4Hu52b1bJo+59jBh3ajtinzw= -github.com/Microsoft/hcsshim v0.8.7-0.20191101173118-65519b62243c/go.mod h1:7xhjOwRV2+0HXGmM0jxaEu+ZiXJFoVZOTfL/dmqbrD8= -github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/OpenDNS/vegadns2client v0.0.0-20180418235048-a3fa4a771d87/go.mod h1:iGLljf5n9GjT6kc0HBvyI1nOKnGQbNB66VzSNbK5iks= -github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo= -github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI= -github.com/akamai/AkamaiOPEN-edgegrid-golang v0.9.0/go.mod h1:zpDJeKyp9ScW4NNrbdr+Eyxvry3ilGPewKoXw3XGN1k= -github.com/alangpierce/go-forceexport v0.0.0-20160317203124-8f1d6941cd75/go.mod h1:uAXEEpARkRhCZfEvy/y0Jcc888f9tHCc1W7/UeEtreE= -github.com/alcortesm/tgz v0.0.0-20161220082320-9c5fe88206d7/go.mod h1:6zEj6s6u/ghQa61ZWa/C2Aw3RkjiTBOix7dkqa1VLIs= -github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/aliyun/alibaba-cloud-sdk-go v0.0.0-20190808125512-07798873deee/go.mod h1:myCDvQSzCW+wB1WAlocEru4wMGJxy+vlxHdhegi1CDQ= -github.com/aliyun/aliyun-oss-go-sdk v0.0.0-20190307165228-86c17b95fcd5/go.mod h1:T/Aws4fEfogEE9v+HPhhw+CntffsBHJ8nXQCwKr0/g8= -github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c= -github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= -github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= -github.com/armon/go-metrics v0.0.0-20190430140413-ec5e00d3c878/go.mod h1:3AMJUQhVx52RsWOnlkpikZr01T/yAVN2gn0861vByNg= -github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= -github.com/aws/aws-sdk-go v1.23.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= -github.com/baiyubin/aliyun-sts-go-sdk v0.0.0-20180326062324-cfa1a18b161f/go.mod h1:AuiFmCCPBSrqvVMvuqFuk0qogytodnVFVSN5CeJB8Gc= -github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= -github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= -github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/bitly/go-simplejson v0.5.0 h1:6IH+V8/tVMab511d5bn4M7EwGXZf9Hj6i2xSwkNEM+Y= -github.com/bitly/go-simplejson v0.5.0/go.mod h1:cXHtHw4XUPsvGaxgjIAn8PhEWG9NfngEKAMDJEczWVA= -github.com/blang/semver v3.1.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= -github.com/blang/semver v3.5.1+incompatible h1:cQNTCjp13qL8KC3Nbxr/y2Bqb63oX6wdnnjpJbkM4JQ= -github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= -github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4= -github.com/boltdb/bolt v1.3.1/go.mod h1:clJnj/oiGkjum5o1McbSZDSLxVThjynRyGBgiAx27Ps= -github.com/bradfitz/gomemcache v0.0.0-20190913173617-a41fca850d0b/go.mod h1:H0wQNHz2YrLsuXOZozoeDmnHXkNCRmMW0gwFWDfEZDA= -github.com/bwmarrin/discordgo v0.20.2/go.mod h1:O9S4p+ofTFwB02em7jkpkV8M3R0/PUVOwN61zSZ0r4Q= -github.com/caddyserver/certmagic v0.10.6/go.mod h1:Y8jcUBctgk/IhpAzlHKfimZNyXCkfGgRTC0orl8gROQ= -github.com/cenkalti/backoff/v4 v4.0.0/go.mod h1:eEew/i+1Q6OrCDZh3WiXYv3+nJwBASZ8Bog/87DQnVg= -github.com/census-instrumentation/opencensus-proto v0.2.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= -github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cheekybits/genny v1.0.0/go.mod h1:+tQajlRqAUrPI7DOSpB0XAqZYtQakVtB7wXkRAgjxjQ= -github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= -github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= -github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= -github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cloudflare/cloudflare-go v0.10.2/go.mod h1:qhVI5MKwBGhdNU89ZRz2plgYutcJ5PCekLxXn56w6SY= -github.com/cloudflare/cloudflare-go v0.10.9/go.mod h1:5TrsWH+3f4NV6WjtS5QFp+DifH81rph40gU374Sh0dQ= -github.com/containerd/cgroups v0.0.0-20190919134610-bf292b21730f/go.mod h1:OApqhQ4XNSNC13gXIwDjhOQxjWa/NxkwZXJ1EvqT0ko= -github.com/containerd/console v0.0.0-20180822173158-c12b1e7919c1/go.mod h1:Tj/on1eG8kiEhd0+fhSDzsPAFESxzBBvdyEgyryXffw= -github.com/containerd/containerd v1.3.0-beta.2.0.20190828155532-0293cbd26c69/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.3.0/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/continuity v0.0.0-20190426062206-aaeac12a7ffc/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= -github.com/containerd/fifo v0.0.0-20190226154929-a9fb20d87448/go.mod h1:ODA38xgv3Kuk8dQz2ZQXpnv/UZZUHUCL7pnLehbXgQI= -github.com/containerd/go-runc v0.0.0-20180907222934-5a6d9f37cfa3/go.mod h1:IV7qH3hrUgRmyYrtgEeGWJfWbgcHL9CSRruz2Vqcph0= -github.com/containerd/ttrpc v0.0.0-20190828154514-0e0f228740de/go.mod h1:PvCDdDGpgqzQIzDW1TphrGLssLDZp2GuS+X5DkEJB8o= -github.com/containerd/typeurl v0.0.0-20180627222232-a93fcdb778cd/go.mod h1:Cm3kwCdlkCfMSHURc+r6fwoGH6/F1hH3S4sg0rLFWPc= -github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= -github.com/coreos/bbolt v1.3.3/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= -github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/etcd v3.3.18+incompatible h1:Zz1aXgDrFFi1nadh58tA9ktt06cmPTwNNP3dXwIq1lE= -github.com/coreos/etcd v3.3.18+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/etcd v3.3.25+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd v0.0.0-20190719114852-fd7a80b32e1f h1:JOrtw2xFKzlg+cbHpyrpLDmnN1HqhBfnX7WDiW7eG2c= -github.com/coreos/go-systemd v0.0.0-20190719114852-fd7a80b32e1f/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f h1:lBNOc5arjvs8E5mO2tbpBpLoyyu8B6e44T7hJy6potg= -github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/cpu/goacmedns v0.0.1/go.mod h1:sesf/pNnCYwUevQEQfEwY0Y3DydlQWSGZbaMElOWxok= -github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/cpuguy83/go-md2man/v2 v2.0.0 h1:EoUDS0afbrsXAZ9YQ9jdu/mZ2sXgT1/2yyNng4PGlyM= -github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM= -github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= -github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= -github.com/dimchansky/utfbom v1.1.0/go.mod h1:rO41eb7gLfo8SF1jd9F8HplJm1Fewwi4mQvIirEdv+8= -github.com/dnaeon/go-vcr v0.0.0-20180814043457-aafff18a5cc2/go.mod h1:aBB1+wY4s93YsC3HHjMBMrwTj2R9FHDzUr9KyGc8n1E= -github.com/dnsimple/dnsimple-go v0.30.0/go.mod h1:O5TJ0/U6r7AfT8niYNlmohpLbCSG+c71tQlGr9SeGrg= -github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= -github.com/docker/docker v1.4.2-0.20191101170500-ac7306503d23/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= -github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= -github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= -github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU= -github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= -github.com/ef-ds/deque v1.0.4-0.20190904040645-54cb57c252a1/go.mod h1:HvODWzv6Y6kBf3Ah2WzN1bHjDUezGLaAhwuWVwfpEJs= -github.com/emirpasic/gods v1.12.0 h1:QAUIPSaCu4G+POclxeqb3F+WPpdKqFGlw36+yOzGlrg= -github.com/emirpasic/gods v1.12.0/go.mod h1:YfzfFFoVP/catgzJb4IKIqXjX78Ha8FMSDh3ymbK86o= -github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/evanphx/json-patch/v5 v5.0.0/go.mod h1:G79N1coSVB93tBe7j6PhzjmR3/2VvlbKOFpnXhI9Bw4= -github.com/exoscale/egoscale v0.18.1/go.mod h1:Z7OOdzzTOz1Q1PjQXumlz9Wn/CddH0zSYdCF3rnBKXE= -github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= -github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= -github.com/forestgiant/sliceutil v0.0.0-20160425183142-94783f95db6c/go.mod h1:pFdJbAhRf7rh6YYMUdIQGyzne6zYL1tCUW8QV2B3UfY= -github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I= -github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= -github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -github.com/fsouza/go-dockerclient v1.6.0/go.mod h1:YWwtNPuL4XTX1SKJQk86cWPmmqwx+4np9qfPbb+znGc= -github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= -github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/gliderlabs/ssh v0.2.2/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= -github.com/go-acme/lego/v3 v3.4.0/go.mod h1:xYbLDuxq3Hy4bMUT1t9JIuz6GWIWb3m5X+TeTHYaT7M= -github.com/go-cmd/cmd v1.0.5/go.mod h1:y8q8qlK5wQibcw63djSl/ntiHUHXHGdCkPk0j4QeW4s= -github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= -github.com/go-git/gcfg v1.5.0 h1:Q5ViNfGF8zFgyJWPqYwA7qGFoMTEiBmdlkcfRmpIMa4= -github.com/go-git/gcfg v1.5.0/go.mod h1:5m20vg6GwYabIxaOonVkTdrILxQMpEShl1xiMF4ua+E= -github.com/go-git/go-billy/v5 v5.0.0 h1:7NQHvd9FVid8VL4qVUMm8XifBK+2xCoZ2lSk0agRrHM= -github.com/go-git/go-billy/v5 v5.0.0/go.mod h1:pmpqyWchKfYfrkb/UVH4otLvyi/5gJlGI4Hb3ZqZ3W0= -github.com/go-git/go-git-fixtures/v4 v4.0.1/go.mod h1:m+ICp2rF3jDhFgEZ/8yziagdT1C+ZpZcrJjappBCDSw= -github.com/go-git/go-git/v5 v5.1.0 h1:HxJn9g/E7eYvKW3Fm7Jt4ee8LXfPOm/H1cdDu8vEssk= -github.com/go-git/go-git/v5 v5.1.0/go.mod h1:ZKfuPUoY1ZqIG4QG9BDBh3G4gLM5zvPuSJAozQrZuyM= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-ini/ini v1.44.0/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8= -github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-log/log v0.2.0/go.mod h1:xzCnwajcues/6w7lne3yK2QU7DBPW7kqbgPGG5AF65U= -github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= -github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= -github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= -github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/go-telegram-bot-api/telegram-bot-api v4.6.4+incompatible/go.mod h1:qf9acutJ8cwBUhm1bqgz6Bei9/C/c93FPDljKWwsOgM= -github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo= -github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= -github.com/gobwas/ws v1.0.3/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM= -github.com/godbus/dbus v0.0.0-20190422162347-ade71ed3457e/go.mod h1:bBOAhwG1umN6/6ZUMtDFBMQR8jRg9O75tm9K00oMsK4= -github.com/gofrs/uuid v3.2.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= -github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= -github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= -github.com/gogo/protobuf v1.2.1 h1:/s5zKNz0uPFCZ5hddgPdo2TK2TVrUNMn0OOX8/aZMTE= -github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= -github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= -github.com/goji/httpauth v0.0.0-20160601135302-2da839ab0f4d/go.mod h1:nnjvkQ9ptGaCkuDUx6wNykzzlUixGxvkme+H/lnzb+A= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.0/go.mod h1:Qd/q+1AKNOZr9uGQzbzCmRO6sUih6GTPZv6a1/R87v0= -github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= -github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= -github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= -github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= -github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= -github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= -github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= -github.com/golang/protobuf v1.4.2 h1:+Z5KGCizgyZCbGh1KZqA0fcLLkwbsjIzS4aV2v7wJX0= -github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= -github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-github/v30 v30.1.0 h1:VLDx+UolQICEOKu2m4uAoMti1SxuEBAl7RSEG16L+Oo= -github.com/google/go-github/v30 v30.1.0/go.mod h1:n8jBpHl45a/rlBUtRJMOG4GhNADUQFEufcolZ95JfU8= -github.com/google/go-querystring v1.0.0 h1:Xkwi/a1rcvNg1PPYe5vI8GbeBY/jrVuDX5ASuANWTrk= -github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= -github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/martian v2.1.0+incompatible h1:/CP5g8u/VJHijgedC/Legn3BAbAaWPgecwXBIDzw5no= -github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= -github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY= -github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.1.2 h1:EVhdT+1Kseyi1/pUmXKaFxYsDNy9RQYkMWRH68J/W7Y= -github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= -github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/gophercloud/gophercloud v0.3.0/go.mod h1:vxM41WHh5uqHVBMZHzuwNOHh8XEoIEcSTewFxm1c5g8= -github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= -github.com/gorilla/handlers v1.4.2/go.mod h1:Qkdc/uu4tH4g6mTK6auzZ766c4CA0Ng8+o/OAirnOIQ= -github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= -github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= -github.com/gorilla/websocket v1.2.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= -github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= -github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= -github.com/grpc-ecosystem/go-grpc-middleware v1.1.0/go.mod h1:f5nM7jw/oeRSadq3xCzHAvxcr8HZnzsqU6ILg/0NiiE= -github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= -github.com/grpc-ecosystem/grpc-gateway v1.8.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= -github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= -github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= -github.com/h2non/parth v0.0.0-20190131123155-b4df798d6542/go.mod h1:Ow0tF8D4Kplbc8s8sSb3V2oUCygFHVp8gC3Dn6U4MNI= -github.com/hashicorp/errwrap v0.0.0-20141028054710-7554cd9344ce/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= -github.com/hashicorp/go-cleanhttp v0.5.1 h1:dH3aiDG9Jvb5r5+bYHsikaOUIpcM0xvgMXVoDkXMzJM= -github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= -github.com/hashicorp/go-hclog v0.9.1/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ= -github.com/hashicorp/go-hclog v0.9.2/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ= -github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-msgpack v0.5.5/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= -github.com/hashicorp/go-multierror v0.0.0-20161216184304-ed905158d874/go.mod h1:JMRHfdO9jKNzS/+BTlxCjKNQHg/jZAft8U7LloJvN7I= -github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= -github.com/hashicorp/go-retryablehttp v0.6.4 h1:BbgctKO892xEyOXnGiaAwIoSq1QZ/SS4AhjoAh9DnfY= -github.com/hashicorp/go-retryablehttp v0.6.4/go.mod h1:vAew36LZh98gCBJNLH42IQ1ER/9wtLZZ8meHqQvEYWY= -github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-version v1.2.1 h1:zEfKbn2+PDgroKdiOzqiE8rsmLqU2uwi5PB5pBJ3TkI= -github.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= -github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.3/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= -github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= -github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -github.com/hashicorp/raft v1.1.2/go.mod h1:vPAJM8Asw6u8LxC3eJCUZmRP/E4QmUGE1R7g7k8sG/8= -github.com/hashicorp/raft-boltdb v0.0.0-20171010151810-6e5ba93211ea/go.mod h1:pNv7Wc3ycL6F5oOWn+tPGo2gWD4a5X+yp/ntwdKLjRk= -github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI= -github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/iij/doapi v0.0.0-20190504054126-0bbf12d6d7df/go.mod h1:QMZY7/J/KSQEhKWFeDesPjMj+wCHReeknARU3wqlyN4= -github.com/imdario/mergo v0.3.9 h1:UauaLniWCFHWd+Jp9oCEkTBj8VO/9DKg3PV3VCNMDIg= -github.com/imdario/mergo v0.3.9/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= -github.com/inconshreveable/go-update v0.0.0-20160112193335-8152e7eb6ccf h1:WfD7VjIE6z8dIvMsI4/s+1qr5EL+zoIGev1BQj1eoJ8= -github.com/inconshreveable/go-update v0.0.0-20160112193335-8152e7eb6ccf/go.mod h1:hyb9oH7vZsitZCiBt0ZvifOrB+qc8PS5IiilCIb87rg= -github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A= -github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo= -github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= -github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= -github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= -github.com/json-iterator/go v1.1.5/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= -github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= -github.com/juju/fslock v0.0.0-20160525022230-4d5c94c67b4b h1:FQ7+9fxhyp82ks9vAuyPzG0/vVbWwMwLJ+P6yJI5FN8= -github.com/juju/fslock v0.0.0-20160525022230-4d5c94c67b4b/go.mod h1:HMcgvsgd0Fjj4XXDkbjdmlbI505rUPBs6WBMYg2pXks= -github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= -github.com/kevinburke/ssh_config v0.0.0-20190725054713-01f96b0aa0cd h1:Coekwdh0v2wtGp9Gmz1Ze3eVRAWJMLokvN3QjdzCHLY= -github.com/kevinburke/ssh_config v0.0.0-20190725054713-01f96b0aa0cd/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= -github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= -github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= -github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/cpuid v1.2.3/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= -github.com/kolo/xmlrpc v0.0.0-20190717152603-07c4ee3fd181/go.mod h1:o03bZfuBwAXHetKXuInt4S7omeXUu62/A845kiycsSQ= -github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/labbsr0x/bindman-dns-webhook v1.0.2/go.mod h1:p6b+VCXIR8NYKpDr8/dg1HKfQoRHCdcsROXKvmoehKA= -github.com/labbsr0x/goh v1.0.1/go.mod h1:8K2UhVoaWXcCU7Lxoa2omWnC8gyW8px7/lmO61c027w= -github.com/lib/pq v1.3.0 h1:/qkRGz8zljWiDcFvgpwUpwIAPu3r07TDvs3Rws+o/pU= -github.com/lib/pq v1.3.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= -github.com/lib/pq v1.7.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= -github.com/lib/pq v1.8.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= -github.com/linode/linodego v0.10.0/go.mod h1:cziNP7pbvE3mXIPneHj0oRY8L1WtGEIKlZ8LANE4eXA= -github.com/liquidweb/liquidweb-go v1.6.0/go.mod h1:UDcVnAMDkZxpw4Y7NOHkqoeiGacVLEIG/i5J9cyixzQ= -github.com/lucas-clemente/quic-go v0.14.1/go.mod h1:Vn3/Fb0/77b02SGhQk36KzOUmXgVpFfizUfW5WMaqyU= -github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/marten-seemann/chacha20 v0.2.0/go.mod h1:HSdjFau7GzYRj+ahFNwsO3ouVJr1HFkWoEwNDb4TMtE= -github.com/marten-seemann/qpack v0.1.0/go.mod h1:LFt1NU/Ptjip0C2CPkhimBz5CGE3WGDAUWqna+CNTrI= -github.com/marten-seemann/qtls v0.4.1/go.mod h1:pxVXcHHw1pNIt8Qo0pwSYQEoZ8yYOOPXTCZLQQunvRc= -github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= -github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= -github.com/mattn/go-runewidth v0.0.6/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= -github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= -github.com/mattn/go-tty v0.0.0-20180219170247-931426f7535a/go.mod h1:XPvLUNfbS4fJH25nqRHfWLMa1ONC8Amw+mIA639KxkE= -github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/micro/cli/v2 v2.1.2 h1:43J1lChg/rZCC1rvdqZNFSQDrGT7qfMrtp6/ztpIkEM= -github.com/micro/cli/v2 v2.1.2/go.mod h1:EguNh6DAoWKm9nmk+k/Rg0H3lQnDxqzu5x5srOtGtYg= -github.com/micro/go-micro v1.18.0 h1:gP70EZVHpJuUIT0YWth192JmlIci+qMOEByHm83XE9E= -github.com/micro/go-micro/v2 v2.9.1 h1:+S9koIrNWARjpP6k2TZ7kt0uC9zUJtNXzIdZTZRms7Q= -github.com/micro/go-micro/v2 v2.9.1/go.mod h1:x55ZM3Puy0FyvvkR3e0ha0xsE9DFwfPSUMWAIbFY0SY= -github.com/micro/go-micro/v3 v3.0.0-alpha h1:Z4/X67Wywu7fYKKPsrnx2fVDY3+WkzuCLr5lInlvIP0= -github.com/micro/go-micro/v3 v3.0.0-alpha/go.mod h1:NmdVm6JkvzciCS0RW++AkY4VhiuzhY68Qe/WXIdCwk4= -github.com/micro/go-micro/v3 v3.0.0-alpha.0.20200728080108-cb4a2864da37 h1:vMWbrOE36kON2imFUOJXH+XaOYCGahYpIncWj9IMwxw= -github.com/micro/go-micro/v3 v3.0.0-alpha.0.20200728080108-cb4a2864da37/go.mod h1:NmdVm6JkvzciCS0RW++AkY4VhiuzhY68Qe/WXIdCwk4= -github.com/micro/go-micro/v3 v3.0.0-alpha.0.20200728125458-9813f98c8b60 h1:cV5a/lkyeKw6a/xuYf6g2eCURfKjep+x2a90qpczg4g= -github.com/micro/go-micro/v3 v3.0.0-alpha.0.20200728125458-9813f98c8b60/go.mod h1:NmdVm6JkvzciCS0RW++AkY4VhiuzhY68Qe/WXIdCwk4= -github.com/micro/go-micro/v3 v3.0.0-alpha.0.20200729124150-006bbefaf3ee h1:ki8cPHI6DH7Lj5u+kK895+MT3N2NIbxm66ba6fcf63Q= -github.com/micro/go-micro/v3 v3.0.0-alpha.0.20200729124150-006bbefaf3ee/go.mod h1:NmdVm6JkvzciCS0RW++AkY4VhiuzhY68Qe/WXIdCwk4= -github.com/micro/go-micro/v3 v3.0.0-alpha.0.20200804104301-07fef9fd33c2 h1:/5aaUNe+EBkXCC8xtnpjVkjkFcqq5/ERTe9Fi4oC0Nk= -github.com/micro/go-micro/v3 v3.0.0-alpha.0.20200804104301-07fef9fd33c2/go.mod h1:NmdVm6JkvzciCS0RW++AkY4VhiuzhY68Qe/WXIdCwk4= -github.com/micro/go-micro/v3 v3.0.0-beta.2/go.mod h1:8VQzHPkol6RwDYO4vhxJk3irqb2XDz/mM8S6j7QNXjQ= -github.com/micro/go-micro/v3 v3.0.0-beta.2.0.20200910150737-d2728b498ca8 h1:mcBiGz6lemuCxmyeLRiczuX+j+QXQktfJiLww3nd7Jc= -github.com/micro/go-micro/v3 v3.0.0-beta.2.0.20200910150737-d2728b498ca8/go.mod h1:dx3ZCcO8zr6Za0Ri05Jk0F7APdTgj15wGBHje9+S++c= -github.com/micro/go-plugins/broker/nats/v3 v3.0.0-20200908121001-4ea6f6760baf/go.mod h1:tO2vsiYt8UmWhgFxhEAhzjyf8kYLLujuqaMcJguywbU= -github.com/micro/go-plugins/events/stream/nats/v3 v3.0.0-20200908121001-4ea6f6760baf/go.mod h1:Cq7p9FXF50cW6fvGHqyP60pQRHhkLdzPQXnj8GoHDds= -github.com/micro/go-plugins/metrics/prometheus/v3 v3.0.0-20200908121001-4ea6f6760baf/go.mod h1:gIRIjMSjfvovtBizygGGKq1hzoLkgB+ipo6Yk8qyTvI= -github.com/micro/go-plugins/registry/etcd/v3 v3.0.0-20200908121001-4ea6f6760baf/go.mod h1:m1oOc/fLZH+uFri7u5c+6bVQ10bd5nB5MFjE47Z9l0w= -github.com/micro/go-plugins/store/cockroach/v3 v3.0.0-20200908121001-4ea6f6760baf/go.mod h1:PU7joUtgK+z+sAAjz/TPdM8xHQPTlfLSOPoBuG8oKuk= -github.com/micro/micro v1.18.0 h1:v+xiQOXbT9xxotLwu1nJM81t4FbruBxZSSyIdhUfujM= -github.com/micro/micro/v3 v2.9.3 h1:20tSy6OEFQFcxQpSj+MRWpwtJPzXP1upCX3V9KsG3Wk= -github.com/micro/micro/v3 v2.9.3/go.mod h1:YsjUsRTTjtBw07MnEYeglNLCZjgvrbmdQFKfTuC9AYk= -github.com/miekg/dns v1.1.15/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= -github.com/miekg/dns v1.1.27 h1:aEH/kqUzUxGJ/UHcEKdJY+ugH6WEzsEBBSPa8zuy1aM= -github.com/miekg/dns v1.1.27/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= -github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= -github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-vnc v0.0.0-20150629162542-723ed9867aed/go.mod h1:3rdaFaCv4AyBgu5ALFM0+tSuHrBh6v692nyQe3ikrq0= -github.com/mitchellh/hashstructure v1.0.0 h1:ZkRJX1CyOoTkar7p/mLS5TZU4nJ1Rn/F8u9dGS02Q3Y= -github.com/mitchellh/hashstructure v1.0.0/go.mod h1:QjSHrPWS+BGUVBYkbTZWEnOh3G1DutKwClXU/ABz6AQ= -github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/morikuni/aec v0.0.0-20170113033406-39771216ff4c/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= -github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/namedotcom/go v0.0.0-20180403034216-08470befbe04/go.mod h1:5sN+Lt1CaY4wsPvgQH/jsuJi4XO2ssZbdsIizr4CVC8= -github.com/nats-io/jwt v0.3.2 h1:+RB5hMpXUUA2dfxuhBTEkMOrYmM+gKIZYS1KjSostMI= -github.com/nats-io/jwt v0.3.2/go.mod h1:/euKqTS1ZD+zzjYrY7pseZrTtWQSjujC7xjPc8wL6eU= -github.com/nats-io/nats-server/v2 v2.1.6/go.mod h1:BL1NOtaBQ5/y97djERRVWNouMW7GT3gxnmbE/eC8u8A= -github.com/nats-io/nats-server/v2 v2.1.7/go.mod h1:rbRrRE/Iv93O/rUvZ9dh4NfT0Cm9HWjW/BqOWLGgYiE= -github.com/nats-io/nats-streaming-server v0.18.0/go.mod h1:Y9Aiif2oANuoKazQrs4wXtF3jqt6p97ODQg68lR5TnY= -github.com/nats-io/nats.go v1.9.2 h1:oDeERm3NcZVrPpdR/JpGdWHMv3oJ8yY30YwxKq+DU2s= -github.com/nats-io/nats.go v1.9.2/go.mod h1:AjGArbfyR50+afOUotNX2Xs5SYHf+CoOa5HH1eEl2HE= -github.com/nats-io/nats.go v1.10.0/go.mod h1:AjGArbfyR50+afOUotNX2Xs5SYHf+CoOa5HH1eEl2HE= -github.com/nats-io/nkeys v0.1.3/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= -github.com/nats-io/nkeys v0.1.4 h1:aEsHIssIk6ETN5m2/MD8Y4B2X7FfXrBAUdkyRvbVYzA= -github.com/nats-io/nkeys v0.1.4/go.mod h1:XdZpAbhgyyODYqjTawOnIOI7VlbKSarI9Gfy1tqEu/s= -github.com/nats-io/nuid v1.0.1 h1:5iA8DT8V7q8WK2EScv2padNa/rTESc1KdnPw4TC2paw= -github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= -github.com/nats-io/stan.go v0.7.0/go.mod h1:Ci6mUIpGQTjl++MqK2XzkWI/0vF+Bl72uScx7ejSYmU= -github.com/nbio/st v0.0.0-20140626010706-e9e8d9816f32/go.mod h1:9wM+0iRr9ahx58uYLpLIr5fm8diHn0JbqRycJi6w0Ms= -github.com/netdata/go-orchestrator v0.0.0-20190905093727-c793edba0e8f/go.mod h1:ECF8anFVCt/TfTIWVPgPrNaYJXtAtpAOF62ugDbw41A= -github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= -github.com/nlopes/slack v0.6.1-0.20191106133607-d06c2a2b3249/go.mod h1:JzQ9m3PMAqcpeCam7UaHSuBuupz7CmpjehYMayT6YOk= -github.com/nrdcg/auroradns v1.0.0/go.mod h1:6JPXKzIRzZzMqtTDgueIhTi6rFf1QvYE/HzqidhOhjw= -github.com/nrdcg/dnspod-go v0.4.0/go.mod h1:vZSoFSFeQVm2gWLMkyX61LZ8HI3BaqtHZWgPTGKr6KQ= -github.com/nrdcg/goinwx v0.6.1/go.mod h1:XPiut7enlbEdntAqalBIqcYcTEVhpv/dKWgDCX2SwKQ= -github.com/nrdcg/namesilo v0.2.1/go.mod h1:lwMvfQTyYq+BbjJd30ylEG4GPSS6PII0Tia4rRpRiyw= -github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= -github.com/olekukonko/tablewriter v0.0.1/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= -github.com/olekukonko/tablewriter v0.0.3/go.mod h1:YZeBtGzYYEsCHp2LST/u/0NDwGkRoBtmn1cIWCJiS6M= -github.com/olekukonko/tablewriter v0.0.4/go.mod h1:zq6QwlOf5SlnkVbMSr5EoBv3636FWnp+qbPhuoO21uA= -github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.12.0/go.mod h1:oUhWkIvk5aDxtKvDDuw8gItl8pKl42LzjC9KZE0HfGg= -github.com/onsi/gomega v1.4.2/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= -github.com/opencontainers/go-digest v0.0.0-20180430190053-c9281466c8b2/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= -github.com/opencontainers/go-digest v1.0.0-rc1/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= -github.com/opencontainers/image-spec v1.0.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= -github.com/opencontainers/runc v0.0.0-20190115041553-12f6a991201f/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= -github.com/opencontainers/runc v0.1.1/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= -github.com/opencontainers/runtime-spec v0.1.2-0.20190507144316-5b71a03e2700/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/opencontainers/runtime-tools v0.0.0-20181011054405-1d69bd0f9c39/go.mod h1:r3f7wjNzSs2extwzU3Y+6pKfobzPh+kKFJ3ofN+3nfs= -github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw= -github.com/oracle/oci-go-sdk v7.0.0+incompatible/go.mod h1:VQb79nF8Z2cwLkLS35ukwStZIg5F66tcBccjip/j888= -github.com/ovh/go-ovh v0.0.0-20181109152953-ba5adb4cf014/go.mod h1:joRatxRJaZBsY3JAOEMcoOp05CnZzsx4scTxi95DHyQ= -github.com/oxtoacart/bpool v0.0.0-20190530202638-03653db5a59c h1:rp5dCmg/yLR3mgFuSOe4oEnDDmGLROTvMragMUXpTQw= -github.com/oxtoacart/bpool v0.0.0-20190530202638-03653db5a59c/go.mod h1:X07ZCGwUbLaax7L0S3Tw4hpejzu63ZrrQiUe6W0hcy0= -github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= -github.com/patrickmn/go-cache v2.1.0+incompatible h1:HRMgzkcYKYpi3C8ajMPV8OFXaaRUnok+kx1WdO15EQc= -github.com/patrickmn/go-cache v2.1.0+incompatible/go.mod h1:3Qf8kWWT7OJRJbdiICTKqZju1ZixQ/KpMGzzAfe6+WQ= -github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= -github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= -github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= -github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v0.9.2/go.mod h1:OsXs2jCmiKlQ1lTBmv21f2mNfw4xf/QclQDMrYNZzcM= -github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs= -github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= -github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= -github.com/prometheus/client_golang v1.1.0/go.mod h1:I1FGZT9+L76gKKOs5djB6ezCbFQP1xR9D75/vuwEF3g= -github.com/prometheus/client_golang v1.7.0/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= -github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= -github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= -github.com/prometheus/common v0.0.0-20181126121408-4724e9255275/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= -github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+Zk0j9GMYc= -github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= -github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.0-20181204211112-1dc9a6cbc91a/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.0.3/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= -github.com/prometheus/procfs v0.0.5/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= -github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= -github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= -github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= -github.com/rainycape/memcache v0.0.0-20150622160815-1031fa0ce2f2/go.mod h1:7tZKcyumwBO6qip7RNQ5r77yrssm9bfCowcLEBcU5IA= -github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= -github.com/rhysd/go-github-selfupdate v1.2.2 h1:G+mNzkc1wEtpmM6sFS/Ghkeq+ad4Yp6EZEHyp//wGEo= -github.com/rhysd/go-github-selfupdate v1.2.2/go.mod h1:khesvSyKcXDUxeySCedFh621iawCks0dS/QnHPcpCws= -github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= -github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/russross/blackfriday/v2 v2.0.1 h1:lPqVAte+HuHNfhJ/0LC98ESWRz8afy9tM/0RK8m9o+Q= -github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/sacloud/libsacloud v1.26.1/go.mod h1:79ZwATmHLIFZIMd7sxA3LwzVy/B77uj3LDoToVTxDoQ= -github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= -github.com/serenize/snaker v0.0.0-20171204205717-a683aaf2d516/go.mod h1:Yow6lPLSAXx2ifx470yD/nUe22Dv5vBvxK/UK9UUTVs= -github.com/sergi/go-diff v1.1.0 h1:we8PVUC3FE2uYfodKH/nBHMSetSfHDR6scGdBi+erh0= -github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= -github.com/shurcooL/sanitized_anchor_name v1.0.0 h1:PdmoCO6wvbs+7yrJyMORt4/BmY5IYyJwS/kOiWx8mHo= -github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= -github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= -github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= -github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= -github.com/skratchdot/open-golang v0.0.0-20160302144031-75fb7ed4208c/go.mod h1:sUM3LWHvSMaG192sy56D9F7CNvL7jUJVXoqM1QKLnog= -github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= -github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= -github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= -github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= -github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= -github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= -github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/viper v1.6.3/go.mod h1:jUMtyi0/lB5yZH/FjyGAoH7IMNrIhlBf6pXZmbMDvzw= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.5.1 h1:nOGnQDM7FYENwehXlg/kFVnos3rEvtKTjRvOWSzb6H4= -github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0= -github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stripe/stripe-go/v71 v71.28.0/go.mod h1:BXYwMQe+xjYomcy5/qaTGyoyVMTP3wDCHa7DVFvg8+Y= -github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= -github.com/syndtr/gocapability v0.0.0-20170704070218-db04d3cc01c8/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= -github.com/tcnksm/go-gitconfig v0.1.2 h1:iiDhRitByXAEyjgBqsKi9QU4o2TNtv9kPP3RgPgXBPw= -github.com/tcnksm/go-gitconfig v0.1.2/go.mod h1:/8EhP4H7oJZdIPyT+/UIsG87kTzrzM4UsLGSItWYCpE= -github.com/technoweenie/multipartstreamer v1.0.1/go.mod h1:jNVxdtShOxzAsukZwTSw6MDx5eUJoiEBsSvzDU9uzog= -github.com/teris-io/shortid v0.0.0-20171029131806-771a37caa5cf h1:Z2X3Os7oRzpdJ75iPqWZc0HeJWFYNCvKsfpQwFpRNTA= -github.com/teris-io/shortid v0.0.0-20171029131806-771a37caa5cf/go.mod h1:M8agBzgqHIhgj7wEn9/0hJUZcrvt9VY+Ln+S1I5Mha0= -github.com/timewasted/linode v0.0.0-20160829202747-37e84520dcf7/go.mod h1:imsgLplxEC/etjIhdr3dNzV3JeT27LbVu5pYWm0JCBY= -github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/tmc/grpc-websocket-proxy v0.0.0-20200122045848-3419fae592fc/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/transip/gotransip v0.0.0-20190812104329-6d8d9179b66f/go.mod h1:i0f4R4o2HM0m3DZYQWsj6/MEowD57VzoH0v3d7igeFY= -github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= -github.com/uber-go/atomic v1.3.2/go.mod h1:/Ct5t2lcmbJ4OSe/waGBoaVvVqtO0bmtfVNex1PFV8g= -github.com/ulikunitz/xz v0.5.5 h1:pFrO0lVpTBXLpYw+pnLj6TbvHuyjXMfjGeCwSqCVwok= -github.com/ulikunitz/xz v0.5.5/go.mod h1:2bypXElzHzzJZwzH67Y6wb67pO62Rzfn7BSiF4ABRW8= -github.com/urfave/cli v0.0.0-20171014202726-7bc6a0acffa5/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= -github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= -github.com/urfave/cli v1.22.2/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= -github.com/vultr/govultr v0.1.4/go.mod h1:9H008Uxr/C4vFNGLqKx232C206GL0PBHzOP0809bGNA= -github.com/xanzy/go-gitlab v0.35.1 h1:jJSgT0NxjCvrSZf7Gvn2NxxV9xAYkTjYrKW8XwWhrfY= -github.com/xanzy/go-gitlab v0.35.1/go.mod h1:sPLojNBn68fMUWSxIJtdVVIP8uSBYqesTfDUseX11Ug= -github.com/xanzy/ssh-agent v0.2.1 h1:TCbipTQL2JiiCprBWx9frJ2eJlCYT00NmctrHxVAr70= -github.com/xanzy/ssh-agent v0.2.1/go.mod h1:mLlQY/MoOhWBj+gOGMQkOeiEvkx+8pJSI+0Bx9h2kr4= -github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= -github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= -github.com/xeipuuv/gojsonschema v0.0.0-20180618132009-1d523034197f/go.mod h1:5yf86TLmAcydyeJq5YvxkGPE2fm/u4myDekKRoLuqhs= -github.com/xeipuuv/gojsonschema v1.1.0/go.mod h1:5yf86TLmAcydyeJq5YvxkGPE2fm/u4myDekKRoLuqhs= -github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= -github.com/xlab/treeprint v0.0.0-20181112141820-a009c3971eca/go.mod h1:ce1O1j6UtZfjr22oyGxGLbauSBp2YVXpARAosm7dHBg= -github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= -go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -go.etcd.io/bbolt v1.3.4 h1:hi1bXHMVrlQh6WwxAy+qZCV/SYIlqo+Ushwdpa4tAKg= -go.etcd.io/bbolt v1.3.4/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= -go.etcd.io/bbolt v1.3.5 h1:XAzx9gjCb0Rxj7EoqcClPD1d5ZBxZJk0jbuoPHenBt0= -go.etcd.io/bbolt v1.3.5/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= -go.etcd.io/etcd v3.3.22+incompatible/go.mod h1:yaeTdrJi5lOmYerz05bd8+V7KubZs8YSFZfzsF9A6aI= -go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= -go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= -go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= -go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= -go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/atomic v1.5.0 h1:OI5t8sDa1Or+q8AeE+yKeB/SDYioSHAgcVljj9JIETY= -go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= -go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= -go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= -go.uber.org/multierr v1.3.0 h1:sFPn2GLc3poCkfrpIXGhBD2X0CMIo4Q/zSULXrj/+uc= -go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= -go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= -go.uber.org/ratelimit v0.0.0-20180316092928-c15da0234277/go.mod h1:2X8KaoNd1J0lZV+PxJk/5+DGbO/tpwLR1m++a7FnB/Y= -go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= -go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -go.uber.org/zap v1.13.0 h1:nR6NoDBgAf67s68NhaXbsojM+2gxp3S1hWkHDl27pVU= -go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= -go.uber.org/zap v1.16.0/go.mod h1:MA8QOfq0BHJwdXa996Y4dYkAqRKB8/1K1QMMZVaNZjQ= -golang.org/x/crypto v0.0.0-20180621125126-a49355c7e3f8/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181030102418-4d3f4d9ffa16/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190219172222-a4c6cb3142f2/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190418165655-df01cb2cc480/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE= -golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190829043050-9756ffdc2472/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190927123631-a832865fa7ad/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200323165209-0ec3e9974c59/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37 h1:cg5LA/zNPRzIXIWSCxQW10Rvpy94aQh3LT/ShoCpkHw= -golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200709230013-948cd5f35899 h1:DZhuSZLsGlFL4CmhA8BcRA0mnthyA/nZ00AqCUo7vHg= -golang.org/x/crypto v0.0.0-20200709230013-948cd5f35899/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= -golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= -golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= -golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= -golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= -golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= -golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= -golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= -golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/net v0.0.0-20180611182652-db08ff08e862/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181108082009-03003ca0c849/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190125091013-d26f9f9a57f3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190228165749-92fc7df08ae7/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190930134127-c5a3c61f89f3/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191027093000-83d349e8ac1a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191126235420-ef20fe5d7933/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2 h1:eDrdRpKgkcCqKZQwyZRyeFZgfqt37SL7Kv3tok06cKE= -golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200707034311-ab3426394381 h1:VXak5I6aEWmAXeQjA+QSZzlgNrpq9mjcfDemuexIKsU= -golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20181106182150-f42d05182288/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45 h1:SVwTIAaPC2U/AvvLNZ2a7OVsmBpC8L5BlwK1whH3hm0= -golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20180622082034-63fc586f45fe/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190209173611-3b5209105503/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190221075227-b4e8571b14e0/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190514135907-3a4b5fb9f71f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190523142557-0e01d883c5c5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190801041406-cbf593c0f2f3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200523222454-059865788121 h1:rITEj+UZHYC927n8GT97eC3zrpzXdb/voyeOuVKS46o= -golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1 h1:ogLJMz+qpzav7lGMh10LMvAkM/fAoGlaiiHYiFYdm80= -golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= -golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20190921001708-c4c64cad1fd0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20191024005414-555d28b269f0 h1:/5xXl8Y5W96D+TtHSlonuFqGHIWVuyCkGJLwGh9JJFs= -golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= -golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191216052735-49a3e744a425/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200117065230-39095c1d176c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk= -google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= -google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= -google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.3.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20180831171423-11092d34479b/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= -google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1 h1:aQktFqmDE2yjveXJlVIfslDFmFnUXSqG0i6KRcJAeMc= -google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013 h1:+kGHl1aib/qcwaRi1CbqBZ1rk19r85MNUf8HaBghugY= -google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= -google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.19.1/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= -google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.22.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.26.0 h1:2dTRdpdFEEhJYQD8EMLB61nnrzSCTbG38PhqdhvOltg= -google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= -google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= -google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= -google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= -google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= -google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.0 h1:4MY060fB1DLGMB/7MBTLnwQUY6+F09GEiz6SsrNqyzM= -google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.25.0 h1:Ejskq+SyPohKW+1uil0JJMtmHCgJPJ/qWTxr8qp+R4c= -google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= -gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= -gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4= -gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/h2non/gock.v1 v1.0.15/go.mod h1:sX4zAkdYX1TRGJ2JY156cFspQn4yRWn6p9EMdODlynE= -gopkg.in/ini.v1 v1.42.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/ini.v1 v1.44.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/ns1/ns1-go.v2 v2.0.0-20190730140822-b51389932cbc/go.mod h1:VV+3haRsgDiVLxyifmMBrBIuCWFBPYKbRssXB9z67Hw= -gopkg.in/resty.v1 v1.9.1/go.mod h1:vo52Hzryw9PnPHcJfPsBiFW62XhNx5OczbV9y+IMpgc= -gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= -gopkg.in/square/go-jose.v2 v2.3.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= -gopkg.in/square/go-jose.v2 v2.4.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= -gopkg.in/telegram-bot-api.v4 v4.6.4/go.mod h1:5DpGO5dbumb40px+dXcwCpcjmeHNYLpk0bp3XRNvWDM= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -gopkg.in/warnings.v0 v0.1.2 h1:wFXVbFY8DY5/xOe1ECiWdKCzZlxgshcYVNkBHstARME= -gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= -gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= -gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.4 h1:/eiJrUcujPVeJ3xlSWaiNi3uSVmDGBK1pDHUHAnao1I= -gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= -gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU= -gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= -honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= -k8s.io/kubernetes v1.13.0/go.mod h1:ocZa8+6APFNC2tX1DZASIbocyYT5jHzqFVsY5aoB7Jk= -rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= -sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= diff --git a/blob-store/README.md b/test/blob-store/README.md similarity index 100% rename from blob-store/README.md rename to test/blob-store/README.md diff --git a/blob-store/main.go b/test/blob-store/main.go similarity index 100% rename from blob-store/main.go rename to test/blob-store/main.go diff --git a/conf/README.md b/test/conf/README.md similarity index 100% rename from conf/README.md rename to test/conf/README.md diff --git a/conf/main.go b/test/conf/main.go similarity index 100% rename from conf/main.go rename to test/conf/main.go diff --git a/events/README.md b/test/events/README.md similarity index 100% rename from events/README.md rename to test/events/README.md diff --git a/events/main.go b/test/events/main.go similarity index 98% rename from events/main.go rename to test/events/main.go index 8d56bb6..349e6c8 100644 --- a/events/main.go +++ b/test/events/main.go @@ -4,9 +4,9 @@ import ( "sync" "time" - goevents "github.com/micro/go-micro/v3/events" "github.com/micro/micro/v3/service" "github.com/micro/micro/v3/service/events" + goevents "github.com/micro/micro/v3/service/events" "github.com/micro/micro/v3/service/logger" ) diff --git a/test/image/.dockerignore b/test/image/.dockerignore new file mode 100644 index 0000000..f1618a6 --- /dev/null +++ b/test/image/.dockerignore @@ -0,0 +1,4 @@ +**/Dockerfile +**/*.md +**/*.git +**/*.dockerignore \ No newline at end of file diff --git a/test/image/Dockerfile b/test/image/Dockerfile new file mode 100644 index 0000000..5dadca9 --- /dev/null +++ b/test/image/Dockerfile @@ -0,0 +1,32 @@ +FROM alpine:latest +RUN apk add make git go gcc libtool musl-dev curl bash + +# Configure Go +ENV GOROOT /usr/lib/go +ENV GOPATH /go +ENV PATH /go/bin:$PATH + +RUN mkdir -p ${GOPATH}/src ${GOPATH}/bin + +RUN apk add ca-certificates && \ + rm -rf /var/cache/apk/* /tmp/* && \ + [ ! -e /etc/nsswitch.conf ] && echo 'hosts: files dns' > /etc/nsswitch.conf + +RUN apk add --update ca-certificates openssl tar && \ + wget https://github.com/coreos/etcd/releases/download/v3.4.7/etcd-v3.4.7-linux-amd64.tar.gz && \ + tar xzvf etcd-v3.4.7-linux-amd64.tar.gz && \ + mv etcd-v3.4.7-linux-amd64/etcd* /bin/ && \ + apk del --purge tar openssl && \ + rm -Rf etcd-v3.4.7-linux-amd64* /var/cache/apk/* +VOLUME /data +EXPOSE 2379 2380 4001 7001 +ADD services/test/image/run-etcd.sh /bin/run.sh + +# Speeding up tests by predownloading and building dependencies for services used. +RUN mkdir services +COPY services/go.* services/ +RUN cd services && go mod download +COPY services/ services +RUN bash -c 'for d in $(find services -name "main.go" | xargs -n 1 dirname); do pushd $d && go install && popd; done' +COPY ./micro/micro /microserver +ENTRYPOINT ["sh", "/bin/run.sh"] diff --git a/test/image/run-etcd.sh b/test/image/run-etcd.sh new file mode 100644 index 0000000..88aa675 --- /dev/null +++ b/test/image/run-etcd.sh @@ -0,0 +1,8 @@ +#!/bin/sh + +ETCD_CMD="/bin/etcd -data-dir=/data" +echo -e "Running '$ETCD_CMD'\nBEGIN ETCD OUTPUT\n" + +exec $ETCD_CMD & +sleep 4 +/microserver $* diff --git a/test/image/test-docker.sh b/test/image/test-docker.sh new file mode 100755 index 0000000..ec52736 --- /dev/null +++ b/test/image/test-docker.sh @@ -0,0 +1,5 @@ +cp services/test/image/.dockerignore . +pushd micro +GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build +popd +DOCKER_BUILDKIT=1 docker build -t micro -f test/image/Dockerfile . diff --git a/test/integration/README.md b/test/integration/README.md new file mode 100644 index 0000000..86c0ed5 --- /dev/null +++ b/test/integration/README.md @@ -0,0 +1,9 @@ +# Integration Tests + +This directory includes integration tests for m3o services + +## Overview + +This directory is for tests built into the tests service. In future there may be a integration.Register endpoint +and we just import the various tests from wherever they are but for they are standard go tests run when the +m3o flag is passed for integration testing diff --git a/test/integration/blog/blog_test.go b/test/integration/blog/blog_test.go new file mode 100644 index 0000000..f7b86e3 --- /dev/null +++ b/test/integration/blog/blog_test.go @@ -0,0 +1,239 @@ +// +build blog + +package signup + +import ( + "encoding/json" + "errors" + "math/rand" + + "os" + "os/exec" + "strings" + "testing" + "time" + + "github.com/micro/micro/v3/test" + p "github.com/micro/services/blog/posts/handler" +) + +const ( + retryCount = 1 + signupSuccessString = "Signup complete" +) + +var letterRunes = []rune("abcdefghijklmnopqrstuvwxyz") + +func randStringRunes(n int) string { + b := make([]rune, n) + for i := range b { + b[i] = letterRunes[rand.Intn(len(letterRunes))] + } + return string(b) +} + +func setupBlogTests(serv test.Server, t *test.T) { + envToConfigKey := map[string][]string{} + + if err := test.Try("Set up config values", t, func() ([]byte, error) { + for envKey, configKeys := range envToConfigKey { + val := os.Getenv(envKey) + if len(val) == 0 { + t.Fatalf("'%v' flag is missing", envKey) + } + for _, configKey := range configKeys { + outp, err := serv.Command().Exec("config", "set", configKey, val) + if err != nil { + return outp, err + } + } + } + return serv.Command().Exec("config", "set", "micro.billing.max_included_services", "3") + }, 10*time.Second); err != nil { + t.Fatal(err) + return + } + + services := []struct { + envVar string + deflt string + }{ + {envVar: "POSTS_SVC", deflt: "../../../blog/posts"}, + {envVar: "TAGS_SVC", deflt: "../../../blog/tags"}, + } + + for _, v := range services { + outp, err := serv.Command().Exec("run", v.deflt) + if err != nil { + t.Fatal(string(outp)) + return + } + } + + if err := test.Try("Find posts and tags", t, func() ([]byte, error) { + outp, err := serv.Command().Exec("services") + if err != nil { + return outp, err + } + list := []string{"posts", "tags"} + logOutp := []byte{} + fail := false + for _, s := range list { + if !strings.Contains(string(outp), s) { + o, _ := serv.Command().Exec("logs", s) + logOutp = append(logOutp, o...) + fail = true + } + } + if fail { + return append(outp, logOutp...), errors.New("Can't find required services in list") + } + return outp, err + }, 180*time.Second); err != nil { + return + } + + // setup rules + + // Adjust rules before we signup into a non admin account + outp, err := serv.Command().Exec("auth", "create", "rule", "--access=granted", "--scope=''", "--resource=\"service:posts:*\"", "posts") + if err != nil { + t.Fatalf("Error setting up rules: %v", outp) + return + } + + // copy the config with the admin logged in so we can use it for reading logs + // we dont want to have an open access rule for logs as it's not how it works in live + confPath := serv.Command().Config + outp, err = exec.Command("cp", "-rf", confPath, confPath+".admin").CombinedOutput() + if err != nil { + t.Fatalf("Error copying config: %v", outp) + return + } +} + +func TestPostsService(t *testing.T) { + test.TrySuite(t, testPosts, retryCount) +} + +// count is a string in responses... +type protoTag struct { + Title string `json:"title"` + Slug string `json:"slug"` + Type string `json:"type"` + Count string `json:"count"` +} + +func testPosts(t *test.T) { + t.Parallel() + + serv := test.NewServer(t, test.WithLogin()) + defer serv.Close() + if err := serv.Run(); err != nil { + return + } + + setupBlogTests(serv, t) + + cmd := serv.Command() + + if err := test.Try("Save post", t, func() ([]byte, error) { + // Attention! The content must be unquoted, don't add quotes. + outp, err := cmd.Exec("posts", "--id=1", "--title=Hi", "--content=Hi there", "--tags=a,b", "save") + if err != nil { + outp1, _ := cmd.Exec("logs", "posts") + return append(outp, outp1...), err + } + return outp, err + }, 15*time.Second); err != nil { + return + } + + outp, err := cmd.Exec("posts", "query") + if err != nil { + t.Fatal(string(outp)) + } + + expected := []p.Post{ + { + ID: "1", + Title: "Hi", + Content: "Hi there", + Tags: []string{"a", "b"}, + }, + } + type rsp struct { + Posts []p.Post `json:"posts"` + } + var actual rsp + json.Unmarshal(outp, &actual) + if len(actual.Posts) == 0 { + t.Fatal(string(outp)) + return + } + + if expected[0].ID != actual.Posts[0].ID || + expected[0].Title != actual.Posts[0].Title || + expected[0].Content != actual.Posts[0].Content || + len(expected[0].Tags) != len(actual.Posts[0].Tags) { + t.Fatal(expected[0], actual.Posts[0]) + } + + outp, err = cmd.Exec("tags", "list", "--type=post-tag") + type tagsRsp struct { + Tags []protoTag `json:"tags"` + } + var tagsActual tagsRsp + json.Unmarshal(outp, &tagsActual) + if len(tagsActual.Tags) == 0 { + outp1, _ := cmd.Exec("logs", "tags") + t.Fatal(string(append(outp, outp1...))) + return + } + if len(tagsActual.Tags) != 2 { + t.Fatal(tagsActual.Tags) + return + } + + if tagsActual.Tags[0].Count != "1" { + t.Fatal(tagsActual.Tags[0]) + return + } + if tagsActual.Tags[1].Count != "1" { + t.Fatal(tagsActual.Tags[1]) + return + } + + time.Sleep(5 * time.Second) + // Inserting an other post so tag counts increase + outp, err = cmd.Exec("posts", "--id=2", "--title=Hi1", "--content=Hi there1", "--tags=a,b", "save") + if err != nil { + t.Fatal(string(outp)) + return + } + + outp, err = cmd.Exec("tags", "list", "--type=post-tag") + json.Unmarshal(outp, &tagsActual) + if len(tagsActual.Tags) == 0 { + outp1, _ := cmd.Exec("logs", "tags") + t.Fatal(string(append(outp, outp1...))) + return + } + if len(tagsActual.Tags) != 2 { + t.Fatal(tagsActual.Tags) + return + } + + if tagsActual.Tags[0].Count != "2" { + outp1, _ := cmd.Exec("store", "list", "--table=tags") + outp2, _ := cmd.Exec("store", "list", "--table=posts") + t.Fatal(tagsActual.Tags[0], string(outp1), string(outp2)) + return + } + if tagsActual.Tags[1].Count != "2" { + outp1, _ := cmd.Exec("store", "list", "--table=tags") + outp2, _ := cmd.Exec("store", "list", "--table=posts") + t.Fatal(tagsActual.Tags[1], string(outp1), string(outp2)) + return + } +} diff --git a/kv/README.md b/test/kv/README.md similarity index 100% rename from kv/README.md rename to test/kv/README.md diff --git a/kv/handler/handler.go b/test/kv/handler/handler.go similarity index 98% rename from kv/handler/handler.go rename to test/kv/handler/handler.go index 7a99894..4d6f697 100644 --- a/kv/handler/handler.go +++ b/test/kv/handler/handler.go @@ -8,7 +8,7 @@ import ( log "github.com/micro/go-micro/v3/logger" store "github.com/micro/micro/v3/service/store" - pb "github.com/micro/services/kv/proto" + pb "github.com/micro/services/test/kv/proto" ) type Example struct{} diff --git a/kv/main.go b/test/kv/main.go similarity index 79% rename from kv/main.go rename to test/kv/main.go index 358dd3c..167e3e2 100644 --- a/kv/main.go +++ b/test/kv/main.go @@ -1,7 +1,7 @@ package main import ( - "github.com/micro/services/kv/handler" + "github.com/micro/services/test/kv/handler" "github.com/micro/micro/v3/service" ) diff --git a/kv/proto/example.pb.go b/test/kv/proto/example.pb.go similarity index 100% rename from kv/proto/example.pb.go rename to test/kv/proto/example.pb.go diff --git a/kv/proto/example.pb.micro.go b/test/kv/proto/example.pb.micro.go similarity index 100% rename from kv/proto/example.pb.micro.go rename to test/kv/proto/example.pb.micro.go diff --git a/kv/proto/example.proto b/test/kv/proto/example.proto similarity index 100% rename from kv/proto/example.proto rename to test/kv/proto/example.proto diff --git a/logger/README.md b/test/logger/README.md similarity index 100% rename from logger/README.md rename to test/logger/README.md diff --git a/logger/main.go b/test/logger/main.go similarity index 100% rename from logger/main.go rename to test/logger/main.go diff --git a/pubsub/README.md b/test/pubsub/README.md similarity index 100% rename from pubsub/README.md rename to test/pubsub/README.md diff --git a/pubsub/main.go b/test/pubsub/main.go similarity index 94% rename from pubsub/main.go rename to test/pubsub/main.go index 745bf77..6da6b16 100644 --- a/pubsub/main.go +++ b/test/pubsub/main.go @@ -7,7 +7,7 @@ import ( "github.com/micro/micro/v3/service" "github.com/micro/micro/v3/service/logger" - pb "github.com/micro/services/pubsub/proto" + pb "github.com/micro/services/test/pubsub/proto" ) // Pub will publish messages every second diff --git a/pubsub/proto/pubsub.pb.go b/test/pubsub/proto/pubsub.pb.go similarity index 100% rename from pubsub/proto/pubsub.pb.go rename to test/pubsub/proto/pubsub.pb.go diff --git a/pubsub/proto/pubsub.pb.micro.go b/test/pubsub/proto/pubsub.pb.micro.go similarity index 100% rename from pubsub/proto/pubsub.pb.micro.go rename to test/pubsub/proto/pubsub.pb.micro.go diff --git a/pubsub/proto/pubsub.proto b/test/pubsub/proto/pubsub.proto similarity index 100% rename from pubsub/proto/pubsub.proto rename to test/pubsub/proto/pubsub.proto diff --git a/routes/README.md b/test/routes/README.md similarity index 100% rename from routes/README.md rename to test/routes/README.md diff --git a/routes/proto/stream.pb.go b/test/routes/proto/stream.pb.go similarity index 76% rename from routes/proto/stream.pb.go rename to test/routes/proto/stream.pb.go index 47b6e0d..2eb2725 100644 --- a/routes/proto/stream.pb.go +++ b/test/routes/proto/stream.pb.go @@ -1,5 +1,5 @@ // Code generated by protoc-gen-go. DO NOT EDIT. -// source: test/service/rpc/proto/stream.proto +// source: proto/stream.proto package stream @@ -36,7 +36,7 @@ func (m *Point) Reset() { *m = Point{} } func (m *Point) String() string { return proto.CompactTextString(m) } func (*Point) ProtoMessage() {} func (*Point) Descriptor() ([]byte, []int) { - return fileDescriptor_3a6280eeb8b3790e, []int{0} + return fileDescriptor_45777bc300452f06, []int{0} } func (m *Point) XXX_Unmarshal(b []byte) error { @@ -87,7 +87,7 @@ func (m *Rectangle) Reset() { *m = Rectangle{} } func (m *Rectangle) String() string { return proto.CompactTextString(m) } func (*Rectangle) ProtoMessage() {} func (*Rectangle) Descriptor() ([]byte, []int) { - return fileDescriptor_3a6280eeb8b3790e, []int{1} + return fileDescriptor_45777bc300452f06, []int{1} } func (m *Rectangle) XXX_Unmarshal(b []byte) error { @@ -138,7 +138,7 @@ func (m *Feature) Reset() { *m = Feature{} } func (m *Feature) String() string { return proto.CompactTextString(m) } func (*Feature) ProtoMessage() {} func (*Feature) Descriptor() ([]byte, []int) { - return fileDescriptor_3a6280eeb8b3790e, []int{2} + return fileDescriptor_45777bc300452f06, []int{2} } func (m *Feature) XXX_Unmarshal(b []byte) error { @@ -188,7 +188,7 @@ func (m *RouteNote) Reset() { *m = RouteNote{} } func (m *RouteNote) String() string { return proto.CompactTextString(m) } func (*RouteNote) ProtoMessage() {} func (*RouteNote) Descriptor() ([]byte, []int) { - return fileDescriptor_3a6280eeb8b3790e, []int{3} + return fileDescriptor_45777bc300452f06, []int{3} } func (m *RouteNote) XXX_Unmarshal(b []byte) error { @@ -245,7 +245,7 @@ func (m *RouteSummary) Reset() { *m = RouteSummary{} } func (m *RouteSummary) String() string { return proto.CompactTextString(m) } func (*RouteSummary) ProtoMessage() {} func (*RouteSummary) Descriptor() ([]byte, []int) { - return fileDescriptor_3a6280eeb8b3790e, []int{4} + return fileDescriptor_45777bc300452f06, []int{4} } func (m *RouteSummary) XXX_Unmarshal(b []byte) error { @@ -303,33 +303,33 @@ func init() { } func init() { - proto.RegisterFile("test/service/rpc/proto/stream.proto", fileDescriptor_3a6280eeb8b3790e) + proto.RegisterFile("proto/stream.proto", fileDescriptor_45777bc300452f06) } -var fileDescriptor_3a6280eeb8b3790e = []byte{ - // 384 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x52, 0xdd, 0xca, 0xd3, 0x40, - 0x10, 0xfd, 0xb6, 0x7e, 0x3f, 0xcd, 0x24, 0x1f, 0xe2, 0xe0, 0x45, 0x08, 0x8a, 0x1a, 0x41, 0xea, - 0x4d, 0x5b, 0x2a, 0xd4, 0x6b, 0x29, 0x58, 0x05, 0x91, 0x12, 0xbd, 0x2f, 0x6b, 0x32, 0xb6, 0x0b, - 0x49, 0xb6, 0x64, 0x27, 0x82, 0xcf, 0xe1, 0x33, 0xfa, 0x1e, 0x92, 0xdd, 0x4d, 0x6c, 0x6d, 0xf1, - 0x2e, 0xe7, 0x9c, 0x39, 0x33, 0x3b, 0x67, 0x02, 0xaf, 0x98, 0x0c, 0xcf, 0x0c, 0x35, 0x3f, 0x54, - 0x4e, 0x33, 0xc3, 0x0d, 0xc9, 0x6a, 0x76, 0x68, 0x34, 0x6b, 0x0f, 0xa6, 0x16, 0xe0, 0xad, 0x43, - 0xe9, 0x3b, 0xb8, 0xd9, 0x68, 0x55, 0x33, 0x26, 0x30, 0x2e, 0x25, 0x2b, 0x6e, 0x0b, 0x8a, 0xc5, - 0x73, 0x31, 0xb9, 0xc9, 0x06, 0x8c, 0x4f, 0x20, 0x28, 0x75, 0xbd, 0x73, 0xe2, 0xc8, 0x8a, 0x7f, - 0x89, 0xf4, 0x23, 0x04, 0x19, 0xe5, 0x2c, 0xeb, 0x5d, 0x49, 0xf8, 0x14, 0x46, 0xa5, 0xb6, 0x0d, - 0xc2, 0xc5, 0xfd, 0xd4, 0x8f, 0xb4, 0x13, 0xb2, 0x51, 0xa9, 0x3b, 0x79, 0xaf, 0x6c, 0x8b, 0x73, - 0x79, 0xaf, 0xd2, 0x0f, 0x70, 0xf7, 0x9e, 0x24, 0xb7, 0x0d, 0x21, 0xc2, 0x75, 0x2d, 0x2b, 0xf7, - 0x96, 0x20, 0xb3, 0xdf, 0xf8, 0x1a, 0xc6, 0xa5, 0xce, 0x25, 0x2b, 0x5d, 0x5f, 0xee, 0x31, 0xc8, - 0xe9, 0x06, 0x82, 0x4c, 0xb7, 0x4c, 0x9f, 0x35, 0x9f, 0xfa, 0xc4, 0x7f, 0x7d, 0x18, 0xc3, 0x5d, - 0x45, 0xc6, 0xc8, 0x9d, 0x5b, 0x34, 0xc8, 0x7a, 0x98, 0xfe, 0x12, 0x10, 0xd9, 0x96, 0x5f, 0xda, - 0xaa, 0x92, 0xcd, 0x4f, 0x7c, 0x06, 0xe1, 0xa1, 0x73, 0x6f, 0x73, 0xdd, 0xd6, 0xec, 0x43, 0x03, - 0x4b, 0xad, 0x3a, 0x06, 0x5f, 0xc2, 0xfd, 0x77, 0xb7, 0x8d, 0x2f, 0x71, 0xd1, 0x45, 0x9e, 0x74, - 0x45, 0x09, 0x8c, 0x0b, 0x65, 0x58, 0xd6, 0x39, 0xc5, 0x0f, 0x5c, 0xee, 0x3d, 0xc6, 0x17, 0x10, - 0x51, 0x29, 0x0f, 0x86, 0x8a, 0x2d, 0xab, 0x8a, 0xe2, 0x6b, 0xab, 0x87, 0x9e, 0xfb, 0xaa, 0x2a, - 0x5a, 0xfc, 0x16, 0x00, 0xf6, 0x55, 0xeb, 0x56, 0x15, 0x84, 0x53, 0x80, 0x35, 0x71, 0x9f, 0xe1, - 0xe9, 0x96, 0xc9, 0xc3, 0x1e, 0x7a, 0x3d, 0xbd, 0xc2, 0x25, 0x44, 0x9f, 0x94, 0xe9, 0x0d, 0x06, - 0x1f, 0xf5, 0x25, 0xc3, 0x45, 0x2f, 0xb8, 0xe6, 0x02, 0x97, 0x10, 0x66, 0x94, 0xeb, 0xa6, 0xb0, - 0xb3, 0xff, 0x1d, 0xf4, 0x78, 0xe8, 0x72, 0x94, 0x57, 0x7a, 0x35, 0x11, 0xf8, 0xd6, 0x9f, 0x65, - 0xb5, 0x97, 0x7c, 0x34, 0xac, 0xbf, 0x54, 0x72, 0x4e, 0x75, 0xb6, 0xb9, 0xf8, 0x76, 0x6b, 0x7f, - 0xdb, 0x37, 0x7f, 0x02, 0x00, 0x00, 0xff, 0xff, 0x5d, 0x08, 0xd9, 0x0d, 0xe0, 0x02, 0x00, 0x00, +var fileDescriptor_45777bc300452f06 = []byte{ + // 371 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0x7c, 0x52, 0x4f, 0x4b, 0xfb, 0x40, + 0x10, 0xed, 0xf6, 0xd7, 0x3f, 0xbf, 0x4c, 0x52, 0xc4, 0xc1, 0x43, 0x29, 0x8a, 0x1a, 0x2f, 0xf5, + 0x52, 0x4b, 0x05, 0x3d, 0x4b, 0xc1, 0x2a, 0x88, 0x94, 0xe8, 0xbd, 0xac, 0xc9, 0xda, 0x2e, 0x24, + 0xd9, 0x92, 0x6c, 0x0e, 0x7e, 0x0e, 0x3f, 0xa3, 0xdf, 0xc3, 0xcd, 0xee, 0x26, 0xb6, 0xb6, 0x78, + 0xcb, 0xbc, 0x37, 0x6f, 0xde, 0xec, 0x9b, 0x00, 0xae, 0x33, 0x21, 0xc5, 0x55, 0x2e, 0x33, 0x46, + 0x93, 0x91, 0x2e, 0xb0, 0x63, 0x2a, 0xff, 0x0e, 0xda, 0x73, 0xc1, 0x53, 0x89, 0x03, 0xf8, 0x1f, + 0x53, 0xc9, 0x65, 0x11, 0xb1, 0x3e, 0x39, 0x23, 0xc3, 0x76, 0x50, 0xd7, 0x78, 0x0c, 0x4e, 0x2c, + 0xd2, 0xa5, 0x21, 0x9b, 0x9a, 0xfc, 0x01, 0xfc, 0x47, 0x70, 0x02, 0x16, 0x4a, 0x9a, 0x2e, 0x63, + 0x86, 0x27, 0xd0, 0x8c, 0x85, 0x1e, 0xe0, 0x4e, 0x7a, 0x23, 0x6b, 0xa9, 0x1d, 0x02, 0x45, 0x94, + 0xf4, 0x8a, 0xeb, 0x11, 0xbb, 0xf4, 0x8a, 0xfb, 0x0f, 0xd0, 0xbd, 0x67, 0x54, 0x16, 0x19, 0x43, + 0x84, 0x56, 0x4a, 0x13, 0xb3, 0x8b, 0x13, 0xe8, 0x6f, 0xbc, 0x54, 0x3b, 0x8a, 0x50, 0x6d, 0x25, + 0xd2, 0xfd, 0x33, 0x6a, 0xda, 0x9f, 0xab, 0xa5, 0x44, 0x21, 0xd9, 0xb3, 0x90, 0xdb, 0x3a, 0xf2, + 0xa7, 0x0e, 0xfb, 0xd0, 0x4d, 0x58, 0x9e, 0xd3, 0xa5, 0x79, 0xa8, 0x13, 0x54, 0xa5, 0xff, 0x49, + 0xc0, 0xd3, 0x23, 0x5f, 0x8a, 0x24, 0xa1, 0xd9, 0x07, 0x9e, 0x82, 0xbb, 0x2e, 0xd5, 0x8b, 0x50, + 0x14, 0xa9, 0xb4, 0xa1, 0x81, 0x86, 0xa6, 0x25, 0x82, 0x17, 0xd0, 0x7b, 0x37, 0xaf, 0xb1, 0x2d, + 0x26, 0x3a, 0xcf, 0x82, 0xa6, 0x49, 0xe5, 0x1e, 0xf1, 0x5c, 0xa5, 0x17, 0xb2, 0xfe, 0x3f, 0x93, + 0x7b, 0x55, 0xe3, 0x39, 0x78, 0x2c, 0xa6, 0xeb, 0x9c, 0x45, 0x0b, 0xc9, 0x55, 0x16, 0x2d, 0xcd, + 0xbb, 0x16, 0x7b, 0x55, 0xd0, 0xe4, 0x8b, 0x00, 0xe8, 0xad, 0x66, 0x05, 0x57, 0x97, 0x1a, 0x01, + 0xcc, 0x98, 0xac, 0x32, 0xdc, 0x7e, 0xe5, 0xe0, 0xa0, 0x2a, 0x2d, 0xef, 0x37, 0xf0, 0x06, 0xbc, + 0x27, 0xe5, 0x66, 0x81, 0x1c, 0x0f, 0xab, 0x96, 0xfa, 0xa2, 0x7b, 0x54, 0x63, 0xa2, 0x74, 0xae, + 0xea, 0x10, 0x59, 0xa4, 0xbd, 0x7f, 0x1b, 0x1d, 0xd5, 0x53, 0x36, 0xf2, 0xf2, 0x1b, 0x43, 0x82, + 0xb7, 0xf6, 0x2c, 0xd3, 0x15, 0x95, 0x1b, 0x66, 0xd5, 0xa5, 0x06, 0xbb, 0x50, 0x29, 0x1b, 0x93, + 0xb7, 0x8e, 0xfe, 0x6d, 0xaf, 0xbf, 0x03, 0x00, 0x00, 0xff, 0xff, 0xcf, 0x12, 0xaf, 0xc8, 0xcc, + 0x02, 0x00, 0x00, } diff --git a/routes/proto/stream.pb.micro.go b/test/routes/proto/stream.pb.micro.go similarity index 98% rename from routes/proto/stream.pb.micro.go rename to test/routes/proto/stream.pb.micro.go index 8206fc4..03c9f70 100644 --- a/routes/proto/stream.pb.micro.go +++ b/test/routes/proto/stream.pb.micro.go @@ -1,21 +1,19 @@ // Code generated by protoc-gen-micro. DO NOT EDIT. -// source: test/service/rpc/proto/stream.proto +// source: proto/stream.proto package stream import ( fmt "fmt" - math "math" - proto "github.com/golang/protobuf/proto" + math "math" +) +import ( context "context" - - api "github.com/micro/go-micro/v3/api" - - client "github.com/micro/go-micro/v3/client" - - server "github.com/micro/go-micro/v3/server" + api "github.com/micro/micro/v3/service/api" + client "github.com/micro/micro/v3/service/client" + server "github.com/micro/micro/v3/service/server" ) // Reference imports to suppress errors if they are not otherwise used. diff --git a/routes/proto/stream.proto b/test/routes/proto/stream.proto similarity index 100% rename from routes/proto/stream.proto rename to test/routes/proto/stream.proto diff --git a/routes/routes-client/main.go b/test/routes/routes-client/main.go similarity index 98% rename from routes/routes-client/main.go rename to test/routes/routes-client/main.go index e1fc06b..d892c81 100644 --- a/routes/routes-client/main.go +++ b/test/routes/routes-client/main.go @@ -8,7 +8,7 @@ import ( "github.com/micro/micro/v3/service" "github.com/micro/micro/v3/service/logger" - pb "github.com/micro/services/routes/proto" + pb "github.com/micro/services/test/routes/proto" ) func main() { diff --git a/routes/routes-server/handler/handler.go b/test/routes/routes-server/handler/handler.go similarity index 98% rename from routes/routes-server/handler/handler.go rename to test/routes/routes-server/handler/handler.go index 6e02dfc..e6a0613 100644 --- a/routes/routes-server/handler/handler.go +++ b/test/routes/routes-server/handler/handler.go @@ -7,7 +7,7 @@ import ( "time" "github.com/golang/protobuf/proto" - pb "github.com/micro/services/routes/proto" + pb "github.com/micro/services/test/routes/proto" ) // RouteGuide implements the route guide handler interface diff --git a/routes/routes-server/handler/util.go b/test/routes/routes-server/handler/util.go similarity index 96% rename from routes/routes-server/handler/util.go rename to test/routes/routes-server/handler/util.go index 1e8e681..47b3274 100644 --- a/routes/routes-server/handler/util.go +++ b/test/routes/routes-server/handler/util.go @@ -4,7 +4,7 @@ import ( "fmt" "math" - pb "github.com/micro/services/routes/proto" + pb "github.com/micro/services/test/routes/proto" ) func toRadians(num float64) float64 { diff --git a/routes/routes-server/main.go b/test/routes/routes-server/main.go similarity index 99% rename from routes/routes-server/main.go rename to test/routes/routes-server/main.go index 030d821..f8dfabd 100644 --- a/routes/routes-server/main.go +++ b/test/routes/routes-server/main.go @@ -7,8 +7,8 @@ import ( "github.com/micro/micro/v3/service" "github.com/micro/micro/v3/service/logger" - pb "github.com/micro/services/routes/proto" - "github.com/micro/services/routes/routes-server/handler" + pb "github.com/micro/services/test/routes/proto" + "github.com/micro/services/test/routes/routes-server/handler" ) func main() { diff --git a/template/.gitignore b/test/template/.gitignore similarity index 100% rename from template/.gitignore rename to test/template/.gitignore diff --git a/template/Dockerfile b/test/template/Dockerfile similarity index 100% rename from template/Dockerfile rename to test/template/Dockerfile diff --git a/template/Makefile b/test/template/Makefile similarity index 100% rename from template/Makefile rename to test/template/Makefile diff --git a/template/README.md b/test/template/README.md similarity index 100% rename from template/README.md rename to test/template/README.md diff --git a/template/cmd/template/main.go b/test/template/cmd/template/main.go similarity index 87% rename from template/cmd/template/main.go rename to test/template/cmd/template/main.go index 3948e07..a23ef7f 100644 --- a/template/cmd/template/main.go +++ b/test/template/cmd/template/main.go @@ -1,7 +1,7 @@ package main import ( - "github.com/micro/services/template/handler" + "github.com/micro/services/test/template/handler" "github.com/micro/micro/v3/service" "github.com/micro/micro/v3/service/logger" diff --git a/template/generate.go b/test/template/generate.go similarity index 100% rename from template/generate.go rename to test/template/generate.go diff --git a/template/handler/idiomatic.go b/test/template/handler/idiomatic.go similarity index 95% rename from template/handler/idiomatic.go rename to test/template/handler/idiomatic.go index 4b2be89..3ba96bd 100644 --- a/template/handler/idiomatic.go +++ b/test/template/handler/idiomatic.go @@ -5,7 +5,7 @@ import ( log "github.com/micro/micro/v3/service/logger" - idiomatic "github.com/micro/services/template/proto" + idiomatic "github.com/micro/services/test/template/proto" ) type Idiomatic struct{} diff --git a/template/proto/idiomatic.pb.go b/test/template/proto/idiomatic.pb.go similarity index 100% rename from template/proto/idiomatic.pb.go rename to test/template/proto/idiomatic.pb.go diff --git a/template/proto/idiomatic.pb.micro.go b/test/template/proto/idiomatic.pb.micro.go similarity index 100% rename from template/proto/idiomatic.pb.micro.go rename to test/template/proto/idiomatic.pb.micro.go diff --git a/template/proto/idiomatic.proto b/test/template/proto/idiomatic.proto similarity index 100% rename from template/proto/idiomatic.proto rename to test/template/proto/idiomatic.proto