fix(baremetal): nvme allocable

This commit is contained in:
Zexi Li
2021-06-16 12:49:56 +08:00
parent 0f74c9ba0a
commit 382962fd0e
9 changed files with 121 additions and 19 deletions
+1 -1
View File
@@ -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 <lizexi@yunionyun.com>"
+3 -3
View File
@@ -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 <wanyaoqi@yunionyun.com>"
+11
View File
@@ -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)
+8
View File
@@ -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
}
-6
View File
@@ -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
}
+2 -2
View File
@@ -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{})
+1
View File
@@ -0,0 +1 @@
package uefi // import "yunion.io/x/onecloud/pkg/baremetal/utils/uefi"
+17 -5
View File
@@ -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
+78 -2
View File
@@ -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")
}
}