diff --git a/pkg/apis/compute/guest_image.go b/pkg/apis/compute/guest_image.go index 0c8a016e2d..cf87e4c218 100644 --- a/pkg/apis/compute/guest_image.go +++ b/pkg/apis/compute/guest_image.go @@ -14,14 +14,16 @@ package compute -type sPair struct { - ID string +type SSubImage struct { + Id string Name string MinDiskMB int32 DiskFormat string } type SImagesInGuest struct { - RootImage sPair - DataImages []sPair + Id string + Name string + RootImage SSubImage + DataImages []SSubImage } diff --git a/pkg/compute/models/guests.go b/pkg/compute/models/guests.go index 29648c99b5..f3243e60f4 100644 --- a/pkg/compute/models/guests.go +++ b/pkg/compute/models/guests.go @@ -6074,17 +6074,6 @@ func (self *SGuest) getGuestUsage(guestCount int) (SQuota, SRegionQuota, error) } func (self *SGuestManager) checkGuestImage(ctx context.Context, input *api.ServerCreateInput) error { - // There is no need to check the availability of guest imag if input.Disks is empty - if len(input.Disks) == 0 { - return nil - } - // That data disks has image id show that these image is part of guest image - for _, config := range input.Disks[1:] { - if len(config.ImageId) != 0 && len(input.GuestImageID) == 0 { - return httperrors.NewMissingParameterError("guest_image_id") - } - } - if len(input.GuestImageID) == 0 { return nil } @@ -6099,35 +6088,36 @@ func (self *SGuestManager) checkGuestImage(ctx context.Context, input *api.Serve return errors.Wrap(err, "get guest image from glance error") } - // input.GuestImageID maybe name of guestimage - if ret.Contains("id") { - id, _ := ret.GetString("id") - input.GuestImageID = id - } - images := &api.SImagesInGuest{} err = ret.Unmarshal(images) if err != nil { - return errors.Wrap(err, "get guest image from glance error") + return errors.Wrap(err, "unmarshal guest image") } - imageIdMap := make(map[string]struct{}) - for _, pair := range images.DataImages { - imageIdMap[pair.ID] = struct{}{} - } - imageIdMap[images.RootImage.ID] = struct{}{} + input.GuestImageID = images.Id - // check - for _, diskConfig := range input.Disks { - if len(diskConfig.ImageId) != 0 { - if _, ok := imageIdMap[diskConfig.ImageId]; !ok { - return httperrors.NewBadRequestError("image %s do not belong to guest image %s", diskConfig.ImageId, guestImageId) - } - delete(imageIdMap, diskConfig.ImageId) + log.Infof("usage guest image %s(%s)", images.Name, images.Id) + + if len(input.Disks) > 0 { + input.Disks[0].ImageId = images.RootImage.Id + } else { + input.Disks = append(input.Disks, + &api.DiskConfig{ + ImageId: images.RootImage.Id, + }, + ) + } + for i := range images.DataImages { + if len(input.Disks) > i+1 { + input.Disks[i+1].ImageId = images.DataImages[i].Id + } else { + input.Disks = append(input.Disks, + &api.DiskConfig{ + ImageId: images.DataImages[i].Id, + }, + ) } } - if len(imageIdMap) != 0 { - return httperrors.NewBadRequestError("miss some subimage of guest image") - } + return nil } diff --git a/pkg/mcclient/options/compute/servers.go b/pkg/mcclient/options/compute/servers.go index 2d571efc28..f04dbe5cd0 100644 --- a/pkg/mcclient/options/compute/servers.go +++ b/pkg/mcclient/options/compute/servers.go @@ -545,6 +545,8 @@ func (opts *ServerCreateOptionalOptions) OptionalParams() (*computeapi.ServerCre EnableMemclean: opts.EnableMemclean, } + params.ProjectId = opts.Project + if opts.FakeCreate != nil { params.FakeCreate = *opts.FakeCreate }