1   
   2   
   3   
   4   
   5   
   6   
   7   
   8   
   9   
  10   
  11   
  12   
  13   
  14   
  15   
  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   
  58   
  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   
  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   
  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      'roleInstancesUrl'            : ROAttr(), 
  97      'maintenanceMode'             : ROAttr(), 
  98      'maintenanceOwners'           : ROAttr(), 
  99      'entityStatus'                : ROAttr(), 
 100    } 
 101   
 102 -  def __init__(self, resource_root, name=None, type=None): 
  104   
 106      return "<ApiService>: %s (cluster: %s)" % ( 
 107          self.name, self._get_cluster_name()) 
  108   
 110      if hasattr(self, 'clusterRef') and self.clusterRef: 
 111        return self.clusterRef.clusterName 
 112      return None 
  113   
 115      """ 
 116      Return the API path for this service. 
 117   
 118      This method assumes that lack of a cluster reference means that the 
 119      object refers to the Cloudera Management Services instance. 
 120      """ 
 121      if self._get_cluster_name(): 
 122        return SERVICE_PATH % (self._get_cluster_name(), self.name) 
 123      else: 
 124        return '/cm/service' 
  125   
 126 -  def _role_cmd(self, cmd, roles, api_version=1): 
  129   
 131      """ 
 132      Parse a json-decoded ApiServiceConfig dictionary into a 2-tuple. 
 133   
 134      @param json_dic: The json dictionary with the config data. 
 135      @param view: View to materialize. 
 136      @return: 2-tuple (service config dictionary, role type configurations) 
 137      """ 
 138      svc_config = json_to_config(json_dic, view == 'full') 
 139      rt_configs = { } 
 140      if json_dic.has_key(ROLETYPES_CFG_KEY): 
 141        for rt_config in json_dic[ROLETYPES_CFG_KEY]: 
 142          rt_configs[rt_config['roleType']] = \ 
 143              json_to_config(rt_config, view == 'full') 
 144   
 145      return (svc_config, rt_configs) 
  146   
 148      """ 
 149      Retrieve a list of running commands for this service. 
 150   
 151      @param view: View to materialize ('full' or 'summary') 
 152      @return: A list of running commands. 
 153      """ 
 154      return self._get("commands", ApiCommand, True, 
 155          params = view and dict(view=view) or None) 
  156   
 159   
 161      return self._get("activities", ApiActivity, True, 
 162          params=query_str and dict(query=query_str) or dict()) 
  163   
 166   
 168      """ 
 169      Returns a list of directories being watched by the Reports Manager. 
 170   
 171      @return: A list of directories being watched 
 172      @since: API v14 
 173      """ 
 174      return self._get("watcheddir", ApiWatchedDir, ret_is_list=True, api_version=14) 
  175   
 177      """ 
 178      Adds a directory to the watching list. 
 179   
 180      @param dir_path: The path of the directory to be added to the watching list 
 181      @return: The added directory, or null if failed 
 182      @since: API v14 
 183      """ 
 184      req = ApiWatchedDir(self._get_resource_root(), path=dir_path) 
 185      return self._post("watcheddir", ApiWatchedDir, data=req, api_version=14) 
  186   
 188      """ 
 189      Removes a directory from the watching list. 
 190   
 191      @param dir_path: The path of the directory to be removed from the watching list 
 192      @return: The removed directory, or null if failed 
 193      @since: API v14 
 194      """ 
 195      return self._delete("watcheddir/%s" % dir_path, ApiWatchedDir, api_version=14) 
  196   
 197 -  def get_impala_queries(self, start_time, end_time, filter_str="", limit=100, 
 198       offset=0): 
  199      """ 
 200      Returns a list of queries that satisfy the filter 
 201   
 202      @type start_time: datetime.datetime. Note that the datetime must either be 
 203                        time zone aware or specified in the server time zone. See 
 204                        the python datetime documentation for more details about 
 205                        python's time zone handling. 
 206      @param start_time: Queries must have ended after this time 
 207      @type end_time: datetime.datetime. Note that the datetime must either be 
 208                      time zone aware or specified in the server time zone. See 
 209                      the python datetime documentation for more details about 
 210                      python's time zone handling. 
 211      @param end_time: Queries must have started before this time 
 212      @param filter_str: A filter to apply to the queries. For example: 
 213                         'user = root and queryDuration > 5s' 
 214      @param limit: The maximum number of results to return 
 215      @param offset: The offset into the return list 
 216      @since: API v4 
 217      """ 
 218      params = { 
 219        'from':   start_time.isoformat(), 
 220        'to':     end_time.isoformat(), 
 221        'filter': filter_str, 
 222        'limit':  limit, 
 223        'offset': offset, 
 224      } 
 225      return self._get("impalaQueries", ApiImpalaQueryResponse, 
 226          params=params, api_version=4) 
  227   
 229      """ 
 230      Cancel the query. 
 231   
 232      @param query_id: The query ID 
 233      @return: The warning message, if any. 
 234      @since: API v4 
 235      """ 
 236      return self._post("impalaQueries/%s/cancel" % query_id, 
 237          ApiImpalaCancelResponse, api_version=4) 
  238   
 240      """ 
 241      Get the query details 
 242   
 243      @param query_id: The query ID 
 244      @param format: The format of the response ('text' or 'thrift_encoded') 
 245      @return: The details text 
 246      @since: API v4 
 247      """ 
 248      return self._get("impalaQueries/" + query_id, ApiImpalaQueryDetailsResponse, 
 249          params=dict(format=format), api_version=4) 
  250   
 252      """ 
 253      Returns the list of all attributes that the Service Monitor can associate 
 254      with Impala queries. 
 255   
 256      Examples of attributes include the user who issued the query and the 
 257      number of HDFS bytes read by the query. 
 258   
 259      These attributes can be used to search for specific Impala queries through 
 260      the get_impala_queries API. For example the 'user' attribute could be used 
 261      in the search 'user = root'. If the attribute is numeric it can also be used 
 262      as a metric in a tsquery (ie, 'select hdfs_bytes_read from IMPALA_QUERIES'). 
 263   
 264      Note that this response is identical for all Impala services. 
 265   
 266      @return: A list of the Impala query attributes 
 267      @since API v6 
 268      """ 
 269      return self._get("impalaQueries/attributes", ApiImpalaQueryAttribute, 
 270          ret_is_list=True, api_version=6) 
  271   
 273      """ 
 274      Create the Impala Catalog Database. Only works with embedded postgresql 
 275      database. This command should usually be followed by a call to 
 276      create_impala_catalog_database_tables. 
 277   
 278      @return: Reference to the submitted command. 
 279      @since: API v6 
 280      """ 
 281      return self._cmd('impalaCreateCatalogDatabase', api_version=6) 
  282   
 284      """ 
 285      Creates the Impala Catalog Database tables in the configured database. 
 286      Will do nothing if tables already exist. Will not perform an upgrade. 
 287   
 288      @return: Reference to the submitted command. 
 289      @since: API v6 
 290      """ 
 291      return self._cmd('impalaCreateCatalogDatabaseTables', api_version=6) 
  292   
 294      """ 
 295      Create the Impala user directory 
 296   
 297      @return: Reference to submitted command. 
 298      @since: API v6 
 299      """ 
 300      return self._cmd('impalaCreateUserDir', api_version=6) 
  301   
 302 -  def enable_llama_rm(self, llama1_host_id, llama1_role_name=None, 
 303                        llama2_host_id=None, llama2_role_name=None, 
 304                        zk_service_name=None, skip_restart=False): 
  305      """ 
 306      Enable Llama-based resource management for Impala. 
 307   
 308      This command only applies to CDH 5.1+ Impala services. 
 309   
 310      This command configures YARN and Impala for Llama resource management, 
 311      and then creates one or two Llama roles, as specified by the parameters. 
 312      When two Llama roles are created, they are configured as an active-standby 
 313      pair. Auto-failover from active to standby Llama will be enabled using 
 314      ZooKeeper. 
 315   
 316      If optional role name(s) are specified, the new Llama role(s) will be 
 317      named accordingly; otherwise, role name(s) will be automatically generated. 
 318   
 319      By default, YARN, Impala, and any dependent services will be restarted, 
 320      and client configuration will be re-deployed across the cluster. These 
 321      default actions may be suppressed. 
 322   
 323      In order to enable Llama resource management, a YARN service must be 
 324      present in the cluster, and Cgroup-based resource management must be 
 325      enabled for all hosts with NodeManager roles. If these preconditions 
 326      are not met, the command will fail. 
 327   
 328      @param llama1_host_id: id of the host where the first Llama role will 
 329                             be created. 
 330      @param llama1_role_name: Name of the first Llama role. If omitted, a 
 331                               name will be generated automatically. 
 332      @param llama2_host_id: id of the host where the second Llama role will 
 333                             be created. If omitted, only one Llama role will 
 334                             be created (i.e., high availability will not be 
 335                             enabled). 
 336      @param llama2_role_name: Name of the second Llama role. If omitted, a 
 337                               name will be generated automatically. 
 338      @param zk_service_name: Name of the ZooKeeper service to use for 
 339                              auto-failover. Only relevant when enabling 
 340                              Llama RM in HA mode (i.e., when creating two 
 341                              Llama roles). If Impala's ZooKeeper dependency 
 342                              is already set, then that ZooKeeper service will 
 343                              be used for auto-failover, and this parameter 
 344                              may be omitted. 
 345      @param skip_restart: true to skip the restart of Yarn, Impala, and 
 346                           their dependent services, and to skip deployment 
 347                           of client configuration. Default is False (i.e., 
 348                           by default dependent services are restarted and 
 349                           client configuration is deployed). 
 350      @return: Reference to the submitted command. 
 351      @since: API v8 
 352      """ 
 353      args = dict( 
 354        llama1HostId = llama1_host_id, 
 355        llama1RoleName = llama1_role_name, 
 356        llama2HostId = llama2_host_id, 
 357        llama2RoleName = llama2_role_name, 
 358        zkServiceName = zk_service_name, 
 359        skipRestart = skip_restart 
 360      ) 
 361      return self._cmd('impalaEnableLlamaRm', data=args, api_version=8) 
  362   
 364      """ 
 365      Disable Llama-based resource management for Impala. 
 366   
 367      This command only applies to CDH 5.1+ Impala services. 
 368   
 369      This command disables resource management for Impala by removing all 
 370      Llama roles present in the Impala service. Any services that depend 
 371      on the Impala service being modified are restarted by the command, 
 372      and client configuration is deployed for all services of the cluster. 
 373   
 374      @return: Reference to the submitted command. 
 375      @since: API v8 
 376      """ 
 377      return self._cmd('impalaDisableLlamaRm', api_version=8) 
  378   
 379 -  def enable_llama_ha(self, new_llama_host_id, zk_service_name=None, 
 380                        new_llama_role_name=None): 
  381      """ 
 382      Enable high availability for an Impala Llama ApplicationMaster. 
 383   
 384      This command only applies to CDH 5.1+ Impala services. 
 385   
 386      @param new_llama_host_id: id of the host where the second Llama role 
 387                                will be added. 
 388      @param zk_service_name: Name of the ZooKeeper service to use for 
 389                              auto-failover. If Impala's ZooKeeper dependency 
 390                              is already set, then that ZooKeeper service will 
 391                              be used for auto-failover, and this parameter 
 392                              may be omitted. 
 393      @param new_llama_role_name: Name of the new Llama role. If omitted, a 
 394                                  name will be generated automatically. 
 395      @return: Reference to the submitted command. 
 396      @since: API v8 
 397      """ 
 398      args = dict( 
 399        newLlamaHostId = new_llama_host_id, 
 400        zkServiceName = zk_service_name, 
 401        newLlamaRoleName = new_llama_role_name 
 402      ) 
 403      return self._cmd('impalaEnableLlamaHa', data=args, api_version=8) 
  404   
 406      """ 
 407      Disable high availability for an Impala Llama active-standby pair. 
 408   
 409      This command only applies to CDH 5.1+ Impala services. 
 410   
 411      @param active_name: name of the Llama role that will be active after 
 412                          the disable operation. The other Llama role will 
 413                          be removed. 
 414   
 415      @return: Reference to the submitted command. 
 416      @since: API v8 
 417      """ 
 418      args = dict( 
 419        activeName = active_name 
 420      ) 
 421      return self._cmd('impalaDisableLlamaHa', data=args, api_version=8) 
  422   
 425      """ 
 426      Returns a list of YARN applications that satisfy the filter 
 427      @type start_time: datetime.datetime. Note that the datetime must either be 
 428                        time zone aware or specified in the server time zone. See 
 429                        the python datetime documentation for more details about 
 430                        python's time zone handling. 
 431      @param start_time: Applications must have ended after this time 
 432      @type end_time: datetime.datetime. Note that the datetime must either be 
 433                      time zone aware or specified in the server time zone. See 
 434                      the python datetime documentation for more details about 
 435                      python's time zone handling. 
 436      @param filter_str: A filter to apply to the applications. For example: 
 437                         'user = root and applicationDuration > 5s' 
 438      @param limit: The maximum number of results to return 
 439      @param offset: The offset into the return list 
 440      @since: API v6 
 441      """ 
 442      params = { 
 443        'from':   start_time.isoformat(), 
 444        'to':     end_time.isoformat(), 
 445        'filter': filter_str, 
 446        'limit':  limit, 
 447        'offset': offset 
 448      } 
 449      return self._get("yarnApplications", ApiYarnApplicationResponse, 
 450          params=params, api_version=6) 
  451   
 453      """ 
 454      Kills the application. 
 455   
 456      @return: The warning message, if any. 
 457      @since: API v6 
 458      """ 
 459      return self._post("yarnApplications/%s/kill" % (application_id, ), 
 460          ApiYarnKillResponse, api_version=6) 
  461   
 463      """ 
 464      Returns the list of all attributes that the Service Monitor can associate 
 465      with YARN applications. 
 466   
 467      Examples of attributes include the user who ran the application and the 
 468      number of maps completed by the application. 
 469   
 470      These attributes can be used to search for specific YARN applications through 
 471      the get_yarn_applications API. For example the 'user' attribute could be used 
 472      in the search 'user = root'. If the attribute is numeric it can also be used 
 473      as a metric in a tsquery (ie, 'select maps_completed from YARN_APPLICATIONS'). 
 474   
 475      Note that this response is identical for all YARN services. 
 476   
 477      @return: A list of the YARN application attributes 
 478      @since API v6 
 479      """ 
 480      return self._get("yarnApplications/attributes", ApiYarnApplicationAttribute, 
 481          ret_is_list=True, api_version=6) 
  482   
 484      """ 
 485      Create the Yarn job history directory. 
 486   
 487      @return: Reference to submitted command. 
 488      @since: API v6 
 489      """ 
 490      return self._cmd('yarnCreateJobHistoryDirCommand', api_version=6) 
  491   
 493      """ 
 494      Create the Yarn NodeManager remote application log directory. 
 495   
 496      @return: Reference to submitted command. 
 497      @since: API v6 
 498      """ 
 499      return self._cmd('yarnNodeManagerRemoteAppLogDirCommand', api_version=6) 
  500   
 502      """ 
 503      DEPRECATED: use create_yarn_application_diagnostics_bundle on the Yarn service. Deprecated since v10. 
 504   
 505      Collects the Diagnostics data for Yarn applications. 
 506   
 507      @param application_ids: An array of strings containing the ids of the 
 508                              yarn applications. 
 509      @return: Reference to the submitted command. 
 510      @since: API v8 
 511      """ 
 512      args = dict(applicationIds = application_ids) 
 513      return self._cmd('yarnApplicationDiagnosticsCollection', api_version=8, data=args) 
  514   
 516      """ 
 517      Collects the Diagnostics data for Yarn applications. 
 518   
 519      @param application_ids: An array of strings containing the ids of the 
 520                              yarn applications. 
 521      @param ticket_number: If applicable, the support ticket number of the issue 
 522                            being experienced on the cluster. 
 523      @param comments: Additional comments 
 524      @return: Reference to the submitted command. 
 525      @since: API v10 
 526      """ 
 527      args = dict(applicationIds = application_ids, 
 528                  ticketNumber = ticket_number, 
 529                  comments = comments) 
 530   
 531      return self._cmd('yarnApplicationDiagnosticsCollection', api_version=10, data=args) 
  532   
 534      """ 
 535      Retrieve the service's configuration. 
 536   
 537      Retrieves both the service configuration and role type configuration 
 538      for each of the service's supported role types. The role type 
 539      configurations are returned as a dictionary, whose keys are the 
 540      role type name, and values are the respective configuration dictionaries. 
 541   
 542      The 'summary' view contains strings as the dictionary values. The full 
 543      view contains ApiConfig instances as the values. 
 544   
 545      @param view: View to materialize ('full' or 'summary') 
 546      @return: 2-tuple (service config dictionary, role type configurations) 
 547      """ 
 548      path = self._path() + '/config' 
 549      resp = self._get_resource_root().get(path, 
 550          params = view and dict(view=view) or None) 
 551      return self._parse_svc_config(resp, view) 
  552   
 554      """ 
 555      Update the service's configuration. 
 556   
 557      @param svc_config: Dictionary with service configuration to update. 
 558      @param rt_configs: Dict of role type configurations to update. 
 559      @return: 2-tuple (service config dictionary, role type configurations) 
 560      """ 
 561      path = self._path() + '/config' 
 562   
 563      if svc_config: 
 564        data = config_to_api_list(svc_config) 
 565      else: 
 566        data = { } 
 567      if rt_configs: 
 568        rt_list = [ ] 
 569        for rt, cfg in rt_configs.iteritems(): 
 570          rt_data = config_to_api_list(cfg) 
 571          rt_data['roleType'] = rt 
 572          rt_list.append(rt_data) 
 573        data[ROLETYPES_CFG_KEY] = rt_list 
 574   
 575      resp = self._get_resource_root().put(path, data = json.dumps(data)) 
 576      return self._parse_svc_config(resp) 
  577   
 579      """ 
 580      Create a role. 
 581   
 582      @param role_name: Role name 
 583      @param role_type: Role type 
 584      @param host_id: ID of the host to assign the role to 
 585      @return: An ApiRole object 
 586      """ 
 587      return roles.create_role(self._get_resource_root(), self.name, role_type, 
 588          role_name, host_id, self._get_cluster_name()) 
  589   
 599   
 609   
 619   
 621      """ 
 622      Get all roles of a certain type in a service. 
 623   
 624      @param role_type: Role type 
 625      @param view: View to materialize ('full' or 'summary') 
 626      @return: A list of ApiRole objects. 
 627      """ 
 628      return roles.get_roles_by_type(self._get_resource_root(), self.name, 
 629          role_type, self._get_cluster_name(), view) 
  630   
 632      """ 
 633      Get a list of role types in a service. 
 634   
 635      @return: A list of role types (strings) 
 636      """ 
 637      resp = self._get_resource_root().get(self._path() + '/roleTypes') 
 638      return resp[ApiList.LIST_KEY] 
  639   
 649   
 660   
 662      """ 
 663      Create a role config group. 
 664   
 665      @param name: The name of the new group. 
 666      @param display_name: The display name of the new group. 
 667      @param role_type: The role type of the new group. 
 668      @return: New ApiRoleConfigGroup object. 
 669      @since: API v3 
 670      """ 
 671      return role_config_groups.create_role_config_group( 
 672          self._get_resource_root(), self.name, name, display_name, role_type, 
 673          self._get_cluster_name()) 
  674   
 687   
 698   
 699 -  def get_metrics(self, from_time=None, to_time=None, metrics=None, view=None): 
  700      """ 
 701      This endpoint is not supported as of v6. Use the timeseries API 
 702      instead. To get all metrics for a service with the timeseries API use 
 703      the query: 
 704   
 705      'select * where serviceName = $SERVICE_NAME'. 
 706   
 707      To get specific metrics for a service use a comma-separated list of 
 708      the metric names as follows: 
 709   
 710      'select $METRIC_NAME1, $METRIC_NAME2 where serviceName = $SERVICE_NAME'. 
 711   
 712      For more information see http://tiny.cloudera.com/tsquery_doc 
 713   
 714      Retrieve metric readings for the service. 
 715      @param from_time: A datetime; start of the period to query (optional). 
 716      @param to_time: A datetime; end of the period to query (default = now). 
 717      @param metrics: List of metrics to query (default = all). 
 718      @param view: View to materialize ('full' or 'summary') 
 719      @return: List of metrics and their readings. 
 720      """ 
 721      return self._get_resource_root().get_metrics(self._path() + '/metrics', 
 722          from_time, to_time, metrics, view) 
  723   
 725      """ 
 726      Start a service. 
 727   
 728      @return: Reference to the submitted command. 
 729      """ 
 730      return self._cmd('start') 
  731   
 733      """ 
 734      Stop a service. 
 735   
 736      @return: Reference to the submitted command. 
 737      """ 
 738      return self._cmd('stop') 
  739   
 741      """ 
 742      Restart a service. 
 743   
 744      @return: Reference to the submitted command. 
 745      """ 
 746      return self._cmd('restart') 
  747   
 749      """ 
 750      Start a list of roles. 
 751   
 752      @param role_names: names of the roles to start. 
 753      @return: List of submitted commands. 
 754      """ 
 755      return self._role_cmd('start', role_names) 
  756   
 758      """ 
 759      Stop a list of roles. 
 760   
 761      @param role_names: names of the roles to stop. 
 762      @return: List of submitted commands. 
 763      """ 
 764      return self._role_cmd('stop', role_names) 
  765   
 767      """ 
 768      Restart a list of roles. 
 769   
 770      @param role_names: names of the roles to restart. 
 771      @return: List of submitted commands. 
 772      """ 
 773      return self._role_cmd('restart', role_names) 
  774   
 776      """ 
 777      Bootstrap HDFS stand-by NameNodes. 
 778   
 779      Initialize their state by syncing it with the respective HA partner. 
 780   
 781      @param role_names: NameNodes to bootstrap. 
 782      @return: List of submitted commands. 
 783      """ 
 784      return self._role_cmd('hdfsBootstrapStandBy', role_names) 
  785   
 796   
 798      """ 
 799      DEPRECATED: use create_hive_warehouse on the Hive service. Deprecated since v3. 
 800   
 801      Create the Beeswax role's warehouse for a Hue service. 
 802   
 803      @return: Reference to the submitted command. 
 804      """ 
 805      return self._cmd('hueCreateHiveWarehouse') 
  806   
 808      """ 
 809      Create the root directory of an HBase service. 
 810   
 811      @return: Reference to the submitted command. 
 812      """ 
 813      return self._cmd('hbaseCreateRoot') 
  814   
 816      """ 
 817      Create the /tmp directory in HDFS with appropriate ownership and permissions. 
 818   
 819      @return: Reference to the submitted command 
 820      @since: API v2 
 821      """ 
 822      return self._cmd('hdfsCreateTmpDir') 
  823   
 825      """ 
 826      Execute the "refresh" command on a set of roles. 
 827   
 828      @param role_names: Names of the roles to refresh. 
 829      @return: Reference to the submitted command. 
 830      """ 
 831      return self._role_cmd('refresh', role_names) 
  832   
 834      """ 
 835      Decommission roles in a service. 
 836   
 837      @param role_names: Names of the roles to decommission. 
 838      @return: Reference to the submitted command. 
 839      """ 
 840      return self._cmd('decommission', data=role_names) 
  841   
 842 -  def offline(self, *role_names, **options): 
  843      """ 
 844      Offline roles in a service. 
 845   
 846      @param role_names: List of names of the roles to offline. 
 847      @param options: Dictionary of options. The following are recognized: 
 848          timeout - Offline timeout in seconds. 
 849                    Specify to override the default offline timeout of 4 hours. 
 850      @return: Reference to the submitted command. 
 851      @since: API v17 
 852      """ 
 853      timeout = options.pop("timeout", None) 
 854      return self._cmd('offline', data=role_names, 
 855          params=timeout and dict(timeout=timeout) or dict(), 
 856          api_version=17) 
  857   
 859      """ 
 860      Recommission roles in a service. 
 861   
 862      @param role_names: Names of the roles to recommission. 
 863      @return: Reference to the submitted command. 
 864      @since: API v2 
 865      """ 
 866      return self._cmd('recommission', data=role_names) 
  867   
 869      """ 
 870      Recommission roles in a service. Roles are started before recommissioning. 
 871   
 872      Warning: Evolving. This method may change in the future and does not offer 
 873      standard compatibility guarantees. 
 874      Only support by HDFS. 
 875      Do not use without guidance from Cloudera. 
 876   
 877      @param role_names: Names of the roles to recommission. 
 878      @return: Reference to the submitted command. 
 879      @since: API v15 
 880      """ 
 881      return self._cmd('recommissionWithStart', data=role_names, api_version=15) 
  882   
 884      """ 
 885      Deploys client configuration to the hosts where roles are running. 
 886   
 887      @param role_names: Names of the roles to decommission. 
 888      @return: Reference to the submitted command. 
 889      """ 
 890      return self._cmd('deployClientConfig', data=role_names) 
  891   
 893      """ 
 894      Disable auto-failover for a highly available HDFS nameservice. 
 895      This command is no longer supported with API v6 onwards. Use disable_nn_ha instead. 
 896   
 897      @param nameservice: Affected nameservice. 
 898      @return: Reference to the submitted command. 
 899      """ 
 900      return self._cmd('hdfsDisableAutoFailover', data=nameservice) 
  901   
 902 -  def disable_hdfs_ha(self, active_name, secondary_name, 
 903        start_dependent_services=True, deploy_client_configs=True, 
 904                        disable_quorum_storage=False): 
  905      """ 
 906      Disable high availability for an HDFS NameNode. 
 907      This command is no longer supported with API v6 onwards. Use disable_nn_ha instead. 
 908   
 909      @param active_name: Name of the NameNode to keep. 
 910      @param secondary_name: Name of (existing) SecondaryNameNode to link to 
 911                             remaining NameNode. 
 912      @param start_dependent_services: whether to re-start dependent services. 
 913      @param deploy_client_configs: whether to re-deploy client configurations. 
 914      @param disable_quorum_storage: whether to disable Quorum-based Storage. Available since API v2. 
 915                                     Quorum-based Storage will be disabled for all 
 916                                     nameservices that have Quorum-based Storage 
 917                                     enabled. 
 918      @return: Reference to the submitted command. 
 919      """ 
 920      args = dict( 
 921        activeName = active_name, 
 922        secondaryName = secondary_name, 
 923        startDependentServices = start_dependent_services, 
 924        deployClientConfigs = deploy_client_configs, 
 925      ) 
 926   
 927      version = self._get_resource_root().version 
 928      if version < 2: 
 929        if disable_quorum_storage: 
 930          raise AttributeError("Quorum-based Storage requires at least API version 2 available in Cloudera Manager 4.1.") 
 931      else: 
 932        args['disableQuorumStorage'] = disable_quorum_storage 
 933   
 934      return self._cmd('hdfsDisableHa', data=args) 
  935   
 938      """ 
 939      Enable auto-failover for an HDFS nameservice. 
 940      This command is no longer supported with API v6 onwards. Use enable_nn_ha instead. 
 941   
 942      @param nameservice: Nameservice for which to enable auto-failover. 
 943      @param active_fc_name: Name of failover controller to create for active node. 
 944      @param standby_fc_name: Name of failover controller to create for stand-by node. 
 945      @param zk_service: ZooKeeper service to use. 
 946      @return: Reference to the submitted command. 
 947      """ 
 948      version = self._get_resource_root().version 
 949   
 950      args = dict( 
 951        nameservice = nameservice, 
 952        activeFCName = active_fc_name, 
 953        standByFCName = standby_fc_name, 
 954        zooKeeperService = dict( 
 955          clusterName = zk_service.clusterRef.clusterName, 
 956          serviceName = zk_service.name, 
 957          ), 
 958        ) 
 959      return self._cmd('hdfsEnableAutoFailover', data=args) 
  960   
 961 -  def enable_hdfs_ha(self, active_name, active_shared_path, standby_name, 
 962        standby_shared_path, nameservice, start_dependent_services=True, 
 963        deploy_client_configs=True, enable_quorum_storage=False): 
  964      """ 
 965      Enable high availability for an HDFS NameNode. 
 966      This command is no longer supported with API v6 onwards. Use enable_nn_ha instead. 
 967   
 968      @param active_name: name of active NameNode. 
 969      @param active_shared_path: shared edits path for active NameNode. 
 970                                 Ignored if Quorum-based Storage is being enabled. 
 971      @param standby_name: name of stand-by NameNode. 
 972      @param standby_shared_path: shared edits path for stand-by NameNode. 
 973                                  Ignored if Quourm Journal is being enabled. 
 974      @param nameservice: nameservice for the HA pair. 
 975      @param start_dependent_services: whether to re-start dependent services. 
 976      @param deploy_client_configs: whether to re-deploy client configurations. 
 977      @param enable_quorum_storage: whether to enable Quorum-based Storage. Available since API v2. 
 978                                    Quorum-based Storage will be enabled for all 
 979                                    nameservices except those configured with NFS High 
 980                                    Availability. 
 981      @return: Reference to the submitted command. 
 982      """ 
 983      version = self._get_resource_root().version 
 984   
 985      args = dict( 
 986        activeName = active_name, 
 987        standByName = standby_name, 
 988        nameservice = nameservice, 
 989        startDependentServices = start_dependent_services, 
 990        deployClientConfigs = deploy_client_configs, 
 991      ) 
 992   
 993      if enable_quorum_storage: 
 994        if version < 2: 
 995          raise AttributeError("Quorum-based Storage is not supported prior to Cloudera Manager 4.1.") 
 996        else: 
 997          args['enableQuorumStorage'] = enable_quorum_storage 
 998      else: 
 999        if active_shared_path is None or standby_shared_path is None: 
