Package cm_api :: Package endpoints :: Module services
[hide private]
[frames] | no frames]

Source Code for Module cm_api.endpoints.services

   1  # Licensed to Cloudera, Inc. under one 
   2  # or more contributor license agreements.  See the NOTICE file 
   3  # distributed with this work for additional information 
   4  # regarding copyright ownership.  Cloudera, Inc. licenses this file 
   5  # to you under the Apache License, Version 2.0 (the 
   6  # "License"); you may not use this file except in compliance 
   7  # with the License.  You may obtain a copy of the License at 
   8  # 
   9  #     http://www.apache.org/licenses/LICENSE-2.0 
  10  # 
  11  # Unless required by applicable law or agreed to in writing, software 
  12  # distributed under the License is distributed on an "AS IS" BASIS, 
  13  # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
  14  # See the License for the specific language governing permissions and 
  15  # limitations under the License. 
  16   
  17  try: 
  18    import json 
  19  except ImportError: 
  20    import simplejson as json 
  21   
  22  from cm_api.endpoints.types import * 
  23  from cm_api.endpoints import roles, role_config_groups 
  24   
  25  __docformat__ = "epytext" 
  26   
  27  SERVICES_PATH = "/clusters/%s/services" 
  28  SERVICE_PATH = "/clusters/%s/services/%s" 
  29  ROLETYPES_CFG_KEY = 'roleTypeConfigs' 
  30   
