1   
  2   
  3   
  4   
  5   
  6   
  7   
  8   
  9   
 10   
 11   
 12   
 13   
 14   
 15   
 16   
 17  from cm_api.endpoints.types import * 
 18  from cm_api.endpoints import services, parcels, host_templates 
 19  from sys import api_version 
 20   
 21  __docformat__ = "epytext" 
 22   
 23  CLUSTERS_PATH = "/clusters" 
 24   
 25 -def create_cluster(resource_root, name, version=None, fullVersion=None): 
  26    """ 
 27    Create a cluster 
 28    @param resource_root: The root Resource object. 
 29    @param name: Cluster name 
 30    @param version: Cluster CDH major version (eg: "CDH4") 
 31                    - The CDH minor version will be assumed to be the 
 32                      latest released version for CDH4, or 5.0 for CDH5. 
 33    @param fullVersion: Cluster's full CDH version. (eg: "5.1.1") 
 34                          - If specified, 'version' will be ignored. 
 35                          - Since: v6 
 36    @return: An ApiCluster object 
 37    """ 
 38    if version is None and fullVersion is None: 
 39      raise Exception("Either 'version' or 'fullVersion' must be specified") 
 40    if fullVersion is not None: 
 41      api_version = 6 
 42      version = None 
 43    else: 
 44      api_version = 1 
 45   
 46    apicluster = ApiCluster(resource_root, name, version, fullVersion) 
 47    return call(resource_root.post, CLUSTERS_PATH, ApiCluster, True, 
 48                data=[apicluster], api_version=api_version)[0] 
  49   
 51    """ 
 52    Lookup a cluster by name 
 53    @param resource_root: The root Resource object. 
 54    @param name: Cluster name 
 55    @return: An ApiCluster object 
 56    """ 
 57    return call(resource_root.get, "%s/%s" % (CLUSTERS_PATH, name), ApiCluster) 
  58   
 60    """ 
 61    Get all clusters 
 62    @param resource_root: The root Resource object. 
 63    @return: A list of ApiCluster objects. 
 64    """ 
 65    return call(resource_root.get, CLUSTERS_PATH, ApiCluster, True, 
 66        params=view and dict(view=view) or None) 
  67   
 69    """ 
 70    Delete a cluster by name 
 71    @param resource_root: The root Resource object. 
 72    @param name: Cluster name 
 73    @return: The deleted ApiCluster object 
 74    """ 
 75    return call(resource_root.delete, "%s/%s" % (CLUSTERS_PATH, name), ApiCluster) 
  76   
 78    _ATTRIBUTES = { 
 79      'name'              : None, 
 80      'displayName'       : None, 
 81      'clusterUrl'        : None, 
 82      'version'           : None, 
 83      'fullVersion'       : None, 
 84      'hostsUrl'          : ROAttr(), 
 85      'maintenanceMode'   : ROAttr(), 
 86      'maintenanceOwners' : ROAttr(), 
 87      'entityStatus'      : ROAttr(), 
 88    } 
 89   
 90 -  def __init__(self, resource_root, name=None, version=None, fullVersion=None): 
  92   
 94      return "<ApiCluster>: %s; version: %s" % (self.name, self.version) 
  95   
 98   
100      """Change cluster attributes""" 
101      cluster = self._put('', ApiCluster, data=dic, params=params) 
102      self._update(cluster) 
103      return self 
 104   
106      """ 
107      Get all service types supported by this cluster. 
108   
109      @return: A list of service types (strings) 
110      """ 
111      resp = self._get_resource_root().get(self._path() + '/serviceTypes') 
112      return resp[ApiList.LIST_KEY] 
 113   
115      """ 
116      Retrieve a list of running commands for this cluster. 
117   
118      @param view: View to materialize ('full' or 'summary') 
119      @return: A list of running commands. 
120      """ 
121      return self._get("commands", ApiCommand, True, 
122          params = view and dict(view=view) or None) 
 123   
