Sergey Lukjanov | 3bc60e9 | 2013-12-10 16:40:50 +0400 | [diff] [blame] | 1 | # Copyright (c) 2013 Mirantis Inc. |
| 2 | # |
Yaroslav Lobankov | 18544b0 | 2014-04-24 20:17:49 +0400 | [diff] [blame] | 3 | # 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 Lukjanov | 3bc60e9 | 2013-12-10 16:40:50 +0400 | [diff] [blame] | 6 | # |
Yaroslav Lobankov | 18544b0 | 2014-04-24 20:17:49 +0400 | [diff] [blame] | 7 | # http://www.apache.org/licenses/LICENSE-2.0 |
Sergey Lukjanov | 3bc60e9 | 2013-12-10 16:40:50 +0400 | [diff] [blame] | 8 | # |
Yaroslav Lobankov | 18544b0 | 2014-04-24 20:17:49 +0400 | [diff] [blame] | 9 | # 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 Lukjanov | 3bc60e9 | 2013-12-10 16:40:50 +0400 | [diff] [blame] | 14 | |
| 15 | import json |
| 16 | |
| 17 | from tempest.common import rest_client |
Matthew Treinish | 684d899 | 2014-01-30 16:27:40 +0000 | [diff] [blame] | 18 | from tempest import config |
| 19 | |
| 20 | CONF = config.CONF |
Sergey Lukjanov | 3bc60e9 | 2013-12-10 16:40:50 +0400 | [diff] [blame] | 21 | |
| 22 | |
| 23 | class DataProcessingClient(rest_client.RestClient): |
Andrea Frittoli | 8bbdb16 | 2014-01-06 11:06:13 +0000 | [diff] [blame] | 24 | def __init__(self, auth_provider): |
| 25 | super(DataProcessingClient, self).__init__(auth_provider) |
Matthew Treinish | 684d899 | 2014-01-30 16:27:40 +0000 | [diff] [blame] | 26 | self.service = CONF.data_processing.catalog_type |
Sergey Lukjanov | 3bc60e9 | 2013-12-10 16:40:50 +0400 | [diff] [blame] | 27 | |
Yaroslav Lobankov | 2f8525e | 2014-07-21 16:40:23 +0400 | [diff] [blame] | 28 | 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 Lukjanov | 3bc60e9 | 2013-12-10 16:40:50 +0400 | [diff] [blame] | 42 | |
| 43 | It returns pair: resp and parsed resource(s) body. |
| 44 | """ |
Yaroslav Lobankov | 2f8525e | 2014-07-21 16:40:23 +0400 | [diff] [blame] | 45 | headers = {'Content-Type': 'application/json'} |
| 46 | resp, body = request_func(uri, headers=headers, *args, **kwargs) |
| 47 | self.expected_success(resp_status, resp.status) |
Sergey Lukjanov | 3bc60e9 | 2013-12-10 16:40:50 +0400 | [diff] [blame] | 48 | body = json.loads(body) |
Yaroslav Lobankov | 2f8525e | 2014-07-21 16:40:23 +0400 | [diff] [blame] | 49 | return resp, body[resource_name] |
Sergey Lukjanov | 3bc60e9 | 2013-12-10 16:40:50 +0400 | [diff] [blame] | 50 | |
| 51 | def list_node_group_templates(self): |
| 52 | """List all node group templates for a user.""" |
| 53 | |
| 54 | uri = 'node-group-templates' |
Yaroslav Lobankov | 2f8525e | 2014-07-21 16:40:23 +0400 | [diff] [blame] | 55 | return self._request_check_and_parse_resp(self.get, uri, |
| 56 | 200, 'node_group_templates') |
Sergey Lukjanov | 3bc60e9 | 2013-12-10 16:40:50 +0400 | [diff] [blame] | 57 | |
| 58 | def get_node_group_template(self, tmpl_id): |
| 59 | """Returns the details of a single node group template.""" |
| 60 | |
Yaroslav Lobankov | 93aa819 | 2014-04-01 20:03:25 +0400 | [diff] [blame] | 61 | uri = 'node-group-templates/%s' % tmpl_id |
Yaroslav Lobankov | 2f8525e | 2014-07-21 16:40:23 +0400 | [diff] [blame] | 62 | return self._request_check_and_parse_resp(self.get, uri, |
| 63 | 200, 'node_group_template') |
Sergey Lukjanov | 3bc60e9 | 2013-12-10 16:40:50 +0400 | [diff] [blame] | 64 | |
| 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 Lobankov | 93aa819 | 2014-04-01 20:03:25 +0400 | [diff] [blame] | 73 | uri = 'node-group-templates' |
Sergey Lukjanov | 3bc60e9 | 2013-12-10 16:40:50 +0400 | [diff] [blame] | 74 | 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 Lobankov | 2f8525e | 2014-07-21 16:40:23 +0400 | [diff] [blame] | 83 | return self._request_check_and_parse_resp(self.post, uri, 202, |
| 84 | 'node_group_template', |
| 85 | body=json.dumps(body)) |
Sergey Lukjanov | 3bc60e9 | 2013-12-10 16:40:50 +0400 | [diff] [blame] | 86 | |
| 87 | def delete_node_group_template(self, tmpl_id): |
| 88 | """Deletes the specified node group template by id.""" |
| 89 | |
Yaroslav Lobankov | 93aa819 | 2014-04-01 20:03:25 +0400 | [diff] [blame] | 90 | uri = 'node-group-templates/%s' % tmpl_id |
Yaroslav Lobankov | 2f8525e | 2014-07-21 16:40:23 +0400 | [diff] [blame] | 91 | return self._request_and_check_resp(self.delete, uri, 204) |
Sergey Lukjanov | dad26cc | 2014-02-06 19:58:31 +0400 | [diff] [blame] | 92 | |
| 93 | def list_plugins(self): |
| 94 | """List all enabled plugins.""" |
| 95 | |
| 96 | uri = 'plugins' |
Yaroslav Lobankov | 2f8525e | 2014-07-21 16:40:23 +0400 | [diff] [blame] | 97 | return self._request_check_and_parse_resp(self.get, |
| 98 | uri, 200, 'plugins') |
Sergey Lukjanov | dad26cc | 2014-02-06 19:58:31 +0400 | [diff] [blame] | 99 | |
| 100 | def get_plugin(self, plugin_name, plugin_version=None): |
| 101 | """Returns the details of a single plugin.""" |
| 102 | |
Yaroslav Lobankov | 93aa819 | 2014-04-01 20:03:25 +0400 | [diff] [blame] | 103 | uri = 'plugins/%s' % plugin_name |
Sergey Lukjanov | dad26cc | 2014-02-06 19:58:31 +0400 | [diff] [blame] | 104 | if plugin_version: |
| 105 | uri += '/%s' % plugin_version |
Yaroslav Lobankov | 2f8525e | 2014-07-21 16:40:23 +0400 | [diff] [blame] | 106 | return self._request_check_and_parse_resp(self.get, uri, 200, 'plugin') |
Yaroslav Lobankov | 93aa819 | 2014-04-01 20:03:25 +0400 | [diff] [blame] | 107 | |
| 108 | def list_cluster_templates(self): |
| 109 | """List all cluster templates for a user.""" |
| 110 | |
| 111 | uri = 'cluster-templates' |
Yaroslav Lobankov | 2f8525e | 2014-07-21 16:40:23 +0400 | [diff] [blame] | 112 | return self._request_check_and_parse_resp(self.get, uri, |
| 113 | 200, 'cluster_templates') |
Yaroslav Lobankov | 93aa819 | 2014-04-01 20:03:25 +0400 | [diff] [blame] | 114 | |
| 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 Lobankov | 2f8525e | 2014-07-21 16:40:23 +0400 | [diff] [blame] | 119 | return self._request_check_and_parse_resp(self.get, |
| 120 | uri, 200, 'cluster_template') |
Yaroslav Lobankov | 93aa819 | 2014-04-01 20:03:25 +0400 | [diff] [blame] | 121 | |
| 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 Lobankov | 2f8525e | 2014-07-21 16:40:23 +0400 | [diff] [blame] | 139 | return self._request_check_and_parse_resp(self.post, uri, 202, |
| 140 | 'cluster_template', |
| 141 | body=json.dumps(body)) |
Yaroslav Lobankov | 93aa819 | 2014-04-01 20:03:25 +0400 | [diff] [blame] | 142 | |
| 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 Lobankov | 2f8525e | 2014-07-21 16:40:23 +0400 | [diff] [blame] | 147 | return self._request_and_check_resp(self.delete, uri, 204) |
Yaroslav Lobankov | 4267bcc | 2014-04-25 13:25:03 +0400 | [diff] [blame] | 148 | |
| 149 | def list_data_sources(self): |
| 150 | """List all data sources for a user.""" |
| 151 | |
| 152 | uri = 'data-sources' |
Yaroslav Lobankov | 2f8525e | 2014-07-21 16:40:23 +0400 | [diff] [blame] | 153 | return self._request_check_and_parse_resp(self.get, |
| 154 | uri, 200, 'data_sources') |
Yaroslav Lobankov | 4267bcc | 2014-04-25 13:25:03 +0400 | [diff] [blame] | 155 | |
| 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 Lobankov | 2f8525e | 2014-07-21 16:40:23 +0400 | [diff] [blame] | 160 | return self._request_check_and_parse_resp(self.get, |
| 161 | uri, 200, 'data_source') |
Yaroslav Lobankov | 4267bcc | 2014-04-25 13:25:03 +0400 | [diff] [blame] | 162 | |
| 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 Lobankov | 2f8525e | 2014-07-21 16:40:23 +0400 | [diff] [blame] | 176 | return self._request_check_and_parse_resp(self.post, uri, |
| 177 | 202, 'data_source', |
| 178 | body=json.dumps(body)) |
Yaroslav Lobankov | 4267bcc | 2014-04-25 13:25:03 +0400 | [diff] [blame] | 179 | |
| 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 Lobankov | 2f8525e | 2014-07-21 16:40:23 +0400 | [diff] [blame] | 184 | return self._request_and_check_resp(self.delete, uri, 204) |
Yaroslav Lobankov | d5dcf19 | 2014-05-21 13:58:10 +0400 | [diff] [blame] | 185 | |
| 186 | def list_job_binary_internals(self): |
| 187 | """List all job binary internals for a user.""" |
| 188 | |
| 189 | uri = 'job-binary-internals' |
Yaroslav Lobankov | 2f8525e | 2014-07-21 16:40:23 +0400 | [diff] [blame] | 190 | return self._request_check_and_parse_resp(self.get, |
| 191 | uri, 200, 'binaries') |
Yaroslav Lobankov | d5dcf19 | 2014-05-21 13:58:10 +0400 | [diff] [blame] | 192 | |
| 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 Lobankov | 2f8525e | 2014-07-21 16:40:23 +0400 | [diff] [blame] | 197 | return self._request_check_and_parse_resp(self.get, uri, |
| 198 | 200, 'job_binary_internal') |
Yaroslav Lobankov | d5dcf19 | 2014-05-21 13:58:10 +0400 | [diff] [blame] | 199 | |
| 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 Lobankov | 2f8525e | 2014-07-21 16:40:23 +0400 | [diff] [blame] | 204 | return self._request_check_and_parse_resp(self.put, uri, 202, |
| 205 | 'job_binary_internal', data) |
Yaroslav Lobankov | d5dcf19 | 2014-05-21 13:58:10 +0400 | [diff] [blame] | 206 | |
| 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 Lobankov | 2f8525e | 2014-07-21 16:40:23 +0400 | [diff] [blame] | 211 | return self._request_and_check_resp(self.delete, uri, 204) |
Yaroslav Lobankov | 889c0e2 | 2014-05-21 18:00:16 +0400 | [diff] [blame] | 212 | |
| 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 Lobankov | 2f8525e | 2014-07-21 16:40:23 +0400 | [diff] [blame] | 217 | return self._request_and_check_resp(self.get, uri, 200) |
Yaroslav Lobankov | 74c923b | 2014-05-21 13:13:07 +0400 | [diff] [blame] | 218 | |
| 219 | def list_job_binaries(self): |
| 220 | """List all job binaries for a user.""" |
| 221 | |
| 222 | uri = 'job-binaries' |
Yaroslav Lobankov | 2f8525e | 2014-07-21 16:40:23 +0400 | [diff] [blame] | 223 | return self._request_check_and_parse_resp(self.get, |
| 224 | uri, 200, 'binaries') |
Yaroslav Lobankov | 74c923b | 2014-05-21 13:13:07 +0400 | [diff] [blame] | 225 | |
| 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 Lobankov | 2f8525e | 2014-07-21 16:40:23 +0400 | [diff] [blame] | 230 | return self._request_check_and_parse_resp(self.get, |
| 231 | uri, 200, 'job_binary') |
Yaroslav Lobankov | 74c923b | 2014-05-21 13:13:07 +0400 | [diff] [blame] | 232 | |
| 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 Lobankov | 2f8525e | 2014-07-21 16:40:23 +0400 | [diff] [blame] | 246 | return self._request_check_and_parse_resp(self.post, uri, |
| 247 | 202, 'job_binary', |
| 248 | body=json.dumps(body)) |
Yaroslav Lobankov | 74c923b | 2014-05-21 13:13:07 +0400 | [diff] [blame] | 249 | |
| 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 Lobankov | 2f8525e | 2014-07-21 16:40:23 +0400 | [diff] [blame] | 254 | return self._request_and_check_resp(self.delete, uri, 204) |
Yaroslav Lobankov | 74c923b | 2014-05-21 13:13:07 +0400 | [diff] [blame] | 255 | |
| 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 Lobankov | 2f8525e | 2014-07-21 16:40:23 +0400 | [diff] [blame] | 260 | return self._request_and_check_resp(self.get, uri, 200) |