Initial code import
[msb/apigateway.git] / apiroute / apiroute-service / src / main / java / org / openo / msb / wrapper / consul / CatalogClient.java
1 /**
2 * Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE)
3 *
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
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
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.
15 */
16
17 package org.openo.msb.wrapper.consul;
18
19 import static org.openo.msb.wrapper.consul.util.ClientUtil.response;
20
21 import java.util.List;
22 import java.util.Map;
23
24 import javax.ws.rs.client.WebTarget;
25 import javax.ws.rs.core.GenericType;
26 import javax.ws.rs.core.MediaType;
27
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;
35
36 /**
37  * HTTP Client for /v1/catalog/ endpoints or api/catalog/v1  by openresty
38  */
39 public class CatalogClient {
40
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>() {};
46     
47     private final WebTarget webTarget;
48     
49     /**
50      * Constructs an instance of this class.
51      *
52      * @param webTarget The {@link javax.ws.rs.client.WebTarget} to base requests from.
53      */
54     CatalogClient(WebTarget webTarget) {
55         this.webTarget = webTarget;        
56     }
57
58     /**
59      * Retrieves all datacenters.
60      *
61      * GET /v1/catalog/datacenters
62      *
63      * @return A list of datacenter names.
64      */
65     public List<String> getDatacenters() {
66         return webTarget.path("datacenters").request()
67                 .accept(MediaType.APPLICATION_JSON_TYPE).get(TYPE_STRING_LIST);
68     }
69
70     /**
71      * Retrieves all nodes.
72      *
73      * GET /v1/catalog/nodes
74      *
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.
77      */
78     public ConsulResponse<List<Node>> getNodes() {
79         return getNodes(null, QueryOptions.BLANK);
80     }
81
82     /**
83      * Retrieves all nodes for a given datacenter.
84      *
85      * GET /v1/catalog/nodes?dc={datacenter}
86      *
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.
90      */
91     public ConsulResponse<List<Node>> getNodes(CatalogOptions catalogOptions) {
92         return getNodes(catalogOptions, QueryOptions.BLANK);
93     }
94
95     /**
96      * Retrieves all nodes with {@link org.openo.msb.wrapper.consul.option.QueryOptions}.
97      *
98      * GET /v1/catalog/nodes
99      *
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.
103      */
104     public ConsulResponse<List<Node>> getNodes(QueryOptions queryOptions) {
105         return getNodes(null, queryOptions);
106     }
107
108     /**
109      * Retrieves all nodes for a given datacenter with {@link org.openo.msb.wrapper.consul.option.QueryOptions}.
110      *
111      * GET /v1/catalog/nodes?dc={datacenter}
112      *
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.
117      */
118     public ConsulResponse<List<Node>> getNodes(CatalogOptions catalogOptions, QueryOptions queryOptions) {
119         return response(webTarget.path("nodes"), catalogOptions, queryOptions, TYPE_NODE_LIST);
120     }
121
122     /**
123      * Retrieves all services for a given datacenter.
124      *
125      * GET /v1/catalog/services?dc={datacenter}
126      *
127      * @return A {@link org.openo.msb.wrapper.consul.model.ConsulResponse} containing a map of service name to list of tags.
128      */
129     public ConsulResponse<Map<String, List<String>>> getServices() {
130         return getServices(null, QueryOptions.BLANK);
131     }
132
133     /**
134      * Retrieves all services for a given datacenter.
135      *
136      * GET /v1/catalog/services?dc={datacenter}
137      *
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.
140      */
141     public ConsulResponse<Map<String, List<String>>> getServices(CatalogOptions catalogOptions) {
142         return getServices(catalogOptions, QueryOptions.BLANK);
143     }
144
145     /**
146      * Retrieves all services for a given datacenter with {@link org.openo.msb.wrapper.consul.option.QueryOptions}.
147      *
148      * GET /v1/catalog/services?dc={datacenter}
149      *
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.
152      */
153     public ConsulResponse<Map<String, List<String>>> getServices(QueryOptions queryOptions) {
154         return getServices(null, queryOptions);
155     }
156
157     /**
158      * Retrieves all services for a given datacenter with {@link org.openo.msb.wrapper.consul.option.QueryOptions}.
159      *
160      * GET /v1/catalog/services?dc={datacenter}
161      *
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.
165      */
166     public ConsulResponse<Map<String, List<String>>> getServices(CatalogOptions catalogOptions, QueryOptions queryOptions) {
167         return response(webTarget.path("services"), catalogOptions, queryOptions, TYPE_SERVICES_MAP);
168     }
169     
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);
173     }
174
175     /**
176      * Retrieves a single service.
177      *
178      * GET /v1/catalog/service/{service}
179      *
180      * @return A {@link org.openo.msb.wrapper.consul.model.ConsulResponse} containing
181      * {@link org.openo.msb.wrapper.consul.model.catalog.CatalogService} objects.
182      */
183     public ConsulResponse<List<CatalogService>> getService(String service) {
184         return getService(service, null, QueryOptions.BLANK);
185     }
186
187     /**
188      * Retrieves a single service for a given datacenter.
189      *
190      * GET /v1/catalog/service/{service}?dc={datacenter}
191      *
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.
195      */
196     public ConsulResponse<List<CatalogService>> getService(String service, CatalogOptions catalogOptions) {
197         return getService(service, catalogOptions, QueryOptions.BLANK);
198     }
199
200     /**
201      * Retrieves a single service with {@link org.openo.msb.wrapper.consul.option.QueryOptions}.
202      *
203      * GET /v1/catalog/service/{service}
204      *
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.
208      */
209     public ConsulResponse<List<CatalogService>> getService(String service, QueryOptions queryOptions) {
210         return getService(service, null, queryOptions);
211     }
212     
213     public void getService(String service, QueryOptions queryOptions, ConsulResponseCallback<List<CatalogService>> callback) {
214    
215         response(webTarget.path("service").path(service), CatalogOptions.BLANK,
216             queryOptions, TYPE_CATALOG_SERVICE_LIST, callback);
217     }
218     
219    
220
221     /**
222      * Retrieves a single service for a given datacenter with {@link org.openo.msb.wrapper.consul.option.QueryOptions}.
223      *
224      * GET /v1/catalog/service/{service}?dc={datacenter}
225      *
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.
230      */
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);
235     }
236
237     /**
238      * Retrieves a single node.
239      *
240      * GET /v1/catalog/node/{node}
241      *
242      * @return A list of matching {@link org.openo.msb.wrapper.consul.model.catalog.CatalogService} objects.
243      */
244     public ConsulResponse<CatalogNode> getNode(String node) {
245         return getNode(node, null, QueryOptions.BLANK);
246     }
247
248     /**
249      * Retrieves a single node for a given datacenter.
250      *
251      * GET /v1/catalog/node/{node}?dc={datacenter}
252      *
253      * @param catalogOptions Catalog specific options to use.      
254      * @return A list of matching {@link org.openo.msb.wrapper.consul.model.catalog.CatalogService} objects.
255      */
256     public ConsulResponse<CatalogNode> getNode(String node, CatalogOptions catalogOptions) {
257         return getNode(node, catalogOptions, QueryOptions.BLANK);
258     }
259
260     /**
261      * Retrieves a single node with {@link org.openo.msb.wrapper.consul.option.QueryOptions}.
262      *
263      * GET /v1/catalog/node/{node}
264      *
265      * @param queryOptions The Query Options to use.
266      * @return A list of matching {@link org.openo.msb.wrapper.consul.model.catalog.CatalogService} objects.
267      */
268     public ConsulResponse<CatalogNode> getNode(String node, QueryOptions queryOptions) {
269         return getNode(node, null, queryOptions);
270     }
271
272     /**
273      * Retrieves a single node for a given datacenter with {@link org.openo.msb.wrapper.consul.option.QueryOptions}.
274      *
275      * GET /v1/catalog/node/{node}?dc={datacenter}
276      *
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.
280      */
281     public ConsulResponse<CatalogNode> getNode(String node, CatalogOptions catalogOptions, QueryOptions queryOptions) {
282         return response(webTarget.path("node").path(node), catalogOptions, queryOptions,
283                 TYPE_CATALOG_NODE);
284     }
285 }