blob: bbc7115105186af222cb537723e269c1320e92bf [file] [log] [blame]
/**
* 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.slider.providers.agent;
import junit.framework.TestCase;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.FilterFileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.yarn.api.records.Container;
import org.apache.hadoop.yarn.api.records.ContainerLaunchContext;
import org.apache.hadoop.yarn.api.records.LocalResource;
import org.apache.hadoop.yarn.api.records.LocalResourceType;
import org.apache.slider.api.ClusterDescription;
import org.apache.slider.api.OptionKeys;
import org.apache.slider.api.StatusKeys;
import org.apache.slider.common.tools.SliderFileSystem;
import org.apache.slider.core.conf.AggregateConf;
import org.apache.slider.core.conf.ConfTree;
import org.apache.slider.core.conf.ConfTreeOperations;
import org.apache.slider.core.conf.MapOperations;
import org.apache.slider.core.exceptions.SliderException;
import org.apache.slider.server.appmaster.model.mock.MockContainerId;
import org.apache.slider.server.appmaster.model.mock.MockFileSystem;
import org.apache.slider.server.appmaster.model.mock.MockNodeId;
import org.apache.slider.server.appmaster.state.StateAccessForProviders;
import org.apache.slider.server.appmaster.web.rest.agent.HeartBeat;
import org.apache.slider.server.appmaster.web.rest.agent.HeartBeatResponse;
import org.apache.slider.server.appmaster.web.rest.agent.Register;
import org.apache.slider.server.appmaster.web.rest.agent.RegistrationResponse;
import org.apache.slider.server.appmaster.web.rest.agent.RegistrationStatus;
import org.junit.Test;
import org.mockito.Mockito;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import static org.easymock.EasyMock.anyObject;
import static org.easymock.EasyMock.createNiceMock;
import static org.easymock.EasyMock.expect;
import static org.easymock.EasyMock.replay;
import static org.mockito.Matchers.any;
import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.eq;
public class AgentProviderServiceTest {
protected static final Logger log =
LoggerFactory.getLogger(AgentProviderServiceTest.class);
@Test
public void testRegistration() throws IOException {
ConfTree tree = new ConfTree();
tree.global.put(OptionKeys.INTERNAL_APPLICATION_IMAGE_PATH, ".");
AgentProviderService aps = new AgentProviderService();
ContainerLaunchContext ctx = createNiceMock(ContainerLaunchContext.class);
AggregateConf instanceDefinition = new AggregateConf();
instanceDefinition.setInternal(tree);
instanceDefinition.setAppConf(tree);
instanceDefinition.getAppConfOperations().getGlobalOptions().put(AgentKeys.APP_DEF, ".");
instanceDefinition.getAppConfOperations().getGlobalOptions().put(AgentKeys.AGENT_CONF, ".");
instanceDefinition.getAppConfOperations().getGlobalOptions().put(AgentKeys.AGENT_VERSION, ".");
Container container = createNiceMock(Container.class);
String role = "HBASE_MASTER";
SliderFileSystem sliderFileSystem = createNiceMock(SliderFileSystem.class);
Path generatedConfPath = new Path(".", "test");
MapOperations resourceComponent = new MapOperations();
MapOperations appComponent = new MapOperations();
Path containerTmpDirPath = new Path(".", "test");
FileSystem mockFs = new MockFileSystem();
expect(sliderFileSystem.getFileSystem())
.andReturn(new FilterFileSystem(mockFs)).anyTimes();
expect(sliderFileSystem.createAmResource(anyObject(Path.class),
anyObject(LocalResourceType.class)))
.andReturn(createNiceMock(LocalResource.class)).anyTimes();
expect(container.getId()).andReturn(new MockContainerId(1)).anyTimes();
expect(container.getNodeId()).andReturn(new MockNodeId("localhost")).anyTimes();
StateAccessForProviders access = createNiceMock(StateAccessForProviders.class);
AgentProviderService mockAps = Mockito.spy(aps);
doReturn(access).when(mockAps).getStateAccessor();
try {
doNothing().when(mockAps).addInstallCommand(
eq("HBASE_MASTER"),
any(HeartBeatResponse.class),
eq("scripts/hbase_master.py"));
} catch (SliderException e) {
}
expect(access.isApplicationLive()).andReturn(true).anyTimes();
ClusterDescription desc = new ClusterDescription();
desc.setInfo(StatusKeys.INFO_AM_HOSTNAME, "host1");
desc.setInfo(StatusKeys.INFO_AM_WEB_PORT, "8088");
desc.setInfo(OptionKeys.APPLICATION_NAME, "HBASE");
desc.getOrAddRole("HBASE_MASTER").put(AgentKeys.COMPONENT_SCRIPT, "scripts/hbase_master.py");
expect(access.getClusterStatus()).andReturn(desc).anyTimes();
AggregateConf aggConf = new AggregateConf();
ConfTreeOperations treeOps = aggConf.getAppConfOperations();
treeOps.getOrAddComponent("HBASE_MASTER").put(AgentKeys.WAIT_HEARTBEAT, "0");
expect(access.getInstanceDefinitionSnapshot()).andReturn(aggConf);
replay(access, ctx, container, sliderFileSystem);
try {
mockAps.buildContainerLaunchContext(null,
instanceDefinition,
container,
role,
sliderFileSystem,
generatedConfPath,
resourceComponent,
appComponent,
containerTmpDirPath);
} catch (SliderException he) {
log.warn(he.getMessage());
} catch (IOException ioe) {
log.warn(ioe.getMessage());
}
Register reg = new Register();
reg.setResponseId(0);
reg.setHostname("mockcontainer_1___HBASE_MASTER");
RegistrationResponse resp = mockAps.handleRegistration(reg);
TestCase.assertEquals(0, resp.getResponseId());
TestCase.assertEquals(RegistrationStatus.OK, resp.getResponseStatus());
HeartBeat hb = new HeartBeat();
hb.setResponseId(1);
hb.setHostname("mockcontainer_1___HBASE_MASTER");
HeartBeatResponse hbr = mockAps.handleHeartBeat(hb);
TestCase.assertEquals(2, hbr.getResponseId());
}
@Test
public void testRoleHostMapping() throws Exception {
AgentProviderService aps = new AgentProviderService();
aps.setRoleHostMapping("FIRST_ROLE", "FIRST_HOST");
aps.setRoleHostMapping("SECOND_ROLE", "SECOND_HOST");
aps.setRoleHostMapping("SECOND_ROLE", "THIRD_HOST");
Map<String,String> tokens = new HashMap<String, String>();
aps.addRoleRelatedTokens(tokens);
TestCase.assertEquals(2, tokens.size());
TestCase.assertEquals("FIRST_HOST", tokens.get("${FIRST_ROLE_HOST}"));
TestCase.assertEquals("SECOND_HOST,THIRD_HOST", tokens.get("${SECOND_ROLE_HOST}"));
aps.close();
}
}