Skip to content

Commit 4313c3d

Browse files
SadiJrSadiJrSadiJr
authored
Allow users to view reserved System VM IPs, if they're already allocated to user (#5902)
* Allow users to view reserved system VM IPs, if this IPs are already allocated to any user VM * Fix checkstyle * Address reviews * Address reviews * Apply @weizhouapache changes Credits to @weizhouapache, and my sincere thanks for the help. Co-authored-by: SadiJr <sadi@scclouds.com.br> Co-authored-by: SadiJr <17a0db2854@firemailbox.club>
1 parent 7ea0dea commit 4313c3d

3 files changed

Lines changed: 124 additions & 3 deletions

File tree

server/src/main/java/com/cloud/network/IpAddressManagerImpl.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -306,7 +306,7 @@ public class IpAddressManagerImpl extends ManagerBase implements IpAddressManage
306306

307307
private static final ConfigKey<Boolean> SystemVmPublicIpReservationModeStrictness = new ConfigKey<Boolean>("Advanced",
308308
Boolean.class, "system.vm.public.ip.reservation.mode.strictness", "false",
309-
"If enabled, the use of System VMs public IP reservation is strict, preferred if not.", false, ConfigKey.Scope.Global);
309+
"If enabled, the use of System VMs public IP reservation is strict, preferred if not.", true, ConfigKey.Scope.Global);
310310

311311
private Random rand = new Random(System.currentTimeMillis());
312312

@@ -2306,4 +2306,8 @@ public boolean isUsageHidden(IPAddressVO ip) {
23062306
NetworkDetailVO networkDetail = _networkDetailsDao.findDetail(networkId, Network.hideIpAddressUsage);
23072307
return networkDetail != null && "true".equals(networkDetail.getValue());
23082308
}
2309+
2310+
public static ConfigKey<Boolean> getSystemvmpublicipreservationmodestrictness() {
2311+
return SystemVmPublicIpReservationModeStrictness;
2312+
}
23092313
}

server/src/main/java/com/cloud/server/ManagementServerImpl.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -666,6 +666,7 @@
666666
import com.cloud.info.ConsoleProxyInfo;
667667
import com.cloud.network.IpAddress;
668668
import com.cloud.network.IpAddressManager;
669+
import com.cloud.network.IpAddressManagerImpl;
669670
import com.cloud.network.Network;
670671
import com.cloud.network.NetworkModel;
671672
import com.cloud.network.dao.IPAddressDao;
@@ -2395,7 +2396,7 @@ private void buildParameters(final SearchBuilder<IPAddressVO> sb, final ListPubl
23952396
}
23962397
}
23972398

