/*******************************************************************************
* Copyright (c) 2012-2017 Codenvy, S.A.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Codenvy, S.A. - initial API and implementation
*******************************************************************************/
package org.eclipse.che;
import org.eclipse.che.api.core.ApiException;
import org.eclipse.che.api.core.rest.HttpJsonRequestFactory;
import org.eclipse.che.api.core.rest.HttpJsonResponse;
import org.eclipse.che.commons.lang.IoUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.annotation.PostConstruct;
import javax.inject.Inject;
import javax.inject.Named;
import javax.inject.Singleton;
import javax.ws.rs.HttpMethod;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.HttpURLConnection;
import java.io.File;
/**
* Checks whether API is accessible from WS agent or not on app start to prevent usage of illegal configuration.
*
* @author Alexander Garagatyi
* @author Eugene Ivantsov
*/
@Singleton
public class ApiEndpointAccessibilityChecker {
private static final Logger LOG = LoggerFactory.getLogger(ApiEndpointAccessibilityChecker.class);
private final String apiEndpoint;
private final HttpJsonRequestFactory httpJsonRequestFactory;
@Inject
public ApiEndpointAccessibilityChecker(@Named("che.api") String apiEndpoint,
HttpJsonRequestFactory httpJsonRequestFactory) {
// everest respond 404 to path to rest without trailing slash
this.apiEndpoint = apiEndpoint.endsWith("/") ? apiEndpoint : apiEndpoint + "/";
this.httpJsonRequestFactory = httpJsonRequestFactory;
}
@PostConstruct
public void start() {
try {
final HttpJsonResponse pingResponse = httpJsonRequestFactory.fromUrl(apiEndpoint)
.setMethod(HttpMethod.GET)
.setTimeout(2000)
.request();
if (pingResponse.getResponseCode() == HttpURLConnection.HTTP_OK) {
return;
}
} catch (ApiException | IOException e) {
LOG.error( e.getLocalizedMessage(), e);
}
LOG.error("The workspace agent has attempted to start, but it is unable to ping the Che server at " + apiEndpoint);
LOG.error("The workspace agent has been forcefully stopped. " +
"This error happens when the agent cannot resolve the location of the Che server. " +
"This error can usually be fixed with additional configuration settings in /conf/che.properties. " +
"The Che server will stop this workspace after a short timeout. " +
"You can get help by posting your config, stacktrace and workspace /etc/hosts below as a GitHub issue.");
// content of /etc/hosts file may provide clues on why the connection failed, e.g. how che-host is resolved
try {
LOG.info("Workspace /etc/hosts: " + IoUtil.readAndCloseQuietly(new FileInputStream(new File("/etc/hosts"))));
} catch (Exception e) {
LOG.info(e.getLocalizedMessage(), e);
}
System.exit(0);
}
}