Skip to content

Commit

Permalink
Merge pull request #92 from mysteriumnetwork/fix/backend-switching
Browse files Browse the repository at this point in the history
Fix/backend switching
  • Loading branch information
Zensey committed Jul 7, 2023
2 parents 0c5a0c8 + 84f3ddc commit 6430915
Show file tree
Hide file tree
Showing 9 changed files with 134 additions and 68 deletions.
4 changes: 3 additions & 1 deletion app/state.go
Expand Up @@ -55,7 +55,9 @@ func (s *AppState) StartAppController() {

func (s *AppState) setAppController(c model.Controller) {
if s.ctrApp != nil {
s.action <- model.ActionStopRunner // wait prev. controller to finish
s.GetUI().TerminateWaitDialogueComplete()

s.ctrApp.Shutdown() // wait prev. controller to finish
}

s.ctrApp = c
Expand Down
14 changes: 9 additions & 5 deletions cmd/app/app.go
Expand Up @@ -38,16 +38,20 @@ func main() {
flagAutorun := flag.Bool(_const.FlagAutorun, false, "app is started by means of autorun")
flag.Parse()

if *debugMode {
utils.AllocConsole(false)
}
ap := app.NewApp()
ipc := ipc_.NewHandler()
defer func() {
ipc.Close()

if *debugMode {
utils.AllocConsole(false)
defer func() {
if *debugMode {
fmt.Println("Press 'Enter' to continue...")
bufio.NewReader(os.Stdin).ReadBytes('\n')
}()
}
}
}()

if *installFlag {
utils.InstallExe()
return
Expand Down
42 changes: 32 additions & 10 deletions controller/docker/docker.go
Expand Up @@ -27,6 +27,9 @@ type Controller struct {
mgr model_.PlatformManager
mystManager *myst.Manager
lg *log.Logger

wantExit bool // exit app
wantExitCtl bool // exit from controller
}

func NewController() *Controller {
Expand All @@ -44,6 +47,14 @@ func (c *Controller) SetApp(a model_.AppState) {

func (c *Controller) setFinished() {
c.finished = true

// read any left messages
select {
case <-c.a.GetAction():
//

default:
}
c.wg.Done()
}

Expand Down Expand Up @@ -82,10 +93,14 @@ func (c *Controller) Start() {

t1 := time.NewTicker(15 * time.Second)
for {
if wantExit := c.tryStartOrInstallDocker(docker); wantExit {
c.tryStartOrInstallDocker(docker)
if c.wantExit {
ui.CloseUI()
return
}
if c.wantExitCtl {
return
}
mdl.SwitchState(model_.UIStateInitial)

// docker is running now
Expand Down Expand Up @@ -136,18 +151,19 @@ func (c *Controller) Start() {
}

// returns: will exit, if tryInstallDocker requests it
func (c *Controller) tryStartOrInstallDocker(docker *DockerRunner) bool {
func (c *Controller) tryStartOrInstallDocker(docker *DockerRunner) {
c.lg.Println("tryStartOrInstallDocker")
mdl := c.a.GetModel()
ui := c.a.GetUI()

if mdl.Config.InitialState == model_.InitialStateStage1 {
return c.tryInstallDocker()
c.tryInstallDocker()
return
}

if docker.IsRunning() {
mdl.SetStateDocker(model_.RunnableStateRunning)
return false
return
}

// In case of suspend/resume some APIs may return unexpected error, so we need to retry it
Expand Down Expand Up @@ -175,35 +191,41 @@ func (c *Controller) tryStartOrInstallDocker(docker *DockerRunner) bool {
if err != nil {
c.lg.Println("error", err)
ui.ErrorModal("Application error", err.Error())
return true

c.wantExit = true
return
}

if isUnderVM && !mdl.Config.CheckVMSettingsConfirm {
ret := ui.YesNoModal("Requirements checker", "VM has been detected.\r\nPlease ensure that VT-x / EPT / IOMMU \r\nare enabled for this VM.\r\nRefer to VM settings.\r\n\r\nContinue ?")
if ret == model_.IDNO {
ui.TerminateWaitDialogueComplete()
return true
c.wantExit = true
return
}
mdl.Config.CheckVMSettingsConfirm = true
mdl.Config.Save()
}

if needSetup {
return c.tryInstallDocker()
c.tryInstallDocker()
return
}

isRunning, couldNotStart := docker.IsRunningOrTryStart()
if isRunning {
mdl.SetStateDocker(model_.RunnableStateRunning)
return false
return
}
mdl.SetStateDocker(model_.RunnableStateStarting)
if couldNotStart {
mdl.SetStateDocker(model_.RunnableStateUnknown)
return c.tryInstallDocker()

c.tryInstallDocker()
return
}

return false
return
}

func (c *Controller) restartContainer() {
Expand Down
57 changes: 36 additions & 21 deletions controller/docker/install_darwin.go
Expand Up @@ -17,14 +17,15 @@ import (
"github.com/mysteriumnetwork/myst-launcher/utils"
)

// returns exit mode: true means exit
func (c *Controller) tryInstallDocker() bool {
func (c *Controller) tryInstallDocker() {
mdl := c.a.GetModel()
ui := c.a.GetUI()

mdl.SwitchState(model.UIStateInstallNeeded)
if !ui.WaitDialogueComplete() {
return true
ok := ui.WaitDialogueComplete()
if ok == model.DLG_TERM {
c.wantExitCtl = true
return
}
mdl.SwitchState(model.UIStateInstallInProgress)

Expand All @@ -34,12 +35,14 @@ func (c *Controller) tryInstallDocker() bool {
c.lg.Println("Failed to query feature:", err)
mdl.SwitchState(model.UIStateInstallError)
mdl.UpdateProperties(model.UIProps{"CheckVTx": model.StepFailed})
return true
c.wantExit = true
return
}
if !featuresOK {
c.lg.Println("Virtualization is not supported !")
mdl.SwitchState(model.UIStateInstallError)
return true
c.wantExit = true
return
}
mdl.UpdateProperties(model.UIProps{"CheckVTx": model.StepFinished})

Expand All @@ -49,18 +52,20 @@ func (c *Controller) tryInstallDocker() bool {
c.lg.Println("Failed to check Docker:", err)
mdl.SwitchState(model.UIStateInstallError)
mdl.UpdateProperties(model.UIProps{"CheckDocker": model.StepFailed})
return true
c.wantExit = true
return
}
mdl.UpdateProperties(model.UIProps{"CheckDocker": model.StepFinished})

if hasDocker {
mdl.SwitchState(model.UIStateInstallFinished)
ok := ui.WaitDialogueComplete()
if !ok {
return true
if ok == model.DLG_TERM {
c.wantExitCtl = true
return
}
mdl.SwitchState(model.UIStateInitial)
return false
return
}

mdl.UpdateProperties(model.UIProps{"DownloadFiles": model.StepInProgress})
Expand All @@ -69,7 +74,8 @@ func (c *Controller) tryInstallDocker() bool {
if err != nil {
c.lg.Println("Couldn't get Docker Desktop link")
mdl.SwitchState(model.UIStateInstallError)
return true
c.wantExit = true
return
}
c.lg.Println("Downloading Docker desktop: ", url)
err = utils.DownloadFile(utils.GetTmpDir()+name, url, func(progress int) {
Expand All @@ -81,7 +87,8 @@ func (c *Controller) tryInstallDocker() bool {
c.lg.Println("Couldn't get Docker Desktop")
mdl.SwitchState(model.UIStateInstallError)
mdl.UpdateProperties(model.UIProps{"DownloadFiles": model.StepFailed})
return true
c.wantExit = true
return
}
mdl.UpdateProperties(model.UIProps{"DownloadFiles": model.StepFinished})

Expand All @@ -92,7 +99,8 @@ func (c *Controller) tryInstallDocker() bool {
c.lg.Println("Failed to run command:", err)
mdl.SwitchState(model.UIStateInstallError)
mdl.UpdateProperties(model.UIProps{"InstallDocker": model.StepFailed})
return true
c.wantExit = true
return
}
buf.Reset()

Expand All @@ -101,7 +109,8 @@ func (c *Controller) tryInstallDocker() bool {
c.lg.Println("Failed to run command:", err)
mdl.SwitchState(model.UIStateInstallError)
mdl.UpdateProperties(model.UIProps{"InstallDocker": model.StepFailed})
return true
c.wantExit = true
return
}
buf.Reset()

Expand All @@ -111,7 +120,8 @@ func (c *Controller) tryInstallDocker() bool {
c.lg.Println("Failed to run command:", err)
mdl.SwitchState(model.UIStateInstallError)
mdl.UpdateProperties(model.UIProps{"InstallDocker": model.StepFailed})
return true
c.wantExit = true
return
}
buf.Reset()

Expand All @@ -121,7 +131,8 @@ func (c *Controller) tryInstallDocker() bool {
c.lg.Println("Failed to run command:", err)
mdl.SwitchState(model.UIStateInstallError)
mdl.UpdateProperties(model.UIProps{"InstallDocker": model.StepFailed})
return true
c.wantExit = true
return
}
buf.Reset()

Expand All @@ -130,7 +141,8 @@ func (c *Controller) tryInstallDocker() bool {
c.lg.Println("Failed to run command:", err)
mdl.SwitchState(model.UIStateInstallError)
mdl.UpdateProperties(model.UIProps{"InstallDocker": model.StepFailed})
return true
c.wantExit = true
return
}
buf.Reset()

Expand All @@ -140,17 +152,20 @@ func (c *Controller) tryInstallDocker() bool {
c.lg.Println("Failed to run command:", err)
mdl.SwitchState(model.UIStateInstallError)
mdl.UpdateProperties(model.UIProps{"InstallDocker": model.StepFailed})
return true
c.wantExit = true
return
}
buf.Reset()

mdl.UpdateProperties(model.UIProps{"InstallDocker": model.StepFinished})
c.lg.Println("Installation succeeded")

mdl.SwitchState(model.UIStateInstallFinished)
if !ui.WaitDialogueComplete() {
return true
ok := ui.WaitDialogueComplete()
if ok == model.DLG_TERM {
c.wantExitCtl = true
return
}
mdl.SwitchState(model.UIStateInitial)
return false
return
}
21 changes: 10 additions & 11 deletions controller/docker/install_win32.go
Expand Up @@ -29,19 +29,19 @@ import (
const dockerUsersGroup = "docker-users"

// returns: will exit
func (c *Controller) tryInstallDocker() bool {
func (c *Controller) tryInstallDocker() {
mgr := c.mgr.(*platform.Manager)
mdl := c.a.GetModel()
ui := c.a.GetUI()
// action := c.a.GetAction()

mdl.ResetProperties()
mdl.SwitchState(model.UIStateInstallNeeded)

if mdl.Config.InitialState != model.InitialStateStage1 && mdl.Config.InitialState != model.InitialStateStage2 {
ok := ui.WaitDialogueComplete()
if !ok {
return true
if ok == model.DLG_TERM {
c.wantExitCtl = true
return
}
}

Expand All @@ -51,7 +51,8 @@ func (c *Controller) tryInstallDocker() bool {
mdl.Config.Save()
}
utils.RunasWithArgsNoWait("")
return true
c.wantExit = true
return
}

mdl.SwitchState(model.UIStateInstallInProgress)
Expand Down Expand Up @@ -242,11 +243,10 @@ func (c *Controller) tryInstallDocker() bool {
return true
})

wantExit := false
if !executor.Run() {
mdl.SwitchState(model.UIStateInstallError)
c.lg.Println("Installation have stopped")
wantExit = true
c.wantExit = true
} else {
// TODO: unelevate rights

Expand All @@ -255,10 +255,9 @@ func (c *Controller) tryInstallDocker() bool {
c.lg.Println("Installation succeeded")
}

// mdl.SetWantExit()
ok := ui.WaitDialogueComplete()
if !ok {
return true
if ok == model.DLG_TERM {
c.wantExitCtl = true
return
}
return wantExit
}

0 comments on commit 6430915

Please sign in to comment.