From d6bec2303945ac3a90727fba4df84ac6d4dc6927 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B1=88=E8=BD=A9?= Date: Mon, 4 Mar 2019 20:18:13 +0800 Subject: [PATCH 01/13] =?UTF-8?q?=E4=BD=BF=E7=94=A8=E5=85=AC=E6=9C=89?= =?UTF-8?q?=E4=BA=91=E9=95=9C=E5=83=8F=E6=97=B6=EF=BC=8C=E6=AD=A3=E7=A1=AE?= =?UTF-8?q?=E8=AE=BE=E7=BD=AE=E7=99=BB=E5=BD=95=E7=94=A8=E6=88=B7=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pkg/cloudprovider/instance.go | 2 ++ pkg/compute/guestdrivers/aliyun.go | 5 +++++ pkg/compute/guestdrivers/managedvirtual.go | 2 ++ pkg/compute/guestdrivers/qcloud.go | 16 +++++++++++++--- 4 files changed, 22 insertions(+), 3 deletions(-) diff --git a/pkg/cloudprovider/instance.go b/pkg/cloudprovider/instance.go index 61929f17b0..ea83502983 100644 --- a/pkg/cloudprovider/instance.go +++ b/pkg/cloudprovider/instance.go @@ -17,6 +17,8 @@ type SDiskInfo struct { type SManagedVMCreateConfig struct { Name string ExternalImageId string + ImageType string + OsType string OsDistribution string OsVersion string InstanceType string // InstanceType 不为空时,直接采用InstanceType创建机器。 diff --git a/pkg/compute/guestdrivers/aliyun.go b/pkg/compute/guestdrivers/aliyun.go index cd7fa10e32..da581ba48c 100644 --- a/pkg/compute/guestdrivers/aliyun.go +++ b/pkg/compute/guestdrivers/aliyun.go @@ -145,6 +145,11 @@ func (self *SAliyunGuestDriver) RequestDeployGuestOnHost(ctx context.Context, gu return err } + userName := "root" + if desc.ImageType == "system" && desc.OsType == "Windows" { + userName = "Administrator" + } + action, err := config.GetString("action") if err != nil { return err diff --git a/pkg/compute/guestdrivers/managedvirtual.go b/pkg/compute/guestdrivers/managedvirtual.go index 1e716a50a7..9b9d7627e7 100644 --- a/pkg/compute/guestdrivers/managedvirtual.go +++ b/pkg/compute/guestdrivers/managedvirtual.go @@ -60,6 +60,8 @@ func (self *SManagedVirtualizedGuestDriver) GetJsonDescAtHost(ctx context.Contex img := scimg.GetCachedimage() config.OsDistribution, _ = img.Info.GetString("properties", "os_distribution") config.OsVersion, _ = img.Info.GetString("properties", "os_version") + config.OsType = img.Info.GetString("properties", "os_type") + config.ImageType = img.ImageType } } else { dataDisk := cloudprovider.SDiskInfo{ diff --git a/pkg/compute/guestdrivers/qcloud.go b/pkg/compute/guestdrivers/qcloud.go index e07af3536c..0743fca763 100644 --- a/pkg/compute/guestdrivers/qcloud.go +++ b/pkg/compute/guestdrivers/qcloud.go @@ -164,6 +164,16 @@ func (self *SQcloudGuestDriver) RequestDeployGuestOnHost(ctx context.Context, gu return err } + userName := "root" + if desc.ImageType == "system" { + if desc.OsDistribution == "Ubuntu" { + userName = "ubuntu" + } + if desc.OsType == "Windows" { + userName = "Administrator" + } + } + action, err := config.GetString("action") if err != nil { return err @@ -212,7 +222,7 @@ func (self *SQcloudGuestDriver) RequestDeployGuestOnHost(ctx context.Context, gu return nil, err } - data := fetchIVMinfo(desc, iVM, guest.Id, "root", desc.Password, action) + data := fetchIVMinfo(desc, iVM, guest.Id, userName, desc.Password, action) return data, nil }) } else if action == "deploy" { @@ -241,7 +251,7 @@ func (self *SQcloudGuestDriver) RequestDeployGuestOnHost(ctx context.Context, gu return nil, err } - data := fetchIVMinfo(desc, iVM, guest.Id, "root", desc.Password, action) + data := fetchIVMinfo(desc, iVM, guest.Id, userName, desc.Password, action) return data, nil }) } else if action == "rebuild" { @@ -302,7 +312,7 @@ func (self *SQcloudGuestDriver) RequestDeployGuestOnHost(ctx context.Context, gu } } - data := fetchIVMinfo(desc, iVM, guest.Id, "root", desc.Password, action) + data := fetchIVMinfo(desc, iVM, guest.Id, userName, desc.Password, action) return data, nil }) From ec88bf0adcef44ade90920e397cc28d40fffe623 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B1=88=E8=BD=A9?= Date: Tue, 5 Mar 2019 13:47:29 +0800 Subject: [PATCH 02/13] =?UTF-8?q?=E7=BB=9F=E4=B8=80aliyun=E7=99=BB?= =?UTF-8?q?=E5=BD=95=E7=94=A8=E6=88=B7=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pkg/compute/guestdrivers/aliyun.go | 6 +++--- pkg/compute/guestdrivers/huawei.go | 16 +++++++++++++--- pkg/compute/guestdrivers/managedvirtual.go | 2 +- 3 files changed, 17 insertions(+), 7 deletions(-) diff --git a/pkg/compute/guestdrivers/aliyun.go b/pkg/compute/guestdrivers/aliyun.go index da581ba48c..cb5a6cf73f 100644 --- a/pkg/compute/guestdrivers/aliyun.go +++ b/pkg/compute/guestdrivers/aliyun.go @@ -182,7 +182,7 @@ func (self *SAliyunGuestDriver) RequestDeployGuestOnHost(ctx context.Context, gu return nil, err } - data := fetchIVMinfo(desc, iVM, guest.Id, "root", desc.Password, action) + data := fetchIVMinfo(desc, iVM, guest.Id, userName, desc.Password, action) return data, nil }) @@ -212,7 +212,7 @@ func (self *SAliyunGuestDriver) RequestDeployGuestOnHost(ctx context.Context, gu return nil, err } - data := fetchIVMinfo(desc, iVM, guest.Id, "root", desc.Password, action) + data := fetchIVMinfo(desc, iVM, guest.Id, userName, desc.Password, action) return data, nil }) @@ -273,7 +273,7 @@ func (self *SAliyunGuestDriver) RequestDeployGuestOnHost(ctx context.Context, gu } } - data := fetchIVMinfo(desc, iVM, guest.Id, "root", desc.Password, action) + data := fetchIVMinfo(desc, iVM, guest.Id, userName, desc.Password, action) return data, nil }) diff --git a/pkg/compute/guestdrivers/huawei.go b/pkg/compute/guestdrivers/huawei.go index 76c040417f..2291da8892 100644 --- a/pkg/compute/guestdrivers/huawei.go +++ b/pkg/compute/guestdrivers/huawei.go @@ -106,6 +106,16 @@ func (self *SHuaweiGuestDriver) RequestDeployGuestOnHost(ctx context.Context, gu return err } + userName := "root" + if desc.ImageType == "system" { + if desc.OsDistribution == "Ubuntu" { + userName = "ubuntu" + } + if desc.OsType == "Windows" { + userName = "Administrator" + } + } + action, err := config.GetString("action") if err != nil { return err @@ -138,7 +148,7 @@ func (self *SHuaweiGuestDriver) RequestDeployGuestOnHost(ctx context.Context, gu return nil, err } - data := fetchIVMinfo(desc, iVM, guest.Id, "root", desc.Password, action) + data := fetchIVMinfo(desc, iVM, guest.Id, userName, desc.Password, action) return data, nil }) @@ -167,7 +177,7 @@ func (self *SHuaweiGuestDriver) RequestDeployGuestOnHost(ctx context.Context, gu return nil, err } - data := fetchIVMinfo(desc, iVM, guest.Id, "root", desc.Password, action) + data := fetchIVMinfo(desc, iVM, guest.Id, userName, desc.Password, action) return data, nil }) @@ -228,7 +238,7 @@ func (self *SHuaweiGuestDriver) RequestDeployGuestOnHost(ctx context.Context, gu } } - data := fetchIVMinfo(desc, iVM, guest.Id, "root", desc.Password, action) + data := fetchIVMinfo(desc, iVM, guest.Id, userName, desc.Password, action) return data, nil }) diff --git a/pkg/compute/guestdrivers/managedvirtual.go b/pkg/compute/guestdrivers/managedvirtual.go index 9b9d7627e7..9d1baed6b0 100644 --- a/pkg/compute/guestdrivers/managedvirtual.go +++ b/pkg/compute/guestdrivers/managedvirtual.go @@ -60,7 +60,7 @@ func (self *SManagedVirtualizedGuestDriver) GetJsonDescAtHost(ctx context.Contex img := scimg.GetCachedimage() config.OsDistribution, _ = img.Info.GetString("properties", "os_distribution") config.OsVersion, _ = img.Info.GetString("properties", "os_version") - config.OsType = img.Info.GetString("properties", "os_type") + config.OsType, _ = img.Info.GetString("properties", "os_type") config.ImageType = img.ImageType } } else { From b0d785b622f3741864f664e5208fdb13474fb1f3 Mon Sep 17 00:00:00 2001 From: Rex Zhang Date: Tue, 5 Mar 2019 19:18:32 +0800 Subject: [PATCH 03/13] =?UTF-8?q?=E7=BB=9F=E4=B8=80aws=E7=99=BB=E5=BD=95?= =?UTF-8?q?=E7=94=A8=E6=88=B7=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pkg/compute/guestdrivers/aws.go | 39 +++++++++++++++++++++++++++++---- 1 file changed, 35 insertions(+), 4 deletions(-) diff --git a/pkg/compute/guestdrivers/aws.go b/pkg/compute/guestdrivers/aws.go index 9de620a4d7..749fa45fbd 100644 --- a/pkg/compute/guestdrivers/aws.go +++ b/pkg/compute/guestdrivers/aws.go @@ -3,6 +3,7 @@ package guestdrivers import ( "context" "fmt" + "strings" "time" "yunion.io/x/jsonutils" @@ -11,7 +12,6 @@ import ( "yunion.io/x/onecloud/pkg/cloudprovider" "yunion.io/x/onecloud/pkg/compute/models" "yunion.io/x/onecloud/pkg/mcclient" - "yunion.io/x/onecloud/pkg/util/ansible" "yunion.io/x/onecloud/pkg/util/billing" "yunion.io/x/pkg/utils" ) @@ -25,6 +25,35 @@ func init() { models.RegisterGuestDriver(&driver) } +func fetchAwsUserName(desc cloudprovider.SManagedVMCreateConfig) string { + // 非公有云官方镜像 + if desc.ImageType != "system" { + return "root" + } + + // 公有云官方镜像 + dist := strings.ToLower(desc.OsDistribution) + if strings.Contains(dist, "centos") { + return "centos" + } else if strings.Contains(dist, "ubuntu") { + return "ubuntu" + } else if strings.Contains(dist, "windows") { + return "Administrator" + } else if strings.Contains(dist, "debian") { + return "admin" + } else if strings.Contains(dist, "suse") { + return "ec2-user" + } else if strings.Contains(dist, "fedora") { + return "ec2-user" + } else if strings.Contains(dist, "rhel") || strings.Contains(dist, "redhat") { + return "ec2-user" + } else if strings.Contains(dist, "amazon linux") { + return "ec2-user" + } else { + return "ec2-user" + } +} + func (self *SAwsGuestDriver) GetHypervisor() string { return models.HYPERVISOR_AWS } @@ -124,6 +153,8 @@ func (self *SAwsGuestDriver) RequestDeployGuestOnHost(ctx context.Context, guest return err } + username := fetchAwsUserName(desc) + switch action { case "create": taskman.LocalTaskRun(task, func() (jsonutils.JSONObject, error) { @@ -148,7 +179,7 @@ func (self *SAwsGuestDriver) RequestDeployGuestOnHost(ctx context.Context, guest return nil, err } - data := fetchIVMinfo(desc, iVM, guest.Id, "root", desc.Password, action) + data := fetchIVMinfo(desc, iVM, guest.Id, username, desc.Password, action) return data, nil }) case "deploy": @@ -168,7 +199,7 @@ func (self *SAwsGuestDriver) RequestDeployGuestOnHost(ctx context.Context, guest return nil, err } - data := fetchIVMinfo(desc, iVM, guest.Id, ansible.PUBLIC_CLOUD_ANSIBLE_USER, desc.Password, action) + data := fetchIVMinfo(desc, iVM, guest.Id, username, desc.Password, action) return data, nil }) case "rebuild": @@ -220,7 +251,7 @@ func (self *SAwsGuestDriver) RequestDeployGuestOnHost(ctx context.Context, guest } } - data := fetchIVMinfo(desc, iVM, guest.Id, ansible.PUBLIC_CLOUD_ANSIBLE_USER, desc.Password, action) + data := fetchIVMinfo(desc, iVM, guest.Id, username, desc.Password, action) return data, nil }) From e74d3f61cbe960c087a43c6fe2184b700609838d Mon Sep 17 00:00:00 2001 From: Rex Zhang Date: Tue, 5 Mar 2019 20:04:30 +0800 Subject: [PATCH 04/13] imagetools add RHEL dist --- pkg/util/imagetools/imagetools.go | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/pkg/util/imagetools/imagetools.go b/pkg/util/imagetools/imagetools.go index a8393204e6..afc4068d61 100644 --- a/pkg/util/imagetools/imagetools.go +++ b/pkg/util/imagetools/imagetools.go @@ -38,9 +38,11 @@ func normalizeOsDistribution(osDist string, imageName string) string { osDist = imageName } osDist = strings.ToLower(osDist) - if strings.Contains(osDist, "centos") || strings.Contains(osDist, "redhat") || strings.Contains(osDist, "rhel") { + if strings.Contains(osDist, "centos") { return "CentOS" - } else if strings.Contains(osDist, "ubuntu") { + } else if strings.Contains(osDist, "redhat") || strings.Contains(osDist, "rhel") { + return "RHEL" + } else if strings.Contains(osDist, "ubuntu") { return "Ubuntu" } else if strings.Contains(osDist, "suse") { return "SUSE" @@ -73,6 +75,7 @@ func normalizeOsDistribution(osDist string, imageName string) string { var imageVersions = map[string][]string{ "CentOS": {"5", "6", "7"}, + "RHEL": {"5", "6", "7"}, "FreeBSD": {"10"}, "Ubuntu": {"10", "12", "14", "16"}, "OpenSUSE": {"11", "12"}, From 54acc594c921debc1263112bc0cba56439000e49 Mon Sep 17 00:00:00 2001 From: zhengjiajie Date: Wed, 6 Mar 2019 17:31:33 +0800 Subject: [PATCH 05/13] zhengjj-add-cloud-sku-rates --- cmd/climc/shell/cloud_sku_rates.go | 39 +++++++++++++++++++++ pkg/mcclient/modules/mod_cloud_sku_rates.go | 13 +++++++ 2 files changed, 52 insertions(+) create mode 100644 cmd/climc/shell/cloud_sku_rates.go create mode 100644 pkg/mcclient/modules/mod_cloud_sku_rates.go diff --git a/cmd/climc/shell/cloud_sku_rates.go b/cmd/climc/shell/cloud_sku_rates.go new file mode 100644 index 0000000000..23b3149bab --- /dev/null +++ b/cmd/climc/shell/cloud_sku_rates.go @@ -0,0 +1,39 @@ +package shell + +import ( + "yunion.io/x/jsonutils" + "yunion.io/x/onecloud/pkg/mcclient" + "yunion.io/x/onecloud/pkg/mcclient/modules" +) + +func init() { + + type CloudSkuRateListOptions struct { + ParamIds []string `help:"param_id of the cloudSkuRate" nargs:"+"` + ParamKeys []string `help:"param_key of the cloudSkuRate" nargs:"+"` + } + + R(&CloudSkuRateListOptions{}, "cloud-sku-rate-list", "list cloud-sku-rates", func(s *mcclient.ClientSession, args *CloudSkuRateListOptions) error { + dataIds := jsonutils.NewArray() + for _, n := range args.ParamIds { + dataIds.Add(jsonutils.NewString(n)) + } + + dataKeys := jsonutils.NewArray() + for _, n := range args.ParamKeys { + dataKeys.Add(jsonutils.NewString(n)) + } + + params := jsonutils.NewDict() + params.Add(dataIds, "param_ids") + params.Add(dataKeys, "param_keys") + + result, err := modules.CloudSkuRates.List(s, params) + if err != nil { + return err + } + + printList(result, modules.CloudSkuRates.GetColumns(s)) + return nil + }) +} diff --git a/pkg/mcclient/modules/mod_cloud_sku_rates.go b/pkg/mcclient/modules/mod_cloud_sku_rates.go new file mode 100644 index 0000000000..c0a7490aee --- /dev/null +++ b/pkg/mcclient/modules/mod_cloud_sku_rates.go @@ -0,0 +1,13 @@ +package modules + +var ( + CloudSkuRates ResourceManager +) + +func init() { + CloudSkuRates = NewMeterManager("cloud_sku_rate", "cloud_sku_rates", + []string{"id", "data_id", "data_key", "hour_price", "month_price", "year_price"}, + []string{}, + ) + register(&CloudSkuRates) +} From 2216f01ab955f03008759ce72c87fc04fdf569c9 Mon Sep 17 00:00:00 2001 From: zhengjiajie Date: Wed, 6 Mar 2019 17:39:30 +0800 Subject: [PATCH 06/13] zhengjj-add-cloud-sku-rates --- cmd/climc/shell/cloud_sku_rates.go | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) diff --git a/cmd/climc/shell/cloud_sku_rates.go b/cmd/climc/shell/cloud_sku_rates.go index 23b3149bab..d91d8f86b7 100644 --- a/cmd/climc/shell/cloud_sku_rates.go +++ b/cmd/climc/shell/cloud_sku_rates.go @@ -14,19 +14,10 @@ func init() { } R(&CloudSkuRateListOptions{}, "cloud-sku-rate-list", "list cloud-sku-rates", func(s *mcclient.ClientSession, args *CloudSkuRateListOptions) error { - dataIds := jsonutils.NewArray() - for _, n := range args.ParamIds { - dataIds.Add(jsonutils.NewString(n)) - } - - dataKeys := jsonutils.NewArray() - for _, n := range args.ParamKeys { - dataKeys.Add(jsonutils.NewString(n)) - } params := jsonutils.NewDict() - params.Add(dataIds, "param_ids") - params.Add(dataKeys, "param_keys") + params.Add(jsonutils.NewStringArray(args.ParamIds), "param_ids") + params.Add(jsonutils.NewStringArray(args.ParamKeys), "param_keys") result, err := modules.CloudSkuRates.List(s, params) if err != nil { From aee2a608836b23b329e58947eb80d69117c47f7f Mon Sep 17 00:00:00 2001 From: Qiu Jian Date: Wed, 6 Mar 2019 20:19:40 +0800 Subject: [PATCH 07/13] fix: umount rootfs before zerofree the partition --- pkg/hostman/storageman/diskutils.go | 2 +- pkg/hostman/storageman/storage_local.go | 20 ++++++++++++-------- 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/pkg/hostman/storageman/diskutils.go b/pkg/hostman/storageman/diskutils.go index e00bcb9459..abf1dfa494 100644 --- a/pkg/hostman/storageman/diskutils.go +++ b/pkg/hostman/storageman/diskutils.go @@ -179,5 +179,5 @@ func (d *SKVMGuestDisk) Zerofree() { for _, part := range d.partitions { part.Zerofree() } - log.Infof("Zerofree takes %f seconds", time.Now().Sub(startTime).Seconds()) + log.Infof("Zerofree %d partitions takes %f seconds", len(d.partitions), time.Now().Sub(startTime).Seconds()) } diff --git a/pkg/hostman/storageman/storage_local.go b/pkg/hostman/storageman/storage_local.go index 70bc831817..b8284befed 100644 --- a/pkg/hostman/storageman/storage_local.go +++ b/pkg/hostman/storageman/storage_local.go @@ -219,17 +219,21 @@ func (s *SLocalStorage) saveToGlance(ctx context.Context, imageId, imagePath str if kvmDisk.Connect() { defer kvmDisk.Disconnect() - if root := kvmDisk.MountKvmRootfs(); root != nil { - defer kvmDisk.UmountKvmRootfs(root) + var err error + func() { + if root := kvmDisk.MountKvmRootfs(); root != nil { + defer kvmDisk.UmountKvmRootfs(root) - osInfo = root.GetOs() - relInfo = root.GetReleaseInfo(root.GetPartition()) - if compress { - if err := root.PrepareFsForTemplate(root.GetPartition()); err != nil { - log.Errorln(err) - return err + osInfo = root.GetOs() + relInfo = root.GetReleaseInfo(root.GetPartition()) + if compress { + err = root.PrepareFsForTemplate(root.GetPartition()) } } + }() + if err != nil { + log.Errorln(err) + return err } if compress { From 0bb016d4431c937da79a788f6977ffd47d718aa7 Mon Sep 17 00:00:00 2001 From: TangBin Date: Wed, 6 Mar 2019 21:10:26 +0800 Subject: [PATCH 08/13] =?UTF-8?q?=E8=BF=87=E6=BB=A4=E6=8E=89=E4=B8=8D?= =?UTF-8?q?=E6=94=AF=E6=8C=81=E7=9A=84huawei=20skus=20&=20image?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pkg/compute/models/skus.go | 15 ++++++ pkg/util/huawei/image.go | 102 ++++++++++++++++++++++++++----------- 2 files changed, 88 insertions(+), 29 deletions(-) diff --git a/pkg/compute/models/skus.go b/pkg/compute/models/skus.go index 9777929cb1..cb8c764666 100644 --- a/pkg/compute/models/skus.go +++ b/pkg/compute/models/skus.go @@ -130,6 +130,17 @@ func inWhiteList(provider string) bool { } } +func excludeSkus(q *sqlchemy.SQuery) *sqlchemy.SQuery { + // 排除掉华为云对镜像有特殊要求的sku + return q.Filter( + sqlchemy.OR( + sqlchemy.NotEquals(q.Field("provider"), CLOUD_PROVIDER_HUAWEI), + sqlchemy.AND( + sqlchemy.Equals(q.Field("provider"), CLOUD_PROVIDER_HUAWEI), + sqlchemy.NotIn(q.Field("instance_type_family"), []string{"e1", "e2", "e3", "d1", "d2", "i3", "h2", "g1", "g3", "p2v", "p1", "pi1", "fp1", "fp1c"}), + ))) +} + func genInstanceType(family string, cpu, mem_mb int64) (string, error) { if cpu <= 0 { return "", fmt.Errorf("cpu_core_count should great than zero") @@ -315,6 +326,8 @@ func (self *SServerSkuManager) GetPropertyInstanceSpecs(ctx context.Context, use q = q.Equals("provider", provider) } + q = excludeSkus(q) + // 如果是查询私有云需要忽略zone参数 zone := jsonutils.GetAnyString(query, []string{"zone", "zone_id"}) if !inWhiteList(provider) { @@ -538,6 +551,8 @@ func (manager *SServerSkuManager) ListItemFilter(ctx context.Context, q *sqlchem return nil, err } + q = excludeSkus(q) + regionStr := jsonutils.GetAnyString(query, []string{"region", "cloudregion", "region_id", "cloudregion_id"}) if len(regionStr) > 0 { regionObj, err := CloudregionManager.FetchByIdOrName(nil, regionStr) diff --git a/pkg/util/huawei/image.go b/pkg/util/huawei/image.go index f5ff2abae8..1aa7014f5d 100644 --- a/pkg/util/huawei/image.go +++ b/pkg/util/huawei/image.go @@ -36,34 +36,39 @@ const ( type SImage struct { storageCache *SStoragecache - Schema string `json:"schema"` - MinDiskGB int64 `json:"min_disk"` - CreatedAt time.Time `json:"created_at"` - ImageSourceType string `json:"__image_source_type"` - ContainerFormat string `json:"container_format"` - File string `json:"file"` - UpdatedAt time.Time `json:"updated_at"` - Protected bool `json:"protected"` - Checksum string `json:"checksum"` - SupportKVMFPGAType string `json:"__support_kvm_fpga_type"` - ID string `json:"id"` - Isregistered string `json:"__isregistered"` - MinRamMB int `json:"min_ram"` - Lazyloading string `json:"__lazyloading"` - Owner string `json:"owner"` - OSType string `json:"__os_type"` - Imagetype string `json:"__imagetype"` - Visibility string `json:"visibility"` - VirtualEnvType string `json:"virtual_env_type"` - Platform string `json:"__platform"` - SizeGB int `json:"size"` - ImageSize int64 `json:"__image_size"` - OSBit string `json:"__os_bit"` - OSVersion string `json:"__os_version"` - Name string `json:"name"` - Self string `json:"self"` - DiskFormat string `json:"disk_format"` - Status string `json:"status"` + Schema string `json:"schema"` + MinDiskGB int64 `json:"min_disk"` + CreatedAt time.Time `json:"created_at"` + ImageSourceType string `json:"__image_source_type"` + ContainerFormat string `json:"container_format"` + File string `json:"file"` + UpdatedAt time.Time `json:"updated_at"` + Protected bool `json:"protected"` + Checksum string `json:"checksum"` + ID string `json:"id"` + Isregistered string `json:"__isregistered"` + MinRamMB int `json:"min_ram"` + Lazyloading string `json:"__lazyloading"` + Owner string `json:"owner"` + OSType string `json:"__os_type"` + Imagetype string `json:"__imagetype"` + Visibility string `json:"visibility"` + VirtualEnvType string `json:"virtual_env_type"` + Platform string `json:"__platform"` + SizeGB int `json:"size"` + ImageSize int64 `json:"__image_size"` + OSBit string `json:"__os_bit"` + OSVersion string `json:"__os_version"` + Name string `json:"name"` + Self string `json:"self"` + DiskFormat string `json:"disk_format"` + Status string `json:"status"` + SupportKVMFPGAType string `json:"__support_kvm_fpga_type"` + SupportKVMNVMEHIGHIO string `json:"__support_nvme_highio"` + SupportLargeMemory string `json:"__support_largememory"` + SupportDiskIntensive string `json:"__support_diskintensive"` + SupportXENGPUType string `json:"__support_xen_gpu_type"` + SupportKVMGPUType string `json:"__support_kvm_gpu_type"` } func (self *SImage) GetMinRamSizeMb() int { @@ -200,6 +205,34 @@ func (self *SRegion) GetImage(imageId string) (SImage, error) { return image, err } +func excludeImage(image SImage) bool { + if len(image.SupportDiskIntensive) > 0 { + return true + } + + if len(image.SupportKVMFPGAType) > 0 { + return true + } + + if len(image.SupportKVMGPUType) > 0 { + return true + } + + if len(image.SupportKVMNVMEHIGHIO) > 0 { + return true + } + + if len(image.SupportLargeMemory) > 0 { + return true + } + + if len(image.SupportXENGPUType) > 0 { + return true + } + + return false +} + // https://support.huaweicloud.com/api-ims/zh-cn_topic_0060804959.html func (self *SRegion) GetImages(status string, imagetype TImageOwnerType, name string, envType string) ([]SImage, error) { queries := map[string]string{} @@ -223,7 +256,18 @@ func (self *SRegion) GetImages(status string, imagetype TImageOwnerType, name st images := make([]SImage, 0) err := doListAllWithMarker(self.ecsClient.Images.List, queries, &images) - return images, err + + // 排除掉需要特定镜像才能创建的实例类型 + // https://support.huaweicloud.com/eu-west-0-api-ims/zh-cn_topic_0031617666.html#ZH-CN_TOPIC_0031617666__table48545918250 + // https://support.huaweicloud.com/productdesc-ecs/zh-cn_topic_0088142947.html + filtedImages := make([]SImage, 0) + for i := range images { + if !excludeImage(images[i]) { + filtedImages = append(filtedImages, images[i]) + } + } + + return filtedImages, err } func (self *SRegion) DeleteImage(imageId string) error { From 2a039a782d9a6cd2ce3d346d5502755edbd363b7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B1=88=E8=BD=A9?= Date: Wed, 6 Mar 2019 21:16:26 +0800 Subject: [PATCH 09/13] =?UTF-8?q?=E5=88=9B=E5=BB=BAopenstack=E7=A3=81?= =?UTF-8?q?=E7=9B=98=E4=BD=BF=E7=94=A8=E9=BB=98=E8=AE=A4=E7=9A=84zone?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pkg/util/openstack/disk.go | 10 +++++----- pkg/util/openstack/storage.go | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/pkg/util/openstack/disk.go b/pkg/util/openstack/disk.go index 78eafd20a9..c043fb2c5a 100644 --- a/pkg/util/openstack/disk.go +++ b/pkg/util/openstack/disk.go @@ -230,11 +230,11 @@ func (disk *SDisk) GetMountpoint() string { func (region *SRegion) CreateDisk(zoneName string, category string, name string, sizeGb int, desc string) (*SDisk, error) { params := map[string]map[string]interface{}{ "volume": { - "size": sizeGb, - "volume_type": category, - "name": name, - "description": desc, - "availability_zone": zoneName, + "size": sizeGb, + "volume_type": category, + "name": name, + "description": desc, + //"availability_zone": zoneName, }, } _, resp, err := region.CinderCreate("/volumes", "", jsonutils.Marshal(params)) diff --git a/pkg/util/openstack/storage.go b/pkg/util/openstack/storage.go index 0827d20d58..a4f03fee3a 100644 --- a/pkg/util/openstack/storage.go +++ b/pkg/util/openstack/storage.go @@ -96,7 +96,7 @@ func (storage *SStorage) GetIStoragecache() cloudprovider.ICloudStoragecache { } func (storage *SStorage) CreateIDisk(name string, sizeGb int, desc string) (cloudprovider.ICloudDisk, error) { - disk, err := storage.zone.region.CreateDisk(storage.zone.ZoneName, storage.Name, name, sizeGb, desc) + disk, err := storage.zone.region.CreateDisk("", storage.Name, name, sizeGb, desc) if err != nil { log.Errorf("createDisk fail %v", err) return nil, err From b8bd9b1fbe5583e2f43ab61da95040685cf22942 Mon Sep 17 00:00:00 2001 From: Qiu Jian Date: Thu, 7 Mar 2019 01:52:44 +0800 Subject: [PATCH 10/13] fix: 1. host start works for baremetal server with guest 2. fix host-syncstatus 3. baremetal may answer pxe request for hypervisors --- cmd/climc/shell/hosts.go | 2 ++ pkg/baremetal/manager.go | 7 ++++++- pkg/baremetal/pxe/dhcp.go | 1 + pkg/compute/models/hosts.go | 21 ++++++++++--------- .../baremetal_server_sync_status_task.go | 17 +++++++++------ 5 files changed, 31 insertions(+), 17 deletions(-) diff --git a/cmd/climc/shell/hosts.go b/cmd/climc/shell/hosts.go index 5ae2b87798..6dc6fc2736 100644 --- a/cmd/climc/shell/hosts.go +++ b/cmd/climc/shell/hosts.go @@ -25,6 +25,8 @@ func init() { HostType string `help:"Host type filter" choices:"baremetal|hypervisor|esxi|kubelet|hyperv|aliyun|azure|qcloud|aws|huawei"` AnyMac string `help:"Mac matches one of the host's interface"` + IsBaremetal *bool `help:"filter host list by is_baremetal=true|false"` + ResourceType string `help:"Resource type" choices:"shared|prepaid|dedicated"` Usable *bool `help:"List all zones that is usable"` diff --git a/pkg/baremetal/manager.go b/pkg/baremetal/manager.go index d2b119eedd..2fb7e50a39 100644 --- a/pkg/baremetal/manager.go +++ b/pkg/baremetal/manager.go @@ -600,13 +600,18 @@ func (b *SBaremetalInstance) NeedPXEBoot() bool { taskNeedPXEBoot = true } ret := false - if taskNeedPXEBoot || (task == nil && len(serverId) == 0) { + if taskNeedPXEBoot || (task == nil && len(serverId) == 0 && b.GetHostType() == "baremetal") { ret = true } log.Infof("Check task %s, server %s NeedPXEBoot: %v", taskName, serverId, ret) return ret } +func (b *SBaremetalInstance) GetHostType() string { + hostType, _ := b.desc.GetString("host_type") + return hostType +} + func (b *SBaremetalInstance) GetIPMINic(cliMac net.HardwareAddr) *types.SNic { nic := b.getNicByType(types.NIC_TYPE_IPMI) if nic == nil { diff --git a/pkg/baremetal/pxe/dhcp.go b/pkg/baremetal/pxe/dhcp.go index 729b3a7bcb..c34d424cd7 100644 --- a/pkg/baremetal/pxe/dhcp.go +++ b/pkg/baremetal/pxe/dhcp.go @@ -216,6 +216,7 @@ func (h *DHCPHandler) createOrUpdateBaremetal() (jsonutils.JSONObject, error) { session := h.baremetalManager.GetClientSession() params := jsonutils.NewDict() params.Add(jsonutils.NewString(h.ClientMac.String()), "any_mac") + params.Add(jsonutils.JSONTrue, "is_baremetal") ret, err := modules.Hosts.List(session, params) if err != nil { return nil, err diff --git a/pkg/compute/models/hosts.go b/pkg/compute/models/hosts.go index 2979db3c4c..e9cd46d353 100644 --- a/pkg/compute/models/hosts.go +++ b/pkg/compute/models/hosts.go @@ -2461,17 +2461,14 @@ func (self *SHost) PerformStart(ctx context.Context, userCred mcclient.TokenCred } guest := self.GetBaremetalServer() if guest != nil { - if self.HostType != HOST_TYPE_BAREMETAL { - if !utils.IsInStringArray(guest.Status, []string{VM_ADMIN}) { - return nil, httperrors.NewBadRequestError("Cannot start baremetal with active guest") - } - } else { - if utils.ToBool(guest.GetMetadata("is_fake_baremetal_server", userCred)) { - return nil, self.InitializedGuestStart(ctx, userCred, guest) - } - self.SetStatus(userCred, BAREMETAL_START_MAINTAIN, "") - return guest.PerformStart(ctx, userCred, query, data) + if self.HostType == HOST_TYPE_BAREMETAL && utils.ToBool(guest.GetMetadata("is_fake_baremetal_server", userCred)) { + return nil, self.InitializedGuestStart(ctx, userCred, guest) } + // if !utils.IsInStringArray(guest.Status, []string{VM_ADMIN}) { + // return nil, httperrors.NewBadRequestError("Cannot start baremetal with active guest") + // } + self.SetStatus(userCred, BAREMETAL_START_MAINTAIN, "") + return guest.PerformStart(ctx, userCred, query, data) } params := jsonutils.NewDict() params.Set("force_reboot", jsonutils.NewBool(false)) @@ -2633,6 +2630,10 @@ func (self *SHost) BaremetalSyncRequest(ctx context.Context, method httputils.TH } func (self *SHost) StartSyncstatus(ctx context.Context, userCred mcclient.TokenCredential, parentTaskId string) error { + guest := self.GetBaremetalServer() + if guest != nil { + return guest.StartSyncstatus(ctx, userCred, parentTaskId) + } task, err := taskman.TaskManager.NewTask(ctx, "BaremetalSyncStatusTask", self, userCred, nil, parentTaskId, "", nil) if err != nil { return err diff --git a/pkg/compute/tasks/baremetal_server_sync_status_task.go b/pkg/compute/tasks/baremetal_server_sync_status_task.go index db2aa58874..4c5c89d6fd 100644 --- a/pkg/compute/tasks/baremetal_server_sync_status_task.go +++ b/pkg/compute/tasks/baremetal_server_sync_status_task.go @@ -23,9 +23,7 @@ func (self *BaremetalServerSyncStatusTask) OnInit(ctx context.Context, obj db.IS guest := obj.(*models.SGuest) baremetal := guest.GetHost() if baremetal == nil { - kwargs := jsonutils.NewDict() - kwargs.Set("status", jsonutils.NewString(models.VM_INIT)) - guest.PerformStatus(ctx, self.UserCred, nil, kwargs) + guest.SetStatus(self.UserCred, models.VM_INIT, "BaremetalServerSyncStatusTask") self.SetStageComplete(ctx, nil) return } @@ -41,24 +39,31 @@ func (self *BaremetalServerSyncStatusTask) OnInit(ctx context.Context, obj db.IS func (self *BaremetalServerSyncStatusTask) OnGuestStatusTaskComplete(ctx context.Context, guest *models.SGuest, data jsonutils.JSONObject) { var status string + var hostStatus string if data.Contains("status") { statusStr, _ := data.GetString("status") switch statusStr { case "running": status = models.VM_RUNNING + hostStatus = models.HOST_STATUS_RUNNING case "stopped", "ready": status = models.VM_READY + hostStatus = models.HOST_STATUS_READY case "admin": status = models.VM_ADMIN + hostStatus = models.HOST_STATUS_RUNNING default: status = models.VM_INIT + hostStatus = models.HOST_STATUS_UNKNOWN } } else { status = models.VM_UNKNOWN + hostStatus = models.HOST_STATUS_UNKNOWN } - kwargs := jsonutils.NewDict() - kwargs.Set("status", jsonutils.NewString(status)) - guest.PerformStatus(ctx, self.UserCred, nil, kwargs) + guest.SetStatus(self.UserCred, status, "BaremetalServerSyncStatusTask") + host := guest.GetHost() + host.SetStatus(self.UserCred, hostStatus, "BaremetalServerSyncStatusTask") + self.SetStageComplete(ctx, nil) } From 6aaa82b7c3c44cfb98870c488670feee2e175839 Mon Sep 17 00:00:00 2001 From: Qiu Jian Date: Thu, 7 Mar 2019 01:56:23 +0800 Subject: [PATCH 11/13] minor fixes --- pkg/baremetal/pxe/dhcp.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/baremetal/pxe/dhcp.go b/pkg/baremetal/pxe/dhcp.go index c34d424cd7..bc8acfa316 100644 --- a/pkg/baremetal/pxe/dhcp.go +++ b/pkg/baremetal/pxe/dhcp.go @@ -260,7 +260,7 @@ func (h *DHCPHandler) updateBaremetal(id string) (jsonutils.JSONObject, error) { params := jsonutils.NewDict() params.Add(jsonutils.NewString(h.ClientMac.String()), "access_mac") params.Add(jsonutils.NewString(h.baremetalManager.GetZoneId()), "zone_id") - params.Add(jsonutils.NewString("baremetal"), "host_type") + // params.Add(jsonutils.NewString("baremetal"), "host_type") params.Add(jsonutils.JSONTrue, "is_baremetal") session := h.baremetalManager.GetClientSession() desc, err := modules.Hosts.Update(session, id, params) From e6f4186236334970095299382ceb6eb260e87e96 Mon Sep 17 00:00:00 2001 From: TangBin Date: Thu, 7 Mar 2019 14:28:21 +0800 Subject: [PATCH 12/13] disk GB fix && make fmt --- pkg/compute/guestdrivers/aws.go | 54 +++++++++++++++---------------- pkg/util/huawei/storagecache.go | 4 ++- pkg/util/imagetools/imagetools.go | 6 ++-- 3 files changed, 33 insertions(+), 31 deletions(-) diff --git a/pkg/compute/guestdrivers/aws.go b/pkg/compute/guestdrivers/aws.go index 749fa45fbd..0327c586ce 100644 --- a/pkg/compute/guestdrivers/aws.go +++ b/pkg/compute/guestdrivers/aws.go @@ -3,7 +3,7 @@ package guestdrivers import ( "context" "fmt" - "strings" + "strings" "time" "yunion.io/x/jsonutils" @@ -26,32 +26,32 @@ func init() { } func fetchAwsUserName(desc cloudprovider.SManagedVMCreateConfig) string { - // 非公有云官方镜像 - if desc.ImageType != "system" { - return "root" - } + // 非公有云官方镜像 + if desc.ImageType != "system" { + return "root" + } - // 公有云官方镜像 - dist := strings.ToLower(desc.OsDistribution) - if strings.Contains(dist, "centos") { - return "centos" - } else if strings.Contains(dist, "ubuntu") { - return "ubuntu" - } else if strings.Contains(dist, "windows") { - return "Administrator" - } else if strings.Contains(dist, "debian") { - return "admin" - } else if strings.Contains(dist, "suse") { - return "ec2-user" - } else if strings.Contains(dist, "fedora") { - return "ec2-user" - } else if strings.Contains(dist, "rhel") || strings.Contains(dist, "redhat") { - return "ec2-user" - } else if strings.Contains(dist, "amazon linux") { - return "ec2-user" - } else { - return "ec2-user" - } + // 公有云官方镜像 + dist := strings.ToLower(desc.OsDistribution) + if strings.Contains(dist, "centos") { + return "centos" + } else if strings.Contains(dist, "ubuntu") { + return "ubuntu" + } else if strings.Contains(dist, "windows") { + return "Administrator" + } else if strings.Contains(dist, "debian") { + return "admin" + } else if strings.Contains(dist, "suse") { + return "ec2-user" + } else if strings.Contains(dist, "fedora") { + return "ec2-user" + } else if strings.Contains(dist, "rhel") || strings.Contains(dist, "redhat") { + return "ec2-user" + } else if strings.Contains(dist, "amazon linux") { + return "ec2-user" + } else { + return "ec2-user" + } } func (self *SAwsGuestDriver) GetHypervisor() string { @@ -153,7 +153,7 @@ func (self *SAwsGuestDriver) RequestDeployGuestOnHost(ctx context.Context, guest return err } - username := fetchAwsUserName(desc) + username := fetchAwsUserName(desc) switch action { case "create": diff --git a/pkg/util/huawei/storagecache.go b/pkg/util/huawei/storagecache.go index c5ff63eb9b..bdfd31d86b 100644 --- a/pkg/util/huawei/storagecache.go +++ b/pkg/util/huawei/storagecache.go @@ -3,6 +3,7 @@ package huawei import ( "context" "fmt" + "math" "strings" "time" @@ -178,7 +179,8 @@ func (self *SStoragecache) uploadImage(ctx context.Context, userCred mcclient.To return "", err } - minDiskGB, _ := _image.Int("min_disk") + minDiskMB, _ := _image.Int("min_disk") + minDiskGB := int(math.Ceil(float64(minDiskMB) / 1024)) // 在使用OBS桶的外部镜像文件制作镜像时生效且为必选字段。取值为40~1024GB。 if minDiskGB < 40 { minDiskGB = 40 diff --git a/pkg/util/imagetools/imagetools.go b/pkg/util/imagetools/imagetools.go index afc4068d61..be36525a01 100644 --- a/pkg/util/imagetools/imagetools.go +++ b/pkg/util/imagetools/imagetools.go @@ -40,9 +40,9 @@ func normalizeOsDistribution(osDist string, imageName string) string { osDist = strings.ToLower(osDist) if strings.Contains(osDist, "centos") { return "CentOS" - } else if strings.Contains(osDist, "redhat") || strings.Contains(osDist, "rhel") { - return "RHEL" - } else if strings.Contains(osDist, "ubuntu") { + } else if strings.Contains(osDist, "redhat") || strings.Contains(osDist, "rhel") { + return "RHEL" + } else if strings.Contains(osDist, "ubuntu") { return "Ubuntu" } else if strings.Contains(osDist, "suse") { return "SUSE" From 9185c3c2acf055da048f525b10bd754c1affec3d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B1=88=E8=BD=A9?= Date: Thu, 7 Mar 2019 13:26:59 +0800 Subject: [PATCH 13/13] =?UTF-8?q?=E9=81=BF=E5=85=8Ddeploy=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1=E7=BB=93=E6=9D=9F=E6=97=B6=E6=A3=80=E6=9F=A5=E7=B3=BB?= =?UTF-8?q?=E7=BB=9F=E7=9B=98id=E4=B8=8E=E8=BF=94=E5=9B=9E=E7=9A=84?= =?UTF-8?q?=E7=A3=81=E7=9B=98id=E4=B8=8D=E5=8C=B9=E9=85=8D=E5=AF=BC?= =?UTF-8?q?=E8=87=B4=E4=BB=BB=E5=8A=A1=E5=A4=B1=E8=B4=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pkg/util/openstack/instance.go | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/pkg/util/openstack/instance.go b/pkg/util/openstack/instance.go index a9fe8f71e3..f98d48634d 100644 --- a/pkg/util/openstack/instance.go +++ b/pkg/util/openstack/instance.go @@ -380,8 +380,11 @@ func (instance *SInstance) DeployVM(ctx context.Context, name string, password s } func (instance *SInstance) RebuildRoot(ctx context.Context, imageId string, passwd string, publicKey string, sysSizeGB int) (string, error) { - return "", instance.host.zone.region.ReplaceSystemDisk(instance.ID, imageId, passwd, publicKey, sysSizeGB) - + sysDiskId := "" + if len(instance.VolumesAttached) > 0 { + sysDiskId = instance.VolumesAttached[0].ID + } + return sysDiskId, instance.host.zone.region.ReplaceSystemDisk(instance.ID, imageId, passwd, publicKey, sysSizeGB) } func (instance *SInstance) ChangeConfig(ctx context.Context, ncpu int, vmem int) error {