125      """ 
126      Rename a cluster. 
127   
128      @param newname: New cluster name 
129      @return: An ApiCluster object 
130      @since: API v2 
131      """ 
132      dic = self.to_json_dict() 
133      if self._get_resource_root().version < 6: 
134        dic['name'] = newname 
135      else: 
136        dic['displayName'] = newname 
137      return self._put_cluster(dic) 
 138   
140      """ 
141      Manually set the CDH version. 
142   
143      @param new_cdh_version: New CDH version, e.g. 4.5.1 
144      @return: An ApiCluster object 
145      @since: API v6 
146      """ 
147      dic = self.to_json_dict() 
148      dic['fullVersion'] = new_cdh_version 
149      return self._put_cluster(dic) 
 150   
152      """ 
153      Create a service. 
154   
155      @param name: Service name 
156      @param service_type: Service type 
157      @return: An ApiService object 
158      """ 
159      return services.create_service(self._get_resource_root(), name, 
160          service_type, self.name) 
 161   
163      """ 
164      Delete a service by name. 
165   
166      @param name: Service name 
167      @return: The deleted ApiService object 
168      """ 
169      return services.delete_service(self._get_resource_root(), name, self.name) 
 170   
172      """ 
173      Lookup a service by name. 
174   
175      @param name: Service name 
176      @return: An ApiService object 
177      """ 
178      return services.get_service(self._get_resource_root(), name, self.name) 
 179   
187   
189      """ 
190      Lookup a parcel by product and version. 
191   
192      @param product: the product name 
193      @param version: the product version 
194      @return: An ApiParcel object 
195      """ 
196      return parcels.get_parcel(self._get_resource_root(), product, version, self.name) 
 197   
205   
207      """ 
208      Lists all the hosts that are associated with this cluster. 
209   
210      @return: A list of ApiHostRef objects of the hosts in the cluster. 
211      @since: API v3 
212      """ 
213      return self._get("hosts", ApiHostRef, True, api_version=3) 
 214   
216      """ 
217      Removes the association of the host with the cluster. 
218   
219      @return: A ApiHostRef of the host that was removed. 
220      @since: API v3 
221      """ 
222      return self._delete("hosts/" + hostId, ApiHostRef, api_version=3) 
 223   
225      """ 
226      Removes the association of all the hosts with the cluster. 
227   
228      @return: A list of ApiHostRef objects of the hosts that were removed. 
229      @since: API v3 
230      """ 
231      return self._delete("hosts", ApiHostRef, True, api_version=3) 
 232   
234      """ 
235      Adds a host to the cluster. 
236   
237      @param hostIds: List of IDs of hosts to add to cluster. 
238      @return: A list of ApiHostRef objects of the new 
239               hosts that were added to the cluster 
240      @since: API v3 
241      """ 
242      hostRefList = [ApiHostRef(self._get_resource_root(), x) for x in hostIds] 
243      return self._post("hosts", ApiHostRef, True, data=hostRefList, 
244          api_version=3) 
 245   
247      """ 
248      Start all services in a cluster, respecting dependencies. 
249   
250      @return: Reference to the submitted command. 
251      """ 
252      return self._cmd('start') 
 253   
255      """ 
256      Stop all services in a cluster, respecting dependencies. 
257   
258      @return: Reference to the submitted command. 
259      """ 
260      return self._cmd('stop') 
 261   
262 -  def restart(self, restart_only_stale_services=None, 
263      redeploy_client_configuration=None, 
264      restart_service_names=None): 
 265      """ 
266      Restart all services in the cluster. 
267      Services are restarted in the appropriate order given their dependencies. 
268   
269      @param restart_only_stale_services: Only restart services that have stale 
270                                          configuration and their dependent 
271                                          services. Default is False. 
272      @param redeploy_client_configuration: Re-deploy client configuration for 
273                                            all services in the cluster. Default 
274                                            is False. 
275      @param restart_service_names: Only restart services that are specified and their dependent services. 
276                                    Available since API v11. 
277      @since API v6 
278   
279      @return: Reference to the submitted command. 
280      """ 
281      if self._get_resource_root().version < 6: 
282        return self._cmd('restart') 
283      else: 
284        args = dict() 
285        args['restartOnlyStaleServices'] = restart_only_stale_services 
286        args['redeployClientConfiguration'] = redeploy_client_configuration 
287        if self._get_resource_root().version >= 11: 
288          args['restartServiceNames'] = restart_service_names 
289        return self._cmd('restart', data=args, api_version=6) 
 290   
