2020
2121import com .cloud .agent .AgentManager ;
2222import com .cloud .agent .api .Answer ;
23+ import com .cloud .agent .api .CleanupPersistentNetworkResourceCommand ;
2324import com .cloud .agent .api .ModifyStoragePoolAnswer ;
2425import com .cloud .agent .api .ModifyStoragePoolCommand ;
26+ import com .cloud .agent .api .SetupPersistentNetworkCommand ;
27+ import com .cloud .agent .api .to .NicTO ;
2528import com .cloud .alert .AlertManager ;
29+ import com .cloud .configuration .ConfigurationManager ;
2630import com .cloud .exception .StorageConflictException ;
31+ import com .cloud .host .HostVO ;
32+ import com .cloud .host .dao .HostDao ;
33+ import com .cloud .network .NetworkModel ;
34+ import com .cloud .network .dao .NetworkDao ;
35+ import com .cloud .network .dao .NetworkVO ;
36+ import com .cloud .offerings .NetworkOfferingVO ;
37+ import com .cloud .offerings .dao .NetworkOfferingDao ;
2738import com .cloud .storage .DataStoreRole ;
2839import com .cloud .storage .Storage ;
2940import com .cloud .storage .StorageManager ;
@@ -62,12 +73,68 @@ public class DefaultHostListener implements HypervisorHostListener {
6273 StorageManager storageManager ;
6374 @ Inject
6475 StorageService storageService ;
76+ @ Inject
77+ NetworkOfferingDao networkOfferingDao ;
78+ @ Inject
79+ HostDao hostDao ;
80+ @ Inject
81+ NetworkModel networkModel ;
82+ @ Inject
83+ ConfigurationManager configManager ;
84+ @ Inject
85+ NetworkDao networkDao ;
86+
6587
6688 @ Override
6789 public boolean hostAdded (long hostId ) {
6890 return true ;
6991 }
7092
93+ private boolean createPersistentNetworkResourcesOnHost (long hostId ) {
94+ HostVO host = hostDao .findById (hostId );
95+ if (host == null ) {
96+ s_logger .warn (String .format ("Host with id %ld can't be found" , hostId ));
97+ return false ;
98+ }
99+
100+ List <NetworkVO > allPersistentNetworks = networkDao .getAllPersistentNetworksFromZone (host .getDataCenterId ());
101+
102+ for (NetworkVO networkVO : allPersistentNetworks ) {
103+ NetworkOfferingVO networkOfferingVO = networkOfferingDao .findById (networkVO .getNetworkOfferingId ());
104+
105+ SetupPersistentNetworkCommand persistentNetworkCommand =
106+ new SetupPersistentNetworkCommand (createNicTOFromNetworkAndOffering (networkVO , networkOfferingVO , host ));
107+ Answer answer = agentMgr .easySend (hostId , persistentNetworkCommand );
108+ if (answer == null ) {
109+ throw new CloudRuntimeException ("Unable to get answer to the setup persistent network command " + networkVO .getId ());
110+ }
111+ if (!answer .getResult ()) {
112+ String msg = String .format ("Unable to create L2 persistent network resources from network %ld on the host %ld in zone %ld" , networkVO .getId (), hostId , networkVO .getDataCenterId ());
113+ alertMgr .sendAlert (AlertManager .AlertType .ALERT_TYPE_HOST , networkVO .getDataCenterId (), host .getPodId (), msg , msg );
114+ throw new CloudRuntimeException ("Unable to create persistent network resources from network " + networkVO .getId () +
115+ " on " + hostId + " due to " + answer .getDetails ());
116+ }
117+ }
118+ return true ;
119+ }
120+
121+ /**
122+ * Creates a dummy NicTO object which is used by the respective hypervisors to setup network elements / resources
123+ * - bridges(KVM), VLANs(Xen) and portgroups(VMWare) for L2 network
124+ */
125+ private NicTO createNicTOFromNetworkAndOffering (NetworkVO networkVO , NetworkOfferingVO networkOfferingVO , HostVO hostVO ) {
126+ NicTO to = new NicTO ();
127+ to .setName (networkModel .getNetworkTag (hostVO .getHypervisorType (), networkVO ));
128+ to .setBroadcastType (networkVO .getBroadcastDomainType ());
129+ to .setType (networkVO .getTrafficType ());
130+ to .setBroadcastUri (networkVO .getBroadcastUri ());
131+ to .setIsolationuri (networkVO .getBroadcastUri ());
132+ to .setNetworkRateMbps (configManager .getNetworkOfferingNetworkRate (networkOfferingVO .getId (), networkVO .getDataCenterId ()));
133+ to .setSecurityGroupEnabled (networkModel .isSecurityGroupSupportedInNetwork (networkVO ));
134+ return to ;
135+ }
136+
137+
71138 @ Override
72139 public boolean hostConnect (long hostId , long poolId ) throws StorageConflictException {
73140 StoragePool pool = (StoragePool ) this .dataStoreMgr .getDataStore (poolId , DataStoreRole .Primary );
@@ -109,7 +176,8 @@ public boolean hostConnect(long hostId, long poolId) throws StorageConflictExcep
109176 storageService .updateStorageCapabilities (poolId , false );
110177
111178 s_logger .info ("Connection established between storage pool " + pool + " and host " + hostId );
112- return true ;
179+
180+ return createPersistentNetworkResourcesOnHost (hostId );
113181 }
114182
115183 private void updateStoragePoolHostVOAndDetails (StoragePool pool , long hostId , ModifyStoragePoolAnswer mspAnswer ) {
@@ -124,7 +192,7 @@ private void updateStoragePoolHostVOAndDetails(StoragePool pool, long hostId, Mo
124192 StoragePoolVO poolVO = this .primaryStoreDao .findById (pool .getId ());
125193 poolVO .setUsedBytes (mspAnswer .getPoolInfo ().getCapacityBytes () - mspAnswer .getPoolInfo ().getAvailableBytes ());
126194 poolVO .setCapacityBytes (mspAnswer .getPoolInfo ().getCapacityBytes ());
127- if (StringUtils .isNotEmpty (mspAnswer .getPoolType ())) {
195+ if (StringUtils .isNotEmpty (mspAnswer .getPoolType ())) {
128196 StoragePoolDetailVO poolType = storagePoolDetailsDao .findDetail (pool .getId (), "pool_type" );
129197 if (poolType == null ) {
130198 StoragePoolDetailVO storagePoolDetailVO = new StoragePoolDetailVO (pool .getId (), "pool_type" , mspAnswer .getPoolType (), false );
@@ -142,6 +210,28 @@ public boolean hostDisconnected(long hostId, long poolId) {
142210
143211 @ Override
144212 public boolean hostAboutToBeRemoved (long hostId ) {
213+ // send host the cleanup persistent network resources
214+ HostVO host = hostDao .findById (hostId );
215+ if (host == null ) {
216+ s_logger .warn ("Host with id " + hostId + " can't be found" );
217+ return false ;
218+ }
219+
220+ List <NetworkVO > allPersistentNetworks = networkDao .getAllPersistentNetworksFromZone (host .getDataCenterId ()); // find zoneId of host
221+ for (NetworkVO persistentNetworkVO : allPersistentNetworks ) {
222+ NetworkOfferingVO networkOfferingVO = networkOfferingDao .findById (persistentNetworkVO .getNetworkOfferingId ());
223+ CleanupPersistentNetworkResourceCommand cleanupCmd =
224+ new CleanupPersistentNetworkResourceCommand (createNicTOFromNetworkAndOffering (persistentNetworkVO , networkOfferingVO , host ));
225+ Answer answer = agentMgr .easySend (hostId , cleanupCmd );
226+ if (answer == null ) {
227+ throw new CloudRuntimeException ("Unable to get answer to the cleanup persistent network command " + persistentNetworkVO .getId ());
228+ }
229+ if (!answer .getResult ()) {
230+ String msg = String .format ("Unable to cleanup L2 persistent network resources from network %ld on the host %ld" , persistentNetworkVO .getId (), hostId );
231+
232+ alertMgr .sendAlert (AlertManager .AlertType .ALERT_TYPE_HOST , persistentNetworkVO .getDataCenterId (), host .getPodId (), msg , msg );
233+ }
234+ }
145235 return true ;
146236 }
147237
0 commit comments