31 -def create_service(resource_root, name, service_type, 32 cluster_name="default"):
33 """ 34 Create a service 35 @param resource_root: The root Resource object. 36 @param name: Service name 37 @param service_type: Service type 38 @param cluster_name: Cluster name 39 @return: An ApiService object 40 """ 41 apiservice = ApiService(resource_root, name, service_type) 42 return call(resource_root.post, 43 SERVICES_PATH % (cluster_name,), 44 ApiService, True, data=[apiservice])[0]
45
46 -def get_service(resource_root, name, cluster_name="default"):
47 """ 48 Lookup a service by name 49 @param resource_root: The root Resource object. 50 @param name: Service name 51 @param cluster_name: Cluster name 52 @return: An ApiService object 53 """ 54 return _get_service(resource_root, "%s/%s" % (SERVICES_PATH % (cluster_name,), name))
55
56 -def _get_service(resource_root, path):
57 return call(resource_root.get, path, ApiService)
58
59 -def get_all_services(resource_root, cluster_name="default", view=None):
60 """ 61 Get all services 62 @param resource_root: The root Resource object. 63 @param cluster_name: Cluster name 64 @return: A list of ApiService objects. 65 """ 66 return call(resource_root.get, 67 SERVICES_PATH % (cluster_name,), 68 ApiService, True, params=view and dict(view=view) or None)
69
70 -def delete_service(resource_root, name, cluster_name="default"):
71 """ 72 Delete a service by name 73 @param resource_root: The root Resource object. 74 @param name: Service name 75 @param cluster_name: Cluster name 76 @return: The deleted ApiService object 77 """ 78 return call(resource_root.delete, 79 "%s/%s" % (SERVICES_PATH % (cluster_name,), name), 80 ApiService)
81 82
83 -class ApiService(BaseApiResource):
84 _ATTRIBUTES = { 85 'name' : None, 86 'type' : None, 87 'displayName' : None, 88 'serviceState' : ROAttr(), 89 'healthSummary' : ROAttr(), 90 'healthChecks' : ROAttr(), 91 'clusterRef' : ROAttr(ApiClusterRef), 92 'configStale' : ROAttr(), 93 'configStalenessStatus' : ROAttr(), 94 'clientConfigStalenessStatus' : ROAttr(), 95 'serviceUrl' : ROAttr(), 96 'maintenanceMode' : ROAttr(), 97 'maintenanceOwners' : ROAttr(), 98 } 99
100 - def __init__(self, resource_root, name=None, type=None):
101 BaseApiObject.init(self, resource_root, locals())
102
103 - def __str__(self):
104 return "<ApiService>: %s (cluster: %s)" % ( 105 self.name, self._get_cluster_name())
106
107 - def _get_cluster_name(self):
108 if hasattr(self, 'clusterRef') and self.clusterRef: 109 return self.clusterRef.clusterName 110 return None
111
112 - def _path(self):
113 """ 114 Return the API path for this service. 115 116 This method assumes that lack of a cluster reference means that the 117 object refers to the Cloudera Management Services instance. 118 """ 119 if self._get_cluster_name(): 120 return SERVICE_PATH % (self._get_cluster_name(), self.name) 121 else: 122 return '/cm/service'
123
124 - def _role_cmd(self, cmd, roles, api_version=1):
125 return self._post("roleCommands/" + cmd, ApiBulkCommandList, 126 data=roles, api_version=api_version)
127
128 - def _parse_svc_config(self, json_dic, view = None):
129 """ 130 Parse a json-decoded ApiServiceConfig dictionary into a 2-tuple. 131 132 @param json_dic: The json dictionary with the config data. 133 @param view: View to materialize. 134 @return: 2-tuple (service config dictionary, role type configurations) 135 """ 136 svc_config = json_to_config(json_dic, view == 'full') 137 rt_configs = { } 138 if json_dic.has_key(ROLETYPES_CFG_KEY): 139 for rt_config in json_dic[ROLETYPES_CFG_KEY]: 140 rt_configs[rt_config['roleType']] = \ 141 json_to_config(rt_config, view == 'full') 142 143 return (svc_config, rt_configs)
144
145 - def get_commands(self, view=None):
146 """ 147 Retrieve a list of running commands for this service. 148 149 @param view: View to materialize ('full' or 'summary') 150 @return: A list of running commands. 151 """ 152 return self._get("commands", ApiCommand, True, 153 params = view and dict(view=view) or None)
154
155 - def get_running_activities(self):
156 return self.query_activities()
157
158 - def query_activities(self, query_str=None):
159 return self._get("activities", ApiActivity, True, 160 params=query_str and dict(query=query_str) or dict())
161
162 - def get_activity(self, job_id):
163 return self._get("activities/" + job_id, ApiActivity)
164
165 - def get_impala_queries(self, start_time, end_time, filter_str="", limit=100, 166 offset=0):
167 """ 168 Returns a list of queries that satisfy the filter 169 170 @type start_time: datetime.datetime. Note that the datetime must either be 171 time zone aware or specified in the server time zone. See 172 the python datetime documentation for more details about 173 python's time zone handling. 174 @param start_time: Queries must have ended after this time 175 @type end_time: datetime.datetime. Note that the datetime must either be 176 time zone aware or specified in the server time zone. See 177 the python datetime documentation for more details about 178 python's time zone handling. 179 @param end_time: Queries must have started before this time 180 @param filter_str: A filter to apply to the queries. For example: 181 'user = root and queryDuration > 5s' 182 @param limit: The maximum number of results to return 183 @param offset: The offset into the return list 184 @since: API v4 185 """ 186 params = { 187 'from': start_time.isoformat(), 188 'to': end_time.isoformat(), 189 'filter': filter_str, 190 'limit': limit, 191 'offset': offset, 192 } 193 return self._get("impalaQueries", ApiImpalaQueryResponse, 194 params=params, api_version=4)
195
196 - def cancel_impala_query(self, query_id):
197 """ 198 Cancel the query. 199 200 @param query_id: The query ID 201 @return: The warning message, if any. 202 @since: API v4 203 """ 204 return self._post("impalaQueries/%s/cancel" % query_id, 205 ApiImpalaCancelResponse, api_version=4)
206
207 - def get_query_details(self, query_id, format='text'):
208 """ 209 Get the query details 210 211 @param query_id: The query ID 212 @param format: The format of the response ('text' or 'thrift_encoded') 213 @return: The details text 214 @since: API v4 215 """ 216 return self._get("impalaQueries/" + query_id, ApiImpalaQueryDetailsResponse, 217 params=dict(format=format), api_version=4)
218
220 """ 221 Returns the list of all attributes that the Service Monitor can associate 222 with Impala queries. 223 224 Examples of attributes include the user who issued the query and the 225 number of HDFS bytes read by the query. 226 227 These attributes can be used to search for specific Impala queries through 228 the get_impala_queries API. For example the 'user' attribute could be used 229 in the search 'user = root'. If the attribute is numeric it can also be used 230 as a metric in a tsquery (ie, 'select hdfs_bytes_read from IMPALA_QUERIES'). 231 232 Note that this response is identical for all Impala services. 233 234 @return: A list of the Impala query attributes 235 @since API v6 236 """ 237 return self._get("impalaQueries/attributes", ApiImpalaQueryAttribute, 238 api_version=6)
239
241 """ 242 Create the Impala Catalog Database. Only works with embedded postgresql 243 database. This command should usually be followed by a call to 244 create_impala_catalog_database_tables. 245 246 @return: Reference to the submitted command. 247 @since: API v6 248 """ 249 return self._cmd('impalaCreateCatalogDatabase', api_version=6)
250
252 """ 253 Creates the Impala Catalog Database tables in the configured database. 254 Will do nothing if tables already exist. Will not perform an upgrade. 255 256 @return: Reference to the submitted command. 257 @since: API v6 258 """ 259 return self._cmd('impalaCreateCatalogDatabaseTables', api_version=6)
260
261 - def create_impala_user_dir(self):
262 """ 263 Create the Impala user directory 264 265 @return: Reference to submitted command. 266 @since: API v6 267 """ 268 return self._cmd('impalaCreateUserDir', api_version=6)
269
270 - def enable_llama_rm(self, llama1_host_id, llama1_role_name=None, 271 llama2_host_id=None, llama2_role_name=None, 272 zk_service_name=None, skip_restart=False):
273 """ 274 Enable Llama-based resource management for Impala. 275 276 This command only applies to CDH 5.1+ Impala services. 277 278 This command configures YARN and Impala for Llama resource management, 279 and then creates one or two Llama roles, as specified by the parameters. 280 When two Llama roles are created, they are configured as an active-standby 281 pair. Auto-failover from active to standby Llama will be enabled using 282 ZooKeeper. 283 284 If optional role name(s) are specified, the new Llama role(s) will be 285 named accordingly; otherwise, role name(s) will be automatically generated. 286 287 By default, YARN, Impala, and any dependent services will be restarted, 288 and client configuration will be re-deployed across the cluster. These 289 default actions may be suppressed. 290 291 In order to enable Llama resource management, a YARN service must be 292 present in the cluster, and Cgroup-based resource management must be 293 enabled for all hosts with NodeManager roles. If these preconditions 294 are not met, the command will fail. 295 296 @param llama1_host_id: id of the host where the first Llama role will 297 be created. 298 @param llama1_role_name: Name of the first Llama role. If omitted, a 299 name will be generated automatically. 300 @param llama2_host_id: id of the host where the second Llama role will 301 be created. If omitted, only one Llama role will 302 be created (i.e., high availability will not be 303 enabled). 304 @param llama2_role_name: Name of the second Llama role. If omitted, a 305 name will be generated automatically. 306 @param zk_service_name: Name of the ZooKeeper service to use for 307 auto-failover. Only relevant when enabling 308 Llama RM in HA mode (i.e., when creating two 309 Llama roles). If Impala's ZooKeeper dependency 310 is already set, then that ZooKeeper service will 311 be used for auto-failover, and this parameter 312 may be omitted. 313 @param skip_restart: true to skip the restart of Yarn, Impala, and 314 their dependent services, and to skip deployment 315 of client configuration. Default is False (i.e., 316 by default dependent services are restarted and 317 client configuration is deployed). 318 @return: Reference to the submitted command. 319 @since: API v8 320 """ 321 args = dict( 322 llama1HostId = llama1_host_id, 323 llama1RoleName = llama1_role_name, 324 llama2HostId = llama2_host_id, 325 llama2RoleName = llama2_role_name, 326 zkServiceName = zk_service_name, 327 skipRestart = skip_restart 328 ) 329 return self._cmd('impalaEnableLlamaRm', data=args, api_version=8)
330
331 - def disable_llama_rm(self):
332 """ 333 Disable Llama-based resource management for Impala. 334 335 This command only applies to CDH 5.1+ Impala services. 336 337 This command disables resource management for Impala by removing all 338 Llama roles present in the Impala service. Any services that depend 339 on the Impala service being modified are restarted by the command, 340 and client configuration is deployed for all services of the cluster. 341 342 @return: Reference to the submitted command. 343 @since: API v8 344 """ 345 return self._cmd('impalaDisableLlamaRm', api_version=8)
346
347 - def enable_llama_ha(self, new_llama_host_id, zk_service_name=None, 348 new_llama_role_name=None):
349 """ 350 Enable high availability for an Impala Llama ApplicationMaster. 351 352 This command only applies to CDH 5.1+ Impala services. 353 354 @param new_llama_host_id: id of the host where the second Llama role 355 will be added. 356 @param zk_service_name: Name of the ZooKeeper service to use for 357 auto-failover. If Impala's ZooKeeper dependency 358 is already set, then that ZooKeeper service will 359 be used for auto-failover, and this parameter 360 may be omitted. 361 @param new_llama_role_name: Name of the new Llama role. If omitted, a 362 name will be generated automatically. 363 @return: Reference to the submitted command. 364 @since: API v8 365 """ 366 args = dict( 367 newLlamaHostId = new_llama_host_id, 368 zkServiceName = zk_service_name, 369 newLlamaRoleName = new_llama_role_name 370 ) 371 return self._cmd('impalaEnableLlamaHa', data=args, api_version=8)
372
373 - def disable_llama_ha(self, active_name):
374 """ 375 Disable high availability for an Impala Llama active-standby pair. 376 377 This command only applies to CDH 5.1+ Impala services. 378 379 @param active_name: name of the Llama role that will be active after 380 the disable operation. The other Llama role will 381 be removed. 382 383 @return: Reference to the submitted command. 384 @since: API v8 385 """ 386 args = dict( 387 activeName = active_name 388 ) 389 return self._cmd('impalaDisableLlamaHa', data=args, api_version=8)
390
391 - def get_yarn_applications(self, start_time, end_time, filter_str="", limit=100, 392 offset=0):
393 """ 394 Returns a list of YARN applications that satisfy the filter 395 @type start_time: datetime.datetime. Note that the datetime must either be 396 time zone aware or specified in the server time zone. See 397 the python datetime documentation for more details about 398 python's time zone handling. 399 @param start_time: Applications must have ended after this time 400 @type end_time: datetime.datetime. Note that the datetime must either be 401 time zone aware or specified in the server time zone. See 402 the python datetime documentation for more details about 403 python's time zone handling. 404 @param filter_str: A filter to apply to the applications. For example: 405 'user = root and applicationDuration > 5s' 406 @param limit: The maximum number of results to return 407 @param offset: The offset into the return list 408 @since: API v6 409 """ 410 params = { 411 'from': start_time.isoformat(), 412 'to': end_time.isoformat(), 413 'filter': filter_str, 414 'limit': limit, 415 'offset': offset 416 } 417 return self._get("yarnApplications", ApiYarnApplicationResponse, 418 params=params, api_version=6)
419
420 - def kill_yarn_application(self, application_id):
421 """ 422 Kills the application. 423 424 @return: The warning message, if any. 425 @since: API v6 426 """ 427 return self._post("yarnApplications/%s/kill" % (application_id, ), 428 ApiYarnKillResponse, api_version=6)
429
431 """ 432 Returns the list of all attributes that the Service Monitor can associate 433 with YARN applications. 434 435 Examples of attributes include the user who ran the application and the 436 number of maps completed by the application. 437 438 These attributes can be used to search for specific YARN applications through 439 the get_yarn_applications API. For example the 'user' attribute could be used 440 in the search 'user = root'. If the attribute is numeric it can also be used 441 as a metric in a tsquery (ie, 'select maps_completed from YARN_APPLICATIONS'). 442 443 Note that this response is identical for all YARN services. 444 445 @return: A list of the YARN application attributes 446 @since API v6 447 """ 448 return self._get("yarnApplications/attributes", ApiYarnApplicationAttribute, 449 api_version=6)
450
452 """ 453 Create the Yarn job history directory. 454 455 @return: Reference to submitted command. 456 @since: API v6 457 """ 458 return self._cmd('yarnCreateJobHistoryDirCommand', api_version=6)
459
461 """ 462 Create the Yarn NodeManager remote application log directory. 463 464 @return: Reference to submitted command. 465 @since: API v6 466 """ 467 return self._cmd('yarnNodeManagerRemoteAppLogDirCommand', api_version=6)
468
469 - def collect_yarn_application_diagnostics(self, *application_ids):
470 """ 471 DEPRECATED: use create_yarn_application_diagnostics_bundle on the Yarn service. Deprecated since v10. 472 473 Collects the Diagnostics data for Yarn applications. 474 475 @param application_ids: An array of strings containing the ids of the 476 yarn applications. 477 @return: Reference to the submitted command. 478 @since: API v8 479 """ 480 args = dict(applicationIds = application_ids) 481 return self._cmd('yarnApplicationDiagnosticsCollection', api_version=8, data=args)
482
483 - def create_yarn_application_diagnostics_bundle(self, application_ids, ticket_number=None, comments=None):
484 """ 485 Collects the Diagnostics data for Yarn applications. 486 487 @param application_ids: An array of strings containing the ids of the 488 yarn applications. 489 @param ticket_number: If applicable, the support ticket number of the issue 490 being experienced on the cluster. 491 @param comments: Additional comments 492 @return: Reference to the submitted command. 493 @since: API v10 494 """ 495 args = dict(applicationIds = application_ids, 496 ticketNumber = ticket_number, 497 comments = comments) 498 499 return self._cmd('yarnApplicationDiagnosticsCollection', api_version=10, data=args)
500
501 - def get_config(self, view = None):
502 """ 503 Retrieve the service's configuration. 504 505 Retrieves both the service configuration and role type configuration 506 for each of the service's supported role types. The role type 507 configurations are returned as a dictionary, whose keys are the 508 role type name, and values are the respective configuration dictionaries. 509 510 The 'summary' view contains strings as the dictionary values. The full 511 view contains ApiConfig instances as the values. 512 513 @param view: View to materialize ('full' or 'summary') 514 @return: 2-tuple (service config dictionary, role type configurations) 515 """ 516 path = self._path() + '/config' 517 resp = self._get_resource_root().get(path, 518 params = view and dict(view=view) or None) 519 return self._parse_svc_config(resp, view)
520
521 - def update_config(self, svc_config, **rt_configs):
522 """ 523 Update the service's configuration. 524 525 @param svc_config: Dictionary with service configuration to update. 526 @param rt_configs: Dict of role type configurations to update. 527 @return: 2-tuple (service config dictionary, role type configurations) 528 """ 529 path = self._path() + '/config' 530 531 if svc_config: 532 data = config_to_api_list(svc_config) 533 else: 534 data = { } 535 if rt_configs: 536 rt_list = [ ] 537 for rt, cfg in rt_configs.iteritems(): 538 rt_data = config_to_api_list(cfg) 539 rt_data['roleType'] = rt 540 rt_list.append(rt_data) 541 data[ROLETYPES_CFG_KEY] = rt_list 542 543 resp = self._get_resource_root().put(path, data = json.dumps(data)) 544 return self._parse_svc_config(resp)
545
546 - def create_role(self, role_name, role_type, host_id):
547 """ 548 Create a role. 549 550 @param role_name: Role name 551 @param role_type: Role type 552 @param host_id: ID of the host to assign the role to 553 @return: An ApiRole object 554 """ 555 return roles.create_role(self._get_resource_root(), self.name, role_type, 556 role_name, host_id, self._get_cluster_name())
557
558 - def delete_role(self, name):
559 """ 560 Delete a role by name. 561 562 @param name: Role name 563 @return: The deleted ApiRole object 564 """ 565 return roles.delete_role(self._get_resource_root(), self.name, name, 566 self._get_cluster_name())
567
568 - def get_role(self, name):
569 """ 570 Lookup a role by name. 571 572 @param name: Role name 573 @return: An ApiRole object 574 """ 575 return roles.get_role(self._get_resource_root(), self.name, name, 576 self._get_cluster_name())
577
578 - def get_all_roles(self, view = None):
579 """ 580 Get all roles in the service. 581 582 @param view: View to materialize ('full' or 'summary') 583 @return: A list of ApiRole objects. 584 """ 585 return roles.get_all_roles(self._get_resource_root(), self.name, 586 self._get_cluster_name(), view)
587
588 - def get_roles_by_type(self, role_type, view = None):
589 """ 590 Get all roles of a certain type in a service. 591 592 @param role_type: Role type 593 @param view: View to materialize ('full' or 'summary') 594 @return: A list of ApiRole objects. 595 """ 596 return roles.get_roles_by_type(self._get_resource_root(), self.name, 597 role_type, self._get_cluster_name(), view)
598
599 - def get_role_types(self):
600 """ 601 Get a list of role types in a service. 602 603 @return: A list of role types (strings) 604 """ 605 resp = self._get_resource_root().get(self._path() + '/roleTypes') 606 return resp[ApiList.LIST_KEY]
607
608 - def get_all_role_config_groups(self):
609 """ 610 Get a list of role configuration groups in the service. 611 612 @return: A list of ApiRoleConfigGroup objects. 613 @since: API v3 614 """ 615 return role_config_groups.get_all_role_config_groups( 616 self._get_resource_root(), self.name, self._get_cluster_name())
617
618 - def get_role_config_group(self, name):
619 """ 620 Get a role configuration group in the service by name. 621 622 @param name: The name of the role config group. 623 @return: An ApiRoleConfigGroup object. 624 @since: API v3 625 """ 626 return role_config_groups.get_role_config_group( 627 self._get_resource_root(), self.name, name, self._get_cluster_name())
628
629 - def create_role_config_group(self, name, display_name, role_type):
630 """ 631 Create a role config group. 632 633 @param name: The name of the new group. 634 @param display_name: The display name of the new group. 635 @param role_type: The role type of the new group. 636 @return: New ApiRoleConfigGroup object. 637 @since: API v3 638 """ 639 return role_config_groups.create_role_config_group( 640 self._get_resource_root(), self.name, name, display_name, role_type, 641 self._get_cluster_name())
642
643 - def update_role_config_group(self, name, apigroup):
644 """ 645 Update a role config group. 646 647 @param name: Role config group name. 648 @param apigroup: The updated role config group. 649 @return: The updated ApiRoleConfigGroup object. 650 @since: API v3 651 """ 652 return role_config_groups.update_role_config_group( 653 self._get_resource_root(), self.name, name, apigroup, 654 self._get_cluster_name())
655
656 - def delete_role_config_group(self, name):
657 """ 658 Delete a role config group by name. 659 660 @param name: Role config group name. 661 @return: The deleted ApiRoleConfigGroup object. 662 @since: API v3 663 """ 664 return role_config_groups.delete_role_config_group( 665 self._get_resource_root(), self.name, name, self._get_cluster_name())
666
667 - def get_metrics(self, from_time=None, to_time=None, metrics=None, view=None):
668 """ 669 This endpoint is not supported as of v6. Use the timeseries API 670 instead. To get all metrics for a service with the timeseries API use 671 the query: 672 673 'select * where serviceName = $SERVICE_NAME'. 674 675 To get specific metrics for a service use a comma-separated list of 676 the metric names as follows: 677 678 'select $METRIC_NAME1, $METRIC_NAME2 where serviceName = $SERVICE_NAME'. 679 680 For more information see http://tiny.cloudera.com/tsquery_doc 681 682 Retrieve metric readings for the service. 683 @param from_time: A datetime; start of the period to query (optional). 684 @param to_time: A datetime; end of the period to query (default = now). 685 @param metrics: List of metrics to query (default = all). 686 @param view: View to materialize ('full' or 'summary') 687 @return: List of metrics and their readings. 688 """ 689 return self._get_resource_root().get_metrics(self._path() + '/metrics', 690 from_time, to_time, metrics, view)
691
692 - def start(self):
693 """ 694 Start a service. 695 696 @return: Reference to the submitted command. 697 """ 698 return self._cmd('start')
699
700 - def stop(self):
701 """ 702 Stop a service. 703 704 @return: Reference to the submitted command. 705 """ 706 return self._cmd('stop')
707
708 - def restart(self):
709 """ 710 Restart a service. 711 712 @return: Reference to the submitted command. 713 """ 714 return self._cmd('restart')
715
716 - def start_roles(self, *role_names):
717 """ 718 Start a list of roles. 719 720 @param role_names: names of the roles to start. 721 @return: List of submitted commands. 722 """ 723 return self._role_cmd('start', role_names)
724
725 - def stop_roles(self, *role_names):
726 """ 727 Stop a list of roles. 728 729 @param role_names: names of the roles to stop. 730 @return: List of submitted commands. 731 """ 732 return self._role_cmd('stop', role_names)
733
734 - def restart_roles(self, *role_names):
735 """ 736 Restart a list of roles. 737 738 @param role_names: names of the roles to restart. 739 @return: List of submitted commands. 740 """ 741 return self._role_cmd('restart', role_names)
742
743 - def bootstrap_hdfs_stand_by(self, *role_names):
744 """ 745 Bootstrap HDFS stand-by NameNodes. 746 747 Initialize their state by syncing it with the respective HA partner. 748 749 @param role_names: NameNodes to bootstrap. 750 @return: List of submitted commands. 751 """ 752 return self._role_cmd('hdfsBootstrapStandBy', role_names)
753
754 - def finalize_metadata_upgrade(self, *role_names):
755 """ 756 Finalize HDFS NameNode metadata upgrade. Should be done after doing 757 HDFS upgrade with full downtime (and not with rolling upgrade). 758 759 @param role_names: NameNodes for which to finalize the upgrade. 760 @return: List of submitted commands. 761 @since: API v3 762 """ 763 return self._role_cmd('hdfsFinalizeMetadataUpgrade', role_names, api_version=3)
764
765 - def create_beeswax_warehouse(self):
766 """ 767 DEPRECATED: use create_hive_warehouse on the Hive service. Deprecated since v3. 768 769 Create the Beeswax role's warehouse for a Hue service. 770 771 @return: Reference to the submitted command. 772 """ 773 return self._cmd('hueCreateHiveWarehouse')
774
775 - def create_hbase_root(self):
776 """ 777 Create the root directory of an HBase service. 778 779 @return: Reference to the submitted command. 780 """ 781 return self._cmd('hbaseCreateRoot')
782
783 - def create_hdfs_tmp(self):
784 """ 785 Create the /tmp directory in HDFS with appropriate ownership and permissions. 786 787 @return: Reference to the submitted command 788 @since: API v2 789 """ 790 return self._cmd('hdfsCreateTmpDir')
791
792 - def refresh(self, *role_names):
793 """ 794 Execute the "refresh" command on a set of roles. 795 796 @param role_names: Names of the roles to refresh. 797 @return: Reference to the submitted command. 798 """ 799 return self._role_cmd('refresh', role_names)
800
801 - def decommission(self, *role_names):
802 """ 803 Decommission roles in a service. 804 805 @param role_names: Names of the roles to decommission. 806 @return: Reference to the submitted command. 807 """ 808 return self._cmd('decommission', data=role_names)
809
810 - def recommission(self, *role_names):
811 """ 812 Recommission roles in a service. 813 814 @param role_names: Names of the roles to recommission. 815 @return: Reference to the submitted command. 816 @since: API v2 817 """ 818 return self._cmd('recommission', data=role_names)
819
820 - def deploy_client_config(self, *role_names):
821 """ 822 Deploys client configuration to the hosts where roles are running. 823 824 @param role_names: Names of the roles to decommission. 825 @return: Reference to the submitted command. 826 """ 827 return self._cmd('deployClientConfig', data=role_names)
828
829 - def disable_hdfs_auto_failover(self, nameservice):
830 """ 831 Disable auto-failover for a highly available HDFS nameservice. 832 This command is no longer supported with API v6 onwards. Use disable_nn_ha instead. 833 834 @param nameservice: Affected nameservice. 835 @return: Reference to the submitted command. 836 """ 837 return self._cmd('hdfsDisableAutoFailover', data=nameservice)
838
839 - def disable_hdfs_ha(self, active_name, secondary_name, 840 start_dependent_services=True, deploy_client_configs=True, 841 disable_quorum_storage=False):
842 """ 843 Disable high availability for an HDFS NameNode. 844 This command is no longer supported with API v6 onwards. Use disable_nn_ha instead. 845 846 @param active_name: Name of the NameNode to keep. 847 @param secondary_name: Name of (existing) SecondaryNameNode to link to 848 remaining NameNode. 849 @param start_dependent_services: whether to re-start dependent services. 850 @param deploy_client_configs: whether to re-deploy client configurations. 851 @param disable_quorum_storage: whether to disable Quorum-based Storage. Available since API v2. 852 Quorum-based Storage will be disabled for all 853 nameservices that have Quorum-based Storage 854 enabled. 855 @return: Reference to the submitted command. 856 """ 857 args = dict( 858 activeName = active_name, 859 secondaryName = secondary_name, 860 startDependentServices = start_dependent_services, 861 deployClientConfigs = deploy_client_configs, 862 ) 863 864 version = self._get_resource_root().version 865 if version < 2: 866 if disable_quorum_storage: 867 raise AttributeError("Quorum-based Storage requires at least API version 2 available in Cloudera Manager 4.1.") 868 else: 869 args['disableQuorumStorage'] = disable_quorum_storage 870 871 return self._cmd('hdfsDisableHa', data=args)
872
873 - def enable_hdfs_auto_failover(self, nameservice, active_fc_name, 874 standby_fc_name, zk_service):
875 """ 876 Enable auto-failover for an HDFS nameservice. 877 This command is no longer supported with API v6 onwards. Use enable_nn_ha instead. 878 879 @param nameservice: Nameservice for which to enable auto-failover. 880 @param active_fc_name: Name of failover controller to create for active node. 881 @param standby_fc_name: Name of failover controller to create for stand-by node. 882 @param zk_service: ZooKeeper service to use. 883 @return: Reference to the submitted command. 884 """ 885 version = self._get_resource_root().version 886 887 args = dict( 888 nameservice = nameservice, 889 activeFCName = active_fc_name, 890 standByFCName = standby_fc_name, 891 zooKeeperService = dict( 892 clusterName = zk_service.clusterRef.clusterName, 893 serviceName = zk_service.name, 894 ), 895 ) 896 return self._cmd('hdfsEnableAutoFailover', data=args)
897
898 - def enable_hdfs_ha(self, active_name, active_shared_path, standby_name, 899 standby_shared_path, nameservice, start_dependent_services=True, 900 deploy_client_configs=True, enable_quorum_storage=False):
901 """ 902 Enable high availability for an HDFS NameNode. 903 This command is no longer supported with API v6 onwards. Use enable_nn_ha instead. 904 905 @param active_name: name of active NameNode. 906 @param active_shared_path: shared edits path for active NameNode. 907 Ignored if Quorum-based Storage is being enabled. 908 @param standby_name: name of stand-by NameNode. 909 @param standby_shared_path: shared edits path for stand-by NameNode. 910 Ignored if Quourm Journal is being enabled. 911 @param nameservice: nameservice for the HA pair. 912 @param start_dependent_services: whether to re-start dependent services. 913 @param deploy_client_configs: whether to re-deploy client configurations. 914 @param enable_quorum_storage: whether to enable Quorum-based Storage. Available since API v2. 915 Quorum-based Storage will be enabled for all 916 nameservices except those configured with NFS High 917 Availability. 918 @return: Reference to the submitted command. 919 """ 920 version = self._get_resource_root().version 921 922 args = dict( 923 activeName = active_name, 924 standByName = standby_name, 925 nameservice = nameservice, 926 startDependentServices = start_dependent_services, 927 deployClientConfigs = deploy_client_configs, 928 ) 929 930 if enable_quorum_storage: 931 if version < 2: 932 raise AttributeError("Quorum-based Storage is not supported prior to Cloudera Manager 4.1.") 933 else: 934 args['enableQuorumStorage'] = enable_quorum_storage 935 else: 936 if active_shared_path is None or standby_shared_path is None: 937 raise AttributeError("Active and standby shared paths must be specified if not enabling Quorum-based Storage") 938 args['activeSharedEditsPath'] = active_shared_path 939 args['standBySharedEditsPath'] = standby_shared_path 940 941 return self._cmd('hdfsEnableHa', data=args)
942
943 - def enable_nn_ha(self, active_name, standby_host_id, nameservice, jns, 944 standby_name_dir_list=None, qj_name=None, standby_name=None, 945 active_fc_name=None, standby_fc_name=None, zk_service_name=None, 946 force_init_znode=True, clear_existing_standby_name_dirs=True, clear_existing_jn_edits_dir=True):
947 """ 948 Enable High Availability (HA) with Auto-Failover for an HDFS NameNode. 949 @param active_name: Name of Active NameNode. 950 @param standby_host_id: ID of host where Standby NameNode will be created. 951 @param nameservice: Nameservice to be used while enabling HA. 952 Optional if Active NameNode already has this config set. 953 @param jns: List of Journal Nodes to be created during the command. 954 Each element of the list must be a dict containing the following keys: 955 - B{jnHostId}: ID of the host where the new JournalNode will be created. 956 - B{jnName}: Name of the JournalNode role (optional) 957 - B{jnEditsDir}: Edits dir of the JournalNode. Can be omitted if the config 958 is already set at RCG level. 959 @param standby_name_dir_list: List of directories for the new Standby NameNode. 960 If not provided then it will use same dirs as Active NameNode. 961 @param qj_name: Name of the journal located on each JournalNodes' filesystem. 962 This can be optionally provided if the config hasn't been already set for the Active NameNode. 963 If this isn't provided and Active NameNode doesn't also have the config, 964 then nameservice is used by default. 965 @param standby_name: Name of the Standby NameNode role to be created (Optional). 966 @param active_fc_name: Name of the Active Failover Controller role to be created (Optional). 967 @param standby_fc_name: Name of the Standby Failover Controller role to be created (Optional). 968 @param zk_service_name: Name of the ZooKeeper service to use for auto-failover. 969 If HDFS service already depends on a ZooKeeper service then that ZooKeeper 970 service will be used for auto-failover and in that case this parameter 971 can either be omitted or should be the same ZooKeeper service. 972 @param force_init_znode: Indicates if the ZNode should be force initialized if it is 973 already present. Useful while re-enabling High Availability. (Default: TRUE) 974 @param clear_existing_standby_name_dirs: Indicates if the existing name directories for Standby NameNode 975 should be cleared during the workflow. 976 Useful while re-enabling High Availability. (Default: TRUE) 977 @param clear_existing_jn_edits_dir: Indicates if the existing edits directories for the JournalNodes 978 for the specified nameservice should be cleared during the workflow. 979 Useful while re-enabling High Availability. (Default: TRUE) 980 @return: Reference to the submitted command. 981 @since: API v6 982 """ 983 args = dict ( 984 activeNnName = active_name, 985 standbyNnName = standby_name, 986 standbyNnHostId = standby_host_id, 987 standbyNameDirList = standby_name_dir_list, 988 nameservice = nameservice, 989 qjName = qj_name, 990 activeFcName = active_fc_name, 991 standbyFcName = standby_fc_name, 992 zkServiceName = zk_service_name, 993 forceInitZNode = force_init_znode, 994 clearExistingStandbyNameDirs = clear_existing_standby_name_dirs, 995 clearExistingJnEditsDir = clear_existing_jn_edits_dir, 996 jns = jns 997 ) 998 return self._cmd('hdfsEnableNnHa', data=args, api_version=6)
999
1000 - def disable_nn_ha(self, active_name, snn_host_id, snn_check_point_dir_list, 1001 snn_name=None):
1002 """ 1003 Disable high availability with automatic failover for an HDFS NameNode. 1004 1005 @param active_name: Name of the NamdeNode role that is going to be active after 1006 High Availability is disabled. 1007 @param snn_host_id: Id of the host where the new SecondaryNameNode will be created. 1008 @param snn_check_point_dir_list : List of directories used for checkpointing 1009 by the new SecondaryNameNode. 1010 @param snn_name: Name of the new SecondaryNameNode role (Optional). 1011 @return: Reference to the submitted command. 1012 @since: API v6 1013 """ 1014 args = dict( 1015 activeNnName = active_name, 1016 snnHostId = snn_host_id, 1017 snnCheckpointDirList = snn_check_point_dir_list, 1018 snnName = snn_name 1019 ) 1020 return self._cmd('hdfsDisableNnHa', data=args, api_version=6)
1021
1022 - def enable_jt_ha(self, new_jt_host_id, force_init_znode=True, zk_service_name=None, 1023 new_jt_name=None, fc1_name=None, fc2_name=None):
1024 """ 1025 Enable high availability for a MR JobTracker. 1026 1027 @param zk_service_name: Name of the ZooKeeper service to use for auto-failover. 1028 If MapReduce service depends on a ZooKeeper service then that ZooKeeper 1029 service will be used for auto-failover and in that case this parameter 1030 can be omitted. 1031 @param new_jt_host_id: id of the host where the second JobTracker 1032 will be added. 1033 @param force_init_znode: Initialize the ZNode used for auto-failover even if 1034 it already exists. This can happen if JobTracker HA 1035 was enabled before and then disabled. Disable operation 1036 doesn't delete this ZNode. Defaults to true. 1037 @param new_jt_name: Name of the second JobTracker role to be created. 1038 @param fc1_name: Name of the Failover Controller role that is co-located with 1039 the existing JobTracker. 1040 @param fc2_name: Name of the Failover Controller role that is co-located with 1041 the new JobTracker. 1042 @return: Reference to the submitted command. 1043 @since: API v5 1044 """ 1045 args = dict( 1046 newJtHostId = new_jt_host_id, 1047 forceInitZNode = force_init_znode, 1048 zkServiceName = zk_service_name, 1049 newJtRoleName = new_jt_name, 1050 fc1RoleName = fc1_name, 1051 fc2RoleName = fc2_name 1052 ) 1053 return self._cmd('enableJtHa', data=args)
1054
1055 - def disable_jt_ha(self, active_name):
1056 """ 1057 Disable high availability for a MR JobTracker active-standby pair. 1058 1059 @param active_name: name of the JobTracker that will be active after 1060 the disable operation. The other JobTracker and 1061 Failover Controllers will be removed. 1062 @return: Reference to the submitted command. 1063 """ 1064 args = dict( 1065 activeName = active_name, 1066 ) 1067 return self._cmd('disableJtHa', data=args)
1068
1069 - def enable_rm_ha(self, new_rm_host_id, zk_service_name=None):
1070 """ 1071 Enable high availability for a YARN ResourceManager. 1072 1073 @param new_rm_host_id: id of the host where the second ResourceManager 1074 will be added. 1075 @param zk_service_name: Name of the ZooKeeper service to use for auto-failover. 1076 If YARN service depends on a ZooKeeper service then that ZooKeeper 1077 service will be used for auto-failover and in that case this parameter 1078 can be omitted. 1079 @return: Reference to the submitted command. 1080 @since: API v6 1081 """ 1082 args = dict( 1083 newRmHostId = new_rm_host_id, 1084 zkServiceName = zk_service_name 1085 ) 1086 return self._cmd('enableRmHa', data=args)
1087
1088 - def disable_rm_ha(self, active_name):
1089 """ 1090 Disable high availability for a YARN ResourceManager active-standby pair. 1091 1092 @param active_name: name of the ResourceManager that will be active after 1093 the disable operation. The other ResourceManager 1094 will be removed. 1095 @return: Reference to the submitted command. 1096 @since: API v6 1097 """ 1098 args = dict( 1099 activeName = active_name 1100 ) 1101 return self._cmd('disableRmHa', data=args)
1102
1103 - def enable_oozie_ha(self, new_oozie_server_host_ids, new_oozie_server_role_names=None, 1104 zk_service_name=None, load_balancer_host_port=None):
1105 """ 1106 Enable high availability for Oozie. 1107 1108 @param new_oozie_server_host_ids: List of IDs of the hosts on which new Oozie Servers 1109 will be added. 1110 @param new_oozie_server_role_names: List of names of the new Oozie Servers. This is an 1111 optional argument, but if provided, it should 1112 match the length of host IDs provided. 1113 @param zk_service_name: Name of the ZooKeeper service that will be used for Oozie HA. 1114 This is an optional parameter if the Oozie to ZooKeeper 1115 dependency is already set. 1116 @param load_balancer_host_port: Address and port of the load balancer used for Oozie HA. 1117 This is an optional parameter if this config is already set. 1118 @return: Reference to the submitted command. 1119 @since: API v6 1120 """ 1121 args = dict( 1122 newOozieServerHostIds = new_oozie_server_host_ids, 1123 newOozieServerRoleNames = new_oozie_server_role_names, 1124 zkServiceName = zk_service_name, 1125 loadBalancerHostPort = load_balancer_host_port 1126 ) 1127 return self._cmd('oozieEnableHa', data=args, api_version=6)
1128
1129 - def disable_oozie_ha(self, active_name):
1130 """ 1131 Disable high availability for Oozie 1132 1133 @param active_name: Name of the Oozie Server that will be active after 1134 High Availability is disabled. 1135 @return: Reference to the submitted command. 1136 @since: API v6 1137 """ 1138 args = dict( 1139 activeName = active_name 1140 ) 1141 return self._cmd('oozieDisableHa', data=args, api_version=6)
1142
1143 - def failover_hdfs(self, active_name, standby_name, force=False):
1144 """ 1145 Initiate a failover of an HDFS NameNode HA pair. 1146 1147 This will make the given stand-by NameNode active, and vice-versa. 1148 1149 @param active_name: name of currently active NameNode. 1150 @param standby_name: name of NameNode currently in stand-by. 1151 @param force: whether to force failover. 1152 @return: Reference to the submitted command. 1153 """ 1154 params = { "force" : "true" and force or "false" } 1155 args = { ApiList.LIST_KEY : [ active_name, standby_name ] } 1156 return self._cmd('hdfsFailover', data=[ active_name, standby_name ], 1157 params = { "force" : "true" and force or "false" })
1158
1159 - def format_hdfs(self, *namenodes):
1160 """ 1161 Format NameNode instances of an HDFS service. 1162 1163 @param namenodes: Name of NameNode instances to format. 1164 @return: List of submitted commands. 1165 """ 1166 return self._role_cmd('hdfsFormat', namenodes)
1167
1168 - def init_hdfs_auto_failover(self, *controllers):
1169 """ 1170 Initialize HDFS failover controller metadata. 1171 1172 Only one controller per nameservice needs to be initialized. 1173 1174 @param controllers: Name of failover controller instances to initialize. 1175 @return: List of submitted commands. 1176 """ 1177 return self._role_cmd('hdfsInitializeAutoFailover', controllers)
1178
1179 - def init_hdfs_shared_dir(self, *namenodes):
1180 """ 1181 Initialize a NameNode's shared edits directory. 1182 1183 @param namenodes: Name of NameNode instances. 1184 @return: List of submitted commands. 1185 """ 1186 return self._role_cmd('hdfsInitializeSharedDir', namenodes)
1187
1188 - def roll_edits_hdfs(self, nameservice=None):
1189 """ 1190 Roll the edits of an HDFS NameNode or Nameservice. 1191 1192 @param nameservice: Nameservice whose edits should be rolled. 1193 Required only with a federated HDFS. 1194 @return: Reference to the submitted command. 1195 @since: API v3 1196 """ 1197 args = dict() 1198 if nameservice: 1199 args['nameservice'] = nameservice 1200 1201 return self._cmd('hdfsRollEdits', data=args)
1202
1203 - def upgrade_hdfs_metadata(self):
1204 """ 1205 Upgrade HDFS Metadata as part of a major version upgrade. 1206 1207 @return: Reference to the submitted command. 1208 @since: API v6 1209 """ 1210 return self._cmd('hdfsUpgradeMetadata', api_version=6)
1211
1212 - def upgrade_hbase(self):
1213 """ 1214 Upgrade HBase data in HDFS and ZooKeeper as part of upgrade from CDH4 to CDH5. 1215 1216 @return: Reference to the submitted command. 1217 @since: API v6 1218 """ 1219 return self._cmd('hbaseUpgrade', api_version=6)
1220
1221 - def create_sqoop_user_dir(self):
1222 """ 1223 Creates the user directory of a Sqoop service in HDFS. 1224 1225 @return: Reference to the submitted command. 1226 @since: API v4 1227 """ 1228 return self._cmd('createSqoopUserDir', api_version=4)
1229
1231 """ 1232 Creates the Sqoop2 Server database tables in the configured database. 1233 Will do nothing if tables already exist. Will not perform an upgrade. 1234 1235 @return: Reference to the submitted command. 1236 @since: API v10 1237 """ 1238 return self._cmd('sqoopCreateDatabaseTables', api_version=10)
1239
1240 - def upgrade_sqoop_db(self):
1241 """ 1242 Upgrade Sqoop Database schema as part of a major version upgrade. 1243 1244 @return: Reference to the submitted command. 1245 @since: API v6 1246 """ 1247 return self._cmd('sqoopUpgradeDb', api_version=6)
1248
1249 - def upgrade_hive_metastore(self):
1250 """ 1251 Upgrade Hive Metastore as part of a major version upgrade. 1252 1253 @return: Reference to the submitted command. 1254 @since: API v6 1255 """ 1256 return self._cmd('hiveUpgradeMetastore', api_version=6)
1257
1258 - def cleanup_zookeeper(self, *servers):
1259 """ 1260 Cleanup a ZooKeeper service or roles. 1261 1262 If no server role names are provided, the command applies to the whole 1263 service, and cleans up all the server roles that are currently running. 1264 1265 @param servers: ZK server role names (optional). 1266 @return: Command reference (for service command) or list of command 1267 references (for role commands). 1268 """ 1269 if servers: 1270 return self._role_cmd('zooKeeperCleanup', servers) 1271 else: 1272 return self._cmd('zooKeeperCleanup')
1273
1274 - def init_zookeeper(self, *servers):
1275 """ 1276 Initialize a ZooKeeper service or roles. 1277 1278 If no server role names are provided, the command applies to the whole 1279 service, and initializes all the configured server roles. 1280 1281 @param servers: ZK server role names (optional). 1282 @return: Command reference (for service command) or list of command 1283 references (for role commands). 1284 """ 1285 if servers: 1286 return self._role_cmd('zooKeeperInit', servers) 1287 else: 1288 return self._cmd('zooKeeperInit')
1289
1290 - def sync_hue_db(self, *servers):
1291 """ 1292 Synchronize the Hue server's database. 1293 1294 @param servers: Name of Hue Server roles to synchronize. Not required starting with API v10. 1295 @return: List of submitted commands. 1296 """ 1297 1298 actual_version = self._get_resource_root().version 1299 if actual_version < 10: 1300 return self._role_cmd('hueSyncDb', servers) 1301 1302 return self._cmd('hueSyncDb', api_version=10)
1303 1304
1305 - def dump_hue_db(self):
1306 """ 1307 Dump the Hue server's database; it can be loaded later. 1308 1309 @return: List of submitted commands. 1310 """ 1311 return self._cmd('hueDumpDb', api_version=10)
1312
1313 - def load_hue_db(self):
1314 """ 1315 Load data into Hue server's database from a previous data dump. 1316 1317 @return: List of submitted commands. 1318 """ 1319 return self._cmd('hueLoadDb', api_version=10)
1320
1321 - def lsof(self, *rolenames):
1322 """ 1323 Run the lsof diagnostic command. This command runs the lsof utility to list 1324 a role's open files. 1325 1326 @param rolenames: Name of the role instances 1327 @return: List of submitted commands. 1328 @since: API v8 1329 """ 1330 return self._role_cmd('lsof', rolenames)
1331
1332 - def jstack(self, *rolenames):
1333 """ 1334 Run the jstack diagnostic command. The command runs the jstack utility to 1335 capture a role's java thread stacks. 1336 1337 @param rolenames: Name of the role instances 1338 @return: List of submitted commands. 1339 @since: API v8 1340 """ 1341 return self._role_cmd('jstack', rolenames)
1342
1343 - def jmap_histo(self, *rolenames):
1344 """ 1345 Run the jmapHisto diagnostic command. The command runs the jmap utility to 1346 capture a histogram of the objects on the role's java heap. 1347 1348 @param rolenames: Name of the role instances 1349 @return: List of submitted commands. 1350 @since: API v8 1351 """ 1352 return self._role_cmd('jmapHisto', rolenames)
1353
1354 - def jmap_dump(self, *rolenames):
1355 """ 1356 Run the jmapDump diagnostic command. The command runs the jmap utility to 1357 capture a dump of the role's java heap. 1358 1359 @param rolenames: Name of the role instances 1360 @return: List of submitted commands. 1361 @since: API v8 1362 """ 1363 return self._role_cmd('jmapDump', rolenames)
1364
1365 - def enter_maintenance_mode(self):
1366 """ 1367 Put the service in maintenance mode. 1368 1369 @return: Reference to the completed command. 1370 @since: API v2 1371 """ 1372 cmd = self._cmd('enterMaintenanceMode') 1373 if cmd.success: 1374 self._update(_get_service(self._get_resource_root(), self._path())) 1375 return cmd
1376
1377 - def exit_maintenance_mode(self):
1378 """ 1379 Take the service out of maintenance mode. 1380 1381 @return: Reference to the completed command. 1382 @since: API v2 1383 """ 1384 cmd = self._cmd('exitMaintenanceMode') 1385 if cmd.success: 1386 self._update(_get_service(self._get_resource_root(), self._path())) 1387 return cmd
1388
1389 - def rolling_restart(self, slave_batch_size=None, 1390 slave_fail_count_threshold=None, 1391 sleep_seconds=None, 1392 stale_configs_only=None, 1393 unupgraded_only=None, 1394 restart_role_types=None, 1395 restart_role_names=None):
1396 """ 1397 Rolling restart the roles of a service. The sequence is: 1398 1. Restart all the non-slave roles 1399 2. If slaves are present restart them in batches of size specified 1400 3. Perform any post-command needed after rolling restart 1401 1402 @param slave_batch_size: Number of slave roles to restart at a time 1403 Must be greater than 0. Default is 1. 1404 For HDFS, this number should be less than the replication factor (default 3) 1405 to ensure data availability during rolling restart. 1406 @param slave_fail_count_threshold: The threshold for number of slave batches that 1407 are allowed to fail to restart before the entire command is considered failed. 1408 Must be >= 0. Default is 0. 1409 @param sleep_seconds: Number of seconds to sleep between restarts of slave role batches. 1410 Must be >=0. Default is 0. 1411 @param stale_configs_only: Restart roles with stale configs only. Default is false. 1412 @param unupgraded_only: Restart roles that haven't been upgraded yet. Default is false. 1413 @param restart_role_types: Role types to restart. If not specified, all startable roles are restarted. 1414 @param restart_role_names: List of specific roles to restart. 1415 If none are specified, then all roles of specified role types are restarted. 1416 @return: Reference to the submitted command. 1417 @since: API v3 1418 """ 1419 args = dict() 1420 if slave_batch_size: 1421 args['slaveBatchSize'] = slave_batch_size 1422 if slave_fail_count_threshold: 1423 args['slaveFailCountThreshold'] = slave_fail_count_threshold 1424 if sleep_seconds: 1425 args['sleepSeconds'] = sleep_seconds 1426 if stale_configs_only: 1427 args['staleConfigsOnly'] = stale_configs_only 1428 if unupgraded_only: 1429 args['unUpgradedOnly'] = unupgraded_only 1430 if restart_role_types: 1431 args['restartRoleTypes'] = restart_role_types 1432 if restart_role_names: 1433 args['restartRoleNames'] = restart_role_names 1434 1435 return self._cmd('rollingRestart', data=args)
1436
1437 - def create_replication_schedule(self, 1438 start_time, end_time, interval_unit, interval, paused, arguments, 1439 alert_on_start=False, alert_on_success=False, alert_on_fail=False, 1440 alert_on_abort=False):
1441 """ 1442 Create a new replication schedule for this service. 1443 1444 The replication argument type varies per service type. The following types 1445 are recognized: 1446 - HDFS: ApiHdfsReplicationArguments 1447 - Hive: ApiHiveReplicationArguments 1448 1449 @type start_time: datetime.datetime 1450 @param start_time: The time at which the schedule becomes active and first executes. 1451 @type end_time: datetime.datetime 1452 @param end_time: The time at which the schedule will expire. 1453 @type interval_unit: str 1454 @param interval_unit: The unit of time the `interval` represents. Ex. MINUTE, HOUR, 1455 DAY. See the server documentation for a full list of values. 1456 @type interval: int 1457 @param interval: The number of time units to wait until triggering the next replication. 1458 @type paused: bool 1459 @param paused: Should the schedule be paused? Useful for on-demand replication. 1460 @param arguments: service type-specific arguments for the replication job. 1461 @param alert_on_start: whether to generate alerts when the job is started. 1462 @param alert_on_success: whether to generate alerts when the job succeeds. 1463 @param alert_on_fail: whether to generate alerts when the job fails. 1464 @param alert_on_abort: whether to generate alerts when the job is aborted. 1465 @return: The newly created schedule. 1466 @since: API v3 1467 """ 1468 schedule = ApiReplicationSchedule(self._get_resource_root(), 1469 startTime=start_time, endTime=end_time, intervalUnit=interval_unit, interval=interval, 1470 paused=paused, alertOnStart=alert_on_start, alertOnSuccess=alert_on_success, 1471 alertOnFail=alert_on_fail, alertOnAbort=alert_on_abort) 1472 1473 if self.type == 'HDFS': 1474 if not isinstance(arguments, ApiHdfsReplicationArguments): 1475 raise TypeError, 'Unexpected type for HDFS replication argument.' 1476 schedule.hdfsArguments = arguments 1477 elif self.type == 'HIVE': 1478 if not isinstance(arguments, ApiHiveReplicationArguments): 1479 raise TypeError, 'Unexpected type for Hive replication argument.' 1480 schedule.hiveArguments = arguments 1481 else: 1482 raise TypeError, 'Replication is not supported for service type ' + self.type 1483 1484 return self._post("replications", ApiReplicationSchedule, True, [schedule], 1485 api_version=3)[0]
1486
1487 - def get_replication_schedules(self):
1488 """ 1489 Retrieve a list of replication schedules. 1490 1491 @return: A list of replication schedules. 1492 @since: API v3 1493 """ 1494 return self._get("replications", ApiReplicationSchedule, True, 1495 api_version=3)
1496
1497 - def get_replication_schedule(self, schedule_id):
1498 """ 1499 Retrieve a single replication schedule. 1500 1501 @param schedule_id: The id of the schedule to retrieve. 1502 @return: The requested schedule. 1503 @since: API v3 1504 """ 1505 return self._get("replications/%d" % schedule_id, ApiReplicationSchedule, 1506 api_version=3)
1507
1508 - def delete_replication_schedule(self, schedule_id):
1509 """ 1510 Delete a replication schedule. 1511 1512 @param schedule_id: The id of the schedule to delete. 1513 @return: The deleted replication schedule. 1514 @since: API v3 1515 """ 1516 return self._delete("replications/%s" % schedule_id, ApiReplicationSchedule, 1517 api_version=3)
1518
1519 - def update_replication_schedule(self, schedule_id, schedule):
1520 """ 1521 Update a replication schedule. 1522 1523 @param schedule_id: The id of the schedule to update. 1524 @param schedule: The modified schedule. 1525 @return: The updated replication schedule. 1526 @since: API v3 1527 """ 1528 return self._put("replications/%s" % schedule_id, ApiReplicationSchedule, 1529 data=schedule, api_version=3)
1530
1531 - def get_replication_command_history(self, schedule_id, limit=20, offset=0, 1532 view=None):
1533 """ 1534 Retrieve a list of commands for a replication schedule. 1535 1536 @param schedule_id: The id of the replication schedule. 1537 @param limit: Maximum number of commands to retrieve. 1538 @param offset: Index of first command to retrieve. 1539 @param view: View to materialize. Valid values are 'full', 'summary', 'export', 'export_redacted'. 1540 @return: List of commands executed for a replication schedule. 1541 @since: API v4 1542 """ 1543 params = { 1544 'limit': limit, 1545 'offset': offset, 1546 } 1547 if view: 1548 params['view'] = view 1549 1550 return self._get("replications/%s/history" % schedule_id, 1551 ApiReplicationCommand, True, params=params, api_version=4)
1552
1553 - def trigger_replication_schedule(self, schedule_id, dry_run=False):
1554 """ 1555 Trigger replication immediately. Start and end dates on the schedule will be 1556 ignored. 1557 1558 @param schedule_id: The id of the schedule to trigger. 1559 @param dry_run: Whether to execute a dry run. 1560 @return: The command corresponding to the replication job. 1561 @since: API v3 1562 """ 1563 return self._post("replications/%s/run" % schedule_id, ApiCommand, 1564 params=dict(dryRun=dry_run), 1565 api_version=3)
1566
1567 - def create_snapshot_policy(self, policy):
1568 """ 1569 Create a new snapshot policy for this service. 1570 @param policy: The snapshot policy to create 1571 @return: The newly created policy. 1572 @since: API v6 1573 """ 1574 return self._post("snapshots/policies", ApiSnapshotPolicy, True, [policy], 1575 api_version=6)[0]
1576
1577 - def get_snapshot_policies(self, view=None):
1578 """ 1579 Retrieve a list of snapshot policies. 1580 1581 @param view: View to materialize. Valid values are 'full', 'summary', 'export', 'export_redacted'. 1582 @return: A list of snapshot policies. 1583 @since: API v6 1584 """ 1585 return self._get("snapshots/policies", ApiSnapshotPolicy, True, 1586 params=view and dict(view=view) or None, api_version=6)
1587
1588 - def get_snapshot_policy(self, name, view=None):
1589 """ 1590 Retrieve a single snapshot policy. 1591 1592 @param name: The name of the snapshot policy to retrieve. 1593 @param view: View to materialize. Valid values are 'full', 'summary', 'export', 'export_redacted'. 1594 @return: The requested snapshot policy. 1595 @since: API v6 1596 """ 1597 return self._get("snapshots/policies/%s" % name, ApiSnapshotPolicy, 1598 params=view and dict(view=view) or None, api_version=6)
1599
1600 - def delete_snapshot_policy(self, name):
1601 """ 1602 Delete a snapshot policy. 1603 1604 @param name: The name of the snapshot policy to delete. 1605 @return: The deleted snapshot policy. 1606 @since: API v6 1607 """ 1608 return self._delete("snapshots/policies/%s" % name, ApiSnapshotPolicy, api_version=6)
1609
1610 - def update_snapshot_policy(self, name, policy):
1611 """ 1612 Update a snapshot policy. 1613 1614 @param name: The name of the snapshot policy to update. 1615 @param policy: The modified snapshot policy. 1616 @return: The updated snapshot policy. 1617 @since: API v6 1618 """ 1619 return self._put("snapshots/policies/%s" % name, ApiSnapshotPolicy, data=policy, 1620 api_version=6)
1621
1622 - def get_snapshot_command_history(self, name, limit=20, offset=0, view=None):
1623 """ 1624 Retrieve a list of commands triggered by a snapshot policy. 1625 1626 @param name: The name of the snapshot policy. 1627 @param limit: Maximum number of commands to retrieve. 1628 @param offset: Index of first command to retrieve. 1629 @param view: View to materialize. Valid values are 'full', 'summary', 'export', 'export_redacted'. 1630 @return: List of commands triggered by a snapshot policy. 1631 @since: API v6 1632 """ 1633 params = { 1634 'limit': limit, 1635 'offset': offset, 1636 } 1637 if view: 1638 params['view'] = view 1639 1640 return self._get("snapshots/policies/%s/history" % name, ApiSnapshotCommand, True, 1641 params=params, api_version=6)
1642 1643
1644 - def install_oozie_sharelib(self):
1645 """ 1646 Installs the Oozie ShareLib. Oozie must be stopped before running this 1647 command. 1648 1649 @return: Reference to the submitted command. 1650 @since: API v3 1651 """ 1652 return self._cmd('installOozieShareLib', api_version=3)
1653
1655 """ 1656 Create the Oozie Server Database. Only works with embedded postgresql 1657 database. This command should usually be followed by a call to 1658 create_oozie_db. 1659 1660 @return: Reference to the submitted command. 1661 @since: API v10 1662 """ 1663 return self._cmd('oozieCreateEmbeddedDatabase', api_version=10)
1664
1665 - def create_oozie_db(self):
1666 """ 1667 Creates the Oozie Database Schema in the configured database. 1668 This command does not create database. This command creates only tables 1669 required by Oozie. To create database, please refer to create_oozie_embedded_database. 1670 1671 @return: Reference to the submitted command. 1672 @since: API v2 1673 """ 1674 return self._cmd('createOozieDb', api_version=2)
1675
1676 - def upgrade_oozie_db(self):
1677 """ 1678 Upgrade Oozie Database schema as part of a major version upgrade. 1679 1680 @return: Reference to the submitted command. 1681 @since: API v6 1682 """ 1683 return self._cmd('oozieUpgradeDb', api_version=6)
1684
1685 - def init_solr(self):
1686 """ 1687 Initializes the Solr service in Zookeeper. 1688 1689 @return: Reference to the submitted command. 1690 @since: API v4 1691 """ 1692 return self._cmd('initSolr', api_version=4)
1693
1694 - def create_solr_hdfs_home_dir(self):
1695 """ 1696 Creates the home directory of a Solr service in HDFS. 1697 1698 @return: Reference to the submitted command. 1699 @since: API v4 1700 """ 1701 return self._cmd('createSolrHdfsHomeDir', api_version=4)
1702
1704 """ 1705 Creates the Hive metastore tables in the configured database. 1706 Will do nothing if tables already exist. Will not perform an upgrade. 1707 1708 @return: Reference to the submitted command. 1709 @since: API v3 1710 """ 1711 return self._cmd('hiveCreateMetastoreDatabaseTables', api_version=3)
1712
1713 - def create_hive_warehouse(self):
1714 """ 1715 Creates the Hive warehouse directory in HDFS. 1716 1717 @return: Reference to the submitted command. 1718 @since: API v3 1719 """ 1720 return self._cmd('hiveCreateHiveWarehouse')
1721
1722 - def create_hive_userdir(self):
1723 """ 1724 Creates the Hive user directory in HDFS. 1725 1726 @return: Reference to the submitted command. 1727 @since: API v4 1728 """ 1729 return self._cmd('hiveCreateHiveUserDir')
1730
1732 """ 1733 Create the Hive Metastore Database. Only works with embedded postgresql 1734 database. This command should usually be followed by a call to 1735 create_hive_metastore_tables. 1736 1737 @return: Reference to the submitted command. 1738 @since: API v4 1739 """ 1740 return self._cmd('hiveCreateMetastoreDatabase', api_version=4)
1741
1742 - def create_sentry_database(self):
1743 """ 1744 Create the Sentry Server Database. Only works with embedded postgresql 1745 database. This command should usually be followed by a call to 1746 create_sentry_database_tables. 1747 1748 @return: Reference to the submitted command. 1749 @since: API v7 1750 """ 1751 return self._cmd('sentryCreateDatabase', api_version=7)
1752
1754 """ 1755 Creates the Sentry Server database tables in the configured database. 1756 Will do nothing if tables already exist. Will not perform an upgrade. 1757 1758 @return: Reference to the submitted command. 1759 @since: API v7 1760 """ 1761 return self._cmd('sentryCreateDatabaseTables', api_version=7)
1762
1764 """ 1765 Upgrades the Sentry Server database tables in the configured database. 1766 1767 @return: Reference to the submitted command. 1768 @since: API v8 1769 """ 1770 return self._cmd('sentryUpgradeDatabaseTables', api_version=8)
1771
1772 - def update_metastore_namenodes(self):
1773 """ 1774 Update Hive Metastore to point to a NameNode's Nameservice name instead of 1775 hostname. Only available when all Hive Metastore Servers are stopped and 1776 HDFS has High Availability. 1777 1778 Back up the Hive Metastore Database before running this command. 1779 1780 @return: Reference to the submitted command. 1781 @since: API v4 1782 """ 1783 return self._cmd('hiveUpdateMetastoreNamenodes', api_version=4)
1784
1786 """ 1787 Import MapReduce configuration into Yarn, overwriting Yarn configuration. 1788 1789 You will lose existing Yarn configuration. Read all MapReduce 1790 configuration, role assignments, and role configuration groups and update 1791 Yarn with corresponding values. MR1 configuration will be converted into 1792 the equivalent MR2 configuration. 1793 1794 Before running this command, Yarn must be stopped and MapReduce must exist 1795 with valid configuration. 1796 1797 @return: Reference to the submitted command. 1798 @since: API v6 1799 """ 1800 return self._cmd('importMrConfigsIntoYarn', api_version=6)
1801
1802 - def switch_to_mr2(self):
1803 """ 1804 Change the cluster to use MR2 instead of MR1. Services will be restarted. 1805 1806 Will perform the following steps: 1807 * Update all services that depend on MapReduce to instead depend on Yarn. 1808 * Stop MapReduce 1809 * Start Yarn (includes MR2) 1810 * Deploy Yarn (MR2) Client Configuration 1811 1812 Available since API v6. 1813 1814 @return: Reference to the submitted command. 1815 @since: API v6 1816 """ 1817 return self._cmd('switchToMr2', api_version=6)
1818
1819 - def finalize_rolling_upgrade(self):
1820 """ 1821 Finalizes the rolling upgrade for HDFS by updating the NameNode 1822 metadata permanently to the next version. Should be done after 1823 doing a rolling upgrade to a CDH version >= 5.2.0. 1824 1825 @return: Reference to the submitted command. 1826 @since: API v8 1827 """ 1828 return self._cmd('hdfsFinalizeRollingUpgrade', api_version=8)
1829
1830 - def role_command_by_name(self, command_name, *role_names):
1831 """ 1832 Executes a role command by name on the specified 1833 roles 1834 1835 @param command_name: The name of the command. 1836 @param role_names: The role names to execute this command on. 1837 @return: Reference to the submitted command. 1838 @since: API v6 1839 """ 1840 return self._role_cmd(command_name, role_names, api_version=6)
1841
1842 - def service_command_by_name(self, command_name):
1843 """ 1844 Executes a command on the service specified 1845 by name. 1846 1847 @param command_name: The name of the command. 1848 @return: Reference to the submitted command. 1849 @since: API v6 1850 """ 1851 return self._cmd(command_name, api_version=6)
1852
1853 - def list_commands_by_name(self):
1854 """ 1855 Lists all the commands that can be executed by name 1856 on the provided service. 1857 1858 @return: A list of command metadata objects 1859 @since: API v6 1860 """ 1861 return self._get("commandsByName", ApiCommandMetadata, True, 1862 api_version=6)
1863
1864 -class ApiServiceSetupInfo(ApiService):
1865 _ATTRIBUTES = { 1866 'name' : None, 1867 'type' : None, 1868 'config' : Attr(ApiConfig), 1869 'roles' : Attr(roles.ApiRole), 1870 } 1871
1872 - def __init__(self, name=None, type=None, 1873 config=None, roles=None):
1874 # The BaseApiObject expects a resource_root, which we don't care about 1875 resource_root = None 1876 # Unfortunately, the json key is called "type". So our input arg 1877 # needs to be called "type" as well, despite it being a python keyword. 1878 BaseApiObject.init(self, None, locals())
1879
1880 - def set_config(self, config):
1881 """ 1882 Set the service configuration. 1883 1884 @param config: A dictionary of config key/value 1885 """ 1886 if self.config is None: 1887 self.config = { } 1888 self.config.update(config_to_api_list(config))
1889
1890 - def add_role_type_info(self, role_type, config):
1891 """ 1892 Add a role type setup info. 1893 1894 @param role_type: Role type 1895 @param config: A dictionary of role type configuration 1896 """ 1897 rt_config = config_to_api_list(config) 1898 rt_config['roleType'] = role_type 1899 1900 if self.config is None: 1901 self.config = { } 1902 if not self.config.has_key(ROLETYPES_CFG_KEY): 1903 self.config[ROLETYPES_CFG_KEY] = [ ] 1904 self.config[ROLETYPES_CFG_KEY].append(rt_config)
1905
1906 - def add_role_info(self, role_name, role_type, host_id, config=None):
1907 """ 1908 Add a role info. The role will be created along with the service setup. 1909 1910 @param role_name: Role name 1911 @param role_type: Role type 1912 @param host_id: The host where the role should run 1913 @param config: (Optional) A dictionary of role config values 1914 """ 1915 if self.roles is None: 1916 self.roles = [ ] 1917 api_config_list = config is not None and config_to_api_list(config) or None 1918 self.roles.append({ 1919 'name' : role_name, 1920 'type' : role_type, 1921 'hostRef' : { 'hostId' : host_id }, 1922 'config' : api_config_list })
1923
1924 - def first_run(self):
1925 """ 1926 Prepare and start this service. 1927 Perform all the steps needed to prepare and start this service. 1928 1929 @return: Reference to the submitted command. 1930 @since: API v7 1931 """ 1932 return self._cmd('firstRun', None, api_version=7)
1933