Files
threshold/internal/cmd/commands.go
T

117 lines
2.9 KiB
Go
Raw Normal View History

2020-02-12 13:53:27 -05:00
package cmd
import (
2020-05-04 23:04:55 -04:00
"context"
2020-02-12 13:53:27 -05:00
"os"
"os/signal"
"syscall"
"github.com/hashicorp/watchtower/internal/cmd/base"
"github.com/hashicorp/watchtower/internal/cmd/commands/controller"
"github.com/hashicorp/watchtower/internal/cmd/commands/dev"
2020-05-04 23:04:55 -04:00
"github.com/hashicorp/watchtower/internal/cmd/commands/hosts"
2020-05-12 17:35:48 -07:00
"github.com/hashicorp/watchtower/internal/cmd/commands/scopes"
"github.com/hashicorp/watchtower/internal/cmd/commands/worker"
2020-02-12 13:53:27 -05:00
"github.com/mitchellh/cli"
)
// Commands is the mapping of all the available commands.
var Commands map[string]cli.CommandFactory
func initCommands(ui, serverCmdUi cli.Ui, runOpts *RunOptions) {
2020-05-04 23:04:55 -04:00
getBaseCommand := func() *base.Command {
ctx, cancel := context.WithCancel(context.Background())
ret := &base.Command{
UI: ui,
ShutdownCh: MakeShutdownCh(),
Context: ctx,
2020-02-12 13:53:27 -05:00
}
2020-05-04 23:04:55 -04:00
go func() {
<-ret.ShutdownCh
cancel()
}()
return ret
}
2020-02-12 13:53:27 -05:00
Commands = map[string]cli.CommandFactory{
"controller": func() (cli.Command, error) {
2020-03-10 15:48:04 -04:00
return &controller.Command{
2020-05-11 17:03:23 -04:00
Server: base.NewServer(&base.Command{
2020-05-04 23:04:55 -04:00
UI: serverCmdUi,
ShutdownCh: MakeShutdownCh(),
2020-05-11 17:03:23 -04:00
}),
2020-05-04 23:04:55 -04:00
SighupCh: MakeSighupCh(),
SigUSR2Ch: MakeSigUSR2Ch(),
2020-02-12 13:53:27 -05:00
}, nil
},
"worker": func() (cli.Command, error) {
return &worker.Command{
2020-05-11 17:03:23 -04:00
Server: base.NewServer(&base.Command{
2020-05-04 23:04:55 -04:00
UI: serverCmdUi,
ShutdownCh: MakeShutdownCh(),
2020-05-11 17:03:23 -04:00
}),
2020-05-04 23:04:55 -04:00
SighupCh: MakeSighupCh(),
SigUSR2Ch: MakeSigUSR2Ch(),
}, nil
},
2020-02-12 13:53:27 -05:00
"dev": func() (cli.Command, error) {
2020-03-10 15:48:04 -04:00
return &dev.Command{
2020-05-11 17:03:23 -04:00
Server: base.NewServer(&base.Command{
2020-05-04 23:04:55 -04:00
UI: serverCmdUi,
ShutdownCh: MakeShutdownCh(),
2020-05-11 17:03:23 -04:00
}),
2020-05-04 23:04:55 -04:00
SighupCh: MakeSighupCh(),
SigUSR2Ch: MakeSigUSR2Ch(),
}, nil
},
"hosts create": func() (cli.Command, error) {
return &hosts.CreateCommand{
Command: getBaseCommand(),
2020-02-12 13:53:27 -05:00
}, nil
},
2020-05-12 17:35:48 -07:00
"projects create": func() (cli.Command, error) {
return &scopes.CreateProjectCommand{
Command: getBaseCommand(),
}, nil
},
"projects read": func() (cli.Command, error) {
return &scopes.ReadProjectCommand{
Command: getBaseCommand(),
}, nil
},
2020-02-12 13:53:27 -05:00
}
}
// MakeShutdownCh returns a channel that can be used for shutdown
// notifications for commands. This channel will send a message for every
// SIGINT or SIGTERM received.
func MakeShutdownCh() chan struct{} {
resultCh := make(chan struct{})
shutdownCh := make(chan os.Signal, 4)
signal.Notify(shutdownCh, os.Interrupt, syscall.SIGTERM)
go func() {
<-shutdownCh
close(resultCh)
}()
return resultCh
}
// MakeSighupCh returns a channel that can be used for SIGHUP
// reloading. This channel will send a message for every
// SIGHUP received.
func MakeSighupCh() chan struct{} {
resultCh := make(chan struct{})
signalCh := make(chan os.Signal, 4)
signal.Notify(signalCh, syscall.SIGHUP)
go func() {
for {
<-signalCh
resultCh <- struct{}{}
}
}()
return resultCh
}