summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrent Baude <bbaude@redhat.com>2021-12-14 14:16:09 -0600
committerBrent Baude <bbaude@redhat.com>2021-12-16 12:40:20 -0600
commita86495ea6fdd56519afc65586c0f7f9c0f4f5ab2 (patch)
treebdf7576ddf565cf60b889bc7fd825b40ec6376e5
parent273da42af237dde44d34d215dfafa33f0b76d9ab (diff)
downloadpodman-a86495ea6fdd56519afc65586c0f7f9c0f4f5ab2.tar.gz
podman-a86495ea6fdd56519afc65586c0f7f9c0f4f5ab2.tar.bz2
podman-a86495ea6fdd56519afc65586c0f7f9c0f4f5ab2.zip
Set machine timezone
Added an option to podman machine init to declare the timezone of the resulting machine. the default is to use the value of the host name or else a given timezone name like America/Chicago. Fixes: #11895 Signed-off-by: Brent Baude <bbaude@redhat.com> [NO NEW TESTS NEEDED] Signed-off-by: Brent Baude <bbaude@redhat.com>
-rw-r--r--cmd/podman/machine/init.go8
-rw-r--r--docs/source/markdown/podman-machine-init.1.md6
-rw-r--r--pkg/machine/config.go1
-rw-r--r--pkg/machine/ignition.go33
-rw-r--r--pkg/machine/ignition_darwin.go16
-rw-r--r--pkg/machine/ignition_linux.go15
-rw-r--r--pkg/machine/qemu/machine.go2
7 files changed, 80 insertions, 1 deletions
diff --git a/cmd/podman/machine/init.go b/cmd/podman/machine/init.go
index adde887f7..bee6844df 100644
--- a/cmd/podman/machine/init.go
+++ b/cmd/podman/machine/init.go
@@ -38,7 +38,6 @@ func init() {
})
flags := initCmd.Flags()
cfg := registry.PodmanConfig()
-
cpusFlagName := "cpus"
flags.Uint64Var(
&initOpts.CPUS,
@@ -69,6 +68,13 @@ func init() {
"now", false,
"Start machine now",
)
+ timezoneFlagName := "timezone"
+ defaultTz := cfg.TZ()
+ if len(defaultTz) < 1 {
+ defaultTz = "local"
+ }
+ flags.StringVar(&initOpts.TimeZone, timezoneFlagName, defaultTz, "Set timezone")
+ _ = initCmd.RegisterFlagCompletionFunc(timezoneFlagName, completion.AutocompleteDefault)
ImagePathFlagName := "image-path"
flags.StringVar(&initOpts.ImagePath, ImagePathFlagName, cfg.Machine.Image, "Path to qcow image")
diff --git a/docs/source/markdown/podman-machine-init.1.md b/docs/source/markdown/podman-machine-init.1.md
index 3abc7c9ea..aead6c695 100644
--- a/docs/source/markdown/podman-machine-init.1.md
+++ b/docs/source/markdown/podman-machine-init.1.md
@@ -55,6 +55,12 @@ Memory (in MB).
Start the virtual machine immediately after it has been initialized.
+#### **--timezone**
+
+Set the timezone for the machine and containers. Valid values are `local` or
+a `timezone` such as `America/Chicago`. A value of `local`, which is the default,
+means to use the timezone of the machine host.
+
#### **--help**
Print usage statement.
diff --git a/pkg/machine/config.go b/pkg/machine/config.go
index 55d5dd7b4..e5e701303 100644
--- a/pkg/machine/config.go
+++ b/pkg/machine/config.go
@@ -21,6 +21,7 @@ type InitOptions struct {
IsDefault bool
Memory uint64
Name string
+ TimeZone string
URI url.URL
Username string
}
diff --git a/pkg/machine/ignition.go b/pkg/machine/ignition.go
index 5c465d37d..9368cc8ed 100644
--- a/pkg/machine/ignition.go
+++ b/pkg/machine/ignition.go
@@ -7,6 +7,7 @@ import (
"fmt"
"io/ioutil"
"net/url"
+ "path/filepath"
)
/*
@@ -44,6 +45,7 @@ func getNodeGrp(grpName string) NodeGroup {
type DynamicIgnition struct {
Name string
Key string
+ TimeZone string
VMName string
WritePath string
}
@@ -76,6 +78,37 @@ func NewIgnitionFile(ign DynamicIgnition) error {
Links: getLinks(ign.Name),
}
+ // Add or set the time zone for the machine
+ if len(ign.TimeZone) > 0 {
+ var (
+ err error
+ tz string
+ )
+ // local means the same as the host
+ // lookup where it is pointing to on the host
+ if ign.TimeZone == "local" {
+ tz, err = getLocalTimeZone()
+ if err != nil {
+ return err
+ }
+ } else {
+ tz = ign.TimeZone
+ }
+ tzLink := Link{
+ Node: Node{
+ Group: getNodeGrp("root"),
+ Path: "/etc/localtime",
+ Overwrite: boolToPtr(false),
+ User: getNodeUsr("root"),
+ },
+ LinkEmbedded1: LinkEmbedded1{
+ Hard: boolToPtr(false),
+ Target: filepath.Join("/usr/share/zoneinfo", tz),
+ },
+ }
+ ignStorage.Links = append(ignStorage.Links, tzLink)
+ }
+
// 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
diff --git a/pkg/machine/ignition_darwin.go b/pkg/machine/ignition_darwin.go
new file mode 100644
index 000000000..9ede4b026
--- /dev/null
+++ b/pkg/machine/ignition_darwin.go
@@ -0,0 +1,16 @@
+//+build darwin
+
+package machine
+
+import (
+ "os"
+ "strings"
+)
+
+func getLocalTimeZone() (string, error) {
+ tzPath, err := os.Readlink("/etc/localtime")
+ if err != nil {
+ return "", err
+ }
+ return strings.TrimPrefix(tzPath, "/var/db/timezone/zoneinfo"), nil
+}
diff --git a/pkg/machine/ignition_linux.go b/pkg/machine/ignition_linux.go
new file mode 100644
index 000000000..6db5a8e7a
--- /dev/null
+++ b/pkg/machine/ignition_linux.go
@@ -0,0 +1,15 @@
+package machine
+
+import (
+ "os/exec"
+ "strings"
+)
+
+func getLocalTimeZone() (string, error) {
+ output, err := exec.Command("timedatectl", "show", "--property=Timezone").Output()
+ if err != nil {
+ return "", err
+ }
+ // Remove prepended field and the newline
+ return strings.TrimPrefix(strings.TrimSuffix(string(output), "\n"), "Timezone="), nil
+}
diff --git a/pkg/machine/qemu/machine.go b/pkg/machine/qemu/machine.go
index 57c32bf74..19cd131e1 100644
--- a/pkg/machine/qemu/machine.go
+++ b/pkg/machine/qemu/machine.go
@@ -145,6 +145,7 @@ func (v *MachineVM) Init(opts machine.InitOptions) error {
// Get image as usual
v.ImageStream = opts.ImagePath
dd, err := machine.NewFcosDownloader(vmtype, v.Name, opts.ImagePath)
+
if err != nil {
return err
}
@@ -235,6 +236,7 @@ func (v *MachineVM) Init(opts machine.InitOptions) error {
Name: opts.Username,
Key: key,
VMName: v.Name,
+ TimeZone: opts.TimeZone,
WritePath: v.IgnitionFilePath,
}
return machine.NewIgnitionFile(ign)