diff options
author | Ryan Campbell <ryanjcampbell@google.com> | 2017-09-11 16:24:09 -0700 |
---|---|---|
committer | Ryan Campbell <ryanjcampbell@google.com> | 2017-09-19 13:37:13 -0700 |
commit | d4265c96d3c4e3dcfe0ffb2ef314317478b16846 (patch) | |
tree | d839ef9db155c5477d29b88df9fa609d351ada7a | |
parent | a9c0f414d5c2e77213e2e21739df96061e5f13cd (diff) | |
download | dashboard-d4265c96d3c4e3dcfe0ffb2ef314317478b16846.tar.gz |
Create a REST servlet for reading/writing acks.
Create a REST servlet which can read all acknowledgements and receive
new/updated acknowledgements.
Test: $.post('/api/test_acknowledgements', JSON.stringify({'testName':
'VtsHalLight', 'branches' : ['branch1']})) in browser
Bug: 65208372
Change-Id: I8cbba4a6d1e73b7d161f857386528e056a676fea
-rw-r--r-- | src/main/java/com/android/vts/api/TestAcknowledgmentRestServlet.java | 150 | ||||
-rw-r--r-- | src/main/webapp/WEB-INF/web.xml | 10 |
2 files changed, 160 insertions, 0 deletions
diff --git a/src/main/java/com/android/vts/api/TestAcknowledgmentRestServlet.java b/src/main/java/com/android/vts/api/TestAcknowledgmentRestServlet.java new file mode 100644 index 0000000..309c3e2 --- /dev/null +++ b/src/main/java/com/android/vts/api/TestAcknowledgmentRestServlet.java @@ -0,0 +1,150 @@ +/* + * Copyright (C) 2017 The Android Open Source Project + * + * Licensed 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 com.android.vts.api; + +import com.android.vts.entity.TestAcknowledgmentEntity; +import com.android.vts.util.DatastoreHelper; +import com.google.appengine.api.datastore.DatastoreFailureException; +import com.google.appengine.api.datastore.DatastoreService; +import com.google.appengine.api.datastore.DatastoreServiceFactory; +import com.google.appengine.api.datastore.DatastoreTimeoutException; +import com.google.appengine.api.datastore.Entity; +import com.google.appengine.api.datastore.Key; +import com.google.appengine.api.datastore.KeyFactory; +import com.google.appengine.api.datastore.Query; +import com.google.appengine.api.datastore.Transaction; +import com.google.appengine.api.users.User; +import com.google.appengine.api.users.UserService; +import com.google.appengine.api.users.UserServiceFactory; +import com.google.gson.Gson; +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; +import java.io.BufferedReader; +import java.io.IOException; +import java.io.PrintWriter; +import java.util.ArrayList; +import java.util.ConcurrentModificationException; +import java.util.List; +import java.util.logging.Level; +import java.util.logging.Logger; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +/** Servlet for handling requests to fetch test acknowledgments. */ +public class TestAcknowledgmentRestServlet extends HttpServlet { + protected static final Logger logger = + Logger.getLogger(TestAcknowledgmentRestServlet.class.getName()); + + /** Read all test acknowledgments. */ + @Override + public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { + DatastoreService datastore = DatastoreServiceFactory.getDatastoreService(); + + Query ackQuery = new Query(TestAcknowledgmentEntity.KIND); + List<JsonObject> testAcks = new ArrayList<>(); + for (Entity ackEntity : + datastore.prepare(ackQuery).asIterable(DatastoreHelper.getLargeBatchOptions())) { + TestAcknowledgmentEntity ack = TestAcknowledgmentEntity.fromEntity(ackEntity); + if (ack == null) continue; + testAcks.add(ack.toJson()); + } + response.setContentType("application/json"); + PrintWriter writer = response.getWriter(); + writer.print(new Gson().toJson(testAcks)); + writer.flush(); + } + + /** Create a test acknowledgment. */ + @Override + public void doPost(HttpServletRequest request, HttpServletResponse response) + throws IOException { + UserService userService = UserServiceFactory.getUserService(); + if (!userService.isUserAdmin()) { + response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); + return; + } + User currentUser = userService.getCurrentUser(); + DatastoreService datastore = DatastoreServiceFactory.getDatastoreService(); + + StringBuilder sb = new StringBuilder(); + BufferedReader br = new BufferedReader(request.getReader()); + String str; + while ((str = br.readLine()) != null) { + sb.append(str); + } + JsonObject json; + try { + json = new JsonParser().parse(sb.toString()).getAsJsonObject(); + } catch (IllegalStateException e) { + response.setStatus(HttpServletResponse.SC_BAD_REQUEST); + return; + } + TestAcknowledgmentEntity ack = TestAcknowledgmentEntity.fromJson(currentUser, json); + Transaction txn = datastore.beginTransaction(); + try { + Key key = datastore.put(ack.toEntity()); + txn.commit(); + + response.setContentType("application/json"); + PrintWriter writer = response.getWriter(); + writer.print(new Gson().toJson(KeyFactory.keyToString(key))); + writer.flush(); + } catch (ConcurrentModificationException + | DatastoreFailureException + | DatastoreTimeoutException e) { + txn.rollback(); + response.setStatus(HttpServletResponse.SC_BAD_REQUEST); + return; + } finally { + if (txn.isActive()) { + logger.log(Level.WARNING, "Transaction rollback forced acknowledgment post."); + txn.rollback(); + response.setStatus(HttpServletResponse.SC_BAD_REQUEST); + return; + } + } + response.setStatus(HttpServletResponse.SC_OK); + } + + /** Remove a test acknowledgment. */ + @Override + public void doDelete(HttpServletRequest request, HttpServletResponse response) + throws IOException { + UserService userService = UserServiceFactory.getUserService(); + if (!userService.isUserAdmin()) { + response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); + return; + } + DatastoreService datastore = DatastoreServiceFactory.getDatastoreService(); + String stringKey = request.getPathInfo(); + if (stringKey == null) { + response.setStatus(HttpServletResponse.SC_BAD_REQUEST); + return; + } + if (stringKey.startsWith("/")) { + stringKey = stringKey.substring(1); + } + Key key = KeyFactory.stringToKey(stringKey); + if (!key.getKind().equals(TestAcknowledgmentEntity.KIND)) { + response.setStatus(HttpServletResponse.SC_BAD_REQUEST); + return; + } + datastore.delete(key); + response.setStatus(HttpServletResponse.SC_OK); + } +} diff --git a/src/main/webapp/WEB-INF/web.xml b/src/main/webapp/WEB-INF/web.xml index a443e63..c5879c9 100644 --- a/src/main/webapp/WEB-INF/web.xml +++ b/src/main/webapp/WEB-INF/web.xml @@ -96,6 +96,11 @@ Copyright 2016 Google Inc. All Rights Reserved. </servlet> <servlet> + <servlet-name>test_acknowledgments</servlet-name> + <servlet-class>com.android.vts.api.TestAcknowledgmentRestServlet</servlet-class> +</servlet> + +<servlet> <servlet-name>vts_alert_job</servlet-name> <servlet-class>com.android.vts.job.VtsAlertJobServlet</servlet-class> </servlet> @@ -201,6 +206,11 @@ Copyright 2016 Google Inc. All Rights Reserved. </servlet-mapping> <servlet-mapping> + <servlet-name>test_acknowledgments</servlet-name> + <url-pattern>/api/test_acknowledgments/*</url-pattern> +</servlet-mapping> + +<servlet-mapping> <servlet-name>vts_alert_job</servlet-name> <url-pattern>/task/vts_alert_job/*</url-pattern> </servlet-mapping> |