Skip to content

Commit

Permalink
chore: refactor daemon (#312)
Browse files Browse the repository at this point in the history
* chore: refactor network daemon
  • Loading branch information
abiosoft authored May 30, 2022
1 parent 2b32ee9 commit 3c03f80
Show file tree
Hide file tree
Showing 25 changed files with 382 additions and 380 deletions.
7 changes: 4 additions & 3 deletions app/app.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ import (
"github.com/abiosoft/colima/environment/container/ubuntu"
"github.com/abiosoft/colima/environment/host"
"github.com/abiosoft/colima/environment/vm/lima"
"github.com/abiosoft/colima/environment/vm/lima/limautil"
log "github.com/sirupsen/logrus"
)

Expand Down Expand Up @@ -208,15 +209,15 @@ func (c colimaApp) SSH(layer bool, args ...string) error {
return c.guest.RunInteractive(args...)
}

conf, err := lima.InstanceConfig()
conf, err := limautil.InstanceConfig()
if err != nil {
return err
}
if !conf.Layer {
return c.guest.RunInteractive(args...)
}

resp, err := lima.ShowSSH(config.CurrentProfile().ID, layer, "args")
resp, err := limautil.ShowSSH(config.CurrentProfile().ID, layer, "args")
if err != nil {
return fmt.Errorf("error getting ssh config: %w", err)
}
Expand Down Expand Up @@ -256,7 +257,7 @@ func (c colimaApp) Status() error {
log.Println(config.CurrentProfile().DisplayName, "is running")
log.Println("arch:", c.guest.Arch())
log.Println("runtime:", currentRuntime)
if conf, err := lima.InstanceConfig(); err == nil {
if conf, err := limautil.InstanceConfig(); err == nil {
log.Println("mountType:", conf.MountType)
}
if currentRuntime == docker.Name {
Expand Down
15 changes: 11 additions & 4 deletions cmd/colima/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,12 +10,12 @@ import (
_ "github.com/abiosoft/colima/cmd" // for other commands
_ "github.com/abiosoft/colima/cmd/daemon" // for vmnet daemon
_ "github.com/abiosoft/colima/embedded" // for embedded assets
"github.com/abiosoft/colima/environment/vm/lima/network/daemon/gvproxy"
"github.com/abiosoft/colima/util"
"github.com/sirupsen/logrus"

"github.com/abiosoft/colima/cmd/root"
"github.com/abiosoft/colima/config"
"github.com/abiosoft/colima/daemon/process/gvproxy"
"github.com/abiosoft/colima/util"
"github.com/sirupsen/logrus"
)

func main() {
Expand All @@ -27,6 +27,7 @@ func main() {
root.Execute()
}
}

func qemuWrapper(qemu string) {
if profile := os.Getenv(config.SubprocessProfileEnvVar); profile != "" {
config.SetProfile(profile)
Expand Down Expand Up @@ -79,6 +80,12 @@ func qemuWrapper(qemu string) {
cmd.ExtraFiles = append(cmd.ExtraFiles, fd)
}

_ = cmd.Run()
err := cmd.Run()
if err != nil {
if err, ok := err.(*exec.ExitError); ok {
os.Exit(err.ExitCode())
}
os.Exit(1)
}

}
23 changes: 12 additions & 11 deletions cmd/daemon/cmd.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,9 @@ import (
"context"
"time"

"github.com/abiosoft/colima/environment/vm/lima/network/daemon"
"github.com/abiosoft/colima/environment/vm/lima/network/daemon/gvproxy"
"github.com/abiosoft/colima/environment/vm/lima/network/daemon/vmnet"
"github.com/abiosoft/colima/daemon/process"
"github.com/abiosoft/colima/daemon/process/gvproxy"
"github.com/abiosoft/colima/daemon/process/vmnet"

"github.com/abiosoft/colima/cmd/root"
"github.com/abiosoft/colima/config"
Expand All @@ -18,10 +18,6 @@ var daemonCmd = &cobra.Command{
Short: "daemon",
Long: `runner for background daemons.`,
Hidden: true,
PersistentPreRun: func(cmd *cobra.Command, args []string) {
cmd.SilenceUsage = true
cmd.SilenceErrors = true
},
}

var startCmd = &cobra.Command{
Expand All @@ -31,16 +27,17 @@ var startCmd = &cobra.Command{
Args: cobra.ExactArgs(1),
RunE: func(cmd *cobra.Command, args []string) error {
config.SetProfile(args[0])
ctx := cmd.Context()

var processes []daemon.Process
var processes []process.Process
if daemonArgs.vmnet {
processes = append(processes, vmnet.New())
}
if daemonArgs.gvproxy {
processes = append(processes, gvproxy.New())
}

return start(cmd.Context(), processes)
return start(ctx, processes)
},
}

Expand Down Expand Up @@ -74,8 +71,11 @@ var statusCmd = &cobra.Command{
}

var daemonArgs struct {
vmnet bool
gvproxy bool
vmnet bool
gvproxy bool
fsnotify bool

verbose bool
}

func init() {
Expand All @@ -87,4 +87,5 @@ func init() {

startCmd.Flags().BoolVar(&daemonArgs.vmnet, "vmnet", false, "start vmnet")
startCmd.Flags().BoolVar(&daemonArgs.gvproxy, "gvproxy", false, "start gvproxy")
startCmd.Flags().BoolVar(&daemonArgs.fsnotify, "fsnotify", false, "start fsnotify")
}
38 changes: 34 additions & 4 deletions cmd/daemon/daemon.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,16 +7,17 @@ import (
"os/signal"
"path/filepath"
"strconv"
"sync"
"syscall"
"time"

"github.com/abiosoft/colima/cli"
"github.com/abiosoft/colima/environment/vm/lima/network/daemon"
"github.com/abiosoft/colima/daemon/process"
godaemon "github.com/sevlyar/go-daemon"
"github.com/sirupsen/logrus"
)

var dir = daemon.Dir
var dir = process.Dir

// daemonize creates the daemon and returns if this is a child process
func daemonize() (ctx *godaemon.Context, child bool, err error) {
Expand Down Expand Up @@ -49,7 +50,7 @@ func daemonize() (ctx *godaemon.Context, child bool, err error) {
return ctx, true, nil
}

func start(ctx context.Context, processes []daemon.Process) error {
func start(ctx context.Context, processes []process.Process) error {
if status() == nil {
logrus.Info("daemon already running, startup ignored")
return nil
Expand All @@ -75,7 +76,7 @@ func start(ctx context.Context, processes []daemon.Process) error {
ctx, stop := signal.NotifyContext(ctx, syscall.SIGINT, syscall.SIGTERM)
defer stop()

return daemon.Run(ctx, processes...)
return RunProcesses(ctx, processes...)
}

func stop(ctx context.Context) error {
Expand Down Expand Up @@ -153,3 +154,32 @@ func Info() struct {
LogFile: filepath.Join(dir, logFileName),
}
}

// Run runs the daemon with background processes.
// NOTE: this must be called from the program entrypoint with minimal intermediary logic
// due to the creation of the daemon.
func RunProcesses(ctx context.Context, processes ...process.Process) error {
ctx, stop := context.WithCancel(ctx)
defer stop()

var wg sync.WaitGroup
wg.Add(len(processes))

for _, bg := range processes {
go func(bg process.Process) {
err := bg.Start(ctx)
if err != nil {
logrus.Error(fmt.Errorf("error starting %s: %w", bg.Name(), err))
stop()
}
wg.Done()
}(bg)
}

<-ctx.Done()
logrus.Info("terminate signal received")

wg.Wait()

return ctx.Err()
}
53 changes: 43 additions & 10 deletions cmd/daemon/daemon_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import (
"testing"
"time"

"github.com/abiosoft/colima/environment/vm/lima/network/daemon"
"github.com/abiosoft/colima/daemon/process"
)

var testDir string
Expand All @@ -19,22 +19,28 @@ func setDir(t *testing.T) {
dir = func() string { return testDir }
}

func TestStart(t *testing.T) {
setDir(t)
info := Info()

func getProcesses() []process.Process {
var addresses = []string{
"localhost",
"127.0.0.1",
}

t.Log("pidfile", info.PidFile)

var processes []daemon.Process
var processes []process.Process
for _, add := range addresses {
processes = append(processes, &pinger{address: add})
}

return processes
}

func TestStart(t *testing.T) {
setDir(t)
info := Info()

processes := getProcesses()

t.Log("pidfile", info.PidFile)

timeout := time.Second * 5
ctx, cancel := context.WithTimeout(context.Background(), timeout)
defer cancel()
Expand All @@ -54,6 +60,8 @@ func TestStart(t *testing.T) {
default:
if p, err := os.ReadFile(info.PidFile); err == nil && len(p) > 0 {
break loop
} else if err != nil {
t.Logf("encountered err: %v", err)
}
time.Sleep(1 * time.Second)
}
Expand All @@ -79,7 +87,32 @@ func TestStart(t *testing.T) {

}

var _ daemon.Process = (*pinger)(nil)
func TestRunProcesses(t *testing.T) {
processes := getProcesses()

timeout := time.Second * 5
ctx, cancel := context.WithTimeout(context.Background(), timeout)

// start the processes
done := make(chan error, 1)
go func() {
done <- RunProcesses(ctx, processes...)
}()

cancel()

select {
case <-ctx.Done():
if err := ctx.Err(); err != context.Canceled {
t.Error(err)
}
case err := <-done:
t.Error(err)
}

}

var _ process.Process = (*pinger)(nil)

type pinger struct {
address string
Expand All @@ -98,7 +131,7 @@ func (p *pinger) Start(ctx context.Context) error {
}

// Start implements BgProcess
func (p *pinger) Dependencies() ([]daemon.Dependency, bool) { return nil, false }
func (p *pinger) Dependencies() ([]process.Dependency, bool) { return nil, false }

func (p *pinger) run(ctx context.Context, command string, args ...string) error {
cmd := exec.CommandContext(ctx, command, args...)
Expand Down
4 changes: 2 additions & 2 deletions cmd/list.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import (
"text/tabwriter"

"github.com/abiosoft/colima/cmd/root"
"github.com/abiosoft/colima/environment/vm/lima"
"github.com/abiosoft/colima/environment/vm/lima/limautil"
"github.com/docker/go-units"
"github.com/sirupsen/logrus"
"github.com/spf13/cobra"
Expand All @@ -26,7 +26,7 @@ var listCmd = &cobra.Command{
A new instance can be created during 'colima start' by specifying the '--profile' flag.`,
Args: cobra.NoArgs,
RunE: func(cmd *cobra.Command, args []string) error {
instances, err := lima.Instances()
instances, err := limautil.Instances()
if err != nil {
return err
}
Expand Down
4 changes: 2 additions & 2 deletions cmd/ssh-config.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import (

"github.com/abiosoft/colima/cmd/root"
"github.com/abiosoft/colima/config"
"github.com/abiosoft/colima/environment/vm/lima"
"github.com/abiosoft/colima/environment/vm/lima/limautil"
"github.com/spf13/cobra"
)

Expand All @@ -16,7 +16,7 @@ var sshConfigCmd = &cobra.Command{
Long: `Show configuration of the SSH connection to the VM.`,
Args: cobra.MaximumNArgs(1),
RunE: func(cmd *cobra.Command, args []string) error {
resp, err := lima.ShowSSH(config.CurrentProfile().ID, sshConfigCmdArgs.layer, sshConfigCmdArgs.format)
resp, err := limautil.ShowSSH(config.CurrentProfile().ID, sshConfigCmdArgs.layer, sshConfigCmdArgs.format)
if err == nil {
fmt.Println(resp.Output)
}
Expand Down
11 changes: 11 additions & 0 deletions config/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -132,6 +132,17 @@ func (m Mount) CleanPath() (string, error) {
return strings.TrimSuffix(str, "/") + "/", nil
}

func (c Config) MountsOrDefault() []Mount {
if len(c.Mounts) > 0 {
return c.Mounts
}

return []Mount{
{Location: util.HomeDir(), Writable: true},
{Location: filepath.Join("/tmp", CurrentProfile().ID), Writable: true},
}
}

// Empty checks if the configuration is empty.
func (c Config) Empty() bool { return c.Runtime == "" } // this may be better but not really needed.

Expand Down
Loading

0 comments on commit 3c03f80

Please sign in to comment.