1000          raise AttributeError("Active and standby shared paths must be specified if not enabling Quorum-based Storage") 
1001        args['activeSharedEditsPath'] = active_shared_path 
1002        args['standBySharedEditsPath'] = standby_shared_path 
1003   
1004      return self._cmd('hdfsEnableHa', data=args) 
 1005   
1006 -  def enable_nn_ha(self, active_name, standby_host_id, nameservice, jns, 
1007        standby_name_dir_list=None, qj_name=None, standby_name=None, 
1008        active_fc_name=None, standby_fc_name=None, zk_service_name=None, 
1009        force_init_znode=True, clear_existing_standby_name_dirs=True, clear_existing_jn_edits_dir=True): 
 1010      """ 
1011      Enable High Availability (HA) with Auto-Failover for an HDFS NameNode. 
1012      @param active_name: Name of Active NameNode. 
1013      @param standby_host_id: ID of host where Standby NameNode will be created. 
1014      @param nameservice: Nameservice to be used while enabling HA. 
1015                          Optional if Active NameNode already has this config set. 
1016      @param jns: List of Journal Nodes to be created during the command. 
1017                  Each element of the list must be a dict containing the following keys: 
1018                    - B{jnHostId}: ID of the host where the new JournalNode will be created. 
1019                    - B{jnName}: Name of the JournalNode role (optional) 
1020                    - B{jnEditsDir}: Edits dir of the JournalNode. Can be omitted if the config 
1021                      is already set at RCG level. 
1022      @param standby_name_dir_list: List of directories for the new Standby NameNode. 
1023                                    If not provided then it will use same dirs as Active NameNode. 
1024      @param qj_name: Name of the journal located on each JournalNodes' filesystem. 
1025                      This can be optionally provided if the config hasn't been already set for the Active NameNode. 
1026                      If this isn't provided and Active NameNode doesn't also have the config, 
1027                      then nameservice is used by default. 
1028      @param standby_name: Name of the Standby NameNode role to be created (Optional). 
1029      @param active_fc_name: Name of the Active Failover Controller role to be created (Optional). 
1030      @param standby_fc_name: Name of the Standby Failover Controller role to be created (Optional). 
1031      @param zk_service_name: Name of the ZooKeeper service to use for auto-failover. 
1032                              If HDFS service already depends on a ZooKeeper service then that ZooKeeper 
1033                              service will be used for auto-failover and in that case this parameter 
1034                              can either be omitted or should be the same ZooKeeper service. 
1035      @param force_init_znode: Indicates if the ZNode should be force initialized if it is 
1036                               already present. Useful while re-enabling High Availability. (Default: TRUE) 
1037      @param clear_existing_standby_name_dirs: Indicates if the existing name directories for Standby NameNode 
1038                                               should be cleared during the workflow. 
1039                                               Useful while re-enabling High Availability. (Default: TRUE) 
1040      @param clear_existing_jn_edits_dir: Indicates if the existing edits directories for the JournalNodes 
1041                                          for the specified nameservice should be cleared during the workflow. 
1042                                          Useful while re-enabling High Availability. (Default: TRUE) 
1043      @return: Reference to the submitted command. 
1044      @since: API v6 
1045      """ 
1046      args = dict ( 
1047        activeNnName = active_name, 
1048        standbyNnName = standby_name, 
1049        standbyNnHostId = standby_host_id, 
1050        standbyNameDirList = standby_name_dir_list, 
1051        nameservice = nameservice, 
1052        qjName = qj_name, 
1053        activeFcName = active_fc_name, 
1054        standbyFcName = standby_fc_name, 
1055        zkServiceName = zk_service_name, 
1056        forceInitZNode = force_init_znode, 
1057        clearExistingStandbyNameDirs = clear_existing_standby_name_dirs, 
1058        clearExistingJnEditsDir = clear_existing_jn_edits_dir, 
1059        jns = jns 
1060      ) 
1061      return self._cmd('hdfsEnableNnHa', data=args, api_version=6) 
 1062   
