mirror of
https://github.com/google/nomulus.git
synced 2025-05-28 09:50:57 +02:00
Change the LoadTestAction to use /_dr/epptool
The load tests used to directly build EPP, but that becomes problematic for an upcoming CL that refactors a lot of the EPP flow code. Instead, use the existing tool endpoint (conveniently, LoadTestAction is already in the tools module). This required changing the EppToolServlet to get its xml from a param rather than from the request payload, since task queues won't allow both a payload and request params on the same task. ------------- Created by MOE: https://github.com/google/moe MOE_MIGRATED_REVID=124351878
This commit is contained in:
parent
5a2f63cf58
commit
366c5a344d
19 changed files with 227 additions and 255 deletions
|
@ -15,8 +15,7 @@
|
|||
package google.registry.flows;
|
||||
|
||||
import static google.registry.flows.EppServletUtils.handleEppCommandAndWriteResponse;
|
||||
|
||||
import com.google.common.io.ByteStreams;
|
||||
import static java.nio.charset.StandardCharsets.UTF_8;
|
||||
|
||||
import google.registry.flows.SessionMetadata.SessionSource;
|
||||
import google.registry.model.eppcommon.ProtocolDefinition;
|
||||
|
@ -42,9 +41,8 @@ public class EppToolServlet extends XsrfProtectedServlet {
|
|||
|
||||
@Override
|
||||
protected void doPost(HttpServletRequest req, HttpServletResponse rsp) throws IOException {
|
||||
byte[] xml = ByteStreams.toByteArray(req.getInputStream());
|
||||
handleEppCommandAndWriteResponse(
|
||||
xml, rsp, new StatelessRequestSessionMetadata(
|
||||
req.getParameter("xml").getBytes(UTF_8), rsp, new StatelessRequestSessionMetadata(
|
||||
req.getParameter("clientIdentifier"),
|
||||
Boolean.parseBoolean(req.getParameter("superuser")),
|
||||
Boolean.parseBoolean(req.getParameter("dryRun")),
|
||||
|
|
|
@ -17,6 +17,7 @@ java_library(
|
|||
deps = [
|
||||
"//java/com/google/common/base",
|
||||
"//java/com/google/common/collect",
|
||||
"//java/com/google/common/net",
|
||||
"//third_party/java/appengine:appengine-api",
|
||||
"//third_party/java/dagger",
|
||||
"//third_party/java/joda_time",
|
||||
|
@ -24,8 +25,6 @@ java_library(
|
|||
"//third_party/java/objectify:objectify-v4_1",
|
||||
"//third_party/java/servlet/servlet_api",
|
||||
"//java/google/registry/config",
|
||||
"//java/google/registry/flows",
|
||||
"//java/google/registry/model",
|
||||
"//java/google/registry/request",
|
||||
"//java/google/registry/util",
|
||||
],
|
||||
|
|
|
@ -1,50 +0,0 @@
|
|||
// Copyright 2016 The Domain Registry Authors. All Rights Reserved.
|
||||
//
|
||||
// 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 google.registry.loadtest;
|
||||
|
||||
import static com.google.cloud.sql.jdbc.internal.Charsets.UTF_8;
|
||||
import static google.registry.flows.EppController.handleEppCommand;
|
||||
|
||||
import com.google.appengine.api.taskqueue.DeferredTask;
|
||||
|
||||
import google.registry.flows.SessionMetadata.SessionSource;
|
||||
import google.registry.flows.StatelessRequestSessionMetadata;
|
||||
import google.registry.model.eppcommon.ProtocolDefinition;
|
||||
|
||||
/** A task that executes a single EPP command. */
|
||||
public class LoadTask implements DeferredTask {
|
||||
|
||||
private static final long serialVersionUID = -7541344556045675149L;
|
||||
|
||||
private final String clientId;
|
||||
private final String xml;
|
||||
|
||||
LoadTask(String clientId, String xml) {
|
||||
this.clientId = clientId;
|
||||
this.xml = xml;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
handleEppCommand(
|
||||
xml.getBytes(UTF_8),
|
||||
new StatelessRequestSessionMetadata(
|
||||
clientId,
|
||||
false,
|
||||
false,
|
||||
ProtocolDefinition.getVisibleServiceExtensionUris(),
|
||||
SessionSource.LOADTEST));
|
||||
}
|
||||
}
|
|
@ -16,19 +16,22 @@ package google.registry.loadtest;
|
|||
|
||||
import static com.google.appengine.api.taskqueue.QueueConstants.maxTasksPerAdd;
|
||||
import static com.google.appengine.api.taskqueue.QueueFactory.getQueue;
|
||||
import static com.google.appengine.api.taskqueue.TaskOptions.Builder.withPayload;
|
||||
import static com.google.common.base.Preconditions.checkArgument;
|
||||
import static com.google.common.collect.Lists.partition;
|
||||
import static com.google.common.collect.Lists.transform;
|
||||
import static google.registry.util.ResourceUtils.readResourceUtf8;
|
||||
import static java.nio.charset.StandardCharsets.UTF_8;
|
||||
import static java.util.Arrays.asList;
|
||||
import static org.joda.time.DateTimeZone.UTC;
|
||||
|
||||
import com.google.appengine.api.taskqueue.TaskOptions;
|
||||
import com.google.common.base.Function;
|
||||
import com.google.common.base.Joiner;
|
||||
import com.google.common.collect.FluentIterable;
|
||||
import com.google.common.collect.ImmutableList;
|
||||
import com.google.common.collect.ImmutableMap;
|
||||
import com.google.common.collect.Iterators;
|
||||
import com.google.common.net.MediaType;
|
||||
|
||||
import google.registry.config.RegistryEnvironment;
|
||||
import google.registry.request.Action;
|
||||
|
@ -37,6 +40,8 @@ import google.registry.util.TaskEnqueuer;
|
|||
|
||||
import org.joda.time.DateTime;
|
||||
|
||||
import java.io.UnsupportedEncodingException;
|
||||
import java.net.URLEncoder;
|
||||
import java.util.Arrays;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
|
@ -278,12 +283,28 @@ public class LoadTestAction implements Runnable {
|
|||
for (int i = 0; i < xmls.size(); i++) {
|
||||
// Space tasks evenly within across a second.
|
||||
int offsetMillis = (int) (1000.0 / xmls.size() * i);
|
||||
tasks.add(withPayload(new LoadTask(clientId, xmls.get(i)))
|
||||
.etaMillis(start.plusMillis(offsetMillis).getMillis()));
|
||||
tasks.add(TaskOptions.Builder.withUrl("/_dr/epptool")
|
||||
.etaMillis(start.getMillis() + offsetMillis)
|
||||
.payload(
|
||||
Joiner.on('&').withKeyValueSeparator('=').join(
|
||||
ImmutableMap.of(
|
||||
"clientIdentifier", clientId,
|
||||
"superuser", false,
|
||||
"dryRun", false,
|
||||
"xml", urlEncode(xmls.get(i)))),
|
||||
MediaType.FORM_DATA.toString()));
|
||||
}
|
||||
return tasks.build();
|
||||
}
|
||||
|
||||
private String urlEncode(String xml) {
|
||||
try {
|
||||
return URLEncoder.encode(xml, UTF_8.toString());
|
||||
} catch (UnsupportedEncodingException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
|
||||
private void enqueue(List<TaskOptions> tasks) {
|
||||
List<List<TaskOptions>> chunks = partition(tasks, maxTasksPerAdd());
|
||||
// Farm out tasks to multiple queues to work around queue qps quotas.
|
||||
|
|
|
@ -20,7 +20,6 @@ import static com.google.common.base.Predicates.notNull;
|
|||
import static com.google.common.base.Strings.nullToEmpty;
|
||||
import static com.google.common.collect.Maps.filterValues;
|
||||
import static com.google.common.io.Resources.getResource;
|
||||
import static google.registry.flows.EppServletUtils.APPLICATION_EPP_XML_UTF8;
|
||||
import static google.registry.model.registry.Registries.findTldForNameOrThrow;
|
||||
import static google.registry.tools.CommandUtilities.addHeader;
|
||||
import static google.registry.util.PreconditionsUtils.checkArgumentNotNull;
|
||||
|
@ -29,9 +28,11 @@ import static java.nio.charset.StandardCharsets.UTF_8;
|
|||
|
||||
import com.google.common.base.Joiner;
|
||||
import com.google.common.collect.ImmutableList;
|
||||
import com.google.common.collect.ImmutableMap;
|
||||
import com.google.common.collect.ImmutableMultimap;
|
||||
import com.google.common.collect.Multimap;
|
||||
import com.google.common.net.InternetDomainName;
|
||||
import com.google.common.net.MediaType;
|
||||
import com.google.template.soy.SoyFileSet;
|
||||
import com.google.template.soy.data.SoyRecord;
|
||||
import com.google.template.soy.parseinfo.SoyFileInfo;
|
||||
|
@ -42,6 +43,7 @@ import com.beust.jcommander.Parameter;
|
|||
import google.registry.model.registrar.Registrar;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.net.URLEncoder;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
|
@ -144,11 +146,14 @@ abstract class EppToolCommand extends ConfirmingCommand implements ServerSideCom
|
|||
params.put("dryRun", dryRun);
|
||||
params.put("clientIdentifier", command.clientId);
|
||||
params.put("superuser", superuser);
|
||||
params.put("xml", URLEncoder.encode(command.xml, UTF_8.toString()));
|
||||
String requestBody = Joiner.on('&').withKeyValueSeparator('=')
|
||||
.join(filterValues(params, notNull()));
|
||||
responses.add(nullToEmpty(connection.send(
|
||||
"/_dr/epptool",
|
||||
filterValues(params, notNull()),
|
||||
APPLICATION_EPP_XML_UTF8,
|
||||
command.xml.getBytes(UTF_8))));
|
||||
ImmutableMap.<String, String>of(),
|
||||
MediaType.FORM_DATA,
|
||||
requestBody.getBytes(UTF_8))));
|
||||
}
|
||||
return responses.build();
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue