summaryrefslogtreecommitdiff
path: root/pkg/machine/ignition.go
diff options
context:
space:
mode:
authorbaude <bbaude@redhat.com>2021-03-25 10:35:43 -0500
committerbaude <bbaude@redhat.com>2021-03-27 10:08:11 -0500
commit7a79f708a4521ba7c42da83a204a01ace010ace3 (patch)
tree42e4128908fa127d158ad0673b033740d416d1f4 /pkg/machine/ignition.go
parentec47312eebf11abcf74b5bf06df19ee2fb7b8afd (diff)
downloadpodman-7a79f708a4521ba7c42da83a204a01ace010ace3.tar.gz
podman-7a79f708a4521ba7c42da83a204a01ace010ace3.tar.bz2
podman-7a79f708a4521ba7c42da83a204a01ace010ace3.zip
Podman machine enhancements
Podman machine remove is now called `rm`. Podman machine create now supports resizing the image to the value of --disk-size as provided. The default is to 10G. Added systemd unit file on guest via ignition that sends a Ready message to the host over a virtio-socket so that we know when the VM is booted and ready for use. Podman machine commands no longer require a VM name as an argument. A default VM name is defined and if no VM name is provided as a arg, the default will be used. [NO TESTS NEEDED] Signed-off-by: baude <bbaude@redhat.com>
Diffstat (limited to 'pkg/machine/ignition.go')
-rw-r--r--pkg/machine/ignition.go51
1 files changed, 40 insertions, 11 deletions
diff --git a/pkg/machine/ignition.go b/pkg/machine/ignition.go
index ff79d5afb..a68d68ac3 100644
--- a/pkg/machine/ignition.go
+++ b/pkg/machine/ignition.go
@@ -2,6 +2,7 @@ package machine
import (
"encoding/json"
+ "fmt"
"io/ioutil"
)
@@ -37,10 +38,17 @@ func getNodeGrp(grpName string) NodeGroup {
return NodeGroup{Name: &grpName}
}
+type DynamicIgnition struct {
+ Name string
+ Key string
+ VMName string
+ WritePath string
+}
+
// NewIgnitionFile
-func NewIgnitionFile(name, key, writePath string) error {
- if len(name) < 1 {
- name = DefaultIgnitionUserName
+func NewIgnitionFile(ign DynamicIgnition) error {
+ if len(ign.Name) < 1 {
+ ign.Name = DefaultIgnitionUserName
}
ignVersion := Ignition{
Version: "3.2.0",
@@ -48,23 +56,44 @@ func NewIgnitionFile(name, key, writePath string) error {
ignPassword := Passwd{
Users: []PasswdUser{{
- Name: name,
- SSHAuthorizedKeys: []SSHAuthorizedKey{SSHAuthorizedKey(key)},
+ Name: ign.Name,
+ SSHAuthorizedKeys: []SSHAuthorizedKey{SSHAuthorizedKey(ign.Key)},
}},
}
ignStorage := Storage{
- Directories: getDirs(name),
- Files: getFiles(name),
- Links: getLinks(name),
+ Directories: getDirs(ign.Name),
+ Files: getFiles(ign.Name),
+ Links: getLinks(ign.Name),
}
+
+ // ready is a unit file that sets up the virtual serial device
+ // where when the VM is done configuring, it will send an ack
+ // so a listening host knows it can being interacting with it
+ ready := `[Unit]
+Requires=dev-virtio\\x2dports-%s.device
+OnFailure=emergency.target
+OnFailureJobMode=isolate
+[Service]
+Type=oneshot
+RemainAfterExit=yes
+ExecStart=/bin/sh -c '/usr/bin/echo Ready >/dev/%s'
+[Install]
+RequiredBy=multi-user.target
+`
+ _ = ready
ignSystemd := Systemd{
Units: []Unit{
{
Enabled: boolToPtr(true),
Name: "podman.socket",
- }}}
-
+ },
+ {
+ Enabled: boolToPtr(true),
+ Name: "ready.service",
+ Contents: strToPtr(fmt.Sprintf(ready, "vport1p1", "vport1p1")),
+ },
+ }}
ignConfig := Config{
Ignition: ignVersion,
Passwd: ignPassword,
@@ -75,7 +104,7 @@ func NewIgnitionFile(name, key, writePath string) error {
if err != nil {
return err
}
- return ioutil.WriteFile(writePath, b, 0644)
+ return ioutil.WriteFile(ign.WritePath, b, 0644)
}
func getDirs(usrName string) []Directory {