292      """ 
293      Deploys Service client configuration to the hosts on the cluster. 
294   
295      @return: Reference to the submitted command. 
296      @since: API v2 
297      """ 
298      return self._cmd('deployClientConfig') 
 299   
301      """ 
302      Deploys Cluster client configuration (Kerberos configuration) to the 
303      hosts on the cluster. Any hosts that are decommissioned or have running 
304      roles will be skipped. 
305   
306      @param hostIds: hostIds of hosts to deploy to. If empty, deploys to all 
307                      hosts in the cluster. 
308      @return: Reference to the submitted command. 
309      @since: API v7 
310      """ 
311      return self._cmd('deployClusterClientConfig', data=hostIds, 
312        api_version=7) 
 313   
315      """ 
316      This command is no longer recommended with API v6 onwards. It simply does 
317      not work when parcels are used, and even with packages it may fail due to 
318      a race. Use upgrade_cdh instead. 
319   
320      Upgrades the services in the cluster to CDH5 version. 
321      This command requires that the CDH packages in the hosts used by the 
322      cluster be upgraded to CDH5 before this command is issued. Once issued, 
323      this command will stop all running services before proceeding. 
324   
325      If parcels are used instead of CDH system packages then the following 
326      steps need to happen in order: 
327        1. Stop all services manually 
328        2. Activate parcel 
329        3. Run this upgrade command 
330   
331      The command will upgrade the services and their configuration to the 
332      version available in the CDH5 distribution. 
333   
334      @return: Reference to the submitted command. 
335      @deprecated: since API v6 
336      """ 
337      return self._cmd('upgradeServices') 
 338   
340      """ 
341      Put the cluster in maintenance mode. 
342   
343      @return: Reference to the completed command. 
344      @since: API v2 
345      """ 
346      cmd = self._cmd('enterMaintenanceMode') 
347      if cmd.success: 
348        self._update(get_cluster(self._get_resource_root(), self.name)) 
349      return cmd 
 350   
352      """ 
353      Take the cluster out of maintenance mode. 
354   
355      @return: Reference to the completed command. 
356      @since: API v2 
357      """ 
358      cmd = self._cmd('exitMaintenanceMode') 
359      if cmd.success: 
360        self._update(get_cluster(self._get_resource_root(), self.name)) 
361      return cmd 
 362   
369   
377   
385   
393   
394 -  def rolling_restart(self, slave_batch_size=None, 
395                        slave_fail_count_threshold=None, 
396                        sleep_seconds=None, 
397                        stale_configs_only=None, 
398                        unupgraded_only=None, 
399                        roles_to_include=None, 
400                        restart_service_names=None): 
 401      """ 
402      Command to do a "best-effort" rolling restart of the given cluster, 
403      i.e. it does plain restart of services that cannot be rolling restarted, 
404      followed by first rolling restarting non-slaves and then rolling restarting 
405      the slave roles of services that can be rolling restarted. The slave restarts 
406      are done host-by-host. 
407      @param slave_batch_size: Number of hosts with slave roles to restart at a time 
408             Must be greater than 0. Default is 1. 
409      @param slave_fail_count_threshold: The threshold for number of slave host batches that 
410             are allowed to fail to restart before the entire command is considered failed. 
411             Must be >= 0. Default is 0. 
412      @param sleep_seconds: Number of seconds to sleep between restarts of slave host batches. 
413             Must be >=0. Default is 0. 
414      @param stale_configs_only: Restart roles with stale configs only. Default is false. 
415      @param unupgraded_only: Restart roles that haven't been upgraded yet. Default is false. 
416      @param roles_to_include: Role types to restart. Default is slave roles only. 
417      @param restart_service_names: List of specific services to restart. 
418      @return: Reference to the submitted command. 
419      @since: API v4 
420      """ 
421      args = dict() 
422      if slave_batch_size: 
423        args['slaveBatchSize'] = slave_batch_size 
424      if slave_fail_count_threshold: 
425        args['slaveFailCountThreshold'] = slave_fail_count_threshold 
426      if sleep_seconds: 
427        args['sleepSeconds'] = sleep_seconds 
428      if stale_configs_only: 
429        args['staleConfigsOnly'] = stale_configs_only 
430      if unupgraded_only: 
431        args['unUpgradedOnly'] = unupgraded_only 
432      if roles_to_include: 
433        args['rolesToInclude'] = roles_to_include 
434      if restart_service_names: 
435        args['restartServiceNames'] = restart_service_names 
436   
437      return self._cmd('rollingRestart', data=args, api_version=4) 
 438   
