Merge pull request #17217 from ygalblum/ygal-quadlet-blockdev-support

quadlet: Add device support for .volume files
This commit is contained in:
OpenShift Merge Robot
2023-01-26 10:20:52 -05:00
committed by GitHub
5 changed files with 93 additions and 3 deletions

View File

@ -412,6 +412,23 @@ Set one or more OCI labels on the volume. The format is a list of
This key can be listed multiple times. This key can be listed multiple times.
#### `Device=`
The path of a device which should be mounted for the volume.
#### `Type=`
The filesystem type of `Device` as used by the **mount(8)** commands `-t` option.
#### `Options=`
The mount options to use for a filesystem as used by the **mount(8)** command `-o` option.
#### `Copy=` (default to `yes`)
If enabled, the content of the image located at the mountpoint of the volume is copied into the
volume on the first run.
### Network units ### Network units
Network files are named with a `.network` extension and contain a section `[Network]` describing the Network files are named with a `.network` extension and contain a section `[Network]` describing the

View File

@ -50,6 +50,10 @@ const (
KeyPublishPort = "PublishPort" KeyPublishPort = "PublishPort"
KeyUser = "User" KeyUser = "User"
KeyGroup = "Group" KeyGroup = "Group"
KeyDevice = "Device"
KeyType = "Type"
KeyOptions = "Options"
KeyCopy = "Copy"
KeyVolume = "Volume" KeyVolume = "Volume"
KeyPodmanArgs = "PodmanArgs" KeyPodmanArgs = "PodmanArgs"
KeyLabel = "Label" KeyLabel = "Label"
@ -113,6 +117,10 @@ var (
supportedVolumeKeys = map[string]bool{ supportedVolumeKeys = map[string]bool{
KeyUser: true, KeyUser: true,
KeyGroup: true, KeyGroup: true,
KeyDevice: true,
KeyType: true,
KeyOptions: true,
KeyCopy: true,
KeyLabel: true, KeyLabel: true,
} }
@ -622,6 +630,44 @@ func ConvertVolume(volume *parser.UnitFile, name string) (*parser.UnitFile, erro
opts.WriteString(fmt.Sprintf("gid=%d", gid)) opts.WriteString(fmt.Sprintf("gid=%d", gid))
} }
copy, ok := volume.LookupBoolean(VolumeGroup, KeyCopy)
if ok {
if copy {
podman.add("--opt", "copy")
} else {
podman.add("--opt", "nocopy")
}
}
devValid := false
dev, ok := volume.Lookup(VolumeGroup, KeyDevice)
if ok && len(dev) != 0 {
podman.add("--opt", fmt.Sprintf("device=%s", dev))
devValid = true
}
devType, ok := volume.Lookup(VolumeGroup, KeyType)
if ok && len(devType) != 0 {
if devValid {
podman.add("--opt", fmt.Sprintf("type=%s", devType))
} else {
return nil, fmt.Errorf("key Type can't be used without Device")
}
}
mountOpts, ok := volume.Lookup(VolumeGroup, KeyOptions)
if ok && len(mountOpts) != 0 {
if devValid {
if opts.Len() > 2 {
opts.WriteString(",")
}
opts.WriteString(mountOpts)
} else {
return nil, fmt.Errorf("key Options can't be used without Device")
}
}
if opts.Len() > 2 { if opts.Len() > 2 {
podman.add("--opt", opts.String()) podman.add("--opt", opts.String())
} }

View File

@ -0,0 +1,13 @@
## assert-key-contains Service ExecStart " --opt o=uid=0,gid=11,rw,compress=zstd "
## assert-key-contains Service ExecStart " --opt type=btrfs "
## assert-key-contains Service ExecStart " --opt device=/dev/vda1 "
## assert-key-contains Service ExecStart " --opt copy "
[Volume]
# Test usernames too
User=root
Group=11
Device=/dev/vda1
Type=btrfs
Options=rw,compress=zstd
Copy=yes

View File

@ -0,0 +1,13 @@
## assert-key-contains Service ExecStart " --opt o=uid=0,gid=11,rw,compress=zstd "
## assert-key-contains Service ExecStart " --opt type=btrfs "
## assert-key-contains Service ExecStart " --opt device=/dev/vda1 "
## assert-key-contains Service ExecStart " --opt nocopy "
[Volume]
# Test usernames too
User=root
Group=11
Device=/dev/vda1
Type=btrfs
Options=rw,compress=zstd
Copy=no

View File

@ -482,6 +482,7 @@ var _ = Describe("quadlet system generator", func() {
Entry("basic.volume", "basic.volume"), Entry("basic.volume", "basic.volume"),
Entry("label.volume", "label.volume"), Entry("label.volume", "label.volume"),
Entry("uid.volume", "uid.volume"), Entry("uid.volume", "uid.volume"),
Entry("device.volume", "device-copy.volume"),
Entry("Basic kube", "basic.kube"), Entry("Basic kube", "basic.kube"),
Entry("Syslog Identifier", "syslog.identifier.kube"), Entry("Syslog Identifier", "syslog.identifier.kube"),