mirror of
https://github.com/yunionio/cloudpods.git
synced 2026-09-21 14:19:49 +08:00
Merge pull request #653 in YUNIONIO/onecloud from ~LIZEXI/onecloud:bugfix/lzx-baremetal-api to release/2.4.0
* commit '5dceb2685ca3a3c078f303ad8328c90ca43d6c8b': region: fix host enable not clean sched cache fix BaremetalSyncAllGuestsStatusTask region: baremetal api compatible region: baremetal api compatible
This commit is contained in:
@@ -5,7 +5,9 @@ import (
|
||||
|
||||
"yunion.io/x/jsonutils"
|
||||
"yunion.io/x/log"
|
||||
|
||||
"yunion.io/x/onecloud/pkg/mcclient"
|
||||
"yunion.io/x/onecloud/pkg/util/logclient"
|
||||
)
|
||||
|
||||
type SEnabledStatusStandaloneResourceBase struct {
|
||||
@@ -37,6 +39,7 @@ func (self *SEnabledStatusStandaloneResourceBase) PerformEnable(ctx context.Cont
|
||||
return nil, err
|
||||
}
|
||||
OpsLog.LogEvent(self, ACT_ENABLE, "", userCred)
|
||||
logclient.AddActionLog(self, logclient.ACT_ENABLE, nil, userCred, true)
|
||||
}
|
||||
return nil, nil
|
||||
}
|
||||
@@ -56,6 +59,7 @@ func (self *SEnabledStatusStandaloneResourceBase) PerformDisable(ctx context.Con
|
||||
return nil, err
|
||||
}
|
||||
OpsLog.LogEvent(self, ACT_DISABLE, "", userCred)
|
||||
logclient.AddActionLog(self, logclient.ACT_DISABLE, nil, userCred, true)
|
||||
}
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
@@ -201,10 +201,10 @@ func (model *SStandaloneResourceBase) PerformMetadata(ctx context.Context, userC
|
||||
}
|
||||
dictStore := make(map[string]interface{})
|
||||
for k, v := range dictMap {
|
||||
dictStore[k] = v
|
||||
dictStore[k], _ = v.GetString()
|
||||
}
|
||||
model.SetAllMetadata(ctx, dictStore, userCred)
|
||||
return nil, nil
|
||||
err = model.SetAllMetadata(ctx, dictStore, userCred)
|
||||
return nil, err
|
||||
}
|
||||
|
||||
func (model *SStandaloneResourceBase) GetCustomizeColumns(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject) *jsonutils.JSONDict {
|
||||
|
||||
@@ -654,9 +654,7 @@ func (self *STask) GetObjects() []db.IStandaloneModel {
|
||||
}
|
||||
|
||||
func (task *STask) GetTaskRequestHeader() http.Header {
|
||||
header := http.Header{}
|
||||
header.Set(mcclient.AUTH_TOKEN, task.GetUserCred().GetTokenString())
|
||||
header := mcclient.GetTokenHeaders(task.GetUserCred())
|
||||
header.Set(mcclient.TASK_ID, task.GetTaskId())
|
||||
header.Set(mcclient.REGION_VERSION, "v2")
|
||||
return header
|
||||
}
|
||||
|
||||
@@ -1,12 +1,14 @@
|
||||
package cloudprovider
|
||||
|
||||
import (
|
||||
"context"
|
||||
"time"
|
||||
|
||||
"context"
|
||||
"yunion.io/x/jsonutils"
|
||||
"yunion.io/x/onecloud/pkg/mcclient"
|
||||
"yunion.io/x/pkg/tristate"
|
||||
"yunion.io/x/pkg/util/secrules"
|
||||
|
||||
"yunion.io/x/onecloud/pkg/mcclient"
|
||||
)
|
||||
|
||||
type ICloudResource interface {
|
||||
@@ -356,7 +358,7 @@ type ICloudHostNetInterface interface {
|
||||
GetDriver() string
|
||||
GetMac() string
|
||||
GetIndex() int8
|
||||
IsLinkUp() bool
|
||||
IsLinkUp() tristate.TriState
|
||||
GetIpAddr() string
|
||||
GetMtu() int16
|
||||
GetNicType() string
|
||||
|
||||
@@ -3,7 +3,6 @@ package guestdrivers
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"net/http"
|
||||
"regexp"
|
||||
"strings"
|
||||
|
||||
@@ -168,9 +167,7 @@ func (self *SBaremetalGuestDriver) RequestStartOnHost(ctx context.Context, guest
|
||||
desc := guest.GetJsonDescAtBaremetal(ctx, host)
|
||||
config := jsonutils.NewDict()
|
||||
config.Set("desc", desc)
|
||||
headers := http.Header{}
|
||||
headers.Set("X-Auth-Token", task.GetUserCred().GetTokenString())
|
||||
headers.Set("X-Task-Id", task.GetTaskId())
|
||||
headers := task.GetTaskRequestHeader()
|
||||
url := fmt.Sprintf("/baremetals/%s/servers/%s/start", host.Id, guest.Id)
|
||||
return host.BaremetalSyncRequest(ctx, "POST", url, headers, config)
|
||||
}
|
||||
@@ -208,9 +205,7 @@ func (self *SBaremetalGuestDriver) RequestStopOnHost(ctx context.Context, guest
|
||||
timeout = 0
|
||||
}
|
||||
body.Set("timeout", jsonutils.NewInt(timeout))
|
||||
headers := http.Header{}
|
||||
headers.Set("X-Auth-Token", task.GetUserCred().GetTokenString())
|
||||
headers.Set("X-Task-Id", task.GetTaskId())
|
||||
headers := task.GetTaskRequestHeader()
|
||||
url := fmt.Sprintf("/baremetals/%s/servers/%s/stop", host.Id, guest.Id)
|
||||
_, err = host.BaremetalSyncRequest(ctx, "POST", url, headers, body)
|
||||
return err
|
||||
@@ -227,9 +222,7 @@ func (self *SBaremetalGuestDriver) StartGuestStopTask(guest *models.SGuest, ctx
|
||||
|
||||
func (self *SBaremetalGuestDriver) RequestUndeployGuestOnHost(ctx context.Context, guest *models.SGuest, host *models.SHost, task taskman.ITask) error {
|
||||
url := fmt.Sprintf("/baremetals/%s/servers/%s", host.Id, guest.Id)
|
||||
headers := http.Header{}
|
||||
headers.Set("X-Auth-Token", task.GetUserCred().GetTokenString())
|
||||
headers.Set("X-Task-Id", task.GetTaskId())
|
||||
headers := task.GetTaskRequestHeader()
|
||||
_, err := host.BaremetalSyncRequest(ctx, "DELETE", url, headers, nil)
|
||||
return err
|
||||
}
|
||||
@@ -361,9 +354,7 @@ func (self *SBaremetalGuestDriver) RequestDeployGuestOnHost(ctx context.Context,
|
||||
config.Set("on_finish", jsonutils.NewString("restart"))
|
||||
}
|
||||
url := fmt.Sprintf("/baremetals/%s/servers/%s/%s", host.Id, guest.Id, val)
|
||||
headers := http.Header{}
|
||||
headers.Set("X-Auth-Token", task.GetUserCred().GetTokenString())
|
||||
headers.Set("X-Task-Id", task.GetTaskId())
|
||||
headers := task.GetTaskRequestHeader()
|
||||
_, err := host.BaremetalSyncRequest(ctx, "POST", url, headers, config)
|
||||
return err
|
||||
}
|
||||
|
||||
+156
-37
@@ -135,7 +135,7 @@ type SHost struct {
|
||||
|
||||
StorageSize int `nullable:"true" list:"admin" update:"admin" create:"admin_optional"` // Column(Integer, nullable=True) # storage size in MB
|
||||
StorageType string `width:"20" charset:"ascii" nullable:"true" list:"admin" update:"admin" create:"admin_optional"` // Column(VARCHAR(20, charset='ascii'), nullable=True)
|
||||
StorageDriver string `width:"20" charset:"ascii" nullable:"true" update:"admin" create:"admin_optional"` // Column(VARCHAR(20, charset='ascii'), nullable=True)
|
||||
StorageDriver string `width:"20" charset:"ascii" nullable:"true" get:"admin" update:"admin" create:"admin_optional"` // Column(VARCHAR(20, charset='ascii'), nullable=True)
|
||||
StorageInfo jsonutils.JSONObject `nullable:"true" get:"admin" update:"admin" create:"admin_optional"` // Column(JSONEncodedDict, nullable=True)
|
||||
|
||||
IpmiInfo jsonutils.JSONObject `nullable:"true" get:"admin" update:"admin" create:"admin_optional"` // Column(JSONEncodedDict, nullable=True)
|
||||
@@ -507,6 +507,79 @@ func (self *SHost) GetBaremetalstorage() *SHoststorage {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (self *SHost) SaveCleanUpdates(doUpdate func() error) (map[string]sqlchemy.SUpdateDiff, error) {
|
||||
return self.saveUpdates(doUpdate, true)
|
||||
}
|
||||
|
||||
func (self *SHost) SaveUpdates(doUpdate func() error) (map[string]sqlchemy.SUpdateDiff, error) {
|
||||
return self.saveUpdates(doUpdate, false)
|
||||
}
|
||||
|
||||
func (self *SHost) saveUpdates(doUpdate func() error, doSchedClean bool) (map[string]sqlchemy.SUpdateDiff, error) {
|
||||
diff, err := self.GetModelManager().TableSpec().Update(self, doUpdate)
|
||||
if err == nil && doSchedClean {
|
||||
self.ClearSchedDescCache()
|
||||
}
|
||||
return diff, err
|
||||
}
|
||||
|
||||
func (self *SHost) AllowPerformUpdateStorage(
|
||||
ctx context.Context,
|
||||
userCred mcclient.TokenCredential,
|
||||
query jsonutils.JSONObject,
|
||||
data jsonutils.JSONObject,
|
||||
) bool {
|
||||
return db.IsAdminAllowPerform(userCred, self, "update-storage")
|
||||
}
|
||||
|
||||
func (self *SHost) PerformUpdateStorage(
|
||||
ctx context.Context,
|
||||
userCred mcclient.TokenCredential,
|
||||
query jsonutils.JSONObject,
|
||||
data jsonutils.JSONObject,
|
||||
) (jsonutils.JSONObject, error) {
|
||||
bs := self.GetBaremetalstorage()
|
||||
capacity, _ := data.Int("capacity")
|
||||
zoneId, _ := data.GetString("zone_id")
|
||||
if bs == nil {
|
||||
// 1. create storage
|
||||
storage := SStorage{}
|
||||
storage.Name = fmt.Sprintf("storage%s", self.GetName())
|
||||
storage.Capacity = int(capacity)
|
||||
storage.StorageType = STORAGE_BAREMETAL
|
||||
storage.MediumType = self.StorageType
|
||||
storage.Cmtbound = 1.0
|
||||
storage.Status = STORAGE_ONLINE
|
||||
storage.ZoneId = zoneId
|
||||
err := StorageManager.TableSpec().Insert(&storage)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("Create baremetal storage error: %v", err)
|
||||
}
|
||||
// 2. create host storage
|
||||
bmStorage := SHoststorage{}
|
||||
bmStorage.HostId = self.Id
|
||||
bmStorage.StorageId = storage.Id
|
||||
bmStorage.RealCapacity = int(capacity)
|
||||
bmStorage.MountPoint = ""
|
||||
err = HoststorageManager.TableSpec().Insert(&bmStorage)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("Create baremetal hostStorage error: %v", err)
|
||||
}
|
||||
return nil, nil
|
||||
}
|
||||
storage := bs.GetStorage()
|
||||
if capacity != int64(storage.Capacity) {
|
||||
_, err := storage.GetModelManager().TableSpec().Update(storage, func() error {
|
||||
storage.Capacity = int(capacity)
|
||||
return nil
|
||||
})
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("Update baremetal storage error: %v", err)
|
||||
}
|
||||
}
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
func (self *SHost) GetFetchUrl() string {
|
||||
managerUrl, err := url.Parse(self.ManagerUri)
|
||||
if err != nil {
|
||||
@@ -568,6 +641,15 @@ func (self *SHost) SyncAttachedStorageStatus() {
|
||||
}
|
||||
}
|
||||
|
||||
func (self *SHostManager) IsNewNameUnique(name string, userCred mcclient.TokenCredential, kwargs *jsonutils.JSONDict) bool {
|
||||
q := self.Query().Equals("name", name)
|
||||
if kwargs != nil && kwargs.Contains("zone_id") {
|
||||
zoneId, _ := kwargs.GetString("zone_id")
|
||||
q.Equals("zone_id", zoneId)
|
||||
}
|
||||
return q.Count() == 0
|
||||
}
|
||||
|
||||
func (self *SHostManager) AllowGetPropertyBmStartRegisterScript(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject) bool {
|
||||
return true
|
||||
}
|
||||
@@ -1053,7 +1135,7 @@ func (manager *SHostManager) SyncHosts(ctx context.Context, userCred mcclient.To
|
||||
}
|
||||
|
||||
func (self *SHost) syncWithCloudHost(extHost cloudprovider.ICloudHost, projectSync bool) error {
|
||||
_, err := self.GetModelManager().TableSpec().Update(self, func() error {
|
||||
_, err := self.SaveUpdates(func() error {
|
||||
self.Name = extHost.GetName()
|
||||
|
||||
self.Status = extHost.GetStatus()
|
||||
@@ -1963,7 +2045,7 @@ func (self *SHost) PostCreate(ctx context.Context, userCred mcclient.TokenCreden
|
||||
return
|
||||
}
|
||||
if ipmiInfo.Length() > 0 {
|
||||
_, err := HostManager.TableSpec().Update(self, func() error {
|
||||
_, err := self.SaveUpdates(func() error {
|
||||
self.IpmiInfo = ipmiInfo
|
||||
return nil
|
||||
})
|
||||
@@ -2031,7 +2113,7 @@ func (manager *SHostManager) ValidateCreateData(ctx context.Context, userCred mc
|
||||
}
|
||||
accessMac, err := data.GetString("access_mac")
|
||||
if err == nil {
|
||||
count := manager.TableSpec().Query().Equals("access_mac", accessMac).Count()
|
||||
count := HostManager.Query().Equals("access_mac", accessMac).Count()
|
||||
if count > 0 {
|
||||
return nil, httperrors.NewDuplicateResourceError("Duplicate access_mac %s", accessMac)
|
||||
}
|
||||
@@ -2097,7 +2179,7 @@ func (self *SHost) ValidateUpdateData(ctx context.Context, userCred mcclient.Tok
|
||||
val := jsonutils.NewDict()
|
||||
val.Update(self.IpmiInfo)
|
||||
val.Update(ipmiInfo)
|
||||
data.Set("impi_info", val)
|
||||
data.Set("ipmi_info", val)
|
||||
}
|
||||
data, err = self.SEnabledStatusStandaloneResourceBase.ValidateUpdateData(ctx, userCred, query, data)
|
||||
if err != nil {
|
||||
@@ -2145,9 +2227,10 @@ func (self *SHost) FetchIpmiInfo(data *jsonutils.JSONDict) (*jsonutils.JSONDict,
|
||||
IPMI_KEY_PERFIX := "ipmi_"
|
||||
ipmiInfo := jsonutils.NewDict()
|
||||
kv, _ := data.GetMap()
|
||||
var err error
|
||||
for key := range kv {
|
||||
value, err := ipmiInfo.GetString(key)
|
||||
if strings.HasPrefix(value, IPMI_KEY_PERFIX) {
|
||||
if strings.HasPrefix(key, IPMI_KEY_PERFIX) {
|
||||
value, _ := data.GetString(key)
|
||||
subkey := key[len(IPMI_KEY_PERFIX):]
|
||||
data.Remove(key)
|
||||
if subkey == "password" {
|
||||
@@ -2156,8 +2239,13 @@ func (self *SHost) FetchIpmiInfo(data *jsonutils.JSONDict) (*jsonutils.JSONDict,
|
||||
log.Errorf("encrypt password failed %s", err)
|
||||
return nil, err
|
||||
}
|
||||
} else if subkey == "ip_addr" {
|
||||
if !regutils.MatchIP4Addr(value) {
|
||||
log.Errorf("%s: %s not match ip address", key, value)
|
||||
continue
|
||||
}
|
||||
}
|
||||
ipmiInfo.Set(key, jsonutils.NewString(value))
|
||||
ipmiInfo.Set(subkey, jsonutils.NewString(value))
|
||||
}
|
||||
}
|
||||
return ipmiInfo, nil
|
||||
@@ -2359,12 +2447,16 @@ func (self *SHost) AllowPerformOffline(ctx context.Context,
|
||||
|
||||
func (self *SHost) PerformOffline(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, data jsonutils.JSONObject) (jsonutils.JSONObject, error) {
|
||||
if self.HostStatus != HOST_OFFLINE {
|
||||
self.GetModelManager().TableSpec().Update(self, func() error {
|
||||
_, err := self.SaveUpdates(func() error {
|
||||
self.HostStatus = HOST_OFFLINE
|
||||
return nil
|
||||
})
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
db.OpsLog.LogEvent(self, db.ACT_OFFLINE, "", userCred)
|
||||
logclient.AddActionLog(self, logclient.ACT_ONLINE, nil, userCred, true)
|
||||
self.SyncAttachedStorageStatus()
|
||||
}
|
||||
return nil, nil
|
||||
}
|
||||
@@ -2378,7 +2470,7 @@ func (self *SHost) AllowPerformOnline(ctx context.Context,
|
||||
|
||||
func (self *SHost) PerformOnline(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, data jsonutils.JSONObject) (jsonutils.JSONObject, error) {
|
||||
if self.HostStatus != HOST_ONLINE {
|
||||
_, err := self.GetModelManager().TableSpec().Update(self, func() error {
|
||||
_, err := self.SaveUpdates(func() error {
|
||||
self.LastPingAt = time.Now()
|
||||
self.HostStatus = HOST_ONLINE
|
||||
self.Status = BAREMETAL_RUNNING
|
||||
@@ -2416,7 +2508,7 @@ func (self *SHost) PerformPing(ctx context.Context, userCred mcclient.TokenCrede
|
||||
if self.HostStatus != HOST_ONLINE {
|
||||
self.PerformOnline(ctx, userCred, query, data)
|
||||
} else {
|
||||
self.GetModelManager().TableSpec().Update(self, func() error {
|
||||
self.SaveUpdates(func() error {
|
||||
self.LastPingAt = time.Now()
|
||||
return nil
|
||||
})
|
||||
@@ -2493,18 +2585,26 @@ func (self *SHost) PerformAddNetif(ctx context.Context, userCred mcclient.TokenC
|
||||
reserve := jsonutils.QueryBoolean(data, "reserve", false)
|
||||
requireDesignatedIp := jsonutils.QueryBoolean(data, "require_designated_ip", false)
|
||||
|
||||
err := self.addNetif(ctx, userCred, mac, wire, ipAddr, int(rate), nicType, int8(index), utils.ToBool(linkUp),
|
||||
isLinkUp := tristate.None
|
||||
if linkUp != "" {
|
||||
if utils.ToBool(linkUp) {
|
||||
isLinkUp = tristate.True
|
||||
} else {
|
||||
isLinkUp = tristate.False
|
||||
}
|
||||
}
|
||||
|
||||
err := self.addNetif(ctx, userCred, mac, wire, ipAddr, int(rate), nicType, int8(index), isLinkUp,
|
||||
int16(mtu), reset, strInterface, bridge, reserve, requireDesignatedIp)
|
||||
return nil, err
|
||||
}
|
||||
|
||||
func (self *SHost) addNetif(ctx context.Context, userCred mcclient.TokenCredential,
|
||||
mac string, wire string, ipAddr string,
|
||||
rate int, nicType string, index int8, linkUp bool, mtu int16,
|
||||
rate int, nicType string, index int8, linkUp tristate.TriState, mtu int16,
|
||||
reset bool, strInterface string, bridge string,
|
||||
reserve bool, requireDesignatedIp bool,
|
||||
) error {
|
||||
|
||||
var sw *SWire
|
||||
if len(wire) > 0 && len(ipAddr) == 0 {
|
||||
iWire, err := WireManager.FetchByIdOrName(userCred, wire)
|
||||
@@ -2539,7 +2639,9 @@ func (self *SHost) addNetif(ctx context.Context, userCred mcclient.TokenCredenti
|
||||
netif.Rate = rate
|
||||
netif.NicType = nicType
|
||||
netif.Index = index
|
||||
netif.LinkUp = linkUp
|
||||
if !linkUp.IsNone() {
|
||||
netif.LinkUp = linkUp.Bool()
|
||||
}
|
||||
netif.Mtu = mtu
|
||||
err = NetInterfaceManager.TableSpec().Insert(netif)
|
||||
if err != nil {
|
||||
@@ -2556,25 +2658,20 @@ func (self *SHost) addNetif(ctx context.Context, userCred mcclient.TokenCredenti
|
||||
changed = true
|
||||
netif.WireId = sw.Id
|
||||
}
|
||||
if rate != netif.Rate {
|
||||
changed = true
|
||||
netif.Rate = int(rate)
|
||||
if rate > 0 && rate != netif.Rate {
|
||||
netif.Rate = rate
|
||||
}
|
||||
if nicType != netif.NicType {
|
||||
changed = true
|
||||
if nicType != "" && nicType != netif.NicType {
|
||||
netif.NicType = nicType
|
||||
}
|
||||
if index >= 0 && index != netif.Index {
|
||||
changed = true
|
||||
netif.Index = int8(index)
|
||||
netif.Index = index
|
||||
}
|
||||
if linkUp != netif.LinkUp {
|
||||
changed = true
|
||||
netif.LinkUp = linkUp
|
||||
if !linkUp.IsNone() && linkUp.Bool() != netif.LinkUp {
|
||||
netif.LinkUp = linkUp.Bool()
|
||||
}
|
||||
if mtu != netif.Mtu {
|
||||
changed = true
|
||||
netif.Mtu = int16(mtu)
|
||||
if mtu > 0 && mtu != netif.Mtu {
|
||||
netif.Mtu = mtu
|
||||
}
|
||||
return nil
|
||||
})
|
||||
@@ -2870,24 +2967,46 @@ func (self *SHost) PerformRemoveAllNetifs(ctx context.Context, userCred mcclient
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
func (self *SHost) AllowPerformDisable(ctx context.Context,
|
||||
func (self *SHost) AllowPerformEnable(
|
||||
ctx context.Context,
|
||||
userCred mcclient.TokenCredential,
|
||||
query jsonutils.JSONObject,
|
||||
data jsonutils.JSONObject) bool {
|
||||
return db.IsAdminAllowPerform(userCred, self, "disable")
|
||||
data jsonutils.JSONObject,
|
||||
) bool {
|
||||
return self.SEnabledStatusStandaloneResourceBase.AllowPerformEnable(ctx, userCred, query, data)
|
||||
}
|
||||
|
||||
func (self *SHost) PerformEnable(
|
||||
ctx context.Context,
|
||||
userCred mcclient.TokenCredential,
|
||||
query jsonutils.JSONObject,
|
||||
data jsonutils.JSONObject,
|
||||
) (jsonutils.JSONObject, error) {
|
||||
if !self.Enabled {
|
||||
_, err := self.SEnabledStatusStandaloneResourceBase.PerformEnable(ctx, userCred, query, data)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
self.SyncAttachedStorageStatus()
|
||||
}
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
func (self *SHost) AllowPerformDisable(
|
||||
ctx context.Context,
|
||||
userCred mcclient.TokenCredential,
|
||||
query jsonutils.JSONObject,
|
||||
data jsonutils.JSONObject,
|
||||
) bool {
|
||||
return self.SEnabledStatusStandaloneResourceBase.AllowPerformDisable(ctx, userCred, query, data)
|
||||
}
|
||||
|
||||
func (self *SHost) PerformDisable(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, data jsonutils.JSONObject) (jsonutils.JSONObject, error) {
|
||||
if self.Enabled {
|
||||
_, err := self.GetModelManager().TableSpec().Update(self, func() error {
|
||||
self.Enabled = false
|
||||
return nil
|
||||
})
|
||||
_, err := self.SEnabledStatusStandaloneResourceBase.PerformDisable(ctx, userCred, query, data)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
db.OpsLog.LogEvent(self, db.ACT_DISABLE, "", userCred)
|
||||
logclient.AddActionLog(self, logclient.ACT_DISABLE, nil, userCred, true)
|
||||
self.SyncAttachedStorageStatus()
|
||||
}
|
||||
return nil, nil
|
||||
|
||||
@@ -3,7 +3,6 @@ package models
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"net/http"
|
||||
|
||||
"yunion.io/x/jsonutils"
|
||||
"yunion.io/x/log"
|
||||
@@ -110,8 +109,7 @@ func (self *SHoststorage) PostCreate(ctx context.Context, userCred mcclient.Toke
|
||||
host := storage.GetMasterHost()
|
||||
log.Infof("Attach SharedStorage[%s] on host %s ...", storage.Name, host.Name)
|
||||
url := fmt.Sprintf("%s/storages/attach", host.ManagerUri)
|
||||
headers := http.Header{}
|
||||
headers.Set("X-Auth-Token", userCred.GetTokenString())
|
||||
headers := mcclient.GetTokenHeaders(userCred)
|
||||
body := jsonutils.NewDict()
|
||||
body.Set("mount_point", jsonutils.NewString(self.MountPoint))
|
||||
body.Set("name", jsonutils.NewString(storage.Name))
|
||||
@@ -142,8 +140,7 @@ func (self *SHoststorage) PreDelete(ctx context.Context, userCred mcclient.Token
|
||||
host := storage.GetMasterHost()
|
||||
log.Infof("Attach SharedStorage[%s] on host %s ...", storage.Name, host.Name)
|
||||
url := fmt.Sprintf("%s/storages/detach", host.ManagerUri)
|
||||
headers := http.Header{}
|
||||
headers.Set("X-Auth-Token", userCred.GetTokenString())
|
||||
headers := mcclient.GetTokenHeaders(userCred)
|
||||
body := jsonutils.NewDict()
|
||||
body.Set("mount_point", jsonutils.NewString(self.MountPoint))
|
||||
body.Set("name", jsonutils.NewString(storage.Name))
|
||||
|
||||
@@ -3,7 +3,6 @@ package tasks
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"net/http"
|
||||
|
||||
"yunion.io/x/jsonutils"
|
||||
"yunion.io/x/log"
|
||||
@@ -29,9 +28,7 @@ func (self *BaremetalDeleteTask) OnInit(ctx context.Context, obj db.IStandaloneM
|
||||
return
|
||||
}
|
||||
url := fmt.Sprintf("/baremetals/%s/delete", baremetal.Id)
|
||||
headers := http.Header{}
|
||||
headers.Set("X-Auth-Token", self.UserCred.GetTokenString())
|
||||
headers.Set("X-Task-Id", self.GetTaskId())
|
||||
headers := self.GetTaskRequestHeader()
|
||||
self.SetStage("OnDeleteBaremetalComplete", nil)
|
||||
_, err := baremetal.BaremetalSyncRequest(ctx, "POST", url, headers, nil)
|
||||
if err != nil {
|
||||
|
||||
@@ -3,7 +3,6 @@ package tasks
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"net/http"
|
||||
|
||||
"yunion.io/x/jsonutils"
|
||||
"yunion.io/x/onecloud/pkg/cloudcommon/db"
|
||||
@@ -23,9 +22,7 @@ func init() {
|
||||
func (self *BaremetalMaintenanceTask) OnInit(ctx context.Context, obj db.IStandaloneModel, body jsonutils.JSONObject) {
|
||||
baremetal := obj.(*models.SHost)
|
||||
url := fmt.Sprintf("/baremetals/%s/maintenance", baremetal.Id)
|
||||
headers := http.Header{}
|
||||
headers.Set("X-Auth-Token", self.UserCred.GetTokenString())
|
||||
headers.Set("X-Task-Id", self.GetTaskId())
|
||||
headers := self.GetTaskRequestHeader()
|
||||
self.SetStage("OnEnterMaintenantModeSucc", nil)
|
||||
_, err := baremetal.BaremetalSyncRequest(ctx, "POST", url, headers, self.Params)
|
||||
if err != nil {
|
||||
|
||||
@@ -3,7 +3,6 @@ package tasks
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"net/http"
|
||||
|
||||
"yunion.io/x/jsonutils"
|
||||
"yunion.io/x/onecloud/pkg/cloudcommon/db"
|
||||
@@ -22,9 +21,7 @@ func init() {
|
||||
func (self *BaremetalPrepareTask) OnInit(ctx context.Context, obj db.IStandaloneModel, body jsonutils.JSONObject) {
|
||||
baremetal := obj.(*models.SHost)
|
||||
url := fmt.Sprintf("/baremetals/%s/prepare", baremetal.Id)
|
||||
headers := http.Header{}
|
||||
headers.Set("X-Auth-Token", self.UserCred.GetTokenString())
|
||||
headers.Set("X-Task-Id", self.GetTaskId())
|
||||
headers := self.GetTaskRequestHeader()
|
||||
self.SetStage("OnSyncConfigComplete", nil)
|
||||
_, err := baremetal.BaremetalSyncRequest(ctx, "POST", url, headers, self.Params)
|
||||
if err != nil {
|
||||
|
||||
@@ -3,7 +3,6 @@ package tasks
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"net/http"
|
||||
|
||||
"yunion.io/x/jsonutils"
|
||||
"yunion.io/x/log"
|
||||
@@ -23,8 +22,7 @@ func (self *BaremetalServerResetTask) OnInit(ctx context.Context, obj db.IStanda
|
||||
return
|
||||
}
|
||||
url := fmt.Sprintf("/baremetals/%s/servers/%s/reset", baremetal.Id, guest.Id)
|
||||
headers := http.Header{}
|
||||
headers.Set("X-Auth-Token", self.UserCred.GetTokenString())
|
||||
headers := self.GetTaskRequestHeader()
|
||||
_, err := baremetal.BaremetalSyncRequest(ctx, "POST", url, headers, nil)
|
||||
if err != nil {
|
||||
log.Errorf(err.Error())
|
||||
|
||||
@@ -3,7 +3,6 @@ package tasks
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"net/http"
|
||||
|
||||
"yunion.io/x/jsonutils"
|
||||
"yunion.io/x/log"
|
||||
@@ -33,9 +32,7 @@ func (self *BaremetalServerStartTask) OnInit(ctx context.Context, obj db.IStanda
|
||||
config := jsonutils.NewDict()
|
||||
config.Set("desc", desc)
|
||||
url := fmt.Sprintf("/baremetals/%s/servers/%s/start", baremetal.Id, guest.Id)
|
||||
headers := http.Header{}
|
||||
headers.Set("X-Auth-Token", self.UserCred.GetTokenString())
|
||||
headers.Set("X-Task-Id", self.GetTaskId())
|
||||
headers := self.GetTaskRequestHeader()
|
||||
self.SetStage("OnStartComplete", nil)
|
||||
_, err := baremetal.BaremetalSyncRequest(ctx, "POST", url, headers, config)
|
||||
if err != nil {
|
||||
|
||||
@@ -3,7 +3,6 @@ package tasks
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"net/http"
|
||||
|
||||
"yunion.io/x/jsonutils"
|
||||
"yunion.io/x/log"
|
||||
@@ -39,9 +38,7 @@ func (self *BaremetalServerStopTask) OnInit(ctx context.Context, obj db.IStandal
|
||||
}
|
||||
params.Set("timeout", jsonutils.NewInt(timeout))
|
||||
url := fmt.Sprintf("/baremetals/%s/servers/%s/stop", baremetal.Id, guest.Id)
|
||||
headers := http.Header{}
|
||||
headers.Set("X-Auth-Token", self.UserCred.GetTokenString())
|
||||
headers.Set("X-Task-Id", self.GetTaskId())
|
||||
headers := self.GetTaskRequestHeader()
|
||||
self.SetStage("OnGuestStopTaskComplete", nil)
|
||||
_, err = baremetal.BaremetalSyncRequest(ctx, "POST", url, headers, params)
|
||||
if err != nil {
|
||||
|
||||
@@ -3,7 +3,6 @@ package tasks
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"net/http"
|
||||
|
||||
"yunion.io/x/jsonutils"
|
||||
"yunion.io/x/log"
|
||||
@@ -31,9 +30,7 @@ func (self *BaremetalServerSyncStatusTask) OnInit(ctx context.Context, obj db.IS
|
||||
return
|
||||
}
|
||||
url := fmt.Sprintf("/baremetals/%s/servers/%s/status", baremetal.Id, guest.Id)
|
||||
headers := http.Header{}
|
||||
headers.Set("X-Auth-Token", self.GetUserCred().GetTokenString())
|
||||
headers.Set("X-Task-Id", self.GetId())
|
||||
headers := self.GetTaskRequestHeader()
|
||||
self.SetStage("OnGuestStatusTaskComplete", nil)
|
||||
_, err := baremetal.BaremetalSyncRequest(ctx, "POST", url, headers, nil)
|
||||
if err != nil {
|
||||
|
||||
@@ -3,12 +3,12 @@ package tasks
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"net/http"
|
||||
|
||||
"yunion.io/x/jsonutils"
|
||||
"yunion.io/x/onecloud/pkg/cloudcommon/db"
|
||||
"yunion.io/x/onecloud/pkg/cloudcommon/db/taskman"
|
||||
"yunion.io/x/onecloud/pkg/compute/models"
|
||||
"yunion.io/x/onecloud/pkg/util/logclient"
|
||||
)
|
||||
|
||||
type BaremetalSyncStatusTask struct {
|
||||
@@ -26,8 +26,7 @@ func (self *BaremetalSyncStatusTask) OnInit(ctx context.Context, obj db.IStandal
|
||||
|
||||
func (self *BaremetalSyncStatusTask) DoSyncStatus(ctx context.Context, baremetal *models.SHost) {
|
||||
url := fmt.Sprintf("/baremetals/%s/syncstatus", baremetal.Id)
|
||||
headers := http.Header{}
|
||||
headers.Set("X-Auth-Token", self.UserCred.GetTokenString())
|
||||
headers := self.GetTaskRequestHeader()
|
||||
_, err := baremetal.BaremetalSyncRequest(ctx, "POST", url, headers, nil)
|
||||
if err == nil {
|
||||
self.SetStageComplete(ctx, nil)
|
||||
@@ -44,7 +43,33 @@ func (self *BaremetalSyncAllGuestsStatusTask) OnInit(ctx context.Context, obj db
|
||||
baremetal := obj.(*models.SHost)
|
||||
guest := baremetal.GetBaremetalServer()
|
||||
if guest != nil {
|
||||
|
||||
var first bool
|
||||
if !guest.IsSystem {
|
||||
first = true
|
||||
}
|
||||
guest.GetModelManager().TableSpec().Update(guest, func() error {
|
||||
guest.IsSystem = true
|
||||
guest.VmemSize = 0
|
||||
guest.VcpuCount = 0
|
||||
return nil
|
||||
})
|
||||
bs := baremetal.GetBaremetalstorage().GetStorage()
|
||||
bs.SetStatus(self.UserCred, models.STORAGE_OFFLINE, "")
|
||||
if first && baremetal.Name != guest.Name {
|
||||
baremetal.GetModelManager().TableSpec().Update(baremetal, func() error {
|
||||
if models.HostManager.IsNewNameUnique(guest.Name, self.UserCred, nil) {
|
||||
baremetal.Name = guest.Name
|
||||
} else {
|
||||
baremetal.Name = db.GenerateName(baremetal.GetModelManager(),
|
||||
self.UserCred.GetTokenString(), guest.Name)
|
||||
}
|
||||
return nil
|
||||
})
|
||||
}
|
||||
if first {
|
||||
db.OpsLog.LogEvent(guest, db.ACT_CONVERT_COMPLETE, "", self.UserCred)
|
||||
logclient.AddActionLog(guest, logclient.ACT_BM_CONVERT_HYPER, "", self.UserCred, true)
|
||||
}
|
||||
}
|
||||
self.SetStage("OnGuestSyncStatusComplete", nil)
|
||||
self.OnGuestSyncStatusComplete(ctx, baremetal, nil)
|
||||
|
||||
@@ -3,7 +3,6 @@ package tasks
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"net/http"
|
||||
|
||||
"yunion.io/x/jsonutils"
|
||||
"yunion.io/x/onecloud/pkg/cloudcommon/db"
|
||||
@@ -23,9 +22,7 @@ func init() {
|
||||
func (self *BaremetalUnmaintenanceTask) OnInit(ctx context.Context, obj db.IStandaloneModel, body jsonutils.JSONObject) {
|
||||
baremetal := obj.(*models.SHost)
|
||||
url := fmt.Sprintf("/baremetals/%s/unmaintenance", baremetal.Id)
|
||||
headers := http.Header{}
|
||||
headers.Set("X-Auth-Token", self.UserCred.GetTokenString())
|
||||
headers.Set("X-Task-Id", self.GetTaskId())
|
||||
headers := self.GetTaskRequestHeader()
|
||||
self.SetStage("OnUnmaintenantComplete", nil)
|
||||
action := self.Action()
|
||||
_, err := baremetal.BaremetalSyncRequest(ctx, "POST", url, headers, self.Params)
|
||||
|
||||
@@ -5,6 +5,7 @@ import (
|
||||
|
||||
"yunion.io/x/jsonutils"
|
||||
"yunion.io/x/log"
|
||||
"yunion.io/x/pkg/utils"
|
||||
|
||||
"yunion.io/x/onecloud/pkg/cloudcommon/db"
|
||||
"yunion.io/x/onecloud/pkg/cloudcommon/db/taskman"
|
||||
@@ -12,7 +13,6 @@ import (
|
||||
"yunion.io/x/onecloud/pkg/compute/models"
|
||||
"yunion.io/x/onecloud/pkg/compute/options"
|
||||
"yunion.io/x/onecloud/pkg/util/logclient"
|
||||
"yunion.io/x/pkg/utils"
|
||||
)
|
||||
|
||||
type GuestDeleteTask struct {
|
||||
@@ -27,6 +27,7 @@ func (self *GuestDeleteTask) OnInit(ctx context.Context, obj db.IStandaloneModel
|
||||
guest := obj.(*models.SGuest)
|
||||
host := guest.GetHost()
|
||||
if guest.Hypervisor == models.HYPERVISOR_BAREMETAL && host.HostType != models.HOST_TYPE_BAREMETAL {
|
||||
// if a fake server for converted hypervisor, then just skip stop
|
||||
self.OnGuestStopComplete(ctx, obj, data)
|
||||
return
|
||||
}
|
||||
|
||||
@@ -3,7 +3,6 @@ package tasks
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"net/http"
|
||||
|
||||
"yunion.io/x/jsonutils"
|
||||
"yunion.io/x/pkg/utils"
|
||||
@@ -95,10 +94,7 @@ func (self *GuestMigrateTask) SaveScheduleResult(ctx context.Context, obj ISched
|
||||
|
||||
// For local storage get disk info
|
||||
func (self *GuestMigrateTask) OnCachedImageComplete(ctx context.Context, guest *models.SGuest, data jsonutils.JSONObject) {
|
||||
header := http.Header{}
|
||||
header.Set("X-Auth-Token", self.GetUserCred().GetTokenString())
|
||||
header.Set("X-Task-Id", self.GetTaskId())
|
||||
header.Set("X-Region-Version", "v2")
|
||||
header := self.GetTaskRequestHeader()
|
||||
body := jsonutils.NewDict()
|
||||
guestStatus, _ := self.Params.GetString("guest_status")
|
||||
if !jsonutils.QueryBoolean(self.Params, "is_rescue_mode", false) && (guestStatus == models.VM_RUNNING || guestStatus == models.VM_SUSPEND) {
|
||||
@@ -138,10 +134,7 @@ func (self *GuestMigrateTask) OnSrcPrepareComplete(ctx context.Context, guest *m
|
||||
body.Set("live_migrate", jsonutils.JSONTrue)
|
||||
}
|
||||
|
||||
headers := http.Header{}
|
||||
headers.Set("X-Auth-Token", self.GetUserCred().GetTokenString())
|
||||
headers.Set("X-Task-Id", self.GetTaskId())
|
||||
headers.Set("X-Region-Version", "v2")
|
||||
headers := self.GetTaskRequestHeader()
|
||||
|
||||
url := fmt.Sprintf("%s/servers/%s/dest-prepare-migrate", targetHost.ManagerUri, guest.Id)
|
||||
self.SetStage("OnMigrateConfAndDiskComplete", nil)
|
||||
@@ -266,10 +259,7 @@ func (self *GuestLiveMigrateTask) OnStartDestComplete(ctx context.Context, guest
|
||||
body.Set("live_migrate_dest_port", liveMigrateDestPort)
|
||||
body.Set("dest_ip", jsonutils.NewString(targetHost.AccessIp))
|
||||
|
||||
headers := http.Header{}
|
||||
headers.Set("X-Auth-Token", self.GetUserCred().GetTokenString())
|
||||
headers.Set("X-Task-Id", self.GetTaskId())
|
||||
headers.Set("X-Region-Version", "v2")
|
||||
headers := self.GetTaskRequestHeader()
|
||||
|
||||
host := guest.GetHost()
|
||||
url := fmt.Sprintf("%s/servers/%s/live-migrate", host.ManagerUri, guest.Id)
|
||||
@@ -325,10 +315,7 @@ func (self *GuestLiveMigrateTask) OnLiveMigrateCompleteFailed(ctx context.Contex
|
||||
}
|
||||
|
||||
func (self *GuestLiveMigrateTask) OnLiveMigrateComplete(ctx context.Context, guest *models.SGuest, data jsonutils.JSONObject) {
|
||||
headers := http.Header{}
|
||||
headers.Set("X-Auth-Token", self.GetUserCred().GetTokenString())
|
||||
headers.Set("X-Task-Id", self.GetTaskId())
|
||||
headers.Set("X-Region-Version", "v2")
|
||||
headers := self.GetTaskRequestHeader()
|
||||
body := jsonutils.NewDict()
|
||||
body.Set("live_migrate", jsonutils.JSONTrue)
|
||||
targetHostId, _ := self.Params.GetString("target_host_id")
|
||||
|
||||
@@ -47,6 +47,13 @@ func populateHeader(self *http.Header, update http.Header) {
|
||||
}
|
||||
}
|
||||
|
||||
func GetTokenHeaders(userCred TokenCredential) http.Header {
|
||||
headers := http.Header{}
|
||||
headers.Set(AUTH_TOKEN, userCred.GetTokenString())
|
||||
headers.Set(REGION_VERSION, "v2")
|
||||
return headers
|
||||
}
|
||||
|
||||
func SplitVersionedURL(url string) (string, string) {
|
||||
endidx := len(url) - 1
|
||||
for ; endidx >= 0 && url[endidx] == '/'; endidx-- {
|
||||
|
||||
@@ -5,10 +5,11 @@ import (
|
||||
"strings"
|
||||
"sync"
|
||||
|
||||
"yunion.io/x/pkg/utils"
|
||||
|
||||
"yunion.io/x/onecloud/pkg/scheduler/algorithm/predicates"
|
||||
"yunion.io/x/onecloud/pkg/scheduler/api"
|
||||
"yunion.io/x/onecloud/pkg/scheduler/core"
|
||||
"yunion.io/x/pkg/utils"
|
||||
)
|
||||
|
||||
type NetworkPredicate struct {
|
||||
|
||||
@@ -1,5 +1,9 @@
|
||||
package esxi
|
||||
|
||||
import (
|
||||
"yunion.io/x/pkg/tristate"
|
||||
)
|
||||
|
||||
type SHostNicInfo struct {
|
||||
Dev string
|
||||
Driver string
|
||||
@@ -27,8 +31,11 @@ func (nic *SHostNicInfo) GetIndex() int8 {
|
||||
return nic.Index
|
||||
}
|
||||
|
||||
func (nic *SHostNicInfo) IsLinkUp() bool {
|
||||
return nic.LinkUp
|
||||
func (nic *SHostNicInfo) IsLinkUp() tristate.TriState {
|
||||
if nic.LinkUp {
|
||||
return tristate.True
|
||||
}
|
||||
return tristate.False
|
||||
}
|
||||
|
||||
func (nic *SHostNicInfo) GetIpAddr() string {
|
||||
|
||||
Reference in New Issue
Block a user