439 -  def rolling_upgrade(self, upgrade_from_cdh_version, 
440                        upgrade_to_cdh_version, 
441                        upgrade_service_names, 
442                        slave_batch_size=None, 
443                        slave_fail_count_threshold=None, 
444                        sleep_seconds=None): 
 445      """ 
446      Command to do a rolling upgrade of services in the given cluster 
447   
448      This command does not handle any services that don't support rolling 
449      upgrades. The command will throw an error and not start if upgrade of 
450      any such service is requested. 
451   
452      This command does not upgrade the full CDH Cluster. You should normally 
453      use the upgradeCDH Command for upgrading the cluster. This is primarily 
454      helpful if you need to need to recover from an upgrade failure or for 
455      advanced users to script an alternative to the upgradeCdhCommand. 
456   
457      This command expects the binaries to be available on hosts and activated. 
458      It does not change any binaries on the hosts. 
459   
460      @param upgrade_from_cdh_version: Current CDH Version of the services. 
461             Example versions are: "5.1.0", "5.2.2" or "5.4.0" 
462      @param upgrade_to_cdh_version: Target CDH Version for the services. 
463             The CDH version should already be present and activated on the nodes. 
464             Example versions are: "5.1.0", "5.2.2" or "5.4.0" 
465      @param upgrade_service_names: List of specific services to be upgraded and restarted. 
466      @param slave_batch_size: Number of hosts with slave roles to restart at a time 
467             Must be greater than 0. Default is 1. 
468      @param slave_fail_count_threshold: The threshold for number of slave host batches that 
469             are allowed to fail to restart before the entire command is considered failed. 
470             Must be >= 0. Default is 0. 
471      @param sleep_seconds: Number of seconds to sleep between restarts of slave host batches. 
472             Must be >=0. Default is 0. 
473   
474      @return: Reference to the submitted command. 
475      @since: API v10 
476      """ 
477      args = dict() 
478      args['upgradeFromCdhVersion'] = upgrade_from_cdh_version 
479      args['upgradeToCdhVersion'] = upgrade_to_cdh_version 
480      args['upgradeServiceNames'] = upgrade_service_names 
481   
482      if slave_batch_size: 
483        args['slaveBatchSize'] = slave_batch_size 
484      if slave_fail_count_threshold: 
485        args['slaveFailCountThreshold'] = slave_fail_count_threshold 
486      if sleep_seconds: 
487        args['sleepSeconds'] = sleep_seconds 
488   
489      return self._cmd('rollingUpgrade', data=args, api_version=10) 
 490   
492      """ 
493      Automatically assign roles to hosts and create the roles for all the services in a cluster. 
494   
495      Assignments are done based on services in the cluster and hardware specifications. 
496      Existing roles will be taken into account and their assignments will be not be modified. 
497      @since: API v6 
498      """ 
499      self._put("autoAssignRoles", None, api_version=6) 
 500   
515   
517      """ 
518      Prepare and start services in a cluster. 
519      Perform all the steps needed to prepare each service in a 
520      cluster and start the services in order. 
521   
522      @return: Reference to the submitted command. 
523      @since: API v7 
524      """ 
525      return self._cmd('firstRun', None, api_version=7) 
 526   
