diff --git a/pkg/apis/compute/api.go b/pkg/apis/compute/api.go index 51be45c035..7f2a6e3216 100644 --- a/pkg/apis/compute/api.go +++ b/pkg/apis/compute/api.go @@ -384,6 +384,10 @@ type ServerCreateInput struct { // required: false UserData string `json:"user_data"` + // swagger: ignore + // 创建测试数据,不实际创建资源 + FakeCreate bool `json:"fake_create"` + // swagger:ignore // Deprecated Keypair string `json:"keypair" yunion-deprecated-by:"keypair_id"` diff --git a/pkg/compute/models/guest_actions.go b/pkg/compute/models/guest_actions.go index dca0995b64..a7ab83cd42 100644 --- a/pkg/compute/models/guest_actions.go +++ b/pkg/compute/models/guest_actions.go @@ -1439,9 +1439,57 @@ func (self *SGuest) GuestNonSchedStartTask( } func (self *SGuest) StartGuestCreateTask(ctx context.Context, userCred mcclient.TokenCredential, input *api.ServerCreateInput, pendingUsage quotas.IQuota, parentTaskId string) error { + if input.FakeCreate { + self.fixFakeServerInfo(ctx, userCred) + return nil + } return self.GetDriver().StartGuestCreateTask(self, ctx, userCred, input.JSON(input), pendingUsage, parentTaskId) } +func (self *SGuest) fixFakeServerInfo(ctx context.Context, userCred mcclient.TokenCredential) { + status := []string{api.VM_READY, api.VM_RUNNING} + rand.Seed(time.Now().Unix()) + db.Update(self, func() error { + self.Status = status[rand.Intn(len(status))] + self.PowerStates = api.VM_POWER_STATES_ON + if self.Status == api.VM_READY { + self.PowerStates = api.VM_POWER_STATES_OFF + } + return nil + }) + disks, _ := self.GetDisks() + for i := range disks { + db.Update(&disks[i], func() error { + disks[i].Status = api.DISK_READY + return nil + }) + } + networks, _ := self.GetNetworks("") + for i := range networks { + if len(networks[i].IpAddr) > 0 { + continue + } + network := networks[i].GetNetwork() + if network != nil { + db.Update(&networks[i], func() error { + networks[i].IpAddr, _ = network.GetFreeIP(ctx, userCred, nil, nil, "", api.IPAllocationRadnom, false) + return nil + }) + } + } + if eip, _ := self.GetEipOrPublicIp(); eip != nil && len(eip.IpAddr) == 0 { + db.Update(eip, func() error { + if len(eip.NetworkId) > 0 { + if network, _ := eip.GetNetwork(); network != nil { + eip.IpAddr, _ = network.GetFreeIP(ctx, userCred, nil, nil, "", api.IPAllocationRadnom, false) + return nil + } + } + return nil + }) + } +} + func (self *SGuest) StartSyncstatus(ctx context.Context, userCred mcclient.TokenCredential, parentTaskId string) error { return self.GetDriver().StartGuestSyncstatusTask(self, ctx, userCred, parentTaskId) } diff --git a/pkg/mcclient/options/compute/servers.go b/pkg/mcclient/options/compute/servers.go index ea95c58ac1..d73e56ff43 100644 --- a/pkg/mcclient/options/compute/servers.go +++ b/pkg/mcclient/options/compute/servers.go @@ -430,6 +430,7 @@ type ServerCreateOptionalOptions struct { Group []string `help:"Group ID or Name of virtual server"` System bool `help:"Create a system VM, sysadmin ONLY option" json:"is_system"` TaskNotify *bool `help:"Setup task notify" json:"-"` + FakeCreate *bool `help:"Fake create server"` DryRun *bool `help:"Dry run to test scheduler" json:"-"` UserDataFile string `help:"user_data file path" json:"-"` InstanceSnapshot string `help:"instance snapshot" json:"instance_snapshot"` @@ -544,6 +545,10 @@ func (opts *ServerCreateOptionalOptions) OptionalParams() (*computeapi.ServerCre EnableMemclean: opts.EnableMemclean, } + if opts.FakeCreate != nil { + params.FakeCreate = *opts.FakeCreate + } + if len(opts.EncryptKey) > 0 { params.EncryptKeyId = &opts.EncryptKey }