From 561ce19038bd9dd4623980f5706e80f4fcbd5985 Mon Sep 17 00:00:00 2001 From: Madhu Date: Wed, 2 Aug 2023 21:38:57 +0530 Subject: [PATCH] Added s390x layout feature --- config/fcos/v1_6_exp/schema.go | 1 + config/fcos/v1_6_exp/translate.go | 62 ++++++++++++++++++++++++++++++- config/fcos/v1_6_exp/validate.go | 2 +- 3 files changed, 63 insertions(+), 2 deletions(-) diff --git a/config/fcos/v1_6_exp/schema.go b/config/fcos/v1_6_exp/schema.go index 140cd31a..52cdfb43 100644 --- a/config/fcos/v1_6_exp/schema.go +++ b/config/fcos/v1_6_exp/schema.go @@ -32,6 +32,7 @@ type BootDevice struct { type BootDeviceLuks struct { Discard *bool `yaml:"discard"` + Device *string `yaml:"device"` Tang []base.Tang `yaml:"tang"` Threshold *int `yaml:"threshold"` Tpm2 *bool `yaml:"tpm2"` diff --git a/config/fcos/v1_6_exp/translate.go b/config/fcos/v1_6_exp/translate.go index 5a5d02ca..e39a1134 100644 --- a/config/fcos/v1_6_exp/translate.go +++ b/config/fcos/v1_6_exp/translate.go @@ -17,6 +17,8 @@ package v1_6_exp import ( "fmt" "strings" + "regexp" + "strconv" baseutil "github.com/coreos/butane/base/util" "github.com/coreos/butane/config/common" @@ -29,6 +31,11 @@ import ( "github.com/coreos/vcontext/report" ) +var ( + dasdRe = regexp.MustCompile("(/dev/dasd[a-z]$)") + sdRe = regexp.MustCompile("(/dev/sd[a-z]$)") +) + const ( reservedTypeGuid = "8DA63339-0007-60C0-C436-083AC8230908" biosTypeGuid = "21686148-6449-6E6F-744E-656564454649" @@ -109,16 +116,25 @@ func (c Config) processBootDevice(config *types.Config, ts *translate.Translatio var r report.Report // check for high-level features - wantLuks := util.IsTrue(c.BootDevice.Luks.Tpm2) || len(c.BootDevice.Luks.Tang) > 0 + wantLuks := util.IsTrue(c.BootDevice.Luks.Tpm2) || len(c.BootDevice.Luks.Tang) > 0 + wantLuksDevice := len(c.BootDeviceLuks.Device) > 0 && len(c.BootDevice.Luks.Tang) > 0 wantMirror := len(c.BootDevice.Mirror.Devices) > 0 if !wantLuks && !wantMirror { return r } + + // s390x zfcp and dasd does not support mirror + if wantLuksDevice && wantMirror { + return r + } // compute layout rendering options var wantBIOSPart bool var wantEFIPart bool var wantPRePPart bool + var wantMBR bool + var wantDasd bool + var wantKVM bool layout := c.BootDevice.Layout switch { case layout == nil || *layout == "x86_64": @@ -128,6 +144,14 @@ func (c Config) processBootDevice(config *types.Config, ts *translate.Translatio wantEFIPart = true case *layout == "ppc64le": wantPRePPart = true + case *layout == "s390x-zfcp": + wantMBR = true + case *layout == "s390x-eckd": + wantDasd = true + case *layout == "s390x-virt": + wantBIOSPart = true + wantEFIPart = true + default: // should have failed validation panic("unknown layout") @@ -258,6 +282,42 @@ func (c Config) processBootDevice(config *types.Config, ts *translate.Translatio renderedTranslations.AddTranslation(lpath, path.New("json", "storage", "luks")) r.Merge(r2) } + + //encrypted root partition for s390x + if wantLuksDevice { + var luksDevice string + dasd := dasdRe.FindString(c.BootDeviceLuks.Device) + sd := sdRe.FindString(c.BootDeviceLuks.Device) + + switch { + case wantMBR && len(sd) != 0: + luksDevice = sd + strconv.Itoa(2) + case wantDasd && len(dasd) != 0: + luksDevice = dasd + strconv.Itoa(2) + default: + panic("can't happen") + } + clevis, ts2, r2 := translateBootDeviceLuks(c.BootDevice.Luks, options) + rendered.Storage.Luks = []types.Luks{{ + Clevis: clevis, + Device: &luksDevice, + Discard: c.BootDevice.Luks.Discard, + Label: util.StrToPtr("luks-root"), + Name: "root", + WipeVolume: util.BoolToPtr(true), + }} + lpath := path.New("yaml", "boot_device", "luks") + rpath := path.New("json", "storage", "luks", 0) + renderedTranslations.Merge(ts2.PrefixPaths(lpath, rpath.Append("clevis"))) + renderedTranslations.AddTranslation(lpath.Append("discard"), rpath.Append("discard")) + for _, f := range []string{"device", "label", "name", "wipeVolume"} { + renderedTranslations.AddTranslation(lpath, rpath.Append(f)) + } + renderedTranslations.AddTranslation(lpath, rpath) + renderedTranslations.AddTranslation(lpath, path.New("json", "storage", "luks")) + r.Merge(r2) + + } // create root filesystem var rootDevice string diff --git a/config/fcos/v1_6_exp/validate.go b/config/fcos/v1_6_exp/validate.go index b37585c4..bb271d28 100644 --- a/config/fcos/v1_6_exp/validate.go +++ b/config/fcos/v1_6_exp/validate.go @@ -25,7 +25,7 @@ import ( func (d BootDevice) Validate(c path.ContextPath) (r report.Report) { if d.Layout != nil { switch *d.Layout { - case "aarch64", "ppc64le", "x86_64": + case "aarch64", "ppc64le", "x86_64", "s390x-zfcp", "s390x-eckd", "s390x-virt": default: r.AddOnError(c.Append("layout"), common.ErrUnknownBootDeviceLayout) }