2 * Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE)
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
17 package org.openo.msb.wrapper.consul;
19 import static org.openo.msb.wrapper.consul.util.ClientUtil.response;
21 import java.util.List;
24 import javax.ws.rs.client.WebTarget;
25 import javax.ws.rs.core.GenericType;
26 import javax.ws.rs.core.MediaType;
28 import org.openo.msb.wrapper.consul.async.ConsulResponseCallback;
29 import org.openo.msb.wrapper.consul.model.ConsulResponse;
30 import org.openo.msb.wrapper.consul.model.catalog.CatalogNode;
31 import org.openo.msb.wrapper.consul.model.catalog.CatalogService;
32 import org.openo.msb.wrapper.consul.model.health.Node;
33 import org.openo.msb.wrapper.consul.option.CatalogOptions;
34 import org.openo.msb.wrapper.consul.option.QueryOptions;
37 * HTTP Client for /v1/catalog/ endpoints or api/catalog/v1 by openresty
39 public class CatalogClient {
41 private static final GenericType<List<String>> TYPE_STRING_LIST = new GenericType<List<String>>() {};
42 private static final GenericType<List<Node>> TYPE_NODE_LIST = new GenericType<List<Node>>() {};
43 private static final GenericType<Map<String, List<String>>> TYPE_SERVICES_MAP = new GenericType<Map<String, List<String>>>() {};
44 private static final GenericType<List<CatalogService>> TYPE_CATALOG_SERVICE_LIST = new GenericType<List<CatalogService>>() {};
45 private static final GenericType<CatalogNode> TYPE_CATALOG_NODE = new GenericType<CatalogNode>() {};
47 private final WebTarget webTarget;
50 * Constructs an instance of this class.
52 * @param webTarget The {@link javax.ws.rs.client.WebTarget} to base requests from.
54 CatalogClient(WebTarget webTarget) {
55 this.webTarget = webTarget;
59 * Retrieves all datacenters.
61 * GET /v1/catalog/datacenters
63 * @return A list of datacenter names.
65 public List<String> getDatacenters() {
66 return webTarget.path("datacenters").request()
67 .accept(MediaType.APPLICATION_JSON_TYPE).get(TYPE_STRING_LIST);
71 * Retrieves all nodes.
73 * GET /v1/catalog/nodes
75 * @return A {@link org.openo.msb.wrapper.consul.model.ConsulResponse} containing a list of
76 * {@link org.openo.msb.wrapper.consul.model.health.Node} objects.
78 public ConsulResponse<List<Node>> getNodes() {
79 return getNodes(null, QueryOptions.BLANK);
83 * Retrieves all nodes for a given datacenter.
85 * GET /v1/catalog/nodes?dc={datacenter}
87 * @param catalogOptions Catalog specific options to use.
88 * @return A {@link org.openo.msb.wrapper.consul.model.ConsulResponse} containing a list of
89 * {@link org.openo.msb.wrapper.consul.model.health.Node} objects.
91 public ConsulResponse<List<Node>> getNodes(CatalogOptions catalogOptions) {
92 return getNodes(catalogOptions, QueryOptions.BLANK);
96 * Retrieves all nodes with {@link org.openo.msb.wrapper.consul.option.QueryOptions}.
98 * GET /v1/catalog/nodes
100 * @param queryOptions The Query Options to use.
101 * @return A {@link org.openo.msb.wrapper.consul.model.ConsulResponse} containing a list of
102 * {@link org.openo.msb.wrapper.consul.model.health.Node} objects.
104 public ConsulResponse<List<Node>> getNodes(QueryOptions queryOptions) {
105 return getNodes(null, queryOptions);
109 * Retrieves all nodes for a given datacenter with {@link org.openo.msb.wrapper.consul.option.QueryOptions}.
111 * GET /v1/catalog/nodes?dc={datacenter}
113 * @param catalogOptions Catalog specific options to use.
114 * @param queryOptions The Query Options to use.
115 * @return A {@link org.openo.msb.wrapper.consul.model.ConsulResponse} containing a list of
116 * {@link org.openo.msb.wrapper.consul.model.health.Node} objects.
118 public ConsulResponse<List<Node>> getNodes(CatalogOptions catalogOptions, QueryOptions queryOptions) {
119 return response(webTarget.path("nodes"), catalogOptions, queryOptions, TYPE_NODE_LIST);
123 * Retrieves all services for a given datacenter.
125 * GET /v1/catalog/services?dc={datacenter}
127 * @return A {@link org.openo.msb.wrapper.consul.model.ConsulResponse} containing a map of service name to list of tags.
129 public ConsulResponse<Map<String, List<String>>> getServices() {
130 return getServices(null, QueryOptions.BLANK);
134 * Retrieves all services for a given datacenter.
136 * GET /v1/catalog/services?dc={datacenter}
138 * @param catalogOptions Catalog specific options to use.
139 * @return A {@link org.openo.msb.wrapper.consul.model.ConsulResponse} containing a map of service name to list of tags.
141 public ConsulResponse<Map<String, List<String>>> getServices(CatalogOptions catalogOptions) {
142 return getServices(catalogOptions, QueryOptions.BLANK);
146 * Retrieves all services for a given datacenter with {@link org.openo.msb.wrapper.consul.option.QueryOptions}.
148 * GET /v1/catalog/services?dc={datacenter}
150 * @param queryOptions The Query Options to use.
151 * @return A {@link org.openo.msb.wrapper.consul.model.ConsulResponse} containing a map of service name to list of tags.
153 public ConsulResponse<Map<String, List<String>>> getServices(QueryOptions queryOptions) {
154 return getServices(null, queryOptions);
158 * Retrieves all services for a given datacenter with {@link org.openo.msb.wrapper.consul.option.QueryOptions}.
160 * GET /v1/catalog/services?dc={datacenter}
162 * @param catalogOptions Catalog specific options to use.
163 * @param queryOptions The Query Options to use.
164 * @return A {@link org.openo.msb.wrapper.consul.model.ConsulResponse} containing a map of service name to list of tags.
166 public ConsulResponse<Map<String, List<String>>> getServices(CatalogOptions catalogOptions, QueryOptions queryOptions) {
167 return response(webTarget.path("services"), catalogOptions, queryOptions, TYPE_SERVICES_MAP);
170 public void getService(QueryOptions queryOptions, ConsulResponseCallback<Map<String, List<String>>> callback) {
171 response(webTarget.path("services"), CatalogOptions.BLANK,
172 queryOptions, TYPE_SERVICES_MAP, callback);
176 * Retrieves a single service.
178 * GET /v1/catalog/service/{service}
180 * @return A {@link org.openo.msb.wrapper.consul.model.ConsulResponse} containing
181 * {@link org.openo.msb.wrapper.consul.model.catalog.CatalogService} objects.
183 public ConsulResponse<List<CatalogService>> getService(String service) {
184 return getService(service, null, QueryOptions.BLANK);
188 * Retrieves a single service for a given datacenter.
190 * GET /v1/catalog/service/{service}?dc={datacenter}
192 * @param catalogOptions Catalog specific options to use.
193 * @return A {@link org.openo.msb.wrapper.consul.model.ConsulResponse} containing
194 * {@link org.openo.msb.wrapper.consul.model.catalog.CatalogService} objects.
196 public ConsulResponse<List<CatalogService>> getService(String service, CatalogOptions catalogOptions) {
197 return getService(service, catalogOptions, QueryOptions.BLANK);
201 * Retrieves a single service with {@link org.openo.msb.wrapper.consul.option.QueryOptions}.
203 * GET /v1/catalog/service/{service}
205 * @param queryOptions The Query Options to use.
206 * @return A {@link org.openo.msb.wrapper.consul.model.ConsulResponse} containing
207 * {@link org.openo.msb.wrapper.consul.model.catalog.CatalogService} objects.
209 public ConsulResponse<List<CatalogService>> getService(String service, QueryOptions queryOptions) {
210 return getService(service, null, queryOptions);
213 public void getService(String service, QueryOptions queryOptions, ConsulResponseCallback<List<CatalogService>> callback) {
215 response(webTarget.path("service").path(service), CatalogOptions.BLANK,
216 queryOptions, TYPE_CATALOG_SERVICE_LIST, callback);
222 * Retrieves a single service for a given datacenter with {@link org.openo.msb.wrapper.consul.option.QueryOptions}.
224 * GET /v1/catalog/service/{service}?dc={datacenter}
226 * @param catalogOptions Catalog specific options to use.
227 * @param queryOptions The Query Options to use.
228 * @return A {@link org.openo.msb.wrapper.consul.model.ConsulResponse} containing
229 * {@link org.openo.msb.wrapper.consul.model.catalog.CatalogService} objects.
231 public ConsulResponse<List<CatalogService>> getService(String service, CatalogOptions catalogOptions,
232 QueryOptions queryOptions) {
233 return response(webTarget.path("service").path(service), catalogOptions, queryOptions,
234 TYPE_CATALOG_SERVICE_LIST);
238 * Retrieves a single node.
240 * GET /v1/catalog/node/{node}
242 * @return A list of matching {@link org.openo.msb.wrapper.consul.model.catalog.CatalogService} objects.
244 public ConsulResponse<CatalogNode> getNode(String node) {
245 return getNode(node, null, QueryOptions.BLANK);
249 * Retrieves a single node for a given datacenter.
251 * GET /v1/catalog/node/{node}?dc={datacenter}
253 * @param catalogOptions Catalog specific options to use.
254 * @return A list of matching {@link org.openo.msb.wrapper.consul.model.catalog.CatalogService} objects.
256 public ConsulResponse<CatalogNode> getNode(String node, CatalogOptions catalogOptions) {
257 return getNode(node, catalogOptions, QueryOptions.BLANK);
261 * Retrieves a single node with {@link org.openo.msb.wrapper.consul.option.QueryOptions}.
263 * GET /v1/catalog/node/{node}
265 * @param queryOptions The Query Options to use.
266 * @return A list of matching {@link org.openo.msb.wrapper.consul.model.catalog.CatalogService} objects.
268 public ConsulResponse<CatalogNode> getNode(String node, QueryOptions queryOptions) {
269 return getNode(node, null, queryOptions);
273 * Retrieves a single node for a given datacenter with {@link org.openo.msb.wrapper.consul.option.QueryOptions}.
275 * GET /v1/catalog/node/{node}?dc={datacenter}
277 * @param catalogOptions Catalog specific options to use.
278 * @param queryOptions The Query Options to use.
279 * @return A list of matching {@link org.openo.msb.wrapper.consul.model.catalog.CatalogService} objects.
281 public ConsulResponse<CatalogNode> getNode(String node, CatalogOptions catalogOptions, QueryOptions queryOptions) {
282 return response(webTarget.path("node").path(node), catalogOptions, queryOptions,