blob: 1fe0cf11f53043ccefe1675be90002e87b7a9555 [file] [log] [blame]
Sergey Lukjanov3bc60e92013-12-10 16:40:50 +04001# Copyright (c) 2013 Mirantis Inc.
2#
Yaroslav Lobankov18544b02014-04-24 20:17:49 +04003# Licensed under the Apache License, Version 2.0 (the "License"); you may
4# not use this file except in compliance with the License. You may obtain
5# a copy of the License at
Sergey Lukjanov3bc60e92013-12-10 16:40:50 +04006#
Yaroslav Lobankov18544b02014-04-24 20:17:49 +04007# http://www.apache.org/licenses/LICENSE-2.0
Sergey Lukjanov3bc60e92013-12-10 16:40:50 +04008#
Yaroslav Lobankov18544b02014-04-24 20:17:49 +04009# Unless required by applicable law or agreed to in writing, software
10# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
11# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
12# License for the specific language governing permissions and limitations
13# under the License.
Sergey Lukjanov3bc60e92013-12-10 16:40:50 +040014
15import json
16
17from tempest.common import rest_client
Matthew Treinish684d8992014-01-30 16:27:40 +000018from tempest import config
19
20CONF = config.CONF
Sergey Lukjanov3bc60e92013-12-10 16:40:50 +040021
22
23class DataProcessingClient(rest_client.RestClient):
Andrea Frittoli8bbdb162014-01-06 11:06:13 +000024 def __init__(self, auth_provider):
25 super(DataProcessingClient, self).__init__(auth_provider)
Matthew Treinish684d8992014-01-30 16:27:40 +000026 self.service = CONF.data_processing.catalog_type
Sergey Lukjanov3bc60e92013-12-10 16:40:50 +040027
Yaroslav Lobankov2f8525e2014-07-21 16:40:23 +040028 def _request_and_check_resp(self, request_func, uri, resp_status):
29 """Make a request using specified request_func and check response
30 status code.
31
32 It returns pair: resp and response body.
33 """
34 resp, body = request_func(uri)
35 self.expected_success(resp_status, resp.status)
36 return resp, body
37
38 def _request_check_and_parse_resp(self, request_func, uri, resp_status,
39 resource_name, *args, **kwargs):
40 """Make a request using specified request_func, check response status
41 code and parse response body.
Sergey Lukjanov3bc60e92013-12-10 16:40:50 +040042
43 It returns pair: resp and parsed resource(s) body.
44 """
Yaroslav Lobankov2f8525e2014-07-21 16:40:23 +040045 headers = {'Content-Type': 'application/json'}
46 resp, body = request_func(uri, headers=headers, *args, **kwargs)
47 self.expected_success(resp_status, resp.status)
Sergey Lukjanov3bc60e92013-12-10 16:40:50 +040048 body = json.loads(body)
Yaroslav Lobankov2f8525e2014-07-21 16:40:23 +040049 return resp, body[resource_name]
Sergey Lukjanov3bc60e92013-12-10 16:40:50 +040050
51 def list_node_group_templates(self):
52 """List all node group templates for a user."""
53
54 uri = 'node-group-templates'
Yaroslav Lobankov2f8525e2014-07-21 16:40:23 +040055 return self._request_check_and_parse_resp(self.get, uri,
56 200, 'node_group_templates')
Sergey Lukjanov3bc60e92013-12-10 16:40:50 +040057
58 def get_node_group_template(self, tmpl_id):
59 """Returns the details of a single node group template."""
60
Yaroslav Lobankov93aa8192014-04-01 20:03:25 +040061 uri = 'node-group-templates/%s' % tmpl_id
Yaroslav Lobankov2f8525e2014-07-21 16:40:23 +040062 return self._request_check_and_parse_resp(self.get, uri,
63 200, 'node_group_template')
Sergey Lukjanov3bc60e92013-12-10 16:40:50 +040064
65 def create_node_group_template(self, name, plugin_name, hadoop_version,
66 node_processes, flavor_id,
67 node_configs=None, **kwargs):
68 """Creates node group template with specified params.
69
70 It supports passing additional params using kwargs and returns created
71 object.
72 """
Yaroslav Lobankov93aa8192014-04-01 20:03:25 +040073 uri = 'node-group-templates'
Sergey Lukjanov3bc60e92013-12-10 16:40:50 +040074 body = kwargs.copy()
75 body.update({
76 'name': name,
77 'plugin_name': plugin_name,
78 'hadoop_version': hadoop_version,
79 'node_processes': node_processes,
80 'flavor_id': flavor_id,
81 'node_configs': node_configs or dict(),
82 })
Yaroslav Lobankov2f8525e2014-07-21 16:40:23 +040083 return self._request_check_and_parse_resp(self.post, uri, 202,
84 'node_group_template',
85 body=json.dumps(body))
Sergey Lukjanov3bc60e92013-12-10 16:40:50 +040086
87 def delete_node_group_template(self, tmpl_id):
88 """Deletes the specified node group template by id."""
89
Yaroslav Lobankov93aa8192014-04-01 20:03:25 +040090 uri = 'node-group-templates/%s' % tmpl_id
Yaroslav Lobankov2f8525e2014-07-21 16:40:23 +040091 return self._request_and_check_resp(self.delete, uri, 204)
Sergey Lukjanovdad26cc2014-02-06 19:58:31 +040092
93 def list_plugins(self):
94 """List all enabled plugins."""
95
96 uri = 'plugins'
Yaroslav Lobankov2f8525e2014-07-21 16:40:23 +040097 return self._request_check_and_parse_resp(self.get,
98 uri, 200, 'plugins')
Sergey Lukjanovdad26cc2014-02-06 19:58:31 +040099
100 def get_plugin(self, plugin_name, plugin_version=None):
101 """Returns the details of a single plugin."""
102
Yaroslav Lobankov93aa8192014-04-01 20:03:25 +0400103 uri = 'plugins/%s' % plugin_name
Sergey Lukjanovdad26cc2014-02-06 19:58:31 +0400104 if plugin_version:
105 uri += '/%s' % plugin_version
Yaroslav Lobankov2f8525e2014-07-21 16:40:23 +0400106 return self._request_check_and_parse_resp(self.get, uri, 200, 'plugin')
Yaroslav Lobankov93aa8192014-04-01 20:03:25 +0400107
108 def list_cluster_templates(self):
109 """List all cluster templates for a user."""
110
111 uri = 'cluster-templates'
Yaroslav Lobankov2f8525e2014-07-21 16:40:23 +0400112 return self._request_check_and_parse_resp(self.get, uri,
113 200, 'cluster_templates')
Yaroslav Lobankov93aa8192014-04-01 20:03:25 +0400114
115 def get_cluster_template(self, tmpl_id):
116 """Returns the details of a single cluster template."""
117
118 uri = 'cluster-templates/%s' % tmpl_id
Yaroslav Lobankov2f8525e2014-07-21 16:40:23 +0400119 return self._request_check_and_parse_resp(self.get,
120 uri, 200, 'cluster_template')
Yaroslav Lobankov93aa8192014-04-01 20:03:25 +0400121
122 def create_cluster_template(self, name, plugin_name, hadoop_version,
123 node_groups, cluster_configs=None,
124 **kwargs):
125 """Creates cluster template with specified params.
126
127 It supports passing additional params using kwargs and returns created
128 object.
129 """
130 uri = 'cluster-templates'
131 body = kwargs.copy()
132 body.update({
133 'name': name,
134 'plugin_name': plugin_name,
135 'hadoop_version': hadoop_version,
136 'node_groups': node_groups,
137 'cluster_configs': cluster_configs or dict(),
138 })
Yaroslav Lobankov2f8525e2014-07-21 16:40:23 +0400139 return self._request_check_and_parse_resp(self.post, uri, 202,
140 'cluster_template',
141 body=json.dumps(body))
Yaroslav Lobankov93aa8192014-04-01 20:03:25 +0400142
143 def delete_cluster_template(self, tmpl_id):
144 """Deletes the specified cluster template by id."""
145
146 uri = 'cluster-templates/%s' % tmpl_id
Yaroslav Lobankov2f8525e2014-07-21 16:40:23 +0400147 return self._request_and_check_resp(self.delete, uri, 204)
Yaroslav Lobankov4267bcc2014-04-25 13:25:03 +0400148
149 def list_data_sources(self):
150 """List all data sources for a user."""
151
152 uri = 'data-sources'
Yaroslav Lobankov2f8525e2014-07-21 16:40:23 +0400153 return self._request_check_and_parse_resp(self.get,
154 uri, 200, 'data_sources')
Yaroslav Lobankov4267bcc2014-04-25 13:25:03 +0400155
156 def get_data_source(self, source_id):
157 """Returns the details of a single data source."""
158
159 uri = 'data-sources/%s' % source_id
Yaroslav Lobankov2f8525e2014-07-21 16:40:23 +0400160 return self._request_check_and_parse_resp(self.get,
161 uri, 200, 'data_source')
Yaroslav Lobankov4267bcc2014-04-25 13:25:03 +0400162
163 def create_data_source(self, name, data_source_type, url, **kwargs):
164 """Creates data source with specified params.
165
166 It supports passing additional params using kwargs and returns created
167 object.
168 """
169 uri = 'data-sources'
170 body = kwargs.copy()
171 body.update({
172 'name': name,
173 'type': data_source_type,
174 'url': url
175 })
Yaroslav Lobankov2f8525e2014-07-21 16:40:23 +0400176 return self._request_check_and_parse_resp(self.post, uri,
177 202, 'data_source',
178 body=json.dumps(body))
Yaroslav Lobankov4267bcc2014-04-25 13:25:03 +0400179
180 def delete_data_source(self, source_id):
181 """Deletes the specified data source by id."""
182
183 uri = 'data-sources/%s' % source_id
Yaroslav Lobankov2f8525e2014-07-21 16:40:23 +0400184 return self._request_and_check_resp(self.delete, uri, 204)
Yaroslav Lobankovd5dcf192014-05-21 13:58:10 +0400185
186 def list_job_binary_internals(self):
187 """List all job binary internals for a user."""
188
189 uri = 'job-binary-internals'
Yaroslav Lobankov2f8525e2014-07-21 16:40:23 +0400190 return self._request_check_and_parse_resp(self.get,
191 uri, 200, 'binaries')
Yaroslav Lobankovd5dcf192014-05-21 13:58:10 +0400192
193 def get_job_binary_internal(self, job_binary_id):
194 """Returns the details of a single job binary internal."""
195
196 uri = 'job-binary-internals/%s' % job_binary_id
Yaroslav Lobankov2f8525e2014-07-21 16:40:23 +0400197 return self._request_check_and_parse_resp(self.get, uri,
198 200, 'job_binary_internal')
Yaroslav Lobankovd5dcf192014-05-21 13:58:10 +0400199
200 def create_job_binary_internal(self, name, data):
201 """Creates job binary internal with specified params."""
202
203 uri = 'job-binary-internals/%s' % name
Yaroslav Lobankov2f8525e2014-07-21 16:40:23 +0400204 return self._request_check_and_parse_resp(self.put, uri, 202,
205 'job_binary_internal', data)
Yaroslav Lobankovd5dcf192014-05-21 13:58:10 +0400206
207 def delete_job_binary_internal(self, job_binary_id):
208 """Deletes the specified job binary internal by id."""
209
210 uri = 'job-binary-internals/%s' % job_binary_id
Yaroslav Lobankov2f8525e2014-07-21 16:40:23 +0400211 return self._request_and_check_resp(self.delete, uri, 204)
Yaroslav Lobankov889c0e22014-05-21 18:00:16 +0400212
213 def get_job_binary_internal_data(self, job_binary_id):
214 """Returns data of a single job binary internal."""
215
216 uri = 'job-binary-internals/%s/data' % job_binary_id
Yaroslav Lobankov2f8525e2014-07-21 16:40:23 +0400217 return self._request_and_check_resp(self.get, uri, 200)
Yaroslav Lobankov74c923b2014-05-21 13:13:07 +0400218
219 def list_job_binaries(self):
220 """List all job binaries for a user."""
221
222 uri = 'job-binaries'
Yaroslav Lobankov2f8525e2014-07-21 16:40:23 +0400223 return self._request_check_and_parse_resp(self.get,
224 uri, 200, 'binaries')
Yaroslav Lobankov74c923b2014-05-21 13:13:07 +0400225
226 def get_job_binary(self, job_binary_id):
227 """Returns the details of a single job binary."""
228
229 uri = 'job-binaries/%s' % job_binary_id
Yaroslav Lobankov2f8525e2014-07-21 16:40:23 +0400230 return self._request_check_and_parse_resp(self.get,
231 uri, 200, 'job_binary')
Yaroslav Lobankov74c923b2014-05-21 13:13:07 +0400232
233 def create_job_binary(self, name, url, extra=None, **kwargs):
234 """Creates job binary with specified params.
235
236 It supports passing additional params using kwargs and returns created
237 object.
238 """
239 uri = 'job-binaries'
240 body = kwargs.copy()
241 body.update({
242 'name': name,
243 'url': url,
244 'extra': extra or dict(),
245 })
Yaroslav Lobankov2f8525e2014-07-21 16:40:23 +0400246 return self._request_check_and_parse_resp(self.post, uri,
247 202, 'job_binary',
248 body=json.dumps(body))
Yaroslav Lobankov74c923b2014-05-21 13:13:07 +0400249
250 def delete_job_binary(self, job_binary_id):
251 """Deletes the specified job binary by id."""
252
253 uri = 'job-binaries/%s' % job_binary_id
Yaroslav Lobankov2f8525e2014-07-21 16:40:23 +0400254 return self._request_and_check_resp(self.delete, uri, 204)
Yaroslav Lobankov74c923b2014-05-21 13:13:07 +0400255
256 def get_job_binary_data(self, job_binary_id):
257 """Returns data of a single job binary."""
258
259 uri = 'job-binaries/%s/data' % job_binary_id
Yaroslav Lobankov2f8525e2014-07-21 16:40:23 +0400260 return self._request_and_check_resp(self.get, uri, 200)