1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 import logging
18 try:
19 import json
20 except ImportError:
21 import simplejson as json
22
23 from cm_api.http_client import HttpClient, RestException
24 from cm_api.endpoints import batch, cms, clusters, events, hosts, tools
25 from cm_api.endpoints import types, users, timeseries
26 from cm_api.resource import Resource
27
28 __docformat__ = "epytext"
29
30 LOG = logging.getLogger(__name__)
31
32 API_AUTH_REALM = "Cloudera Manager"
33 API_CURRENT_VERSION = 6
36 """
37 Any error result from the API is converted into this exception type.
38 This handles errors from the HTTP level as well as the API level.
39 """
41
42 RestException.__init__(self, error)
43 try:
44
45 json_body = json.loads(self._message)
46 self._message = json_body['message']
47 except (ValueError, KeyError):
48 pass
49
52 """
53 Resource object that provides methods for managing the top-level API resources.
54 """
55
56 - def __init__(self, server_host, server_port=None,
57 username="admin", password="admin",
58 use_tls=False, version=API_CURRENT_VERSION):
59 """
60 Creates a Resource object that provides API endpoints.
61
62 @param server_host: The hostname of the Cloudera Manager server.
63 @param server_port: The port of the server. Defaults to 7180 (http) or
64 7183 (https).
65 @param username: Login name.
66 @param password: Login password.
67 @param use_tls: Whether to use tls (https).
68 @param version: API version.
69 @return: Resource object referring to the root.
70 """
71 self._version = version
72 protocol = use_tls and "https" or "http"
73 if server_port is None:
74 server_port = use_tls and 7183 or 7180
75 base_url = "%s://%s:%s/api/v%s" % \
76 (protocol, server_host, server_port, version)
77
78 client = HttpClient(base_url, exc_class=ApiException)
79 client.set_basic_auth(username, password, API_AUTH_REALM)
80 client.set_headers( { "Content-Type" : "application/json" } )
81 Resource.__init__(self, client)
82
83 @property
85 """
86 Returns the API version (integer) being used.
87 """
88 return self._version
89
90
91
97
98
99
101 """
102 Create a new cluster.
103
104 @param name: Cluster name.
105 @param version: Cluster CDH version.
106 @return: The created cluster.
107 """
108 return clusters.create_cluster(self, name, version)
109
111 """
112 Delete a cluster by name.
113
114 @param name: Cluster name
115 @return: The deleted ApiCluster object
116 """
117 return clusters.delete_cluster(self, name)
118
120 """
121 Retrieve a list of all clusters.
122 @param view: View to materialize ('full' or 'summary').
123 @return: A list of ApiCluster objects.
124 """
125 return clusters.get_all_clusters(self, view)
126
128 """
129 Look up a cluster by name.
130
131 @param name: Cluster name.
132 @return: An ApiCluster object.
133 """
134 return clusters.get_cluster(self, name)
135
136
137
138 - def create_host(self, host_id, name, ipaddr, rack_id = None):
139 """
140 Create a host.
141
142 @param host_id: The host id.
143 @param name: Host name
144 @param ipaddr: IP address
145 @param rack_id: Rack id. Default None.
146 @return: An ApiHost object
147 """
148 return hosts.create_host(self, host_id, name, ipaddr, rack_id)
149
151 """
152 Delete a host by id.
153
154 @param host_id: Host id
155 @return: The deleted ApiHost object
156 """
157 return hosts.delete_host(self, host_id)
158
160 """
161 Get all hosts
162
163 @param view: View to materialize ('full' or 'summary').
164 @return: A list of ApiHost objects.
165 """
166 return hosts.get_all_hosts(self, view)
167
169 """
170 Look up a host by id.
171
172 @param host_id: Host id
173 @return: An ApiHost object
174 """
175 return hosts.get_host(self, host_id)
176
177
178
180 """
181 Get all users.
182
183 @param view: View to materialize ('full' or 'summary').
184 @return: A list of ApiUser objects.
185 """
186 return users.get_all_users(self, view)
187
189 """
190 Look up a user by username.
191
192 @param username: Username to look up
193 @return: An ApiUser object
194 """
195 return users.get_user(self, username)
196
198 """
199 Create a user.
200
201 @param username: Username
202 @param password: Password
203 @param roles: List of roles for the user. This should be [] for a
204 regular user, or ['ROLE_ADMIN'] for an admin.
205 @return: An ApiUser object
206 """
207 return users.create_user(self, username, password, roles)
208
210 """
211 Delete user by username.
212
213 @param username: Username
214 @return: An ApiUser object
215 """
216 return users.delete_user(self, username)
217
218
219
221 """
222 Query events.
223 @param query_str: Query string.
224 @return: A list of ApiEvent.
225 """
226 return events.query_events(self, query_str)
227
229 """
230 Retrieve a particular event by ID.
231 @param event_id: The event ID.
232 @return: An ApiEvent.
233 """
234 return events.get_event(self, event_id)
235
236
237
238 - def echo(self, message):
239 """Have the server echo a message back."""
240 return tools.echo(self, message)
241
245
246
247
248 - def get_metrics(self, path, from_time, to_time, metrics, view, params=None):
249 """
250 Generic function for querying metrics.
251
252 @param from_time: A datetime; start of the period to query (optional).
253 @param to_time: A datetime; end of the period to query (default = now).
254 @param metrics: List of metrics to query (default = all).
255 @param view: View to materialize ('full' or 'summary')
256 @param params: Other query parameters.
257 @return: List of metrics and their readings.
258 """
259 if not params:
260 params = { }
261 if from_time:
262 params['from'] = from_time.isoformat()
263 if to_time:
264 params['to'] = to_time.isoformat()
265 if metrics:
266 params['metrics'] = metrics
267 if view:
268 params['view'] = view
269 resp = self.get(path, params=params)
270 return types.ApiList.from_json_dict(resp, self, types.ApiMetric)
271
273 """
274 Query time series.
275 @param query: Query string.
276 @param from_time: Start of the period to query (optional).
277 @param to_time: End of the period to query (default = now).
278 @return: A list of ApiTimeSeriesResponse.
279 """
280 return timeseries.query_timeseries(self, query, from_time, to_time)
281
283 """
284 Get the schema for all of the metrics.
285 @return: A list of ApiMetricSchema.
286 """
287 return timeseries.get_metric_schema(self)
288
289
290
292 """
293 Execute a batch request with one or more elements. If any element fails,
294 the entire request is rolled back and subsequent elements are ignored.
295 @param elements: A list of ApiBatchRequestElements
296 @return: 2-tuple (overall success, list of ApiBatchResponseElements).
297 """
298 return batch.do_batch(self, elements)
299
303 """
304 See ApiResource.
305 """
306 return ApiResource(server_host, server_port, username, password, use_tls,
307 version)
308