/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.ambari.server.events.listeners.upgrade;
import static org.easymock.EasyMock.createNiceMock;
import java.util.ArrayList;
import java.util.List;
import javax.persistence.EntityManager;
import org.apache.ambari.server.events.MaintenanceModeEvent;
import org.apache.ambari.server.events.publishers.AmbariEventPublisher;
import org.apache.ambari.server.orm.DBAccessor;
import org.apache.ambari.server.orm.InMemoryDefaultTestModule;
import org.apache.ambari.server.orm.dao.AlertDefinitionDAO;
import org.apache.ambari.server.orm.dao.AlertsDAO;
import org.apache.ambari.server.orm.entities.AlertCurrentEntity;
import org.apache.ambari.server.orm.entities.AlertHistoryEntity;
import org.apache.ambari.server.state.AlertState;
import org.apache.ambari.server.state.Cluster;
import org.apache.ambari.server.state.Clusters;
import org.apache.ambari.server.state.Host;
import org.apache.ambari.server.state.MaintenanceState;
import org.apache.ambari.server.state.Service;
import org.apache.ambari.server.state.ServiceComponentHost;
import org.apache.ambari.server.utils.EventBusSynchronizer;
import org.easymock.EasyMock;
import org.junit.Before;
import org.junit.Test;
import com.google.inject.Binder;
import com.google.inject.Guice;
import com.google.inject.Inject;
import com.google.inject.Injector;
import com.google.inject.Module;
import com.google.inject.util.Modules;
/**
*
*/
public class AlertMaintenanceModeListenerTest {
private static final String HOSTNAME = "c6401.ambari.apache.org";
private static final String SERVICE = "HDFS";
private static final String COMPONENT = "NAMENODE";
@Inject
private AmbariEventPublisher m_eventPublisher;
@Inject
private AlertsDAO m_alertsDAO;
private Injector injector;
/**
*
*/
@Before
public void setup() throws Exception {
injector = Guice.createInjector(Modules.override(new InMemoryDefaultTestModule()).with(
new MockModule()));
// !!! need a synchronous op for testing
EventBusSynchronizer.synchronizeAmbariEventPublisher(injector);
injector.injectMembers(this);
}
/**
* Tests that only the host alert has its maintenance mode changed.
*
* @throws Exception
*/
@Test
public void testHostMaintenanceMode() throws Exception {
List<AlertCurrentEntity> alerts = getMockAlerts("HOST");
AlertCurrentEntity hostAlert = alerts.get(0);
AlertCurrentEntity serviceAlert = alerts.get(1);
AlertCurrentEntity componentAlert = alerts.get(2);
EasyMock.expect(hostAlert.getMaintenanceState()).andReturn(MaintenanceState.OFF).atLeastOnce();
hostAlert.setMaintenanceState(MaintenanceState.ON);
EasyMock.expectLastCall().once();
EasyMock.expect(m_alertsDAO.merge(hostAlert)).andReturn(hostAlert).once();
Host host = EasyMock.createNiceMock(Host.class);
EasyMock.expect(host.getHostName()).andReturn(HOSTNAME).atLeastOnce();
EasyMock.replay(hostAlert, serviceAlert, componentAlert, host, m_alertsDAO);
MaintenanceModeEvent hostEvent = new MaintenanceModeEvent(MaintenanceState.ON, 1 /* cluster id */, host);
m_eventPublisher.publish(hostEvent);
EasyMock.verify(hostAlert, serviceAlert, componentAlert, host, m_alertsDAO);
}
@Test
/**
* Tests that only the service alert has its maintenance mode changed.
*
* @throws Exception
*/
public void testServiceMaintenanceMode() throws Exception {
List<AlertCurrentEntity> alerts = getMockAlerts("SERVICE");
AlertCurrentEntity hostAlert = alerts.get(0);
AlertCurrentEntity serviceAlert = alerts.get(1);
AlertCurrentEntity componentAlert = alerts.get(2);
EasyMock.expect(serviceAlert.getMaintenanceState()).andReturn(MaintenanceState.OFF).atLeastOnce();
serviceAlert.setMaintenanceState(MaintenanceState.ON);
EasyMock.expectLastCall().once();
EasyMock.expect(m_alertsDAO.merge(serviceAlert)).andReturn(serviceAlert).once();
Service service = EasyMock.createNiceMock(Service.class);
EasyMock.expect(service.getName()).andReturn(SERVICE).atLeastOnce();
EasyMock.replay(hostAlert, serviceAlert, componentAlert, service, m_alertsDAO);
MaintenanceModeEvent serviceEvent = new MaintenanceModeEvent(MaintenanceState.ON, service);
m_eventPublisher.publish(serviceEvent);
EasyMock.verify(hostAlert, serviceAlert, componentAlert, service, m_alertsDAO);
}
@Test
public void testComponentMaintenanceMode() throws Exception {
List<AlertCurrentEntity> alerts = getMockAlerts("SCH");
AlertCurrentEntity hostAlert = alerts.get(0);
AlertCurrentEntity serviceAlert = alerts.get(1);
AlertCurrentEntity componentAlert = alerts.get(2);
EasyMock.expect(componentAlert.getMaintenanceState()).andReturn(MaintenanceState.OFF).atLeastOnce();
componentAlert.setMaintenanceState(MaintenanceState.ON);
EasyMock.expectLastCall().once();
EasyMock.expect(m_alertsDAO.merge(componentAlert)).andReturn(componentAlert).once();
ServiceComponentHost serviceComponentHost = EasyMock.createNiceMock(ServiceComponentHost.class);
EasyMock.expect(serviceComponentHost.getHostName()).andReturn(HOSTNAME).atLeastOnce();
EasyMock.expect(serviceComponentHost.getServiceName()).andReturn(SERVICE).atLeastOnce();
EasyMock.expect(serviceComponentHost.getServiceComponentName()).andReturn(COMPONENT).atLeastOnce();
EasyMock.replay(hostAlert, serviceAlert, componentAlert, serviceComponentHost, m_alertsDAO);
MaintenanceModeEvent serviceComponentHostEvent = new MaintenanceModeEvent(MaintenanceState.ON,
serviceComponentHost);
m_eventPublisher.publish(serviceComponentHostEvent);
EasyMock.verify(hostAlert, serviceAlert, componentAlert, serviceComponentHost, m_alertsDAO);
}
private List<AlertCurrentEntity> getMockAlerts(String testType) {
AlertCurrentEntity hostAlert = EasyMock.createStrictMock(AlertCurrentEntity.class);
AlertCurrentEntity serviceAlert = EasyMock.createStrictMock(AlertCurrentEntity.class);
AlertCurrentEntity componentAlert = EasyMock.createStrictMock(AlertCurrentEntity.class);
AlertHistoryEntity hostHistory = EasyMock.createStrictMock(AlertHistoryEntity.class);
AlertHistoryEntity serviceHistory = EasyMock.createStrictMock(AlertHistoryEntity.class);
AlertHistoryEntity componentHistory = EasyMock.createStrictMock(AlertHistoryEntity.class);
EasyMock.expect(hostAlert.getAlertHistory()).andReturn(hostHistory).atLeastOnce();
EasyMock.expect(serviceAlert.getAlertHistory()).andReturn(serviceHistory).atLeastOnce();
EasyMock.expect(componentAlert.getAlertHistory()).andReturn(componentHistory).atLeastOnce();
EasyMock.expect(hostHistory.getHostName()).andReturn(HOSTNAME).atLeastOnce();
EasyMock.expect(hostHistory.getServiceName()).andReturn(null).atLeastOnce();
EasyMock.expect(hostHistory.getComponentName()).andReturn(null).atLeastOnce();
EasyMock.expect(hostHistory.getAlertState()).andReturn(AlertState.OK).atLeastOnce();
EasyMock.expect(serviceHistory.getHostName()).andReturn(null).atLeastOnce();
EasyMock.expect(serviceHistory.getServiceName()).andReturn(SERVICE).atLeastOnce();
EasyMock.expect(serviceHistory.getComponentName()).andReturn(null).atLeastOnce();
EasyMock.expect(serviceHistory.getAlertState()).andReturn(AlertState.OK).atLeastOnce();
if (testType.equals("SCH")) {
EasyMock.expect(componentHistory.getHostName()).andReturn(HOSTNAME).atLeastOnce();
EasyMock.expect(componentHistory.getServiceName()).andReturn(SERVICE).atLeastOnce();
EasyMock.expect(componentHistory.getComponentName()).andReturn(COMPONENT).atLeastOnce();
} else {
EasyMock.expect(componentHistory.getHostName()).andReturn(null).atLeastOnce();
EasyMock.expect(componentHistory.getServiceName()).andReturn(null).atLeastOnce();
EasyMock.expect(componentHistory.getComponentName()).andReturn(COMPONENT).atLeastOnce();
}
EasyMock.expect(componentHistory.getAlertState()).andReturn(AlertState.OK).atLeastOnce();
List<AlertCurrentEntity> currentAlerts = new ArrayList<>();
currentAlerts.add(hostAlert);
currentAlerts.add(serviceAlert);
currentAlerts.add(componentAlert);
EasyMock.expect(m_alertsDAO.findCurrent()).andReturn(currentAlerts).atLeastOnce();
EasyMock.replay(hostHistory, serviceHistory, componentHistory);
return currentAlerts;
}
/**
*
*/
private class MockModule implements Module {
/**
* {@inheritDoc}
*/
@Override
public void configure(Binder binder) {
Cluster cluster = EasyMock.createNiceMock(Cluster.class);
binder.bind(Clusters.class).toInstance(createNiceMock(Clusters.class));
binder.bind(DBAccessor.class).toInstance(createNiceMock(DBAccessor.class));
binder.bind(Cluster.class).toInstance(cluster);
binder.bind(AlertDefinitionDAO.class).toInstance(createNiceMock(AlertDefinitionDAO.class));
binder.bind(AlertsDAO.class).toInstance(createNiceMock(AlertsDAO.class));
binder.bind(EntityManager.class).toInstance(createNiceMock(EntityManager.class));
}
}
}