mirror of
https://github.com/apache/zeppelin
synced 2026-05-24 09:38:26 +00:00
Refactored Abstract rest api test to also handle the case of tests with shiro (security), I also added some utility http method to do action with authenticated user
This commit is contained in:
parent
db0c39c4a1
commit
b412266b4d
1 changed files with 102 additions and 6 deletions
|
|
@ -26,18 +26,22 @@ import java.util.List;
|
|||
import java.util.Properties;
|
||||
import java.util.concurrent.ExecutorService;
|
||||
import java.util.concurrent.Executors;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
import org.apache.commons.exec.CommandLine;
|
||||
import org.apache.commons.exec.DefaultExecutor;
|
||||
import org.apache.commons.exec.PumpStreamHandler;
|
||||
import org.apache.commons.httpclient.HttpClient;
|
||||
import org.apache.commons.httpclient.HttpMethodBase;
|
||||
import org.apache.commons.httpclient.cookie.CookiePolicy;
|
||||
import org.apache.commons.httpclient.methods.ByteArrayRequestEntity;
|
||||
import org.apache.commons.httpclient.methods.DeleteMethod;
|
||||
import org.apache.commons.httpclient.methods.GetMethod;
|
||||
import org.apache.commons.httpclient.methods.PostMethod;
|
||||
import org.apache.commons.httpclient.methods.PutMethod;
|
||||
import org.apache.commons.httpclient.methods.RequestEntity;
|
||||
import org.apache.commons.io.FileUtils;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.apache.zeppelin.conf.ZeppelinConfiguration;
|
||||
import org.apache.zeppelin.interpreter.InterpreterSetting;
|
||||
import org.apache.zeppelin.server.ZeppelinServer;
|
||||
|
|
@ -47,6 +51,7 @@ import org.hamcrest.TypeSafeMatcher;
|
|||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import com.google.gson.Gson;
|
||||
import com.google.gson.JsonElement;
|
||||
import com.google.gson.JsonParseException;
|
||||
import com.google.gson.JsonParser;
|
||||
|
|
@ -60,6 +65,28 @@ public abstract class AbstractTestRestApi {
|
|||
protected static final boolean wasRunning = checkIfServerIsRunning();
|
||||
static boolean pySpark = false;
|
||||
static boolean sparkR = false;
|
||||
static Gson gson = new Gson();
|
||||
|
||||
private static File shiroIni = null;
|
||||
private static String zeppelinShiro =
|
||||
"[users]\n" +
|
||||
"admin = password1, admin\n" +
|
||||
"user1 = password2, role1, role2\n" +
|
||||
"user2 = password3, role3\n" +
|
||||
"user3 = password4, role2\n" +
|
||||
"[main]\n" +
|
||||
"sessionManager = org.apache.shiro.web.session.mgt.DefaultWebSessionManager\n" +
|
||||
"securityManager.sessionManager = $sessionManager\n" +
|
||||
"securityManager.sessionManager.globalSessionTimeout = 86400000\n" +
|
||||
"shiro.loginUrl = /api/login\n" +
|
||||
"[roles]\n" +
|
||||
"role1 = *\n" +
|
||||
"role2 = *\n" +
|
||||
"role3 = *\n" +
|
||||
"admin = *" +
|
||||
"[urls]\n" +
|
||||
"/api/version = anon\n" +
|
||||
"/** = authc";
|
||||
|
||||
private String getUrl(String path) {
|
||||
String url;
|
||||
|
|
@ -95,15 +122,26 @@ public abstract class AbstractTestRestApi {
|
|||
}
|
||||
};
|
||||
|
||||
protected static void startUp() throws Exception {
|
||||
private static void start(boolean withAuth) throws Exception {
|
||||
if (!wasRunning) {
|
||||
System.setProperty(ZeppelinConfiguration.ConfVars.ZEPPELIN_HOME.getVarName(), "../");
|
||||
System.setProperty(ZeppelinConfiguration.ConfVars.ZEPPELIN_WAR.getVarName(), "../zeppelin-web/dist");
|
||||
LOG.info("Staring test Zeppelin up...");
|
||||
ZeppelinConfiguration conf = ZeppelinConfiguration.create();
|
||||
|
||||
if (withAuth) {
|
||||
// Set Anonymous session to false.
|
||||
System.setProperty(ZeppelinConfiguration.ConfVars.ZEPPELIN_ANONYMOUS_ALLOWED.getVarName(), "false");
|
||||
|
||||
// Create a shiro env test.
|
||||
shiroIni = new File("../conf/shiro.ini");
|
||||
if (!shiroIni.exists()) {
|
||||
shiroIni.createNewFile();
|
||||
}
|
||||
FileUtils.writeStringToFile(shiroIni, zeppelinShiro);
|
||||
}
|
||||
|
||||
// exclude org.apache.zeppelin.rinterpreter.* for scala 2.11 test
|
||||
ZeppelinConfiguration conf = ZeppelinConfiguration.create();
|
||||
String interpreters = conf.getString(ZeppelinConfiguration.ConfVars.ZEPPELIN_INTERPRETERS);
|
||||
String interpretersCompatibleWithScala211Test = null;
|
||||
|
||||
|
|
@ -184,6 +222,14 @@ public abstract class AbstractTestRestApi {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
protected static void startUpWithAutenticationEnabled() throws Exception {
|
||||
start(true);
|
||||
}
|
||||
|
||||
protected static void startUp() throws Exception {
|
||||
start(false);
|
||||
}
|
||||
|
||||
private static String getHostname() {
|
||||
try {
|
||||
|
|
@ -244,7 +290,9 @@ public abstract class AbstractTestRestApi {
|
|||
for (String setting : settingList) {
|
||||
ZeppelinServer.notebook.getInterpreterFactory().restart(setting);
|
||||
}
|
||||
|
||||
if (shiroIni != null) {
|
||||
FileUtils.deleteQuietly(shiroIni);
|
||||
}
|
||||
LOG.info("Terminating test Zeppelin...");
|
||||
ZeppelinServer.jettyWebServer.stop();
|
||||
executor.shutdown();
|
||||
|
|
@ -286,49 +334,97 @@ public abstract class AbstractTestRestApi {
|
|||
}
|
||||
|
||||
protected static GetMethod httpGet(String path) throws IOException {
|
||||
return httpGet(path, StringUtils.EMPTY, StringUtils.EMPTY);
|
||||
}
|
||||
|
||||
protected static GetMethod httpGet(String path, String user, String pwd) throws IOException {
|
||||
LOG.info("Connecting to {}", url + path);
|
||||
HttpClient httpClient = new HttpClient();
|
||||
GetMethod getMethod = new GetMethod(url + path);
|
||||
getMethod.addRequestHeader("Origin", url);
|
||||
if (userAndPasswordAreNotBlank(user, pwd)) {
|
||||
getMethod.setRequestHeader("Cookie", "JSESSIONID="+ getCookie(user, pwd));
|
||||
}
|
||||
httpClient.executeMethod(getMethod);
|
||||
LOG.info("{} - {}", getMethod.getStatusCode(), getMethod.getStatusText());
|
||||
return getMethod;
|
||||
}
|
||||
|
||||
protected static DeleteMethod httpDelete(String path) throws IOException {
|
||||
return httpDelete(path, StringUtils.EMPTY, StringUtils.EMPTY);
|
||||
}
|
||||
|
||||
protected static DeleteMethod httpDelete(String path, String user, String pwd) throws IOException {
|
||||
LOG.info("Connecting to {}", url + path);
|
||||
HttpClient httpClient = new HttpClient();
|
||||
DeleteMethod deleteMethod = new DeleteMethod(url + path);
|
||||
deleteMethod.addRequestHeader("Origin", url);
|
||||
if (userAndPasswordAreNotBlank(user, pwd)) {
|
||||
deleteMethod.setRequestHeader("Cookie", "JSESSIONID="+ getCookie(user, pwd));
|
||||
}
|
||||
httpClient.executeMethod(deleteMethod);
|
||||
LOG.info("{} - {}", deleteMethod.getStatusCode(), deleteMethod.getStatusText());
|
||||
return deleteMethod;
|
||||
}
|
||||
|
||||
protected static PostMethod httpPost(String path, String body) throws IOException {
|
||||
return httpPost(path, body, StringUtils.EMPTY, StringUtils.EMPTY);
|
||||
}
|
||||
|
||||
protected static PostMethod httpPost(String path, String request, String user, String pwd)
|
||||
throws IOException {
|
||||
LOG.info("Connecting to {}", url + path);
|
||||
HttpClient httpClient = new HttpClient();
|
||||
PostMethod postMethod = new PostMethod(url + path);
|
||||
postMethod.addRequestHeader("Origin", url);
|
||||
RequestEntity entity = new ByteArrayRequestEntity(body.getBytes("UTF-8"));
|
||||
postMethod.setRequestEntity(entity);
|
||||
postMethod.setRequestBody(request);
|
||||
postMethod.getParams().setCookiePolicy(CookiePolicy.IGNORE_COOKIES);
|
||||
if (userAndPasswordAreNotBlank(user, pwd)) {
|
||||
postMethod.setRequestHeader("Cookie", "JSESSIONID="+ getCookie(user, pwd));
|
||||
}
|
||||
httpClient.executeMethod(postMethod);
|
||||
LOG.info("{} - {}", postMethod.getStatusCode(), postMethod.getStatusText());
|
||||
return postMethod;
|
||||
}
|
||||
|
||||
protected static PutMethod httpPut(String path, String body) throws IOException {
|
||||
return httpPut(path, body, StringUtils.EMPTY, StringUtils.EMPTY);
|
||||
}
|
||||
|
||||
protected static PutMethod httpPut(String path, String body, String user, String pwd) throws IOException {
|
||||
LOG.info("Connecting to {}", url + path);
|
||||
HttpClient httpClient = new HttpClient();
|
||||
PutMethod putMethod = new PutMethod(url + path);
|
||||
putMethod.addRequestHeader("Origin", url);
|
||||
RequestEntity entity = new ByteArrayRequestEntity(body.getBytes("UTF-8"));
|
||||
putMethod.setRequestEntity(entity);
|
||||
if (userAndPasswordAreNotBlank(user, pwd)) {
|
||||
putMethod.setRequestHeader("Cookie", "JSESSIONID="+ getCookie(user, pwd));
|
||||
}
|
||||
httpClient.executeMethod(putMethod);
|
||||
LOG.info("{} - {}", putMethod.getStatusCode(), putMethod.getStatusText());
|
||||
return putMethod;
|
||||
}
|
||||
|
||||
private static String getCookie(String user, String password) throws IOException {
|
||||
HttpClient httpClient = new HttpClient();
|
||||
PostMethod postMethod = new PostMethod(url + "/login");
|
||||
postMethod.addRequestHeader("Origin", url);
|
||||
postMethod.setParameter("password", password);
|
||||
postMethod.setParameter("userName", user);
|
||||
httpClient.executeMethod(postMethod);
|
||||
LOG.info("{} - {}", postMethod.getStatusCode(), postMethod.getStatusText());
|
||||
Pattern pattern = Pattern.compile("JSESSIONID=([a-zA-Z0-9-]*)");
|
||||
java.util.regex.Matcher matcher = pattern.matcher(postMethod.getResponseHeaders("Set-Cookie")[0].toString());
|
||||
return matcher.find()? matcher.group(1) : StringUtils.EMPTY;
|
||||
}
|
||||
|
||||
protected static boolean userAndPasswordAreNotBlank(String user, String pwd) {
|
||||
if (StringUtils.isBlank(user) && StringUtils.isBlank(pwd)) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
protected Matcher<HttpMethodBase> responsesWith(final int expectedStatusCode) {
|
||||
return new TypeSafeMatcher<HttpMethodBase>() {
|
||||
WeakReference<HttpMethodBase> method;
|
||||
|
|
|
|||
Loading…
Reference in a new issue