I wouldn't use the node metadata as a "transport" for the properties
between methods. Instead, I would:

* Create a new type to transport the information, say NodeAndOptions
or NodeAndTemplate, that has a reference to the NodeMetadata and to
the TemplateOptions (or Template).
* Modify the deflaration of the AllocateAndAddFloatingIpToNode class
to accept that type as an input.
* Modify the 
ApplyNovaTemplateOptionsCreateNodesWithGroupEncodedIntoNameThenAddToSet
here [1]. That line transforms each node with the function to allocate
and add the IPs. You could chain the transformations: first convert
them to NodeAndOptions and then apply the allocation IP function.


WDYT?

I.


[1] 
https://github.com/jclouds/jclouds/blob/master/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/compute/strategy/ApplyNovaTemplateOptionsCreateNodesWithGroupEncodedIntoNameThenAddToSet.java#L155

On 3 July 2014 02:42, Dancy, Chris <chris.da...@pega.com> wrote:
> Hey Guys,
>
> So this is with respect to the PR here:
>
> https://github.com/jclouds/jclouds/pull/425#issuecomment-47813143
>
> PR is actually good and fixes the bug where inside 
> "AllocateAndAddFloatingIpToNode.apply()" we get a null returned when calling 
> "FloatingIpApi.create()". The solution however is to iterate over 
> "FloatingIpApi.list()" searching for an available FloatingIP. This works but 
> I wonder if we can do better. We have the method 
> "FloatingIpApi.allocate(String poolName)" which works if you pass it in a 
> valid floating-ip-pool-name. The problem is how to get a pool-name down to 
> "AllocateAndAddFloatingIpToNode.apply()" which is called way down the chain 
> when invoking ComputeService.createNodesInGroup() like below:
>
>                         NovaTemplateOptions options = 
> NovaTemplateOptions.Builder.
>                                                         
> autoAssignFloatingIp(true).
>                                                         
> blockUntilRunning(true).
>                                                         
> securityGroupNames(securityGroups);
>
>                         Template template = 
> computeServiceContext.getComputeService().templateBuilder().
>                                                         imageId(imageID).
>                                                         
> hardwareId(hardwareID).
>                                                         options(options).
>                                                         build();
>
>                         Set<NodeMetadata> groupNodes = 
> (Set<NodeMetadata>)computeServiceContext.getComputeService().createNodesInGroup(groupName,
>  count, template);
>
> The ideal solution, IMO, would be to alter the above NovaTemplateOptions to 
> do something like:
>
>                         NovaTemplateOptions options = 
> NovaTemplateOptions.Builder.
>                                                         
> autoAssignFloatingIp(true).
>                                                         
> floatingIpPoolNames(String ...poolNames). // adding this method call to set 
> pool names
>                                                         
> blockUntilRunning(true).
>                                                         
> securityGroupNames(securityGroups);
>
> problem is I've no idea, short of changing the TemplateOptions class which 
> looks to be a no-no, to get it down to 
> "AllocateAndAddFloatingIpToNode.apply()". Now one thing that did work, though 
> I'm not sure if others would approve, is to set the pool-names inside 
> NodeMetadata.getUserMetadata() (which returns a map) much earlier on in the 
> call chain, which is possible, and then check for their existence inside 
> "AllocateAndAddFloatingIpToNode.apply()" once we reach that point. I've 
> gotten this to work but was not sure if there was a better I'm completely 
> missing. Thoughts and ideas are more than welcome.

Reply via email to