| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you 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 org.apache.drill.test; |
| |
| import com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider; |
| import org.apache.drill.exec.server.rest.PluginConfigWrapper; |
| import com.google.common.base.Preconditions; |
| import org.apache.drill.exec.server.rest.StatusResources; |
| import org.glassfish.jersey.client.ClientConfig; |
| import org.glassfish.jersey.client.JerseyClientBuilder; |
| |
| import javax.annotation.Nullable; |
| import javax.ws.rs.client.Client; |
| import javax.ws.rs.client.Entity; |
| import javax.ws.rs.client.WebTarget; |
| import javax.ws.rs.core.GenericType; |
| import javax.ws.rs.core.MediaType; |
| import javax.ws.rs.core.MultivaluedMap; |
| import javax.ws.rs.core.Response; |
| |
| import java.util.List; |
| |
| /** |
| * Represents a client for the Drill Rest API. |
| */ |
| public class RestClientFixture implements AutoCloseable { |
| /** |
| * A builder for the rest client. |
| */ |
| public static class Builder { |
| private ClusterFixture cluster; |
| |
| public Builder(ClusterFixture cluster) { |
| this.cluster = Preconditions.checkNotNull(cluster); |
| } |
| |
| public RestClientFixture build() { |
| return new RestClientFixture(cluster); |
| } |
| } |
| |
| private final WebTarget baseTarget; |
| private final Client client; |
| |
| private RestClientFixture(ClusterFixture cluster) { |
| int port = cluster.drillbit().getWebServerPort(); |
| String address = cluster.drillbits().iterator().next().getContext().getEndpoint().getAddress(); |
| String baseURL = "http://" + address + ":" + port; |
| |
| ClientConfig cc = new ClientConfig(); |
| cc.register(JacksonJsonProvider.class); |
| client = JerseyClientBuilder.createClient(cc); |
| baseTarget = client.target(baseURL); |
| } |
| |
| /** |
| * Gets all the external options from the rest api. |
| * @return All the external options |
| */ |
| public List<StatusResources.OptionWrapper> getStatusOptions() { |
| return baseTarget.path(StatusResources.PATH_OPTIONS_JSON) |
| .request(MediaType.APPLICATION_JSON) |
| .get(new GenericType<List<StatusResources.OptionWrapper>>() {}); |
| } |
| |
| public List<StatusResources.OptionWrapper> getStatusInternalOptions() { |
| return baseTarget.path(StatusResources.PATH_INTERNAL_OPTIONS_JSON) |
| .request(MediaType.APPLICATION_JSON) |
| .get(new GenericType<List<StatusResources.OptionWrapper>>() {}); |
| } |
| |
| public MultivaluedMap<String, String> getResponseHeaders(String relativeResourcePath) { |
| Response response = baseTarget.path(relativeResourcePath) |
| .request(MediaType.TEXT_HTML) |
| .get(); |
| return response.getStringHeaders(); |
| } |
| |
| /** |
| * Gets the external option corresponding to the given name. |
| * @param name The name of the external option to retrieve. |
| * @return The external option corresponding to the given name. |
| */ |
| @Nullable |
| public StatusResources.OptionWrapper getStatusOption(String name) { |
| return getStatusOptionHelper(getStatusOptions(), name); |
| } |
| |
| /** |
| * Gets the internal option corresponding to the given name. |
| * @param name The name of the internal option to retrieve. |
| * @return The internal option corresponding to the given name. |
| */ |
| @Nullable |
| public StatusResources.OptionWrapper getStatusInternalOption(String name) { |
| return getStatusOptionHelper(getStatusInternalOptions(), name); |
| } |
| |
| private StatusResources.OptionWrapper getStatusOptionHelper(List<StatusResources.OptionWrapper> options, |
| String name) { |
| for (StatusResources.OptionWrapper option: options) { |
| if (option.getName().equals(name)) { |
| return option; |
| } |
| } |
| |
| return null; |
| } |
| |
| public PluginConfigWrapper getStorageConfig(String name) { |
| return baseTarget.path(String.format("/storage/%s.json", name)) |
| .request(MediaType.APPLICATION_JSON) |
| .get(new GenericType<PluginConfigWrapper>() {}); |
| } |
| |
| public void postStorageConfig(PluginConfigWrapper pcw) { |
| baseTarget.path(String.format("/storage/%s.json", pcw.getName())) |
| .request(MediaType.APPLICATION_JSON) |
| .post(Entity.entity(pcw, MediaType.APPLICATION_JSON)); |
| } |
| |
| public void toggleEnabled(String name, boolean b) { |
| baseTarget.path(String.format("/storage/%s/enable/%b", name, b)) |
| .request(MediaType.APPLICATION_JSON) |
| .post(Entity.json("")); |
| } |
| |
| public void deleteStorageConfig(String name) { |
| baseTarget.path(String.format("/storage/%s.json", name)) |
| .request(MediaType.APPLICATION_JSON) |
| .delete(); |
| } |
| |
| @Override |
| public void close() throws Exception { |
| client.close(); |
| } |
| } |