diff options
author | Alexander Mazuruk <a.mazuruk@samsung.com> | 2018-08-13 17:30:00 +0200 |
---|---|---|
committer | Alexander Mazuruk <a.mazuruk@samsung.com> | 2018-09-13 16:17:07 +0000 |
commit | 30c6d5c730671bbae5f0dfb49b89024a76586772 (patch) | |
tree | 8ad1f43c5a38082b52c0056eabead351d733d39a | |
parent | 492bcd27007b4e54ba996cb49a7697c88e98fc29 (diff) | |
download | weles-30c6d5c730671bbae5f0dfb49b89024a76586772.tar.gz weles-30c6d5c730671bbae5f0dfb49b89024a76586772.tar.bz2 weles-30c6d5c730671bbae5f0dfb49b89024a76586772.zip |
Update go-swagger, regenerate server
This resolves bug where out of ArtifactInfo struct only
ArtifactDescription was marshalled to JSON:
https://github.com/go-swagger/go-swagger/issues/1617
Fixed in 0.16.0 release.
1. Updated Gopkg.toml
2. Re-generated Gopkg.lock
$ make Gopkg.lock
3. Build new swagger
$ make tools
4. Re-generate swagger server
$ make swagger-server-generate
Change-Id: I622e4a2500203f4236d8938031abfee136c69b81
Signed-off-by: Alexander Mazuruk <a.mazuruk@samsung.com>
-rw-r--r-- | Gopkg.lock | 127 | ||||
-rw-r--r-- | Gopkg.toml | 8 | ||||
-rw-r--r-- | artifact_info.go | 54 | ||||
-rw-r--r-- | server/server.go | 136 |
4 files changed, 202 insertions, 123 deletions
@@ -28,8 +28,8 @@ [[projects]] name = "github.com/davecgh/go-spew" packages = ["spew"] - revision = "346938d642f2ec3594ed81d874461961cd0faa76" - version = "v1.1.0" + revision = "8991bc29aa16c548c550c7ff78260e27b9ab7c73" + version = "v1.1.1" [[projects]] name = "github.com/dgrijalva/jwt-go" @@ -57,33 +57,36 @@ [[projects]] name = "github.com/go-openapi/analysis" - packages = ["."] - revision = "3c8fe72ed5d307113ef76c7c3035964d7e4d4b73" - version = "0.15.0" + packages = [ + ".", + "internal" + ] + revision = "7c1bef8f6d9fa6148ce0d8a0ebf5339a084a6639" + version = "0.16.0" [[projects]] name = "github.com/go-openapi/errors" packages = ["."] revision = "b2b2befaf267d082d779bcef52d682a47c779517" - version = "0.15.0" + version = "0.16.0" [[projects]] name = "github.com/go-openapi/inflect" packages = ["."] revision = "b1f6470ffb9c552dc105dd869f16e36ba86ba7d0" - version = "0.15.0" + version = "0.16.0" [[projects]] name = "github.com/go-openapi/jsonpointer" packages = ["."] revision = "3a0015ad55fa9873f41605d3e8f28cd279c32ab2" - version = "0.15.0" + version = "0.16.0" [[projects]] name = "github.com/go-openapi/jsonreference" packages = ["."] revision = "3fb327e6747da3043567ee86abd02bb6376b6be2" - version = "0.15.0" + version = "0.16.0" [[projects]] name = "github.com/go-openapi/loads" @@ -92,7 +95,7 @@ "fmts" ] revision = "2a2b323bab96e6b1fdee110e57d959322446e9c9" - version = "0.15.0" + version = "0.16.0" [[projects]] name = "github.com/go-openapi/runtime" @@ -107,36 +110,37 @@ "security" ] revision = "9a3091f566c0811ef4d54b535179bc0fc484a11f" - version = "0.15.0" + version = "0.16.0" [[projects]] name = "github.com/go-openapi/spec" packages = ["."] - revision = "bce47c9386f9ecd6b86f450478a80103c3fe1402" - version = "0.15.0" + revision = "384415f06ee238aae1df5caad877de6ceac3a5c4" + version = "0.16.0" [[projects]] name = "github.com/go-openapi/strfmt" packages = ["."] revision = "913ee058e387ac83a67e2d9f13acecdcd5769fc6" - version = "0.15.0" + version = "0.16.0" [[projects]] name = "github.com/go-openapi/swag" packages = ["."] - revision = "2b0bd4f193d011c203529df626a65d63cb8a79e8" - version = "0.15.0" + revision = "becd2f08beafcca035645a8a101e0e3e18140458" + version = "0.16.0" [[projects]] name = "github.com/go-openapi/validate" packages = ["."] - revision = "9a6e517cddf1ddd47449be5d06a6a786e51d9986" - version = "0.15.0" + revision = "7c1911976134d3a24d0c03127505163c9f16aa3b" + version = "0.16.0" [[projects]] name = "github.com/go-swagger/go-swagger" packages = ["."] - revision = "8c101dc8c12c8e25b5803a6376b7b2b7f09a622f" + revision = "dd867fd63c30269ac217004c102f47a1774d4f5a" + version = "0.16.0" [[projects]] branch = "master" @@ -157,17 +161,16 @@ [[projects]] name = "github.com/golang/protobuf" packages = ["proto"] - revision = "b4deda0973fb4c70b50d226b1af49f3da59f5265" - version = "v1.1.0" + revision = "aa810b61a9c79d51363740d207bb46cf8e620ed5" + version = "v1.2.0" [[projects]] name = "github.com/gorilla/handlers" packages = ["."] - revision = "90663712d74cb411cbef281bc1e08c19d1a76145" - version = "v1.3.0" + revision = "7e0847f9db758cdebd26c149d0ae9d5d0b9c98ce" + version = "v1.4.0" [[projects]] - branch = "master" name = "github.com/hashicorp/hcl" packages = [ ".", @@ -181,7 +184,20 @@ "json/scanner", "json/token" ] - revision = "ef8a98b0bbce4a65b5aa4c368430a80ddc533168" + revision = "8cb6e5b959231cc1119e43259c4a608f9c51a241" + version = "v1.0.0" + +[[projects]] + name = "github.com/hpcloud/tail" + packages = [ + ".", + "ratelimiter", + "util", + "watch", + "winfile" + ] + revision = "a30252cb686a21eb2d0b98132633053ec2f7f1e5" + version = "v1.0.0" [[projects]] name = "github.com/jessevdk/go-flags" @@ -215,7 +231,7 @@ "jlexer", "jwriter" ] - revision = "3fdea8d05856a0c8df22ed4bc71b3219245e4485" + revision = "60711f1a8329503b04e1c88535f419d0bb440bff" [[projects]] name = "github.com/mattn/go-sqlite3" @@ -224,10 +240,10 @@ version = "v1.9.0" [[projects]] - branch = "master" name = "github.com/mitchellh/mapstructure" packages = ["."] - revision = "bb74f1db0675b241733089d5a1faa5dd8b0ef57b" + revision = "fa473d140ef3c6adf42d6b391fe76707f1f243c8" + version = "v1.0.0" [[projects]] name = "github.com/onsi/ginkgo" @@ -252,8 +268,8 @@ "reporters/stenographer/support/go-isatty", "types" ] - revision = "fa5fabab2a1bfbd924faf4c067d07ae414e2aedf" - version = "v1.5.0" + revision = "3774a09d95489ccaa16032e0770d08ea77ba6184" + version = "v1.6.0" [[projects]] name = "github.com/onsi/gomega" @@ -271,8 +287,8 @@ "matchers/support/goraph/util", "types" ] - revision = "62bff4df71bdbc266561a0caee19f0594b17c240" - version = "v1.4.0" + revision = "b6ea1ea48f981d0f615a154a45eabb9dd466556d" + version = "v1.4.1" [[projects]] name = "github.com/pelletier/go-toml" @@ -295,8 +311,8 @@ ".", "mem" ] - revision = "787d034dfe70e44075ccc060d346146ef53270ad" - version = "v1.1.1" + revision = "d40851caa0d747393da1ffb28f7f9d8b4eeffebd" + version = "v1.1.2" [[projects]] name = "github.com/spf13/cast" @@ -305,22 +321,22 @@ version = "v1.2.0" [[projects]] - branch = "master" name = "github.com/spf13/jwalterweatherman" packages = ["."] - revision = "7c0cea34c8ece3fbeb2b27ab9b59511d360fb394" + revision = "4a4406e478ca629068e7768fc33f3f044173c0a6" + version = "v1.0.0" [[projects]] name = "github.com/spf13/pflag" packages = ["."] - revision = "583c0c0531f06d5278b7d917446061adc344b5cd" - version = "v1.0.1" + revision = "9a97c102cda95a86cec2345a6f09f55a939babf5" + version = "v1.0.2" [[projects]] name = "github.com/spf13/viper" packages = ["."] - revision = "b5e8006cbee93ec955a89ab31e0e3ce3204f3736" - version = "v1.0.2" + revision = "8fb642006536c8d3760c99d4fa2389f5e2205631" + version = "v1.2.0" [[projects]] name = "github.com/tideland/golib" @@ -349,10 +365,11 @@ "ed25519/internal/edwards25519", "internal/chacha20", "internal/subtle", + "pbkdf2", "poly1305", "ssh" ] - revision = "a49355c7e3f8fe157a85be2f77e6e269a0f89602" + revision = "0e37d006457bf46f9e6692014ba72ef82c33022c" [[projects]] branch = "master" @@ -366,7 +383,7 @@ "idna", "netutil" ] - revision = "d0887baf81f4598189d4e12a37c6da86f0bba4d0" + revision = "161cd47e91fd58ac17490ef4d742dc98bb4cf60e" [[projects]] branch = "master" @@ -375,13 +392,13 @@ ".", "internal" ] - revision = "ef147856a6ddbb60760db74283d2424e98c87bff" + revision = "d2e6202438beef2727060aa7cabdd924d92ebfd9" [[projects]] branch = "master" name = "golang.org/x/sys" packages = ["unix"] - revision = "1b2967e3c290b7c545b3db0deeda16e9be4f98a2" + revision = "d0be0721c37eeb5299f245a996a483160fc36940" [[projects]] name = "golang.org/x/text" @@ -423,11 +440,12 @@ packages = [ "go/ast/astutil", "go/buildutil", + "go/internal/cgo", "go/loader", "imports", "internal/fastwalk" ] - revision = "18e9dfbf20567d5156dd6f1dd987092c021f7fa6" + revision = "677d2ff680c188ddb7dcd2bfa6bc7d3f2f2f75b2" [[projects]] name = "google.golang.org/appengine" @@ -444,6 +462,13 @@ version = "v1.1.0" [[projects]] + name = "gopkg.in/fsnotify.v1" + packages = ["."] + revision = "c2828203cd70a50dcccfb2761f8b1f8ceef9a8e9" + source = "https://github.com/fsnotify/fsnotify/archive/v1.4.7.tar.gz" + version = "v1.4.7" + +[[projects]] branch = "v2" name = "gopkg.in/mgo.v2" packages = [ @@ -459,8 +484,14 @@ "cipher", "json" ] - revision = "76dd09796242edb5b897103a75df2645c028c960" - version = "v2.1.6" + revision = "8254d6c783765f38c8675fae4427a1fe73fbd09d" + version = "v2.1.8" + +[[projects]] + branch = "v1" + name = "gopkg.in/tomb.v1" + packages = ["."] + revision = "dd632973f1e7218eb1089048e0798ec9ae7dceb8" [[projects]] name = "gopkg.in/yaml.v2" @@ -471,6 +502,6 @@ [solve-meta] analyzer-name = "dep" analyzer-version = 1 - inputs-digest = "a5e864a9f1537b8cb1a6fdceb4224e969cec77a4e1f692f62b019f7f640638b5" + inputs-digest = "060e0f81e4cb9e825489af1b1d729a679af8fb014e3e19864dbd1b017f26923c" solver-name = "gps-cdcl" solver-version = 1 @@ -49,7 +49,13 @@ version = "v1.1.1" # in other required packages (which do not have stable version tagged) [[constraint]] name = "github.com/go-swagger/go-swagger" -revision = "8c101dc8c12c8e25b5803a6376b7b2b7f09a622f" +version = "v0.16.0" + + +# https://github.com/golang/dep/issues/1799 +[[override]] +name = "gopkg.in/fsnotify.v1" +source = "https://github.com/fsnotify/fsnotify/archive/v1.4.7.tar.gz" # WARNING! # Do not uncomment below lines diff --git a/artifact_info.go b/artifact_info.go index ae5079c..2881773 100644 --- a/artifact_info.go +++ b/artifact_info.go @@ -1,5 +1,4 @@ // Code generated by go-swagger; DO NOT EDIT. -// NOTE: above is not entirely true. see TODO: below. // Copyright (c) 2017-2018 Samsung Electronics Co., Ltd All Rights Reserved // @@ -34,7 +33,7 @@ import ( type ArtifactInfo struct { ArtifactDescription - // ID in the artifacts database + // unique identification of the artifact. ID int64 `json:"ID,omitempty" db:",primarykey, autoincrement"` // path @@ -48,12 +47,6 @@ type ArtifactInfo struct { Timestamp strfmt.DateTime `json:"Timestamp,omitempty"` } -// TODO -// current go-swagger generates broken marshalling and unmarshalling: -// https://github.com/go-swagger/go-swagger/issues/1617 -// it is commented out as implicit marshalling works fine. - -/* // UnmarshalJSON unmarshals this object from a JSON structure func (m *ArtifactInfo) UnmarshalJSON(raw []byte) error { // AO0 @@ -63,6 +56,27 @@ func (m *ArtifactInfo) UnmarshalJSON(raw []byte) error { } m.ArtifactDescription = aO0 + // now for regular properties + var propsArtifactInfo struct { + ID int64 `json:"ID,omitempty"` + + Path ArtifactPath `json:"Path,omitempty"` + + Status ArtifactStatus `json:"Status,omitempty"` + + Timestamp strfmt.DateTime `json:"Timestamp,omitempty"` + } + if err := swag.ReadJSON(raw, &propsArtifactInfo); err != nil { + return err + } + m.ID = propsArtifactInfo.ID + + m.Path = propsArtifactInfo.Path + + m.Status = propsArtifactInfo.Status + + m.Timestamp = propsArtifactInfo.Timestamp + return nil } @@ -76,9 +90,31 @@ func (m ArtifactInfo) MarshalJSON() ([]byte, error) { } _parts = append(_parts, aO0) + // now for regular properties + var propsArtifactInfo struct { + ID int64 `json:"ID,omitempty"` + + Path ArtifactPath `json:"Path,omitempty"` + + Status ArtifactStatus `json:"Status,omitempty"` + + Timestamp strfmt.DateTime `json:"Timestamp,omitempty"` + } + propsArtifactInfo.ID = m.ID + + propsArtifactInfo.Path = m.Path + + propsArtifactInfo.Status = m.Status + + propsArtifactInfo.Timestamp = m.Timestamp + + jsonDataPropsArtifactInfo, errArtifactInfo := swag.WriteJSON(propsArtifactInfo) + if errArtifactInfo != nil { + return nil, errArtifactInfo + } + _parts = append(_parts, jsonDataPropsArtifactInfo) return swag.ConcatJSON(_parts...), nil } -*/ // Validate validates this artifact info func (m *ArtifactInfo) Validate(formats strfmt.Registry) error { diff --git a/server/server.go b/server/server.go index 25a265b..dd146aa 100644 --- a/server/server.go +++ b/server/server.go @@ -100,9 +100,9 @@ func init() { flag.StringVar(&tlsHost, "tls-host", "localhost", "the IP to listen on") flag.IntVar(&tlsPort, "tls-port", 0, "the port to listen on for secure connections, defaults to a random value") - flag.StringVar(&tlsCertificate, "tls-certificate", "", "the certificate to use for secure connections") - flag.StringVar(&tlsCertificateKey, "tls-key", "", "the private key to use for secure conections") - flag.StringVar(&tlsCACertificate, "tls-ca", "", "the certificate authority file to be used with mutual tls auth") + flag.StringVar(&tlsCertificate, "tls-certificate", "", "the certificate file to use for secure connections") + flag.StringVar(&tlsCertificateKey, "tls-key", "", "the private key file to use for secure connections (without passphrase)") + flag.StringVar(&tlsCACertificate, "tls-ca", "", "the certificate authority certificate file to be used with mutual tls auth") flag.IntVar(&tlsListenLimit, "tls-listen-limit", 0, "limit the number of outstanding requests") flag.DurationVar(&tlsKeepAlive, "tls-keep-alive", 3*time.Minute, "sets the TCP keep-alive timeouts on accepted connections. It prunes dead TCP connections ( e.g. closing laptop mid-download)") flag.DurationVar(&tlsReadTimeout, "tls-read-timeout", 30*time.Second, "maximum duration before timing out read of the request") @@ -283,11 +283,14 @@ func (s *Server) Serve() (err error) { s.SetHandler(s.api.Serve(nil)) } - var wg sync.WaitGroup - quitting := make(chan struct{}) + wg := new(sync.WaitGroup) once := new(sync.Once) signalNotify(s.interrupt) - go handleInterrupt(once, s, quitting) + go handleInterrupt(once, s) + + servers := []*http.Server{} + wg.Add(1) + go s.handleShutdown(wg, &servers) if s.hasScheme(schemeUnix) { domainSocket := new(http.Server) @@ -299,16 +302,16 @@ func (s *Server) Serve() (err error) { configureServer(domainSocket, "unix", string(s.SocketPath)) - wg.Add(2) + wg.Add(1) s.Logf("Serving weles at unix://%s", s.SocketPath) go func(l net.Listener) { defer wg.Done() - if err := domainSocket.Serve(l); err != nil { + if err := domainSocket.Serve(l); err != nil && err != http.ErrServerClosed { s.Fatalf("%v", err) } s.Logf("Stopped serving weles at unix://%s", s.SocketPath) }(s.domainSocketL) - go s.handleShutdown(&wg, domainSocket) + servers = append(servers, domainSocket) } if s.hasScheme(schemeHTTP) { @@ -329,16 +332,16 @@ func (s *Server) Serve() (err error) { configureServer(httpServer, "http", s.httpServerL.Addr().String()) - wg.Add(2) + wg.Add(1) s.Logf("Serving weles at http://%s", s.httpServerL.Addr()) go func(l net.Listener) { defer wg.Done() - if err := httpServer.Serve(l); err != nil { + if err := httpServer.Serve(l); err != nil && err != http.ErrServerClosed { s.Fatalf("%v", err) } s.Logf("Stopped serving weles at http://%s", l.Addr()) }(s.httpServerL) - go s.handleShutdown(&wg, httpServer) + servers = append(servers, httpServer) } if s.hasScheme(schemeHTTPS) { @@ -373,33 +376,40 @@ func (s *Server) Serve() (err error) { tls.TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384, tls.TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, tls.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, + tls.TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305, + tls.TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305, }, } + // build standard config from server options if s.TLSCertificate != "" && s.TLSCertificateKey != "" { httpsServer.TLSConfig.Certificates = make([]tls.Certificate, 1) httpsServer.TLSConfig.Certificates[0], err = tls.LoadX509KeyPair(s.TLSCertificate, s.TLSCertificateKey) + if err != nil { + return err + } } if s.TLSCACertificate != "" { + // include specified CA certificate caCert, caCertErr := ioutil.ReadFile(s.TLSCACertificate) if caCertErr != nil { - log.Fatal(caCertErr) + return caCertErr } caCertPool := x509.NewCertPool() - caCertPool.AppendCertsFromPEM(caCert) + ok := caCertPool.AppendCertsFromPEM(caCert) + if !ok { + return fmt.Errorf("cannot parse CA certificate") + } httpsServer.TLSConfig.ClientCAs = caCertPool httpsServer.TLSConfig.ClientAuth = tls.RequireAndVerifyClientCert } + // call custom TLS configurator configureTLS(httpsServer.TLSConfig) - httpsServer.TLSConfig.BuildNameToCertificate() - - if err != nil { - return err - } if len(httpsServer.TLSConfig.Certificates) == 0 { + // after standard and custom config are passed, this ends up with no certificate if s.TLSCertificate == "" { if s.TLSCertificateKey == "" { s.Fatalf("the required flags `--tls-certificate` and `--tls-key` were not specified") @@ -409,20 +419,25 @@ func (s *Server) Serve() (err error) { if s.TLSCertificateKey == "" { s.Fatalf("the required flag `--tls-key` was not specified") } + // this happens with a wrong custom TLS configurator + s.Fatalf("no certificate was configured for TLS") } + // must have at least one certificate or panics + httpsServer.TLSConfig.BuildNameToCertificate() + configureServer(httpsServer, "https", s.httpsServerL.Addr().String()) - wg.Add(2) + wg.Add(1) s.Logf("Serving weles at https://%s", s.httpsServerL.Addr()) go func(l net.Listener) { defer wg.Done() - if err := httpsServer.Serve(l); err != nil { + if err := httpsServer.Serve(l); err != nil && err != http.ErrServerClosed { s.Fatalf("%v", err) } s.Logf("Stopped serving weles at https://%s", l.Addr()) }(tls.NewListener(s.httpsServerL, httpsServer.TLSConfig)) - go s.handleShutdown(&wg, httpsServer) + servers = append(servers, httpsServer) } wg.Wait() @@ -502,48 +517,49 @@ func (s *Server) Listen() error { // Shutdown server and clean up resources func (s *Server) Shutdown() error { - if atomic.LoadInt32(&s.shuttingDown) != 0 { - s.Logf("already shutting down") - return nil + if atomic.CompareAndSwapInt32(&s.shuttingDown, 0, 1) { + close(s.shutdown) } - close(s.shutdown) return nil } -func (s *Server) handleShutdown(wg *sync.WaitGroup, server *http.Server) { +func (s *Server) handleShutdown(wg *sync.WaitGroup, serversPtr *[]*http.Server) { + // wg.Done must occur last, after s.api.ServerShutdown() + // (to preserve old behaviour) defer wg.Done() + + <-s.shutdown + + servers := *serversPtr + ctx, cancel := context.WithTimeout(context.TODO(), 15*time.Second) defer cancel() - <-s.shutdown - if err := server.Shutdown(ctx); err != nil { - // Error from closing listeners, or context timeout: - s.Logf("HTTP server Shutdown: %v", err) - } else { - atomic.AddInt32(&s.shuttingDown, 1) - select { - case <-ctx.Done(): - if err := ctx.Err(); err != nil { - s.Logf("Error %s", err) - } - default: - done := make(chan error) - defer close(done) - go func() { - <-ctx.Done() - done <- ctx.Err() - }() - go func() { - //done <- s.api.Shutdown(ctx) - s.api.ServerShutdown() - done <- errors.New("API shut down") + shutdownChan := make(chan bool) + for i := range servers { + server := servers[i] + go func() { + var success bool + defer func() { + shutdownChan <- success }() - if err := <-done; err != nil { - s.Logf("Error %s", err) + if err := server.Shutdown(ctx); err != nil { + // Error from closing listeners, or context timeout: + s.Logf("HTTP server Shutdown: %v", err) + } else { + success = true } - } + }() + } + + // Wait until all listeners have successfully shut down before calling ServerShutdown + success := true + for range servers { + success = success && <-shutdownChan + } + if success { + s.api.ServerShutdown() } - return } // GetHandler returns a handler useful for testing @@ -586,7 +602,7 @@ func (s *Server) TLSListener() (net.Listener, error) { return s.httpsServerL, nil } -func handleInterrupt(once *sync.Once, s *Server, quitting chan struct{}) { +func handleInterrupt(once *sync.Once, s *Server) { once.Do(func() { for _ = range s.interrupt { if s.interrupted { @@ -595,17 +611,7 @@ func handleInterrupt(once *sync.Once, s *Server, quitting chan struct{}) { } s.interrupted = true s.Logf("Shutting down... ") - close(quitting) - - if err := s.httpServerL.Close(); err != nil { - s.Logf("Error: %s", err) - } - if err := s.httpsServerL.Close(); err != nil { - s.Logf("Error: %s", err) - } - if err := s.domainSocketL.Close(); err != nil { - s.Logf("Error: %s", err) - } + s.Shutdown() } }) } |