Skip to content

Commit 7d55554

Browse files
committed
Merge pull request apache#851 from SudharmaJain/cs-8864
CLOUDSTACK-8864: Not able to add TCP port forwarding rule in VPN for specific ports Setting port forwarding rules for port 500,1701 and 4500 after enabling VPN, gives the error message "The range specified, xxxx, conflicts with rule xxxx which has xxxx." This happens because the rules added for vpn doesn't have a matching condition to allow port forwarding rules. Added a unit test to verify the detectRulesConflict function of FirewallManagerImpl. * pr/851: CLOUDSTACK-8864: Not able to add TCP port forwarding rule in VPN for specific ports Signed-off-by: Remi Bergsma <github@remi.nl>
2 parents 8367911 + 96c38bf commit 7d55554

2 files changed

Lines changed: 76 additions & 10 deletions

File tree

server/src/com/cloud/network/firewall/FirewallManagerImpl.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -426,7 +426,8 @@ public void detectRulesConflict(FirewallRule newRule) throws NetworkRuleConflict
426426
// we allow port forwarding rules with the same parameters but different protocols
427427
boolean allowPf =
428428
(rule.getPurpose() == Purpose.PortForwarding && newRule.getPurpose() == Purpose.PortForwarding && !newRule.getProtocol().equalsIgnoreCase(
429-
rule.getProtocol()));
429+
rule.getProtocol())) || (rule.getPurpose() == Purpose.Vpn && newRule.getPurpose() == Purpose.PortForwarding && !newRule.getProtocol().equalsIgnoreCase(
430+
rule.getProtocol()));
430431
boolean allowStaticNat =
431432
(rule.getPurpose() == Purpose.StaticNat && newRule.getPurpose() == Purpose.StaticNat && !newRule.getProtocol().equalsIgnoreCase(rule.getProtocol()));
432433

server/test/com/cloud/network/firewall/FirewallManagerTest.java

Lines changed: 74 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -22,20 +22,28 @@
2222
import static org.mockito.Mockito.mock;
2323
import static org.mockito.Mockito.verify;
2424
import static org.mockito.Mockito.when;
25+
import static org.mockito.Mockito.spy;
2526

2627
import java.util.ArrayList;
2728
import java.util.List;
2829

29-
import javax.inject.Inject;
30-
30+
import com.cloud.exception.NetworkRuleConflictException;
31+
import com.cloud.network.NetworkModel;
32+
import com.cloud.network.dao.FirewallRulesDao;
33+
import com.cloud.network.vpc.VpcManager;
34+
import com.cloud.user.AccountManager;
35+
import com.cloud.user.DomainManager;
3136
import junit.framework.Assert;
3237

3338
import org.apache.log4j.Logger;
39+
import org.junit.Before;
3440
import org.junit.Ignore;
3541
import org.junit.Test;
3642
import org.junit.runner.RunWith;
37-
import org.springframework.test.context.ContextConfiguration;
38-
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
43+
import org.mockito.InjectMocks;
44+
import org.mockito.Mock;
45+
import org.mockito.MockitoAnnotations;
46+
import org.mockito.runners.MockitoJUnitRunner;
3947

4048
import org.apache.cloudstack.engine.orchestration.service.NetworkOrchestrationService;
4149

@@ -52,9 +60,9 @@
5260
import com.cloud.network.rules.FirewallRuleVO;
5361
import com.cloud.utils.component.ComponentContext;
5462

