Skip to content

Commit 3d85bc6

Browse files
committed
First draft including checks
1 parent 07d4730 commit 3d85bc6

File tree

6 files changed

+85
-106
lines changed

6 files changed

+85
-106
lines changed

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@
4343

4444
@APICommand(name = UnmanageVMInstanceCmd.API_NAME,
4545
description = "Unmanage a virtual machine from a given cluster.",
46-
responseObject = UserVmResponse.class,
46+
responseObject = UnmanageVMInstanceResponse.class,
4747
responseView = ResponseObject.ResponseView.Full,
4848
requestHasSensitiveInfo = false,
4949
authorized = {RoleType.Admin},
@@ -60,7 +60,7 @@ public class UnmanageVMInstanceCmd extends BaseAsyncCmd {
6060
//////////////// API parameters /////////////////////
6161
/////////////////////////////////////////////////////
6262

63-
@Parameter(name = ApiConstants.VIRTUAL_MACHINE_ID, type = CommandType.UUID,
63+
@Parameter(name = ApiConstants.ID, type = CommandType.UUID,
6464
entityType = UserVmResponse.class, required = true,
6565
description = "The ID of the virtual machine to unmanage")
6666
private Long vmId;

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,11 @@ public class UnmanageVMInstanceResponse extends BaseResponse {
3535
public UnmanageVMInstanceResponse() {
3636
}
3737

38+
public UnmanageVMInstanceResponse(boolean success, String details) {
39+
this.success = success;
40+
this.details = details;
41+
}
42+
3843
public boolean isSuccess() {
3944
return success;
4045
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package com.cloud.agent.api;
2+
3+
public class UnmanageVMInstanceAnswer extends Answer {
4+
5+
public UnmanageVMInstanceAnswer() {
6+
}
7+
}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
// Licensed to the Apache Software Foundation (ASF) under one
2+
// or more contributor license agreements. See the NOTICE file
3+
// distributed with this work for additional information
4+
// regarding copyright ownership. The ASF licenses this file
5+
// to you under the Apache License, Version 2.0 (the
6+
// "License"); you may not use this file except in compliance
7+
// with the License. You may obtain a copy of the License at
8+
//
9+
// http://www.apache.org/licenses/LICENSE-2.0
10+
//
11+
// Unless required by applicable law or agreed to in writing,
12+
// software distributed under the License is distributed on an
13+
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
14+
// KIND, either express or implied. See the License for the
15+
// specific language governing permissions and limitations
16+
// under the License.
17+
18+
package com.cloud.agent.api;
19+
20+
public class UnmanageVMInstanceCommand extends Command {
21+
22+
private String instanceName;
23+
24+
public UnmanageVMInstanceCommand() {
25+
}
26+
27+
public String getInstanceName() {
28+
return instanceName;
29+
}
30+
31+
public void setInstanceName(String instanceName) {
32+
this.instanceName = instanceName;
33+
}
34+
35+
@Override
36+
public boolean executeInSequence() {
37+
return false;
38+
}
39+
}

plugins/hypervisors/vmware/src/main/java/com/cloud/hypervisor/vmware/resource/VmwareResource.java

Lines changed: 8 additions & 100 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@
4444
import javax.naming.ConfigurationException;
4545
import javax.xml.datatype.XMLGregorianCalendar;
4646

47+
import com.cloud.agent.api.*;
4748
import org.apache.cloudstack.api.ApiConstants;
4849
import org.apache.cloudstack.storage.command.CopyCommand;
4950
import org.apache.cloudstack.storage.command.StorageSubSystemCommand;
@@ -62,106 +63,6 @@
6263
import org.joda.time.Duration;
6364

6465
import com.cloud.agent.IAgentControl;
65-
import com.cloud.agent.api.Answer;
66-
import com.cloud.agent.api.AttachIsoAnswer;
67-
import com.cloud.agent.api.AttachIsoCommand;
68-
import com.cloud.agent.api.BackupSnapshotAnswer;
69-
import com.cloud.agent.api.BackupSnapshotCommand;
70-
import com.cloud.agent.api.CheckHealthAnswer;
71-
import com.cloud.agent.api.CheckHealthCommand;
72-
import com.cloud.agent.api.CheckNetworkAnswer;
73-
import com.cloud.agent.api.CheckNetworkCommand;
74-
import com.cloud.agent.api.CheckOnHostAnswer;
75-
import com.cloud.agent.api.CheckOnHostCommand;
76-
import com.cloud.agent.api.CheckVirtualMachineAnswer;
77-
import com.cloud.agent.api.CheckVirtualMachineCommand;
78-
import com.cloud.agent.api.Command;
79-
import com.cloud.agent.api.CreatePrivateTemplateFromSnapshotCommand;
80-
import com.cloud.agent.api.CreatePrivateTemplateFromVolumeCommand;
81-
import com.cloud.agent.api.CreateStoragePoolCommand;
82-
import com.cloud.agent.api.CreateVMSnapshotAnswer;
83-
import com.cloud.agent.api.CreateVMSnapshotCommand;
84-
import com.cloud.agent.api.CreateVolumeFromSnapshotAnswer;
85-
import com.cloud.agent.api.CreateVolumeFromSnapshotCommand;
86-
import com.cloud.agent.api.DeleteStoragePoolCommand;
87-
import com.cloud.agent.api.DeleteVMSnapshotAnswer;
88-
import com.cloud.agent.api.DeleteVMSnapshotCommand;
89-
import com.cloud.agent.api.GetHostStatsAnswer;
90-
import com.cloud.agent.api.GetHostStatsCommand;
91-
import com.cloud.agent.api.GetStorageStatsAnswer;
92-
import com.cloud.agent.api.GetStorageStatsCommand;
93-
import com.cloud.agent.api.GetUnmanagedInstancesAnswer;
94-
import com.cloud.agent.api.GetUnmanagedInstancesCommand;
95-
import com.cloud.agent.api.GetVmDiskStatsAnswer;
96-
import com.cloud.agent.api.GetVmDiskStatsCommand;
97-
import com.cloud.agent.api.GetVmIpAddressCommand;
98-
import com.cloud.agent.api.GetVmNetworkStatsAnswer;
99-
import com.cloud.agent.api.GetVmNetworkStatsCommand;
100-
import com.cloud.agent.api.GetVmStatsAnswer;
101-
import com.cloud.agent.api.GetVmStatsCommand;
102-
import com.cloud.agent.api.GetVncPortAnswer;
103-
import com.cloud.agent.api.GetVncPortCommand;
104-
import com.cloud.agent.api.GetVolumeStatsAnswer;
105-
import com.cloud.agent.api.GetVolumeStatsCommand;
106-
import com.cloud.agent.api.HostStatsEntry;
107-
import com.cloud.agent.api.HostVmStateReportEntry;
108-
import com.cloud.agent.api.MaintainAnswer;
109-
import com.cloud.agent.api.MaintainCommand;
110-
import com.cloud.agent.api.ManageSnapshotAnswer;
111-
import com.cloud.agent.api.ManageSnapshotCommand;
112-
import com.cloud.agent.api.MigrateAnswer;
113-
import com.cloud.agent.api.MigrateCommand;
114-
import com.cloud.agent.api.MigrateVmToPoolAnswer;
115-
import com.cloud.agent.api.MigrateVmToPoolCommand;
116-
import com.cloud.agent.api.MigrateWithStorageAnswer;
117-
import com.cloud.agent.api.MigrateWithStorageCommand;
118-
import com.cloud.agent.api.ModifySshKeysCommand;
119-
import com.cloud.agent.api.ModifyStoragePoolAnswer;
120-
import com.cloud.agent.api.ModifyStoragePoolCommand;
121-
import com.cloud.agent.api.ModifyTargetsAnswer;
122-
import com.cloud.agent.api.ModifyTargetsCommand;
123-
import com.cloud.agent.api.NetworkUsageAnswer;
124-
import com.cloud.agent.api.NetworkUsageCommand;
125-
import com.cloud.agent.api.PingCommand;
126-
import com.cloud.agent.api.PingRoutingCommand;
127-
import com.cloud.agent.api.PingTestCommand;
128-
import com.cloud.agent.api.PlugNicAnswer;
129-
import com.cloud.agent.api.PlugNicCommand;
130-
import com.cloud.agent.api.PrepareForMigrationAnswer;
131-
import com.cloud.agent.api.PrepareForMigrationCommand;
132-
import com.cloud.agent.api.PvlanSetupCommand;
133-
import com.cloud.agent.api.ReadyAnswer;
134-
import com.cloud.agent.api.ReadyCommand;
135-
import com.cloud.agent.api.RebootAnswer;
136-
import com.cloud.agent.api.RebootCommand;
137-
import com.cloud.agent.api.RebootRouterCommand;
138-
import com.cloud.agent.api.ReplugNicAnswer;
139-
import com.cloud.agent.api.ReplugNicCommand;
140-
import com.cloud.agent.api.RevertToVMSnapshotAnswer;
141-
import com.cloud.agent.api.RevertToVMSnapshotCommand;
142-
import com.cloud.agent.api.ScaleVmAnswer;
143-
import com.cloud.agent.api.ScaleVmCommand;
144-
import com.cloud.agent.api.SetupAnswer;
145-
import com.cloud.agent.api.SetupCommand;
146-
import com.cloud.agent.api.SetupGuestNetworkCommand;
147-
import com.cloud.agent.api.StartAnswer;
148-
import com.cloud.agent.api.StartCommand;
149-
import com.cloud.agent.api.StartupCommand;
150-
import com.cloud.agent.api.StartupRoutingCommand;
151-
import com.cloud.agent.api.StartupStorageCommand;
152-
import com.cloud.agent.api.StopAnswer;
153-
import com.cloud.agent.api.StopCommand;
154-
import com.cloud.agent.api.StoragePoolInfo;
155-
import com.cloud.agent.api.UnPlugNicAnswer;
156-
import com.cloud.agent.api.UnPlugNicCommand;
157-
import com.cloud.agent.api.UnregisterNicCommand;
158-
import com.cloud.agent.api.UnregisterVMCommand;
159-
import com.cloud.agent.api.UpgradeSnapshotCommand;
160-
import com.cloud.agent.api.ValidateSnapshotAnswer;
161-
import com.cloud.agent.api.ValidateSnapshotCommand;
162-
import com.cloud.agent.api.VmDiskStatsEntry;
163-
import com.cloud.agent.api.VmStatsEntry;
164-
import com.cloud.agent.api.VolumeStatsEntry;
16566
import com.cloud.agent.api.check.CheckSshAnswer;
16667
import com.cloud.agent.api.check.CheckSshCommand;
16768
import com.cloud.agent.api.routing.IpAssocCommand;
@@ -561,6 +462,8 @@ public Answer executeRequest(Command cmd) {
561462
answer = execute((UnregisterNicCommand) cmd);
562463
} else if (clz == GetUnmanagedInstancesCommand.class) {
563464
answer = execute((GetUnmanagedInstancesCommand) cmd);
465+
} else if (clz == UnmanageVMInstanceCommand.class) {
466+
answer = execute((UnmanageVMInstanceCommand) cmd);
564467
} else {
565468
answer = Answer.createUnsupportedCommandAnswer(cmd);
566469
}
@@ -7098,4 +7001,9 @@ private Answer execute(GetUnmanagedInstancesCommand cmd) {
70987001
}
70997002
return new GetUnmanagedInstancesAnswer(cmd, "", unmanagedInstances);
71007003
}
7004+
7005+
private Answer execute(UnmanageVMInstanceCommand cmd) {
7006+
s_logger.info("Unmanage VMware instance " + cmd.getInstanceName());
7007+
return new UnmanageVMInstanceAnswer();
7008+
}
71017009
}

server/src/main/java/org/apache/cloudstack/vm/UnmanageVMManagerImpl.java

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@
2525

2626
import javax.inject.Inject;
2727

28+
import com.cloud.agent.api.UnmanageVMInstanceAnswer;
29+
import com.cloud.agent.api.UnmanageVMInstanceCommand;
2830
import org.apache.cloudstack.api.ApiConstants;
2931
import org.apache.cloudstack.api.ApiErrorCode;
3032
import org.apache.cloudstack.api.ResponseGenerator;
@@ -1219,9 +1221,27 @@ public List<Class<?>> getCommands() {
12191221

12201222
@Override
12211223
public UnmanageVMInstanceResponse unmanageVMInstance(UnmanageVMInstanceCmd cmd) {
1222-
UnmanageVMInstanceResponse response = new UnmanageVMInstanceResponse();
1223-
response.setSuccess(true);
1224-
response.setDetails("VM unmanaged successfully");
1225-
return response;
1224+
Long vmId = cmd.getVmId();
1225+
VMInstanceVO vmVO = vmDao.findById(vmId);
1226+
if (vmVO == null) {
1227+
return new UnmanageVMInstanceResponse(false, "Could not find VM with id = " + vmId);
1228+
} else if (vmVO.getState() == VirtualMachine.State.Destroyed || vmVO.getState() == VirtualMachine.State.Expunging) {
1229+
return new UnmanageVMInstanceResponse(false, "VM with id = " + vmVO.getUuid() + " is destroyed and cannot be unmanaged");
1230+
}
1231+
String instanceName = vmVO.getInstanceName();
1232+
Long hostId = vmVO.getHostId();
1233+
1234+
// Communicate with hypervisor (if needed)
1235+
UnmanageVMInstanceCommand command = new UnmanageVMInstanceCommand();
1236+
command.setInstanceName(instanceName);
1237+
Answer ans = agentManager.easySend(hostId, command);
1238+
if (!(ans instanceof UnmanageVMInstanceAnswer)) {
1239+
return new UnmanageVMInstanceResponse(false, "Error communicating with host " + hostId);
1240+
}
1241+
UnmanageVMInstanceAnswer answer = (UnmanageVMInstanceAnswer) ans;
1242+
1243+
//TODO:Management server release
1244+
1245+
return new UnmanageVMInstanceResponse(true, "VM " + instanceName + " unmanaged successfully");
12261246
}
12271247
}

0 commit comments

Comments
 (0)