From cfd7c5bd90df2260680e772566531cef08422220 Mon Sep 17 00:00:00 2001 From: Qu Xuan Date: Tue, 17 Nov 2020 21:16:35 +0800 Subject: [PATCH] fix(region): add instance capability info(default account) --- pkg/apis/compute/guest_const.go | 4 +++- pkg/cloudprovider/instance.go | 32 ++++++++++++++++++++++++++ pkg/compute/guestdrivers/aliyun.go | 17 ++++++++++++++ pkg/compute/guestdrivers/aws.go | 17 ++++++++++++++ pkg/compute/guestdrivers/azure.go | 17 ++++++++++++++ pkg/compute/guestdrivers/baremetals.go | 8 +++++++ pkg/compute/guestdrivers/container.go | 8 +++++++ pkg/compute/guestdrivers/ctyun.go | 17 ++++++++++++++ pkg/compute/guestdrivers/esxi.go | 17 ++++++++++++++ pkg/compute/guestdrivers/google.go | 15 ++++++++++++ pkg/compute/guestdrivers/huawei.go | 15 ++++++++++++ pkg/compute/guestdrivers/kvm.go | 17 ++++++++++++++ pkg/compute/guestdrivers/openstack.go | 17 ++++++++++++++ pkg/compute/guestdrivers/qcloud.go | 24 +++++++++++++++++++ pkg/compute/guestdrivers/ucloud.go | 15 ++++++++++++ pkg/compute/guestdrivers/zstack.go | 15 ++++++++++++ pkg/compute/models/capabilities.go | 9 ++++++++ pkg/compute/models/guestdrivers.go | 1 + 18 files changed, 264 insertions(+), 1 deletion(-) diff --git a/pkg/apis/compute/guest_const.go b/pkg/apis/compute/guest_const.go index b41e403164..717eb1a6c1 100644 --- a/pkg/apis/compute/guest_const.go +++ b/pkg/apis/compute/guest_const.go @@ -254,9 +254,11 @@ var HOSTTYPE_HYPERVISOR = map[string]string{ } const ( + VM_DEFAULT_WINDOWS_LOGIN_USER = "Administrator" + VM_DEFAULT_LINUX_LOGIN_USER = "root" VM_AWS_DEFAULT_LOGIN_USER = "ec2user" VM_AWS_DEFAULT_WINDOWS_LOGIN_USER = "Administrator" - VM_AZURE_DEFAULT_LOGIN_USER = "toor" + VM_AZURE_DEFAULT_LOGIN_USER = "azureuser" VM_ZSTACK_DEFAULT_LOGIN_USER = "root" VM_METADATA_APP_TAGS = "app_tags" diff --git a/pkg/cloudprovider/instance.go b/pkg/cloudprovider/instance.go index 862ba6264f..db9acadb97 100644 --- a/pkg/cloudprovider/instance.go +++ b/pkg/cloudprovider/instance.go @@ -26,6 +26,38 @@ import ( "yunion.io/x/onecloud/pkg/util/seclib2" ) +type SDistDefaultAccount struct { + // 操作系统发行版 + OsDistribution string + // 默认用户名 + DefaultAccount string + // 是否可更改 + Changeable bool +} + +type SOsDefaultAccount struct { + // 默认用户名 + DefaultAccount string + // 是否可更改用户名 + Changeable bool + // 禁止使用的账号 + DisabledAccounts []string + // 各操作系统发行版的默认用户名信息 + DistAccounts []SDistDefaultAccount +} + +type SDefaultAccount struct { + Linux SOsDefaultAccount + Windows SOsDefaultAccount +} + +type SInstanceCapability struct { + Provider string + Hypervisor string + + DefaultAccount SDefaultAccount +} + type SDiskInfo struct { StorageExternalId string StorageType string diff --git a/pkg/compute/guestdrivers/aliyun.go b/pkg/compute/guestdrivers/aliyun.go index bae7781d65..7362adb5db 100644 --- a/pkg/compute/guestdrivers/aliyun.go +++ b/pkg/compute/guestdrivers/aliyun.go @@ -164,6 +164,23 @@ func (self *SAliyunGuestDriver) GetGuestInitialStateAfterRebuild() string { return api.VM_READY } +func (self *SAliyunGuestDriver) GetInstanceCapability() cloudprovider.SInstanceCapability { + return cloudprovider.SInstanceCapability{ + Hypervisor: self.GetHypervisor(), + Provider: self.GetProvider(), + DefaultAccount: cloudprovider.SDefaultAccount{ + Linux: cloudprovider.SOsDefaultAccount{ + DefaultAccount: api.VM_DEFAULT_LINUX_LOGIN_USER, + Changeable: false, + }, + Windows: cloudprovider.SOsDefaultAccount{ + DefaultAccount: api.VM_DEFAULT_WINDOWS_LOGIN_USER, + Changeable: false, + }, + }, + } +} + func (self *SAliyunGuestDriver) GetLinuxDefaultAccount(desc cloudprovider.SManagedVMCreateConfig) string { userName := "root" if desc.OsType == "Windows" { diff --git a/pkg/compute/guestdrivers/aws.go b/pkg/compute/guestdrivers/aws.go index 25775c6346..707a3d96a3 100644 --- a/pkg/compute/guestdrivers/aws.go +++ b/pkg/compute/guestdrivers/aws.go @@ -86,6 +86,23 @@ func (self *SAwsGuestDriver) GetWindowsUserDataType() string { return cloudprovider.CLOUD_EC2 } +func (self *SAwsGuestDriver) GetInstanceCapability() cloudprovider.SInstanceCapability { + return cloudprovider.SInstanceCapability{ + Hypervisor: self.GetHypervisor(), + Provider: self.GetProvider(), + DefaultAccount: cloudprovider.SDefaultAccount{ + Linux: cloudprovider.SOsDefaultAccount{ + DefaultAccount: api.VM_DEFAULT_LINUX_LOGIN_USER, + Changeable: false, + }, + Windows: cloudprovider.SOsDefaultAccount{ + DefaultAccount: api.VM_DEFAULT_WINDOWS_LOGIN_USER, + Changeable: false, + }, + }, + } +} + func (self *SAwsGuestDriver) GetLinuxDefaultAccount(desc cloudprovider.SManagedVMCreateConfig) string { // return fetchAwsUserName(desc) if desc.OsType == "Windows" { diff --git a/pkg/compute/guestdrivers/azure.go b/pkg/compute/guestdrivers/azure.go index deda893f41..d7871ec696 100644 --- a/pkg/compute/guestdrivers/azure.go +++ b/pkg/compute/guestdrivers/azure.go @@ -222,6 +222,23 @@ func (self *SAzureGuestDriver) GetGuestInitialStateAfterRebuild() string { return api.VM_READY } +func (self *SAzureGuestDriver) GetInstanceCapability() cloudprovider.SInstanceCapability { + return cloudprovider.SInstanceCapability{ + Hypervisor: self.GetHypervisor(), + Provider: self.GetProvider(), + DefaultAccount: cloudprovider.SDefaultAccount{ + Linux: cloudprovider.SOsDefaultAccount{ + DefaultAccount: api.VM_AZURE_DEFAULT_LOGIN_USER, + Changeable: false, + }, + Windows: cloudprovider.SOsDefaultAccount{ + DefaultAccount: api.VM_DEFAULT_WINDOWS_LOGIN_USER, + Changeable: false, + }, + }, + } +} + func (self *SAzureGuestDriver) GetLinuxDefaultAccount(desc cloudprovider.SManagedVMCreateConfig) string { return api.VM_AZURE_DEFAULT_LOGIN_USER } diff --git a/pkg/compute/guestdrivers/baremetals.go b/pkg/compute/guestdrivers/baremetals.go index d1c2d4fb9f..543865e4bb 100644 --- a/pkg/compute/guestdrivers/baremetals.go +++ b/pkg/compute/guestdrivers/baremetals.go @@ -30,6 +30,7 @@ import ( "yunion.io/x/onecloud/pkg/cloudcommon/db" "yunion.io/x/onecloud/pkg/cloudcommon/db/quotas" "yunion.io/x/onecloud/pkg/cloudcommon/db/taskman" + "yunion.io/x/onecloud/pkg/cloudprovider" "yunion.io/x/onecloud/pkg/compute/baremetal" "yunion.io/x/onecloud/pkg/compute/models" "yunion.io/x/onecloud/pkg/compute/options" @@ -56,6 +57,13 @@ func (self *SBaremetalGuestDriver) GetProvider() string { return api.CLOUD_PROVIDER_ONECLOUD } +func (self *SBaremetalGuestDriver) GetInstanceCapability() cloudprovider.SInstanceCapability { + return cloudprovider.SInstanceCapability{ + Hypervisor: self.GetHypervisor(), + Provider: self.GetProvider(), + } +} + func (self *SBaremetalGuestDriver) GetComputeQuotaKeys(scope rbacutils.TRbacScope, ownerId mcclient.IIdentityProvider, brand string) models.SComputeResourceKeys { keys := models.SComputeResourceKeys{} keys.SBaseProjectQuotaKeys = quotas.OwnerIdProjectQuotaKeys(scope, ownerId) diff --git a/pkg/compute/guestdrivers/container.go b/pkg/compute/guestdrivers/container.go index 11f82d4e86..f0fbe99154 100644 --- a/pkg/compute/guestdrivers/container.go +++ b/pkg/compute/guestdrivers/container.go @@ -24,6 +24,7 @@ import ( api "yunion.io/x/onecloud/pkg/apis/compute" "yunion.io/x/onecloud/pkg/cloudcommon/db/quotas" "yunion.io/x/onecloud/pkg/cloudcommon/db/taskman" + "yunion.io/x/onecloud/pkg/cloudprovider" "yunion.io/x/onecloud/pkg/compute/models" "yunion.io/x/onecloud/pkg/compute/options" "yunion.io/x/onecloud/pkg/httperrors" @@ -57,6 +58,13 @@ func (self *SContainerDriver) GetProvider() string { return api.CLOUD_PROVIDER_ONECLOUD } +func (self *SContainerDriver) GetInstanceCapability() cloudprovider.SInstanceCapability { + return cloudprovider.SInstanceCapability{ + Hypervisor: self.GetHypervisor(), + Provider: self.GetProvider(), + } +} + // for backward compatibility, deprecated driver func (self *SContainerDriver) GetComputeQuotaKeys(scope rbacutils.TRbacScope, ownerId mcclient.IIdentityProvider, brand string) models.SComputeResourceKeys { keys := models.SComputeResourceKeys{} diff --git a/pkg/compute/guestdrivers/ctyun.go b/pkg/compute/guestdrivers/ctyun.go index e7f3a7adaa..eb38088a55 100644 --- a/pkg/compute/guestdrivers/ctyun.go +++ b/pkg/compute/guestdrivers/ctyun.go @@ -39,6 +39,23 @@ func (self *SCtyunGuestDriver) GetProvider() string { return api.CLOUD_PROVIDER_CTYUN } +func (self *SCtyunGuestDriver) GetInstanceCapability() cloudprovider.SInstanceCapability { + return cloudprovider.SInstanceCapability{ + Hypervisor: self.GetHypervisor(), + Provider: self.GetProvider(), + DefaultAccount: cloudprovider.SDefaultAccount{ + Linux: cloudprovider.SOsDefaultAccount{ + DefaultAccount: api.VM_DEFAULT_LINUX_LOGIN_USER, + Changeable: false, + }, + Windows: cloudprovider.SOsDefaultAccount{ + DefaultAccount: api.VM_DEFAULT_WINDOWS_LOGIN_USER, + Changeable: false, + }, + }, + } +} + func (self *SCtyunGuestDriver) GetComputeQuotaKeys(scope rbacutils.TRbacScope, ownerId mcclient.IIdentityProvider, brand string) models.SComputeResourceKeys { keys := models.SComputeResourceKeys{} keys.SBaseProjectQuotaKeys = quotas.OwnerIdProjectQuotaKeys(scope, ownerId) diff --git a/pkg/compute/guestdrivers/esxi.go b/pkg/compute/guestdrivers/esxi.go index 872710232d..d12bc37b9b 100644 --- a/pkg/compute/guestdrivers/esxi.go +++ b/pkg/compute/guestdrivers/esxi.go @@ -66,6 +66,23 @@ func (self *SESXiGuestDriver) GetProvider() string { return api.CLOUD_PROVIDER_VMWARE } +func (self *SESXiGuestDriver) GetInstanceCapability() cloudprovider.SInstanceCapability { + return cloudprovider.SInstanceCapability{ + Hypervisor: self.GetHypervisor(), + Provider: self.GetProvider(), + DefaultAccount: cloudprovider.SDefaultAccount{ + Linux: cloudprovider.SOsDefaultAccount{ + DefaultAccount: api.VM_DEFAULT_LINUX_LOGIN_USER, + Changeable: true, + }, + Windows: cloudprovider.SOsDefaultAccount{ + DefaultAccount: api.VM_DEFAULT_WINDOWS_LOGIN_USER, + Changeable: false, + }, + }, + } +} + func (self *SESXiGuestDriver) GetComputeQuotaKeys(scope rbacutils.TRbacScope, ownerId mcclient.IIdentityProvider, brand string) models.SComputeResourceKeys { keys := models.SComputeResourceKeys{} keys.SBaseProjectQuotaKeys = quotas.OwnerIdProjectQuotaKeys(scope, ownerId) diff --git a/pkg/compute/guestdrivers/google.go b/pkg/compute/guestdrivers/google.go index 7bbc8500de..f7806325ee 100644 --- a/pkg/compute/guestdrivers/google.go +++ b/pkg/compute/guestdrivers/google.go @@ -65,6 +65,21 @@ func (self *SGoogleGuestDriver) GetProvider() string { return api.CLOUD_PROVIDER_GOOGLE } +func (self *SGoogleGuestDriver) GetInstanceCapability() cloudprovider.SInstanceCapability { + return cloudprovider.SInstanceCapability{ + Hypervisor: self.GetHypervisor(), + Provider: self.GetProvider(), + DefaultAccount: cloudprovider.SDefaultAccount{ + Linux: cloudprovider.SOsDefaultAccount{ + DefaultAccount: api.VM_DEFAULT_LINUX_LOGIN_USER, + }, + Windows: cloudprovider.SOsDefaultAccount{ + DefaultAccount: api.VM_DEFAULT_WINDOWS_LOGIN_USER, + }, + }, + } +} + func (self *SGoogleGuestDriver) GetDefaultSysDiskBackend() string { return api.STORAGE_GOOGLE_PD_STANDARD } diff --git a/pkg/compute/guestdrivers/huawei.go b/pkg/compute/guestdrivers/huawei.go index 1cc1ef8f55..fd2f53d349 100644 --- a/pkg/compute/guestdrivers/huawei.go +++ b/pkg/compute/guestdrivers/huawei.go @@ -110,6 +110,21 @@ func (self *SHuaweiGuestDriver) GetGuestInitialStateAfterRebuild() string { return api.VM_RUNNING } +func (self *SHuaweiGuestDriver) GetInstanceCapability() cloudprovider.SInstanceCapability { + return cloudprovider.SInstanceCapability{ + Hypervisor: self.GetHypervisor(), + Provider: self.GetProvider(), + DefaultAccount: cloudprovider.SDefaultAccount{ + Linux: cloudprovider.SOsDefaultAccount{ + DefaultAccount: api.VM_DEFAULT_LINUX_LOGIN_USER, + }, + Windows: cloudprovider.SOsDefaultAccount{ + DefaultAccount: api.VM_DEFAULT_WINDOWS_LOGIN_USER, + }, + }, + } +} + func (self *SHuaweiGuestDriver) GetLinuxDefaultAccount(desc cloudprovider.SManagedVMCreateConfig) string { userName := "root" if desc.OsType == "Windows" { diff --git a/pkg/compute/guestdrivers/kvm.go b/pkg/compute/guestdrivers/kvm.go index aeb38f9aa2..d1800af552 100644 --- a/pkg/compute/guestdrivers/kvm.go +++ b/pkg/compute/guestdrivers/kvm.go @@ -32,6 +32,7 @@ import ( "yunion.io/x/onecloud/pkg/cloudcommon/db/lockman" "yunion.io/x/onecloud/pkg/cloudcommon/db/quotas" "yunion.io/x/onecloud/pkg/cloudcommon/db/taskman" + "yunion.io/x/onecloud/pkg/cloudprovider" "yunion.io/x/onecloud/pkg/compute/models" "yunion.io/x/onecloud/pkg/compute/options" "yunion.io/x/onecloud/pkg/httperrors" @@ -68,6 +69,22 @@ func (self *SKVMGuestDriver) GetComputeQuotaKeys(scope rbacutils.TRbacScope, own return keys } +func (self *SKVMGuestDriver) GetInstanceCapability() cloudprovider.SInstanceCapability { + return cloudprovider.SInstanceCapability{ + Hypervisor: self.GetHypervisor(), + Provider: self.GetProvider(), + DefaultAccount: cloudprovider.SDefaultAccount{ + Linux: cloudprovider.SOsDefaultAccount{ + DefaultAccount: api.VM_DEFAULT_LINUX_LOGIN_USER, + Changeable: true, + }, + Windows: cloudprovider.SOsDefaultAccount{ + DefaultAccount: api.VM_DEFAULT_WINDOWS_LOGIN_USER, + }, + }, + } +} + func (self *SKVMGuestDriver) GetDefaultSysDiskBackend() string { return api.STORAGE_LOCAL } diff --git a/pkg/compute/guestdrivers/openstack.go b/pkg/compute/guestdrivers/openstack.go index 208fa4bf2f..ea7740289a 100644 --- a/pkg/compute/guestdrivers/openstack.go +++ b/pkg/compute/guestdrivers/openstack.go @@ -64,6 +64,23 @@ func (self *SOpenStackGuestDriver) GetProvider() string { return api.CLOUD_PROVIDER_OPENSTACK } +func (self *SOpenStackGuestDriver) GetInstanceCapability() cloudprovider.SInstanceCapability { + return cloudprovider.SInstanceCapability{ + Hypervisor: self.GetHypervisor(), + Provider: self.GetProvider(), + DefaultAccount: cloudprovider.SDefaultAccount{ + Linux: cloudprovider.SOsDefaultAccount{ + DefaultAccount: api.VM_DEFAULT_LINUX_LOGIN_USER, + Changeable: false, + }, + Windows: cloudprovider.SOsDefaultAccount{ + DefaultAccount: api.VM_DEFAULT_WINDOWS_LOGIN_USER, + Changeable: false, + }, + }, + } +} + func (self *SOpenStackGuestDriver) GetComputeQuotaKeys(scope rbacutils.TRbacScope, ownerId mcclient.IIdentityProvider, brand string) models.SComputeResourceKeys { keys := models.SComputeResourceKeys{} keys.SBaseProjectQuotaKeys = quotas.OwnerIdProjectQuotaKeys(scope, ownerId) diff --git a/pkg/compute/guestdrivers/qcloud.go b/pkg/compute/guestdrivers/qcloud.go index 45f6ff8168..9eebc6d9a2 100644 --- a/pkg/compute/guestdrivers/qcloud.go +++ b/pkg/compute/guestdrivers/qcloud.go @@ -243,6 +243,30 @@ func (self *SQcloudGuestDriver) GetUserDataType() string { return cloudprovider.CLOUD_SHELL } +func (self *SQcloudGuestDriver) GetInstanceCapability() cloudprovider.SInstanceCapability { + return cloudprovider.SInstanceCapability{ + Hypervisor: self.GetHypervisor(), + Provider: self.GetProvider(), + DefaultAccount: cloudprovider.SDefaultAccount{ + Linux: cloudprovider.SOsDefaultAccount{ + DefaultAccount: api.VM_DEFAULT_LINUX_LOGIN_USER, + Changeable: false, + DistAccounts: []cloudprovider.SDistDefaultAccount{ + { + OsDistribution: "Ubuntu", + DefaultAccount: "ubuntu", + Changeable: false, + }, + }, + }, + Windows: cloudprovider.SOsDefaultAccount{ + DefaultAccount: api.VM_DEFAULT_WINDOWS_LOGIN_USER, + Changeable: false, + }, + }, + } +} + func (self *SQcloudGuestDriver) GetLinuxDefaultAccount(desc cloudprovider.SManagedVMCreateConfig) string { userName := "root" if desc.ImageType == "system" { diff --git a/pkg/compute/guestdrivers/ucloud.go b/pkg/compute/guestdrivers/ucloud.go index 4286b5d556..37bae09faa 100644 --- a/pkg/compute/guestdrivers/ucloud.go +++ b/pkg/compute/guestdrivers/ucloud.go @@ -96,6 +96,21 @@ func (self *SUCloudGuestDriver) ValidateResizeDisk(guest *models.SGuest, disk *m return nil } +func (self *SUCloudGuestDriver) GetInstanceCapability() cloudprovider.SInstanceCapability { + return cloudprovider.SInstanceCapability{ + Hypervisor: self.GetHypervisor(), + Provider: self.GetProvider(), + DefaultAccount: cloudprovider.SDefaultAccount{ + Linux: cloudprovider.SOsDefaultAccount{ + DefaultAccount: api.VM_DEFAULT_LINUX_LOGIN_USER, + }, + Windows: cloudprovider.SOsDefaultAccount{ + DefaultAccount: api.VM_DEFAULT_WINDOWS_LOGIN_USER, + }, + }, + } +} + func (self *SUCloudGuestDriver) GetLinuxDefaultAccount(desc cloudprovider.SManagedVMCreateConfig) string { if desc.OsType == "Windows" { return "Administrator" diff --git a/pkg/compute/guestdrivers/zstack.go b/pkg/compute/guestdrivers/zstack.go index 1e3a3b3b11..80237a04b3 100644 --- a/pkg/compute/guestdrivers/zstack.go +++ b/pkg/compute/guestdrivers/zstack.go @@ -158,6 +158,21 @@ func (self *SZStackGuestDriver) IsWindowsUserDataTypeNeedEncode() bool { return true } +func (self *SZStackGuestDriver) GetInstanceCapability() cloudprovider.SInstanceCapability { + return cloudprovider.SInstanceCapability{ + Hypervisor: self.GetHypervisor(), + Provider: self.GetProvider(), + DefaultAccount: cloudprovider.SDefaultAccount{ + Linux: cloudprovider.SOsDefaultAccount{ + DefaultAccount: api.VM_DEFAULT_LINUX_LOGIN_USER, + }, + Windows: cloudprovider.SOsDefaultAccount{ + DefaultAccount: api.VM_DEFAULT_WINDOWS_LOGIN_USER, + }, + }, + } +} + func (self *SZStackGuestDriver) GetLinuxDefaultAccount(desc cloudprovider.SManagedVMCreateConfig) string { userName := "root" if desc.OsType == "Windows" { diff --git a/pkg/compute/models/capabilities.go b/pkg/compute/models/capabilities.go index 66d1fb2750..076a58b8f4 100644 --- a/pkg/compute/models/capabilities.go +++ b/pkg/compute/models/capabilities.go @@ -77,6 +77,8 @@ type SCapabilities struct { StorageTypes3 map[string]map[string]*SimpleStorageInfo `json:",allowempty"` DataStorageTypes2 map[string][]string `json:",allowempty"` DataStorageTypes3 map[string]map[string]*SimpleStorageInfo `json:",allowempty"` + + InstanceCapabilities []cloudprovider.SInstanceCapability } func GetCapabilities(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, region *SCloudregion, zone *SZone) (SCapabilities, error) { @@ -109,6 +111,13 @@ func GetCapabilities(ctx context.Context, userCred mcclient.TokenCredential, que domainId = "" } capa.Hypervisors = getHypervisors(region, zone, domainId) + capa.InstanceCapabilities = []cloudprovider.SInstanceCapability{} + for _, hypervisor := range capa.Hypervisors { + driver := GetDriver(hypervisor) + if driver != nil { + capa.InstanceCapabilities = append(capa.InstanceCapabilities, driver.GetInstanceCapability()) + } + } getBrands(region, zone, domainId, &capa) // capa.Brands, capa.ComputeEngineBrands, capa.NetworkManageBrands, capa.ObjectStorageBrands = a, c, n, o capa.ResourceTypes = getResourceTypes(region, zone, domainId) diff --git a/pkg/compute/models/guestdrivers.go b/pkg/compute/models/guestdrivers.go index 04fdcc1182..ac56872473 100644 --- a/pkg/compute/models/guestdrivers.go +++ b/pkg/compute/models/guestdrivers.go @@ -96,6 +96,7 @@ type IGuestDriver interface { GetGuestInitialStateAfterCreate() string GetGuestInitialStateAfterRebuild() string GetLinuxDefaultAccount(desc cloudprovider.SManagedVMCreateConfig) string + GetInstanceCapability() cloudprovider.SInstanceCapability OnGuestDeployTaskDataReceived(ctx context.Context, guest *SGuest, task taskman.ITask, data jsonutils.JSONObject) error