1063 -  def disable_nn_ha(self, active_name, snn_host_id, snn_check_point_dir_list, 
1064        snn_name=None): 
 1065      """ 
1066      Disable high availability with automatic failover for an HDFS NameNode. 
1067   
1068      @param active_name: Name of the NamdeNode role that is going to be active after 
1069                          High Availability is disabled. 
1070      @param snn_host_id: Id of the host where the new SecondaryNameNode will be created. 
1071      @param snn_check_point_dir_list : List of directories used for checkpointing 
1072                                        by the new SecondaryNameNode. 
1073      @param snn_name: Name of the new SecondaryNameNode role (Optional). 
1074      @return: Reference to the submitted command. 
1075      @since: API v6 
1076      """ 
1077      args = dict( 
1078        activeNnName = active_name, 
1079        snnHostId = snn_host_id, 
1080        snnCheckpointDirList = snn_check_point_dir_list, 
1081        snnName = snn_name 
1082      ) 
1083      return self._cmd('hdfsDisableNnHa', data=args, api_version=6) 
 1084   
1085 -  def enable_jt_ha(self, new_jt_host_id, force_init_znode=True, zk_service_name=None, 
1086        new_jt_name=None, fc1_name=None, fc2_name=None): 
 1087      """ 
1088      Enable high availability for a MR JobTracker. 
1089   
1090      @param zk_service_name: Name of the ZooKeeper service to use for auto-failover. 
1091             If MapReduce service depends on a ZooKeeper service then that ZooKeeper 
1092             service will be used for auto-failover and in that case this parameter 
1093             can be omitted. 
1094      @param new_jt_host_id: id of the host where the second JobTracker 
1095                          will be added. 
1096      @param force_init_znode: Initialize the ZNode used for auto-failover even if 
1097                               it already exists. This can happen if JobTracker HA 
1098                               was enabled before and then disabled. Disable operation 
1099                               doesn't delete this ZNode. Defaults to true. 
1100      @param new_jt_name: Name of the second JobTracker role to be created. 
1101      @param fc1_name: Name of the Failover Controller role that is co-located with 
1102                       the existing JobTracker. 
1103      @param fc2_name: Name of the Failover Controller role that is co-located with 
1104                       the new JobTracker. 
1105      @return: Reference to the submitted command. 
1106      @since: API v5 
1107      """ 
1108      args = dict( 
1109        newJtHostId = new_jt_host_id, 
1110        forceInitZNode = force_init_znode, 
1111        zkServiceName = zk_service_name, 
1112        newJtRoleName = new_jt_name, 
1113        fc1RoleName = fc1_name, 
1114        fc2RoleName = fc2_name 
1115      ) 
1116      return self._cmd('enableJtHa', data=args) 
 1117   
