diff --git a/pkg/compute/guestdrivers/baremetals.go b/pkg/compute/guestdrivers/baremetals.go index 40af2119ab..ab61df505d 100644 --- a/pkg/compute/guestdrivers/baremetals.go +++ b/pkg/compute/guestdrivers/baremetals.go @@ -5,6 +5,7 @@ import ( "fmt" "net/http" "regexp" + "strings" "yunion.io/x/jsonutils" "yunion.io/x/log" @@ -155,12 +156,20 @@ func (self *SBaremetalGuestDriver) RequestStartOnHost(ctx context.Context, guest } func (self *SBaremetalGuestDriver) RequestStopGuestForDelete(ctx context.Context, guest *models.SGuest, task taskman.ITask) error { + host := guest.GetHost() guestStatus, _ := task.GetParams().GetString("guest_status") - if guestStatus == models.VM_RUNNING && options.Options.EnablePendingDelete && !guest.PendingDeleted && jsonutils.QueryBoolean(task.GetParams(), "purge", false) { - host := guest.GetHost() - if host != nil && host.Enabled { - return guest.StartGuestStopTask(ctx, task.GetUserCred(), true, task.GetTaskId()) - } + overridePendingDelete := jsonutils.QueryBoolean(task.GetParams(), "override_pending_delete", false) + purge := jsonutils.QueryBoolean(task.GetParams(), "purge", false) + if host != nil && host.Enabled && + (guestStatus == models.VM_RUNNING || strings.Index(guestStatus, "stop") >= 0) && + options.Options.EnablePendingDelete && + !guest.PendingDeleted && + !overridePendingDelete && + !purge { + return guest.StartGuestStopTask(ctx, task.GetUserCred(), true, task.GetTaskId()) + } + if host != nil && !host.Enabled && !purge { + return fmt.Errorf("fail to contact baremetal") } task.ScheduleRun(nil) return nil diff --git a/pkg/compute/models/hosts.go b/pkg/compute/models/hosts.go index 7b72dd82f3..3e28f46768 100644 --- a/pkg/compute/models/hosts.go +++ b/pkg/compute/models/hosts.go @@ -2041,7 +2041,7 @@ func (self *SHost) FetchIpmiInfo(data *jsonutils.JSONDict) (*jsonutils.JSONDict, IPMI_KEY_PERFIX := "ipmi_" ipmiInfo := jsonutils.NewDict() kv, _ := data.GetMap() - for key, _ := range kv { + for key := range kv { value, err := ipmiInfo.GetString(key) if strings.HasPrefix(value, IPMI_KEY_PERFIX) { subkey := key[len(IPMI_KEY_PERFIX):] @@ -2375,7 +2375,7 @@ func (self *SHost) PerformAddNetif(ctx context.Context, userCred mcclient.TokenC ipAddr, _ := data.GetString("ip_addr") var sw *SWire if len(wire) > 0 && len(ipAddr) == 0 { - iWire, err := WireManager.FetchByIdOrName(userCred.GetProjectId(), wire) + iWire, err := WireManager.FetchByIdOrName(userCred, wire) if err != nil { return nil, httperrors.NewBadRequestError("Wire %s not found", wire) } @@ -2565,7 +2565,7 @@ func (self *SHost) EnableNetif(ctx context.Context, userCred mcclient.TokenCrede } if net == nil { if len(network) > 0 { - iNet, err := NetworkManager.FetchByIdOrName(userCred.GetProjectId(), network) + iNet, err := NetworkManager.FetchByIdOrName(userCred, network) if err != nil { return fmt.Errorf("Network %s not found: %s", network, err) } diff --git a/pkg/compute/models/storages.go b/pkg/compute/models/storages.go index 8a8a5676f8..1af83a0ca1 100644 --- a/pkg/compute/models/storages.go +++ b/pkg/compute/models/storages.go @@ -102,7 +102,7 @@ func (manager *SStorageManager) ValidateCreateData(ctx context.Context, userCred if err != nil { return nil, httperrors.NewMissingParameterError("zone") } - zone, _ := ZoneManager.FetchByIdOrName(userCred.GetProjectId(), zoneId) + zone, _ := ZoneManager.FetchByIdOrName(userCred, zoneId) if zone == nil { return nil, httperrors.NewResourceNotFoundError("zone %s", zoneId) }