فهرست منبع

AMBARI-7572. Ambari puts master components on 7 nodes in a 10 node cluster

Srimanth Gunturi 10 سال پیش
والد
کامیت
d284e71968

+ 6 - 11
ambari-server/src/main/resources/stacks/stack_advisor.py

@@ -365,9 +365,9 @@ class DefaultStackAdvisor(StackAdvisor):
                 hostsCount = len(availableHosts)
               hostsForComponent = availableHosts[:hostsCount]
             else:
-              hostsForComponent = [self.getHostForComponent(component, availableHosts, hostsComponentsMap)]
+              hostsForComponent = [self.getHostForComponent(component, availableHosts)]
           else:
-            hostsForComponent = [self.getHostForComponent(component, availableHosts, hostsComponentsMap)]
+            hostsForComponent = [self.getHostForComponent(component, availableHosts)]
 
         #extend 'hostsComponentsMap' with 'hostsForComponent'
         for hostName in hostsForComponent:
@@ -532,23 +532,18 @@ class DefaultStackAdvisor(StackAdvisor):
   def getComponentCardinality(self, componentName):
     return self.getCardinalitiesDict().get(componentName, {"min": 1, "max": 1})
 
-  def getHostForComponent(self, component, hostsList, hostsComponentsMap):
+  def getHostForComponent(self, component, hostsList):
     componentName = self.getComponentName(component)
 
-    if len(hostsList) == 1:
-      return hostsList[0]
-    else:
+    if len(hostsList) != 1:
       scheme = self.getComponentLayoutScheme(componentName)
       if scheme is not None:
         for key in scheme.keys():
           if isinstance(key, ( int, long )):
             if len(hostsList) < key:
               return hostsList[scheme[key]]
