-
Notifications
You must be signed in to change notification settings - Fork 86
/
virtual_machine_start.go
115 lines (101 loc) · 3.06 KB
/
virtual_machine_start.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
package main
import (
"fmt"
"github.com/runfinch/finch/pkg/disk"
"github.com/runfinch/finch/pkg/command"
"github.com/runfinch/finch/pkg/config"
"github.com/runfinch/finch/pkg/dependency"
"github.com/runfinch/finch/pkg/flog"
"github.com/runfinch/finch/pkg/lima"
"github.com/spf13/afero"
"github.com/spf13/cobra"
)
func newStartVMCommand(
lcc command.LimaCmdCreator,
logger flog.Logger,
optionalDepGroups []*dependency.Group,
lca config.LimaConfigApplier,
nca config.NerdctlConfigApplier,
fs afero.Fs,
privateKeyPath string,
dm disk.UserDataDiskManager,
) *cobra.Command {
return &cobra.Command{
Use: "start",
Short: "Start the virtual machine",
RunE: newStartVMAction(lcc, logger, optionalDepGroups, lca, dm).runAdapter,
PostRunE: newPostVMStartInitAction(logger, lcc, fs, privateKeyPath, nca).runAdapter,
}
}
type startVMAction struct {
creator command.LimaCmdCreator
logger flog.Logger
optionalDepGroups []*dependency.Group
limaConfigApplier config.LimaConfigApplier
userDataDiskManager disk.UserDataDiskManager
}
func newStartVMAction(
creator command.LimaCmdCreator,
logger flog.Logger,
optionalDepGroups []*dependency.Group,
lca config.LimaConfigApplier,
dm disk.UserDataDiskManager,
) *startVMAction {
return &startVMAction{
creator: creator,
logger: logger,
optionalDepGroups: optionalDepGroups,
limaConfigApplier: lca,
userDataDiskManager: dm,
}
}
func (sva *startVMAction) runAdapter(_ *cobra.Command, _ []string) error {
return sva.run()
}
func (sva *startVMAction) run() error {
err := sva.assertVMIsStopped(sva.creator, sva.logger)
if err != nil {
return err
}
err = dependency.InstallOptionalDeps(sva.optionalDepGroups, sva.logger)
if err != nil {
sva.logger.Errorf("Dependency error: %v", err)
}
err = sva.limaConfigApplier.Apply(false)
if err != nil {
return err
}
// TODO: don't run this on Windows
err = sva.userDataDiskManager.EnsureUserDataDisk()
if err != nil {
return err
}
limaCmd := sva.creator.CreateWithoutStdio("start", limaInstanceName)
sva.logger.Info("Starting existing Finch virtual machine...")
logs, err := limaCmd.CombinedOutput()
if err != nil {
sva.logger.SetFormatter(flog.TextWithoutTruncation)
sva.logger.Errorf("Finch virtual machine failed to start, debug logs:\n%s", logs)
sva.logger.SetFormatter(flog.Text)
return err
}
sva.logger.Info("Finch virtual machine started successfully")
return nil
}
func (sva *startVMAction) assertVMIsStopped(creator command.LimaCmdCreator, logger flog.Logger) error {
status, err := lima.GetVMStatus(creator, logger, limaInstanceName)
if err != nil {
return err
}
switch status {
case lima.Nonexistent:
return fmt.Errorf("the instance %q does not exist, run `finch %s init` to create a new instance",
limaInstanceName, virtualMachineRootCmd)
case lima.Running:
return fmt.Errorf("the instance %q is already running", limaInstanceName)
default:
return nil
}
}