mirror of
				https://github.com/apache/cloudstack.git
				synced 2025-10-26 08:42:29 +01:00 
			
		
		
		
	CLOUDSTACK-3272 Latest changes to add global configuration parameters to control the publishing of events on the message bus
This commit is contained in:
		
							parent
							
								
									23c7a893e3
								
							
						
					
					
						commit
						4b89a45e57
					
				| @ -28,6 +28,7 @@ import javax.inject.Inject; | ||||
| import org.apache.log4j.Logger; | ||||
| import org.springframework.beans.factory.NoSuchBeanDefinitionException; | ||||
| 
 | ||||
| import org.apache.cloudstack.framework.config.dao.ConfigurationDao; | ||||
| import org.apache.cloudstack.framework.events.Event; | ||||
| import org.apache.cloudstack.framework.events.EventBus; | ||||
| import org.apache.cloudstack.framework.events.EventBusException; | ||||
| @ -46,6 +47,7 @@ public class UsageEventUtils { | ||||
|     private static DataCenterDao s_dcDao; | ||||
|     private static final Logger s_logger = Logger.getLogger(UsageEventUtils.class); | ||||
|     protected static EventBus s_eventBus = null; | ||||
|     protected static ConfigurationDao s_configDao; | ||||
| 
 | ||||
|     @Inject | ||||
|     UsageEventDao usageEventDao; | ||||
| @ -53,6 +55,8 @@ public class UsageEventUtils { | ||||
|     AccountDao accountDao; | ||||
|     @Inject | ||||
|     DataCenterDao dcDao; | ||||
|     @Inject | ||||
|     ConfigurationDao configDao; | ||||
| 
 | ||||
|     public UsageEventUtils() { | ||||
|     } | ||||
| @ -62,6 +66,7 @@ public class UsageEventUtils { | ||||
|         s_usageEventDao = usageEventDao; | ||||
|         s_accountDao = accountDao; | ||||
|         s_dcDao = dcDao; | ||||
|         s_configDao = configDao; | ||||
|     } | ||||
| 
 | ||||
|     public static void publishUsageEvent(String usageType, long accountId, long zoneId, long resourceId, String resourceName, Long offeringId, Long templateId, | ||||
| @ -161,7 +166,11 @@ public class UsageEventUtils { | ||||
|     } | ||||
| 
 | ||||
|     private static void publishUsageEvent(String usageEventType, Long accountId, Long zoneId, String resourceType, String resourceUUID) { | ||||
| 
 | ||||
|         String configKey = "publish.usage.events"; | ||||
|         String value = s_configDao.getValue(configKey); | ||||
|         boolean configValue = Boolean.parseBoolean(value); | ||||
|         if( !configValue) | ||||
|             return; | ||||
|         try { | ||||
|             s_eventBus = ComponentContext.getComponent(EventBus.class); | ||||
|         } catch (NoSuchBeanDefinitionException nbe) { | ||||
|  | ||||
| @ -27,6 +27,7 @@ import javax.inject.Inject; | ||||
| import org.apache.log4j.Logger; | ||||
| import org.springframework.beans.factory.NoSuchBeanDefinitionException; | ||||
| 
 | ||||
| import org.apache.cloudstack.framework.config.dao.ConfigurationDao; | ||||
| import org.apache.cloudstack.framework.events.EventBus; | ||||
| import org.apache.cloudstack.framework.events.EventBusException; | ||||
| 
 | ||||
| @ -44,14 +45,17 @@ public class NetworkStateListener implements StateListener<State, Event, Network | ||||
|     protected UsageEventDao _usageEventDao; | ||||
|     @Inject | ||||
|     protected NetworkDao _networkDao; | ||||
|     @Inject | ||||
|     protected ConfigurationDao _configDao; | ||||
| 
 | ||||
|     protected static EventBus s_eventBus = null; | ||||
| 
 | ||||
|     private static final Logger s_logger = Logger.getLogger(NetworkStateListener.class); | ||||
| 
 | ||||
|     public NetworkStateListener(UsageEventDao usageEventDao, NetworkDao networkDao) { | ||||
|     public NetworkStateListener(UsageEventDao usageEventDao, NetworkDao networkDao, ConfigurationDao configDao) { | ||||
|         _usageEventDao = usageEventDao; | ||||
|         _networkDao = networkDao; | ||||
|         _configDao = configDao; | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
| @ -68,6 +72,11 @@ public class NetworkStateListener implements StateListener<State, Event, Network | ||||
| 
 | ||||
|     private void pubishOnEventBus(String event, String status, Network vo, State oldState, State newState) { | ||||
| 
 | ||||
|         String configKey = "publish.resource.state.events"; | ||||
|         String value = _configDao.getValue(configKey); | ||||
|         boolean configValue = Boolean.parseBoolean(value); | ||||
|         if(!configValue) | ||||
|             return; | ||||
|         try { | ||||
|             s_eventBus = ComponentContext.getComponent(EventBus.class); | ||||
|         } catch (NoSuchBeanDefinitionException nbe) { | ||||
|  | ||||
| @ -574,7 +574,7 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra | ||||
| 
 | ||||
|         _agentMgr.registerForHostEvents(this, true, false, true); | ||||
| 
 | ||||
|         Network.State.getStateMachine().registerListener(new NetworkStateListener(_usageEventDao, _networksDao)); | ||||
|         Network.State.getStateMachine().registerListener(new NetworkStateListener(_usageEventDao, _networksDao, _configDao)); | ||||
| 
 | ||||
|         s_logger.info("Network Manager is configured."); | ||||
| 
 | ||||
|  | ||||
| @ -1915,7 +1915,12 @@ public enum Config { | ||||
|             "timeout in seconds for each Virtual Router command being aggregated. The final aggregation command timeout would be determined by this timeout * commands counts ", | ||||
|             null), | ||||
| 
 | ||||
|     ManagementServerVendor("Advanced", ManagementServer.class, String.class, "mgt.server.vendor", "ACS", "the vendor of management server", null); | ||||
|     ManagementServerVendor("Advanced", ManagementServer.class, String.class, "mgt.server.vendor", "ACS", "the vendor of management server", null), | ||||
|     PublishActionEvent("Advanced", ManagementServer.class, Boolean.class, "publish.action.events", "true", "enable or disable publishing of action events on the event bus", null), | ||||
|     PublishAlertEvent("Advanced", ManagementServer.class, Boolean.class, "publish.alert.events", "true", "enable or disable publishing of alert events on the event bus", null), | ||||
|     PublishResourceStateEvent("Advanced", ManagementServer.class, Boolean.class, "publish.resource.state.events", "true", "enable or disable publishing of alert events on the event bus", null), | ||||
|     PublishUsageEvent("Advanced", ManagementServer.class, Boolean.class, "publish.usage.events", "true", "enable or disable publishing of usage events on the event bus", null), | ||||
|     PublishAsynJobEvent("Advanced", ManagementServer.class, Boolean.class, "publish.async.job.events", "true", "enable or disable publishing of usage events on the event bus", null); | ||||
| 
 | ||||
|     private final String _category; | ||||
|     private final Class<?> _componentClass; | ||||
|  | ||||
| @ -32,9 +32,11 @@ import org.apache.log4j.Logger; | ||||
| import org.springframework.beans.factory.NoSuchBeanDefinitionException; | ||||
| 
 | ||||
| import org.apache.cloudstack.context.CallContext; | ||||
| import org.apache.cloudstack.framework.config.dao.ConfigurationDao; | ||||
| import org.apache.cloudstack.framework.events.EventBus; | ||||
| import org.apache.cloudstack.framework.events.EventBusException; | ||||
| 
 | ||||
| import com.cloud.configuration.Config; | ||||
| import com.cloud.domain.Domain; | ||||
| import com.cloud.event.dao.EventDao; | ||||
| import com.cloud.server.ManagementService; | ||||
| @ -56,6 +58,7 @@ public class ActionEventUtils { | ||||
|     protected static UserDao s_userDao; | ||||
|     protected static EventBus s_eventBus = null; | ||||
|     protected static EntityManager s_entityMgr; | ||||
|     protected static ConfigurationDao s_configDao; | ||||
| 
 | ||||
|     public static final String EventDetails = "event_details"; | ||||
|     public static final String EventId = "event_id"; | ||||
| @ -73,6 +76,8 @@ public class ActionEventUtils { | ||||
|     ProjectDao projectDao; | ||||
|     @Inject | ||||
|     EntityManager entityMgr; | ||||
|     @Inject | ||||
|     ConfigurationDao configDao; | ||||
| 
 | ||||
|     public ActionEventUtils() { | ||||
|     } | ||||
| @ -84,6 +89,7 @@ public class ActionEventUtils { | ||||
|         s_userDao = userDao; | ||||
|         s_projectDao = projectDao; | ||||
|         s_entityMgr = entityMgr; | ||||
|         s_configDao = configDao; | ||||
|     } | ||||
| 
 | ||||
|     public static Long onActionEvent(Long userId, Long accountId, Long domainId, String type, String description) { | ||||
| @ -183,6 +189,11 @@ public class ActionEventUtils { | ||||
|     } | ||||
| 
 | ||||
|     private static void publishOnEventBus(long userId, long accountId, String eventCategory, String eventType, Event.State state, String description) { | ||||
|         String configKey = Config.PublishActionEvent.key(); | ||||
|         String value = s_configDao.getValue(configKey); | ||||
|         boolean configValue = Boolean.parseBoolean(value); | ||||
|         if(!configValue) | ||||
|             return; | ||||
|         try { | ||||
|             s_eventBus = ComponentContext.getComponent(EventBus.class); | ||||
|         } catch (NoSuchBeanDefinitionException nbe) { | ||||
|  | ||||
| @ -29,9 +29,11 @@ import org.apache.log4j.Logger; | ||||
| import org.springframework.beans.factory.NoSuchBeanDefinitionException; | ||||
| import org.springframework.stereotype.Component; | ||||
| 
 | ||||
| import org.apache.cloudstack.framework.config.dao.ConfigurationDao; | ||||
| import org.apache.cloudstack.framework.events.EventBus; | ||||
| import org.apache.cloudstack.framework.events.EventBusException; | ||||
| 
 | ||||
| import com.cloud.configuration.Config; | ||||
| import com.cloud.dc.DataCenterVO; | ||||
| import com.cloud.dc.HostPodVO; | ||||
| import com.cloud.dc.dao.DataCenterDao; | ||||
| @ -46,11 +48,14 @@ public class AlertGenerator { | ||||
|     private static DataCenterDao s_dcDao; | ||||
|     private static HostPodDao s_podDao; | ||||
|     protected static EventBus s_eventBus = null; | ||||
|     protected static ConfigurationDao s_configDao; | ||||
| 
 | ||||
|     @Inject | ||||
|     DataCenterDao dcDao; | ||||
|     @Inject | ||||
|     HostPodDao podDao; | ||||
|     @Inject | ||||
|     ConfigurationDao configDao; | ||||
| 
 | ||||
|     public AlertGenerator() { | ||||
|     } | ||||
| @ -62,6 +67,12 @@ public class AlertGenerator { | ||||
|     } | ||||
| 
 | ||||
|     public static void publishAlertOnEventBus(String alertType, long dataCenterId, Long podId, String subject, String body) { | ||||
| 
 | ||||
|         String configKey = Config.PublishAlertEvent.key(); | ||||
|         String value = s_configDao.getValue(configKey); | ||||
|         boolean configValue = Boolean.parseBoolean(value); | ||||
|         if(!configValue) | ||||
|             return; | ||||
|         try { | ||||
|             s_eventBus = ComponentContext.getComponent(EventBus.class); | ||||
|         } catch (NoSuchBeanDefinitionException nbe) { | ||||
|  | ||||
| @ -398,7 +398,7 @@ public class IpAddressManagerImpl extends ManagerBase implements IpAddressManage | ||||
|         AssignIpAddressFromPodVlanSearch.join("vlan", podVlanSearch, podVlanSearch.entity().getId(), AssignIpAddressFromPodVlanSearch.entity().getVlanId(), JoinType.INNER); | ||||
|         AssignIpAddressFromPodVlanSearch.done(); | ||||
| 
 | ||||
|         Network.State.getStateMachine().registerListener(new NetworkStateListener(_usageEventDao, _networksDao)); | ||||
|         Network.State.getStateMachine().registerListener(new NetworkStateListener(_usageEventDao, _networksDao, _configDao)); | ||||
| 
 | ||||
|         s_logger.info("Network Manager is configured."); | ||||
| 
 | ||||
|  | ||||
| @ -488,7 +488,7 @@ public class StorageManagerImpl extends ManagerBase implements StorageManager, C | ||||
|         LocalStorageSearch.and("type", LocalStorageSearch.entity().getPoolType(), SearchCriteria.Op.IN); | ||||
|         LocalStorageSearch.done(); | ||||
| 
 | ||||
|         Volume.State.getStateMachine().registerListener(new VolumeStateListener()); | ||||
|         Volume.State.getStateMachine().registerListener(new VolumeStateListener(_configDao)); | ||||
| 
 | ||||
|         return true; | ||||
|     } | ||||
|  | ||||
| @ -22,12 +22,16 @@ import java.util.Date; | ||||
| import java.util.HashMap; | ||||
| import java.util.Map; | ||||
| 
 | ||||
| import javax.inject.Inject; | ||||
| 
 | ||||
| import org.apache.log4j.Logger; | ||||
| import org.springframework.beans.factory.NoSuchBeanDefinitionException; | ||||
| 
 | ||||
| import org.apache.cloudstack.framework.config.dao.ConfigurationDao; | ||||
| import org.apache.cloudstack.framework.events.EventBus; | ||||
| import org.apache.cloudstack.framework.events.EventBusException; | ||||
| 
 | ||||
| import com.cloud.configuration.Config; | ||||
| import com.cloud.event.EventCategory; | ||||
| import com.cloud.server.ManagementService; | ||||
| import com.cloud.storage.Snapshot; | ||||
| @ -40,6 +44,8 @@ import com.cloud.utils.fsm.StateListener; | ||||
| public class SnapshotStateListener implements StateListener<State, Event, SnapshotVO> { | ||||
| 
 | ||||
|     protected static EventBus s_eventBus = null; | ||||
|     @Inject | ||||
|     private ConfigurationDao _configDao; | ||||
| 
 | ||||
|     private static final Logger s_logger = Logger.getLogger(VolumeStateListener.class); | ||||
| 
 | ||||
| @ -61,6 +67,11 @@ public class SnapshotStateListener implements StateListener<State, Event, Snapsh | ||||
| 
 | ||||
|     private void pubishOnEventBus(String event, String status, Snapshot vo, State oldState, State newState) { | ||||
| 
 | ||||
|         String configKey = Config.PublishResourceStateEvent.key(); | ||||
|         String value = _configDao.getValue(configKey); | ||||
|         boolean configValue = Boolean.parseBoolean(value); | ||||
|         if(!configValue) | ||||
|             return; | ||||
|         try { | ||||
|             s_eventBus = ComponentContext.getComponent(EventBus.class); | ||||
|         } catch (NoSuchBeanDefinitionException nbe) { | ||||
|  | ||||
| @ -25,9 +25,11 @@ import java.util.Map; | ||||
| import org.apache.log4j.Logger; | ||||
| import org.springframework.beans.factory.NoSuchBeanDefinitionException; | ||||
| 
 | ||||
| import org.apache.cloudstack.framework.config.dao.ConfigurationDao; | ||||
| import org.apache.cloudstack.framework.events.EventBus; | ||||
| import org.apache.cloudstack.framework.events.EventBusException; | ||||
| 
 | ||||
| import com.cloud.configuration.Config; | ||||
| import com.cloud.event.EventCategory; | ||||
| import com.cloud.server.ManagementService; | ||||
| import com.cloud.storage.Volume; | ||||
| @ -39,11 +41,12 @@ import com.cloud.utils.fsm.StateListener; | ||||
| public class VolumeStateListener implements StateListener<State, Event, Volume> { | ||||
| 
 | ||||
|     protected static EventBus s_eventBus = null; | ||||
|     protected ConfigurationDao _configDao; | ||||
| 
 | ||||
|     private static final Logger s_logger = Logger.getLogger(VolumeStateListener.class); | ||||
| 
 | ||||
|     public VolumeStateListener() { | ||||
| 
 | ||||
|     public VolumeStateListener(ConfigurationDao configDao) { | ||||
|         this._configDao = configDao; | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
| @ -60,6 +63,11 @@ public class VolumeStateListener implements StateListener<State, Event, Volume> | ||||
| 
 | ||||
|     private void pubishOnEventBus(String event, String status, Volume vo, State oldState, State newState) { | ||||
| 
 | ||||
|         String configKey = Config.PublishResourceStateEvent.key(); | ||||
|         String value = _configDao.getValue(configKey); | ||||
|         boolean configValue = Boolean.parseBoolean(value); | ||||
|         if(!configValue) | ||||
|             return; | ||||
|         try { | ||||
|             s_eventBus = ComponentContext.getComponent(EventBus.class); | ||||
|         } catch (NoSuchBeanDefinitionException nbe) { | ||||
|  | ||||
| @ -234,6 +234,11 @@ public class DatabaseConfig { | ||||
|         s_configurationDescriptions.put("snapshot.test.weeks.per.month", "Set it to a smaller value to take more recurring snapshots"); | ||||
|         s_configurationDescriptions.put("snapshot.test.months.per.year", "Set it to a smaller value to take more recurring snapshots"); | ||||
|         s_configurationDescriptions.put("hypervisor.type", "The type of hypervisor that this deployment will use."); | ||||
|         s_configurationDescriptions.put("publish.action.events", "enable or disable to control the publishing of action events on the event bus"); | ||||
|         s_configurationDescriptions.put("publish.alert.events", "enable or disable to control the publishing of alert events on the event bus"); | ||||
|         s_configurationDescriptions.put("publish.resource.state.events", "enable or disable to control the publishing of resource state events on the event bus"); | ||||
|         s_configurationDescriptions.put("publish.usage.events", "enable or disable to control the publishing of usage events on the event bus"); | ||||
|         s_configurationDescriptions.put("publish.async.job.events", "enable or disable to control the publishing of async job events on the event bus"); | ||||
| 
 | ||||
|         s_configurationComponents.put("host.stats.interval", "management-server"); | ||||
|         s_configurationComponents.put("storage.stats.interval", "management-server"); | ||||
| @ -306,6 +311,11 @@ public class DatabaseConfig { | ||||
|         s_configurationComponents.put("snapshot.test.weeks.per.month", "SnapshotManager"); | ||||
|         s_configurationComponents.put("snapshot.test.months.per.year", "SnapshotManager"); | ||||
|         s_configurationComponents.put("hypervisor.type", "ManagementServer"); | ||||
|         s_configurationComponents.put("publish.action.events", "management-server"); | ||||
|         s_configurationComponents.put("publish.alert.events", "management-server"); | ||||
|         s_configurationComponents.put("publish.resource.state.events", "management-server"); | ||||
|         s_configurationComponents.put("publish.usage.events", "management-server"); | ||||
|         s_configurationComponents.put("publish.async.job.events", "management-server"); | ||||
| 
 | ||||
|         s_defaultConfigurationValues.put("host.stats.interval", "60000"); | ||||
|         s_defaultConfigurationValues.put("storage.stats.interval", "60000"); | ||||
| @ -347,6 +357,11 @@ public class DatabaseConfig { | ||||
|         s_defaultConfigurationValues.put("init", "false"); | ||||
|         s_defaultConfigurationValues.put("cpu.overprovisioning.factor", "1"); | ||||
|         s_defaultConfigurationValues.put("mem.overprovisioning.factor", "1"); | ||||
|         s_defaultConfigurationValues.put("publish.action.events", "true"); | ||||
|         s_defaultConfigurationValues.put("publish.alert.events", "true"); | ||||
|         s_defaultConfigurationValues.put("publish.resource.state.events", "true"); | ||||
|         s_defaultConfigurationValues.put("publish.usage.events", "true"); | ||||
|         s_defaultConfigurationValues.put("publish.async.job.events", "true"); | ||||
|     } | ||||
| 
 | ||||
|     protected DatabaseConfig() { | ||||
|  | ||||
| @ -1611,7 +1611,7 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir | ||||
| 
 | ||||
|         _itMgr.registerGuru(VirtualMachine.Type.User, this); | ||||
| 
 | ||||
|         VirtualMachine.State.getStateMachine().registerListener(new UserVmStateListener(_usageEventDao, _networkDao, _nicDao, _offeringDao, _vmDao, this)); | ||||
|         VirtualMachine.State.getStateMachine().registerListener(new UserVmStateListener(_usageEventDao, _networkDao, _nicDao, _offeringDao, _vmDao, this, _configDao)); | ||||
| 
 | ||||
|         String value = _configDao.getValue(Config.SetVmInternalNameUsingDisplayName.key()); | ||||
|         _instanceNameFlag = (value == null) ? false : Boolean.parseBoolean(value); | ||||
|  | ||||
| @ -29,8 +29,10 @@ import com.cloud.vm.dao.UserVmDao; | ||||
| import org.apache.log4j.Logger; | ||||
| import org.springframework.beans.factory.NoSuchBeanDefinitionException; | ||||
| 
 | ||||
| import org.apache.cloudstack.framework.config.dao.ConfigurationDao; | ||||
| import org.apache.cloudstack.framework.events.EventBus; | ||||
| 
 | ||||
| import com.cloud.configuration.Config; | ||||
| import com.cloud.event.EventCategory; | ||||
| import com.cloud.event.EventTypes; | ||||
| import com.cloud.event.UsageEventUtils; | ||||
| @ -52,17 +54,20 @@ public class UserVmStateListener implements StateListener<State, VirtualMachine. | ||||
|     @Inject protected ServiceOfferingDao _offeringDao; | ||||
|     @Inject protected UserVmDao _userVmDao; | ||||
|     @Inject protected UserVmManager _userVmMgr; | ||||
|     @Inject protected ConfigurationDao _configDao; | ||||
|     private static final Logger s_logger = Logger.getLogger(UserVmStateListener.class); | ||||
| 
 | ||||
|     protected static EventBus s_eventBus = null; | ||||
| 
 | ||||
|     public UserVmStateListener(UsageEventDao usageEventDao, NetworkDao networkDao, NicDao nicDao, ServiceOfferingDao offeringDao, UserVmDao userVmDao, UserVmManager userVmMgr) { | ||||
|     public UserVmStateListener(UsageEventDao usageEventDao, NetworkDao networkDao, NicDao nicDao, ServiceOfferingDao offeringDao, UserVmDao userVmDao, UserVmManager userVmMgr, | ||||
|             ConfigurationDao configDao) { | ||||
|         this._usageEventDao = usageEventDao; | ||||
|         this._networkDao = networkDao; | ||||
|         this._nicDao = nicDao; | ||||
|         this._offeringDao = offeringDao; | ||||
|         this._userVmDao = userVmDao; | ||||
|         this._userVmMgr = userVmMgr; | ||||
|         this._configDao = configDao; | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
| @ -113,6 +118,11 @@ public class UserVmStateListener implements StateListener<State, VirtualMachine. | ||||
| 
 | ||||
|     private void pubishOnEventBus(String event, String status, VirtualMachine vo, VirtualMachine.State oldState, VirtualMachine.State newState) { | ||||
| 
 | ||||
|         String configKey = Config.PublishResourceStateEvent.key(); | ||||
|         String value = _configDao.getValue(configKey); | ||||
|         boolean configValue = Boolean.parseBoolean(value); | ||||
|         if(!configValue) | ||||
|             return; | ||||
|         try { | ||||
|             s_eventBus = ComponentContext.getComponent(EventBus.class); | ||||
|         } catch (NoSuchBeanDefinitionException nbe) { | ||||
|  | ||||
| @ -57,6 +57,7 @@ import org.apache.cloudstack.affinity.dao.AffinityGroupDao; | ||||
| import org.apache.cloudstack.affinity.dao.AffinityGroupDomainMapDao; | ||||
| import org.apache.cloudstack.affinity.dao.AffinityGroupVMMapDao; | ||||
| import org.apache.cloudstack.context.CallContext; | ||||
| import org.apache.cloudstack.framework.config.dao.ConfigurationDao; | ||||
| import org.apache.cloudstack.framework.messagebus.MessageBus; | ||||
| import org.apache.cloudstack.test.utils.SpringUtils; | ||||
| 
 | ||||
| @ -298,6 +299,11 @@ public class AffinityApiUnitTest { | ||||
|             return Mockito.mock(MessageBus.class); | ||||
|         } | ||||
| 
 | ||||
|         @Bean | ||||
|         public ConfigurationDao configDao() { | ||||
|             return Mockito.mock(ConfigurationDao.class); | ||||
|         } | ||||
| 
 | ||||
|         public static class Library implements TypeFilter { | ||||
| 
 | ||||
|             @Override | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user