Skip to content

Commit f7999bc

Browse files
committed
Merge remote-tracking branch 'apache/main' into improve-publicip-associate
2 parents 5f1cce4 + 858663f commit f7999bc

File tree

46 files changed

+2323
-257
lines changed

Some content is hidden

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

46 files changed

+2323
-257
lines changed

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/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/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
}

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

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,10 @@ public class UnmanageVMInstanceResponse extends BaseResponse {
3232
@Param(description = "details of the unmanage VM operation")
3333
private String details;
3434

35+
@SerializedName(ApiConstants.HOST_ID)
36+
@Param(description = "The ID of the host used for unmanaged Instance")
37+
private String hostId;
38+
3539
public UnmanageVMInstanceResponse() {
3640
}
3741

@@ -55,4 +59,12 @@ public String getDetails() {
5559
public void setDetails(String details) {
5660
this.details = details;
5761
}
62+
63+
public String getHostId() {
64+
return hostId;
65+
}
66+
67+
public void setHostId(String hostId) {
68+
this.hostId = hostId;
69+
}
5870
}

api/src/main/java/org/apache/cloudstack/backup/BackupManager.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ public interface BackupManager extends BackupService, Configurable, PluggableSer
5555
ConfigKey<String> BackupProviderPlugin = new ConfigKey<>("Advanced", String.class,
5656
"backup.framework.provider.plugin",
5757
"dummy",
58-
"The backup and recovery provider plugin.", true, ConfigKey.Scope.Zone, BackupFrameworkEnabled.key());
58+
"The backup and recovery provider plugin. Valid plugin values: dummy, veeam, networker and nas", true, ConfigKey.Scope.Zone, BackupFrameworkEnabled.key());
5959

6060
ConfigKey<Long> BackupSyncPollingInterval = new ConfigKey<>("Advanced", Long.class,
6161
"backup.framework.sync.interval",

api/src/main/java/org/apache/cloudstack/vm/UnmanageVMService.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,14 @@
1717

1818
package org.apache.cloudstack.vm;
1919

20+
import com.cloud.utils.Pair;
21+
2022
public interface UnmanageVMService {
2123

2224
/**
2325
* Unmanage a guest VM from CloudStack
24-
* @return true if the VM is successfully unmanaged, false if not.
26+
*
27+
* @return (true if successful, false if not, hostUuid) if the VM is successfully unmanaged.
2528
*/
26-
boolean unmanageVMInstance(long vmId);
29+
Pair<Boolean, String> unmanageVMInstance(long vmId, Long paramHostId, boolean isForced);
2730
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
//
2+
// Licensed to the Apache Software Foundation (ASF) under one
3+
// or more contributor license agreements. See the NOTICE file
4+
// distributed with this work for additional information
5+
// regarding copyright ownership. The ASF licenses this file
6+
// to you under the Apache License, Version 2.0 (the
7+
// "License"); you may not use this file except in compliance
8+
// with the License. You may obtain a copy of the License at
9+
//
10+
// http://www.apache.org/licenses/LICENSE-2.0
11+
//
12+
// Unless required by applicable law or agreed to in writing,
13+
// software distributed under the License is distributed on an
14+
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15+
// KIND, either express or implied. See the License for the
16+
// specific language governing permissions and limitations
17+
// under the License.
18+
//
19+
20+
package com.cloud.agent.api;
21+
22+
public class UnmanageInstanceAnswer extends Answer {
23+
24+
public UnmanageInstanceAnswer(UnmanageInstanceCommand cmd, boolean success, String details) {
25+
super(cmd, success, details);
26+
}
27+
}
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
//
2+
// Licensed to the Apache Software Foundation (ASF) under one
3+
// or more contributor license agreements. See the NOTICE file
4+
// distributed with this work for additional information
5+
// regarding copyright ownership. The ASF licenses this file
6+
// to you under the Apache License, Version 2.0 (the
7+
// "License"); you may not use this file except in compliance
8+
// with the License. You may obtain a copy of the License at
9+
//
10+
// http://www.apache.org/licenses/LICENSE-2.0
11+
//
12+
// Unless required by applicable law or agreed to in writing,
13+
// software distributed under the License is distributed on an
14+
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15+
// KIND, either express or implied. See the License for the
16+
// specific language governing permissions and limitations
17+
// under the License.
18+
//
19+
20+
package com.cloud.agent.api;
21+
22+
import com.cloud.agent.api.to.VirtualMachineTO;
23+
24+
/**
25+
*/
26+
public class UnmanageInstanceCommand extends Command {
27+
String instanceName;
28+
boolean executeInSequence = false;
29+
VirtualMachineTO vm;
30+
boolean isConfigDriveAttached;
31+
32+
@Override
33+
public boolean executeInSequence() {
34+
return executeInSequence;
35+
}
36+
37+
public UnmanageInstanceCommand(VirtualMachineTO vm) {
38+
this.vm = vm;
39+
this.instanceName = vm.getName();
40+
}
41+
42+
public UnmanageInstanceCommand(String instanceName) {
43+
this.instanceName = instanceName;
44+
}
45+
46+
public String getInstanceName() {
47+
return instanceName;
48+
}
49+
50+
public VirtualMachineTO getVm() {
51+
return vm;
52+
}
53+
54+
public boolean isConfigDriveAttached() {
55+
return isConfigDriveAttached;
56+
}
57+
58+
public void setConfigDriveAttached(boolean configDriveAttached) {
59+
isConfigDriveAttached = configDriveAttached;
60+
}
61+
}

0 commit comments

Comments
 (0)