55-
@Ignore("Requires database to be set up")
56-
@RunWith(SpringJUnit4ClassRunner.class)
57-
@ContextConfiguration(locations = "classpath:/testContext.xml")
63+
//@Ignore("Requires database to be set up")
64+
@RunWith(MockitoJUnitRunner.class)
65+
//@ContextConfiguration(locations = "classpath:/testContext.xml")
5866
//@ComponentSetup(managerName="management-server", setupXml="network-mgr-component.xml")
5967
public class FirewallManagerTest {
6068
private static final Logger s_logger = Logger.getLogger(FirewallManagerTest.class);
@@ -71,6 +79,7 @@ public class FirewallManagerTest {
7179
// super.setUp();
7280
// }
7381

82+
@Ignore("Requires database to be set up")
7483
@Test
7584
public void testInjected() {
7685

@@ -100,9 +109,30 @@ public void testInjected() {
100109

101110
}
102111

103-
@Inject
104-
FirewallManager _firewallMgr;
112+
@Mock
113+
AccountManager _accountMgr;
114+
@Mock
115+
NetworkOrchestrationService _networkMgr;
116+
@Mock
117+
NetworkModel _networkModel;
118+
@Mock
119+
DomainManager _domainMgr;
120+
@Mock
121+
VpcManager _vpcMgr;
122+
@Mock
123+
IpAddressManager _ipAddrMgr;
124+
@Mock
125+
FirewallRulesDao _firewallDao;
126+
127+
@InjectMocks
128+
FirewallManager _firewallMgr = new FirewallManagerImpl();
129+
130+
@Before
131+
public void initMocks() {
132+
MockitoAnnotations.initMocks(this);
133+
}
105134

135+
@Ignore("Requires database to be set up")
106136
@Test
107137
public void testApplyRules() {
108138
List<FirewallRuleVO> ruleList = new ArrayList<FirewallRuleVO>();
@@ -123,6 +153,7 @@ public void testApplyRules() {
123153
}
124154
}
125155

156+
@Ignore("Requires database to be set up")
126157
@Test
127158
public void testApplyFWRules() {
128159
List<FirewallRuleVO> ruleList = new ArrayList<FirewallRuleVO>();
@@ -151,4 +182,38 @@ public void testApplyFWRules() {
151182
}
152183
}
153184

185+
@Test
186+
public void testDetectRulesConflict() {
187+
List<FirewallRuleVO> ruleList = new ArrayList<FirewallRuleVO>();
188+
FirewallRuleVO rule1 = spy(new FirewallRuleVO("rule1", 3, 500, "UDP", 1, 2, 1, Purpose.Vpn, null, null, null, null));
189+
FirewallRuleVO rule2 = spy(new FirewallRuleVO("rule2", 3, 1701, "UDP", 1, 2, 1, Purpose.Vpn, null, null, null, null));
190+
FirewallRuleVO rule3 = spy(new FirewallRuleVO("rule3", 3, 4500, "UDP", 1, 2, 1, Purpose.Vpn, null, null, null, null));
191+
192+
ruleList.add(rule1);
193+
ruleList.add(rule2);
194+
ruleList.add(rule3);
195+
196+
FirewallManagerImpl firewallMgr = (FirewallManagerImpl)_firewallMgr;
197+
198+
when(firewallMgr._firewallDao.listByIpAndPurposeAndNotRevoked(3,null)).thenReturn(ruleList);
199+
when(rule1.getId()).thenReturn(1L);
200+
when(rule2.getId()).thenReturn(2L);
201+
when(rule3.getId()).thenReturn(3L);
202+
203+
FirewallRule newRule1 = new FirewallRuleVO("newRule1", 3, 500, "TCP", 1, 2, 1, Purpose.PortForwarding, null, null, null, null);
204+
FirewallRule newRule2 = new FirewallRuleVO("newRule2", 3, 1701, "TCP", 1, 2, 1, Purpose.PortForwarding, null, null, null, null);
205+
FirewallRule newRule3 = new FirewallRuleVO("newRule3", 3, 4500, "TCP", 1, 2, 1, Purpose.PortForwarding, null, null, null, null);
206+
207+
try {
208+
firewallMgr.detectRulesConflict(newRule1);
209+
firewallMgr.detectRulesConflict(newRule2);
210+
firewallMgr.detectRulesConflict(newRule3);
211+
}
212+
catch (NetworkRuleConflictException ex) {
213+
Assert.fail();
214+
}
215+
}
216+
217+
218+
154219
}

0 commit comments

Comments
 (0)