diff --git a/pkg/compute/models/disks.go b/pkg/compute/models/disks.go index 36717c6852..5bb6012956 100644 --- a/pkg/compute/models/disks.go +++ b/pkg/compute/models/disks.go @@ -1749,6 +1749,8 @@ func fillDiskConfigByImage(ctx context.Context, userCred mcclient.TokenCredentia } if strings.Contains(image.Properties["os_arch"], "aarch") { diskConfig.OsArch = api.OS_ARCH_AARCH64 + } else { + diskConfig.OsArch = image.Properties["os_arch"] } } return nil diff --git a/pkg/compute/models/guest_actions.go b/pkg/compute/models/guest_actions.go index dbf46ffd7f..beedfb5322 100644 --- a/pkg/compute/models/guest_actions.go +++ b/pkg/compute/models/guest_actions.go @@ -1476,6 +1476,16 @@ func (self *SGuest) PerformRebuildRoot(ctx context.Context, userCred mcclient.To if err != nil { return nil, err } + + // compare os arch + if len(self.InstanceType) > 0 { + provider := GetDriver(self.Hypervisor).GetProvider() + sku, _ := ServerSkuManager.FetchSkuByNameAndProvider(self.InstanceType, provider, true) + if sku != nil && len(sku.CpuArch) > 0 && len(img.Properties["os_arch"]) > 0 && !strings.Contains(img.Properties["os_arch"], sku.CpuArch) { + return nil, httperrors.NewConflictError("root disk image(%s) and sku(%s) architecture mismatch", img.Properties["os_arch"], sku.CpuArch) + } + } + diskCat := self.CategorizeDisks() if img.MinDiskMB == 0 || img.Status != imageapi.IMAGE_STATUS_ACTIVE { return nil, httperrors.NewInputParameterError("invlid image") diff --git a/pkg/compute/models/guests.go b/pkg/compute/models/guests.go index 8e7358ff6c..aa55f59564 100644 --- a/pkg/compute/models/guests.go +++ b/pkg/compute/models/guests.go @@ -1323,7 +1323,7 @@ func (manager *SGuestManager) validateCreateData( input.Disks[0] = rootDiskConfig if sku != nil { if len(rootDiskConfig.OsArch) > 0 && len(sku.CpuArch) > 0 { - if strings.Contains(rootDiskConfig.OsArch, sku.CpuArch) { + if !strings.Contains(rootDiskConfig.OsArch, sku.CpuArch) { return nil, httperrors.NewConflictError("root disk image(%s) and sku(%s) architecture mismatch", rootDiskConfig.OsArch, sku.CpuArch) } }