From 22050bca71f7f4f8f769132cdc98e6801b185c13 Mon Sep 17 00:00:00 2001 From: Zexi Li Date: Sat, 1 Dec 2018 16:32:02 +0800 Subject: [PATCH 1/4] region: baremetal api compatible --- Gopkg.lock | 4 ++-- pkg/cloudcommon/db/standalone.go | 6 ++--- pkg/compute/models/hosts.go | 24 ++++++++++--------- pkg/compute/tasks/baremetal_delete_task.go | 5 +--- .../tasks/baremetal_maintenance_task.go | 5 +--- pkg/compute/tasks/baremetal_prepare_task.go | 5 +--- .../tasks/baremetal_server_reset_task.go | 4 +--- .../tasks/baremetal_server_start_task.go | 5 +--- .../tasks/baremetal_server_stop_task.go | 5 +--- .../baremetal_server_sync_status_task.go | 5 +--- .../tasks/baremetal_sync_status_task.go | 4 +--- .../tasks/baremetal_unmaintenance_task.go | 5 +--- vendor/yunion.io/x/sqlchemy/update.go | 5 +--- 13 files changed, 28 insertions(+), 54 deletions(-) diff --git a/Gopkg.lock b/Gopkg.lock index a1b81d3ba7..ef74322d9e 100644 --- a/Gopkg.lock +++ b/Gopkg.lock @@ -1368,11 +1368,11 @@ [[projects]] branch = "master" - digest = "1:66b13d3803b8ff8f26c3ca0422fb18ca0362dff62240e436b0aa0a921f833bb9" + digest = "1:5a3958d2f3c6c6510cc6b0e754cc45f6e98d8f8780ea04c1232a8f22fd6d91fc" name = "yunion.io/x/sqlchemy" packages = ["."] pruneopts = "UT" - revision = "7de55aae3ef9b019c47d21ff8fa4add1a9c80eb7" + revision = "30271a36b97155505642d6d3709a37600aade302" [[projects]] branch = "master" diff --git a/pkg/cloudcommon/db/standalone.go b/pkg/cloudcommon/db/standalone.go index cc73447c00..bcf99014c3 100644 --- a/pkg/cloudcommon/db/standalone.go +++ b/pkg/cloudcommon/db/standalone.go @@ -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 { diff --git a/pkg/compute/models/hosts.go b/pkg/compute/models/hosts.go index 30c731bd3c..c46678fd82 100644 --- a/pkg/compute/models/hosts.go +++ b/pkg/compute/models/hosts.go @@ -2031,7 +2031,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 +2097,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 +2145,11 @@ 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) + log.Errorf("---------fetch ipmiinfo key: %s, val: %s", key, value) subkey := key[len(IPMI_KEY_PERFIX):] data.Remove(key) if subkey == "password" { @@ -2156,8 +2158,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 @@ -2557,23 +2564,18 @@ func (self *SHost) addNetif(ctx context.Context, userCred mcclient.TokenCredenti netif.WireId = sw.Id } if rate != netif.Rate { - changed = true - netif.Rate = int(rate) + netif.Rate = rate } if nicType != netif.NicType { - changed = true netif.NicType = nicType } if index >= 0 && index != netif.Index { - changed = true netif.Index = int8(index) } if linkUp != netif.LinkUp { - changed = true netif.LinkUp = linkUp } if mtu != netif.Mtu { - changed = true netif.Mtu = int16(mtu) } return nil diff --git a/pkg/compute/tasks/baremetal_delete_task.go b/pkg/compute/tasks/baremetal_delete_task.go index 08dd848847..cdbb887fbd 100644 --- a/pkg/compute/tasks/baremetal_delete_task.go +++ b/pkg/compute/tasks/baremetal_delete_task.go @@ -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 { diff --git a/pkg/compute/tasks/baremetal_maintenance_task.go b/pkg/compute/tasks/baremetal_maintenance_task.go index 4575d9c82f..23c50a49ea 100644 --- a/pkg/compute/tasks/baremetal_maintenance_task.go +++ b/pkg/compute/tasks/baremetal_maintenance_task.go @@ -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 { diff --git a/pkg/compute/tasks/baremetal_prepare_task.go b/pkg/compute/tasks/baremetal_prepare_task.go index 83b9615021..79cd189345 100644 --- a/pkg/compute/tasks/baremetal_prepare_task.go +++ b/pkg/compute/tasks/baremetal_prepare_task.go @@ -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 { diff --git a/pkg/compute/tasks/baremetal_server_reset_task.go b/pkg/compute/tasks/baremetal_server_reset_task.go index 1f5f623163..af3f90945a 100644 --- a/pkg/compute/tasks/baremetal_server_reset_task.go +++ b/pkg/compute/tasks/baremetal_server_reset_task.go @@ -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()) diff --git a/pkg/compute/tasks/baremetal_server_start_task.go b/pkg/compute/tasks/baremetal_server_start_task.go index 90b43230c0..29c567b2f8 100644 --- a/pkg/compute/tasks/baremetal_server_start_task.go +++ b/pkg/compute/tasks/baremetal_server_start_task.go @@ -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 { diff --git a/pkg/compute/tasks/baremetal_server_stop_task.go b/pkg/compute/tasks/baremetal_server_stop_task.go index 40258c42fd..a963c147e1 100644 --- a/pkg/compute/tasks/baremetal_server_stop_task.go +++ b/pkg/compute/tasks/baremetal_server_stop_task.go @@ -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 { diff --git a/pkg/compute/tasks/baremetal_server_sync_status_task.go b/pkg/compute/tasks/baremetal_server_sync_status_task.go index 8e07cb1ce2..db2aa58874 100644 --- a/pkg/compute/tasks/baremetal_server_sync_status_task.go +++ b/pkg/compute/tasks/baremetal_server_sync_status_task.go @@ -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 { diff --git a/pkg/compute/tasks/baremetal_sync_status_task.go b/pkg/compute/tasks/baremetal_sync_status_task.go index 0fbaf408d1..56189a4b47 100644 --- a/pkg/compute/tasks/baremetal_sync_status_task.go +++ b/pkg/compute/tasks/baremetal_sync_status_task.go @@ -3,7 +3,6 @@ package tasks import ( "context" "fmt" - "net/http" "yunion.io/x/jsonutils" "yunion.io/x/onecloud/pkg/cloudcommon/db" @@ -26,8 +25,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) diff --git a/pkg/compute/tasks/baremetal_unmaintenance_task.go b/pkg/compute/tasks/baremetal_unmaintenance_task.go index 992dd07c70..456e0b7335 100644 --- a/pkg/compute/tasks/baremetal_unmaintenance_task.go +++ b/pkg/compute/tasks/baremetal_unmaintenance_task.go @@ -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) diff --git a/vendor/yunion.io/x/sqlchemy/update.go b/vendor/yunion.io/x/sqlchemy/update.go index f88e1a6bde..43ac815135 100644 --- a/vendor/yunion.io/x/sqlchemy/update.go +++ b/vendor/yunion.io/x/sqlchemy/update.go @@ -83,10 +83,7 @@ func (us *SUpdateSession) saveUpdate(dt interface{}) (map[string]SUpdateDiff, er setters := make(map[string]SUpdateDiff) for _, c := range us.tableSpec.columns { k := c.Name() - of, ok := ofields[k] - if !ok { - continue - } + of := ofields[k] nf := fields[k] if c.IsPrimary() && !c.IsZero(of) { // skip update primary key primaries[k] = of From 1b3d33986b0bd16f8a423fe9f590c94dbab354c3 Mon Sep 17 00:00:00 2001 From: Zexi Li Date: Sat, 1 Dec 2018 16:32:02 +0800 Subject: [PATCH 2/4] region: baremetal api compatible --- Gopkg.lock | 4 +- pkg/cloudcommon/db/standalone.go | 6 +- pkg/compute/models/hosts.go | 81 ++++++++++++++++--- pkg/compute/tasks/baremetal_delete_task.go | 5 +- .../tasks/baremetal_maintenance_task.go | 5 +- pkg/compute/tasks/baremetal_prepare_task.go | 5 +- .../tasks/baremetal_server_reset_task.go | 4 +- .../tasks/baremetal_server_start_task.go | 5 +- .../tasks/baremetal_server_stop_task.go | 5 +- .../baremetal_server_sync_status_task.go | 5 +- .../tasks/baremetal_sync_status_task.go | 4 +- .../tasks/baremetal_unmaintenance_task.go | 5 +- .../predicates/baremetal/network_predicate.go | 5 +- vendor/yunion.io/x/sqlchemy/update.go | 5 +- 14 files changed, 89 insertions(+), 55 deletions(-) diff --git a/Gopkg.lock b/Gopkg.lock index a1b81d3ba7..ef74322d9e 100644 --- a/Gopkg.lock +++ b/Gopkg.lock @@ -1368,11 +1368,11 @@ [[projects]] branch = "master" - digest = "1:66b13d3803b8ff8f26c3ca0422fb18ca0362dff62240e436b0aa0a921f833bb9" + digest = "1:5a3958d2f3c6c6510cc6b0e754cc45f6e98d8f8780ea04c1232a8f22fd6d91fc" name = "yunion.io/x/sqlchemy" packages = ["."] pruneopts = "UT" - revision = "7de55aae3ef9b019c47d21ff8fa4add1a9c80eb7" + revision = "30271a36b97155505642d6d3709a37600aade302" [[projects]] branch = "master" diff --git a/pkg/cloudcommon/db/standalone.go b/pkg/cloudcommon/db/standalone.go index cc73447c00..bcf99014c3 100644 --- a/pkg/cloudcommon/db/standalone.go +++ b/pkg/cloudcommon/db/standalone.go @@ -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 { diff --git a/pkg/compute/models/hosts.go b/pkg/compute/models/hosts.go index 30c731bd3c..aea55072d7 100644 --- a/pkg/compute/models/hosts.go +++ b/pkg/compute/models/hosts.go @@ -507,6 +507,63 @@ func (self *SHost) GetBaremetalstorage() *SHoststorage { return nil } +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 { @@ -2031,7 +2088,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 +2154,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 +2202,11 @@ 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) + log.Errorf("---------fetch ipmiinfo key: %s, val: %s", key, value) subkey := key[len(IPMI_KEY_PERFIX):] data.Remove(key) if subkey == "password" { @@ -2156,8 +2215,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 @@ -2557,23 +2621,18 @@ func (self *SHost) addNetif(ctx context.Context, userCred mcclient.TokenCredenti netif.WireId = sw.Id } if rate != netif.Rate { - changed = true - netif.Rate = int(rate) + netif.Rate = rate } if nicType != netif.NicType { - changed = true netif.NicType = nicType } if index >= 0 && index != netif.Index { - changed = true netif.Index = int8(index) } if linkUp != netif.LinkUp { - changed = true netif.LinkUp = linkUp } if mtu != netif.Mtu { - changed = true netif.Mtu = int16(mtu) } return nil diff --git a/pkg/compute/tasks/baremetal_delete_task.go b/pkg/compute/tasks/baremetal_delete_task.go index 08dd848847..cdbb887fbd 100644 --- a/pkg/compute/tasks/baremetal_delete_task.go +++ b/pkg/compute/tasks/baremetal_delete_task.go @@ -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 { diff --git a/pkg/compute/tasks/baremetal_maintenance_task.go b/pkg/compute/tasks/baremetal_maintenance_task.go index 4575d9c82f..23c50a49ea 100644 --- a/pkg/compute/tasks/baremetal_maintenance_task.go +++ b/pkg/compute/tasks/baremetal_maintenance_task.go @@ -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 { diff --git a/pkg/compute/tasks/baremetal_prepare_task.go b/pkg/compute/tasks/baremetal_prepare_task.go index 83b9615021..79cd189345 100644 --- a/pkg/compute/tasks/baremetal_prepare_task.go +++ b/pkg/compute/tasks/baremetal_prepare_task.go @@ -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 { diff --git a/pkg/compute/tasks/baremetal_server_reset_task.go b/pkg/compute/tasks/baremetal_server_reset_task.go index 1f5f623163..af3f90945a 100644 --- a/pkg/compute/tasks/baremetal_server_reset_task.go +++ b/pkg/compute/tasks/baremetal_server_reset_task.go @@ -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()) diff --git a/pkg/compute/tasks/baremetal_server_start_task.go b/pkg/compute/tasks/baremetal_server_start_task.go index 90b43230c0..29c567b2f8 100644 --- a/pkg/compute/tasks/baremetal_server_start_task.go +++ b/pkg/compute/tasks/baremetal_server_start_task.go @@ -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 { diff --git a/pkg/compute/tasks/baremetal_server_stop_task.go b/pkg/compute/tasks/baremetal_server_stop_task.go index 40258c42fd..a963c147e1 100644 --- a/pkg/compute/tasks/baremetal_server_stop_task.go +++ b/pkg/compute/tasks/baremetal_server_stop_task.go @@ -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 { diff --git a/pkg/compute/tasks/baremetal_server_sync_status_task.go b/pkg/compute/tasks/baremetal_server_sync_status_task.go index 8e07cb1ce2..db2aa58874 100644 --- a/pkg/compute/tasks/baremetal_server_sync_status_task.go +++ b/pkg/compute/tasks/baremetal_server_sync_status_task.go @@ -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 { diff --git a/pkg/compute/tasks/baremetal_sync_status_task.go b/pkg/compute/tasks/baremetal_sync_status_task.go index 0fbaf408d1..56189a4b47 100644 --- a/pkg/compute/tasks/baremetal_sync_status_task.go +++ b/pkg/compute/tasks/baremetal_sync_status_task.go @@ -3,7 +3,6 @@ package tasks import ( "context" "fmt" - "net/http" "yunion.io/x/jsonutils" "yunion.io/x/onecloud/pkg/cloudcommon/db" @@ -26,8 +25,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) diff --git a/pkg/compute/tasks/baremetal_unmaintenance_task.go b/pkg/compute/tasks/baremetal_unmaintenance_task.go index 992dd07c70..456e0b7335 100644 --- a/pkg/compute/tasks/baremetal_unmaintenance_task.go +++ b/pkg/compute/tasks/baremetal_unmaintenance_task.go @@ -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) diff --git a/pkg/scheduler/algorithm/predicates/baremetal/network_predicate.go b/pkg/scheduler/algorithm/predicates/baremetal/network_predicate.go index c569a8397e..c9e2a2e248 100644 --- a/pkg/scheduler/algorithm/predicates/baremetal/network_predicate.go +++ b/pkg/scheduler/algorithm/predicates/baremetal/network_predicate.go @@ -5,10 +5,12 @@ import ( "strings" "sync" + "yunion.io/x/log" + "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 { @@ -102,6 +104,7 @@ func (p *NetworkPredicate) Execute(u *core.Unit, c core.Candidater) (bool, []cor return isRandomNetworkAvailable(network.Private, network.Exit, network.Wire) } for _, net := range candidate.Networks { + log.Errorf("============ net %s TenantID: %s, sched OwnerTenantID: %s", net.Name, net.TenantID, schedData.OwnerTenantID) if (network.Idx == net.ID || network.Idx == net.Name) && (net.IsPublic || net.TenantID == schedData.OwnerTenantID) && (net.Ports > 0 || isMigrate()) { h.SetCapacity(1) return "" diff --git a/vendor/yunion.io/x/sqlchemy/update.go b/vendor/yunion.io/x/sqlchemy/update.go index f88e1a6bde..43ac815135 100644 --- a/vendor/yunion.io/x/sqlchemy/update.go +++ b/vendor/yunion.io/x/sqlchemy/update.go @@ -83,10 +83,7 @@ func (us *SUpdateSession) saveUpdate(dt interface{}) (map[string]SUpdateDiff, er setters := make(map[string]SUpdateDiff) for _, c := range us.tableSpec.columns { k := c.Name() - of, ok := ofields[k] - if !ok { - continue - } + of := ofields[k] nf := fields[k] if c.IsPrimary() && !c.IsZero(of) { // skip update primary key primaries[k] = of From ea81fa26dbcb56eefe131387b2fab8c3b731029d Mon Sep 17 00:00:00 2001 From: wanyaoqi Date: Mon, 3 Dec 2018 20:19:20 +0800 Subject: [PATCH 3/4] fix BaremetalSyncAllGuestsStatusTask --- pkg/compute/models/hosts.go | 9 ++++++ .../tasks/baremetal_sync_status_task.go | 29 ++++++++++++++++++- 2 files changed, 37 insertions(+), 1 deletion(-) diff --git a/pkg/compute/models/hosts.go b/pkg/compute/models/hosts.go index c46678fd82..40f84cf097 100644 --- a/pkg/compute/models/hosts.go +++ b/pkg/compute/models/hosts.go @@ -568,6 +568,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 } diff --git a/pkg/compute/tasks/baremetal_sync_status_task.go b/pkg/compute/tasks/baremetal_sync_status_task.go index 56189a4b47..e94303a4ea 100644 --- a/pkg/compute/tasks/baremetal_sync_status_task.go +++ b/pkg/compute/tasks/baremetal_sync_status_task.go @@ -8,6 +8,7 @@ import ( "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 { @@ -42,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) From 5dceb2685ca3a3c078f303ad8328c90ca43d6c8b Mon Sep 17 00:00:00 2001 From: Zexi Li Date: Tue, 4 Dec 2018 18:32:08 +0800 Subject: [PATCH 4/4] region: fix host enable not clean sched cache --- pkg/cloudcommon/db/enabledstatusstandalone.go | 4 ++ pkg/compute/models/hosts.go | 45 ++++++++++++++----- 2 files changed, 38 insertions(+), 11 deletions(-) diff --git a/pkg/cloudcommon/db/enabledstatusstandalone.go b/pkg/cloudcommon/db/enabledstatusstandalone.go index 6a456a429b..faffc888c0 100644 --- a/pkg/cloudcommon/db/enabledstatusstandalone.go +++ b/pkg/cloudcommon/db/enabledstatusstandalone.go @@ -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 } diff --git a/pkg/compute/models/hosts.go b/pkg/compute/models/hosts.go index 13f62f7bed..5df731c4fb 100644 --- a/pkg/compute/models/hosts.go +++ b/pkg/compute/models/hosts.go @@ -2447,7 +2447,7 @@ 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 { - _, err := self.SaveCleanUpdates(func() error { + _, err := self.SaveUpdates(func() error { self.HostStatus = HOST_OFFLINE return nil }) @@ -2456,6 +2456,7 @@ func (self *SHost) PerformOffline(ctx context.Context, userCred mcclient.TokenCr } db.OpsLog.LogEvent(self, db.ACT_OFFLINE, "", userCred) logclient.AddActionLog(self, logclient.ACT_ONLINE, nil, userCred, true) + self.SyncAttachedStorageStatus() } return nil, nil } @@ -2469,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.SaveCleanUpdates(func() error { + _, err := self.SaveUpdates(func() error { self.LastPingAt = time.Now() self.HostStatus = HOST_ONLINE self.Status = BAREMETAL_RUNNING @@ -2966,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.SaveCleanUpdates(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