mirror of
https://github.com/apache/cloudstack.git
synced 2025-10-26 08:42:29 +01:00
Merge branch '4.18'
This commit is contained in:
commit
ea832bce13
@ -35,6 +35,10 @@ public interface AutoScaleVmProfile extends ControlledEntity, InternalIdentity,
|
|||||||
|
|
||||||
String getUserData();
|
String getUserData();
|
||||||
|
|
||||||
|
Long getUserDataId();
|
||||||
|
|
||||||
|
String getUserDataDetails();
|
||||||
|
|
||||||
public String getUuid();
|
public String getUuid();
|
||||||
|
|
||||||
public Long getZoneId();
|
public Long getZoneId();
|
||||||
|
|||||||
@ -21,8 +21,10 @@ import java.lang.reflect.Field;
|
|||||||
import java.text.DateFormat;
|
import java.text.DateFormat;
|
||||||
import java.text.SimpleDateFormat;
|
import java.text.SimpleDateFormat;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collection;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
|
import java.util.Iterator;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.regex.Pattern;
|
import java.util.regex.Pattern;
|
||||||
@ -42,6 +44,7 @@ import org.apache.cloudstack.network.lb.InternalLoadBalancerVMService;
|
|||||||
import org.apache.cloudstack.query.QueryService;
|
import org.apache.cloudstack.query.QueryService;
|
||||||
import org.apache.cloudstack.storage.ImageStoreService;
|
import org.apache.cloudstack.storage.ImageStoreService;
|
||||||
import org.apache.cloudstack.usage.UsageService;
|
import org.apache.cloudstack.usage.UsageService;
|
||||||
|
import org.apache.commons.collections.MapUtils;
|
||||||
import org.apache.log4j.Logger;
|
import org.apache.log4j.Logger;
|
||||||
|
|
||||||
import com.cloud.configuration.ConfigurationService;
|
import com.cloud.configuration.ConfigurationService;
|
||||||
@ -456,4 +459,18 @@ public abstract class BaseCmd {
|
|||||||
return ApiCommandResourceType.None;
|
return ApiCommandResourceType.None;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Map<String, String> convertDetailsToMap(Map details) {
|
||||||
|
Map<String, String> detailsMap = new HashMap<String, String>();
|
||||||
|
if (MapUtils.isNotEmpty(details)) {
|
||||||
|
Collection parameterCollection = details.values();
|
||||||
|
Iterator iter = parameterCollection.iterator();
|
||||||
|
while (iter.hasNext()) {
|
||||||
|
HashMap<String, String> value = (HashMap<String, String>)iter.next();
|
||||||
|
for (Map.Entry<String,String> entry: value.entrySet()) {
|
||||||
|
detailsMap.put(entry.getKey(),entry.getValue());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return detailsMap;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -51,7 +51,7 @@ public class StopInternalLBVMCmd extends BaseAsyncCmd {
|
|||||||
@Parameter(name = ApiConstants.ID, type = CommandType.UUID, entityType = DomainRouterResponse.class, required = true, description = "the ID of the internal lb vm")
|
@Parameter(name = ApiConstants.ID, type = CommandType.UUID, entityType = DomainRouterResponse.class, required = true, description = "the ID of the internal lb vm")
|
||||||
private Long id;
|
private Long id;
|
||||||
|
|
||||||
@Parameter(name = ApiConstants.FORCED, type = CommandType.BOOLEAN, required = false, description = "Force stop the VM. The caller knows the VM is stopped.")
|
@Parameter(name = ApiConstants.FORCED, type = CommandType.BOOLEAN, required = false, description = "Force stop the VM (vm is marked as Stopped even when command fails to be send to the backend, otherwise a force poweroff is attempted). To be used if the caller knows the VM is stopped and should be marked as such.")
|
||||||
private Boolean forced;
|
private Boolean forced;
|
||||||
|
|
||||||
// ///////////////////////////////////////////////////
|
// ///////////////////////////////////////////////////
|
||||||
|
|||||||
@ -49,7 +49,7 @@ public class StopRouterCmd extends BaseAsyncCmd {
|
|||||||
@Parameter(name = ApiConstants.ID, type = CommandType.UUID, entityType = DomainRouterResponse.class, required = true, description = "the ID of the router")
|
@Parameter(name = ApiConstants.ID, type = CommandType.UUID, entityType = DomainRouterResponse.class, required = true, description = "the ID of the router")
|
||||||
private Long id;
|
private Long id;
|
||||||
|
|
||||||
@Parameter(name = ApiConstants.FORCED, type = CommandType.BOOLEAN, required = false, description = "Force stop the VM. The caller knows the VM is stopped.")
|
@Parameter(name = ApiConstants.FORCED, type = CommandType.BOOLEAN, required = false, description = "Force stop the VM (vm is marked as Stopped even when command fails to be send to the backend, otherwise a force poweroff is attempted). To be used if the caller knows the VM is stopped and should be marked as such.")
|
||||||
private Boolean forced;
|
private Boolean forced;
|
||||||
|
|
||||||
// ///////////////////////////////////////////////////
|
// ///////////////////////////////////////////////////
|
||||||
|
|||||||
@ -54,7 +54,7 @@ public class StopSystemVmCmd extends BaseAsyncCmd {
|
|||||||
description = "The ID of the system virtual machine")
|
description = "The ID of the system virtual machine")
|
||||||
private Long id;
|
private Long id;
|
||||||
|
|
||||||
@Parameter(name = ApiConstants.FORCED, type = CommandType.BOOLEAN, required = false, description = "Force stop the VM. The caller knows the VM is stopped.")
|
@Parameter(name = ApiConstants.FORCED, type = CommandType.BOOLEAN, required = false, description = "Force stop the VM (vm is marked as Stopped even when command fails to be send to the backend, otherwise a force poweroff is attempted). To be used if the caller knows the VM is stopped and should be marked as such.")
|
||||||
private Boolean forced;
|
private Boolean forced;
|
||||||
|
|
||||||
/////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////
|
||||||
|
|||||||
@ -35,6 +35,7 @@ import org.apache.cloudstack.api.response.DomainResponse;
|
|||||||
import org.apache.cloudstack.api.response.ProjectResponse;
|
import org.apache.cloudstack.api.response.ProjectResponse;
|
||||||
import org.apache.cloudstack.api.response.ServiceOfferingResponse;
|
import org.apache.cloudstack.api.response.ServiceOfferingResponse;
|
||||||
import org.apache.cloudstack.api.response.TemplateResponse;
|
import org.apache.cloudstack.api.response.TemplateResponse;
|
||||||
|
import org.apache.cloudstack.api.response.UserDataResponse;
|
||||||
import org.apache.cloudstack.api.response.UserResponse;
|
import org.apache.cloudstack.api.response.UserResponse;
|
||||||
import org.apache.cloudstack.api.response.ZoneResponse;
|
import org.apache.cloudstack.api.response.ZoneResponse;
|
||||||
import org.apache.cloudstack.context.CallContext;
|
import org.apache.cloudstack.context.CallContext;
|
||||||
@ -107,6 +108,12 @@ public class CreateAutoScaleVmProfileCmd extends BaseAsyncCreateCmd {
|
|||||||
since = "4.18.0")
|
since = "4.18.0")
|
||||||
private String userData;
|
private String userData;
|
||||||
|
|
||||||
|
@Parameter(name = ApiConstants.USER_DATA_ID, type = CommandType.UUID, entityType = UserDataResponse.class, description = "the ID of the Userdata", since = "4.18.1")
|
||||||
|
private Long userDataId;
|
||||||
|
|
||||||
|
@Parameter(name = ApiConstants.USER_DATA_DETAILS, type = CommandType.MAP, description = "used to specify the parameters values for the variables in userdata.", since = "4.18.1")
|
||||||
|
private Map userDataDetails;
|
||||||
|
|
||||||
@Parameter(name = ApiConstants.AUTOSCALE_USER_ID,
|
@Parameter(name = ApiConstants.AUTOSCALE_USER_ID,
|
||||||
type = CommandType.UUID,
|
type = CommandType.UUID,
|
||||||
entityType = UserResponse.class,
|
entityType = UserResponse.class,
|
||||||
@ -163,6 +170,14 @@ public class CreateAutoScaleVmProfileCmd extends BaseAsyncCreateCmd {
|
|||||||
return userData;
|
return userData;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Long getUserDataId() {
|
||||||
|
return userDataId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Map<String, String> getUserDataDetails() {
|
||||||
|
return convertDetailsToMap(userDataDetails);
|
||||||
|
}
|
||||||
|
|
||||||
public Long getAutoscaleUserId() {
|
public Long getAutoscaleUserId() {
|
||||||
return autoscaleUserId;
|
return autoscaleUserId;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -35,6 +35,7 @@ import org.apache.cloudstack.api.ServerApiException;
|
|||||||
import org.apache.cloudstack.api.response.AutoScaleVmProfileResponse;
|
import org.apache.cloudstack.api.response.AutoScaleVmProfileResponse;
|
||||||
import org.apache.cloudstack.api.response.ServiceOfferingResponse;
|
import org.apache.cloudstack.api.response.ServiceOfferingResponse;
|
||||||
import org.apache.cloudstack.api.response.TemplateResponse;
|
import org.apache.cloudstack.api.response.TemplateResponse;
|
||||||
|
import org.apache.cloudstack.api.response.UserDataResponse;
|
||||||
import org.apache.cloudstack.api.response.UserResponse;
|
import org.apache.cloudstack.api.response.UserResponse;
|
||||||
import org.apache.cloudstack.context.CallContext;
|
import org.apache.cloudstack.context.CallContext;
|
||||||
|
|
||||||
@ -102,6 +103,14 @@ public class UpdateAutoScaleVmProfileCmd extends BaseAsyncCustomIdCmd {
|
|||||||
since = "4.18.0")
|
since = "4.18.0")
|
||||||
private String userData;
|
private String userData;
|
||||||
|
|
||||||
|
@Parameter(name = ApiConstants.USER_DATA_ID, type = CommandType.UUID, entityType = UserDataResponse.class, description = "the ID of the userdata",
|
||||||
|
since = "4.18.1")
|
||||||
|
private Long userDataId;
|
||||||
|
|
||||||
|
@Parameter(name = ApiConstants.USER_DATA_DETAILS, type = CommandType.MAP, description = "used to specify the parameters values for the variables in userdata.",
|
||||||
|
since = "4.18.1")
|
||||||
|
private Map userDataDetails;
|
||||||
|
|
||||||
@Parameter(name = ApiConstants.AUTOSCALE_USER_ID,
|
@Parameter(name = ApiConstants.AUTOSCALE_USER_ID,
|
||||||
type = CommandType.UUID,
|
type = CommandType.UUID,
|
||||||
entityType = UserResponse.class,
|
entityType = UserResponse.class,
|
||||||
@ -156,6 +165,14 @@ public class UpdateAutoScaleVmProfileCmd extends BaseAsyncCustomIdCmd {
|
|||||||
return userData;
|
return userData;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Long getUserDataId() {
|
||||||
|
return userDataId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Map<String, String> getUserDataDetails() {
|
||||||
|
return convertDetailsToMap(userDataDetails);
|
||||||
|
}
|
||||||
|
|
||||||
public Long getAutoscaleUserId() {
|
public Long getAutoscaleUserId() {
|
||||||
return autoscaleUserId;
|
return autoscaleUserId;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -118,7 +118,9 @@ public class CreateNetworkCmd extends BaseCmd implements UserCmd {
|
|||||||
private Long projectId;
|
private Long projectId;
|
||||||
|
|
||||||
@Parameter(name = ApiConstants.DOMAIN_ID, type = CommandType.UUID, entityType = DomainResponse.class, description = "domain ID of the account owning a network. " +
|
@Parameter(name = ApiConstants.DOMAIN_ID, type = CommandType.UUID, entityType = DomainResponse.class, description = "domain ID of the account owning a network. " +
|
||||||
"If no account is provided then network will be assigned to the caller account and domain")
|
"If the account is not specified, but the acltype is Account or not specified, the network will be automatically assigned to the caller account and domain. " +
|
||||||
|
"To create a network under the domain without linking it to any account, make sure to include acltype=Domain parameter in the api call. " +
|
||||||
|
"If account is not specified, but acltype is Domain, the network will be created for the specified domain.")
|
||||||
private Long domainId;
|
private Long domainId;
|
||||||
|
|
||||||
@Parameter(name = ApiConstants.SUBDOMAIN_ACCESS,
|
@Parameter(name = ApiConstants.SUBDOMAIN_ACCESS,
|
||||||
|
|||||||
@ -62,7 +62,7 @@ public class CreateSnapshotCmd extends BaseAsyncCreateCmd {
|
|||||||
@Parameter(name = ApiConstants.DOMAIN_ID,
|
@Parameter(name = ApiConstants.DOMAIN_ID,
|
||||||
type = CommandType.UUID,
|
type = CommandType.UUID,
|
||||||
entityType = DomainResponse.class,
|
entityType = DomainResponse.class,
|
||||||
description = "The domain ID of the snapshot. If used with the account parameter, specifies a domain for the account associated with the disk volume.")
|
description = "The domain ID of the snapshot. If used with the account parameter, specifies a domain for the account associated with the disk volume. If account is NOT provided then snapshot will be assigned to the caller account and domain.")
|
||||||
private Long domainId;
|
private Long domainId;
|
||||||
|
|
||||||
@Parameter(name = ApiConstants.VOLUME_ID, type = CommandType.UUID, entityType = VolumeResponse.class, required = true, description = "The ID of the disk volume")
|
@Parameter(name = ApiConstants.VOLUME_ID, type = CommandType.UUID, entityType = VolumeResponse.class, required = true, description = "The ID of the disk volume")
|
||||||
|
|||||||
@ -109,7 +109,7 @@ public class DeployVMCmd extends BaseAsyncCreateCustomIdCmd implements SecurityG
|
|||||||
@Parameter(name = ApiConstants.ACCOUNT, type = CommandType.STRING, description = "an optional account for the virtual machine. Must be used with domainId.")
|
@Parameter(name = ApiConstants.ACCOUNT, type = CommandType.STRING, description = "an optional account for the virtual machine. Must be used with domainId.")
|
||||||
private String accountName;
|
private String accountName;
|
||||||
|
|
||||||
@Parameter(name = ApiConstants.DOMAIN_ID, type = CommandType.UUID, entityType = DomainResponse.class, description = "an optional domainId for the virtual machine. If the account parameter is used, domainId must also be used.")
|
@Parameter(name = ApiConstants.DOMAIN_ID, type = CommandType.UUID, entityType = DomainResponse.class, description = "an optional domainId for the virtual machine. If the account parameter is used, domainId must also be used. If account is NOT provided then virtual machine will be assigned to the caller account and domain.")
|
||||||
private Long domainId;
|
private Long domainId;
|
||||||
|
|
||||||
//Network information
|
//Network information
|
||||||
@ -317,17 +317,8 @@ public class DeployVMCmd extends BaseAsyncCreateCustomIdCmd implements SecurityG
|
|||||||
}
|
}
|
||||||
|
|
||||||
public Map<String, String> getDetails() {
|
public Map<String, String> getDetails() {
|
||||||
Map<String, String> customparameterMap = new HashMap<String, String>();
|
Map<String, String> customparameterMap = convertDetailsToMap(details);
|
||||||
if (details != null && details.size() != 0) {
|
|
||||||
Collection parameterCollection = details.values();
|
|
||||||
Iterator iter = parameterCollection.iterator();
|
|
||||||
while (iter.hasNext()) {
|
|
||||||
HashMap<String, String> value = (HashMap<String, String>)iter.next();
|
|
||||||
for (Map.Entry<String,String> entry: value.entrySet()) {
|
|
||||||
customparameterMap.put(entry.getKey(),entry.getValue());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (getBootType() != null) {
|
if (getBootType() != null) {
|
||||||
customparameterMap.put(getBootType().toString(), getBootMode().toString());
|
customparameterMap.put(getBootType().toString(), getBootMode().toString());
|
||||||
}
|
}
|
||||||
@ -466,18 +457,7 @@ public class DeployVMCmd extends BaseAsyncCreateCustomIdCmd implements SecurityG
|
|||||||
}
|
}
|
||||||
|
|
||||||
public Map<String, String> getUserdataDetails() {
|
public Map<String, String> getUserdataDetails() {
|
||||||
Map<String, String> userdataDetailsMap = new HashMap<String, String>();
|
return convertDetailsToMap(userdataDetails);
|
||||||
if (userdataDetails != null && userdataDetails.size() != 0) {
|
|
||||||
Collection parameterCollection = userdataDetails.values();
|
|
||||||
Iterator iter = parameterCollection.iterator();
|
|
||||||
while (iter.hasNext()) {
|
|
||||||
HashMap<String, String> value = (HashMap<String, String>)iter.next();
|
|
||||||
for (Map.Entry<String,String> entry: value.entrySet()) {
|
|
||||||
userdataDetailsMap.put(entry.getKey(),entry.getValue());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return userdataDetailsMap;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public Long getZoneId() {
|
public Long getZoneId() {
|
||||||
|
|||||||
@ -39,9 +39,6 @@ import org.apache.cloudstack.api.response.UserVmResponse;
|
|||||||
import org.apache.cloudstack.context.CallContext;
|
import org.apache.cloudstack.context.CallContext;
|
||||||
import org.apache.log4j.Logger;
|
import org.apache.log4j.Logger;
|
||||||
|
|
||||||
import java.util.Collection;
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.Iterator;
|
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
@APICommand(name = "resetUserDataForVirtualMachine", responseObject = UserVmResponse.class, description = "Resets the UserData for virtual machine. " +
|
@APICommand(name = "resetUserDataForVirtualMachine", responseObject = UserVmResponse.class, description = "Resets the UserData for virtual machine. " +
|
||||||
@ -117,18 +114,7 @@ public class ResetVMUserDataCmd extends BaseCmd implements UserCmd {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public Map<String, String> getUserdataDetails() {
|
public Map<String, String> getUserdataDetails() {
|
||||||
Map<String, String> userdataDetailsMap = new HashMap<String, String>();
|
return convertDetailsToMap(userdataDetails);
|
||||||
if (userdataDetails != null && userdataDetails.size() != 0) {
|
|
||||||
Collection parameterCollection = userdataDetails.values();
|
|
||||||
Iterator iter = parameterCollection.iterator();
|
|
||||||
while (iter.hasNext()) {
|
|
||||||
HashMap<String, String> value = (HashMap<String, String>)iter.next();
|
|
||||||
for (Map.Entry<String,String> entry: value.entrySet()) {
|
|
||||||
userdataDetailsMap.put(entry.getKey(),entry.getValue());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return userdataDetailsMap;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@ -16,9 +16,6 @@
|
|||||||
// under the License.
|
// under the License.
|
||||||
package org.apache.cloudstack.api.command.user.vm;
|
package org.apache.cloudstack.api.command.user.vm;
|
||||||
|
|
||||||
import java.util.Collection;
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.Iterator;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
@ -99,17 +96,7 @@ public class ScaleVMCmd extends BaseAsyncCmd implements UserCmd {
|
|||||||
//it is because details.values() cannot be cast to a map.
|
//it is because details.values() cannot be cast to a map.
|
||||||
//it gives a exception
|
//it gives a exception
|
||||||
public Map<String, String> getDetails() {
|
public Map<String, String> getDetails() {
|
||||||
Map<String, String> customparameterMap = new HashMap<String, String>();
|
Map<String, String> customparameterMap = convertDetailsToMap(details);
|
||||||
if (details != null && details.size() != 0) {
|
|
||||||
Collection parameterCollection = details.values();
|
|
||||||
Iterator iter = parameterCollection.iterator();
|
|
||||||
while (iter.hasNext()) {
|
|
||||||
HashMap<String, String> value = (HashMap<String, String>)iter.next();
|
|
||||||
for (String key : value.keySet()) {
|
|
||||||
customparameterMap.put(key, value.get(key));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (shrinkOk != null) customparameterMap.put(ApiConstants.SHRINK_OK, String.valueOf(isShrinkOk()));
|
if (shrinkOk != null) customparameterMap.put(ApiConstants.SHRINK_OK, String.valueOf(isShrinkOk()));
|
||||||
if (autoMigrate != null) customparameterMap.put(ApiConstants.AUTO_MIGRATE, String.valueOf(getAutoMigrate()));
|
if (autoMigrate != null) customparameterMap.put(ApiConstants.AUTO_MIGRATE, String.valueOf(getAutoMigrate()));
|
||||||
|
|||||||
@ -55,7 +55,8 @@ public class StopVMCmd extends BaseAsyncCmd implements UserCmd {
|
|||||||
private Long id;
|
private Long id;
|
||||||
|
|
||||||
@Parameter(name = ApiConstants.FORCED, type = CommandType.BOOLEAN, required = false, description = "Force stop the VM "
|
@Parameter(name = ApiConstants.FORCED, type = CommandType.BOOLEAN, required = false, description = "Force stop the VM "
|
||||||
+ "(vm is marked as Stopped even when command fails to be send to the backend, otherwise a force poweroff is attempted). The caller knows the VM is stopped.")
|
+ "(vm is marked as Stopped even when command fails to be send to the backend, otherwise a force poweroff is attempted)."
|
||||||
|
+ " This option is to be used if the caller knows the VM is stopped and should be marked as such.")
|
||||||
private Boolean forced;
|
private Boolean forced;
|
||||||
|
|
||||||
// ///////////////////////////////////////////////////
|
// ///////////////////////////////////////////////////
|
||||||
|
|||||||
@ -18,7 +18,6 @@ package org.apache.cloudstack.api.command.user.vm;
|
|||||||
|
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Iterator;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
@ -176,18 +175,7 @@ public class UpdateVMCmd extends BaseCustomIdCmd implements SecurityGroupAction,
|
|||||||
}
|
}
|
||||||
|
|
||||||
public Map<String, String> getUserdataDetails() {
|
public Map<String, String> getUserdataDetails() {
|
||||||
Map<String, String> userdataDetailsMap = new HashMap<String, String>();
|
return convertDetailsToMap(userdataDetails);
|
||||||
if (userdataDetails != null && userdataDetails.size() != 0) {
|
|
||||||
Collection parameterCollection = userdataDetails.values();
|
|
||||||
Iterator iter = parameterCollection.iterator();
|
|
||||||
while (iter.hasNext()) {
|
|
||||||
HashMap<String, String> value = (HashMap<String, String>)iter.next();
|
|
||||||
for (Map.Entry<String,String> entry: value.entrySet()) {
|
|
||||||
userdataDetailsMap.put(entry.getKey(),entry.getValue());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return userdataDetailsMap;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public Boolean getDisplayVm() {
|
public Boolean getDisplayVm() {
|
||||||
|
|||||||
@ -16,9 +16,6 @@
|
|||||||
// under the License.
|
// under the License.
|
||||||
package org.apache.cloudstack.api.command.user.vm;
|
package org.apache.cloudstack.api.command.user.vm;
|
||||||
|
|
||||||
import java.util.Collection;
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.Iterator;
|
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
import org.apache.log4j.Logger;
|
import org.apache.log4j.Logger;
|
||||||
@ -95,17 +92,7 @@ public class UpgradeVMCmd extends BaseCmd implements UserCmd {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public Map<String, String> getDetails() {
|
public Map<String, String> getDetails() {
|
||||||
Map<String, String> customparameterMap = new HashMap<String, String>();
|
Map<String, String> customparameterMap = convertDetailsToMap(details);
|
||||||
if (details != null && details.size() != 0) {
|
|
||||||
Collection parameterCollection = details.values();
|
|
||||||
Iterator iter = parameterCollection.iterator();
|
|
||||||
while (iter.hasNext()) {
|
|
||||||
HashMap<String, String> value = (HashMap<String, String>)iter.next();
|
|
||||||
for (String key : value.keySet()) {
|
|
||||||
customparameterMap.put(key, value.get(key));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (shrinkOk != null) customparameterMap.put(ApiConstants.SHRINK_OK, String.valueOf(isShrinkOk()));
|
if (shrinkOk != null) customparameterMap.put(ApiConstants.SHRINK_OK, String.valueOf(isShrinkOk()));
|
||||||
if (autoMigrate != null) customparameterMap.put(ApiConstants.AUTO_MIGRATE, String.valueOf(getAutoMigrate()));
|
if (autoMigrate != null) customparameterMap.put(ApiConstants.AUTO_MIGRATE, String.valueOf(getAutoMigrate()));
|
||||||
|
|||||||
@ -70,7 +70,8 @@ public class CreateVolumeCmd extends BaseAsyncCreateCustomIdCmd implements UserC
|
|||||||
type = CommandType.UUID,
|
type = CommandType.UUID,
|
||||||
entityType = DomainResponse.class,
|
entityType = DomainResponse.class,
|
||||||
description = "the domain ID associated with the disk offering. If used with the account parameter"
|
description = "the domain ID associated with the disk offering. If used with the account parameter"
|
||||||
+ " returns the disk volume associated with the account for the specified domain.")
|
+ " returns the disk volume associated with the account for the specified domain." +
|
||||||
|
"If account is NOT provided then the volume will be assigned to the caller account and domain.")
|
||||||
private Long domainId;
|
private Long domainId;
|
||||||
|
|
||||||
@Parameter(name = ApiConstants.DISK_OFFERING_ID,
|
@Parameter(name = ApiConstants.DISK_OFFERING_ID,
|
||||||
|
|||||||
@ -78,7 +78,7 @@ public class UploadVolumeCmd extends BaseAsyncCmd implements UserCmd {
|
|||||||
@Parameter(name = ApiConstants.DOMAIN_ID,
|
@Parameter(name = ApiConstants.DOMAIN_ID,
|
||||||
type = CommandType.UUID,
|
type = CommandType.UUID,
|
||||||
entityType = DomainResponse.class,
|
entityType = DomainResponse.class,
|
||||||
description = "an optional domainId. If the account parameter is used, domainId must also be used.")
|
description = "an optional domainId. If the account parameter is used, domainId must also be used. If account is NOT provided then volume will be assigned to the caller account and domain.")
|
||||||
private Long domainId;
|
private Long domainId;
|
||||||
|
|
||||||
@Parameter(name = ApiConstants.ACCOUNT, type = CommandType.STRING, description = "an optional accountName. Must be used with domainId.")
|
@Parameter(name = ApiConstants.ACCOUNT, type = CommandType.STRING, description = "an optional accountName. Must be used with domainId.")
|
||||||
|
|||||||
@ -72,6 +72,18 @@ public class AutoScaleVmProfileResponse extends BaseResponse implements Controll
|
|||||||
@Param(description = "Base 64 encoded VM user data")
|
@Param(description = "Base 64 encoded VM user data")
|
||||||
private String userData;
|
private String userData;
|
||||||
|
|
||||||
|
@SerializedName(ApiConstants.USER_DATA_ID) @Param(description="the id of userdata used for the VM", since = "4.18.1")
|
||||||
|
private String userDataId;
|
||||||
|
|
||||||
|
@SerializedName(ApiConstants.USER_DATA_NAME) @Param(description="the name of userdata used for the VM", since = "4.18.1")
|
||||||
|
private String userDataName;
|
||||||
|
|
||||||
|
@SerializedName(ApiConstants.USER_DATA_POLICY) @Param(description="the userdata override policy with the userdata provided while deploying VM", since = "4.18.1")
|
||||||
|
private String userDataPolicy;
|
||||||
|
|
||||||
|
@SerializedName(ApiConstants.USER_DATA_DETAILS) @Param(description="list of variables and values for the variables declared in userdata", since = "4.18.1")
|
||||||
|
private String userDataDetails;
|
||||||
|
|
||||||
@SerializedName(ApiConstants.AUTOSCALE_USER_ID)
|
@SerializedName(ApiConstants.AUTOSCALE_USER_ID)
|
||||||
@Param(description = "the ID of the user used to launch and destroy the VMs")
|
@Param(description = "the ID of the user used to launch and destroy the VMs")
|
||||||
private String autoscaleUserId;
|
private String autoscaleUserId;
|
||||||
@ -153,6 +165,22 @@ public class AutoScaleVmProfileResponse extends BaseResponse implements Controll
|
|||||||
this.userData = userData;
|
this.userData = userData;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setUserDataId(String userDataId) {
|
||||||
|
this.userDataId = userDataId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setUserDataName(String userDataName) {
|
||||||
|
this.userDataName = userDataName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setUserDataPolicy(String userDataPolicy) {
|
||||||
|
this.userDataPolicy = userDataPolicy;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setUserDataDetails(String userDataDetails) {
|
||||||
|
this.userDataDetails = userDataDetails;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setAccountName(String accountName) {
|
public void setAccountName(String accountName) {
|
||||||
this.accountName = accountName;
|
this.accountName = accountName;
|
||||||
@ -193,4 +221,24 @@ public class AutoScaleVmProfileResponse extends BaseResponse implements Controll
|
|||||||
public void setForDisplay(Boolean forDisplay) {
|
public void setForDisplay(Boolean forDisplay) {
|
||||||
this.forDisplay = forDisplay;
|
this.forDisplay = forDisplay;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public String getUserData() {
|
||||||
|
return userData;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getUserDataId() {
|
||||||
|
return userDataId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getUserDataName() {
|
||||||
|
return userDataName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getUserDataPolicy() {
|
||||||
|
return userDataPolicy;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getUserDataDetails() {
|
||||||
|
return userDataDetails;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -103,7 +103,7 @@ public class UserVmResponse extends BaseResponseWithTagInformation implements Co
|
|||||||
private String group;
|
private String group;
|
||||||
|
|
||||||
@SerializedName(ApiConstants.ZONE_ID)
|
@SerializedName(ApiConstants.ZONE_ID)
|
||||||
@Param(description = "the ID of the availablility zone for the virtual machine")
|
@Param(description = "the ID of the availability zone for the virtual machine")
|
||||||
private String zoneId;
|
private String zoneId;
|
||||||
|
|
||||||
@SerializedName(ApiConstants.ZONE_NAME)
|
@SerializedName(ApiConstants.ZONE_NAME)
|
||||||
|
|||||||
@ -123,6 +123,7 @@ import com.cloud.storage.Storage;
|
|||||||
import com.cloud.storage.Storage.ImageFormat;
|
import com.cloud.storage.Storage.ImageFormat;
|
||||||
import com.cloud.storage.StorageManager;
|
import com.cloud.storage.StorageManager;
|
||||||
import com.cloud.storage.StoragePool;
|
import com.cloud.storage.StoragePool;
|
||||||
|
import com.cloud.storage.StoragePoolHostVO;
|
||||||
import com.cloud.storage.StorageUtil;
|
import com.cloud.storage.StorageUtil;
|
||||||
import com.cloud.storage.VMTemplateStorageResourceAssoc;
|
import com.cloud.storage.VMTemplateStorageResourceAssoc;
|
||||||
import com.cloud.storage.Volume;
|
import com.cloud.storage.Volume;
|
||||||
@ -131,6 +132,7 @@ import com.cloud.storage.VolumeApiService;
|
|||||||
import com.cloud.storage.VolumeDetailVO;
|
import com.cloud.storage.VolumeDetailVO;
|
||||||
import com.cloud.storage.VolumeVO;
|
import com.cloud.storage.VolumeVO;
|
||||||
import com.cloud.storage.dao.SnapshotDao;
|
import com.cloud.storage.dao.SnapshotDao;
|
||||||
|
import com.cloud.storage.dao.StoragePoolHostDao;
|
||||||
import com.cloud.storage.dao.VMTemplateDetailsDao;
|
import com.cloud.storage.dao.VMTemplateDetailsDao;
|
||||||
import com.cloud.storage.dao.VolumeDao;
|
import com.cloud.storage.dao.VolumeDao;
|
||||||
import com.cloud.storage.dao.VolumeDetailsDao;
|
import com.cloud.storage.dao.VolumeDetailsDao;
|
||||||
@ -243,6 +245,8 @@ public class VolumeOrchestrator extends ManagerBase implements VolumeOrchestrati
|
|||||||
VolumeApiService _volumeApiService;
|
VolumeApiService _volumeApiService;
|
||||||
@Inject
|
@Inject
|
||||||
PassphraseDao passphraseDao;
|
PassphraseDao passphraseDao;
|
||||||
|
@Inject
|
||||||
|
StoragePoolHostDao storagePoolHostDao;
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
protected SnapshotHelper snapshotHelper;
|
protected SnapshotHelper snapshotHelper;
|
||||||
@ -656,7 +660,8 @@ public class VolumeOrchestrator extends ManagerBase implements VolumeOrchestrati
|
|||||||
}
|
}
|
||||||
|
|
||||||
@DB
|
@DB
|
||||||
public VolumeInfo createVolume(VolumeInfo volumeInfo, VirtualMachine vm, VirtualMachineTemplate template, DataCenter dc, Pod pod, Long clusterId, ServiceOffering offering, DiskOffering diskOffering,
|
public VolumeInfo createVolume(VolumeInfo volumeInfo, VirtualMachine vm, VirtualMachineTemplate template, DataCenter dc, Pod pod, Long clusterId,
|
||||||
|
Long hostId, ServiceOffering offering, DiskOffering diskOffering,
|
||||||
List<StoragePool> avoids, long size, HypervisorType hyperType) {
|
List<StoragePool> avoids, long size, HypervisorType hyperType) {
|
||||||
// update the volume's hv_ss_reserve (hypervisor snapshot reserve) from a disk offering (used for managed storage)
|
// update the volume's hv_ss_reserve (hypervisor snapshot reserve) from a disk offering (used for managed storage)
|
||||||
volumeInfo = volService.updateHypervisorSnapshotReserveForVolume(diskOffering, volumeInfo.getId(), hyperType);
|
volumeInfo = volService.updateHypervisorSnapshotReserveForVolume(diskOffering, volumeInfo.getId(), hyperType);
|
||||||
@ -691,7 +696,7 @@ public class VolumeOrchestrator extends ManagerBase implements VolumeOrchestrati
|
|||||||
|
|
||||||
final HashSet<StoragePool> avoidPools = new HashSet<StoragePool>(avoids);
|
final HashSet<StoragePool> avoidPools = new HashSet<StoragePool>(avoids);
|
||||||
|
|
||||||
pool = findStoragePool(dskCh, dc, pod, clusterId, vm.getHostId(), vm, avoidPools);
|
pool = findStoragePool(dskCh, dc, pod, clusterId, hostId, vm, avoidPools);
|
||||||
if (pool == null) {
|
if (pool == null) {
|
||||||
String msg = String.format("Unable to find suitable primary storage when creating volume [%s].", volumeToString);
|
String msg = String.format("Unable to find suitable primary storage when creating volume [%s].", volumeToString);
|
||||||
s_logger.error(msg);
|
s_logger.error(msg);
|
||||||
@ -1122,10 +1127,17 @@ public class VolumeOrchestrator extends ManagerBase implements VolumeOrchestrati
|
|||||||
if (s_logger.isTraceEnabled()) {
|
if (s_logger.isTraceEnabled()) {
|
||||||
s_logger.trace(String.format("storage-pool %s/%s is associated with cluster %d",storagePool.getName(), storagePool.getUuid(), clusterId));
|
s_logger.trace(String.format("storage-pool %s/%s is associated with cluster %d",storagePool.getName(), storagePool.getUuid(), clusterId));
|
||||||
}
|
}
|
||||||
|
Long hostId = vm.getHostId();
|
||||||
|
if (hostId == null && storagePool.isLocal()) {
|
||||||
|
List<StoragePoolHostVO> poolHosts = storagePoolHostDao.listByPoolId(storagePool.getId());
|
||||||
|
if (poolHosts.size() > 0) {
|
||||||
|
hostId = poolHosts.get(0).getHostId();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
VolumeInfo vol = null;
|
VolumeInfo vol = null;
|
||||||
if (volumeInfo.getState() == Volume.State.Allocated) {
|
if (volumeInfo.getState() == Volume.State.Allocated) {
|
||||||
vol = createVolume(volumeInfo, vm, rootDiskTmplt, dcVO, pod, clusterId, svo, diskVO, new ArrayList<StoragePool>(), volumeInfo.getSize(), rootDiskHyperType);
|
vol = createVolume(volumeInfo, vm, rootDiskTmplt, dcVO, pod, clusterId, hostId, svo, diskVO, new ArrayList<StoragePool>(), volumeInfo.getSize(), rootDiskHyperType);
|
||||||
} else if (volumeInfo.getState() == Volume.State.Uploaded) {
|
} else if (volumeInfo.getState() == Volume.State.Uploaded) {
|
||||||
vol = copyVolume(storagePool, volumeInfo, vm, rootDiskTmplt, dcVO, pod, diskVO, svo, rootDiskHyperType);
|
vol = copyVolume(storagePool, volumeInfo, vm, rootDiskTmplt, dcVO, pod, diskVO, svo, rootDiskHyperType);
|
||||||
if (vol != null) {
|
if (vol != null) {
|
||||||
|
|||||||
@ -19,6 +19,7 @@ package com.cloud.hypervisor.dao;
|
|||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
|
import org.apache.cloudstack.utils.CloudStackVersion;
|
||||||
import org.apache.commons.lang3.StringUtils;
|
import org.apache.commons.lang3.StringUtils;
|
||||||
import org.apache.log4j.Logger;
|
import org.apache.log4j.Logger;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
@ -73,6 +74,12 @@ public class HypervisorCapabilitiesDaoImpl extends GenericDaoBase<HypervisorCapa
|
|||||||
SearchCriteria<HypervisorCapabilitiesVO> sc = HypervisorTypeAndVersionSearch.create();
|
SearchCriteria<HypervisorCapabilitiesVO> sc = HypervisorTypeAndVersionSearch.create();
|
||||||
sc.setParameters("hypervisorType", hypervisorType);
|
sc.setParameters("hypervisorType", hypervisorType);
|
||||||
sc.setParameters("hypervisorVersion", hypervisorVersion);
|
sc.setParameters("hypervisorVersion", hypervisorVersion);
|
||||||
|
HypervisorCapabilitiesVO result = findOneBy(sc);
|
||||||
|
if (result != null || !HypervisorType.VMware.equals(hypervisorType) ||
|
||||||
|
CloudStackVersion.getVMwareParentVersion(hypervisorVersion) == null) {
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
sc.setParameters("hypervisorVersion", CloudStackVersion.getVMwareParentVersion(hypervisorVersion));
|
||||||
return findOneBy(sc);
|
return findOneBy(sc);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -88,6 +88,12 @@ public class AutoScaleVmProfileVO implements AutoScaleVmProfile, Identity, Inter
|
|||||||
@Basic(fetch = FetchType.LAZY)
|
@Basic(fetch = FetchType.LAZY)
|
||||||
private String userData;
|
private String userData;
|
||||||
|
|
||||||
|
@Column(name = "user_data_id", nullable = true)
|
||||||
|
private Long userDataId = null;
|
||||||
|
|
||||||
|
@Column(name = "user_data_details", updatable = true, length = 4096)
|
||||||
|
private String userDataDetails;
|
||||||
|
|
||||||
@Column(name = GenericDao.REMOVED_COLUMN)
|
@Column(name = GenericDao.REMOVED_COLUMN)
|
||||||
protected Date removed;
|
protected Date removed;
|
||||||
|
|
||||||
@ -228,6 +234,24 @@ public class AutoScaleVmProfileVO implements AutoScaleVmProfile, Identity, Inter
|
|||||||
return userData;
|
return userData;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Long getUserDataId() {
|
||||||
|
return userDataId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setUserDataId(Long userDataId) {
|
||||||
|
this.userDataId = userDataId;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getUserDataDetails() {
|
||||||
|
return userDataDetails;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setUserDataDetails(String userDataDetails) {
|
||||||
|
this.userDataDetails = userDataDetails;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getUuid() {
|
public String getUuid() {
|
||||||
return uuid;
|
return uuid;
|
||||||
|
|||||||
@ -229,4 +229,20 @@ public class GuestOsMapper {
|
|||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void updateGuestOsNameInHypervisorMapping(long categoryId, String displayName, GuestOSHypervisorMapping mapping) {
|
||||||
|
if (!isValidGuestOSHypervisorMapping(mapping)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
long guestOsId = getGuestOsId(categoryId, displayName);
|
||||||
|
if (guestOsId == 0) {
|
||||||
|
LOG.error(String.format("no guest os found for category %d and name %s, skipping mapping it to %s/%s", guestOsId, displayName, mapping.getHypervisorType(), mapping.getHypervisorVersion()));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
GuestOSHypervisorVO guestOsMapping = guestOSHypervisorDao.findByOsIdAndHypervisor(guestOsId, mapping.getHypervisorType(), mapping.getHypervisorVersion());
|
||||||
|
guestOsMapping.setGuestOsName(mapping.getGuestOsName());
|
||||||
|
guestOSHypervisorDao.update(guestOsMapping.getId(), guestOsMapping);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -16,6 +16,9 @@
|
|||||||
// under the License.
|
// under the License.
|
||||||
package com.cloud.upgrade.dao;
|
package com.cloud.upgrade.dao;
|
||||||
|
|
||||||
|
import com.cloud.hypervisor.Hypervisor;
|
||||||
|
import com.cloud.storage.GuestOSHypervisorMapping;
|
||||||
|
import com.cloud.upgrade.GuestOsMapper;
|
||||||
import com.cloud.upgrade.SystemVmTemplateRegistration;
|
import com.cloud.upgrade.SystemVmTemplateRegistration;
|
||||||
import com.cloud.utils.exception.CloudRuntimeException;
|
import com.cloud.utils.exception.CloudRuntimeException;
|
||||||
import org.apache.log4j.Logger;
|
import org.apache.log4j.Logger;
|
||||||
@ -58,6 +61,9 @@ public class Upgrade41800to41810 implements DbUpgrade, DbUpgradeSystemVmTemplate
|
|||||||
@Override
|
@Override
|
||||||
public void performDataMigration(Connection conn) {
|
public void performDataMigration(Connection conn) {
|
||||||
fixForeignKeyNames(conn);
|
fixForeignKeyNames(conn);
|
||||||
|
updateGuestOsMappings(conn);
|
||||||
|
copyGuestOsMappingsToVMware80u1();
|
||||||
|
addForeignKeyToAutoscaleVmprofiles(conn);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -86,6 +92,115 @@ public class Upgrade41800to41810 implements DbUpgrade, DbUpgradeSystemVmTemplate
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void updateGuestOsMappings(Connection conn) {
|
||||||
|
LOG.debug("Updating guest OS mappings");
|
||||||
|
|
||||||
|
GuestOsMapper guestOsMapper = new GuestOsMapper();
|
||||||
|
List<GuestOSHypervisorMapping> mappings = new ArrayList<>();
|
||||||
|
|
||||||
|
LOG.debug("Adding Ubuntu 20.04 support for VMware 6.5+");
|
||||||
|
guestOsMapper.addGuestOsHypervisorMapping(new GuestOSHypervisorMapping("VMware", "6.5", "ubuntu64Guest"), 10, "Ubuntu 20.04 LTS");
|
||||||
|
guestOsMapper.addGuestOsHypervisorMapping(new GuestOSHypervisorMapping("VMware", "6.7", "ubuntu64Guest"), 10, "Ubuntu 20.04 LTS");
|
||||||
|
guestOsMapper.addGuestOsHypervisorMapping(new GuestOSHypervisorMapping("VMware", "6.7.1", "ubuntu64Guest"), 10, "Ubuntu 20.04 LTS");
|
||||||
|
guestOsMapper.addGuestOsHypervisorMapping(new GuestOSHypervisorMapping("VMware", "6.7.2", "ubuntu64Guest"), 10, "Ubuntu 20.04 LTS");
|
||||||
|
guestOsMapper.addGuestOsHypervisorMapping(new GuestOSHypervisorMapping("VMware", "6.7.3", "ubuntu64Guest"), 10, "Ubuntu 20.04 LTS");
|
||||||
|
guestOsMapper.addGuestOsHypervisorMapping(new GuestOSHypervisorMapping("VMware", "7.0", "ubuntu64Guest"), 10, "Ubuntu 20.04 LTS");
|
||||||
|
guestOsMapper.addGuestOsHypervisorMapping(new GuestOSHypervisorMapping("VMware", "7.0.1.0", "ubuntu64Guest"), 10, "Ubuntu 20.04 LTS");
|
||||||
|
guestOsMapper.addGuestOsHypervisorMapping(new GuestOSHypervisorMapping("VMware", "7.0.2.0", "ubuntu64Guest"), 10, "Ubuntu 20.04 LTS");
|
||||||
|
guestOsMapper.addGuestOsHypervisorMapping(new GuestOSHypervisorMapping("VMware", "7.0.3.0", "ubuntu64Guest"), 10, "Ubuntu 20.04 LTS");
|
||||||
|
guestOsMapper.addGuestOsHypervisorMapping(new GuestOSHypervisorMapping("VMware", "8.0", "ubuntu64Guest"), 10, "Ubuntu 20.04 LTS");
|
||||||
|
|
||||||
|
LOG.debug("Adding Ubuntu 22.04 support for KVM and VMware 6.5+");
|
||||||
|
mappings.add(new GuestOSHypervisorMapping("KVM", "default", "Ubuntu 22.04 LTS"));
|
||||||
|
mappings.add(new GuestOSHypervisorMapping("VMware", "6.5", "ubuntu64Guest"));
|
||||||
|
mappings.add(new GuestOSHypervisorMapping("VMware", "6.7", "ubuntu64Guest"));
|
||||||
|
mappings.add(new GuestOSHypervisorMapping("VMware", "6.7.1", "ubuntu64Guest"));
|
||||||
|
mappings.add(new GuestOSHypervisorMapping("VMware", "6.7.2", "ubuntu64Guest"));
|
||||||
|
mappings.add(new GuestOSHypervisorMapping("VMware", "6.7.3", "ubuntu64Guest"));
|
||||||
|
mappings.add(new GuestOSHypervisorMapping("VMware", "7.0", "ubuntu64Guest"));
|
||||||
|
mappings.add(new GuestOSHypervisorMapping("VMware", "7.0.1.0", "ubuntu64Guest"));
|
||||||
|
mappings.add(new GuestOSHypervisorMapping("VMware", "7.0.2.0", "ubuntu64Guest"));
|
||||||
|
mappings.add(new GuestOSHypervisorMapping("VMware", "7.0.3.0", "ubuntu64Guest"));
|
||||||
|
mappings.add(new GuestOSHypervisorMapping("VMware", "8.0", "ubuntu64Guest"));
|
||||||
|
guestOsMapper.addGuestOsAndHypervisorMappings(10, "Ubuntu 22.04 LTS", mappings);
|
||||||
|
mappings.clear();
|
||||||
|
|
||||||
|
LOG.debug("Correcting guest OS names in hypervisor mappings for VMware 8.0 ad 8.0.0.1");
|
||||||
|
final String hypervisorVMware = Hypervisor.HypervisorType.VMware.name();
|
||||||
|
final String hypervisorVersionVmware8 = "8.0";
|
||||||
|
guestOsMapper.updateGuestOsNameInHypervisorMapping(1, "AlmaLinux 9", new GuestOSHypervisorMapping(hypervisorVMware, hypervisorVersionVmware8, "almalinux_64Guest"));
|
||||||
|
guestOsMapper.updateGuestOsNameInHypervisorMapping(1, "Oracle Linux 9", new GuestOSHypervisorMapping(hypervisorVMware, hypervisorVersionVmware8, "oracleLinux9_64Guest"));
|
||||||
|
guestOsMapper.updateGuestOsNameInHypervisorMapping(1, "Rocky Linux 9", new GuestOSHypervisorMapping(hypervisorVMware, hypervisorVersionVmware8, "rockylinux_64Guest"));
|
||||||
|
guestOsMapper.updateGuestOsNameInHypervisorMapping(1, "AlmaLinux 9", new GuestOSHypervisorMapping(hypervisorVMware, "8.0.0.1", "almalinux_64Guest"));
|
||||||
|
guestOsMapper.updateGuestOsNameInHypervisorMapping(1, "Oracle Linux 9", new GuestOSHypervisorMapping(hypervisorVMware, "8.0.0.1", "oracleLinux9_64Guest"));
|
||||||
|
guestOsMapper.updateGuestOsNameInHypervisorMapping(1, "Rocky Linux 9", new GuestOSHypervisorMapping(hypervisorVMware, "8.0.0.1", "rockylinux_64Guest"));
|
||||||
|
|
||||||
|
LOG.debug("Correcting guest OS names in hypervisor mappings for Red Hat Enterprise Linux 9");
|
||||||
|
guestOsMapper.updateGuestOsNameInHypervisorMapping(1, "Red Hat Enterprise Linux 9", new GuestOSHypervisorMapping(hypervisorVMware, "7.0", "rhel9_64Guest"));
|
||||||
|
guestOsMapper.updateGuestOsNameInHypervisorMapping(1, "Red Hat Enterprise Linux 9", new GuestOSHypervisorMapping(hypervisorVMware, "7.0.1.0", "rhel9_64Guest"));
|
||||||
|
guestOsMapper.updateGuestOsNameInHypervisorMapping(1, "Red Hat Enterprise Linux 9", new GuestOSHypervisorMapping(hypervisorVMware, "7.0.2.0", "rhel9_64Guest"));
|
||||||
|
guestOsMapper.updateGuestOsNameInHypervisorMapping(1, "Red Hat Enterprise Linux 9", new GuestOSHypervisorMapping(hypervisorVMware, "7.0.3.0", "rhel9_64Guest"));
|
||||||
|
guestOsMapper.updateGuestOsNameInHypervisorMapping(1, "Red Hat Enterprise Linux 9", new GuestOSHypervisorMapping(hypervisorVMware, hypervisorVersionVmware8, "rhel9_64Guest"));
|
||||||
|
guestOsMapper.updateGuestOsNameInHypervisorMapping(1, "Red Hat Enterprise Linux 9", new GuestOSHypervisorMapping(hypervisorVMware, "8.0.0.1", "rhel9_64Guest"));
|
||||||
|
|
||||||
|
LOG.debug("Adding new guest OS ids in hypervisor mappings for VMware 8.0");
|
||||||
|
// Add support for darwin22_64Guest from VMware 8.0
|
||||||
|
mappings.add(new GuestOSHypervisorMapping(hypervisorVMware, hypervisorVersionVmware8, "darwin22_64Guest"));
|
||||||
|
guestOsMapper.addGuestOsAndHypervisorMappings(7, "macOS 13 (64-bit)", mappings);
|
||||||
|
mappings.clear();
|
||||||
|
|
||||||
|
// Add support for darwin23_64Guest from VMware 8.0
|
||||||
|
mappings.add(new GuestOSHypervisorMapping(hypervisorVMware, hypervisorVersionVmware8, "darwin23_64Guest"));
|
||||||
|
guestOsMapper.addGuestOsAndHypervisorMappings(7, "macOS 14 (64-bit)", mappings);
|
||||||
|
mappings.clear();
|
||||||
|
|
||||||
|
// Add support for debian12_64Guest from VMware 8.0
|
||||||
|
mappings.add(new GuestOSHypervisorMapping(hypervisorVMware, hypervisorVersionVmware8, "debian12_64Guest"));
|
||||||
|
guestOsMapper.addGuestOsAndHypervisorMappings(2, "Debian GNU/Linux 12 (64-bit)", mappings);
|
||||||
|
mappings.clear();
|
||||||
|
|
||||||
|
// Add support for debian12Guest from VMware 8.0
|
||||||
|
mappings.add(new GuestOSHypervisorMapping(hypervisorVMware, hypervisorVersionVmware8, "debian12Guest"));
|
||||||
|
guestOsMapper.addGuestOsAndHypervisorMappings(2, "Debian GNU/Linux 12 (32-bit)", mappings);
|
||||||
|
mappings.clear();
|
||||||
|
|
||||||
|
// Add support for freebsd14_64Guest from VMware 8.0
|
||||||
|
mappings.add(new GuestOSHypervisorMapping(hypervisorVMware, hypervisorVersionVmware8, "freebsd14_64Guest"));
|
||||||
|
guestOsMapper.addGuestOsAndHypervisorMappings(9, "FreeBSD 14 (64-bit)", mappings);
|
||||||
|
mappings.clear();
|
||||||
|
|
||||||
|
// Add support for freebsd14Guest from VMware 8.0
|
||||||
|
mappings.add(new GuestOSHypervisorMapping(hypervisorVMware, hypervisorVersionVmware8, "freebsd14Guest"));
|
||||||
|
guestOsMapper.addGuestOsAndHypervisorMappings(9, "FreeBSD 14 (32-bit)", mappings);
|
||||||
|
mappings.clear();
|
||||||
|
|
||||||
|
// Add support for other6xLinux64Guest from VMware 8.0
|
||||||
|
mappings.add(new GuestOSHypervisorMapping(hypervisorVMware, hypervisorVersionVmware8, "other6xLinux64Guest"));
|
||||||
|
guestOsMapper.addGuestOsAndHypervisorMappings(7, "Linux 6.x Kernel (64-bit)", mappings);
|
||||||
|
mappings.clear();
|
||||||
|
|
||||||
|
// Add support for other6xLinuxGuest from VMware 8.0
|
||||||
|
mappings.add(new GuestOSHypervisorMapping(hypervisorVMware, hypervisorVersionVmware8, "other6xLinuxGuest"));
|
||||||
|
guestOsMapper.addGuestOsAndHypervisorMappings(7, "Linux 6.x Kernel (32-bit)", mappings);
|
||||||
|
mappings.clear();
|
||||||
|
|
||||||
|
// Add support for vmkernel8Guest from VMware 8.0
|
||||||
|
mappings.add(new GuestOSHypervisorMapping(hypervisorVMware, hypervisorVersionVmware8, "vmkernel8Guest"));
|
||||||
|
guestOsMapper.addGuestOsAndHypervisorMappings(7, "VMware ESXi 8.0", mappings);
|
||||||
|
mappings.clear();
|
||||||
|
|
||||||
|
// Add support for windows11_64Guest from VMware 8.0
|
||||||
|
mappings.add(new GuestOSHypervisorMapping(hypervisorVMware, hypervisorVersionVmware8, "windows11_64Guest"));
|
||||||
|
guestOsMapper.addGuestOsAndHypervisorMappings(6, "Windows 11 (64-bit)", mappings);
|
||||||
|
mappings.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void copyGuestOsMappingsToVMware80u1() {
|
||||||
|
LOG.debug("Copying guest OS mappings from VMware 8.0 to VMware 8.0.1");
|
||||||
|
GuestOsMapper guestOsMapper = new GuestOsMapper();
|
||||||
|
guestOsMapper.copyGuestOSHypervisorMappings(Hypervisor.HypervisorType.VMware, "8.0", "8.0.1");
|
||||||
|
}
|
||||||
|
|
||||||
private void fixForeignKeyNames(Connection conn) {
|
private void fixForeignKeyNames(Connection conn) {
|
||||||
//Alter foreign key name for user_vm table from fk_user_data_id to fk_user_vm__user_data_id (if exists)
|
//Alter foreign key name for user_vm table from fk_user_data_id to fk_user_vm__user_data_id (if exists)
|
||||||
List<String> keys = new ArrayList<String>();
|
List<String> keys = new ArrayList<String>();
|
||||||
@ -111,4 +226,8 @@ public class Upgrade41800to41810 implements DbUpgrade, DbUpgradeSystemVmTemplate
|
|||||||
DbUpgradeUtils.dropKeysIfExist(conn, "cloud.volumes", keys, false);
|
DbUpgradeUtils.dropKeysIfExist(conn, "cloud.volumes", keys, false);
|
||||||
DbUpgradeUtils.addForeignKey(conn, "volumes", "passphrase_id","passphrase", "id");
|
DbUpgradeUtils.addForeignKey(conn, "volumes", "passphrase_id","passphrase", "id");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void addForeignKeyToAutoscaleVmprofiles(Connection conn) {
|
||||||
|
DbUpgradeUtils.addForeignKey(conn, "autoscale_vmprofiles", "user_data_id", "user_data", "id");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -19,6 +19,9 @@
|
|||||||
-- Schema upgrade from 4.18.0.0 to 4.18.1.0
|
-- Schema upgrade from 4.18.0.0 to 4.18.1.0
|
||||||
--;
|
--;
|
||||||
|
|
||||||
|
-- Add support for VMware 8.0u1 (8.0.1.x)
|
||||||
|
INSERT IGNORE INTO `cloud`.`hypervisor_capabilities` (uuid, hypervisor_type, hypervisor_version, max_guests_limit, security_group_enabled, max_data_volumes_limit, max_hosts_per_cluster, storage_motion_supported, vm_snapshot_enabled) values (UUID(), 'VMware', '8.0.1', 1024, 0, 59, 64, 1, 1);
|
||||||
|
|
||||||
-- Update conserve_mode of the default network offering for Tungsten Fabric (this fixes issue #7241)
|
-- Update conserve_mode of the default network offering for Tungsten Fabric (this fixes issue #7241)
|
||||||
UPDATE `cloud`.`network_offerings` SET conserve_mode = 0 WHERE unique_name ='DefaultTungstenFarbicNetworkOffering';
|
UPDATE `cloud`.`network_offerings` SET conserve_mode = 0 WHERE unique_name ='DefaultTungstenFarbicNetworkOffering';
|
||||||
|
|
||||||
@ -32,6 +35,10 @@ CALL ADD_GUEST_OS_AND_HYPERVISOR_MAPPING (6, 'Windows Server 2022 (64-bit)', 'VM
|
|||||||
CALL ADD_GUEST_OS_AND_HYPERVISOR_MAPPING (6, 'Windows Server 2022 (64-bit)', 'VMware', '8.0.0.1', 'windows2019srvNext_64Guest');
|
CALL ADD_GUEST_OS_AND_HYPERVISOR_MAPPING (6, 'Windows Server 2022 (64-bit)', 'VMware', '8.0.0.1', 'windows2019srvNext_64Guest');
|
||||||
CALL ADD_GUEST_OS_AND_HYPERVISOR_MAPPING (6, 'Windows Server 2022 (64-bit)', 'Xenserver', '8.2.0', 'Windows Server 2022 (64-bit)');
|
CALL ADD_GUEST_OS_AND_HYPERVISOR_MAPPING (6, 'Windows Server 2022 (64-bit)', 'Xenserver', '8.2.0', 'Windows Server 2022 (64-bit)');
|
||||||
|
|
||||||
|
-- Support userdata ids and details in VM AutoScaling
|
||||||
|
CALL `cloud`.`IDEMPOTENT_ADD_COLUMN`('cloud.autoscale_vmprofiles', 'user_data_id', 'bigint unsigned DEFAULT NULL COMMENT "id of the user data" AFTER `user_data`');
|
||||||
|
CALL `cloud`.`IDEMPOTENT_ADD_COLUMN`('cloud.autoscale_vmprofiles', 'user_data_details', 'mediumtext DEFAULT NULL COMMENT "value of the comma-separated list of parameters" AFTER `user_data_id`');
|
||||||
|
|
||||||
-- Don't enable CPU cap for default system offerings, fixes regression from https://github.com/apache/cloudstack/pull/6420
|
-- Don't enable CPU cap for default system offerings, fixes regression from https://github.com/apache/cloudstack/pull/6420
|
||||||
UPDATE `cloud`.`service_offering` so
|
UPDATE `cloud`.`service_offering` so
|
||||||
SET so.limit_cpu_use = 0
|
SET so.limit_cpu_use = 0
|
||||||
|
|||||||
@ -26,6 +26,18 @@ import org.junit.Test;
|
|||||||
|
|
||||||
public class AutoScaleVmProfileVOTest {
|
public class AutoScaleVmProfileVOTest {
|
||||||
|
|
||||||
|
static long zoneId = 1L;
|
||||||
|
static long domainId = 2L;
|
||||||
|
static long accountId = 3L;
|
||||||
|
static long serviceOfferingId = 4L;
|
||||||
|
static long templateId = 5L;
|
||||||
|
static String userdata = "userdata";
|
||||||
|
static long userdataId = 6L;
|
||||||
|
static String userdataDetails = "userdataDetails";
|
||||||
|
static String userdataNew = "userdataNew";
|
||||||
|
|
||||||
|
static long autoScaleUserId = 7L;
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testCounterParamsForUpdate() {
|
public void testCounterParamsForUpdate() {
|
||||||
AutoScaleVmProfileVO profile = new AutoScaleVmProfileVO();
|
AutoScaleVmProfileVO profile = new AutoScaleVmProfileVO();
|
||||||
@ -62,4 +74,23 @@ public class AutoScaleVmProfileVOTest {
|
|||||||
Assert.assertEquals("rootdisksize", otherDeployParamsList.get(1).first());
|
Assert.assertEquals("rootdisksize", otherDeployParamsList.get(1).first());
|
||||||
Assert.assertEquals("10", otherDeployParamsList.get(1).second());
|
Assert.assertEquals("10", otherDeployParamsList.get(1).second());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testProperties() {
|
||||||
|
AutoScaleVmProfileVO profile = new AutoScaleVmProfileVO(zoneId, domainId, accountId, serviceOfferingId, templateId, null, null, userdata, null, autoScaleUserId);
|
||||||
|
Assert.assertEquals(new Long(zoneId), profile.getZoneId());
|
||||||
|
Assert.assertEquals(domainId, profile.getDomainId());
|
||||||
|
Assert.assertEquals(accountId, profile.getAccountId());
|
||||||
|
Assert.assertEquals(new Long(serviceOfferingId), profile.getServiceOfferingId());
|
||||||
|
Assert.assertEquals(new Long(templateId), profile.getTemplateId());
|
||||||
|
Assert.assertEquals(userdata, profile.getUserData());
|
||||||
|
Assert.assertEquals(new Long(autoScaleUserId), profile.getAutoScaleUserId());
|
||||||
|
|
||||||
|
profile.setUserData(userdataNew);
|
||||||
|
profile.setUserDataId(userdataId);
|
||||||
|
profile.setUserDataDetails(userdataDetails);
|
||||||
|
Assert.assertEquals(userdataNew, profile.getUserData());
|
||||||
|
Assert.assertEquals(new Long(userdataId), profile.getUserDataId());
|
||||||
|
Assert.assertEquals(userdataDetails, profile.getUserDataDetails());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -53,7 +53,7 @@ intelligent IaaS cloud implementation.
|
|||||||
%package management
|
%package management
|
||||||
Summary: CloudStack management server UI
|
Summary: CloudStack management server UI
|
||||||
Requires: java-11-openjdk
|
Requires: java-11-openjdk
|
||||||
Requires: tzdata-java
|
Requires: (tzdata-java or timezone-java)
|
||||||
Requires: python3
|
Requires: python3
|
||||||
Requires: bash
|
Requires: bash
|
||||||
Requires: gawk
|
Requires: gawk
|
||||||
|
|||||||
@ -76,12 +76,12 @@ public class StaticRoleBasedAPIAccessChecker extends AdapterBase implements APIA
|
|||||||
if (roleService.isEnabled()) {
|
if (roleService.isEnabled()) {
|
||||||
LOGGER.debug("RoleService is enabled. We will use it instead of StaticRoleBasedAPIAccessChecker.");
|
LOGGER.debug("RoleService is enabled. We will use it instead of StaticRoleBasedAPIAccessChecker.");
|
||||||
}
|
}
|
||||||
return roleService.isEnabled();
|
return !roleService.isEnabled();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<String> getApisAllowedToUser(Role role, User user, List<String> apiNames) throws PermissionDeniedException {
|
public List<String> getApisAllowedToUser(Role role, User user, List<String> apiNames) throws PermissionDeniedException {
|
||||||
if (isEnabled()) {
|
if (!isEnabled()) {
|
||||||
return apiNames;
|
return apiNames;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -93,7 +93,7 @@ public class StaticRoleBasedAPIAccessChecker extends AdapterBase implements APIA
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean checkAccess(User user, String commandName) throws PermissionDeniedException {
|
public boolean checkAccess(User user, String commandName) throws PermissionDeniedException {
|
||||||
if (isEnabled()) {
|
if (!isEnabled()) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -107,6 +107,10 @@ public class StaticRoleBasedAPIAccessChecker extends AdapterBase implements APIA
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean checkAccess(Account account, String commandName) {
|
public boolean checkAccess(Account account, String commandName) {
|
||||||
|
if (!isEnabled()) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
RoleType roleType = accountService.getRoleType(account);
|
RoleType roleType = accountService.getRoleType(account);
|
||||||
if (isApiAllowed(commandName, roleType)) {
|
if (isApiAllowed(commandName, roleType)) {
|
||||||
return true;
|
return true;
|
||||||
|
|||||||
@ -53,7 +53,7 @@ public class ResetApiLimitCmd extends BaseCmd {
|
|||||||
/////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////
|
||||||
|
|
||||||
@ACL
|
@ACL
|
||||||
@Parameter(name = ApiConstants.ACCOUNT, type = CommandType.UUID, entityType = AccountResponse.class, description = "the ID of the acount whose limit to be reset")
|
@Parameter(name = ApiConstants.ACCOUNT, type = CommandType.UUID, entityType = AccountResponse.class, description = "the ID of the account whose limit to be reset")
|
||||||
private Long accountId;
|
private Long accountId;
|
||||||
|
|
||||||
/////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////
|
||||||
|
|||||||
@ -47,6 +47,7 @@ import com.cloud.vm.dao.DomainRouterDao;
|
|||||||
import com.cloud.vm.dao.NicDao;
|
import com.cloud.vm.dao.NicDao;
|
||||||
import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao;
|
import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao;
|
||||||
import org.apache.cloudstack.storage.image.deployasis.DeployAsIsHelper;
|
import org.apache.cloudstack.storage.image.deployasis.DeployAsIsHelper;
|
||||||
|
import org.apache.cloudstack.utils.CloudStackVersion;
|
||||||
import org.apache.commons.lang.BooleanUtils;
|
import org.apache.commons.lang.BooleanUtils;
|
||||||
import org.apache.log4j.Logger;
|
import org.apache.log4j.Logger;
|
||||||
|
|
||||||
@ -165,7 +166,7 @@ class VmwareVmImplementer {
|
|||||||
|
|
||||||
GuestOSHypervisorVO guestOsMapping = null;
|
GuestOSHypervisorVO guestOsMapping = null;
|
||||||
if (host != null) {
|
if (host != null) {
|
||||||
guestOsMapping = guestOsHypervisorDao.findByOsIdAndHypervisor(guestOS.getId(), Hypervisor.HypervisorType.VMware.toString(), host.getHypervisorVersion());
|
guestOsMapping = getGuestOsMapping(guestOS, host.getHypervisorVersion());
|
||||||
}
|
}
|
||||||
if (guestOsMapping == null || host == null) {
|
if (guestOsMapping == null || host == null) {
|
||||||
to.setPlatformEmulator(null);
|
to.setPlatformEmulator(null);
|
||||||
@ -405,4 +406,17 @@ class VmwareVmImplementer {
|
|||||||
|
|
||||||
return listForSort.toArray(new NicTO[0]);
|
return listForSort.toArray(new NicTO[0]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected GuestOSHypervisorVO getGuestOsMapping(GuestOSVO guestOS , String hypervisorVersion) {
|
||||||
|
GuestOSHypervisorVO guestOsMapping = guestOsHypervisorDao.findByOsIdAndHypervisor(guestOS.getId(), Hypervisor.HypervisorType.VMware.toString(), hypervisorVersion);
|
||||||
|
if (guestOsMapping == null) {
|
||||||
|
LOGGER.debug(String.format("Cannot find guest os mappings for guest os \"%s\" on VMware %s", guestOS.getDisplayName(), hypervisorVersion));
|
||||||
|
String parentVersion = CloudStackVersion.getVMwareParentVersion(hypervisorVersion);
|
||||||
|
if (parentVersion != null) {
|
||||||
|
guestOsMapping = guestOsHypervisorDao.findByOsIdAndHypervisor(guestOS.getId(), Hypervisor.HypervisorType.VMware.toString(), parentVersion);
|
||||||
|
LOGGER.debug(String.format("Found guest os mappings for guest os \"%s\" on VMware %s: %s", guestOS.getDisplayName(), parentVersion, guestOsMapping));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return guestOsMapping;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -2636,7 +2636,9 @@ public class VmwareResource extends ServerResourceBase implements StoragePoolRes
|
|||||||
//
|
//
|
||||||
// Power-on VM
|
// Power-on VM
|
||||||
//
|
//
|
||||||
if (!vmMo.powerOn()) {
|
if (powerOnVM(vmMo, vmInternalCSName, vmNameOnVcenter)) {
|
||||||
|
s_logger.debug(String.format("VM %s has been started successfully with hostname %s.", vmInternalCSName, vmNameOnVcenter));
|
||||||
|
} else {
|
||||||
throw new Exception("Failed to start VM. vmName: " + vmInternalCSName + " with hostname " + vmNameOnVcenter);
|
throw new Exception("Failed to start VM. vmName: " + vmInternalCSName + " with hostname " + vmNameOnVcenter);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2708,6 +2710,23 @@ public class VmwareResource extends ServerResourceBase implements StoragePoolRes
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private boolean powerOnVM(final VirtualMachineMO vmMo, final String vmInternalCSName, final String vmNameOnVcenter) throws Exception {
|
||||||
|
int retry = 20;
|
||||||
|
while (retry-- > 0) {
|
||||||
|
try {
|
||||||
|
return vmMo.powerOn();
|
||||||
|
} catch (Exception e) {
|
||||||
|
s_logger.info(String.format("Got exception while power on VM %s with hostname %s", vmInternalCSName, vmNameOnVcenter), e);
|
||||||
|
if (e.getMessage() != null && e.getMessage().contains("File system specific implementation of Ioctl[file] failed")) {
|
||||||
|
s_logger.debug(String.format("Failed to power on VM %s with hostname %s. Retrying", vmInternalCSName, vmNameOnVcenter));
|
||||||
|
} else {
|
||||||
|
throw e;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
private boolean multipleIsosAtached(DiskTO[] sortedDisks) {
|
private boolean multipleIsosAtached(DiskTO[] sortedDisks) {
|
||||||
return Arrays.stream(sortedDisks).filter(disk -> disk.getType() == Volume.Type.ISO).count() > 1;
|
return Arrays.stream(sortedDisks).filter(disk -> disk.getType() == Volume.Type.ISO).count() > 1;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -24,6 +24,7 @@ import java.util.HashMap;
|
|||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
import org.junit.After;
|
import org.junit.After;
|
||||||
|
import org.junit.Assert;
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.junit.runner.RunWith;
|
import org.junit.runner.RunWith;
|
||||||
@ -37,6 +38,9 @@ import org.springframework.test.context.ContextConfiguration;
|
|||||||
import org.springframework.test.context.support.AnnotationConfigContextLoader;
|
import org.springframework.test.context.support.AnnotationConfigContextLoader;
|
||||||
|
|
||||||
import com.cloud.agent.api.to.VirtualMachineTO;
|
import com.cloud.agent.api.to.VirtualMachineTO;
|
||||||
|
import com.cloud.storage.GuestOSHypervisorVO;
|
||||||
|
import com.cloud.storage.GuestOSVO;
|
||||||
|
import com.cloud.storage.dao.GuestOSHypervisorDao;
|
||||||
import com.cloud.vm.VmDetailConstants;
|
import com.cloud.vm.VmDetailConstants;
|
||||||
|
|
||||||
@RunWith(MockitoJUnitRunner.class)
|
@RunWith(MockitoJUnitRunner.class)
|
||||||
@ -50,6 +54,9 @@ public class VmwareVmImplementerTest {
|
|||||||
@Mock
|
@Mock
|
||||||
VirtualMachineTO vmTO;
|
VirtualMachineTO vmTO;
|
||||||
|
|
||||||
|
@Mock
|
||||||
|
GuestOSHypervisorDao guestOsHypervisorDao;
|
||||||
|
|
||||||
private Map<String,String> vmDetails = new HashMap<String, String>();
|
private Map<String,String> vmDetails = new HashMap<String, String>();
|
||||||
|
|
||||||
AutoCloseable closeable;
|
AutoCloseable closeable;
|
||||||
@ -150,4 +157,43 @@ public class VmwareVmImplementerTest {
|
|||||||
executeAndVerifyTest(false, false, "false", false);
|
executeAndVerifyTest(false, false, "false", false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testGetGuestOsMapping1() {
|
||||||
|
GuestOSVO guestOs = Mockito.mock(GuestOSVO.class);
|
||||||
|
GuestOSHypervisorVO guestOsMapping = Mockito.mock(GuestOSHypervisorVO.class);
|
||||||
|
Mockito.when(guestOs.getId()).thenReturn(200L);
|
||||||
|
Mockito.when(guestOsHypervisorDao.findByOsIdAndHypervisor(200L, "VMware", "8.0.1.0")).thenReturn(guestOsMapping);
|
||||||
|
GuestOSHypervisorVO result = implementer.getGuestOsMapping(guestOs, "8.0.1.0");
|
||||||
|
Assert.assertEquals(guestOsMapping, result);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testGetGuestOsMapping2() {
|
||||||
|
GuestOSVO guestOs = Mockito.mock(GuestOSVO.class);
|
||||||
|
GuestOSHypervisorVO guestOsMapping = Mockito.mock(GuestOSHypervisorVO.class);
|
||||||
|
Mockito.when(guestOs.getId()).thenReturn(200L);
|
||||||
|
Mockito.when(guestOsHypervisorDao.findByOsIdAndHypervisor(200L, "VMware", "8.0.1.0")).thenReturn(null);
|
||||||
|
Mockito.when(guestOsHypervisorDao.findByOsIdAndHypervisor(200L, "VMware", "8.0.1")).thenReturn(guestOsMapping);
|
||||||
|
GuestOSHypervisorVO result = implementer.getGuestOsMapping(guestOs, "8.0.1.0");
|
||||||
|
Assert.assertEquals(guestOsMapping, result);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testGetGuestOsMapping3() {
|
||||||
|
GuestOSVO guestOs = Mockito.mock(GuestOSVO.class);
|
||||||
|
Mockito.when(guestOs.getId()).thenReturn(200L);
|
||||||
|
Mockito.when(guestOsHypervisorDao.findByOsIdAndHypervisor(200L, "VMware", "8.0.1.0")).thenReturn(null);
|
||||||
|
Mockito.when(guestOsHypervisorDao.findByOsIdAndHypervisor(200L, "VMware", "8.0.1")).thenReturn(null);
|
||||||
|
GuestOSHypervisorVO result = implementer.getGuestOsMapping(guestOs, "8.0.1.0");
|
||||||
|
Assert.assertNull(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testGetGuestOsMapping4() {
|
||||||
|
GuestOSVO guestOs = Mockito.mock(GuestOSVO.class);
|
||||||
|
Mockito.when(guestOs.getId()).thenReturn(200L);
|
||||||
|
Mockito.when(guestOsHypervisorDao.findByOsIdAndHypervisor(200L, "VMware", "8.0")).thenReturn(null);
|
||||||
|
GuestOSHypervisorVO result = implementer.getGuestOsMapping(guestOs, "8.0");
|
||||||
|
Assert.assertNull(result);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -56,7 +56,7 @@ public class StopNetScalerVMCmd extends BaseAsyncCmd {
|
|||||||
@Parameter(name = ApiConstants.ID, type = CommandType.UUID, entityType = DomainRouterResponse.class, required = true, description = "the ID of the NetScaler vm")
|
@Parameter(name = ApiConstants.ID, type = CommandType.UUID, entityType = DomainRouterResponse.class, required = true, description = "the ID of the NetScaler vm")
|
||||||
private Long id;
|
private Long id;
|
||||||
|
|
||||||
@Parameter(name = ApiConstants.FORCED, type = CommandType.BOOLEAN, required = false, description = "Force stop the VM. The caller knows the VM is stopped.")
|
@Parameter(name = ApiConstants.FORCED, type = CommandType.BOOLEAN, required = false, description = "Force stop the VM (vm is marked as Stopped even when command fails to be send to the backend, otherwise a force poweroff is attempted). To be used if the caller knows the VM is stopped and should be marked as such.")
|
||||||
private Boolean forced;
|
private Boolean forced;
|
||||||
|
|
||||||
// ///////////////////////////////////////////////////
|
// ///////////////////////////////////////////////////
|
||||||
|
|||||||
@ -61,7 +61,7 @@ public class ListTungstenFabricTagCmd extends BaseListCmd {
|
|||||||
@Parameter(name = ApiConstants.VM_UUID, type = CommandType.STRING, description = "the uuid of Tungsten-Fabric vm")
|
@Parameter(name = ApiConstants.VM_UUID, type = CommandType.STRING, description = "the uuid of Tungsten-Fabric vm")
|
||||||
private String vmUuid;
|
private String vmUuid;
|
||||||
|
|
||||||
@Parameter(name = ApiConstants.NIC_UUID, type = CommandType.STRING, description = "tthe uuid of Tungsten-Fabric nic")
|
@Parameter(name = ApiConstants.NIC_UUID, type = CommandType.STRING, description = "the uuid of Tungsten-Fabric nic")
|
||||||
private String nicUuid;
|
private String nicUuid;
|
||||||
|
|
||||||
@Parameter(name = ApiConstants.POLICY_UUID, type = CommandType.STRING, description = "the uuid of Tungsten-Fabric policy")
|
@Parameter(name = ApiConstants.POLICY_UUID, type = CommandType.STRING, description = "the uuid of Tungsten-Fabric policy")
|
||||||
|
|||||||
@ -48,7 +48,7 @@ public class ListElastistorVolumeResponse extends BaseResponse {
|
|||||||
private String compression;
|
private String compression;
|
||||||
|
|
||||||
@SerializedName("sync")
|
@SerializedName("sync")
|
||||||
@Param(description = "syncronization")
|
@Param(description = "synchronization")
|
||||||
private String sync;
|
private String sync;
|
||||||
|
|
||||||
public String getGraceAllowed() {
|
public String getGraceAllowed() {
|
||||||
|
|||||||
@ -32,7 +32,7 @@ public class LdapConfigurationResponse extends BaseResponse {
|
|||||||
private String hostname;
|
private String hostname;
|
||||||
|
|
||||||
@SerializedName(ApiConstants.PORT)
|
@SerializedName(ApiConstants.PORT)
|
||||||
@Param(description = "port teh ldap server is running on")
|
@Param(description = "port the ldap server is running on")
|
||||||
private int port;
|
private int port;
|
||||||
|
|
||||||
@SerializedName(ApiConstants.DOMAIN_ID)
|
@SerializedName(ApiConstants.DOMAIN_ID)
|
||||||
|
|||||||
@ -34,7 +34,7 @@ public class LinkAccountToLdapResponse extends BaseResponse {
|
|||||||
private String ldapDomain;
|
private String ldapDomain;
|
||||||
|
|
||||||
@SerializedName(ApiConstants.TYPE)
|
@SerializedName(ApiConstants.TYPE)
|
||||||
@Param(description = "type of the name in LDAP which is linke to the domain")
|
@Param(description = "type of the name in LDAP which is linked to the domain")
|
||||||
private String type;
|
private String type;
|
||||||
|
|
||||||
@SerializedName(ApiConstants.ACCOUNT_TYPE)
|
@SerializedName(ApiConstants.ACCOUNT_TYPE)
|
||||||
|
|||||||
@ -39,7 +39,7 @@ public class LinkDomainToLdapResponse extends BaseResponse {
|
|||||||
private String ldapDomain;
|
private String ldapDomain;
|
||||||
|
|
||||||
@SerializedName(ApiConstants.TYPE)
|
@SerializedName(ApiConstants.TYPE)
|
||||||
@Param(description = "type of the name in LDAP which is linke to the domain")
|
@Param(description = "type of the name in LDAP which is linked to the domain")
|
||||||
private String type;
|
private String type;
|
||||||
|
|
||||||
@SerializedName(ApiConstants.ACCOUNT_TYPE)
|
@SerializedName(ApiConstants.ACCOUNT_TYPE)
|
||||||
|
|||||||
@ -21,6 +21,7 @@ import java.util.Map;
|
|||||||
|
|
||||||
import javax.inject.Inject;
|
import javax.inject.Inject;
|
||||||
|
|
||||||
|
import org.apache.cloudstack.api.ApiConstants;
|
||||||
import org.apache.cloudstack.api.ApiErrorCode;
|
import org.apache.cloudstack.api.ApiErrorCode;
|
||||||
import org.apache.cloudstack.api.BaseAsyncCmd;
|
import org.apache.cloudstack.api.BaseAsyncCmd;
|
||||||
import org.apache.cloudstack.api.BaseAsyncCreateCmd;
|
import org.apache.cloudstack.api.BaseAsyncCreateCmd;
|
||||||
@ -101,6 +102,11 @@ public class ApiAsyncJobDispatcher extends AdapterBase implements AsyncJobDispat
|
|||||||
ctx.putContextParameters((Map<Object, Object>) gson.fromJson(contextDetails, objectMapType));
|
ctx.putContextParameters((Map<Object, Object>) gson.fromJson(contextDetails, objectMapType));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
String httpmethod = params.get(ApiConstants.HTTPMETHOD);
|
||||||
|
if (httpmethod != null) {
|
||||||
|
cmdObj.setHttpMethod(httpmethod);
|
||||||
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
// dispatch could ultimately queue the job
|
// dispatch could ultimately queue the job
|
||||||
_dispatcher.dispatch(cmdObj, params, true);
|
_dispatcher.dispatch(cmdObj, params, true);
|
||||||
|
|||||||
@ -372,6 +372,7 @@ import com.cloud.user.User;
|
|||||||
import com.cloud.user.UserAccount;
|
import com.cloud.user.UserAccount;
|
||||||
import com.cloud.user.UserData;
|
import com.cloud.user.UserData;
|
||||||
import com.cloud.user.UserStatisticsVO;
|
import com.cloud.user.UserStatisticsVO;
|
||||||
|
import com.cloud.user.dao.UserDataDao;
|
||||||
import com.cloud.user.dao.UserStatisticsDao;
|
import com.cloud.user.dao.UserStatisticsDao;
|
||||||
import com.cloud.uservm.UserVm;
|
import com.cloud.uservm.UserVm;
|
||||||
import com.cloud.utils.Pair;
|
import com.cloud.utils.Pair;
|
||||||
@ -464,6 +465,8 @@ public class ApiResponseHelper implements ResponseGenerator {
|
|||||||
NetworkServiceMapDao ntwkSrvcDao;
|
NetworkServiceMapDao ntwkSrvcDao;
|
||||||
@Inject
|
@Inject
|
||||||
FirewallRulesDao firewallRulesDao;
|
FirewallRulesDao firewallRulesDao;
|
||||||
|
@Inject
|
||||||
|
UserDataDao userDataDao;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public UserResponse createUserResponse(User user) {
|
public UserResponse createUserResponse(User user) {
|
||||||
@ -3437,9 +3440,20 @@ public class ApiResponseHelper implements ResponseGenerator {
|
|||||||
VMTemplateVO template = ApiDBUtils.findTemplateById(profile.getTemplateId());
|
VMTemplateVO template = ApiDBUtils.findTemplateById(profile.getTemplateId());
|
||||||
if (template != null) {
|
if (template != null) {
|
||||||
response.setTemplateId(template.getUuid());
|
response.setTemplateId(template.getUuid());
|
||||||
|
if (template.getUserDataOverridePolicy() != null) {
|
||||||
|
response.setUserDataPolicy(template.getUserDataOverridePolicy().toString());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
response.setUserData(profile.getUserData());
|
response.setUserData(profile.getUserData());
|
||||||
|
if (profile.getUserDataId() != null) {
|
||||||
|
UserData userData = userDataDao.findById(profile.getUserDataId());
|
||||||
|
if (userData != null) {
|
||||||
|
response.setUserDataId(userData.getUuid());
|
||||||
|
response.setUserDataName(userData.getName());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
response.setUserDataDetails(profile.getUserDataDetails());
|
||||||
response.setOtherDeployParams(profile.getOtherDeployParamsList());
|
response.setOtherDeployParams(profile.getOtherDeployParamsList());
|
||||||
response.setCounterParams(profile.getCounterParams());
|
response.setCounterParams(profile.getCounterParams());
|
||||||
response.setExpungeVmGracePeriod(profile.getExpungeVmGracePeriod());
|
response.setExpungeVmGracePeriod(profile.getExpungeVmGracePeriod());
|
||||||
|
|||||||
@ -740,6 +740,9 @@ public class ApiServer extends ManagerBase implements HttpRequestHandler, ApiSer
|
|||||||
params.put("ctxStartEventId", String.valueOf(startEventId));
|
params.put("ctxStartEventId", String.valueOf(startEventId));
|
||||||
params.put("cmdEventType", asyncCmd.getEventType().toString());
|
params.put("cmdEventType", asyncCmd.getEventType().toString());
|
||||||
params.put("ctxDetails", ApiGsonHelper.getBuilder().create().toJson(ctx.getContextParameters()));
|
params.put("ctxDetails", ApiGsonHelper.getBuilder().create().toJson(ctx.getContextParameters()));
|
||||||
|
if (asyncCmd.getHttpMethod() != null) {
|
||||||
|
params.put(ApiConstants.HTTPMETHOD, asyncCmd.getHttpMethod().toString());
|
||||||
|
}
|
||||||
|
|
||||||
Long instanceId = (objectId == null) ? asyncCmd.getApiResourceId() : objectId;
|
Long instanceId = (objectId == null) ? asyncCmd.getApiResourceId() : objectId;
|
||||||
|
|
||||||
|
|||||||
@ -62,7 +62,7 @@ public class DefaultLoginAPIAuthenticatorCmd extends BaseCmd implements APIAuthe
|
|||||||
@Parameter(name = ApiConstants.DOMAIN, type = CommandType.STRING, description = "Path of the domain that the user belongs to. Example: domain=/com/cloud/internal. If no domain is passed in, the ROOT (/) domain is assumed.")
|
@Parameter(name = ApiConstants.DOMAIN, type = CommandType.STRING, description = "Path of the domain that the user belongs to. Example: domain=/com/cloud/internal. If no domain is passed in, the ROOT (/) domain is assumed.")
|
||||||
private String domain;
|
private String domain;
|
||||||
|
|
||||||
@Parameter(name = ApiConstants.DOMAIN__ID, type = CommandType.LONG, description = "The id of the domain that the user belongs to. If both domain and domainId are passed in, \"domainId\" parameter takes precendence")
|
@Parameter(name = ApiConstants.DOMAIN__ID, type = CommandType.LONG, description = "The id of the domain that the user belongs to. If both domain and domainId are passed in, \"domainId\" parameter takes precedence.")
|
||||||
private Long domainId;
|
private Long domainId;
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
|
|||||||
@ -3968,7 +3968,7 @@ public class QueryManagerImpl extends MutualExclusiveIdsManagerBase implements Q
|
|||||||
@Override
|
@Override
|
||||||
public ListResponse<TemplateResponse> listIsos(ListIsosCmd cmd) {
|
public ListResponse<TemplateResponse> listIsos(ListIsosCmd cmd) {
|
||||||
Pair<List<TemplateJoinVO>, Integer> result = searchForIsosInternal(cmd);
|
Pair<List<TemplateJoinVO>, Integer> result = searchForIsosInternal(cmd);
|
||||||
ListResponse<TemplateResponse> response = new ListResponse<TemplateResponse>();
|
ListResponse<TemplateResponse> response = new ListResponse<>();
|
||||||
|
|
||||||
ResponseView respView = ResponseView.Restricted;
|
ResponseView respView = ResponseView.Restricted;
|
||||||
if (cmd instanceof ListIsosCmdByAdmin) {
|
if (cmd instanceof ListIsosCmdByAdmin) {
|
||||||
@ -3995,11 +3995,11 @@ public class QueryManagerImpl extends MutualExclusiveIdsManagerBase implements Q
|
|||||||
listAll = true;
|
listAll = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
List<Long> permittedAccountIds = new ArrayList<Long>();
|
List<Long> permittedAccountIds = new ArrayList<>();
|
||||||
Ternary<Long, Boolean, ListProjectResourcesCriteria> domainIdRecursiveListProject = new Ternary<Long, Boolean, ListProjectResourcesCriteria>(cmd.getDomainId(), cmd.isRecursive(), null);
|
Ternary<Long, Boolean, ListProjectResourcesCriteria> domainIdRecursiveListProject = new Ternary<>(cmd.getDomainId(), cmd.isRecursive(), null);
|
||||||
_accountMgr.buildACLSearchParameters(caller, id, cmd.getAccountName(), cmd.getProjectId(), permittedAccountIds, domainIdRecursiveListProject, listAll, false);
|
_accountMgr.buildACLSearchParameters(caller, id, cmd.getAccountName(), cmd.getProjectId(), permittedAccountIds, domainIdRecursiveListProject, listAll, false);
|
||||||
ListProjectResourcesCriteria listProjectResourcesCriteria = domainIdRecursiveListProject.third();
|
ListProjectResourcesCriteria listProjectResourcesCriteria = domainIdRecursiveListProject.third();
|
||||||
List<Account> permittedAccounts = new ArrayList<Account>();
|
List<Account> permittedAccounts = new ArrayList<>();
|
||||||
for (Long accountId : permittedAccountIds) {
|
for (Long accountId : permittedAccountIds) {
|
||||||
permittedAccounts.add(_accountMgr.getAccount(accountId));
|
permittedAccounts.add(_accountMgr.getAccount(accountId));
|
||||||
}
|
}
|
||||||
|
|||||||
@ -21,7 +21,6 @@ import java.util.ArrayList;
|
|||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.EnumSet;
|
import java.util.EnumSet;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Hashtable;
|
|
||||||
import java.util.LinkedHashMap;
|
import java.util.LinkedHashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
@ -150,7 +149,7 @@ public class ViewResponseHelper {
|
|||||||
public static List<UserVmResponse> createUserVmResponse(ResponseView view, String objectName, Set<VMDetails> details, Boolean accumulateStats, Boolean showUserData,
|
public static List<UserVmResponse> createUserVmResponse(ResponseView view, String objectName, Set<VMDetails> details, Boolean accumulateStats, Boolean showUserData,
|
||||||
UserVmJoinVO... userVms) {
|
UserVmJoinVO... userVms) {
|
||||||
Account caller = CallContext.current().getCallingAccount();
|
Account caller = CallContext.current().getCallingAccount();
|
||||||
Hashtable<Long, UserVmResponse> vmDataList = new Hashtable<Long, UserVmResponse>();
|
LinkedHashMap<Long, UserVmResponse> vmDataList = new LinkedHashMap<>();
|
||||||
// Initialise the vmdatalist with the input data
|
// Initialise the vmdatalist with the input data
|
||||||
|
|
||||||
for (UserVmJoinVO userVm : userVms) {
|
for (UserVmJoinVO userVm : userVms) {
|
||||||
@ -169,7 +168,7 @@ public class ViewResponseHelper {
|
|||||||
|
|
||||||
public static List<DomainRouterResponse> createDomainRouterResponse(DomainRouterJoinVO... routers) {
|
public static List<DomainRouterResponse> createDomainRouterResponse(DomainRouterJoinVO... routers) {
|
||||||
Account caller = CallContext.current().getCallingAccount();
|
Account caller = CallContext.current().getCallingAccount();
|
||||||
Hashtable<Long, DomainRouterResponse> vrDataList = new Hashtable<Long, DomainRouterResponse>();
|
LinkedHashMap<Long, DomainRouterResponse> vrDataList = new LinkedHashMap<>();
|
||||||
// Initialise the vrdatalist with the input data
|
// Initialise the vrdatalist with the input data
|
||||||
for (DomainRouterJoinVO vr : routers) {
|
for (DomainRouterJoinVO vr : routers) {
|
||||||
DomainRouterResponse vrData = vrDataList.get(vr.getId());
|
DomainRouterResponse vrData = vrDataList.get(vr.getId());
|
||||||
@ -187,7 +186,7 @@ public class ViewResponseHelper {
|
|||||||
|
|
||||||
public static List<SecurityGroupResponse> createSecurityGroupResponses(List<SecurityGroupJoinVO> securityGroups) {
|
public static List<SecurityGroupResponse> createSecurityGroupResponses(List<SecurityGroupJoinVO> securityGroups) {
|
||||||
Account caller = CallContext.current().getCallingAccount();
|
Account caller = CallContext.current().getCallingAccount();
|
||||||
Hashtable<Long, SecurityGroupResponse> vrDataList = new Hashtable<Long, SecurityGroupResponse>();
|
LinkedHashMap<Long, SecurityGroupResponse> vrDataList = new LinkedHashMap<>();
|
||||||
// Initialise the vrdatalist with the input data
|
// Initialise the vrdatalist with the input data
|
||||||
for (SecurityGroupJoinVO vr : securityGroups) {
|
for (SecurityGroupJoinVO vr : securityGroups) {
|
||||||
SecurityGroupResponse vrData = vrDataList.get(vr.getId());
|
SecurityGroupResponse vrData = vrDataList.get(vr.getId());
|
||||||
@ -205,7 +204,7 @@ public class ViewResponseHelper {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static List<ProjectResponse> createProjectResponse(EnumSet<DomainDetails> details, ProjectJoinVO... projects) {
|
public static List<ProjectResponse> createProjectResponse(EnumSet<DomainDetails> details, ProjectJoinVO... projects) {
|
||||||
Hashtable<Long, ProjectResponse> prjDataList = new Hashtable<Long, ProjectResponse>();
|
LinkedHashMap<Long, ProjectResponse> prjDataList = new LinkedHashMap<>();
|
||||||
// Initialise the prjdatalist with the input data
|
// Initialise the prjdatalist with the input data
|
||||||
for (ProjectJoinVO p : projects) {
|
for (ProjectJoinVO p : projects) {
|
||||||
ProjectResponse pData = prjDataList.get(p.getId());
|
ProjectResponse pData = prjDataList.get(p.getId());
|
||||||
@ -247,7 +246,7 @@ public class ViewResponseHelper {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static List<HostResponse> createHostResponse(EnumSet<HostDetails> details, HostJoinVO... hosts) {
|
public static List<HostResponse> createHostResponse(EnumSet<HostDetails> details, HostJoinVO... hosts) {
|
||||||
Hashtable<Long, HostResponse> vrDataList = new Hashtable<Long, HostResponse>();
|
LinkedHashMap<Long, HostResponse> vrDataList = new LinkedHashMap<>();
|
||||||
// Initialise the vrdatalist with the input data
|
// Initialise the vrdatalist with the input data
|
||||||
for (HostJoinVO vr : hosts) {
|
for (HostJoinVO vr : hosts) {
|
||||||
HostResponse vrData = ApiDBUtils.newHostResponse(vr, details);
|
HostResponse vrData = ApiDBUtils.newHostResponse(vr, details);
|
||||||
@ -257,7 +256,7 @@ public class ViewResponseHelper {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static List<HostForMigrationResponse> createHostForMigrationResponse(EnumSet<HostDetails> details, HostJoinVO... hosts) {
|
public static List<HostForMigrationResponse> createHostForMigrationResponse(EnumSet<HostDetails> details, HostJoinVO... hosts) {
|
||||||
Hashtable<Long, HostForMigrationResponse> vrDataList = new Hashtable<Long, HostForMigrationResponse>();
|
LinkedHashMap<Long, HostForMigrationResponse> vrDataList = new LinkedHashMap<>();
|
||||||
// Initialise the vrdatalist with the input data
|
// Initialise the vrdatalist with the input data
|
||||||
for (HostJoinVO vr : hosts) {
|
for (HostJoinVO vr : hosts) {
|
||||||
HostForMigrationResponse vrData = ApiDBUtils.newHostForMigrationResponse(vr, details);
|
HostForMigrationResponse vrData = ApiDBUtils.newHostForMigrationResponse(vr, details);
|
||||||
@ -267,7 +266,7 @@ public class ViewResponseHelper {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static List<VolumeResponse> createVolumeResponse(ResponseView view, VolumeJoinVO... volumes) {
|
public static List<VolumeResponse> createVolumeResponse(ResponseView view, VolumeJoinVO... volumes) {
|
||||||
Hashtable<Long, VolumeResponse> vrDataList = new Hashtable<Long, VolumeResponse>();
|
LinkedHashMap<Long, VolumeResponse> vrDataList = new LinkedHashMap<>();
|
||||||
DecimalFormat df = new DecimalFormat("0.0%");
|
DecimalFormat df = new DecimalFormat("0.0%");
|
||||||
for (VolumeJoinVO vr : volumes) {
|
for (VolumeJoinVO vr : volumes) {
|
||||||
VolumeResponse vrData = vrDataList.get(vr.getId());
|
VolumeResponse vrData = vrDataList.get(vr.getId());
|
||||||
@ -308,7 +307,7 @@ public class ViewResponseHelper {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static List<StoragePoolResponse> createStoragePoolResponse(StoragePoolJoinVO... pools) {
|
public static List<StoragePoolResponse> createStoragePoolResponse(StoragePoolJoinVO... pools) {
|
||||||
Hashtable<Long, StoragePoolResponse> vrDataList = new Hashtable<Long, StoragePoolResponse>();
|
LinkedHashMap<Long, StoragePoolResponse> vrDataList = new LinkedHashMap<>();
|
||||||
// Initialise the vrdatalist with the input data
|
// Initialise the vrdatalist with the input data
|
||||||
for (StoragePoolJoinVO vr : pools) {
|
for (StoragePoolJoinVO vr : pools) {
|
||||||
StoragePoolResponse vrData = vrDataList.get(vr.getId());
|
StoragePoolResponse vrData = vrDataList.get(vr.getId());
|
||||||
@ -345,7 +344,7 @@ public class ViewResponseHelper {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static List<ImageStoreResponse> createImageStoreResponse(ImageStoreJoinVO... stores) {
|
public static List<ImageStoreResponse> createImageStoreResponse(ImageStoreJoinVO... stores) {
|
||||||
Hashtable<Long, ImageStoreResponse> vrDataList = new Hashtable<Long, ImageStoreResponse>();
|
LinkedHashMap<Long, ImageStoreResponse> vrDataList = new LinkedHashMap<>();
|
||||||
// Initialise the vrdatalist with the input data
|
// Initialise the vrdatalist with the input data
|
||||||
for (ImageStoreJoinVO vr : stores) {
|
for (ImageStoreJoinVO vr : stores) {
|
||||||
ImageStoreResponse vrData = vrDataList.get(vr.getId());
|
ImageStoreResponse vrData = vrDataList.get(vr.getId());
|
||||||
@ -362,7 +361,7 @@ public class ViewResponseHelper {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static List<StoragePoolResponse> createStoragePoolForMigrationResponse(StoragePoolJoinVO... pools) {
|
public static List<StoragePoolResponse> createStoragePoolForMigrationResponse(StoragePoolJoinVO... pools) {
|
||||||
Hashtable<Long, StoragePoolResponse> vrDataList = new Hashtable<Long, StoragePoolResponse>();
|
LinkedHashMap<Long, StoragePoolResponse> vrDataList = new LinkedHashMap<>();
|
||||||
// Initialise the vrdatalist with the input data
|
// Initialise the vrdatalist with the input data
|
||||||
for (StoragePoolJoinVO vr : pools) {
|
for (StoragePoolJoinVO vr : pools) {
|
||||||
StoragePoolResponse vrData = vrDataList.get(vr.getId());
|
StoragePoolResponse vrData = vrDataList.get(vr.getId());
|
||||||
@ -577,7 +576,7 @@ public class ViewResponseHelper {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static List<TemplateResponse> createTemplateResponse(EnumSet<ApiConstants.DomainDetails> detailsView, ResponseView view, TemplateJoinVO... templates) {
|
public static List<TemplateResponse> createTemplateResponse(EnumSet<ApiConstants.DomainDetails> detailsView, ResponseView view, TemplateJoinVO... templates) {
|
||||||
LinkedHashMap<String, TemplateResponse> vrDataList = new LinkedHashMap<String, TemplateResponse>();
|
LinkedHashMap<String, TemplateResponse> vrDataList = new LinkedHashMap<>();
|
||||||
for (TemplateJoinVO vr : templates) {
|
for (TemplateJoinVO vr : templates) {
|
||||||
TemplateResponse vrData = vrDataList.get(vr.getTempZonePair());
|
TemplateResponse vrData = vrDataList.get(vr.getTempZonePair());
|
||||||
if (vrData == null) {
|
if (vrData == null) {
|
||||||
@ -594,7 +593,7 @@ public class ViewResponseHelper {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static List<TemplateResponse> createTemplateUpdateResponse(ResponseView view, TemplateJoinVO... templates) {
|
public static List<TemplateResponse> createTemplateUpdateResponse(ResponseView view, TemplateJoinVO... templates) {
|
||||||
Hashtable<Long, TemplateResponse> vrDataList = new Hashtable<Long, TemplateResponse>();
|
LinkedHashMap<Long, TemplateResponse> vrDataList = new LinkedHashMap<>();
|
||||||
for (TemplateJoinVO vr : templates) {
|
for (TemplateJoinVO vr : templates) {
|
||||||
TemplateResponse vrData = vrDataList.get(vr.getId());
|
TemplateResponse vrData = vrDataList.get(vr.getId());
|
||||||
if (vrData == null) {
|
if (vrData == null) {
|
||||||
@ -610,7 +609,7 @@ public class ViewResponseHelper {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static List<TemplateResponse> createIsoResponse(ResponseView view, TemplateJoinVO... templates) {
|
public static List<TemplateResponse> createIsoResponse(ResponseView view, TemplateJoinVO... templates) {
|
||||||
Hashtable<String, TemplateResponse> vrDataList = new Hashtable<String, TemplateResponse>();
|
LinkedHashMap<String, TemplateResponse> vrDataList = new LinkedHashMap<>();
|
||||||
for (TemplateJoinVO vr : templates) {
|
for (TemplateJoinVO vr : templates) {
|
||||||
TemplateResponse vrData = vrDataList.get(vr.getTempZonePair());
|
TemplateResponse vrData = vrDataList.get(vr.getTempZonePair());
|
||||||
if (vrData == null) {
|
if (vrData == null) {
|
||||||
@ -626,7 +625,7 @@ public class ViewResponseHelper {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static List<AffinityGroupResponse> createAffinityGroupResponses(List<AffinityGroupJoinVO> groups) {
|
public static List<AffinityGroupResponse> createAffinityGroupResponses(List<AffinityGroupJoinVO> groups) {
|
||||||
Hashtable<Long, AffinityGroupResponse> vrDataList = new Hashtable<Long, AffinityGroupResponse>();
|
LinkedHashMap<Long, AffinityGroupResponse> vrDataList = new LinkedHashMap<>();
|
||||||
for (AffinityGroupJoinVO vr : groups) {
|
for (AffinityGroupJoinVO vr : groups) {
|
||||||
AffinityGroupResponse vrData = vrDataList.get(vr.getId());
|
AffinityGroupResponse vrData = vrDataList.get(vr.getId());
|
||||||
if (vrData == null) {
|
if (vrData == null) {
|
||||||
|
|||||||
@ -532,7 +532,6 @@ public class AutoScaleManagerImpl extends ManagerBase implements AutoScaleManage
|
|||||||
long zoneId = cmd.getZoneId();
|
long zoneId = cmd.getZoneId();
|
||||||
long serviceOfferingId = cmd.getServiceOfferingId();
|
long serviceOfferingId = cmd.getServiceOfferingId();
|
||||||
Long autoscaleUserId = cmd.getAutoscaleUserId();
|
Long autoscaleUserId = cmd.getAutoscaleUserId();
|
||||||
String userData = cmd.getUserData();
|
|
||||||
|
|
||||||
DataCenter zone = entityMgr.findById(DataCenter.class, zoneId);
|
DataCenter zone = entityMgr.findById(DataCenter.class, zoneId);
|
||||||
|
|
||||||
@ -545,6 +544,11 @@ public class AutoScaleManagerImpl extends ManagerBase implements AutoScaleManage
|
|||||||
throw new InvalidParameterValueException("Unable to find service offering by id");
|
throw new InvalidParameterValueException("Unable to find service offering by id");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
VirtualMachineTemplate template = entityMgr.findById(VirtualMachineTemplate.class, cmd.getTemplateId());
|
||||||
|
if (template == null) {
|
||||||
|
throw new InvalidParameterValueException("Unable to find template by id " + cmd.getTemplateId());
|
||||||
|
}
|
||||||
|
|
||||||
// validations
|
// validations
|
||||||
HashMap<String, String> deployParams = cmd.getDeployParamMap();
|
HashMap<String, String> deployParams = cmd.getDeployParamMap();
|
||||||
/*
|
/*
|
||||||
@ -562,9 +566,23 @@ public class AutoScaleManagerImpl extends ManagerBase implements AutoScaleManage
|
|||||||
profileVO.setDisplay(cmd.getDisplay());
|
profileVO.setDisplay(cmd.getDisplay());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
String userData = cmd.getUserData();
|
||||||
|
Long userDataId = cmd.getUserDataId();
|
||||||
|
String userDataDetails = null;
|
||||||
|
if (MapUtils.isNotEmpty(cmd.getUserDataDetails())) {
|
||||||
|
userDataDetails = cmd.getUserDataDetails().toString();
|
||||||
|
}
|
||||||
|
userData = userVmMgr.finalizeUserData(userData, userDataId, template);
|
||||||
|
userData = userVmMgr.validateUserData(userData, cmd.getHttpMethod());
|
||||||
if (userData != null) {
|
if (userData != null) {
|
||||||
profileVO.setUserData(userData);
|
profileVO.setUserData(userData);
|
||||||
}
|
}
|
||||||
|
if (userDataId != null) {
|
||||||
|
profileVO.setUserDataId(userDataId);
|
||||||
|
}
|
||||||
|
if (userDataDetails != null) {
|
||||||
|
profileVO.setUserDataDetails(userDataDetails);
|
||||||
|
}
|
||||||
|
|
||||||
profileVO = checkValidityAndPersist(profileVO, true);
|
profileVO = checkValidityAndPersist(profileVO, true);
|
||||||
s_logger.info("Successfully create AutoScale Vm Profile with Id: " + profileVO.getId());
|
s_logger.info("Successfully create AutoScale Vm Profile with Id: " + profileVO.getId());
|
||||||
@ -582,12 +600,19 @@ public class AutoScaleManagerImpl extends ManagerBase implements AutoScaleManage
|
|||||||
Map<String, HashMap<String, String>> otherDeployParams = cmd.getOtherDeployParams();
|
Map<String, HashMap<String, String>> otherDeployParams = cmd.getOtherDeployParams();
|
||||||
Map counterParamList = cmd.getCounterParamList();
|
Map counterParamList = cmd.getCounterParamList();
|
||||||
String userData = cmd.getUserData();
|
String userData = cmd.getUserData();
|
||||||
|
Long userDataId = cmd.getUserDataId();
|
||||||
|
String userDataDetails = null;
|
||||||
|
if (MapUtils.isNotEmpty(cmd.getUserDataDetails())) {
|
||||||
|
userDataDetails = cmd.getUserDataDetails().toString();
|
||||||
|
}
|
||||||
|
boolean userdataUpdate = userData != null || userDataId != null || MapUtils.isNotEmpty(cmd.getUserDataDetails());
|
||||||
|
|
||||||
Integer expungeVmGracePeriod = cmd.getExpungeVmGracePeriod();
|
Integer expungeVmGracePeriod = cmd.getExpungeVmGracePeriod();
|
||||||
|
|
||||||
AutoScaleVmProfileVO vmProfile = getEntityInDatabase(CallContext.current().getCallingAccount(), "Auto Scale Vm Profile", profileId, autoScaleVmProfileDao);
|
AutoScaleVmProfileVO vmProfile = getEntityInDatabase(CallContext.current().getCallingAccount(), "Auto Scale Vm Profile", profileId, autoScaleVmProfileDao);
|
||||||
|
|
||||||
boolean physicalParameterUpdate = (templateId != null || autoscaleUserId != null || counterParamList != null || otherDeployParams != null || expungeVmGracePeriod != null || userData != null);
|
boolean physicalParameterUpdate = (templateId != null || autoscaleUserId != null || counterParamList != null
|
||||||
|
|| otherDeployParams != null || expungeVmGracePeriod != null || userdataUpdate);
|
||||||
|
|
||||||
if (serviceOfferingId != null) {
|
if (serviceOfferingId != null) {
|
||||||
vmProfile.setServiceOfferingId(serviceOfferingId);
|
vmProfile.setServiceOfferingId(serviceOfferingId);
|
||||||
@ -609,10 +634,6 @@ public class AutoScaleManagerImpl extends ManagerBase implements AutoScaleManage
|
|||||||
vmProfile.setCounterParamsForUpdate(counterParamList);
|
vmProfile.setCounterParamsForUpdate(counterParamList);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (userData != null) {
|
|
||||||
vmProfile.setUserData(userData);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (expungeVmGracePeriod != null) {
|
if (expungeVmGracePeriod != null) {
|
||||||
vmProfile.setExpungeVmGracePeriod(expungeVmGracePeriod);
|
vmProfile.setExpungeVmGracePeriod(expungeVmGracePeriod);
|
||||||
}
|
}
|
||||||
@ -625,6 +646,18 @@ public class AutoScaleManagerImpl extends ManagerBase implements AutoScaleManage
|
|||||||
vmProfile.setDisplay(cmd.getDisplay());
|
vmProfile.setDisplay(cmd.getDisplay());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (userdataUpdate) {
|
||||||
|
if (templateId == null) {
|
||||||
|
templateId = vmProfile.getTemplateId();
|
||||||
|
}
|
||||||
|
VirtualMachineTemplate template = entityMgr.findByIdIncludingRemoved(VirtualMachineTemplate.class, templateId);
|
||||||
|
userData = userVmMgr.finalizeUserData(userData, userDataId, template);
|
||||||
|
userData = userVmMgr.validateUserData(userData, cmd.getHttpMethod());
|
||||||
|
vmProfile.setUserDataId(userDataId);
|
||||||
|
vmProfile.setUserData(userData);
|
||||||
|
vmProfile.setUserDataDetails(userDataDetails);
|
||||||
|
}
|
||||||
|
|
||||||
List<AutoScaleVmGroupVO> vmGroupList = autoScaleVmGroupDao.listByAll(null, profileId);
|
List<AutoScaleVmGroupVO> vmGroupList = autoScaleVmGroupDao.listByAll(null, profileId);
|
||||||
for (AutoScaleVmGroupVO vmGroupVO : vmGroupList) {
|
for (AutoScaleVmGroupVO vmGroupVO : vmGroupList) {
|
||||||
if (physicalParameterUpdate && !vmGroupVO.getState().equals(AutoScaleVmGroup.State.DISABLED)) {
|
if (physicalParameterUpdate && !vmGroupVO.getState().equals(AutoScaleVmGroup.State.DISABLED)) {
|
||||||
@ -1740,6 +1773,8 @@ public class AutoScaleManagerImpl extends ManagerBase implements AutoScaleManage
|
|||||||
}
|
}
|
||||||
|
|
||||||
String userData = profileVo.getUserData();
|
String userData = profileVo.getUserData();
|
||||||
|
Long userDataId = profileVo.getUserDataId();
|
||||||
|
String userDataDetails = profileVo.getUserDataDetails();
|
||||||
|
|
||||||
UserVm vm = null;
|
UserVm vm = null;
|
||||||
IpAddresses addrs = new IpAddresses(null, null);
|
IpAddresses addrs = new IpAddresses(null, null);
|
||||||
@ -1763,20 +1798,20 @@ public class AutoScaleManagerImpl extends ManagerBase implements AutoScaleManage
|
|||||||
if (zone.getNetworkType() == NetworkType.Basic) {
|
if (zone.getNetworkType() == NetworkType.Basic) {
|
||||||
vm = userVmService.createBasicSecurityGroupVirtualMachine(zone, serviceOffering, template, null, owner, vmHostName,
|
vm = userVmService.createBasicSecurityGroupVirtualMachine(zone, serviceOffering, template, null, owner, vmHostName,
|
||||||
vmHostName, diskOfferingId, dataDiskSize, null,
|
vmHostName, diskOfferingId, dataDiskSize, null,
|
||||||
hypervisorType, HTTPMethod.GET, userData, null, null, sshKeyPairs,
|
hypervisorType, HTTPMethod.GET, userData, userDataId, userDataDetails, sshKeyPairs,
|
||||||
null, null, true, null, affinityGroupIdList, customParameters, null, null, null,
|
null, null, true, null, affinityGroupIdList, customParameters, null, null, null,
|
||||||
null, true, overrideDiskOfferingId);
|
null, true, overrideDiskOfferingId);
|
||||||
} else {
|
} else {
|
||||||
if (zone.isSecurityGroupEnabled()) {
|
if (zone.isSecurityGroupEnabled()) {
|
||||||
vm = userVmService.createAdvancedSecurityGroupVirtualMachine(zone, serviceOffering, template, networkIds, null,
|
vm = userVmService.createAdvancedSecurityGroupVirtualMachine(zone, serviceOffering, template, networkIds, null,
|
||||||
owner, vmHostName,vmHostName, diskOfferingId, dataDiskSize, null,
|
owner, vmHostName,vmHostName, diskOfferingId, dataDiskSize, null,
|
||||||
hypervisorType, HTTPMethod.GET, userData, null, null, sshKeyPairs,
|
hypervisorType, HTTPMethod.GET, userData, userDataId, userDataDetails, sshKeyPairs,
|
||||||
null, null, true, null, affinityGroupIdList, customParameters, null, null, null,
|
null, null, true, null, affinityGroupIdList, customParameters, null, null, null,
|
||||||
null, true, overrideDiskOfferingId, null);
|
null, true, overrideDiskOfferingId, null);
|
||||||
} else {
|
} else {
|
||||||
vm = userVmService.createAdvancedVirtualMachine(zone, serviceOffering, template, networkIds, owner, vmHostName, vmHostName,
|
vm = userVmService.createAdvancedVirtualMachine(zone, serviceOffering, template, networkIds, owner, vmHostName, vmHostName,
|
||||||
diskOfferingId, dataDiskSize, null,
|
diskOfferingId, dataDiskSize, null,
|
||||||
hypervisorType, HTTPMethod.GET, userData, null, null, sshKeyPairs,
|
hypervisorType, HTTPMethod.GET, userData, userDataId, userDataDetails, sshKeyPairs,
|
||||||
null, addrs, true, null, affinityGroupIdList, customParameters, null, null, null,
|
null, addrs, true, null, affinityGroupIdList, customParameters, null, null, null,
|
||||||
null, true, null, overrideDiskOfferingId);
|
null, true, null, overrideDiskOfferingId);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1071,7 +1071,7 @@ public class SecurityGroupManagerImpl extends ManagerBase implements SecurityGro
|
|||||||
} else {
|
} else {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
SecurityGroupRulesCmd cmd = generateRulesetCmd(vm.getInstanceName(), nic.getIPv4Address(), nic.getIPv6Address(), vm.getPrivateMacAddress(), vm.getId(),
|
SecurityGroupRulesCmd cmd = generateRulesetCmd(vm.getInstanceName(), nic.getIPv4Address(), nic.getIPv6Address(), nic.getMacAddress(), vm.getId(),
|
||||||
generateRulesetSignature(ingressRules, egressRules), seqnum, ingressRules, egressRules, nicSecIps);
|
generateRulesetSignature(ingressRules, egressRules), seqnum, ingressRules, egressRules, nicSecIps);
|
||||||
Commands cmds = new Commands(cmd);
|
Commands cmds = new Commands(cmd);
|
||||||
try {
|
try {
|
||||||
|
|||||||
@ -188,7 +188,7 @@ public class SecurityGroupManagerImpl2 extends SecurityGroupManagerImpl {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
SecurityGroupRulesCmd cmd =
|
SecurityGroupRulesCmd cmd =
|
||||||
generateRulesetCmd(vm.getInstanceName(), nic.getIPv4Address(), nic.getIPv6Address(), vm.getPrivateMacAddress(), vm.getId(), null, work.getLogsequenceNumber(),
|
generateRulesetCmd(vm.getInstanceName(), nic.getIPv4Address(), nic.getIPv6Address(), nic.getMacAddress(), vm.getId(), null, work.getLogsequenceNumber(),
|
||||||
ingressRules, egressRules, nicSecIps);
|
ingressRules, egressRules, nicSecIps);
|
||||||
cmd.setMsId(_serverId);
|
cmd.setMsId(_serverId);
|
||||||
if (s_logger.isDebugEnabled()) {
|
if (s_logger.isDebugEnabled()) {
|
||||||
|
|||||||
@ -1219,7 +1219,7 @@ public class TemplateManagerImpl extends ManagerBase implements TemplateManager,
|
|||||||
tmplt = _tmplFactory.getReadyBypassedTemplateOnPrimaryStore(isoId, poolId, hostId);
|
tmplt = _tmplFactory.getReadyBypassedTemplateOnPrimaryStore(isoId, poolId, hostId);
|
||||||
bypassed = true;
|
bypassed = true;
|
||||||
} else {
|
} else {
|
||||||
tmplt = _tmplFactory.getTemplate(isoId, DataStoreRole.Image, dcId);
|
tmplt = _tmplFactory.getReadyTemplateOnImageStore(isoId, dcId);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (tmplt == null || tmplt.getFormat() != ImageFormat.ISO) {
|
if (tmplt == null || tmplt.getFormat() != ImageFormat.ISO) {
|
||||||
|
|||||||
@ -3327,7 +3327,7 @@ public class AccountManagerImpl extends ManagerBase implements AccountManager, M
|
|||||||
protected UserTwoFactorAuthenticationSetupResponse disableTwoFactorAuthentication(Long userId, Account caller, Account owner) {
|
protected UserTwoFactorAuthenticationSetupResponse disableTwoFactorAuthentication(Long userId, Account caller, Account owner) {
|
||||||
UserVO userVO = null;
|
UserVO userVO = null;
|
||||||
if (userId != null) {
|
if (userId != null) {
|
||||||
userVO = validateUser(userId, caller.getDomainId());
|
userVO = validateUser(userId);
|
||||||
owner = _accountService.getActiveAccountById(userVO.getAccountId());
|
owner = _accountService.getActiveAccountById(userVO.getAccountId());
|
||||||
} else {
|
} else {
|
||||||
userId = CallContext.current().getCallingUserId();
|
userId = CallContext.current().getCallingUserId();
|
||||||
@ -3349,16 +3349,13 @@ public class AccountManagerImpl extends ManagerBase implements AccountManager, M
|
|||||||
return response;
|
return response;
|
||||||
}
|
}
|
||||||
|
|
||||||
private UserVO validateUser(Long userId, Long domainId) {
|
private UserVO validateUser(Long userId) {
|
||||||
UserVO user = null;
|
UserVO user = null;
|
||||||
if (userId != null) {
|
if (userId != null) {
|
||||||
user = _userDao.findById(userId);
|
user = _userDao.findById(userId);
|
||||||
if (user == null) {
|
if (user == null) {
|
||||||
throw new InvalidParameterValueException("Invalid user ID provided");
|
throw new InvalidParameterValueException("Invalid user ID provided");
|
||||||
}
|
}
|
||||||
if (_accountDao.findById(user.getAccountId()).getDomainId() != domainId) {
|
|
||||||
throw new InvalidParameterValueException("User doesn't belong to the specified account or domain");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return user;
|
return user;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -90,6 +90,10 @@ public interface UserVmManager extends UserVmService {
|
|||||||
|
|
||||||
void removeInstanceFromInstanceGroup(long vmId);
|
void removeInstanceFromInstanceGroup(long vmId);
|
||||||
|
|
||||||
|
String finalizeUserData(String userData, Long userDataId, VirtualMachineTemplate template);
|
||||||
|
|
||||||
|
String validateUserData(String userData, HTTPMethod httpmethod);
|
||||||
|
|
||||||
boolean isVMUsingLocalStorage(VMInstanceVO vm);
|
boolean isVMUsingLocalStorage(VMInstanceVO vm);
|
||||||
|
|
||||||
boolean expunge(UserVmVO vm);
|
boolean expunge(UserVmVO vm);
|
||||||
|
|||||||
@ -4779,6 +4779,56 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String validateUserData(String userData, HTTPMethod httpmethod) {
|
||||||
|
byte[] decodedUserData = null;
|
||||||
|
if (userData != null) {
|
||||||
|
|
||||||
|
if (userData.contains("%")) {
|
||||||
|
try {
|
||||||
|
userData = URLDecoder.decode(userData, "UTF-8");
|
||||||
|
} catch (UnsupportedEncodingException e) {
|
||||||
|
throw new InvalidParameterValueException("Url decoding of userdata failed.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!Base64.isBase64(userData)) {
|
||||||
|
throw new InvalidParameterValueException("User data is not base64 encoded");
|
||||||
|
}
|
||||||
|
// If GET, use 4K. If POST, support up to 1M.
|
||||||
|
if (httpmethod.equals(HTTPMethod.GET)) {
|
||||||
|
if (userData.length() >= MAX_HTTP_GET_LENGTH) {
|
||||||
|
throw new InvalidParameterValueException("User data is too long for an http GET request");
|
||||||
|
}
|
||||||
|
if (userData.length() > VM_USERDATA_MAX_LENGTH.value()) {
|
||||||
|
throw new InvalidParameterValueException("User data has exceeded configurable max length : " + VM_USERDATA_MAX_LENGTH.value());
|
||||||
|
}
|
||||||
|
decodedUserData = Base64.decodeBase64(userData.getBytes());
|
||||||
|
if (decodedUserData.length > MAX_HTTP_GET_LENGTH) {
|
||||||
|
throw new InvalidParameterValueException("User data is too long for GET request");
|
||||||
|
}
|
||||||
|
} else if (httpmethod.equals(HTTPMethod.POST)) {
|
||||||
|
if (userData.length() >= MAX_HTTP_POST_LENGTH) {
|
||||||
|
throw new InvalidParameterValueException("User data is too long for an http POST request");
|
||||||
|
}
|
||||||
|
if (userData.length() > VM_USERDATA_MAX_LENGTH.value()) {
|
||||||
|
throw new InvalidParameterValueException("User data has exceeded configurable max length : " + VM_USERDATA_MAX_LENGTH.value());
|
||||||
|
}
|
||||||
|
decodedUserData = Base64.decodeBase64(userData.getBytes());
|
||||||
|
if (decodedUserData.length > MAX_HTTP_POST_LENGTH) {
|
||||||
|
throw new InvalidParameterValueException("User data is too long for POST request");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (decodedUserData == null || decodedUserData.length < 1) {
|
||||||
|
throw new InvalidParameterValueException("User data is too short");
|
||||||
|
}
|
||||||
|
// Re-encode so that the '=' paddings are added if necessary since 'isBase64' does not require it, but python does on the VR.
|
||||||
|
return Base64.encodeBase64String(decodedUserData);
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ActionEvent(eventType = EventTypes.EVENT_VM_CREATE, eventDescription = "deploying Vm", async = true)
|
@ActionEvent(eventType = EventTypes.EVENT_VM_CREATE, eventDescription = "deploying Vm", async = true)
|
||||||
public UserVm startVirtualMachine(DeployVMCmd cmd) throws ResourceUnavailableException, InsufficientCapacityException, ConcurrentOperationException, ResourceAllocationException {
|
public UserVm startVirtualMachine(DeployVMCmd cmd) throws ResourceUnavailableException, InsufficientCapacityException, ConcurrentOperationException, ResourceAllocationException {
|
||||||
@ -5677,7 +5727,8 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir
|
|||||||
return userVm.getHypervisorType();
|
return userVm.getHypervisorType();
|
||||||
}
|
}
|
||||||
|
|
||||||
protected String finalizeUserData(String userData, Long userDataId, VirtualMachineTemplate template) {
|
@Override
|
||||||
|
public String finalizeUserData(String userData, Long userDataId, VirtualMachineTemplate template) {
|
||||||
if (StringUtils.isEmpty(userData) && userDataId == null && (template == null || template.getUserDataId() == null)) {
|
if (StringUtils.isEmpty(userData) && userDataId == null && (template == null || template.getUserDataId() == null)) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -32,6 +32,7 @@ import java.util.UUID;
|
|||||||
|
|
||||||
import org.apache.cloudstack.annotation.dao.AnnotationDao;
|
import org.apache.cloudstack.annotation.dao.AnnotationDao;
|
||||||
import org.apache.cloudstack.api.response.AutoScaleVmGroupResponse;
|
import org.apache.cloudstack.api.response.AutoScaleVmGroupResponse;
|
||||||
|
import org.apache.cloudstack.api.response.AutoScaleVmProfileResponse;
|
||||||
import org.apache.cloudstack.api.response.DirectDownloadCertificateResponse;
|
import org.apache.cloudstack.api.response.DirectDownloadCertificateResponse;
|
||||||
import org.apache.cloudstack.api.response.NicSecondaryIpResponse;
|
import org.apache.cloudstack.api.response.NicSecondaryIpResponse;
|
||||||
import org.apache.cloudstack.api.response.UsageRecordResponse;
|
import org.apache.cloudstack.api.response.UsageRecordResponse;
|
||||||
@ -52,17 +53,22 @@ import org.powermock.modules.junit4.PowerMockRunner;
|
|||||||
import com.cloud.domain.DomainVO;
|
import com.cloud.domain.DomainVO;
|
||||||
import com.cloud.network.as.AutoScaleVmGroup;
|
import com.cloud.network.as.AutoScaleVmGroup;
|
||||||
import com.cloud.network.as.AutoScaleVmGroupVO;
|
import com.cloud.network.as.AutoScaleVmGroupVO;
|
||||||
|
import com.cloud.network.as.AutoScaleVmProfileVO;
|
||||||
import com.cloud.network.as.dao.AutoScaleVmGroupVmMapDao;
|
import com.cloud.network.as.dao.AutoScaleVmGroupVmMapDao;
|
||||||
import com.cloud.network.dao.IPAddressVO;
|
import com.cloud.network.dao.IPAddressVO;
|
||||||
import com.cloud.network.dao.LoadBalancerVO;
|
import com.cloud.network.dao.LoadBalancerVO;
|
||||||
import com.cloud.network.dao.NetworkServiceMapDao;
|
import com.cloud.network.dao.NetworkServiceMapDao;
|
||||||
import com.cloud.network.dao.NetworkVO;
|
import com.cloud.network.dao.NetworkVO;
|
||||||
|
import com.cloud.storage.VMTemplateVO;
|
||||||
import com.cloud.usage.UsageVO;
|
import com.cloud.usage.UsageVO;
|
||||||
import com.cloud.user.Account;
|
import com.cloud.user.Account;
|
||||||
import com.cloud.user.AccountManager;
|
import com.cloud.user.AccountManager;
|
||||||
import com.cloud.user.AccountVO;
|
import com.cloud.user.AccountVO;
|
||||||
import com.cloud.user.User;
|
import com.cloud.user.User;
|
||||||
|
import com.cloud.user.UserData;
|
||||||
|
import com.cloud.user.UserDataVO;
|
||||||
import com.cloud.user.UserVO;
|
import com.cloud.user.UserVO;
|
||||||
|
import com.cloud.user.dao.UserDataDao;
|
||||||
import com.cloud.utils.net.Ip;
|
import com.cloud.utils.net.Ip;
|
||||||
import com.cloud.vm.NicSecondaryIp;
|
import com.cloud.vm.NicSecondaryIp;
|
||||||
|
|
||||||
@ -86,12 +92,27 @@ public class ApiResponseHelperTest {
|
|||||||
@Mock
|
@Mock
|
||||||
AutoScaleVmGroupVmMapDao autoScaleVmGroupVmMapDaoMock;
|
AutoScaleVmGroupVmMapDao autoScaleVmGroupVmMapDaoMock;
|
||||||
|
|
||||||
|
@Mock
|
||||||
|
UserDataDao userDataDaoMock;
|
||||||
|
|
||||||
@Spy
|
@Spy
|
||||||
@InjectMocks
|
@InjectMocks
|
||||||
ApiResponseHelper apiResponseHelper = new ApiResponseHelper();
|
ApiResponseHelper apiResponseHelper = new ApiResponseHelper();
|
||||||
|
|
||||||
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss ZZZ");
|
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss ZZZ");
|
||||||
|
|
||||||
|
static long zoneId = 1L;
|
||||||
|
static long domainId = 2L;
|
||||||
|
static long accountId = 3L;
|
||||||
|
static long serviceOfferingId = 4L;
|
||||||
|
static long templateId = 5L;
|
||||||
|
static String userdata = "userdata";
|
||||||
|
static long userdataId = 6L;
|
||||||
|
static String userdataDetails = "userdataDetails";
|
||||||
|
static String userdataNew = "userdataNew";
|
||||||
|
|
||||||
|
static long autoScaleUserId = 7L;
|
||||||
|
|
||||||
@Before
|
@Before
|
||||||
public void injectMocks() throws SecurityException, NoSuchFieldException,
|
public void injectMocks() throws SecurityException, NoSuchFieldException,
|
||||||
IllegalArgumentException, IllegalAccessException {
|
IllegalArgumentException, IllegalAccessException {
|
||||||
@ -297,4 +318,55 @@ public class ApiResponseHelperTest {
|
|||||||
assertEquals("8080", response.getPublicPort());
|
assertEquals("8080", response.getPublicPort());
|
||||||
assertEquals("8081", response.getPrivatePort());
|
assertEquals("8081", response.getPrivatePort());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@PrepareForTest(ApiDBUtils.class)
|
||||||
|
public void testAutoScaleVmProfileResponse() {
|
||||||
|
AutoScaleVmProfileVO vmProfile = new AutoScaleVmProfileVO(zoneId, domainId, accountId, serviceOfferingId, templateId, null, null, userdata, null, autoScaleUserId);
|
||||||
|
vmProfile.setUserDataId(userdataId);
|
||||||
|
vmProfile.setUserDataDetails(userdataDetails);
|
||||||
|
|
||||||
|
PowerMockito.mockStatic(ApiDBUtils.class);
|
||||||
|
when(ApiDBUtils.findAccountById(anyLong())).thenReturn(new AccountVO());
|
||||||
|
when(ApiDBUtils.findDomainById(anyLong())).thenReturn(new DomainVO());
|
||||||
|
|
||||||
|
UserData.UserDataOverridePolicy templatePolicy = UserData.UserDataOverridePolicy.APPEND;
|
||||||
|
VMTemplateVO templateVO = Mockito.mock(VMTemplateVO.class);
|
||||||
|
when(ApiDBUtils.findTemplateById(anyLong())).thenReturn(templateVO);
|
||||||
|
when(templateVO.getUserDataOverridePolicy()).thenReturn(templatePolicy);
|
||||||
|
|
||||||
|
UserDataVO userDataVO = Mockito.mock(UserDataVO.class);
|
||||||
|
String userDataUuid = "userDataUuid";
|
||||||
|
String userDataName = "userDataName";
|
||||||
|
when(userDataDaoMock.findById(anyLong())).thenReturn(userDataVO);
|
||||||
|
when(userDataVO.getUuid()).thenReturn(userDataUuid);
|
||||||
|
when(userDataVO.getName()).thenReturn(userDataName);
|
||||||
|
|
||||||
|
AutoScaleVmProfileResponse response = apiResponseHelper.createAutoScaleVmProfileResponse(vmProfile);
|
||||||
|
assertEquals(templatePolicy.toString(), response.getUserDataPolicy());
|
||||||
|
assertEquals(userdata, response.getUserData());
|
||||||
|
assertEquals(userDataUuid, response.getUserDataId());
|
||||||
|
assertEquals(userDataName, response.getUserDataName());
|
||||||
|
assertEquals(userdataDetails, response.getUserDataDetails());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@PrepareForTest(ApiDBUtils.class)
|
||||||
|
public void testAutoScaleVmProfileResponseWithoutUserData() {
|
||||||
|
AutoScaleVmProfileVO vmProfile = new AutoScaleVmProfileVO(zoneId, domainId, accountId, serviceOfferingId, templateId, null, null, null, null, autoScaleUserId);
|
||||||
|
|
||||||
|
PowerMockito.mockStatic(ApiDBUtils.class);
|
||||||
|
when(ApiDBUtils.findAccountById(anyLong())).thenReturn(new AccountVO());
|
||||||
|
when(ApiDBUtils.findDomainById(anyLong())).thenReturn(new DomainVO());
|
||||||
|
|
||||||
|
VMTemplateVO templateVO = Mockito.mock(VMTemplateVO.class);
|
||||||
|
when(ApiDBUtils.findTemplateById(anyLong())).thenReturn(templateVO);
|
||||||
|
|
||||||
|
AutoScaleVmProfileResponse response = apiResponseHelper.createAutoScaleVmProfileResponse(vmProfile);
|
||||||
|
assertNull(response.getUserDataPolicy());
|
||||||
|
assertNull(response.getUserData());
|
||||||
|
assertNull(response.getUserDataId());
|
||||||
|
assertNull(response.getUserDataName());
|
||||||
|
assertNull(response.getUserDataDetails());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -47,6 +47,7 @@ import org.apache.cloudstack.affinity.dao.AffinityGroupDao;
|
|||||||
import org.apache.cloudstack.annotation.AnnotationService;
|
import org.apache.cloudstack.annotation.AnnotationService;
|
||||||
import org.apache.cloudstack.annotation.dao.AnnotationDao;
|
import org.apache.cloudstack.annotation.dao.AnnotationDao;
|
||||||
import org.apache.cloudstack.api.ApiConstants;
|
import org.apache.cloudstack.api.ApiConstants;
|
||||||
|
import org.apache.cloudstack.api.BaseCmd;
|
||||||
import org.apache.cloudstack.api.command.admin.autoscale.CreateCounterCmd;
|
import org.apache.cloudstack.api.command.admin.autoscale.CreateCounterCmd;
|
||||||
import org.apache.cloudstack.api.command.user.autoscale.CreateAutoScalePolicyCmd;
|
import org.apache.cloudstack.api.command.user.autoscale.CreateAutoScalePolicyCmd;
|
||||||
import org.apache.cloudstack.api.command.user.autoscale.CreateAutoScaleVmGroupCmd;
|
import org.apache.cloudstack.api.command.user.autoscale.CreateAutoScaleVmGroupCmd;
|
||||||
@ -340,6 +341,10 @@ public class AutoScaleManagerImplTest {
|
|||||||
private static final Long scaleDownCounterId = 38L;
|
private static final Long scaleDownCounterId = 38L;
|
||||||
private static final Long nextVmSeq = 39L;
|
private static final Long nextVmSeq = 39L;
|
||||||
private static final Long networkOfferingId = 40L;
|
private static final Long networkOfferingId = 40L;
|
||||||
|
private static final String userData = "VGVzdFVzZXJEYXRh"; //TestUserData
|
||||||
|
private static final Long userDataId = 41L;
|
||||||
|
private static final Map<String, HashMap<String, String>> userDataDetails = new HashMap<>();
|
||||||
|
private static final String userDataFinal = "VGVzdFVzZXJEYXRhRmluYWw="; //TestUserDataFinal
|
||||||
|
|
||||||
@Mock
|
@Mock
|
||||||
DataCenterVO zoneMock;
|
DataCenterVO zoneMock;
|
||||||
@ -404,6 +409,10 @@ public class AutoScaleManagerImplTest {
|
|||||||
Mockito.doNothing().when(accountManager).checkAccess(Mockito.any(Account.class), Mockito.isNull(), Mockito.anyBoolean(), Mockito.any());
|
Mockito.doNothing().when(accountManager).checkAccess(Mockito.any(Account.class), Mockito.isNull(), Mockito.anyBoolean(), Mockito.any());
|
||||||
|
|
||||||
when(asPolicyDao.persist(any(AutoScalePolicyVO.class))).thenReturn(asScaleUpPolicyMock);
|
when(asPolicyDao.persist(any(AutoScalePolicyVO.class))).thenReturn(asScaleUpPolicyMock);
|
||||||
|
|
||||||
|
userDataDetails.put("0", new HashMap<>() {{ put("key1", "value1"); put("key2", "value2"); }});
|
||||||
|
Mockito.doReturn(userDataFinal).when(userVmMgr).finalizeUserData(any(), any(), any());
|
||||||
|
Mockito.doReturn(userDataFinal).when(userVmMgr).validateUserData(eq(userDataFinal), nullable(BaseCmd.HTTPMethod.class));
|
||||||
}
|
}
|
||||||
|
|
||||||
@After
|
@After
|
||||||
@ -748,10 +757,48 @@ public class AutoScaleManagerImplTest {
|
|||||||
ReflectionTestUtils.setField(cmd, "otherDeployParams", otherDeployParams);
|
ReflectionTestUtils.setField(cmd, "otherDeployParams", otherDeployParams);
|
||||||
ReflectionTestUtils.setField(cmd, "counterParamList", counterParamList);
|
ReflectionTestUtils.setField(cmd, "counterParamList", counterParamList);
|
||||||
|
|
||||||
|
ReflectionTestUtils.setField(cmd, "userData", userData);
|
||||||
|
ReflectionTestUtils.setField(cmd, "userDataId", userDataId);
|
||||||
|
ReflectionTestUtils.setField(cmd, "userDataDetails", userDataDetails);
|
||||||
|
|
||||||
AutoScaleVmProfile vmProfile = autoScaleManagerImplSpy.createAutoScaleVmProfile(cmd);
|
AutoScaleVmProfile vmProfile = autoScaleManagerImplSpy.createAutoScaleVmProfile(cmd);
|
||||||
|
|
||||||
Assert.assertEquals(asVmProfileMock, vmProfile);
|
Assert.assertEquals(asVmProfileMock, vmProfile);
|
||||||
Mockito.verify(autoScaleVmProfileDao).persist(Mockito.any());
|
Mockito.verify(autoScaleVmProfileDao).persist(Mockito.any());
|
||||||
|
|
||||||
|
Mockito.verify(userVmMgr).finalizeUserData(any(), any(), any());
|
||||||
|
Mockito.verify(userVmMgr).validateUserData(eq(userDataFinal), nullable(BaseCmd.HTTPMethod.class));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test(expected = InvalidParameterValueException.class)
|
||||||
|
@PrepareForTest(ComponentContext.class)
|
||||||
|
public void testCreateAutoScaleVmProfileFail() {
|
||||||
|
when(entityManager.findById(DataCenter.class, zoneId)).thenReturn(zoneMock);
|
||||||
|
when(entityManager.findById(ServiceOffering.class, serviceOfferingId)).thenReturn(serviceOfferingMock);
|
||||||
|
when(entityManager.findByIdIncludingRemoved(ServiceOffering.class, serviceOfferingId)).thenReturn(serviceOfferingMock);
|
||||||
|
when(entityManager.findById(VirtualMachineTemplate.class, templateId)).thenReturn(templateMock);
|
||||||
|
when(serviceOfferingMock.isDynamic()).thenReturn(false);
|
||||||
|
Mockito.doThrow(InvalidParameterValueException.class).when(userVmMgr).finalizeUserData(any(), any(), any());
|
||||||
|
|
||||||
|
DispatchChain dispatchChainMock = Mockito.mock(DispatchChain.class);
|
||||||
|
when(dispatchChainFactory.getStandardDispatchChain()).thenReturn(dispatchChainMock);
|
||||||
|
Mockito.doNothing().when(dispatchChainMock).dispatch(any());
|
||||||
|
PowerMockito.mockStatic(ComponentContext.class);
|
||||||
|
when(ComponentContext.inject(DeployVMCmd.class)).thenReturn(Mockito.mock(DeployVMCmd.class));
|
||||||
|
|
||||||
|
CreateAutoScaleVmProfileCmd cmd = new CreateAutoScaleVmProfileCmd();
|
||||||
|
|
||||||
|
ReflectionTestUtils.setField(cmd, "zoneId", zoneId);
|
||||||
|
ReflectionTestUtils.setField(cmd, "serviceOfferingId", serviceOfferingId);
|
||||||
|
ReflectionTestUtils.setField(cmd, "templateId", templateId);
|
||||||
|
ReflectionTestUtils.setField(cmd, "expungeVmGracePeriod", expungeVmGracePeriod);
|
||||||
|
ReflectionTestUtils.setField(cmd, "otherDeployParams", otherDeployParams);
|
||||||
|
ReflectionTestUtils.setField(cmd, "counterParamList", counterParamList);
|
||||||
|
|
||||||
|
ReflectionTestUtils.setField(cmd, "userData", userData);
|
||||||
|
ReflectionTestUtils.setField(cmd, "userDataId", userDataId);
|
||||||
|
|
||||||
|
AutoScaleVmProfile vmProfile = autoScaleManagerImplSpy.createAutoScaleVmProfile(cmd);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@ -774,10 +821,17 @@ public class AutoScaleManagerImplTest {
|
|||||||
ReflectionTestUtils.setField(cmd, "serviceOfferingId", serviceOfferingId);
|
ReflectionTestUtils.setField(cmd, "serviceOfferingId", serviceOfferingId);
|
||||||
ReflectionTestUtils.setField(cmd, "templateId", templateId);
|
ReflectionTestUtils.setField(cmd, "templateId", templateId);
|
||||||
|
|
||||||
|
ReflectionTestUtils.setField(cmd, "userData", userData);
|
||||||
|
ReflectionTestUtils.setField(cmd, "userDataId", userDataId);
|
||||||
|
ReflectionTestUtils.setField(cmd, "userDataDetails", userDataDetails);
|
||||||
|
|
||||||
AutoScaleVmProfile vmProfile = autoScaleManagerImplSpy.updateAutoScaleVmProfile(cmd);
|
AutoScaleVmProfile vmProfile = autoScaleManagerImplSpy.updateAutoScaleVmProfile(cmd);
|
||||||
|
|
||||||
Assert.assertEquals(asVmProfileMock, vmProfile);
|
Assert.assertEquals(asVmProfileMock, vmProfile);
|
||||||
Mockito.verify(autoScaleVmProfileDao).persist(Mockito.any());
|
Mockito.verify(autoScaleVmProfileDao).persist(Mockito.any());
|
||||||
|
|
||||||
|
Mockito.verify(userVmMgr).finalizeUserData(any(), any(), any());
|
||||||
|
Mockito.verify(userVmMgr).validateUserData(eq(userDataFinal), nullable(BaseCmd.HTTPMethod.class));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@ -1208,6 +1262,9 @@ public class AutoScaleManagerImplTest {
|
|||||||
when(asVmProfileMock.getAccountId()).thenReturn(accountId);
|
when(asVmProfileMock.getAccountId()).thenReturn(accountId);
|
||||||
when(asVmProfileMock.getZoneId()).thenReturn(zoneId);
|
when(asVmProfileMock.getZoneId()).thenReturn(zoneId);
|
||||||
when(asVmProfileMock.getOtherDeployParams()).thenReturn("");
|
when(asVmProfileMock.getOtherDeployParams()).thenReturn("");
|
||||||
|
when(asVmProfileMock.getUserData()).thenReturn(userData);
|
||||||
|
when(asVmProfileMock.getUserDataId()).thenReturn(userDataId);
|
||||||
|
when(asVmProfileMock.getUserDataDetails()).thenReturn(userDataDetails.toString());
|
||||||
|
|
||||||
when(accountService.getActiveAccountById(accountId)).thenReturn(account);
|
when(accountService.getActiveAccountById(accountId)).thenReturn(account);
|
||||||
when(entityManager.findById(DataCenter.class, zoneId)).thenReturn(zoneMock);
|
when(entityManager.findById(DataCenter.class, zoneId)).thenReturn(zoneMock);
|
||||||
@ -1224,7 +1281,7 @@ public class AutoScaleManagerImplTest {
|
|||||||
when(userVmMock.getId()).thenReturn(virtualMachineId);
|
when(userVmMock.getId()).thenReturn(virtualMachineId);
|
||||||
when(zoneMock.getNetworkType()).thenReturn(DataCenter.NetworkType.Basic);
|
when(zoneMock.getNetworkType()).thenReturn(DataCenter.NetworkType.Basic);
|
||||||
when(userVmService.createBasicSecurityGroupVirtualMachine(any(), any(), any(), any(), any(), any(), any(),
|
when(userVmService.createBasicSecurityGroupVirtualMachine(any(), any(), any(), any(), any(), any(), any(),
|
||||||
any(), any(), any(), any(), any(), any(), any(), any(), any(), any(), any(), eq(true), any(), any(), any(),
|
any(), any(), any(), any(), any(), eq(userData), eq(userDataId), eq(userDataDetails.toString()), any(), any(), any(), eq(true), any(), any(), any(),
|
||||||
any(), any(), any(), any(), eq(true), any())).thenReturn(userVmMock);
|
any(), any(), any(), any(), eq(true), any())).thenReturn(userVmMock);
|
||||||
|
|
||||||
long result = autoScaleManagerImplSpy.createNewVM(asVmGroupMock);
|
long result = autoScaleManagerImplSpy.createNewVM(asVmGroupMock);
|
||||||
@ -1235,7 +1292,7 @@ public class AutoScaleManagerImplTest {
|
|||||||
"-" + asVmGroupMock.getNextVmSeq() + "-[a-z]{6}";
|
"-" + asVmGroupMock.getNextVmSeq() + "-[a-z]{6}";
|
||||||
Mockito.verify(userVmService).createBasicSecurityGroupVirtualMachine(any(), any(), any(), any(), any(),
|
Mockito.verify(userVmService).createBasicSecurityGroupVirtualMachine(any(), any(), any(), any(), any(),
|
||||||
matches(vmHostNamePattern), matches(vmHostNamePattern),
|
matches(vmHostNamePattern), matches(vmHostNamePattern),
|
||||||
any(), any(), any(), any(), any(), any(), any(), any(), any(), any(), any(), eq(true), any(), any(), any(),
|
any(), any(), any(), any(), any(), eq(userData), eq(userDataId), eq(userDataDetails.toString()), any(), any(), any(), eq(true), any(), any(), any(),
|
||||||
any(), any(), any(), any(), eq(true), any());
|
any(), any(), any(), any(), eq(true), any());
|
||||||
Mockito.verify(asVmGroupMock).setNextVmSeq(nextVmSeq + 1);
|
Mockito.verify(asVmGroupMock).setNextVmSeq(nextVmSeq + 1);
|
||||||
}
|
}
|
||||||
@ -1253,6 +1310,9 @@ public class AutoScaleManagerImplTest {
|
|||||||
when(asVmProfileMock.getAccountId()).thenReturn(accountId);
|
when(asVmProfileMock.getAccountId()).thenReturn(accountId);
|
||||||
when(asVmProfileMock.getZoneId()).thenReturn(zoneId);
|
when(asVmProfileMock.getZoneId()).thenReturn(zoneId);
|
||||||
when(asVmProfileMock.getOtherDeployParams()).thenReturn("");
|
when(asVmProfileMock.getOtherDeployParams()).thenReturn("");
|
||||||
|
when(asVmProfileMock.getUserData()).thenReturn(userData);
|
||||||
|
when(asVmProfileMock.getUserDataId()).thenReturn(userDataId);
|
||||||
|
when(asVmProfileMock.getUserDataDetails()).thenReturn(userDataDetails.toString());
|
||||||
|
|
||||||
when(accountService.getActiveAccountById(accountId)).thenReturn(account);
|
when(accountService.getActiveAccountById(accountId)).thenReturn(account);
|
||||||
when(entityManager.findById(DataCenter.class, zoneId)).thenReturn(zoneMock);
|
when(entityManager.findById(DataCenter.class, zoneId)).thenReturn(zoneMock);
|
||||||
@ -1270,7 +1330,7 @@ public class AutoScaleManagerImplTest {
|
|||||||
when(zoneMock.getNetworkType()).thenReturn(DataCenter.NetworkType.Advanced);
|
when(zoneMock.getNetworkType()).thenReturn(DataCenter.NetworkType.Advanced);
|
||||||
when(zoneMock.isSecurityGroupEnabled()).thenReturn(true);
|
when(zoneMock.isSecurityGroupEnabled()).thenReturn(true);
|
||||||
when(userVmService.createAdvancedSecurityGroupVirtualMachine(any(), any(), any(), any(), any(), any(), any(),
|
when(userVmService.createAdvancedSecurityGroupVirtualMachine(any(), any(), any(), any(), any(), any(), any(),
|
||||||
any(), any(), any(), any(), any(), any(), any(), any(), any(), any(), any(), any(), any(), any(), any(),
|
any(), any(), any(), any(), any(), any(), eq(userData), eq(userDataId), eq(userDataDetails.toString()), any(), any(), any(), any(), any(), any(),
|
||||||
any(), any(), any(), any(), any(), eq(true), any(), any())).thenReturn(userVmMock);
|
any(), any(), any(), any(), any(), eq(true), any(), any())).thenReturn(userVmMock);
|
||||||
|
|
||||||
long result = autoScaleManagerImplSpy.createNewVM(asVmGroupMock);
|
long result = autoScaleManagerImplSpy.createNewVM(asVmGroupMock);
|
||||||
@ -1281,7 +1341,7 @@ public class AutoScaleManagerImplTest {
|
|||||||
"-" + asVmGroupMock.getNextVmSeq() + "-[a-z]{6}";
|
"-" + asVmGroupMock.getNextVmSeq() + "-[a-z]{6}";
|
||||||
Mockito.verify(userVmService).createAdvancedSecurityGroupVirtualMachine(any(), any(), any(), any(), any(), any(),
|
Mockito.verify(userVmService).createAdvancedSecurityGroupVirtualMachine(any(), any(), any(), any(), any(), any(),
|
||||||
matches(vmHostNamePattern), matches(vmHostNamePattern),
|
matches(vmHostNamePattern), matches(vmHostNamePattern),
|
||||||
any(), any(), any(), any(), any(), any(), any(), any(), any(), any(), any(), any(), any(), any(),
|
any(), any(), any(), any(), any(), eq(userData), eq(userDataId), eq(userDataDetails.toString()), any(), any(), any(), any(), any(), any(),
|
||||||
any(), any(), any(), any(), any(), eq(true), any(), any());
|
any(), any(), any(), any(), any(), eq(true), any(), any());
|
||||||
Mockito.verify(asVmGroupMock).setNextVmSeq(nextVmSeq + 2);
|
Mockito.verify(asVmGroupMock).setNextVmSeq(nextVmSeq + 2);
|
||||||
}
|
}
|
||||||
@ -1299,6 +1359,9 @@ public class AutoScaleManagerImplTest {
|
|||||||
when(asVmProfileMock.getAccountId()).thenReturn(accountId);
|
when(asVmProfileMock.getAccountId()).thenReturn(accountId);
|
||||||
when(asVmProfileMock.getZoneId()).thenReturn(zoneId);
|
when(asVmProfileMock.getZoneId()).thenReturn(zoneId);
|
||||||
when(asVmProfileMock.getOtherDeployParams()).thenReturn("");
|
when(asVmProfileMock.getOtherDeployParams()).thenReturn("");
|
||||||
|
when(asVmProfileMock.getUserData()).thenReturn(userData);
|
||||||
|
when(asVmProfileMock.getUserDataId()).thenReturn(userDataId);
|
||||||
|
when(asVmProfileMock.getUserDataDetails()).thenReturn(userDataDetails.toString());
|
||||||
|
|
||||||
when(accountService.getActiveAccountById(accountId)).thenReturn(account);
|
when(accountService.getActiveAccountById(accountId)).thenReturn(account);
|
||||||
when(entityManager.findById(DataCenter.class, zoneId)).thenReturn(zoneMock);
|
when(entityManager.findById(DataCenter.class, zoneId)).thenReturn(zoneMock);
|
||||||
@ -1316,7 +1379,7 @@ public class AutoScaleManagerImplTest {
|
|||||||
when(zoneMock.getNetworkType()).thenReturn(DataCenter.NetworkType.Advanced);
|
when(zoneMock.getNetworkType()).thenReturn(DataCenter.NetworkType.Advanced);
|
||||||
when(zoneMock.isSecurityGroupEnabled()).thenReturn(false);
|
when(zoneMock.isSecurityGroupEnabled()).thenReturn(false);
|
||||||
when(userVmService.createAdvancedVirtualMachine(any(), any(), any(), any(), any(), any(), any(),
|
when(userVmService.createAdvancedVirtualMachine(any(), any(), any(), any(), any(), any(), any(),
|
||||||
any(), any(), any(), any(), any(), any(), any(), any(), any(), any(), any(), eq(true), any(), any(), any(),
|
any(), any(), any(), any(), any(), eq(userData), eq(userDataId), eq(userDataDetails.toString()), any(), any(), any(), eq(true), any(), any(), any(),
|
||||||
any(), any(), any(), any(), eq(true), any(), any())).thenReturn(userVmMock);
|
any(), any(), any(), any(), eq(true), any(), any())).thenReturn(userVmMock);
|
||||||
|
|
||||||
long result = autoScaleManagerImplSpy.createNewVM(asVmGroupMock);
|
long result = autoScaleManagerImplSpy.createNewVM(asVmGroupMock);
|
||||||
@ -1327,7 +1390,7 @@ public class AutoScaleManagerImplTest {
|
|||||||
"-" + asVmGroupMock.getNextVmSeq() + "-[a-z]{6}";
|
"-" + asVmGroupMock.getNextVmSeq() + "-[a-z]{6}";
|
||||||
Mockito.verify(userVmService).createAdvancedVirtualMachine(any(), any(), any(), any(), any(),
|
Mockito.verify(userVmService).createAdvancedVirtualMachine(any(), any(), any(), any(), any(),
|
||||||
matches(vmHostNamePattern), matches(vmHostNamePattern),
|
matches(vmHostNamePattern), matches(vmHostNamePattern),
|
||||||
any(), any(), any(), any(), any(), any(), any(), any(), any(), any(), any(), eq(true), any(), any(), any(),
|
any(), any(), any(), any(), any(), eq(userData), eq(userDataId), eq(userDataDetails.toString()), any(), any(), any(), eq(true), any(), any(), any(),
|
||||||
any(), any(), any(), any(), eq(true), any(), any());
|
any(), any(), any(), any(), eq(true), any(), any());
|
||||||
Mockito.verify(asVmGroupMock).setNextVmSeq(nextVmSeq + 3);
|
Mockito.verify(asVmGroupMock).setNextVmSeq(nextVmSeq + 3);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -875,19 +875,17 @@ public class AccountManagerImplTest extends AccountManagetImplTestBase {
|
|||||||
@Test
|
@Test
|
||||||
public void testDisableUserTwoFactorAuthentication() {
|
public void testDisableUserTwoFactorAuthentication() {
|
||||||
Long userId = 1L;
|
Long userId = 1L;
|
||||||
|
Long accountId = 2L;
|
||||||
|
|
||||||
UserVO userVO = Mockito.mock(UserVO.class);
|
UserVO userVO = Mockito.mock(UserVO.class);
|
||||||
Account caller = Mockito.mock(Account.class);
|
Account caller = Mockito.mock(Account.class);
|
||||||
|
Account owner = Mockito.mock(Account.class);
|
||||||
|
|
||||||
AccountVO accountMock = Mockito.mock(AccountVO.class);
|
|
||||||
Mockito.doNothing().when(accountManagerImpl).checkAccess(nullable(Account.class), Mockito.isNull(), nullable(Boolean.class), nullable(Account.class));
|
Mockito.doNothing().when(accountManagerImpl).checkAccess(nullable(Account.class), Mockito.isNull(), nullable(Boolean.class), nullable(Account.class));
|
||||||
|
|
||||||
Mockito.when(caller.getDomainId()).thenReturn(1L);
|
|
||||||
Mockito.when(userDaoMock.findById(userId)).thenReturn(userVO);
|
Mockito.when(userDaoMock.findById(userId)).thenReturn(userVO);
|
||||||
Mockito.when(userVO.getAccountId()).thenReturn(1L);
|
Mockito.when(userVO.getAccountId()).thenReturn(accountId);
|
||||||
Mockito.when(_accountDao.findById(1L)).thenReturn(accountMock);
|
Mockito.when(_accountService.getActiveAccountById(accountId)).thenReturn(owner);
|
||||||
Mockito.when(accountMock.getDomainId()).thenReturn(1L);
|
|
||||||
Mockito.when(_accountService.getActiveAccountById(1L)).thenReturn(caller);
|
|
||||||
|
|
||||||
userVoMock.setKeyFor2fa("EUJEAEDVOURFZTE6OGWVTJZMI54QGMIL");
|
userVoMock.setKeyFor2fa("EUJEAEDVOURFZTE6OGWVTJZMI54QGMIL");
|
||||||
userVoMock.setUser2faProvider("totp");
|
userVoMock.setUser2faProvider("totp");
|
||||||
@ -895,8 +893,9 @@ public class AccountManagerImplTest extends AccountManagetImplTestBase {
|
|||||||
|
|
||||||
Mockito.when(userDaoMock.createForUpdate()).thenReturn(userVoMock);
|
Mockito.when(userDaoMock.createForUpdate()).thenReturn(userVoMock);
|
||||||
|
|
||||||
UserTwoFactorAuthenticationSetupResponse response = accountManagerImpl.disableTwoFactorAuthentication(userId, caller, caller);
|
UserTwoFactorAuthenticationSetupResponse response = accountManagerImpl.disableTwoFactorAuthentication(userId, caller, owner);
|
||||||
|
|
||||||
|
Mockito.verify(accountManagerImpl).checkAccess(caller, null, true, owner);
|
||||||
Assert.assertNull(response.getSecretCode());
|
Assert.assertNull(response.getSecretCode());
|
||||||
Assert.assertNull(userVoMock.getKeyFor2fa());
|
Assert.assertNull(userVoMock.getKeyFor2fa());
|
||||||
Assert.assertNull(userVoMock.getUser2faProvider());
|
Assert.assertNull(userVoMock.getUser2faProvider());
|
||||||
|
|||||||
@ -113,30 +113,34 @@ public class ConsoleProxyNoVncClient implements ConsoleProxyClient {
|
|||||||
if (client.isVncOverWebSocketConnectionOpen()) {
|
if (client.isVncOverWebSocketConnectionOpen()) {
|
||||||
updateFrontEndActivityTime();
|
updateFrontEndActivityTime();
|
||||||
}
|
}
|
||||||
connectionAlive = client.isVncOverWebSocketConnectionAlive();
|
connectionAlive = session.isOpen();
|
||||||
try {
|
try {
|
||||||
Thread.sleep(1);
|
Thread.sleep(1);
|
||||||
} catch (Exception e) {
|
} catch (InterruptedException e) {
|
||||||
s_logger.warn("Error on sleep for vnc over websocket", e);
|
s_logger.error("Error on sleep for vnc over websocket", e);
|
||||||
}
|
}
|
||||||
} else if (client.isVncOverNioSocket()) {
|
} else if (client.isVncOverNioSocket()) {
|
||||||
byte[] bytesArr;
|
byte[] bytesArr;
|
||||||
int nextBytes = client.getNextBytes();
|
int nextBytes = client.getNextBytes();
|
||||||
bytesArr = new byte[nextBytes];
|
bytesArr = new byte[nextBytes];
|
||||||
client.readBytes(bytesArr, nextBytes);
|
client.readBytes(bytesArr, nextBytes);
|
||||||
|
s_logger.trace(String.format("Read [%s] bytes from client [%s]", nextBytes, clientId));
|
||||||
if (nextBytes > 0) {
|
if (nextBytes > 0) {
|
||||||
session.getRemote().sendBytes(ByteBuffer.wrap(bytesArr));
|
session.getRemote().sendBytes(ByteBuffer.wrap(bytesArr));
|
||||||
updateFrontEndActivityTime();
|
updateFrontEndActivityTime();
|
||||||
|
} else {
|
||||||
|
connectionAlive = session.isOpen();
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
b = new byte[100];
|
b = new byte[100];
|
||||||
readBytes = client.read(b);
|
readBytes = client.read(b);
|
||||||
|
s_logger.trace(String.format("Read [%s] bytes from client [%s]", readBytes, clientId));
|
||||||
if (readBytes == -1 || (readBytes > 0 && !sendReadBytesToNoVNC(b, readBytes))) {
|
if (readBytes == -1 || (readBytes > 0 && !sendReadBytesToNoVNC(b, readBytes))) {
|
||||||
connectionAlive = false;
|
connectionAlive = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
connectionAlive = false;
|
s_logger.info(String.format("Connection with client [%s] is dead.", clientId));
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
s_logger.error("Error on VNC client", e);
|
s_logger.error("Error on VNC client", e);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -485,7 +485,7 @@ class TestInternalLb(cloudstackTestCase):
|
|||||||
|
|
||||||
try:
|
try:
|
||||||
for x in range(0, max_requests):
|
for x in range(0, max_requests):
|
||||||
cmd_test_http = "/usr/bin/wget -T2 -qO- http://" + \
|
cmd_test_http = "curl --connect-timeout 3 -L http://" + \
|
||||||
lb_address + "/ 2>/dev/null"
|
lb_address + "/ 2>/dev/null"
|
||||||
# self.debug( "SSH into VM public address: %s and port: %s"
|
# self.debug( "SSH into VM public address: %s and port: %s"
|
||||||
# %(.public_ip, vm.public_port))
|
# %(.public_ip, vm.public_port))
|
||||||
@ -677,9 +677,8 @@ class TestInternalLb(cloudstackTestCase):
|
|||||||
|
|
||||||
url = "http://" + stats_ip + ":" + \
|
url = "http://" + stats_ip + ":" + \
|
||||||
settings["stats_port"] + settings["stats_uri"]
|
settings["stats_port"] + settings["stats_uri"]
|
||||||
get_contents = "/usr/bin/wget -T3 -qO- --user=" + \
|
get_contents = "curl --connect-timeout 3 -L --user %s:%s %s" \
|
||||||
settings["username"] + " --password=" + \
|
% (settings["username"], settings["password"], url)
|
||||||
settings["password"] + " " + url
|
|
||||||
try:
|
try:
|
||||||
self.logger.debug(
|
self.logger.debug(
|
||||||
"Trying to connect to the haproxy stats url %s" % url)
|
"Trying to connect to the haproxy stats url %s" % url)
|
||||||
|
|||||||
@ -38,6 +38,7 @@ from marvin.lib.base import (Account,
|
|||||||
Domain,
|
Domain,
|
||||||
Project,
|
Project,
|
||||||
ServiceOffering,
|
ServiceOffering,
|
||||||
|
Template,
|
||||||
VirtualMachine,
|
VirtualMachine,
|
||||||
Volume,
|
Volume,
|
||||||
Zone,
|
Zone,
|
||||||
@ -47,6 +48,7 @@ from marvin.lib.base import (Account,
|
|||||||
LoadBalancerRule,
|
LoadBalancerRule,
|
||||||
VPC,
|
VPC,
|
||||||
VpcOffering,
|
VpcOffering,
|
||||||
|
UserData,
|
||||||
SSHKeyPair)
|
SSHKeyPair)
|
||||||
|
|
||||||
from marvin.lib.common import (get_domain,
|
from marvin.lib.common import (get_domain,
|
||||||
@ -198,6 +200,37 @@ class TestVmAutoScaling(cloudstackTestCase):
|
|||||||
name="keypair2"
|
name="keypair2"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# 8-2. Register userdata
|
||||||
|
cls.apiUserdata = UserData.register(
|
||||||
|
cls.apiclient,
|
||||||
|
name="ApiUserdata",
|
||||||
|
userdata="QVBJdXNlcmRhdGE=", #APIuserdata
|
||||||
|
account=cls.regular_user.name,
|
||||||
|
domainid=cls.regular_user.domainid
|
||||||
|
)
|
||||||
|
|
||||||
|
# 8-3. Register userdata for template
|
||||||
|
cls.templateUserdata = UserData.register(
|
||||||
|
cls.apiclient,
|
||||||
|
name="TemplateUserdata",
|
||||||
|
userdata="IyMgdGVtcGxhdGU6IGppbmphCiNjbG91ZC1jb25maWcKcnVuY21kOgogICAgLSBlY2hvICdrZXkge3sgZHMubWV0YV9kYXRhLmtleTEgfX0nID4+IC9yb290L2luc3RhbmNlX21ldGFkYXRhCgo=",
|
||||||
|
# ## template: jinja
|
||||||
|
# #cloud-config
|
||||||
|
# runcmd:
|
||||||
|
# - echo 'key {{ ds.meta_data.key1 }}' >> /root/instance_metadata
|
||||||
|
#
|
||||||
|
account=cls.regular_user.name,
|
||||||
|
domainid=cls.regular_user.domainid
|
||||||
|
)
|
||||||
|
|
||||||
|
# 8-3. Link userdata to template
|
||||||
|
cls.template = Template.linkUserDataToTemplate(
|
||||||
|
cls.apiclient,
|
||||||
|
templateid=cls.template.id,
|
||||||
|
userdataid=cls.templateUserdata.userdata.id,
|
||||||
|
userdatapolicy="append"
|
||||||
|
)
|
||||||
|
|
||||||
# 9. Get counters for cpu and memory
|
# 9. Get counters for cpu and memory
|
||||||
counters = Autoscale.listCounters(
|
counters = Autoscale.listCounters(
|
||||||
cls.regular_user_apiclient,
|
cls.regular_user_apiclient,
|
||||||
@ -294,6 +327,7 @@ class TestVmAutoScaling(cloudstackTestCase):
|
|||||||
serviceofferingid=cls.service_offering.id,
|
serviceofferingid=cls.service_offering.id,
|
||||||
zoneid=cls.zone.id,
|
zoneid=cls.zone.id,
|
||||||
templateid=cls.template.id,
|
templateid=cls.template.id,
|
||||||
|
userdata="VGVzdFVzZXJEYXRh", #TestUserData
|
||||||
expungevmgraceperiod=DEFAULT_EXPUNGE_VM_GRACE_PERIOD,
|
expungevmgraceperiod=DEFAULT_EXPUNGE_VM_GRACE_PERIOD,
|
||||||
otherdeployparams=cls.otherdeployparams
|
otherdeployparams=cls.otherdeployparams
|
||||||
)
|
)
|
||||||
@ -349,6 +383,10 @@ class TestVmAutoScaling(cloudstackTestCase):
|
|||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def tearDownClass(cls):
|
def tearDownClass(cls):
|
||||||
|
cls.template = Template.linkUserDataToTemplate(
|
||||||
|
cls.apiclient,
|
||||||
|
templateid=cls.template.id
|
||||||
|
)
|
||||||
Configurations.update(cls.apiclient,
|
Configurations.update(cls.apiclient,
|
||||||
CONFIG_NAME_DISK_CONTROLLER,
|
CONFIG_NAME_DISK_CONTROLLER,
|
||||||
cls.initial_vmware_root_disk_controller)
|
cls.initial_vmware_root_disk_controller)
|
||||||
@ -390,6 +428,7 @@ class TestVmAutoScaling(cloudstackTestCase):
|
|||||||
self.regular_user_apiclient,
|
self.regular_user_apiclient,
|
||||||
autoscalevmgroupid=autoscalevmgroupid,
|
autoscalevmgroupid=autoscalevmgroupid,
|
||||||
projectid=projectid,
|
projectid=projectid,
|
||||||
|
userdata=True,
|
||||||
listall=True
|
listall=True
|
||||||
)
|
)
|
||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
@ -505,6 +544,31 @@ class TestVmAutoScaling(cloudstackTestCase):
|
|||||||
else:
|
else:
|
||||||
self.assertEquals(affinitygroupids, '')
|
self.assertEquals(affinitygroupids, '')
|
||||||
|
|
||||||
|
userdata = None
|
||||||
|
userdatadetails = None
|
||||||
|
userdataid = None
|
||||||
|
if vm.userdata:
|
||||||
|
userdata = vm.userdata
|
||||||
|
if vm.userdatadetails:
|
||||||
|
userdatadetails = vm.userdatadetails
|
||||||
|
if vm.userdataid:
|
||||||
|
userdataid = vm.userdataid
|
||||||
|
|
||||||
|
if vmprofile.userdataid:
|
||||||
|
self.assertEquals(userdataid, vmprofile.userdataid)
|
||||||
|
else:
|
||||||
|
self.assertIsNone(userdataid)
|
||||||
|
|
||||||
|
if vmprofile.userdatadetails:
|
||||||
|
self.assertEquals(userdatadetails, vmprofile.userdatadetails)
|
||||||
|
else:
|
||||||
|
self.assertIsNone(userdatadetails)
|
||||||
|
|
||||||
|
if vmprofile.userdata:
|
||||||
|
self.assertEquals(userdata, vmprofile.userdata)
|
||||||
|
else:
|
||||||
|
self.assertIsNone(userdata)
|
||||||
|
|
||||||
def wait_for_vm_start(self, vm=None, project_id=None):
|
def wait_for_vm_start(self, vm=None, project_id=None):
|
||||||
""" Wait until vm is Running """
|
""" Wait until vm is Running """
|
||||||
def check_user_vm_state():
|
def check_user_vm_state():
|
||||||
@ -512,6 +576,7 @@ class TestVmAutoScaling(cloudstackTestCase):
|
|||||||
self.apiclient,
|
self.apiclient,
|
||||||
id=vm.id,
|
id=vm.id,
|
||||||
projectid=project_id,
|
projectid=project_id,
|
||||||
|
userdata=True,
|
||||||
listall=True
|
listall=True
|
||||||
)
|
)
|
||||||
if isinstance(vms, list):
|
if isinstance(vms, list):
|
||||||
@ -576,6 +641,8 @@ class TestVmAutoScaling(cloudstackTestCase):
|
|||||||
Autoscale.updateAutoscaleVMProfile(
|
Autoscale.updateAutoscaleVMProfile(
|
||||||
self.regular_user_apiclient,
|
self.regular_user_apiclient,
|
||||||
id = self.autoscaling_vmprofile.id,
|
id = self.autoscaling_vmprofile.id,
|
||||||
|
userdataid=self.apiUserdata.userdata.id,
|
||||||
|
userdatadetails=[{"key1": "value2"}],
|
||||||
serviceofferingid = self.service_offering_new.id,
|
serviceofferingid = self.service_offering_new.id,
|
||||||
expungevmgraceperiod = DEFAULT_EXPUNGE_VM_GRACE_PERIOD + 1,
|
expungevmgraceperiod = DEFAULT_EXPUNGE_VM_GRACE_PERIOD + 1,
|
||||||
otherdeployparams = otherdeployparams_new
|
otherdeployparams = otherdeployparams_new
|
||||||
@ -712,6 +779,7 @@ class TestVmAutoScaling(cloudstackTestCase):
|
|||||||
vms = VirtualMachine.list(
|
vms = VirtualMachine.list(
|
||||||
self.regular_user_apiclient,
|
self.regular_user_apiclient,
|
||||||
autoscalevmgroupid=self.autoscaling_vmgroup.id,
|
autoscalevmgroupid=self.autoscaling_vmgroup.id,
|
||||||
|
userdata=True,
|
||||||
listall=True
|
listall=True
|
||||||
)
|
)
|
||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
@ -889,6 +957,7 @@ class TestVmAutoScaling(cloudstackTestCase):
|
|||||||
self.regular_user_apiclient,
|
self.regular_user_apiclient,
|
||||||
autoscalevmgroupid=autoscaling_vmgroup_project.id,
|
autoscalevmgroupid=autoscaling_vmgroup_project.id,
|
||||||
projectid=project.id,
|
projectid=project.id,
|
||||||
|
userdata=True,
|
||||||
listall=True
|
listall=True
|
||||||
)
|
)
|
||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
|
|||||||
@ -59,8 +59,12 @@ fi
|
|||||||
# Default case for Linux sed, just use "-i"
|
# Default case for Linux sed, just use "-i"
|
||||||
sedi='-i'
|
sedi='-i'
|
||||||
case "$(uname)" in
|
case "$(uname)" in
|
||||||
# For macOS, use two parameters
|
# For macOS, use two parameters, if gnu sed is not set up
|
||||||
Darwin*) sedi='-i ""'
|
Darwin*)
|
||||||
|
if ! $(which sed | grep -q gnu); then
|
||||||
|
sedi='-i ""'
|
||||||
|
fi
|
||||||
|
;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
set -e
|
set -e
|
||||||
|
|||||||
@ -1659,6 +1659,7 @@
|
|||||||
"label.reset.config.value": "Reset to default value",
|
"label.reset.config.value": "Reset to default value",
|
||||||
"label.reset.ssh.key.pair": "Reset SSH key pair",
|
"label.reset.ssh.key.pair": "Reset SSH key pair",
|
||||||
"label.reset.to.default": "Reset to default",
|
"label.reset.to.default": "Reset to default",
|
||||||
|
"label.reset.userdata.on.autoscale.vm.group": "Reset Userdata on AutoScale VM Group",
|
||||||
"label.reset.userdata.on.vm": "Reset Userdata on VM",
|
"label.reset.userdata.on.vm": "Reset Userdata on VM",
|
||||||
"label.reset.vpn.connection": "Reset VPN connection",
|
"label.reset.vpn.connection": "Reset VPN connection",
|
||||||
"label.resource": "Resource",
|
"label.resource": "Resource",
|
||||||
|
|||||||
@ -214,7 +214,7 @@ export default {
|
|||||||
}
|
}
|
||||||
return fields
|
return fields
|
||||||
},
|
},
|
||||||
details: ['name', 'id', 'displaytext', 'checksum', 'ostypename', 'size', 'bootable', 'isready', 'directdownload', 'isextractable', 'ispublic', 'isfeatured', 'crosszones', 'account', 'domain', 'created', 'userdatadetails', 'userdatapolicy'],
|
details: ['name', 'id', 'displaytext', 'checksum', 'ostypename', 'size', 'bootable', 'isready', 'directdownload', 'isextractable', 'ispublic', 'isfeatured', 'crosszones', 'account', 'domain', 'created', 'userdatadetails', 'userdatapolicy', 'url'],
|
||||||
searchFilters: ['name', 'zoneid', 'tags'],
|
searchFilters: ['name', 'zoneid', 'tags'],
|
||||||
related: [{
|
related: [{
|
||||||
name: 'vm',
|
name: 'vm',
|
||||||
|
|||||||
@ -73,6 +73,47 @@
|
|||||||
{{ getServiceOfferingName(serviceofferingid) }}
|
{{ getServiceOfferingName(serviceofferingid) }}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="form" v-if="userdataid">
|
||||||
|
<div class="form__item">
|
||||||
|
<div class="form__label">
|
||||||
|
<tooltip-label :title="$t('label.userdataid')"/>
|
||||||
|
</div>
|
||||||
|
{{ userdataid }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="form" v-if="userdataname">
|
||||||
|
<div class="form__item">
|
||||||
|
<div class="form__label">
|
||||||
|
<tooltip-label :title="$t('label.userdataname')"/>
|
||||||
|
</div>
|
||||||
|
{{ userdataname }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="form" v-if="userdatadetails">
|
||||||
|
<div class="form__item">
|
||||||
|
<div class="form__label">
|
||||||
|
<tooltip-label :title="$t('label.userdatadetails')"/>
|
||||||
|
</div>
|
||||||
|
{{ userdatadetails }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="form" v-if="userdatapolicy">
|
||||||
|
<div class="form__item">
|
||||||
|
<div class="form__label">
|
||||||
|
<tooltip-label :title="$t('label.userdatapolicy')"/>
|
||||||
|
</div>
|
||||||
|
{{ userdatapolicy }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="form">
|
||||||
|
<div class="form__item">
|
||||||
|
<div class="form__label">
|
||||||
|
<tooltip-label :title="$t('label.userdata')" :tooltip="createAutoScaleVmProfileApiParams.userdata.description"/>
|
||||||
|
</div>
|
||||||
|
<a-textarea v-model:value="userdata" rows="5" :disabled="true">
|
||||||
|
</a-textarea>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
<div class="form">
|
<div class="form">
|
||||||
<div class="form__item">
|
<div class="form__item">
|
||||||
<a-button ref="submit" :disabled="!('updateAutoScaleVmProfile' in $store.getters.apis) || resource.state !== 'DISABLED'" type="primary" @click="editProfileModalVisible = true">
|
<a-button ref="submit" :disabled="!('updateAutoScaleVmProfile' in $store.getters.apis) || resource.state !== 'DISABLED'" type="primary" @click="editProfileModalVisible = true">
|
||||||
@ -80,6 +121,12 @@
|
|||||||
{{ $t('label.edit.autoscale.vmprofile') }}
|
{{ $t('label.edit.autoscale.vmprofile') }}
|
||||||
</a-button>
|
</a-button>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="form__item">
|
||||||
|
<a-button ref="submit" :disabled="!('updateAutoScaleVmProfile' in $store.getters.apis) || resource.state !== 'DISABLED'" type="primary" @click="showUpdateUserDataForm = true">
|
||||||
|
<template #icon><solution-outlined /></template>
|
||||||
|
{{ $t('label.reset.userdata.on.autoscale.vm.group') }}
|
||||||
|
</a-button>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<a-divider/>
|
<a-divider/>
|
||||||
@ -236,20 +283,26 @@
|
|||||||
</a-select>
|
</a-select>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="form">
|
|
||||||
<div class="form__item">
|
|
||||||
<div class="form__label">
|
|
||||||
<tooltip-label :title="$t('label.userdata')" :tooltip="createAutoScaleVmProfileApiParams.userdata.description"/>
|
|
||||||
</div>
|
|
||||||
<a-textarea v-model:value="userdata">
|
|
||||||
</a-textarea>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div :span="24" class="action-button">
|
<div :span="24" class="action-button">
|
||||||
<a-button :loading="loading" @click="closeModal">{{ $t('label.cancel') }}</a-button>
|
<a-button :loading="loading" @click="closeModal">{{ $t('label.cancel') }}</a-button>
|
||||||
<a-button :loading="loading" ref="submit" type="primary" @click="updateAutoScaleVmProfile">{{ $t('label.ok') }}</a-button>
|
<a-button :loading="loading" ref="submit" type="primary" @click="updateAutoScaleVmProfile">{{ $t('label.ok') }}</a-button>
|
||||||
</div>
|
</div>
|
||||||
</a-modal>
|
</a-modal>
|
||||||
|
|
||||||
|
<a-modal
|
||||||
|
:visible="showUpdateUserDataForm"
|
||||||
|
:title="$t('label.reset.userdata.on.autoscale.vm.group')"
|
||||||
|
:closable="true"
|
||||||
|
:maskClosable="false"
|
||||||
|
:footer="null"
|
||||||
|
@cancel="showUpdateUserDataForm = false"
|
||||||
|
centered
|
||||||
|
width="auto">
|
||||||
|
<reset-user-data
|
||||||
|
:resource="{ ...resource, ...{ resetUserDataApiName: 'updateAutoScaleVmProfile', resetUserDataResourceId: this.resource.vmprofileid, templateid: this.templateid}}"
|
||||||
|
@close-action="showUpdateUserDataForm = false"
|
||||||
|
/>
|
||||||
|
</a-modal>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
@ -259,10 +312,12 @@ import { isAdmin, isAdminOrDomainAdmin } from '@/role'
|
|||||||
import Status from '@/components/widgets/Status'
|
import Status from '@/components/widgets/Status'
|
||||||
import TooltipButton from '@/components/widgets/TooltipButton'
|
import TooltipButton from '@/components/widgets/TooltipButton'
|
||||||
import TooltipLabel from '@/components/widgets/TooltipLabel'
|
import TooltipLabel from '@/components/widgets/TooltipLabel'
|
||||||
|
import ResetUserData from '@views/compute/ResetUserData'
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: 'conditionsTab',
|
name: 'conditionsTab',
|
||||||
components: {
|
components: {
|
||||||
|
ResetUserData,
|
||||||
Status,
|
Status,
|
||||||
TooltipButton,
|
TooltipButton,
|
||||||
TooltipLabel
|
TooltipLabel
|
||||||
@ -278,12 +333,17 @@ export default {
|
|||||||
filterColumns: ['Actions'],
|
filterColumns: ['Actions'],
|
||||||
loading: true,
|
loading: true,
|
||||||
editProfileModalVisible: false,
|
editProfileModalVisible: false,
|
||||||
|
showUpdateUserDataForm: false,
|
||||||
profileid: null,
|
profileid: null,
|
||||||
autoscaleuserid: null,
|
autoscaleuserid: null,
|
||||||
expungevmgraceperiod: null,
|
expungevmgraceperiod: null,
|
||||||
templateid: null,
|
templateid: null,
|
||||||
serviceofferingid: null,
|
serviceofferingid: null,
|
||||||
userdata: null,
|
userdata: null,
|
||||||
|
userdataid: null,
|
||||||
|
userdataname: null,
|
||||||
|
userdatadetails: null,
|
||||||
|
userdatapolicy: null,
|
||||||
usersList: [],
|
usersList: [],
|
||||||
templatesList: [],
|
templatesList: [],
|
||||||
serviceOfferingsList: [],
|
serviceOfferingsList: [],
|
||||||
@ -396,6 +456,11 @@ export default {
|
|||||||
this.serviceofferingid = response.listautoscalevmprofilesresponse?.autoscalevmprofile?.[0]?.serviceofferingid
|
this.serviceofferingid = response.listautoscalevmprofilesresponse?.autoscalevmprofile?.[0]?.serviceofferingid
|
||||||
this.templateid = response.listautoscalevmprofilesresponse?.autoscalevmprofile?.[0]?.templateid
|
this.templateid = response.listautoscalevmprofilesresponse?.autoscalevmprofile?.[0]?.templateid
|
||||||
this.userdata = this.decodeUserData(decodeURIComponent(response.listautoscalevmprofilesresponse?.autoscalevmprofile?.[0]?.userdata || ''))
|
this.userdata = this.decodeUserData(decodeURIComponent(response.listautoscalevmprofilesresponse?.autoscalevmprofile?.[0]?.userdata || ''))
|
||||||
|
this.userdataid = response.listautoscalevmprofilesresponse?.autoscalevmprofile?.[0]?.userdataid
|
||||||
|
this.userdataname = response.listautoscalevmprofilesresponse?.autoscalevmprofile?.[0]?.userdataname
|
||||||
|
this.userdatadetails = response.listautoscalevmprofilesresponse?.autoscalevmprofile?.[0]?.userdatadetails
|
||||||
|
this.userdatapolicy = response.listautoscalevmprofilesresponse?.autoscalevmprofile?.[0]?.userdatapolicy
|
||||||
|
|
||||||
const counterparam = response.listautoscalevmprofilesresponse?.autoscalevmprofile?.[0]?.counterparam || {}
|
const counterparam = response.listautoscalevmprofilesresponse?.autoscalevmprofile?.[0]?.counterparam || {}
|
||||||
const otherdeployparams = response.listautoscalevmprofilesresponse?.autoscalevmprofile?.[0]?.otherdeployparams || {}
|
const otherdeployparams = response.listautoscalevmprofilesresponse?.autoscalevmprofile?.[0]?.otherdeployparams || {}
|
||||||
this.finalizeParams(counterparam, otherdeployparams)
|
this.finalizeParams(counterparam, otherdeployparams)
|
||||||
@ -530,13 +595,10 @@ export default {
|
|||||||
if (this.autoscaleuserid) {
|
if (this.autoscaleuserid) {
|
||||||
params.autoscaleuserid = this.autoscaleuserid
|
params.autoscaleuserid = this.autoscaleuserid
|
||||||
}
|
}
|
||||||
if (this.userdata && this.userdata.length > 0) {
|
|
||||||
params.userdata = this.$toBase64AndURIEncoded(this.userdata)
|
|
||||||
}
|
|
||||||
|
|
||||||
const httpMethod = params.userdata ? 'POST' : 'GET'
|
const httpMethod = 'GET'
|
||||||
const args = httpMethod === 'POST' ? {} : params
|
const args = params
|
||||||
const data = httpMethod === 'POST' ? params : {}
|
const data = {}
|
||||||
|
|
||||||
api('updateAutoScaleVmProfile', args, httpMethod, data).then(response => {
|
api('updateAutoScaleVmProfile', args, httpMethod, data).then(response => {
|
||||||
this.$pollJob({
|
this.$pollJob({
|
||||||
|
|||||||
@ -407,7 +407,7 @@
|
|||||||
|
|
||||||
<span v-if="property.type && property.type==='boolean'">
|
<span v-if="property.type && property.type==='boolean'">
|
||||||
<a-switch
|
<a-switch
|
||||||
v-model:cheked="form['properties.' + escapePropertyKey(property.key)]"
|
v-model:checked="form['properties.' + escapePropertyKey(property.key)]"
|
||||||
:placeholder="property.description"
|
:placeholder="property.description"
|
||||||
/>
|
/>
|
||||||
</span>
|
</span>
|
||||||
@ -762,13 +762,100 @@
|
|||||||
@select-affinity-group-item="($event) => updateAffinityGroups($event)"
|
@select-affinity-group-item="($event) => updateAffinityGroups($event)"
|
||||||
@handle-search-filter="($event) => handleSearchFilter('affinityGroups', $event)"/>
|
@handle-search-filter="($event) => handleSearchFilter('affinityGroups', $event)"/>
|
||||||
</a-form-item>
|
</a-form-item>
|
||||||
<a-form-item name="userdata" ref="userdata">
|
<a-form-item>
|
||||||
<template #label>
|
<template #label>
|
||||||
<tooltip-label :title="$t('label.userdata')" :tooltip="createAutoScaleVmProfileApiParams.userdata.description"/>
|
<tooltip-label :title="$t('label.userdata')" :tooltip="createAutoScaleVmProfileApiParams.userdata.description"/>
|
||||||
</template>
|
</template>
|
||||||
<a-textarea
|
<a-card>
|
||||||
v-model:value="form.userdata">
|
<div v-if="this.template && this.template.userdataid">
|
||||||
</a-textarea>
|
<a-text type="primary">
|
||||||
|
Userdata "{{ $t(this.template.userdataname) }}" is linked with template "{{ $t(this.template.name) }}" with override policy "{{ $t(this.template.userdatapolicy) }}"
|
||||||
|
</a-text><br/><br/>
|
||||||
|
<div v-if="templateUserDataParams.length > 0 && !doUserdataOverride">
|
||||||
|
<a-text type="primary" v-if="this.template && this.template.userdataid && templateUserDataParams.length > 0">
|
||||||
|
Enter the values for the variables in userdata
|
||||||
|
</a-text>
|
||||||
|
<a-input-group>
|
||||||
|
<a-table
|
||||||
|
size="small"
|
||||||
|
style="overflow-y: auto"
|
||||||
|
:columns="userDataParamCols"
|
||||||
|
:dataSource="templateUserDataParams"
|
||||||
|
:pagination="false"
|
||||||
|
:rowKey="record => record.key">
|
||||||
|
<template #value="{ record }">
|
||||||
|
<a-input v-model:value="templateUserDataValues[record.key]" />
|
||||||
|
</template>
|
||||||
|
</a-table>
|
||||||
|
</a-input-group>
|
||||||
|
</div>
|
||||||
|
</div><br/><br/>
|
||||||
|
<div v-if="userdataDefaultOverridePolicy === 'ALLOWOVERRIDE' || userdataDefaultOverridePolicy === 'APPEND' || !userdataDefaultOverridePolicy">
|
||||||
|
<span v-if="userdataDefaultOverridePolicy === 'ALLOWOVERRIDE'" >
|
||||||
|
{{ $t('label.userdata.do.override') }}
|
||||||
|
<a-switch v-model:checked="doUserdataOverride" style="margin-left: 10px"/>
|
||||||
|
</span>
|
||||||
|
<span v-if="userdataDefaultOverridePolicy === 'APPEND'">
|
||||||
|
{{ $t('label.userdata.do.append') }}
|
||||||
|
<a-switch v-model:checked="doUserdataAppend" style="margin-left: 10px"/>
|
||||||
|
</span>
|
||||||
|
<a-step
|
||||||
|
:status="zoneSelected ? 'process' : 'wait'">
|
||||||
|
<template #description>
|
||||||
|
<div v-if="doUserdataOverride || doUserdataAppend || !userdataDefaultOverridePolicy" style="margin-top: 15px">
|
||||||
|
<a-card
|
||||||
|
:tabList="userdataTabList"
|
||||||
|
:activeTabKey="userdataTabKey"
|
||||||
|
@tabChange="key => onUserdataTabChange(key, 'userdataTabKey')">
|
||||||
|
<div v-if="userdataTabKey === 'userdataregistered'">
|
||||||
|
<a-step
|
||||||
|
v-if="isUserAllowedToListUserDatas"
|
||||||
|
:status="zoneSelected ? 'process' : 'wait'">
|
||||||
|
<template #description>
|
||||||
|
<div v-if="zoneSelected">
|
||||||
|
<user-data-selection
|
||||||
|
:items="options.userDatas"
|
||||||
|
:row-count="rowCount.userDatas"
|
||||||
|
:zoneId="zoneId"
|
||||||
|
:disabled="template.userdatapolicy === 'DENYOVERRIDE'"
|
||||||
|
:loading="loading.userDatas"
|
||||||
|
:preFillContent="dataPreFill"
|
||||||
|
@select-user-data-item="($event) => updateUserData($event)"
|
||||||
|
@handle-search-filter="($event) => handleSearchFilter('userData', $event)"
|
||||||
|
/>
|
||||||
|
<div v-if="userDataParams.length > 0">
|
||||||
|
<a-input-group>
|
||||||
|
<a-table
|
||||||
|
size="small"
|
||||||
|
style="overflow-y: auto"
|
||||||
|
:columns="userDataParamCols"
|
||||||
|
:dataSource="userDataParams"
|
||||||
|
:pagination="false"
|
||||||
|
:rowKey="record => record.key">
|
||||||
|
<template #value="{ record }">
|
||||||
|
<a-input v-model:value="userDataValues[record.key]" />
|
||||||
|
</template>
|
||||||
|
</a-table>
|
||||||
|
</a-input-group>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
</a-step>
|
||||||
|
</div>
|
||||||
|
<div v-else>
|
||||||
|
<a-form-item name="userdata" ref="userdata" >
|
||||||
|
<a-textarea
|
||||||
|
placeholder="Userdata"
|
||||||
|
v-model:value="form.userdata">
|
||||||
|
</a-textarea>
|
||||||
|
</a-form-item>
|
||||||
|
</div>
|
||||||
|
</a-card>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
</a-step>
|
||||||
|
</div>
|
||||||
|
</a-card>
|
||||||
</a-form-item>
|
</a-form-item>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
@ -958,6 +1045,7 @@ import NetworkSelection from '@views/compute/wizard/NetworkSelection'
|
|||||||
import NetworkConfiguration from '@views/compute/wizard/NetworkConfiguration'
|
import NetworkConfiguration from '@views/compute/wizard/NetworkConfiguration'
|
||||||
import LoadBalancerSelection from '@views/compute/wizard/LoadBalancerSelection'
|
import LoadBalancerSelection from '@views/compute/wizard/LoadBalancerSelection'
|
||||||
import SshKeyPairSelection from '@views/compute/wizard/SshKeyPairSelection'
|
import SshKeyPairSelection from '@views/compute/wizard/SshKeyPairSelection'
|
||||||
|
import UserDataSelection from '@views/compute/wizard/UserDataSelection'
|
||||||
import SecurityGroupSelection from '@views/compute/wizard/SecurityGroupSelection'
|
import SecurityGroupSelection from '@views/compute/wizard/SecurityGroupSelection'
|
||||||
import TooltipLabel from '@/components/widgets/TooltipLabel'
|
import TooltipLabel from '@/components/widgets/TooltipLabel'
|
||||||
import InstanceNicsNetworkSelectListView from '@/components/view/InstanceNicsNetworkSelectListView.vue'
|
import InstanceNicsNetworkSelectListView from '@/components/view/InstanceNicsNetworkSelectListView.vue'
|
||||||
@ -970,6 +1058,7 @@ export default {
|
|||||||
name: 'Wizard',
|
name: 'Wizard',
|
||||||
components: {
|
components: {
|
||||||
SshKeyPairSelection,
|
SshKeyPairSelection,
|
||||||
|
UserDataSelection,
|
||||||
NetworkConfiguration,
|
NetworkConfiguration,
|
||||||
NetworkSelection,
|
NetworkSelection,
|
||||||
LoadBalancerSelection,
|
LoadBalancerSelection,
|
||||||
@ -1016,6 +1105,10 @@ export default {
|
|||||||
zoneSelected: false,
|
zoneSelected: false,
|
||||||
dynamicscalingenabled: true,
|
dynamicscalingenabled: true,
|
||||||
templateKey: 0,
|
templateKey: 0,
|
||||||
|
showRegisteredUserdata: true,
|
||||||
|
doUserdataOverride: false,
|
||||||
|
doUserdataAppend: false,
|
||||||
|
userdataDefaultOverridePolicy: 'ALLOWOVERRIDE',
|
||||||
vm: {
|
vm: {
|
||||||
name: null,
|
name: null,
|
||||||
zoneid: null,
|
zoneid: null,
|
||||||
@ -1040,6 +1133,7 @@ export default {
|
|||||||
affinityGroups: [],
|
affinityGroups: [],
|
||||||
networks: [],
|
networks: [],
|
||||||
sshKeyPairs: [],
|
sshKeyPairs: [],
|
||||||
|
UserDatas: [],
|
||||||
loadbalancers: []
|
loadbalancers: []
|
||||||
},
|
},
|
||||||
rowCount: {},
|
rowCount: {},
|
||||||
@ -1051,6 +1145,7 @@ export default {
|
|||||||
affinityGroups: false,
|
affinityGroups: false,
|
||||||
networks: false,
|
networks: false,
|
||||||
sshKeyPairs: false,
|
sshKeyPairs: false,
|
||||||
|
userDatas: false,
|
||||||
loadbalancers: false,
|
loadbalancers: false,
|
||||||
zones: false
|
zones: false
|
||||||
},
|
},
|
||||||
@ -1129,6 +1224,32 @@ export default {
|
|||||||
zone: {},
|
zone: {},
|
||||||
sshKeyPairs: [],
|
sshKeyPairs: [],
|
||||||
sshKeyPair: {},
|
sshKeyPair: {},
|
||||||
|
userData: {},
|
||||||
|
userDataParams: [],
|
||||||
|
userDataParamCols: [
|
||||||
|
{
|
||||||
|
title: this.$t('label.key'),
|
||||||
|
dataIndex: 'key'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: this.$t('label.value'),
|
||||||
|
dataIndex: 'value',
|
||||||
|
slots: { customRender: 'value' }
|
||||||
|
}
|
||||||
|
],
|
||||||
|
userDataValues: {},
|
||||||
|
templateUserDataCols: [
|
||||||
|
{
|
||||||
|
title: this.$t('label.userdata'),
|
||||||
|
dataIndex: 'userdata'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: this.$t('label.userdatapolicy'),
|
||||||
|
dataIndex: 'userdataoverridepolicy'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
templateUserDataParams: [],
|
||||||
|
templateUserDataValues: {},
|
||||||
overrideDiskOffering: {},
|
overrideDiskOffering: {},
|
||||||
templateFilter: [
|
templateFilter: [
|
||||||
'featured',
|
'featured',
|
||||||
@ -1140,6 +1261,7 @@ export default {
|
|||||||
defaultNetworkId: '',
|
defaultNetworkId: '',
|
||||||
dataNetworkCreated: [],
|
dataNetworkCreated: [],
|
||||||
tabKey: 'templateid',
|
tabKey: 'templateid',
|
||||||
|
userdataTabKey: 'userdataregistered',
|
||||||
dataPreFill: {},
|
dataPreFill: {},
|
||||||
showDetails: false,
|
showDetails: false,
|
||||||
showRootDiskSizeChanger: false,
|
showRootDiskSizeChanger: false,
|
||||||
@ -1230,6 +1352,15 @@ export default {
|
|||||||
listall: false
|
listall: false
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
userDatas: {
|
||||||
|
list: 'listUserData',
|
||||||
|
options: {
|
||||||
|
page: 1,
|
||||||
|
pageSize: 10,
|
||||||
|
keyword: undefined,
|
||||||
|
listall: false
|
||||||
|
}
|
||||||
|
},
|
||||||
networks: {
|
networks: {
|
||||||
list: 'listNetworks',
|
list: 'listNetworks',
|
||||||
options: {
|
options: {
|
||||||
@ -1291,12 +1422,27 @@ export default {
|
|||||||
}]
|
}]
|
||||||
return tabList
|
return tabList
|
||||||
},
|
},
|
||||||
|
userdataTabList () {
|
||||||
|
let tabList = []
|
||||||
|
tabList = [{
|
||||||
|
key: 'userdataregistered',
|
||||||
|
tab: this.$t('label.userdata.registered')
|
||||||
|
},
|
||||||
|
{
|
||||||
|
key: 'userdatatext',
|
||||||
|
tab: this.$t('label.userdata.text')
|
||||||
|
}]
|
||||||
|
return tabList
|
||||||
|
},
|
||||||
showSecurityGroupSection () {
|
showSecurityGroupSection () {
|
||||||
return (this.networks.length > 0 && this.zone.securitygroupsenabled) || (this.zone && this.zone.networktype === 'Basic')
|
return (this.networks.length > 0 && this.zone.securitygroupsenabled) || (this.zone && this.zone.networktype === 'Basic')
|
||||||
},
|
},
|
||||||
isUserAllowedToListSshKeys () {
|
isUserAllowedToListSshKeys () {
|
||||||
return Boolean('listSSHKeyPairs' in this.$store.getters.apis)
|
return Boolean('listSSHKeyPairs' in this.$store.getters.apis)
|
||||||
},
|
},
|
||||||
|
isUserAllowedToListUserDatas () {
|
||||||
|
return Boolean('listUserData' in this.$store.getters.apis)
|
||||||
|
},
|
||||||
dynamicScalingVmConfigValue () {
|
dynamicScalingVmConfigValue () {
|
||||||
return this.options.dynamicScalingVmConfig?.[0]?.value === 'true'
|
return this.options.dynamicScalingVmConfig?.[0]?.value === 'true'
|
||||||
},
|
},
|
||||||
@ -1427,6 +1573,8 @@ export default {
|
|||||||
template (oldValue, newValue) {
|
template (oldValue, newValue) {
|
||||||
if (oldValue && newValue && oldValue.id !== newValue.id) {
|
if (oldValue && newValue && oldValue.id !== newValue.id) {
|
||||||
this.dynamicscalingenabled = this.isDynamicallyScalable()
|
this.dynamicscalingenabled = this.isDynamicallyScalable()
|
||||||
|
this.doUserdataOverride = false
|
||||||
|
this.doUserdataAppend = false
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
beforeCreate () {
|
beforeCreate () {
|
||||||
@ -1859,6 +2007,8 @@ export default {
|
|||||||
if (template) {
|
if (template) {
|
||||||
var size = template.size / (1024 * 1024 * 1024) || 0 // bytes to GB
|
var size = template.size / (1024 * 1024 * 1024) || 0 // bytes to GB
|
||||||
this.dataPreFill.minrootdisksize = Math.ceil(size)
|
this.dataPreFill.minrootdisksize = Math.ceil(size)
|
||||||
|
this.updateTemplateLinkedUserData(this.template.userdataid)
|
||||||
|
this.userdataDefaultOverridePolicy = this.template.userdatapolicy
|
||||||
}
|
}
|
||||||
} else if (['cpuspeed', 'cpunumber', 'memory'].includes(name)) {
|
} else if (['cpuspeed', 'cpunumber', 'memory'].includes(name)) {
|
||||||
this.vm[name] = value
|
this.vm[name] = value
|
||||||
@ -2023,6 +2173,56 @@ export default {
|
|||||||
this.form.keypairs = names
|
this.form.keypairs = names
|
||||||
this.sshKeyPairs = names.map((sshKeyPair) => { return sshKeyPair.name })
|
this.sshKeyPairs = names.map((sshKeyPair) => { return sshKeyPair.name })
|
||||||
},
|
},
|
||||||
|
updateUserData (id) {
|
||||||
|
if (id === '0') {
|
||||||
|
this.form.userdataid = undefined
|
||||||
|
return
|
||||||
|
}
|
||||||
|
this.form.userdataid = id
|
||||||
|
this.userDataParams = []
|
||||||
|
api('listUserData', { id: id }).then(json => {
|
||||||
|
const resp = json?.listuserdataresponse?.userdata || []
|
||||||
|
if (resp) {
|
||||||
|
var params = resp[0].params
|
||||||
|
if (params) {
|
||||||
|
var dataParams = params.split(',')
|
||||||
|
}
|
||||||
|
var that = this
|
||||||
|
dataParams.forEach(function (val, index) {
|
||||||
|
that.userDataParams.push({
|
||||||
|
id: index,
|
||||||
|
key: val
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
updateTemplateLinkedUserData (id) {
|
||||||
|
if (id === '0') {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
this.templateUserDataParams = []
|
||||||
|
|
||||||
|
api('listUserData', { id: id }).then(json => {
|
||||||
|
const resp = json?.listuserdataresponse?.userdata || []
|
||||||
|
if (resp) {
|
||||||
|
var params = resp[0].params
|
||||||
|
if (params) {
|
||||||
|
var dataParams = params.split(',')
|
||||||
|
}
|
||||||
|
var that = this
|
||||||
|
that.templateUserDataParams = []
|
||||||
|
if (dataParams) {
|
||||||
|
dataParams.forEach(function (val, index) {
|
||||||
|
that.templateUserDataParams.push({
|
||||||
|
id: index,
|
||||||
|
key: val
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
updateAffinityGroups (ids) {
|
updateAffinityGroups (ids) {
|
||||||
this.form.affinitygroupids = ids
|
this.form.affinitygroupids = ids
|
||||||
},
|
},
|
||||||
@ -2041,16 +2241,20 @@ export default {
|
|||||||
}, 1000)
|
}, 1000)
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
createVmProfile (createVmGroupData) {
|
createVmProfile (createVmGroupData, createVmGroupUserDataDetails) {
|
||||||
this.addStep('message.creating.autoscale.vmprofile', 'createVmProfile')
|
this.addStep('message.creating.autoscale.vmprofile', 'createVmProfile')
|
||||||
|
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
const params = {
|
const params = {
|
||||||
expungevmgraceperiod: createVmGroupData.expungevmgraceperiod,
|
...createVmGroupUserDataDetails,
|
||||||
serviceofferingid: createVmGroupData.serviceofferingid,
|
...{
|
||||||
templateid: createVmGroupData.templateid,
|
expungevmgraceperiod: createVmGroupData.expungevmgraceperiod,
|
||||||
userdata: createVmGroupData.userdata,
|
serviceofferingid: createVmGroupData.serviceofferingid,
|
||||||
zoneid: createVmGroupData.zoneid
|
templateid: createVmGroupData.templateid,
|
||||||
|
userdata: createVmGroupData.userdata,
|
||||||
|
userdataid: createVmGroupData.userdataid,
|
||||||
|
zoneid: createVmGroupData.zoneid
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (createVmGroupData.autoscaleuserid) {
|
if (createVmGroupData.autoscaleuserid) {
|
||||||
params.autoscaleuserid = createVmGroupData.autoscaleuserid
|
params.autoscaleuserid = createVmGroupData.autoscaleuserid
|
||||||
@ -2431,9 +2635,13 @@ export default {
|
|||||||
// advanced settings
|
// advanced settings
|
||||||
createVmGroupData.keypairs = this.sshKeyPairs.join(',')
|
createVmGroupData.keypairs = this.sshKeyPairs.join(',')
|
||||||
createVmGroupData.affinitygroupids = (values.affinitygroupids || []).join(',')
|
createVmGroupData.affinitygroupids = (values.affinitygroupids || []).join(',')
|
||||||
if (values.userdata && values.userdata.length > 0) {
|
const isUserdataAllowed = !this.userdataDefaultOverridePolicy || (this.userdataDefaultOverridePolicy === 'ALLOWOVERRIDE' && this.doUserdataOverride) || (this.userdataDefaultOverridePolicy === 'APPEND' && this.doUserdataAppend)
|
||||||
|
if (isUserdataAllowed && values.userdata && values.userdata.length > 0) {
|
||||||
createVmGroupData.userdata = this.$toBase64AndURIEncoded(values.userdata)
|
createVmGroupData.userdata = this.$toBase64AndURIEncoded(values.userdata)
|
||||||
}
|
}
|
||||||
|
if (isUserdataAllowed) {
|
||||||
|
createVmGroupData.userdataid = values.userdataid
|
||||||
|
}
|
||||||
|
|
||||||
// vm profile details
|
// vm profile details
|
||||||
createVmGroupData.autoscaleuserid = values.autoscaleuserid
|
createVmGroupData.autoscaleuserid = values.autoscaleuserid
|
||||||
@ -2442,11 +2650,26 @@ export default {
|
|||||||
createVmGroupData = Object.fromEntries(
|
createVmGroupData = Object.fromEntries(
|
||||||
Object.entries(createVmGroupData).filter(([key, value]) => value !== undefined))
|
Object.entries(createVmGroupData).filter(([key, value]) => value !== undefined))
|
||||||
|
|
||||||
|
const createVmGroupUserDataDetails = {}
|
||||||
|
var idx = 0
|
||||||
|
if (this.templateUserDataValues) {
|
||||||
|
for (const [key, value] of Object.entries(this.templateUserDataValues)) {
|
||||||
|
createVmGroupUserDataDetails['userdatadetails[' + idx + '].' + `${key}`] = value
|
||||||
|
idx++
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (isUserdataAllowed && this.userDataValues) {
|
||||||
|
for (const [key, value] of Object.entries(this.userDataValues)) {
|
||||||
|
createVmGroupUserDataDetails['userdatadetails[' + idx + '].' + `${key}`] = value
|
||||||
|
idx++
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
this.processStatusModalVisible = true
|
this.processStatusModalVisible = true
|
||||||
this.processStatus = null
|
this.processStatus = null
|
||||||
|
|
||||||
// create autoscale vm profile
|
// create autoscale vm profile
|
||||||
const vmprofile = await this.createVmProfile(createVmGroupData)
|
const vmprofile = await this.createVmProfile(createVmGroupData, createVmGroupUserDataDetails)
|
||||||
|
|
||||||
// create scaleup conditions and policy
|
// create scaleup conditions and policy
|
||||||
const scaleUpPolicyIds = []
|
const scaleUpPolicyIds = []
|
||||||
@ -2553,7 +2776,7 @@ export default {
|
|||||||
return new Promise((resolve) => {
|
return new Promise((resolve) => {
|
||||||
this.loading.zones = true
|
this.loading.zones = true
|
||||||
const param = this.params.zones
|
const param = this.params.zones
|
||||||
const args = { listall: true, showicon: true }
|
const args = { showicon: true }
|
||||||
if (zoneId) args.id = zoneId
|
if (zoneId) args.id = zoneId
|
||||||
api(param.list, args).then(json => {
|
api(param.list, args).then(json => {
|
||||||
const zoneResponse = (json.listzonesresponse.zone || []).filter(item => item.securitygroupsenabled === false)
|
const zoneResponse = (json.listzonesresponse.zone || []).filter(item => item.securitygroupsenabled === false)
|
||||||
@ -2585,7 +2808,7 @@ export default {
|
|||||||
param.loading = true
|
param.loading = true
|
||||||
param.opts = []
|
param.opts = []
|
||||||
const options = param.options || {}
|
const options = param.options || {}
|
||||||
if (!('listall' in options)) {
|
if (!('listall' in options) && !['zones', 'pods', 'clusters', 'hosts', 'dynamicScalingVmConfig', 'hypervisors'].includes(name)) {
|
||||||
options.listall = true
|
options.listall = true
|
||||||
}
|
}
|
||||||
api(param.list, options).then((response) => {
|
api(param.list, options).then((response) => {
|
||||||
@ -2709,6 +2932,10 @@ export default {
|
|||||||
this.params[name].options = { ...this.params[name].options, ...options }
|
this.params[name].options = { ...this.params[name].options, ...options }
|
||||||
this.fetchOptions(this.params[name], name)
|
this.fetchOptions(this.params[name], name)
|
||||||
},
|
},
|
||||||
|
onUserdataTabChange (key, type) {
|
||||||
|
this[type] = key
|
||||||
|
this.userDataParams = []
|
||||||
|
},
|
||||||
fetchTemplateNics (template) {
|
fetchTemplateNics (template) {
|
||||||
var nics = []
|
var nics = []
|
||||||
this.nicToNetworkSelection = []
|
this.nicToNetworkSelection = []
|
||||||
|
|||||||
@ -339,7 +339,6 @@ export default {
|
|||||||
this.loadingData = true
|
this.loadingData = true
|
||||||
console.log(values)
|
console.log(values)
|
||||||
const params = {
|
const params = {
|
||||||
id: this.resource.id
|
|
||||||
}
|
}
|
||||||
if (values.userdata && values.userdata.length > 0) {
|
if (values.userdata && values.userdata.length > 0) {
|
||||||
params.userdata = this.$toBase64AndURIEncoded(values.userdata)
|
params.userdata = this.$toBase64AndURIEncoded(values.userdata)
|
||||||
@ -360,7 +359,14 @@ export default {
|
|||||||
idx++
|
idx++
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
api('resetUserDataForVirtualMachine', params).then(json => {
|
params.id = this.resource.resetUserDataResourceId ? this.resource.resetUserDataResourceId : this.resource.id
|
||||||
|
|
||||||
|
const resetUserDataApiName = this.resource.resetUserDataApiName ? this.resource.resetUserDataApiName : 'resetUserDataForVirtualMachine'
|
||||||
|
const httpMethod = params.userdata ? 'POST' : 'GET'
|
||||||
|
const args = httpMethod === 'POST' ? {} : params
|
||||||
|
const data = httpMethod === 'POST' ? params : {}
|
||||||
|
|
||||||
|
api(resetUserDataApiName, args, httpMethod, data).then(json => {
|
||||||
this.$message.success({
|
this.$message.success({
|
||||||
content: `${this.$t('label.action.userdata.reset')} - ${this.$t('label.success')}`,
|
content: `${this.$t('label.action.userdata.reset')} - ${this.$t('label.success')}`,
|
||||||
duration: 2
|
duration: 2
|
||||||
|
|||||||
@ -35,8 +35,10 @@
|
|||||||
<a-form-item
|
<a-form-item
|
||||||
v-if="currentForm === 'Create'"
|
v-if="currentForm === 'Create'"
|
||||||
ref="url"
|
ref="url"
|
||||||
name="url"
|
name="url">
|
||||||
:label="$t('label.url')">
|
<template #label>
|
||||||
|
<tooltip-label :title="$t('label.url')" :tooltip="apiParams.url.description"/>
|
||||||
|
</template>
|
||||||
<a-input
|
<a-input
|
||||||
v-focus="currentForm === 'Create'"
|
v-focus="currentForm === 'Create'"
|
||||||
v-model:value="form.url"
|
v-model:value="form.url"
|
||||||
@ -61,23 +63,35 @@
|
|||||||
</p>
|
</p>
|
||||||
</a-upload-dragger>
|
</a-upload-dragger>
|
||||||
</a-form-item>
|
</a-form-item>
|
||||||
<a-form-item ref="name" name="name" :label="$t('label.name')">
|
<a-form-item ref="name" name="name">
|
||||||
|
<template #label>
|
||||||
|
<tooltip-label :title="$t('label.name')" :tooltip="apiParams.name.description"/>
|
||||||
|
</template>
|
||||||
<a-input
|
<a-input
|
||||||
v-model:value="form.name"
|
v-model:value="form.name"
|
||||||
:placeholder="apiParams.name.description"
|
:placeholder="apiParams.name.description"
|
||||||
v-focus="currentForm !== 'Create'" />
|
v-focus="currentForm !== 'Create'" />
|
||||||
</a-form-item>
|
</a-form-item>
|
||||||
<a-form-item ref="displaytext" name="displaytext" :label="$t('label.displaytext')">
|
<a-form-item ref="displaytext" name="displaytext">
|
||||||
|
<template #label>
|
||||||
|
<tooltip-label :title="$t('label.displaytext')" :tooltip="apiParams.displaytext.description"/>
|
||||||
|
</template>
|
||||||
<a-input
|
<a-input
|
||||||
v-model:value="form.displaytext"
|
v-model:value="form.displaytext"
|
||||||
:placeholder="apiParams.displaytext.description" />
|
:placeholder="apiParams.displaytext.description" />
|
||||||
</a-form-item>
|
</a-form-item>
|
||||||
|
|
||||||
<a-form-item ref="directdownload" name="directdownload" v-if="allowed && currentForm !== 'Upload'" :label="$t('label.directdownload')">
|
<a-form-item ref="directdownload" name="directdownload" v-if="allowed && currentForm !== 'Upload'">
|
||||||
|
<template #label>
|
||||||
|
<tooltip-label :title="$t('label.directdownload')" :tooltip="apiParams.directdownload.description"/>
|
||||||
|
</template>
|
||||||
<a-switch v-model:checked="form.directdownload"/>
|
<a-switch v-model:checked="form.directdownload"/>
|
||||||
</a-form-item>
|
</a-form-item>
|
||||||
|
|
||||||
<a-form-item ref="zoneid" name="zoneid" :label="$t('label.zoneid')">
|
<a-form-item ref="zoneid" name="zoneid">
|
||||||
|
<template #label>
|
||||||
|
<tooltip-label :title="$t('label.zoneid')" :tooltip="apiParams.zoneid.description"/>
|
||||||
|
</template>
|
||||||
<a-select
|
<a-select
|
||||||
v-model:value="form.zoneid"
|
v-model:value="form.zoneid"
|
||||||
showSearch
|
showSearch
|
||||||
@ -139,11 +153,17 @@
|
|||||||
</a-select>
|
</a-select>
|
||||||
</a-form-item>
|
</a-form-item>
|
||||||
|
|
||||||
<a-form-item ref="bootable" name="bootable" :label="$t('label.bootable')">
|
<a-form-item ref="bootable" name="bootable">
|
||||||
|
<template #label>
|
||||||
|
<tooltip-label :title="$t('label.bootable')" :tooltip="apiParams.bootable.description"/>
|
||||||
|
</template>
|
||||||
<a-switch v-model:checked="form.bootable" />
|
<a-switch v-model:checked="form.bootable" />
|
||||||
</a-form-item>
|
</a-form-item>
|
||||||
|
|
||||||
<a-form-item ref="ostypeid" name="ostypeid" v-if="form.bootable" :label="$t('label.ostypeid')">
|
<a-form-item ref="ostypeid" name="ostypeid" v-if="form.bootable">
|
||||||
|
<template #label>
|
||||||
|
<tooltip-label :title="$t('label.ostypeid')" :tooltip="apiParams.ostypeid.description"/>
|
||||||
|
</template>
|
||||||
<a-select
|
<a-select
|
||||||
v-model:value="form.ostypeid"
|
v-model:value="form.ostypeid"
|
||||||
showSearch
|
showSearch
|
||||||
@ -167,8 +187,10 @@
|
|||||||
<a-col :md="24" :lg="12">
|
<a-col :md="24" :lg="12">
|
||||||
<a-form-item
|
<a-form-item
|
||||||
name="userdataid"
|
name="userdataid"
|
||||||
ref="userdataid"
|
ref="userdataid">
|
||||||
:label="$t('label.userdata')">
|
<template #label>
|
||||||
|
<tooltip-label :title="$t('label.userdata')" :tooltip="linkUserDataParams.userdataid.description"/>
|
||||||
|
</template>
|
||||||
<a-select
|
<a-select
|
||||||
showSearch
|
showSearch
|
||||||
optionFilterProp="label"
|
optionFilterProp="label"
|
||||||
@ -187,7 +209,7 @@
|
|||||||
<a-col :md="24" :lg="12">
|
<a-col :md="24" :lg="12">
|
||||||
<a-form-item ref="userdatapolicy" name="userdatapolicy">
|
<a-form-item ref="userdatapolicy" name="userdatapolicy">
|
||||||
<template #label>
|
<template #label>
|
||||||
<tooltip-label :title="$t('label.userdatapolicy')" :tooltip="$t('label.userdatapolicy.tooltip')"/>
|
<tooltip-label :title="$t('label.userdatapolicy')" :tooltip="linkUserDataParams.userdatapolicy.description"/>
|
||||||
</template>
|
</template>
|
||||||
<a-select
|
<a-select
|
||||||
showSearch
|
showSearch
|
||||||
@ -205,19 +227,27 @@
|
|||||||
</a-col>
|
</a-col>
|
||||||
</a-row>
|
</a-row>
|
||||||
|
|
||||||
<a-form-item ref="isextractable" name="isextractable" :label="$t('label.isextractable')">
|
<a-form-item ref="isextractable" name="isextractable">
|
||||||
|
<template #label>
|
||||||
|
<tooltip-label :title="$t('label.isextractable')" :tooltip="apiParams.isextractable.description"/>
|
||||||
|
</template>
|
||||||
<a-switch v-model:checked="form.isextractable" />
|
<a-switch v-model:checked="form.isextractable" />
|
||||||
</a-form-item>
|
</a-form-item>
|
||||||
|
|
||||||
<a-form-item
|
<a-form-item
|
||||||
ref="ispublic"
|
ref="ispublic"
|
||||||
name="ispublic"
|
name="ispublic"
|
||||||
:label="$t('label.ispublic')"
|
|
||||||
v-if="$store.getters.userInfo.roletype === 'Admin' || $store.getters.features.userpublictemplateenabled" >
|
v-if="$store.getters.userInfo.roletype === 'Admin' || $store.getters.features.userpublictemplateenabled" >
|
||||||
|
<template #label>
|
||||||
|
<tooltip-label :title="$t('label.ispublic')" :tooltip="apiParams.ispublic.description"/>
|
||||||
|
</template>
|
||||||
<a-switch v-model:checked="form.ispublic" />
|
<a-switch v-model:checked="form.ispublic" />
|
||||||
</a-form-item>
|
</a-form-item>
|
||||||
|
|
||||||
<a-form-item ref="isfeatured" name="isfeatured" :label="$t('label.isfeatured')" v-if="$store.getters.userInfo.roletype === 'Admin'">
|
<a-form-item ref="isfeatured" name="isfeatured" v-if="$store.getters.userInfo.roletype === 'Admin'">
|
||||||
|
<template #label>
|
||||||
|
<tooltip-label :title="$t('label.isfeatured')" :tooltip="apiParams.isfeatured.description"/>
|
||||||
|
</template>
|
||||||
<a-switch v-model:checked="form.isfeatured" />
|
<a-switch v-model:checked="form.isfeatured" />
|
||||||
</a-form-item>
|
</a-form-item>
|
||||||
|
|
||||||
@ -326,7 +356,7 @@ export default {
|
|||||||
params.showicon = true
|
params.showicon = true
|
||||||
|
|
||||||
this.zoneLoading = true
|
this.zoneLoading = true
|
||||||
if (store.getters.userInfo.roletype === this.rootAdmin) {
|
if (store.getters.userInfo.roletype === 'Admin') {
|
||||||
this.allowed = true
|
this.allowed = true
|
||||||
}
|
}
|
||||||
api('listZones', params).then(json => {
|
api('listZones', params).then(json => {
|
||||||
|
|||||||
@ -32,7 +32,10 @@
|
|||||||
@finish="handleSubmit"
|
@finish="handleSubmit"
|
||||||
layout="vertical">
|
layout="vertical">
|
||||||
<div v-if="currentForm === 'Create'">
|
<div v-if="currentForm === 'Create'">
|
||||||
<a-form-item :label="$t('label.url')" name="url" ref="url">
|
<a-form-item name="url" ref="url">
|
||||||
|
<template #label>
|
||||||
|
<tooltip-label :title="$t('label.url')" :tooltip="apiParams.url.description"/>
|
||||||
|
</template>
|
||||||
<a-input
|
<a-input
|
||||||
v-focus="currentForm === 'Create'"
|
v-focus="currentForm === 'Create'"
|
||||||
v-model:value="form.url"
|
v-model:value="form.url"
|
||||||
@ -56,22 +59,30 @@
|
|||||||
</a-upload-dragger>
|
</a-upload-dragger>
|
||||||
</a-form-item>
|
</a-form-item>
|
||||||
</div>
|
</div>
|
||||||
<a-form-item :label="$t('label.name')" ref="name" name="name">
|
<a-form-item ref="name" name="name">
|
||||||
|
<template #label>
|
||||||
|
<tooltip-label :title="$t('label.name')" :tooltip="apiParams.name.description"/>
|
||||||
|
</template>
|
||||||
<a-input
|
<a-input
|
||||||
v-model:value="form.name"
|
v-model:value="form.name"
|
||||||
:placeholder="apiParams.name.description"
|
:placeholder="apiParams.name.description"
|
||||||
v-focus="currentForm !== 'Create'"/>
|
v-focus="currentForm !== 'Create'"/>
|
||||||
</a-form-item>
|
</a-form-item>
|
||||||
<a-form-item :label="$t('label.displaytext')" ref="displaytext" name="displaytext">
|
<a-form-item ref="displaytext" name="displaytext">
|
||||||
|
<template #label>
|
||||||
|
<tooltip-label :title="$t('label.displaytext')" :tooltip="apiParams.displaytext.description"/>
|
||||||
|
</template>
|
||||||
<a-input
|
<a-input
|
||||||
v-model:value="form.displaytext"
|
v-model:value="form.displaytext"
|
||||||
:placeholder="apiParams.displaytext.description" />
|
:placeholder="apiParams.displaytext.description" />
|
||||||
</a-form-item>
|
</a-form-item>
|
||||||
<div v-if="currentForm === 'Create'">
|
<div v-if="currentForm === 'Create'">
|
||||||
<a-form-item
|
<a-form-item
|
||||||
:label="$t('label.zone')"
|
|
||||||
name="zoneids"
|
name="zoneids"
|
||||||
ref="zoneids">
|
ref="zoneids">
|
||||||
|
<template #label>
|
||||||
|
<tooltip-label :title="$t('label.zone')" :tooltip="apiParams.zoneids.description"/>
|
||||||
|
</template>
|
||||||
<a-select
|
<a-select
|
||||||
v-model:value="form.zoneids"
|
v-model:value="form.zoneids"
|
||||||
:loading="zones.loading"
|
:loading="zones.loading"
|
||||||
@ -94,9 +105,11 @@
|
|||||||
</div>
|
</div>
|
||||||
<div v-else>
|
<div v-else>
|
||||||
<a-form-item
|
<a-form-item
|
||||||
:label="$t('label.zoneid')"
|
|
||||||
ref="zoneid"
|
ref="zoneid"
|
||||||
name="zoneid">
|
name="zoneid">
|
||||||
|
<template #label>
|
||||||
|
<tooltip-label :title="$t('label.zoneid')" :tooltip="apiParams.zoneid.description"/>
|
||||||
|
</template>
|
||||||
<a-select
|
<a-select
|
||||||
v-model:value="form.zoneid"
|
v-model:value="form.zoneid"
|
||||||
showSearch
|
showSearch
|
||||||
@ -160,7 +173,10 @@
|
|||||||
</a-form-item>
|
</a-form-item>
|
||||||
<a-row :gutter="12">
|
<a-row :gutter="12">
|
||||||
<a-col :md="24" :lg="12">
|
<a-col :md="24" :lg="12">
|
||||||
<a-form-item ref="hypervisor" name="hypervisor" :label="$t('label.hypervisor')">
|
<a-form-item ref="hypervisor" name="hypervisor">
|
||||||
|
<template #label>
|
||||||
|
<tooltip-label :title="$t('label.hypervisor')" :tooltip="apiParams.hypervisor.description"/>
|
||||||
|
</template>
|
||||||
<a-select
|
<a-select
|
||||||
v-model:value="form.hypervisor"
|
v-model:value="form.hypervisor"
|
||||||
:loading="hyperVisor.loading"
|
:loading="hyperVisor.loading"
|
||||||
@ -178,7 +194,10 @@
|
|||||||
</a-form-item>
|
</a-form-item>
|
||||||
</a-col>
|
</a-col>
|
||||||
<a-col :md="24" :lg="12">
|
<a-col :md="24" :lg="12">
|
||||||
<a-form-item ref="format" name="format" :label="$t('label.format')">
|
<a-form-item ref="format" name="format">
|
||||||
|
<template #label>
|
||||||
|
<tooltip-label :title="$t('label.format')" :tooltip="apiParams.format.description"/>
|
||||||
|
</template>
|
||||||
<a-select
|
<a-select
|
||||||
v-model:value="form.format"
|
v-model:value="form.format"
|
||||||
:placeholder="apiParams.format.description"
|
:placeholder="apiParams.format.description"
|
||||||
@ -197,12 +216,18 @@
|
|||||||
</a-row>
|
</a-row>
|
||||||
<a-row :gutter="12" v-if="allowed && (hyperKVMShow || hyperCustomShow) && currentForm !== 'Upload'">
|
<a-row :gutter="12" v-if="allowed && (hyperKVMShow || hyperCustomShow) && currentForm !== 'Upload'">
|
||||||
<a-col :md="24" :lg="12">
|
<a-col :md="24" :lg="12">
|
||||||
<a-form-item ref="directdownload" name="directdownload" :label="$t('label.directdownload')">
|
<a-form-item ref="directdownload" name="directdownload">
|
||||||
|
<template #label>
|
||||||
|
<tooltip-label :title="$t('label.directdownload')" :tooltip="apiParams.directdownload.description"/>
|
||||||
|
</template>
|
||||||
<a-switch v-model:checked="form.directdownload" @change="handleChangeDirect" />
|
<a-switch v-model:checked="form.directdownload" @change="handleChangeDirect" />
|
||||||
</a-form-item>
|
</a-form-item>
|
||||||
</a-col>
|
</a-col>
|
||||||
<a-col :md="24" :lg="12" v-if="allowDirectDownload">
|
<a-col :md="24" :lg="12" v-if="allowDirectDownload">
|
||||||
<a-form-item ref="checksum" name="checksum" :label="$t('label.checksum')">
|
<a-form-item ref="checksum" name="checksum">
|
||||||
|
<template #label>
|
||||||
|
<tooltip-label :title="$t('label.checksum')" :tooltip="apiParams.checksum.description"/>
|
||||||
|
</template>
|
||||||
<a-input
|
<a-input
|
||||||
v-model:value="form.checksum"
|
v-model:value="form.checksum"
|
||||||
:placeholder="apiParams.checksum.description" />
|
:placeholder="apiParams.checksum.description" />
|
||||||
@ -215,7 +240,10 @@
|
|||||||
</a-form-item>
|
</a-form-item>
|
||||||
</a-row>
|
</a-row>
|
||||||
|
|
||||||
<a-form-item ref="deployasis" name="deployasis" :label="$t('label.deployasis')" v-if="selectedFormat === 'OVA'">
|
<a-form-item ref="deployasis" name="deployasis" v-if="selectedFormat === 'OVA'">
|
||||||
|
<template #label>
|
||||||
|
<tooltip-label :title="$t('label.deployasis')" :tooltip="apiParams.deployasis.description"/>
|
||||||
|
</template>
|
||||||
<a-switch
|
<a-switch
|
||||||
v-model:checked="form.deployasis"
|
v-model:checked="form.deployasis"
|
||||||
:checked="deployasis"
|
:checked="deployasis"
|
||||||
@ -278,8 +306,10 @@
|
|||||||
<a-form-item
|
<a-form-item
|
||||||
name="ostypeid"
|
name="ostypeid"
|
||||||
ref="ostypeid"
|
ref="ostypeid"
|
||||||
:label="$t('label.ostypeid')"
|
|
||||||
v-if="!hyperVMWShow || (hyperVMWShow && !deployasis)">
|
v-if="!hyperVMWShow || (hyperVMWShow && !deployasis)">
|
||||||
|
<template #label>
|
||||||
|
<tooltip-label :title="$t('label.ostypeid')" :tooltip="apiParams.ostypeid.description"/>
|
||||||
|
</template>
|
||||||
<a-select
|
<a-select
|
||||||
showSearch
|
showSearch
|
||||||
optionFilterProp="label"
|
optionFilterProp="label"
|
||||||
@ -298,8 +328,10 @@
|
|||||||
<a-col :md="24" :lg="12">
|
<a-col :md="24" :lg="12">
|
||||||
<a-form-item
|
<a-form-item
|
||||||
name="userdataid"
|
name="userdataid"
|
||||||
ref="userdataid"
|
ref="userdataid">
|
||||||
:label="$t('label.userdata')">
|
<template #label>
|
||||||
|
<tooltip-label :title="$t('label.userdata')" :tooltip="linkUserDataParams.userdataid.description"/>
|
||||||
|
</template>
|
||||||
<a-select
|
<a-select
|
||||||
showSearch
|
showSearch
|
||||||
optionFilterProp="label"
|
optionFilterProp="label"
|
||||||
@ -318,7 +350,7 @@
|
|||||||
<a-col :md="24" :lg="12">
|
<a-col :md="24" :lg="12">
|
||||||
<a-form-item ref="userdatapolicy" name="userdatapolicy">
|
<a-form-item ref="userdatapolicy" name="userdatapolicy">
|
||||||
<template #label>
|
<template #label>
|
||||||
<tooltip-label :title="$t('label.userdatapolicy')" :tooltip="$t('label.userdatapolicy.tooltip')"/>
|
<tooltip-label :title="$t('label.userdatapolicy')" :tooltip="linkUserDataParams.userdatapolicy.description"/>
|
||||||
</template>
|
</template>
|
||||||
<a-select
|
<a-select
|
||||||
showSearch
|
showSearch
|
||||||
|
|||||||
@ -75,6 +75,23 @@
|
|||||||
:rowKey="record => record.zoneid">
|
:rowKey="record => record.zoneid">
|
||||||
</a-table>
|
</a-table>
|
||||||
</template>
|
</template>
|
||||||
|
<template #action="{ record }">
|
||||||
|
<tooltip-button
|
||||||
|
style="margin-right: 5px"
|
||||||
|
:disabled="!('copyTemplate' in $store.getters.apis && record.isready)"
|
||||||
|
:title="$t('label.action.copy.template')"
|
||||||
|
icon="copy-outlined"
|
||||||
|
:loading="copyLoading"
|
||||||
|
@onClick="showCopyTemplate(record)" />
|
||||||
|
<tooltip-button
|
||||||
|
style="margin-right: 5px"
|
||||||
|
:disabled="!('deleteTemplate' in $store.getters.apis) || record.status.startsWith('Installing')"
|
||||||
|
:title="$t('label.action.delete.template')"
|
||||||
|
type="primary"
|
||||||
|
:danger="true"
|
||||||
|
icon="delete-outlined"
|
||||||
|
@onClick="onShowDeleteModal(record)"/>
|
||||||
|
</template>
|
||||||
</a-table>
|
</a-table>
|
||||||
<a-pagination
|
<a-pagination
|
||||||
class="row-element"
|
class="row-element"
|
||||||
|
|||||||
@ -483,6 +483,9 @@ export default {
|
|||||||
} else {
|
} else {
|
||||||
this.stepData.physicalNetworkReturned = this.stepData.physicalNetworkItem['createPhysicalNetwork' + index]
|
this.stepData.physicalNetworkReturned = this.stepData.physicalNetworkItem['createPhysicalNetwork' + index]
|
||||||
}
|
}
|
||||||
|
if (physicalNetwork.traffics.findIndex(traffic => traffic.type === 'guest') > -1) {
|
||||||
|
this.stepData.guestPhysicalNetworkId = physicalNetworkReturned.id
|
||||||
|
}
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
this.messageError = e
|
this.messageError = e
|
||||||
this.processStatus = STATUS_FAILED
|
this.processStatus = STATUS_FAILED
|
||||||
@ -1181,7 +1184,7 @@ export default {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const updateParams = {}
|
const updateParams = {}
|
||||||
updateParams.id = this.stepData.physicalNetworkReturned.id
|
updateParams.id = this.stepData.guestPhysicalNetworkId
|
||||||
updateParams.vlan = vlan
|
updateParams.vlan = vlan
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
|||||||
@ -272,4 +272,21 @@ public final class CloudStackVersion implements Comparable<CloudStackVersion> {
|
|||||||
public String toString() {
|
public String toString() {
|
||||||
return Joiner.on(".").join(asList());
|
return Joiner.on(".").join(asList());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the parent version of VMware hypervisor version
|
||||||
|
* @since 4.18.1.0
|
||||||
|
*/
|
||||||
|
public static String getVMwareParentVersion(String hypervisorVersion) {
|
||||||
|
try {
|
||||||
|
CloudStackVersion version = CloudStackVersion.parse(hypervisorVersion);
|
||||||
|
String parentVersion = String.format("%s.%s", version.getMajorRelease(), version.getMinorRelease());
|
||||||
|
if (version.getPatchRelease() != 0) {
|
||||||
|
parentVersion = String.format("%s.%s", parentVersion, version.getPatchRelease());
|
||||||
|
}
|
||||||
|
return parentVersion;
|
||||||
|
} catch (Exception ex) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -21,6 +21,7 @@ package org.apache.cloudstack.utils;
|
|||||||
import com.google.common.testing.EqualsTester;
|
import com.google.common.testing.EqualsTester;
|
||||||
import com.tngtech.java.junit.dataprovider.DataProvider;
|
import com.tngtech.java.junit.dataprovider.DataProvider;
|
||||||
import com.tngtech.java.junit.dataprovider.DataProviderRunner;
|
import com.tngtech.java.junit.dataprovider.DataProviderRunner;
|
||||||
|
import org.junit.Assert;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.junit.runner.RunWith;
|
import org.junit.runner.RunWith;
|
||||||
|
|
||||||
@ -204,4 +205,23 @@ public final class CloudStackVersionTest {
|
|||||||
assertEquals(expected, CloudStackVersion.trimRouterVersion(value));
|
assertEquals(expected, CloudStackVersion.trimRouterVersion(value));
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void verifyGetVMwareParentVersion(String hypervisorVersion, String expectedParentVersion) {
|
||||||
|
if (expectedParentVersion == null) {
|
||||||
|
Assert.assertNull(CloudStackVersion.getVMwareParentVersion(hypervisorVersion));
|
||||||
|
} else {
|
||||||
|
Assert.assertEquals(CloudStackVersion.getVMwareParentVersion(hypervisorVersion), expectedParentVersion);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@Test
|
||||||
|
public void testGetParentVersion() {
|
||||||
|
verifyGetVMwareParentVersion(null, null);
|
||||||
|
verifyGetVMwareParentVersion("6.5", null);
|
||||||
|
verifyGetVMwareParentVersion("6.7.3", "6.7.3");
|
||||||
|
verifyGetVMwareParentVersion("7.0.3.0", "7.0.3");
|
||||||
|
verifyGetVMwareParentVersion("8.0", null);
|
||||||
|
verifyGetVMwareParentVersion("8.0.0", "8.0");
|
||||||
|
verifyGetVMwareParentVersion("8.0.0.2", "8.0");
|
||||||
|
verifyGetVMwareParentVersion("8.0.1.0", "8.0.1");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user