Skip to content

Commit

Permalink
Refactor: move network upload tasks to NetUtils
Browse files Browse the repository at this point in the history
  • Loading branch information
mobile-enerlytics committed Apr 12, 2018
1 parent d66a4d9 commit 92a8c6d
Show file tree
Hide file tree
Showing 6 changed files with 128 additions and 62 deletions.
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
package com.mobileenerlytics.eagle.tester.jenkins.eagletesterjenkins;
package com.mobileenerlytics.eagle.tester.common.util;

import com.mobileenerlytics.eagle.tester.jenkins.eagletesterjenkins.EagleWrapper;

import javax.ws.rs.client.ClientRequestContext;
import javax.ws.rs.client.ClientRequestFilter;
Expand All @@ -7,12 +9,12 @@
import java.io.IOException;
import java.io.UnsupportedEncodingException;

class EagleAuthenticator implements ClientRequestFilter {
class AuthFilter implements ClientRequestFilter {

private final String user;
private final String password;

public EagleAuthenticator(EagleWrapper.DescriptorImpl descriptor) {
public AuthFilter(EagleWrapper.DescriptorImpl descriptor) {
this.user = descriptor.getUsername();
this.password = descriptor.getPassword();
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.mobileenerlytics.eagle.tester.jenkins.eagletesterjenkins;
package com.mobileenerlytics.eagle.tester.common.util;


import com.mobileenerlytics.eagle.tester.LocalOperation;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package com.mobileenerlytics.eagle.tester.common.util;


import com.mobileenerlytics.eagle.tester.jenkins.eagletesterjenkins.EagleWrapper;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;

import java.io.PrintStream;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
package com.mobileenerlytics.eagle.tester.common.util;

import com.mobileenerlytics.eagle.tester.jenkins.eagletesterjenkins.EagleWrapper;
import org.glassfish.jersey.media.multipart.FormDataContentDisposition;
import org.glassfish.jersey.media.multipart.FormDataMultiPart;
import org.glassfish.jersey.media.multipart.MultiPartFeature;
import org.glassfish.jersey.media.multipart.file.FileDataBodyPart;

import javax.ws.rs.client.Client;
import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.client.Entity;
import javax.ws.rs.client.WebTarget;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import java.io.*;
import java.util.Map;

public class NetUtils {
public static Response upload(File fileToUpload, final String url, EagleWrapper.DescriptorImpl desc,
Map<String, String> fields) throws FileNotFoundException {
// Upload traces to server
Client client = getClient(desc);
WebTarget webTarget = client.target(url);
FormDataMultiPart multiPart = new FormDataMultiPart();
for(Map.Entry<String, String> field: fields.entrySet()) {
multiPart.field(field.getKey(), field.getValue());
}
multiPart.setMediaType(MediaType.MULTIPART_FORM_DATA_TYPE);

InputStream fileInStream = new FileInputStream(fileToUpload);

FileDataBodyPart fileDataBodyPart = new FileDataBodyPart(fileToUpload.getName(),
fileToUpload, MediaType.APPLICATION_OCTET_STREAM_TYPE);
fileDataBodyPart.setContentDisposition(
FormDataContentDisposition.name("file")
.fileName(fileToUpload.getName()).build());
multiPart.bodyPart(fileDataBodyPart);

return webTarget.request()
.post(Entity.entity(multiPart, multiPart.getMediaType()));
// .post(Entity.entity(fileInStream, MediaType.MULTIPART_FORM_DATA_TYPE));

}

public static boolean authenticate(EagleWrapper.DescriptorImpl desc) {
Client client = getClient(desc);
String url = "https://tester.mobileenerlytics.com/api/auth/";
WebTarget webTarget = client.target(url);
Response response = webTarget.request().get();
if (200 == response.getStatusInfo().getStatusCode()) {
Log.i("Authed ~");
return true;
}
Log.w("Failed to authenticate. Check username, password");
return false;
}

public static Client getClient(EagleWrapper.DescriptorImpl descriptor) {
return ClientBuilder.newBuilder()
.register(MultiPartFeature.class)
.register(new AuthFilter(descriptor))
.build();
}
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
package com.mobileenerlytics.eagle.tester.jenkins.eagletesterjenkins;

import com.mobileenerlytics.eagle.tester.common.EagleTesterArgument;
import com.mobileenerlytics.eagle.tester.common.util.JenkinsLocalOperation;
import com.mobileenerlytics.eagle.tester.common.util.Log;
import com.mobileenerlytics.eagle.tester.common.util.NetUtils;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import hudson.EnvVars;
import hudson.Extension;
Expand All @@ -15,24 +17,16 @@
import hudson.tasks.BuildWrapperDescriptor;
import hudson.util.FormValidation;
import net.sf.json.JSONObject;
import org.glassfish.jersey.media.multipart.FormDataContentDisposition;
import org.glassfish.jersey.media.multipart.FormDataMultiPart;
import org.glassfish.jersey.media.multipart.MultiPart;
import org.glassfish.jersey.media.multipart.MultiPartFeature;
import org.glassfish.jersey.media.multipart.file.FileDataBodyPart;
import org.kohsuke.stapler.DataBoundConstructor;
import org.kohsuke.stapler.QueryParameter;
import org.kohsuke.stapler.StaplerRequest;

import javax.ws.rs.client.Client;
import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.client.Entity;
import javax.ws.rs.client.WebTarget;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import java.io.File;
import java.io.IOException;
import java.io.*;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class EagleWrapper extends BuildWrapper {
private final static String DEFAULT_PROJECT_NAME = "default";
Expand Down Expand Up @@ -145,47 +139,37 @@ private boolean postBuild(AbstractBuild build, BuildListener listener) throws In
return true;
}

// Upload traces to server
List<String> devices = localOperation.getDevices();
if (devices.isEmpty()) {
listener.fatalError(TAG + "No connected device found. Tester may not produce output.");
return true;
}

final String url = String.format("%s/api/upload/version_energy", desc.mServerUri);
listener.getLogger().printf("%s %s%n", TAG, url);
final Client client = getClient(desc);
WebTarget webTarget = client.target(url);
MultiPart multiPart = new FormDataMultiPart()
.field("device", devices.get(0))
.field("pkg", pkgName)
.field("project_name", eagleTesterArgument.PROJECT_NAME)
.field("author_name", eagleTesterArgument.AUTHOR_NAME)
.field("author_email", eagleTesterArgument.AUTHOR_EMAIL)
.field("branch", eagleTesterArgument.BRANCH)
.field("commit", eagleTesterArgument.COMMIT)
.field("cur_version", eagleTesterArgument.CURRENT_VERSION);
multiPart.setMediaType(MediaType.MULTIPART_FORM_DATA_TYPE);

FileDataBodyPart fileDataBodyPart = new FileDataBodyPart(fileToUpload.getName(),
fileToUpload, MediaType.APPLICATION_OCTET_STREAM_TYPE);
fileDataBodyPart.setContentDisposition(
FormDataContentDisposition.name("file")
.fileName(fileToUpload.getName()).build());
multiPart.bodyPart(fileDataBodyPart);

Response response = webTarget.request()
.post(Entity.entity(multiPart, multiPart.getMediaType()));

Map<String, String> fields = new HashMap<>();
fields.put("device", devices.get(0));
fields.put("pkg", pkgName);
fields.put("project_name", eagleTesterArgument.PROJECT_NAME);
fields.put("author_name", eagleTesterArgument.AUTHOR_NAME);
fields.put("author_email", eagleTesterArgument.AUTHOR_EMAIL);
fields.put("branch", eagleTesterArgument.BRANCH);
fields.put("commit", eagleTesterArgument.COMMIT);
fields.put("cur_version", eagleTesterArgument.CURRENT_VERSION);

Response response = NetUtils.upload(fileToUpload, url, desc, fields);
if (200 == response.getStatusInfo().getStatusCode()) {
listener.getLogger().printf("%s See the energy report at %s%n", TAG, desc.mServerUri);
} else {
listener.getLogger().printf("%s Error uploading file %s to eagle server. %s%n", TAG,
fileToUpload.getAbsolutePath(), response);
}

return true;
}
}


@Override
public Environment setUp(AbstractBuild build, Launcher launcher, BuildListener listener) throws IOException, InterruptedException {
Log.out = listener.getLogger();
Expand All @@ -200,7 +184,7 @@ private boolean preBuild(AbstractBuild<?, ?> build, BuildListener listener) thro

// Authenticate with the server
if (!auth) {
auth = authenticate(getClient(desc));
auth = NetUtils.authenticate(desc);
}
if (!auth) {
listener.fatalError(TAG + "Failed to authenticate. Tester may not produce output");
Expand Down Expand Up @@ -231,25 +215,6 @@ private boolean preBuild(AbstractBuild<?, ?> build, BuildListener listener) thro
return true;
}

static Client getClient(EagleWrapper.DescriptorImpl descriptor) {
return ClientBuilder.newBuilder()
.register(MultiPartFeature.class)
.register(new EagleAuthenticator(descriptor))
.build();
}

static boolean authenticate(Client client) {
String url = "https://tester.mobileenerlytics.com/api/auth/";
WebTarget webTarget = client.target(url);
Response response = webTarget.request().get();
if (200 == response.getStatusInfo().getStatusCode()) {
Log.i("Authed ~");
return true;
}
Log.w("Failed to authenticate. Check username, password");
return false;
}

private void initEagleTesterArg(AbstractBuild<?, ?> build, BuildListener listener) throws IOException, InterruptedException {
EnvVars env = build.getEnvironment(listener);

Expand Down Expand Up @@ -342,8 +307,7 @@ public FormValidation doVerify(@QueryParameter("adb") final String adb,
setEagleServerUri(eagleServerUri);
setAdb(adb);

Client client = EagleWrapper.getClient(this);
if (!EagleWrapper.authenticate(client))
if (!NetUtils.authenticate(this))
return FormValidation.error("Authentication failed. Incorrect username: " + username + " or password: " + password);
return FormValidation.ok("Success");
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package com.mobileenerlytics.eagle.tester.common.util;

import com.mobileenerlytics.eagle.tester.jenkins.eagletesterjenkins.EagleWrapper;
//import org.junit.Test;

import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.HashMap;
import java.util.Map;

public class NetTests {
// @Test
public void uploadTest() throws IOException {
Path filePath = Files.createTempFile("upload", ".zip");
File file = filePath.toFile();
RandomAccessFile f = new RandomAccessFile(file, "rw");
long length = 1024 * 1024 * 1024;
// length *= 4; // 4 GB file
f.setLength(length);
final String url = "http://localhost:38673/api/upload/version_energy";

Map<String, String> fields = new HashMap<>();
fields.put("device", "d");
fields.put("pkg", "pkg");
fields.put("project_name", "pn");
fields.put("author_name", "an");
fields.put("author_email", "ae");
fields.put("branch", "b");
fields.put("commit", "c");
fields.put("cur_version", "cv");

NetUtils.upload(file, url, new EagleWrapper.DescriptorImpl(), fields);
}
}

0 comments on commit 92a8c6d

Please sign in to comment.