1119      """ 
1120      Disable high availability for a MR JobTracker active-standby pair. 
1121   
1122      @param active_name: name of the JobTracker that will be active after 
1123                          the disable operation. The other JobTracker and 
1124                          Failover Controllers will be removed. 
1125      @return: Reference to the submitted command. 
1126      """ 
1127      args = dict( 
1128        activeName = active_name, 
1129      ) 
1130      return self._cmd('disableJtHa', data=args) 
 1131   
1132 -  def enable_rm_ha(self, new_rm_host_id, zk_service_name=None): 
 1133      """ 
1134      Enable high availability for a YARN ResourceManager. 
1135   
1136      @param new_rm_host_id: id of the host where the second ResourceManager 
1137                             will be added. 
1138      @param zk_service_name: Name of the ZooKeeper service to use for auto-failover. 
1139             If YARN service depends on a ZooKeeper service then that ZooKeeper 
1140             service will be used for auto-failover and in that case this parameter 
1141             can be omitted. 
1142      @return: Reference to the submitted command. 
1143      @since: API v6 
1144      """ 
1145      args = dict( 
1146        newRmHostId = new_rm_host_id, 
1147        zkServiceName = zk_service_name 
1148      ) 
1149      return self._cmd('enableRmHa', data=args) 
 1150   