527 -  def upgrade_cdh(self, deploy_client_config=True, start_all_services=True, 
528        cdh_parcel_version=None, cdh_package_version=None, 
529        rolling_restart=False, slave_batch_size=None, sleep_seconds=None, 
530        slave_fail_count_threshold=None): 
 531      """ 
532      Perform CDH upgrade to the next major version. In v9+, also supports 
533      minor CDH 5 upgrades (5.a.b to 5.x.y where x > a) and supports maintenance 
534      release changes (a.b.x to a.b.y). 
535   
536      If using packages, CDH packages on all hosts of the cluster must be 
537      manually upgraded before this command is issued. 
538   
539      The command will upgrade the services and their configuration to the 
540      requested version. All running services will be stopped before proceeding, 
541      unless rolling restart is requested and is available. 
542   
543      @param deploy_client_config: Whether to deploy client configurations 
544             after the upgrade. Default is True. Has no effect in v9+; 
545             client configurations are always deployed. 
546      @param start_all_services: Whether to start all services after the upgrade. 
547             Default is True. Has no effect in v9+; services are always 
548             restarted. 
549      @param cdh_parcel_version: If upgrading to parcels, the full version of an 
550             already distributed parcel for the next CDH version. Default 
551             is None. Example versions are: '5.0.0-1.cdh5.0.0.p0.11' or 
552             '5.0.2-1.cdh5.0.2.p0.32'. 
553      @param cdh_package_version: If upgrading to packages, the full version of an 
554             already installed package for the next CDH version. Default 
555             is None. Example versions are: '5.2.0' or '4.5.0'. Only available 
556             since v9. 
557      @param rolling_restart: If you'd like to do a rolling restart, set this to 
558             True. Default is False. Only available since v9. 
559      @param slave_batch_size: Controls the rolling restart slave batch size. 
560             Only applicable when rolling_restart is True. 
561      @param sleep_seconds: Controls how many seconds to sleep betweein rolling 
562             restart batches. Only applicable when rolling_restart is True. 
563      @param slave_fail_count_threshold: Controls how many slave restart failures 
564             are tolerated in a rolling restart. Only applicable when 
565             rolling_restart is True. 
566      @return: Reference to the submitted command. 
567      @since: API v6 for major upgrades only, v9 for maintenance and CDH 5 minor 
568              releases. 
569      """ 
570      args = dict() 
571      args['deployClientConfig'] = deploy_client_config 
572      args['startAllServices'] = start_all_services 
573      if cdh_parcel_version: 
574        args['cdhParcelVersion'] = cdh_parcel_version 
575      if cdh_package_version: 
576        args['cdhPackageVersion'] = cdh_package_version 
577      if rolling_restart: 
578        args['rollingRestartArgs'] = { 
579            'slaveBatchSize' : slave_batch_size, 
580            'sleepSeconds' : sleep_seconds, 
581            'slaveFailCountThreshold' : slave_fail_count_threshold 
582          } 
583      return self._cmd('upgradeCdh', data=args, api_version=6) 
 584   
609   
610 -  def export(self, export_auto_config=False): 
 611      """ 
612      Export the cluster template for the given cluster. ccluster must have host 
613      templates defined. It cluster does not have host templates defined it will 
614      export host templates based on roles assignment. 
615   
616      @param export_auto_config: Also export auto configured configs 
617      @return: Return cluster template 
618      @since: API v12 
619      """ 
620   
621      return self._get("export", ApiClusterTemplate, False, 
622                       params=dict(exportAutoConfig=export_auto_config), api_version=12) 
 623   
625      """ 
626      Refresh Dynamic Pools configurations for relevant services.. 
627   
628      @return: Reference to the submitted command. 
629      @since: API v6 
630      """ 
631      return self._cmd('poolsRefresh', api_version=6) 
 632   
634      """ 
635      List available DFS (distributed file system) services in a cluster. 
636      @param view: View to materialize 
637      @return: List of available distributed file system services in the cluster. 
638      @since: API v12 
639      """ 
640      if view: 
641        return self._get_resource_root().get("%s/%s?view=%s" % (self._path(), 'dfsServices', view)) 
642      else: 
643        return self._get_resource_root().get("%s/%s" % (self._path(), 'dfsServices')) 
  644