From 127ce54503255fca65564b548cf87cb2edabe4db Mon Sep 17 00:00:00 2001 From: wanyaoqi Date: Sun, 26 Apr 2020 18:31:55 +0800 Subject: [PATCH] misc bugfix: - fix get details hosts - save image enable generate_name - network auto set dns - fix servers filter by disk --- pkg/apis/compute/guests.go | 5 +++- pkg/cloudcommon/db/caller.go | 4 +-- pkg/compute/models/disks.go | 19 +++++++++------ pkg/compute/models/guest_actions.go | 2 +- pkg/compute/models/guests.go | 38 ++++++++++++++--------------- pkg/compute/models/hosts.go | 4 +++ pkg/compute/models/networks.go | 4 +++ 7 files changed, 45 insertions(+), 31 deletions(-) diff --git a/pkg/apis/compute/guests.go b/pkg/apis/compute/guests.go index db599b5cd6..e4ce3e75b2 100644 --- a/pkg/apis/compute/guests.go +++ b/pkg/apis/compute/guests.go @@ -36,7 +36,7 @@ type ServerListInput struct { GroupFilterListInput SecgroupFilterListInput - DiskFilterListInput `"yunion:ambiguous-prefix":"storage_"` + //DiskFilterListInput `"yunion:ambiguous-prefix":"storage_"` ScalingGroupFilterListInput // 只列出裸金属主机 @@ -63,6 +63,9 @@ type ServerListInput struct { // 列出可以挂载指定EIP的主机 UsableServerForEip string `json:"usable_server_for_eip"` + // 列出可以挂载磁盘的主机 + AttachableServersForDisk string `json:"attachable_servers_for_disk" "yunion:deprecated-by":"disk"` + // 按主机资源类型进行排序 // enum: shared,prepaid,dedicated ResourceType string `json:"resource_type"` diff --git a/pkg/cloudcommon/db/caller.go b/pkg/cloudcommon/db/caller.go index d3197a8375..91e7d5245e 100644 --- a/pkg/cloudcommon/db/caller.go +++ b/pkg/cloudcommon/db/caller.go @@ -291,8 +291,8 @@ func FetchCustomizeColumns( } retVal := make([]*jsonutils.JSONDict, ret[0].Len()) for i := 0; i < ret[0].Len(); i += 1 { - jsonDict := ValueToJSONDict(ret[0].Index(i)) - jsonDict.Update(jsonutils.Marshal(objs[i])) + jsonDict := jsonutils.Marshal(objs[i]).(*jsonutils.JSONDict) + jsonDict.Update(ValueToJSONDict(ret[0].Index(i))) retVal[i] = jsonDict } return retVal, nil diff --git a/pkg/compute/models/disks.go b/pkg/compute/models/disks.go index 7e87a5b80b..1bc67c94ea 100644 --- a/pkg/compute/models/disks.go +++ b/pkg/compute/models/disks.go @@ -973,15 +973,18 @@ func (self *SDisk) PrepareSaveImage(ctx context.Context, userCred mcclient.Token return "", httperrors.NewResourceNotFoundError("No zone for this disk") } data.Add(jsonutils.NewString(self.DiskFormat), "disk_format") - name, _ := data.GetString("name") - s := auth.GetAdminSession(ctx, options.Options.Region, "") - imageList, err := modules.Images.List(s, jsonutils.Marshal(map[string]string{"name": name, "admin": "true"})) - if err != nil { - return "", err - } - if imageList.Total > 0 { - return "", httperrors.NewConflictError("Duplicate image name %s", name) + if !data.Contains("generate_name") { + name, _ := data.GetString("name") + s := auth.GetAdminSession(ctx, options.Options.Region, "") + imageList, err := modules.Images.List(s, jsonutils.Marshal(map[string]string{"name": name, "admin": "true"})) + if err != nil { + return "", err + } + if imageList.Total > 0 { + return "", httperrors.NewConflictError("Duplicate image name %s", name) + } } + /* no need to check quota anymore session := auth.GetSession(userCred, options.Options.Region, "v2") diff --git a/pkg/compute/models/guest_actions.go b/pkg/compute/models/guest_actions.go index 41268a8b65..8fb4478d09 100644 --- a/pkg/compute/models/guest_actions.go +++ b/pkg/compute/models/guest_actions.go @@ -155,7 +155,7 @@ func (self *SGuest) AllowPerformSaveImage(ctx context.Context, userCred mcclient func (self *SGuest) PerformSaveImage(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, data jsonutils.JSONObject) (jsonutils.JSONObject, error) { if !utils.IsInStringArray(self.Status, []string{api.VM_READY}) { return nil, httperrors.NewInputParameterError("Cannot save image in status %s", self.Status) - } else if !data.Contains("name") { + } else if !data.Contains("name") && !data.Contains("generate_name") { return nil, httperrors.NewInputParameterError("Image name is required") } else if disks := self.CategorizeDisks(); disks.Root == nil { return nil, httperrors.NewInputParameterError("No root image") diff --git a/pkg/compute/models/guests.go b/pkg/compute/models/guests.go index 04b13c4ba8..084681342c 100644 --- a/pkg/compute/models/guests.go +++ b/pkg/compute/models/guests.go @@ -201,14 +201,14 @@ func (manager *SGuestManager) ListItemFilter( q = q.In("id", netQ.SubQuery()) } - diskQ := GuestdiskManager.Query("guest_id").Snapshot() - diskQ, err = manager.SDiskResourceBaseManager.ListItemFilter(ctx, diskQ, userCred, query.DiskFilterListInput) - if err != nil { - return nil, errors.Wrap(err, "SDiskResourceBaseManager.ListItemFilter") - } - if diskQ.IsAltered() { - q = q.In("id", diskQ.SubQuery()) - } + //diskQ := GuestdiskManager.Query("guest_id").Snapshot() + //diskQ, err = manager.SDiskResourceBaseManager.ListItemFilter(ctx, diskQ, userCred, query.DiskFilterListInput) + //if err != nil { + // return nil, errors.Wrap(err, "SDiskResourceBaseManager.ListItemFilter") + //} + //if diskQ.IsAltered() { + // q = q.In("id", diskQ.SubQuery()) + //} scalingGroupQ := ScalingGroupGuestManager.Query("guest_id").NotEquals("guest_status", api.SG_GUEST_STATUS_PENDING_REMOVE).Snapshot() scalingGroupQ, err = manager.SScalingGroupResourceBaseManager.ListItemFilter(ctx, scalingGroupQ, userCred, query.ScalingGroupFilterListInput) @@ -337,7 +337,7 @@ func (manager *SGuestManager) ListItemFilter( q = q.In("host_id", sq) } - /*diskFilter := query.Disk + diskFilter := query.AttachableServersForDisk if len(diskFilter) > 0 { diskI, _ := DiskManager.FetchByIdOrName(userCred, diskFilter) if diskI == nil { @@ -362,7 +362,7 @@ func (manager *SGuestManager) ListItemFilter( Filter(sqlchemy.Equals(storages.Field("id"), disk.StorageId)).SubQuery() q = q.In("host_id", sq) } - }*/ + } withEip := (query.WithEip != nil && *query.WithEip) withoutEip := (query.WithoutEip != nil && *query.WithoutEip) @@ -501,15 +501,15 @@ func (manager *SGuestManager) OrderByExtraFields(ctx context.Context, q *sqlchem return nil, errors.Wrap(err, "SNetworkResourceBaseManager.OrderByExtraFields") } } - fields = manager.SDiskResourceBaseManager.GetOrderByFields(query.DiskFilterListInput) - if db.NeedOrderQuery(fields) { - diskQ := GuestdiskManager.Query("guest_id", "disk_id").SubQuery() - q = q.LeftJoin(diskQ, sqlchemy.Equals(q.Field("id"), diskQ.Field("guest_id"))).Distinct() - q, err = manager.SDiskResourceBaseManager.OrderByExtraFields(ctx, q, userCred, query.DiskFilterListInput) - if err != nil { - return nil, errors.Wrap(err, "SDiskResourceBaseManager.OrderByExtraFields") - } - } + //fields = manager.SDiskResourceBaseManager.GetOrderByFields(query.DiskFilterListInput) + //if db.NeedOrderQuery(fields) { + // diskQ := GuestdiskManager.Query("guest_id", "disk_id").SubQuery() + // q = q.LeftJoin(diskQ, sqlchemy.Equals(q.Field("id"), diskQ.Field("guest_id"))).Distinct() + // q, err = manager.SDiskResourceBaseManager.OrderByExtraFields(ctx, q, userCred, query.DiskFilterListInput) + // if err != nil { + // return nil, errors.Wrap(err, "SDiskResourceBaseManager.OrderByExtraFields") + // } + //} return q, nil } diff --git a/pkg/compute/models/hosts.go b/pkg/compute/models/hosts.go index 7ce8c8bcbd..a6be2c1e48 100644 --- a/pkg/compute/models/hosts.go +++ b/pkg/compute/models/hosts.go @@ -2584,6 +2584,10 @@ func (self *SHost) getMoreDetails(ctx context.Context, out api.HostDetails, show out.StorageCommitRate = capa.GetCommitRate() out.Spec = self.GetHardwareSpecification() + // custom cpu mem commit bound + out.CpuCmtbound = self.GetCPUOvercommitBound() + out.MemCmtbound = self.GetMemoryOvercommitBound() + // extra = self.SManagedResourceBase.getExtraDetails(ctx, extra) out.IsPrepaidRecycle = false diff --git a/pkg/compute/models/networks.go b/pkg/compute/models/networks.go index 57455c26c7..b1c3ca0858 100644 --- a/pkg/compute/models/networks.go +++ b/pkg/compute/models/networks.go @@ -1311,6 +1311,10 @@ func (manager *SNetworkManager) ValidateCreateData(ctx context.Context, userCred return input, httperrors.NewInputParameterError("Invalid masklen %d", input.GuestIpMask) } + if len(input.GuestDns) == 0 { + input.GuestDns = options.Options.DNSServer + } + for key, ipStr := range map[string]string{"guest_gateway": input.GuestGateway, "guest_dns": input.GuestDns, "guest_dhcp": input.GuestDHCP} { if len(ipStr) > 0 { if key == "guest_dhcp" {