1152      """ 
1153      Disable high availability for a YARN ResourceManager active-standby pair. 
1154   
1155      @param active_name: name of the ResourceManager that will be active after 
1156                          the disable operation. The other ResourceManager 
1157                          will be removed. 
1158      @return: Reference to the submitted command. 
1159      @since: API v6 
1160      """ 
1161      args = dict( 
1162        activeName = active_name 
1163      ) 
1164      return self._cmd('disableRmHa', data=args) 
 1165   
1166 -  def enable_oozie_ha(self, new_oozie_server_host_ids, new_oozie_server_role_names=None, 
1167      zk_service_name=None, load_balancer_host_port=None, 
1168      load_balancer_hostname=None, load_balancer_port=None, load_balancer_ssl_port=None): 
 1169      """ 
1170      Enable high availability for Oozie. 
1171   
1172      @param new_oozie_server_host_ids: List of IDs of the hosts on which new Oozie Servers 
1173                                        will be added. 
1174      @param new_oozie_server_role_names: List of names of the new Oozie Servers. This is an 
1175                                          optional argument, but if provided, it should 
1176                                          match the length of host IDs provided. 
1177      @param zk_service_name: Name of the ZooKeeper service that will be used for Oozie HA. 
1178                              This is an optional parameter if the Oozie to ZooKeeper 
1179                              dependency is already set. 
1180      @param load_balancer_host_port: DEPRECATED Address and port of the load balancer used for Oozie HA. 
1181                                      This is an optional parameter if this config is already set. 
1182      @param load_balancer_hostname: (since v19) Address and port of the load balancer used for Oozie HA. 
1183                                     This is an optional parameter if this config is already set. 
1184      @param load_balancer_port: (since v19) HTTP port of the load balancer used for Oozie HA. 
1185                                 This is an optional parameter if this config is already set. 
1186      @param load_balancer_ssl_port: (since v19) HTTPS port of the load balancer used for Oozie HA. 
1187                                     This is an optional parameter if this config is already set. 
1188      @return: Reference to the submitted command. 
1189      @since: API v6 
1190      """ 
1191      if load_balancer_hostname: 
1192        args = dict( 
1193          newOozieServerHostIds = new_oozie_server_host_ids, 
1194          newOozieServerRoleNames = new_oozie_server_role_names, 
1195          zkServiceName = zk_service_name, 
1196          loadBalancerHostname = load_balancer_hostname, 
1197          loadBalancerPort = load_balancer_port, 
1198          loadBalancerSslPort = load_balancer_ssl_port 
1199        ) 
1200        apiVersion = 19 
1201      else: 
1202        args = dict( 
1203          newOozieServerHostIds = new_oozie_server_host_ids, 
1204          newOozieServerRoleNames = new_oozie_server_role_names, 
1205          zkServiceName = zk_service_name, 
1206          loadBalancerHostPort = load_balancer_host_port, 
1207        ) 
1208        apiVersion = 6 
1209      return self._cmd('oozieEnableHa', data=args, api_version=apiVersion) 
 1210   
1212      """ 
1213      Disable high availability for Oozie 
1214   
1215      @param active_name: Name of the Oozie Server that will be active after 
1216                          High Availability is disabled. 
1217      @return: Reference to the submitted command. 
1218      @since: API v6 
1219      """ 
1220      args = dict( 
1221        activeName = active_name 
1222      ) 
1223      return self._cmd('oozieDisableHa', data=args, api_version=6) 
 1224   
1225 -  def enable_sentry_ha(self, new_sentry_host_id, new_sentry_role_name=None, 
1226                         zk_service_name=None): 
 1227      """ 
1228      Enable high availability for Sentry. 
1229   
1230      @param new_sentry_server_host_id: ID of the host on which new Sentry Server will be added 
1231      @param new_sentry_server_rolename: Name of the new Sentry Server. This is an optional argument. 
1232                                         A default name will be generated if not specified. 
1233      @param zk_service_name: Name of the ZooKeeper service that will be used for Oozie HA. 
1234                              This is an optional parameter if the Oozie to ZooKeeper 
1235                              dependency is already set. 
1236      @return: Reference to the submitted command. 
1237      @since: API v18 
1238      """ 
1239      args = dict( 
1240        newSentryHostId = new_sentry_host_id, 
1241        newSentryRoleName = new_sentry_role_name, 
1242        zkServiceName = zk_service_name 
1243      ) 
1244      return self._cmd('enableSentryHa', data=args, api_version=18) 
 1245   
1246 -  def disable_sentry_ha(self, active_name): 
 1247      """ 
1248      Disable high availability for Sentry 
1249   
1250      @param active_name: Name of the Sentry Server that will be active after 
1251                          high availability is disabled. 
1252      @return: Reference to the submitted command. 
1253      @since: API v18 
1254      """ 
1255      args = dict( 
1256        activeName = active_name 
1257      ) 
1258      return self._cmd('disableSentryHa', data=args, api_version=18) 
 1259   
1260 -  def failover_hdfs(self, active_name, standby_name, force=False): 
 1261      """ 
1262      Initiate a failover of an HDFS NameNode HA pair. 
1263   
1264      This will make the given stand-by NameNode active, and vice-versa. 
1265   
1266      @param active_name: name of currently active NameNode. 
1267      @param standby_name: name of NameNode currently in stand-by. 
1268      @param force: whether to force failover. 
1269      @return: Reference to the submitted command. 
1270      """ 
1271      params = { "force" : "true" and force or "false" } 
1272      args = { ApiList.LIST_KEY : [ active_name, standby_name ] } 
1273      return self._cmd('hdfsFailover', data=[ active_name, standby_name ], 
1274          params = { "force" : "true" and force or "false" }) 
 1275   
1284   
1286      """ 
1287      Initialize HDFS failover controller metadata. 
1288   
1289      Only one controller per nameservice needs to be initialized. 
1290   
1291      @param controllers: Name of failover controller instances to initialize. 
1292      @return: List of submitted commands. 
1293      """ 
1294      return self._role_cmd('hdfsInitializeAutoFailover', controllers) 
 1295   
