Skip to content

Commit 5bc1a68

Browse files
Add support for Fedora CoreOS
This commit is inspired by upstream docker-archive-public#4808
1 parent cdcfa4c commit 5bc1a68

File tree

2 files changed

+144
-0
lines changed

2 files changed

+144
-0
lines changed

libmachine/provision/fedora.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,3 +23,9 @@ type FedoraProvisioner struct {
2323
func (provisioner *FedoraProvisioner) String() string {
2424
return "fedora"
2525
}
26+
27+
func (provisioner *FedoraProvisioner) CompatibleWithHost() bool {
28+
isFedora := provisioner.OsReleaseInfo.ID == provisioner.OsReleaseID
29+
isCoreOS := provisioner.OsReleaseInfo.VariantID == "coreos"
30+
return isFedora && !isCoreOS
31+
}

libmachine/provision/fedora_coreos.go

Lines changed: 138 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,138 @@
1+
package provision
2+
3+
import (
4+
"bytes"
5+
"fmt"
6+
"text/template"
7+
8+
"github.com/rancher/machine/libmachine/auth"
9+
"github.com/rancher/machine/libmachine/drivers"
10+
"github.com/rancher/machine/libmachine/engine"
11+
"github.com/rancher/machine/libmachine/log"
12+
"github.com/rancher/machine/libmachine/provision/pkgaction"
13+
"github.com/rancher/machine/libmachine/swarm"
14+
)
15+
16+
func init() {
17+
Register("Fedora-CoreOS", &RegisteredProvisioner{
18+
New: NewFedoraCoreOSProvisioner,
19+
})
20+
}
21+
22+
// NewFedoraCoreOSProvisioner creates a new provisioner for a driver
23+
func NewFedoraCoreOSProvisioner(d drivers.Driver) Provisioner {
24+
return &FedoraCoreOSProvisioner{
25+
NewSystemdProvisioner("fedora", d),
26+
}
27+
}
28+
29+
// FedoraCoreOSProvisioner is a provisioner based on the CoreOS provisioner
30+
type FedoraCoreOSProvisioner struct {
31+
SystemdProvisioner
32+
}
33+
34+
// String returns the name of the provisioner
35+
func (provisioner *FedoraCoreOSProvisioner) String() string {
36+
return "Fedora CoreOS"
37+
}
38+
39+
// SetHostname sets the hostname of the remote machine
40+
func (provisioner *FedoraCoreOSProvisioner) SetHostname(hostname string) error {
41+
log.Debugf("SetHostname: %s", hostname)
42+
43+
command := fmt.Sprintf("sudo hostnamectl set-hostname %s", hostname)
44+
if _, err := provisioner.SSHCommand(command); err != nil {
45+
return err
46+
}
47+
48+
return nil
49+
}
50+
51+
// GenerateDockerOptions formats a systemd drop-in unit which adds support for
52+
// Docker Machine
53+
func (provisioner *FedoraCoreOSProvisioner) GenerateDockerOptions(dockerPort int) (*DockerOptions, error) {
54+
var (
55+
engineCfg bytes.Buffer
56+
)
57+
58+
driverNameLabel := fmt.Sprintf("provider=%s", provisioner.Driver.DriverName())
59+
provisioner.EngineOptions.Labels = append(provisioner.EngineOptions.Labels, driverNameLabel)
60+
61+
engineConfigTmpl := `[Service]
62+
ExecStart=
63+
ExecStart=/usr/bin/dockerd \\
64+
--host=fd:// \\
65+
--exec-opt native.cgroupdriver=systemd \\
66+
--host=tcp://0.0.0.0:{{.DockerPort}} \\
67+
--tlsverify \\
68+
--tlscacert {{.AuthOptions.CaCertRemotePath}} \\
69+
--tlscert {{.AuthOptions.ServerCertRemotePath}} \\
70+
--tlskey {{.AuthOptions.ServerKeyRemotePath}}{{ range .EngineOptions.Labels }} \\
71+
--label {{.}}{{ end }}{{ range .EngineOptions.InsecureRegistry }} \\
72+
--insecure-registry {{.}}{{ end }}{{ range .EngineOptions.RegistryMirror }} \\
73+
--registry-mirror {{.}}{{ end }}{{ range .EngineOptions.ArbitraryFlags }} \\
74+
-{{.}}{{ end }} \\
75+
\$OPTIONS
76+
Environment={{range .EngineOptions.Env}}{{ printf "%q" . }} {{end}}
77+
`
78+
79+
t, err := template.New("engineConfig").Parse(engineConfigTmpl)
80+
if err != nil {
81+
return nil, err
82+
}
83+
84+
engineConfigContext := EngineConfigContext{
85+
DockerPort: dockerPort,
86+
AuthOptions: provisioner.AuthOptions,
87+
EngineOptions: provisioner.EngineOptions,
88+
}
89+
90+
t.Execute(&engineCfg, engineConfigContext)
91+
92+
return &DockerOptions{
93+
EngineOptions: engineCfg.String(),
94+
EngineOptionsPath: provisioner.DaemonOptionsFile,
95+
}, nil
96+
}
97+
98+
// CompatibleWithHost returns whether or not this provisoner is compatible
99+
// with the target host
100+
func (provisioner *FedoraCoreOSProvisioner) CompatibleWithHost() bool {
101+
isFedora := provisioner.OsReleaseInfo.ID == "fedora"
102+
isCoreOS := provisioner.OsReleaseInfo.VariantID == "coreos"
103+
return isFedora && isCoreOS
104+
}
105+
106+
// Package installs a package on the remote host. The Fedora CoreOS provisioner
107+
// does not support (or need) any package installation
108+
func (provisioner *FedoraCoreOSProvisioner) Package(name string, action pkgaction.PackageAction) error {
109+
return nil
110+
}
111+
112+
// Provision provisions the machine
113+
func (provisioner *FedoraCoreOSProvisioner) Provision(swarmOptions swarm.Options, authOptions auth.Options, engineOptions engine.Options) error {
114+
provisioner.SwarmOptions = swarmOptions
115+
provisioner.AuthOptions = authOptions
116+
provisioner.EngineOptions = engineOptions
117+
118+
if err := provisioner.SetHostname(provisioner.Driver.GetMachineName()); err != nil {
119+
return err
120+
}
121+
122+
if err := makeDockerOptionsDir(provisioner); err != nil {
123+
return err
124+
}
125+
126+
log.Debugf("Preparing certificates")
127+
provisioner.AuthOptions = setRemoteAuthOptions(provisioner)
128+
129+
log.Debugf("Setting up certificates")
130+
if err := ConfigureAuth(provisioner); err != nil {
131+
return err
132+
}
133+
134+
log.Debug("Configuring swarm")
135+
err := configureSwarm(provisioner, swarmOptions, provisioner.AuthOptions)
136+
return err
137+
}
138+

0 commit comments

Comments
 (0)