Skip to content

Commit 03f8c2f

Browse files
authored
Merge branch 'main' into enforce-distinct-hostnames-network
2 parents 6f2136e + f67b738 commit 03f8c2f

File tree

157 files changed

+4038
-596
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

157 files changed

+4038
-596
lines changed

api/src/main/java/com/cloud/offering/DiskOffering.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ enum State {
3737
State getState();
3838

3939
enum DiskCacheMode {
40-
NONE("none"), WRITEBACK("writeback"), WRITETHROUGH("writethrough");
40+
NONE("none"), WRITEBACK("writeback"), WRITETHROUGH("writethrough"), HYPERVISOR_DEFAULT("hypervisor_default");
4141

4242
private final String _diskCacheMode;
4343

@@ -69,6 +69,8 @@ public String toString() {
6969

7070
boolean isCustomized();
7171

72+
boolean isShared();
73+
7274
void setDiskSize(long diskSize);
7375

7476
long getDiskSize();
@@ -99,7 +101,6 @@ public String toString() {
99101

100102
Long getBytesReadRateMaxLength();
101103

102-
103104
void setBytesWriteRate(Long bytesWriteRate);
104105

105106
Long getBytesWriteRate();
@@ -112,7 +113,6 @@ public String toString() {
112113

113114
Long getBytesWriteRateMaxLength();
114115

115-
116116
void setIopsReadRate(Long iopsReadRate);
117117

118118
Long getIopsReadRate();
@@ -133,7 +133,6 @@ public String toString() {
133133

134134
Long getIopsWriteRateMax();
135135

136-
137136
void setIopsWriteRateMaxLength(Long iopsWriteRateMaxLength);
138137

139138
Long getIopsWriteRateMaxLength();

api/src/main/java/com/cloud/storage/VolumeApiService.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -180,6 +180,8 @@ Volume updateVolume(long volumeId, String path, String state, Long storageId,
180180
*/
181181
boolean doesStoragePoolSupportDiskOfferingTags(StoragePool destPool, String diskOfferingTags);
182182

183+
boolean validateConditionsToReplaceDiskOfferingOfVolume(Volume volume, DiskOffering newDiskOffering, StoragePool destPool);
184+
183185
Volume destroyVolume(long volumeId, Account caller, boolean expunge, boolean forceExpunge);
184186

185187
void destroyVolume(long volumeId);

api/src/main/java/com/cloud/vm/UserVmService.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@
6464
import com.cloud.template.VirtualMachineTemplate;
6565
import com.cloud.user.Account;
6666
import com.cloud.uservm.UserVm;
67+
import com.cloud.utils.Pair;
6768
import com.cloud.utils.exception.ExecutionException;
6869

6970
public interface UserVmService {
@@ -538,9 +539,10 @@ UserVm importVM(final DataCenter zone, final Host host, final VirtualMachineTemp
538539

539540
/**
540541
* Unmanage a guest VM from CloudStack
541-
* @return true if the VM is successfully unmanaged, false if not.
542+
*
543+
* @return (true if successful, false if not, hostUuid) if the VM is successfully unmanaged.
542544
*/
543-
boolean unmanageUserVM(Long vmId);
545+
Pair<Boolean, String> unmanageUserVM(Long vmId, Long targetHostId);
544546

545547
UserVm allocateVMFromBackup(CreateVMFromBackupCmd cmd) throws InsufficientCapacityException, ResourceAllocationException, ResourceUnavailableException;
546548

api/src/main/java/org/apache/cloudstack/api/ApiConstants.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ public class ApiConstants {
2727
public static final String ACTIVATION_RULE = "activationrule";
2828
public static final String ACTIVITY = "activity";
2929
public static final String ADAPTER_TYPE = "adaptertype";
30+
public static final String ADDITONAL_CONFIG_ENABLED = "additionalconfigenabled";
3031
public static final String ADDRESS = "address";
3132
public static final String ALGORITHM = "algorithm";
3233
public static final String ALIAS = "alias";

api/src/main/java/org/apache/cloudstack/api/command/admin/offering/CreateDiskOfferingCmd.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,7 @@ public class CreateDiskOfferingCmd extends BaseCmd {
151151
@Parameter(name = ApiConstants.CACHE_MODE,
152152
type = CommandType.STRING,
153153
required = false,
154-
description = "the cache mode to use for this disk offering. none, writeback or writethrough",
154+
description = "the cache mode to use for this disk offering. none, writeback, writethrough or hypervisor default. If the hypervisor default cache mode is used on other hypervisors than KVM, it will fall back to none cache mode",
155155
since = "4.14")
156156
private String cacheMode;
157157

api/src/main/java/org/apache/cloudstack/api/command/admin/offering/CreateServiceOfferingCmd.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -190,7 +190,7 @@ public class CreateServiceOfferingCmd extends BaseCmd {
190190
@Parameter(name = ApiConstants.CACHE_MODE,
191191
type = CommandType.STRING,
192192
required = false,
193-
description = "the cache mode to use for this disk offering. none, writeback or writethrough",
193+
description = "the cache mode to use for this disk offering. none, writeback, writethrough or hypervisor default. If the hypervisor default cache mode is used on other hypervisors than KVM, it will fall back to none cache mode",
194194
since = "4.14")
195195
private String cacheMode;
196196

api/src/main/java/org/apache/cloudstack/api/command/admin/vm/UnmanageVMInstanceCmd.java

Lines changed: 33 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
import com.cloud.exception.ResourceUnavailableException;
2828
import com.cloud.user.Account;
2929
import com.cloud.uservm.UserVm;
30+
import com.cloud.utils.Pair;
3031
import com.cloud.vm.VirtualMachine;
3132
import org.apache.cloudstack.acl.RoleType;
3233
import org.apache.cloudstack.api.APICommand;
@@ -36,10 +37,12 @@
3637
import org.apache.cloudstack.api.BaseAsyncCmd;
3738
import org.apache.cloudstack.api.Parameter;
3839
import org.apache.cloudstack.api.ServerApiException;
40+
import org.apache.cloudstack.api.response.HostResponse;
3941
import org.apache.cloudstack.api.response.UnmanageVMInstanceResponse;
4042
import org.apache.cloudstack.api.response.UserVmResponse;
4143
import org.apache.cloudstack.context.CallContext;
4244
import org.apache.cloudstack.vm.UnmanagedVMsManager;
45+
import org.apache.commons.lang3.BooleanUtils;
4346

4447
import javax.inject.Inject;
4548

@@ -65,6 +68,20 @@ public class UnmanageVMInstanceCmd extends BaseAsyncCmd {
6568
description = "The ID of the virtual machine to unmanage")
6669
private Long vmId;
6770

71+
@Parameter(name = ApiConstants.HOST_ID, type = CommandType.UUID,
72+
entityType = HostResponse.class, required = false,
73+
description = "ID of the host which will be used for unmanaging the Instance. " +
74+
"Applicable only for KVM hypervisor and stopped Instances. Domain XML will be stored on this host.",
75+
since = "4.22.0")
76+
private Long hostId;
77+
78+
@Parameter(name = ApiConstants.FORCED,
79+
type = CommandType.BOOLEAN,
80+
required = false,
81+
description = "Force unmanaging Instance with config drive. Applicable only for KVM Hypervisor.",
82+
since = "4.22.0")
83+
private Boolean forced;
84+
6885
/////////////////////////////////////////////////////
6986
/////////////////// Accessors ///////////////////////
7087
/////////////////////////////////////////////////////
@@ -83,6 +100,18 @@ public String getEventDescription() {
83100
return "unmanaging VM. VM ID = " + vmId;
84101
}
85102

103+
public Long getHostId() {
104+
return hostId;
105+
}
106+
107+
public void setHostId(Long hostId) {
108+
this.hostId = hostId;
109+
}
110+
111+
public Boolean isForced() {
112+
return BooleanUtils.isTrue(forced);
113+
}
114+
86115
/////////////////////////////////////////////////////
87116
/////////////// API Implementation///////////////////
88117
/////////////////////////////////////////////////////
@@ -93,9 +122,10 @@ public void execute() throws ResourceUnavailableException, InsufficientCapacityE
93122
UnmanageVMInstanceResponse response = new UnmanageVMInstanceResponse();
94123
try {
95124
CallContext.current().setEventDetails("VM ID = " + vmId);
96-
boolean result = unmanagedVMsManager.unmanageVMInstance(vmId);
97-
response.setSuccess(result);
98-
if (result) {
125+
Pair<Boolean, String> result = unmanagedVMsManager.unmanageVMInstance(vmId, hostId, isForced());
126+
if (result.first()) {
127+
response.setSuccess(true);
128+
response.setHostId(result.second());
99129
response.setDetails("VM unmanaged successfully");
100130
}
101131
} catch (Exception e) {
@@ -124,5 +154,4 @@ public ApiCommandResourceType getApiResourceType() {
124154
public Long getApiResourceId() {
125155
return vmId;
126156
}
127-
128157
}

api/src/main/java/org/apache/cloudstack/api/command/user/config/ListCapabilitiesCmd.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@ public void execute() {
7575
response.setInstanceLeaseEnabled((Boolean) capabilities.get(ApiConstants.INSTANCE_LEASE_ENABLED));
7676
response.setExtensionsPath((String)capabilities.get(ApiConstants.EXTENSIONS_PATH));
7777
response.setDynamicScalingEnabled((Boolean) capabilities.get(ApiConstants.DYNAMIC_SCALING_ENABLED));
78+
response.setAdditionalConfigEnabled((Boolean) capabilities.get(ApiConstants.ADDITONAL_CONFIG_ENABLED));
7879
response.setObjectName("capability");
7980
response.setResponseName(getCommandName());
8081
this.setResponseObject(response);

api/src/main/java/org/apache/cloudstack/api/command/user/vpn/AddVpnUserCmd.java

Lines changed: 1 addition & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@
2828
import org.apache.cloudstack.api.response.VpnUsersResponse;
2929
import org.apache.cloudstack.context.CallContext;
3030

31-
import com.cloud.domain.Domain;
3231
import com.cloud.event.EventTypes;
3332
import com.cloud.network.VpnUser;
3433
import com.cloud.user.Account;
@@ -110,32 +109,17 @@ public String getEventType() {
110109
@Override
111110
public void execute() {
112111
VpnUser vpnUser = _entityMgr.findById(VpnUser.class, getEntityId());
113-
Account account = _entityMgr.findById(Account.class, vpnUser.getAccountId());
114112
try {
115113
if (!_ravService.applyVpnUsers(vpnUser.getAccountId(), userName)) {
116114
throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to add vpn user");
117115
}
118116
} catch (Exception ex) {
119117
throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, ex.getMessage());
120118
}
121-
122-
VpnUsersResponse vpnResponse = new VpnUsersResponse();
123-
vpnResponse.setId(vpnUser.getUuid());
124-
vpnResponse.setUserName(vpnUser.getUsername());
125-
vpnResponse.setAccountName(account.getAccountName());
126119
// re-retrieve the vpnuser, as the call to `applyVpnUsers` might have changed the state
127120
vpnUser = _entityMgr.findById(VpnUser.class, getEntityId());
128-
vpnResponse.setState(vpnUser.getState().toString());
129-
130-
Domain domain = _entityMgr.findById(Domain.class, account.getDomainId());
131-
if (domain != null) {
132-
vpnResponse.setDomainId(domain.getUuid());
133-
vpnResponse.setDomainName(domain.getName());
134-
vpnResponse.setDomainPath(domain.getPath());
135-
}
136-
121+
VpnUsersResponse vpnResponse = _responseGenerator.createVpnUserResponse(vpnUser);
137122
vpnResponse.setResponseName(getCommandName());
138-
vpnResponse.setObjectName("vpnuser");
139123
setResponseObject(vpnResponse);
140124
}
141125

api/src/main/java/org/apache/cloudstack/api/response/CapabilitiesResponse.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,10 @@ public class CapabilitiesResponse extends BaseResponse {
149149
@Param(description = "true if dynamically scaling for instances is enabled", since = "4.21.0")
150150
private Boolean dynamicScalingEnabled;
151151

152+
@SerializedName(ApiConstants.ADDITONAL_CONFIG_ENABLED)
153+
@Param(description = "true if additional configurations or extraconfig can be passed to Instances", since = "4.20.2")
154+
private Boolean additionalConfigEnabled;
155+
152156
public void setSecurityGroupsEnabled(boolean securityGroupsEnabled) {
153157
this.securityGroupsEnabled = securityGroupsEnabled;
154158
}
@@ -272,4 +276,8 @@ public void setExtensionsPath(String extensionsPath) {
272276
public void setDynamicScalingEnabled(Boolean dynamicScalingEnabled) {
273277
this.dynamicScalingEnabled = dynamicScalingEnabled;
274278
}
279+
280+
public void setAdditionalConfigEnabled(Boolean additionalConfigEnabled) {
281+
this.additionalConfigEnabled = additionalConfigEnabled;
282+
}
275283
}

0 commit comments

Comments
 (0)