1297      """ 
1298      Initialize a NameNode's shared edits directory. 
1299   
1300      @param namenodes: Name of NameNode instances. 
1301      @return: List of submitted commands. 
1302      """ 
1303      return self._role_cmd('hdfsInitializeSharedDir', namenodes) 
 1304   
1306      """ 
1307      Roll the edits of an HDFS NameNode or Nameservice. 
1308   
1309      @param nameservice: Nameservice whose edits should be rolled. 
1310                          Required only with a federated HDFS. 
1311      @return: Reference to the submitted command. 
1312      @since: API v3 
1313      """ 
1314      args = dict() 
1315      if nameservice: 
1316        args['nameservice'] = nameservice 
1317   
1318      return self._cmd('hdfsRollEdits', data=args) 
 1319   
1328   
1330      """ 
1331      Upgrade HBase data in HDFS and ZooKeeper as part of upgrade from CDH4 to CDH5. 
1332   
1333      @return: Reference to the submitted command. 
1334      @since: API v6 
1335      """ 
1336      return self._cmd('hbaseUpgrade', api_version=6) 
 1337   
1339      """ 
1340      Creates the user directory of a Sqoop service in HDFS. 
1341   
1342      @return: Reference to the submitted command. 
1343      @since: API v4 
1344      """ 
1345      return self._cmd('createSqoopUserDir', api_version=4) 
 1346   
1348      """ 
1349      Creates the Sqoop2 Server database tables in the configured database. 
1350      Will do nothing if tables already exist. Will not perform an upgrade. 
1351   
1352      @return: Reference to the submitted command. 
1353      @since: API v10 
1354      """ 
1355      return self._cmd('sqoopCreateDatabaseTables', api_version=10) 
 1356   
1358      """ 
1359      Upgrade Sqoop Database schema as part of a major version upgrade. 
1360   
1361      @return: Reference to the submitted command. 
1362      @since: API v6 
1363      """ 
1364      return self._cmd('sqoopUpgradeDb', api_version=6) 
 1365   
1374   
1376      """ 
1377      Cleanup a ZooKeeper service or roles. 
1378   
1379      If no server role names are provided, the command applies to the whole 
1380      service, and cleans up all the server roles that are currently running. 
1381   
1382      @param servers: ZK server role names (optional). 
1383      @return: Command reference (for service command) or list of command 
1384               references (for role commands). 
1385      """ 
1386      if servers: 
1387        return self._role_cmd('zooKeeperCleanup', servers) 
1388      else: 
1389        return self._cmd('zooKeeperCleanup') 
 1390   
1392      """ 
1393      Initialize a ZooKeeper service or roles. 
1394   
1395      If no server role names are provided, the command applies to the whole 
1396      service, and initializes all the configured server roles. 
1397   
1398      @param servers: ZK server role names (optional). 
1399      @return: Command reference (for service command) or list of command 
1400               references (for role commands). 
1401      """ 
1402      if servers: 
1403        return self._role_cmd('zooKeeperInit', servers) 
1404      else: 
1405        return self._cmd('zooKeeperInit') 
 1406   
1408      """ 
1409      Synchronize the Hue server's database. 
1410   
1411      @param servers: Name of Hue Server roles to synchronize. Not required starting with API v10. 
1412      @return: List of submitted commands. 
1413      """ 
1414   
1415      actual_version = self._get_resource_root().version 
1416      if actual_version < 10: 
1417        return self._role_cmd('hueSyncDb', servers) 
1418   
1419      return self._cmd('hueSyncDb', api_version=10) 
 1420   
1421   
1423      """ 
1424      Dump the Hue server's database; it can be loaded later. 
1425   
1426      @return: List of submitted commands. 
1427      """ 
1428      return self._cmd('hueDumpDb', api_version=10) 
 1429   
1431      """ 
1432      Load data into Hue server's database from a previous data dump. 
1433   
1434      @return: List of submitted commands. 
1435      """ 
1436      return self._cmd('hueLoadDb', api_version=10) 
 1437   
1438 -  def lsof(self, *rolenames): 
 1439      """ 
1440      Run the lsof diagnostic command. This command runs the lsof utility to list 
1441      a role's open files. 
1442   
1443      @param rolenames: Name of the role instances 
1444      @return: List of submitted commands. 
1445      @since: API v8 
1446      """ 
1447      return self._role_cmd('lsof', rolenames) 
 1448   
1449 -  def jstack(self, *rolenames): 
 1450      """ 
1451      Run the jstack diagnostic command. The command runs the jstack utility to 
1452      capture a role's java thread stacks. 
1453   
1454      @param rolenames: Name of the role instances 
1455      @return: List of submitted commands. 
1456      @since: API v8 
1457      """ 
1458      return self._role_cmd('jstack', rolenames) 
 1459   
1461      """ 
1462      Run the jmapHisto diagnostic command. The command runs the jmap utility to 
1463      capture a histogram of the objects on the role's java heap. 
1464   
1465      @param rolenames: Name of the role instances 
1466      @return: List of submitted commands. 
1467      @since: API v8 
1468      """ 
1469      return self._role_cmd('jmapHisto', rolenames) 
 1470   
1472      """ 
1473      Run the jmapDump diagnostic command. The command runs the jmap utility to 
1474      capture a dump of the role's java heap. 
1475   
1476      @param rolenames: Name of the role instances 
1477      @return: List of submitted commands. 
1478      @since: API v8 
1479      """ 
1480      return self._role_cmd('jmapDump', rolenames) 
 1481   
1483      """ 
1484      Put the service in maintenance mode. 
1485   
1486      @return: Reference to the completed command. 
1487      @since: API v2 
1488      """ 
1489      cmd = self._cmd('enterMaintenanceMode') 
1490      if cmd.success: 
1491        self._update(_get_service(self._get_resource_root(), self._path())) 
1492      return cmd 
 1493   
1495      """ 
1496      Take the service out of maintenance mode. 
1497   
1498      @return: Reference to the completed command. 
1499      @since: API v2 
1500      """ 
1501      cmd = self._cmd('exitMaintenanceMode') 
1502      if cmd.success: 
1503        self._update(_get_service(self._get_resource_root(), self._path())) 
1504      return cmd 
 1505   
1506 -  def rolling_restart(self, slave_batch_size=None, 
1507                        slave_fail_count_threshold=None, 
1508                        sleep_seconds=None, 
1509                        stale_configs_only=None, 
1510                        unupgraded_only=None, 
1511                        restart_role_types=None, 
1512                        restart_role_names=None): 
 1513      """ 
1514      Rolling restart the roles of a service. The sequence is: 
1515        1. Restart all the non-slave roles 
1516        2. If slaves are present restart them in batches of size specified 
1517        3. Perform any post-command needed after rolling restart 
1518   
1519      @param slave_batch_size: Number of slave roles to restart at a time 
1520             Must be greater than 0. Default is 1. 
1521             For HDFS, this number should be less than the replication factor (default 3) 
1522             to ensure data availability during rolling restart. 
1523      @param slave_fail_count_threshold: The threshold for number of slave batches that 
1524             are allowed to fail to restart before the entire command is considered failed. 
1525             Must be >= 0. Default is 0. 
1526      @param sleep_seconds: Number of seconds to sleep between restarts of slave role batches. 
1527              Must be >=0. Default is 0. 
1528      @param stale_configs_only: Restart roles with stale configs only. Default is false. 
1529      @param unupgraded_only: Restart roles that haven't been upgraded yet. Default is false. 
1530      @param restart_role_types: Role types to restart. If not specified, all startable roles are restarted. 
1531      @param restart_role_names: List of specific roles to restart. 
1532              If none are specified, then all roles of specified role types are restarted. 
1533      @return: Reference to the submitted command. 
1534      @since: API v3 
1535      """ 
1536      args = dict() 
1537      if slave_batch_size: 
1538        args['slaveBatchSize'] = slave_batch_size 
1539      if slave_fail_count_threshold: 
1540        args['slaveFailCountThreshold'] = slave_fail_count_threshold 
1541      if sleep_seconds: 
1542        args['sleepSeconds'] = sleep_seconds 
1543      if stale_configs_only: 
1544        args['staleConfigsOnly'] = stale_configs_only 
1545      if unupgraded_only: 
1546        args['unUpgradedOnly'] = unupgraded_only 
1547      if restart_role_types: 
1548        args['restartRoleTypes'] = restart_role_types 
1549      if restart_role_names: 
1550        args['restartRoleNames'] = restart_role_names 
1551   
1552      return self._cmd('rollingRestart', data=args) 
 1553   
