Skip to content

Commit bf4cc9e

Browse files
committed
refactor, configurable extension path
Signed-off-by: Abhishek Kumar <[email protected]>
1 parent b4350d9 commit bf4cc9e

File tree

9 files changed

+270
-216
lines changed

9 files changed

+270
-216
lines changed

engine/components-api/src/main/java/com/cloud/hypervisor/ExternalProvisioner.java

Lines changed: 14 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,13 @@
1616
// under the License.
1717
package com.cloud.hypervisor;
1818

19+
import java.util.Map;
20+
1921
import com.cloud.agent.api.HostVmStateReportEntry;
20-
import com.cloud.agent.api.PrepareExternalProvisioningAnswer;
21-
import com.cloud.agent.api.PrepareExternalProvisioningCommand;
2222
import com.cloud.agent.api.PostExternalProvisioningAnswer;
2323
import com.cloud.agent.api.PostExternalProvisioningCommand;
24+
import com.cloud.agent.api.PrepareExternalProvisioningAnswer;
25+
import com.cloud.agent.api.PrepareExternalProvisioningCommand;
2426
import com.cloud.agent.api.RebootAnswer;
2527
import com.cloud.agent.api.RebootCommand;
2628
import com.cloud.agent.api.RunCustomActionAnswer;
@@ -31,8 +33,6 @@
3133
import com.cloud.agent.api.StopCommand;
3234
import com.cloud.utils.component.Manager;
3335

34-
import java.util.HashMap;
35-
3636
public interface ExternalProvisioner extends Manager {
3737
/**
3838
* Returns the unique name of the provider
@@ -46,25 +46,23 @@ public interface ExternalProvisioner extends Manager {
4646
*/
4747
String getDescription();
4848

49-
PrepareExternalProvisioningAnswer prepareExternalProvisioning(PrepareExternalProvisioningCommand cmd);
50-
51-
StartAnswer startInstance(StartCommand cmd);
49+
String getExtensionScriptPath(String extensionName);
5250

53-
StopAnswer stopInstance(StopCommand cmd);
51+
PrepareExternalProvisioningAnswer prepareExternalProvisioning(String extensionName, PrepareExternalProvisioningCommand cmd);
5452

55-
RebootAnswer rebootInstance(RebootCommand cmd);
53+
StartAnswer startInstance(String extensionName, StartCommand cmd);
5654

57-
StopAnswer expungeInstance(StopCommand cmd);
55+
StopAnswer stopInstance(String extensionName, StopCommand cmd);
5856

59-
PostExternalProvisioningAnswer postsetupInstance(PostExternalProvisioningCommand cmd);
57+
RebootAnswer rebootInstance(String extensionName, RebootCommand cmd);
6058

61-
HashMap<String, HostVmStateReportEntry> getHostVmStateReport(Long hostId);
59+
StopAnswer expungeInstance(String extensionName, StopCommand cmd);
6260

63-
RunCustomActionAnswer runCustomAction(RunCustomActionCommand cmd);
61+
PostExternalProvisioningAnswer postSetupInstance(String extensionName, PostExternalProvisioningCommand cmd);
6462

65-
void prepareScripts(String extensionName);
63+
Map<String, HostVmStateReportEntry> getHostVmStateReport(String extensionName, long hostId);
6664

67-
void loadScripts(String extensionName);
65+
RunCustomActionAnswer runCustomAction(String extensionName, RunCustomActionCommand cmd);
6866

69-
String getScriptPath();
67+
void prepareScripts(String extensionName);
7068
}

framework/extensions/src/main/java/org/apache/cloudstack/framework/extensions/manager/ExtensionsManager.java

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -20,23 +20,24 @@
2020
package org.apache.cloudstack.framework.extensions.manager;
2121

2222

