/*
* The Alluxio Open Foundation licenses this work under the Apache License, version 2.0
* (the "License"). You may not use this work except in compliance with the License, which is
* available at www.apache.org/licenses/LICENSE-2.0
*
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
* either express or implied, as more fully set forth in the License.
*
* See the NOTICE file distributed with this work for information regarding copyright ownership.
*/
package alluxio.proxy;
import alluxio.Configuration;
import alluxio.Constants;
import alluxio.PropertyKey;
import alluxio.util.CommonUtils;
import alluxio.util.WaitForOptions;
import alluxio.util.network.NetworkAddressUtils;
import alluxio.util.network.NetworkAddressUtils.ServiceType;
import alluxio.web.ProxyWebServer;
import alluxio.web.WebServer;
import com.google.common.base.Function;
import org.apache.commons.io.IOUtils;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.HttpClientBuilder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.IOException;
import java.util.concurrent.CountDownLatch;
import javax.annotation.concurrent.NotThreadSafe;
/**
* This class encapsulates the different worker services that are configured to run.
*/
@NotThreadSafe
public final class AlluxioProxyProcess implements ProxyProcess {
private static final Logger LOG = LoggerFactory.getLogger(AlluxioProxyProcess.class);
/** The web server. */
private WebServer mWebServer = null;
/** Worker start time in milliseconds. */
private final long mStartTimeMs;
private final CountDownLatch mLatch;
/**
* Creates an instance of {@link AlluxioProxy}.
*/
AlluxioProxyProcess() {
mStartTimeMs = System.currentTimeMillis();
mLatch = new CountDownLatch(1);
}
@Override
public int getWebLocalPort() {
return mWebServer.getLocalPort();
}
@Override
public long getStartTimeMs() {
return mStartTimeMs;
}
@Override
public long getUptimeMs() {
return System.currentTimeMillis() - mStartTimeMs;
}
@Override
public void start() throws Exception {
mWebServer = new ProxyWebServer(ServiceType.PROXY_WEB.getServiceName(),
NetworkAddressUtils.getBindAddress(ServiceType.PROXY_WEB), this);
// reset proxy web port
Configuration.set(PropertyKey.PROXY_WEB_PORT, Integer.toString(mWebServer.getLocalPort()));
mWebServer.start();
mLatch.await();
}
@Override
public void stop() throws Exception {
if (mWebServer != null) {
mWebServer.stop();
mWebServer = null;
}
mLatch.countDown();
}
@Override
public void waitForReady() {
CommonUtils.waitFor(this + " to start", new Function<Void, Boolean>() {
@Override
public Boolean apply(Void input) {
if (mWebServer == null || !mWebServer.getServer().isRunning()) {
return false;
}
HttpClient client = HttpClientBuilder.create().build();
HttpPost method = new HttpPost(String
.format("http://%s:%d%s/%s///%s", mWebServer.getBindHost(), mWebServer.getLocalPort(),
Constants.REST_API_PREFIX, PathsRestServiceHandler.SERVICE_PREFIX,
PathsRestServiceHandler.EXISTS));
try {
HttpResponse response = client.execute(method);
if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
return true;
}
LOG.debug(IOUtils.toString(response.getEntity().getContent()));
return false;
} catch (IOException e) {
LOG.debug("Exception: ", e);
return false;
}
}
}, WaitForOptions.defaults().setTimeout(10000));
}
@Override
public String toString() {
return "Alluxio Proxy";
}
}