1554 -  def create_replication_schedule(self, 
1555        start_time, end_time, interval_unit, interval, paused, arguments, 
1556        alert_on_start=False, alert_on_success=False, alert_on_fail=False, 
1557        alert_on_abort=False, name=None, description=None): 
 1558      """ 
1559      Create a new replication schedule for this service. 
1560   
1561      The replication argument type varies per service type. The following types 
1562      are recognized: 
1563        - HDFS: ApiHdfsReplicationArguments 
1564        - Hive: ApiHiveReplicationArguments 
1565   
1566      @type  start_time: datetime.datetime 
1567      @param start_time: The time at which the schedule becomes active and first executes. 
1568      @type  end_time: datetime.datetime 
1569      @param end_time: The time at which the schedule will expire. 
1570      @type  interval_unit: str 
1571      @param interval_unit: The unit of time the `interval` represents. Ex. MINUTE, HOUR, 
1572                            DAY. See the server documentation for a full list of values. 
1573      @type  interval: int 
1574      @param interval: The number of time units to wait until triggering the next replication. 
1575      @type  paused: bool 
1576      @param paused: Should the schedule be paused? Useful for on-demand replication. 
1577      @param arguments: service type-specific arguments for the replication job. 
1578      @param alert_on_start: whether to generate alerts when the job is started. 
1579      @param alert_on_success: whether to generate alerts when the job succeeds. 
1580      @param alert_on_fail: whether to generate alerts when the job fails. 
1581      @param alert_on_abort: whether to generate alerts when the job is aborted. 
1582      @param name: Name of the replication schedule 
1583      @param description: Description of the replication schedule 
1584      @return: The newly created schedule. 
1585      @since: API v3 
1586      """ 
1587      version = self._get_resource_root().version 
1588      if version >= 17:   
1589        schedule = ApiReplicationSchedule(self._get_resource_root(), 
1590          startTime=start_time, endTime=end_time, intervalUnit=interval_unit, interval=interval, 
1591          paused=paused, alertOnStart=alert_on_start, alertOnSuccess=alert_on_success, 
1592          alertOnFail=alert_on_fail, alertOnAbort=alert_on_abort, displayName=name, description=description) 
1593      else: 
1594        schedule = ApiReplicationSchedule2(self._get_resource_root(), 
1595          startTime=start_time, endTime=end_time, intervalUnit=interval_unit, interval=interval, 
1596          paused=paused, alertOnStart=alert_on_start, alertOnSuccess=alert_on_success, 
1597          alertOnFail=alert_on_fail, alertOnAbort=alert_on_abort) 
1598      if self.type == 'HDFS': 
1599        if isinstance(arguments, ApiHdfsCloudReplicationArguments): 
1600          schedule.hdfsCloudArguments = arguments 
1601        elif isinstance(arguments, ApiHdfsReplicationArguments): 
1602          schedule.hdfsArguments = arguments 
1603        else: 
1604          raise TypeError, 'Unexpected type for HDFS replication argument.' 
1605      elif self.type == 'HIVE': 
1606        if isinstance(arguments, ApiHiveCloudReplicationArguments): 
1607          schedule.hiveCloudArguments = arguments 
1608        elif isinstance(arguments, ApiHiveReplicationArguments): 
1609          schedule.hiveArguments = arguments 
1610        else: 
1611          raise TypeError, 'Unexpected type for Hive replication argument.' 
1612      else: 
1613        raise TypeError, 'Replication is not supported for service type ' + self.type 
1614   
1615      return self._post("replications", ApiReplicationSchedule, True, [schedule], 
1616          api_version=3)[0] 
 1617   
1619      """ 
1620      Retrieve a list of replication schedules. 
1621   
1622      @return: A list of replication schedules. 
1623      @since: API v3 
1624      """ 
1625      return self._get("replications", ApiReplicationSchedule, True, 
1626          api_version=3) 
 1627   
1629      """ 
1630      Retrieve a single replication schedule. 
1631   
1632      @param schedule_id: The id of the schedule to retrieve. 
1633      @return: The requested schedule. 
1634      @since: API v3 
1635      """ 
1636      return self._get("replications/%d" % schedule_id, ApiReplicationSchedule, 
1637          api_version=3) 
 1638   
1640      """ 
1641      Delete a replication schedule. 
1642   
1643      @param schedule_id: The id of the schedule to delete. 
1644      @return: The deleted replication schedule. 
1645      @since: API v3 
1646      """ 
1647      return self._delete("replications/%s" % schedule_id, ApiReplicationSchedule, 
1648          api_version=3) 
 1649   
1651      """ 
1652      Update a replication schedule. 
1653   
1654      @param schedule_id: The id of the schedule to update. 
1655      @param schedule: The modified schedule. 
1656      @return: The updated replication schedule. 
1657      @since: API v3 
1658      """ 
1659      return self._put("replications/%s" % schedule_id, ApiReplicationSchedule, 
1660          data=schedule, api_version=3) 
 1661   
1662 -  def get_replication_command_history(self, schedule_id, limit=20, offset=0, 
1663                                        view=None): 
 1664      """ 
1665      Retrieve a list of commands for a replication schedule. 
1666   
1667      @param schedule_id: The id of the replication schedule. 
1668      @param limit: Maximum number of commands to retrieve. 
1669      @param offset: Index of first command to retrieve. 
1670      @param view: View to materialize. Valid values are 'full', 'summary', 'export', 'export_redacted'. 
1671      @return: List of commands executed for a replication schedule. 
1672      @since: API v4 
1673      """ 
1674      params = { 
1675        'limit':  limit, 
1676        'offset': offset, 
1677      } 
1678      if view: 
1679        params['view'] = view 
1680   
1681      return self._get("replications/%s/history" % schedule_id, 
1682                       ApiReplicationCommand, True, params=params, api_version=4) 
 1683   
1685      """ 
1686      Trigger replication immediately. Start and end dates on the schedule will be 
1687      ignored. 
1688   
1689      @param schedule_id: The id of the schedule to trigger. 
1690      @param dry_run: Whether to execute a dry run. 
1691      @return: The command corresponding to the replication job. 
1692      @since: API v3 
1693      """ 
1694      return self._post("replications/%s/run" % schedule_id, ApiCommand, 
1695          params=dict(dryRun=dry_run), 
1696          api_version=3) 
 1697   
1699      """ 
1700      Collect replication diagnostic data for the specified schedule id 
1701   
1702      @param schedule_id: The id of the schedule to collect diagnostic data. 
1703      @param diagnostic_args: Arguments for collecting diagnostic data. 
1704      @return: The command corresponding to the collect diagnostic data. 
1705      @since: API v11 
1706      """ 
1707      return self._post("replications/%s/collectDiagnosticData" % schedule_id, ApiCommand, 
1708          data=diagnostic_args, params=view and dict(view=view) or None, 
1709          api_version=11) 
 1710   
1712      """ 
1713      Create a new snapshot policy for this service. 
1714      @param policy: The snapshot policy to create 
1715      @return: The newly created policy. 
1716      @since: API v6 
1717      """ 
1718      return self._post("snapshots/policies", ApiSnapshotPolicy, True, [policy], 
1719          api_version=6)[0] 
 1720   
1722      """ 
1723      Retrieve a list of snapshot policies. 
1724   
1725      @param view: View to materialize. Valid values are 'full', 'summary', 'export', 'export_redacted'. 
1726      @return: A list of snapshot policies. 
1727      @since: API v6 
1728      """ 
1729      return self._get("snapshots/policies", ApiSnapshotPolicy, True, 
1730          params=view and dict(view=view) or None, api_version=6) 
 1731   
1733      """ 
1734      Retrieve a single snapshot policy. 
1735   
1736      @param name: The name of the snapshot policy to retrieve. 
1737      @param view: View to materialize. Valid values are 'full', 'summary', 'export', 'export_redacted'. 
1738      @return: The requested snapshot policy. 
1739      @since: API v6 
1740      """ 
1741      return self._get("snapshots/policies/%s" % name, ApiSnapshotPolicy, 
1742          params=view and dict(view=view) or None, api_version=6) 
 1743   
1745      """ 
1746      Delete a snapshot policy. 
1747   
1748      @param name: The name of the snapshot policy to delete. 
1749      @return: The deleted snapshot policy. 
1750      @since: API v6 
1751      """ 
1752      return self._delete("snapshots/policies/%s" % name, ApiSnapshotPolicy, api_version=6) 
 1753   
1755      """ 
1756      Update a snapshot policy. 
1757   
1758      @param name: The name of the snapshot policy to update. 
1759      @param policy: The modified snapshot policy. 
1760      @return: The updated snapshot policy. 
1761      @since: API v6 
1762      """ 
1763      return self._put("snapshots/policies/%s" % name, ApiSnapshotPolicy, data=policy, 
1764          api_version=6) 
 1765   
