Skip to content

Commit bb7493a

Browse files
nvazquezyadvr
authored andcommitted
configdrive: Add missing ConfigDrive entries on existing zones after upgrade (#3007)
After upgrade existing environments to 4.11, ConfigDrive cannot be enabled for existing zones due to missing entry on 'physical_network_service_providers' table.
1 parent 7d8eb37 commit bb7493a

File tree

2 files changed

+154
-2
lines changed

2 files changed

+154
-2
lines changed

server/src/com/cloud/network/NetworkModelImpl.java

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
import javax.inject.Inject;
3535
import javax.naming.ConfigurationException;
3636

37+
import org.apache.commons.collections.CollectionUtils;
3738
import org.apache.log4j.Logger;
3839

3940
import org.apache.cloudstack.acl.ControlledEntity.ACLType;
@@ -202,6 +203,8 @@ public void setNetworkElements(List<NetworkElement> networkElements) {
202203
private ProjectAccountDao _projectAccountDao;
203204
@Inject
204205
NetworkOfferingDetailsDao _ntwkOffDetailsDao;
206+
@Inject
207+
private NetworkService _networkService;
205208

206209
private final HashMap<String, NetworkOfferingVO> _systemNetworks = new HashMap<String, NetworkOfferingVO>(5);
207210
static Long s_privateOfferingId = null;
@@ -2113,10 +2116,44 @@ public boolean start() {
21132116
}
21142117
}
21152118
}
2119+
2120+
//After network elements are configured correctly, verify ConfigDrive entries on enabled zones
2121+
verifyDisabledConfigDriveEntriesOnEnabledZones();
2122+
21162123
s_logger.info("Started Network Model");
21172124
return true;
21182125
}
21192126