2398-
private void setParameters(SearchCriteria<IPAddressVO> sc, final ListPublicIpAddressesCmd cmd, VlanType vlanType, Boolean isAllocated) {
2399+
protected void setParameters(SearchCriteria<IPAddressVO> sc, final ListPublicIpAddressesCmd cmd, VlanType vlanType, Boolean isAllocated) {
23992400
final Object keyword = cmd.getKeyword();
24002401
final Long physicalNetworkId = cmd.getPhysicalNetworkId();
24012402
final Long sourceNetworkId = cmd.getNetworkId();
@@ -2467,7 +2468,9 @@ private void setParameters(SearchCriteria<IPAddressVO> sc, final ListPublicIpAdd
24672468
sc.setParameters("state", IpAddress.State.Allocated);
24682469
}
24692470

2470-
sc.setParameters( "forsystemvms", false);
2471+
if (IpAddressManagerImpl.getSystemvmpublicipreservationmodestrictness().value() && IpAddress.State.Free.name().equalsIgnoreCase(state)) {
2472+
sc.setParameters("forsystemvms", false);
2473+
}
24712474
}
24722475

24732476
@Override

server/src/test/java/com/cloud/server/ManagementServerImplTest.java

Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,23 +21,35 @@
2121
import static org.mockito.Mockito.lenient;
2222
import static org.mockito.Mockito.when;
2323

24+
import org.apache.cloudstack.api.command.user.address.ListPublicIpAddressesCmd;
2425
import org.apache.cloudstack.api.command.user.ssh.RegisterSSHKeyPairCmd;
26+
import org.apache.cloudstack.framework.config.ConfigKey;
27+
import org.junit.Before;
2528
import org.junit.Test;
2629
import org.junit.runner.RunWith;
2730
import org.mockito.Mock;
2831
import org.mockito.Mockito;
2932
import org.mockito.Spy;
3033
import org.mockito.runners.MockitoJUnitRunner;
34+
import org.powermock.reflect.Whitebox;
3135

36+
import com.cloud.dc.Vlan.VlanType;
3237
import com.cloud.exception.InvalidParameterValueException;
38+
import com.cloud.network.IpAddress;
39+
import com.cloud.network.IpAddressManagerImpl;
40+
import com.cloud.network.dao.IPAddressVO;
3341
import com.cloud.user.Account;
3442
import com.cloud.user.SSHKeyPair;
3543
import com.cloud.user.SSHKeyPairVO;
3644
import com.cloud.user.dao.SSHKeyPairDao;
45+
import com.cloud.utils.db.SearchCriteria;
3746

3847
@RunWith(MockitoJUnitRunner.class)
3948
public class ManagementServerImplTest {
4049

50+
@Mock
51+
SearchCriteria<IPAddressVO> sc;
52+
4153
@Mock
4254
RegisterSSHKeyPairCmd regCmd;
4355

@@ -54,9 +66,20 @@ public class ManagementServerImplTest {
5466
@Mock
5567
SSHKeyPair sshKeyPair;
5668

69+
@Mock
70+
IpAddressManagerImpl ipAddressManagerImpl;
71+
5772
@Spy
5873
ManagementServerImpl spy;
5974

75+
ConfigKey mockConfig;
76+
77+
@Before
78+
public void setup() {
79+
mockConfig = Mockito.mock(ConfigKey.class);
80+
Whitebox.setInternalState(ipAddressManagerImpl.getClass(), "SystemVmPublicIpReservationModeStrictness", mockConfig);
81+
}
82+
6083
@Test(expected = InvalidParameterValueException.class)
6184
public void testDuplicateRegistraitons(){
6285
String accountName = "account";
@@ -107,4 +130,95 @@ public void testSuccess(){
107130
spy.registerSSHKeyPair(regCmd);
108131
Mockito.verify(spy, Mockito.times(3)).getPublicKeyFromKeyKeyMaterial(anyString());
109132
}
133+
134+
@Test
135+
public void setParametersTestWhenStateIsFreeAndSystemVmPublicIsTrue() throws IllegalArgumentException, IllegalAccessException, NoSuchFieldException, SecurityException {
136+
Mockito.when(mockConfig.value()).thenReturn(Boolean.TRUE);
137+
138+
ListPublicIpAddressesCmd cmd = Mockito.mock(ListPublicIpAddressesCmd.class);
139+
Mockito.when(cmd.getNetworkId()).thenReturn(10L);
140+
Mockito.when(cmd.getZoneId()).thenReturn(null);
141+
Mockito.when(cmd.getIpAddress()).thenReturn(null);
142+
Mockito.when(cmd.getPhysicalNetworkId()).thenReturn(null);
143+
Mockito.when(cmd.getVlanId()).thenReturn(null);
144+
Mockito.when(cmd.getId()).thenReturn(null);
145+
Mockito.when(cmd.isSourceNat()).thenReturn(null);
146+
Mockito.when(cmd.isStaticNat()).thenReturn(null);
147+
Mockito.when(cmd.getState()).thenReturn(IpAddress.State.Free.name());
148+
Mockito.when(cmd.getTags()).thenReturn(null);
149+
spy.setParameters(sc, cmd, VlanType.VirtualNetwork, Boolean.FALSE);
150+
151+
Mockito.verify(sc, Mockito.times(1)).setJoinParameters("vlanSearch", "vlanType", VlanType.VirtualNetwork);
152+
Mockito.verify(sc, Mockito.times(1)).setParameters("display", false);
153+
Mockito.verify(sc, Mockito.times(1)).setParameters("sourceNetworkId", 10L);
154+
Mockito.verify(sc, Mockito.times(1)).setParameters("state", "Free");
155+
Mockito.verify(sc, Mockito.times(1)).setParameters("forsystemvms", false);
156+
}
157+
158+
@Test
159+
public void setParametersTestWhenStateIsFreeAndSystemVmPublicIsFalse() {
160+
Mockito.when(mockConfig.value()).thenReturn(Boolean.FALSE);
161+
ListPublicIpAddressesCmd cmd = Mockito.mock(ListPublicIpAddressesCmd.class);
162+
Mockito.when(cmd.getNetworkId()).thenReturn(10L);
163+
Mockito.when(cmd.getZoneId()).thenReturn(null);
164+
Mockito.when(cmd.getIpAddress()).thenReturn(null);
165+
Mockito.when(cmd.getPhysicalNetworkId()).thenReturn(null);
166+
Mockito.when(cmd.getVlanId()).thenReturn(null);
167+
Mockito.when(cmd.getId()).thenReturn(null);
168+
Mockito.when(cmd.isSourceNat()).thenReturn(null);
169+
Mockito.when(cmd.isStaticNat()).thenReturn(null);
170+
Mockito.when(cmd.getState()).thenReturn(IpAddress.State.Free.name());
171+
Mockito.when(cmd.getTags()).thenReturn(null);
172+
spy.setParameters(sc, cmd, VlanType.VirtualNetwork, Boolean.FALSE);
173+
174+
Mockito.verify(sc, Mockito.times(1)).setJoinParameters("vlanSearch", "vlanType", VlanType.VirtualNetwork);
175+
Mockito.verify(sc, Mockito.times(1)).setParameters("display", false);
176+
Mockito.verify(sc, Mockito.times(1)).setParameters("sourceNetworkId", 10L);
177+
Mockito.verify(sc, Mockito.times(1)).setParameters("state", "Free");
178+
Mockito.verify(sc, Mockito.never()).setParameters("forsystemvms", false);
179+
}
180+
181+
@Test
182+
public void setParametersTestWhenStateIsNullAndSystemVmPublicIsFalse() {
183+
Mockito.when(mockConfig.value()).thenReturn(Boolean.FALSE);
184+
ListPublicIpAddressesCmd cmd = Mockito.mock(ListPublicIpAddressesCmd.class);
185+
Mockito.when(cmd.getNetworkId()).thenReturn(10L);
186+
Mockito.when(cmd.getZoneId()).thenReturn(null);
187+
Mockito.when(cmd.getIpAddress()).thenReturn(null);
188+
Mockito.when(cmd.getPhysicalNetworkId()).thenReturn(null);
189+
Mockito.when(cmd.getVlanId()).thenReturn(null);
190+
Mockito.when(cmd.getId()).thenReturn(null);
191+
Mockito.when(cmd.isSourceNat()).thenReturn(null);
192+
Mockito.when(cmd.isStaticNat()).thenReturn(null);
193+
Mockito.when(cmd.getState()).thenReturn(null);
194+
Mockito.when(cmd.getTags()).thenReturn(null);
195+
spy.setParameters(sc, cmd, VlanType.VirtualNetwork, Boolean.TRUE);
196+
197+
Mockito.verify(sc, Mockito.times(1)).setJoinParameters("vlanSearch", "vlanType", VlanType.VirtualNetwork);
198+
Mockito.verify(sc, Mockito.times(1)).setParameters("display", false);
199+
Mockito.verify(sc, Mockito.times(1)).setParameters("sourceNetworkId", 10L);
200+
Mockito.verify(sc, Mockito.never()).setParameters("forsystemvms", false);
201+
}
202+
203+
@Test
204+
public void setParametersTestWhenStateIsNullAndSystemVmPublicIsTrue() {
205+
Mockito.when(mockConfig.value()).thenReturn(Boolean.TRUE);
206+
ListPublicIpAddressesCmd cmd = Mockito.mock(ListPublicIpAddressesCmd.class);
207+
Mockito.when(cmd.getNetworkId()).thenReturn(10L);
208+
Mockito.when(cmd.getZoneId()).thenReturn(null);
209+
Mockito.when(cmd.getIpAddress()).thenReturn(null);
210+
Mockito.when(cmd.getPhysicalNetworkId()).thenReturn(null);
211+
Mockito.when(cmd.getVlanId()).thenReturn(null);
212+
Mockito.when(cmd.getId()).thenReturn(null);
213+
Mockito.when(cmd.isSourceNat()).thenReturn(null);
214+
Mockito.when(cmd.isStaticNat()).thenReturn(null);
215+
Mockito.when(cmd.getState()).thenReturn(null);
216+
Mockito.when(cmd.getTags()).thenReturn(null);
217+
spy.setParameters(sc, cmd, VlanType.VirtualNetwork, Boolean.TRUE);
218+
219+
Mockito.verify(sc, Mockito.times(1)).setJoinParameters("vlanSearch", "vlanType", VlanType.VirtualNetwork);
220+
Mockito.verify(sc, Mockito.times(1)).setParameters("display", false);
221+
Mockito.verify(sc, Mockito.times(1)).setParameters("sourceNetworkId", 10L);
222+
Mockito.verify(sc, Mockito.never()).setParameters("forsystemvms", false);
223+
}
110224
}

0 commit comments

Comments
 (0)