blob: 887ca89da4d5aa9d8e0350c917122b4f056e2f88 [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 com.sun.jersey.api.client.Client
import com.sun.jersey.api.client.WebResource
import groovy.transform.CompileStatic
import groovy.util.logging.Slf4j
import org.apache.hadoop.fs.Path
import org.apache.hadoop.yarn.conf.YarnConfiguration
import org.apache.hadoop.yarn.exceptions.YarnException
import org.apache.slider.api.StatusKeys
import org.apache.slider.client.SliderClient
import org.apache.slider.common.SliderKeys
import org.apache.slider.common.SliderXmlConfKeys
import org.apache.slider.core.build.InstanceBuilder
import org.apache.slider.core.conf.AggregateConf
import org.apache.slider.core.conf.MapOperations
import org.apache.slider.core.exceptions.SliderException
import org.apache.slider.core.launch.LaunchedApplication
import org.apache.slider.core.main.ServiceLauncher
import org.apache.slider.core.persist.LockAcquireFailedException
import org.apache.slider.server.appmaster.web.rest.agent.RegistrationResponse
import org.apache.slider.server.appmaster.web.rest.agent.RegistrationStatus
import org.apache.slider.server.services.security.CertificateManager
import org.apache.slider.server.services.security.SecurityUtils
import org.junit.Before
import org.junit.Test
import org.slf4j.Logger
import org.slf4j.LoggerFactory
import javax.net.ssl.HostnameVerifier
import javax.net.ssl.HttpsURLConnection
import javax.net.ssl.SSLSession
import javax.ws.rs.core.MediaType
import static org.apache.slider.common.params.Arguments.ARG_OPTION
import static org.apache.slider.providers.agent.AgentKeys.*
import static org.apache.slider.providers.agent.AgentTestUtils.createDummyJSONRegister
import static org.apache.slider.providers.agent.AgentTestUtils.createTestClient
@CompileStatic
@Slf4j
class TestAgentAMManagementWS extends AgentTestBase {
private static String password;
public static final String AGENT_URI = "ws/v1/slider/agents/";
final static Logger logger = LoggerFactory.getLogger(TestAgentAMManagementWS.class)
static {
//for localhost testing only
HttpsURLConnection.setDefaultHostnameVerifier(
new HostnameVerifier(){
public boolean verify(String hostname,
SSLSession sslSession) {
logger.info("verifying hostname ${hostname}")
InetAddress[] addresses =
InetAddress.getAllByName(hostname);
if (hostname.equals("localhost")) {
return true;
}
for (InetAddress address : addresses) {
if (address.getHostName().equals(hostname) ||
address.isAnyLocalAddress() ||
address.isLoopbackAddress()) {
return true;
}
}
return false;
}
});
}
@Override
@Before
void setup() {
super.setup()
MapOperations compOperations = new MapOperations();
compOperations.put(SliderXmlConfKeys.KEY_KEYSTORE_LOCATION, "/tmp/work/security/keystore.p12");
SecurityUtils.initializeSecurityParameters(compOperations, true);
CertificateManager certificateManager = new CertificateManager();
certificateManager.initialize(compOperations);
String keystoreFile = SecurityUtils.getSecurityDir() + File.separator + SliderKeys.KEYSTORE_FILE_NAME;
password = SecurityUtils.getKeystorePass();
System.setProperty("javax.net.ssl.trustStore", keystoreFile);
System.setProperty("javax.net.ssl.trustStorePassword", password);
System.setProperty("javax.net.ssl.trustStoreType", "PKCS12");
}
@Test
public void testAgentAMManagementWS() throws Throwable {
String clustername = createMiniCluster("",
configuration,
1,
1,
1,
true,
false)
Map<String, Integer> roles = [:]
File slider_core = new File(new File(".").absoluteFile, "src/test/python");
File app_def_path = new File(app_def_pkg_path)
String agt_ver = "version"
File agt_ver_path = new File(slider_core, agt_ver)
String agt_conf = "agent.ini"
File agt_conf_path = new File(slider_core, agt_conf)
assert app_def_path.exists()
assert agt_ver_path.exists()
assert agt_conf_path.exists()
try {
sliderClientClassName = TestSliderClient.name
ServiceLauncher<SliderClient> launcher = buildAgentCluster(clustername,
roles,
[
ARG_OPTION, PACKAGE_PATH, slider_core.absolutePath,
ARG_OPTION, APP_DEF, toURIArg(app_def_path),
ARG_OPTION, AGENT_CONF, toURIArg(agt_conf_path),
ARG_OPTION, AGENT_VERSION, toURIArg(agt_ver_path),
],
true, true,
true)
SliderClient sliderClient = launcher.service
def report = waitForClusterLive(sliderClient)
def trackingUrl = report.trackingUrl
log.info("tracking URL is $trackingUrl")
def agent_url = trackingUrl + AGENT_URI
def status = dumpClusterStatus(sliderClient, "agent AM")
def liveURL = status.getInfo(StatusKeys.INFO_AM_AGENT_OPS_URL)
if (liveURL) {
agent_url = liveURL + AGENT_URI
}
log.info("Agent is $agent_url")
log.info("stacks is ${liveURL}stacks")
log.info("conf is ${liveURL}conf")
def sleeptime = 10
log.info "sleeping for $sleeptime seconds"
Thread.sleep(sleeptime * 1000)
String page = fetchWebPageWithoutError(agent_url);
log.info(page);
//WS get
Client client = createTestClient();
WebResource webResource = client.resource(agent_url + "test/register");
RegistrationResponse response = webResource.type(MediaType.APPLICATION_JSON)
.post(
RegistrationResponse.class,
createDummyJSONRegister());
//TODO: assert failure as actual agent is not started. This test only starts the AM.
assert RegistrationStatus.FAILED == response.getResponseStatus();
} finally {
sliderClientClassName = DEFAULT_SLIDER_CLIENT
}
}
static class TestSliderClient extends SliderClient {
@Override
protected void persistInstanceDefinition(boolean overwrite,
Path appconfdir,
InstanceBuilder builder)
throws IOException, SliderException, LockAcquireFailedException {
AggregateConf conf = builder.getInstanceDescription()
MapOperations component = conf.getAppConfOperations().getComponent("slider-appmaster")
component.put(
"ssl.server.keystore.location",
"/tmp/work/security/keystore.p12")
component.put("ssl.server.keystore.password", password)
super.persistInstanceDefinition(overwrite, appconfdir, builder)
}
@Override
LaunchedApplication launchApplication(String clustername,
Path clusterDirectory,
AggregateConf instanceDefinition,
boolean debugAM)
throws YarnException, IOException {
MapOperations component = instanceDefinition.getAppConfOperations().getComponent("slider-appmaster")
component.put(
"ssl.server.keystore.location",
"/tmp/work/security/keystore.p12")
component.put("ssl.server.keystore.password", password)
return super.launchApplication(clustername, clusterDirectory, instanceDefinition, debugAM)
}
}
}