mirror of
https://github.com/yunionio/cloudpods.git
synced 2026-09-21 06:09:39 +08:00
fix: 1. nil pointer panic error when accessing resource pool and
storagecache 2. support multiple disk format
This commit is contained in:
@@ -437,6 +437,10 @@ func syncZoneStorages(ctx context.Context, userCred mcclient.TokenCredential, sy
|
||||
|
||||
func syncStorageCaches(ctx context.Context, userCred mcclient.TokenCredential, provider *SCloudprovider, localStorage *SStorage, remoteStorage cloudprovider.ICloudStorage) (cachePair sStoragecacheSyncPair) {
|
||||
remoteCache := remoteStorage.GetIStoragecache()
|
||||
if remoteCache == nil {
|
||||
log.Errorf("remote storageCache is nil")
|
||||
return
|
||||
}
|
||||
localCache, isNew, err := StoragecacheManager.SyncWithCloudStoragecache(ctx, userCred, remoteCache, provider)
|
||||
if err != nil {
|
||||
msg := fmt.Sprintf("SyncWithCloudStoragecache for storage %s failed %s", remoteStorage.GetName(), err)
|
||||
|
||||
@@ -1461,9 +1461,15 @@ func (manager *SHostManager) newFromCloudHost(ctx context.Context, userCred mccl
|
||||
|
||||
if izone == nil {
|
||||
// onpremise host
|
||||
wire, err := WireManager.GetOnPremiseWireOfIp(extHost.GetAccessIp())
|
||||
accessIp := extHost.GetAccessIp()
|
||||
if len(accessIp) == 0 {
|
||||
msg := fmt.Sprintf("fail to find wire for host %s: empty host access ip", extHost.GetName())
|
||||
log.Errorf(msg)
|
||||
return nil, fmt.Errorf(msg)
|
||||
}
|
||||
wire, err := WireManager.GetOnPremiseWireOfIp(accessIp)
|
||||
if err != nil {
|
||||
msg := fmt.Sprintf("fail to find wire for host %s %s: %s", extHost.GetName(), extHost.GetAccessIp(), err)
|
||||
msg := fmt.Sprintf("fail to find wire for host %s %s: %s", extHost.GetName(), accessIp, err)
|
||||
log.Errorf(msg)
|
||||
return nil, fmt.Errorf(msg)
|
||||
}
|
||||
|
||||
+100
-12
@@ -48,11 +48,96 @@ func (disk *SVirtualDisk) getVirtualDisk() *types.VirtualDisk {
|
||||
return disk.dev.(*types.VirtualDisk)
|
||||
}
|
||||
|
||||
func (disk *SVirtualDisk) getBackingInfo() *types.VirtualDiskFlatVer2BackingInfo {
|
||||
type IDiskBackingInfo interface {
|
||||
GetParent() IDiskBackingInfo
|
||||
GetUuid() string
|
||||
GetDiskMode() string
|
||||
GetWriteThrough() bool
|
||||
GetFileName() string
|
||||
GetDatastore() *types.ManagedObjectReference
|
||||
}
|
||||
|
||||
type sVirtualDiskFlatVer2BackingInfo struct {
|
||||
info *types.VirtualDiskFlatVer2BackingInfo
|
||||
}
|
||||
|
||||
func (s *sVirtualDiskFlatVer2BackingInfo) GetParent() IDiskBackingInfo {
|
||||
if s.info.Parent != nil {
|
||||
return &sVirtualDiskFlatVer2BackingInfo{
|
||||
info: s.info.Parent,
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (s *sVirtualDiskFlatVer2BackingInfo) GetUuid() string {
|
||||
return s.info.Uuid
|
||||
}
|
||||
|
||||
func (s *sVirtualDiskFlatVer2BackingInfo) GetDiskMode() string {
|
||||
return s.info.DiskMode
|
||||
}
|
||||
|
||||
func (s *sVirtualDiskFlatVer2BackingInfo) GetWriteThrough() bool {
|
||||
if s.info.WriteThrough != nil && *s.info.WriteThrough == true {
|
||||
return true
|
||||
} else {
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
func (s *sVirtualDiskFlatVer2BackingInfo) GetFileName() string {
|
||||
return s.info.FileName
|
||||
}
|
||||
|
||||
func (s *sVirtualDiskFlatVer2BackingInfo) GetDatastore() *types.ManagedObjectReference {
|
||||
return s.info.Datastore
|
||||
}
|
||||
|
||||
type sVirtualDiskSparseVer2BackingInfo struct {
|
||||
info *types.VirtualDiskSparseVer2BackingInfo
|
||||
}
|
||||
|
||||
func (s *sVirtualDiskSparseVer2BackingInfo) GetParent() IDiskBackingInfo {
|
||||
if s.info.Parent != nil {
|
||||
return &sVirtualDiskSparseVer2BackingInfo{
|
||||
info: s.info.Parent,
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (s *sVirtualDiskSparseVer2BackingInfo) GetUuid() string {
|
||||
return s.info.Uuid
|
||||
}
|
||||
|
||||
func (s *sVirtualDiskSparseVer2BackingInfo) GetDiskMode() string {
|
||||
return s.info.DiskMode
|
||||
}
|
||||
|
||||
func (s *sVirtualDiskSparseVer2BackingInfo) GetWriteThrough() bool {
|
||||
if s.info.WriteThrough != nil && *s.info.WriteThrough == true {
|
||||
return true
|
||||
} else {
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
func (s *sVirtualDiskSparseVer2BackingInfo) GetFileName() string {
|
||||
return s.info.FileName
|
||||
}
|
||||
|
||||
func (s *sVirtualDiskSparseVer2BackingInfo) GetDatastore() *types.ManagedObjectReference {
|
||||
return s.info.Datastore
|
||||
}
|
||||
|
||||
func (disk *SVirtualDisk) getBackingInfo() IDiskBackingInfo {
|
||||
backing := disk.getVirtualDisk().Backing
|
||||
switch backing.(type) {
|
||||
case *types.VirtualDiskFlatVer2BackingInfo:
|
||||
return backing.(*types.VirtualDiskFlatVer2BackingInfo)
|
||||
return &sVirtualDiskFlatVer2BackingInfo{
|
||||
info: backing.(*types.VirtualDiskFlatVer2BackingInfo),
|
||||
}
|
||||
case *types.VirtualDeviceFileBackingInfo:
|
||||
case *types.VirtualDiskFlatVer1BackingInfo:
|
||||
case *types.VirtualDiskLocalPMemBackingInfo:
|
||||
@@ -60,6 +145,9 @@ func (disk *SVirtualDisk) getBackingInfo() *types.VirtualDiskFlatVer2BackingInfo
|
||||
case *types.VirtualDiskSeSparseBackingInfo:
|
||||
case *types.VirtualDiskSparseVer1BackingInfo:
|
||||
case *types.VirtualDiskSparseVer2BackingInfo:
|
||||
return &sVirtualDiskSparseVer2BackingInfo{
|
||||
info: backing.(*types.VirtualDiskSparseVer2BackingInfo),
|
||||
}
|
||||
case *types.VirtualFloppyImageBackingInfo:
|
||||
case *types.VirtualNVDIMMBackingInfo:
|
||||
case *types.VirtualParallelPortFileBackingInfo:
|
||||
@@ -72,12 +160,12 @@ func (disk *SVirtualDisk) getBackingInfo() *types.VirtualDiskFlatVer2BackingInfo
|
||||
|
||||
func (disk *SVirtualDisk) GetId() string {
|
||||
backing := disk.getBackingInfo()
|
||||
return backing.Uuid
|
||||
return backing.GetUuid()
|
||||
}
|
||||
|
||||
func (disk *SVirtualDisk) GetName() string {
|
||||
backing := disk.getBackingInfo()
|
||||
return path.Base(backing.FileName)
|
||||
return path.Base(backing.GetFileName())
|
||||
}
|
||||
|
||||
func (disk *SVirtualDisk) GetGlobalId() string {
|
||||
@@ -115,7 +203,7 @@ func (disk *SVirtualDisk) GetAccessPath() string {
|
||||
return ""
|
||||
}
|
||||
ds := istore.(*SDatastore)
|
||||
return ds.getFullPath(disk.getBackingInfo().FileName)
|
||||
return ds.getFullPath(disk.getBackingInfo().GetFileName())
|
||||
}
|
||||
|
||||
func (disk *SVirtualDisk) GetDiskFormat() string {
|
||||
@@ -123,7 +211,7 @@ func (disk *SVirtualDisk) GetDiskFormat() string {
|
||||
}
|
||||
|
||||
func (disk *SVirtualDisk) GetIStorage() (cloudprovider.ICloudStorage, error) {
|
||||
dsObj := disk.getBackingInfo().Datastore
|
||||
dsObj := disk.getBackingInfo().GetDatastore()
|
||||
dc, err := disk.vm.GetDatacenter()
|
||||
if err != nil {
|
||||
log.Errorf("fail to find datacenter %s", err)
|
||||
@@ -142,15 +230,15 @@ func (disk *SVirtualDisk) GetIsAutoDelete() bool {
|
||||
|
||||
func (disk *SVirtualDisk) GetTemplateId() string {
|
||||
backing := disk.getBackingInfo()
|
||||
if backing.Parent != nil {
|
||||
return path.Base(backing.Parent.FileName)
|
||||
if backing.GetParent() != nil {
|
||||
return path.Base(backing.GetParent().GetFileName())
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
func (disk *SVirtualDisk) GetDiskType() string {
|
||||
backing := disk.getBackingInfo()
|
||||
if backing.Parent != nil {
|
||||
if backing.GetParent() != nil {
|
||||
return api.DISK_TYPE_SYS
|
||||
}
|
||||
return api.DISK_TYPE_DATA
|
||||
@@ -162,7 +250,7 @@ func (disk *SVirtualDisk) GetFsFormat() string {
|
||||
|
||||
func (disk *SVirtualDisk) getDiskMode() string {
|
||||
backing := disk.getBackingInfo()
|
||||
return backing.DiskMode
|
||||
return backing.GetDiskMode()
|
||||
}
|
||||
|
||||
func (disk *SVirtualDisk) GetIsNonPersistent() bool {
|
||||
@@ -185,7 +273,7 @@ func (disk *SVirtualDisk) GetDriver() string {
|
||||
|
||||
func (disk *SVirtualDisk) GetCacheMode() string {
|
||||
backing := disk.getBackingInfo()
|
||||
if backing.WriteThrough != nil && *backing.WriteThrough {
|
||||
if backing.GetWriteThrough() {
|
||||
return "writethrough"
|
||||
} else {
|
||||
return "none"
|
||||
@@ -203,7 +291,7 @@ func (disk *SVirtualDisk) Delete(ctx context.Context) error {
|
||||
return err
|
||||
}
|
||||
ds := istorage.(*SDatastore)
|
||||
return ds.DeleteVmdk(ctx, disk.getBackingInfo().FileName)
|
||||
return ds.DeleteVmdk(ctx, disk.getBackingInfo().GetFileName())
|
||||
}
|
||||
|
||||
func (disk *SVirtualDisk) CreateISnapshot(ctx context.Context, name string, desc string) (cloudprovider.ICloudSnapshot, error) {
|
||||
|
||||
@@ -27,11 +27,11 @@ import (
|
||||
|
||||
"yunion.io/x/jsonutils"
|
||||
"yunion.io/x/log"
|
||||
"yunion.io/x/pkg/errors"
|
||||
"yunion.io/x/pkg/util/netutils"
|
||||
"yunion.io/x/pkg/util/reflectutils"
|
||||
"yunion.io/x/pkg/util/regutils"
|
||||
|
||||
"github.com/pkg/errors"
|
||||
billing_api "yunion.io/x/onecloud/pkg/apis/billing"
|
||||
api "yunion.io/x/onecloud/pkg/apis/compute"
|
||||
"yunion.io/x/onecloud/pkg/cloudcommon/db/lockman"
|
||||
@@ -815,6 +815,9 @@ func (self *SVirtualMachine) GetError() error {
|
||||
func (self *SVirtualMachine) getResourcePool() (*SResourcePool, error) {
|
||||
vm := self.getVirtualMachine()
|
||||
morp := mo.ResourcePool{}
|
||||
if vm.ResourcePool == nil {
|
||||
return nil, errors.Error("nil resource pool")
|
||||
}
|
||||
err := self.manager.reference2Object(*vm.ResourcePool, RESOURCEPOOL_PROPS, &morp)
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(err, "self.manager.reference2Object")
|
||||
|
||||
Reference in New Issue
Block a user