From 9e2ff2999bbab7aa39cfe392a4ce5b77f5443081 Mon Sep 17 00:00:00 2001 From: Yuhang Wei Date: Tue, 26 Sep 2023 12:42:03 +0800 Subject: [PATCH] KubeOS: support labeling of multiple file systems Signed-off-by: Yuhang Wei --- cmd/agent/server/config.go | 4 +-- cmd/agent/server/config_test.go | 2 +- cmd/agent/server/server.go | 12 ++++----- cmd/agent/server/server_test.go | 10 ++++---- cmd/agent/server/utils.go | 45 ++++++++++++++++++++------------- cmd/agent/server/utils_test.go | 23 +++++++++-------- 6 files changed, 53 insertions(+), 43 deletions(-) diff --git a/cmd/agent/server/config.go b/cmd/agent/server/config.go index ee4297ab..1f3d25ac 100644 --- a/cmd/agent/server/config.go +++ b/cmd/agent/server/config.go @@ -133,12 +133,12 @@ func getConfigPartition(isCurPartition bool) (bool, error) { if err != nil { return false, err } - _, next, err := getNextPart(partA, partB) + nextPartInfo, err := getNextPart(partA, partB) if err != nil { return false, err } var flag bool - if next == "B" { + if nextPartInfo.menuentry == "B" { flag = true } return isCurPartition != flag, nil diff --git a/cmd/agent/server/config_test.go b/cmd/agent/server/config_test.go index 29bb9268..1a2bc7d4 100644 --- a/cmd/agent/server/config_test.go +++ b/cmd/agent/server/config_test.go @@ -479,7 +479,7 @@ func Test_getConfigPartition(t *testing.T) { patchRootfsDisks := gomonkey.ApplyFuncReturn(getRootfsDisks, "/dev/sda2", "/dev/sda3", nil) defer patchRootfsDisks.Reset() // assume now is partition A, want to swiching to partition B - patchGetNextPartition := gomonkey.ApplyFuncReturn(getNextPart, "/dev/sda3", "B", nil) + patchGetNextPartition := gomonkey.ApplyFuncReturn(getNextPart, partitionInfo{"/dev/sda3", "B", "ext4"}, nil) defer patchGetNextPartition.Reset() for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { diff --git a/cmd/agent/server/server.go b/cmd/agent/server/server.go index f8cbb410..4c245c80 100644 --- a/cmd/agent/server/server.go +++ b/cmd/agent/server/server.go @@ -128,12 +128,12 @@ func (s *Server) update(req *pb.UpdateRequest) error { if err != nil { return err } - side, next, err := getNextPart(partA, partB) - logrus.Infoln("switching to " + side + " partition " + next) + nextPartInfo, err := getNextPart(partA, partB) + logrus.Infoln("switching to " + nextPartInfo.device + " partition " + nextPartInfo.menuentry) if err != nil { return err } - if err = install(imagePath, side, next); err != nil { + if err = install(imagePath, nextPartInfo.device, nextPartInfo.menuentry); err != nil { return err } return s.reboot() @@ -144,7 +144,7 @@ func (s *Server) rollback() error { if err != nil { return err } - _, next, err := getNextPart(partA, partB) + nextPartInfo, err := getNextPart(partA, partB) if err != nil { return err } @@ -153,11 +153,11 @@ func (s *Server) rollback() error { return err } if bootMode == "uefi" { - if err = runCommand("grub2-editenv", grubenvPath, "set", "saved_entry="+next); err != nil { + if err = runCommand("grub2-editenv", grubenvPath, "set", "saved_entry="+nextPartInfo.menuentry); err != nil { return err } } else { - if err = runCommand("grub2-set-default", next); err != nil { + if err = runCommand("grub2-set-default", nextPartInfo.menuentry); err != nil { return err } } diff --git a/cmd/agent/server/server_test.go b/cmd/agent/server/server_test.go index 15b6f5ea..49c515ae 100644 --- a/cmd/agent/server/server_test.go +++ b/cmd/agent/server/server_test.go @@ -96,7 +96,7 @@ func TestServerUpdate(t *testing.T) { patchRootfsDisks := gomonkey.ApplyFuncReturn(getRootfsDisks, "/dev/sda2", "/dev/sda3", nil) defer patchRootfsDisks.Reset() // assume now is partition A, want to swiching to partition B - patchGetNextPartition := gomonkey.ApplyFuncReturn(getNextPart, "/dev/sda3", "B", nil) + patchGetNextPartition := gomonkey.ApplyFuncReturn(getNextPart, partitionInfo{"/dev/sda3", "B", "ext4"}, nil) defer patchGetNextPartition.Reset() patchDownloadImage := gomonkey.ApplyPrivateMethod(conImageHandler{}, "downloadImage", func(_ conImageHandler, req *pb.UpdateRequest) (string, error) { return "", nil @@ -151,8 +151,8 @@ func TestServerRollback(t *testing.T) { defer patchRootfsDisks.Reset() // assume now is partition A, want to swiching to partition B patchGetNextPartition := gomonkey.ApplyFuncSeq(getNextPart, []gomonkey.OutputCell{ - {Values: gomonkey.Params{"", "", fmt.Errorf("rollbak test error")}}, - {Values: gomonkey.Params{"/dev/sda3", "B", nil}}, + {Values: gomonkey.Params{partitionInfo{}, fmt.Errorf("rollbak test error")}}, + {Values: gomonkey.Params{partitionInfo{"/dev/sda3", "B", "ext4"}, nil}}, }) defer patchGetNextPartition.Reset() patchDownloadImage := gomonkey.ApplyPrivateMethod(conImageHandler{}, "downloadImage", func(_ conImageHandler, req *pb.UpdateRequest) (string, error) { @@ -248,8 +248,8 @@ func TestServerrollback(t *testing.T) { {name: "error", fields: fields{UnimplementedOSServer: pb.UnimplementedOSServer{}, disableReboot: true}, wantErr: true}, } - patchGetNextPart := gomonkey.ApplyFunc(getNextPart, func(partA string, partB string) (string, string, error) { - return "", "", fmt.Errorf("rollbak test error") + patchGetNextPart := gomonkey.ApplyFunc(getNextPart, func(partA string, partB string) (partitionInfo, error) { + return partitionInfo{}, fmt.Errorf("rollbak test error") }) defer patchGetNextPart.Reset() for _, tt := range tests { diff --git a/cmd/agent/server/utils.go b/cmd/agent/server/utils.go index fdddc7d5..76679f41 100644 --- a/cmd/agent/server/utils.go +++ b/cmd/agent/server/utils.go @@ -51,6 +51,12 @@ type preparePath struct { rootfsFile string } +type partitionInfo struct { + device string + menuentry string + fsType string +} + func runCommand(name string, args ...string) error { out, err := exec.Command(name, args...).CombinedOutput() if err != nil { @@ -68,16 +74,11 @@ func runCommandWithOut(name string, args ...string) (string, error) { } func deleteNewline(out string) string { - if strings.HasSuffix(out, "\n") { - out = strings.TrimSuffix(out, "\n") - } + out = strings.TrimSuffix(out, "\n") return out } func install(imagePath string, side string, next string) error { - if err := modifyImageLabel(imagePath, side, next); err != nil { - return err - } if err := runCommand("dd", "if="+imagePath, "of="+side, "bs=8M"); err != nil { return err } @@ -93,20 +94,27 @@ func install(imagePath string, side string, next string) error { } } -func getNextPart(partA string, partB string) (string, string, error) { +func getNextPart(partA string, partB string) (partitionInfo, error) { out, err := exec.Command("lsblk", "-no", "MOUNTPOINT", partA).CombinedOutput() if err != nil { - return "", "", fmt.Errorf("fail to lsblk %s out:%s err:%s", partA, out, err) + return partitionInfo{}, fmt.Errorf("fail to lsblk %s out:%s err:%s", partA, out, err) } mountPoint := strings.TrimSpace(string(out)) - side := partA next := "A" if mountPoint == "/" { side = partB next = "B" } - return side, next, nil + fsType, err := exec.Command("lsblk", "-no", "FSTYPE", side).CombinedOutput() + if err != nil { + return partitionInfo{}, fmt.Errorf("fail to lsblk %s out:%s err:%s", side, fsType, err) + } + return partitionInfo{ + device: side, + menuentry: next, + fsType: strings.TrimSpace(string(fsType)), + }, nil } func getRootfsDisks() (string, string, error) { @@ -155,13 +163,21 @@ func getBootMode() (string, error) { func createOSImage(neededPath preparePath) (string, error) { imagePath := neededPath.imagePath updatePath := neededPath.updatePath + partA, partB, err := getRootfsDisks() + if err != nil { + return "", err + } + nextPartInfo, err := getNextPart(partA, partB) + if err != nil { + return "", err + } if err := runCommand("dd", "if=/dev/zero", "of="+imagePath, "bs=2M", "count=1024"); err != nil { return "", err } if err := os.Chmod(imagePath, imgPermission); err != nil { return "", err } - if err := runCommand("mkfs.ext4", "-L", "ROOT-A", imagePath); err != nil { + if err := runCommand("mkfs."+nextPartInfo.fsType, "-L", "ROOT-"+nextPartInfo.menuentry, imagePath); err != nil { return "", err } mountPath := neededPath.mountPath @@ -371,10 +387,3 @@ func getOCIImageDigest(containerRuntime string, imageName string) (string, error } return imageDigests, nil } - -func modifyImageLabel(imagePath, side, next string) error { - if err := runCommand("e2label", imagePath, "ROOT-"+next); err != nil { - return err - } - return nil -} diff --git a/cmd/agent/server/utils_test.go b/cmd/agent/server/utils_test.go index da53c0e6..37c58aad 100644 --- a/cmd/agent/server/utils_test.go +++ b/cmd/agent/server/utils_test.go @@ -86,32 +86,31 @@ func Test_getNextPart(t *testing.T) { tests := []struct { name string args args - want string - want1 string + want partitionInfo wantErr bool }{ - {name: "switch to sda3", args: args{partA: "/dev/sda2", partB: "/dev/sda3"}, want: "/dev/sda3", want1: "B", wantErr: false}, - {name: "switch to sda2", args: args{partA: "/dev/sda2", partB: "/dev/sda3"}, want: "/dev/sda2", want1: "A", wantErr: false}, - {name: "error", args: args{partA: "/dev/sda2", partB: "/dev/sda3"}, want: "", want1: "", wantErr: true}, + {name: "switch to sda3", args: args{partA: "/dev/sda2", partB: "/dev/sda3"}, want: partitionInfo{"/dev/sda3", "B", "ext4"}, wantErr: false}, + {name: "switch to sda2", args: args{partA: "/dev/sda2", partB: "/dev/sda3"}, want: partitionInfo{"/dev/sda2", "A", "ext4"}, wantErr: false}, + {name: "error", args: args{partA: "/dev/sda2", partB: "/dev/sda3"}, want: partitionInfo{}, wantErr: true}, } patchExecCommand := gomonkey.ApplyMethodSeq(&exec.Cmd{}, "CombinedOutput", []gomonkey.OutputCell{ {Values: gomonkey.Params{[]byte("/"), nil}}, + {Values: gomonkey.Params{[]byte("ext4"), nil}}, {Values: gomonkey.Params{[]byte(""), nil}}, + {Values: gomonkey.Params{[]byte("ext4"), nil}}, {Values: gomonkey.Params{[]byte(""), fmt.Errorf("error")}}, + {Values: gomonkey.Params{[]byte("ext4"), nil}}, }) defer patchExecCommand.Reset() for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - got, got1, err := getNextPart(tt.args.partA, tt.args.partB) + nextPartInfo, err := getNextPart(tt.args.partA, tt.args.partB) if (err != nil) != tt.wantErr { t.Errorf("getNextPart() error = %v, wantErr %v", err, tt.wantErr) return } - if got != tt.want { - t.Errorf("getNextPart() got = %v, want %v", got, tt.want) - } - if got1 != tt.want1 { - t.Errorf("getNextPart() got1 = %v, want %v", got1, tt.want1) + if nextPartInfo != tt.want { + t.Errorf("getNextPart() got = %v, want %v", nextPartInfo, tt.want) } }) } @@ -188,6 +187,8 @@ func Test_createOSImage(t *testing.T) { wantErr: false, }, } + patchGetNextPartition := gomonkey.ApplyFuncReturn(getNextPart, partitionInfo{"/dev/sda3", "B", "ext4"}, nil) + defer patchGetNextPartition.Reset() for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { got, err := createOSImage(tt.args.neededPath) -- Gitee