> + vm =
> client.getVirtualMachineApi().getVirtualMachine(vm.getId());
> + List<Integer> ports =
> Ints.asList(templateOptions.getInboundPorts());
> + if (capabilities.getCloudStackVersion().startsWith("2")) {
> + logger.debug(">> setting up IP forwarding for
> IPAddress(%s) rules(%s)", ip.getId(), ports);
> + Set<IPForwardingRule> rules =
> setupPortForwardingRulesForIP.apply(ip, ports);
> + logger.trace("<< setup %d IP forwarding rules on
> IPAddress(%s)", rules.size(), ip.getId());
> + } else {
> + logger.debug(">> setting up firewall rules for
> IPAddress(%s) rules(%s)", ip.getId(), ports);
> + Set<FirewallRule> rules =
> setupFirewallRulesForIP.apply(ip, ports);
> + logger.trace("<< setup %d firewall rules on
> IPAddress(%s)", rules.size(), ip.getId());
> + }
> + }
> + }
> + } catch (RuntimeException re) {
> + logger.error("-- exception after node has been created, trying to
> destroy the created virtualMachine(%s)", vm.getId());
> + destroyNode(vm.getId());
> the point of this code is that destroyNode needs to be called before we
> rethrow the exception.
Oh, I agree. Sorry, I didn't express myself clearly. What I meant is the
following: with the code as currently written, what if `destroyNode` here
throws an exception? Then the original exception (the one that probably matters
to the user, which explains why the static NATs could not be created) will not
be visible, and the user will instead be stuck with the "cleanup exception".
I was suggesting something like:
```
} catch (RuntimeException re) {
logger.error("-- exception after node has been created, trying to destroy the
created virtualMachine(%s)", vm.getId());
try {
destroyNode(vm.getId());
} catch (RuntimeException re2) {
// or just ignore this exception
logger.debug("-- exception trying to destroy the created
virtualMachine(%s): %s", vm.getId(), re2);
}
throw re
}
```
Does that make more sense?
---
Reply to this email directly or view it on GitHub:
https://github.com/jclouds/jclouds/pull/328/files#r11014653