2127+
/**
2128+
* Verifies ConfigDrive entries on a zone and adds disabled ConfigDrive provider if missing.
2129+
*/
2130+
protected void addDisabledConfigDriveEntriesOnZone(DataCenterVO zone) {
2131+
if (zone.getNetworkType() == DataCenter.NetworkType.Advanced) {
2132+
List<PhysicalNetworkVO> physicalNetworks = _physicalNetworkDao.listByZoneAndTrafficType(
2133+
zone.getId(), TrafficType.Guest);
2134+
for (PhysicalNetworkVO physicalNetworkVO : physicalNetworks) {
2135+
PhysicalNetworkServiceProviderVO provider = _pNSPDao.findByServiceProvider(
2136+
physicalNetworkVO.getId(), Provider.ConfigDrive.getName());
2137+
if (provider == null) {
2138+
_networkService.addProviderToPhysicalNetwork(
2139+
physicalNetworkVO.getId(), Provider.ConfigDrive.getName(), null, null);
2140+
}
2141+
}
2142+
}
2143+
}
2144+
2145+
/**
2146+
* Verifies ConfigDrive entries on enabled zones, adds disabled ConfigDrive provider if missing.
2147+
*/
2148+
protected void verifyDisabledConfigDriveEntriesOnEnabledZones() {
2149+
List<DataCenterVO> zones = _dcDao.listEnabledZones();
2150+
if (CollectionUtils.isNotEmpty(zones)) {
2151+
for (DataCenterVO zone : zones) {
2152+
addDisabledConfigDriveEntriesOnZone(zone);
2153+
}
2154+
}
2155+
}
2156+
21202157
@Override
21212158
public boolean stop() {
21222159
return true;

server/test/com/cloud/network/NetworkModelTest.java

Lines changed: 117 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,18 +19,32 @@
1919

2020
import static org.mockito.Matchers.any;
2121
import static org.mockito.Matchers.anyLong;
22+
import static org.mockito.Matchers.eq;
23+
import static org.mockito.Matchers.isNull;
2224
import static org.mockito.Mockito.doReturn;
2325
import static org.mockito.Mockito.mock;
26+
import static org.mockito.Mockito.never;
27+
import static org.mockito.Mockito.times;
28+
import static org.mockito.Mockito.verify;
2429
import static org.mockito.Mockito.when;
2530
import static org.mockito.Mockito.spy;
2631

2732
import java.util.ArrayList;
33+
import java.util.Arrays;
34+
import java.util.Collections;
2835
import java.util.HashMap;
2936
import java.util.HashSet;
3037
import java.util.List;
3138
import java.util.Map;
3239
import java.util.Set;
3340

41+
import com.cloud.dc.DataCenter;
42+
import com.cloud.dc.DataCenterVO;
43+
import com.cloud.dc.dao.DataCenterDao;
44+
import com.cloud.network.dao.PhysicalNetworkDao;
45+
import com.cloud.network.dao.PhysicalNetworkServiceProviderDao;
46+
import com.cloud.network.dao.PhysicalNetworkServiceProviderVO;
47+
import com.cloud.network.dao.PhysicalNetworkVO;
3448
import junit.framework.Assert;
3549

3650
import org.junit.Before;
@@ -48,11 +62,64 @@
4862
import com.cloud.utils.db.SearchCriteria;
4963
import com.cloud.utils.net.Ip;
5064
import com.cloud.network.Network.Provider;
65+
import org.mockito.InjectMocks;
66+
import org.mockito.Mock;
67+
import org.mockito.MockitoAnnotations;
68+
import org.mockito.Spy;
5169

5270
public class NetworkModelTest {
71+
72+
@Mock
73+
private DataCenterDao dataCenterDao;
74+
@Mock
75+
private PhysicalNetworkDao physicalNetworkDao;
76+
@Mock
77+
private PhysicalNetworkServiceProviderDao physicalNetworkServiceProviderDao;
78+
@Mock
79+
private NetworkService networkService;
80+
81+
@InjectMocks
82+
@Spy
83+
private NetworkModelImpl networkModel = new NetworkModelImpl();
84+
85+
@Mock
86+
private DataCenterVO zone1;
87+
@Mock
88+
private DataCenterVO zone2;
89+
@Mock
90+
private PhysicalNetworkVO physicalNetworkZone1;
91+
@Mock
92+
private PhysicalNetworkVO physicalNetworkZone2;
93+
@Mock
94+
private PhysicalNetworkServiceProviderVO providerVO;
95+
96+
private static final long ZONE_1_ID = 1L;
97+
private static final long ZONE_2_ID = 2L;
98+
private static final long PHYSICAL_NETWORK_1_ID = 1L;
99+
private static final long PHYSICAL_NETWORK_2_ID = 2L;
100+
53101
@Before
54102
public void setUp() {
55-
103+
MockitoAnnotations.initMocks(this);
104+
105+
when(dataCenterDao.listEnabledZones()).thenReturn(Arrays.asList(zone1, zone2));
106+
when(physicalNetworkDao.listByZoneAndTrafficType(ZONE_1_ID, Networks.TrafficType.Guest)).
107+
thenReturn(Collections.singletonList(physicalNetworkZone1));
108+
when(physicalNetworkDao.listByZoneAndTrafficType(ZONE_2_ID, Networks.TrafficType.Guest)).
109+
thenReturn(Collections.singletonList(physicalNetworkZone2));
110+
when(physicalNetworkServiceProviderDao.findByServiceProvider(
111+
PHYSICAL_NETWORK_1_ID, Network.Provider.ConfigDrive.getName())).thenReturn(null);
112+
when(physicalNetworkServiceProviderDao.findByServiceProvider(
113+
PHYSICAL_NETWORK_2_ID, Network.Provider.ConfigDrive.getName())).thenReturn(null);
114+
115+
when(zone1.getNetworkType()).thenReturn(DataCenter.NetworkType.Advanced);
116+
when(zone1.getId()).thenReturn(ZONE_1_ID);
117+
118+
when(zone2.getNetworkType()).thenReturn(DataCenter.NetworkType.Advanced);
119+
when(zone2.getId()).thenReturn(ZONE_2_ID);
120+
121+
when(physicalNetworkZone1.getId()).thenReturn(PHYSICAL_NETWORK_1_ID);
122+
when(physicalNetworkZone2.getId()).thenReturn(PHYSICAL_NETWORK_2_ID);
56123
}
57124

58125
@Test
@@ -69,7 +136,7 @@ public void testGetSourceNatIpAddressForGuestNetwork() {
69136
when(fakeVlanDao.findById(anyLong())).thenReturn(mock(VlanVO.class));
70137
modelImpl._vlanDao = fakeVlanDao;
71138
when(fakeSearch.create()).thenReturn(mock(SearchCriteria.class));
72-
when(ipAddressDao.search(any(SearchCriteria.class), (Filter)org.mockito.Matchers.isNull())).thenReturn(fakeList);
139+
when(ipAddressDao.search(any(SearchCriteria.class), (Filter) isNull())).thenReturn(fakeList);
73140
when(ipAddressDao.findById(anyLong())).thenReturn(fakeIp);
74141
Account fakeAccount = mock(Account.class);
75142
when(fakeAccount.getId()).thenReturn(1L);
@@ -134,5 +201,53 @@ public void testCapabilityForProvider() {
134201
}
135202
}
136203

204+
@Test
205+
public void testVerifyDisabledConfigDriveEntriesOnZonesBothEnabledZones() {
206+
networkModel.verifyDisabledConfigDriveEntriesOnEnabledZones();
207+
verify(networkModel, times(2)).addDisabledConfigDriveEntriesOnZone(any(DataCenterVO.class));
208+
}
209+
210+
@Test
211+
public void testVerifyDisabledConfigDriveEntriesOnZonesOneEnabledZone() {
212+
when(dataCenterDao.listEnabledZones()).thenReturn(Collections.singletonList(zone1));
213+
214+
networkModel.verifyDisabledConfigDriveEntriesOnEnabledZones();
215+
verify(networkModel).addDisabledConfigDriveEntriesOnZone(any(DataCenterVO.class));
216+
}
217+
218+
@Test
219+
public void testVerifyDisabledConfigDriveEntriesOnZonesNoEnabledZones() {
220+
when(dataCenterDao.listEnabledZones()).thenReturn(null);
221+
222+
networkModel.verifyDisabledConfigDriveEntriesOnEnabledZones();
223+
verify(networkModel, never()).addDisabledConfigDriveEntriesOnZone(any(DataCenterVO.class));
224+
}
225+
226+
@Test
227+
public void testAddDisabledConfigDriveEntriesOnZoneBasicZone() {
228+
when(zone1.getNetworkType()).thenReturn(DataCenter.NetworkType.Basic);
229+
230+
networkModel.addDisabledConfigDriveEntriesOnZone(zone1);
231+
verify(physicalNetworkDao, never()).listByZoneAndTrafficType(ZONE_1_ID, Networks.TrafficType.Guest);
232+
verify(networkService, never()).
233+
addProviderToPhysicalNetwork(anyLong(), eq(Provider.ConfigDrive.getName()), isNull(Long.class), isNull(List.class));
234+
}
235+
236+
@Test
237+
public void testAddDisabledConfigDriveEntriesOnZoneAdvancedZoneExistingConfigDrive() {
238+
when(physicalNetworkServiceProviderDao.findByServiceProvider(
239+
PHYSICAL_NETWORK_1_ID, Network.Provider.ConfigDrive.getName())).thenReturn(providerVO);
240+
241+
networkModel.addDisabledConfigDriveEntriesOnZone(zone1);
242+
verify(networkService, never()).
243+
addProviderToPhysicalNetwork(anyLong(), eq(Provider.ConfigDrive.getName()), isNull(Long.class), isNull(List.class));
244+
}
245+
246+
@Test
247+
public void testAddDisabledConfigDriveEntriesOnZoneAdvancedZoneNonExistingConfigDrive() {
248+
networkModel.addDisabledConfigDriveEntriesOnZone(zone1);
249+
verify(networkService).
250+
addProviderToPhysicalNetwork(anyLong(), eq(Provider.ConfigDrive.getName()), isNull(Long.class), isNull(List.class));
251+
}
137252

138253
}

0 commit comments

Comments
 (0)