You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudstack.apache.org by al...@apache.org on 2013/04/24 00:30:38 UTC
git commit: updated refs/heads/internallb to 8057567
Updated Branches:
refs/heads/internallb 35c0273b8 -> 8057567aa
Internallb: more unittests for ApplicationLoadBalancerService
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/8057567a
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/8057567a
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/8057567a
Branch: refs/heads/internallb
Commit: 8057567aaab5000b2f6d3aec8ace65631092adc1
Parents: 35c0273
Author: Alena Prokharchyk <al...@citrix.com>
Authored: Tue Apr 23 13:15:36 2013 -0700
Committer: Alena Prokharchyk <al...@citrix.com>
Committed: Tue Apr 23 15:13:30 2013 -0700
----------------------------------------------------------------------
server/src/com/cloud/api/ApiResponseHelper.java | 4 +-
.../lb/ApplicationLoadBalancerManagerImpl.java | 48 ++--
.../cloudstack/lb/ApplicationLoadBalancerTest.java | 237 +++++++++++++--
3 files changed, 241 insertions(+), 48 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/8057567a/server/src/com/cloud/api/ApiResponseHelper.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/api/ApiResponseHelper.java b/server/src/com/cloud/api/ApiResponseHelper.java
index 909eab1..f1422bb 100755
--- a/server/src/com/cloud/api/ApiResponseHelper.java
+++ b/server/src/com/cloud/api/ApiResponseHelper.java
@@ -2779,8 +2779,8 @@ public class ApiResponseHelper implements ResponseGenerator {
@Override
public VirtualRouterProviderResponse createVirtualRouterProviderResponse(VirtualRouterProvider result) {
//generate only response of the VR/VPCVR provider type
- if (!(result.getType() == VirtualRouterProvider.VirtualRouterProviderType.VirtualRouter)
- || (result.getType() == VirtualRouterProvider.VirtualRouterProviderType.VPCVirtualRouter)) {
+ if (!(result.getType() == VirtualRouterProvider.VirtualRouterProviderType.VirtualRouter
+ || result.getType() == VirtualRouterProvider.VirtualRouterProviderType.VPCVirtualRouter)) {
return null;
}
VirtualRouterProviderResponse response = new VirtualRouterProviderResponse();
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/8057567a/server/src/org/apache/cloudstack/network/lb/ApplicationLoadBalancerManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/org/apache/cloudstack/network/lb/ApplicationLoadBalancerManagerImpl.java b/server/src/org/apache/cloudstack/network/lb/ApplicationLoadBalancerManagerImpl.java
index 747b42b..b646bad 100644
--- a/server/src/org/apache/cloudstack/network/lb/ApplicationLoadBalancerManagerImpl.java
+++ b/server/src/org/apache/cloudstack/network/lb/ApplicationLoadBalancerManagerImpl.java
@@ -94,8 +94,8 @@ public class ApplicationLoadBalancerManagerImpl extends ManagerBase implements A
//Validate LB rule guest network
Network guestNtwk = _networkModel.getNetwork(networkId);
- if (guestNtwk == null) {
- throw new InvalidParameterValueException("Can't find network by id");
+ if (guestNtwk == null || guestNtwk.getTrafficType() != TrafficType.Guest) {
+ throw new InvalidParameterValueException("Can't find guest network by id");
}
Account caller = UserContext.current().getCaller();
@@ -130,10 +130,10 @@ public class ApplicationLoadBalancerManagerImpl extends ManagerBase implements A
validateSourceIpNtwkForLbRule(sourceIpNtwk, scheme);
//3) Get source ip address
- sourceIp = getSourceIp(scheme, sourceIpNtwk, sourceIp);
+ Ip sourceIpAddr = getSourceIp(scheme, sourceIpNtwk, sourceIp);
ApplicationLoadBalancerRuleVO newRule = new ApplicationLoadBalancerRuleVO(name, description, sourcePort, instancePort, algorithm, guestNtwk.getId(),
- lbOwner.getId(), lbOwner.getDomainId(), new Ip(sourceIp), sourceIpNtwk.getId(), scheme);
+ lbOwner.getId(), lbOwner.getDomainId(), sourceIpAddr, sourceIpNtwk.getId(), scheme);
//4) Validate Load Balancing rule on the providers
LoadBalancingRule loadBalancing = new LoadBalancingRule(newRule, new ArrayList<LbDestination>(),
@@ -218,7 +218,7 @@ public class ApplicationLoadBalancerManagerImpl extends ManagerBase implements A
throw new InvalidParameterValueException("Invalid value for instance port: " + instancePort);
}
- if (!NetUtils.isValidPort(instancePort)) {
+ if (!NetUtils.isValidPort(sourcePort)) {
throw new InvalidParameterValueException("Invalid value for source port: " + sourcePort);
}
@@ -236,34 +236,40 @@ public class ApplicationLoadBalancerManagerImpl extends ManagerBase implements A
* @return
* @throws InsufficientVirtualNetworkCapcityException
*/
- protected String getSourceIp(Scheme scheme, Network sourceIpNtwk, String requestedIp) throws InsufficientVirtualNetworkCapcityException {
+ protected Ip getSourceIp(Scheme scheme, Network sourceIpNtwk, String requestedIp) throws InsufficientVirtualNetworkCapcityException {
//Get source IP address
+ if (_lbDao.countBySourceIp(new Ip(requestedIp), sourceIpNtwk.getId()) > 0) {
+ s_logger.debug("IP address " + requestedIp + " is already used by existing LB rule, returning it");
+ return new Ip(requestedIp);
+ }
+
if (requestedIp != null) {
validateRequestedSourceIpForLbRule(sourceIpNtwk, new Ip(requestedIp), scheme);
- } else {
- requestedIp = allocateSourceIpForLbRule(scheme, sourceIpNtwk);
}
+ requestedIp = allocateSourceIpForLbRule(scheme, sourceIpNtwk, requestedIp);
+
if (requestedIp == null) {
throw new InsufficientVirtualNetworkCapcityException("Unable to acquire IP address for network " + sourceIpNtwk, Network.class, sourceIpNtwk.getId());
}
- return requestedIp;
+ return new Ip(requestedIp);
}
/**
* Allocates new Source IP address for the Load Balancer rule based on LB rule scheme/sourceNetwork
* @param scheme
- * @param sourceIp
* @param sourceIpNtwk
+ * @param requestedIp TODO
+ * @param sourceIp
* @return
*/
- protected String allocateSourceIpForLbRule(Scheme scheme, Network sourceIpNtwk) {
+ protected String allocateSourceIpForLbRule(Scheme scheme, Network sourceIpNtwk, String requestedIp) {
String sourceIp = null;
if (scheme != Scheme.Internal) {
throw new InvalidParameterValueException("Only scheme " + Scheme.Internal + " is supported");
} else {
- sourceIp = allocateSourceIpForInternalLbRule(sourceIpNtwk);
+ sourceIp = allocateSourceIpForInternalLbRule(sourceIpNtwk, requestedIp);
}
return sourceIp;
}
@@ -272,10 +278,11 @@ public class ApplicationLoadBalancerManagerImpl extends ManagerBase implements A
/**
* Allocates sourceIp for the Internal LB rule
* @param sourceIpNtwk
+ * @param requestedIp TODO
* @return
*/
- protected String allocateSourceIpForInternalLbRule(Network sourceIpNtwk) {
- return _ntwkMgr.acquireGuestIpAddress(sourceIpNtwk, null);
+ protected String allocateSourceIpForInternalLbRule(Network sourceIpNtwk, String requestedIp) {
+ return _ntwkMgr.acquireGuestIpAddress(sourceIpNtwk, requestedIp);
}
@@ -302,22 +309,11 @@ public class ApplicationLoadBalancerManagerImpl extends ManagerBase implements A
* @param requestedSourceIp
*/
protected void validateRequestedSourceIpForInternalLbRule(Network sourceIpNtwk, Ip requestedSourceIp) {
- //1) Check if the IP is within the network cidr
+ //Check if the IP is within the network cidr
Pair<String, Integer> cidr = NetUtils.getCidr(sourceIpNtwk.getCidr());
if (!NetUtils.getCidrSubNet(requestedSourceIp.addr(), cidr.second()).equalsIgnoreCase(NetUtils.getCidrSubNet(cidr.first(), cidr.second()))) {
throw new InvalidParameterValueException("The requested IP is not in the network's CIDR subnet.");
}
-
- //2) Check if the IP address used by the load balancer or other nics
- if (_lbDao.countBySourceIp(requestedSourceIp, sourceIpNtwk.getId()) > 0) {
- s_logger.debug("IP address " + requestedSourceIp.addr() + " is already used by existing LB rule, skipping the validation");
- return;
- } else {
- List<String> usedIps = _networkModel.getUsedIpsInNetwork(sourceIpNtwk);
- if (usedIps.contains(requestedSourceIp.toString())) {
- throw new InvalidParameterValueException("Ip address " + requestedSourceIp.addr() + " is already in use");
- }
- }
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/8057567a/server/test/org/apache/cloudstack/lb/ApplicationLoadBalancerTest.java
----------------------------------------------------------------------
diff --git a/server/test/org/apache/cloudstack/lb/ApplicationLoadBalancerTest.java b/server/test/org/apache/cloudstack/lb/ApplicationLoadBalancerTest.java
index 995da2c..e18a461 100644
--- a/server/test/org/apache/cloudstack/lb/ApplicationLoadBalancerTest.java
+++ b/server/test/org/apache/cloudstack/lb/ApplicationLoadBalancerTest.java
@@ -16,7 +16,10 @@
// under the License.
package org.apache.cloudstack.lb;
+import java.lang.reflect.Field;
+import java.util.ArrayList;
import java.util.HashMap;
+import java.util.List;
import java.util.Map;
import javax.inject.Inject;
@@ -28,6 +31,7 @@ import org.apache.cloudstack.network.lb.ApplicationLoadBalancerRule;
import org.apache.cloudstack.network.lb.ApplicationLoadBalancerRuleVO;
import org.apache.cloudstack.network.lb.dao.ApplicationLoadBalancerRuleDao;
import org.junit.Before;
+import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mockito;
@@ -39,6 +43,7 @@ import com.cloud.exception.InsufficientAddressCapacityException;
import com.cloud.exception.InsufficientVirtualNetworkCapcityException;
import com.cloud.exception.InvalidParameterValueException;
import com.cloud.exception.NetworkRuleConflictException;
+import com.cloud.exception.UnsupportedServiceException;
import com.cloud.network.Network;
import com.cloud.network.Network.Capability;
import com.cloud.network.Network.Service;
@@ -50,11 +55,13 @@ import com.cloud.network.lb.LoadBalancingRule;
import com.cloud.network.lb.LoadBalancingRulesManager;
import com.cloud.network.rules.FirewallRuleVO;
import com.cloud.network.rules.LoadBalancerContainer.Scheme;
+import com.cloud.offerings.NetworkOfferingVO;
import com.cloud.user.AccountManager;
import com.cloud.user.AccountVO;
import com.cloud.user.UserContext;
import com.cloud.user.UserVO;
import com.cloud.utils.component.ComponentContext;
+import com.cloud.utils.exception.CloudRuntimeException;
import com.cloud.utils.net.Ip;
import com.cloud.utils.net.NetUtils;
@@ -81,11 +88,14 @@ public class ApplicationLoadBalancerTest extends TestCase{
public static long existingLbId = 1L;
public static long nonExistingLbId = 2L;
- public static long validNetworkId = 1L;
- public static long invalidNetworkId = 2L;
+ public static long validGuestNetworkId = 1L;
+ public static long invalidGuestNetworkId = 2L;
+ public static long validPublicNetworkId = 3L;
public static long validAccountId = 1L;
public static long invalidAccountId = 2L;
+
+ public String validRequestedIp = "10.1.1.1";
@@ -101,23 +111,25 @@ public class ApplicationLoadBalancerTest extends TestCase{
Mockito.when(_lbMgr.deleteLoadBalancerRule(nonExistingLbId, true)).thenReturn(false);
//mockito for .createApplicationLoadBalancer tests
- NetworkVO network = new NetworkVO(TrafficType.Guest, null, null, 1,
- null, 1, 1L);
+ NetworkVO guestNetwork = new NetworkVO(TrafficType.Guest, null, null, 1,
+ null, 1, 1L);
+ setId(guestNetwork, validGuestNetworkId);
+ guestNetwork.setCidr("10.1.1.1/24");
+
+ NetworkVO publicNetwork = new NetworkVO(TrafficType.Public, null, null, 1,
+ null, 1, 1L);
- Mockito.when(_ntwkModel.getNetwork(validNetworkId)).thenReturn(network);
- Mockito.when(_ntwkModel.getNetwork(invalidNetworkId)).thenReturn(null);
+ Mockito.when(_ntwkModel.getNetwork(validGuestNetworkId)).thenReturn(guestNetwork);
+ Mockito.when(_ntwkModel.getNetwork(invalidGuestNetworkId)).thenReturn(null);
+ Mockito.when(_ntwkModel.getNetwork(validPublicNetworkId)).thenReturn(publicNetwork);
+
Mockito.when(_accountMgr.getAccount(validAccountId)).thenReturn(new AccountVO());
Mockito.when(_accountMgr.getAccount(invalidAccountId)).thenReturn(null);
- Mockito.when(_ntwkModel.areServicesSupportedInNetwork(validNetworkId, Service.Lb)).thenReturn(true);
- Mockito.when(_ntwkModel.areServicesSupportedInNetwork(invalidNetworkId, Service.Lb)).thenReturn(false);
-
- String supportedProtocols = NetUtils.TCP_PROTO.toLowerCase();
- Map<Network.Capability, String> capsMap = new HashMap<Network.Capability, String>();
- capsMap.put(Capability.SupportedProtocols, supportedProtocols);
- Mockito.when(_ntwkModel.getNetworkServiceCapabilities(validNetworkId, Service.Lb)).thenReturn(capsMap);
+ Mockito.when(_ntwkModel.areServicesSupportedInNetwork(validGuestNetworkId, Service.Lb)).thenReturn(true);
+ Mockito.when(_ntwkModel.areServicesSupportedInNetwork(invalidGuestNetworkId, Service.Lb)).thenReturn(false);
ApplicationLoadBalancerRuleVO lbRule = new ApplicationLoadBalancerRuleVO("new", "new", 22, 22, "roundrobin",
- validNetworkId, validAccountId, 1L, new Ip("10.1.1.1"), validNetworkId, Scheme.Internal);
+ validGuestNetworkId, validAccountId, 1L, new Ip(validRequestedIp), validGuestNetworkId, Scheme.Internal);
Mockito.when(_lbDao.persist(Mockito.any(ApplicationLoadBalancerRuleVO.class))).thenReturn(lbRule);
Mockito.when(_lbMgr.validateLbRule(Mockito.any(LoadBalancingRule.class))).thenReturn(true);
@@ -128,6 +140,15 @@ public class ApplicationLoadBalancerTest extends TestCase{
Mockito.when(_accountMgr.getSystemAccount()).thenReturn(new AccountVO(2));
UserContext.registerContext(_accountMgr.getSystemUser().getId(), _accountMgr.getSystemAccount(), null, false);
+ Mockito.when(_ntwkModel.areServicesSupportedInNetwork(Mockito.anyLong(), Mockito.any(Network.Service.class))).thenReturn(true);
+
+ Map<Network.Capability, String> caps = new HashMap<Network.Capability, String>();
+ caps.put(Capability.SupportedProtocols, NetUtils.TCP_PROTO);
+ Mockito.when(_ntwkModel.getNetworkServiceCapabilities(Mockito.anyLong(), Mockito.any(Network.Service.class))).thenReturn(caps);
+
+
+ Mockito.when(_lbDao.countBySourceIp(new Ip(validRequestedIp), validGuestNetworkId)).thenReturn(1L);
+
}
/**
@@ -190,13 +211,65 @@ public class ApplicationLoadBalancerTest extends TestCase{
/**
* TESTS FOR .createApplicationLoadBalancer
*/
+
+ @Test
//Positive test
public void createValidLoadBalancer() {
- ApplicationLoadBalancerRule rule = null;
-
+ String expectedExcText = null;
+ try {
+ _appLbSvc.createApplicationLoadBalancer("alena", "alena", Scheme.Internal, validGuestNetworkId, validRequestedIp,
+ 22, 22, "roundrobin", validGuestNetworkId, validAccountId);
+ } catch (InsufficientAddressCapacityException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ } catch (InsufficientVirtualNetworkCapcityException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ } catch (NetworkRuleConflictException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ } catch (CloudRuntimeException e) {
+ expectedExcText = e.getMessage();
+ } finally {
+ //expect the exception happen because persistlLbRule() method coudln't be mocked properly due to unability to mock static vars in UsageEventUtils class
+ assertEquals("Test failed. The rule wasn't created" + expectedExcText, expectedExcText, "Unable to add lb rule for ip address null");
+ }
+ }
+
+
+ @Test(expected = UnsupportedServiceException.class)
+ //Negative test - only internal scheme value is supported in the current release
+ public void createPublicLoadBalancer() {
+ String expectedExcText = null;
+ try {
+ _appLbSvc.createApplicationLoadBalancer("alena", "alena", Scheme.Public, validGuestNetworkId, validRequestedIp,
+ 22, 22, "roundrobin", validGuestNetworkId, validAccountId);
+ } catch (InsufficientAddressCapacityException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ } catch (InsufficientVirtualNetworkCapcityException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ } catch (NetworkRuleConflictException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ } catch (UnsupportedServiceException e) {
+ expectedExcText = e.getMessage();
+ throw e;
+ } finally {
+ assertEquals("Test failed. The Public lb rule was created, which shouldn't be supported"
+ + expectedExcText, expectedExcText, "Only scheme of type " + Scheme.Internal + " is supported");
+ }
+ }
+
+
+ @Test(expected = InvalidParameterValueException.class)
+ //Negative test - invalid SourcePort
+ public void createWithInvalidSourcePort() {
+ String expectedExcText = null;
try {
- rule = _appLbSvc.createApplicationLoadBalancer("alena", "alena", Scheme.Internal, validNetworkId, "10.1.1.1",
- 22, 22, "roundrobin", validNetworkId, validAccountId);
+ _appLbSvc.createApplicationLoadBalancer("alena", "alena", Scheme.Internal, validGuestNetworkId, validRequestedIp,
+ 65536, 22, "roundrobin", validGuestNetworkId, validAccountId);
} catch (InsufficientAddressCapacityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
@@ -206,8 +279,132 @@ public class ApplicationLoadBalancerTest extends TestCase{
} catch (NetworkRuleConflictException e) {
// TODO Auto-generated catch block
e.printStackTrace();
- }finally {
- //assertNotNull("Failed to create application load balancer rule", rule);
+ } catch (InvalidParameterValueException e) {
+ expectedExcText = e.getMessage();
+ throw e;
+ } finally {
+ assertEquals("Test failed. The rule with invalid source port was created"
+ + expectedExcText, expectedExcText, "Invalid value for source port: 65536");
}
}
+
+ @Test(expected = InvalidParameterValueException.class)
+ //Negative test - invalid instancePort
+ public void createWithInvalidInstandePort() {
+ String expectedExcText = null;
+ try {
+ _appLbSvc.createApplicationLoadBalancer("alena", "alena", Scheme.Internal, validGuestNetworkId, validRequestedIp,
+ 22, 65536, "roundrobin", validGuestNetworkId, validAccountId);
+ } catch (InsufficientAddressCapacityException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ } catch (InsufficientVirtualNetworkCapcityException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ } catch (NetworkRuleConflictException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ } catch (InvalidParameterValueException e) {
+ expectedExcText = e.getMessage();
+ throw e;
+ } finally {
+ assertEquals("Test failed. The rule with invalid instance port was created"
+ + expectedExcText, expectedExcText, "Invalid value for instance port: 65536");
+ }
+ }
+
+
+ @Test(expected = InvalidParameterValueException.class)
+ //Negative test - invalid algorithm
+ public void createWithInvalidAlgorithm() {
+ String expectedExcText = null;
+ try {
+ _appLbSvc.createApplicationLoadBalancer("alena", "alena", Scheme.Internal, validGuestNetworkId, validRequestedIp,
+ 22, 22, "invalidalgorithm", validGuestNetworkId, validAccountId);
+ } catch (InsufficientAddressCapacityException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ } catch (InsufficientVirtualNetworkCapcityException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ } catch (NetworkRuleConflictException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ } catch (InvalidParameterValueException e) {
+ expectedExcText = e.getMessage();
+ throw e;
+ } finally {
+ assertEquals("Test failed. The rule with invalid algorithm was created"
+ + expectedExcText, expectedExcText, "Invalid algorithm: invalidalgorithm");
+ }
+ }
+
+ @Test(expected = InvalidParameterValueException.class)
+ //Negative test - invalid sourceNetworkId (of Public type, which is not supported)
+ public void createWithInvalidSourceIpNtwk() {
+ String expectedExcText = null;
+ try {
+ _appLbSvc.createApplicationLoadBalancer("alena", "alena", Scheme.Internal, validPublicNetworkId, validRequestedIp,
+ 22, 22, "roundrobin", validGuestNetworkId, validAccountId);
+ } catch (InsufficientAddressCapacityException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ } catch (InsufficientVirtualNetworkCapcityException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ } catch (NetworkRuleConflictException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ } catch (InvalidParameterValueException e) {
+ expectedExcText = e.getMessage();
+ throw e;
+ } finally {
+ assertEquals("Test failed. The rule with invalid source ip network id was created"
+ + expectedExcText, expectedExcText, "Only traffic type Guest is supported");
+ }
+ }
+
+
+ @Test(expected = InvalidParameterValueException.class)
+ //Negative test - invalid requested IP (outside of guest network cidr range)
+ public void createWithInvalidRequestedIp() {
+ String expectedExcText = null;
+ try {
+ _appLbSvc.createApplicationLoadBalancer("alena", "alena", Scheme.Internal, validGuestNetworkId, "10.2.1.1",
+ 22, 22, "roundrobin", validGuestNetworkId, validAccountId);
+ } catch (InsufficientAddressCapacityException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ } catch (InsufficientVirtualNetworkCapcityException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ } catch (NetworkRuleConflictException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+
+ } catch (InvalidParameterValueException e) {
+ expectedExcText = e.getMessage();
+ throw e;
+ } finally {
+ assertEquals("Test failed. The rule with invalid requested ip was created"
+ + expectedExcText, expectedExcText, "The requested IP is not in the network's CIDR subnet.");
+ }
+ }
+
+
+ private static NetworkVO setId(NetworkVO vo, long id) {
+ NetworkVO voToReturn = vo;
+ Class<?> c = voToReturn.getClass();
+ try {
+ Field f = c.getDeclaredField("id");
+ f.setAccessible(true);
+ f.setLong(voToReturn, id);
+ } catch (NoSuchFieldException ex) {
+ return null;
+ } catch (IllegalAccessException ex) {
+ return null;
+ }
+
+ return voToReturn;
+ }
}