diff --git a/build/docker/Dockerfile.baremetal-agent b/build/docker/Dockerfile.baremetal-agent index 2385b4a78d..f076ce22d0 100644 --- a/build/docker/Dockerfile.baremetal-agent +++ b/build/docker/Dockerfile.baremetal-agent @@ -1,4 +1,4 @@ -FROM registry.cn-beijing.aliyuncs.com/yunionio/baremetal-base:v0.2 +FROM registry.cn-beijing.aliyuncs.com/yunionio/baremetal-base:v0.3 MAINTAINER "Zexi Li " diff --git a/build/docker/Dockerfile.baremetal-base b/build/docker/Dockerfile.baremetal-base index fb40e97c75..1fea0bef7b 100644 --- a/build/docker/Dockerfile.baremetal-base +++ b/build/docker/Dockerfile.baremetal-base @@ -1,7 +1,7 @@ -FROM registry.cn-beijing.aliyuncs.com/yunionio/centos-build:1.1-4 as build -RUN yum install -y https://iso.yunion.cn/3.6/rpms/packages/host/baremetal-pxerom-1.1.0-20072810.x86_64.rpm +FROM --platform=linux/amd64 registry.cn-beijing.aliyuncs.com/yunionio/centos-build:1.1-4 as build +RUN yum install -y https://iso.yunion.cn/vm-images/baremetal-pxerom-1.1.0-21060506.x86_64.rpm -FROM frolvlad/alpine-glibc:glibc-2.28 +FROM registry.cn-beijing.aliyuncs.com/yunionio/onecloud-base:v0.2 MAINTAINER "Yaoqi Wan " diff --git a/build/docker/Makefile b/build/docker/Makefile index cd49fec1f1..c9e77eab93 100644 --- a/build/docker/Makefile +++ b/build/docker/Makefile @@ -1,3 +1,8 @@ +REGISTRY ?= "registry.cn-beijing.aliyuncs.com/yunionio" + +DOCKER_BUILD = docker build -t $(REGISTRY) +DOCKER_BUILDX = docker buildx build --platform linux/arm64,linux/amd64 --push -t $(REGISTRY) + debian10-base: docker buildx build --platform linux/arm64,linux/amd64 --push \ -t registry.cn-beijing.aliyuncs.com/yunionio/debian10-base:1.0 -f ./Dockerfile.debian-base . @@ -5,3 +10,9 @@ debian10-base: climc-base: docker buildx build --platform linux/arm64,linux/amd64 --push \ -t registry.cn-beijing.aliyuncs.com/yunionio/climc-base:$(VERSION) -f ./Dockerfile.climc-base . + +BAREMETAL_BASE_VERSION = v0.3 + +baremetal-base: + $(DOCKER_BUILD)/baremetal-base:$(BAREMETAL_BASE_VERSION) -f ./Dockerfile.baremetal-base . + docker push $(REGISTRY)/baremetal-base:$(BAREMETAL_BASE_VERSION) diff --git a/pkg/baremetal/manager.go b/pkg/baremetal/manager.go index 3c06748d5a..b1d78a9e6d 100644 --- a/pkg/baremetal/manager.go +++ b/pkg/baremetal/manager.go @@ -2260,6 +2260,14 @@ func (s *SBaremetalServer) GetDiskConfig() ([]*api.BaremetalDiskConfig, error) { if err != nil { return nil, err } + + if len(layouts) != 0 { + firstDisk := layouts[0] + // convert to normal order if first disk is PCIE driver + if firstDisk.Conf.Driver == baremetal.DISK_DRIVER_PCIE { + return baremetal.GetLayoutDiskConfig(layouts), nil + } + } return baremetal.GetLayoutRaidConfig(layouts), nil } diff --git a/pkg/baremetal/tasks/base.go b/pkg/baremetal/tasks/base.go index 6e76dea961..4e9de65756 100644 --- a/pkg/baremetal/tasks/base.go +++ b/pkg/baremetal/tasks/base.go @@ -507,15 +507,9 @@ func AdjustUEFIBootOrder(term *ssh.Client) error { return errors.Wrap(err, "NewEFIBootMgrFromRemote") } - log.Errorf("=====before set ") - time.Sleep(30 * time.Second) - if err := uefi.RemoteSetCurrentBootAtFirst(term, mgr); err != nil { return errors.Wrap(err, "Set current pxe boot at fist") } - log.Errorf("=====after set ") - time.Sleep(30 * time.Second) - return nil } diff --git a/pkg/baremetal/tasks/baseprepare.go b/pkg/baremetal/tasks/baseprepare.go index 25da5d1c73..080108a9e4 100644 --- a/pkg/baremetal/tasks/baseprepare.go +++ b/pkg/baremetal/tasks/baseprepare.go @@ -363,7 +363,7 @@ func (task *sBaremetalPrepareTask) findAdminNic(cli *ssh.Client, nicsInfo []*typ func (task *sBaremetalPrepareTask) updateBmInfo(cli *ssh.Client, i *baremetalPrepareInfo) error { adminNic := task.baremetal.GetAdminNic() - if adminNic == nil { + if adminNic == nil || (adminNic != nil && !adminNic.LinkUp) { adminIdx, adminNicDev, err := task.findAdminNic(cli, i.nicsInfo) if err != nil { return errors.Wrap(err, "task.findAdminNic") @@ -373,7 +373,7 @@ func (task *sBaremetalPrepareTask) updateBmInfo(cli *ssh.Client, i *baremetalPre if err != nil { return errors.Wrap(err, "send Admin Nic Info") } - adminNic = task.baremetal.GetAdminNic() + adminNic = task.baremetal.GetNicByMac(adminNicDev.Mac) } // collect params updateInfo := make(map[string]interface{}) diff --git a/pkg/baremetal/utils/uefi/doc.go b/pkg/baremetal/utils/uefi/doc.go new file mode 100644 index 0000000000..75fcbcaeb3 --- /dev/null +++ b/pkg/baremetal/utils/uefi/doc.go @@ -0,0 +1 @@ +package uefi // import "yunion.io/x/onecloud/pkg/baremetal/utils/uefi" diff --git a/pkg/compute/baremetal/diskconfig.go b/pkg/compute/baremetal/diskconfig.go index 9cd552c139..8623bdd198 100644 --- a/pkg/compute/baremetal/diskconfig.go +++ b/pkg/compute/baremetal/diskconfig.go @@ -58,7 +58,7 @@ func isDiskConfigStorageMatch( adapterIsEqual := (confAdapter == nil || *confAdapter == adapter) && (confDriver == nil || *confDriver == driver) - log.V(10).Debugf("typeIsHybrid: %v, typeIsRotate: %v, typeIsSSD: %v, rangeIsNoneAndCountZero: %v, rangeIsNotNoneAndIndexInRange: %v, rangeIsNoneAndSmallThanCount: %v, adapterIsEqual: %v", typeIsHybrid, typeIsRotate, typeIsSSD, rangeIsNoneAndCountZero, rangeIsNotNoneAndIndexInRange, rangeIsNoneAndSmallThanCount, adapterIsEqual) + log.V(10).Debugf("Try storage: %#v, typeIsHybrid: %v, typeIsRotate: %v, typeIsSSD: %v, rangeIsNoneAndCountZero: %v, rangeIsNotNoneAndIndexInRange: %v, rangeIsNoneAndSmallThanCount: %v, adapterIsEqual: %v", *storage, typeIsHybrid, typeIsRotate, typeIsSSD, rangeIsNoneAndCountZero, rangeIsNotNoneAndIndexInRange, rangeIsNoneAndSmallThanCount, adapterIsEqual) if (typeIsHybrid || typeIsRotate || typeIsSSD) && (rangeIsNoneAndCountZero || rangeIsNotNoneAndIndexInRange || rangeIsNoneAndSmallThanCount) && @@ -109,7 +109,11 @@ func RetrieveStorages(diskConfig *api.BaremetalDiskConfig, storages []*Baremetal } else { rest = append(rest, storage) } - idx++ + if confDriver == nil { + idx++ + } else if *confDriver == storage.Driver { + idx++ + } } return } @@ -298,10 +302,18 @@ func ExpandNoneConf(layouts []Layout) (ret []Layout) { } func GetLayoutRaidConfig(layouts []Layout) []*api.BaremetalDiskConfig { + return getLayoutConfig(layouts, true) +} + +func GetLayoutDiskConfig(layouts []Layout) []*api.BaremetalDiskConfig { + return getLayoutConfig(layouts, false) +} + +func getLayoutConfig(layouts []Layout, onlyRaidDisk bool) []*api.BaremetalDiskConfig { var disk []*BaremetalStorage ret := make([]*api.BaremetalDiskConfig, 0) for _, layout := range layouts { - if layout.Conf.Conf == DISK_CONF_NONE && + if onlyRaidDisk && layout.Conf.Conf == DISK_CONF_NONE && sets.NewString(DISK_DRIVER_LINUX, DISK_DRIVER_PCIE).Has(layout.Disks[0].Driver) { continue } @@ -335,8 +347,8 @@ func CalculateLayout(confs []*api.BaremetalDiskConfig, storages []*BaremetalStor noneConf, _ := ParseDiskConfig(DISK_CONF_NONE) conf = &noneConf } - selected, storage1 := RetrieveStorages(conf, storages) - storages = storage1 + selected, restStorges := RetrieveStorages(conf, storages) + storages = restStorges if len(selected) == 0 { err = fmt.Errorf("Not found matched storages by config: %#v", conf) return diff --git a/pkg/compute/baremetal/diskconfig_test.go b/pkg/compute/baremetal/diskconfig_test.go index f1ddb562e3..aefa8b0f09 100644 --- a/pkg/compute/baremetal/diskconfig_test.go +++ b/pkg/compute/baremetal/diskconfig_test.go @@ -19,6 +19,8 @@ import ( "reflect" "testing" + "github.com/stretchr/testify/assert" + api "yunion.io/x/onecloud/pkg/apis/compute" ) @@ -464,7 +466,9 @@ func TestCalculateLayout(t *testing.T) { if err != nil { t.Fatalf("Unmarshal expectedLayoutJson err: %v", err) } - if !reflect.DeepEqual(layout, expectedLayout) { + + assert := assert.New(t) + if !assert.Equal(expectedLayout, layout) { t.Errorf("CalculateLayout() = %v, want %v", layout, expectedLayout) } } @@ -475,7 +479,7 @@ func TestCheckDisksAllocable(t *testing.T) { "6:raid5:adapter2", "6:raid5:adapter2", ) - bitmainConfs, err := NewBaremetalDiskConfigs("raid10:(60g,)") + bitmainConfs, err := NewBaremetalDiskConfigs("MarvelRaid:raid10:(60g,)") if err != nil { t.Fatalf("NewDiskConfigs err: %v", err) } @@ -1255,3 +1259,75 @@ func TestGetSplitSizes(t *testing.T) { }) } } + +var ( + pcieStorages = []*BaremetalStorage{ + { + Driver: DISK_DRIVER_LINUX, + Rotate: true, + Size: 51200, + Adapter: 0, + Index: 0, + }, + { + Driver: DISK_DRIVER_PCIE, + Rotate: false, + Size: 61440, + Adapter: 0, + Index: 0, + }, + } +) + +func TestPCIEStoragesAllocable(t *testing.T) { + adapter0 := 0 + confs := []*api.BaremetalDiskConfig{ + { + Adapter: &adapter0, + Conf: DISK_CONF_NONE, + Count: 1, + Driver: DISK_DRIVER_PCIE, + Range: []int64{0}, + Type: DISK_TYPE_SSD, + }, + { + Adapter: &adapter0, + Conf: DISK_CONF_NONE, + Count: 1, + Driver: DISK_DRIVER_LINUX, + Range: []int64{0}, + Type: DISK_TYPE_ROTATE, + }, + } + + layouts, err := CalculateLayout(confs, pcieStorages) + if err != nil { + t.Errorf("CalculateLayout error: %v", err) + return + } + // log.Errorf("layouts: %s", jsonutils.Marshal(layouts)) + disks := []*api.DiskConfig{ + { + Backend: api.STORAGE_LOCAL, + Driver: "scsi", + SizeMb: 30720, + }, + { + Backend: api.STORAGE_LOCAL, + Driver: "scsi", + Fs: "ext4", + Mountpoint: "/opt", + SizeMb: -1, + }, + { + Backend: api.STORAGE_LOCAL, + Driver: "scsi", + Fs: "ext4", + Mountpoint: "/data", + SizeMb: -1, + }, + } + if ok := IsDisksAllocable(layouts, disks); !ok { + t.Errorf("Disk not allocable") + } +}