commit e223458dd4092de282e58c7dfafb35412028f854 Author: SourceFellows Date: Fri Aug 21 06:26:40 2020 +0200 initial import diff --git a/best-practices/context-http-server/main.go b/best-practices/context-http-server/main.go new file mode 100644 index 0000000..9dc5b8a --- /dev/null +++ b/best-practices/context-http-server/main.go @@ -0,0 +1,24 @@ +package main + +import ( + "fmt" + "net/http" + "time" +) + +func handleCall(res http.ResponseWriter, req *http.Request) { + ctx := req.Context() + select { + case <-ctx.Done(): + res.Write([]byte("end")) + fmt.Println("clsoing connection to client") + return + case <-time.After(20 * time.Second): + fmt.Fprintln(res, "Hello World") + } +} + +func main() { + http.HandleFunc("/", handleCall) + http.ListenAndServe(":8080", nil) +} diff --git a/best-practices/context-loop/main.go b/best-practices/context-loop/main.go new file mode 100644 index 0000000..c02de42 --- /dev/null +++ b/best-practices/context-loop/main.go @@ -0,0 +1,41 @@ +package main + +import ( + "context" + "log" + "time" +) + +func loop(ctx context.Context) <-chan string { + c := make(chan string) + go func() { + for { + select { + case <-ctx.Done(): + close(c) + return + default: + c <- "Hello World!" + } + time.Sleep(1 * time.Second) + } + }() + return c +} + +func main() { + ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) + defer cancel() + for s := range loop(ctx) { + log.Println(s) + } + + log.Println("nächste Variante") + + ctx, cancel = context.WithCancel(context.Background()) + time.AfterFunc(5*time.Second, cancel) + for s := range loop(ctx) { + log.Println(s) + } + +} diff --git a/best-practices/context-value-nono/main.go b/best-practices/context-value-nono/main.go new file mode 100644 index 0000000..4fb1f38 --- /dev/null +++ b/best-practices/context-value-nono/main.go @@ -0,0 +1,28 @@ +package main + +import ( + "context" + "fmt" +) + +type contextKey int + +const usernameKey contextKey = iota + +func businessCall(username string) { + //.. was wichtiges + fmt.Println(username) +} + +func main() { + ctx := context.Background() + vCtx := context.WithValue(ctx, usernameKey, "bob") + //.. einiges anderes + businessCall(vCtx.Value(usernameKey).(string)) + + //Variante2 + username := "bob" + //.. einiges anderes + businessCall(username) + +} diff --git a/best-practices/context-value/main.go b/best-practices/context-value/main.go new file mode 100644 index 0000000..1e01775 --- /dev/null +++ b/best-practices/context-value/main.go @@ -0,0 +1,15 @@ +package main + +import ( + "context" + "fmt" +) + +type contextKey string + +func main() { + var key contextKey = "test" + ctx := context.Background() + ctx = context.WithValue(ctx, key, "world") + fmt.Println(ctx.Value(key)) +} diff --git a/best-practices/context/main.go b/best-practices/context/main.go new file mode 100644 index 0000000..994cdec --- /dev/null +++ b/best-practices/context/main.go @@ -0,0 +1,28 @@ +package main + +import ( + "context" + "fmt" + "time" +) + +func main() { + + bg := context.Background() + fmt.Println(bg.Deadline()) //0001-01-01 00:00:00 +0000 UTC false + fmt.Println(bg.Err()) // + //fmt.Println(<-td.Done()) //blockiert für immer! + + ctx, cancel := context.WithTimeout(bg, 5*time.Second) + defer cancel() + + go func() { + time.Sleep(500 * time.Millisecond) + cancel() + }() + + fmt.Println(ctx.Deadline()) + <-ctx.Done() + fmt.Println("Ende") + +} diff --git a/best-practices/empty-string-check/main.go b/best-practices/empty-string-check/main.go new file mode 100644 index 0000000..39e4c92 --- /dev/null +++ b/best-practices/empty-string-check/main.go @@ -0,0 +1,17 @@ +package main + +import "fmt" + +func main() { + + s := "" + + if len(s) == 0 { + fmt.Println("string ist leer") + } + + if s == "" { + fmt.Println("string ist leer") + } + +} diff --git a/best-practices/error-behaviour/external_lib.go b/best-practices/error-behaviour/external_lib.go new file mode 100644 index 0000000..2dd4a93 --- /dev/null +++ b/best-practices/error-behaviour/external_lib.go @@ -0,0 +1,12 @@ +package main + +import ( + "net" +) + +func callRemoteService() error { + + var err net.UnknownNetworkError = "blub" + return err + +} diff --git a/best-practices/error-behaviour/main.go b/best-practices/error-behaviour/main.go new file mode 100644 index 0000000..753bd75 --- /dev/null +++ b/best-practices/error-behaviour/main.go @@ -0,0 +1,34 @@ +package main + +import ( + "log" + "net" +) + +func isTimeout(err error) bool { + + type timeout interface { + Timeout() bool + } + + v, ok := err.(timeout) + if !ok { + return false + } + + return v.Timeout() + +} + +func main() { + err := callRemoteService() + + if nerr, ok := err.(net.Error); ok && nerr.Timeout() { + //nochmal versuchen + log.Printf("it's a unknown network error: %v\n", nerr) + } + + if err != nil && !isTimeout(err) { + log.Fatal(err) + } +} diff --git a/best-practices/error-handling-2/main.go b/best-practices/error-handling-2/main.go new file mode 100644 index 0000000..31786ef --- /dev/null +++ b/best-practices/error-handling-2/main.go @@ -0,0 +1,31 @@ +package main + +import ( + "fmt" + "log" + "os" +) + +var err error +var f *os.File + +func write(text string) { + if err != nil { + return + } + _, err = fmt.Fprintln(f, text) +} + +func main() { + f, err = os.OpenFile("test.txt", os.O_WRONLY, os.ModePerm) + if err != nil { + log.Fatal(err) + } + defer f.Close() + write("Hello world 2") + write("Hello world 2") + if err != nil { + log.Fatal(err) + } + fmt.Println(f) +} diff --git a/best-practices/error-handling-2/test.txt b/best-practices/error-handling-2/test.txt new file mode 100644 index 0000000..172b2b6 --- /dev/null +++ b/best-practices/error-handling-2/test.txt @@ -0,0 +1,2 @@ +Hello world 2 +Hello world 2 diff --git a/best-practices/error-handling-3/main.go b/best-practices/error-handling-3/main.go new file mode 100644 index 0000000..ccc916c --- /dev/null +++ b/best-practices/error-handling-3/main.go @@ -0,0 +1,48 @@ +package main + +import ( + "fmt" + "io" + "log" + "os" +) + +func NewWriter(w io.Writer) *writer { + return &writer{w, nil} +} + +type writer struct { + w io.Writer + err error +} + +func (w *writer) write(text string) { + if w.err != nil { + return + } + _, w.err = fmt.Fprintln(w.w, text) +} + +func (w *writer) Err() error { + return w.err +} + +func main() { + + f, err := os.OpenFile("test.txt", os.O_WRONLY, os.ModePerm) + if err != nil { + log.Fatal(err) + } + defer f.Close() + + w := NewWriter(f) + + w.write("Hello world 3") + w.write("Hello world 3") + + if err = w.Err(); err != nil { + log.Fatal(err) + } + fmt.Println(f) + +} diff --git a/best-practices/error-handling-3/test.txt b/best-practices/error-handling-3/test.txt new file mode 100644 index 0000000..dbc8893 --- /dev/null +++ b/best-practices/error-handling-3/test.txt @@ -0,0 +1,2 @@ +Hello world 3 +Hello world 3 diff --git a/best-practices/error-handling/main.go b/best-practices/error-handling/main.go new file mode 100644 index 0000000..05ea06c --- /dev/null +++ b/best-practices/error-handling/main.go @@ -0,0 +1,24 @@ +package main + +import ( + "fmt" + "log" + "os" +) + +func main() { + f, err := os.OpenFile("test.txt", os.O_WRONLY, os.ModePerm) + if err != nil { + log.Fatal(err) + } + defer f.Close() + _, err = fmt.Fprintln(f, "Hello World") + if err != nil { + log.Fatal(err) + } + _, err = fmt.Fprintln(f, "Hello World") + if err != nil { + log.Fatal(err) + } + fmt.Println(f) +} diff --git a/best-practices/error-handling/test.txt b/best-practices/error-handling/test.txt new file mode 100644 index 0000000..b3eee0a --- /dev/null +++ b/best-practices/error-handling/test.txt @@ -0,0 +1,4 @@ +Hello World +Hello World +Hello World +Hello World diff --git a/best-practices/file-io-large/main.go b/best-practices/file-io-large/main.go new file mode 100644 index 0000000..e80ee13 --- /dev/null +++ b/best-practices/file-io-large/main.go @@ -0,0 +1,24 @@ +package main + +import ( + "bufio" + "fmt" + "log" + "os" +) + +func main() { + + f, err := os.Open("main.go") + if err != nil { + log.Fatal(err) + } + defer f.Close() + + scanner := bufio.NewScanner(f) + //scanner.Split(bufio.ScanWords) + for scanner.Scan() { + fmt.Println(scanner.Text()) + } + +} diff --git a/best-practices/file-io/main.go b/best-practices/file-io/main.go new file mode 100644 index 0000000..0e7ba40 --- /dev/null +++ b/best-practices/file-io/main.go @@ -0,0 +1,24 @@ +package main + +import ( + "fmt" + "io/ioutil" + "log" +) + +func main() { + + bites, err := ioutil.ReadFile("test.txt") + if err != nil { + log.Fatal(err) + } + + fmt.Printf("%s\n", bites) + fmt.Println(string(bites)) + + toWrite := []byte("Hello World!") + err = ioutil.WriteFile("test2.txt", toWrite, 0644) + if err != nil { + log.Fatal(err) + } +} diff --git a/best-practices/file-io/test.txt b/best-practices/file-io/test.txt new file mode 100644 index 0000000..c57eff5 --- /dev/null +++ b/best-practices/file-io/test.txt @@ -0,0 +1 @@ +Hello World! \ No newline at end of file diff --git a/best-practices/force-interface/main.go b/best-practices/force-interface/main.go new file mode 100644 index 0000000..da48d86 --- /dev/null +++ b/best-practices/force-interface/main.go @@ -0,0 +1,18 @@ +package main + +type UserService interface { + Save() +} + +var _ UserService = &MyUserService{} + +type MyUserService struct { +} + +func (us *MyUserService) Save() { + +} + +func main() { + +} diff --git a/best-practices/goroutine-pooling/main.go b/best-practices/goroutine-pooling/main.go new file mode 100644 index 0000000..f3849b8 --- /dev/null +++ b/best-practices/goroutine-pooling/main.go @@ -0,0 +1,33 @@ +package main + +import ( + "fmt" + "sync" + "time" +) + +var ( + concurrent = 5 + pool = make(chan interface{}, concurrent) +) + +func work(num int, w *sync.WaitGroup) { + pool <- "starting" + defer func() { + w.Done() + <-pool + }() + fmt.Printf("number %d\n", num) + time.Sleep(1 * time.Second) +} + +func main() { + + var wg sync.WaitGroup + for i := 0; i < 1000; i++ { + wg.Add(1) + go work(i, &wg) + } + wg.Wait() + +} diff --git a/best-practices/logging-defer/main.go b/best-practices/logging-defer/main.go new file mode 100644 index 0000000..d5441a0 --- /dev/null +++ b/best-practices/logging-defer/main.go @@ -0,0 +1,15 @@ +package main + +import "log" + +func importantStuff() { + log.Println("rein") + defer log.Println("raus") + + log.Println("drin") + +} + +func main() { + importantStuff() +} diff --git a/best-practices/map-contains/main.go b/best-practices/map-contains/main.go new file mode 100644 index 0000000..20b6ae3 --- /dev/null +++ b/best-practices/map-contains/main.go @@ -0,0 +1,14 @@ +package main + +import "fmt" + +func main() { + + m := make(map[string]string) + m["key1"] = "value1" + + if v, ok := m["key2"]; ok { + fmt.Printf("Wert %v enthalten\n", v) + } + +} diff --git a/best-practices/project-structure/cmd-sample/cmd/myapp/myapp.go b/best-practices/project-structure/cmd-sample/cmd/myapp/myapp.go new file mode 100644 index 0000000..a9e8afa --- /dev/null +++ b/best-practices/project-structure/cmd-sample/cmd/myapp/myapp.go @@ -0,0 +1,7 @@ +package main + +import "fmt" + +func main() { + fmt.Println("myapp") +} diff --git a/best-practices/project-structure/cmd-sample/cmd/mycli/mycli.go b/best-practices/project-structure/cmd-sample/cmd/mycli/mycli.go new file mode 100644 index 0000000..993680a --- /dev/null +++ b/best-practices/project-structure/cmd-sample/cmd/mycli/mycli.go @@ -0,0 +1,7 @@ +package main + +import "fmt" + +func main() { + fmt.Println("mycli") +} diff --git a/best-practices/project-structure/cmd-sample/handler.go b/best-practices/project-structure/cmd-sample/handler.go new file mode 100644 index 0000000..e69de29 diff --git a/best-practices/project-structure/cmd-sample/myapp b/best-practices/project-structure/cmd-sample/myapp new file mode 100755 index 0000000..ce8baff Binary files /dev/null and b/best-practices/project-structure/cmd-sample/myapp differ diff --git a/best-practices/project-structure/cmd-sample/registration.go b/best-practices/project-structure/cmd-sample/registration.go new file mode 100644 index 0000000..e69de29 diff --git a/best-practices/project-structure/cmd-sample/service.go b/best-practices/project-structure/cmd-sample/service.go new file mode 100644 index 0000000..e69de29 diff --git a/best-practices/project-structure/dependency-sample/cmd/main.go b/best-practices/project-structure/dependency-sample/cmd/main.go new file mode 100644 index 0000000..9dd33e9 --- /dev/null +++ b/best-practices/project-structure/dependency-sample/cmd/main.go @@ -0,0 +1,17 @@ +package main + +import ( + "net/http" + + "golang.source-fellows.com/samples/applicationx/http/rest" + "golang.source-fellows.com/samples/applicationx/postgres" +) + +func main() { + + us := &postgres.UserService{} + + http.HandleFunc("/", rest.Handler(us)) + http.ListenAndServe(":8080", nil) + +} diff --git a/best-practices/project-structure/dependency-sample/go.mod b/best-practices/project-structure/dependency-sample/go.mod new file mode 100644 index 0000000..7176e01 --- /dev/null +++ b/best-practices/project-structure/dependency-sample/go.mod @@ -0,0 +1,8 @@ +module golang.source-fellows.com/samples/applicationx + +go 1.14 + +require ( + github.com/golang/mock v1.4.4 + rsc.io/quote/v3 v3.1.0 // indirect +) diff --git a/best-practices/project-structure/dependency-sample/go.sum b/best-practices/project-structure/dependency-sample/go.sum new file mode 100644 index 0000000..e88613b --- /dev/null +++ b/best-practices/project-structure/dependency-sample/go.sum @@ -0,0 +1,14 @@ +github.com/golang/mock v1.4.3 h1:GV+pQPG/EUUbkh47niozDcADz6go/dUwhVzdUQHIVRw= +github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.4 h1:l75CXGRSwbaYNpl/Z2X1XIIAMSCquvXgpVZDhwEIJsc= +github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/tools v0.0.0-20190425150028-36563e24a262 h1:qsl9y/CJx34tuA7QCPNp86JNJe4spst6Ff8MjvPUdPg= +golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= +rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= diff --git a/best-practices/project-structure/dependency-sample/http/rest/handler.go b/best-practices/project-structure/dependency-sample/http/rest/handler.go new file mode 100644 index 0000000..2f20a61 --- /dev/null +++ b/best-practices/project-structure/dependency-sample/http/rest/handler.go @@ -0,0 +1,16 @@ +package rest + +import ( + "fmt" + "net/http" + "time" + + "golang.source-fellows.com/samples/applicationx" +) + +func Handler(us applicationx.UserService) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + us.CreateUser(&applicationx.User{}) + fmt.Fprintf(w, "Hello World! %s", time.Now()) + } +} diff --git a/best-practices/project-structure/dependency-sample/http/rest/handler_test.go b/best-practices/project-structure/dependency-sample/http/rest/handler_test.go new file mode 100644 index 0000000..7666997 --- /dev/null +++ b/best-practices/project-structure/dependency-sample/http/rest/handler_test.go @@ -0,0 +1,29 @@ +package rest + +import ( + "net/http" + "net/http/httptest" + "testing" + + "github.com/golang/mock/gomock" + "golang.source-fellows.com/samples/applicationx/mocks" +) + +func TestHandler(t *testing.T) { + + ctrl := gomock.NewController(t) + defer ctrl.Finish() + + userService := mocks.NewMockUserService(ctrl) + + handlerFunc := Handler(userService) + + w := httptest.NewRecorder() + r, _ := http.NewRequest("GET", "/egal", nil) + + //wird der Service überhaupt aufgerufen? + userService.EXPECT().CreateUser(gomock.Any()).MinTimes(1) + + handlerFunc(w, r) + +} diff --git a/best-practices/project-structure/dependency-sample/mocks/user_service.go b/best-practices/project-structure/dependency-sample/mocks/user_service.go new file mode 100644 index 0000000..e34ab45 --- /dev/null +++ b/best-practices/project-structure/dependency-sample/mocks/user_service.go @@ -0,0 +1,77 @@ +// Code generated by MockGen. DO NOT EDIT. +// Source: user.go + +// Package mocks is a generated GoMock package. +package mocks + +import ( + gomock "github.com/golang/mock/gomock" + applicationx "golang.source-fellows.com/samples/applicationx" + reflect "reflect" +) + +// MockUserService is a mock of UserService interface +type MockUserService struct { + ctrl *gomock.Controller + recorder *MockUserServiceMockRecorder +} + +// MockUserServiceMockRecorder is the mock recorder for MockUserService +type MockUserServiceMockRecorder struct { + mock *MockUserService +} + +// NewMockUserService creates a new mock instance +func NewMockUserService(ctrl *gomock.Controller) *MockUserService { + mock := &MockUserService{ctrl: ctrl} + mock.recorder = &MockUserServiceMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockUserService) EXPECT() *MockUserServiceMockRecorder { + return m.recorder +} + +// CreateUser mocks base method +func (m *MockUserService) CreateUser(u *applicationx.User) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "CreateUser", u) + ret0, _ := ret[0].(error) + return ret0 +} + +// CreateUser indicates an expected call of CreateUser +func (mr *MockUserServiceMockRecorder) CreateUser(u interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateUser", reflect.TypeOf((*MockUserService)(nil).CreateUser), u) +} + +// ReadUser mocks base method +func (m *MockUserService) ReadUser(id int) (*applicationx.User, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ReadUser", id) + ret0, _ := ret[0].(*applicationx.User) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ReadUser indicates an expected call of ReadUser +func (mr *MockUserServiceMockRecorder) ReadUser(id interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ReadUser", reflect.TypeOf((*MockUserService)(nil).ReadUser), id) +} + +// DeleteUser mocks base method +func (m *MockUserService) DeleteUser(id int) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "DeleteUser", id) + ret0, _ := ret[0].(error) + return ret0 +} + +// DeleteUser indicates an expected call of DeleteUser +func (mr *MockUserServiceMockRecorder) DeleteUser(id interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteUser", reflect.TypeOf((*MockUserService)(nil).DeleteUser), id) +} diff --git a/best-practices/project-structure/dependency-sample/postgres/user_service.go b/best-practices/project-structure/dependency-sample/postgres/user_service.go new file mode 100644 index 0000000..fa36fd1 --- /dev/null +++ b/best-practices/project-structure/dependency-sample/postgres/user_service.go @@ -0,0 +1,24 @@ +package postgres + +import ( + "fmt" + + "golang.source-fellows.com/samples/applicationx" +) + +var _ applicationx.UserService = &UserService{} + +type UserService struct{} + +func (us *UserService) CreateUser(user *applicationx.User) error { + fmt.Println("Create User in Postgres Service") + return nil +} + +func (us *UserService) DeleteUser(id int) error { + return nil +} + +func (us *UserService) ReadUser(id int) (*applicationx.User, error) { + return nil, nil +} diff --git a/best-practices/project-structure/dependency-sample/user.go b/best-practices/project-structure/dependency-sample/user.go new file mode 100644 index 0000000..29330e0 --- /dev/null +++ b/best-practices/project-structure/dependency-sample/user.go @@ -0,0 +1,14 @@ +//go:generate mockgen -source=user.go -package mocks -destination mocks/user_service.go + +package applicationx + +type User struct { + ID int + name string +} + +type UserService interface { + CreateUser(u *User) error + ReadUser(id int) (*User, error) + DeleteUser(id int) error +} diff --git a/best-practices/project-structure/flat-sample/handler.go b/best-practices/project-structure/flat-sample/handler.go new file mode 100644 index 0000000..e69de29 diff --git a/best-practices/project-structure/flat-sample/main.go b/best-practices/project-structure/flat-sample/main.go new file mode 100644 index 0000000..e69de29 diff --git a/best-practices/project-structure/flat-sample/registration.go b/best-practices/project-structure/flat-sample/registration.go new file mode 100644 index 0000000..e69de29 diff --git a/best-practices/project-structure/flat-sample/service.go b/best-practices/project-structure/flat-sample/service.go new file mode 100644 index 0000000..e69de29 diff --git a/best-practices/project-structure/internal-sample/a/b/c/g/app.go b/best-practices/project-structure/internal-sample/a/b/c/g/app.go new file mode 100644 index 0000000..e69de29 diff --git a/best-practices/project-structure/internal-sample/a/b/c/internal/d/e/f/accessor.go b/best-practices/project-structure/internal-sample/a/b/c/internal/d/e/f/accessor.go new file mode 100644 index 0000000..2b199a8 --- /dev/null +++ b/best-practices/project-structure/internal-sample/a/b/c/internal/d/e/f/accessor.go @@ -0,0 +1,7 @@ +package f + +import "fmt" + +func Access() { + fmt.Println("Access it!") +} diff --git a/best-practices/project-structure/internal-sample/a/b/c/runner.go b/best-practices/project-structure/internal-sample/a/b/c/runner.go new file mode 100644 index 0000000..0b72fef --- /dev/null +++ b/best-practices/project-structure/internal-sample/a/b/c/runner.go @@ -0,0 +1,7 @@ +package c + +import "golang.source-fellows.com/project/isample/a/b/c/internal/d/e/f" + +func Run() { + f.Access() +} diff --git a/best-practices/project-structure/internal-sample/a/b/g/helper.go b/best-practices/project-structure/internal-sample/a/b/g/helper.go new file mode 100644 index 0000000..4e539b8 --- /dev/null +++ b/best-practices/project-structure/internal-sample/a/b/g/helper.go @@ -0,0 +1,7 @@ +package g + +import "fmt" + +func Help() { + fmt.Println("Help me! cannot access") +} diff --git a/best-practices/project-structure/internal-sample/go.mod b/best-practices/project-structure/internal-sample/go.mod new file mode 100644 index 0000000..7550f0f --- /dev/null +++ b/best-practices/project-structure/internal-sample/go.mod @@ -0,0 +1,3 @@ +module golang.source-fellows.com/project/isample + +go 1.14 diff --git a/best-practices/project-structure/layer-sample/cmd/main.go b/best-practices/project-structure/layer-sample/cmd/main.go new file mode 100644 index 0000000..aed3df1 --- /dev/null +++ b/best-practices/project-structure/layer-sample/cmd/main.go @@ -0,0 +1,12 @@ +package main + +import ( + "fmt" + + "layeredsample/models" +) + +func main() { + c := models.CustomerModel{} + fmt.Println(c) +} diff --git a/best-practices/project-structure/layer-sample/go.mod b/best-practices/project-structure/layer-sample/go.mod new file mode 100644 index 0000000..11fd81c --- /dev/null +++ b/best-practices/project-structure/layer-sample/go.mod @@ -0,0 +1,3 @@ +module layeredsample + +go 1.14 diff --git a/best-practices/project-structure/layer-sample/go.sum b/best-practices/project-structure/layer-sample/go.sum new file mode 100644 index 0000000..16e9303 --- /dev/null +++ b/best-practices/project-structure/layer-sample/go.sum @@ -0,0 +1 @@ +golang.source-fellows.com v0.0.0-20200619133407-79aa8981720c h1:c0BKYhs4PULAm3Hb5f+t9AcmPRScdSAkeuajndyOMLQ= diff --git a/best-practices/project-structure/layer-sample/handlers/customer.go b/best-practices/project-structure/layer-sample/handlers/customer.go new file mode 100644 index 0000000..5d78ee3 --- /dev/null +++ b/best-practices/project-structure/layer-sample/handlers/customer.go @@ -0,0 +1,3 @@ +package handlers + +type CustomerHandler struct{} diff --git a/best-practices/project-structure/layer-sample/handlers/registration.go b/best-practices/project-structure/layer-sample/handlers/registration.go new file mode 100644 index 0000000..1f8adb1 --- /dev/null +++ b/best-practices/project-structure/layer-sample/handlers/registration.go @@ -0,0 +1,3 @@ +package handlers + +type RegistrationHandler struct{} diff --git a/best-practices/project-structure/layer-sample/models/customer.go b/best-practices/project-structure/layer-sample/models/customer.go new file mode 100644 index 0000000..3a7020e --- /dev/null +++ b/best-practices/project-structure/layer-sample/models/customer.go @@ -0,0 +1,11 @@ +package models + +import "layeredsample/storage" + +type CustomerModel struct { + db storage.DB +} + +func (c *CustomerModel) Save() { + +} diff --git a/best-practices/project-structure/layer-sample/models/registration.go b/best-practices/project-structure/layer-sample/models/registration.go new file mode 100644 index 0000000..4000b66 --- /dev/null +++ b/best-practices/project-structure/layer-sample/models/registration.go @@ -0,0 +1,3 @@ +package models + +type RegistrationModel struct{} diff --git a/best-practices/project-structure/layer-sample/services/customer.go b/best-practices/project-structure/layer-sample/services/customer.go new file mode 100644 index 0000000..e69de29 diff --git a/best-practices/project-structure/layer-sample/services/registration.go b/best-practices/project-structure/layer-sample/services/registration.go new file mode 100644 index 0000000..e69de29 diff --git a/best-practices/project-structure/layer-sample/storage/db.go b/best-practices/project-structure/layer-sample/storage/db.go new file mode 100644 index 0000000..bc57987 --- /dev/null +++ b/best-practices/project-structure/layer-sample/storage/db.go @@ -0,0 +1,9 @@ +package storage + +import "layeredsample/models" + +type DBStorage struct{} + +func (d *DBStorage) Save(c models.CustomerModel) { + +} diff --git a/best-practices/project-structure/layer-sample/storage/xml.go b/best-practices/project-structure/layer-sample/storage/xml.go new file mode 100644 index 0000000..81eeede --- /dev/null +++ b/best-practices/project-structure/layer-sample/storage/xml.go @@ -0,0 +1,3 @@ +package storage + +type XMLStorage struct{} diff --git a/best-practices/project-structure/module-sample/cmd/main.go b/best-practices/project-structure/module-sample/cmd/main.go new file mode 100644 index 0000000..e69de29 diff --git a/best-practices/project-structure/module-sample/registration/handler.go b/best-practices/project-structure/module-sample/registration/handler.go new file mode 100644 index 0000000..e69de29 diff --git a/best-practices/project-structure/module-sample/registration/registration.go b/best-practices/project-structure/module-sample/registration/registration.go new file mode 100644 index 0000000..e69de29 diff --git a/best-practices/project-structure/module-sample/registration/service.go b/best-practices/project-structure/module-sample/registration/service.go new file mode 100644 index 0000000..e69de29 diff --git a/best-practices/project-structure/module-sample/storage/db.go b/best-practices/project-structure/module-sample/storage/db.go new file mode 100644 index 0000000..e69de29 diff --git a/best-practices/project-structure/module-sample/storage/xml.go b/best-practices/project-structure/module-sample/storage/xml.go new file mode 100644 index 0000000..e69de29 diff --git a/best-practices/project-structure/module-sample/user/handler.go b/best-practices/project-structure/module-sample/user/handler.go new file mode 100644 index 0000000..e69de29 diff --git a/best-practices/project-structure/module-sample/user/service.go b/best-practices/project-structure/module-sample/user/service.go new file mode 100644 index 0000000..e69de29 diff --git a/best-practices/project-structure/module-sample/user/user.go b/best-practices/project-structure/module-sample/user/user.go new file mode 100644 index 0000000..e69de29 diff --git a/best-practices/project-structure/packagename/cmd/main.go b/best-practices/project-structure/packagename/cmd/main.go new file mode 100644 index 0000000..ca58e2b --- /dev/null +++ b/best-practices/project-structure/packagename/cmd/main.go @@ -0,0 +1,14 @@ +package main + +import ( + "encoding/json" + + "golang.source-fellows.com/samples/packagename/util" +) + +func main() { + + util.ParseValue("Hello World") + json.Marshal("Hello World") + +} diff --git a/best-practices/project-structure/packagename/go.mod b/best-practices/project-structure/packagename/go.mod new file mode 100644 index 0000000..631e37d --- /dev/null +++ b/best-practices/project-structure/packagename/go.mod @@ -0,0 +1,3 @@ +module golang.source-fellows.com/samples/packagename + +go 1.14 diff --git a/best-practices/project-structure/packagename/util/log.go b/best-practices/project-structure/packagename/util/log.go new file mode 100644 index 0000000..d3f9e54 --- /dev/null +++ b/best-practices/project-structure/packagename/util/log.go @@ -0,0 +1,7 @@ +package util + +import "fmt" + +func ParseValue(text string) { + fmt.Println(text) +} diff --git a/best-practices/single-method-interface/main.go b/best-practices/single-method-interface/main.go new file mode 100644 index 0000000..f7f4cd2 --- /dev/null +++ b/best-practices/single-method-interface/main.go @@ -0,0 +1,28 @@ +package main + +import ( + "fmt" +) + +type Logger interface { + Log(message string) +} + +type LoggerFunc func(message string) + +func (l LoggerFunc) Log(message string) { + l(message) +} + +func MyLogFunc(message string) { + fmt.Printf("I log %s\n", message) +} + +func myMethodTakesTheLog(l Logger) { + l.Log("my log message") +} + +func main() { + logger := LoggerFunc(MyLogFunc) + myMethodTakesTheLog(logger) +} diff --git a/best-practices/struct-to-text/main.go b/best-practices/struct-to-text/main.go new file mode 100644 index 0000000..e470b3c --- /dev/null +++ b/best-practices/struct-to-text/main.go @@ -0,0 +1,16 @@ +package main + +import "fmt" + +type Tester struct { + Name string + Alter int + Sonstwas string +} + +func main() { + + t := &Tester{Name: "Dingo", Alter: 3, Sonstwas: "Wert"} + fmt.Printf("%+v\n", t) + +} diff --git a/best-practices/synchron-api/main.go b/best-practices/synchron-api/main.go new file mode 100644 index 0000000..0a327e4 --- /dev/null +++ b/best-practices/synchron-api/main.go @@ -0,0 +1,11 @@ +package main + +type Reader struct { + c chan string +} + + + +func main() { + +} diff --git a/cloud-provider/aws-beanstak-sample/.gitignore b/cloud-provider/aws-beanstak-sample/.gitignore new file mode 100644 index 0000000..bca646a --- /dev/null +++ b/cloud-provider/aws-beanstak-sample/.gitignore @@ -0,0 +1,5 @@ + +# Elastic Beanstalk Files +.elasticbeanstalk/* +!.elasticbeanstalk/*.cfg.yml +!.elasticbeanstalk/*.global.yml diff --git a/cloud-provider/aws-beanstak-sample/Buildfile b/cloud-provider/aws-beanstak-sample/Buildfile new file mode 100644 index 0000000..e8aed28 --- /dev/null +++ b/cloud-provider/aws-beanstak-sample/Buildfile @@ -0,0 +1 @@ +make: ./build.sh \ No newline at end of file diff --git a/cloud-provider/aws-beanstak-sample/Dockerfile b/cloud-provider/aws-beanstak-sample/Dockerfile new file mode 100644 index 0000000..72ba415 --- /dev/null +++ b/cloud-provider/aws-beanstak-sample/Dockerfile @@ -0,0 +1,12 @@ +FROM ubuntu + +RUN apt-get update && apt-get install \ + build-essential zlib1g-dev libssl-dev libncurses-dev \ + libffi-dev libsqlite3-dev libreadline-dev libbz2-dev git curl wget -y + +WORKDIR /opt/ +RUN git clone https://github.com/aws/aws-elastic-beanstalk-cli-setup.git + +RUN ./aws-elastic-beanstalk-cli-setup/scripts/bundled_installer + +ENV PATH="/root/.ebcli-virtual-env/executables:/root/.pyenv/versions/3.7.2/bin:$PATH" \ No newline at end of file diff --git a/cloud-provider/aws-beanstak-sample/Procfile b/cloud-provider/aws-beanstak-sample/Procfile new file mode 100644 index 0000000..4997a78 --- /dev/null +++ b/cloud-provider/aws-beanstak-sample/Procfile @@ -0,0 +1 @@ +web: application \ No newline at end of file diff --git a/cloud-provider/aws-beanstak-sample/README.txt b/cloud-provider/aws-beanstak-sample/README.txt new file mode 100644 index 0000000..04d10d4 --- /dev/null +++ b/cloud-provider/aws-beanstak-sample/README.txt @@ -0,0 +1,13 @@ +Nutzer der EB-Cli über Docker-Container: + +Image erstellen und ausführen: +``` +docker build -t elasticbeanstalk-cli . +docker run -v `pwd`:/app -it elasticbeanstalk-cli /bin/bash +``` + +Innerhalb des Containers müssen folgende Kommandos ausgeführt werden: +``` +eb init -p go go-beanstalk-sample --region eu-central-1 +eb create go-env +``` \ No newline at end of file diff --git a/cloud-provider/aws-beanstak-sample/build.sh b/cloud-provider/aws-beanstak-sample/build.sh new file mode 100755 index 0000000..9005fbc --- /dev/null +++ b/cloud-provider/aws-beanstak-sample/build.sh @@ -0,0 +1,4 @@ +#!/usr/bin/env bash + +# Build app +go build -o application \ No newline at end of file diff --git a/cloud-provider/aws-beanstak-sample/go.mod b/cloud-provider/aws-beanstak-sample/go.mod new file mode 100644 index 0000000..325be1e --- /dev/null +++ b/cloud-provider/aws-beanstak-sample/go.mod @@ -0,0 +1,3 @@ +module golang.source-fellows.com/samples/cloud/beanstalk + +go 1.14 diff --git a/cloud-provider/aws-beanstak-sample/main.go b/cloud-provider/aws-beanstak-sample/main.go new file mode 100644 index 0000000..84cc6ca --- /dev/null +++ b/cloud-provider/aws-beanstak-sample/main.go @@ -0,0 +1,16 @@ +package main + +import ( + "fmt" + "net/http" + "time" +) + +func greet(w http.ResponseWriter, r *http.Request) { + fmt.Fprintf(w, "Hello World! %s", time.Now()) +} + +func main() { + http.HandleFunc("/", greet) + http.ListenAndServe(":5000", nil) +} diff --git a/cloud-provider/aws-lambda-go/README.txt b/cloud-provider/aws-lambda-go/README.txt new file mode 100644 index 0000000..4587d73 --- /dev/null +++ b/cloud-provider/aws-lambda-go/README.txt @@ -0,0 +1,10 @@ +``` +GOOS=linux go build main.go +zip function.zip main +aws lambda create-function \ + --function-name aws-lambda-sample \ + --runtime go1.x \ + --zip-file fileb://function.zip + --handler main + --role arn:aws:iam:::role/ +``` \ No newline at end of file diff --git a/cloud-provider/aws-lambda-go/function.zip b/cloud-provider/aws-lambda-go/function.zip new file mode 100644 index 0000000..6a7bf1d Binary files /dev/null and b/cloud-provider/aws-lambda-go/function.zip differ diff --git a/cloud-provider/aws-lambda-go/main.go b/cloud-provider/aws-lambda-go/main.go new file mode 100644 index 0000000..14a3eb8 --- /dev/null +++ b/cloud-provider/aws-lambda-go/main.go @@ -0,0 +1,24 @@ +package main + +import ( + "context" + "fmt" + + "github.com/aws/aws-lambda-go/lambda" + "github.com/aws/aws-lambda-go/lambdacontext" +) + +type MyEvent struct { + Name string `json:"name"` +} + +func HandleRequest(ctx context.Context, name MyEvent) (string, error) { + + lc, _ := lambdacontext.FromContext(ctx) + + return fmt.Sprintf("Hello %s! %s", name.Name, lc.AwsRequestID), nil +} + +func main() { + lambda.Start(HandleRequest) +} diff --git a/cloud-provider/azure-kubernetes/Dockerfile b/cloud-provider/azure-kubernetes/Dockerfile new file mode 100644 index 0000000..4deb6b7 --- /dev/null +++ b/cloud-provider/azure-kubernetes/Dockerfile @@ -0,0 +1,12 @@ +FROM golang:1 as builder + +WORKDIR /go/src/app +COPY *.go . +RUN CGO_ENABLED=0 go build . + +#################################### + +FROM alpine +COPY --from=builder /go/src/app/app . +EXPOSE 8080 +CMD [ "./app" ] diff --git a/cloud-provider/azure-kubernetes/README.txt b/cloud-provider/azure-kubernetes/README.txt new file mode 100644 index 0000000..9733181 --- /dev/null +++ b/cloud-provider/azure-kubernetes/README.txt @@ -0,0 +1,11 @@ + +``` +eval $(minikube docker-env) +docker build -t minikube-golang-sample . + +kubectl create -f manifest.yml +kubectl get pod +kubectl expose deployment golang-sample --type=NodePort +kubectl get service +minikube service golang-sample --url +``` diff --git a/cloud-provider/azure-kubernetes/main.go b/cloud-provider/azure-kubernetes/main.go new file mode 100644 index 0000000..00a35e4 --- /dev/null +++ b/cloud-provider/azure-kubernetes/main.go @@ -0,0 +1,16 @@ +package main + +import ( + "fmt" + "net/http" + "time" +) + +func greet(w http.ResponseWriter, r *http.Request) { + fmt.Fprintf(w, "Hello World! %s", time.Now()) +} + +func main() { + http.HandleFunc("/", greet) + http.ListenAndServe(":8080", nil) +} diff --git a/cloud-provider/azure-kubernetes/manifest.yml b/cloud-provider/azure-kubernetes/manifest.yml new file mode 100644 index 0000000..3bd12d9 --- /dev/null +++ b/cloud-provider/azure-kubernetes/manifest.yml @@ -0,0 +1,26 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + creationTimestamp: null + labels: + app: go-azure-sample + name: go-azure-sample +spec: + replicas: 2 + selector: + matchLabels: + app: go-azure-sample + strategy: {} + template: + metadata: + creationTimestamp: null + labels: + app: go-azure-sample + spec: + containers: + - image: trainingfellow.azurecr.io/go-azure-sample + name: go-azure-sample + resources: {} + ports: + - containerPort: 8080 +status: {} \ No newline at end of file diff --git a/cloud-provider/docker-compose/Dockerfile.receiver b/cloud-provider/docker-compose/Dockerfile.receiver new file mode 100644 index 0000000..ffd7736 --- /dev/null +++ b/cloud-provider/docker-compose/Dockerfile.receiver @@ -0,0 +1,13 @@ +FROM golang:1 as builder + +WORKDIR /go/src/app + +COPY go.* ./ +RUN go mod download + +COPY . . +RUN CGO_ENABLED=0 go build -o app ./cmd/receiver + +FROM alpine:latest +COPY --from=builder /go/src/app . +CMD ["./app"] diff --git a/cloud-provider/docker-compose/Dockerfile.sender b/cloud-provider/docker-compose/Dockerfile.sender new file mode 100644 index 0000000..805412d --- /dev/null +++ b/cloud-provider/docker-compose/Dockerfile.sender @@ -0,0 +1,13 @@ +FROM golang:1 as builder + +WORKDIR /go/src/app + +COPY go.* ./ +RUN go mod download + +COPY . . +RUN CGO_ENABLED=0 go build -o app ./cmd/sender + +FROM alpine:latest +COPY --from=builder /go/src/app . +CMD ["./app"] diff --git a/cloud-provider/docker-compose/cmd/receiver/main.go b/cloud-provider/docker-compose/cmd/receiver/main.go new file mode 100644 index 0000000..e0ccec5 --- /dev/null +++ b/cloud-provider/docker-compose/cmd/receiver/main.go @@ -0,0 +1,70 @@ +package main + +import ( + "context" + "log" + "os" + "sync" + "time" + + "github.com/nats-io/nats.go" +) + +type Message struct { + Text string +} + +func connectNATS(ctx context.Context, url string) (*nats.Conn, error) { + var err error + for { + select { + case <-ctx.Done(): + return nil, err + default: + var nc *nats.Conn + nc, err = nats.Connect(url) + if err == nil { + return nc, err + } + } + } + +} + +func main() { + + url := nats.DefaultURL + if v, ok := os.LookupEnv("NATS_URL"); ok { + url = v + } + + ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) + defer cancel() + nc, err := connectNATS(ctx, url) + if err != nil { + log.Fatalf("Could not connect to server because of %v", err) + } + defer nc.Close() + log.Println("successfully connected to NATS server") + + c, _ := nats.NewEncodedConn(nc, nats.JSON_ENCODER) + defer c.Close() + + wg := sync.WaitGroup{} + wg.Add(1) + + sub, err := c.Subscribe("testing", func(message *Message) { + log.Printf("neue Nachricht %+v", message) + }) + + if err != nil { + log.Fatalf("Could not subscribe because of %v", err) + } + + log.Printf("Warte auf Nachrichten") + wg.Wait() + + sub.Unsubscribe() + sub.Drain() + +} diff --git a/cloud-provider/docker-compose/cmd/sender/main.go b/cloud-provider/docker-compose/cmd/sender/main.go new file mode 100644 index 0000000..12e2a8c --- /dev/null +++ b/cloud-provider/docker-compose/cmd/sender/main.go @@ -0,0 +1,44 @@ +package main + +import ( + "log" + "os" + "time" + + "github.com/nats-io/nats.go" +) + +type Message struct { + Text string +} + +func sendMessage(url string) error { + nc, err := nats.Connect(url) + if err != nil { + return err + } + defer nc.Close() + c, _ := nats.NewEncodedConn(nc, nats.JSON_ENCODER) + defer c.Close() + + return c.Publish("testing", &Message{"Hello World"}) +} + +func main() { + + url := nats.DefaultURL + if v, ok := os.LookupEnv("NATS_URL"); ok { + url = v + } + + for { + err := sendMessage(url) + if err != nil { + log.Println(err) + } else { + log.Println("Nachricht versendet") + } + time.Sleep(4 * time.Second) + } + +} diff --git a/cloud-provider/docker-compose/docker-compose.yml b/cloud-provider/docker-compose/docker-compose.yml new file mode 100644 index 0000000..22a34e6 --- /dev/null +++ b/cloud-provider/docker-compose/docker-compose.yml @@ -0,0 +1,16 @@ +version: '3' +services: + sender-application: + build: + context: . + dockerfile: Dockerfile.sender + environment: + NATS_URL: "nats://nats-server:4222" + receiver-application: + build: + context: . + dockerfile: Dockerfile.receiver + environment: + NATS_URL: "nats://nats-server:4222" + nats-server: + image: nats \ No newline at end of file diff --git a/cloud-provider/docker-compose/go.mod b/cloud-provider/docker-compose/go.mod new file mode 100644 index 0000000..fd82645 --- /dev/null +++ b/cloud-provider/docker-compose/go.mod @@ -0,0 +1,5 @@ +module golang.source-fellows.com/samples/cloud/dockercompose + +go 1.14 + +require github.com/nats-io/nats.go v1.10.0 // indirect diff --git a/cloud-provider/docker-compose/go.sum b/cloud-provider/docker-compose/go.sum new file mode 100644 index 0000000..3dd11f0 --- /dev/null +++ b/cloud-provider/docker-compose/go.sum @@ -0,0 +1,17 @@ +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.go v1.10.0 h1:L8qnKaofSfNFbXg0C5F71LdjPRnmQwSsA4ukmkt1TvY= +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= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200323165209-0ec3e9974c59 h1:3zb4D3T4G8jdExgVU/95+vQXfpEPiMdCaZgmGVxjNHM= +golang.org/x/crypto v0.0.0-20200323165209-0ec3e9974c59/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= diff --git a/cloud-provider/docker-sample-multistage/Dockerfile b/cloud-provider/docker-sample-multistage/Dockerfile new file mode 100644 index 0000000..758ce51 --- /dev/null +++ b/cloud-provider/docker-sample-multistage/Dockerfile @@ -0,0 +1,11 @@ +FROM golang:1 as builder + +WORKDIR /go/src/app +COPY *.go . +RUN CGO_ENABLED=0 go build . + +#################################### + +FROM alpine +COPY --from=builder /go/src/app/app . +CMD [ "./app" ] diff --git a/cloud-provider/docker-sample-multistage/main.go b/cloud-provider/docker-sample-multistage/main.go new file mode 100644 index 0000000..20f0d0f --- /dev/null +++ b/cloud-provider/docker-sample-multistage/main.go @@ -0,0 +1,9 @@ +package main + +import ( + "fmt" +) + +func main() { + fmt.Println("Hello World!") +} diff --git a/cloud-provider/docker-sample/Dockerfile b/cloud-provider/docker-sample/Dockerfile new file mode 100644 index 0000000..932f87d --- /dev/null +++ b/cloud-provider/docker-sample/Dockerfile @@ -0,0 +1,7 @@ +FROM golang + +WORKDIR /go/src/app +COPY *.go . +RUN go install . + +CMD ["app"] \ No newline at end of file diff --git a/cloud-provider/docker-sample/main.go b/cloud-provider/docker-sample/main.go new file mode 100644 index 0000000..20f0d0f --- /dev/null +++ b/cloud-provider/docker-sample/main.go @@ -0,0 +1,9 @@ +package main + +import ( + "fmt" +) + +func main() { + fmt.Println("Hello World!") +} diff --git a/cloud-provider/go-cloud/Dockerfile b/cloud-provider/go-cloud/Dockerfile new file mode 100644 index 0000000..368339e --- /dev/null +++ b/cloud-provider/go-cloud/Dockerfile @@ -0,0 +1,14 @@ +FROM golang:1 as builder + +WORKDIR /go/src/app +COPY go.* ./ +RUN go mod download +COPY *.go ./ +RUN CGO_ENABLED=0 go build . + +#################################### + +FROM alpine +COPY --from=builder /go/src/app/gcloud . +EXPOSE 8080 +CMD [ "./gcloud" ] diff --git a/cloud-provider/go-cloud/docker-compose.yml b/cloud-provider/go-cloud/docker-compose.yml new file mode 100644 index 0000000..b59c535 --- /dev/null +++ b/cloud-provider/go-cloud/docker-compose.yml @@ -0,0 +1,13 @@ +version: '3' +services: + application: + build: . + ports: + - 8080:8080 + minio-server: + image: minio/minio + command: server /data + volumes: + - ./minio:/data + ports: + - 9000:9000 \ No newline at end of file diff --git a/cloud-provider/go-cloud/go.mod b/cloud-provider/go-cloud/go.mod new file mode 100644 index 0000000..b6661d2 --- /dev/null +++ b/cloud-provider/go-cloud/go.mod @@ -0,0 +1,15 @@ +module golang.source-fellows.com/gobuch/gcloud + +go 1.14 + +require ( + github.com/gin-gonic/gin v1.6.3 // indirect + github.com/go-playground/validator/v10 v10.3.0 // indirect + github.com/json-iterator/go v1.1.10 // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.1 // indirect + gocloud.dev v0.20.0 // indirect + golang.org/x/sys v0.0.0-20200808120158-1030fc2bf1d9 // indirect + google.golang.org/protobuf v1.25.0 // indirect + gopkg.in/yaml.v2 v2.3.0 // indirect +) diff --git a/cloud-provider/go-cloud/go.sum b/cloud-provider/go-cloud/go.sum new file mode 100644 index 0000000..64b072a --- /dev/null +++ b/cloud-provider/go-cloud/go.sum @@ -0,0 +1,478 @@ +bazil.org/fuse v0.0.0-20180421153158-65cc252bf669/go.mod h1:Xbm+BRKSBEpa4q4hTSxohYNQpsxXPbPry4JJWOB3LB8= +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.39.0/go.mod h1:rVLT6fkc8chs9sfPtFc1SBH6em7n+ZoXaG+87tDISts= +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.44.3/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 v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= +cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= +cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= +cloud.google.com/go v0.55.0/go.mod h1:ZHmoY+/lIMNkN2+fBmuTiqZ4inFhvQad8ft7MT8IV5Y= +cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= +cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= +cloud.google.com/go v0.58.0/go.mod h1:W+9FnSUw6nhVwXlFcp1eL+krq5+HQUJeUogSeJZZiWg= +cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= +cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= +cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= +cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= +cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= +cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= +cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= +cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= +cloud.google.com/go/firestore v1.2.0/go.mod h1:iISCjWnTpnoJT1R287xRdjvQHJrxQOpeah4phb5D3h0= +cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= +cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= +cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= +cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= +cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= +cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= +cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= +cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= +cloud.google.com/go/storage v1.9.0/go.mod h1:m+/etGaqZbylxaNT876QGXqEHp4PR2Rq5GMqICWb9bU= +contrib.go.opencensus.io/exporter/aws v0.0.0-20181029163544-2befc13012d0/go.mod h1:uu1P0UCM/6RbsMrgPa98ll8ZcHM858i/AD06a9aLRCA= +contrib.go.opencensus.io/exporter/stackdriver v0.12.1/go.mod h1:iwB6wGarfphGGe/e5CWqyUk/cLzKnWsOKPVW3no6OTw= +contrib.go.opencensus.io/integrations/ocsql v0.1.4/go.mod h1:8DsSdjz3F+APR+0z0WkU1aRorQCFfRxvqjUUPMbF3fE= +contrib.go.opencensus.io/resource v0.1.1/go.mod h1:F361eGI91LCmW1I/Saf+rX0+OFcigGlFvXwEGEnkRLA= +dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +github.com/Azure/azure-amqp-common-go/v3 v3.0.0/go.mod h1:SY08giD/XbhTz07tJdpw1SoxQXHPN30+DI3Z04SYqyg= +github.com/Azure/azure-pipeline-go v0.2.1/go.mod h1:UGSo8XybXnIGZ3epmeBw7Jdz+HiUVpqIlpz/HKHylF4= +github.com/Azure/azure-pipeline-go v0.2.2/go.mod h1:4rQ/NZncSvGqNkkOsNpOU1tgoNuIlp9AfUH5G1tvCHc= +github.com/Azure/azure-sdk-for-go v37.1.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= +github.com/Azure/azure-service-bus-go v0.10.1/go.mod h1:E/FOceuKAFUfpbIJDKWz/May6guE+eGibfGT6q+n1to= +github.com/Azure/azure-storage-blob-go v0.9.0/go.mod h1:8UBPbiOhrMQ4pLPi3gA1tXnpjrS76UYE/fo5A40vf4g= +github.com/Azure/go-amqp v0.12.6/go.mod h1:qApuH6OFTSKZFmCOxccvAv5rLizBQf4v8pRmG138DPo= +github.com/Azure/go-amqp v0.12.7/go.mod h1:qApuH6OFTSKZFmCOxccvAv5rLizBQf4v8pRmG138DPo= +github.com/Azure/go-autorest/autorest v0.9.0/go.mod h1:xyHB1BMZT0cuDHU7I0+g046+BFDTQ8rEZB0s4Yfa6bI= +github.com/Azure/go-autorest/autorest v0.9.3/go.mod h1:GsRuLYvwzLjjjRoWEIyMUaYq8GNUx2nRB378IPt/1p0= +github.com/Azure/go-autorest/autorest/adal v0.5.0/go.mod h1:8Z9fGy2MpX0PvDjB1pEgQTmVqjGhiHBW7RJJEciWzS0= +github.com/Azure/go-autorest/autorest/adal v0.8.0/go.mod h1:Z6vX6WXXuyieHAXwMj0S6HY6e6wcHn37qQMBQlvY3lc= +github.com/Azure/go-autorest/autorest/adal v0.8.1/go.mod h1:ZjhuQClTqx435SRJ2iMlOxPYt3d2C/T/7TiQCVZSn3Q= +github.com/Azure/go-autorest/autorest/adal v0.8.3/go.mod h1:ZjhuQClTqx435SRJ2iMlOxPYt3d2C/T/7TiQCVZSn3Q= +github.com/Azure/go-autorest/autorest/azure/auth v0.4.2/go.mod h1:90gmfKdlmKgfjUpnCEpOJzsUEjrWDSLwHIG73tSXddM= +github.com/Azure/go-autorest/autorest/azure/cli v0.3.1/go.mod h1:ZG5p860J94/0kI9mNJVoIoLgXcirM2gF5i2kWloofxw= +github.com/Azure/go-autorest/autorest/date v0.1.0/go.mod h1:plvfp3oPSKwf2DNjlBjWF/7vwR+cUD/ELuzDCXwHUVA= +github.com/Azure/go-autorest/autorest/date v0.2.0/go.mod h1:vcORJHLJEh643/Ioh9+vPmf1Ij9AEBM5FuBIXLmIy0g= +github.com/Azure/go-autorest/autorest/mocks v0.1.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= +github.com/Azure/go-autorest/autorest/mocks v0.2.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= +github.com/Azure/go-autorest/autorest/mocks v0.3.0/go.mod h1:a8FDP3DYzQ4RYfVAxAN3SVSiiO77gL2j2ronKKP0syM= +github.com/Azure/go-autorest/autorest/to v0.3.0/go.mod h1:MgwOyqaIuKdG4TL/2ywSsIWKAfJfgHDo8ObuUk3t5sA= +github.com/Azure/go-autorest/autorest/validation v0.2.0/go.mod h1:3EEqHnBxQGHXRYq3HT1WyXAvT7LLY3tl70hw6tQIbjI= +github.com/Azure/go-autorest/logger v0.1.0/go.mod h1:oExouG+K6PryycPJfVSxi/koC6LSNgds39diKLz7Vrc= +github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbtp2fGCgRFtBroKn4Dk= +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/GoogleCloudPlatform/cloudsql-proxy v0.0.0-20191009163259-e802c2cb94ae/go.mod h1:mjwGPas4yKduTyubHvD1Atl9r1rUq8DfVy+gkVvZ+oo= +github.com/aws/aws-sdk-go v1.15.27/go.mod h1:mFuSZ37Z9YOHbQEwBWztmVzqXrEkub65tZoCYDt7FT0= +github.com/aws/aws-sdk-go v1.19.18/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= +github.com/aws/aws-sdk-go v1.31.13 h1:UeWMTRTL0XAKLR7vxDL4/u7KOtz/LtfJr+lXtxN4YEQ= +github.com/aws/aws-sdk-go v1.31.13/go.mod h1:5zCpMtNQVjRREroY7sYe8lOMRSxkhG6MZveU8YkpAk0= +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/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/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/devigned/tab v0.1.1/go.mod h1:XG9mPq0dFghrYvoBF3xdRrJzSTX1b7IQrvaL9mzjeJY= +github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= +github.com/dimchansky/utfbom v1.1.0/go.mod h1:rO41eb7gLfo8SF1jd9F8HplJm1Fewwi4mQvIirEdv+8= +github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= +github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= +github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= +github.com/gin-gonic/gin v1.6.3 h1:ahKqKTFpO5KTPHxWZjEdPScmYaGtLo8Y4DMHoEsnp14= +github.com/gin-gonic/gin v1.6.3/go.mod h1:75u5sXoLsGZoRN5Sgbi1eraJ4GU3++wFwWzhwvtwp4M= +github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-ini/ini v1.25.4/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8= +github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= +github.com/go-playground/locales v0.13.0 h1:HyWk6mgj5qFqCT5fjGBuRArbVDfE4hi8+e8ceBS/t7Q= +github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= +github.com/go-playground/universal-translator v0.17.0 h1:icxd5fm+REJzpZx7ZfpaD876Lmtgy7VtROAbHHXk8no= +github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= +github.com/go-playground/validator/v10 v10.2.0 h1:KgJ0snyC2R9VXYN2rneOtQcw5aHQB1Vv0sFl1UcHBOY= +github.com/go-playground/validator/v10 v10.2.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GOhaH6EGOAJShg8Id5JGkI= +github.com/go-playground/validator/v10 v10.3.0 h1:nZU+7q+yJoFmwvNgv/LnPUkwPal62+b2xXj0AU1Es7o= +github.com/go-playground/validator/v10 v10.3.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GOhaH6EGOAJShg8Id5JGkI= +github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e h1:1r7pUrabqp18hOBcwBwiTsbnFeTZHV9eER/QT5JVZxY= +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/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +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.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +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/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.4.1/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-replayers/grpcreplay v0.1.0/go.mod h1:8Ig2Idjpr6gifRd6pNVggX6TC1Zw6Jx74AKp7QNH2QE= +github.com/google/go-replayers/httpreplay v0.1.0/go.mod h1:YKZViNhiGgqdBlUbI2MwGpq4pXxNmhJLPHQ7cv2b5no= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= +github.com/google/martian v2.1.1-0.20190517191504-25dcb96d9e51+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/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200507031123-427632fa3b1c/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/subcommands v1.0.1/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= +github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/wire v0.4.0 h1:kXcsA/rIGzJImVqPdhfnr6q0xsS9gU0515q1EPpJ9fE= +github.com/google/wire v0.4.0/go.mod h1:ngWDr9Qvq3yZA10YrxfyGELY/AFWGVpy9c1LTRi1EoU= +github.com/googleapis/gax-go v2.0.2+incompatible h1:silFMLAnr330+NRuag/VjIGF7TLp/LBrV2CJKFLWEww= +github.com/googleapis/gax-go v2.0.2+incompatible/go.mod h1:SFVmujtThgffbyetf+mdk2eWhX2bMyUtNHzFKcPA9HY= +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/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/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/jmespath/go-jmespath v0.0.0-20160202185014-0b12d6b521d8/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= +github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= +github.com/jmespath/go-jmespath v0.3.0 h1:OS12ieG61fsCg5+qLJ+SsW9NicxNkg3b25OyT2yCeUc= +github.com/jmespath/go-jmespath v0.3.0/go.mod h1:9QtRXoHjLGCJ5IBSaohpXITPlowMeeYCZ7fLUTSywik= +github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg= +github.com/json-iterator/go v1.1.9 h1:9yzud/Ht36ygwatGx56VwCZtlI/2AD15T1X2sjSuGns= +github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.10 h1:Kz6Cvnvv2wGdaG/V8yMvfkmNiXq9Ya2KUv4rouJJr68= +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/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +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/leodido/go-urn v1.2.0 h1:hpXL4XnriNwQ/ABnpepYM/1vCLWNDfUNts8dX3xTG6Y= +github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= +github.com/lib/pq v1.1.1/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/mattn/go-ieproxy v0.0.0-20190610004146-91bb50d98149/go.mod h1:31jz6HNzdxOmlERGGEc4v/dMssOfmp2p5bT/okiKFFc= +github.com/mattn/go-ieproxy v0.0.0-20190702010315-6dee0af9227d/go.mod h1:31jz6HNzdxOmlERGGEc4v/dMssOfmp2p5bT/okiKFFc= +github.com/mattn/go-ieproxy v0.0.1/go.mod h1:pYabZ6IHcRpFh7vIaLfK7rdcWgFEb3SFJ6/gNWuh88E= +github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY= +github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= +github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 h1:ZqeYNhU3OHLH3mGKHDcjJRFFRrJa6eAM5H+CtDdOsPc= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742 h1:Esafd1046DLDQ0W1YjYsBW+p8U2u7vzgW2SQVmlNazg= +github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI= +github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= +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/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/ugorji/go v1.1.7 h1:/68gy2h+1mWMrwZFeD1kQialdSzAb432dtpeJ42ovdo= +github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= +github.com/ugorji/go/codec v1.1.7 h1:2SvQaVZ1ouYrrKKwoSk2pzd4A9evlKJb9oTL+OaLUSs= +github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= +github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +go.opencensus.io v0.15.0/go.mod h1:UffZAU+4sDEINUGP/B7UfBBkq4fqLu9zXAX7ke6CHW0= +go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= +go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= +go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.3 h1:8sGtKOrtQqkN1bp2AtX+misvLIlOmsEsNd+9NIcPEm8= +go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +gocloud.dev v0.20.0 h1:mbEKMfnyPV7W1Rj35R1xXfjszs9dXkwSOq2KoFr25g8= +gocloud.dev v0.20.0/go.mod h1:+Y/RpSXrJthIOM8uFNzWp6MRu9pFPNFEEZrQMxpkfIc= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +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-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413/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-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= +golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= +golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= +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/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +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/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +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-20190108225652-1e06a53dbb7e/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-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-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20190619014844-b5b0513f8c1b/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-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191112182307-2180aed22343/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/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-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200602114024-627f9648deb9 h1:pNX+40auqi2JqRfOP1akLGtYcn15TUbkhwuCO3foqqM= +golang.org/x/net v0.0.0-20200602114024-627f9648deb9/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/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-20190402181905-9f3314589c9a/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/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/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/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-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/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-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-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191112214154-59a1497f0cea/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200317113312-5766fd39f98d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200602225109-6fdc65e7d980 h1:OjiUf46hAmXblsZdnoSXsEUSKU8r1UEzcL5RVZ4gO9Y= +golang.org/x/sys v0.0.0-20200602225109-6fdc65e7d980/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200808120158-1030fc2bf1d9 h1:yi1hN8dcqI9l8klZfy4B8mJvFmmAxJEePIQQFNSd7Cs= +golang.org/x/sys v0.0.0-20200808120158-1030fc2bf1d9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +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-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/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-20190422233926-fe54fb35175b/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-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/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-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200317043434-63da46f3035e/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= +golang.org/x/tools v0.0.0-20200325010219-a49f79bcc224/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= +golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= +golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200601175630-2caf76543d99/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200606014950-c42cb6316fb6/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200608174601-1b747fd94509/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +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 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= +google.golang.org/api v0.5.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.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.26.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +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/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/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-20190508193815-b515fa19cec8/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190530194941-fb225487d101/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= +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-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= +google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200317114155-1f3552e48f24/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200325114520-5b2d0af7952b/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= +google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= +google.golang.org/genproto v0.0.0-20200603110839-e855014d5736/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= +google.golang.org/genproto v0.0.0-20200608115520-7c474a2e3482 h1:i+Aiej6cta/Frzp13/swvwz5O00kYcSe0A/C5Wd7zX8= +google.golang.org/genproto v0.0.0-20200608115520-7c474a2e3482/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= +google.golang.org/grpc v1.19.0/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.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= +google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= +google.golang.org/grpc v1.29.1 h1:EC2SB8S04d2r73uptxphDSUG+kTKVgjRPF+N3xpxRB4= +google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= +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/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.24.0 h1:UhZDfRO8JRQru4/+LlLE0BRKGF8L+PICnvYZmx/fEGA= +google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= +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/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/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/yaml.v2 v2.2.2/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= +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= +honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= +rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= +rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= diff --git a/cloud-provider/go-cloud/main.go b/cloud-provider/go-cloud/main.go new file mode 100644 index 0000000..f6507a1 --- /dev/null +++ b/cloud-provider/go-cloud/main.go @@ -0,0 +1,76 @@ +package main + +import ( + "io" + "log" + "net/http" + "os" + + "github.com/gin-gonic/gin" + "gocloud.dev/blob" + _ "gocloud.dev/blob/s3blob" +) + +var serverURL string + +func readfile(c *gin.Context) { + ctx := c.Request.Context() + bucket, err := blob.OpenBucket(ctx, serverURL) + if err != nil { + c.AbortWithStatus(http.StatusInternalServerError) + return + } + defer bucket.Close() + + reader, err := bucket.NewReader(ctx, "gopher.png", nil) + if err != nil { + c.AbortWithStatus(http.StatusInternalServerError) + return + } + defer reader.Close() + + c.Header("Content-Type", "image/png") + io.Copy(c.Writer, reader) + +} + +func writefile(c *gin.Context) { + ctx := c.Request.Context() + bucket, err := blob.OpenBucket(ctx, serverURL) + if err != nil { + c.AbortWithStatus(http.StatusInternalServerError) + return + } + defer bucket.Close() + + writer, err := bucket.NewWriter(ctx, "gopher.png", nil) + if err != nil { + log.Println(err) + c.AbortWithStatus(http.StatusInternalServerError) + return + } + defer writer.Close() + _, err = io.Copy(writer, c.Request.Body) + if err != nil { + log.Println(err) + c.AbortWithStatus(http.StatusInternalServerError) + return + } + + c.Status(http.StatusCreated) +} + +func main() { + + os.Setenv("AWS_ACCESS_KEY", "minioadmin") + os.Setenv("AWS_SECRET_KEY", "minioadmin") + + log.Println("starting...") + + serverURL = "s3://gocloud?endpoint=localhost:9000&disableSSL=true&s3ForcePathStyle=true®ion=DE" + + r := gin.Default() + r.GET("/", readfile) + r.POST("/", writefile) + r.Run() +} diff --git a/cloud-provider/go-cloud/manifest.yml b/cloud-provider/go-cloud/manifest.yml new file mode 100644 index 0000000..bdc42e2 --- /dev/null +++ b/cloud-provider/go-cloud/manifest.yml @@ -0,0 +1,36 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + creationTimestamp: null + labels: + app: gcloud-sample + name: gcloud-sample +spec: + replicas: 2 + selector: + matchLabels: + app: gcloud-sample + strategy: {} + template: + metadata: + creationTimestamp: null + labels: + app: gcloud-sample + spec: + containers: + - image: minikube-gcloud-sample + name: gcloud-sample-service + imagePullPolicy: Never + resources: {} + ports: + - containerPort: 8080 + - image: minio/minio + name: minio + args: ["server", "/data"] + volumeMounts: + - name: minio-storage + mountPath: /data + volumes: + - name: minio-storage + emptyDir: {} +status: {} \ No newline at end of file diff --git a/cloud-provider/go-cloud/minio/gocloud/gopher.png b/cloud-provider/go-cloud/minio/gocloud/gopher.png new file mode 100644 index 0000000..8262174 Binary files /dev/null and b/cloud-provider/go-cloud/minio/gocloud/gopher.png differ diff --git a/cloud-provider/google-cloud-hello/.gitignore b/cloud-provider/google-cloud-hello/.gitignore new file mode 100644 index 0000000..2712ffa --- /dev/null +++ b/cloud-provider/google-cloud-hello/.gitignore @@ -0,0 +1,14 @@ +# Binaries for programs and plugins +*.exe +*.exe~ +*.dll +*.so +*.dylib +# delve output +debug + +# Test binary, built with `go test -c` +*.test + +# Output of the go coverage tool, specifically when used with LiteIDE +*.out diff --git a/cloud-provider/google-cloud-hello/.idea/.gitignore b/cloud-provider/google-cloud-hello/.idea/.gitignore new file mode 100644 index 0000000..5c98b42 --- /dev/null +++ b/cloud-provider/google-cloud-hello/.idea/.gitignore @@ -0,0 +1,2 @@ +# Default ignored files +/workspace.xml \ No newline at end of file diff --git a/cloud-provider/google-cloud-hello/.idea/externalDependencies.xml b/cloud-provider/google-cloud-hello/.idea/externalDependencies.xml new file mode 100644 index 0000000..fc2f618 --- /dev/null +++ b/cloud-provider/google-cloud-hello/.idea/externalDependencies.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/cloud-provider/google-cloud-hello/.idea/go-hello-world.iml b/cloud-provider/google-cloud-hello/.idea/go-hello-world.iml new file mode 100644 index 0000000..c956989 --- /dev/null +++ b/cloud-provider/google-cloud-hello/.idea/go-hello-world.iml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/cloud-provider/google-cloud-hello/.idea/modules.xml b/cloud-provider/google-cloud-hello/.idea/modules.xml new file mode 100644 index 0000000..94566e0 --- /dev/null +++ b/cloud-provider/google-cloud-hello/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/cloud-provider/google-cloud-hello/.vscode/extensions.json b/cloud-provider/google-cloud-hello/.vscode/extensions.json new file mode 100644 index 0000000..2767220 --- /dev/null +++ b/cloud-provider/google-cloud-hello/.vscode/extensions.json @@ -0,0 +1,5 @@ +{ + "recommendations": [ + "googlecloudtools.cloudcode", + ] +} diff --git a/cloud-provider/google-cloud-hello/.vscode/launch.json b/cloud-provider/google-cloud-hello/.vscode/launch.json new file mode 100644 index 0000000..d2caaaf --- /dev/null +++ b/cloud-provider/google-cloud-hello/.vscode/launch.json @@ -0,0 +1,22 @@ +{ + "version": "0.2.0", + "configurations": [ + { + "name": "Run on Kubernetes", + "type": "cloudcode.kubernetes", + "request": "launch", + "skaffoldConfig": "${workspaceFolder}/skaffold.yaml", + "watch": true, + "cleanUp": true, + "portForward": true, + "imageRegistry": "gcr.io/gobuch-72abe" + }, + { + "type": "go", + "request": "launch", + "name": "Launch (local)", + "mode": "auto", + "program": "${workspaceFolder}/cmd/hello-world" + } + ] +} diff --git a/cloud-provider/google-cloud-hello/.vscode/tasks.json b/cloud-provider/google-cloud-hello/.vscode/tasks.json new file mode 100644 index 0000000..77c188e --- /dev/null +++ b/cloud-provider/google-cloud-hello/.vscode/tasks.json @@ -0,0 +1,42 @@ +{ + // See https://go.microsoft.com/fwlink/?LinkId=733558 + // for the documentation about the tasks.json format + "version": "2.0.0", + "presentation": { + "panel": "shared", + "showReuseMessage": true, + }, + "tasks": [ + { + "group": "build", + "label": "Build container image using local Docker", + "type": "process", + "command": "skaffold", + "args": [ + "build", + "-p=no-push" + ], + "problemMatcher": [], + }, + { + "label": "Deploy to Kubernetes cluster", + "type": "process", + "command": "skaffold", + "args": [ + "run" + ], + "problemMatcher": [], + }, + { + "label": "View application logs on Kubernetes", + "type": "process", + "command": "kubectl", + "args": [ + "logs", + "--selector", + "app=hello-world" + ], + "problemMatcher": [], + } + ] +} diff --git a/cloud-provider/google-cloud-hello/Dockerfile b/cloud-provider/google-cloud-hello/Dockerfile new file mode 100644 index 0000000..15e7c73 --- /dev/null +++ b/cloud-provider/google-cloud-hello/Dockerfile @@ -0,0 +1,29 @@ +# Use base golang image from Docker Hub +FROM golang:1.14 + +# Download the dlv (delve) debugger for go (you can comment this out if unused) +RUN go get -u -v github.com/go-delve/delve/cmd/dlv + +WORKDIR /src/hello-world + +# Install dependencies in go.mod and go.sum +COPY go.mod go.sum ./ +RUN go mod download + +# Copy rest of the application source code +COPY . ./ + +# Compile the application to /app. +RUN go build -o /app -v ./cmd/hello-world + +# If you want to use the debugger, you need to modify the entrypoint to the +# container and point it to the "dlv debug" command: +# * UNCOMMENT the following ENTRYPOINT statement, +# * COMMENT OUT the last ENTRYPOINT statement +# Start the "dlv debug" server on port 3000 of the container. +ENTRYPOINT ["dlv", "exec", "/app", "--continue", "--accept-multiclient", "--api-version=2", "--headless", "--listen=:3000", "--log"] + +# If you want to run WITHOUT the debugging server: +# * COMMENT OUT the previous ENTRYPOINT statements, +# * UNCOMMENT the following ENTRYPOINT statement. +# ENTRYPOINT ["/app"] diff --git a/cloud-provider/google-cloud-hello/README.md b/cloud-provider/google-cloud-hello/README.md new file mode 100644 index 0000000..177fa96 --- /dev/null +++ b/cloud-provider/google-cloud-hello/README.md @@ -0,0 +1,73 @@ +# Hello World with Cloud Code + +![Architecture Diagram](./img/diagram.png) + +"Hello World" is a simple Kubernetes application that contains a single +[Deployment](https://kubernetes.io/docs/concepts/workloads/controllers/deployment/) and a corresponding +[Service](https://kubernetes.io/docs/concepts/services-networking/service/). The Deployment contains a + web server that simply prints "Hello World". + +---- + +## Table of Contents + +* [VS Code Guide](#vs-code-guide) + 1. [Getting Started](#vs-code-getting-started) + 2. [What's in the box](https://cloud.google.com/code/docs/vscode/quickstart#whats_in_the_box) +* [IntelliJ Guide](#intellij-guide) + 1. [Getting Started](#intellij-getting-started) + 2. [What's in the box](https://cloud.google.com/code/docs/intellij/quickstart#whats_in_the_box) +* [Using the Command Line](#using-the-command-line) + +---- + +## VS Code Guide + +### VS Code Getting Started + +This sample was written to demonstrate how to use the Cloud Code extension for Visual Studio Code. + +* [Install Cloud Code for VS Code](https://cloud.google.com/code/docs/vscode/install) +* [Creating a new app](https://cloud.google.com/code/docs/vscode/creating-an-application) +* [Editing YAML files](https://cloud.google.com/code/docs/vscode/yaml-editing) + +### Using Cloud Code +* [Set up a Google Kubernetes Engine Cluster](https://cloud.google.com/code/docs/vscode/quickstart#creating_a_google_kubernetes_engine_cluster) +* [Running the app](https://cloud.google.com/code/docs/vscode/quickstart#running_your_app) +* [Debug the app](https://cloud.google.com/code/docs/vscode/quickstart#debugging_your_app) +* [View Container Logs](https://cloud.google.com/code/docs/vscode/quickstart#viewing_logs) +* [Open a Terminal in Your Container](https://cloud.google.com/code/docs/vscode/quickstart#bonus_opening_a_terminal_in_your_container) +---- + +## IntelliJ Guide + +### IntelliJ Getting Started + +This sample was written to demonstrate how to use the Cloud Code plugin for IntelliJ. + +* [Install Cloud Code for IntelliJ](https://cloud.google.com/code/docs/intellij/install) +* [Creating a new app](https://cloud.google.com/code/docs/intellij/creating-a-k8-app) +* [Editing YAML files](https://cloud.google.com/code/docs/intellij/yaml-editing) + +### Using Cloud Code +* [Creating an app](https://cloud.google.com/code/docs/intellij/quickstart-k8s#creating_an_application) +* [Develop an app](https://cloud.google.com/code/docs/intellij/quickstart-k8s#developing_your_application) +* [Debug an app](https://cloud.google.com/code/docs/intellij/quickstart-k8s#debugging_your_application) +* [View Container Logs](https://cloud.google.com/code/docs/intellij/quickstart-k8s#viewing_logs) +---- + +## Using the Command Line + +As an alternative to using Cloud Code, the application can be deployed to a cluster using standard command line tools + +#### Skaffold + +[Skaffold](https://github.com/GoogleContainerTools/skaffold) is a command line tool that can be used to build, push, and deploy your container images + +```bash +skaffold run --default-repo=gcr.io/YOUR-PROJECT-ID-HERE/cloudcode +``` + +#### kubectl + +[kubectl](https://kubernetes.io/docs/tasks/tools/install-kubectl/) is the official Kubernetes command line tool. It can be used to deploy Kubernetes manifests to your cluster, but images must be build separately using another tool (for example, using the [Docker CLI](https://docs.docker.com/engine/reference/commandline/cli/)) diff --git a/cloud-provider/google-cloud-hello/cmd/hello-world/main.go b/cloud-provider/google-cloud-hello/cmd/hello-world/main.go new file mode 100644 index 0000000..a1598af --- /dev/null +++ b/cloud-provider/google-cloud-hello/cmd/hello-world/main.go @@ -0,0 +1,31 @@ +package main + +import ( + "fmt" + "log" + "net/http" + "os" +) + +const defaultAddr = ":8080" + +// main starts an http server on the $PORT environment variable. +func main() { + addr := defaultAddr + // $PORT environment variable is provided in the Kubernetes deployment. + if p := os.Getenv("PORT"); p != "" { + addr = ":" + p + } + + log.Printf("server starting to listen on %s", addr) + http.HandleFunc("/", home) + if err := http.ListenAndServe(addr, nil); err != nil { + log.Fatalf("server listen error: %+v", err) + } +} + +// home logs the received request and returns a simple response. +func home(w http.ResponseWriter, r *http.Request) { + log.Printf("received request: %s %s", r.Method, r.URL.Path) + fmt.Fprintf(w, "Hello, world!") +} diff --git a/cloud-provider/google-cloud-hello/go.mod b/cloud-provider/google-cloud-hello/go.mod new file mode 100644 index 0000000..602e8b2 --- /dev/null +++ b/cloud-provider/google-cloud-hello/go.mod @@ -0,0 +1,3 @@ +module hello-world + +go 1.12 diff --git a/cloud-provider/google-cloud-hello/go.sum b/cloud-provider/google-cloud-hello/go.sum new file mode 100644 index 0000000..e69de29 diff --git a/cloud-provider/google-cloud-hello/img/diagram.png b/cloud-provider/google-cloud-hello/img/diagram.png new file mode 100644 index 0000000..bb203e4 Binary files /dev/null and b/cloud-provider/google-cloud-hello/img/diagram.png differ diff --git a/cloud-provider/google-cloud-hello/kubernetes-manifests/hello.deployment.yaml b/cloud-provider/google-cloud-hello/kubernetes-manifests/hello.deployment.yaml new file mode 100644 index 0000000..5ed8f1a --- /dev/null +++ b/cloud-provider/google-cloud-hello/kubernetes-manifests/hello.deployment.yaml @@ -0,0 +1,27 @@ +# This Deployment manifest defines: +# - single-replica deployment of the container image, with label "app: go-hello-world" +# - Pod exposes port 8080 +# - specify PORT environment variable to the container process +# Syntax reference https://kubernetes.io/docs/concepts/configuration/overview/ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: go-hello-world +spec: + replicas: 1 + selector: + matchLabels: + app: go-hello-world + template: + metadata: + labels: + app: go-hello-world + spec: + containers: + - name: server + image: go-hello-world + ports: + - containerPort: 8080 + env: + - name: PORT + value: "8080" diff --git a/cloud-provider/google-cloud-hello/kubernetes-manifests/hello.service.yaml b/cloud-provider/google-cloud-hello/kubernetes-manifests/hello.service.yaml new file mode 100644 index 0000000..38b88e2 --- /dev/null +++ b/cloud-provider/google-cloud-hello/kubernetes-manifests/hello.service.yaml @@ -0,0 +1,17 @@ +# This Service manifest defines: +# - a load balancer for pods matching label "app: go-hello-world" +# - exposing the application to the public Internet (type:LoadBalancer) +# - routes port 80 of the load balancer to the port 8080 of the Pods. +# Syntax reference https://kubernetes.io/docs/concepts/configuration/overview/ +apiVersion: v1 +kind: Service +metadata: + name: go-hello-world-external +spec: + type: LoadBalancer + selector: + app: go-hello-world + ports: + - name: http + port: 80 + targetPort: 8080 diff --git a/cloud-provider/google-cloud-hello/skaffold.yaml b/cloud-provider/google-cloud-hello/skaffold.yaml new file mode 100644 index 0000000..9d1ac4b --- /dev/null +++ b/cloud-provider/google-cloud-hello/skaffold.yaml @@ -0,0 +1,16 @@ +apiVersion: skaffold/v1beta15 +kind: Config +build: + tagPolicy: + sha256: {} + artifacts: + - context: . + image: go-hello-world +deploy: + kubectl: + manifests: + - kubernetes-manifests/** +profiles: +- name: cloudbuild + build: + googleCloudBuild: {} diff --git a/cloud-provider/google-cloud-sample/.vscode/launch.json b/cloud-provider/google-cloud-sample/.vscode/launch.json new file mode 100644 index 0000000..72f5dec --- /dev/null +++ b/cloud-provider/google-cloud-sample/.vscode/launch.json @@ -0,0 +1,14 @@ +{ + "configurations": [ + { + "name": "Run/Debug on Kubernetes", + "type": "cloudcode.kubernetes", + "request": "launch", + "skaffoldConfig": "${workspaceFolder}/skaffold.yaml", + "watch": true, + "cleanUp": true, + "portForward": true, + "imageRegistry": "gcr.io/gobuch-72abe/google-cloud-sample" + } + ] +} \ No newline at end of file diff --git a/cloud-provider/google-cloud-sample/Dockerfile b/cloud-provider/google-cloud-sample/Dockerfile new file mode 100644 index 0000000..4deb6b7 --- /dev/null +++ b/cloud-provider/google-cloud-sample/Dockerfile @@ -0,0 +1,12 @@ +FROM golang:1 as builder + +WORKDIR /go/src/app +COPY *.go . +RUN CGO_ENABLED=0 go build . + +#################################### + +FROM alpine +COPY --from=builder /go/src/app/app . +EXPOSE 8080 +CMD [ "./app" ] diff --git a/cloud-provider/google-cloud-sample/README.txt b/cloud-provider/google-cloud-sample/README.txt new file mode 100644 index 0000000..ac82622 --- /dev/null +++ b/cloud-provider/google-cloud-sample/README.txt @@ -0,0 +1,10 @@ + +``` +docker build -t minikube-golang-sample . + +kubectl create -f manifest.yml +kubectl get pod +kubectl expose deployment golang-sample --type=NodePort +kubectl get service +minikube service golang-sample --url +``` diff --git a/cloud-provider/google-cloud-sample/deployment-manifest.yml b/cloud-provider/google-cloud-sample/deployment-manifest.yml new file mode 100644 index 0000000..a44808b --- /dev/null +++ b/cloud-provider/google-cloud-sample/deployment-manifest.yml @@ -0,0 +1,26 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + creationTimestamp: null + labels: + app: google-cloud-sample + name: google-cloud-sample +spec: + replicas: 2 + selector: + matchLabels: + app: google-cloud-sample + strategy: {} + template: + metadata: + creationTimestamp: null + labels: + app: google-cloud-sample + spec: + containers: + - image: google-cloud-sample + name: google-cloud-sample + resources: {} + ports: + - containerPort: 8080 +status: {} \ No newline at end of file diff --git a/cloud-provider/google-cloud-sample/main.go b/cloud-provider/google-cloud-sample/main.go new file mode 100644 index 0000000..00a35e4 --- /dev/null +++ b/cloud-provider/google-cloud-sample/main.go @@ -0,0 +1,16 @@ +package main + +import ( + "fmt" + "net/http" + "time" +) + +func greet(w http.ResponseWriter, r *http.Request) { + fmt.Fprintf(w, "Hello World! %s", time.Now()) +} + +func main() { + http.HandleFunc("/", greet) + http.ListenAndServe(":8080", nil) +} diff --git a/cloud-provider/google-cloud-sample/service-manifest.yml b/cloud-provider/google-cloud-sample/service-manifest.yml new file mode 100644 index 0000000..4b905c6 --- /dev/null +++ b/cloud-provider/google-cloud-sample/service-manifest.yml @@ -0,0 +1,17 @@ +# This Service manifest defines: +# - a load balancer for pods matching label "app: go-hello-world" +# - exposing the application to the public Internet (type:LoadBalancer) +# - routes port 80 of the load balancer to the port 8080 of the Pods. +# Syntax reference https://kubernetes.io/docs/concepts/configuration/overview/ +apiVersion: v1 +kind: Service +metadata: + name: google-cloud-sample-external +spec: + type: LoadBalancer + selector: + app: google-cloud-sample + ports: + - name: http + port: 80 + targetPort: 8080 diff --git a/cloud-provider/google-cloud-sample/skaffold.yaml b/cloud-provider/google-cloud-sample/skaffold.yaml new file mode 100644 index 0000000..1bde403 --- /dev/null +++ b/cloud-provider/google-cloud-sample/skaffold.yaml @@ -0,0 +1,14 @@ +apiVersion: skaffold/v2beta5 +kind: Config +metadata: + name: google-cloud-sample +build: + artifacts: + - image: google-cloud-sample + tagPolicy: + sha256: {} +deploy: + kubectl: + manifests: + - deployment-manifest.yml + - service-manifest.yml diff --git a/cloud-provider/minikube-sample/Dockerfile b/cloud-provider/minikube-sample/Dockerfile new file mode 100644 index 0000000..4deb6b7 --- /dev/null +++ b/cloud-provider/minikube-sample/Dockerfile @@ -0,0 +1,12 @@ +FROM golang:1 as builder + +WORKDIR /go/src/app +COPY *.go . +RUN CGO_ENABLED=0 go build . + +#################################### + +FROM alpine +COPY --from=builder /go/src/app/app . +EXPOSE 8080 +CMD [ "./app" ] diff --git a/cloud-provider/minikube-sample/README.txt b/cloud-provider/minikube-sample/README.txt new file mode 100644 index 0000000..9733181 --- /dev/null +++ b/cloud-provider/minikube-sample/README.txt @@ -0,0 +1,11 @@ + +``` +eval $(minikube docker-env) +docker build -t minikube-golang-sample . + +kubectl create -f manifest.yml +kubectl get pod +kubectl expose deployment golang-sample --type=NodePort +kubectl get service +minikube service golang-sample --url +``` diff --git a/cloud-provider/minikube-sample/main.go b/cloud-provider/minikube-sample/main.go new file mode 100644 index 0000000..00a35e4 --- /dev/null +++ b/cloud-provider/minikube-sample/main.go @@ -0,0 +1,16 @@ +package main + +import ( + "fmt" + "net/http" + "time" +) + +func greet(w http.ResponseWriter, r *http.Request) { + fmt.Fprintf(w, "Hello World! %s", time.Now()) +} + +func main() { + http.HandleFunc("/", greet) + http.ListenAndServe(":8080", nil) +} diff --git a/cloud-provider/minikube-sample/manifest.yml b/cloud-provider/minikube-sample/manifest.yml new file mode 100644 index 0000000..74973cb --- /dev/null +++ b/cloud-provider/minikube-sample/manifest.yml @@ -0,0 +1,27 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + creationTimestamp: null + labels: + app: golang-sample + name: golang-sample +spec: + replicas: 2 + selector: + matchLabels: + app: golang-sample + strategy: {} + template: + metadata: + creationTimestamp: null + labels: + app: golang-sample + spec: + containers: + - image: minikube-golang-sample + name: golang-sample + imagePullPolicy: Never + resources: {} + ports: + - containerPort: 8080 +status: {} \ No newline at end of file diff --git a/concurrency/best-practices-generator-function/main.go b/concurrency/best-practices-generator-function/main.go new file mode 100644 index 0000000..2f91621 --- /dev/null +++ b/concurrency/best-practices-generator-function/main.go @@ -0,0 +1,25 @@ +package main + +import ( + "fmt" + "math/rand" + "time" +) + +func printOut() <-chan string { + c := make(chan string) + go func() { + for i := 1; ; i++ { + c <- fmt.Sprintf("Print %v", i) + time.Sleep(time.Duration(rand.Intn(500)) * time.Millisecond) + } + }() + return c +} + +func main() { + c := printOut() + for i := 1; i < 10; i++ { + fmt.Println(<-c) + } +} diff --git a/concurrency/best-practices-multiplexer-select/main.go b/concurrency/best-practices-multiplexer-select/main.go new file mode 100644 index 0000000..9226016 --- /dev/null +++ b/concurrency/best-practices-multiplexer-select/main.go @@ -0,0 +1,42 @@ +package main + +import ( + "fmt" + "math/rand" + "time" +) + +func printOut() <-chan string { + c := make(chan string) + go func() { + for i := 1; ; i++ { + c <- fmt.Sprintf("Print %v", i) + time.Sleep(time.Duration(rand.Intn(500)) * time.Millisecond) + } + }() + return c +} + +func join(in1, in2 <-chan string) <-chan string { + out := make(chan string) + go func() { + for { + select { + case t := <-in1: + out <- t + case t := <-in2: + out <- t + } + } + }() + return out +} + +func main() { + c1 := printOut() + c2 := printOut() + c3 := join(c1, c2) + for i := 1; i < 10; i++ { + fmt.Println(<-c3) + } +} diff --git a/concurrency/best-practices-multiplexer/main.go b/concurrency/best-practices-multiplexer/main.go new file mode 100644 index 0000000..4c47671 --- /dev/null +++ b/concurrency/best-practices-multiplexer/main.go @@ -0,0 +1,42 @@ +package main + +import ( + "fmt" + "math/rand" + "time" +) + +func printOut() <-chan string { + c := make(chan string) + go func() { + for i := 1; ; i++ { + c <- fmt.Sprintf("Print %v", i) + time.Sleep(time.Duration(rand.Intn(500)) * time.Millisecond) + } + }() + return c +} + +func join(in1, in2 <-chan string) <-chan string { + out := make(chan string) + go func() { + for { + out <- <-in1 + } + }() + go func() { + for { + out <- <-in2 + } + }() + return out +} + +func main() { + c1 := printOut() + c2 := printOut() + c3 := join(c1, c2) + for i := 1; i < 10; i++ { + fmt.Println(<-c3) + } +} diff --git a/concurrency/best-practices-sync/main.go b/concurrency/best-practices-sync/main.go new file mode 100644 index 0000000..c9339fc --- /dev/null +++ b/concurrency/best-practices-sync/main.go @@ -0,0 +1,54 @@ +package main + +import ( + "fmt" + "math/rand" + "time" +) + +type Message struct { + text string + wait chan interface{} +} + +func printOut() <-chan Message { + finish := make(chan interface{}) + c := make(chan Message) + go func() { + for i := 1; ; i++ { + c <- Message{fmt.Sprintf("Print %v", i), finish} + time.Sleep(time.Duration(rand.Intn(9000)) * time.Millisecond) + <-finish + } + }() + return c +} + +func join(in1, in2 <-chan Message) <-chan Message { + out := make(chan Message) + go func() { + for { + out <- <-in1 + } + }() + go func() { + for { + out <- <-in2 + } + }() + return out +} + +func main() { + c1 := printOut() + c2 := printOut() + c3 := join(c1, c2) + for i := 1; i < 20; i++ { + message1 := <-c3 + message2 := <-c3 + fmt.Println(message1.text) + fmt.Println(message2.text) + message1.wait <- "" + message2.wait <- "" + } +} diff --git a/concurrency/best-practices-timeout/main.go b/concurrency/best-practices-timeout/main.go new file mode 100644 index 0000000..22dcefa --- /dev/null +++ b/concurrency/best-practices-timeout/main.go @@ -0,0 +1,49 @@ +package main + +import ( + "fmt" + "math/rand" + "time" +) + +func printOut() <-chan string { + c := make(chan string) + go func() { + for i := 1; ; i++ { + c <- fmt.Sprintf("Print %v", i) + time.Sleep(time.Duration(rand.Intn(500)) * time.Millisecond) + } + }() + return c +} + +func join(in1, in2 <-chan string) <-chan string { + out := make(chan string) + go func() { + for { + select { + case t := <-in1: + out <- t + case t := <-in2: + out <- t + } + } + }() + return out +} + +func main() { + c1 := printOut() + c2 := printOut() + c3 := join(c1, c2) + + timeout := time.After(3 * time.Second) + for { + select { + case t := <-c3: + fmt.Println(t) + case <-timeout: + return + } + } +} diff --git a/concurrency/channel-mit-close/main.go b/concurrency/channel-mit-close/main.go new file mode 100644 index 0000000..07329e0 --- /dev/null +++ b/concurrency/channel-mit-close/main.go @@ -0,0 +1,31 @@ +package main + +import ( + "fmt" + "math/rand" + "time" +) + +var c chan string + +func printOut() { + for i := 1; i < 10; i++ { + c <- fmt.Sprintf("Print %v", i) + time.Sleep(time.Duration(rand.Intn(500)) * time.Millisecond) + } + close(c) +} + +func main() { + c = make(chan string) + go printOut() + + for { + t, open := <-c + if open { + fmt.Println(t) + } else { + break + } + } +} diff --git a/concurrency/channel-range/main.go b/concurrency/channel-range/main.go new file mode 100644 index 0000000..6e7385d --- /dev/null +++ b/concurrency/channel-range/main.go @@ -0,0 +1,25 @@ +package main + +import ( + "fmt" + "math/rand" + "time" +) + +var c chan string + +func printOut() { + for i := 1; i < 10; i++ { + c <- fmt.Sprintf("Print %v", i) + time.Sleep(time.Duration(rand.Intn(500)) * time.Millisecond) + } + close(c) +} + +func main() { + c = make(chan string) + go printOut() + for t := range c { + fmt.Println(t) + } +} diff --git a/concurrency/channels/main.go b/concurrency/channels/main.go new file mode 100644 index 0000000..27230d3 --- /dev/null +++ b/concurrency/channels/main.go @@ -0,0 +1,17 @@ +package main + +import "fmt" + +func main() { + + c := make(chan string) + + go func() { + fmt.Println(<-c) + }() + + c <- "Hello World!" + + close(c) + +} diff --git a/concurrency/first-go-routine-mit-channel/main.go b/concurrency/first-go-routine-mit-channel/main.go new file mode 100644 index 0000000..483159c --- /dev/null +++ b/concurrency/first-go-routine-mit-channel/main.go @@ -0,0 +1,24 @@ +package main + +import ( + "fmt" + "math/rand" + "time" +) + +var c chan string + +func printOut() { + for i := 1; ; i++ { + c <- fmt.Sprintf("Print %v", i) + time.Sleep(time.Duration(rand.Intn(500)) * time.Millisecond) + } +} + +func main() { + c = make(chan string) + go printOut() + for i := 0; i < 10; i++ { + fmt.Println(<-c) + } +} diff --git a/concurrency/first-go-routine/main.go b/concurrency/first-go-routine/main.go new file mode 100644 index 0000000..b77a502 --- /dev/null +++ b/concurrency/first-go-routine/main.go @@ -0,0 +1,19 @@ +package main + +import ( + "fmt" + "math/rand" + "time" +) + +func printOut() { + for i := 0; i < 10; i++ { + fmt.Printf("Print %v\n", i) + time.Sleep(time.Duration(rand.Intn(500)) * time.Millisecond) + } +} + +func main() { + go printOut() + time.Sleep(5 * time.Second) +} diff --git a/concurrency/graceful-shutdown/.vscode/settings.json b/concurrency/graceful-shutdown/.vscode/settings.json new file mode 100644 index 0000000..8c45cda --- /dev/null +++ b/concurrency/graceful-shutdown/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "go.formatTool": "goimports" +} \ No newline at end of file diff --git a/concurrency/graceful-shutdown/go.mod b/concurrency/graceful-shutdown/go.mod new file mode 100644 index 0000000..d5aca28 --- /dev/null +++ b/concurrency/graceful-shutdown/go.mod @@ -0,0 +1,3 @@ +module graceful-shutdown + +go 1.12 diff --git a/concurrency/graceful-shutdown/main.go b/concurrency/graceful-shutdown/main.go new file mode 100644 index 0000000..8776c80 --- /dev/null +++ b/concurrency/graceful-shutdown/main.go @@ -0,0 +1,60 @@ +package main + +import ( + "context" + "fmt" + "log" + "net/http" + "os" + "os/signal" + "time" +) + +func handle(w http.ResponseWriter, r *http.Request) { + + select { + case <-time.After(60 * time.Second): + // If we receive a message after 2 seconds + // that means the request has been processed + // We then write this as the response + w.Write([]byte("request processed")) + case <-r.Context().Done(): + // If the request gets cancelled, log it + // to STDERR + fmt.Fprint(os.Stderr, "request cancelled\n") + } + +} + +func main() { + + srv := http.Server{Addr: ":8081"} + + idleConnsClosed := make(chan struct{}) + + ctx, cancel := context.WithTimeout(context.Background(), 100*time.Second) + defer cancel() + + go func() { + sigint := make(chan os.Signal, 1) + signal.Notify(sigint, os.Interrupt) + <-sigint + // We received an interrupt signal, shut down. + if err := srv.Shutdown(ctx); err != nil { + // Error from closing listeners, or context timeout: + log.Printf("HTTP server Shutdown: %v", err) + } + log.Print("HTTP server Shutdown successful") + close(idleConnsClosed) + }() + + http.HandleFunc("/", handle) + + if err := srv.ListenAndServe(); err != http.ErrServerClosed { + // Error starting or closing listener: + log.Printf("HTTP server ListenAndServe: %v", err) + } + + <-idleConnsClosed + +} diff --git a/concurrency/java-threads-beispiel/Main.java b/concurrency/java-threads-beispiel/Main.java new file mode 100644 index 0000000..963b179 --- /dev/null +++ b/concurrency/java-threads-beispiel/Main.java @@ -0,0 +1,40 @@ +import java.util.concurrent.Semaphore; +import java.util.concurrent.atomic.AtomicBoolean; + +public class Main { + + static int count = 0; + + public static void main(String[] args) { + + new Thread(new Runnable() { + @Override + public void run() { + while (true) { + count++; + try { + new Thread(new Runnable() { + @Override + public void run() { + while (true) { + try { + Thread.sleep(120000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + System.out.println("Thread Hello " + count); + } + } + }).start(); + } catch (Throwable e) { + e.printStackTrace(); + System.exit(1); + } + System.out.println("create native thread "+ count); + } + } + }).start(); + + } + +} diff --git a/configuration/application-configuration-os/main.go b/configuration/application-configuration-os/main.go new file mode 100644 index 0000000..f3bf44b --- /dev/null +++ b/configuration/application-configuration-os/main.go @@ -0,0 +1,11 @@ +package main + +import ( + "fmt" + "os" +) + +func main() { + configValue := os.Getenv("HELLO") + fmt.Printf("Hello %v\n", configValue) +} diff --git a/configuration/application-configuration-viper/config.yml b/configuration/application-configuration-viper/config.yml new file mode 100644 index 0000000..fab7553 --- /dev/null +++ b/configuration/application-configuration-viper/config.yml @@ -0,0 +1,2 @@ +server: + host: localhost \ No newline at end of file diff --git a/configuration/application-configuration-viper/go.mod b/configuration/application-configuration-viper/go.mod new file mode 100644 index 0000000..e9726f8 --- /dev/null +++ b/configuration/application-configuration-viper/go.mod @@ -0,0 +1,8 @@ +module golang.source-fellows.com/samples/applicationconfiguration + +go 1.14 + +require ( + github.com/kelseyhightower/envconfig v1.4.0 // indirect + github.com/spf13/viper v1.7.0 +) diff --git a/configuration/application-configuration-viper/go.sum b/configuration/application-configuration-viper/go.sum new file mode 100644 index 0000000..cd8bd31 --- /dev/null +++ b/configuration/application-configuration-viper/go.sum @@ -0,0 +1,292 @@ +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/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/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= +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= +dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +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/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= +github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= +github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= +github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= +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/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= +github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= +github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= +github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= +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/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +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/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= +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/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= +github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +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-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= +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/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.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +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/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/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/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/gorilla/websocket v1.4.2/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-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= +github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= +github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= +github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= +github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= +github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= +github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= +github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= +github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= +github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= +github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= +github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= +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/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/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= +github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= +github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= +github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= +github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= +github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= +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/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= +github.com/kelseyhightower/envconfig v1.4.0 h1:Im6hONhd3pLkfDFsbRgu68RDNkGF1r3dvMUtDTo2cv8= +github.com/kelseyhightower/envconfig v1.4.0/go.mod h1:cccZRl6mQpaq41TPp5QxidR+Sa3axMbJDNb//FQX6Gg= +github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/konsorten/go-windows-terminal-sequences v1.0.1/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/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/magiconair/properties v1.8.1 h1:ZC2Vc7/ZFkGmsVC9KvOjumD+G5lXy2RtTKyzRKO2BQ4= +github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= +github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= +github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= +github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= +github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= +github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= +github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= +github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= +github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/mitchellh/mapstructure v1.1.2 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQzvN1EDeE= +github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= +github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= +github.com/pelletier/go-toml v1.2.0 h1:T5zMGML61Wp+FlcbWjRDT7yAxhJNAiPPLOFECq181zc= +github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= +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/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= +github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= +github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= +github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= +github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= +github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= +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/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= +github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= +github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= +github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= +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 h1:m8/z1t7/fwjysjQRYbP0RD+bUIF/8tJwPdEZsI83ACI= +github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= +github.com/spf13/cast v1.3.0 h1:oget//CVOEoFewqQxwr0Ej5yjygnqGkvggSE/gB35Q8= +github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/jwalterweatherman v1.0.0 h1:XHEdyB+EcvlqZamSM4ZOMGlc93t6AcsBEu9Gc1vn7yk= +github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= +github.com/spf13/pflag v1.0.3 h1:zPAT6CGy6wXeQ7NtTnaTerfKOsV6V6F8agHXFiazDkg= +github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/viper v1.7.0 h1:xVKxvI7ouOI5I+U9s2eeiUfMaWBVoXA3AWskkrqK0VM= +github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= +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/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s= +github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= +github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= +go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= +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.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= +go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= +golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/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-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +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-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= +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/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/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-20181023162649-9b4f9f5ad519/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-20190213061140-3a22650c66bd/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-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/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/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/sys v0.0.0-20180823144017-11551d06cbcc/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-20181026203630-95b1ffbd15a5/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-20190215142949-d0b11bdaac8a/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-20190412213103-97732733099d/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-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0 h1:HyfiK1WMnHj5FXFXatD+Qs1A/xC2Run6RzeW1SyHxpc= +golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/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/tools v0.0.0-20180221164845-07fd8470d635/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-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-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-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +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.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +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-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-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= +google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +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/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/ini.v1 v1.51.0 h1:AQvPpx3LzTDM0AjnIRlVFwFFGC+npRopjZxLJj6gdno= +gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= +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.4 h1:/eiJrUcujPVeJ3xlSWaiNi3uSVmDGBK1pDHUHAnao1I= +gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +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.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= +rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= diff --git a/configuration/application-configuration-viper/main.go b/configuration/application-configuration-viper/main.go new file mode 100644 index 0000000..696235f --- /dev/null +++ b/configuration/application-configuration-viper/main.go @@ -0,0 +1,28 @@ +/*Package main show how to use viper. + +Start the app in the root folder with: + + SERVER_HOST=testing go run cmd/main.go + +*/ +package main + +import ( + "fmt" + "strings" + + "github.com/spf13/viper" +) + +func main() { + viper.SetConfigName("config") + viper.AddConfigPath(".") + err := viper.ReadInConfig() + if err != nil { + panic(fmt.Errorf("fatal error config file: %s", err)) + } + replacer := strings.NewReplacer(".", "_") + viper.SetEnvKeyReplacer(replacer) + viper.AutomaticEnv() + fmt.Println(viper.Get("server.host")) +} diff --git a/configuration/application-configuration/cmd/main.go b/configuration/application-configuration/cmd/main.go new file mode 100644 index 0000000..d2d7a75 --- /dev/null +++ b/configuration/application-configuration/cmd/main.go @@ -0,0 +1,28 @@ +/*Package main show how to use envconfig. + +Start the app in the root folder with: + + SERVER_PORT=8080 SERVER_HOST=localhost go run cmd/main.go + +*/ +package main + +import ( + "fmt" + + "github.com/kelseyhightower/envconfig" + "golang.source-fellows.com/samples/applicationconfiguration" +) + +func main() { + + cfg := applicationconfiguration.Config{} + err := envconfig.Process("", &cfg) + + if err != nil { + panic(err) + } + + fmt.Println(cfg.Server.Port) + +} diff --git a/configuration/application-configuration/configuration.go b/configuration/application-configuration/configuration.go new file mode 100644 index 0000000..a59e3ad --- /dev/null +++ b/configuration/application-configuration/configuration.go @@ -0,0 +1,12 @@ +package applicationconfiguration + +type Config struct { + Server struct { + Port string `envconfig:"SERVER_PORT" required:"true"` + Host string `envconfig:"SERVER_HOST" required:"true"` + } + Database struct { + Username string `envconfig:"DB_USERNAME"` + Password string `envconfig:"DB_PASSWORD"` + } +} diff --git a/configuration/application-configuration/go.mod b/configuration/application-configuration/go.mod new file mode 100644 index 0000000..e5e7c0a --- /dev/null +++ b/configuration/application-configuration/go.mod @@ -0,0 +1,5 @@ +module golang.source-fellows.com/samples/applicationconfiguration + +go 1.14 + +require github.com/kelseyhightower/envconfig v1.4.0 // indirect diff --git a/configuration/application-configuration/go.sum b/configuration/application-configuration/go.sum new file mode 100644 index 0000000..8642a1a --- /dev/null +++ b/configuration/application-configuration/go.sum @@ -0,0 +1,2 @@ +github.com/kelseyhightower/envconfig v1.4.0 h1:Im6hONhd3pLkfDFsbRgu68RDNkGF1r3dvMUtDTo2cv8= +github.com/kelseyhightower/envconfig v1.4.0/go.mod h1:cccZRl6mQpaq41TPp5QxidR+Sa3axMbJDNb//FQX6Gg= diff --git a/first-module-dependency/cmd/main.go b/first-module-dependency/cmd/main.go new file mode 100644 index 0000000..fd8faff --- /dev/null +++ b/first-module-dependency/cmd/main.go @@ -0,0 +1,9 @@ +package main + +import ( + "golang.source-fellows.com/training/sample" +) + +func main() { + sample.Hello() +} diff --git a/first-module-dependency/go.mod b/first-module-dependency/go.mod new file mode 100644 index 0000000..5c3ff4d --- /dev/null +++ b/first-module-dependency/go.mod @@ -0,0 +1,5 @@ +module golang.source-fellows.com/training/sample + +go 1.13 + +require github.com/sirupsen/logrus v1.5.0 diff --git a/first-module-dependency/go.sum b/first-module-dependency/go.sum new file mode 100644 index 0000000..129248e --- /dev/null +++ b/first-module-dependency/go.sum @@ -0,0 +1,9 @@ +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/konsorten/go-windows-terminal-sequences v1.0.1 h1:mweAR1A6xJ3oS2pRaGiHgQ4OO8tzTaLawm8vnODuwDk= +github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/sirupsen/logrus v1.5.0 h1:1N5EYkVAPEywqZRJd7cwnRtCb6xJx7NH3T3WUTF980Q= +github.com/sirupsen/logrus v1.5.0/go.mod h1:+F7Ogzej0PZc/94MaYx/nvG9jOFMD2osvC3s+Squfpo= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +golang.org/x/sys v0.0.0-20190422165155-953cdadca894 h1:Cz4ceDQGXuKRnVBDTS23GTn/pU5OE2C0WrNTOYK1Uuc= +golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= diff --git a/first-module-dependency/main.go b/first-module-dependency/main.go new file mode 100644 index 0000000..7dbfad2 --- /dev/null +++ b/first-module-dependency/main.go @@ -0,0 +1,7 @@ +package sample + +import log "github.com/sirupsen/logrus" + +func Hello() { + log.Println("Hello World") +} diff --git a/golang-language-samples/collection-array-slice/collection.go b/golang-language-samples/collection-array-slice/collection.go new file mode 100644 index 0000000..85593a0 --- /dev/null +++ b/golang-language-samples/collection-array-slice/collection.go @@ -0,0 +1,25 @@ +package main + +import "fmt" + +func main() { + + //Array mit fester Größe + var months = [12]string{"Januar", + "Februar", "März", "April", + "Mai", "Juni", "Juli", "August", + "September", "Oktober", "November", + "Dezember"} + + //Slices mit immer 3 Elementen des Arrays + q1 := months[:3] + q2 := months[3:6] + q3 := months[6:9] + q4 := months[9:12] + //Liefert "[Januar februar März]" + fmt.Println(q1) + fmt.Println(q2) + fmt.Println(q3) + fmt.Println(q4) + +} diff --git a/golang-language-samples/collection-array/collection.go b/golang-language-samples/collection-array/collection.go new file mode 100644 index 0000000..55f3ade --- /dev/null +++ b/golang-language-samples/collection-array/collection.go @@ -0,0 +1,19 @@ +package main + +import "fmt" + +func main() { + //Initialisierung eines leeren Arrays + var str1 [3]string + //Befüllung durch Zuweisungen + str1[0] = "Hello" + str1[1] = "World" + str1[2] = "!" + fmt.Println(str1[0]) + fmt.Println(len(str1)) + + //Initialsierung mit direkter Befüllung + var str2 = [3]string{"Hello", "World", "!"} + fmt.Println(str2[0]) + fmt.Println(len(str2)) +} diff --git a/golang-language-samples/collection-capa/collection.go b/golang-language-samples/collection-capa/collection.go new file mode 100644 index 0000000..48c1d36 --- /dev/null +++ b/golang-language-samples/collection-capa/collection.go @@ -0,0 +1,25 @@ +package main + +import "fmt" + +func main() { + + //Array mit fester Größe + var months = [12]string{"Januar", + "Februar", "März", "April", + "Mai", "Juni", "Juli", "August", + "September", "Oktober", "November", + "Dezember"} + + //Slices mit immer 3 Elementen des Arrays + q1 := months[:3] + q2 := months[3:6] + q3 := months[6:9] + q4 := months[9:12] + + fmt.Printf("Length %v, Capa %v, Values: %v\n", len(q1), cap(q1), q1) + fmt.Printf("Length %v, Capa %v, Values: %v\n", len(q2), cap(q2), q2) + fmt.Printf("Length %v, Capa %v, Values: %v\n", len(q3), cap(q3), q3) + fmt.Printf("Length %v, Capa %v, Values: %v\n", len(q4), cap(q4), q4) + +} diff --git a/golang-language-samples/collection-for-range/collection.go b/golang-language-samples/collection-for-range/collection.go new file mode 100644 index 0000000..d49697e --- /dev/null +++ b/golang-language-samples/collection-for-range/collection.go @@ -0,0 +1,22 @@ +package main + +import "fmt" + +func main() { + + //Array mit fester Größe + var months = [12]string{"Januar", + "Februar", "März", "April", + "Mai", "Juni", "Juli", "August", + "September", "Oktober", "November", + "Dezember"} + for i, month := range months { + fmt.Printf("%v: %v\n", i, month) + } + + q2 := months[3:6] + for i, month := range q2 { + fmt.Printf("%v: %v\n", i, month) + } + +} diff --git a/golang-language-samples/defer-file-open/defer.go b/golang-language-samples/defer-file-open/defer.go new file mode 100644 index 0000000..2d06dc4 --- /dev/null +++ b/golang-language-samples/defer-file-open/defer.go @@ -0,0 +1,22 @@ +package main + +import ( + "log" + "os" +) + +func main() { + + f, err := os.Open("testfile") + if err != nil { + log.Fatalf("Konnte die Datei nicht öffnen: %v", err) + } + defer f.Close() + + f2, err := os.Open("nichtVorhanden") + if err != nil { + log.Fatalf("Konnte die Datei nicht öffnen: %v", err) + } + defer f2.Close() + //Arbeit mit den Dateien +} diff --git a/golang-language-samples/defer-file-open/testfile b/golang-language-samples/defer-file-open/testfile new file mode 100644 index 0000000..e69de29 diff --git a/golang-language-samples/defer-lock/defer.go b/golang-language-samples/defer-lock/defer.go new file mode 100644 index 0000000..9d6acf3 --- /dev/null +++ b/golang-language-samples/defer-lock/defer.go @@ -0,0 +1,23 @@ +package main + +import ( + "fmt" + "sync" +) + +var lock sync.Mutex + +func wasWichtiges() { + lock.Lock() + defer lock.Unlock() + //auf ressourcen zugreifen + fmt.Println("Arbeit an gesperrter Ressource") +} + +func main() { + + wasWichtiges() + lock.Lock() + fmt.Println("am Ende") + +} diff --git a/golang-language-samples/defer/defer.go b/golang-language-samples/defer/defer.go new file mode 100644 index 0000000..2767752 --- /dev/null +++ b/golang-language-samples/defer/defer.go @@ -0,0 +1,16 @@ +package main + +import "fmt" + +func sagA() { + fmt.Println("A") +} + +func sagB() { + fmt.Println("B") +} + +func main() { + defer sagA() + sagB() +} diff --git a/golang-language-samples/errors-new/errors.go b/golang-language-samples/errors-new/errors.go new file mode 100644 index 0000000..e8ec1db --- /dev/null +++ b/golang-language-samples/errors-new/errors.go @@ -0,0 +1,29 @@ +package main + +import ( + "errors" + "fmt" +) + +func erzeugeEinenNeuenFehler(i int) error { + if i != 42 { + return fmt.Errorf("Mit %v lösen Sie das Problem nicht", i) + } + return nil +} + +func erzeugeNochEinenFehler() error { + return errors.New("Da ist noch ein Problem") +} + +func main() { + err := erzeugeEinenNeuenFehler(13) + if err != nil { + fmt.Printf("Es ist ein Fehler aufgetreten: %v\n", err) + } + err = erzeugeNochEinenFehler() + if err != nil { + fmt.Printf("Es ist ein Fehler aufgetreten: %v\n", err) + } + +} diff --git a/golang-language-samples/errors-owntyp-wrap/errors.go b/golang-language-samples/errors-owntyp-wrap/errors.go new file mode 100644 index 0000000..2016956 --- /dev/null +++ b/golang-language-samples/errors-owntyp-wrap/errors.go @@ -0,0 +1,49 @@ +package main + +import ( + "errors" + "fmt" + "log" +) + +var PermissionError = errors.New("keine Berechtigung") + +//StatementExecutionError ist ein eigener Fehlertyp +//mit zusätzlicher Information +type StatementExecutionError struct { + Statement string + Message string + Cause error +} + +func (wse *StatementExecutionError) Unwrap() error { + return wse.Cause +} + +//Implementierung der Error Methode des error Interface +func (wse *StatementExecutionError) Error() string { + return wse.Message +} + +func fuehreStatementAus(statement string) error { + if statement != "1=1" { + return &StatementExecutionError{ + Statement: statement, + Message: "Statement kann nicht ausgeführt werden", + Cause: PermissionError, + } + } + return nil +} + +func main() { + err := fuehreStatementAus("v:=b") + //Prüfung über errors Package + if errors.Is(err, PermissionError) { + log.Fatal("Das Statement konnte nicht ausgeführt werden.") + } else { + fmt.Println("alles ok") + } + + panic("") +} diff --git a/golang-language-samples/errors-owntyp/errors.go b/golang-language-samples/errors-owntyp/errors.go new file mode 100644 index 0000000..c898f49 --- /dev/null +++ b/golang-language-samples/errors-owntyp/errors.go @@ -0,0 +1,38 @@ +package main + +import ( + "fmt" + "log" +) + +//StatementExecutionError ist ein eigener Fehlertyp +//mit zusätzlicher Information +type StatementExecutionError struct { + Statement string + Message string +} + +//Implementierung der Error Methode des error Interface +func (wse *StatementExecutionError) Error() string { + return wse.Message +} + +func fuehreStatementAus(statement string) error { + if statement != "1=1" { + return &StatementExecutionError{ + Statement: statement, + Message: "Statement kann nicht ausgeführt werden", + } + } + return nil +} + +func main() { + err := fuehreStatementAus("v:=b") + //Prüfung über Simple-Statement mit Type-Assertion + if e, ok := err.(*StatementExecutionError); ok { + log.Fatalf("Das Statement '%v' konnte nicht ausgeführt werden.", e.Statement) + } else { + fmt.Println("alles ok") + } +} diff --git a/golang-language-samples/errors/errors.go b/golang-language-samples/errors/errors.go new file mode 100644 index 0000000..1eaecc7 --- /dev/null +++ b/golang-language-samples/errors/errors.go @@ -0,0 +1,16 @@ +package main + +import ( + "log" + "os" +) + +func main() { + f, err := os.Open("datei-ist-nicht-da.txt") + if err != nil { + //Durch den Aufruf von log.Fatalf wird die weitere + // Verarbeitung abgebrochen und die Anwendung beendet + log.Fatalf("Konnte die Datei nicht öffnen, da %v", err) + } + f.Close() +} diff --git a/golang-language-samples/for-range/main.go b/golang-language-samples/for-range/main.go new file mode 100644 index 0000000..803b4d3 --- /dev/null +++ b/golang-language-samples/for-range/main.go @@ -0,0 +1,19 @@ +package main + +import "fmt" + +func main() { + + text := "Hello" + + //Nur Zuweisung des Index + for v := range text { + fmt.Print(v) + } + + //Zuweisung von Index und Wert + for i, v := range text { + fmt.Printf("index %d value %c\n", i, v) + } + +} diff --git a/golang-language-samples/pointer-parameter/pointer.go b/golang-language-samples/pointer-parameter/pointer.go new file mode 100644 index 0000000..16c8128 --- /dev/null +++ b/golang-language-samples/pointer-parameter/pointer.go @@ -0,0 +1,20 @@ +package main + +import "fmt" + +type Person struct { + Name string +} + +func sayHello(p interface{}) { + t, ok := p.(*Person) + fmt.Println(t) + fmt.Println(ok) +} + +func main() { + + p := &Person{"Kristian"} + sayHello(p) + +} diff --git a/golang-language-samples/pointer-receiver/pointer.go b/golang-language-samples/pointer-receiver/pointer.go new file mode 100644 index 0000000..ef73928 --- /dev/null +++ b/golang-language-samples/pointer-receiver/pointer.go @@ -0,0 +1,23 @@ +package main + +import ( + "fmt" +) + +type Person struct { + alter int +} + +func (p *Person) Alter() int { + return p.alter +} + +func (p *Person) GeburtstagFeiern() { + p.alter = p.alter + 1 +} + +func main() { + p := Person{5} + p.GeburtstagFeiern() + fmt.Println(p.Alter()) +} diff --git a/golang-language-samples/pointer-struct/pointer.go b/golang-language-samples/pointer-struct/pointer.go new file mode 100644 index 0000000..fc7ff7e --- /dev/null +++ b/golang-language-samples/pointer-struct/pointer.go @@ -0,0 +1,14 @@ +package main + +import "fmt" + +type Person struct { + Name string +} + +func main() { + p := &Person{} + p.Name = "Kristian" + (*p).Name = "Kristian" //beide Zeilen sind gleichbedeutend + fmt.Println(p) +} diff --git a/golang-language-samples/pointer/pointer.go b/golang-language-samples/pointer/pointer.go new file mode 100644 index 0000000..cd8b8bf --- /dev/null +++ b/golang-language-samples/pointer/pointer.go @@ -0,0 +1,15 @@ +package main + +import "fmt" + +func main() { + + var month = "Januar" + //Erstellt einen Pointer auf die Variable month + var monthPtr = &month + //Ändern den Wert von month über den Pointer monthPtr + *monthPtr = "Februar" + + fmt.Println(month) + +} diff --git a/golang-language-samples/sampledoc/first.go b/golang-language-samples/sampledoc/first.go new file mode 100644 index 0000000..2528252 --- /dev/null +++ b/golang-language-samples/sampledoc/first.go @@ -0,0 +1,7 @@ +//Package sampledoc zeigt wie man Integer Werte addiert. +package sampledoc + +//Add addiert zwei Integer Werte und liefert das Ergebnis. +func Add(first int, second int) int { + return first + second +} diff --git a/golang-language-samples/sampledoc/first_example_test.go b/golang-language-samples/sampledoc/first_example_test.go new file mode 100644 index 0000000..0e7e69a --- /dev/null +++ b/golang-language-samples/sampledoc/first_example_test.go @@ -0,0 +1,12 @@ +package sampledoc + +import "fmt" + +func ExampleAdd() { + + res := Add(1, 2) + fmt.Println(res) + + //Output: 3 + +} diff --git a/golang-language-samples/switch-case-falltrough/switch-case.go b/golang-language-samples/switch-case-falltrough/switch-case.go new file mode 100644 index 0000000..058fc78 --- /dev/null +++ b/golang-language-samples/switch-case-falltrough/switch-case.go @@ -0,0 +1,24 @@ +package main + +import "fmt" + +func main() { + + val := 2 + var erg int + + switch { + case val == 2: + erg = val * 2 + fallthrough + case val < 10: + erg = erg * 2 + case val < 100: + erg = erg * 3 + default: + erg = 1 + } + + fmt.Println(erg) + +} diff --git a/golang-language-samples/switch-case-no-expression/switch-case.go b/golang-language-samples/switch-case-no-expression/switch-case.go new file mode 100644 index 0000000..29fe844 --- /dev/null +++ b/golang-language-samples/switch-case-no-expression/switch-case.go @@ -0,0 +1,18 @@ +package main + +import "fmt" + +func main() { + + val := 2 * 5 + + switch { + case val == 10: + fmt.Println("10!") + case val < 10: + fmt.Println("kleiner 10") + default: + fmt.Println("größer 10") + } + +} diff --git a/golang-language-samples/switch-case/switch-case.go b/golang-language-samples/switch-case/switch-case.go new file mode 100644 index 0000000..ba1ed14 --- /dev/null +++ b/golang-language-samples/switch-case/switch-case.go @@ -0,0 +1,18 @@ +package main + +import "fmt" + +func main() { + + val := 2 * 6 + + switch val { + case 10: + fmt.Println("10!") + case 1, 2, 3, 4, 5, 6, 7, 8, 9: + fmt.Println("kleiner 10") + default: + fmt.Println("größer 10") + } + +} diff --git a/golang-language-samples/type-alias-definition/type-definition.go b/golang-language-samples/type-alias-definition/type-definition.go new file mode 100644 index 0000000..3676a14 --- /dev/null +++ b/golang-language-samples/type-alias-definition/type-definition.go @@ -0,0 +1,13 @@ +package main + +import "fmt" + +type ( + A1 = string // A1 und string bezeichen identische Typen + A2 = A1 // A2 und A1 bezeichen identische Typen +) + +func main() { + var text A2 + fmt.Println(text) +} diff --git a/golang-language-samples/type-definition-assertion/type-definition.go b/golang-language-samples/type-definition-assertion/type-definition.go new file mode 100644 index 0000000..e558969 --- /dev/null +++ b/golang-language-samples/type-definition-assertion/type-definition.go @@ -0,0 +1,24 @@ +package main + +import "fmt" + +func main() { + //Variable muss ein Interfacetyp sein + var i interface{} = "hello" + + //direkte Zuweisung ohne Prüfung + s := i.(string) + fmt.Println(s) + + //Zuweisung mit Prüfung ob möglich + s, ok := i.(string) + fmt.Println(s, ok) + + //Zuweisung mit Prüfung ob möglich + f, ok := i.(int) + fmt.Println(f, ok) + + //Zuweisung ohne Prüfung führt zu Panic + f = i.(int) + fmt.Println(f) +} diff --git a/golang-language-samples/type-definition-interface-receiver/type-definition.go b/golang-language-samples/type-definition-interface-receiver/type-definition.go new file mode 100644 index 0000000..2a4733f --- /dev/null +++ b/golang-language-samples/type-definition-interface-receiver/type-definition.go @@ -0,0 +1,21 @@ +package main + +import "fmt" + +type Dog interface { + Bark() +} + +type Dackel struct { + name string +} + +func (d Dackel) Bark() { + fmt.Printf("Wuff %v\n", d.name) +} + +func main() { + var d Dog + d = Dackel{"Heino"} + d.Bark() +} diff --git a/golang-language-samples/type-definition-interface/type-definition.go b/golang-language-samples/type-definition-interface/type-definition.go new file mode 100644 index 0000000..6111cca --- /dev/null +++ b/golang-language-samples/type-definition-interface/type-definition.go @@ -0,0 +1,16 @@ +package main + +import "fmt" + +type File interface { + Read([]byte) (int, error) + Write([]byte) (int, error) + Close() error +} + +func main() { + + var f File + fmt.Println(f) + +} diff --git a/golang-language-samples/type-definition-struct/type-definition.go b/golang-language-samples/type-definition-struct/type-definition.go new file mode 100644 index 0000000..efc3f56 --- /dev/null +++ b/golang-language-samples/type-definition-struct/type-definition.go @@ -0,0 +1,15 @@ +package main + +import "fmt" + +type Person struct { + vorname string + nachname string +} + +func main() { + p := Person{"Kristian", "Köhler"} + p2 := Person{nachname: "Köhler"} + fmt.Println(p.vorname) + fmt.Println(p2.nachname) +} diff --git a/golang-language-samples/type-definition-switch/type-definition.go b/golang-language-samples/type-definition-switch/type-definition.go new file mode 100644 index 0000000..fc654be --- /dev/null +++ b/golang-language-samples/type-definition-switch/type-definition.go @@ -0,0 +1,20 @@ +package main + +import "fmt" + +func checkMyType(i interface{}) { + switch i.(type) { + case string: + fmt.Println("Es ist ein string") + case int: + fmt.Println("Es ist ein int") + default: + fmt.Println("Es ist weder string noch int") + } +} + +func main() { + checkMyType("Hello") + checkMyType(1) + checkMyType(3.4) +} diff --git a/golang-language-samples/type-definition/type-definition.go b/golang-language-samples/type-definition/type-definition.go new file mode 100644 index 0000000..28595da --- /dev/null +++ b/golang-language-samples/type-definition/type-definition.go @@ -0,0 +1,13 @@ +package main + +import "fmt" + +type ( + Point struct{ x, y float64 } + polar Point +) + +func main() { + var p Point + fmt.Println(p) +} diff --git a/golang-language-samples/type-failure/type-failure.go b/golang-language-samples/type-failure/type-failure.go new file mode 100644 index 0000000..a96f04d --- /dev/null +++ b/golang-language-samples/type-failure/type-failure.go @@ -0,0 +1,11 @@ +package main + +import "fmt" + +func main() { + + var i int = "Hello" + + fmt.Println(i) + +} diff --git a/hello-channel-post/main.go b/hello-channel-post/main.go new file mode 100644 index 0000000..c17035a --- /dev/null +++ b/hello-channel-post/main.go @@ -0,0 +1,19 @@ +package main + +import "fmt" + +func f(left, right chan int) { + left <- 1 + <-right +} + +func main() { + leftmost := make(chan int) + var left, right chan int = nil, leftmost + for i := 0; i < 100000; i++ { + left, right = right, make(chan int) + go f(left, right) + } + right <- 0 + x := <-leftmost + fmt.Println(x) +} diff --git a/hello-channel/main.go b/hello-channel/main.go new file mode 100644 index 0000000..ec1e268 --- /dev/null +++ b/hello-channel/main.go @@ -0,0 +1,11 @@ +package main + +import "fmt" + +func main() { + c := make(chan string) + //Wert in Channel schreiben + c <- "Hello World" + //Wert aus Channel lesen + fmt.Println(<-c) +} diff --git a/hello-go-channel/main.go b/hello-go-channel/main.go new file mode 100644 index 0000000..66c1488 --- /dev/null +++ b/hello-go-channel/main.go @@ -0,0 +1,20 @@ +package main + +import ( + "fmt" +) + +func sayHello(c chan string) { + fmt.Println("vor") + c <- "Hello World" + fmt.Println("nach") +} + +func main() { + c := make(chan string) + go sayHello(c) + fmt.Println("vor2") + text := <-c + fmt.Println("nach2") + fmt.Println(text) +} diff --git a/hello-interface/main.go b/hello-interface/main.go new file mode 100644 index 0000000..b6039ed --- /dev/null +++ b/hello-interface/main.go @@ -0,0 +1,27 @@ +package main + +import "fmt" + +type QuasselStrippe interface { + Quassel() +} + +type Person struct { + name string +} + +func (p *Person) Quassel() { + fmt.Printf("Hi. Meine Name ist %s\n", p.name) +} + +func VielQuasseln(qs QuasselStrippe) { + for i := 0; i < 3; i++ { + qs.Quassel() + } +} + +func main() { + s := &Person{name: "Quassel-Philip"} + s.Quassel() + VielQuasseln(s) +} diff --git a/hello-world/cplusplus/README.txt b/hello-world/cplusplus/README.txt new file mode 100644 index 0000000..8b0dd8c --- /dev/null +++ b/hello-world/cplusplus/README.txt @@ -0,0 +1,12 @@ +Starten des docker Containers +----------------------------- + +``` +docker run -v `pwd`:/tmp -it gcc:latest /bin/bash +``` + +Danach im Container +``` +cd /tmp +time g++ hello.cpp +``` diff --git a/hello-world/cplusplus/a.out b/hello-world/cplusplus/a.out new file mode 100755 index 0000000..08c963e Binary files /dev/null and b/hello-world/cplusplus/a.out differ diff --git a/hello-world/cplusplus/hello.cpp b/hello-world/cplusplus/hello.cpp new file mode 100644 index 0000000..4706104 --- /dev/null +++ b/hello-world/cplusplus/hello.cpp @@ -0,0 +1,6 @@ +#include + +int main() { + std::cout << "Hello World!"; + return 0; +} \ No newline at end of file diff --git a/hello-world/go/README.txt b/hello-world/go/README.txt new file mode 100644 index 0000000..3007a60 --- /dev/null +++ b/hello-world/go/README.txt @@ -0,0 +1,12 @@ +Starten des docker Containers +----------------------------- + +``` +docker run -v `pwd`:/tmp -it golang:latest /bin/bash +``` + +Danach im Container +``` +cd /tmp +time go build main.go +``` diff --git a/hello-world/go/main.go b/hello-world/go/main.go new file mode 100644 index 0000000..078ddff --- /dev/null +++ b/hello-world/go/main.go @@ -0,0 +1,7 @@ +package main + +import "fmt" + +func main() { + fmt.Println("Hello, 世界") +} diff --git a/hello-world/java/Main.java b/hello-world/java/Main.java new file mode 100644 index 0000000..cabd861 --- /dev/null +++ b/hello-world/java/Main.java @@ -0,0 +1,7 @@ + + +public class Main { + public static void main(String[] args) { + System.out.println("Hello World"); + } +} diff --git a/hello-world/java/README.txt b/hello-world/java/README.txt new file mode 100644 index 0000000..5955271 --- /dev/null +++ b/hello-world/java/README.txt @@ -0,0 +1,12 @@ +Starten des docker Containers +----------------------------- + +``` +docker run -v `pwd`:/tmp -it openjdk:latest /bin/bash +``` + +Danach im Container +``` +cd /tmp +time javac Main.java +``` \ No newline at end of file diff --git a/hello-world/javascript/README.txt b/hello-world/javascript/README.txt new file mode 100644 index 0000000..bf3eb06 --- /dev/null +++ b/hello-world/javascript/README.txt @@ -0,0 +1,12 @@ +Starten des docker Containers +----------------------------- + +``` +docker run -v `pwd`:/tmp -it node:latest /bin/bash +``` + +Danach im Containers +``` +cd /tmp +node index.js +``` \ No newline at end of file diff --git a/hello-world/javascript/index.js b/hello-world/javascript/index.js new file mode 100644 index 0000000..b8c57fe --- /dev/null +++ b/hello-world/javascript/index.js @@ -0,0 +1 @@ +console.log("Hello World") \ No newline at end of file diff --git a/hello-world/python/README.txt b/hello-world/python/README.txt new file mode 100644 index 0000000..80537b5 --- /dev/null +++ b/hello-world/python/README.txt @@ -0,0 +1,12 @@ +Starten des docker Containers +----------------------------- + +``` +docker run -v `pwd`:/tmp -it python:latest /bin/bash +``` + +Danach im Containers +``` +cd /tmp +time python hello.py +``` \ No newline at end of file diff --git a/hello-world/python/hello.py b/hello-world/python/hello.py new file mode 100644 index 0000000..8ad280d --- /dev/null +++ b/hello-world/python/hello.py @@ -0,0 +1 @@ +print("Hello World.") \ No newline at end of file diff --git a/hello-world/typescript/README.txt b/hello-world/typescript/README.txt new file mode 100644 index 0000000..58caa73 --- /dev/null +++ b/hello-world/typescript/README.txt @@ -0,0 +1,13 @@ +Starten des docker Containers +----------------------------- + +``` +docker run -v `pwd`:/tmp -it node:latest /bin/bash +``` + +Danach im Container +``` +npm install -g tsc +cd /tmp +time tsc hello.ts +``` diff --git a/hello-world/typescript/hello.js b/hello-world/typescript/hello.js new file mode 100644 index 0000000..9ad1fd7 --- /dev/null +++ b/hello-world/typescript/hello.js @@ -0,0 +1,5 @@ +function greeter(person) { + return "Hello, " + person; +} +var user = "Jane User"; +console.log(greeter(user)); diff --git a/hello-world/typescript/hello.ts b/hello-world/typescript/hello.ts new file mode 100644 index 0000000..37e6674 --- /dev/null +++ b/hello-world/typescript/hello.ts @@ -0,0 +1,7 @@ +function greeter(person) { + return "Hello, " + person; +} + +let user = "Jane User"; + +console.log(greeter(user)); \ No newline at end of file diff --git a/library-dependency/go.mod b/library-dependency/go.mod new file mode 100644 index 0000000..e9882fc --- /dev/null +++ b/library-dependency/go.mod @@ -0,0 +1,5 @@ +module library-dependency + +go 1.13 + +require github.com/SourceFellows/somelib v0.0.2 diff --git a/library-dependency/go.sum b/library-dependency/go.sum new file mode 100644 index 0000000..322cadf --- /dev/null +++ b/library-dependency/go.sum @@ -0,0 +1,2 @@ +github.com/SourceFellows/somelib v0.0.2 h1:mRbh02CVY098DPnLaTGeBeeCfYkoBY8U2v3ZJk/Zyvo= +github.com/SourceFellows/somelib v0.0.2/go.mod h1:acrwWUtWlfzG22eWIsriyO+Qu6it2dIHQZO21HFpRwY= diff --git a/library-dependency/main.go b/library-dependency/main.go new file mode 100644 index 0000000..b7270d9 --- /dev/null +++ b/library-dependency/main.go @@ -0,0 +1,9 @@ +package main + +import "github.com/SourceFellows/somelib" + +func main() { + + somelib.CallLib() + +} diff --git a/microservices/container/Dockerfile b/microservices/container/Dockerfile new file mode 100644 index 0000000..4e671e5 --- /dev/null +++ b/microservices/container/Dockerfile @@ -0,0 +1,7 @@ +FROM golang:latest + +COPY main.go /app/main.go +WORKDIR /app +RUN go build main.go + +CMD [ "/app/main"] \ No newline at end of file diff --git a/microservices/container/README.md b/microservices/container/README.md new file mode 100644 index 0000000..63028ab --- /dev/null +++ b/microservices/container/README.md @@ -0,0 +1,6 @@ +# Ausführen + +``` +docker build -t microservice-buch . +docker run microservice-buch +``` \ No newline at end of file diff --git a/microservices/container/main.go b/microservices/container/main.go new file mode 100644 index 0000000..b1b14d0 --- /dev/null +++ b/microservices/container/main.go @@ -0,0 +1,7 @@ +package main + +import "fmt" + +func main() { + fmt.Println("Hello World!") +} diff --git a/microservices/default-mux-demo/main.go b/microservices/default-mux-demo/main.go new file mode 100644 index 0000000..74e5a46 --- /dev/null +++ b/microservices/default-mux-demo/main.go @@ -0,0 +1,28 @@ +package main + +import "net/http" + +type myHandler struct { + Name string +} + +func (h *myHandler) ServeHTTP(r http.ResponseWriter, _ *http.Request) { + r.Write([]byte(h.Name)) +} + +func main() { + handler1 := &myHandler{Name: "handler1"} + handler2 := &myHandler{Name: "handler2"} + handler3 := &myHandler{Name: "handler3"} + handler4 := &myHandler{Name: "handler4"} + handler5 := &myHandler{Name: "handler5"} + handler6 := &myHandler{Name: "handler6"} + + http.Handle("/", handler1) + http.Handle("/book", handler2) + http.Handle("/books/", handler3) + http.Handle("/books/Hobbit", handler4) + http.Handle("/theme", handler5) + http.Handle("/theme/", handler6) + http.ListenAndServeTLS(":8080", nil) +} diff --git a/microservices/formrequest/Form-request.http b/microservices/formrequest/Form-request.http new file mode 100644 index 0000000..885c2e5 --- /dev/null +++ b/microservices/formrequest/Form-request.http @@ -0,0 +1,4 @@ +POST http://localhost:8080/ HTTP/1.1 +Content-Type: application/x-www-form-urlencoded + +name=Peter \ No newline at end of file diff --git a/microservices/formrequest/go.mod b/microservices/formrequest/go.mod new file mode 100644 index 0000000..38aad23 --- /dev/null +++ b/microservices/formrequest/go.mod @@ -0,0 +1,3 @@ +module golang.source-fellows.com/samples/formrequest + +go 1.13 diff --git a/microservices/formrequest/main.go b/microservices/formrequest/main.go new file mode 100644 index 0000000..9c0fbca --- /dev/null +++ b/microservices/formrequest/main.go @@ -0,0 +1,18 @@ +package main + +import "net/http" + +func handleForm(rw http.ResponseWriter, rq *http.Request) { + err := rq.ParseForm() + if err != nil { + rw.WriteHeader(http.StatusNotAcceptable) + return + } + name := rq.Form.Get("name") + rw.Write([]byte("Hello " + name)) +} + +func main() { + http.HandleFunc("/", handleForm) + http.ListenAndServe(":8080", nil) +} diff --git a/microservices/go-channel/main.go b/microservices/go-channel/main.go new file mode 100644 index 0000000..a1ed456 --- /dev/null +++ b/microservices/go-channel/main.go @@ -0,0 +1,33 @@ +package main + +import ( + "fmt" + "math/rand" + "time" +) + +func main() { + + tc := make(chan time.Time) + + var c int64 = 0 + + go func() { + for { + go func() { + for { + c++ + i := rand.Int31n(10) + time.Sleep(time.Duration(i) * time.Millisecond) + tc <- time.Now() + } + }() + } + }() + + for t := range tc { + fmt.Println(t) + fmt.Println(c) + } + +} diff --git a/microservices/gorilla-mux/go.mod b/microservices/gorilla-mux/go.mod new file mode 100644 index 0000000..0124fe7 --- /dev/null +++ b/microservices/gorilla-mux/go.mod @@ -0,0 +1,5 @@ +module golang.source-fellows.com/samples/gorillamux + +go 1.13 + +require github.com/gorilla/mux v1.7.4 diff --git a/microservices/gorilla-mux/go.sum b/microservices/gorilla-mux/go.sum new file mode 100644 index 0000000..abb0613 --- /dev/null +++ b/microservices/gorilla-mux/go.sum @@ -0,0 +1,2 @@ +github.com/gorilla/mux v1.7.4 h1:VuZ8uybHlWmqV03+zRzdwKL4tUnIp1MAQtp1mIFE1bc= +github.com/gorilla/mux v1.7.4/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= diff --git a/microservices/gorilla-mux/main.go b/microservices/gorilla-mux/main.go new file mode 100644 index 0000000..397dfa6 --- /dev/null +++ b/microservices/gorilla-mux/main.go @@ -0,0 +1,18 @@ +package main + +import ( + "net/http" + + "github.com/gorilla/mux" +) + +func myFunc(rw http.ResponseWriter, rq *http.Request) { + rw.Write([]byte("Hello World")) +} + +func main() { + r := mux.NewRouter() + r.PathPrefix("/").HandlerFunc(myFunc) + r.Methods("GET") + http.ListenAndServe(":8080", r) +} diff --git a/microservices/gorm-hooks/go.mod b/microservices/gorm-hooks/go.mod new file mode 100644 index 0000000..0f19ba4 --- /dev/null +++ b/microservices/gorm-hooks/go.mod @@ -0,0 +1,8 @@ +module golang.source-fellows.com/samples/gorm + +go 1.14 + +require ( + github.com/Unknwon/log v0.0.0-20200308114134-929b1006e34a + github.com/jinzhu/gorm v1.9.14 +) diff --git a/microservices/gorm-hooks/go.sum b/microservices/gorm-hooks/go.sum new file mode 100644 index 0000000..f7bce9b --- /dev/null +++ b/microservices/gorm-hooks/go.sum @@ -0,0 +1,27 @@ +github.com/PuerkitoBio/goquery v1.5.1/go.mod h1:GsLWisAFVj4WgDibEWF4pvYnkVQBpKBKeU+7zCJoLcc= +github.com/Unknwon/log v0.0.0-20200308114134-929b1006e34a h1:2/IoPLpPzmKDdgAfM0aQVp71xVK5G/FKUqPWHQw5xp8= +github.com/Unknwon/log v0.0.0-20200308114134-929b1006e34a/go.mod h1:/+ZenhmdkCX8gc8YHVQRSdVGE/+F9HvTY6QDTwEbaO4= +github.com/andybalholm/cascadia v1.1.0/go.mod h1:GsXiBklL0woXo1j/WYWtSYYC4ouU9PqHO0sqidkEA4Y= +github.com/denisenkom/go-mssqldb v0.0.0-20191124224453-732737034ffd/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU= +github.com/erikstmartin/go-testdb v0.0.0-20160219214506-8d10e4a1bae5/go.mod h1:a2zkGnVExMxdzMo3M0Hi/3sEU+cWnZpSni0O6/Yb/P0= +github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= +github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= +github.com/jinzhu/gorm v1.9.14 h1:Kg3ShyTPcM6nzVo148fRrcMO6MNKuqtOUwnzqMgVniM= +github.com/jinzhu/gorm v1.9.14/go.mod h1:G3LB3wezTOWM2ITLzPxEXgSkOXAntiLHS7UdBefADcs= +github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E= +github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= +github.com/jinzhu/now v1.0.1/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= +github.com/lib/pq v1.1.1/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/mattn/go-sqlite3 v1.14.0 h1:mLyGNKR8+Vv9CAU7PphKa2hkEqxxhn8i32J6FPj1/QA= +github.com/mattn/go-sqlite3 v1.14.0/go.mod h1:JIl7NbARA7phWnGvh0LKTyg7S9BA+6gx71ShQilpsus= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190325154230-a5d413f7728c/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20191205180655-e7c4368fe9dd/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/net v0.0.0-20180218175443-cbe0f9307d01/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= diff --git a/microservices/gorm-hooks/main.go b/microservices/gorm-hooks/main.go new file mode 100644 index 0000000..c5f1894 --- /dev/null +++ b/microservices/gorm-hooks/main.go @@ -0,0 +1,58 @@ +package main + +import ( + "fmt" + "log" + + "github.com/jinzhu/gorm" + _ "github.com/jinzhu/gorm/dialects/sqlite" +) + +type Customer struct { + gorm.Model + FirstName string + LastName string +} + +func (u *Customer) BeforeUpdate() (err error) { + fmt.Println("before update") + return nil +} + +func main() { + db, err := gorm.Open("sqlite3", "test.db") + if err != nil { + panic("failed to connect database") + } + defer db.Close() + + // LogMode enable + db.LogMode(true) + + // Migrate the schema + err = db.AutoMigrate(&Customer{}).Error + if err != nil { + log.Fatalf("error migrating ", err) + } + + // Create + customer := Customer{FirstName: "Hans", LastName: "wurst"} + db.Create(&customer) + + var foundCustomer Customer + // Plain SQL + db.First(&foundCustomer, "First_Name = ?", "Hans") + // Template + db.Where(&Customer{FirstName: "Hans"}).First(&foundCustomer) + + fmt.Println("Gefunden wurde:", foundCustomer.FirstName) + + // Update - update product's price to 2000 + db.Model(&foundCustomer).Update("LastName", "Meiser") + + err = db.Delete(&foundCustomer).Error + if err != nil { + panic(err) + } + +} diff --git a/microservices/gorm-hooks/test.db b/microservices/gorm-hooks/test.db new file mode 100644 index 0000000..1120d73 Binary files /dev/null and b/microservices/gorm-hooks/test.db differ diff --git a/microservices/gorm-relation/go.mod b/microservices/gorm-relation/go.mod new file mode 100644 index 0000000..c1d87c3 --- /dev/null +++ b/microservices/gorm-relation/go.mod @@ -0,0 +1,5 @@ +module golang.source-fellows.com/samples/gormrelation + +go 1.14 + +require github.com/jinzhu/gorm v1.9.14 diff --git a/microservices/gorm-relation/go.sum b/microservices/gorm-relation/go.sum new file mode 100644 index 0000000..12a4fd1 --- /dev/null +++ b/microservices/gorm-relation/go.sum @@ -0,0 +1,32 @@ +github.com/PuerkitoBio/goquery v1.5.1/go.mod h1:GsLWisAFVj4WgDibEWF4pvYnkVQBpKBKeU+7zCJoLcc= +github.com/andybalholm/cascadia v1.1.0/go.mod h1:GsXiBklL0woXo1j/WYWtSYYC4ouU9PqHO0sqidkEA4Y= +github.com/denisenkom/go-mssqldb v0.0.0-20191124224453-732737034ffd h1:83Wprp6ROGeiHFAP8WJdI2RoxALQYgdllERc3N5N2DM= +github.com/denisenkom/go-mssqldb v0.0.0-20191124224453-732737034ffd/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU= +github.com/erikstmartin/go-testdb v0.0.0-20160219214506-8d10e4a1bae5 h1:Yzb9+7DPaBjB8zlTR87/ElzFsnQfuHnVUVqpZZIcV5Y= +github.com/erikstmartin/go-testdb v0.0.0-20160219214506-8d10e4a1bae5/go.mod h1:a2zkGnVExMxdzMo3M0Hi/3sEU+cWnZpSni0O6/Yb/P0= +github.com/go-sql-driver/mysql v1.5.0 h1:ozyZYNQW3x3HtqT1jira07DN2PArx2v7/mN66gGcHOs= +github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= +github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe h1:lXe2qZdvpiX5WZkZR4hgp4KJVfY3nMkvmwbVkpv1rVY= +github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= +github.com/jinzhu/gorm v1.9.14 h1:Kg3ShyTPcM6nzVo148fRrcMO6MNKuqtOUwnzqMgVniM= +github.com/jinzhu/gorm v1.9.14/go.mod h1:G3LB3wezTOWM2ITLzPxEXgSkOXAntiLHS7UdBefADcs= +github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E= +github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= +github.com/jinzhu/now v1.0.1 h1:HjfetcXq097iXP0uoPCdnM4Efp5/9MsM0/M+XOTeR3M= +github.com/jinzhu/now v1.0.1/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= +github.com/lib/pq v1.1.1 h1:sJZmqHoEaY7f+NPP8pgLB/WxulyR3fewgCM2qaSlBb4= +github.com/lib/pq v1.1.1/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/mattn/go-sqlite3 v1.14.0 h1:mLyGNKR8+Vv9CAU7PphKa2hkEqxxhn8i32J6FPj1/QA= +github.com/mattn/go-sqlite3 v1.14.0/go.mod h1:JIl7NbARA7phWnGvh0LKTyg7S9BA+6gx71ShQilpsus= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190325154230-a5d413f7728c/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20191205180655-e7c4368fe9dd h1:GGJVjV8waZKRHrgwvtH66z9ZGVurTD1MT0n1Bb+q4aM= +golang.org/x/crypto v0.0.0-20191205180655-e7c4368fe9dd/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/net v0.0.0-20180218175443-cbe0f9307d01/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= diff --git a/microservices/gorm-relation/main.go b/microservices/gorm-relation/main.go new file mode 100644 index 0000000..8faac45 --- /dev/null +++ b/microservices/gorm-relation/main.go @@ -0,0 +1,51 @@ +package main + +import ( + "fmt" + + "github.com/jinzhu/gorm" + _ "github.com/jinzhu/gorm/dialects/sqlite" +) + +type Customer struct { + gorm.Model + FirstName string + LastName string + CreditCard CreditCard + CreditCardId uint +} + +type CreditCard struct { + gorm.Model + Number string +} + +func main() { + db, err := gorm.Open("sqlite3", "test.db") + if err != nil { + panic("failed to connect database") + } + defer db.Close() + + // LogMode enable + db.LogMode(true) + + // Migrate the schema + db.AutoMigrate(&CreditCard{}, &Customer{}) + + // Create + customer := Customer{FirstName: "Hans", LastName: "wurst"} + customer.CreditCard = CreditCard{Number: "123-123-123"} + db.Set("gorm:association_autoupdate", false).Set("gorm:association_autoupdate", true).Create(&customer) + + var foundCustomer Customer + var foundCreditCard CreditCard + + db.Where(&Customer{FirstName: "Hans"}).First(&foundCustomer) + db.Model(&foundCustomer).Related(&foundCreditCard) + + fmt.Println("Gefunden wurde:", foundCreditCard.Number) + + db.Delete(&foundCustomer) + +} diff --git a/microservices/gorm/go.mod b/microservices/gorm/go.mod new file mode 100644 index 0000000..0f19ba4 --- /dev/null +++ b/microservices/gorm/go.mod @@ -0,0 +1,8 @@ +module golang.source-fellows.com/samples/gorm + +go 1.14 + +require ( + github.com/Unknwon/log v0.0.0-20200308114134-929b1006e34a + github.com/jinzhu/gorm v1.9.14 +) diff --git a/microservices/gorm/go.sum b/microservices/gorm/go.sum new file mode 100644 index 0000000..f7bce9b --- /dev/null +++ b/microservices/gorm/go.sum @@ -0,0 +1,27 @@ +github.com/PuerkitoBio/goquery v1.5.1/go.mod h1:GsLWisAFVj4WgDibEWF4pvYnkVQBpKBKeU+7zCJoLcc= +github.com/Unknwon/log v0.0.0-20200308114134-929b1006e34a h1:2/IoPLpPzmKDdgAfM0aQVp71xVK5G/FKUqPWHQw5xp8= +github.com/Unknwon/log v0.0.0-20200308114134-929b1006e34a/go.mod h1:/+ZenhmdkCX8gc8YHVQRSdVGE/+F9HvTY6QDTwEbaO4= +github.com/andybalholm/cascadia v1.1.0/go.mod h1:GsXiBklL0woXo1j/WYWtSYYC4ouU9PqHO0sqidkEA4Y= +github.com/denisenkom/go-mssqldb v0.0.0-20191124224453-732737034ffd/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU= +github.com/erikstmartin/go-testdb v0.0.0-20160219214506-8d10e4a1bae5/go.mod h1:a2zkGnVExMxdzMo3M0Hi/3sEU+cWnZpSni0O6/Yb/P0= +github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= +github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= +github.com/jinzhu/gorm v1.9.14 h1:Kg3ShyTPcM6nzVo148fRrcMO6MNKuqtOUwnzqMgVniM= +github.com/jinzhu/gorm v1.9.14/go.mod h1:G3LB3wezTOWM2ITLzPxEXgSkOXAntiLHS7UdBefADcs= +github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E= +github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= +github.com/jinzhu/now v1.0.1/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= +github.com/lib/pq v1.1.1/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/mattn/go-sqlite3 v1.14.0 h1:mLyGNKR8+Vv9CAU7PphKa2hkEqxxhn8i32J6FPj1/QA= +github.com/mattn/go-sqlite3 v1.14.0/go.mod h1:JIl7NbARA7phWnGvh0LKTyg7S9BA+6gx71ShQilpsus= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190325154230-a5d413f7728c/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20191205180655-e7c4368fe9dd/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/net v0.0.0-20180218175443-cbe0f9307d01/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= diff --git a/microservices/gorm/main.go b/microservices/gorm/main.go new file mode 100644 index 0000000..75be97c --- /dev/null +++ b/microservices/gorm/main.go @@ -0,0 +1,53 @@ +package main + +import ( + "fmt" + "log" + + "github.com/jinzhu/gorm" + _ "github.com/jinzhu/gorm/dialects/sqlite" +) + +type Customer struct { + gorm.Model + FirstName string + LastName string +} + +func main() { + db, err := gorm.Open("sqlite3", "test.db") + if err != nil { + panic("failed to connect database") + } + defer db.Close() + + // LogMode enable + db.LogMode(true) + + // Migrate the schema + err = db.AutoMigrate(&Customer{}).Error + if err != nil { + log.Fatalf("error migrating ", err) + } + + // Create + customer := Customer{FirstName: "Hans", LastName: "wurst"} + db.Create(&customer) + + var foundCustomer Customer + // Plain SQL + db.First(&foundCustomer, "First_Name = ?", "Hans") + // Template + db.Where(&Customer{FirstName: "Hans"}).First(&foundCustomer) + + fmt.Println("Gefunden wurde:", foundCustomer.FirstName) + + // Update - update product's price to 2000 + db.Model(&foundCustomer).Update("LastName", "Meiser") + + err = db.Delete(&foundCustomer).Error + if err != nil { + panic(err) + } + +} diff --git a/microservices/grpc/client/cmd/main.go b/microservices/grpc/client/cmd/main.go new file mode 100644 index 0000000..0962aa7 --- /dev/null +++ b/microservices/grpc/client/cmd/main.go @@ -0,0 +1,22 @@ +package main + +import ( + "context" + "log" + + "golang.source-fellows.com/samples/grpc/hello" + "google.golang.org/grpc" + "google.golang.org/protobuf/types/known/emptypb" +) + +func main() { + con, _ := grpc.Dial(":8080", grpc.WithInsecure()) + client := hello.NewHelloWorldServiceClient(con) + + ctx := context.Background() + answer, err := client.SayHello(ctx, &emptypb.Empty{}) + if err != nil { + log.Fatal(err) + } + log.Println(answer.GetMessageText()) +} diff --git a/microservices/grpc/client/go.mod b/microservices/grpc/client/go.mod new file mode 100644 index 0000000..0f8ec44 --- /dev/null +++ b/microservices/grpc/client/go.mod @@ -0,0 +1,11 @@ +module golang.source-fellows.com/samples/grpc/client + +go 1.13 + +require ( + golang.source-fellows.com/samples/grpc/hello v0.0.0 + google.golang.org/grpc v1.30.0 + google.golang.org/protobuf v1.25.0 +) + +replace golang.source-fellows.com/samples/grpc/hello => ./../hello diff --git a/microservices/grpc/client/go.sum b/microservices/grpc/client/go.sum new file mode 100644 index 0000000..6807b9f --- /dev/null +++ b/microservices/grpc/client/go.sum @@ -0,0 +1,78 @@ +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= +github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/protobuf v1.2.0/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.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +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/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 h1:/QaMHBdZ26BB3SSst0Iwl10Epc+xhTquomWX0oZEB6w= +github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +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-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +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-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a h1:oWX7TPOiFAMXLq8o0ikBYfCJVlRHBcsciT5bXOrH628= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +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-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a h1:1BGLXjeY4akVXGgbC9HugT3Jv3hCI0z56oJR5vAMgBU= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +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-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +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.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= +google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.30.0 h1:M5a8xTlYTxwMn5ZFkwhRabsygDY5G8TYLyQDBxJNAxE= +google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +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/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= +honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= diff --git a/microservices/grpc/hello/go.mod b/microservices/grpc/hello/go.mod new file mode 100644 index 0000000..916e5fe --- /dev/null +++ b/microservices/grpc/hello/go.mod @@ -0,0 +1,9 @@ +module golang.source-fellows.com/samples/grpc/hello + +go 1.13 + +require ( + github.com/golang/protobuf v1.4.2 + google.golang.org/grpc v1.30.0 + google.golang.org/protobuf v1.25.0 +) diff --git a/microservices/grpc/hello/go.sum b/microservices/grpc/hello/go.sum new file mode 100644 index 0000000..c0931d5 --- /dev/null +++ b/microservices/grpc/hello/go.sum @@ -0,0 +1,75 @@ +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= +github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/protobuf v1.2.0/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.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +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/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/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +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-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +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-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a h1:oWX7TPOiFAMXLq8o0ikBYfCJVlRHBcsciT5bXOrH628= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +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-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +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-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +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.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= +google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.30.0 h1:M5a8xTlYTxwMn5ZFkwhRabsygDY5G8TYLyQDBxJNAxE= +google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +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/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= +honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= diff --git a/microservices/grpc/hello/hello-message.pb.go b/microservices/grpc/hello/hello-message.pb.go new file mode 100644 index 0000000..0078d92 --- /dev/null +++ b/microservices/grpc/hello/hello-message.pb.go @@ -0,0 +1,161 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.25.0-devel +// protoc v3.12.3 +// source: hello-message.proto + +package hello + +import ( + proto "github.com/golang/protobuf/proto" + empty "github.com/golang/protobuf/ptypes/empty" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +// This is a compile-time assertion that a sufficiently up-to-date version +// of the legacy proto package is being used. +const _ = proto.ProtoPackageIsVersion4 + +type HelloMessage struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + MessageText string `protobuf:"bytes,1,opt,name=messageText,proto3" json:"messageText,omitempty"` +} + +func (x *HelloMessage) Reset() { + *x = HelloMessage{} + if protoimpl.UnsafeEnabled { + mi := &file_hello_message_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *HelloMessage) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*HelloMessage) ProtoMessage() {} + +func (x *HelloMessage) ProtoReflect() protoreflect.Message { + mi := &file_hello_message_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use HelloMessage.ProtoReflect.Descriptor instead. +func (*HelloMessage) Descriptor() ([]byte, []int) { + return file_hello_message_proto_rawDescGZIP(), []int{0} +} + +func (x *HelloMessage) GetMessageText() string { + if x != nil { + return x.MessageText + } + return "" +} + +var File_hello_message_proto protoreflect.FileDescriptor + +var file_hello_message_proto_rawDesc = []byte{ + 0x0a, 0x13, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x2d, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x05, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x1a, 0x1b, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x65, 0x6d, + 0x70, 0x74, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x30, 0x0a, 0x0c, 0x48, 0x65, 0x6c, + 0x6c, 0x6f, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x6d, 0x65, 0x73, + 0x73, 0x61, 0x67, 0x65, 0x54, 0x65, 0x78, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, + 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x54, 0x65, 0x78, 0x74, 0x32, 0x4c, 0x0a, 0x11, 0x48, + 0x65, 0x6c, 0x6c, 0x6f, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x12, 0x37, 0x0a, 0x08, 0x73, 0x61, 0x79, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x12, 0x16, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, + 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x13, 0x2e, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x2e, 0x48, 0x65, 0x6c, + 0x6c, 0x6f, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x42, 0x2e, 0x5a, 0x2c, 0x67, 0x6f, 0x6c, + 0x61, 0x6e, 0x67, 0x2e, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2d, 0x66, 0x65, 0x6c, 0x6c, 0x6f, + 0x77, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x73, 0x2f, 0x67, + 0x72, 0x70, 0x63, 0x2f, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x33, +} + +var ( + file_hello_message_proto_rawDescOnce sync.Once + file_hello_message_proto_rawDescData = file_hello_message_proto_rawDesc +) + +func file_hello_message_proto_rawDescGZIP() []byte { + file_hello_message_proto_rawDescOnce.Do(func() { + file_hello_message_proto_rawDescData = protoimpl.X.CompressGZIP(file_hello_message_proto_rawDescData) + }) + return file_hello_message_proto_rawDescData +} + +var file_hello_message_proto_msgTypes = make([]protoimpl.MessageInfo, 1) +var file_hello_message_proto_goTypes = []interface{}{ + (*HelloMessage)(nil), // 0: hello.HelloMessage + (*empty.Empty)(nil), // 1: google.protobuf.Empty +} +var file_hello_message_proto_depIdxs = []int32{ + 1, // 0: hello.HelloWorldService.sayHello:input_type -> google.protobuf.Empty + 0, // 1: hello.HelloWorldService.sayHello:output_type -> hello.HelloMessage + 1, // [1:2] is the sub-list for method output_type + 0, // [0:1] is the sub-list for method input_type + 0, // [0:0] is the sub-list for extension type_name + 0, // [0:0] is the sub-list for extension extendee + 0, // [0:0] is the sub-list for field type_name +} + +func init() { file_hello_message_proto_init() } +func file_hello_message_proto_init() { + if File_hello_message_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_hello_message_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*HelloMessage); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_hello_message_proto_rawDesc, + NumEnums: 0, + NumMessages: 1, + NumExtensions: 0, + NumServices: 1, + }, + GoTypes: file_hello_message_proto_goTypes, + DependencyIndexes: file_hello_message_proto_depIdxs, + MessageInfos: file_hello_message_proto_msgTypes, + }.Build() + File_hello_message_proto = out.File + file_hello_message_proto_rawDesc = nil + file_hello_message_proto_goTypes = nil + file_hello_message_proto_depIdxs = nil +} diff --git a/microservices/grpc/hello/hello-message.proto b/microservices/grpc/hello/hello-message.proto new file mode 100644 index 0000000..31ab508 --- /dev/null +++ b/microservices/grpc/hello/hello-message.proto @@ -0,0 +1,15 @@ +syntax="proto3"; + +package hello; + +option go_package = "golang.source-fellows.com/samples/grpc/hello"; + +import "google/protobuf/empty.proto"; + +message HelloMessage { + string messageText = 1; +} + +service HelloWorldService { + rpc sayHello(google.protobuf.Empty) returns (HelloMessage); +} \ No newline at end of file diff --git a/microservices/grpc/hello/hello-message_grpc.pb.go b/microservices/grpc/hello/hello-message_grpc.pb.go new file mode 100644 index 0000000..fb2d784 --- /dev/null +++ b/microservices/grpc/hello/hello-message_grpc.pb.go @@ -0,0 +1,91 @@ +// Code generated by protoc-gen-go-grpc. DO NOT EDIT. + +package hello + +import ( + context "context" + empty "github.com/golang/protobuf/ptypes/empty" + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" +) + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +const _ = grpc.SupportPackageIsVersion6 + +// HelloWorldServiceClient is the client API for HelloWorldService service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. +type HelloWorldServiceClient interface { + SayHello(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*HelloMessage, error) +} + +type helloWorldServiceClient struct { + cc grpc.ClientConnInterface +} + +func NewHelloWorldServiceClient(cc grpc.ClientConnInterface) HelloWorldServiceClient { + return &helloWorldServiceClient{cc} +} + +func (c *helloWorldServiceClient) SayHello(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*HelloMessage, error) { + out := new(HelloMessage) + err := c.cc.Invoke(ctx, "/hello.HelloWorldService/sayHello", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +// HelloWorldServiceServer is the server API for HelloWorldService service. +// All implementations must embed UnimplementedHelloWorldServiceServer +// for forward compatibility +type HelloWorldServiceServer interface { + SayHello(context.Context, *empty.Empty) (*HelloMessage, error) + mustEmbedUnimplementedHelloWorldServiceServer() +} + +// UnimplementedHelloWorldServiceServer must be embedded to have forward compatible implementations. +type UnimplementedHelloWorldServiceServer struct { +} + +func (*UnimplementedHelloWorldServiceServer) SayHello(context.Context, *empty.Empty) (*HelloMessage, error) { + return nil, status.Errorf(codes.Unimplemented, "method SayHello not implemented") +} +func (*UnimplementedHelloWorldServiceServer) mustEmbedUnimplementedHelloWorldServiceServer() {} + +func RegisterHelloWorldServiceServer(s *grpc.Server, srv HelloWorldServiceServer) { + s.RegisterService(&_HelloWorldService_serviceDesc, srv) +} + +func _HelloWorldService_SayHello_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(empty.Empty) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(HelloWorldServiceServer).SayHello(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/hello.HelloWorldService/SayHello", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(HelloWorldServiceServer).SayHello(ctx, req.(*empty.Empty)) + } + return interceptor(ctx, in, info, handler) +} + +var _HelloWorldService_serviceDesc = grpc.ServiceDesc{ + ServiceName: "hello.HelloWorldService", + HandlerType: (*HelloWorldServiceServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "sayHello", + Handler: _HelloWorldService_SayHello_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "hello-message.proto", +} diff --git a/microservices/grpc/server/cmd/main.go b/microservices/grpc/server/cmd/main.go new file mode 100644 index 0000000..4796d91 --- /dev/null +++ b/microservices/grpc/server/cmd/main.go @@ -0,0 +1,18 @@ +package main + +import ( + "log" + "net" + + "golang.source-fellows.com/samples/grpc/hello" + "golang.source-fellows.com/samples/grpc/server" + "google.golang.org/grpc" +) + +func main() { + srv := grpc.NewServer() + hello.RegisterHelloWorldServiceServer(srv, &server.HelloService{}) + listener, _ := net.Listen("tcp", ":8080") + log.Println("Starting Server ...") + log.Fatal(srv.Serve(listener)) +} diff --git a/microservices/grpc/server/go.mod b/microservices/grpc/server/go.mod new file mode 100644 index 0000000..6d92815 --- /dev/null +++ b/microservices/grpc/server/go.mod @@ -0,0 +1,13 @@ +module golang.source-fellows.com/samples/grpc/server + +go 1.13 + +require ( + github.com/golang/protobuf v1.4.2 + golang.source-fellows.com/samples/grpc/hello v0.0.0 + google.golang.org/grpc v1.30.0 + google.golang.org/grpc/cmd/protoc-gen-go-grpc v0.0.0-20200630190442-3de8449f8555 // indirect + google.golang.org/protobuf v1.25.0 +) + +replace golang.source-fellows.com/samples/grpc/hello => ./../hello diff --git a/microservices/grpc/server/go.sum b/microservices/grpc/server/go.sum new file mode 100644 index 0000000..73c105d --- /dev/null +++ b/microservices/grpc/server/go.sum @@ -0,0 +1,80 @@ +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= +github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/protobuf v1.2.0/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.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +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/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/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +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-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +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-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a h1:oWX7TPOiFAMXLq8o0ikBYfCJVlRHBcsciT5bXOrH628= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +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-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +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-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.source-fellows.com v0.0.0-20200619133407-79aa8981720c h1:c0BKYhs4PULAm3Hb5f+t9AcmPRScdSAkeuajndyOMLQ= +golang.source-fellows.com v0.0.0-20200619133407-79aa8981720c/go.mod h1:40F0hxiV+yxOJaUHRyBpnlLt4Cv2SQFKZNBKTvueCeI= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +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.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= +google.golang.org/grpc v1.27.0 h1:rRYRFMVgRv6E0D70Skyfsr28tDXIuuPZyWGMPdMcnXg= +google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.30.0 h1:M5a8xTlYTxwMn5ZFkwhRabsygDY5G8TYLyQDBxJNAxE= +google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc/cmd/protoc-gen-go-grpc v0.0.0-20200630190442-3de8449f8555 h1:HYZFXlXJqim8gcoUICZN9oGXFPtw2GEBFm3ay9KZnxU= +google.golang.org/grpc/cmd/protoc-gen-go-grpc v0.0.0-20200630190442-3de8449f8555/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= +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/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= +honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= diff --git a/microservices/grpc/server/helloService.go b/microservices/grpc/server/helloService.go new file mode 100644 index 0000000..f308d12 --- /dev/null +++ b/microservices/grpc/server/helloService.go @@ -0,0 +1,17 @@ +package server + +import ( + context "context" + + empty "github.com/golang/protobuf/ptypes/empty" + "golang.source-fellows.com/samples/grpc/hello" +) + +type HelloService struct { + hello.UnimplementedHelloWorldServiceServer +} + +func (hs *HelloService) SayHello(context.Context, *empty.Empty) (*hello.HelloMessage, error) { + msg := &hello.HelloMessage{MessageText: "Hello World"} + return msg, nil +} diff --git a/microservices/hanlder-impl/cmd/main.go b/microservices/hanlder-impl/cmd/main.go new file mode 100644 index 0000000..60be16b --- /dev/null +++ b/microservices/hanlder-impl/cmd/main.go @@ -0,0 +1,11 @@ +package main + +import ( + "net/http" + + "golang.source-fellows.com/samples/httphandler" +) + +func main() { + http.ListenAndServe(":8080", &httphandler.MyHandler{}) +} diff --git a/microservices/hanlder-impl/go.mod b/microservices/hanlder-impl/go.mod new file mode 100644 index 0000000..df86df0 --- /dev/null +++ b/microservices/hanlder-impl/go.mod @@ -0,0 +1,3 @@ +module golang.source-fellows.com/samples/httphandler + +go 1.13 diff --git a/microservices/hanlder-impl/go.sum b/microservices/hanlder-impl/go.sum new file mode 100644 index 0000000..16e9303 --- /dev/null +++ b/microservices/hanlder-impl/go.sum @@ -0,0 +1 @@ +golang.source-fellows.com v0.0.0-20200619133407-79aa8981720c h1:c0BKYhs4PULAm3Hb5f+t9AcmPRScdSAkeuajndyOMLQ= diff --git a/microservices/hanlder-impl/handler.go b/microservices/hanlder-impl/handler.go new file mode 100644 index 0000000..81067fe --- /dev/null +++ b/microservices/hanlder-impl/handler.go @@ -0,0 +1,9 @@ +package httphandler + +import "net/http" + +type MyHandler struct{} + +func (mh *MyHandler) ServeHTTP(writer http.ResponseWriter, req *http.Request) { + writer.Write([]byte("Hello World!")) +} diff --git a/microservices/http-client-circut-breaker/go.mod b/microservices/http-client-circut-breaker/go.mod new file mode 100644 index 0000000..1e10229 --- /dev/null +++ b/microservices/http-client-circut-breaker/go.mod @@ -0,0 +1,5 @@ +module golang.source-fellows.com/samples/httpcircuitbreaker + +go 1.13 + +require github.com/sony/gobreaker v0.4.1 diff --git a/microservices/http-client-circut-breaker/go.sum b/microservices/http-client-circut-breaker/go.sum new file mode 100644 index 0000000..11b0e52 --- /dev/null +++ b/microservices/http-client-circut-breaker/go.sum @@ -0,0 +1,6 @@ +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/sony/gobreaker v0.4.1 h1:oMnRNZXX5j85zso6xCPRNPtmAycat+WcoKbklScLDgQ= +github.com/sony/gobreaker v0.4.1/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= diff --git a/microservices/http-client-circut-breaker/main.go b/microservices/http-client-circut-breaker/main.go new file mode 100644 index 0000000..1064cc2 --- /dev/null +++ b/microservices/http-client-circut-breaker/main.go @@ -0,0 +1,43 @@ +package main + +import ( + "fmt" + "io/ioutil" + "log" + "net/http" + "time" + + breaker "github.com/sony/gobreaker" +) + +var cb *breaker.CircuitBreaker + +func main() { + + settings := breaker.Settings{Interval: 1 * time.Second, Timeout: 5 * time.Second} + cb = breaker.NewCircuitBreaker(settings) + + for { + bites, err := cb.Execute(func() (interface{}, error) { + res, err := http.Get("http://localhost:8080/a") + if err != nil { + return nil, err + } + if res.StatusCode == http.StatusOK { + + } + defer res.Body.Close() + bites, _ := ioutil.ReadAll(res.Body) + return bites, nil + }) + + if err != nil { + log.Printf("error %v\n", err) + + } else { + fmt.Println(string(bites.([]byte))) + } + + } + +} diff --git a/microservices/http-client-config/main.go b/microservices/http-client-config/main.go new file mode 100644 index 0000000..c823ae5 --- /dev/null +++ b/microservices/http-client-config/main.go @@ -0,0 +1,17 @@ +package main + +import ( + "net/http" + "time" +) + +func main() { + client := http.Client{Transport: &http.Transport{ + ResponseHeaderTimeout: 1 * time.Millisecond, + }} + res, err := client.Get("https://google.com") + if err != nil { + panic(err) + } + defer res.Body.Close() +} diff --git a/microservices/http-client-ssl-cert/certs/ca/certsdb/01.pem b/microservices/http-client-ssl-cert/certs/ca/certsdb/01.pem new file mode 100644 index 0000000..1844631 --- /dev/null +++ b/microservices/http-client-ssl-cert/certs/ca/certsdb/01.pem @@ -0,0 +1,71 @@ +Certificate: + Data: + Version: 1 (0x0) + Serial Number: 1 (0x1) + Signature Algorithm: sha1WithRSAEncryption + Issuer: C=DE, ST=BW, L=Reutlingen, O=Source Fellows GmbH/emailAddress=webmaster@example.private, CN=test.example.private + Validity + Not Before: Jul 9 04:15:47 2020 GMT + Not After : Jul 9 04:15:47 2021 GMT + Subject: C=DE, ST=BW, L=Reutlingen, O=Source Fellows GmbH, CN=test.example.private/emailAddress=user@example.private + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + RSA Public-Key: (2048 bit) + Modulus: + 00:e3:a9:b6:c5:35:06:6d:12:ee:e7:ee:60:89:49: + 2a:ac:b2:be:3d:f7:c5:4d:55:08:fc:80:43:aa:fd: + 05:6c:43:94:a5:02:c9:1f:fc:70:c4:44:85:5a:b8: + f9:95:f8:8a:5c:2e:12:55:43:23:f2:d0:34:c3:a4: + 41:89:14:a9:d1:19:d4:0d:d0:58:87:38:9f:6c:1d: + 89:2d:23:60:8f:9e:af:f4:5a:f0:d0:a4:fd:4a:49: + 9b:19:df:97:20:db:80:7b:ee:f2:ba:e7:9a:b4:3c: + 48:74:9c:57:61:0b:4e:ee:eb:53:5d:ca:3d:9e:f3: + d2:d5:1a:f7:7a:34:1d:09:73:44:1c:af:3d:31:72: + 90:e9:43:0b:b3:c9:30:58:21:df:27:5b:39:42:85: + f1:ec:d9:1c:89:38:64:92:d6:da:f9:22:c1:e9:b5: + 22:bf:3a:32:10:f9:e3:e6:b3:73:1d:d2:7e:a9:a6: + 27:86:83:8c:7e:9d:4f:39:d0:53:45:0b:f7:89:8b: + f2:8c:43:44:42:a9:4a:81:83:60:bb:1f:63:f5:75: + fa:73:3b:85:c9:62:7d:1d:8a:61:4c:3c:f9:23:a3: + 3d:97:78:6f:6d:13:db:88:79:fb:89:0b:3e:a6:50: + b8:72:9a:c8:d3:7b:d2:ec:6c:15:3d:ab:f7:8b:c8: + 50:9b + Exponent: 65537 (0x10001) + Signature Algorithm: sha1WithRSAEncryption + 95:b9:66:f0:95:05:82:2c:9b:f6:85:ea:68:7c:ae:18:b5:d1: + 12:10:22:2f:2f:1f:5f:d8:15:b6:b3:87:4a:dc:b1:1c:1d:c3: + 8c:80:2f:cb:d2:bd:36:35:53:27:20:c0:b8:5f:58:92:8e:60: + 2a:01:f1:08:38:d0:97:6f:4f:a1:57:17:e7:b9:fc:e1:67:7a: + 97:1b:b3:e1:36:26:06:b2:32:9d:5a:12:4b:2d:b7:0b:8b:c8: + 09:bc:5c:b1:8f:f8:42:24:97:10:6d:6a:eb:82:99:0a:bf:e8: + fe:9c:1d:52:f2:2d:78:18:a4:9f:33:27:88:54:86:09:11:0e: + fd:d5:5c:0d:65:c4:78:bd:cc:2f:34:59:e0:13:e8:02:ed:98: + c4:9e:7f:5e:f7:9b:18:d1:c6:76:eb:1b:dc:76:6a:a6:ab:f3: + b5:8f:b5:0a:ad:cf:07:d5:cf:6c:69:ae:0c:f5:dc:f2:b2:11: + 2b:b2:b6:a5:b5:63:6b:1f:0d:7b:cd:07:81:59:40:5e:12:c9: + 41:73:cf:08:87:3c:ab:38:51:27:c2:ad:c6:57:20:dc:bd:fe: + cf:ea:b5:37:29:be:c1:f4:9b:61:ad:a3:f8:5c:d7:7b:65:2e: + 80:f9:6b:dd:42:a8:62:ae:52:0d:95:f7:67:04:10:b9:97:24: + 48:33:fb:22 +-----BEGIN CERTIFICATE----- +MIIDnTCCAoUCAQEwDQYJKoZIhvcNAQEFBQAwgZYxCzAJBgNVBAYTAkRFMQswCQYD +VQQIDAJCVzETMBEGA1UEBwwKUmV1dGxpbmdlbjEcMBoGA1UECgwTU291cmNlIEZl +bGxvd3MgR21iSDEoMCYGCSqGSIb3DQEJARYZd2VibWFzdGVyQGV4YW1wbGUucHJp +dmF0ZTEdMBsGA1UEAwwUdGVzdC5leGFtcGxlLnByaXZhdGUwHhcNMjAwNzA5MDQx +NTQ3WhcNMjEwNzA5MDQxNTQ3WjCBkTELMAkGA1UEBhMCREUxCzAJBgNVBAgMAkJX +MRMwEQYDVQQHDApSZXV0bGluZ2VuMRwwGgYDVQQKDBNTb3VyY2UgRmVsbG93cyBH +bWJIMR0wGwYDVQQDDBR0ZXN0LmV4YW1wbGUucHJpdmF0ZTEjMCEGCSqGSIb3DQEJ +ARYUdXNlckBleGFtcGxlLnByaXZhdGUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw +ggEKAoIBAQDjqbbFNQZtEu7n7mCJSSqssr4998VNVQj8gEOq/QVsQ5SlAskf/HDE +RIVauPmV+IpcLhJVQyPy0DTDpEGJFKnRGdQN0FiHOJ9sHYktI2CPnq/0WvDQpP1K +SZsZ35cg24B77vK655q0PEh0nFdhC07u61Ndyj2e89LVGvd6NB0Jc0Qcrz0xcpDp +QwuzyTBYId8nWzlChfHs2RyJOGSS1tr5IsHptSK/OjIQ+ePms3Md0n6ppieGg4x+ +nU850FNFC/eJi/KMQ0RCqUqBg2C7H2P1dfpzO4XJYn0dimFMPPkjoz2XeG9tE9uI +efuJCz6mULhymsjTe9LsbBU9q/eLyFCbAgMBAAEwDQYJKoZIhvcNAQEFBQADggEB +AJW5ZvCVBYIsm/aF6mh8rhi10RIQIi8vH1/YFbazh0rcsRwdw4yAL8vSvTY1Uycg +wLhfWJKOYCoB8Qg40JdvT6FXF+e5/OFnepcbs+E2JgayMp1aEksttwuLyAm8XLGP ++EIklxBtauuCmQq/6P6cHVLyLXgYpJ8zJ4hUhgkRDv3VXA1lxHi9zC80WeAT6ALt +mMSef173mxjRxnbrG9x2aqar87WPtQqtzwfVz2xprgz13PKyESuytqW1Y2sfDXvN +B4FZQF4SyUFzzwiHPKs4USfCrcZXINy9/s/qtTcpvsH0m2Gto/hc13tlLoD5a91C +qGKuUg2V92cEELmXJEgz+yI= +-----END CERTIFICATE----- diff --git a/microservices/http-client-ssl-cert/certs/ca/index.txt b/microservices/http-client-ssl-cert/certs/ca/index.txt new file mode 100644 index 0000000..27662dd --- /dev/null +++ b/microservices/http-client-ssl-cert/certs/ca/index.txt @@ -0,0 +1 @@ +V 210709041547Z 01 unknown /C=DE/ST=BW/L=Reutlingen/O=Source Fellows GmbH/CN=test.example.private/emailAddress=user@example.private diff --git a/microservices/http-client-ssl-cert/certs/ca/index.txt.attr b/microservices/http-client-ssl-cert/certs/ca/index.txt.attr new file mode 100644 index 0000000..8f7e63a --- /dev/null +++ b/microservices/http-client-ssl-cert/certs/ca/index.txt.attr @@ -0,0 +1 @@ +unique_subject = yes diff --git a/microservices/http-client-ssl-cert/certs/ca/index.txt.attr.old b/microservices/http-client-ssl-cert/certs/ca/index.txt.attr.old new file mode 100644 index 0000000..e69de29 diff --git a/microservices/http-client-ssl-cert/certs/ca/index.txt.old b/microservices/http-client-ssl-cert/certs/ca/index.txt.old new file mode 100644 index 0000000..e69de29 diff --git a/microservices/http-client-ssl-cert/certs/ca/serial b/microservices/http-client-ssl-cert/certs/ca/serial new file mode 100644 index 0000000..9e22bcb --- /dev/null +++ b/microservices/http-client-ssl-cert/certs/ca/serial @@ -0,0 +1 @@ +02 diff --git a/microservices/http-client-ssl-cert/certs/ca/serial.old b/microservices/http-client-ssl-cert/certs/ca/serial.old new file mode 100644 index 0000000..8a0f05e --- /dev/null +++ b/microservices/http-client-ssl-cert/certs/ca/serial.old @@ -0,0 +1 @@ +01 diff --git a/microservices/http-client-ssl-cert/certs/myRoot.crt b/microservices/http-client-ssl-cert/certs/myRoot.crt new file mode 100644 index 0000000..242eadf --- /dev/null +++ b/microservices/http-client-ssl-cert/certs/myRoot.crt @@ -0,0 +1,21 @@ +-----BEGIN CERTIFICATE----- +MIIDhTCCAm2gAwIBAgIUS7TqIYrkdb2kEmtuawe8h/54VVIwDQYJKoZIhvcNAQEL +BQAwUjELMAkGA1UEBhMCREUxEDAOBgNVBAgMB0JhV8ODwrwxEzARBgNVBAcMClJl +dXRsaW5nZW4xHDAaBgNVBAoME1NvdXJjZSBGZWxsb3dzIEdtYkgwHhcNMjAwNzA4 +MDM1ODE4WhcNMzAwNzA2MDM1ODE4WjBSMQswCQYDVQQGEwJERTEQMA4GA1UECAwH +QmFXw4PCvDETMBEGA1UEBwwKUmV1dGxpbmdlbjEcMBoGA1UECgwTU291cmNlIEZl +bGxvd3MgR21iSDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANY+x2Kr +U49506heEh2s0Q5vTjXUbP5814pHhlJ43X3p7QYMbJ/BBunxLA3a8GvuukgD1Wxr +0T0uHo5/MLxRh6r1TEy80IApUsyCcAO3jdTGtIr4iebnAOL/Dw0TGWDRyl5SZCwo +BsVSOfCoJyMs+ygB+BLE+05Dq5FwA3CpxP5r67efBpY2Y9bu1iXAC179rGaVvtLM +3Zy5G+tQ0aMJYOqVR6tvSrrYg44gJiM270u6Os80V723fPtEUvKbHQOpZoleHWsb +uZ1FbdQBcnJ2u3bI93ewQAvqQ3tjOqgell5n7kJ1B3Vjk8bVzda1zPKH9vcvF0fc +gXdPrVOzBCa5Su8CAwEAAaNTMFEwHQYDVR0OBBYEFO3om6AZ9q/+r6kXo7hAhOBD +SeTbMB8GA1UdIwQYMBaAFO3om6AZ9q/+r6kXo7hAhOBDSeTbMA8GA1UdEwEB/wQF +MAMBAf8wDQYJKoZIhvcNAQELBQADggEBAMxKFUWYTQz/ACVY8lV18QCGxcvNj3Uz +ZdtNUEDkxu6yKsl+1otREbuxqnfNjrGLmlLQfU/GlY+PCF85SYm1Ep4yKdZ7J+1c +MG+PB5NS3cV7BnoJ6WnXk7KJRX+dYpCr+jQmQbtTshk6dM2a6THjyPzKkyDflcfM +tXQROGDG9O/5DvF8Eqz13Gel5Wukept9mHtDHapU0BooFTXNqh+tPmFU76tKCQZV +h0Qt9BC8A6bDEaULVlXpvNTuDCrCMGhiYEo2++PD/e5YT1UDVNSokanyFIUoCJAn +X5u+VjRfaVibiWu8E63qoKv+oXBf9pwlNeE8KBlydzf5OQgx8FEkbfc= +-----END CERTIFICATE----- diff --git a/microservices/http-client-ssl-cert/certs/myRoot.key b/microservices/http-client-ssl-cert/certs/myRoot.key new file mode 100644 index 0000000..a018d60 --- /dev/null +++ b/microservices/http-client-ssl-cert/certs/myRoot.key @@ -0,0 +1,27 @@ +-----BEGIN RSA PRIVATE KEY----- +MIIEowIBAAKCAQEA1j7HYqtTj3nTqF4SHazRDm9ONdRs/nzXikeGUnjdfentBgxs +n8EG6fEsDdrwa+66SAPVbGvRPS4ejn8wvFGHqvVMTLzQgClSzIJwA7eN1Ma0iviJ +5ucA4v8PDRMZYNHKXlJkLCgGxVI58KgnIyz7KAH4EsT7TkOrkXADcKnE/mvrt58G +ljZj1u7WJcALXv2sZpW+0szdnLkb61DRowlg6pVHq29KutiDjiAmIzbvS7o6zzRX +vbd8+0RS8psdA6lmiV4daxu5nUVt1AFycna7dsj3d7BAC+pDe2M6qB6WXmfuQnUH +dWOTxtXN1rXM8of29y8XR9yBd0+tU7MEJrlK7wIDAQABAoIBAQC0GzaWthybAvly +ExL7q2pbzipbimbOUbkI4DQFZOIelebSLOOsMSNUy5ATXbi7o4cqPz7N1J2j5v99 +H2OjDI8WovwvjpNhClw23Hi6RzaOZzUjluinGg9exLisbx/oirSrMmxPyp5Wh1d5 +/oJYSdohufYIIVx6YNz8eMQLlEys7BcAs9uDbfrEh2lhSCRd+eVER/p2U+EE3YFe +OPhE7S7/5fDHidA/vU5YL0zyDcTiqec8lF3b63L39zYsckUjvbJ9gXru+RUFsnYT +FCz/8axvSyiRj9M162BtrwV1lANgbck+unmk9j63bMaNUFHdlFxovxZDA4C6napJ ++5dnwduBAoGBAO3UqDRxSWvelTv5vSFWaiJoFKU23PGX46Fsy+b8ttj+8Jz94333 +u+1t5fEnpS46QhQtiVRB42pezBncJ+CdjQ92ikcJZL7o8NYttlmTVg2i/v+dnxmL +T+Tgl89VUOgfKdlRwpgG64dMT1HFQJlMKkKMzdS6FxQtSclYSq0yYVxhAoGBAOac +2ijcy0xlhDinsmikxBveaxl8pTeF0jmLlXmNRTuSXkk9tXi5yurV+e4M9oG7pvYU +4LUthIvtbmPgDhANN5+45bJqNWw3ovaLb0/60XsET4fiR8W0muXMHcBySpFQsvRm +/daw41S+f4rv2XqyaLLbwmgPiusGlJMDENQQCmlPAoGASPA2Idc4gDeEJx+hTE8X +P7QR2NVpj0JY0lHuesm4PfZ5znviv+gxH1Db+0iAVRwS1eNdQZTvbNjj2W52YGGR +OFPPdpe/6PjBm73rNa+E7au2bqhlec0K1JO4myJ8LKQaDocPmdZNd3IExXwsIpeE +QmKyYXIsz8hP38sPI+zWhSECgYBzJz2Ui/QEGOj2NV7T+/plBCIsnt4NJIh97aJd +CNraTVNBdUvplbSqoOBlKxnoXCCZ3oD6V1lJWez2eEntX/w3iGdCOOCmQf3g6G1T +3aW+rL9d1fMK2Q1D1DHDCA8OEuLZQZhdHQTXKyya3vuU1gOL1Ep2FdTDWQzVgAFm +MwBP5wKBgC7jFtvny07N3NQN/KX758LxN043Awx7DstraYj93jDQ8xT5naiXC/8m +YoGB9aE6v+uxllBN5QdTSdzL0vpmkLYfnLbKSq54WVOflSAvL6VjxI9o9HMFqGF2 +wcEp3pm+ub20bZBdFoxP15X3IisUGiQcrg/q4ZGHxOvJuzI9q4b0 +-----END RSA PRIVATE KEY----- diff --git a/microservices/http-client-ssl-cert/certs/myRoot.srl b/microservices/http-client-ssl-cert/certs/myRoot.srl new file mode 100644 index 0000000..ad3cbeb --- /dev/null +++ b/microservices/http-client-ssl-cert/certs/myRoot.srl @@ -0,0 +1 @@ +73771BE66A4800A9EBDEF9018EBEDCDB7701BCC8 diff --git a/microservices/http-client-ssl-cert/certs/server-cert.conf b/microservices/http-client-ssl-cert/certs/server-cert.conf new file mode 100644 index 0000000..306506a --- /dev/null +++ b/microservices/http-client-ssl-cert/certs/server-cert.conf @@ -0,0 +1,6 @@ +authorityKeyIdentifier=keyid,issuer +basicConstraints=CA:FALSE +keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment, keyCertSign +subjectAltName = @alt_names +[alt_names] +DNS.1 = test.example.private \ No newline at end of file diff --git a/microservices/http-client-ssl-cert/certs/server-cert.request.conf b/microservices/http-client-ssl-cert/certs/server-cert.request.conf new file mode 100644 index 0000000..09d661e --- /dev/null +++ b/microservices/http-client-ssl-cert/certs/server-cert.request.conf @@ -0,0 +1,12 @@ +[req] +distinguished_name = dn +default_bits = 2048 +prompt = no +default_md = sha256 +[dn] +C=DE +ST=BW +L=Reutlingen +O=Source Fellows GmbH +emailAddress=webmaster@example.private +CN = test.example.private \ No newline at end of file diff --git a/microservices/http-client-ssl-cert/certs/server-chain.crt b/microservices/http-client-ssl-cert/certs/server-chain.crt new file mode 100644 index 0000000..2fc88c8 --- /dev/null +++ b/microservices/http-client-ssl-cert/certs/server-chain.crt @@ -0,0 +1,42 @@ +-----BEGIN CERTIFICATE----- +MIIDhTCCAm2gAwIBAgIUS7TqIYrkdb2kEmtuawe8h/54VVIwDQYJKoZIhvcNAQEL +BQAwUjELMAkGA1UEBhMCREUxEDAOBgNVBAgMB0JhV8ODwrwxEzARBgNVBAcMClJl +dXRsaW5nZW4xHDAaBgNVBAoME1NvdXJjZSBGZWxsb3dzIEdtYkgwHhcNMjAwNzA4 +MDM1ODE4WhcNMzAwNzA2MDM1ODE4WjBSMQswCQYDVQQGEwJERTEQMA4GA1UECAwH +QmFXw4PCvDETMBEGA1UEBwwKUmV1dGxpbmdlbjEcMBoGA1UECgwTU291cmNlIEZl +bGxvd3MgR21iSDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANY+x2Kr +U49506heEh2s0Q5vTjXUbP5814pHhlJ43X3p7QYMbJ/BBunxLA3a8GvuukgD1Wxr +0T0uHo5/MLxRh6r1TEy80IApUsyCcAO3jdTGtIr4iebnAOL/Dw0TGWDRyl5SZCwo +BsVSOfCoJyMs+ygB+BLE+05Dq5FwA3CpxP5r67efBpY2Y9bu1iXAC179rGaVvtLM +3Zy5G+tQ0aMJYOqVR6tvSrrYg44gJiM270u6Os80V723fPtEUvKbHQOpZoleHWsb +uZ1FbdQBcnJ2u3bI93ewQAvqQ3tjOqgell5n7kJ1B3Vjk8bVzda1zPKH9vcvF0fc +gXdPrVOzBCa5Su8CAwEAAaNTMFEwHQYDVR0OBBYEFO3om6AZ9q/+r6kXo7hAhOBD +SeTbMB8GA1UdIwQYMBaAFO3om6AZ9q/+r6kXo7hAhOBDSeTbMA8GA1UdEwEB/wQF +MAMBAf8wDQYJKoZIhvcNAQELBQADggEBAMxKFUWYTQz/ACVY8lV18QCGxcvNj3Uz +ZdtNUEDkxu6yKsl+1otREbuxqnfNjrGLmlLQfU/GlY+PCF85SYm1Ep4yKdZ7J+1c +MG+PB5NS3cV7BnoJ6WnXk7KJRX+dYpCr+jQmQbtTshk6dM2a6THjyPzKkyDflcfM +tXQROGDG9O/5DvF8Eqz13Gel5Wukept9mHtDHapU0BooFTXNqh+tPmFU76tKCQZV +h0Qt9BC8A6bDEaULVlXpvNTuDCrCMGhiYEo2++PD/e5YT1UDVNSokanyFIUoCJAn +X5u+VjRfaVibiWu8E63qoKv+oXBf9pwlNeE8KBlydzf5OQgx8FEkbfc= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDcDCCAlgCFHN3G+ZqSACp6975AY6+3Nt3AbzIMA0GCSqGSIb3DQEBCwUAMFIx +CzAJBgNVBAYTAkRFMRAwDgYDVQQIDAdCYVfDg8K8MRMwEQYDVQQHDApSZXV0bGlu +Z2VuMRwwGgYDVQQKDBNTb3VyY2UgRmVsbG93cyBHbWJIMB4XDTIwMDcwOTA0MTM0 +NloXDTMwMDcwNzA0MTM0NlowgZYxCzAJBgNVBAYTAkRFMQswCQYDVQQIDAJCVzET +MBEGA1UEBwwKUmV1dGxpbmdlbjEcMBoGA1UECgwTU291cmNlIEZlbGxvd3MgR21i +SDEoMCYGCSqGSIb3DQEJARYZd2VibWFzdGVyQGV4YW1wbGUucHJpdmF0ZTEdMBsG +A1UEAwwUdGVzdC5leGFtcGxlLnByaXZhdGUwggEiMA0GCSqGSIb3DQEBAQUAA4IB +DwAwggEKAoIBAQDEff9ZynNlYbqjTSl77iLejkEwkZuByBwW90CSNcU4GvYnBkiJ +phUGCV0ifZzEbs+a+AFi9n4AUeA6MUHukEd9ccVSjhg3CQVuPgShyWW1m7XFuiFw +ms0cePzkNviwDwQvHknS1DaEVDwhjciE0PmWn2CcRVf5ZoNi39EmrYotZBvovxQv +RoOoP8LXRj4sZDY+5hrwheOoYbAiq0pZcNY7ajHH5CXt/GXKwNucZmBiJSCqusj8 +BQgJ1ob788pu1mqojs8QAhgcRf2jkM7MKTuO5tjOrHfdN2dlcDV9k8O+dg2FwIAF +db0Nrmy71qHrdz1o7nsx0ktyuQmcHC8GfltNAgMBAAEwDQYJKoZIhvcNAQELBQAD +ggEBAFC2bJh1AVWBdHA6Ig6GPW0pta14foNIQTPgjZfxRZZBaHS3cTr5Shl5Dhpi +nU48hoAZNmNaSf7Y47+UhjlQHaRWs1kGyIdYFuyujn9CxGQXmzCG/VvOHh+elwws +HV7cR6KRMozzOo4JVc61wKgnXOlaLOkY2T26aFhMfpeZhSmZ+vxRIe7uo2UEWLNg +nRf7DOAcQCUEtyWB8jF+Du5nKg6FnQYn9S9qzwJSCDKvNaw+TaXK1kumcrxuF9s9 +HLxYDAnKfLIqsekoeELrbMU+r0Jhpbr3oHeUa4Mm+v2I2SleWNcYLfQmCyxklJ5r +LrQLEceRlUveswrFdPYZYVQq2gc= +-----END CERTIFICATE----- diff --git a/microservices/http-client-ssl-cert/certs/test.example.crt b/microservices/http-client-ssl-cert/certs/test.example.crt new file mode 100644 index 0000000..caaa4fa --- /dev/null +++ b/microservices/http-client-ssl-cert/certs/test.example.crt @@ -0,0 +1,21 @@ +-----BEGIN CERTIFICATE----- +MIIDcDCCAlgCFHN3G+ZqSACp6975AY6+3Nt3AbzIMA0GCSqGSIb3DQEBCwUAMFIx +CzAJBgNVBAYTAkRFMRAwDgYDVQQIDAdCYVfDg8K8MRMwEQYDVQQHDApSZXV0bGlu +Z2VuMRwwGgYDVQQKDBNTb3VyY2UgRmVsbG93cyBHbWJIMB4XDTIwMDcwOTA0MTM0 +NloXDTMwMDcwNzA0MTM0NlowgZYxCzAJBgNVBAYTAkRFMQswCQYDVQQIDAJCVzET +MBEGA1UEBwwKUmV1dGxpbmdlbjEcMBoGA1UECgwTU291cmNlIEZlbGxvd3MgR21i +SDEoMCYGCSqGSIb3DQEJARYZd2VibWFzdGVyQGV4YW1wbGUucHJpdmF0ZTEdMBsG +A1UEAwwUdGVzdC5leGFtcGxlLnByaXZhdGUwggEiMA0GCSqGSIb3DQEBAQUAA4IB +DwAwggEKAoIBAQDEff9ZynNlYbqjTSl77iLejkEwkZuByBwW90CSNcU4GvYnBkiJ +phUGCV0ifZzEbs+a+AFi9n4AUeA6MUHukEd9ccVSjhg3CQVuPgShyWW1m7XFuiFw +ms0cePzkNviwDwQvHknS1DaEVDwhjciE0PmWn2CcRVf5ZoNi39EmrYotZBvovxQv +RoOoP8LXRj4sZDY+5hrwheOoYbAiq0pZcNY7ajHH5CXt/GXKwNucZmBiJSCqusj8 +BQgJ1ob788pu1mqojs8QAhgcRf2jkM7MKTuO5tjOrHfdN2dlcDV9k8O+dg2FwIAF +db0Nrmy71qHrdz1o7nsx0ktyuQmcHC8GfltNAgMBAAEwDQYJKoZIhvcNAQELBQAD +ggEBAFC2bJh1AVWBdHA6Ig6GPW0pta14foNIQTPgjZfxRZZBaHS3cTr5Shl5Dhpi +nU48hoAZNmNaSf7Y47+UhjlQHaRWs1kGyIdYFuyujn9CxGQXmzCG/VvOHh+elwws +HV7cR6KRMozzOo4JVc61wKgnXOlaLOkY2T26aFhMfpeZhSmZ+vxRIe7uo2UEWLNg +nRf7DOAcQCUEtyWB8jF+Du5nKg6FnQYn9S9qzwJSCDKvNaw+TaXK1kumcrxuF9s9 +HLxYDAnKfLIqsekoeELrbMU+r0Jhpbr3oHeUa4Mm+v2I2SleWNcYLfQmCyxklJ5r +LrQLEceRlUveswrFdPYZYVQq2gc= +-----END CERTIFICATE----- diff --git a/microservices/http-client-ssl-cert/certs/test.example.csr b/microservices/http-client-ssl-cert/certs/test.example.csr new file mode 100644 index 0000000..9d3b8ec --- /dev/null +++ b/microservices/http-client-ssl-cert/certs/test.example.csr @@ -0,0 +1,18 @@ +-----BEGIN CERTIFICATE REQUEST----- +MIIC3DCCAcQCAQAwgZYxCzAJBgNVBAYTAkRFMQswCQYDVQQIDAJCVzETMBEGA1UE +BwwKUmV1dGxpbmdlbjEcMBoGA1UECgwTU291cmNlIEZlbGxvd3MgR21iSDEoMCYG +CSqGSIb3DQEJARYZd2VibWFzdGVyQGV4YW1wbGUucHJpdmF0ZTEdMBsGA1UEAwwU +dGVzdC5leGFtcGxlLnByaXZhdGUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK +AoIBAQDEff9ZynNlYbqjTSl77iLejkEwkZuByBwW90CSNcU4GvYnBkiJphUGCV0i +fZzEbs+a+AFi9n4AUeA6MUHukEd9ccVSjhg3CQVuPgShyWW1m7XFuiFwms0cePzk +NviwDwQvHknS1DaEVDwhjciE0PmWn2CcRVf5ZoNi39EmrYotZBvovxQvRoOoP8LX +Rj4sZDY+5hrwheOoYbAiq0pZcNY7ajHH5CXt/GXKwNucZmBiJSCqusj8BQgJ1ob7 +88pu1mqojs8QAhgcRf2jkM7MKTuO5tjOrHfdN2dlcDV9k8O+dg2FwIAFdb0Nrmy7 +1qHrdz1o7nsx0ktyuQmcHC8GfltNAgMBAAGgADANBgkqhkiG9w0BAQsFAAOCAQEA +l+IOqCs8V602w/GoWdxmLagVGUhSO7DOj6y3mPJirYCWwXCWWePkI9EFnW6ZW3O5 +uNCS2EkmzCOn/Py2M4R6h0+4a+eT+uZVY3gLhD4oN3uYPDoycoMHfkCYXXCNTJG1 +y3rWrvqrg7PjzEk7NOdG5dpGbdok9GVmkaXVjMn64J0PVzzyYZbM+1bxs9sq7Juj +xzW/ZYioL/R+XBsUFeiwIiro1AlSUO1zClEMR5ePPGoEkbaMu6z1aojF51jEW+3M +208+uZnRgycuwpcLPdThagXGblAdypYzSB6vTKN9jndsy+/gMgp/K/Ie926trJEZ +Bmogwc3Y5xduKsqkSxWNEw== +-----END CERTIFICATE REQUEST----- diff --git a/microservices/http-client-ssl-cert/certs/test.example.key b/microservices/http-client-ssl-cert/certs/test.example.key new file mode 100644 index 0000000..bacb8f4 --- /dev/null +++ b/microservices/http-client-ssl-cert/certs/test.example.key @@ -0,0 +1,28 @@ +-----BEGIN PRIVATE KEY----- +MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDEff9ZynNlYbqj +TSl77iLejkEwkZuByBwW90CSNcU4GvYnBkiJphUGCV0ifZzEbs+a+AFi9n4AUeA6 +MUHukEd9ccVSjhg3CQVuPgShyWW1m7XFuiFwms0cePzkNviwDwQvHknS1DaEVDwh +jciE0PmWn2CcRVf5ZoNi39EmrYotZBvovxQvRoOoP8LXRj4sZDY+5hrwheOoYbAi +q0pZcNY7ajHH5CXt/GXKwNucZmBiJSCqusj8BQgJ1ob788pu1mqojs8QAhgcRf2j +kM7MKTuO5tjOrHfdN2dlcDV9k8O+dg2FwIAFdb0Nrmy71qHrdz1o7nsx0ktyuQmc +HC8GfltNAgMBAAECggEAD4P/gOCaohvIeBKkvvN772T+Qs6Mn//kL/AQOjtiul5u +p4A4hB4INPTSVOHkWiKB5DPHMEBUjMPqV84B7cuYyZANS8qKoPXmZuEgzoGvtVp5 +TQa4k0K2BZSMK50noAdfhjT3EV3OfD6GjQO8HLi/rKQjJdPX8Yqlv037Hvm/GnxU +we4ozN6AbrfUAff5VLU/S8BcKjzlklHHAnRpFzD+Wz4w7woKNDUOjHH1WI6HWoSR +Pupab/IYhldiXNrB6hCuco+I58DENY1cYQ2X24k/XExRDebpUwZXrGSIxQ7lxCKh +tc+x/QyJMqu2t4kKSvgBXTeb+g3PfSmfdZnIrAnTQQKBgQDozUzLhCPb3NzeiHG8 +Kd3J14+QttpT2x15qo3hn2jp5pBQmY07s75AiuBX4MKZ01rMFHUd+DpcJ7NOEC5X +dPJJ4jJEdwee26NSKk+MnWliiQgzThw1rL/9Nq9Wh7bZxMG/R5Q4ED0FRQWCPW3h +MwAEN6CRALaj94NOJUNEjUzFPQKBgQDYEnJ+vHvhwsQPzQaBez/U4aQ1tA1rh9hB +iecddIX91OXw8znQvSxZUKvXQov8U+03rGeJXIMRLGT7EsvK4/8czi2r7NgLnUMM +6AQ3/FXwylNTUvSFLEcypHp4FfwJ1OFHvZWCvT8i+Ni7onvbL5JEKeKoRE/3E91N +FrfCKlDvUQKBgCwsAB1BhlhKUPI8a3ArdXS93PS1bTmqAq66KM+dopd28v0IFZ81 +XKz8bNLfx6zOSJUecJZuKgygT8pJEbHwc6SHMciB2UVQIW4OrydcGsnifFbXxEx+ +6bLO9HfzqkMprSVxHHOCyUE9tmze4QFw3tjuAR5iR0VXSmfCdEAGm4F1AoGAbf1N +/UfTRAQSK/zxL95eiu5l2dSS9EcNhac+V9cmEiVa+8HEj4aM2dZf807z1XmfirSf +a+QE8CwKJ2jVBq3zAmXOB/Ojsp3WMO62nw07bjyAGC1lPZlhkNz7Xr/KMfMEzrEq +N4hAaHwGT9WReO0JZttvfrpvflXFVGWZGyTRWFECgYEA1UGQB/+I4WanfaP7aTRn +hVPdf62wePlm2hDCg5DI7OSRxFbIq7aah516QG1w0JiEEnbTEYF0IAMvJT2SuDsS +45UNe0myHb4jDI6kqPXef4EmJhhO92GsMfgocsl9HYb+ElSiSWWUFj1G3pnBdXyu +KTrAWWyykNup7GJd4un8dNc= +-----END PRIVATE KEY----- diff --git a/microservices/http-client-ssl-cert/certs/user-cert.conf b/microservices/http-client-ssl-cert/certs/user-cert.conf new file mode 100644 index 0000000..2e3dc14 --- /dev/null +++ b/microservices/http-client-ssl-cert/certs/user-cert.conf @@ -0,0 +1,28 @@ +authorityKeyIdentifier=keyid,issuer +basicConstraints=CA:FALSE +keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment +default_days = 365 +[ca] +default_ca = CA_default +[ CA_default ] +dir = ca +certs = $dir/certsdb +new_certs_dir = $certs +database = $dir/index.txt +certificate = $dir/cacert.pem +private_key = $dir/private/cakey.pem +serial = $dir/serial +crldir = $dir/crl +crlnumber = $dir/crlnumber +crl = $crldir/crl.pem +RANDFILE = $dir/private/.rand +default_md = sha1 +policy = policy_match +[ policy_match ] +countryName = match +stateOrProvinceName = match +localityName = supplied +organizationName = match +organizationalUnitName = optional +commonName = supplied +emailAddress = optional \ No newline at end of file diff --git a/microservices/http-client-ssl-cert/certs/user-cert.request.conf b/microservices/http-client-ssl-cert/certs/user-cert.request.conf new file mode 100644 index 0000000..75449bf --- /dev/null +++ b/microservices/http-client-ssl-cert/certs/user-cert.request.conf @@ -0,0 +1,12 @@ +[req] +distinguished_name = dn +default_bits = 2048 +prompt = no +default_md = sha256 +[dn] +C=DE +ST=BW +L=Reutlingen +O=Source Fellows GmbH +emailAddress=user@example.private +CN = test.example.private \ No newline at end of file diff --git a/microservices/http-client-ssl-cert/certs/user-client.p12 b/microservices/http-client-ssl-cert/certs/user-client.p12 new file mode 100644 index 0000000..9bfe53c Binary files /dev/null and b/microservices/http-client-ssl-cert/certs/user-client.p12 differ diff --git a/microservices/http-client-ssl-cert/certs/user.crt b/microservices/http-client-ssl-cert/certs/user.crt new file mode 100644 index 0000000..1844631 --- /dev/null +++ b/microservices/http-client-ssl-cert/certs/user.crt @@ -0,0 +1,71 @@ +Certificate: + Data: + Version: 1 (0x0) + Serial Number: 1 (0x1) + Signature Algorithm: sha1WithRSAEncryption + Issuer: C=DE, ST=BW, L=Reutlingen, O=Source Fellows GmbH/emailAddress=webmaster@example.private, CN=test.example.private + Validity + Not Before: Jul 9 04:15:47 2020 GMT + Not After : Jul 9 04:15:47 2021 GMT + Subject: C=DE, ST=BW, L=Reutlingen, O=Source Fellows GmbH, CN=test.example.private/emailAddress=user@example.private + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + RSA Public-Key: (2048 bit) + Modulus: + 00:e3:a9:b6:c5:35:06:6d:12:ee:e7:ee:60:89:49: + 2a:ac:b2:be:3d:f7:c5:4d:55:08:fc:80:43:aa:fd: + 05:6c:43:94:a5:02:c9:1f:fc:70:c4:44:85:5a:b8: + f9:95:f8:8a:5c:2e:12:55:43:23:f2:d0:34:c3:a4: + 41:89:14:a9:d1:19:d4:0d:d0:58:87:38:9f:6c:1d: + 89:2d:23:60:8f:9e:af:f4:5a:f0:d0:a4:fd:4a:49: + 9b:19:df:97:20:db:80:7b:ee:f2:ba:e7:9a:b4:3c: + 48:74:9c:57:61:0b:4e:ee:eb:53:5d:ca:3d:9e:f3: + d2:d5:1a:f7:7a:34:1d:09:73:44:1c:af:3d:31:72: + 90:e9:43:0b:b3:c9:30:58:21:df:27:5b:39:42:85: + f1:ec:d9:1c:89:38:64:92:d6:da:f9:22:c1:e9:b5: + 22:bf:3a:32:10:f9:e3:e6:b3:73:1d:d2:7e:a9:a6: + 27:86:83:8c:7e:9d:4f:39:d0:53:45:0b:f7:89:8b: + f2:8c:43:44:42:a9:4a:81:83:60:bb:1f:63:f5:75: + fa:73:3b:85:c9:62:7d:1d:8a:61:4c:3c:f9:23:a3: + 3d:97:78:6f:6d:13:db:88:79:fb:89:0b:3e:a6:50: + b8:72:9a:c8:d3:7b:d2:ec:6c:15:3d:ab:f7:8b:c8: + 50:9b + Exponent: 65537 (0x10001) + Signature Algorithm: sha1WithRSAEncryption + 95:b9:66:f0:95:05:82:2c:9b:f6:85:ea:68:7c:ae:18:b5:d1: + 12:10:22:2f:2f:1f:5f:d8:15:b6:b3:87:4a:dc:b1:1c:1d:c3: + 8c:80:2f:cb:d2:bd:36:35:53:27:20:c0:b8:5f:58:92:8e:60: + 2a:01:f1:08:38:d0:97:6f:4f:a1:57:17:e7:b9:fc:e1:67:7a: + 97:1b:b3:e1:36:26:06:b2:32:9d:5a:12:4b:2d:b7:0b:8b:c8: + 09:bc:5c:b1:8f:f8:42:24:97:10:6d:6a:eb:82:99:0a:bf:e8: + fe:9c:1d:52:f2:2d:78:18:a4:9f:33:27:88:54:86:09:11:0e: + fd:d5:5c:0d:65:c4:78:bd:cc:2f:34:59:e0:13:e8:02:ed:98: + c4:9e:7f:5e:f7:9b:18:d1:c6:76:eb:1b:dc:76:6a:a6:ab:f3: + b5:8f:b5:0a:ad:cf:07:d5:cf:6c:69:ae:0c:f5:dc:f2:b2:11: + 2b:b2:b6:a5:b5:63:6b:1f:0d:7b:cd:07:81:59:40:5e:12:c9: + 41:73:cf:08:87:3c:ab:38:51:27:c2:ad:c6:57:20:dc:bd:fe: + cf:ea:b5:37:29:be:c1:f4:9b:61:ad:a3:f8:5c:d7:7b:65:2e: + 80:f9:6b:dd:42:a8:62:ae:52:0d:95:f7:67:04:10:b9:97:24: + 48:33:fb:22 +-----BEGIN CERTIFICATE----- +MIIDnTCCAoUCAQEwDQYJKoZIhvcNAQEFBQAwgZYxCzAJBgNVBAYTAkRFMQswCQYD +VQQIDAJCVzETMBEGA1UEBwwKUmV1dGxpbmdlbjEcMBoGA1UECgwTU291cmNlIEZl +bGxvd3MgR21iSDEoMCYGCSqGSIb3DQEJARYZd2VibWFzdGVyQGV4YW1wbGUucHJp +dmF0ZTEdMBsGA1UEAwwUdGVzdC5leGFtcGxlLnByaXZhdGUwHhcNMjAwNzA5MDQx +NTQ3WhcNMjEwNzA5MDQxNTQ3WjCBkTELMAkGA1UEBhMCREUxCzAJBgNVBAgMAkJX +MRMwEQYDVQQHDApSZXV0bGluZ2VuMRwwGgYDVQQKDBNTb3VyY2UgRmVsbG93cyBH +bWJIMR0wGwYDVQQDDBR0ZXN0LmV4YW1wbGUucHJpdmF0ZTEjMCEGCSqGSIb3DQEJ +ARYUdXNlckBleGFtcGxlLnByaXZhdGUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw +ggEKAoIBAQDjqbbFNQZtEu7n7mCJSSqssr4998VNVQj8gEOq/QVsQ5SlAskf/HDE +RIVauPmV+IpcLhJVQyPy0DTDpEGJFKnRGdQN0FiHOJ9sHYktI2CPnq/0WvDQpP1K +SZsZ35cg24B77vK655q0PEh0nFdhC07u61Ndyj2e89LVGvd6NB0Jc0Qcrz0xcpDp +QwuzyTBYId8nWzlChfHs2RyJOGSS1tr5IsHptSK/OjIQ+ePms3Md0n6ppieGg4x+ +nU850FNFC/eJi/KMQ0RCqUqBg2C7H2P1dfpzO4XJYn0dimFMPPkjoz2XeG9tE9uI +efuJCz6mULhymsjTe9LsbBU9q/eLyFCbAgMBAAEwDQYJKoZIhvcNAQEFBQADggEB +AJW5ZvCVBYIsm/aF6mh8rhi10RIQIi8vH1/YFbazh0rcsRwdw4yAL8vSvTY1Uycg +wLhfWJKOYCoB8Qg40JdvT6FXF+e5/OFnepcbs+E2JgayMp1aEksttwuLyAm8XLGP ++EIklxBtauuCmQq/6P6cHVLyLXgYpJ8zJ4hUhgkRDv3VXA1lxHi9zC80WeAT6ALt +mMSef173mxjRxnbrG9x2aqar87WPtQqtzwfVz2xprgz13PKyESuytqW1Y2sfDXvN +B4FZQF4SyUFzzwiHPKs4USfCrcZXINy9/s/qtTcpvsH0m2Gto/hc13tlLoD5a91C +qGKuUg2V92cEELmXJEgz+yI= +-----END CERTIFICATE----- diff --git a/microservices/http-client-ssl-cert/certs/user.key b/microservices/http-client-ssl-cert/certs/user.key new file mode 100644 index 0000000..24ecb98 --- /dev/null +++ b/microservices/http-client-ssl-cert/certs/user.key @@ -0,0 +1,27 @@ +-----BEGIN RSA PRIVATE KEY----- +MIIEpAIBAAKCAQEA46m2xTUGbRLu5+5giUkqrLK+PffFTVUI/IBDqv0FbEOUpQLJ +H/xwxESFWrj5lfiKXC4SVUMj8tA0w6RBiRSp0RnUDdBYhzifbB2JLSNgj56v9Frw +0KT9SkmbGd+XINuAe+7yuueatDxIdJxXYQtO7utTXco9nvPS1Rr3ejQdCXNEHK89 +MXKQ6UMLs8kwWCHfJ1s5QoXx7NkciThkktba+SLB6bUivzoyEPnj5rNzHdJ+qaYn +hoOMfp1POdBTRQv3iYvyjENEQqlKgYNgux9j9XX6czuFyWJ9HYphTDz5I6M9l3hv +bRPbiHn7iQs+plC4cprI03vS7GwVPav3i8hQmwIDAQABAoIBAQDjJvzT+7ozroZt +J61ujXBk69thnQxhwoy604ew3dBBW5S+p+7hWVFyoyOjh5iQCHKU0us740fFB/T9 +l7BEBDgECI9KUS1jjh2TFE1AmmHIKv9JAkvxAg4vxw1YXX0/LYQfJCVQU7JKTzPE +FhIhI9VYEbkWhanCJWmhc8ylQ8YNG/FU9DYl2qR4GpgEEmyX3EErG/30PBEKRVBl +k51/cz8vT3fN/bzXjX6+wkG41/+71o879Jh47wI9WY38ZUtqIGWZZaenCNubhHQx +/5dvFvidwkeueXmwgssBKLdsP1cBxpu/7eN4PsiY+n7RDPVgcnE/PQvTindDOA5w +vFJ2gZQxAoGBAPgMK2ZV23zMb0JxSfk+pxT2FJZP1MKI0IkdgB6c+rJWEnjV857q +KeHf37uSEx/4EeAX+E9LFaNgpv48XmJXZtZ9hjOvhvwyDdCEwXsFStH6yulHcxlH +Ri7iVeEOeBPhRXEhM4jOebw8Kqqp2so170Cc/kDZOx/383/e02FxEAg9AoGBAOr2 +PU+IWNBHZP/1BpekQRZBSpwmlsML5/YnIyXWeYO+d0Kwp3Qi0lKKL/ZI+/bVRGyq +tEl6fGQzzPoT7XuTS8pey7K1HSyunYdx+vbS6L/ID07mO5oIFjtAbcJQfM7kfqWr +m662lYvYdCYVPYF0ZfCw20ayb3LQNJTtzVp/5fG3AoGAapyQasOsOs+DYoNe0Anl +tlSuNIzLXXGAb+6GCqJd/hiQh+8tbrgmmDao6u212p+8zxx+VVZoTnhUTiGUT6BR +Sw9Yhw6CbhL1bRIiNsXniqjIXcuf5NWFjNErKDgX1DOWrTEf/UUBfa4+iGvI5fCY +jKTtguHbT7o6plMXd2IpCeECgYEAjqWoW1y/7tMpcmvj8LR7/3LsRRj4droHvd3M +7O/lHiLIbOirAUsSvaG/tJpivlyECiUpB2MhmgQI8dqfV2L5pIcgzAJBEBuC7/Q3 +FRq+y5A+GvyUOtOmC5r2B/6thz4Z1aL2BYA8Eob7HRPQH4P3T8VPmwBBwUa+ZZxq +DAOSKskCgYAWCldfjkOgynFHjqQ3HXDtSRLMrgVEj/+Muy6yCu7Lk+lhOsrflK82 +1rMH+O8Z2RxFIA6KuzHZbUXexNzmibsEIWBZU5X14QrLkX1Gq9mCwLv8cSMDqKz+ +qNLcMrEDqSmdPkPppVsJbz44QvFItVWYsPAWS4cyN62X6IJ2lDPjNw== +-----END RSA PRIVATE KEY----- diff --git a/microservices/http-client-ssl-cert/certs/user.req b/microservices/http-client-ssl-cert/certs/user.req new file mode 100644 index 0000000..cddf1aa --- /dev/null +++ b/microservices/http-client-ssl-cert/certs/user.req @@ -0,0 +1,18 @@ +-----BEGIN CERTIFICATE REQUEST----- +MIIC1zCCAb8CAQAwgZExCzAJBgNVBAYTAkRFMQswCQYDVQQIDAJCVzETMBEGA1UE +BwwKUmV1dGxpbmdlbjEcMBoGA1UECgwTU291cmNlIEZlbGxvd3MgR21iSDEjMCEG +CSqGSIb3DQEJARYUdXNlckBleGFtcGxlLnByaXZhdGUxHTAbBgNVBAMMFHRlc3Qu +ZXhhbXBsZS5wcml2YXRlMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA +46m2xTUGbRLu5+5giUkqrLK+PffFTVUI/IBDqv0FbEOUpQLJH/xwxESFWrj5lfiK +XC4SVUMj8tA0w6RBiRSp0RnUDdBYhzifbB2JLSNgj56v9Frw0KT9SkmbGd+XINuA +e+7yuueatDxIdJxXYQtO7utTXco9nvPS1Rr3ejQdCXNEHK89MXKQ6UMLs8kwWCHf +J1s5QoXx7NkciThkktba+SLB6bUivzoyEPnj5rNzHdJ+qaYnhoOMfp1POdBTRQv3 +iYvyjENEQqlKgYNgux9j9XX6czuFyWJ9HYphTDz5I6M9l3hvbRPbiHn7iQs+plC4 +cprI03vS7GwVPav3i8hQmwIDAQABoAAwDQYJKoZIhvcNAQELBQADggEBAJ2ZHvrq +QE8yoiOSb+itUtWLo86T+qbSwHLy9Ned0wtu1XiL7ltJATyRwMbv1RduGcfYWBcx +ZcUAcqYhsuSTM3MPg0MQvAFrLRwonq+TN6zq0K7RvZ5FSCizzcyThJIRcCtUNd0y +heqknhsvnkIwSQCb4RPF3/57FXct1FNEHEKMtldWEHCkKbJnUtt9Z/4WEkmTCvzi +EYwcwoK6QsmJOIwQXzOYniaPf2k8oeBLu81sq5GG5vRZvs9dFX6HQmfQ28oKeMCy +8n6XGHPudNybKBykvYzRKbChVl6LiFdz1f95x5JSh+aJx8Ca8mq5NpFK0TJEzQWv +NUvFSnG7X4w6JJg= +-----END CERTIFICATE REQUEST----- diff --git a/microservices/http-client-ssl-cert/main.go b/microservices/http-client-ssl-cert/main.go new file mode 100644 index 0000000..559bd68 --- /dev/null +++ b/microservices/http-client-ssl-cert/main.go @@ -0,0 +1,31 @@ +package main + +import ( + "crypto/tls" + "crypto/x509" + "fmt" + "io/ioutil" + "net/http" +) + +func main() { + certPool := x509.NewCertPool() + crt, _ := ioutil.ReadFile("./certs/myRoot.crt") + certPool.AppendCertsFromPEM(crt) + keyPair, _ := tls.LoadX509KeyPair("./certs/user.crt", "./certs/user.key") + clientCerts := []tls.Certificate{keyPair} + tlsConfig := &tls.Config{ + RootCAs: certPool, + Certificates: clientCerts, + } + transport := &http.Transport{ + TLSClientConfig: tlsConfig, + } + client := http.Client{Transport: transport} + res, err := client.Get("https://test.example.private:8443") + if err != nil { + panic(err) + } + bites, err := ioutil.ReadAll(res.Body) + fmt.Printf("response is: %v", string(bites)) +} diff --git a/microservices/http-client/main.go b/microservices/http-client/main.go new file mode 100644 index 0000000..1953d1d --- /dev/null +++ b/microservices/http-client/main.go @@ -0,0 +1,18 @@ +package main + +import ( + "fmt" + "io/ioutil" + "net/http" +) + +func main() { + res, err := http.Get("https://google.com") + if err != nil { + panic(err) + } + defer res.Body.Close() + fmt.Println(res.Status) + bites, _ := ioutil.ReadAll(res.Body) + fmt.Println(string(bites)) +} diff --git a/microservices/http-metod-matching/main.go b/microservices/http-metod-matching/main.go new file mode 100644 index 0000000..380488b --- /dev/null +++ b/microservices/http-metod-matching/main.go @@ -0,0 +1,16 @@ +package main + +import "net/http" + +func myHandler(res http.ResponseWriter, req *http.Request) { + if req.Method == http.MethodGet { + res.Write([]byte("Hello World")) + } else { + res.WriteHeader(http.StatusMethodNotAllowed) + } +} + +func main() { + http.HandleFunc("/", myHandler) + http.ListenAndServe(":8080", nil) +} diff --git a/microservices/http-ratelimit/go.mod b/microservices/http-ratelimit/go.mod new file mode 100644 index 0000000..3d84d42 --- /dev/null +++ b/microservices/http-ratelimit/go.mod @@ -0,0 +1,8 @@ +module golang.source-fellows.com/samples/ratelimit + +go 1.14 + +require ( + github.com/go-redis/redis/v7 v7.4.0 + github.com/ulule/limiter/v3 v3.5.0 +) diff --git a/microservices/http-ratelimit/go.sum b/microservices/http-ratelimit/go.sum new file mode 100644 index 0000000..950307c --- /dev/null +++ b/microservices/http-ratelimit/go.sum @@ -0,0 +1,65 @@ +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= +github.com/gin-gonic/gin v1.6.2/go.mod h1:75u5sXoLsGZoRN5Sgbi1eraJ4GU3++wFwWzhwvtwp4M= +github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= +github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= +github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= +github.com/go-playground/validator/v10 v10.2.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GOhaH6EGOAJShg8Id5JGkI= +github.com/go-redis/redis/v7 v7.2.0/go.mod h1:JDNMw23GTyLNC4GZu9njt15ctBQVn7xjRfnwdHj/Dcg= +github.com/go-redis/redis/v7 v7.4.0 h1:7obg6wUoj05T0EpY0o8B59S9w5yeMWql7sw2kwNW1x4= +github.com/go-redis/redis/v7 v7.4.0/go.mod h1:JDNMw23GTyLNC4GZu9njt15ctBQVn7xjRfnwdHj/Dcg= +github.com/golang/protobuf v1.2.0/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.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/klauspost/compress v1.8.2/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= +github.com/klauspost/compress v1.9.6/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= +github.com/klauspost/cpuid v1.2.1/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +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/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= +github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +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/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +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/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= +github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= +github.com/ulule/limiter/v3 v3.5.0 h1:QRAebbswjlezHIfiSQgM8+jMxaz/zsrxGRuiUJ43MHo= +github.com/ulule/limiter/v3 v3.5.0/go.mod h1:TgOUQZKZ2KHjemqrC8UHUbKPqpTmSY43/2wbQ7YN1h8= +github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= +github.com/valyala/fasthttp v1.9.0/go.mod h1:FstJa9V+Pj9vQ7OJie2qMHdwemEDaDiSdBnvPM1Su9w= +github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a/go.mod h1:v3UYOV9WzVtRmSR+PDvWpU/qWl4Wa5LApYYX4ZtKbio= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/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/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/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-20191010194322-b09406accb47/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= +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/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= diff --git a/microservices/http-ratelimit/main.go b/microservices/http-ratelimit/main.go new file mode 100644 index 0000000..6db89c2 --- /dev/null +++ b/microservices/http-ratelimit/main.go @@ -0,0 +1,42 @@ +package main + +import ( + "net/http" + + libredis "github.com/go-redis/redis/v7" + "github.com/ulule/limiter/v3" + "github.com/ulule/limiter/v3/drivers/middleware/stdlib" + "github.com/ulule/limiter/v3/drivers/store/redis" +) + +func handleRequest(res http.ResponseWriter, req *http.Request) { + res.Write([]byte("Hello World!")) +} + +func rateLimitMiddleWare(handler http.HandlerFunc) http.Handler { + rate, err := limiter.NewRateFromFormatted("4-S") + if err != nil { + panic(err) + } + // Redis Client anlegen + option, err := libredis.ParseURL("redis://localhost:6379/0") + if err != nil { + panic(err) + } + client := libredis.NewClient(option) + // Store mit Redis konfigurieren + store, err := redis.NewStoreWithOptions(client, limiter.StoreOptions{ + Prefix: "limiter_http_example", + MaxRetry: 3, + }) + if err != nil { + panic(err) + } + middleware := stdlib.NewMiddleware(limiter.New(store, rate, limiter.WithTrustForwardHeader(true))) + return middleware.Handler(handler) +} + +func main() { + http.Handle("/", rateLimitMiddleWare(http.HandlerFunc(handleRequest))) + http.ListenAndServe(":8080", nil) +} diff --git a/microservices/http-registration/go.mod b/microservices/http-registration/go.mod new file mode 100644 index 0000000..80ce972 --- /dev/null +++ b/microservices/http-registration/go.mod @@ -0,0 +1,3 @@ +module golang.source-fellows.com/samples/httpregistration + +go 1.13 diff --git a/microservices/http-registration/main.go b/microservices/http-registration/main.go new file mode 100644 index 0000000..b344101 --- /dev/null +++ b/microservices/http-registration/main.go @@ -0,0 +1,21 @@ +package main + +import "net/http" + +type MyHandler struct{} + +func (mh *MyHandler) ServeHTTP(writer http.ResponseWriter, req *http.Request) { + writer.Write([]byte("Hello World (from ServeHTTP)")) +} + +func handleHttp(res http.ResponseWriter, req *http.Request) { + res.Write([]byte("Hello World (from handleHttp)")) +} + +func main() { + //Anmeldung der HandlerFunc Implementierung + http.HandleFunc("/func", handleHttp) + //Anmeldung der Handler Interface Implementierung + http.Handle("/handler", &MyHandler{}) + http.ListenAndServe(":8080", &MyHandler{}) +} diff --git a/microservices/http-retry/client/go.mod b/microservices/http-retry/client/go.mod new file mode 100644 index 0000000..faeb606 --- /dev/null +++ b/microservices/http-retry/client/go.mod @@ -0,0 +1,5 @@ +module golang.source-fellows.com/samples/rfc7808/server + +go 1.13 + +require github.com/hashicorp/go-retryablehttp v0.6.6 diff --git a/microservices/http-retry/client/go.sum b/microservices/http-retry/client/go.sum new file mode 100644 index 0000000..fd16176 --- /dev/null +++ b/microservices/http-retry/client/go.sum @@ -0,0 +1,8 @@ +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +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.2/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ= +github.com/hashicorp/go-retryablehttp v0.6.6 h1:HJunrbHTDDbBb/ay4kxa1n+dLmttUlnP3V9oNE4hmsM= +github.com/hashicorp/go-retryablehttp v0.6.6/go.mod h1:vAew36LZh98gCBJNLH42IQ1ER/9wtLZZ8meHqQvEYWY= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= diff --git a/microservices/http-retry/client/main.go b/microservices/http-retry/client/main.go new file mode 100644 index 0000000..494e4f8 --- /dev/null +++ b/microservices/http-retry/client/main.go @@ -0,0 +1,21 @@ +package main + +import ( + "log" + + "github.com/hashicorp/go-retryablehttp" +) + +func main() { + retryClient := retryablehttp.NewClient() + retryClient.RetryMax = 10 + + standardClient := retryClient.StandardClient() + + res, err := standardClient.Get("http://localhost:8080/") + if err != nil { + log.Fatal("could not request") + } + defer res.Body.Close() + log.Println(res.Status) +} diff --git a/microservices/http-retry/server/go.mod b/microservices/http-retry/server/go.mod new file mode 100644 index 0000000..8ac8692 --- /dev/null +++ b/microservices/http-retry/server/go.mod @@ -0,0 +1,3 @@ +module golang.source-fellows.com/samples/httpretry/server + +go 1.13 diff --git a/microservices/http-retry/server/go.sum b/microservices/http-retry/server/go.sum new file mode 100644 index 0000000..e69de29 diff --git a/microservices/http-retry/server/main.go b/microservices/http-retry/server/main.go new file mode 100644 index 0000000..e569b9e --- /dev/null +++ b/microservices/http-retry/server/main.go @@ -0,0 +1,26 @@ +package main + +import ( + "fmt" + "net/http" +) + +var count int = 0 + +func handleHttp(res http.ResponseWriter, req *http.Request) { + + responseStatus := http.StatusInternalServerError + if count%4 == 0 { + responseStatus = http.StatusOK + } + fmt.Printf("will return %v\n", responseStatus) + res.WriteHeader(responseStatus) + + count++ + +} + +func main() { + http.HandleFunc("/", handleHttp) + http.ListenAndServe(":8080", nil) +} diff --git a/microservices/httpsserver/README.md b/microservices/httpsserver/README.md new file mode 100644 index 0000000..52e104d --- /dev/null +++ b/microservices/httpsserver/README.md @@ -0,0 +1,16 @@ +Zertifikate erstellen +===================== + +- Root Zertifikat erstellen: +``` +openssl genrsa -out myRoot.key 2048 +openssl req -x509 -new -nodes -key myRoot.key -sha256 -days 3650 -out myRoot.crt +``` + +- Zertifikat für Server erstellen: +``` +#CSR erstellen +openssl req -new -sha256 -nodes -out test.example.csr -newkey rsa:2048 -keyout test.example.key -config server-cert.request.conf + +openssl x509 -req -in test.example.csr -CA myRoot.crt -CAkey myRoot.key -CAcreateserial -extfile test.example.ext.cnf -out test.example.crt -days 3650 -sha256 +``` \ No newline at end of file diff --git a/microservices/httpsserver/certs/myRoot.crt b/microservices/httpsserver/certs/myRoot.crt new file mode 100644 index 0000000..242eadf --- /dev/null +++ b/microservices/httpsserver/certs/myRoot.crt @@ -0,0 +1,21 @@ +-----BEGIN CERTIFICATE----- +MIIDhTCCAm2gAwIBAgIUS7TqIYrkdb2kEmtuawe8h/54VVIwDQYJKoZIhvcNAQEL +BQAwUjELMAkGA1UEBhMCREUxEDAOBgNVBAgMB0JhV8ODwrwxEzARBgNVBAcMClJl +dXRsaW5nZW4xHDAaBgNVBAoME1NvdXJjZSBGZWxsb3dzIEdtYkgwHhcNMjAwNzA4 +MDM1ODE4WhcNMzAwNzA2MDM1ODE4WjBSMQswCQYDVQQGEwJERTEQMA4GA1UECAwH +QmFXw4PCvDETMBEGA1UEBwwKUmV1dGxpbmdlbjEcMBoGA1UECgwTU291cmNlIEZl +bGxvd3MgR21iSDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANY+x2Kr +U49506heEh2s0Q5vTjXUbP5814pHhlJ43X3p7QYMbJ/BBunxLA3a8GvuukgD1Wxr +0T0uHo5/MLxRh6r1TEy80IApUsyCcAO3jdTGtIr4iebnAOL/Dw0TGWDRyl5SZCwo +BsVSOfCoJyMs+ygB+BLE+05Dq5FwA3CpxP5r67efBpY2Y9bu1iXAC179rGaVvtLM +3Zy5G+tQ0aMJYOqVR6tvSrrYg44gJiM270u6Os80V723fPtEUvKbHQOpZoleHWsb +uZ1FbdQBcnJ2u3bI93ewQAvqQ3tjOqgell5n7kJ1B3Vjk8bVzda1zPKH9vcvF0fc +gXdPrVOzBCa5Su8CAwEAAaNTMFEwHQYDVR0OBBYEFO3om6AZ9q/+r6kXo7hAhOBD +SeTbMB8GA1UdIwQYMBaAFO3om6AZ9q/+r6kXo7hAhOBDSeTbMA8GA1UdEwEB/wQF +MAMBAf8wDQYJKoZIhvcNAQELBQADggEBAMxKFUWYTQz/ACVY8lV18QCGxcvNj3Uz +ZdtNUEDkxu6yKsl+1otREbuxqnfNjrGLmlLQfU/GlY+PCF85SYm1Ep4yKdZ7J+1c +MG+PB5NS3cV7BnoJ6WnXk7KJRX+dYpCr+jQmQbtTshk6dM2a6THjyPzKkyDflcfM +tXQROGDG9O/5DvF8Eqz13Gel5Wukept9mHtDHapU0BooFTXNqh+tPmFU76tKCQZV +h0Qt9BC8A6bDEaULVlXpvNTuDCrCMGhiYEo2++PD/e5YT1UDVNSokanyFIUoCJAn +X5u+VjRfaVibiWu8E63qoKv+oXBf9pwlNeE8KBlydzf5OQgx8FEkbfc= +-----END CERTIFICATE----- diff --git a/microservices/httpsserver/certs/myRoot.key b/microservices/httpsserver/certs/myRoot.key new file mode 100644 index 0000000..a018d60 --- /dev/null +++ b/microservices/httpsserver/certs/myRoot.key @@ -0,0 +1,27 @@ +-----BEGIN RSA PRIVATE KEY----- +MIIEowIBAAKCAQEA1j7HYqtTj3nTqF4SHazRDm9ONdRs/nzXikeGUnjdfentBgxs +n8EG6fEsDdrwa+66SAPVbGvRPS4ejn8wvFGHqvVMTLzQgClSzIJwA7eN1Ma0iviJ +5ucA4v8PDRMZYNHKXlJkLCgGxVI58KgnIyz7KAH4EsT7TkOrkXADcKnE/mvrt58G +ljZj1u7WJcALXv2sZpW+0szdnLkb61DRowlg6pVHq29KutiDjiAmIzbvS7o6zzRX +vbd8+0RS8psdA6lmiV4daxu5nUVt1AFycna7dsj3d7BAC+pDe2M6qB6WXmfuQnUH +dWOTxtXN1rXM8of29y8XR9yBd0+tU7MEJrlK7wIDAQABAoIBAQC0GzaWthybAvly +ExL7q2pbzipbimbOUbkI4DQFZOIelebSLOOsMSNUy5ATXbi7o4cqPz7N1J2j5v99 +H2OjDI8WovwvjpNhClw23Hi6RzaOZzUjluinGg9exLisbx/oirSrMmxPyp5Wh1d5 +/oJYSdohufYIIVx6YNz8eMQLlEys7BcAs9uDbfrEh2lhSCRd+eVER/p2U+EE3YFe +OPhE7S7/5fDHidA/vU5YL0zyDcTiqec8lF3b63L39zYsckUjvbJ9gXru+RUFsnYT +FCz/8axvSyiRj9M162BtrwV1lANgbck+unmk9j63bMaNUFHdlFxovxZDA4C6napJ ++5dnwduBAoGBAO3UqDRxSWvelTv5vSFWaiJoFKU23PGX46Fsy+b8ttj+8Jz94333 +u+1t5fEnpS46QhQtiVRB42pezBncJ+CdjQ92ikcJZL7o8NYttlmTVg2i/v+dnxmL +T+Tgl89VUOgfKdlRwpgG64dMT1HFQJlMKkKMzdS6FxQtSclYSq0yYVxhAoGBAOac +2ijcy0xlhDinsmikxBveaxl8pTeF0jmLlXmNRTuSXkk9tXi5yurV+e4M9oG7pvYU +4LUthIvtbmPgDhANN5+45bJqNWw3ovaLb0/60XsET4fiR8W0muXMHcBySpFQsvRm +/daw41S+f4rv2XqyaLLbwmgPiusGlJMDENQQCmlPAoGASPA2Idc4gDeEJx+hTE8X +P7QR2NVpj0JY0lHuesm4PfZ5znviv+gxH1Db+0iAVRwS1eNdQZTvbNjj2W52YGGR +OFPPdpe/6PjBm73rNa+E7au2bqhlec0K1JO4myJ8LKQaDocPmdZNd3IExXwsIpeE +QmKyYXIsz8hP38sPI+zWhSECgYBzJz2Ui/QEGOj2NV7T+/plBCIsnt4NJIh97aJd +CNraTVNBdUvplbSqoOBlKxnoXCCZ3oD6V1lJWez2eEntX/w3iGdCOOCmQf3g6G1T +3aW+rL9d1fMK2Q1D1DHDCA8OEuLZQZhdHQTXKyya3vuU1gOL1Ep2FdTDWQzVgAFm +MwBP5wKBgC7jFtvny07N3NQN/KX758LxN043Awx7DstraYj93jDQ8xT5naiXC/8m +YoGB9aE6v+uxllBN5QdTSdzL0vpmkLYfnLbKSq54WVOflSAvL6VjxI9o9HMFqGF2 +wcEp3pm+ub20bZBdFoxP15X3IisUGiQcrg/q4ZGHxOvJuzI9q4b0 +-----END RSA PRIVATE KEY----- diff --git a/microservices/httpsserver/certs/myRoot.srl b/microservices/httpsserver/certs/myRoot.srl new file mode 100644 index 0000000..5a814b7 --- /dev/null +++ b/microservices/httpsserver/certs/myRoot.srl @@ -0,0 +1 @@ +73771BE66A4800A9EBDEF9018EBEDCDB7701BCC7 diff --git a/microservices/httpsserver/certs/server-cert.conf b/microservices/httpsserver/certs/server-cert.conf new file mode 100644 index 0000000..59c110b --- /dev/null +++ b/microservices/httpsserver/certs/server-cert.conf @@ -0,0 +1,6 @@ +authorityKeyIdentifier=keyid,issuer +basicConstraints=CA:FALSE +keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment +subjectAltName = @alt_names +[alt_names] +DNS.1 = test.example.private \ No newline at end of file diff --git a/microservices/httpsserver/certs/server-cert.request.conf b/microservices/httpsserver/certs/server-cert.request.conf new file mode 100644 index 0000000..09d661e --- /dev/null +++ b/microservices/httpsserver/certs/server-cert.request.conf @@ -0,0 +1,12 @@ +[req] +distinguished_name = dn +default_bits = 2048 +prompt = no +default_md = sha256 +[dn] +C=DE +ST=BW +L=Reutlingen +O=Source Fellows GmbH +emailAddress=webmaster@example.private +CN = test.example.private \ No newline at end of file diff --git a/microservices/httpsserver/certs/test.example.crt b/microservices/httpsserver/certs/test.example.crt new file mode 100644 index 0000000..73ad419 --- /dev/null +++ b/microservices/httpsserver/certs/test.example.crt @@ -0,0 +1,23 @@ +-----BEGIN CERTIFICATE----- +MIID0zCCArugAwIBAgIUc3cb5mpIAKnr3vkBjr7c23cBvMcwDQYJKoZIhvcNAQEL +BQAwUjELMAkGA1UEBhMCREUxEDAOBgNVBAgMB0JhV8ODwrwxEzARBgNVBAcMClJl +dXRsaW5nZW4xHDAaBgNVBAoME1NvdXJjZSBGZWxsb3dzIEdtYkgwHhcNMjAwNzA4 +MDQwNzA0WhcNMzAwNzA2MDQwNzA0WjCBljELMAkGA1UEBhMCREUxCzAJBgNVBAgM +AkJXMRMwEQYDVQQHDApSZXV0bGluZ2VuMRwwGgYDVQQKDBNTb3VyY2UgRmVsbG93 +cyBHbWJIMSgwJgYJKoZIhvcNAQkBFhl3ZWJtYXN0ZXJAZXhhbXBsZS5wcml2YXRl +MR0wGwYDVQQDDBR0ZXN0LmV4YW1wbGUucHJpdmF0ZTCCASIwDQYJKoZIhvcNAQEB +BQADggEPADCCAQoCggEBAK46AzTKQy+/SFeseHbRZbuQZnYznIjiWW57A2dGCSg2 +tuI0811lV5Fx7MMlPEdvHOycwg678hMDvwLv5GvZQg06Pz/rvRxSls6g+S0dPAGE +NPgNaWDqVa8G58FVdzfe1NFRYLvf/oaFXkE6WJvdgVHuZoNj1IrjqBQMoFRNBeub +JJHNEJZhX5KdMWqFxJBM4jDzXt1PUIFgeFbtOHnnK6/1ga6yXvtvusS/1tZYZpNp +1czr5l2cw0VXAcgVDu3qQIOtvYtCkUZO57436UNHKE3uT3gLzzAKRxfrS8LbVG2H +V82dT5or77bPT2N/GyPJwWgzi50yIfX7vpRmTPHipt0CAwEAAaNcMFowHwYDVR0j +BBgwFoAU7eiboBn2r/6vqRejuECE4ENJ5NswCQYDVR0TBAIwADALBgNVHQ8EBAMC +BPAwHwYDVR0RBBgwFoIUdGVzdC5leGFtcGxlLnByaXZhdGUwDQYJKoZIhvcNAQEL +BQADggEBAFYzh53rfQmEw//rCCeZCjWnyyHuW52DdEYLOJVmT3rkogmIkuFuw7n4 +KNEqw1eDwNCYMFV0uemiWpI80qvtQO8RvaSoWlJs/hTYVI/BIL0xlR8/tOUhshep +qwAv9LJISd5RcmTJ6Ag3ytR1f6skBuzHdUbODTZBh/L+tM/ypHF+kRnqqjDkEC3r +kMb81hoU6xALpjwqCzRawbEC3OIw2QQUqVB+zsW45hnhhHKVrLkkyO9djSoReHOy +lrz7liWcZBlTUjuH+M3WCb8Qr9FD1Cz1f2Ejq0pR6WLTL3c/tcWpZiNUpFYGnscF +fLyZekegMNG1PqawmEgxBfTAxrONwbo= +-----END CERTIFICATE----- diff --git a/microservices/httpsserver/certs/test.example.csr b/microservices/httpsserver/certs/test.example.csr new file mode 100644 index 0000000..a4e9fc9 --- /dev/null +++ b/microservices/httpsserver/certs/test.example.csr @@ -0,0 +1,18 @@ +-----BEGIN CERTIFICATE REQUEST----- +MIIC3DCCAcQCAQAwgZYxCzAJBgNVBAYTAkRFMQswCQYDVQQIDAJCVzETMBEGA1UE +BwwKUmV1dGxpbmdlbjEcMBoGA1UECgwTU291cmNlIEZlbGxvd3MgR21iSDEoMCYG +CSqGSIb3DQEJARYZd2VibWFzdGVyQGV4YW1wbGUucHJpdmF0ZTEdMBsGA1UEAwwU +dGVzdC5leGFtcGxlLnByaXZhdGUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK +AoIBAQCuOgM0ykMvv0hXrHh20WW7kGZ2M5yI4lluewNnRgkoNrbiNPNdZVeRcezD +JTxHbxzsnMIOu/ITA78C7+Rr2UINOj8/670cUpbOoPktHTwBhDT4DWlg6lWvBufB +VXc33tTRUWC73/6GhV5BOlib3YFR7maDY9SK46gUDKBUTQXrmySRzRCWYV+SnTFq +hcSQTOIw817dT1CBYHhW7Th55yuv9YGusl77b7rEv9bWWGaTadXM6+ZdnMNFVwHI +FQ7t6kCDrb2LQpFGTue+N+lDRyhN7k94C88wCkcX60vC21Rth1fNnU+aK++2z09j +fxsjycFoM4udMiH1+76UZkzx4qbdAgMBAAGgADANBgkqhkiG9w0BAQsFAAOCAQEA +Uz43p2rJGBNxao94QiKV+AsGoHJeogT8ghJqAsyMrpLTs0ETmVEdtmwO+cujpYOd +bWzJ4WPhemyUbyV4/Igx7U43A0OkAN1xmLHXkuDAZa3Ox43lP1027A193Ik/eAdk +IhZixL/MJUaub7nTC6uSOq73wo4TcQku9cZUvs9+9t6yOjeMAfNXsyfshXq3hlxd +aRqbydeSuAn1TYBB8fNWZmLCRaAQ88SHTa3WA3Sapc+JAxbLlz7UWpMcn5Ua4jsD +vgnhXHhUcaGSB2bGUPxolSj1al7I3q8HrzgCSSHnoBBl3LJ0jpkd56+0VHJ351+4 +cziMZngB/7t5LDDKr7q/Yg== +-----END CERTIFICATE REQUEST----- diff --git a/microservices/httpsserver/certs/test.example.key b/microservices/httpsserver/certs/test.example.key new file mode 100644 index 0000000..07ee56b --- /dev/null +++ b/microservices/httpsserver/certs/test.example.key @@ -0,0 +1,28 @@ +-----BEGIN PRIVATE KEY----- +MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCuOgM0ykMvv0hX +rHh20WW7kGZ2M5yI4lluewNnRgkoNrbiNPNdZVeRcezDJTxHbxzsnMIOu/ITA78C +7+Rr2UINOj8/670cUpbOoPktHTwBhDT4DWlg6lWvBufBVXc33tTRUWC73/6GhV5B +Olib3YFR7maDY9SK46gUDKBUTQXrmySRzRCWYV+SnTFqhcSQTOIw817dT1CBYHhW +7Th55yuv9YGusl77b7rEv9bWWGaTadXM6+ZdnMNFVwHIFQ7t6kCDrb2LQpFGTue+ +N+lDRyhN7k94C88wCkcX60vC21Rth1fNnU+aK++2z09jfxsjycFoM4udMiH1+76U +Zkzx4qbdAgMBAAECggEBAJOAUc6TnqYBz4FKZwJQ7UwKSHSx5UiOOSCrzInWZVJC +YDrKkW70qVpdlRDxqULg8x/u5uwKejtW5JPb/QrBeIYyVfIL5qLf2QU+izaClZbD +EwUedaSzP69arUKk1LXcVViRCNCGJrpElzOp7fKnaSCwMOHz1rFvY5D1z5cPTn/U +Bsa0r2tGRtEfuUMfceMFaR5BnqJRjP8TuwscoqlOO/bBC1N5lGahJ77dlUB5L1QS +98Ajwgnsl4QZTqhkoVkAPf3jG5rogF9tJQfBdxHPTUaWawE8GnBcUricq4fjhUA3 +b6zZVyvjI8dPI02UZdkkdTsOpRkXQJ1pz36hypu5GIECgYEA36KivMvoe8fOuzCc +bnMdT7mCvd77y+m4u0lT8kbCi+HKuGUgYQpCKx9ifIuW9CtdG8YwbWw0Z6QxvfSV +rTdN/23zDQco5uHe5miLQDVyn3LuAbkYkmKTe3V3Y2XkRL1zptAZ82XBWa3aw6+j +rIoKRCJ9jLrrGIuFNyU9YevCAPkCgYEAx3DbRXzlEWF3uiYWMpy37DfwgTs6vCjq +0MAyW03hn7oZ3waghGjuJ5LiYaC/kLk1JUbjCBQEvtgyAVJ6AMatkgWmMlyMjlu8 +480gjLDbiJafvFpaExclK3iZDvhUhBunBje8hIGpWw637MbQB2z7bDiuhTTKp8zb +pN5/YKwoMgUCgYEA1g9rrEGV/92KkXz/T22akfRlI+9rn4zRSVvwIYj/sTtoesY5 +jwltuq8o60QGMyPK1MoJEsQvCUGOZ1/VYV79ptCMhFzlFtL/NBa/q689T0iIb1fI +IF6BAvy2UYt3SyD4saSiImu0/m0+aG8XwRDEsOE+wdUtMWpjEhzwO2maYqkCgYA6 +M2f5tkHOuafLzdOKf4t4xrZLsDIquLIVqxDG7kpaZ1+nYvKy0UA2kjm4DcX5gOLO +dwpH0De2TbcCBcSOt2vtgfKHHdTysjjELZdDF1VpXbNNrvw8N/Pj5LSd1sArMTqj +qN49uOzoIrpvwXDxyc7xPPVI8Cf3oeOzEC8R0guE1QKBgG1kyv5p2CfE26aL3+eO +o9VAY36Fr/oM74wBySC9J22G9a0oNegW3eEuGvnGMRc4fkSoIlJjqA53on0OcG3h +Eua1qz02v6LpIKs3RvmlY/PFfv3TosVjQQXnEH8XRBVqPIVI9xwP1GbjWYE2kKMq +VM8bquSy+WIsUuD0eFhnx+rC +-----END PRIVATE KEY----- diff --git a/microservices/httpsserver/go.mod b/microservices/httpsserver/go.mod new file mode 100644 index 0000000..d1ec280 --- /dev/null +++ b/microservices/httpsserver/go.mod @@ -0,0 +1,5 @@ +module golang.source-fellows.com/samples/https/server + +go 1.14 + +require golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 diff --git a/microservices/httpsserver/go.sum b/microservices/httpsserver/go.sum new file mode 100644 index 0000000..e7a8df9 --- /dev/null +++ b/microservices/httpsserver/go.sum @@ -0,0 +1,9 @@ +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 h1:psW17arqaxU48Z5kZ0CQnkZWQJsqcURM6tKiBApRjXI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3 h1:0GoQqolDA55aaLxZyTzK/Y2ePZzZTUrRacwib7cNsYQ= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= diff --git a/microservices/httpsserver/main.go b/microservices/httpsserver/main.go new file mode 100644 index 0000000..4f8001a --- /dev/null +++ b/microservices/httpsserver/main.go @@ -0,0 +1,19 @@ +package main + +import ( + "fmt" + "net/http" +) + +func main() { + + http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { + fmt.Fprintln(w, "Hello World") + }) + + certFile := "./certs/test.example.crt" + keyFile := "./certs/test.example.key" + + http.ListenAndServeTLS(":8443", certFile, keyFile, nil) + +} diff --git a/microservices/httpsservercert/README.md b/microservices/httpsservercert/README.md new file mode 100644 index 0000000..3e02d69 --- /dev/null +++ b/microservices/httpsservercert/README.md @@ -0,0 +1,46 @@ +Zertifikate erstellen +===================== + +AUSFÜHRE IM cert VERZEICHNIS + +- Root Zertifikat erstellen: +``` +openssl genrsa -out myRoot.key 2048 +openssl req -x509 -new -nodes -key myRoot.key -sha256 -days 3650 -out myRoot.crt +``` + +- Zertifikat für Server erstellen: +``` +#CSR erstellen +openssl req -new -sha256 -nodes -out test.example.csr -newkey rsa:2048 -keyout test.example.key -config server-cert.request.conf + +openssl x509 -req -in test.example.csr -CA myRoot.crt -CAkey myRoot.key -CAcreateserial -out test.example.crt -days 3650 -sha256 +``` + +-CA anlegen +``` +mkdir -p ca/certsdb +touch ca/index.txt +touch ca/index.txt.attr +echo '01' > ca/serial +``` + +- Client-Zertifikat erstellen + +``` +openssl genrsa -des3 -out user.key # key is 1234 +openssl req -new -key user.key -out user.req -config user-cert.request.conf +openssl ca -cert test.example.crt -keyfile test.example.key -out user.crt -in user.req -config user-cert.conf +openssl pkcs12 -export -in user.crt -inkey user.key -out user-client.p12 +``` + +- Chain + +``` +cat +``` + +- Curl +``` +curl --cacert ./certs/myRoot.crt --cert ./certs/user.crt --key ./certs/user.key -v https://test.example.private:8443 +``` \ No newline at end of file diff --git a/microservices/httpsservercert/certs/ca/certsdb/01.pem b/microservices/httpsservercert/certs/ca/certsdb/01.pem new file mode 100644 index 0000000..1844631 --- /dev/null +++ b/microservices/httpsservercert/certs/ca/certsdb/01.pem @@ -0,0 +1,71 @@ +Certificate: + Data: + Version: 1 (0x0) + Serial Number: 1 (0x1) + Signature Algorithm: sha1WithRSAEncryption + Issuer: C=DE, ST=BW, L=Reutlingen, O=Source Fellows GmbH/emailAddress=webmaster@example.private, CN=test.example.private + Validity + Not Before: Jul 9 04:15:47 2020 GMT + Not After : Jul 9 04:15:47 2021 GMT + Subject: C=DE, ST=BW, L=Reutlingen, O=Source Fellows GmbH, CN=test.example.private/emailAddress=user@example.private + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + RSA Public-Key: (2048 bit) + Modulus: + 00:e3:a9:b6:c5:35:06:6d:12:ee:e7:ee:60:89:49: + 2a:ac:b2:be:3d:f7:c5:4d:55:08:fc:80:43:aa:fd: + 05:6c:43:94:a5:02:c9:1f:fc:70:c4:44:85:5a:b8: + f9:95:f8:8a:5c:2e:12:55:43:23:f2:d0:34:c3:a4: + 41:89:14:a9:d1:19:d4:0d:d0:58:87:38:9f:6c:1d: + 89:2d:23:60:8f:9e:af:f4:5a:f0:d0:a4:fd:4a:49: + 9b:19:df:97:20:db:80:7b:ee:f2:ba:e7:9a:b4:3c: + 48:74:9c:57:61:0b:4e:ee:eb:53:5d:ca:3d:9e:f3: + d2:d5:1a:f7:7a:34:1d:09:73:44:1c:af:3d:31:72: + 90:e9:43:0b:b3:c9:30:58:21:df:27:5b:39:42:85: + f1:ec:d9:1c:89:38:64:92:d6:da:f9:22:c1:e9:b5: + 22:bf:3a:32:10:f9:e3:e6:b3:73:1d:d2:7e:a9:a6: + 27:86:83:8c:7e:9d:4f:39:d0:53:45:0b:f7:89:8b: + f2:8c:43:44:42:a9:4a:81:83:60:bb:1f:63:f5:75: + fa:73:3b:85:c9:62:7d:1d:8a:61:4c:3c:f9:23:a3: + 3d:97:78:6f:6d:13:db:88:79:fb:89:0b:3e:a6:50: + b8:72:9a:c8:d3:7b:d2:ec:6c:15:3d:ab:f7:8b:c8: + 50:9b + Exponent: 65537 (0x10001) + Signature Algorithm: sha1WithRSAEncryption + 95:b9:66:f0:95:05:82:2c:9b:f6:85:ea:68:7c:ae:18:b5:d1: + 12:10:22:2f:2f:1f:5f:d8:15:b6:b3:87:4a:dc:b1:1c:1d:c3: + 8c:80:2f:cb:d2:bd:36:35:53:27:20:c0:b8:5f:58:92:8e:60: + 2a:01:f1:08:38:d0:97:6f:4f:a1:57:17:e7:b9:fc:e1:67:7a: + 97:1b:b3:e1:36:26:06:b2:32:9d:5a:12:4b:2d:b7:0b:8b:c8: + 09:bc:5c:b1:8f:f8:42:24:97:10:6d:6a:eb:82:99:0a:bf:e8: + fe:9c:1d:52:f2:2d:78:18:a4:9f:33:27:88:54:86:09:11:0e: + fd:d5:5c:0d:65:c4:78:bd:cc:2f:34:59:e0:13:e8:02:ed:98: + c4:9e:7f:5e:f7:9b:18:d1:c6:76:eb:1b:dc:76:6a:a6:ab:f3: + b5:8f:b5:0a:ad:cf:07:d5:cf:6c:69:ae:0c:f5:dc:f2:b2:11: + 2b:b2:b6:a5:b5:63:6b:1f:0d:7b:cd:07:81:59:40:5e:12:c9: + 41:73:cf:08:87:3c:ab:38:51:27:c2:ad:c6:57:20:dc:bd:fe: + cf:ea:b5:37:29:be:c1:f4:9b:61:ad:a3:f8:5c:d7:7b:65:2e: + 80:f9:6b:dd:42:a8:62:ae:52:0d:95:f7:67:04:10:b9:97:24: + 48:33:fb:22 +-----BEGIN CERTIFICATE----- +MIIDnTCCAoUCAQEwDQYJKoZIhvcNAQEFBQAwgZYxCzAJBgNVBAYTAkRFMQswCQYD +VQQIDAJCVzETMBEGA1UEBwwKUmV1dGxpbmdlbjEcMBoGA1UECgwTU291cmNlIEZl +bGxvd3MgR21iSDEoMCYGCSqGSIb3DQEJARYZd2VibWFzdGVyQGV4YW1wbGUucHJp +dmF0ZTEdMBsGA1UEAwwUdGVzdC5leGFtcGxlLnByaXZhdGUwHhcNMjAwNzA5MDQx +NTQ3WhcNMjEwNzA5MDQxNTQ3WjCBkTELMAkGA1UEBhMCREUxCzAJBgNVBAgMAkJX +MRMwEQYDVQQHDApSZXV0bGluZ2VuMRwwGgYDVQQKDBNTb3VyY2UgRmVsbG93cyBH +bWJIMR0wGwYDVQQDDBR0ZXN0LmV4YW1wbGUucHJpdmF0ZTEjMCEGCSqGSIb3DQEJ +ARYUdXNlckBleGFtcGxlLnByaXZhdGUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw +ggEKAoIBAQDjqbbFNQZtEu7n7mCJSSqssr4998VNVQj8gEOq/QVsQ5SlAskf/HDE +RIVauPmV+IpcLhJVQyPy0DTDpEGJFKnRGdQN0FiHOJ9sHYktI2CPnq/0WvDQpP1K +SZsZ35cg24B77vK655q0PEh0nFdhC07u61Ndyj2e89LVGvd6NB0Jc0Qcrz0xcpDp +QwuzyTBYId8nWzlChfHs2RyJOGSS1tr5IsHptSK/OjIQ+ePms3Md0n6ppieGg4x+ +nU850FNFC/eJi/KMQ0RCqUqBg2C7H2P1dfpzO4XJYn0dimFMPPkjoz2XeG9tE9uI +efuJCz6mULhymsjTe9LsbBU9q/eLyFCbAgMBAAEwDQYJKoZIhvcNAQEFBQADggEB +AJW5ZvCVBYIsm/aF6mh8rhi10RIQIi8vH1/YFbazh0rcsRwdw4yAL8vSvTY1Uycg +wLhfWJKOYCoB8Qg40JdvT6FXF+e5/OFnepcbs+E2JgayMp1aEksttwuLyAm8XLGP ++EIklxBtauuCmQq/6P6cHVLyLXgYpJ8zJ4hUhgkRDv3VXA1lxHi9zC80WeAT6ALt +mMSef173mxjRxnbrG9x2aqar87WPtQqtzwfVz2xprgz13PKyESuytqW1Y2sfDXvN +B4FZQF4SyUFzzwiHPKs4USfCrcZXINy9/s/qtTcpvsH0m2Gto/hc13tlLoD5a91C +qGKuUg2V92cEELmXJEgz+yI= +-----END CERTIFICATE----- diff --git a/microservices/httpsservercert/certs/ca/index.txt b/microservices/httpsservercert/certs/ca/index.txt new file mode 100644 index 0000000..27662dd --- /dev/null +++ b/microservices/httpsservercert/certs/ca/index.txt @@ -0,0 +1 @@ +V 210709041547Z 01 unknown /C=DE/ST=BW/L=Reutlingen/O=Source Fellows GmbH/CN=test.example.private/emailAddress=user@example.private diff --git a/microservices/httpsservercert/certs/ca/index.txt.attr b/microservices/httpsservercert/certs/ca/index.txt.attr new file mode 100644 index 0000000..8f7e63a --- /dev/null +++ b/microservices/httpsservercert/certs/ca/index.txt.attr @@ -0,0 +1 @@ +unique_subject = yes diff --git a/microservices/httpsservercert/certs/ca/index.txt.attr.old b/microservices/httpsservercert/certs/ca/index.txt.attr.old new file mode 100644 index 0000000..e69de29 diff --git a/microservices/httpsservercert/certs/ca/index.txt.old b/microservices/httpsservercert/certs/ca/index.txt.old new file mode 100644 index 0000000..e69de29 diff --git a/microservices/httpsservercert/certs/ca/serial b/microservices/httpsservercert/certs/ca/serial new file mode 100644 index 0000000..9e22bcb --- /dev/null +++ b/microservices/httpsservercert/certs/ca/serial @@ -0,0 +1 @@ +02 diff --git a/microservices/httpsservercert/certs/ca/serial.old b/microservices/httpsservercert/certs/ca/serial.old new file mode 100644 index 0000000..8a0f05e --- /dev/null +++ b/microservices/httpsservercert/certs/ca/serial.old @@ -0,0 +1 @@ +01 diff --git a/microservices/httpsservercert/certs/myRoot.crt b/microservices/httpsservercert/certs/myRoot.crt new file mode 100644 index 0000000..242eadf --- /dev/null +++ b/microservices/httpsservercert/certs/myRoot.crt @@ -0,0 +1,21 @@ +-----BEGIN CERTIFICATE----- +MIIDhTCCAm2gAwIBAgIUS7TqIYrkdb2kEmtuawe8h/54VVIwDQYJKoZIhvcNAQEL +BQAwUjELMAkGA1UEBhMCREUxEDAOBgNVBAgMB0JhV8ODwrwxEzARBgNVBAcMClJl +dXRsaW5nZW4xHDAaBgNVBAoME1NvdXJjZSBGZWxsb3dzIEdtYkgwHhcNMjAwNzA4 +MDM1ODE4WhcNMzAwNzA2MDM1ODE4WjBSMQswCQYDVQQGEwJERTEQMA4GA1UECAwH +QmFXw4PCvDETMBEGA1UEBwwKUmV1dGxpbmdlbjEcMBoGA1UECgwTU291cmNlIEZl +bGxvd3MgR21iSDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANY+x2Kr +U49506heEh2s0Q5vTjXUbP5814pHhlJ43X3p7QYMbJ/BBunxLA3a8GvuukgD1Wxr +0T0uHo5/MLxRh6r1TEy80IApUsyCcAO3jdTGtIr4iebnAOL/Dw0TGWDRyl5SZCwo +BsVSOfCoJyMs+ygB+BLE+05Dq5FwA3CpxP5r67efBpY2Y9bu1iXAC179rGaVvtLM +3Zy5G+tQ0aMJYOqVR6tvSrrYg44gJiM270u6Os80V723fPtEUvKbHQOpZoleHWsb +uZ1FbdQBcnJ2u3bI93ewQAvqQ3tjOqgell5n7kJ1B3Vjk8bVzda1zPKH9vcvF0fc +gXdPrVOzBCa5Su8CAwEAAaNTMFEwHQYDVR0OBBYEFO3om6AZ9q/+r6kXo7hAhOBD +SeTbMB8GA1UdIwQYMBaAFO3om6AZ9q/+r6kXo7hAhOBDSeTbMA8GA1UdEwEB/wQF +MAMBAf8wDQYJKoZIhvcNAQELBQADggEBAMxKFUWYTQz/ACVY8lV18QCGxcvNj3Uz +ZdtNUEDkxu6yKsl+1otREbuxqnfNjrGLmlLQfU/GlY+PCF85SYm1Ep4yKdZ7J+1c +MG+PB5NS3cV7BnoJ6WnXk7KJRX+dYpCr+jQmQbtTshk6dM2a6THjyPzKkyDflcfM +tXQROGDG9O/5DvF8Eqz13Gel5Wukept9mHtDHapU0BooFTXNqh+tPmFU76tKCQZV +h0Qt9BC8A6bDEaULVlXpvNTuDCrCMGhiYEo2++PD/e5YT1UDVNSokanyFIUoCJAn +X5u+VjRfaVibiWu8E63qoKv+oXBf9pwlNeE8KBlydzf5OQgx8FEkbfc= +-----END CERTIFICATE----- diff --git a/microservices/httpsservercert/certs/myRoot.key b/microservices/httpsservercert/certs/myRoot.key new file mode 100644 index 0000000..a018d60 --- /dev/null +++ b/microservices/httpsservercert/certs/myRoot.key @@ -0,0 +1,27 @@ +-----BEGIN RSA PRIVATE KEY----- +MIIEowIBAAKCAQEA1j7HYqtTj3nTqF4SHazRDm9ONdRs/nzXikeGUnjdfentBgxs +n8EG6fEsDdrwa+66SAPVbGvRPS4ejn8wvFGHqvVMTLzQgClSzIJwA7eN1Ma0iviJ +5ucA4v8PDRMZYNHKXlJkLCgGxVI58KgnIyz7KAH4EsT7TkOrkXADcKnE/mvrt58G +ljZj1u7WJcALXv2sZpW+0szdnLkb61DRowlg6pVHq29KutiDjiAmIzbvS7o6zzRX +vbd8+0RS8psdA6lmiV4daxu5nUVt1AFycna7dsj3d7BAC+pDe2M6qB6WXmfuQnUH +dWOTxtXN1rXM8of29y8XR9yBd0+tU7MEJrlK7wIDAQABAoIBAQC0GzaWthybAvly +ExL7q2pbzipbimbOUbkI4DQFZOIelebSLOOsMSNUy5ATXbi7o4cqPz7N1J2j5v99 +H2OjDI8WovwvjpNhClw23Hi6RzaOZzUjluinGg9exLisbx/oirSrMmxPyp5Wh1d5 +/oJYSdohufYIIVx6YNz8eMQLlEys7BcAs9uDbfrEh2lhSCRd+eVER/p2U+EE3YFe +OPhE7S7/5fDHidA/vU5YL0zyDcTiqec8lF3b63L39zYsckUjvbJ9gXru+RUFsnYT +FCz/8axvSyiRj9M162BtrwV1lANgbck+unmk9j63bMaNUFHdlFxovxZDA4C6napJ ++5dnwduBAoGBAO3UqDRxSWvelTv5vSFWaiJoFKU23PGX46Fsy+b8ttj+8Jz94333 +u+1t5fEnpS46QhQtiVRB42pezBncJ+CdjQ92ikcJZL7o8NYttlmTVg2i/v+dnxmL +T+Tgl89VUOgfKdlRwpgG64dMT1HFQJlMKkKMzdS6FxQtSclYSq0yYVxhAoGBAOac +2ijcy0xlhDinsmikxBveaxl8pTeF0jmLlXmNRTuSXkk9tXi5yurV+e4M9oG7pvYU +4LUthIvtbmPgDhANN5+45bJqNWw3ovaLb0/60XsET4fiR8W0muXMHcBySpFQsvRm +/daw41S+f4rv2XqyaLLbwmgPiusGlJMDENQQCmlPAoGASPA2Idc4gDeEJx+hTE8X +P7QR2NVpj0JY0lHuesm4PfZ5znviv+gxH1Db+0iAVRwS1eNdQZTvbNjj2W52YGGR +OFPPdpe/6PjBm73rNa+E7au2bqhlec0K1JO4myJ8LKQaDocPmdZNd3IExXwsIpeE +QmKyYXIsz8hP38sPI+zWhSECgYBzJz2Ui/QEGOj2NV7T+/plBCIsnt4NJIh97aJd +CNraTVNBdUvplbSqoOBlKxnoXCCZ3oD6V1lJWez2eEntX/w3iGdCOOCmQf3g6G1T +3aW+rL9d1fMK2Q1D1DHDCA8OEuLZQZhdHQTXKyya3vuU1gOL1Ep2FdTDWQzVgAFm +MwBP5wKBgC7jFtvny07N3NQN/KX758LxN043Awx7DstraYj93jDQ8xT5naiXC/8m +YoGB9aE6v+uxllBN5QdTSdzL0vpmkLYfnLbKSq54WVOflSAvL6VjxI9o9HMFqGF2 +wcEp3pm+ub20bZBdFoxP15X3IisUGiQcrg/q4ZGHxOvJuzI9q4b0 +-----END RSA PRIVATE KEY----- diff --git a/microservices/httpsservercert/certs/myRoot.srl b/microservices/httpsservercert/certs/myRoot.srl new file mode 100644 index 0000000..ad3cbeb --- /dev/null +++ b/microservices/httpsservercert/certs/myRoot.srl @@ -0,0 +1 @@ +73771BE66A4800A9EBDEF9018EBEDCDB7701BCC8 diff --git a/microservices/httpsservercert/certs/server-cert.conf b/microservices/httpsservercert/certs/server-cert.conf new file mode 100644 index 0000000..306506a --- /dev/null +++ b/microservices/httpsservercert/certs/server-cert.conf @@ -0,0 +1,6 @@ +authorityKeyIdentifier=keyid,issuer +basicConstraints=CA:FALSE +keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment, keyCertSign +subjectAltName = @alt_names +[alt_names] +DNS.1 = test.example.private \ No newline at end of file diff --git a/microservices/httpsservercert/certs/server-cert.request.conf b/microservices/httpsservercert/certs/server-cert.request.conf new file mode 100644 index 0000000..09d661e --- /dev/null +++ b/microservices/httpsservercert/certs/server-cert.request.conf @@ -0,0 +1,12 @@ +[req] +distinguished_name = dn +default_bits = 2048 +prompt = no +default_md = sha256 +[dn] +C=DE +ST=BW +L=Reutlingen +O=Source Fellows GmbH +emailAddress=webmaster@example.private +CN = test.example.private \ No newline at end of file diff --git a/microservices/httpsservercert/certs/server-chain.crt b/microservices/httpsservercert/certs/server-chain.crt new file mode 100644 index 0000000..2fc88c8 --- /dev/null +++ b/microservices/httpsservercert/certs/server-chain.crt @@ -0,0 +1,42 @@ +-----BEGIN CERTIFICATE----- +MIIDhTCCAm2gAwIBAgIUS7TqIYrkdb2kEmtuawe8h/54VVIwDQYJKoZIhvcNAQEL +BQAwUjELMAkGA1UEBhMCREUxEDAOBgNVBAgMB0JhV8ODwrwxEzARBgNVBAcMClJl +dXRsaW5nZW4xHDAaBgNVBAoME1NvdXJjZSBGZWxsb3dzIEdtYkgwHhcNMjAwNzA4 +MDM1ODE4WhcNMzAwNzA2MDM1ODE4WjBSMQswCQYDVQQGEwJERTEQMA4GA1UECAwH +QmFXw4PCvDETMBEGA1UEBwwKUmV1dGxpbmdlbjEcMBoGA1UECgwTU291cmNlIEZl +bGxvd3MgR21iSDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANY+x2Kr +U49506heEh2s0Q5vTjXUbP5814pHhlJ43X3p7QYMbJ/BBunxLA3a8GvuukgD1Wxr +0T0uHo5/MLxRh6r1TEy80IApUsyCcAO3jdTGtIr4iebnAOL/Dw0TGWDRyl5SZCwo +BsVSOfCoJyMs+ygB+BLE+05Dq5FwA3CpxP5r67efBpY2Y9bu1iXAC179rGaVvtLM +3Zy5G+tQ0aMJYOqVR6tvSrrYg44gJiM270u6Os80V723fPtEUvKbHQOpZoleHWsb +uZ1FbdQBcnJ2u3bI93ewQAvqQ3tjOqgell5n7kJ1B3Vjk8bVzda1zPKH9vcvF0fc +gXdPrVOzBCa5Su8CAwEAAaNTMFEwHQYDVR0OBBYEFO3om6AZ9q/+r6kXo7hAhOBD +SeTbMB8GA1UdIwQYMBaAFO3om6AZ9q/+r6kXo7hAhOBDSeTbMA8GA1UdEwEB/wQF +MAMBAf8wDQYJKoZIhvcNAQELBQADggEBAMxKFUWYTQz/ACVY8lV18QCGxcvNj3Uz +ZdtNUEDkxu6yKsl+1otREbuxqnfNjrGLmlLQfU/GlY+PCF85SYm1Ep4yKdZ7J+1c +MG+PB5NS3cV7BnoJ6WnXk7KJRX+dYpCr+jQmQbtTshk6dM2a6THjyPzKkyDflcfM +tXQROGDG9O/5DvF8Eqz13Gel5Wukept9mHtDHapU0BooFTXNqh+tPmFU76tKCQZV +h0Qt9BC8A6bDEaULVlXpvNTuDCrCMGhiYEo2++PD/e5YT1UDVNSokanyFIUoCJAn +X5u+VjRfaVibiWu8E63qoKv+oXBf9pwlNeE8KBlydzf5OQgx8FEkbfc= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIDcDCCAlgCFHN3G+ZqSACp6975AY6+3Nt3AbzIMA0GCSqGSIb3DQEBCwUAMFIx +CzAJBgNVBAYTAkRFMRAwDgYDVQQIDAdCYVfDg8K8MRMwEQYDVQQHDApSZXV0bGlu +Z2VuMRwwGgYDVQQKDBNTb3VyY2UgRmVsbG93cyBHbWJIMB4XDTIwMDcwOTA0MTM0 +NloXDTMwMDcwNzA0MTM0NlowgZYxCzAJBgNVBAYTAkRFMQswCQYDVQQIDAJCVzET +MBEGA1UEBwwKUmV1dGxpbmdlbjEcMBoGA1UECgwTU291cmNlIEZlbGxvd3MgR21i +SDEoMCYGCSqGSIb3DQEJARYZd2VibWFzdGVyQGV4YW1wbGUucHJpdmF0ZTEdMBsG +A1UEAwwUdGVzdC5leGFtcGxlLnByaXZhdGUwggEiMA0GCSqGSIb3DQEBAQUAA4IB +DwAwggEKAoIBAQDEff9ZynNlYbqjTSl77iLejkEwkZuByBwW90CSNcU4GvYnBkiJ +phUGCV0ifZzEbs+a+AFi9n4AUeA6MUHukEd9ccVSjhg3CQVuPgShyWW1m7XFuiFw +ms0cePzkNviwDwQvHknS1DaEVDwhjciE0PmWn2CcRVf5ZoNi39EmrYotZBvovxQv +RoOoP8LXRj4sZDY+5hrwheOoYbAiq0pZcNY7ajHH5CXt/GXKwNucZmBiJSCqusj8 +BQgJ1ob788pu1mqojs8QAhgcRf2jkM7MKTuO5tjOrHfdN2dlcDV9k8O+dg2FwIAF +db0Nrmy71qHrdz1o7nsx0ktyuQmcHC8GfltNAgMBAAEwDQYJKoZIhvcNAQELBQAD +ggEBAFC2bJh1AVWBdHA6Ig6GPW0pta14foNIQTPgjZfxRZZBaHS3cTr5Shl5Dhpi +nU48hoAZNmNaSf7Y47+UhjlQHaRWs1kGyIdYFuyujn9CxGQXmzCG/VvOHh+elwws +HV7cR6KRMozzOo4JVc61wKgnXOlaLOkY2T26aFhMfpeZhSmZ+vxRIe7uo2UEWLNg +nRf7DOAcQCUEtyWB8jF+Du5nKg6FnQYn9S9qzwJSCDKvNaw+TaXK1kumcrxuF9s9 +HLxYDAnKfLIqsekoeELrbMU+r0Jhpbr3oHeUa4Mm+v2I2SleWNcYLfQmCyxklJ5r +LrQLEceRlUveswrFdPYZYVQq2gc= +-----END CERTIFICATE----- diff --git a/microservices/httpsservercert/certs/test.example.crt b/microservices/httpsservercert/certs/test.example.crt new file mode 100644 index 0000000..caaa4fa --- /dev/null +++ b/microservices/httpsservercert/certs/test.example.crt @@ -0,0 +1,21 @@ +-----BEGIN CERTIFICATE----- +MIIDcDCCAlgCFHN3G+ZqSACp6975AY6+3Nt3AbzIMA0GCSqGSIb3DQEBCwUAMFIx +CzAJBgNVBAYTAkRFMRAwDgYDVQQIDAdCYVfDg8K8MRMwEQYDVQQHDApSZXV0bGlu +Z2VuMRwwGgYDVQQKDBNTb3VyY2UgRmVsbG93cyBHbWJIMB4XDTIwMDcwOTA0MTM0 +NloXDTMwMDcwNzA0MTM0NlowgZYxCzAJBgNVBAYTAkRFMQswCQYDVQQIDAJCVzET +MBEGA1UEBwwKUmV1dGxpbmdlbjEcMBoGA1UECgwTU291cmNlIEZlbGxvd3MgR21i +SDEoMCYGCSqGSIb3DQEJARYZd2VibWFzdGVyQGV4YW1wbGUucHJpdmF0ZTEdMBsG +A1UEAwwUdGVzdC5leGFtcGxlLnByaXZhdGUwggEiMA0GCSqGSIb3DQEBAQUAA4IB +DwAwggEKAoIBAQDEff9ZynNlYbqjTSl77iLejkEwkZuByBwW90CSNcU4GvYnBkiJ +phUGCV0ifZzEbs+a+AFi9n4AUeA6MUHukEd9ccVSjhg3CQVuPgShyWW1m7XFuiFw +ms0cePzkNviwDwQvHknS1DaEVDwhjciE0PmWn2CcRVf5ZoNi39EmrYotZBvovxQv +RoOoP8LXRj4sZDY+5hrwheOoYbAiq0pZcNY7ajHH5CXt/GXKwNucZmBiJSCqusj8 +BQgJ1ob788pu1mqojs8QAhgcRf2jkM7MKTuO5tjOrHfdN2dlcDV9k8O+dg2FwIAF +db0Nrmy71qHrdz1o7nsx0ktyuQmcHC8GfltNAgMBAAEwDQYJKoZIhvcNAQELBQAD +ggEBAFC2bJh1AVWBdHA6Ig6GPW0pta14foNIQTPgjZfxRZZBaHS3cTr5Shl5Dhpi +nU48hoAZNmNaSf7Y47+UhjlQHaRWs1kGyIdYFuyujn9CxGQXmzCG/VvOHh+elwws +HV7cR6KRMozzOo4JVc61wKgnXOlaLOkY2T26aFhMfpeZhSmZ+vxRIe7uo2UEWLNg +nRf7DOAcQCUEtyWB8jF+Du5nKg6FnQYn9S9qzwJSCDKvNaw+TaXK1kumcrxuF9s9 +HLxYDAnKfLIqsekoeELrbMU+r0Jhpbr3oHeUa4Mm+v2I2SleWNcYLfQmCyxklJ5r +LrQLEceRlUveswrFdPYZYVQq2gc= +-----END CERTIFICATE----- diff --git a/microservices/httpsservercert/certs/test.example.csr b/microservices/httpsservercert/certs/test.example.csr new file mode 100644 index 0000000..9d3b8ec --- /dev/null +++ b/microservices/httpsservercert/certs/test.example.csr @@ -0,0 +1,18 @@ +-----BEGIN CERTIFICATE REQUEST----- +MIIC3DCCAcQCAQAwgZYxCzAJBgNVBAYTAkRFMQswCQYDVQQIDAJCVzETMBEGA1UE +BwwKUmV1dGxpbmdlbjEcMBoGA1UECgwTU291cmNlIEZlbGxvd3MgR21iSDEoMCYG +CSqGSIb3DQEJARYZd2VibWFzdGVyQGV4YW1wbGUucHJpdmF0ZTEdMBsGA1UEAwwU +dGVzdC5leGFtcGxlLnByaXZhdGUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK +AoIBAQDEff9ZynNlYbqjTSl77iLejkEwkZuByBwW90CSNcU4GvYnBkiJphUGCV0i +fZzEbs+a+AFi9n4AUeA6MUHukEd9ccVSjhg3CQVuPgShyWW1m7XFuiFwms0cePzk +NviwDwQvHknS1DaEVDwhjciE0PmWn2CcRVf5ZoNi39EmrYotZBvovxQvRoOoP8LX +Rj4sZDY+5hrwheOoYbAiq0pZcNY7ajHH5CXt/GXKwNucZmBiJSCqusj8BQgJ1ob7 +88pu1mqojs8QAhgcRf2jkM7MKTuO5tjOrHfdN2dlcDV9k8O+dg2FwIAFdb0Nrmy7 +1qHrdz1o7nsx0ktyuQmcHC8GfltNAgMBAAGgADANBgkqhkiG9w0BAQsFAAOCAQEA +l+IOqCs8V602w/GoWdxmLagVGUhSO7DOj6y3mPJirYCWwXCWWePkI9EFnW6ZW3O5 +uNCS2EkmzCOn/Py2M4R6h0+4a+eT+uZVY3gLhD4oN3uYPDoycoMHfkCYXXCNTJG1 +y3rWrvqrg7PjzEk7NOdG5dpGbdok9GVmkaXVjMn64J0PVzzyYZbM+1bxs9sq7Juj +xzW/ZYioL/R+XBsUFeiwIiro1AlSUO1zClEMR5ePPGoEkbaMu6z1aojF51jEW+3M +208+uZnRgycuwpcLPdThagXGblAdypYzSB6vTKN9jndsy+/gMgp/K/Ie926trJEZ +Bmogwc3Y5xduKsqkSxWNEw== +-----END CERTIFICATE REQUEST----- diff --git a/microservices/httpsservercert/certs/test.example.key b/microservices/httpsservercert/certs/test.example.key new file mode 100644 index 0000000..bacb8f4 --- /dev/null +++ b/microservices/httpsservercert/certs/test.example.key @@ -0,0 +1,28 @@ +-----BEGIN PRIVATE KEY----- +MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDEff9ZynNlYbqj +TSl77iLejkEwkZuByBwW90CSNcU4GvYnBkiJphUGCV0ifZzEbs+a+AFi9n4AUeA6 +MUHukEd9ccVSjhg3CQVuPgShyWW1m7XFuiFwms0cePzkNviwDwQvHknS1DaEVDwh +jciE0PmWn2CcRVf5ZoNi39EmrYotZBvovxQvRoOoP8LXRj4sZDY+5hrwheOoYbAi +q0pZcNY7ajHH5CXt/GXKwNucZmBiJSCqusj8BQgJ1ob788pu1mqojs8QAhgcRf2j +kM7MKTuO5tjOrHfdN2dlcDV9k8O+dg2FwIAFdb0Nrmy71qHrdz1o7nsx0ktyuQmc +HC8GfltNAgMBAAECggEAD4P/gOCaohvIeBKkvvN772T+Qs6Mn//kL/AQOjtiul5u +p4A4hB4INPTSVOHkWiKB5DPHMEBUjMPqV84B7cuYyZANS8qKoPXmZuEgzoGvtVp5 +TQa4k0K2BZSMK50noAdfhjT3EV3OfD6GjQO8HLi/rKQjJdPX8Yqlv037Hvm/GnxU +we4ozN6AbrfUAff5VLU/S8BcKjzlklHHAnRpFzD+Wz4w7woKNDUOjHH1WI6HWoSR +Pupab/IYhldiXNrB6hCuco+I58DENY1cYQ2X24k/XExRDebpUwZXrGSIxQ7lxCKh +tc+x/QyJMqu2t4kKSvgBXTeb+g3PfSmfdZnIrAnTQQKBgQDozUzLhCPb3NzeiHG8 +Kd3J14+QttpT2x15qo3hn2jp5pBQmY07s75AiuBX4MKZ01rMFHUd+DpcJ7NOEC5X +dPJJ4jJEdwee26NSKk+MnWliiQgzThw1rL/9Nq9Wh7bZxMG/R5Q4ED0FRQWCPW3h +MwAEN6CRALaj94NOJUNEjUzFPQKBgQDYEnJ+vHvhwsQPzQaBez/U4aQ1tA1rh9hB +iecddIX91OXw8znQvSxZUKvXQov8U+03rGeJXIMRLGT7EsvK4/8czi2r7NgLnUMM +6AQ3/FXwylNTUvSFLEcypHp4FfwJ1OFHvZWCvT8i+Ni7onvbL5JEKeKoRE/3E91N +FrfCKlDvUQKBgCwsAB1BhlhKUPI8a3ArdXS93PS1bTmqAq66KM+dopd28v0IFZ81 +XKz8bNLfx6zOSJUecJZuKgygT8pJEbHwc6SHMciB2UVQIW4OrydcGsnifFbXxEx+ +6bLO9HfzqkMprSVxHHOCyUE9tmze4QFw3tjuAR5iR0VXSmfCdEAGm4F1AoGAbf1N +/UfTRAQSK/zxL95eiu5l2dSS9EcNhac+V9cmEiVa+8HEj4aM2dZf807z1XmfirSf +a+QE8CwKJ2jVBq3zAmXOB/Ojsp3WMO62nw07bjyAGC1lPZlhkNz7Xr/KMfMEzrEq +N4hAaHwGT9WReO0JZttvfrpvflXFVGWZGyTRWFECgYEA1UGQB/+I4WanfaP7aTRn +hVPdf62wePlm2hDCg5DI7OSRxFbIq7aah516QG1w0JiEEnbTEYF0IAMvJT2SuDsS +45UNe0myHb4jDI6kqPXef4EmJhhO92GsMfgocsl9HYb+ElSiSWWUFj1G3pnBdXyu +KTrAWWyykNup7GJd4un8dNc= +-----END PRIVATE KEY----- diff --git a/microservices/httpsservercert/certs/user-cert.conf b/microservices/httpsservercert/certs/user-cert.conf new file mode 100644 index 0000000..2e3dc14 --- /dev/null +++ b/microservices/httpsservercert/certs/user-cert.conf @@ -0,0 +1,28 @@ +authorityKeyIdentifier=keyid,issuer +basicConstraints=CA:FALSE +keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment +default_days = 365 +[ca] +default_ca = CA_default +[ CA_default ] +dir = ca +certs = $dir/certsdb +new_certs_dir = $certs +database = $dir/index.txt +certificate = $dir/cacert.pem +private_key = $dir/private/cakey.pem +serial = $dir/serial +crldir = $dir/crl +crlnumber = $dir/crlnumber +crl = $crldir/crl.pem +RANDFILE = $dir/private/.rand +default_md = sha1 +policy = policy_match +[ policy_match ] +countryName = match +stateOrProvinceName = match +localityName = supplied +organizationName = match +organizationalUnitName = optional +commonName = supplied +emailAddress = optional \ No newline at end of file diff --git a/microservices/httpsservercert/certs/user-cert.request.conf b/microservices/httpsservercert/certs/user-cert.request.conf new file mode 100644 index 0000000..75449bf --- /dev/null +++ b/microservices/httpsservercert/certs/user-cert.request.conf @@ -0,0 +1,12 @@ +[req] +distinguished_name = dn +default_bits = 2048 +prompt = no +default_md = sha256 +[dn] +C=DE +ST=BW +L=Reutlingen +O=Source Fellows GmbH +emailAddress=user@example.private +CN = test.example.private \ No newline at end of file diff --git a/microservices/httpsservercert/certs/user-client.p12 b/microservices/httpsservercert/certs/user-client.p12 new file mode 100644 index 0000000..9bfe53c Binary files /dev/null and b/microservices/httpsservercert/certs/user-client.p12 differ diff --git a/microservices/httpsservercert/certs/user.crt b/microservices/httpsservercert/certs/user.crt new file mode 100644 index 0000000..1844631 --- /dev/null +++ b/microservices/httpsservercert/certs/user.crt @@ -0,0 +1,71 @@ +Certificate: + Data: + Version: 1 (0x0) + Serial Number: 1 (0x1) + Signature Algorithm: sha1WithRSAEncryption + Issuer: C=DE, ST=BW, L=Reutlingen, O=Source Fellows GmbH/emailAddress=webmaster@example.private, CN=test.example.private + Validity + Not Before: Jul 9 04:15:47 2020 GMT + Not After : Jul 9 04:15:47 2021 GMT + Subject: C=DE, ST=BW, L=Reutlingen, O=Source Fellows GmbH, CN=test.example.private/emailAddress=user@example.private + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + RSA Public-Key: (2048 bit) + Modulus: + 00:e3:a9:b6:c5:35:06:6d:12:ee:e7:ee:60:89:49: + 2a:ac:b2:be:3d:f7:c5:4d:55:08:fc:80:43:aa:fd: + 05:6c:43:94:a5:02:c9:1f:fc:70:c4:44:85:5a:b8: + f9:95:f8:8a:5c:2e:12:55:43:23:f2:d0:34:c3:a4: + 41:89:14:a9:d1:19:d4:0d:d0:58:87:38:9f:6c:1d: + 89:2d:23:60:8f:9e:af:f4:5a:f0:d0:a4:fd:4a:49: + 9b:19:df:97:20:db:80:7b:ee:f2:ba:e7:9a:b4:3c: + 48:74:9c:57:61:0b:4e:ee:eb:53:5d:ca:3d:9e:f3: + d2:d5:1a:f7:7a:34:1d:09:73:44:1c:af:3d:31:72: + 90:e9:43:0b:b3:c9:30:58:21:df:27:5b:39:42:85: + f1:ec:d9:1c:89:38:64:92:d6:da:f9:22:c1:e9:b5: + 22:bf:3a:32:10:f9:e3:e6:b3:73:1d:d2:7e:a9:a6: + 27:86:83:8c:7e:9d:4f:39:d0:53:45:0b:f7:89:8b: + f2:8c:43:44:42:a9:4a:81:83:60:bb:1f:63:f5:75: + fa:73:3b:85:c9:62:7d:1d:8a:61:4c:3c:f9:23:a3: + 3d:97:78:6f:6d:13:db:88:79:fb:89:0b:3e:a6:50: + b8:72:9a:c8:d3:7b:d2:ec:6c:15:3d:ab:f7:8b:c8: + 50:9b + Exponent: 65537 (0x10001) + Signature Algorithm: sha1WithRSAEncryption + 95:b9:66:f0:95:05:82:2c:9b:f6:85:ea:68:7c:ae:18:b5:d1: + 12:10:22:2f:2f:1f:5f:d8:15:b6:b3:87:4a:dc:b1:1c:1d:c3: + 8c:80:2f:cb:d2:bd:36:35:53:27:20:c0:b8:5f:58:92:8e:60: + 2a:01:f1:08:38:d0:97:6f:4f:a1:57:17:e7:b9:fc:e1:67:7a: + 97:1b:b3:e1:36:26:06:b2:32:9d:5a:12:4b:2d:b7:0b:8b:c8: + 09:bc:5c:b1:8f:f8:42:24:97:10:6d:6a:eb:82:99:0a:bf:e8: + fe:9c:1d:52:f2:2d:78:18:a4:9f:33:27:88:54:86:09:11:0e: + fd:d5:5c:0d:65:c4:78:bd:cc:2f:34:59:e0:13:e8:02:ed:98: + c4:9e:7f:5e:f7:9b:18:d1:c6:76:eb:1b:dc:76:6a:a6:ab:f3: + b5:8f:b5:0a:ad:cf:07:d5:cf:6c:69:ae:0c:f5:dc:f2:b2:11: + 2b:b2:b6:a5:b5:63:6b:1f:0d:7b:cd:07:81:59:40:5e:12:c9: + 41:73:cf:08:87:3c:ab:38:51:27:c2:ad:c6:57:20:dc:bd:fe: + cf:ea:b5:37:29:be:c1:f4:9b:61:ad:a3:f8:5c:d7:7b:65:2e: + 80:f9:6b:dd:42:a8:62:ae:52:0d:95:f7:67:04:10:b9:97:24: + 48:33:fb:22 +-----BEGIN CERTIFICATE----- +MIIDnTCCAoUCAQEwDQYJKoZIhvcNAQEFBQAwgZYxCzAJBgNVBAYTAkRFMQswCQYD +VQQIDAJCVzETMBEGA1UEBwwKUmV1dGxpbmdlbjEcMBoGA1UECgwTU291cmNlIEZl +bGxvd3MgR21iSDEoMCYGCSqGSIb3DQEJARYZd2VibWFzdGVyQGV4YW1wbGUucHJp +dmF0ZTEdMBsGA1UEAwwUdGVzdC5leGFtcGxlLnByaXZhdGUwHhcNMjAwNzA5MDQx +NTQ3WhcNMjEwNzA5MDQxNTQ3WjCBkTELMAkGA1UEBhMCREUxCzAJBgNVBAgMAkJX +MRMwEQYDVQQHDApSZXV0bGluZ2VuMRwwGgYDVQQKDBNTb3VyY2UgRmVsbG93cyBH +bWJIMR0wGwYDVQQDDBR0ZXN0LmV4YW1wbGUucHJpdmF0ZTEjMCEGCSqGSIb3DQEJ +ARYUdXNlckBleGFtcGxlLnByaXZhdGUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw +ggEKAoIBAQDjqbbFNQZtEu7n7mCJSSqssr4998VNVQj8gEOq/QVsQ5SlAskf/HDE +RIVauPmV+IpcLhJVQyPy0DTDpEGJFKnRGdQN0FiHOJ9sHYktI2CPnq/0WvDQpP1K +SZsZ35cg24B77vK655q0PEh0nFdhC07u61Ndyj2e89LVGvd6NB0Jc0Qcrz0xcpDp +QwuzyTBYId8nWzlChfHs2RyJOGSS1tr5IsHptSK/OjIQ+ePms3Md0n6ppieGg4x+ +nU850FNFC/eJi/KMQ0RCqUqBg2C7H2P1dfpzO4XJYn0dimFMPPkjoz2XeG9tE9uI +efuJCz6mULhymsjTe9LsbBU9q/eLyFCbAgMBAAEwDQYJKoZIhvcNAQEFBQADggEB +AJW5ZvCVBYIsm/aF6mh8rhi10RIQIi8vH1/YFbazh0rcsRwdw4yAL8vSvTY1Uycg +wLhfWJKOYCoB8Qg40JdvT6FXF+e5/OFnepcbs+E2JgayMp1aEksttwuLyAm8XLGP ++EIklxBtauuCmQq/6P6cHVLyLXgYpJ8zJ4hUhgkRDv3VXA1lxHi9zC80WeAT6ALt +mMSef173mxjRxnbrG9x2aqar87WPtQqtzwfVz2xprgz13PKyESuytqW1Y2sfDXvN +B4FZQF4SyUFzzwiHPKs4USfCrcZXINy9/s/qtTcpvsH0m2Gto/hc13tlLoD5a91C +qGKuUg2V92cEELmXJEgz+yI= +-----END CERTIFICATE----- diff --git a/microservices/httpsservercert/certs/user.key b/microservices/httpsservercert/certs/user.key new file mode 100644 index 0000000..24ecb98 --- /dev/null +++ b/microservices/httpsservercert/certs/user.key @@ -0,0 +1,27 @@ +-----BEGIN RSA PRIVATE KEY----- +MIIEpAIBAAKCAQEA46m2xTUGbRLu5+5giUkqrLK+PffFTVUI/IBDqv0FbEOUpQLJ +H/xwxESFWrj5lfiKXC4SVUMj8tA0w6RBiRSp0RnUDdBYhzifbB2JLSNgj56v9Frw +0KT9SkmbGd+XINuAe+7yuueatDxIdJxXYQtO7utTXco9nvPS1Rr3ejQdCXNEHK89 +MXKQ6UMLs8kwWCHfJ1s5QoXx7NkciThkktba+SLB6bUivzoyEPnj5rNzHdJ+qaYn +hoOMfp1POdBTRQv3iYvyjENEQqlKgYNgux9j9XX6czuFyWJ9HYphTDz5I6M9l3hv +bRPbiHn7iQs+plC4cprI03vS7GwVPav3i8hQmwIDAQABAoIBAQDjJvzT+7ozroZt +J61ujXBk69thnQxhwoy604ew3dBBW5S+p+7hWVFyoyOjh5iQCHKU0us740fFB/T9 +l7BEBDgECI9KUS1jjh2TFE1AmmHIKv9JAkvxAg4vxw1YXX0/LYQfJCVQU7JKTzPE +FhIhI9VYEbkWhanCJWmhc8ylQ8YNG/FU9DYl2qR4GpgEEmyX3EErG/30PBEKRVBl +k51/cz8vT3fN/bzXjX6+wkG41/+71o879Jh47wI9WY38ZUtqIGWZZaenCNubhHQx +/5dvFvidwkeueXmwgssBKLdsP1cBxpu/7eN4PsiY+n7RDPVgcnE/PQvTindDOA5w +vFJ2gZQxAoGBAPgMK2ZV23zMb0JxSfk+pxT2FJZP1MKI0IkdgB6c+rJWEnjV857q +KeHf37uSEx/4EeAX+E9LFaNgpv48XmJXZtZ9hjOvhvwyDdCEwXsFStH6yulHcxlH +Ri7iVeEOeBPhRXEhM4jOebw8Kqqp2so170Cc/kDZOx/383/e02FxEAg9AoGBAOr2 +PU+IWNBHZP/1BpekQRZBSpwmlsML5/YnIyXWeYO+d0Kwp3Qi0lKKL/ZI+/bVRGyq +tEl6fGQzzPoT7XuTS8pey7K1HSyunYdx+vbS6L/ID07mO5oIFjtAbcJQfM7kfqWr +m662lYvYdCYVPYF0ZfCw20ayb3LQNJTtzVp/5fG3AoGAapyQasOsOs+DYoNe0Anl +tlSuNIzLXXGAb+6GCqJd/hiQh+8tbrgmmDao6u212p+8zxx+VVZoTnhUTiGUT6BR +Sw9Yhw6CbhL1bRIiNsXniqjIXcuf5NWFjNErKDgX1DOWrTEf/UUBfa4+iGvI5fCY +jKTtguHbT7o6plMXd2IpCeECgYEAjqWoW1y/7tMpcmvj8LR7/3LsRRj4droHvd3M +7O/lHiLIbOirAUsSvaG/tJpivlyECiUpB2MhmgQI8dqfV2L5pIcgzAJBEBuC7/Q3 +FRq+y5A+GvyUOtOmC5r2B/6thz4Z1aL2BYA8Eob7HRPQH4P3T8VPmwBBwUa+ZZxq +DAOSKskCgYAWCldfjkOgynFHjqQ3HXDtSRLMrgVEj/+Muy6yCu7Lk+lhOsrflK82 +1rMH+O8Z2RxFIA6KuzHZbUXexNzmibsEIWBZU5X14QrLkX1Gq9mCwLv8cSMDqKz+ +qNLcMrEDqSmdPkPppVsJbz44QvFItVWYsPAWS4cyN62X6IJ2lDPjNw== +-----END RSA PRIVATE KEY----- diff --git a/microservices/httpsservercert/certs/user.req b/microservices/httpsservercert/certs/user.req new file mode 100644 index 0000000..cddf1aa --- /dev/null +++ b/microservices/httpsservercert/certs/user.req @@ -0,0 +1,18 @@ +-----BEGIN CERTIFICATE REQUEST----- +MIIC1zCCAb8CAQAwgZExCzAJBgNVBAYTAkRFMQswCQYDVQQIDAJCVzETMBEGA1UE +BwwKUmV1dGxpbmdlbjEcMBoGA1UECgwTU291cmNlIEZlbGxvd3MgR21iSDEjMCEG +CSqGSIb3DQEJARYUdXNlckBleGFtcGxlLnByaXZhdGUxHTAbBgNVBAMMFHRlc3Qu +ZXhhbXBsZS5wcml2YXRlMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA +46m2xTUGbRLu5+5giUkqrLK+PffFTVUI/IBDqv0FbEOUpQLJH/xwxESFWrj5lfiK +XC4SVUMj8tA0w6RBiRSp0RnUDdBYhzifbB2JLSNgj56v9Frw0KT9SkmbGd+XINuA +e+7yuueatDxIdJxXYQtO7utTXco9nvPS1Rr3ejQdCXNEHK89MXKQ6UMLs8kwWCHf +J1s5QoXx7NkciThkktba+SLB6bUivzoyEPnj5rNzHdJ+qaYnhoOMfp1POdBTRQv3 +iYvyjENEQqlKgYNgux9j9XX6czuFyWJ9HYphTDz5I6M9l3hvbRPbiHn7iQs+plC4 +cprI03vS7GwVPav3i8hQmwIDAQABoAAwDQYJKoZIhvcNAQELBQADggEBAJ2ZHvrq +QE8yoiOSb+itUtWLo86T+qbSwHLy9Ned0wtu1XiL7ltJATyRwMbv1RduGcfYWBcx +ZcUAcqYhsuSTM3MPg0MQvAFrLRwonq+TN6zq0K7RvZ5FSCizzcyThJIRcCtUNd0y +heqknhsvnkIwSQCb4RPF3/57FXct1FNEHEKMtldWEHCkKbJnUtt9Z/4WEkmTCvzi +EYwcwoK6QsmJOIwQXzOYniaPf2k8oeBLu81sq5GG5vRZvs9dFX6HQmfQ28oKeMCy +8n6XGHPudNybKBykvYzRKbChVl6LiFdz1f95x5JSh+aJx8Ca8mq5NpFK0TJEzQWv +NUvFSnG7X4w6JJg= +-----END CERTIFICATE REQUEST----- diff --git a/microservices/httpsservercert/go.mod b/microservices/httpsservercert/go.mod new file mode 100644 index 0000000..8247d66 --- /dev/null +++ b/microservices/httpsservercert/go.mod @@ -0,0 +1,3 @@ +module golang.source-fellows.com/samples/https/servercert + +go 1.14 diff --git a/microservices/httpsservercert/main.go b/microservices/httpsservercert/main.go new file mode 100644 index 0000000..bc446c5 --- /dev/null +++ b/microservices/httpsservercert/main.go @@ -0,0 +1,35 @@ +package main + +import ( + "crypto/tls" + "crypto/x509" + "fmt" + "io/ioutil" + "log" + "net/http" +) + +func main() { + http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { + fmt.Fprintln(w, "Hello World") + }) + + certPool := x509.NewCertPool() + pem, err := ioutil.ReadFile("certs/server-chain.crt") + if err != nil { + panic(err) + } + certPool.AppendCertsFromPEM(pem) + + tlsConfig := &tls.Config{ + ClientAuth: tls.RequireAndVerifyClientCert, + ClientCAs: certPool, + } + + srv := http.Server{ + Addr: ":8443", + TLSConfig: tlsConfig, + } + + log.Fatal(srv.ListenAndServeTLS("certs/test.example.crt", "certs/test.example.key")) +} diff --git a/microservices/httpsservercert/test.example.key b/microservices/httpsservercert/test.example.key new file mode 100644 index 0000000..fc761bd --- /dev/null +++ b/microservices/httpsservercert/test.example.key @@ -0,0 +1,28 @@ +-----BEGIN PRIVATE KEY----- +MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQC5OCW6wZCbbSyk +i8UH/+sP3ABICznxYI34oSTwuzubpciIvfrsgfGjo9L5mkTe4opHybKSsPVCfHx9 +pvp2eYGkNsy+P6LFICqRrV1Aay+tNu+qTin/7VHrEiVbdmkm3nWWf/kp46X/0q// +YHdGDSAK0Oh4dqjAF4v4y1aAFpL+bJGbAXd/thD6/MPi09YhNqRISPHxixEukbN+ +Jg5VfC+aqKTI49ntLAhznPtI6rReH1wIhTtUEtQsGpQmbk+Okz5BvshD3D856Oix +BoCjW8FiS/3IYYL23NlHoen6GvTTO24J4asT3XuH03az5eyX1YdHWKOVr3LQpAMx +udzX91DbAgMBAAECggEAGH3eL1XNI2BKWO/KfAZRNOWoe95QKSTVYR0d319CwJAp +djt45LFCHJtbGHpXxQk7s8ZuAIu5wrLnW04rLGNgyzAb3sRXZ62bM2wzOoNx6Hut +MV3om9jrziO2IOQFf4hHEEGX1vwtRSi88Q32d6Lgq814EAXQxqXWcm2g4IsboNzM +sL5sZKlYLLlVPvhJOtdpx/ywz2it/Tbn1LwqL0RVZnodDZ0mm0jZZyfyqEcrHj6G +/PsNPbmQNJ2y+15HPX1V9TPXNIzwC5BCG80ck0WxBe164mlZM4qa5olsgXv/UGfh +1Ejk2LR+ZBszD56+8Oave1o6DlQwLehzCBSFQM+N0QKBgQDlqXAIgRAJzWDBWgNp +3mwJaqHHJhShW3AJxmoA72pB5jI/3j9EeVQcwsKarCwniPkvFJw4IVwbyVFBgKQh +BUEiX7zgXg7bFwfsqSNc4sDP0txPMju20yi8LPO6h/x0DicR6yt9YXSwDWdoFtdq +2eFpopq23mbikYg4e/qiffW/rQKBgQDOde/P6lUPzVI30STJC2nAhLiw2QHjCWaj +pJehiGGM9vGIqz4SKR8X8VSBGbTwDDk49foUmqxiEAQe63f7QrOM8ukjf9LPHjPT +julVA9UDD0YQi/qPrD8ejCqUgeEI4bLeVKGz8R1Bn5iwLVbdcmY/9/8Mx+DNKBt3 ++vHSRRFDpwKBgHXHoYca+WithTNjwGBpCysBHpqNcwMVa633raFxJyNItPiAOB4b +wwFE+JxuM+7KllCI110J7rzpT9yx5npwwWiphKnkUuYVN6EtVM9sEsoCL64F6w3l +2Pw4aX5+AwBZybusyY7xjfBDz4ZYQH2x46JTG9kw0b7cN+oP2we+ZWu5AoGBAMFs +voLE4HJQguGmQFdWKPpjnYCZnmntCcrwTdrZIcNmK31GKX3sJqRQxUG6KsjmOsoB +sQySqEOrC6FIK30rzXmUrhVDEOZYPmfKsRGj6HHYYmToL5Ng5TWiTdYaJBElGmWv +Vlt13ln3wp3zrDkFj4QIvFtl+1dZZvquENZVPMprAoGAaeT+yLEtoGRSzONAvFhp +PAT+Blsz1bUO75/GHYjx7xqMZcD1iigyPtEZufVdpig7BIl968wHEs2/FS2HHh9O +IZsd6iU3nCs4k8SnJcXDj/937xY6lhFdlb/eOoPp0mjWCOaK0gdQS7YGbABibpAu +jUZ+tKBeipopfCZRrfhCXfw= +-----END PRIVATE KEY----- diff --git a/microservices/jsonhandling/main.go b/microservices/jsonhandling/main.go new file mode 100644 index 0000000..4dfb188 --- /dev/null +++ b/microservices/jsonhandling/main.go @@ -0,0 +1,23 @@ +package main + +import ( + "encoding/json" + "fmt" +) + +type Customer struct { + ID int `json:"id,omitempty"` + Firstname string `json:"first,omitempty"` + Lastname string `json:"last,omitempty"` +} + +func main() { + customer := &Customer{ID: 1, + Firstname: "Hans", Lastname: "Wurst"} + bites, _ := json.Marshal(customer) + fmt.Println(string(bites)) + + customer2 := &Customer{} + json.Unmarshal(bites, customer2) + fmt.Println(customer2.Firstname) +} diff --git a/microservices/jsonservice/GET-request.http b/microservices/jsonservice/GET-request.http new file mode 100644 index 0000000..6637830 --- /dev/null +++ b/microservices/jsonservice/GET-request.http @@ -0,0 +1 @@ +GET http://localhost:8080/customer HTTP/1.1 \ No newline at end of file diff --git a/microservices/jsonservice/POST-request.http b/microservices/jsonservice/POST-request.http new file mode 100644 index 0000000..eb1898d --- /dev/null +++ b/microservices/jsonservice/POST-request.http @@ -0,0 +1,8 @@ +POST http://localhost:8080/customer HTTP/1.1 +content-type: application/json + +{ + "ID": 2, + "Lastname": "Wurst" +} + diff --git a/microservices/jsonservice/go.mod b/microservices/jsonservice/go.mod new file mode 100644 index 0000000..38b7222 --- /dev/null +++ b/microservices/jsonservice/go.mod @@ -0,0 +1,5 @@ +module golang.source-fellows.com/samples/jsonservice + +go 1.13 + +require github.com/gorilla/mux v1.7.4 diff --git a/microservices/jsonservice/go.sum b/microservices/jsonservice/go.sum new file mode 100644 index 0000000..abb0613 --- /dev/null +++ b/microservices/jsonservice/go.sum @@ -0,0 +1,2 @@ +github.com/gorilla/mux v1.7.4 h1:VuZ8uybHlWmqV03+zRzdwKL4tUnIp1MAQtp1mIFE1bc= +github.com/gorilla/mux v1.7.4/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= diff --git a/microservices/jsonservice/main.go b/microservices/jsonservice/main.go new file mode 100644 index 0000000..c8ce7dd --- /dev/null +++ b/microservices/jsonservice/main.go @@ -0,0 +1,37 @@ +package main + +import ( + "encoding/json" + "io/ioutil" + "net/http" + + "github.com/gorilla/mux" +) + +type Customer struct { + ID int `json:"id,omitempty"` + Firstname string `json:"first,omitempty"` + Lastname string `json:"last,omitempty"` +} + +var customer *Customer + +func myGetFunc(rw http.ResponseWriter, rq *http.Request) { + bites, _ := json.Marshal(customer) + rw.Header().Add("Content-Type", "application/json") + rw.Write(bites) +} + +func myPostFunc(rw http.ResponseWriter, rq *http.Request) { + body, _ := ioutil.ReadAll(rq.Body) + json.Unmarshal(body, customer) + rw.WriteHeader(204) +} + +func main() { + customer = &Customer{ID: 1, Firstname: "Peter"} + r := mux.NewRouter() + r.HandleFunc("/customer", myGetFunc).Methods("GET") + r.HandleFunc("/customer", myPostFunc).Methods("POST") + http.ListenAndServe(":8080", r) +} diff --git a/microservices/jwt/server/go.mod b/microservices/jwt/server/go.mod new file mode 100644 index 0000000..82ad881 --- /dev/null +++ b/microservices/jwt/server/go.mod @@ -0,0 +1,5 @@ +module golang.source-fellows.com/samples/jwt/server + +go 1.14 + +require github.com/SermoDigital/jose v0.9.2-0.20161205224733-f6df55f235c2 diff --git a/microservices/jwt/server/go.sum b/microservices/jwt/server/go.sum new file mode 100644 index 0000000..68f3afd --- /dev/null +++ b/microservices/jwt/server/go.sum @@ -0,0 +1,2 @@ +github.com/SermoDigital/jose v0.9.2-0.20161205224733-f6df55f235c2 h1:koK7z0nSsRiRiBWwa+E714Puh+DO+ZRdIyAXiXzL+lg= +github.com/SermoDigital/jose v0.9.2-0.20161205224733-f6df55f235c2/go.mod h1:ARgCUhI1MHQH+ONky/PAtmVHQrP5JlGY0F3poXOp/fA= diff --git a/microservices/jwt/server/jwt/token.go b/microservices/jwt/server/jwt/token.go new file mode 100644 index 0000000..c897337 --- /dev/null +++ b/microservices/jwt/server/jwt/token.go @@ -0,0 +1,27 @@ +package jwt + +import ( + "time" + + "github.com/SermoDigital/jose/crypto" + "github.com/SermoDigital/jose/jws" +) + +var key = []byte("meinGeheimerSchlüssel") + +func CreateToken(user string) ([]byte, error) { + claims := jws.Claims{} + claims.SetAudience("source-fellows.com") + claims.SetIssuer(user) + claims.SetExpiration(time.Now().Add(time.Minute * 10)) + token := jws.NewJWT(claims, crypto.SigningMethodHS256) + return token.Serialize(key) +} + +func ValidateToken(token []byte) error { + newToken, err := jws.ParseJWT(token) + if err != nil { + return err + } + return newToken.Validate(key, crypto.SigningMethodHS256) +} diff --git a/microservices/jwt/server/main.go b/microservices/jwt/server/main.go new file mode 100644 index 0000000..95328d9 --- /dev/null +++ b/microservices/jwt/server/main.go @@ -0,0 +1,31 @@ +package main + +import ( + "log" + "net/http" + + "golang.source-fellows.com/samples/jwt/server/jwt" +) + +func handle(res http.ResponseWriter, req *http.Request) { + token, err := jwt.CreateToken() + if err != nil { + log.Fatal(err) + res.WriteHeader(http.StatusInternalServerError) + return + } + + err = jwt.ValidateToken(token) + if err != nil { + log.Fatal(err) + res.WriteHeader(http.StatusInternalServerError) + return + } + + res.Write(token) +} + +func main() { + http.HandleFunc("/", handle) + http.ListenAndServe(":8080", nil) +} diff --git a/microservices/letscrypt/go.mod b/microservices/letscrypt/go.mod new file mode 100644 index 0000000..0582dba --- /dev/null +++ b/microservices/letscrypt/go.mod @@ -0,0 +1,3 @@ +module golang.source-fellows.com/samples/https/letscrypt + +go 1.14 diff --git a/microservices/letscrypt/main.go b/microservices/letscrypt/main.go new file mode 100644 index 0000000..523c4a2 --- /dev/null +++ b/microservices/letscrypt/main.go @@ -0,0 +1,19 @@ +package main + +import ( + "fmt" + "log" + "net/http" + + "golang.org/x/crypto/acme/autocert" +) + +func main() { + + http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { + fmt.Fprintln(w, "Hello World") + }) + + log.Fatal(http.Serve(autocert.NewListener("x.source-fellows.com"), nil)) + +} diff --git a/microservices/logging/go.mod b/microservices/logging/go.mod new file mode 100644 index 0000000..3eaeb22 --- /dev/null +++ b/microservices/logging/go.mod @@ -0,0 +1,5 @@ +module golang.source-fellows.com/samples/logging + +go 1.13 + +require github.com/sirupsen/logrus v1.6.0 diff --git a/microservices/logging/go.sum b/microservices/logging/go.sum new file mode 100644 index 0000000..f42da32 --- /dev/null +++ b/microservices/logging/go.sum @@ -0,0 +1,12 @@ +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/konsorten/go-windows-terminal-sequences v1.0.3 h1:CE8S1cTafDpPvMhIxNJKvHsGVBgn1xWYf1NbHQhywc8= +github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +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/sirupsen/logrus v1.6.0 h1:UBcNElsrwanuuMsnGSlYmtmgbb23qDR5dG+6X6Oo89I= +github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= +github.com/stretchr/testify v1.2.2 h1:bSDNvY7ZPG5RlJ8otE/7V6gMiyenm9RtJ7IUVIAoJ1w= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +golang.org/x/sys v0.0.0-20190422165155-953cdadca894 h1:Cz4ceDQGXuKRnVBDTS23GTn/pU5OE2C0WrNTOYK1Uuc= +golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= diff --git a/microservices/logging/main.go b/microservices/logging/main.go new file mode 100644 index 0000000..80e13b2 --- /dev/null +++ b/microservices/logging/main.go @@ -0,0 +1,21 @@ +package main + +import ( + log "github.com/sirupsen/logrus" +) + +func main() { + // zusätzliche Felder an log.Entry anhängen + log.WithFields(log.Fields{ + "importId": "ka18s", + "size": 10, + }).Info("Starte den Import") + // Wiederverwenden von log.Entry damit alle weiteren + // Aufrufe ebenfalls Felder bekommen + contextLogger := log.WithFields(log.Fields{ + "importId": "0815s", + "other": "Ich werde geloggt", + }) + contextLogger.Info("I'll be logged with common and other field") + contextLogger.Info("Me too") +} diff --git a/microservices/middleware/go.mod b/microservices/middleware/go.mod new file mode 100644 index 0000000..92feb93 --- /dev/null +++ b/microservices/middleware/go.mod @@ -0,0 +1,3 @@ +module golang.source-fellows.com/samples/middleware + +go 1.14 diff --git a/microservices/middleware/main.go b/microservices/middleware/main.go new file mode 100644 index 0000000..64a32d1 --- /dev/null +++ b/microservices/middleware/main.go @@ -0,0 +1,28 @@ +package main + +import ( + "log" + "net/http" +) + +func businessLogic(text string) http.Handler { + myFunc := func(res http.ResponseWriter, req *http.Request) { + res.Write([]byte(text)) + } + return http.HandlerFunc(myFunc) +} + +func middleWare(wrapped http.Handler) http.Handler { + return http.HandlerFunc(func(re http.ResponseWriter, rq *http.Request) { + log.Println("before request") + wrapped.ServeHTTP(re, rq) + log.Println("after request") + }) +} + +func main() { + http.Handle("/", middleWare(businessLogic("Hello World"))) + if err := http.ListenAndServe(":8080", nil); err != nil { + log.Printf("error with server %v", err) + } +} diff --git a/microservices/mongodb-update/docker-compose.yml b/microservices/mongodb-update/docker-compose.yml new file mode 100644 index 0000000..ff8210a --- /dev/null +++ b/microservices/mongodb-update/docker-compose.yml @@ -0,0 +1,19 @@ +version: '3' +services: + mongodb: + image: 'mongo' + container_name: 'mongo-container' + environment: + - MONGO_INITDB_DATABASE=mongodb + - MONGO_INITDB_ROOT_USERNAME=mongorootuser + - MONGO_INITDB_ROOT_PASSWORD=mongorootpw + ports: + - '27017-27019:27017-27019' + mongo-express: + image: mongo-express + environment: + - ME_CONFIG_MONGODB_SERVER=mongodb + - ME_CONFIG_MONGODB_ADMINUSERNAME=mongorootuser + - ME_CONFIG_MONGODB_ADMINPASSWORD=mongorootpw + ports: + - 8081:8081 \ No newline at end of file diff --git a/microservices/mongodb-update/go.mod b/microservices/mongodb-update/go.mod new file mode 100644 index 0000000..60fe878 --- /dev/null +++ b/microservices/mongodb-update/go.mod @@ -0,0 +1,5 @@ +module golang.source-fellows.com/samples/mongodb + +go 1.14 + +require go.mongodb.org/mongo-driver v1.3.5 // indirect diff --git a/microservices/mongodb-update/go.sum b/microservices/mongodb-update/go.sum new file mode 100644 index 0000000..9c69671 --- /dev/null +++ b/microservices/mongodb-update/go.sum @@ -0,0 +1,100 @@ +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk= +github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/gobuffalo/attrs v0.0.0-20190224210810-a9411de4debd/go.mod h1:4duuawTqi2wkkpB4ePgWMaai6/Kc6WEz83bhFwpHzj0= +github.com/gobuffalo/depgen v0.0.0-20190329151759-d478694a28d3/go.mod h1:3STtPUQYuzV0gBVOY3vy6CfMm/ljR4pABfrTeHNLHUY= +github.com/gobuffalo/depgen v0.1.0/go.mod h1:+ifsuy7fhi15RWncXQQKjWS9JPkdah5sZvtHc2RXGlg= +github.com/gobuffalo/envy v1.6.15/go.mod h1:n7DRkBerg/aorDM8kbduw5dN3oXGswK5liaSCx4T5NI= +github.com/gobuffalo/envy v1.7.0/go.mod h1:n7DRkBerg/aorDM8kbduw5dN3oXGswK5liaSCx4T5NI= +github.com/gobuffalo/flect v0.1.0/go.mod h1:d2ehjJqGOH/Kjqcoz+F7jHTBbmDb38yXA598Hb50EGs= +github.com/gobuffalo/flect v0.1.1/go.mod h1:8JCgGVbRjJhVgD6399mQr4fx5rRfGKVzFjbj6RE/9UI= +github.com/gobuffalo/flect v0.1.3/go.mod h1:8JCgGVbRjJhVgD6399mQr4fx5rRfGKVzFjbj6RE/9UI= +github.com/gobuffalo/genny v0.0.0-20190329151137-27723ad26ef9/go.mod h1:rWs4Z12d1Zbf19rlsn0nurr75KqhYp52EAGGxTbBhNk= +github.com/gobuffalo/genny v0.0.0-20190403191548-3ca520ef0d9e/go.mod h1:80lIj3kVJWwOrXWWMRzzdhW3DsrdjILVil/SFKBzF28= +github.com/gobuffalo/genny v0.1.0/go.mod h1:XidbUqzak3lHdS//TPu2OgiFB+51Ur5f7CSnXZ/JDvo= +github.com/gobuffalo/genny v0.1.1/go.mod h1:5TExbEyY48pfunL4QSXxlDOmdsD44RRq4mVZ0Ex28Xk= +github.com/gobuffalo/gitgen v0.0.0-20190315122116-cc086187d211/go.mod h1:vEHJk/E9DmhejeLeNt7UVvlSGv3ziL+djtTr3yyzcOw= +github.com/gobuffalo/gogen v0.0.0-20190315121717-8f38393713f5/go.mod h1:V9QVDIxsgKNZs6L2IYiGR8datgMhB577vzTDqypH360= +github.com/gobuffalo/gogen v0.1.0/go.mod h1:8NTelM5qd8RZ15VjQTFkAW6qOMx5wBbW4dSCS3BY8gg= +github.com/gobuffalo/gogen v0.1.1/go.mod h1:y8iBtmHmGc4qa3urIyo1shvOD8JftTtfcKi+71xfDNE= +github.com/gobuffalo/logger v0.0.0-20190315122211-86e12af44bc2/go.mod h1:QdxcLw541hSGtBnhUc4gaNIXRjiDppFGaDqzbrBd3v8= +github.com/gobuffalo/mapi v1.0.1/go.mod h1:4VAGh89y6rVOvm5A8fKFxYG+wIW6LO1FMTG9hnKStFc= +github.com/gobuffalo/mapi v1.0.2/go.mod h1:4VAGh89y6rVOvm5A8fKFxYG+wIW6LO1FMTG9hnKStFc= +github.com/gobuffalo/packd v0.0.0-20190315124812-a385830c7fc0/go.mod h1:M2Juc+hhDXf/PnmBANFCqx4DM3wRbgDvnVWeG2RIxq4= +github.com/gobuffalo/packd v0.1.0/go.mod h1:M2Juc+hhDXf/PnmBANFCqx4DM3wRbgDvnVWeG2RIxq4= +github.com/gobuffalo/packr/v2 v2.0.9/go.mod h1:emmyGweYTm6Kdper+iywB6YK5YzuKchGtJQZ0Odn4pQ= +github.com/gobuffalo/packr/v2 v2.2.0/go.mod h1:CaAwI0GPIAv+5wKLtv8Afwl+Cm78K/I/VCm/3ptBN+0= +github.com/gobuffalo/syncx v0.0.0-20190224160051-33c29581e754/go.mod h1:HhnNqWY95UYwwW3uSASeV7vtgYkT2t16hJgV3AEPUpw= +github.com/golang/snappy v0.0.1 h1:Qgr9rKW7uDUkrbSmQeiDsGa8SjGyCOGtuasMWwvp2P4= +github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= +github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg= +github.com/karrick/godirwalk v1.8.0/go.mod h1:H5KPZjojv4lE+QYImBI8xVtrBRgYrIVsaRPx4tDPEn4= +github.com/karrick/godirwalk v1.10.3/go.mod h1:RoGL9dQei4vP9ilrpETWE8CLOZ1kiN0LhBygSwrAsHA= +github.com/klauspost/compress v1.9.5 h1:U+CaK85mrNNb4k8BNOfgJtJ/gr6kswUCFj6miSzVC6M= +github.com/klauspost/compress v1.9.5/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= +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/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +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/markbates/oncer v0.0.0-20181203154359-bf2de49a0be2/go.mod h1:Ld9puTsIW75CHf65OeIOkyKbteujpZVXDpWK6YGZbxE= +github.com/markbates/safe v1.0.1/go.mod h1:nAqgmRi7cY2nqMc92/bSEeQA+R4OheNU2T1kNSCBdG0= +github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= +github.com/pelletier/go-toml v1.4.0/go.mod h1:PN7xzY2wHTK0K9p34ErDQMlFxa51Fk0OUruD3k1mMwo= +github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/rogpeppe/go-internal v1.1.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rogpeppe/go-internal v1.2.2/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/sirupsen/logrus v1.4.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/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= +github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +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/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= +github.com/xdg/scram v0.0.0-20180814205039-7eeb5667e42c h1:u40Z8hqBAAQyv+vATcGgV0YCnDjqSL7/q/JyPhhJSPk= +github.com/xdg/scram v0.0.0-20180814205039-7eeb5667e42c/go.mod h1:lB8K/P019DLNhemzwFU4jHLhdvlE6uDZjXFejJXr49I= +github.com/xdg/stringprep v0.0.0-20180714160509-73f8eece6fdc h1:n+nNi93yXLkJvKwXNP9d55HC7lGK4H/SRcwB5IaUZLo= +github.com/xdg/stringprep v0.0.0-20180714160509-73f8eece6fdc/go.mod h1:Jhud4/sHMO4oL310DaZAKk9ZaJ08SJfe+sJh0HrGL1Y= +go.mongodb.org/mongo-driver v1.3.5 h1:S0ZOruh4YGHjD7JoN7mIsTrNjnQbOjrmgrx6l6pZN7I= +go.mongodb.org/mongo-driver v1.3.5/go.mod h1:Ual6Gkco7ZGQw8wE1t4tLnvBsf6yVSM60qW6TgOeJ5c= +golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/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-20190422162423-af44ce270edf/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE= +golang.org/x/crypto v0.0.0-20190530122614-20be4c3c3ed5 h1:8dUaAV7K4uHsF56JQWkprecIQKdPHtR9jCHF5nB8uzc= +golang.org/x/crypto v0.0.0-20190530122614-20be4c3c3ed5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +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/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190412183630-56d357773e84/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58 h1:8gQV6CLnAEikrhgkHFbMAEhagSSnXWGV915qUMm9mrU= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/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-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-20190419153524-e8e3143a4f4a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190531175056-4c3a928424d2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3 h1:cokOdA+Jmi5PJGXLlLllQSgYigAEfHXJAERHVMaCc2k= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190329151228-23e29df326fe/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190416151739-9c9e1878f421/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190420181800-aa740d480789/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190531172133-b3315ee88b7d/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +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/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= diff --git a/microservices/mongodb-update/main.go b/microservices/mongodb-update/main.go new file mode 100644 index 0000000..519a5be --- /dev/null +++ b/microservices/mongodb-update/main.go @@ -0,0 +1,84 @@ +package main + +import ( + "context" + "fmt" + "time" + + "go.mongodb.org/mongo-driver/bson" + "go.mongodb.org/mongo-driver/mongo" + "go.mongodb.org/mongo-driver/mongo/options" + "go.mongodb.org/mongo-driver/mongo/readpref" +) + +type Customer struct { + FirstName string + LastName string + CreditCard CreditCard +} + +type CreditCard struct { + Number string +} + +func main() { + client, err := mongo.NewClient( + options.Client(). + ApplyURI("mongodb://mongorootuser:mongorootpw@localhost:27017")) + if err != nil { + panic(err) + } + ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second) + defer cancel() + err = client.Connect(ctx) + if err != nil { + panic(err) + } + defer func() { + if err = client.Disconnect(ctx); err != nil { + panic(err) + } + }() + err = client.Ping(ctx, readpref.Primary()) + if err != nil { + panic(err) + } + + collection := client.Database("shop").Collection("customer") + customer := Customer{FirstName: "Hans", LastName: "wurst"} + customer.CreditCard = CreditCard{Number: "123-123-123"} + collection.InsertOne(ctx, customer) + + cursor, err := collection.Find(ctx, bson.D{{"firstname", "Hans"}}) + if err != nil { + panic(err) + } + defer cursor.Close(ctx) + + for cursor.Next(ctx) { + var result bson.M + err := cursor.Decode(&result) + if err != nil { + panic(err) + } + fmt.Printf("result is %v\n", result) + } + if err := cursor.Err(); err != nil { + panic(err) + } + + filter := bson.D{{"firstname", "Hans"}} + updated := bson.M{ + "$set": Customer{FirstName: "Peter", LastName: "Lustig"}, + } + + res, err := collection.UpdateOne(ctx, filter, updated) + if err != nil { + panic(err) + } + fmt.Println(res.MatchedCount) + + collection.FindOneAndUpdate(ctx, filter, updated) + collection.FindOneAndDelete(ctx, filter) + +} diff --git a/microservices/mongodb/docker-compose.yml b/microservices/mongodb/docker-compose.yml new file mode 100644 index 0000000..ff8210a --- /dev/null +++ b/microservices/mongodb/docker-compose.yml @@ -0,0 +1,19 @@ +version: '3' +services: + mongodb: + image: 'mongo' + container_name: 'mongo-container' + environment: + - MONGO_INITDB_DATABASE=mongodb + - MONGO_INITDB_ROOT_USERNAME=mongorootuser + - MONGO_INITDB_ROOT_PASSWORD=mongorootpw + ports: + - '27017-27019:27017-27019' + mongo-express: + image: mongo-express + environment: + - ME_CONFIG_MONGODB_SERVER=mongodb + - ME_CONFIG_MONGODB_ADMINUSERNAME=mongorootuser + - ME_CONFIG_MONGODB_ADMINPASSWORD=mongorootpw + ports: + - 8081:8081 \ No newline at end of file diff --git a/microservices/mongodb/go.mod b/microservices/mongodb/go.mod new file mode 100644 index 0000000..60fe878 --- /dev/null +++ b/microservices/mongodb/go.mod @@ -0,0 +1,5 @@ +module golang.source-fellows.com/samples/mongodb + +go 1.14 + +require go.mongodb.org/mongo-driver v1.3.5 // indirect diff --git a/microservices/mongodb/go.sum b/microservices/mongodb/go.sum new file mode 100644 index 0000000..9c69671 --- /dev/null +++ b/microservices/mongodb/go.sum @@ -0,0 +1,100 @@ +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk= +github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/gobuffalo/attrs v0.0.0-20190224210810-a9411de4debd/go.mod h1:4duuawTqi2wkkpB4ePgWMaai6/Kc6WEz83bhFwpHzj0= +github.com/gobuffalo/depgen v0.0.0-20190329151759-d478694a28d3/go.mod h1:3STtPUQYuzV0gBVOY3vy6CfMm/ljR4pABfrTeHNLHUY= +github.com/gobuffalo/depgen v0.1.0/go.mod h1:+ifsuy7fhi15RWncXQQKjWS9JPkdah5sZvtHc2RXGlg= +github.com/gobuffalo/envy v1.6.15/go.mod h1:n7DRkBerg/aorDM8kbduw5dN3oXGswK5liaSCx4T5NI= +github.com/gobuffalo/envy v1.7.0/go.mod h1:n7DRkBerg/aorDM8kbduw5dN3oXGswK5liaSCx4T5NI= +github.com/gobuffalo/flect v0.1.0/go.mod h1:d2ehjJqGOH/Kjqcoz+F7jHTBbmDb38yXA598Hb50EGs= +github.com/gobuffalo/flect v0.1.1/go.mod h1:8JCgGVbRjJhVgD6399mQr4fx5rRfGKVzFjbj6RE/9UI= +github.com/gobuffalo/flect v0.1.3/go.mod h1:8JCgGVbRjJhVgD6399mQr4fx5rRfGKVzFjbj6RE/9UI= +github.com/gobuffalo/genny v0.0.0-20190329151137-27723ad26ef9/go.mod h1:rWs4Z12d1Zbf19rlsn0nurr75KqhYp52EAGGxTbBhNk= +github.com/gobuffalo/genny v0.0.0-20190403191548-3ca520ef0d9e/go.mod h1:80lIj3kVJWwOrXWWMRzzdhW3DsrdjILVil/SFKBzF28= +github.com/gobuffalo/genny v0.1.0/go.mod h1:XidbUqzak3lHdS//TPu2OgiFB+51Ur5f7CSnXZ/JDvo= +github.com/gobuffalo/genny v0.1.1/go.mod h1:5TExbEyY48pfunL4QSXxlDOmdsD44RRq4mVZ0Ex28Xk= +github.com/gobuffalo/gitgen v0.0.0-20190315122116-cc086187d211/go.mod h1:vEHJk/E9DmhejeLeNt7UVvlSGv3ziL+djtTr3yyzcOw= +github.com/gobuffalo/gogen v0.0.0-20190315121717-8f38393713f5/go.mod h1:V9QVDIxsgKNZs6L2IYiGR8datgMhB577vzTDqypH360= +github.com/gobuffalo/gogen v0.1.0/go.mod h1:8NTelM5qd8RZ15VjQTFkAW6qOMx5wBbW4dSCS3BY8gg= +github.com/gobuffalo/gogen v0.1.1/go.mod h1:y8iBtmHmGc4qa3urIyo1shvOD8JftTtfcKi+71xfDNE= +github.com/gobuffalo/logger v0.0.0-20190315122211-86e12af44bc2/go.mod h1:QdxcLw541hSGtBnhUc4gaNIXRjiDppFGaDqzbrBd3v8= +github.com/gobuffalo/mapi v1.0.1/go.mod h1:4VAGh89y6rVOvm5A8fKFxYG+wIW6LO1FMTG9hnKStFc= +github.com/gobuffalo/mapi v1.0.2/go.mod h1:4VAGh89y6rVOvm5A8fKFxYG+wIW6LO1FMTG9hnKStFc= +github.com/gobuffalo/packd v0.0.0-20190315124812-a385830c7fc0/go.mod h1:M2Juc+hhDXf/PnmBANFCqx4DM3wRbgDvnVWeG2RIxq4= +github.com/gobuffalo/packd v0.1.0/go.mod h1:M2Juc+hhDXf/PnmBANFCqx4DM3wRbgDvnVWeG2RIxq4= +github.com/gobuffalo/packr/v2 v2.0.9/go.mod h1:emmyGweYTm6Kdper+iywB6YK5YzuKchGtJQZ0Odn4pQ= +github.com/gobuffalo/packr/v2 v2.2.0/go.mod h1:CaAwI0GPIAv+5wKLtv8Afwl+Cm78K/I/VCm/3ptBN+0= +github.com/gobuffalo/syncx v0.0.0-20190224160051-33c29581e754/go.mod h1:HhnNqWY95UYwwW3uSASeV7vtgYkT2t16hJgV3AEPUpw= +github.com/golang/snappy v0.0.1 h1:Qgr9rKW7uDUkrbSmQeiDsGa8SjGyCOGtuasMWwvp2P4= +github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= +github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg= +github.com/karrick/godirwalk v1.8.0/go.mod h1:H5KPZjojv4lE+QYImBI8xVtrBRgYrIVsaRPx4tDPEn4= +github.com/karrick/godirwalk v1.10.3/go.mod h1:RoGL9dQei4vP9ilrpETWE8CLOZ1kiN0LhBygSwrAsHA= +github.com/klauspost/compress v1.9.5 h1:U+CaK85mrNNb4k8BNOfgJtJ/gr6kswUCFj6miSzVC6M= +github.com/klauspost/compress v1.9.5/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= +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/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +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/markbates/oncer v0.0.0-20181203154359-bf2de49a0be2/go.mod h1:Ld9puTsIW75CHf65OeIOkyKbteujpZVXDpWK6YGZbxE= +github.com/markbates/safe v1.0.1/go.mod h1:nAqgmRi7cY2nqMc92/bSEeQA+R4OheNU2T1kNSCBdG0= +github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= +github.com/pelletier/go-toml v1.4.0/go.mod h1:PN7xzY2wHTK0K9p34ErDQMlFxa51Fk0OUruD3k1mMwo= +github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/rogpeppe/go-internal v1.1.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rogpeppe/go-internal v1.2.2/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/sirupsen/logrus v1.4.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/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= +github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +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/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= +github.com/xdg/scram v0.0.0-20180814205039-7eeb5667e42c h1:u40Z8hqBAAQyv+vATcGgV0YCnDjqSL7/q/JyPhhJSPk= +github.com/xdg/scram v0.0.0-20180814205039-7eeb5667e42c/go.mod h1:lB8K/P019DLNhemzwFU4jHLhdvlE6uDZjXFejJXr49I= +github.com/xdg/stringprep v0.0.0-20180714160509-73f8eece6fdc h1:n+nNi93yXLkJvKwXNP9d55HC7lGK4H/SRcwB5IaUZLo= +github.com/xdg/stringprep v0.0.0-20180714160509-73f8eece6fdc/go.mod h1:Jhud4/sHMO4oL310DaZAKk9ZaJ08SJfe+sJh0HrGL1Y= +go.mongodb.org/mongo-driver v1.3.5 h1:S0ZOruh4YGHjD7JoN7mIsTrNjnQbOjrmgrx6l6pZN7I= +go.mongodb.org/mongo-driver v1.3.5/go.mod h1:Ual6Gkco7ZGQw8wE1t4tLnvBsf6yVSM60qW6TgOeJ5c= +golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/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-20190422162423-af44ce270edf/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE= +golang.org/x/crypto v0.0.0-20190530122614-20be4c3c3ed5 h1:8dUaAV7K4uHsF56JQWkprecIQKdPHtR9jCHF5nB8uzc= +golang.org/x/crypto v0.0.0-20190530122614-20be4c3c3ed5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +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/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190412183630-56d357773e84/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58 h1:8gQV6CLnAEikrhgkHFbMAEhagSSnXWGV915qUMm9mrU= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/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-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-20190419153524-e8e3143a4f4a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190531175056-4c3a928424d2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3 h1:cokOdA+Jmi5PJGXLlLllQSgYigAEfHXJAERHVMaCc2k= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190329151228-23e29df326fe/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190416151739-9c9e1878f421/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190420181800-aa740d480789/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190531172133-b3315ee88b7d/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +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/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= diff --git a/microservices/mongodb/main.go b/microservices/mongodb/main.go new file mode 100644 index 0000000..759884d --- /dev/null +++ b/microservices/mongodb/main.go @@ -0,0 +1,70 @@ +package main + +import ( + "context" + "fmt" + "time" + + "go.mongodb.org/mongo-driver/bson" + "go.mongodb.org/mongo-driver/mongo" + "go.mongodb.org/mongo-driver/mongo/options" + "go.mongodb.org/mongo-driver/mongo/readpref" +) + +type Customer struct { + FirstName string + LastName string + CreditCard CreditCard +} + +type CreditCard struct { + Number string +} + +func main() { + client, err := mongo.NewClient( + options.Client(). + ApplyURI("mongodb://mongorootuser:mongorootpw@localhost:27017")) + if err != nil { + panic(err) + } + ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second) + defer cancel() + err = client.Connect(ctx) + if err != nil { + panic(err) + } + defer func() { + if err = client.Disconnect(ctx); err != nil { + panic(err) + } + }() + err = client.Ping(ctx, readpref.Primary()) + if err != nil { + panic(err) + } + + collection := client.Database("shop").Collection("customer") + customer := Customer{FirstName: "Hans", LastName: "wurst"} + customer.CreditCard = CreditCard{Number: "123-123-123"} + collection.InsertOne(ctx, customer) + + cursor, err := collection.Find(ctx, bson.D{{"firstname", "Hans"}}) + if err != nil { + panic(err) + } + defer cursor.Close(ctx) + + for cursor.Next(ctx) { + var result bson.M + err := cursor.Decode(&result) + if err != nil { + panic(err) + } + fmt.Printf("result is %v\n", result) + } + if err := cursor.Err(); err != nil { + panic(err) + } + +} diff --git a/microservices/nats/receiver/cmd/main.go b/microservices/nats/receiver/cmd/main.go new file mode 100644 index 0000000..1b92371 --- /dev/null +++ b/microservices/nats/receiver/cmd/main.go @@ -0,0 +1,29 @@ +package main + +import ( + "log" + "time" + + "github.com/nats-io/nats.go" +) + +func main() { + nc, err := nats.Connect(nats.DefaultURL) + if err != nil { + log.Fatalf("Could not connect to server because of %v", err) + } + defer nc.Close() + sub, err := nc.SubscribeSync("foo") + if err != nil { + log.Fatalf("Could not subscribe because of %v", err) + } + m, err := sub.NextMsg(20 * time.Second) + if m == nil { + log.Println("No messages available") + return + } + log.Println(m.Subject) + log.Println(string(m.Data)) + sub.Unsubscribe() + sub.Drain() +} diff --git a/microservices/nats/receiver/go.mod b/microservices/nats/receiver/go.mod new file mode 100644 index 0000000..8a26e90 --- /dev/null +++ b/microservices/nats/receiver/go.mod @@ -0,0 +1,5 @@ +module golang.source-fellows.com/nats/receiver + +go 1.14 + +require github.com/nats-io/nats.go v1.10.0 diff --git a/microservices/nats/receiver/go.sum b/microservices/nats/receiver/go.sum new file mode 100644 index 0000000..3dd11f0 --- /dev/null +++ b/microservices/nats/receiver/go.sum @@ -0,0 +1,17 @@ +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.go v1.10.0 h1:L8qnKaofSfNFbXg0C5F71LdjPRnmQwSsA4ukmkt1TvY= +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= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200323165209-0ec3e9974c59 h1:3zb4D3T4G8jdExgVU/95+vQXfpEPiMdCaZgmGVxjNHM= +golang.org/x/crypto v0.0.0-20200323165209-0ec3e9974c59/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= diff --git a/microservices/nats/sender/cmd/main.go b/microservices/nats/sender/cmd/main.go new file mode 100644 index 0000000..8a1571e --- /dev/null +++ b/microservices/nats/sender/cmd/main.go @@ -0,0 +1,19 @@ +package main + +import ( + "log" + + "github.com/nats-io/nats.go" +) + +func main() { + nc, err := nats.Connect(nats.DefaultURL) + + if err != nil { + log.Fatalf("Could not connect to server because of %v", err) + } + defer nc.Close() + + nc.Publish("foo", []byte("Hello World")) + +} diff --git a/microservices/nats/sender/go.mod b/microservices/nats/sender/go.mod new file mode 100644 index 0000000..51e7319 --- /dev/null +++ b/microservices/nats/sender/go.mod @@ -0,0 +1,5 @@ +module golang.source-fellows.com/nats/sender + +go 1.14 + +require github.com/nats-io/nats.go v1.10.0 // indirect diff --git a/microservices/nats/sender/go.sum b/microservices/nats/sender/go.sum new file mode 100644 index 0000000..3dd11f0 --- /dev/null +++ b/microservices/nats/sender/go.sum @@ -0,0 +1,17 @@ +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.go v1.10.0 h1:L8qnKaofSfNFbXg0C5F71LdjPRnmQwSsA4ukmkt1TvY= +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= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200323165209-0ec3e9974c59 h1:3zb4D3T4G8jdExgVU/95+vQXfpEPiMdCaZgmGVxjNHM= +golang.org/x/crypto v0.0.0-20200323165209-0ec3e9974c59/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= diff --git a/microservices/oracle-db-connection-prepared-statement/.devcontainer/Dockerfile b/microservices/oracle-db-connection-prepared-statement/.devcontainer/Dockerfile new file mode 100644 index 0000000..4190530 --- /dev/null +++ b/microservices/oracle-db-connection-prepared-statement/.devcontainer/Dockerfile @@ -0,0 +1,90 @@ +#------------------------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See https://go.microsoft.com/fwlink/?linkid=2090316 for license information. +#------------------------------------------------------------------------------------------------------------- + +FROM golang:1 + +# This Dockerfile adds a non-root user with sudo access. Use the "remoteUser" +# property in devcontainer.json to use it. On Linux, the container user's GID/UIDs +# will be updated to match your local UID/GID (when using the dockerFile property). +# See https://aka.ms/vscode-remote/containers/non-root-user for details. +ARG USERNAME=vscode +ARG USER_UID=1000 +ARG USER_GID=$USER_UID + +# Configure apt, install packages and tools +RUN apt-get update \ + && export DEBIAN_FRONTEND=noninteractive \ + && apt-get -y install --no-install-recommends apt-utils dialog 2>&1 \ + # + # Verify git, process tools, lsb-release (common in install instructions for CLIs) installed + && apt-get -y install git openssh-client less iproute2 procps lsb-release \ + # + # Build Go tools w/module support + && mkdir -p /tmp/gotools \ + && cd /tmp/gotools \ + && GOPATH=/tmp/gotools GO111MODULE=on go get -v golang.org/x/tools/gopls@latest 2>&1 \ + && GOPATH=/tmp/gotools GO111MODULE=on go get -v \ + honnef.co/go/tools/...@latest \ + golang.org/x/tools/cmd/gorename@latest \ + golang.org/x/tools/cmd/goimports@latest \ + golang.org/x/tools/cmd/guru@latest \ + golang.org/x/lint/golint@latest \ + github.com/mdempsky/gocode@latest \ + github.com/cweill/gotests/...@latest \ + github.com/haya14busa/goplay/cmd/goplay@latest \ + github.com/sqs/goreturns@latest \ + github.com/josharian/impl@latest \ + github.com/davidrjenni/reftools/cmd/fillstruct@latest \ + github.com/uudashr/gopkgs/v2/cmd/gopkgs@latest \ + github.com/ramya-rao-a/go-outline@latest \ + github.com/acroca/go-symbols@latest \ + github.com/godoctor/godoctor@latest \ + github.com/rogpeppe/godef@latest \ + github.com/zmb3/gogetdoc@latest \ + github.com/fatih/gomodifytags@latest \ + github.com/mgechev/revive@latest \ + github.com/go-delve/delve/cmd/dlv@latest 2>&1 \ + # + # Build Go tools w/o module support + && GOPATH=/tmp/gotools go get -v github.com/alecthomas/gometalinter 2>&1 \ + # + # Build gocode-gomod + && GOPATH=/tmp/gotools go get -x -d github.com/stamblerre/gocode 2>&1 \ + && GOPATH=/tmp/gotools go build -o gocode-gomod github.com/stamblerre/gocode \ + # + # Install Go tools + && mv /tmp/gotools/bin/* /usr/local/bin/ \ + && mv gocode-gomod /usr/local/bin/ \ + # + # Install golangci-lint + && curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b /usr/local/bin 2>&1 \ + # + # Create a non-root user to use if preferred - see https://aka.ms/vscode-remote/containers/non-root-user. + && groupadd --gid $USER_GID $USERNAME \ + && useradd -s /bin/bash --uid $USER_UID --gid $USER_GID -m $USERNAME \ + # [Optional] Add sudo support + && apt-get install -y sudo \ + && echo $USERNAME ALL=\(root\) NOPASSWD:ALL > /etc/sudoers.d/$USERNAME \ + && chmod 0440 /etc/sudoers.d/$USERNAME \ + # + # Clean up + && apt-get autoremove -y \ + && apt-get clean -y \ + && rm -rf /var/lib/apt/lists/* /tmp/gotools + +# Update this to "on" or "off" as appropriate +ENV GO111MODULE=auto + +#Install Oracle Client +RUN apt-get update &&\ + apt-get -y install unzip libaio1 && \ + mkdir /opt/oracle &&\ + curl -o /opt/oracle/oracle.zip https://download.oracle.com/otn_software/linux/instantclient/19600/instantclient-basiclite-linux.x64-19.6.0.0.0dbru.zip &&\ + cd /opt/oracle &&\ + unzip oracle.zip &&\ + rm oracle.zip + +ENV LD_LIBRARY_PATH=/opt/oracle/instantclient_19_6:$LD_LIBRARY_PATH + diff --git a/microservices/oracle-db-connection-prepared-statement/.devcontainer/devcontainer.json b/microservices/oracle-db-connection-prepared-statement/.devcontainer/devcontainer.json new file mode 100644 index 0000000..faba3ff --- /dev/null +++ b/microservices/oracle-db-connection-prepared-statement/.devcontainer/devcontainer.json @@ -0,0 +1,27 @@ +// For format details, see https://aka.ms/vscode-remote/devcontainer.json or this file's README at: +// https://github.com/microsoft/vscode-dev-containers/tree/v0.122.1/containers/go +{ + "name": "Go", + "dockerFile": "Dockerfile", + "runArgs": [ "--cap-add=SYS_PTRACE", "--security-opt", "seccomp=unconfined" ], + + // Set *default* container specific settings.json values on container create. + "settings": { + "terminal.integrated.shell.linux": "/bin/bash", + "go.gopath": "/go" + }, + + // Add the IDs of extensions you want installed when the container is created. + "extensions": [ + "golang.Go" + ] + + // Use 'forwardPorts' to make a list of ports inside the container available locally. + // "forwardPorts": [], + + // Use 'postCreateCommand' to run commands after the container is created. + ,"postCreateCommand": "go get", + + // Uncomment to connect as a non-root user. See https://aka.ms/vscode-remote/containers/non-root. + // "remoteUser": "vscode" +} \ No newline at end of file diff --git a/microservices/oracle-db-connection-prepared-statement/go.mod b/microservices/oracle-db-connection-prepared-statement/go.mod new file mode 100644 index 0000000..aa16802 --- /dev/null +++ b/microservices/oracle-db-connection-prepared-statement/go.mod @@ -0,0 +1,5 @@ +module golang.source-fellows.com/samples/oracle + +go 1.14 + +require github.com/godror/godror v0.17.0 diff --git a/microservices/oracle-db-connection-prepared-statement/go.sum b/microservices/oracle-db-connection-prepared-statement/go.sum new file mode 100644 index 0000000..b224ccc --- /dev/null +++ b/microservices/oracle-db-connection-prepared-statement/go.sum @@ -0,0 +1,7 @@ +github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= +github.com/godror/godror v0.17.0 h1:ClVuKG0qCj6f182BruhwgHS8xCgfpQp35pTrefSq4NE= +github.com/godror/godror v0.17.0/go.mod h1:DE94Br7LXn4dQGCexePriVrKotR9GkVzPPT5nnm8dj0= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= diff --git a/microservices/oracle-db-connection-prepared-statement/main.go b/microservices/oracle-db-connection-prepared-statement/main.go new file mode 100644 index 0000000..03f2966 --- /dev/null +++ b/microservices/oracle-db-connection-prepared-statement/main.go @@ -0,0 +1,50 @@ +package main + +import ( + "database/sql" + "log" + "time" + + _ "github.com/godror/godror" +) + +type Angestellter struct { + id int + Name string + Einstellungsdatum time.Time +} + +func main() { + db, err := sql.Open("godror", "app/app@(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=tcp)(HOST=172.17.0.1)(PORT=1521)))(CONNECT_DATA=(SID=ORCLCDB)))") + if err != nil { + log.Fatal(err) + } + defer db.Close() + db.SetMaxIdleConns(0) + db.SetMaxOpenConns(100) + db.SetConnMaxLifetime(2 * time.Hour) + + stmt, err := db.Prepare("select EMPNO, ENAME, HIREDATE from EMP where EMPNO = :p") + if err != nil { + log.Fatalf("Fehler bei Query: %v", err) + } + defer stmt.Close() + rows, err := stmt.Query(sql.Named("p", 7499)) + if err != nil { + log.Fatal(err) + } + defer rows.Close() + + log.Println("retri") + + for rows.Next() { + angestellter := &Angestellter{} + err = rows.Scan(&angestellter.id, + &angestellter.Name, + &angestellter.Einstellungsdatum) + if err != nil { + log.Fatalf("Fehler beim Laden: %v", err) + } + log.Println(angestellter) + } +} diff --git a/microservices/oracle-db-connection-write-tx/.devcontainer/Dockerfile b/microservices/oracle-db-connection-write-tx/.devcontainer/Dockerfile new file mode 100644 index 0000000..4190530 --- /dev/null +++ b/microservices/oracle-db-connection-write-tx/.devcontainer/Dockerfile @@ -0,0 +1,90 @@ +#------------------------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See https://go.microsoft.com/fwlink/?linkid=2090316 for license information. +#------------------------------------------------------------------------------------------------------------- + +FROM golang:1 + +# This Dockerfile adds a non-root user with sudo access. Use the "remoteUser" +# property in devcontainer.json to use it. On Linux, the container user's GID/UIDs +# will be updated to match your local UID/GID (when using the dockerFile property). +# See https://aka.ms/vscode-remote/containers/non-root-user for details. +ARG USERNAME=vscode +ARG USER_UID=1000 +ARG USER_GID=$USER_UID + +# Configure apt, install packages and tools +RUN apt-get update \ + && export DEBIAN_FRONTEND=noninteractive \ + && apt-get -y install --no-install-recommends apt-utils dialog 2>&1 \ + # + # Verify git, process tools, lsb-release (common in install instructions for CLIs) installed + && apt-get -y install git openssh-client less iproute2 procps lsb-release \ + # + # Build Go tools w/module support + && mkdir -p /tmp/gotools \ + && cd /tmp/gotools \ + && GOPATH=/tmp/gotools GO111MODULE=on go get -v golang.org/x/tools/gopls@latest 2>&1 \ + && GOPATH=/tmp/gotools GO111MODULE=on go get -v \ + honnef.co/go/tools/...@latest \ + golang.org/x/tools/cmd/gorename@latest \ + golang.org/x/tools/cmd/goimports@latest \ + golang.org/x/tools/cmd/guru@latest \ + golang.org/x/lint/golint@latest \ + github.com/mdempsky/gocode@latest \ + github.com/cweill/gotests/...@latest \ + github.com/haya14busa/goplay/cmd/goplay@latest \ + github.com/sqs/goreturns@latest \ + github.com/josharian/impl@latest \ + github.com/davidrjenni/reftools/cmd/fillstruct@latest \ + github.com/uudashr/gopkgs/v2/cmd/gopkgs@latest \ + github.com/ramya-rao-a/go-outline@latest \ + github.com/acroca/go-symbols@latest \ + github.com/godoctor/godoctor@latest \ + github.com/rogpeppe/godef@latest \ + github.com/zmb3/gogetdoc@latest \ + github.com/fatih/gomodifytags@latest \ + github.com/mgechev/revive@latest \ + github.com/go-delve/delve/cmd/dlv@latest 2>&1 \ + # + # Build Go tools w/o module support + && GOPATH=/tmp/gotools go get -v github.com/alecthomas/gometalinter 2>&1 \ + # + # Build gocode-gomod + && GOPATH=/tmp/gotools go get -x -d github.com/stamblerre/gocode 2>&1 \ + && GOPATH=/tmp/gotools go build -o gocode-gomod github.com/stamblerre/gocode \ + # + # Install Go tools + && mv /tmp/gotools/bin/* /usr/local/bin/ \ + && mv gocode-gomod /usr/local/bin/ \ + # + # Install golangci-lint + && curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b /usr/local/bin 2>&1 \ + # + # Create a non-root user to use if preferred - see https://aka.ms/vscode-remote/containers/non-root-user. + && groupadd --gid $USER_GID $USERNAME \ + && useradd -s /bin/bash --uid $USER_UID --gid $USER_GID -m $USERNAME \ + # [Optional] Add sudo support + && apt-get install -y sudo \ + && echo $USERNAME ALL=\(root\) NOPASSWD:ALL > /etc/sudoers.d/$USERNAME \ + && chmod 0440 /etc/sudoers.d/$USERNAME \ + # + # Clean up + && apt-get autoremove -y \ + && apt-get clean -y \ + && rm -rf /var/lib/apt/lists/* /tmp/gotools + +# Update this to "on" or "off" as appropriate +ENV GO111MODULE=auto + +#Install Oracle Client +RUN apt-get update &&\ + apt-get -y install unzip libaio1 && \ + mkdir /opt/oracle &&\ + curl -o /opt/oracle/oracle.zip https://download.oracle.com/otn_software/linux/instantclient/19600/instantclient-basiclite-linux.x64-19.6.0.0.0dbru.zip &&\ + cd /opt/oracle &&\ + unzip oracle.zip &&\ + rm oracle.zip + +ENV LD_LIBRARY_PATH=/opt/oracle/instantclient_19_6:$LD_LIBRARY_PATH + diff --git a/microservices/oracle-db-connection-write-tx/.devcontainer/devcontainer.json b/microservices/oracle-db-connection-write-tx/.devcontainer/devcontainer.json new file mode 100644 index 0000000..faba3ff --- /dev/null +++ b/microservices/oracle-db-connection-write-tx/.devcontainer/devcontainer.json @@ -0,0 +1,27 @@ +// For format details, see https://aka.ms/vscode-remote/devcontainer.json or this file's README at: +// https://github.com/microsoft/vscode-dev-containers/tree/v0.122.1/containers/go +{ + "name": "Go", + "dockerFile": "Dockerfile", + "runArgs": [ "--cap-add=SYS_PTRACE", "--security-opt", "seccomp=unconfined" ], + + // Set *default* container specific settings.json values on container create. + "settings": { + "terminal.integrated.shell.linux": "/bin/bash", + "go.gopath": "/go" + }, + + // Add the IDs of extensions you want installed when the container is created. + "extensions": [ + "golang.Go" + ] + + // Use 'forwardPorts' to make a list of ports inside the container available locally. + // "forwardPorts": [], + + // Use 'postCreateCommand' to run commands after the container is created. + ,"postCreateCommand": "go get", + + // Uncomment to connect as a non-root user. See https://aka.ms/vscode-remote/containers/non-root. + // "remoteUser": "vscode" +} \ No newline at end of file diff --git a/microservices/oracle-db-connection-write-tx/go.mod b/microservices/oracle-db-connection-write-tx/go.mod new file mode 100644 index 0000000..aa16802 --- /dev/null +++ b/microservices/oracle-db-connection-write-tx/go.mod @@ -0,0 +1,5 @@ +module golang.source-fellows.com/samples/oracle + +go 1.14 + +require github.com/godror/godror v0.17.0 diff --git a/microservices/oracle-db-connection-write-tx/go.sum b/microservices/oracle-db-connection-write-tx/go.sum new file mode 100644 index 0000000..b224ccc --- /dev/null +++ b/microservices/oracle-db-connection-write-tx/go.sum @@ -0,0 +1,7 @@ +github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= +github.com/godror/godror v0.17.0 h1:ClVuKG0qCj6f182BruhwgHS8xCgfpQp35pTrefSq4NE= +github.com/godror/godror v0.17.0/go.mod h1:DE94Br7LXn4dQGCexePriVrKotR9GkVzPPT5nnm8dj0= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= diff --git a/microservices/oracle-db-connection-write-tx/main.go b/microservices/oracle-db-connection-write-tx/main.go new file mode 100644 index 0000000..86d7b47 --- /dev/null +++ b/microservices/oracle-db-connection-write-tx/main.go @@ -0,0 +1,45 @@ +package main + +import ( + "context" + "database/sql" + "log" + "time" + + _ "github.com/godror/godror" +) + +type Angestellter struct { + id int + Name string + Einstellungsdatum time.Time +} + +func main() { + db, err := sql.Open("godror", "app/app@(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=tcp)(HOST=172.17.0.1)(PORT=1521)))(CONNECT_DATA=(SID=ORCLCDB)))") + if err != nil { + log.Fatal(err) + } + db.SetMaxOpenConns(0) + db.SetMaxIdleConns(0) + defer db.Close() + + tx, err := db.BeginTx(context.Background(), &sql.TxOptions{Isolation: sql.LevelReadCommitted, ReadOnly: true}) + stmt, err := tx.Prepare("INSERT INTO EMP (EMPNO, ENAME, HIREDATE) VALUES(:id1, :name2, :date3)") + if err != nil { + log.Fatalf("Fehler bei Statement: %v", err) + } + for i := 10; i < 100; i++ { + _, err = stmt.Exec( + sql.Named("id1", i), + sql.Named("name2", "JOE"), + sql.Named("date3", time.Now())) + + if err != nil { + log.Fatalf("Fehler bei Exec: %v", err) + } + } + defer stmt.Close() + tx.Commit() + +} diff --git a/microservices/oracle-db-connection-write/.devcontainer/Dockerfile b/microservices/oracle-db-connection-write/.devcontainer/Dockerfile new file mode 100644 index 0000000..4190530 --- /dev/null +++ b/microservices/oracle-db-connection-write/.devcontainer/Dockerfile @@ -0,0 +1,90 @@ +#------------------------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See https://go.microsoft.com/fwlink/?linkid=2090316 for license information. +#------------------------------------------------------------------------------------------------------------- + +FROM golang:1 + +# This Dockerfile adds a non-root user with sudo access. Use the "remoteUser" +# property in devcontainer.json to use it. On Linux, the container user's GID/UIDs +# will be updated to match your local UID/GID (when using the dockerFile property). +# See https://aka.ms/vscode-remote/containers/non-root-user for details. +ARG USERNAME=vscode +ARG USER_UID=1000 +ARG USER_GID=$USER_UID + +# Configure apt, install packages and tools +RUN apt-get update \ + && export DEBIAN_FRONTEND=noninteractive \ + && apt-get -y install --no-install-recommends apt-utils dialog 2>&1 \ + # + # Verify git, process tools, lsb-release (common in install instructions for CLIs) installed + && apt-get -y install git openssh-client less iproute2 procps lsb-release \ + # + # Build Go tools w/module support + && mkdir -p /tmp/gotools \ + && cd /tmp/gotools \ + && GOPATH=/tmp/gotools GO111MODULE=on go get -v golang.org/x/tools/gopls@latest 2>&1 \ + && GOPATH=/tmp/gotools GO111MODULE=on go get -v \ + honnef.co/go/tools/...@latest \ + golang.org/x/tools/cmd/gorename@latest \ + golang.org/x/tools/cmd/goimports@latest \ + golang.org/x/tools/cmd/guru@latest \ + golang.org/x/lint/golint@latest \ + github.com/mdempsky/gocode@latest \ + github.com/cweill/gotests/...@latest \ + github.com/haya14busa/goplay/cmd/goplay@latest \ + github.com/sqs/goreturns@latest \ + github.com/josharian/impl@latest \ + github.com/davidrjenni/reftools/cmd/fillstruct@latest \ + github.com/uudashr/gopkgs/v2/cmd/gopkgs@latest \ + github.com/ramya-rao-a/go-outline@latest \ + github.com/acroca/go-symbols@latest \ + github.com/godoctor/godoctor@latest \ + github.com/rogpeppe/godef@latest \ + github.com/zmb3/gogetdoc@latest \ + github.com/fatih/gomodifytags@latest \ + github.com/mgechev/revive@latest \ + github.com/go-delve/delve/cmd/dlv@latest 2>&1 \ + # + # Build Go tools w/o module support + && GOPATH=/tmp/gotools go get -v github.com/alecthomas/gometalinter 2>&1 \ + # + # Build gocode-gomod + && GOPATH=/tmp/gotools go get -x -d github.com/stamblerre/gocode 2>&1 \ + && GOPATH=/tmp/gotools go build -o gocode-gomod github.com/stamblerre/gocode \ + # + # Install Go tools + && mv /tmp/gotools/bin/* /usr/local/bin/ \ + && mv gocode-gomod /usr/local/bin/ \ + # + # Install golangci-lint + && curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b /usr/local/bin 2>&1 \ + # + # Create a non-root user to use if preferred - see https://aka.ms/vscode-remote/containers/non-root-user. + && groupadd --gid $USER_GID $USERNAME \ + && useradd -s /bin/bash --uid $USER_UID --gid $USER_GID -m $USERNAME \ + # [Optional] Add sudo support + && apt-get install -y sudo \ + && echo $USERNAME ALL=\(root\) NOPASSWD:ALL > /etc/sudoers.d/$USERNAME \ + && chmod 0440 /etc/sudoers.d/$USERNAME \ + # + # Clean up + && apt-get autoremove -y \ + && apt-get clean -y \ + && rm -rf /var/lib/apt/lists/* /tmp/gotools + +# Update this to "on" or "off" as appropriate +ENV GO111MODULE=auto + +#Install Oracle Client +RUN apt-get update &&\ + apt-get -y install unzip libaio1 && \ + mkdir /opt/oracle &&\ + curl -o /opt/oracle/oracle.zip https://download.oracle.com/otn_software/linux/instantclient/19600/instantclient-basiclite-linux.x64-19.6.0.0.0dbru.zip &&\ + cd /opt/oracle &&\ + unzip oracle.zip &&\ + rm oracle.zip + +ENV LD_LIBRARY_PATH=/opt/oracle/instantclient_19_6:$LD_LIBRARY_PATH + diff --git a/microservices/oracle-db-connection-write/.devcontainer/devcontainer.json b/microservices/oracle-db-connection-write/.devcontainer/devcontainer.json new file mode 100644 index 0000000..faba3ff --- /dev/null +++ b/microservices/oracle-db-connection-write/.devcontainer/devcontainer.json @@ -0,0 +1,27 @@ +// For format details, see https://aka.ms/vscode-remote/devcontainer.json or this file's README at: +// https://github.com/microsoft/vscode-dev-containers/tree/v0.122.1/containers/go +{ + "name": "Go", + "dockerFile": "Dockerfile", + "runArgs": [ "--cap-add=SYS_PTRACE", "--security-opt", "seccomp=unconfined" ], + + // Set *default* container specific settings.json values on container create. + "settings": { + "terminal.integrated.shell.linux": "/bin/bash", + "go.gopath": "/go" + }, + + // Add the IDs of extensions you want installed when the container is created. + "extensions": [ + "golang.Go" + ] + + // Use 'forwardPorts' to make a list of ports inside the container available locally. + // "forwardPorts": [], + + // Use 'postCreateCommand' to run commands after the container is created. + ,"postCreateCommand": "go get", + + // Uncomment to connect as a non-root user. See https://aka.ms/vscode-remote/containers/non-root. + // "remoteUser": "vscode" +} \ No newline at end of file diff --git a/microservices/oracle-db-connection-write/go.mod b/microservices/oracle-db-connection-write/go.mod new file mode 100644 index 0000000..aa16802 --- /dev/null +++ b/microservices/oracle-db-connection-write/go.mod @@ -0,0 +1,5 @@ +module golang.source-fellows.com/samples/oracle + +go 1.14 + +require github.com/godror/godror v0.17.0 diff --git a/microservices/oracle-db-connection-write/go.sum b/microservices/oracle-db-connection-write/go.sum new file mode 100644 index 0000000..b224ccc --- /dev/null +++ b/microservices/oracle-db-connection-write/go.sum @@ -0,0 +1,7 @@ +github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= +github.com/godror/godror v0.17.0 h1:ClVuKG0qCj6f182BruhwgHS8xCgfpQp35pTrefSq4NE= +github.com/godror/godror v0.17.0/go.mod h1:DE94Br7LXn4dQGCexePriVrKotR9GkVzPPT5nnm8dj0= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= diff --git a/microservices/oracle-db-connection-write/main.go b/microservices/oracle-db-connection-write/main.go new file mode 100644 index 0000000..aba61b0 --- /dev/null +++ b/microservices/oracle-db-connection-write/main.go @@ -0,0 +1,48 @@ +package main + +import ( + "database/sql" + "log" + "time" + + _ "github.com/godror/godror" +) + +type Angestellter struct { + id int + Name string + Einstellungsdatum time.Time +} + +func main() { + db, err := sql.Open("godror", "app/app@(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=tcp)(HOST=172.17.0.1)(PORT=1521)))(CONNECT_DATA=(SID=ORCLCDB)))") + if err != nil { + log.Fatal(err) + } + db.SetMaxOpenConns(0) + db.SetMaxIdleConns(0) + defer db.Close() + res, err := db.Exec("INSERT INTO EMP (EMPNO, ENAME, HIREDATE) VALUES(:id1, :name1, :date1)", 1, "WURST", time.Now()) + if err != nil { + log.Fatalf("Fehler bei Exec: %v", err) + } + count, _ := res.RowsAffected() + log.Printf("Updated %v row", count) + + stmt, err := db.Prepare("INSERT INTO EMP (EMPNO, ENAME, HIREDATE) VALUES(:id1, :name2, :date3)") + if err != nil { + log.Fatalf("Fehler bei Statement: %v", err) + } + for i := 10; i < 100; i++ { + _, err = stmt.Exec( + sql.Named("id1", i), + sql.Named("name2", "JOE"), + sql.Named("date3", time.Now())) + + if err != nil { + log.Fatalf("Fehler bei Exec: %v", err) + } + } + defer stmt.Close() + +} diff --git a/microservices/oracle-db-connection/.devcontainer/Dockerfile b/microservices/oracle-db-connection/.devcontainer/Dockerfile new file mode 100644 index 0000000..4190530 --- /dev/null +++ b/microservices/oracle-db-connection/.devcontainer/Dockerfile @@ -0,0 +1,90 @@ +#------------------------------------------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See https://go.microsoft.com/fwlink/?linkid=2090316 for license information. +#------------------------------------------------------------------------------------------------------------- + +FROM golang:1 + +# This Dockerfile adds a non-root user with sudo access. Use the "remoteUser" +# property in devcontainer.json to use it. On Linux, the container user's GID/UIDs +# will be updated to match your local UID/GID (when using the dockerFile property). +# See https://aka.ms/vscode-remote/containers/non-root-user for details. +ARG USERNAME=vscode +ARG USER_UID=1000 +ARG USER_GID=$USER_UID + +# Configure apt, install packages and tools +RUN apt-get update \ + && export DEBIAN_FRONTEND=noninteractive \ + && apt-get -y install --no-install-recommends apt-utils dialog 2>&1 \ + # + # Verify git, process tools, lsb-release (common in install instructions for CLIs) installed + && apt-get -y install git openssh-client less iproute2 procps lsb-release \ + # + # Build Go tools w/module support + && mkdir -p /tmp/gotools \ + && cd /tmp/gotools \ + && GOPATH=/tmp/gotools GO111MODULE=on go get -v golang.org/x/tools/gopls@latest 2>&1 \ + && GOPATH=/tmp/gotools GO111MODULE=on go get -v \ + honnef.co/go/tools/...@latest \ + golang.org/x/tools/cmd/gorename@latest \ + golang.org/x/tools/cmd/goimports@latest \ + golang.org/x/tools/cmd/guru@latest \ + golang.org/x/lint/golint@latest \ + github.com/mdempsky/gocode@latest \ + github.com/cweill/gotests/...@latest \ + github.com/haya14busa/goplay/cmd/goplay@latest \ + github.com/sqs/goreturns@latest \ + github.com/josharian/impl@latest \ + github.com/davidrjenni/reftools/cmd/fillstruct@latest \ + github.com/uudashr/gopkgs/v2/cmd/gopkgs@latest \ + github.com/ramya-rao-a/go-outline@latest \ + github.com/acroca/go-symbols@latest \ + github.com/godoctor/godoctor@latest \ + github.com/rogpeppe/godef@latest \ + github.com/zmb3/gogetdoc@latest \ + github.com/fatih/gomodifytags@latest \ + github.com/mgechev/revive@latest \ + github.com/go-delve/delve/cmd/dlv@latest 2>&1 \ + # + # Build Go tools w/o module support + && GOPATH=/tmp/gotools go get -v github.com/alecthomas/gometalinter 2>&1 \ + # + # Build gocode-gomod + && GOPATH=/tmp/gotools go get -x -d github.com/stamblerre/gocode 2>&1 \ + && GOPATH=/tmp/gotools go build -o gocode-gomod github.com/stamblerre/gocode \ + # + # Install Go tools + && mv /tmp/gotools/bin/* /usr/local/bin/ \ + && mv gocode-gomod /usr/local/bin/ \ + # + # Install golangci-lint + && curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b /usr/local/bin 2>&1 \ + # + # Create a non-root user to use if preferred - see https://aka.ms/vscode-remote/containers/non-root-user. + && groupadd --gid $USER_GID $USERNAME \ + && useradd -s /bin/bash --uid $USER_UID --gid $USER_GID -m $USERNAME \ + # [Optional] Add sudo support + && apt-get install -y sudo \ + && echo $USERNAME ALL=\(root\) NOPASSWD:ALL > /etc/sudoers.d/$USERNAME \ + && chmod 0440 /etc/sudoers.d/$USERNAME \ + # + # Clean up + && apt-get autoremove -y \ + && apt-get clean -y \ + && rm -rf /var/lib/apt/lists/* /tmp/gotools + +# Update this to "on" or "off" as appropriate +ENV GO111MODULE=auto + +#Install Oracle Client +RUN apt-get update &&\ + apt-get -y install unzip libaio1 && \ + mkdir /opt/oracle &&\ + curl -o /opt/oracle/oracle.zip https://download.oracle.com/otn_software/linux/instantclient/19600/instantclient-basiclite-linux.x64-19.6.0.0.0dbru.zip &&\ + cd /opt/oracle &&\ + unzip oracle.zip &&\ + rm oracle.zip + +ENV LD_LIBRARY_PATH=/opt/oracle/instantclient_19_6:$LD_LIBRARY_PATH + diff --git a/microservices/oracle-db-connection/.devcontainer/devcontainer.json b/microservices/oracle-db-connection/.devcontainer/devcontainer.json new file mode 100644 index 0000000..faba3ff --- /dev/null +++ b/microservices/oracle-db-connection/.devcontainer/devcontainer.json @@ -0,0 +1,27 @@ +// For format details, see https://aka.ms/vscode-remote/devcontainer.json or this file's README at: +// https://github.com/microsoft/vscode-dev-containers/tree/v0.122.1/containers/go +{ + "name": "Go", + "dockerFile": "Dockerfile", + "runArgs": [ "--cap-add=SYS_PTRACE", "--security-opt", "seccomp=unconfined" ], + + // Set *default* container specific settings.json values on container create. + "settings": { + "terminal.integrated.shell.linux": "/bin/bash", + "go.gopath": "/go" + }, + + // Add the IDs of extensions you want installed when the container is created. + "extensions": [ + "golang.Go" + ] + + // Use 'forwardPorts' to make a list of ports inside the container available locally. + // "forwardPorts": [], + + // Use 'postCreateCommand' to run commands after the container is created. + ,"postCreateCommand": "go get", + + // Uncomment to connect as a non-root user. See https://aka.ms/vscode-remote/containers/non-root. + // "remoteUser": "vscode" +} \ No newline at end of file diff --git a/microservices/oracle-db-connection/go.mod b/microservices/oracle-db-connection/go.mod new file mode 100644 index 0000000..aa16802 --- /dev/null +++ b/microservices/oracle-db-connection/go.mod @@ -0,0 +1,5 @@ +module golang.source-fellows.com/samples/oracle + +go 1.14 + +require github.com/godror/godror v0.17.0 diff --git a/microservices/oracle-db-connection/go.sum b/microservices/oracle-db-connection/go.sum new file mode 100644 index 0000000..b224ccc --- /dev/null +++ b/microservices/oracle-db-connection/go.sum @@ -0,0 +1,7 @@ +github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= +github.com/godror/godror v0.17.0 h1:ClVuKG0qCj6f182BruhwgHS8xCgfpQp35pTrefSq4NE= +github.com/godror/godror v0.17.0/go.mod h1:DE94Br7LXn4dQGCexePriVrKotR9GkVzPPT5nnm8dj0= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= diff --git a/microservices/oracle-db-connection/main.go b/microservices/oracle-db-connection/main.go new file mode 100644 index 0000000..f8f00ca --- /dev/null +++ b/microservices/oracle-db-connection/main.go @@ -0,0 +1,38 @@ +package main + +import ( + "database/sql" + "log" + "time" + + _ "github.com/godror/godror" +) + +type Angestellter struct { + id int + Name string + Einstellungsdatum time.Time +} + +func main() { + db, err := sql.Open("godror", "app/app@(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=tcp)(HOST=172.17.0.1)(PORT=1521)))(CONNECT_DATA=(SID=ORCLCDB)))") + if err != nil { + log.Fatal(err) + } + defer db.Close() + rows, err := db.Query("select EMPNO, ENAME, HIREDATE from EMP where EMPNO = :0", 7499) + if err != nil { + log.Fatalf("Fehler bei Query: %v", err) + } + defer rows.Close() + for rows.Next() { + angestellter := &Angestellter{} + err = rows.Scan(&angestellter.id, + &angestellter.Name, + &angestellter.Einstellungsdatum) + if err != nil { + log.Fatalf("Fehler beim Laden: %v", err) + } + log.Println(angestellter) + } +} diff --git a/microservices/prometheus-metrics/go.mod b/microservices/prometheus-metrics/go.mod new file mode 100644 index 0000000..f3f7640 --- /dev/null +++ b/microservices/prometheus-metrics/go.mod @@ -0,0 +1,5 @@ +module golang.source-fellows.com/samples/prometheusmetric + +go 1.14 + +require github.com/prometheus/client_golang v1.7.1 diff --git a/microservices/prometheus-metrics/go.sum b/microservices/prometheus-metrics/go.sum new file mode 100644 index 0000000..35420e8 --- /dev/null +++ b/microservices/prometheus-metrics/go.sum @@ -0,0 +1,104 @@ +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/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 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= +github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= +github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+qY= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +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-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-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +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.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.2 h1:+Z5KGCizgyZCbGh1KZqA0fcLLkwbsjIzS4aV2v7wJX0= +github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +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 h1:xsAVV57WRhGj6kEIi8ReJzQlHHqcBYCElAvkovg3B/4= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= +github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= +github.com/konsorten/go-windows-terminal-sequences v1.0.1/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/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/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= +github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= +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/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +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/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 v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= +github.com/prometheus/client_golang v1.7.1 h1:NTGy1Ja9pByO+xAeH/qiWnLrKtr3hJPNjaVUwnjpdpA= +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-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M= +github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.10.0 h1:RyRA7RzGXQZiW+tGMr7sxa85G1z0yOpM1qq5c8lNawc= +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.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/procfs v0.1.3 h1:F0+tqvhOksq22sc6iCHF5WGlWjdwj92p0udFh1VFBS8= +github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= +github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= +github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= +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= +golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +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-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/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-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/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/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +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.23.0 h1:4MY060fB1DLGMB/7MBTLnwQUY6+F09GEiz6SsrNqyzM= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +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-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +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/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= diff --git a/microservices/prometheus-metrics/main.go b/microservices/prometheus-metrics/main.go new file mode 100644 index 0000000..cd41e7c --- /dev/null +++ b/microservices/prometheus-metrics/main.go @@ -0,0 +1,36 @@ +package main + +import ( + "fmt" + "net/http" + + "github.com/prometheus/client_golang/prometheus" + "github.com/prometheus/client_golang/prometheus/promauto" + "github.com/prometheus/client_golang/prometheus/promhttp" +) + +var ( + postCallsCounter = promauto.NewCounter(prometheus.CounterOpts{ + Name: "myapp_processed_post_total", + Help: "The total number of POST requests", + }) + getCallsCounter = promauto.NewCounter(prometheus.CounterOpts{ + Name: "myapp_processed_get_total", + Help: "The total number of GET requests", + }) +) + +func main() { + http.HandleFunc("/do", func(rs http.ResponseWriter, rq *http.Request) { + + if rq.Method == http.MethodPost { + postCallsCounter.Add(1) + } else if rq.Method == http.MethodGet { + getCallsCounter.Add(1) + } + + fmt.Fprintln(rs, "Hello World") + }) + http.Handle("/metrics", promhttp.Handler()) + http.ListenAndServe(":8080", nil) +} diff --git a/microservices/prometheus/application/Dockerfile b/microservices/prometheus/application/Dockerfile new file mode 100644 index 0000000..6eae478 --- /dev/null +++ b/microservices/prometheus/application/Dockerfile @@ -0,0 +1,8 @@ +from golang:latest + +RUN mkdir /application +ADD . /application +WORKDIR /application +RUN go build -o application . + +CMD ["/application/application"] diff --git a/microservices/prometheus/application/go.mod b/microservices/prometheus/application/go.mod new file mode 100644 index 0000000..486157c --- /dev/null +++ b/microservices/prometheus/application/go.mod @@ -0,0 +1,5 @@ +module golang.source-fellows.com/samples/prometheus + +go 1.14 + +require github.com/prometheus/client_golang v1.7.1 diff --git a/microservices/prometheus/application/go.sum b/microservices/prometheus/application/go.sum new file mode 100644 index 0000000..35420e8 --- /dev/null +++ b/microservices/prometheus/application/go.sum @@ -0,0 +1,104 @@ +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/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 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= +github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= +github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+qY= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +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-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-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +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.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.2 h1:+Z5KGCizgyZCbGh1KZqA0fcLLkwbsjIzS4aV2v7wJX0= +github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +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 h1:xsAVV57WRhGj6kEIi8ReJzQlHHqcBYCElAvkovg3B/4= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= +github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= +github.com/konsorten/go-windows-terminal-sequences v1.0.1/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/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/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= +github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= +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/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +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/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 v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= +github.com/prometheus/client_golang v1.7.1 h1:NTGy1Ja9pByO+xAeH/qiWnLrKtr3hJPNjaVUwnjpdpA= +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-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M= +github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.10.0 h1:RyRA7RzGXQZiW+tGMr7sxa85G1z0yOpM1qq5c8lNawc= +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.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/procfs v0.1.3 h1:F0+tqvhOksq22sc6iCHF5WGlWjdwj92p0udFh1VFBS8= +github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= +github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= +github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= +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= +golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +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-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/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-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/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/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +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.23.0 h1:4MY060fB1DLGMB/7MBTLnwQUY6+F09GEiz6SsrNqyzM= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +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-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +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/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= diff --git a/microservices/prometheus/application/main.go b/microservices/prometheus/application/main.go new file mode 100644 index 0000000..64a3ff9 --- /dev/null +++ b/microservices/prometheus/application/main.go @@ -0,0 +1,15 @@ +package main + +import ( + "net/http" + + "github.com/prometheus/client_golang/prometheus/promhttp" +) + +func main() { + http.HandleFunc("/", func(rs http.ResponseWriter, rq *http.Request) { + rs.WriteHeader(http.StatusOK) + }) + http.Handle("/metrics", promhttp.Handler()) + http.ListenAndServe(":8080", nil) +} diff --git a/microservices/prometheus/docker-compose.yml b/microservices/prometheus/docker-compose.yml new file mode 100644 index 0000000..7ebc338 --- /dev/null +++ b/microservices/prometheus/docker-compose.yml @@ -0,0 +1,18 @@ +version: '2' +services: + prometheus: + image: prom/prometheus + ports: + - "9090:9090" + volumes: + - ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml + application: + build: application + ports: + - "8080:8080" + grafana: + image: grafana/grafana + ports: + - "3000:3000" + volumes: + - ./grafana/grafana.ini:/etc/grafana/grafana.ini \ No newline at end of file diff --git a/microservices/prometheus/grafana/grafana.ini b/microservices/prometheus/grafana/grafana.ini new file mode 100644 index 0000000..a184600 --- /dev/null +++ b/microservices/prometheus/grafana/grafana.ini @@ -0,0 +1,764 @@ +##################### Grafana Configuration Example ##################### +# +# Everything has defaults so you only need to uncomment things you want to +# change + +# possible values : production, development +;app_mode = production + +# instance name, defaults to HOSTNAME environment variable value or hostname if HOSTNAME var is empty +;instance_name = ${HOSTNAME} + +#################################### Paths #################################### +[paths] +# Path to where grafana can store temp files, sessions, and the sqlite3 db (if that is used) +;data = /var/lib/grafana + +# Temporary files in `data` directory older than given duration will be removed +;temp_data_lifetime = 24h + +# Directory where grafana can store logs +;logs = /var/log/grafana + +# Directory where grafana will automatically scan and look for plugins +;plugins = /var/lib/grafana/plugins + +# folder that contains provisioning config files that grafana will apply on startup and while running. +;provisioning = conf/provisioning + +#################################### Server #################################### +[server] +# Protocol (http, https, h2, socket) +;protocol = http + +# The ip address to bind to, empty will bind to all interfaces +;http_addr = + +# The http port to use +;http_port = 3000 + +# The public facing domain name used to access grafana from a browser +;domain = localhost + +# Redirect to correct domain if host header does not match domain +# Prevents DNS rebinding attacks +;enforce_domain = false + +# The full public facing url you use in browser, used for redirects and emails +# If you use reverse proxy and sub path specify full url (with sub path) +;root_url = %(protocol)s://%(domain)s:%(http_port)s/ + +# Serve Grafana from subpath specified in `root_url` setting. By default it is set to `false` for compatibility reasons. +;serve_from_sub_path = false + +# Log web requests +;router_logging = false + +# the path relative working path +;static_root_path = public + +# enable gzip +;enable_gzip = false + +# https certs & key file +;cert_file = +;cert_key = + +# Unix socket path +;socket = + +#################################### Database #################################### +[database] +# You can configure the database connection by specifying type, host, name, user and password +# as separate properties or as on string using the url properties. + +# Either "mysql", "postgres" or "sqlite3", it's your choice +;type = sqlite3 +;host = 127.0.0.1:3306 +;name = grafana +;user = root +# If the password contains # or ; you have to wrap it with triple quotes. Ex """#password;""" +;password = + +# Use either URL or the previous fields to configure the database +# Example: mysql://user:secret@host:port/database +;url = + +# For "postgres" only, either "disable", "require" or "verify-full" +;ssl_mode = disable + +;ca_cert_path = +;client_key_path = +;client_cert_path = +;server_cert_name = + +# For "sqlite3" only, path relative to data_path setting +;path = grafana.db + +# Max idle conn setting default is 2 +;max_idle_conn = 2 + +# Max conn setting default is 0 (mean not set) +;max_open_conn = + +# Connection Max Lifetime default is 14400 (means 14400 seconds or 4 hours) +;conn_max_lifetime = 14400 + +# Set to true to log the sql calls and execution times. +;log_queries = + +# For "sqlite3" only. cache mode setting used for connecting to the database. (private, shared) +;cache_mode = private + +#################################### Cache server ############################# +[remote_cache] +# Either "redis", "memcached" or "database" default is "database" +;type = database + +# cache connectionstring options +# database: will use Grafana primary database. +# redis: config like redis server e.g. `addr=127.0.0.1:6379,pool_size=100,db=0,ssl=false`. Only addr is required. ssl may be 'true', 'false', or 'insecure'. +# memcache: 127.0.0.1:11211 +;connstr = + +#################################### Data proxy ########################### +[dataproxy] + +# This enables data proxy logging, default is false +;logging = false + +# How long the data proxy waits before timing out, default is 30 seconds. +# This setting also applies to core backend HTTP data sources where query requests use an HTTP client with timeout set. +;timeout = 30 + +# If enabled and user is not anonymous, data proxy will add X-Grafana-User header with username into the request, default is false. +;send_user_header = false + +#################################### Analytics #################################### +[analytics] +# Server reporting, sends usage counters to stats.grafana.org every 24 hours. +# No ip addresses are being tracked, only simple counters to track +# running instances, dashboard and error counts. It is very helpful to us. +# Change this option to false to disable reporting. +;reporting_enabled = true + +# Set to false to disable all checks to https://grafana.net +# for new versions (grafana itself and plugins), check is used +# in some UI views to notify that grafana or plugin update exists +# This option does not cause any auto updates, nor send any information +# only a GET request to http://grafana.com to get latest versions +;check_for_updates = true + +# Google Analytics universal tracking code, only enabled if you specify an id here +;google_analytics_ua_id = + +# Google Tag Manager ID, only enabled if you specify an id here +;google_tag_manager_id = + +#################################### Security #################################### +[security] +# disable creation of admin user on first start of grafana +;disable_initial_admin_creation = false + +# default admin user, created on startup +;admin_user = admin + +# default admin password, can be changed before first start of grafana, or in profile settings +;admin_password = admin + +# used for signing +;secret_key = SW2YcwTIb9zpOOhoPsMm + +# disable gravatar profile images +;disable_gravatar = false + +# data source proxy whitelist (ip_or_domain:port separated by spaces) +;data_source_proxy_whitelist = + +# disable protection against brute force login attempts +;disable_brute_force_login_protection = false + +# set to true if you host Grafana behind HTTPS. default is false. +;cookie_secure = false + +# set cookie SameSite attribute. defaults to `lax`. can be set to "lax", "strict", "none" and "disabled" +;cookie_samesite = lax + +# set to true if you want to allow browsers to render Grafana in a ,