-
Notifications
You must be signed in to change notification settings - Fork 18
/
persistentworker.go
61 lines (52 loc) · 2.29 KB
/
persistentworker.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
package persistentworker
import (
"errors"
"fmt"
"github.com/cirruslabs/cirrus-ci-agent/api"
"github.com/cirruslabs/cirrus-cli/internal/executor/instance/abstract"
"github.com/cirruslabs/cirrus-cli/internal/executor/instance/persistentworker/isolation/container"
"github.com/cirruslabs/cirrus-cli/internal/executor/instance/persistentworker/isolation/none"
"github.com/cirruslabs/cirrus-cli/internal/executor/instance/persistentworker/isolation/parallels"
"github.com/cirruslabs/cirrus-cli/internal/executor/instance/persistentworker/isolation/tart"
"github.com/cirruslabs/cirrus-cli/internal/logger"
"runtime"
"strings"
)
var ErrInvalidIsolation = errors.New("invalid isolation parameters")
func New(isolation *api.Isolation, logger logger.Lightweight) (abstract.Instance, error) {
if isolation == nil {
return none.New(none.WithLogger(logger))
}
switch iso := isolation.Type.(type) {
case *api.Isolation_None_:
return none.New(none.WithLogger(logger))
case *api.Isolation_Parallels_:
if iso.Parallels.Platform != api.Platform_DARWIN && iso.Parallels.Platform != api.Platform_LINUX {
return nil, fmt.Errorf("%w: only Darwin and Linux are currently supported for Parallels",
ErrInvalidIsolation)
}
if runtime.GOARCH != "amd64" {
return nil, fmt.Errorf("%w: only Intel (amd64) is currently supported for Parallels, "+
"use Tart if you're running on Apple silicon (arm64)", ErrInvalidIsolation)
}
return parallels.New(iso.Parallels.Image, iso.Parallels.User, iso.Parallels.Password,
strings.ToLower(iso.Parallels.Platform.String()), parallels.WithLogger(logger))
case *api.Isolation_Container_:
return container.New(iso.Container.Image, iso.Container.Cpu, iso.Container.Memory, iso.Container.Volumes)
case *api.Isolation_Tart_:
opts := []tart.Option{tart.WithLogger(logger)}
if iso.Tart.Softnet {
opts = append(opts, tart.WithSoftnet())
}
if iso.Tart.Display != "" {
opts = append(opts, tart.WithDisplay(iso.Tart.Display))
}
if iso.Tart.MountTemporaryWorkingDirectoryFromHost {
opts = append(opts, tart.WithMountTemporaryWorkingDirectoryFromHost())
}
return tart.New(iso.Tart.Image, iso.Tart.User, iso.Tart.Password, iso.Tart.Cpu, iso.Tart.Memory,
opts...)
default:
return nil, fmt.Errorf("%w: unsupported isolation type %T", ErrInvalidIsolation, iso)
}
}