-      return self.getLeastOccupiedHost(hostsList, hostsComponentsMap)
-
-  def getLeastOccupiedHost(self, hostsList, hostComponentsMap):
-    hostOccupations = dict((host, len(components)) for host, components in hostComponentsMap.iteritems() if host in hostsList)
-    return min(hostOccupations, key=hostOccupations.get)
+        return hostsList[scheme['else']]
+    return hostsList[0]
 
   def getComponentLayoutScheme(self, componentName):
     """

+ 4 - 5
ambari-server/src/test/python/TestStackAdvisor.py

@@ -308,17 +308,16 @@ class TestStackAdvisorInitialization(TestCase):
           "host_groups": [
             {
               "name": "host-group-1",
-              "components": [
-                {"name": "GANGLIA_SERVER"},
-                {"name": "NAMENODE"},
-                {"name": "ZOOKEEPER_SERVER"}
-              ]
+              "components": []
             },
             {
               "name": "host-group-2",
               "components": [
+                {"name": "GANGLIA_SERVER"},
                 {"name": "HBASE_MASTER"},
+                {"name": "NAMENODE"},
                 {"name": "SECONDARY_NAMENODE"},
+                {"name": "ZOOKEEPER_SERVER"},
                 {"name": "ZOOKEEPER_CLIENT"}
               ]
             }

+ 554 - 0
ambari-server/src/test/python/stacks/2.1/common/hosts.json

@@ -0,0 +1,554 @@
+{
+  "href" : "/api/v1/hosts?fields=*&Hosts/host_name.in(ipan10-10.c.pramod-thangali.internal,ipan10-2.c.pramod-thangali.internal,ipan10-3.c.pramod-thangali.internal,ipan10-4.c.pramod-thangali.internal,ipan10-5.c.pramod-thangali.internal,ipan10-6.c.pramod-thangali.internal,ipan10-7.c.pramod-thangali.internal,ipan10-8.c.pramod-thangali.internal,ipan10-9.c.pramod-thangali.internal)",
+  "items" : [
+    {
+      "href" : "/api/v1/hosts/ipan10-10.c.pramod-thangali.internal",
+      "Hosts" : {
+        "cpu_count" : 1,
+        "desired_configs" : null,
+        "disk_info" : [
+          {
+            "available" : "8643532",
+            "used" : "1151444",
+            "percent" : "12%",
+            "size" : "10319160",
+            "type" : "ext4",
+            "mountpoint" : "/"
+          },
+          {
+            "available" : "1832436",
+            "used" : "0",
+            "percent" : "0%",
+            "size" : "1832436",
+            "type" : "tmpfs",
+            "mountpoint" : "/dev/shm"
+          }
+        ],
+        "host_health_report" : "",
+        "host_name" : "ipan10-10.c.pramod-thangali.internal",
+        "host_state" : "HEALTHY",
+        "host_status" : "HEALTHY",
+        "ip" : "10.240.189.116",
+        "last_agent_env" : {
+          "stackFoldersAndFiles" : [ ],
+          "alternatives" : [ ],
+          "existingUsers" : [ ],
+          "existingRepos" : [ ],
+          "installedPackages" : [ ],
+          "hostHealth" : {
+            "activeJavaProcs" : [ ],
+            "agentTimeStampAtReporting" : 1412083457014,
+            "serverTimeStampAtReporting" : 1412083457068,
+            "liveServices" : [
+              {
+                "desc" : "",
+                "name" : "ntpd",
+                "status" : "Healthy"
+              }
+            ]
+          },
+          "umask" : 18,
+          "transparentHugePage" : "always",
+          "iptablesIsRunning" : true,
+          "reverseLookup" : true
+        },
+        "last_heartbeat_time" : 1412083477169,
+        "last_registration_time" : 1412083350432,
+        "os_arch" : "x86_64",
+        "os_type" : "centos6",
+        "ph_cpu_count" : 1,
+        "public_host_name" : "ipan10-10.c.pramod-thangali.internal",
+        "rack_info" : "/default-rack",
+        "total_mem" : 3664872
+      }
+    },
+    {
+      "href" : "/api/v1/hosts/ipan10-2.c.pramod-thangali.internal",
+      "Hosts" : {
+        "cpu_count" : 1,
+        "desired_configs" : null,
+        "disk_info" : [
+          {
+            "available" : "8643552",
+            "used" : "1151424",
+            "percent" : "12%",
+            "size" : "10319160",
+            "type" : "ext4",
+            "mountpoint" : "/"
+          },
+          {
+            "available" : "1832436",
+            "used" : "0",
+            "percent" : "0%",
+            "size" : "1832436",
+            "type" : "tmpfs",
+            "mountpoint" : "/dev/shm"
+          }
+        ],
+        "host_health_report" : "",
+        "host_name" : "ipan10-2.c.pramod-thangali.internal",
+        "host_state" : "HEALTHY",
+        "host_status" : "HEALTHY",
+        "ip" : "10.240.54.211",
+        "last_agent_env" : {
+          "stackFoldersAndFiles" : [ ],
+          "alternatives" : [ ],
+          "existingUsers" : [ ],
+          "existingRepos" : [ ],
+          "installedPackages" : [ ],
+          "hostHealth" : {
+            "activeJavaProcs" : [ ],
+            "agentTimeStampAtReporting" : 1412083466260,
+            "serverTimeStampAtReporting" : 1412083466310,
+            "liveServices" : [
+              {
+                "desc" : "",
+                "name" : "ntpd",
+                "status" : "Healthy"
+              }
+            ]
+          },
+          "umask" : 18,
+          "transparentHugePage" : "always",
+          "iptablesIsRunning" : true,
+          "reverseLookup" : true
+        },
+        "last_heartbeat_time" : 1412083476356,
+        "last_registration_time" : 1412083349885,
+        "os_arch" : "x86_64",
+        "os_type" : "centos6",
+        "ph_cpu_count" : 1,
+        "public_host_name" : "ipan10-2.c.pramod-thangali.internal",
+        "rack_info" : "/default-rack",
+        "total_mem" : 3664872
+      }
+    },
+    {
+      "href" : "/api/v1/hosts/ipan10-3.c.pramod-thangali.internal",
+      "Hosts" : {
+        "cpu_count" : 1,
+        "desired_configs" : null,
+        "disk_info" : [
+          {
+            "available" : "8643552",
+            "used" : "1151424",
+            "percent" : "12%",
+            "size" : "10319160",
+            "type" : "ext4",
+            "mountpoint" : "/"
+          },
+          {
+            "available" : "1832436",
+            "used" : "0",
+            "percent" : "0%",
+            "size" : "1832436",
+            "type" : "tmpfs",
+            "mountpoint" : "/dev/shm"
+          }
+        ],
+        "host_health_report" : "",
+        "host_name" : "ipan10-3.c.pramod-thangali.internal",
+        "host_state" : "HEALTHY",
+        "host_status" : "HEALTHY",
+        "ip" : "10.240.91.97",
+        "last_agent_env" : {
+          "stackFoldersAndFiles" : [ ],
+          "alternatives" : [ ],
+          "existingUsers" : [ ],
+          "existingRepos" : [ ],
+          "installedPackages" : [ ],
+          "hostHealth" : {
+            "activeJavaProcs" : [ ],
+            "agentTimeStampAtReporting" : 1412083471227,
+            "serverTimeStampAtReporting" : 1412083471272,
+            "liveServices" : [
+              {
+                "desc" : "",
+                "name" : "ntpd",
+                "status" : "Healthy"
+              }
+            ]
+          },
+          "umask" : 18,
+          "transparentHugePage" : "always",
+          "iptablesIsRunning" : true,
+          "reverseLookup" : true
+        },
+        "last_heartbeat_time" : 1412083481320,
+        "last_registration_time" : 1412083354395,
+        "os_arch" : "x86_64",
+        "os_type" : "centos6",
+        "ph_cpu_count" : 1,
+        "public_host_name" : "ipan10-3.c.pramod-thangali.internal",
+        "rack_info" : "/default-rack",
+        "total_mem" : 3664872
+      }
+    },
+    {
+      "href" : "/api/v1/hosts/ipan10-4.c.pramod-thangali.internal",
+      "Hosts" : {
+        "cpu_count" : 1,
+        "desired_configs" : null,
+        "disk_info" : [
+          {
+            "available" : "8643552",
+            "used" : "1151424",
+            "percent" : "12%",
+            "size" : "10319160",
+            "type" : "ext4",
+            "mountpoint" : "/"
+          },
+          {
+            "available" : "1832436",
+            "used" : "0",
+            "percent" : "0%",
+            "size" : "1832436",
+            "type" : "tmpfs",
+            "mountpoint" : "/dev/shm"
+          }
+        ],
+        "host_health_report" : "",
+        "host_name" : "ipan10-4.c.pramod-thangali.internal",
+        "host_state" : "HEALTHY",
+        "host_status" : "HEALTHY",
+        "ip" : "10.240.245.18",
+        "last_agent_env" : {
+          "stackFoldersAndFiles" : [ ],
+          "alternatives" : [ ],
+          "existingUsers" : [ ],
+          "existingRepos" : [ ],
+          "installedPackages" : [ ],
+          "hostHealth" : {
+            "activeJavaProcs" : [ ],
+            "agentTimeStampAtReporting" : 1412083457128,
+            "serverTimeStampAtReporting" : 1412083457186,
+            "liveServices" : [
+              {
+                "desc" : "",
+                "name" : "ntpd",
+                "status" : "Healthy"
+              }
+            ]
+          },
+          "umask" : 18,
+          "transparentHugePage" : "always",
+          "iptablesIsRunning" : true,
+          "reverseLookup" : true
+        },
+        "last_heartbeat_time" : 1412083477282,
+        "last_registration_time" : 1412083350393,
+        "os_arch" : "x86_64",
+        "os_type" : "centos6",
+        "ph_cpu_count" : 1,
+        "public_host_name" : "ipan10-4.c.pramod-thangali.internal",
+        "rack_info" : "/default-rack",
+        "total_mem" : 3664872
+      }
+    },
+    {
+      "href" : "/api/v1/hosts/ipan10-5.c.pramod-thangali.internal",
+      "Hosts" : {
+        "cpu_count" : 1,
+        "desired_configs" : null,
+        "disk_info" : [
+          {
+            "available" : "8643552",
+            "used" : "1151424",
+            "percent" : "12%",
+            "size" : "10319160",
+            "type" : "ext4",
+            "mountpoint" : "/"
+          },
+          {
+            "available" : "1832436",
+            "used" : "0",
+            "percent" : "0%",
+            "size" : "1832436",
+            "type" : "tmpfs",
+            "mountpoint" : "/dev/shm"
+          }
+        ],
+        "host_health_report" : "",
+        "host_name" : "ipan10-5.c.pramod-thangali.internal",
+        "host_state" : "HEALTHY",
+        "host_status" : "HEALTHY",
+        "ip" : "10.240.159.192",
+        "last_agent_env" : {
+          "stackFoldersAndFiles" : [ ],
+          "alternatives" : [ ],
+          "existingUsers" : [ ],
+          "existingRepos" : [ ],
+          "installedPackages" : [ ],
+          "hostHealth" : {
+            "activeJavaProcs" : [ ],
+            "agentTimeStampAtReporting" : 1412083468316,
+            "serverTimeStampAtReporting" : 1412083468358,
+            "liveServices" : [
+              {
+                "desc" : "",
+                "name" : "ntpd",
+                "status" : "Healthy"
+              }
+            ]
+          },
+          "umask" : 18,
+          "transparentHugePage" : "always",
+          "iptablesIsRunning" : true,
+          "reverseLookup" : true
+        },
+        "last_heartbeat_time" : 1412083478406,
+        "last_registration_time" : 1412083351596,
+        "os_arch" : "x86_64",
+        "os_type" : "centos6",
+        "ph_cpu_count" : 1,
+        "public_host_name" : "ipan10-5.c.pramod-thangali.internal",
+        "rack_info" : "/default-rack",
+        "total_mem" : 3664872
+      }
+    },
+    {
+      "href" : "/api/v1/hosts/ipan10-6.c.pramod-thangali.internal",
+      "Hosts" : {
+        "cpu_count" : 1,
+        "desired_configs" : null,
+        "disk_info" : [
+          {
+            "available" : "8643552",
+            "used" : "1151424",
+            "percent" : "12%",
+            "size" : "10319160",
+            "type" : "ext4",
+            "mountpoint" : "/"
+          },
+          {
+            "available" : "1832436",
+            "used" : "0",
+            "percent" : "0%",
+            "size" : "1832436",
+            "type" : "tmpfs",
+            "mountpoint" : "/dev/shm"
+          }
+        ],
+        "host_health_report" : "",
+        "host_name" : "ipan10-6.c.pramod-thangali.internal",
+        "host_state" : "HEALTHY",
+        "host_status" : "HEALTHY",
+        "ip" : "10.240.185.216",
+        "last_agent_env" : {
+          "stackFoldersAndFiles" : [ ],
+          "alternatives" : [ ],
+          "existingUsers" : [ ],
+          "existingRepos" : [ ],
+          "installedPackages" : [ ],
+          "hostHealth" : {
+            "activeJavaProcs" : [ ],
+            "agentTimeStampAtReporting" : 1412083469031,
+            "serverTimeStampAtReporting" : 1412083469087,
+            "liveServices" : [
+              {
+                "desc" : "",
+                "name" : "ntpd",
+                "status" : "Healthy"
+              }
+            ]
+          },
+          "umask" : 18,
+          "transparentHugePage" : "always",
+          "iptablesIsRunning" : true,
+          "reverseLookup" : true
+        },
+        "last_heartbeat_time" : 1412083479135,
+        "last_registration_time" : 1412083351880,
+        "os_arch" : "x86_64",
+        "os_type" : "centos6",
+        "ph_cpu_count" : 1,
+        "public_host_name" : "ipan10-6.c.pramod-thangali.internal",
+        "rack_info" : "/default-rack",
+        "total_mem" : 3664872
+      }
+    },
+    {
+      "href" : "/api/v1/hosts/ipan10-7.c.pramod-thangali.internal",
+      "Hosts" : {
+        "cpu_count" : 1,
+        "desired_configs" : null,
+        "disk_info" : [
+          {
+            "available" : "8643552",
+            "used" : "1151424",
+            "percent" : "12%",
+            "size" : "10319160",
+            "type" : "ext4",
+            "mountpoint" : "/"
+          },
+          {
+            "available" : "1832436",
+            "used" : "0",
+            "percent" : "0%",
+            "size" : "1832436",
+            "type" : "tmpfs",
+            "mountpoint" : "/dev/shm"
+          }
+        ],
+        "host_health_report" : "",
+        "host_name" : "ipan10-7.c.pramod-thangali.internal",
+        "host_state" : "HEALTHY",
+        "host_status" : "HEALTHY",
+        "ip" : "10.240.182.17",
+        "last_agent_env" : {
+          "stackFoldersAndFiles" : [ ],
+          "alternatives" : [ ],
+          "existingUsers" : [ ],
+          "existingRepos" : [ ],
+          "installedPackages" : [ ],
+          "hostHealth" : {
+            "activeJavaProcs" : [ ],
+            "agentTimeStampAtReporting" : 1412083457228,
+            "serverTimeStampAtReporting" : 1412083457274,
+            "liveServices" : [
+              {
+                "desc" : "",
+                "name" : "ntpd",
+                "status" : "Healthy"
+              }
+            ]
+          },
+          "umask" : 18,
+          "transparentHugePage" : "always",
+          "iptablesIsRunning" : true,
+          "reverseLookup" : true
+        },
+        "last_heartbeat_time" : 1412083477378,
+        "last_registration_time" : 1412083350373,
+        "os_arch" : "x86_64",
+        "os_type" : "centos6",
+        "ph_cpu_count" : 1,
+        "public_host_name" : "ipan10-7.c.pramod-thangali.internal",
+        "rack_info" : "/default-rack",
+        "total_mem" : 3664872
+      }
+    },
+    {
+      "href" : "/api/v1/hosts/ipan10-8.c.pramod-thangali.internal",
+      "Hosts" : {
+        "cpu_count" : 1,
+        "desired_configs" : null,
+        "disk_info" : [
+          {
+            "available" : "8643540",
+            "used" : "1151436",
+            "percent" : "12%",
+            "size" : "10319160",
+            "type" : "ext4",
+            "mountpoint" : "/"
+          },
+          {
+            "available" : "1832436",
+            "used" : "0",
+            "percent" : "0%",
+            "size" : "1832436",
+            "type" : "tmpfs",
+            "mountpoint" : "/dev/shm"
+          }
+        ],
+        "host_health_report" : "",
+        "host_name" : "ipan10-8.c.pramod-thangali.internal",
+        "host_state" : "HEALTHY",
+        "host_status" : "HEALTHY",
+        "ip" : "10.240.85.2",
+        "last_agent_env" : {
+          "stackFoldersAndFiles" : [ ],
+          "alternatives" : [ ],
+          "existingUsers" : [ ],
+          "existingRepos" : [ ],
+          "installedPackages" : [ ],
+          "hostHealth" : {
+            "activeJavaProcs" : [ ],
+            "agentTimeStampAtReporting" : 1412083457151,
+            "serverTimeStampAtReporting" : 1412083457196,
+            "liveServices" : [
+              {
+                "desc" : "",
+                "name" : "ntpd",
+                "status" : "Healthy"
+              }
+            ]
+          },
+          "umask" : 18,
+          "transparentHugePage" : "always",
+          "iptablesIsRunning" : true,
+          "reverseLookup" : true
+        },
+        "last_heartbeat_time" : 1412083477295,
+        "last_registration_time" : 1412083350316,
+        "os_arch" : "x86_64",
+        "os_type" : "centos6",
+        "ph_cpu_count" : 1,
+        "public_host_name" : "ipan10-8.c.pramod-thangali.internal",
+        "rack_info" : "/default-rack",
+        "total_mem" : 3664872
+      }
+    },
+    {
+      "href" : "/api/v1/hosts/ipan10-9.c.pramod-thangali.internal",
+      "Hosts" : {
+        "cpu_count" : 1,
+        "desired_configs" : null,
+        "disk_info" : [
+          {
+            "available" : "8643548",
+            "used" : "1151428",
+            "percent" : "12%",
+            "size" : "10319160",
+            "type" : "ext4",
+            "mountpoint" : "/"
+          },
+          {
+            "available" : "1832436",
+            "used" : "0",
+            "percent" : "0%",
+            "size" : "1832436",
+            "type" : "tmpfs",
+            "mountpoint" : "/dev/shm"
+          }
+        ],
+        "host_health_report" : "",
+        "host_name" : "ipan10-9.c.pramod-thangali.internal",
+        "host_state" : "HEALTHY",
+        "host_status" : "HEALTHY",
+        "ip" : "10.240.19.21",
+        "last_agent_env" : {
+          "stackFoldersAndFiles" : [ ],
+          "alternatives" : [ ],
+          "existingUsers" : [ ],
+          "existingRepos" : [ ],
+          "installedPackages" : [ ],
+          "hostHealth" : {
+            "activeJavaProcs" : [ ],
+            "agentTimeStampAtReporting" : 1412083468240,
+            "serverTimeStampAtReporting" : 1412083468295,
+            "liveServices" : [
+              {
+                "desc" : "",
+                "name" : "ntpd",
+                "status" : "Healthy"
+              }
+            ]
+          },
+          "umask" : 18,
+          "transparentHugePage" : "always",
+          "iptablesIsRunning" : true,
+          "reverseLookup" : true
+        },
+        "last_heartbeat_time" : 1412083478342,
+        "last_registration_time" : 1412083351675,
+        "os_arch" : "x86_64",
+        "os_type" : "centos6",
+        "ph_cpu_count" : 1,
+        "public_host_name" : "ipan10-9.c.pramod-thangali.internal",
+        "rack_info" : "/default-rack",
+        "total_mem" : 3664872
+      }
+    }
+  ]
+}

+ 1036 - 0
ambari-server/src/test/python/stacks/2.1/common/services.json

@@ -0,0 +1,1036 @@
+{
+  "href" : "/api/v1/stacks/HDP/versions/2.1?fields=Versions/stack_name,Versions/stack_version,Versions/parent_stack_version,services/StackServices/service_name,services/StackServices/service_version,services/components/StackServiceComponents,services/components/dependencies,services/components/auto_deploy&services/StackServices/service_name.in(HDFS,MAPREDUCE2,YARN,TEZ,NAGIOS,GANGLIA,HIVE,HBASE,PIG,SQOOP,OOZIE,ZOOKEEPER,FALCON,STORM,FLUME)",
+  "Versions" : {
+    "parent_stack_version" : "2.0.6",
+    "stack_name" : "HDP",
+    "stack_version" : "2.1",
+    "stack_hierarchy" : {
+      "stack_name" : "HDP",
+      "stack_versions" : [ "2.0.6" ]
+    }
+  },
+  "services" : [ {
+    "href" : "/api/v1/stacks/HDP/versions/2.1/services/FALCON",
+    "StackServices" : {
+      "service_name" : "FALCON",
+      "service_version" : "0.5.0.2.1",
+      "stack_name" : "HDP",
+      "stack_version" : "2.1"
+    },
+    "components" : [ {
+      "href" : "/api/v1/stacks/HDP/versions/2.1/services/FALCON/components/FALCON_CLIENT",
+      "StackServiceComponents" : {
+        "cardinality" : "1+",
+        "component_category" : "CLIENT",
+        "component_name" : "FALCON_CLIENT",
+        "custom_commands" : [ ],
+        "display_name" : "Falcon Client",
+        "is_client" : true,
+        "is_master" : false,
+        "service_name" : "FALCON",
+        "stack_name" : "HDP",
+        "stack_version" : "2.1",
+        "hostnames" : [ ]
+      },
+      "dependencies" : [ ]
+    }, {
+      "href" : "/api/v1/stacks/HDP/versions/2.1/services/FALCON/components/FALCON_SERVER",
+      "StackServiceComponents" : {
+        "cardinality" : "1",
+        "component_category" : "MASTER",
+        "component_name" : "FALCON_SERVER",
+        "custom_commands" : [ ],
+        "display_name" : "Falcon Server",
+        "is_client" : false,
+        "is_master" : true,
+        "service_name" : "FALCON",
+        "stack_name" : "HDP",
+        "stack_version" : "2.1",
+        "hostnames" : [ ]
+      },
+      "dependencies" : [ {
+        "href" : "/api/v1/stacks/HDP/versions/2.1/services/FALCON/components/FALCON_SERVER/dependencies/OOZIE_CLIENT",
+        "Dependencies" : {
+          "component_name" : "OOZIE_CLIENT",
+          "dependent_component_name" : "FALCON_SERVER",
+          "dependent_service_name" : "FALCON",
+          "stack_name" : "HDP",
+          "stack_version" : "2.1"
+        }
+      }, {
+        "href" : "/api/v1/stacks/HDP/versions/2.1/services/FALCON/components/FALCON_SERVER/dependencies/OOZIE_SERVER",
+        "Dependencies" : {
+          "component_name" : "OOZIE_SERVER",
+          "dependent_component_name" : "FALCON_SERVER",
+          "dependent_service_name" : "FALCON",
+          "stack_name" : "HDP",
+          "stack_version" : "2.1"
+        }
+      } ]
+    } ]
+  }, {
+    "href" : "/api/v1/stacks/HDP/versions/2.1/services/FLUME",
+    "StackServices" : {
+      "service_name" : "FLUME",
+      "service_version" : "1.4.0.2.1",
+      "stack_name" : "HDP",
+      "stack_version" : "2.1"
+    },
+    "components" : [ {
+      "href" : "/api/v1/stacks/HDP/versions/2.1/services/FLUME/components/FLUME_HANDLER",
+      "StackServiceComponents" : {
+        "cardinality" : "1+",
+        "component_category" : "SLAVE",
+        "component_name" : "FLUME_HANDLER",
+        "custom_commands" : [ ],
+        "display_name" : "Flume",
+        "is_client" : false,
+        "is_master" : false,
+        "service_name" : "FLUME",
+        "stack_name" : "HDP",
+        "stack_version" : "2.1",
+        "hostnames" : [ ]
+      },
+      "dependencies" : [ ]
+    } ]
+  }, {
+    "href" : "/api/v1/stacks/HDP/versions/2.1/services/GANGLIA",
+    "StackServices" : {
+      "service_name" : "GANGLIA",
+      "service_version" : "3.5.0",
+      "stack_name" : "HDP",
+      "stack_version" : "2.1"
+    },
+    "components" : [ {
+      "href" : "/api/v1/stacks/HDP/versions/2.1/services/GANGLIA/components/GANGLIA_MONITOR",
+      "StackServiceComponents" : {
+        "cardinality" : "ALL",
+        "component_category" : "SLAVE",
+        "component_name" : "GANGLIA_MONITOR",
+        "custom_commands" : [ ],
+        "display_name" : "Ganglia Monitor",
+        "is_client" : false,
+        "is_master" : false,
+        "service_name" : "GANGLIA",
+        "stack_name" : "HDP",
+        "stack_version" : "2.1",
+        "hostnames" : [ ]
+      },
+      "auto_deploy" : {
+        "enabled" : true
+      },
+      "dependencies" : [ ]
+    }, {
+      "href" : "/api/v1/stacks/HDP/versions/2.1/services/GANGLIA/components/GANGLIA_SERVER",
+      "StackServiceComponents" : {
+        "cardinality" : "1",
+        "component_category" : "MASTER",
+        "component_name" : "GANGLIA_SERVER",
+        "custom_commands" : [ ],
+        "display_name" : "Ganglia Server",
+        "is_client" : false,
+        "is_master" : true,
+        "service_name" : "GANGLIA",
+        "stack_name" : "HDP",
+        "stack_version" : "2.1",
+        "hostnames" : [ ]
+      },
+      "dependencies" : [ ]
+    } ]
+  }, {
+    "href" : "/api/v1/stacks/HDP/versions/2.1/services/HBASE",
+    "StackServices" : {
+      "service_name" : "HBASE",
+      "service_version" : "0.98.0.2.1",
+      "stack_name" : "HDP",
+      "stack_version" : "2.1"
+    },
+    "components" : [ {
+      "href" : "/api/v1/stacks/HDP/versions/2.1/services/HBASE/components/HBASE_CLIENT",
+      "StackServiceComponents" : {
+        "cardinality" : "1+",
+        "component_category" : "CLIENT",
+        "component_name" : "HBASE_CLIENT",
+        "custom_commands" : [ ],
+        "display_name" : "HBase Client",
+        "is_client" : true,
+        "is_master" : false,
+        "service_name" : "HBASE",
+        "stack_name" : "HDP",
+        "stack_version" : "2.1",
+        "hostnames" : [ ]
+      },
+      "dependencies" : [ ]
+    }, {
+      "href" : "/api/v1/stacks/HDP/versions/2.1/services/HBASE/components/HBASE_MASTER",
+      "StackServiceComponents" : {
+        "cardinality" : "1+",
+        "component_category" : "MASTER",
+        "component_name" : "HBASE_MASTER",
+        "custom_commands" : [ "DECOMMISSION" ],
+        "display_name" : "HBase Master",
+        "is_client" : false,
+        "is_master" : true,
+        "service_name" : "HBASE",
+        "stack_name" : "HDP",
+        "stack_version" : "2.1",
+        "hostnames" : [ ]
+      },
+      "dependencies" : [ {
+        "href" : "/api/v1/stacks/HDP/versions/2.1/services/HBASE/components/HBASE_MASTER/dependencies/HDFS_CLIENT",
+        "Dependencies" : {
+          "component_name" : "HDFS_CLIENT",
+          "dependent_component_name" : "HBASE_MASTER",
+          "dependent_service_name" : "HBASE",
+          "stack_name" : "HDP",
+          "stack_version" : "2.1"
+        }
+      }, {
+        "href" : "/api/v1/stacks/HDP/versions/2.1/services/HBASE/components/HBASE_MASTER/dependencies/ZOOKEEPER_SERVER",
+        "Dependencies" : {
+          "component_name" : "ZOOKEEPER_SERVER",
+          "dependent_component_name" : "HBASE_MASTER",
+          "dependent_service_name" : "HBASE",
+          "stack_name" : "HDP",
+          "stack_version" : "2.1"
+        }
+      } ]
+    }, {
+      "href" : "/api/v1/stacks/HDP/versions/2.1/services/HBASE/components/HBASE_REGIONSERVER",
+      "StackServiceComponents" : {
+        "cardinality" : "1+",
+        "component_category" : "SLAVE",
+        "component_name" : "HBASE_REGIONSERVER",
+        "custom_commands" : [ ],
+        "display_name" : "RegionServer",
+        "is_client" : false,
+        "is_master" : false,
+        "service_name" : "HBASE",
+        "stack_name" : "HDP",
+        "stack_version" : "2.1",
+        "hostnames" : [ ]
+      },
+      "dependencies" : [ ]
+    } ]
+  }, {
+    "href" : "/api/v1/stacks/HDP/versions/2.1/services/HDFS",
+    "StackServices" : {
+      "service_name" : "HDFS",
+      "service_version" : "2.4.0.2.1",
+      "stack_name" : "HDP",
+      "stack_version" : "2.1"
+    },
+    "components" : [ {
+      "href" : "/api/v1/stacks/HDP/versions/2.1/services/HDFS/components/DATANODE",
+      "StackServiceComponents" : {
+        "cardinality" : "1+",
+        "component_category" : "SLAVE",
+        "component_name" : "DATANODE",
+        "custom_commands" : [ ],
+        "display_name" : "DataNode",
+        "is_client" : false,
+        "is_master" : false,
+        "service_name" : "HDFS",
+        "stack_name" : "HDP",
+        "stack_version" : "2.1",
+        "hostnames" : [ ]
+      },
+      "dependencies" : [ ]
+    }, {
+      "href" : "/api/v1/stacks/HDP/versions/2.1/services/HDFS/components/HDFS_CLIENT",
+      "StackServiceComponents" : {
+        "cardinality" : "1+",
+        "component_category" : "CLIENT",
+        "component_name" : "HDFS_CLIENT",
+        "custom_commands" : [ ],
+        "display_name" : "HDFS Client",
+        "is_client" : true,
+        "is_master" : false,
+        "service_name" : "HDFS",
+        "stack_name" : "HDP",
+        "stack_version" : "2.1",
+        "hostnames" : [ ]
+      },
+      "dependencies" : [ ]
+    }, {
+      "href" : "/api/v1/stacks/HDP/versions/2.1/services/HDFS/components/JOURNALNODE",
+      "StackServiceComponents" : {
+        "cardinality" : "0+",
+        "component_category" : "SLAVE",
+        "component_name" : "JOURNALNODE",
+        "custom_commands" : [ ],
+        "display_name" : "JournalNode",
+        "is_client" : false,
+        "is_master" : false,
+        "service_name" : "HDFS",
+        "stack_name" : "HDP",
+        "stack_version" : "2.1",
+        "hostnames" : [ ]
+      },
+      "dependencies" : [ ]
+    }, {
+      "href" : "/api/v1/stacks/HDP/versions/2.1/services/HDFS/components/NAMENODE",
+      "StackServiceComponents" : {
+        "cardinality" : "1-2",
+        "component_category" : "MASTER",
+        "component_name" : "NAMENODE",
+        "custom_commands" : [ "DECOMMISSION", "REBALANCEHDFS" ],
+        "display_name" : "NameNode",
+        "is_client" : false,
+        "is_master" : true,
+        "service_name" : "HDFS",
+        "stack_name" : "HDP",
+        "stack_version" : "2.1",
+        "hostnames" : [ ]
+      },
+      "dependencies" : [ ]
+    }, {
+      "href" : "/api/v1/stacks/HDP/versions/2.1/services/HDFS/components/SECONDARY_NAMENODE",
+      "StackServiceComponents" : {
+        "cardinality" : "1",
+        "component_category" : "MASTER",
+        "component_name" : "SECONDARY_NAMENODE",
+        "custom_commands" : [ ],
+        "display_name" : "SNameNode",
+        "is_client" : false,
+        "is_master" : true,
+        "service_name" : "HDFS",
+        "stack_name" : "HDP",
+        "stack_version" : "2.1",
+        "hostnames" : [ ]
+      },
+      "dependencies" : [ ]
+    }, {
+      "href" : "/api/v1/stacks/HDP/versions/2.1/services/HDFS/components/ZKFC",
+      "StackServiceComponents" : {
+        "cardinality" : "0+",
+        "component_category" : "SLAVE",
+        "component_name" : "ZKFC",
+        "custom_commands" : [ ],
+        "display_name" : "ZKFailoverController",
+        "is_client" : false,
+        "is_master" : false,
+        "service_name" : "HDFS",
+        "stack_name" : "HDP",
+        "stack_version" : "2.1",
+        "hostnames" : [ ]
+      },
+      "dependencies" : [ ]
+    } ]
+  }, {
+    "href" : "/api/v1/stacks/HDP/versions/2.1/services/HIVE",
+    "StackServices" : {
+      "service_name" : "HIVE",
+      "service_version" : "0.13.0.2.1",
+      "stack_name" : "HDP",
+      "stack_version" : "2.1"
+    },
+    "components" : [ {
+      "href" : "/api/v1/stacks/HDP/versions/2.1/services/HIVE/components/HCAT",
+      "StackServiceComponents" : {
+        "cardinality" : null,
+        "component_category" : "CLIENT",
+        "component_name" : "HCAT",
+        "custom_commands" : [ ],
+        "display_name" : "HCat Client",
+        "is_client" : true,
+        "is_master" : false,
+        "service_name" : "HIVE",
+        "stack_name" : "HDP",
+        "stack_version" : "2.1",
+        "hostnames" : [ ]
+      },
+      "dependencies" : [ ]
+    }, {
+      "href" : "/api/v1/stacks/HDP/versions/2.1/services/HIVE/components/HIVE_CLIENT",
+      "StackServiceComponents" : {
+        "cardinality" : "1+",
+        "component_category" : "CLIENT",
+        "component_name" : "HIVE_CLIENT",
+        "custom_commands" : [ ],
+        "display_name" : "Hive Client",
+        "is_client" : true,
+        "is_master" : false,
+        "service_name" : "HIVE",
+        "stack_name" : "HDP",
+        "stack_version" : "2.1",
+        "hostnames" : [ ]
+      },
+      "dependencies" : [ ]
+    }, {
+      "href" : "/api/v1/stacks/HDP/versions/2.1/services/HIVE/components/HIVE_METASTORE",
+      "StackServiceComponents" : {
+        "cardinality" : "1",
+        "component_category" : "MASTER",
+        "component_name" : "HIVE_METASTORE",
+        "custom_commands" : [ ],
+        "display_name" : "Hive Metastore",
+        "is_client" : false,
+        "is_master" : true,
+        "service_name" : "HIVE",
+        "stack_name" : "HDP",
+        "stack_version" : "2.1",
+        "hostnames" : [ ]
+      },
+      "auto_deploy" : {
+        "enabled" : true,
+        "location" : "HIVE/HIVE_SERVER"
+      },
+      "dependencies" : [ ]
+    }, {
+      "href" : "/api/v1/stacks/HDP/versions/2.1/services/HIVE/components/HIVE_SERVER",
+      "StackServiceComponents" : {
+        "cardinality" : "1",
+        "component_category" : "MASTER",
+        "component_name" : "HIVE_SERVER",
+        "custom_commands" : [ ],
+        "display_name" : "HiveServer2",
+        "is_client" : false,
+        "is_master" : true,
+        "service_name" : "HIVE",
+        "stack_name" : "HDP",
+        "stack_version" : "2.1",
+        "hostnames" : [ ]
+      },
+      "dependencies" : [ {
+        "href" : "/api/v1/stacks/HDP/versions/2.1/services/HIVE/components/HIVE_SERVER/dependencies/MAPREDUCE2_CLIENT",
+        "Dependencies" : {
+          "component_name" : "MAPREDUCE2_CLIENT",
+          "dependent_component_name" : "HIVE_SERVER",
+          "dependent_service_name" : "HIVE",
+          "stack_name" : "HDP",
+          "stack_version" : "2.1"
+        }
+      }, {
+        "href" : "/api/v1/stacks/HDP/versions/2.1/services/HIVE/components/HIVE_SERVER/dependencies/TEZ_CLIENT",
+        "Dependencies" : {
+          "component_name" : "TEZ_CLIENT",
+          "dependent_component_name" : "HIVE_SERVER",
+          "dependent_service_name" : "HIVE",
+          "stack_name" : "HDP",
+          "stack_version" : "2.1"
+        }
+      }, {
+        "href" : "/api/v1/stacks/HDP/versions/2.1/services/HIVE/components/HIVE_SERVER/dependencies/YARN_CLIENT",
+        "Dependencies" : {
+          "component_name" : "YARN_CLIENT",
+          "dependent_component_name" : "HIVE_SERVER",
+          "dependent_service_name" : "HIVE",
+          "stack_name" : "HDP",
+          "stack_version" : "2.1"
+        }
+      }, {
+        "href" : "/api/v1/stacks/HDP/versions/2.1/services/HIVE/components/HIVE_SERVER/dependencies/ZOOKEEPER_SERVER",
+        "Dependencies" : {
+          "component_name" : "ZOOKEEPER_SERVER",
+          "dependent_component_name" : "HIVE_SERVER",
+          "dependent_service_name" : "HIVE",
+          "stack_name" : "HDP",
+          "stack_version" : "2.1"
+        }
+      } ]
+    }, {
+      "href" : "/api/v1/stacks/HDP/versions/2.1/services/HIVE/components/MYSQL_SERVER",
+      "StackServiceComponents" : {
+        "cardinality" : "0-1",
+        "component_category" : "MASTER",
+        "component_name" : "MYSQL_SERVER",
+        "custom_commands" : [ ],
+        "display_name" : "MySQL Server",
+        "is_client" : false,
+        "is_master" : true,
+        "service_name" : "HIVE",
+        "stack_name" : "HDP",
+        "stack_version" : "2.1",
+        "hostnames" : [ ]
+      },
+      "dependencies" : [ ]
+    }, {
+      "href" : "/api/v1/stacks/HDP/versions/2.1/services/HIVE/components/WEBHCAT_SERVER",
+      "StackServiceComponents" : {
+        "cardinality" : "1",
+        "component_category" : "MASTER",
+        "component_name" : "WEBHCAT_SERVER",
+        "custom_commands" : [ ],
+        "display_name" : "WebHCat Server",
+        "is_client" : false,
+        "is_master" : true,
+        "service_name" : "HIVE",
+        "stack_name" : "HDP",
+        "stack_version" : "2.1",
+        "hostnames" : [ ]
+      },
+      "dependencies" : [ {
+        "href" : "/api/v1/stacks/HDP/versions/2.1/services/HIVE/components/WEBHCAT_SERVER/dependencies/HDFS_CLIENT",
+        "Dependencies" : {
+          "component_name" : "HDFS_CLIENT",
+          "dependent_component_name" : "WEBHCAT_SERVER",
+          "dependent_service_name" : "HIVE",
+          "stack_name" : "HDP",
+          "stack_version" : "2.1"
+        }
+      }, {
+        "href" : "/api/v1/stacks/HDP/versions/2.1/services/HIVE/components/WEBHCAT_SERVER/dependencies/MAPREDUCE2_CLIENT",
+        "Dependencies" : {
+          "component_name" : "MAPREDUCE2_CLIENT",
+          "dependent_component_name" : "WEBHCAT_SERVER",
+          "dependent_service_name" : "HIVE",
+          "stack_name" : "HDP",
+          "stack_version" : "2.1"
+        }
+      }, {
+        "href" : "/api/v1/stacks/HDP/versions/2.1/services/HIVE/components/WEBHCAT_SERVER/dependencies/YARN_CLIENT",
+        "Dependencies" : {
+          "component_name" : "YARN_CLIENT",
+          "dependent_component_name" : "WEBHCAT_SERVER",
+          "dependent_service_name" : "HIVE",
+          "stack_name" : "HDP",
+          "stack_version" : "2.1"
+        }
+      }, {
+        "href" : "/api/v1/stacks/HDP/versions/2.1/services/HIVE/components/WEBHCAT_SERVER/dependencies/ZOOKEEPER_CLIENT",
+        "Dependencies" : {
+          "component_name" : "ZOOKEEPER_CLIENT",
+          "dependent_component_name" : "WEBHCAT_SERVER",
+          "dependent_service_name" : "HIVE",
+          "stack_name" : "HDP",
+          "stack_version" : "2.1"
+        }
+      }, {
+        "href" : "/api/v1/stacks/HDP/versions/2.1/services/HIVE/components/WEBHCAT_SERVER/dependencies/ZOOKEEPER_SERVER",
+        "Dependencies" : {
+          "component_name" : "ZOOKEEPER_SERVER",
+          "dependent_component_name" : "WEBHCAT_SERVER",
+          "dependent_service_name" : "HIVE",
+          "stack_name" : "HDP",
+          "stack_version" : "2.1"
+        }
+      } ]
+    } ]
+  }, {
+    "href" : "/api/v1/stacks/HDP/versions/2.1/services/MAPREDUCE2",
+    "StackServices" : {
+      "service_name" : "MAPREDUCE2",
+      "service_version" : "2.1.0.2.0.6.0",
+      "stack_name" : "HDP",
+      "stack_version" : "2.1"
+    },
+    "components" : [ {
+      "href" : "/api/v1/stacks/HDP/versions/2.1/services/MAPREDUCE2/components/HISTORYSERVER",
+      "StackServiceComponents" : {
+        "cardinality" : "1",
+        "component_category" : "MASTER",
+        "component_name" : "HISTORYSERVER",
+        "custom_commands" : [ ],
+        "display_name" : "History Server",
+        "is_client" : false,
+        "is_master" : true,
+        "service_name" : "MAPREDUCE2",
+        "stack_name" : "HDP",
+        "stack_version" : "2.1",
+        "hostnames" : [ ]
+      },
+      "auto_deploy" : {
+        "enabled" : true,
+        "location" : "YARN/RESOURCEMANAGER"
+      },
+      "dependencies" : [ {
+        "href" : "/api/v1/stacks/HDP/versions/2.1/services/MAPREDUCE2/components/HISTORYSERVER/dependencies/HDFS_CLIENT",
+        "Dependencies" : {
+          "component_name" : "HDFS_CLIENT",
+          "dependent_component_name" : "HISTORYSERVER",
+          "dependent_service_name" : "MAPREDUCE2",
+          "stack_name" : "HDP",
+          "stack_version" : "2.1"
+        }
+      } ]
+    }, {
+      "href" : "/api/v1/stacks/HDP/versions/2.1/services/MAPREDUCE2/components/MAPREDUCE2_CLIENT",
+      "StackServiceComponents" : {
+        "cardinality" : "0+",
+        "component_category" : "CLIENT",
+        "component_name" : "MAPREDUCE2_CLIENT",
+        "custom_commands" : [ ],
+        "display_name" : "MapReduce2 Client",
+        "is_client" : true,
+        "is_master" : false,
+        "service_name" : "MAPREDUCE2",
+        "stack_name" : "HDP",
+        "stack_version" : "2.1",
+        "hostnames" : [ ]
+      },
+      "dependencies" : [ ]
+    } ]
+  }, {
+    "href" : "/api/v1/stacks/HDP/versions/2.1/services/NAGIOS",
+    "StackServices" : {
+      "service_name" : "NAGIOS",
+      "service_version" : "3.5.0",
+      "stack_name" : "HDP",
+      "stack_version" : "2.1"
+    },
+    "components" : [ {
+      "href" : "/api/v1/stacks/HDP/versions/2.1/services/NAGIOS/components/NAGIOS_SERVER",
+      "StackServiceComponents" : {
+        "cardinality" : "1",
+        "component_category" : "MASTER",
+        "component_name" : "NAGIOS_SERVER",
+        "custom_commands" : [ ],
+        "display_name" : "Nagios Server",
+        "is_client" : false,
+        "is_master" : true,
+        "service_name" : "NAGIOS",
+        "stack_name" : "HDP",
+        "stack_version" : "2.1",
+        "hostnames" : [ ]
+      },
+      "dependencies" : [ {
+        "href" : "/api/v1/stacks/HDP/versions/2.1/services/NAGIOS/components/NAGIOS_SERVER/dependencies/HCAT",
+        "Dependencies" : {
+          "component_name" : "HCAT",
+          "dependent_component_name" : "NAGIOS_SERVER",
+          "dependent_service_name" : "NAGIOS",
+          "stack_name" : "HDP",
+          "stack_version" : "2.1"
+        }
+      }, {
+        "href" : "/api/v1/stacks/HDP/versions/2.1/services/NAGIOS/components/NAGIOS_SERVER/dependencies/HDFS_CLIENT",
+        "Dependencies" : {
+          "component_name" : "HDFS_CLIENT",
+          "dependent_component_name" : "NAGIOS_SERVER",
+          "dependent_service_name" : "NAGIOS",
+          "stack_name" : "HDP",
+          "stack_version" : "2.1"
+        }
+      }, {
+        "href" : "/api/v1/stacks/HDP/versions/2.1/services/NAGIOS/components/NAGIOS_SERVER/dependencies/MAPREDUCE2_CLIENT",
+        "Dependencies" : {
+          "component_name" : "MAPREDUCE2_CLIENT",
+          "dependent_component_name" : "NAGIOS_SERVER",
+          "dependent_service_name" : "NAGIOS",
+          "stack_name" : "HDP",
+          "stack_version" : "2.1"
+        }
+      }, {
+        "href" : "/api/v1/stacks/HDP/versions/2.1/services/NAGIOS/components/NAGIOS_SERVER/dependencies/OOZIE_CLIENT",
+        "Dependencies" : {
+          "component_name" : "OOZIE_CLIENT",
+          "dependent_component_name" : "NAGIOS_SERVER",
+          "dependent_service_name" : "NAGIOS",
+          "stack_name" : "HDP",
+          "stack_version" : "2.1"
+        }
+      }, {
+        "href" : "/api/v1/stacks/HDP/versions/2.1/services/NAGIOS/components/NAGIOS_SERVER/dependencies/TEZ_CLIENT",
+        "Dependencies" : {
+          "component_name" : "TEZ_CLIENT",
+          "dependent_component_name" : "NAGIOS_SERVER",
+          "dependent_service_name" : "NAGIOS",
+          "stack_name" : "HDP",
+          "stack_version" : "2.1"
+        }
+      }, {
+        "href" : "/api/v1/stacks/HDP/versions/2.1/services/NAGIOS/components/NAGIOS_SERVER/dependencies/YARN_CLIENT",
+        "Dependencies" : {
+          "component_name" : "YARN_CLIENT",
+          "dependent_component_name" : "NAGIOS_SERVER",
+          "dependent_service_name" : "NAGIOS",
+          "stack_name" : "HDP",
+          "stack_version" : "2.1"
+        }
+      } ]
+    } ]
+  }, {
+    "href" : "/api/v1/stacks/HDP/versions/2.1/services/OOZIE",
+    "StackServices" : {
+      "service_name" : "OOZIE",
+      "service_version" : "4.0.0.2.1",
+      "stack_name" : "HDP",
+      "stack_version" : "2.1"
+    },
+    "components" : [ {
+      "href" : "/api/v1/stacks/HDP/versions/2.1/services/OOZIE/components/OOZIE_CLIENT",
+      "StackServiceComponents" : {
+        "cardinality" : "1+",
+        "component_category" : "CLIENT",
+        "component_name" : "OOZIE_CLIENT",
+        "custom_commands" : [ ],
+        "display_name" : "Oozie Client",
+        "is_client" : true,
+        "is_master" : false,
+        "service_name" : "OOZIE",
+        "stack_name" : "HDP",
+        "stack_version" : "2.1",
+        "hostnames" : [ ]
+      },
+      "dependencies" : [ {
+        "href" : "/api/v1/stacks/HDP/versions/2.1/services/OOZIE/components/OOZIE_CLIENT/dependencies/HDFS_CLIENT",
+        "Dependencies" : {
+          "component_name" : "HDFS_CLIENT",
+          "dependent_component_name" : "OOZIE_CLIENT",
+          "dependent_service_name" : "OOZIE",
+          "stack_name" : "HDP",
+          "stack_version" : "2.1"
+        }
+      }, {
+        "href" : "/api/v1/stacks/HDP/versions/2.1/services/OOZIE/components/OOZIE_CLIENT/dependencies/MAPREDUCE2_CLIENT",
+        "Dependencies" : {
+          "component_name" : "MAPREDUCE2_CLIENT",
+          "dependent_component_name" : "OOZIE_CLIENT",
+          "dependent_service_name" : "OOZIE",
+          "stack_name" : "HDP",
+          "stack_version" : "2.1"
+        }
+      } ]
+    }, {
+      "href" : "/api/v1/stacks/HDP/versions/2.1/services/OOZIE/components/OOZIE_SERVER",
+      "StackServiceComponents" : {
+        "cardinality" : "1",
+        "component_category" : "MASTER",
+        "component_name" : "OOZIE_SERVER",
+        "custom_commands" : [ ],
+        "display_name" : "Oozie Server",
+        "is_client" : false,
+        "is_master" : true,
+        "service_name" : "OOZIE",
+        "stack_name" : "HDP",
+        "stack_version" : "2.1",
+        "hostnames" : [ ]
+      },
+      "dependencies" : [ {
+        "href" : "/api/v1/stacks/HDP/versions/2.1/services/OOZIE/components/OOZIE_SERVER/dependencies/HDFS_CLIENT",
+        "Dependencies" : {
+          "component_name" : "HDFS_CLIENT",
+          "dependent_component_name" : "OOZIE_SERVER",
+          "dependent_service_name" : "OOZIE",
+          "stack_name" : "HDP",
+          "stack_version" : "2.1"
+        }
+      }, {
+        "href" : "/api/v1/stacks/HDP/versions/2.1/services/OOZIE/components/OOZIE_SERVER/dependencies/MAPREDUCE2_CLIENT",
+        "Dependencies" : {
+          "component_name" : "MAPREDUCE2_CLIENT",
+          "dependent_component_name" : "OOZIE_SERVER",
+          "dependent_service_name" : "OOZIE",
+          "stack_name" : "HDP",
+          "stack_version" : "2.1"
+        }
+      }, {
+        "href" : "/api/v1/stacks/HDP/versions/2.1/services/OOZIE/components/OOZIE_SERVER/dependencies/YARN_CLIENT",
+        "Dependencies" : {
+          "component_name" : "YARN_CLIENT",
+          "dependent_component_name" : "OOZIE_SERVER",
+          "dependent_service_name" : "OOZIE",
+          "stack_name" : "HDP",
+          "stack_version" : "2.1"
+        }
+      } ]
+    } ]
+  }, {
+    "href" : "/api/v1/stacks/HDP/versions/2.1/services/PIG",
+    "StackServices" : {
+      "service_name" : "PIG",
+      "service_version" : "0.12.1.2.1",
+      "stack_name" : "HDP",
+      "stack_version" : "2.1"
+    },
+    "components" : [ {
+      "href" : "/api/v1/stacks/HDP/versions/2.1/services/PIG/components/PIG",
+      "StackServiceComponents" : {
+        "cardinality" : "0+",
+        "component_category" : "CLIENT",
+        "component_name" : "PIG",
+        "custom_commands" : [ ],
+        "display_name" : "Pig",
+        "is_client" : true,
+        "is_master" : false,
+        "service_name" : "PIG",
+        "stack_name" : "HDP",
+        "stack_version" : "2.1",
+        "hostnames" : [ ]
+      },
+      "dependencies" : [ ]
+    } ]
+  }, {
+    "href" : "/api/v1/stacks/HDP/versions/2.1/services/SQOOP",
+    "StackServices" : {
+      "service_name" : "SQOOP",
+      "service_version" : "1.4.4.2.1",
+      "stack_name" : "HDP",
+      "stack_version" : "2.1"
+    },
+    "components" : [ {
+      "href" : "/api/v1/stacks/HDP/versions/2.1/services/SQOOP/components/SQOOP",
+      "StackServiceComponents" : {
+        "cardinality" : "1+",
+        "component_category" : "CLIENT",
+        "component_name" : "SQOOP",
+        "custom_commands" : [ ],
+        "display_name" : "Sqoop",
+        "is_client" : true,
+        "is_master" : false,
+        "service_name" : "SQOOP",
+        "stack_name" : "HDP",
+        "stack_version" : "2.1",
+        "hostnames" : [ ]
+      },
+      "dependencies" : [ {
+        "href" : "/api/v1/stacks/HDP/versions/2.1/services/SQOOP/components/SQOOP/dependencies/HDFS_CLIENT",
+        "Dependencies" : {
+          "component_name" : "HDFS_CLIENT",
+          "dependent_component_name" : "SQOOP",
+          "dependent_service_name" : "SQOOP",
+          "stack_name" : "HDP",
+          "stack_version" : "2.1"
+        }
+      }, {
+        "href" : "/api/v1/stacks/HDP/versions/2.1/services/SQOOP/components/SQOOP/dependencies/MAPREDUCE2_CLIENT",
+        "Dependencies" : {
+          "component_name" : "MAPREDUCE2_CLIENT",
+          "dependent_component_name" : "SQOOP",
+          "dependent_service_name" : "SQOOP",
+          "stack_name" : "HDP",
+          "stack_version" : "2.1"
+        }
+      } ]
+    } ]
+  }, {
+    "href" : "/api/v1/stacks/HDP/versions/2.1/services/STORM",
+    "StackServices" : {
+      "service_name" : "STORM",
+      "service_version" : "0.9.1.2.1",
+      "stack_name" : "HDP",
+      "stack_version" : "2.1"
+    },
+    "components" : [ {
+      "href" : "/api/v1/stacks/HDP/versions/2.1/services/STORM/components/DRPC_SERVER",
+      "StackServiceComponents" : {
+        "cardinality" : "1",
+        "component_category" : "MASTER",
+        "component_name" : "DRPC_SERVER",
+        "custom_commands" : [ ],
+        "display_name" : "DRPC Server",
+        "is_client" : false,
+        "is_master" : true,
+        "service_name" : "STORM",
+        "stack_name" : "HDP",
+        "stack_version" : "2.1",
+        "hostnames" : [ ]
+      },
+      "dependencies" : [ ]
+    }, {
+      "href" : "/api/v1/stacks/HDP/versions/2.1/services/STORM/components/NIMBUS",
+      "StackServiceComponents" : {
+        "cardinality" : "1",
+        "component_category" : "MASTER",
+        "component_name" : "NIMBUS",
+        "custom_commands" : [ ],
+        "display_name" : "Nimbus",
+        "is_client" : false,
+        "is_master" : true,
+        "service_name" : "STORM",
+        "stack_name" : "HDP",
+        "stack_version" : "2.1",
+        "hostnames" : [ ]
+      },
+      "dependencies" : [ {
+        "href" : "/api/v1/stacks/HDP/versions/2.1/services/STORM/components/NIMBUS/dependencies/ZOOKEEPER_SERVER",
+        "Dependencies" : {
+          "component_name" : "ZOOKEEPER_SERVER",
+          "dependent_component_name" : "NIMBUS",
+          "dependent_service_name" : "STORM",
+          "stack_name" : "HDP",
+          "stack_version" : "2.1"
+        }
+      } ]
+    }, {
+      "href" : "/api/v1/stacks/HDP/versions/2.1/services/STORM/components/STORM_REST_API",
+      "StackServiceComponents" : {
+        "cardinality" : "1",
+        "component_category" : "MASTER",
+        "component_name" : "STORM_REST_API",
+        "custom_commands" : [ ],
+        "display_name" : "Storm REST API Server",
+        "is_client" : false,
+        "is_master" : true,
+        "service_name" : "STORM",
+        "stack_name" : "HDP",
+        "stack_version" : "2.1",
+        "hostnames" : [ ]
+      },
+      "dependencies" : [ ]
+    }, {
+      "href" : "/api/v1/stacks/HDP/versions/2.1/services/STORM/components/STORM_UI_SERVER",
+      "StackServiceComponents" : {
+        "cardinality" : "1",
+        "component_category" : "MASTER",
+        "component_name" : "STORM_UI_SERVER",
+        "custom_commands" : [ ],
+        "display_name" : "Storm UI Server",
+        "is_client" : false,
+        "is_master" : true,
+        "service_name" : "STORM",
+        "stack_name" : "HDP",
+        "stack_version" : "2.1",
+        "hostnames" : [ ]
+      },
+      "dependencies" : [ ]
+    }, {
+      "href" : "/api/v1/stacks/HDP/versions/2.1/services/STORM/components/SUPERVISOR",
+      "StackServiceComponents" : {
+        "cardinality" : "1+",
+        "component_category" : "SLAVE",
+        "component_name" : "SUPERVISOR",
+        "custom_commands" : [ ],
+        "display_name" : "Supervisor",
+        "is_client" : false,
+        "is_master" : false,
+        "service_name" : "STORM",
+        "stack_name" : "HDP",
+        "stack_version" : "2.1",
+        "hostnames" : [ ]
+      },
+      "dependencies" : [ ]
+    } ]
+  }, {
+    "href" : "/api/v1/stacks/HDP/versions/2.1/services/TEZ",
+    "StackServices" : {
+      "service_name" : "TEZ",
+      "service_version" : "0.4.0.2.1",
+      "stack_name" : "HDP",
+      "stack_version" : "2.1"
+    },
+    "components" : [ {
+      "href" : "/api/v1/stacks/HDP/versions/2.1/services/TEZ/components/TEZ_CLIENT",
+      "StackServiceComponents" : {
+        "cardinality" : "1+",
+        "component_category" : "CLIENT",
+        "component_name" : "TEZ_CLIENT",
+        "custom_commands" : [ ],
+        "display_name" : "Tez Client",
+        "is_client" : true,
+        "is_master" : false,
+        "service_name" : "TEZ",
+        "stack_name" : "HDP",
+        "stack_version" : "2.1",
+        "hostnames" : [ ]
+      },
+      "dependencies" : [ ]
+    } ]
+  }, {
+    "href" : "/api/v1/stacks/HDP/versions/2.1/services/YARN",
+    "StackServices" : {
+      "service_name" : "YARN",
+      "service_version" : "2.4.0.2.1",
+      "stack_name" : "HDP",
+      "stack_version" : "2.1"
+    },
+    "components" : [ {
+      "href" : "/api/v1/stacks/HDP/versions/2.1/services/YARN/components/APP_TIMELINE_SERVER",
+      "StackServiceComponents" : {
+        "cardinality" : "0-1",
+        "component_category" : "MASTER",
+        "component_name" : "APP_TIMELINE_SERVER",
+        "custom_commands" : [ ],
+        "display_name" : "App Timeline Server",
+        "is_client" : false,
+        "is_master" : true,
+        "service_name" : "YARN",
+        "stack_name" : "HDP",
+        "stack_version" : "2.1",
+        "hostnames" : [ ]
+      },
+      "dependencies" : [ ]
+    }, {
+      "href" : "/api/v1/stacks/HDP/versions/2.1/services/YARN/components/NODEMANAGER",
+      "StackServiceComponents" : {
+        "cardinality" : "1+",
+        "component_category" : "SLAVE",
+        "component_name" : "NODEMANAGER",
+        "custom_commands" : [ ],
+        "display_name" : "NodeManager",
+        "is_client" : false,
+        "is_master" : false,
+        "service_name" : "YARN",
+        "stack_name" : "HDP",
+        "stack_version" : "2.1",
+        "hostnames" : [ ]
+      },
+      "dependencies" : [ ]
+    }, {
+      "href" : "/api/v1/stacks/HDP/versions/2.1/services/YARN/components/RESOURCEMANAGER",
+      "StackServiceComponents" : {
+        "cardinality" : "1-2",
+        "component_category" : "MASTER",
+        "component_name" : "RESOURCEMANAGER",
+        "custom_commands" : [ "DECOMMISSION", "REFRESHQUEUES" ],
+        "display_name" : "ResourceManager",
+        "is_client" : false,
+        "is_master" : true,
+        "service_name" : "YARN",
+        "stack_name" : "HDP",
+        "stack_version" : "2.1",
+        "hostnames" : [ ]
+      },
+      "dependencies" : [ ]
+    }, {
+      "href" : "/api/v1/stacks/HDP/versions/2.1/services/YARN/components/YARN_CLIENT",
+      "StackServiceComponents" : {
+        "cardinality" : "1+",
+        "component_category" : "CLIENT",
+        "component_name" : "YARN_CLIENT",
+        "custom_commands" : [ ],
+        "display_name" : "Yarn Client",
+        "is_client" : true,
+        "is_master" : false,
+        "service_name" : "YARN",
+        "stack_name" : "HDP",
+        "stack_version" : "2.1",
+        "hostnames" : [ ]
+      },
+      "dependencies" : [ ]
+    } ]
+  }, {
+    "href" : "/api/v1/stacks/HDP/versions/2.1/services/ZOOKEEPER",
+    "StackServices" : {
+      "service_name" : "ZOOKEEPER",
+      "service_version" : "3.4.5.2.1",
+      "stack_name" : "HDP",
+      "stack_version" : "2.1"
+    },
+    "components" : [ {
+      "href" : "/api/v1/stacks/HDP/versions/2.1/services/ZOOKEEPER/components/ZOOKEEPER_CLIENT",
+      "StackServiceComponents" : {
+        "cardinality" : "1+",
+        "component_category" : "CLIENT",
+        "component_name" : "ZOOKEEPER_CLIENT",
+        "custom_commands" : [ ],
+        "display_name" : "ZooKeeper Client",
+        "is_client" : true,
+        "is_master" : false,
+        "service_name" : "ZOOKEEPER",
+        "stack_name" : "HDP",
+        "stack_version" : "2.1",
+        "hostnames" : [ ]
+      },
+      "dependencies" : [ ]
+    }, {
+      "href" : "/api/v1/stacks/HDP/versions/2.1/services/ZOOKEEPER/components/ZOOKEEPER_SERVER",
+      "StackServiceComponents" : {
+        "cardinality" : "1+",
+        "component_category" : "MASTER",
+        "component_name" : "ZOOKEEPER_SERVER",
+        "custom_commands" : [ ],
+        "display_name" : "ZooKeeper Server",
+        "is_client" : false,
+        "is_master" : true,
+        "service_name" : "ZOOKEEPER",
+        "stack_name" : "HDP",
+        "stack_version" : "2.1",
+        "hostnames" : [ ]
+      },
+      "dependencies" : [ ]
+    } ]
+  } ],
+  "configurations" : { }
+}

+ 35 - 6
ambari-server/src/test/python/stacks/2.1/common/test_stack_advisor.py

@@ -16,19 +16,19 @@ See the License for the specific language governing permissions and
 limitations under the License.
 '''
 
-import socket
+import json
+import os
 from unittest import TestCase
 
 class TestHDP21StackAdvisor(TestCase):
 
   def setUp(self):
     import imp
-    import os
 
-    testDirectory = os.path.dirname(os.path.abspath(__file__))
-    stackAdvisorPath = os.path.join(testDirectory, '../../../../../main/resources/stacks/stack_advisor.py')
-    hdp206StackAdvisorPath = os.path.join(testDirectory, '../../../../../main/resources/stacks/HDP/2.0.6/services/stack_advisor.py')
-    hdp21StackAdvisorPath = os.path.join(testDirectory, '../../../../../main/resources/stacks/HDP/2.1/services/stack_advisor.py')
+    self.testDirectory = os.path.dirname(os.path.abspath(__file__))
+    stackAdvisorPath = os.path.join(self.testDirectory, '../../../../../main/resources/stacks/stack_advisor.py')
+    hdp206StackAdvisorPath = os.path.join(self.testDirectory, '../../../../../main/resources/stacks/HDP/2.0.6/services/stack_advisor.py')
+    hdp21StackAdvisorPath = os.path.join(self.testDirectory, '../../../../../main/resources/stacks/HDP/2.1/services/stack_advisor.py')
     hdp21StackAdvisorClassName = 'HDP21StackAdvisor'
     with open(stackAdvisorPath, 'rb') as fp:
       imp.load_module('stack_advisor', fp, stackAdvisorPath, ('.py', 'rb', imp.PY_SOURCE))
@@ -110,6 +110,35 @@ class TestHDP21StackAdvisor(TestCase):
     self.stackAdvisor.recommendHiveConfigurations(configurations, clusterData)
     self.assertEquals(configurations, expected)
 
+  def test_createComponentLayoutRecommendations_mastersIn10nodes(self):
+    services = json.load(open(os.path.join(self.testDirectory, 'services.json')))
+    hosts = json.load(open(os.path.join(self.testDirectory, 'hosts.json')))
+
+    expected_layout = [
+      [u'NAMENODE', u'NAGIOS_SERVER', u'GANGLIA_SERVER', u'ZOOKEEPER_SERVER', u'DRPC_SERVER', u'NIMBUS', u'STORM_REST_API', u'STORM_UI_SERVER', u'MYSQL_SERVER'],
+      [u'SECONDARY_NAMENODE', u'HISTORYSERVER', u'APP_TIMELINE_SERVER', u'RESOURCEMANAGER', u'ZOOKEEPER_SERVER'],
+      [u'HIVE_METASTORE', u'HIVE_SERVER', u'WEBHCAT_SERVER', u'HBASE_MASTER', u'OOZIE_SERVER', u'ZOOKEEPER_SERVER', u'FALCON_SERVER']
+    ]
+
+    masterComponents = [component['StackServiceComponents']['component_name'] for service in services["services"] for component in service["components"]
+                        if self.stackAdvisor.isMasterComponent(component)]
+
+    recommendation = self.stackAdvisor.createComponentLayoutRecommendations(services, hosts)
+
+    groups = []
+    for host_group in recommendation['blueprint']['host_groups']:
+      components = [component['name'] for component in host_group['components'] if component['name'] in masterComponents]
+      if len(components) > 0:
+        groups.append(components)
+
+    def sort_nested_lists(list):
+      result_list = []
+      for sublist in list:
+        result_list.append(sorted(sublist))
+      return sorted(result_list)
+
+    self.assertEquals(sort_nested_lists(expected_layout), sort_nested_lists(groups))
+
   def test_recommendHiveConfigurations_containersRamIsLess(self):
     configurations = {}
     clusterData = {