fix: 1. nil pointer panic error when accessing resource pool and

storagecache 2. support multiple disk format
This commit is contained in:
Qiu Jian
2019-09-07 17:19:24 +08:00
parent f556f92820
commit 60e89bd3fb
4 changed files with 116 additions and 15 deletions
+4
View File
@@ -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)
+8 -2
View File
@@ -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
View File
@@ -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) {
+4 -1
View File
@@ -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")