This is an automated email from the ASF dual-hosted git repository.

mwalch pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/fluo-muchos.git


The following commit(s) were added to refs/heads/master by this push:
     new 656a785  Improve config to handle different cluster types (#249)
656a785 is described below

commit 656a785e37eba2653cea96d8a6fd1158dd9c1b7d
Author: Mike Walch <[email protected]>
AuthorDate: Thu Jan 31 13:51:58 2019 -0500

    Improve config to handle different cluster types (#249)
    
    * Configuration object now returns correct config
      based on cluster type
---
 conf/muchos.props.example | 10 ++++---
 lib/muchos/config.py      | 67 ++++++++++++++++++++++++++++++++++++-----------
 lib/muchos/existing.py    | 29 ++++++--------------
 lib/tests/test_config.py  | 36 ++++++++++++++++++++++---
 4 files changed, 98 insertions(+), 44 deletions(-)

diff --git a/conf/muchos.props.example b/conf/muchos.props.example
index c781238..899beef 100644
--- a/conf/muchos.props.example
+++ b/conf/muchos.props.example
@@ -80,10 +80,12 @@ shutdown_delay_minutes = 0
 shutdown_behavior = stop
 
 [existing]
-mount_root = /var/disk
-mounts = /var/disk01,/var/disk02,/var/disk03
-devices = /dev/hdb1,/dev/hdc1,/dev/hdd1
-metrics_drive_ids = var-disk01,var-disk02,var-disk03
+# Root of data dirs
+mount_root = /var/data
+# Data directories on all nodes
+data_dirs = /var/data1,/var/data2,/var/data3
+# Identifies drives for metrics
+metrics_drive_ids = var-data1,var-data2,var-data3
 
 [performance]
 # Automatically tune Accumulo, Yarn, and Fluo performance setting by selecting 
or
diff --git a/lib/muchos/config.py b/lib/muchos/config.py
index d9a89bb..ace1532 100644
--- a/lib/muchos/config.py
+++ b/lib/muchos/config.py
@@ -36,7 +36,7 @@ class DeployConfig(ConfigParser):
         self.cluster_name = cluster_name
         self.sg_name = cluster_name + '-group'
         self.ephemeral_root = 'ephemeral'
-        self.mount_root = '/media/' + self.ephemeral_root
+        self.cluster_type = self.get('general', 'cluster_type')
         self.metrics_drive_root = 'media-' + self.ephemeral_root
         self.node_d = None
         self.hosts = None
@@ -87,10 +87,11 @@ class DeployConfig(ConfigParser):
 
     def node_type_map(self):
         node_types = {}
-        node_list = [('default', self.default_ephemeral_devices()), ('worker', 
self.worker_ephemeral_devices())]
+        if self.get_cluster_type() == 'ec2':
+            node_list = [('default', self.default_ephemeral_devices()), 
('worker', self.worker_ephemeral_devices())]
 
-        for (ntype, devices) in node_list:
-            node_types[ntype] = {'mounts': self.mounts(len(devices)), 
'devices': devices}
+            for (ntype, devices) in node_list:
+                node_types[ntype] = {'mounts': self.mounts(len(devices)), 
'devices': devices}
         return node_types
 
     def node_type(self, hostname):
@@ -101,26 +102,57 @@ class DeployConfig(ConfigParser):
     def mounts(self, num_ephemeral):
         mounts = []
         for i in range(0, num_ephemeral):
-            mounts.append(self.mount_root + str(i))
+            mounts.append(self.mount_root() + str(i))
         return mounts
 
+    def mount_root(self):
+        if self.get_cluster_type() == 'ec2':
+            return '/media/' + self.ephemeral_root
+        elif self.get_cluster_type() == 'existing':
+            return self.get('existing', 'mount_root')
+
     def fstype(self):
-        retval = self.get('ec2', 'fstype')
-        if not retval:
-            return 'ext3'
+        retval = None
+        if self.get_cluster_type() == 'ec2':
+            retval = self.get('ec2', 'fstype')
+            if not retval:
+                return 'ext3'
         return retval
 
     def force_format(self):
-        retval = self.get('ec2', 'force_format')
-        if not retval:
-            return 'no'
+        retval = 'no'
+        if self.get_cluster_type() == 'ec2':
+            retval = self.get('ec2', 'force_format')
+            if not retval:
+                return 'no'
         return retval
 
+    def worker_data_dirs(self):
+        if self.get_cluster_type() == 'ec2':
+            return self.node_type_map()['worker']['mounts']
+        elif self.get_cluster_type() == 'existing':
+            return self.get('existing', 'data_dirs').split(",")
+
+    def default_data_dirs(self):
+        if self.get_cluster_type() == 'ec2':
+            return self.node_type_map()['default']['mounts']
+        elif self.get_cluster_type() == 'existing':
+            return self.get('existing', 'data_dirs').split(",")
+
     def metrics_drive_ids(self):
-        drive_ids = []
-        for i in range(0, self.max_ephemeral()):
-            drive_ids.append(self.metrics_drive_root + str(i))
-        return drive_ids
+        if self.get_cluster_type() == 'ec2':
+            drive_ids = []
+            for i in range(0, self.max_ephemeral()):
+                drive_ids.append(self.metrics_drive_root + str(i))
+            return drive_ids
+        elif self.get_cluster_type() == 'existing':
+            return self.get("existing", "metrics_drive_ids").split(",")
+
+    def shutdown_delay_minutes(self):
+        retval = '0'
+        if self.get_cluster_type() == 'ec2':
+            retval = self.get("ec2", "shutdown_delay_minutes")
+        return retval
 
     def version(self, software_id):
         return self.get('general', software_id + '_version')
@@ -247,6 +279,11 @@ class DeployConfig(ConfigParser):
     def get_public_ip(self, hostname):
         return self.get_hosts()[hostname][1]
 
+    def get_cluster_type(self):
+        if self.cluster_type not in ('ec2', 'existing'):
+            exit('ERROR - Unknown cluster type' + self.cluster_type)
+        return self.cluster_type
+
     def proxy_hostname(self):
         return self.get('general', 'proxy_hostname')
 
diff --git a/lib/muchos/existing.py b/lib/muchos/existing.py
index 3fcd08e..6f79a4e 100644
--- a/lib/muchos/existing.py
+++ b/lib/muchos/existing.py
@@ -55,27 +55,14 @@ class ExistingCluster:
         play_vars['hadoop_sha256'] = config.checksum('hadoop')
         play_vars['spark_sha256'] = config.checksum('spark')
         play_vars['zookeeper_sha256'] = config.checksum('zookeeper')
-
-        cluster_type = host_vars.get('cluster_type', 'ec2')
-        node_type_map = {}
-        if cluster_type == 'ec2':
-            node_type_map = config.node_type_map()
-            play_vars["mount_root"] = config.mount_root
-            play_vars["metrics_drive_ids"] = config.metrics_drive_ids()
-            play_vars["fstype"] = config.fstype()
-            play_vars["force_format"] = config.force_format()
-            play_vars["shutdown_delay_minutes"] = config.get("ec2", 
"shutdown_delay_minutes")
-        if cluster_type == 'existing':
-            play_vars["mount_root"] = config.get("existing", "mount_root")
-            play_vars["metrics_drive_ids"] = config.get("existing", 
"metrics_drives_ids").split(",")
-            mounts = config.get("existing", "mounts").split(",")
-            devices = config.get("existing", "devices").split(",")
-            for node_type in 'default', 'worker':
-                node_type_map[node_type] = {'mounts': mounts, 'devices': 
devices}
-
-        play_vars["node_type_map"] = node_type_map
-        host_vars['worker_data_dirs'] = str(node_type_map['worker']['mounts'])
-        host_vars['default_data_dirs'] = 
str(node_type_map['default']['mounts'])
+        play_vars["shutdown_delay_minutes"] = config.shutdown_delay_minutes()
+        play_vars["metrics_drive_ids"] = config.metrics_drive_ids()
+        play_vars["mount_root"] = config.mount_root()
+        play_vars["node_type_map"] = config.node_type_map()
+        play_vars["fstype"] = config.fstype()
+        play_vars["force_format"] = config.force_format()
+        host_vars['worker_data_dirs'] = str(config.worker_data_dirs())
+        host_vars['default_data_dirs'] = str(config.default_data_dirs())
 
         with open(join(config.deploy_path, "ansible/site.yml"), 'w') as 
site_file:
             print("- import_playbook: common.yml", file=site_file)
diff --git a/lib/tests/test_config.py b/lib/tests/test_config.py
index eed5a50..c69fc9a 100644
--- a/lib/tests/test_config.py
+++ b/lib/tests/test_config.py
@@ -18,7 +18,7 @@
 from muchos.config import DeployConfig
 
 
-def test_defaults():
+def test_ec2_cluster():
     c = DeployConfig("muchos", '../conf/muchos.props.example', 
'../conf/hosts/example/example_cluster',
                      '../conf/checksums', 'mycluster')
     assert c.checksum_ver('accumulo', '1.9.0') == 
'f68a6145029a9ea843b0305c90a7f5f0334d8a8ceeea94734267ec36421fe7fe'
@@ -27,6 +27,13 @@ def test_defaults():
     assert c.get('ec2', 'worker_instance_type') == 'm5d.large'
     assert c.get('ec2', 'aws_ami') == 'ami-9887c6e7'
     assert c.max_ephemeral() == 1
+    assert c.mount_root() == '/media/ephemeral'
+    assert c.fstype() == 'ext3'
+    assert c.force_format() == 'no'
+    assert c.worker_data_dirs() == ['/media/ephemeral0']
+    assert c.default_data_dirs() == ['/media/ephemeral0']
+    assert c.metrics_drive_ids() == ['media-ephemeral0']
+    assert c.shutdown_delay_minutes() == '0'
     assert c.mounts(2) == ['/media/ephemeral0', '/media/ephemeral1']
     assert c.node_type_map() == {'default': {'mounts': ['/media/ephemeral0', 
], 'devices': ['/dev/nvme1n1', ]},
                                  'worker': {'mounts': ['/media/ephemeral0', ], 
'devices': ['/dev/nvme1n1', ]}}
@@ -45,10 +52,13 @@ def test_defaults():
     assert not c.has_service('fluo')
     assert c.get_service_hostnames('worker') == ['worker1', 'worker2', 
'worker3', 'worker4']
     assert c.get_service_hostnames('zookeeper') == ['leader1']
-    assert c.get_hosts() == {'leader2': ('10.0.0.1', None), 'leader1': 
('10.0.0.0', '23.0.0.0'), 'worker1': ('10.0.0.2', None), 'worker3': 
('10.0.0.4', None), 'worker2': ('10.0.0.3', None), 'worker4': ('10.0.0.5', 
None)}
+    assert c.get_hosts() == {'leader2': ('10.0.0.1', None), 'leader1': 
('10.0.0.0', '23.0.0.0'),
+                             'worker1': ('10.0.0.2', None), 'worker3': 
('10.0.0.4', None),
+                             'worker2': ('10.0.0.3', None), 'worker4': 
('10.0.0.5', None)}
     assert c.get_public_ip('leader1') == '23.0.0.0'
     assert c.get_private_ip('leader1') == '10.0.0.0'
     assert c.cluster_name == 'mycluster'
+    assert c.get_cluster_type() == 'ec2'
     assert c.version("accumulo").startswith('2.')
     assert c.version("fluo").startswith('1.')
     assert c.version("hadoop").startswith('3.')
@@ -61,8 +71,26 @@ def test_defaults():
     assert c.get('general', 'cluster_user') == "centos"
     assert c.get_non_proxy() == [('10.0.0.1', 'leader2'), ('10.0.0.2', 
'worker1'), ('10.0.0.3', 'worker2'),
                                  ('10.0.0.4', 'worker3'), ('10.0.0.5', 
'worker4')]
-    assert c.get_host_services() == [('leader1', 'namenode resourcemanager 
accumulomaster zookeeper'), ('leader2', 'metrics'),
-            ('worker1', 'worker swarmmanager'), ('worker2', 'worker'), 
('worker3', 'worker'), ('worker4', 'worker')]
+    assert c.get_host_services() == [('leader1', 'namenode resourcemanager 
accumulomaster zookeeper'),
+                                     ('leader2', 'metrics'),
+                                     ('worker1', 'worker swarmmanager'), 
('worker2', 'worker'), ('worker3', 'worker'),
+                                     ('worker4', 'worker')]
+
+
+def test_existing_cluster():
+    c = DeployConfig("muchos", '../conf/muchos.props.example', 
'../conf/hosts/example/example_cluster',
+                     '../conf/checksums', 'mycluster')
+    c.cluster_type = 'existing'
+    assert c.get_cluster_type() == 'existing'
+    assert c.node_type_map() == {}
+    assert c.mount_root() == '/var/data'
+    assert c.fstype() is None
+    assert c.force_format() == 'no'
+    assert c.worker_data_dirs() == ['/var/data1', '/var/data2', '/var/data3']
+    assert c.default_data_dirs() == ['/var/data1', '/var/data2', '/var/data3']
+    assert c.metrics_drive_ids() == ['var-data1', 'var-data2', 'var-data3']
+    assert c.shutdown_delay_minutes() == '0'
+
 
 def test_case_sensitive():
     c = DeployConfig("muchos", '../conf/muchos.props.example', 
'../conf/hosts/example/example_cluster',

Reply via email to