jclouds userData: support for vCloud Director

- Reflectively invoke userData(String) or guestCustomizationScript(String)
  so that works with other clouds, including vCloud Director.
- Don’t really want to add a direct dependency from Brooklyn to 
  vCD (https://github.com/cloudsoft/jclouds-vcloud-director/).
  That is an unofficial jclouds provider, rather than part of core
  jclouds or jclouds labs.

Project: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/repo
Commit: 
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/commit/51e7e0b1
Tree: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/tree/51e7e0b1
Diff: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/diff/51e7e0b1

Branch: refs/heads/master
Commit: 51e7e0b1a5424e6eb8dd92af1047b8a24a66d0b3
Parents: ae3790e
Author: Aled Sage <[email protected]>
Authored: Thu Jun 11 14:49:47 2015 +0100
Committer: Aled Sage <[email protected]>
Committed: Thu Jun 11 14:49:47 2015 +0100

----------------------------------------------------------------------
 .../location/jclouds/JcloudsLocation.java       | 28 +++++++++++++++++++-
 1 file changed, 27 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/51e7e0b1/locations/jclouds/src/main/java/brooklyn/location/jclouds/JcloudsLocation.java
----------------------------------------------------------------------
diff --git 
a/locations/jclouds/src/main/java/brooklyn/location/jclouds/JcloudsLocation.java
 
b/locations/jclouds/src/main/java/brooklyn/location/jclouds/JcloudsLocation.java
index c665ba7..7d3d50e 100644
--- 
a/locations/jclouds/src/main/java/brooklyn/location/jclouds/JcloudsLocation.java
+++ 
b/locations/jclouds/src/main/java/brooklyn/location/jclouds/JcloudsLocation.java
@@ -1057,7 +1057,33 @@ public class JcloudsLocation extends 
AbstractCloudMachineProvisioningLocation im
                         } else if (t instanceof SoftLayerTemplateOptions) {
                             
((SoftLayerTemplateOptions)t).userData(Strings.toString(v));
                         } else {
-                            LOG.info("ignoring userDataString({}) in VM 
creation because not supported for cloud/type ({})", v, t.getClass());
+                            // Try reflection: userData(String), or 
guestCustomizationScript(String);
+                            // the latter is used by vCloud Director.
+                            Class<? extends TemplateOptions> clazz = 
t.getClass();
+                            Method userDataMethod = null;
+                            try {
+                                userDataMethod = clazz.getMethod("userData", 
String.class);
+                            } catch (SecurityException e) {
+                                LOG.info("Problem reflectively inspecting 
methods of "+t.getClass()+" for setting userData", e);
+                            } catch (NoSuchMethodException e) {
+                                try {
+                                    // For vCloud Director
+                                    userDataMethod = 
clazz.getMethod("guestCustomizationScript", String.class);
+                                } catch (NoSuchMethodException e2) {
+                                    // expected on various other clouds
+                                }
+                            }
+                            if (userDataMethod != null) {
+                                try {
+                                    userDataMethod.invoke(Strings.toString(v));
+                                } catch (InvocationTargetException e) {
+                                    LOG.info("Problem invoking 
"+userDataMethod.getName()+" of "+t.getClass()+", for setting userData", e);
+                                } catch (IllegalAccessException e) {
+                                    LOG.info("Unable to reflectively invoke 
"+userDataMethod.getName()+" of "+t.getClass()+", for setting userData", e);
+                                }
+                            } else {
+                                LOG.info("ignoring userDataString({}) in VM 
creation because not supported for cloud/type ({})", v, t.getClass());
+                            }
                         }
                     }})
             .put(USER_DATA_UUENCODED, new CustomizeTemplateOptions() {

Reply via email to