3737import com .cloud .hypervisor .HypervisorGuruManagerImpl ;
3838import com .cloud .hypervisor .external .provisioner .api .ExtensionResponse ;
3939import com .cloud .hypervisor .external .provisioner .api .ListExtensionsCmd ;
40+ import com .cloud .hypervisor .external .provisioner .api .CreateExtensionCmd ;
4041import com .cloud .hypervisor .external .provisioner .api .RegisterExtensionCmd ;
4142import com .cloud .hypervisor .external .provisioner .api .RunCustomActionCmd ;
43+ import com .cloud .hypervisor .external .provisioner .dao .ExtensionResourceMapDao ;
44+ import com .cloud .hypervisor .external .provisioner .dao .ExtensionResourceMapDetailsDao ;
4245import com .cloud .hypervisor .external .provisioner .dao .ExternalOrchestratorDao ;
4346import com .cloud .hypervisor .external .provisioner .dao .ExternalOrchestratorDetailDao ;
44- import com .cloud .hypervisor .external .provisioner .dao .ExternalOrchestratorDetailVO ;
47+ import com .cloud .hypervisor .external .provisioner .vo .ExtensionResourceMapDetailsVO ;
48+ import com .cloud .hypervisor .external .provisioner .vo .ExternalOrchestratorDetailVO ;
4549import com .cloud .hypervisor .external .provisioner .simpleprovisioner .SimpleExternalProvisioner ;
4650import com .cloud .hypervisor .external .provisioner .vo .Extension ;
51+ import com .cloud .hypervisor .external .provisioner .vo .ExtensionResourceMapVO ;
4752import com .cloud .hypervisor .external .provisioner .vo .ExtensionVO ;
4853import com .cloud .hypervisor .external .resource .ExternalResourceBase ;
4954import com .cloud .org .Cluster ;
@@ -82,6 +87,12 @@ public class ExternalAgentManagerImpl extends ManagerBase implements ExternalAge
8287 @ Inject
8388 ExternalOrchestratorDetailDao externalOrchestratorDetailDao ;
8489
90+ @ Inject
91+ ExtensionResourceMapDao extensionResourceMapDao ;
92+
93+ @ Inject
94+ ExtensionResourceMapDetailsDao extensionResourceMapDetailsDao ;
95+
8596 @ Inject
8697 HostPodDao podDao ;
8798
@@ -123,6 +134,7 @@ public boolean start() {
123134 public List <Class <?>> getCommands () {
124135 List <Class <?>> cmds = new ArrayList <Class <?>>();
125136 cmds .add (RunCustomActionCmd .class );
137+ cmds .add (CreateExtensionCmd .class );
126138 cmds .add (RegisterExtensionCmd .class );
127139 cmds .add (ListExtensionsCmd .class );
128140 return cmds ;
@@ -191,11 +203,10 @@ public RunCustomActionAnswer runCustomAction(RunCustomActionCmd cmd) {
191203 }
192204
193205 @ Override
194- public Extension registerExternalOrchestrator ( RegisterExtensionCmd cmd ) {
206+ public Extension createExtension ( CreateExtensionCmd cmd ) {
195207 ExtensionVO extension = new ExtensionVO ();
196208 extension .setName (cmd .getName ());
197209 extension .setType (cmd .getType ());
198- extension .setPodId (cmd .getPodId ());
199210 ExtensionVO savedExtension = externalOrchestratorDao .persist (extension );
200211
201212 Map <String , String > externalDetails = cmd .getExternalDetails ();
@@ -207,8 +218,6 @@ public Extension registerExternalOrchestrator(RegisterExtensionCmd cmd) {
207218 externalOrchestratorDetailDao .saveDetails (detailsVOList );
208219 }
209220
210- createRequiredResourcesForExtension (savedExtension , cmd );
211-
212221 return savedExtension ;
213222 }
214223
@@ -241,7 +250,7 @@ public List<ExtensionResponse> listExtensions(ListExtensionsCmd cmd) {
241250 List <ExtensionResponse > responses = new ArrayList <>();
242251 for (ExtensionVO extension : result .first ()) {
243252 Map <String , String > details = externalOrchestratorDetailDao .listDetailsKeyPairs (extension .getId ());
244- ExtensionResponse response = new ExtensionResponse (extension .getName (), extension .getType (), extension .getPodId (), extension . getUuid (), details );
253+ ExtensionResponse response = new ExtensionResponse (extension .getName (), extension .getType (), extension .getUuid (), details );
245254 String destinationPath = String .format (SimpleExternalProvisioner .EXTENSION_SCRIPT_PATH , extension .getId ());
246255 response .setScriptPath (destinationPath );
247256 response .setObjectName (ApiConstants .EXTENSIONS );
@@ -251,9 +260,48 @@ public List<ExtensionResponse> listExtensions(ListExtensionsCmd cmd) {
251260 return responses ;
252261 }
253262
254- private void createRequiredResourcesForExtension (ExtensionVO extension , RegisterExtensionCmd registerExtensionCmd ) {
255- String clusterName = extension .getName () + "-" + extension .getId () + "-cluster" ;
256- HostPodVO pod = podDao .findById (extension .getPodId ());
263+ @ Override
264+ public boolean registerExtensionWithResource (RegisterExtensionCmd cmd ) {
265+ String resourceId = cmd .getResourceId ();
266+ Long extensionId = cmd .getExtensionId ();
267+ String resourceType = cmd .getResourceType ();
268+ if ("POD" .equalsIgnoreCase (resourceType )) {
269+ HostPodVO pod = podDao .findByUuid (resourceId );
270+ ExtensionResourceMapVO extensionMap = new ExtensionResourceMapVO ();
271+ extensionMap .setExtensionId (extensionId );
272+ extensionMap .setResourceId (pod .getId ());
273+ extensionMap .setResourceType (resourceType );
274+ ExtensionResourceMapVO savedExtensionMap = extensionResourceMapDao .persist (extensionMap );
275+
276+ Map <String , String > externalDetails = cmd .getExternalDetails ();
277+ List <ExtensionResourceMapDetailsVO > detailsVOList = new ArrayList <>();
278+ if (externalDetails != null && !externalDetails .isEmpty ()) {
279+ for (Map .Entry <String , String > entry : externalDetails .entrySet ()) {
280+ detailsVOList .add (new ExtensionResourceMapDetailsVO (savedExtensionMap .getId (), entry .getKey (), entry .getValue ()));
281+ }
282+ extensionResourceMapDetailsDao .saveDetails (detailsVOList );
283+ }
284+ createRequiredResourcesForExtensionInPod (cmd , savedExtensionMap );
285+ } else {
286+ throw new CloudRuntimeException ("Currently only pod can be used to register an extension of type Orchestrator" );
287+ }
288+
289+ return true ;
290+ }
291+
292+ private void createRequiredResourcesForExtensionInPod (RegisterExtensionCmd cmd , ExtensionResourceMapVO extensionResourceMap ) {
293+ String resourceId = cmd .getResourceId ();
294+ Long extensionId = cmd .getExtensionId ();
295+ ExtensionVO extension = externalOrchestratorDao .findById (extensionId );
296+
297+ Map <String , String > details = new HashMap <>();
298+ Map <String , String > externalDetails = cmd .getExternalDetails ();
299+ Map <String , String > extensionDetails = externalOrchestratorDetailDao .listDetailsKeyPairs (extensionId );
300+ details .putAll (extensionDetails );
301+ details .putAll (externalDetails );
302+
303+ String clusterName = extension .getName () + "-" + extension .getId () + "-" + extensionResourceMap .getId () + "-cluster" ;
304+ HostPodVO pod = podDao .findByUuid (resourceId );
257305 AddClusterCmd clusterCmd = new AddClusterCmd (clusterName , pod .getDataCenterId (), pod .getId (), Cluster .ClusterType .CloudManaged .toString (),
258306 Hypervisor .HypervisorType .External .toString (), SimpleExternalProvisioner .class .getSimpleName ());
259307 List <? extends Cluster > clusters ;
@@ -265,9 +313,9 @@ private void createRequiredResourcesForExtension(ExtensionVO extension, Register
265313
266314 Cluster cluster = clusters .get (0 );
267315
268- String hosturl = "http://" + extension .getName () + "-" + extension .getId () + "-host" ;
316+ String hosturl = "http://" + extension .getName () + "-" + extension .getId () + "-" + extensionResourceMap . getId () + "- host" ;
269317 AddHostCmd addHostCmd = new AddHostCmd (pod .getDataCenterId (), pod .getId (), cluster .getId (), Hypervisor .HypervisorType .External .toString (),
270- "External" , "External" , hosturl , registerExtensionCmd . getDetails () , extension .getId ());
318+ "External" , "External" , hosturl , details , extension .getId ());
271319
272320 List <? extends Host > hosts ;
273321 try {
0 commit comments