Skip to content

Commit

Permalink
Merge c745927 into c910e75
Browse files Browse the repository at this point in the history
  • Loading branch information
ajatprabha committed Jul 10, 2020
2 parents c910e75 + c745927 commit 10012d3
Show file tree
Hide file tree
Showing 18 changed files with 347 additions and 139 deletions.
26 changes: 15 additions & 11 deletions cmd/root.go
Original file line number Diff line number Diff line change
@@ -1,20 +1,24 @@
package cmd

import (
"github.com/gojek/darkroom/cmd/signals"
"github.com/spf13/cobra"
)

var rootCmd = &cobra.Command{
Use: "darkroom",
Short: "Darkroom is an Image Proxy on your image source",
// newRootCmd represents the base command when called without any subcommands.
func newRootCmd() *cobra.Command {
cmd := &cobra.Command{
Use: "darkroom",
Short: "Darkroom is an Image Proxy on your image source",
}
cmd.AddCommand(newRunCmdWithOpts(runCmdOpts{
SetupSignalHandler: signals.SetupSignalHandler,
}))
return cmd
}

func init() {
rootCmd.AddCommand(serverCmd)
}

// Run function lets you run the commands
func Run(args []string) error {
rootCmd.SetArgs(args)
return rootCmd.Execute()
// Execute adds all child commands to the root command and sets flags appropriately.
// This is called by main.main(). It only needs to happen once to the rootCmd.
func Execute() error {
return newRootCmd().Execute()
}
13 changes: 13 additions & 0 deletions cmd/root_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package cmd

import (
"github.com/stretchr/testify/assert"
"testing"
)

func TestRootCmd(t *testing.T) {
// when
err := Execute()
// then
assert.NoError(t, err)
}
42 changes: 24 additions & 18 deletions cmd/server.go
Original file line number Diff line number Diff line change
@@ -1,30 +1,36 @@
package cmd

import (
"github.com/gojek/darkroom/pkg/logger"
"github.com/gojek/darkroom/pkg/router"
"github.com/gojek/darkroom/pkg/server"
"github.com/gojek/darkroom/pkg/service"
"github.com/spf13/cobra"
)

var serverCmd = &cobra.Command{
Use: "server",
Short: "Start the app server",
Run: serverCmdF,
type runCmdOpts struct {
SetupSignalHandler func() (stopCh <-chan struct{})
}

func serverCmdF(cmd *cobra.Command, args []string) {
defer func() {
if e := recover(); e != nil {
logger.Errorf("failed to start the app due to error: %s", e)
}
}()
startServer()
}

func startServer() {
handler := router.NewRouter(service.NewDependencies())
s := server.NewServer(server.WithHandler(handler))
s.Start()
func newRunCmdWithOpts(opts runCmdOpts) *cobra.Command {
args := struct {
port int
}{}
cmd := &cobra.Command{
Use: "server",
Short: "Start the app server",
RunE: func(cmd *cobra.Command, _ []string) error {
deps, err := service.NewDependencies()
if err != nil {
return err
}
handler := router.NewRouter(deps)
s := server.NewServer(server.Options{
Handler: handler,
Port: args.port,
})
return s.Start(opts.SetupSignalHandler())
},
}
cmd.PersistentFlags().IntVarP(&args.port, "port", "p", 3000, "server port")
return cmd
}
105 changes: 105 additions & 0 deletions cmd/server_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,105 @@
package cmd

import (
"fmt"
"github.com/gojek/darkroom/pkg/config"
"github.com/stretchr/testify/assert"
"net/http"
"testing"
"time"
)

func TestRunServer(t *testing.T) {
// setup
errCh := make(chan error)
stopCh := make(chan struct{})
diagnosticsPort := 9999
v := config.Viper()
v.Set("source.kind", "WebFolder")
v.Set("source.baseURL", "https://example.com/path/to/folder")
config.Update()

// given
cmd := newRunCmdWithOpts(runCmdOpts{
SetupSignalHandler: func() <-chan struct{} {
return stopCh
},
})
cmd.SetArgs([]string{"-p", fmt.Sprintf("%d", diagnosticsPort)})

// when
go func() {
defer close(errCh)
errCh <- cmd.Execute()
}()

assert.True(t, assert.Eventually(t, func() bool {
resp, err := http.Get(fmt.Sprintf("http://localhost:%d/ping", diagnosticsPort))
if err != nil {
return false
}
defer func() {
_ = resp.Body.Close()
}()
return resp.StatusCode == http.StatusOK
}, 5*time.Second, 100*time.Millisecond), "failed to run server")

// when
close(stopCh)

// then
assert.NoError(t, <-errCh)
}

func TestRunServerWithInvalidPort(t *testing.T) {
// setup
errCh := make(chan error)
stopCh := make(chan struct{})
v := config.Viper()
v.Set("source.kind", "WebFolder")
v.Set("source.baseURL", "https://example.com/path/to/folder")
config.Update()

// given
cmd := newRunCmdWithOpts(runCmdOpts{
SetupSignalHandler: func() <-chan struct{} {
return stopCh
},
})
cmd.SetArgs([]string{"-p", fmt.Sprintf("%d", -9000)})

// when
go func() {
defer close(errCh)
errCh <- cmd.Execute()
}()

// then
assert.Error(t, <-errCh)
}

func TestRunServerWithInvalidDependencies(t *testing.T) {
// setup
errCh := make(chan error)
stopCh := make(chan struct{})
v := config.Viper()
v.Set("source.kind", "")
v.Set("source.baseURL", "")
config.Update()

// given
cmd := newRunCmdWithOpts(runCmdOpts{
SetupSignalHandler: func() <-chan struct{} {
return stopCh
},
})

// when
go func() {
defer close(errCh)
errCh <- cmd.Execute()
}()

// then
assert.EqualError(t, <-errCh, "handler dependencies are not valid")
}
29 changes: 29 additions & 0 deletions cmd/signals/signal.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package signals

import (
"os"
"os/signal"
"syscall"
)

var onlyOneSignalHandler = make(chan struct{})

// SetupSignalHandler registers for SIGTERM and SIGINT. A stop channel is returned
// which is closed on one of these signals. If a second signal is caught, the program
// is terminated with exit code 1.
func SetupSignalHandler() (stopCh <-chan struct{}) {
close(onlyOneSignalHandler) // panics when SetupSignalHandler is called twice

stop := make(chan struct{})
c := make(chan os.Signal, 2)
signal.Notify(c, os.Interrupt, syscall.SIGTERM)
go func() {
<-c
close(stop)
<-c
os.Exit(1) // second signal. Exit directly.
}()

return stop
}

58 changes: 58 additions & 0 deletions cmd/signals/signal_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
package signals

import (
"fmt"
"github.com/stretchr/testify/assert"
"os"
"os/signal"
"sync"
"testing"
"time"
)

func TestSetupSignalHandler(t *testing.T) {
stop := SetupSignalHandler()
task := &Task{
ticker: time.NewTicker(time.Second * 2),
}
c := make(chan os.Signal, 1)
signal.Notify(c, os.Interrupt)
task.wg.Add(1)
go func(c chan os.Signal) {
defer task.wg.Done()
task.Run(c)
}(c)

select {
case sig := <-c:
fmt.Printf("Got %s signal. Aborting...\n", sig)
case _, ok := <-stop:
assert.False(t, ok)
}
}

type Task struct {
wg sync.WaitGroup
ticker *time.Ticker
}

func (t *Task) Run(c chan os.Signal) {
for {
go sendSignal(c)
handle()
}
}

func handle() {
for i := 0; i < 5; i++ {
fmt.Print("#")
time.Sleep(time.Millisecond * 100)
}
fmt.Println()
}

func sendSignal(stopChan chan os.Signal) {
fmt.Printf("...")
time.Sleep(1 * time.Second)
stopChan <- os.Interrupt
}
3 changes: 2 additions & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ require (
github.com/magiconair/properties v1.8.1 // indirect
github.com/pelletier/go-toml v1.4.0 // indirect
github.com/pkg/errors v0.8.1
github.com/prometheus/common v0.4.0
github.com/rcrowley/go-metrics v0.0.0-20190706150252-9beb055b7962 // indirect
github.com/smartystreets/assertions v1.0.0 // indirect
github.com/smartystreets/goconvey v0.0.0-20190710185942-9d28bd7c0945 // indirect
Expand All @@ -23,7 +24,7 @@ require (
github.com/spf13/jwalterweatherman v1.1.0 // indirect
github.com/spf13/viper v1.4.0
github.com/stretchr/objx v0.2.0 // indirect
github.com/stretchr/testify v1.3.0
github.com/stretchr/testify v1.6.1
go.uber.org/zap v1.10.0
golang.org/x/net v0.0.0-20190628185345-da137c7871d7 // indirect
golang.org/x/sys v0.0.0-20190712062909-fae7ac547cb7 // indirect
Expand Down
10 changes: 10 additions & 0 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,9 @@ github.com/DataDog/datadog-go v2.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3
github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5 h1:rFw4nCn9iMW+Vajsk51NtYIcwSTkXr+JGrMd36kTDJw=
github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c=
github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc h1:cAKDfWh5VpdgMhJosfJnn5/FoN2SRZ4p7fJNX58YPaU=
github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf h1:qet1QNfXsQxTZqLG4oE62mJzwPIB8+Tee4RNCL9ulrY=
github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
github.com/anthonynsimon/bild v0.10.1-0.20190710205720-eee9188e4370 h1:SkRJhi+9cy+K9VNb32opvBC7OTHiF/YLWlZ1PbY+FdY=
github.com/anthonynsimon/bild v0.10.1-0.20190710205720-eee9188e4370/go.mod h1:eNsCfVn8OMLYhMiqPI1o7EJPD1L82bqwe9Nth6Ey/Lk=
Expand Down Expand Up @@ -104,6 +106,7 @@ github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDf
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 h1:7etb9YClo3a6HjLzfl6rIQaU+FDfi0VSX39io3aQ+DM=
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=
Expand All @@ -112,6 +115,7 @@ github.com/rcrowley/go-metrics v0.0.0-20190706150252-9beb055b7962 h1:eUm8ma4+yPk
github.com/rcrowley/go-metrics v0.0.0-20190706150252-9beb055b7962/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4=
github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg=
github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g=
github.com/sirupsen/logrus v1.2.0 h1:juTguoYk5qI21pwyTXY3B3Y5cOTH3ZUyZCg1v/mihuo=
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/assertions v1.0.0 h1:UVQPSSmc3qtTi+zPPkCXvZX9VvW/xT/NsRvKfwY81a8=
Expand Down Expand Up @@ -145,6 +149,8 @@ github.com/stretchr/testify v1.2.2 h1:bSDNvY7ZPG5RlJ8otE/7V6gMiyenm9RtJ7IUVIAoJ1
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q=
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0=
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc=
github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0=
Expand All @@ -159,6 +165,7 @@ go.uber.org/zap v1.10.0 h1:ORx85nbTijNz8ljznvCMR1ZBIPKFn3jQrag10X2AsuM=
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-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2 h1:VklqNMn3ovrHsnt90PveolxSbWFaJdECFbxSq0Mqo2M=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/image v0.0.0-20190703141733-d6a02ce849c9/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
Expand Down Expand Up @@ -196,6 +203,7 @@ google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9Ywl
google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
gopkg.in/alecthomas/kingpin.v2 v2.2.6 h1:jMFz6MfLP0/4fUyZle81rXUoxOBFi19VUFKVDOQfozc=
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 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY=
Expand All @@ -205,4 +213,6 @@ gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bl
gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw=
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
5 changes: 2 additions & 3 deletions main.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,11 @@ package main

import (
"github.com/gojek/darkroom/cmd"
"log"
"os"
)

func main() {
if err := cmd.Run(os.Args[1:]); err != nil {
log.Fatalf("unable to run the command %s ", err)
if err := cmd.Execute(); err != nil {
os.Exit(1)
}
}

0 comments on commit 10012d3

Please sign in to comment.