23-
import com.cloud.extension.ExtensionCustomAction;
23+
import java.util.List;
24+
import java.util.Map;
25+
2426
import org.apache.cloudstack.api.response.ExtensionCustomActionResponse;
27+
import org.apache.cloudstack.api.response.ExtensionResponse;
2528
import org.apache.cloudstack.extension.CustomActionResponse;
29+
import org.apache.cloudstack.framework.extensions.api.AddCustomActionCmd;
2630
import org.apache.cloudstack.framework.extensions.api.CreateExtensionCmd;
2731
import org.apache.cloudstack.framework.extensions.api.DeleteCustomActionCmd;
2832
import org.apache.cloudstack.framework.extensions.api.DeleteExtensionCmd;
2933
import org.apache.cloudstack.framework.extensions.api.ListCustomActionCmd;
3034
import org.apache.cloudstack.framework.extensions.api.ListExtensionsCmd;
31-
import com.cloud.utils.component.Manager;
32-
import org.apache.cloudstack.framework.extensions.api.AddCustomActionCmd;
3335
import org.apache.cloudstack.framework.extensions.api.RegisterExtensionCmd;
3436
import org.apache.cloudstack.framework.extensions.api.RunCustomActionCmd;
35-
import org.apache.cloudstack.api.response.ExtensionResponse;
36-
import com.cloud.extension.Extension;
3737

38-
import java.util.List;
39-
import java.util.Map;
38+
import com.cloud.extension.Extension;
39+
import com.cloud.extension.ExtensionCustomAction;
40+
import com.cloud.utils.component.Manager;
4041