1766 -  def get_snapshot_command_history(self, name, limit=20, offset=0, view=None): 
 1767      """ 
1768      Retrieve a list of commands triggered by a snapshot policy. 
1769   
1770      @param name: The name of the snapshot policy. 
1771      @param limit: Maximum number of commands to retrieve. 
1772      @param offset: Index of first command to retrieve. 
1773      @param view: View to materialize. Valid values are 'full', 'summary', 'export', 'export_redacted'. 
1774      @return: List of commands triggered by a snapshot policy. 
1775      @since: API v6 
1776      """ 
1777      params = { 
1778        'limit':  limit, 
1779        'offset': offset, 
1780      } 
1781      if view: 
1782        params['view'] = view 
1783   
1784      return self._get("snapshots/policies/%s/history" % name, ApiSnapshotCommand, True, 
1785          params=params, api_version=6) 
 1786   
1787   
1789      """ 
1790      Installs the Oozie ShareLib. Oozie must be stopped before running this 
1791      command. 
1792   
1793      @return: Reference to the submitted command. 
1794      @since: API v3 
1795      """ 
1796      return self._cmd('installOozieShareLib', api_version=3) 
 1797   
1799      """ 
1800      Create the Oozie Server Database. Only works with embedded postgresql 
1801      database. This command should usually be followed by a call to 
1802      create_oozie_db. 
1803   
1804      @return: Reference to the submitted command. 
1805      @since: API v10 
1806      """ 
1807      return self._cmd('oozieCreateEmbeddedDatabase', api_version=10) 
 1808   
1810      """ 
1811      Creates the Oozie Database Schema in the configured database. 
1812      This command does not create database. This command creates only tables 
1813      required by Oozie. To create database, please refer to create_oozie_embedded_database. 
1814   
1815      @return: Reference to the submitted command. 
1816      @since: API v2 
1817      """ 
1818      return self._cmd('createOozieDb', api_version=2) 
 1819   
1821      """ 
1822      Upgrade Oozie Database schema as part of a major version upgrade. 
1823   
1824      @return: Reference to the submitted command. 
1825      @since: API v6 
1826      """ 
1827      return self._cmd('oozieUpgradeDb', api_version=6) 
 1828   
1830      """ 
1831      Initializes the Solr service in Zookeeper. 
1832   
1833      @return: Reference to the submitted command. 
1834      @since: API v4 
1835      """ 
1836      return self._cmd('initSolr', api_version=4) 
 1837   
1839      """ 
1840      Creates the home directory of a Solr service in HDFS. 
1841   
1842      @return: Reference to the submitted command. 
1843      @since: API v4 
1844      """ 
1845      return self._cmd('createSolrHdfsHomeDir', api_version=4) 
 1846   
1856   
1858      """ 
1859      Creates the Hive warehouse directory in HDFS. 
1860   
1861      @return: Reference to the submitted command. 
1862      @since: API v3 
1863      """ 
1864      return self._cmd('hiveCreateHiveWarehouse') 
 1865   
1867      """ 
1868      Creates the Hive user directory in HDFS. 
1869   
1870      @return: Reference to the submitted command. 
1871      @since: API v4 
1872      """ 
1873      return self._cmd('hiveCreateHiveUserDir') 
 1874   
1885   
1887      """ 
1888      Create the Sentry Server Database. Only works with embedded postgresql 
1889      database. This command should usually be followed by a call to 
1890      create_sentry_database_tables. 
1891   
1892      @return: Reference to the submitted command. 
1893      @since: API v7 
1894      """ 
1895      return self._cmd('sentryCreateDatabase', api_version=7) 
 1896   
1898      """ 
1899      Creates the Sentry Server database tables in the configured database. 
1900      Will do nothing if tables already exist. Will not perform an upgrade. 
1901   
1902      @return: Reference to the submitted command. 
1903      @since: API v7 
1904      """ 
1905      return self._cmd('sentryCreateDatabaseTables', api_version=7) 
 1906   
1908      """ 
1909      Upgrades the Sentry Server database tables in the configured database. 
1910   
1911      @return: Reference to the submitted command. 
1912      @since: API v8 
1913      """ 
1914      return self._cmd('sentryUpgradeDatabaseTables', api_version=8) 
 1915   
1928   
1930      """ 
1931      Import MapReduce configuration into Yarn, overwriting Yarn configuration. 
1932   
1933      You will lose existing Yarn configuration. Read all MapReduce 
1934      configuration, role assignments, and role configuration groups and update 
1935      Yarn with corresponding values. MR1 configuration will be converted into 
1936      the equivalent MR2 configuration. 
1937   
1938      Before running this command, Yarn must be stopped and MapReduce must exist 
1939      with valid configuration. 
1940   
1941      @return: Reference to the submitted command. 
1942      @since: API v6 
1943      """ 
1944      return self._cmd('importMrConfigsIntoYarn', api_version=6) 
 1945   
1947      """ 
1948      Change the cluster to use MR2 instead of MR1. Services will be restarted. 
1949   
1950      Will perform the following steps: 
1951      * Update all services that depend on MapReduce to instead depend on Yarn. 
1952      * Stop MapReduce 
1953      * Start Yarn (includes MR2) 
1954      * Deploy Yarn (MR2) Client Configuration 
1955   
1956      Available since API v6. 
1957   
1958      @return: Reference to the submitted command. 
1959      @since: API v6 
1960      """ 
1961      return self._cmd('switchToMr2', api_version=6) 
 1962   
1964      """ 
1965      Finalizes the rolling upgrade for HDFS by updating the NameNode 
1966      metadata permanently to the next version. Should be done after 
1967      doing a rolling upgrade to a CDH version >= 5.2.0. 
1968   
1969      @return: Reference to the submitted command. 
1970      @since: API v8 
1971      """ 
1972      return self._cmd('hdfsFinalizeRollingUpgrade', api_version=8) 
 1973   
1975      """ 
1976      Executes a role command by name on the specified 
1977      roles 
1978   
1979      @param command_name: The name of the command. 
1980      @param role_names: The role names to execute this command on. 
1981      @return: Reference to the submitted command. 
1982      @since: API v6 
1983      """ 
1984      return self._role_cmd(command_name, role_names, api_version=6) 
 1985   
1987      """ 
1988      Executes a command on the service specified 
1989      by name. 
1990   
1991      @param command_name: The name of the command. 
1992      @return: Reference to the submitted command. 
1993      @since: API v6 
1994      """ 
1995      return self._cmd(command_name, api_version=6) 
 1996   
1998      """ 
1999      Lists all the commands that can be executed by name 
2000      on the provided service. 
2001   
2002      @return: A list of command metadata objects 
2003      @since: API v6 
2004      """ 
2005      return self._get("commandsByName", ApiCommandMetadata, True, 
2006          api_version=6) 
 2007   
2017   
 2026   
2028    _ATTRIBUTES = { 
2029      'name'    : None, 
2030      'type'    : None, 
2031      'config'  : Attr(ApiConfig), 
2032      'roles'   : Attr(roles.ApiRole), 
2033    } 
2034   
2035 -  def __init__(self, name=None, type=None, 
2036                 config=None, roles=None): 
 2037       
2038      resource_root = None 
2039       
2040       
2041      BaseApiObject.init(self, None, locals()) 
 2042   
2044      """ 
2045      Set the service configuration. 
2046   
2047      @param config: A dictionary of config key/value 
2048      """ 
2049      if self.config is None: 
2050        self.config = { } 
2051      self.config.update(config_to_api_list(config)) 
 2052   
2054      """ 
2055      Add a role type setup info. 
2056   
2057      @param role_type: Role type 
2058      @param config: A dictionary of role type configuration 
2059      """ 
2060      rt_config = config_to_api_list(config) 
2061      rt_config['roleType'] = role_type 
2062   
2063      if self.config is None: 
2064        self.config = { } 
2065      if not self.config.has_key(ROLETYPES_CFG_KEY): 
2066        self.config[ROLETYPES_CFG_KEY] = [ ] 
2067      self.config[ROLETYPES_CFG_KEY].append(rt_config) 
 2068   
2069 -  def add_role_info(self, role_name, role_type, host_id, config=None): 
 2070      """ 
2071      Add a role info. The role will be created along with the service setup. 
2072   
2073      @param role_name: Role name 
2074      @param role_type: Role type 
2075      @param host_id: The host where the role should run 
2076      @param config: (Optional) A dictionary of role config values 
2077      """ 
2078      if self.roles is None: 
2079        self.roles = [ ] 
2080      api_config_list = config is not None and config_to_api_list(config) or None 
2081      self.roles.append({ 
2082          'name' : role_name, 
2083          'type' : role_type, 
2084          'hostRef' : { 'hostId' : host_id }, 
2085          'config' : api_config_list }) 
 2086   
2088      """ 
2089      Prepare and start this service. 
2090      Perform all the steps needed to prepare and start this service. 
2091   
2092      @return: Reference to the submitted command. 
2093      @since: API v7 
2094      """ 
2095      return self._cmd('firstRun', None, api_version=7) 
  2096