4142
public interface ExtensionsManager extends Manager {
4243
Extension createExtension(CreateExtensionCmd cmd);
@@ -45,7 +46,7 @@ public interface ExtensionsManager extends Manager {
4546

4647
ExtensionResponse registerExtensionWithResource(RegisterExtensionCmd cmd);
4748

48-
ExtensionResponse registerExtensionWithCluster(String resourceId, Long extensionId, String resourceType, Map<String, String> externalDetails);
49+
ExtensionResponse registerExtensionWithCluster(String resourceId, Long extensionId, Map<String, String> externalDetails);
4950

5051
void unregisterExtensionWithCluster(Long clusterId, Long extensionId);
5152

framework/extensions/src/main/java/org/apache/cloudstack/framework/extensions/manager/ExtensionsManagerImpl.java

Lines changed: 47 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,40 @@
1919

2020
package org.apache.cloudstack.framework.extensions.manager;
2121

22+
import java.util.ArrayList;
23+
import java.util.Collections;
24+
import java.util.List;
25+
import java.util.Map;
26+
27+
import javax.inject.Inject;
28+
29+
import org.apache.cloudstack.api.ApiConstants;
30+
import org.apache.cloudstack.api.response.ExtensionCustomActionResponse;
31+
import org.apache.cloudstack.api.response.ExtensionResourceMapResponse;
32+
import org.apache.cloudstack.api.response.ExtensionResponse;
33+
import org.apache.cloudstack.extension.CustomActionResponse;
34+
import org.apache.cloudstack.framework.extensions.api.AddCustomActionCmd;
35+
import org.apache.cloudstack.framework.extensions.api.CreateExtensionCmd;
36+
import org.apache.cloudstack.framework.extensions.api.DeleteCustomActionCmd;
37+
import org.apache.cloudstack.framework.extensions.api.DeleteExtensionCmd;
38+
import org.apache.cloudstack.framework.extensions.api.ListCustomActionCmd;
39+
import org.apache.cloudstack.framework.extensions.api.ListExtensionsCmd;
40+
import org.apache.cloudstack.framework.extensions.api.RegisterExtensionCmd;
41+
import org.apache.cloudstack.framework.extensions.api.RunCustomActionCmd;
42+
import org.apache.cloudstack.framework.extensions.dao.ExtensionCustomActionDao;
43+
import org.apache.cloudstack.framework.extensions.dao.ExtensionCustomActionDetailsDao;
44+
import org.apache.cloudstack.framework.extensions.dao.ExtensionDao;
45+
import org.apache.cloudstack.framework.extensions.dao.ExtensionDetailsDao;
46+
import org.apache.cloudstack.framework.extensions.dao.ExtensionResourceMapDao;
47+
import org.apache.cloudstack.framework.extensions.dao.ExtensionResourceMapDetailsDao;
48+
import org.apache.cloudstack.framework.extensions.vo.ExtensionCustomActionDetailsVO;
49+
import org.apache.cloudstack.framework.extensions.vo.ExtensionCustomActionVO;
50+
import org.apache.cloudstack.framework.extensions.vo.ExtensionDetailsVO;
51+
import org.apache.cloudstack.framework.extensions.vo.ExtensionResourceMapDetailsVO;
52+
import org.apache.cloudstack.framework.extensions.vo.ExtensionResourceMapVO;
53+
import org.apache.cloudstack.framework.extensions.vo.ExtensionVO;
54+
import org.apache.commons.collections.CollectionUtils;
55+
2256
import com.cloud.agent.AgentManager;
2357
import com.cloud.agent.api.RunCustomActionAnswer;
2458
import com.cloud.agent.api.RunCustomActionCommand;
@@ -28,54 +62,23 @@
2862
import com.cloud.exception.AgentUnavailableException;
2963
import com.cloud.exception.InvalidParameterValueException;
3064
import com.cloud.exception.OperationTimedoutException;
65+
import com.cloud.extension.Extension;
3166
import com.cloud.extension.ExtensionCustomAction;
3267
import com.cloud.host.HostVO;
3368
import com.cloud.host.dao.HostDao;
3469
import com.cloud.host.dao.HostDetailsDao;
3570
import com.cloud.hypervisor.ExternalProvisioner;
71+
import com.cloud.org.Cluster;
3672
import com.cloud.utils.Pair;
73+
import com.cloud.utils.component.ManagerBase;
74+
import com.cloud.utils.component.PluggableService;
3775
import com.cloud.utils.db.Filter;
3876
import com.cloud.utils.db.SearchBuilder;
3977
import com.cloud.utils.db.SearchCriteria;
4078
import com.cloud.utils.exception.CloudRuntimeException;
4179
import com.cloud.vm.VMInstanceVO;
4280
import com.cloud.vm.VirtualMachine;
4381
import com.cloud.vm.dao.VMInstanceDao;
44-
import org.apache.cloudstack.api.ApiConstants;
45-
import org.apache.cloudstack.api.response.ExtensionCustomActionResponse;
46-
import org.apache.cloudstack.extension.CustomActionResponse;
47-
import org.apache.cloudstack.framework.extensions.api.CreateExtensionCmd;
48-
import org.apache.cloudstack.framework.extensions.api.DeleteCustomActionCmd;
49-
import org.apache.cloudstack.framework.extensions.api.DeleteExtensionCmd;
50-
import org.apache.cloudstack.framework.extensions.api.ListCustomActionCmd;
51-
import org.apache.cloudstack.framework.extensions.api.ListExtensionsCmd;
52-
import org.apache.cloudstack.framework.extensions.api.AddCustomActionCmd;
53-
import org.apache.cloudstack.framework.extensions.api.RunCustomActionCmd;
54-
import com.cloud.utils.component.ManagerBase;
55-
import com.cloud.utils.component.PluggableService;
56-
import org.apache.cloudstack.framework.extensions.api.RegisterExtensionCmd;
57-
import org.apache.cloudstack.framework.extensions.dao.ExtensionCustomActionDao;
58-
import org.apache.cloudstack.framework.extensions.dao.ExtensionCustomActionDetailsDao;
59-
import org.apache.cloudstack.framework.extensions.dao.ExtensionResourceMapDao;
60-
import org.apache.cloudstack.framework.extensions.dao.ExtensionResourceMapDetailsDao;
61-
import org.apache.cloudstack.framework.extensions.dao.ExtensionDao;
62-
import org.apache.cloudstack.framework.extensions.dao.ExtensionDetailsDao;
63-
import org.apache.cloudstack.api.response.ExtensionResourceMapResponse;
64-
import org.apache.cloudstack.api.response.ExtensionResponse;
65-
import com.cloud.extension.Extension;
66-
import org.apache.cloudstack.framework.extensions.vo.ExtensionCustomActionDetailsVO;
67-
import org.apache.cloudstack.framework.extensions.vo.ExtensionCustomActionVO;
68-
import org.apache.cloudstack.framework.extensions.vo.ExtensionResourceMapDetailsVO;
69-
import org.apache.cloudstack.framework.extensions.vo.ExtensionResourceMapVO;
70-
import org.apache.cloudstack.framework.extensions.vo.ExtensionVO;
71-
import org.apache.cloudstack.framework.extensions.vo.ExtensionDetailsVO;
72-
import org.apache.commons.collections.CollectionUtils;
73-
74-
import javax.inject.Inject;
75-
import java.util.ArrayList;
76-
import java.util.Collections;
77-
import java.util.List;
78-
import java.util.Map;
7982

8083
public class ExtensionsManagerImpl extends ManagerBase implements ExtensionsManager, PluggableService {
8184

@@ -132,7 +135,7 @@ public Extension createExtension(CreateExtensionCmd cmd) {
132135
ExtensionVO extension = new ExtensionVO();
133136
extension.setName(name);
134137
extension.setType(type);
135-
String scriptPath = String.format(externalProvisioner.getScriptPath(), name);
138+
String scriptPath = externalProvisioner.getExtensionScriptPath(name);
136139
extension.setScript(scriptPath);
137140
ExtensionVO savedExtension = extensionDao.persist(extension);
138141

@@ -180,7 +183,7 @@ public List<ExtensionResponse> listExtensions(ListExtensionsCmd cmd) {
180183
for (ExtensionVO extension : result.first()) {
181184
Map<String, String> details = extensionDetailsDao.listDetailsKeyPairs(extension.getId());
182185
ExtensionResponse response = new ExtensionResponse(extension.getName(), extension.getType(), extension.getUuid(), details);
183-
String scriptPath = String.format(externalProvisioner.getScriptPath(), extension.getName());
186+
String scriptPath = externalProvisioner.getExtensionScriptPath(extension.getName());
184187
response.setScriptPath(scriptPath);
185188

186189
List<ExtensionResourceMapVO> extensionResourceMapVOS = extensionResourceMapDao.listByExtensionId(extension.getId());
@@ -210,21 +213,22 @@ public ExtensionResponse registerExtensionWithResource(RegisterExtensionCmd cmd)
210213
Long extensionId = cmd.getExtensionId();
211214
String resourceType = cmd.getResourceType();
212215
if ("CLUSTER".equalsIgnoreCase(resourceType)) {
213-
return registerExtensionWithCluster(resourceId, extensionId, resourceType, cmd.getExternalDetails());
216+
return registerExtensionWithCluster(resourceId, extensionId, cmd.getExternalDetails());
214217
} else {
215218
throw new CloudRuntimeException("Currently only cluster can be used to register an extension of type Orchestrator");
216219
}
217220
}
218221

219222
@Override
220-
public ExtensionResponse registerExtensionWithCluster(String resourceId, Long extensionId, String resourceType, Map<String, String> externalDetails) {
223+
public ExtensionResponse registerExtensionWithCluster(String resourceId, Long extensionId, Map<String, String> externalDetails) {
224+
final String resourceType = Cluster.class.getSimpleName();
221225
ClusterVO cluster = clusterDao.findByUuid(resourceId);
222226
ExtensionResourceMapVO existing = extensionResourceMapDao.findByResourceIdAndType(cluster.getId(), resourceType);
223227
if (existing != null) {
224228
throw new CloudRuntimeException("Extension already registered with this resource");
225229
}
226230

227-
ExtensionResourceMapVO extensionMap = new ExtensionResourceMapVO();
231+
ExtensionResourceMapVO extensionMap = new ExtensionResourceMapVO(extensionId, cluster.getId(), resourceType);
228232
extensionMap.setExtensionId(extensionId);
229233
extensionMap.setResourceId(cluster.getId());
230234
extensionMap.setResourceType(resourceType);
@@ -247,11 +251,11 @@ public ExtensionResponse registerExtensionWithCluster(String resourceId, Long ex
247251
clusterDetailsDao.persist(cluster.getId(), externalDetails);
248252

249253
ExtensionResponse response = new ExtensionResponse(extension.getName(), extension.getType(), extension.getUuid(), details);
250-
String scriptPath = String.format(externalProvisioner.getScriptPath(), extension.getName());
254+
String scriptPath = externalProvisioner.getExtensionScriptPath(extension.getName());
251255
response.setScriptPath(scriptPath);
252256

253-
ExtensionResourceMapVO extensionResourceMapVO = extensionResourceMapDao.findByResourceIdAndType(cluster.getId(), "cluster");
254-
ExtensionResourceMapResponse resourceResponse = new ExtensionResourceMapResponse(extension.getUuid(), cluster.getUuid(), "cluster");
257+
ExtensionResourceMapVO extensionResourceMapVO = extensionResourceMapDao.findByResourceIdAndType(cluster.getId(), resourceType);
258+
ExtensionResourceMapResponse resourceResponse = new ExtensionResourceMapResponse(extension.getUuid(), cluster.getUuid(), resourceType);
255259

256260
Map<String, String> resourceMapDetails = extensionResourceMapDetailsDao.listDetailsKeyPairs(extensionResourceMapVO.getId());
257261
resourceResponse.setDetails(resourceMapDetails);

framework/extensions/src/main/java/org/apache/cloudstack/framework/extensions/vo/ExtensionVO.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@
3232
import javax.persistence.Temporal;
3333
import javax.persistence.TemporalType;
3434

35+
import org.apache.cloudstack.utils.reflectiontostringbuilderutils.ReflectionToStringBuilderUtils;
36+
3537
@Entity
3638
@Table(name = "extension")
3739
public class ExtensionVO implements Extension {
@@ -110,4 +112,9 @@ public void setType(String type) {
110112
public void setRemoved(Date removed) {
111113
this.removed = removed;
112114
}
115+
116+
@Override
117+
public String toString() {
118+
return String.format("Extension %s", ReflectionToStringBuilderUtils.reflectOnlySelectedFields(this, "id", "uuid", "name", "type"));
119+
}
113120
}

plugins/hypervisors/external/src/main/java/org/apache/cloudstack/hypervisor/external/discoverer/ExternalServerDiscoverer.java

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -229,22 +229,22 @@ public HostVO createHostVOForConnectedAgent(HostVO host, StartupCommand[] cmd) {
229229
}
230230

231231
@Override
232-
public HostVO createHostVOForDirectConnectAgent(HostVO host, StartupCommand[] startup, ServerResource resource, Map<String, String> details, List<String> hostTags) {
232+
public HostVO createHostVOForDirectConnectAgent(HostVO host, StartupCommand[] startup, ServerResource resource,
233+
Map<String, String> details, List<String> hostTags) {
233234
StartupCommand firstCmd = startup[0];
234235
if (!(firstCmd instanceof StartupRoutingCommand)) {
235236
return null;
236237
}
237-
238-
StartupRoutingCommand ssCmd = ((StartupRoutingCommand)firstCmd);
238+
StartupRoutingCommand ssCmd = (StartupRoutingCommand)firstCmd;
239239
if (ssCmd.getHypervisorType() != Hypervisor.HypervisorType.External) {
240240
return null;
241241
}
242-
243242
final ClusterVO cluster = _clusterDao.findById(host.getClusterId());
244-
ExtensionResourceMapVO extensionResourceMapVO = extensionResourceMapDao.findByResourceIdAndType(cluster.getId(), "cluster");
243+
ExtensionResourceMapVO extensionResourceMapVO =
244+
extensionResourceMapDao.findByResourceIdAndType(cluster.getId(), "cluster");
245245
ExtensionVO extensionVO = externalOrchestratorDao.findById(extensionResourceMapVO.getExtensionId());
246-
externalProvisioner.loadScripts(extensionVO.getName());
247-
246+
logger.debug("Creating host for {}", extensionVO);
247+
externalProvisioner.prepareScripts(extensionVO.getName()); // ToDo: good idea to add prepare here?
248248
return _resourceMgr.fillRoutingHostVO(host, ssCmd, Hypervisor.HypervisorType.External, details, hostTags);
249249
}
250250

0 commit comments

Comments
 (0)