You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by ds...@apache.org on 2014/04/14 12:57:11 UTC

git commit: AMBARI-5424 Fix BootStrap of Ambari Agents to work on Ubuntu. (dsen)

Repository: ambari
Updated Branches:
  refs/heads/trunk f6d0436c6 -> c9e181d25


AMBARI-5424 Fix BootStrap of Ambari Agents to work on Ubuntu. (dsen)


Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/c9e181d2
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/c9e181d2
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/c9e181d2

Branch: refs/heads/trunk
Commit: c9e181d25f57f5ea56770a080e6d3b09dbda82b1
Parents: f6d0436
Author: Dmitry Sen <ds...@hortonworks.com>
Authored: Mon Apr 14 13:37:32 2014 +0300
Committer: Dmitry Sen <ds...@hortonworks.com>
Committed: Mon Apr 14 13:37:32 2014 +0300

----------------------------------------------------------------------
 .../server/api/services/AmbariMetaInfo.java     |  38 ++---
 ambari-server/src/main/python/bootstrap.py      |  50 +++++--
 ambari-server/src/main/python/setupAgent.py     | 108 +++++++-------
 .../server/api/services/AmbariMetaInfoTest.java |  77 +++++-----
 ambari-server/src/test/python/TestBootstrap.py  |  24 +++-
 ambari-server/src/test/python/TestSetupAgent.py | 143 ++++++++++++-------
 6 files changed, 275 insertions(+), 165 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/c9e181d2/ambari-server/src/main/java/org/apache/ambari/server/api/services/AmbariMetaInfo.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/services/AmbariMetaInfo.java b/ambari-server/src/main/java/org/apache/ambari/server/api/services/AmbariMetaInfo.java
index f62bfd0..52c7309 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/api/services/AmbariMetaInfo.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/api/services/AmbariMetaInfo.java
@@ -111,8 +111,8 @@ public class AmbariMetaInfo {
   // all the supported OS'es
   private static final List<String> ALL_SUPPORTED_OS = Arrays.asList(
       "centos5", "redhat5", "centos6", "redhat6", "oraclelinux5",
-      "oraclelinux6", "suse11", "sles11", "ubuntu12");
-  
+      "oraclelinux6", "suse11", "sles11", "ubuntu12", "debian12");
+
   private final ActionDefinitionManager adManager = new ActionDefinitionManager();
   private String serverVersion = "undefined";
   private List<StackInfo> stacksResult = new ArrayList<StackInfo>();
@@ -688,9 +688,9 @@ public class AmbariMetaInfo {
         return new Thread(r, "Stack Version Loading Thread");
       }
     });
-    
+
     List<LatestRepoCallable> lookupList = new ArrayList<LatestRepoCallable>();
-    
+
     for (StackInfo stack : stacks) {
       LOG.debug("Adding new stack to known stacks"
         + ", stackName = " + stack.getName()
@@ -733,9 +733,9 @@ public class AmbariMetaInfo {
               resolveHooksFolder(stack);
       stack.setStackHooksFolder(stackHooksToUse);
     }
-    
+
     es.invokeAll(lookupList);
-    
+
     es.shutdown();
   }
 
@@ -747,7 +747,7 @@ public class AmbariMetaInfo {
   private List<RepositoryInfo> getRepository(File repositoryFile, StackInfo stack,
       List<LatestRepoCallable> lookupList)
       throws JAXBException {
-    
+
     RepositoryXml rxml = StackExtensionHelper.unmarshal(RepositoryXml.class, repositoryFile);
 
     List<RepositoryInfo> list = new ArrayList<RepositoryInfo>();
@@ -763,7 +763,7 @@ public class AmbariMetaInfo {
           ri.setRepoId(r.getRepoId());
           ri.setRepoName(r.getRepoName());
           ri.setLatestBaseUrl(r.getBaseUrl());
-          
+
           if (null != metainfoDAO) {
             LOG.debug("Checking for override for base_url");
             String key = generateRepoMetaKey(r.getRepoName(), stack.getVersion(),
@@ -783,7 +783,7 @@ public class AmbariMetaInfo {
         }
       }
     }
-    
+
     if (null != rxml.getLatestURI() && list.size() > 0) {
       lookupList.add(new LatestRepoCallable(rxml.getLatestURI(),
           repositoryFile.getParentFile(), stack));
@@ -849,7 +849,7 @@ public class AmbariMetaInfo {
   public File getStackRoot() {
     return stackRoot;
   }
-  
+
   /**
    * Gets the metrics for a Role (component).
    * @return the list of defined metrics.
@@ -857,42 +857,42 @@ public class AmbariMetaInfo {
   public List<MetricDefinition> getMetrics(String stackName, String stackVersion,
       String serviceName, String componentName, String metricType)
   throws AmbariException {
-    
+
     ServiceInfo svc = getService(stackName, stackVersion, serviceName);
-    
+
     if (null == svc.getMetricsFile() || !svc.getMetricsFile().exists()) {
       LOG.debug("Metrics file for " + stackName + "/" + stackVersion + "/" + serviceName + " not found.");
       return null;
     }
-    
+
     Map<String, Map<String, List<MetricDefinition>>> map = svc.getMetrics();
-    
+
     // check for cached
     if (null == map) {
       // data layout:
       // "DATANODE" -> "Component" -> [ MetricDefinition, MetricDefinition, ... ]
       //           \-> "HostComponent" -> [ MetricDefinition, ... ]
       Type type = new TypeToken<Map<String, Map<String, List<MetricDefinition>>>>(){}.getType();
-      
+
       Gson gson = new Gson();
 
       try {
         map = gson.fromJson(new FileReader(svc.getMetricsFile()), type);
-    
+
         svc.setMetrics(map);
-        
+
       } catch (Exception e) {
         LOG.error ("Could not read the metrics file", e);
         throw new AmbariException("Could not read metrics file", e);
       }
     }
-    
+
     if (map.containsKey(componentName)) {
       if (map.get(componentName).containsKey(metricType)) {
         return map.get(componentName).get(metricType);
       }
     }
-	  
+
 	  return null;
   }
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/c9e181d2/ambari-server/src/main/python/bootstrap.py
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/python/bootstrap.py b/ambari-server/src/main/python/bootstrap.py
index 908451e..f2548a8 100755
--- a/ambari-server/src/main/python/bootstrap.py
+++ b/ambari-server/src/main/python/bootstrap.py
@@ -28,6 +28,7 @@ import os
 import subprocess
 import threading
 import traceback
+import re
 from pprint import pformat
 
 AMBARI_PASSPHRASE_VAR_NAME = "AMBARI_PASSPHRASE"
@@ -36,7 +37,7 @@ HOST_BOOTSTRAP_TIMEOUT = 300
 MAX_PARALLEL_BOOTSTRAPS = 20
 # How many seconds to wait between polling parallel bootstraps
 POLL_INTERVAL_SEC = 1
-DEBUG=False
+DEBUG = False
 PYTHON_ENV="env PYTHONPATH=$PYTHONPATH:/tmp "
 
 
@@ -138,7 +139,7 @@ class Bootstrap(threading.Thread):
   """ Bootstrap the agent on a separate host"""
   TEMP_FOLDER = "/tmp"
   OS_CHECK_SCRIPT_FILENAME = "os_check_type.py"
-  AMBARI_REPO_FILENAME = "ambari.repo"
+  AMBARI_REPO_FILENAME = "ambari"
   SETUP_SCRIPT_FILENAME = "setupAgent.py"
   PASSWORD_FILENAME = "host_pass"
   COMMON_FUNCTIONS="/usr/lib/python2.6/site-packages/common_functions"
@@ -155,6 +156,11 @@ class Bootstrap(threading.Thread):
     self.host_log = HostLog(log_file)
     self.daemon = True
 
+    if self.is_debian():
+      self.AMBARI_REPO_FILENAME = self.AMBARI_REPO_FILENAME + ".list"
+    else:
+      self.AMBARI_REPO_FILENAME = self.AMBARI_REPO_FILENAME + ".repo"
+
 
   def getRemoteName(self, filename):
     full_name = os.path.join(self.TEMP_FOLDER, filename)
@@ -179,17 +185,23 @@ class Bootstrap(threading.Thread):
       self(obj, *args, **kwargs)
     return _call
 
-
   def is_suse(self):
     if os.path.isfile("/etc/issue"):
       if "suse" in open("/etc/issue").read().lower():
         return True
     return False
 
+  def is_debian(self):
+    if self.getServerFamily()[0] == "debian":
+      return True
+    return False
+
   def getRepoDir(self):
     """ Ambari repo file for Ambari."""
     if self.is_suse():
       return "/etc/zypp/repos.d"
+    elif self.is_debian():
+      return "/etc/apt/sources.list.d"
     else:
       return "/etc/yum.repos.d"
 
@@ -203,7 +215,7 @@ class Bootstrap(threading.Thread):
 
   def getOsCheckScriptRemoteLocation(self):
     return self.getRemoteName(self.OS_CHECK_SCRIPT_FILENAME)
-  
+
   def getCommonFunctionsRemoteLocation(self):
     return self.TEMP_FOLDER;
 
@@ -230,7 +242,7 @@ class Bootstrap(threading.Thread):
     result = scp.run()
     self.host_log.write("\n")
     return result
-  
+
   def copyCommonFunctions(self):
     # Copying the os check script file
     fileToCopy = self.COMMON_FUNCTIONS
@@ -261,6 +273,9 @@ class Bootstrap(threading.Thread):
     else:
       return self.getMoveRepoFileWithoutPasswordCommand(targetDir)
 
+  def getAptUpdateCommand(self):
+    return "apt-get update -o Dir::Etc::sourcelist=\"%s/%s\" -o API::Get::List-Cleanup=\"0\" --no-list-cleanup" %\
+          ("sources.list.d", self.AMBARI_REPO_FILENAME)
 
   def copyNeededFiles(self):
     # Copying the files
@@ -285,6 +300,18 @@ class Bootstrap(threading.Thread):
     retcode2 = ssh.run()
     self.host_log.write("\n")
 
+    # Update repo cache for debian OS
+    if self.is_debian():
+      self.host_log.write("==========================\n")
+      self.host_log.write("Update apt cache of repository...")
+      command = self.getAptUpdateCommand()
+      ssh = SSH(params.user, params.sshkey_file, self.host, command,
+                params.bootdir, self.host_log)
+      retcode2 = ssh.run()
+      self.host_log.write("\n")
+
+
+
     self.host_log.write("==========================\n")
     self.host_log.write("Copying setup script file...")
     fileToCopy = params.setup_agent_file
@@ -345,7 +372,7 @@ class Bootstrap(threading.Thread):
     params = self.shared_state
     self.host_log.write("==========================\n")
     self.host_log.write("Running OS type check...")
-    
+
     command = "chmod a+x %s && %s %s" % \
               (self.getOsCheckScriptRemoteLocation(),
                PYTHON_ENV + self.getOsCheckScriptRemoteLocation(), params.cluster_os_type)
@@ -379,13 +406,20 @@ class Bootstrap(threading.Thread):
       doneFile.write(str(retcode))
       doneFile.close()
 
+  def getServerFamily(self):
+    '''Return server OS family and version'''
+    cot = re.search("([^\d]+)([\d]*)", self.shared_state.cluster_os_type)
+    return cot.group(1).lower(),cot.group(2).lower()
 
   def checkSudoPackage(self):
     """ Checking 'sudo' package on remote host """
     self.host_log.write("==========================\n")
     self.host_log.write("Checking 'sudo' package on remote host...")
     params = self.shared_state
-    command = "rpm -qa | grep sudo"
+    if self.getServerFamily()[0] == "debian":
+      command = "dpkg --get-selections|grep -e ^sudo"
+    else:
+      command = "rpm -qa | grep -e ^sudo"
     ssh = SSH(params.user, params.sshkey_file, self.host, command,
               params.bootdir, self.host_log,
               errorMessage="Error: Sudo command is not available. " \
@@ -606,7 +640,7 @@ def main(argv=None):
 
   if passwordFile is not None and passwordFile != 'null':
     subprocess.Popen(["chmod", "600", passwordFile], stdout=subprocess.PIPE)
-  
+
   logging.info("BootStrapping hosts " + pprint.pformat(hostList) +
                " using " + scriptDir + " cluster primary OS: " + cluster_os_type +
                " with user '" + user + "' sshKey File " + sshkey_file + " password File " + passwordFile +\

http://git-wip-us.apache.org/repos/asf/ambari/blob/c9e181d2/ambari-server/src/main/python/setupAgent.py
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/python/setupAgent.py b/ambari-server/src/main/python/setupAgent.py
index 69f357a..0c2851a 100755
--- a/ambari-server/src/main/python/setupAgent.py
+++ b/ambari-server/src/main/python/setupAgent.py
@@ -29,7 +29,6 @@ import threading
 import traceback
 import stat
 from pprint import pformat
-import re
 
 AMBARI_PASSPHRASE_VAR = "AMBARI_PASSPHRASE"
 
@@ -40,22 +39,33 @@ def execOsCommand(osCommand):
   ret = {"exitstatus": osStat.returncode, "log": log}
   return ret
 
+
 def is_suse():
   if os.path.isfile("/etc/issue"):
     if "suse" in open("/etc/issue").read().lower():
       return True
   return False
 
-def installAgentSuse(projectVersion):
-  """ Run zypper install and make sure the agent install alright """
-  zypperCommand = ["zypper", "install", "-y", "ambari-agent" + projectVersion]
-  return execOsCommand(zypperCommand)
+
+def is_ubuntu():
+  if os.path.isfile("/etc/issue"):
+    if "ubuntu" in open("/etc/issue").read().lower():
+      return True
+  return False
+
 
 def installAgent(projectVersion):
-  """ Run yum install and make sure the agent install alright """
+  """ Run install and make sure the agent install alright """
   # The command doesn't work with file mask ambari-agent*.rpm, so rename it on agent host
-  rpmCommand = ["yum", "-y", "install", "--nogpgcheck", "ambari-agent" + projectVersion]
-  return execOsCommand(rpmCommand)
+  if is_suse():
+    Command = ["zypper", "install", "-y", "ambari-agent-" + projectVersion]
+  elif is_ubuntu():
+    # add * to end of version in case of some test releases
+    Command = ["apt-get", "install", "-y", "--force-yes", "ambari-agent=" + projectVersion + "*"]
+  else:
+    Command = ["yum", "-y", "install", "--nogpgcheck", "ambari-agent-" + projectVersion]
+  return execOsCommand(Command)
+
 
 def configureAgent(server_hostname):
   """ Configure the agent so that it has all the configs knobs properly installed """
@@ -64,6 +74,7 @@ def configureAgent(server_hostname):
   execOsCommand(osCommand)
   return
 
+
 def runAgent(passPhrase, expected_hostname):
   os.environ[AMBARI_PASSPHRASE_VAR] = passPhrase
   agent_retcode = subprocess.call("/usr/sbin/ambari-agent restart --expected-hostname=" +\
@@ -82,68 +93,73 @@ def runAgent(passPhrase, expected_hostname):
       return ret['exitstatus']
 
     return agent_retcode
-  except (Exception), e:
+  except (Exception):
     return 1
 
 
 def getOptimalVersion(initialProjectVersion):
   optimalVersion = initialProjectVersion
-  if is_suse():
-    ret = findNearestAgentPackageVersionSuse(optimalVersion)
-  else:
-    ret = findNearestAgentPackageVersion(optimalVersion)
+  ret = findNearestAgentPackageVersion(optimalVersion)
 
   if ret["exitstatus"] == 0 and ret["log"][0].strip() != "" and ret["log"][0].strip() == initialProjectVersion:
     optimalVersion = ret["log"][0].strip()
     retcode = 0
   else:
-    if is_suse():
-        ret = getAvaliableAgentPackageVersionsSuse()
-    else:
-        ret = getAvaliableAgentPackageVersions()
+    ret = getAvaliableAgentPackageVersions()
     retcode = 1
     optimalVersion = ret["log"]
 
   return {"exitstatus": retcode, "log": optimalVersion}
 
 
-def findNearestAgentPackageVersionSuse(projectVersion):
-  if projectVersion == "":
-    projectVersion = "  "
-  zypperCommand = ["bash", "-c", "zypper search -s --match-exact ambari-agent | grep '" + projectVersion +\
-                                 "' | cut -d '|' -f 4 | head -n1 | sed -e 's/-\w[^:]*//1' "]
-  return execOsCommand(zypperCommand)
-
 def findNearestAgentPackageVersion(projectVersion):
   if projectVersion == "":
     projectVersion = "  "
-  yumCommand = ["bash", "-c", "yum list all ambari-agent | grep '" + projectVersion +\
+  if is_suse():
+    Command = ["bash", "-c", "zypper search -s --match-exact ambari-agent | grep '" + projectVersion +\
+                                 "' | cut -d '|' -f 4 | head -n1 | sed -e 's/-\w[^:]*//1' "]
+  elif is_ubuntu():
+    if projectVersion == "  ":
+      Command = ["bash", "-c", "apt-cache show ambari-agent |grep Version|cut -d ' ' -f 2|tr -d '\\n'|sed -s 's/[-|~][A-Za-z\d]*//g'"]
+    else:
+      Command = ["bash", "-c", "apt-cache show ambari-agent |grep Version|cut -d ' ' -f 2|grep '" +
+               projectVersion + "'|tr -d '\\n'|sed -s 's/[-|~][A-Za-z\d]*//g'"]
+  else:
+    Command = ["bash", "-c", "yum list all ambari-agent | grep '" + projectVersion +\
                               "' | sed -re 's/\s+/ /g' | cut -d ' ' -f 2 | head -n1 | sed -e 's/-\w[^:]*//1' "]
-  return execOsCommand(yumCommand)
+  return execOsCommand(Command)
+
 
 def isAgentPackageAlreadyInstalled(projectVersion):
-    yumCommand = ["bash", "-c", "rpm -qa | grep ambari-agent"+projectVersion]
-    ret = execOsCommand(yumCommand)
+    if is_ubuntu():
+      Command = ["bash", "-c", "dpkg -s ambari-agent  2>&1|grep Version|grep " + projectVersion]
+    else:
+      Command = ["bash", "-c", "rpm -qa | grep ambari-agent-"+projectVersion]
+    ret = execOsCommand(Command)
     res = False
     if ret["exitstatus"] == 0 and ret["log"][0].strip() != "":
         res = True
     return res
 
+
 def getAvaliableAgentPackageVersions():
-    yumCommand = ["bash", "-c",
+  if is_suse():
+    Command = ["bash", "-c",
+        """zypper search -s --match-exact ambari-agent | grep ambari-agent | sed -re 's/\s+/ /g' | cut -d '|' -f 4 | tr '\\n' ', ' | sed -e 's/-\w[^:]*//1' """]
+  elif is_ubuntu():
+    Command = ["bash", "-c",
+        """apt-cache show ambari-agent|grep Version|cut -d ' ' -f 2| tr '\\n' ', '|sed -s 's/[-|~][A-Za-z\d]*//g'"""]
+  else:
+    Command = ["bash", "-c",
         """yum list all ambari-agent | grep -E '^ambari-agent' | sed -re 's/\s+/ /g' | cut -d ' ' -f 2 | tr '\\n' ', ' | sed -e 's/-\w[^:]*//1' """]
-    return execOsCommand(yumCommand)
+  return execOsCommand(Command)
 
-def getAvaliableAgentPackageVersionsSuse():
-    yumCommand = ["bash", "-c",
-        """zypper search -s --match-exact ambari-agent | grep ambari-agent | sed -re 's/\s+/ /g' | cut -d '|' -f 4 | tr '\\n' ', ' | sed -e 's/-\w[^:]*//1' """]
-    return execOsCommand(yumCommand)
 
 def checkServerReachability(host, port):
   ret = {}
-  s = socket.socket() 
-  try: 
-   s.connect((host, port)) 
+  s = socket.socket()
+  try:
+   s.connect((host, port))
    return
   except Exception:
    ret["exitstatus"] = 1
@@ -153,8 +169,8 @@ def checkServerReachability(host, port):
    sys.exit(ret)
   pass
 
+
 def main(argv=None):
-  scriptDir = os.path.realpath(os.path.dirname(argv[0]))
   # Parse the input
   onlyargs = argv[1:]
   expected_hostname = onlyargs[0]
@@ -168,26 +184,23 @@ def main(argv=None):
     server_port = onlyargs[4]
   try:
     server_port = int(server_port)
-  except (Exception), e:
+  except (Exception):
     server_port = 8080
 
   checkServerReachability(hostname, server_port)
 
   if projectVersion is None or projectVersion == "null" or projectVersion == "{ambariVersion}" or projectVersion == "":
+    projectVersion = ""  # fix error in error output, if projectVersion leaves None
     retcode = getOptimalVersion("")
   else:
     retcode = getOptimalVersion(projectVersion)
 
-
   if retcode["exitstatus"] == 0 and retcode["log"] != None and retcode["log"] != "" and retcode["log"][0].strip() != "":
-      availiableProjectVersion = "-" + retcode["log"].strip()
+      availiableProjectVersion = retcode["log"].strip()
       if not isAgentPackageAlreadyInstalled(availiableProjectVersion):
-          if is_suse():
-            ret = installAgentSuse(availiableProjectVersion)
-          else:
-            ret = installAgent(availiableProjectVersion)
-          if (not ret["exitstatus"]== 0):
-            sys.exit(ret)
+        ret = installAgent(availiableProjectVersion)
+        if (not ret["exitstatus"] == 0):
+          sys.exit(ret)
   elif retcode["exitstatus"] == 1 and retcode["log"][0].strip() != "":
       sys.exit({"exitstatus": 1, "log": "Desired version ("+projectVersion+") of ambari-agent package"
                                         " is not available."
@@ -202,4 +215,3 @@ def main(argv=None):
 if __name__ == '__main__':
   logging.basicConfig(level=logging.DEBUG)
   main(sys.argv)
-

http://git-wip-us.apache.org/repos/asf/ambari/blob/c9e181d2/ambari-server/src/test/java/org/apache/ambari/server/api/services/AmbariMetaInfoTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/api/services/AmbariMetaInfoTest.java b/ambari-server/src/test/java/org/apache/ambari/server/api/services/AmbariMetaInfoTest.java
index c76ab46..8c0bd65 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/api/services/AmbariMetaInfoTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/api/services/AmbariMetaInfoTest.java
@@ -74,9 +74,9 @@ public class AmbariMetaInfoTest {
   private static final String OS_TYPE = "centos5";
   private static final String REPO_ID = "HDP-UTILS-1.1.0.15";
   private static final String PROPERTY_NAME = "hbase.regionserver.msginterval";
-  
+
   private static final String NON_EXT_VALUE = "XXX";
-  
+
   private static final int REPOS_CNT = 3;
   private static final int STACKS_NAMES_CNT = 1;
   private static final int PROPERTIES_CNT = 63;
@@ -86,7 +86,7 @@ public class AmbariMetaInfoTest {
   private final static Logger LOG =
       LoggerFactory.getLogger(AmbariMetaInfoTest.class);
   private static final String FILE_NAME = "hbase-site.xml";
-  
+
 
   @Rule
   public TemporaryFolder tmpFolder = new TemporaryFolder();
@@ -136,7 +136,7 @@ public class AmbariMetaInfoTest {
     boolean supportedStack = metaInfo.isSupportedStack(STACK_NAME_HDP,
         STACK_VERSION_HDP);
     assertTrue(supportedStack);
-    
+
     boolean notSupportedStack = metaInfo.isSupportedStack(NON_EXT_VALUE,
         NON_EXT_VALUE);
     assertFalse(notSupportedStack);
@@ -180,7 +180,7 @@ public class AmbariMetaInfoTest {
   /**
    * Method: Map<String, ServiceInfo> getServices(String stackName, String
    * version, String serviceName)
-   * @throws AmbariException 
+   * @throws AmbariException
    */
   @Test
   public void getServices() throws AmbariException {
@@ -266,11 +266,11 @@ public class AmbariMetaInfoTest {
     assertEquals(3, redhat5cnt.size());
     assertEquals(3, centos6Cnt.size());
   }
-  
-  
+
+
   @Test
   /**
-   * Make sure global mapping is avaliable when global.xml is 
+   * Make sure global mapping is avaliable when global.xml is
    * in the path.
    * @throws Exception
    */
@@ -280,7 +280,7 @@ public class AmbariMetaInfoTest {
     List<PropertyInfo> pinfo = sinfo.getProperties();
     /** check all the config knobs and make sure the global one is there **/
     boolean checkforglobal = false;
-    
+
     for (PropertyInfo pinfol: pinfo) {
       if ("global.xml".equals(pinfol.getFilename())) {
         checkforglobal = true;
@@ -299,7 +299,7 @@ public class AmbariMetaInfoTest {
     }
     Assert.assertTrue(checkforhadoopheapsize);
   }
-  
+
   @Test
   public void testMetaInfoFileFilter() throws Exception {
     String buildDir = tmpFolder.getRoot().getAbsolutePath();
@@ -322,7 +322,7 @@ public class AmbariMetaInfoTest {
     getSupportedConfigs();
     // Check .svn is not part of the stack but abcd.svn is
     Assert.assertNotNull(ambariMetaInfo.getStackInfo("abcd.svn", "001.svn"));
-    
+
     Assert.assertFalse(ambariMetaInfo.isSupportedStack(".svn", ""));
     Assert.assertFalse(ambariMetaInfo.isSupportedStack(".svn", ""));
   }
@@ -339,9 +339,9 @@ public class AmbariMetaInfoTest {
     } catch (StackAccessException e) {
       Assert.assertTrue(e instanceof StackAccessException);
     }
-    
+
   }
-  
+
   @Test
   public void testGetRepositories() throws Exception {
     List<RepositoryInfo> repositories = metaInfo.getRepositories(STACK_NAME_HDP, STACK_VERSION_HDP, OS_TYPE);
@@ -359,7 +359,7 @@ public class AmbariMetaInfoTest {
       Assert.assertTrue(e instanceof StackAccessException);
     }
   }
-  
+
   @Test
   public void testGetService() throws Exception {
     ServiceInfo service = metaInfo.getService(STACK_NAME_HDP, STACK_VERSION_HDP, SERVICE_NAME_HDFS);
@@ -369,16 +369,16 @@ public class AmbariMetaInfoTest {
     } catch (StackAccessException e) {
       Assert.assertTrue(e instanceof StackAccessException);
     }
-    
+
   }
-  
+
   @Test
   public void testGetStacksNames() throws Exception {
     Set<Stack> stackNames = metaInfo.getStackNames();
     assertEquals(stackNames.size(), STACKS_NAMES_CNT);
     assertTrue(stackNames.contains(new Stack(STACK_NAME_HDP)));
   }
-  
+
   @Test
   public void testGetStack() throws Exception {
     Stack stack = metaInfo.getStack(STACK_NAME_HDP);
@@ -408,7 +408,7 @@ public class AmbariMetaInfoTest {
     Set<PropertyInfo> properties = metaInfo.getProperties(STACK_NAME_HDP, STACK_VERSION_HDP, SERVICE_NAME_HDFS);
     Assert.assertEquals(properties.size(), PROPERTIES_CNT);
   }
-  
+
   @Test
   public void testGetProperty() throws Exception {
     PropertyInfo property = metaInfo.getProperty(STACK_NAME_HDP, STACK_VERSION_HDP, SERVICE_NAME_HDFS, PROPERTY_NAME);
@@ -420,21 +420,21 @@ public class AmbariMetaInfoTest {
     } catch (StackAccessException e) {
       Assert.assertTrue(e instanceof StackAccessException);
     }
-    
+
   }
-  
+
   @Test
   public void testGetOperatingSystems() throws Exception {
     Set<OperatingSystemInfo> operatingSystems = metaInfo.getOperatingSystems(STACK_NAME_HDP, STACK_VERSION_HDP);
     Assert.assertEquals(OS_CNT, operatingSystems.size());
   }
-  
+
   @Test
   public void testGetOperatingSystem() throws Exception {
     OperatingSystemInfo operatingSystem = metaInfo.getOperatingSystem(STACK_NAME_HDP, STACK_VERSION_HDP, OS_TYPE);
     Assert.assertEquals(operatingSystem.getOsType(), OS_TYPE);
-    
-    
+
+
     try {
       metaInfo.getOperatingSystem(STACK_NAME_HDP, STACK_VERSION_HDP, NON_EXT_VALUE);
     } catch (StackAccessException e) {
@@ -453,6 +453,7 @@ public class AmbariMetaInfoTest {
     Assert.assertTrue(metaInfo.isOsSupported("suse11"));
     Assert.assertTrue(metaInfo.isOsSupported("sles11"));
     Assert.assertTrue(metaInfo.isOsSupported("ubuntu12"));
+    Assert.assertTrue(metaInfo.isOsSupported("debian12"));
     Assert.assertFalse(metaInfo.isOsSupported("windows"));
   }
 
@@ -622,7 +623,7 @@ public class AmbariMetaInfoTest {
     Set<PropertyInfo> properties = metaInfo.getProperties(STACK_NAME_HDP, STACK_VERSION_HDP_02, SERVICE_NAME_HDFS);
     Assert.assertEquals(81, properties.size());
   }
-  
+
   @Test
   public void testBadStack() throws Exception {
     File stackRoot = new File("src/test/resources/bad-stacks");
@@ -634,27 +635,27 @@ public class AmbariMetaInfoTest {
       assertTrue(JAXBException.class.isInstance(e));
     }
   }
-  
+
   @Test
   public void testMetricsJson() throws Exception {
     ServiceInfo svc = metaInfo.getService(STACK_NAME_HDP, "2.0.5", "HDFS");
     Assert.assertNotNull(svc);
     Assert.assertNotNull(svc.getMetricsFile());
-    
+
     svc = metaInfo.getService(STACK_NAME_HDP, "2.0.6", "HDFS");
     Assert.assertNotNull(svc);
     Assert.assertNotNull(svc.getMetricsFile());
-    
+
     List<MetricDefinition> list = metaInfo.getMetrics(STACK_NAME_HDP, "2.0.5", "HDFS", "NAMENODE", "Component");
     Assert.assertNotNull(list);
-    
+
     list = metaInfo.getMetrics(STACK_NAME_HDP, "2.0.5", "HDFS", "DATANODE", "Component");
     Assert.assertNull(list);
-    
+
     List<MetricDefinition> list0 = metaInfo.getMetrics(STACK_NAME_HDP, "2.0.5", "HDFS", "DATANODE", "Component");
     Assert.assertNull(list0);
     Assert.assertTrue("Expecting subsequent calls to use a cached value for the definition", list == list0);
-    
+
 
     // not explicitly defined, uses 2.0.5
     list = metaInfo.getMetrics(STACK_NAME_HDP, "2.0.6", "HDFS", "DATANODE", "Component");
@@ -1254,16 +1255,16 @@ public class AmbariMetaInfoTest {
     }
     return null;
   }
-  
+
   @Test
   public void testCustomConfigDir() throws Exception {
-    
+
     ServiceInfo service = metaInfo.getService(STACK_NAME_HDP, "2.0.7", "MAPREDUCE2");
 
     // assert that the property was found in a differently-named directory
     // cannot check the dirname itself since extended stacks won't carry over
     // the name
-    
+
     boolean found = false;
     for (PropertyInfo pi : service.getProperties()) {
       if (pi.getName().equals("mr2-prop")) {
@@ -1271,13 +1272,13 @@ public class AmbariMetaInfoTest {
         found = true;
       }
     }
-    
+
     Assert.assertTrue(found);
   }
 
   @Test
   public void testLatestRepo() throws Exception {
-    
+
     for (RepositoryInfo ri : metaInfo.getRepositories("HDP", "2.1.1", "centos6")) {
       Assert.assertEquals(
           "Expected the base url to be set properly",
@@ -1288,7 +1289,7 @@ public class AmbariMetaInfoTest {
           "http://public-repo-1.hortonworks.com/HDP/centos6/2.x/updates/2.0.6.0",
           ri.getDefaultBaseUrl());
     }
-    
+
     for (RepositoryInfo ri : metaInfo.getRepositories("HDP", "2.1.1", "suse11")) {
       Assert.assertEquals(
           "Expected hdp.json to be stripped from the url",
@@ -1300,8 +1301,8 @@ public class AmbariMetaInfoTest {
       Assert.assertEquals("http://s3.amazonaws.com/dev.hortonworks.com/HDP/suse11/2.x/BUILDS/2.1.1.0-118",
           ri.getLatestBaseUrl());
     }
-    
-    
+
+
   }
 
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/c9e181d2/ambari-server/src/test/python/TestBootstrap.py
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/python/TestBootstrap.py b/ambari-server/src/test/python/TestBootstrap.py
index 88ff3c2..bae5c1e 100644
--- a/ambari-server/src/test/python/TestBootstrap.py
+++ b/ambari-server/src/test/python/TestBootstrap.py
@@ -520,10 +520,11 @@ class TestBootstrap(TestCase):
       self.assertEqual(res, str(expected))
     os.unlink(done_file)
 
+  @patch.object(Bootstrap, "getServerFamily")
   @patch.object(SSH, "__init__")
   @patch.object(SSH, "run")
   @patch.object(HostLog, "write")
-  def test_checkSudoPackage(self, write_mock, run_mock, init_mock):
+  def test_checkSudoPackage(self, write_mock, run_mock, init_mock, server_family_mock):
     shared_state = SharedState("root", "sshkey_file", "scriptDir", "bootdir",
                                "setupAgentFile", "ambariServer", "centos6",
                                None, "8440")
@@ -531,10 +532,29 @@ class TestBootstrap(TestCase):
     expected = 42
     init_mock.return_value = None
     run_mock.return_value = expected
+    server_family_mock.return_value = ["centos", "6"]
     res = bootstrap_obj.checkSudoPackage()
     self.assertEquals(res, expected)
     command = str(init_mock.call_args[0][3])
-    self.assertEqual(command, "rpm -qa | grep sudo")
+    self.assertEqual(command, "rpm -qa | grep -e ^sudo")
+
+  @patch.object(Bootstrap, "getServerFamily")
+  @patch.object(SSH, "__init__")
+  @patch.object(SSH, "run")
+  @patch.object(HostLog, "write")
+  def test_checkSudoPackageDebian(self, write_mock, run_mock, init_mock, server_family_mock):
+    shared_state = SharedState("root", "sshkey_file", "scriptDir", "bootdir",
+                               "setupAgentFile", "ambariServer", "debian12",
+                               None, "8440")
+    bootstrap_obj = Bootstrap("hostname", shared_state)
+    expected = 42
+    init_mock.return_value = None
+    run_mock.return_value = expected
+    server_family_mock.return_value = ["debian", "12"]
+    res = bootstrap_obj.checkSudoPackage()
+    self.assertEquals(res, expected)
+    command = str(init_mock.call_args[0][3])
+    self.assertEqual(command, "dpkg --get-selections|grep -e ^sudo")
 
 
   @patch.object(SSH, "__init__")

http://git-wip-us.apache.org/repos/asf/ambari/blob/c9e181d2/ambari-server/src/test/python/TestSetupAgent.py
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/python/TestSetupAgent.py b/ambari-server/src/test/python/TestSetupAgent.py
index b9c6056..35edadf 100644
--- a/ambari-server/src/test/python/TestSetupAgent.py
+++ b/ambari-server/src/test/python/TestSetupAgent.py
@@ -81,59 +81,93 @@ class TestSetupAgent(TestCase):
     self.assertEqual(ret, 2)
 
 
-  @patch.object(setup_agent, 'getAvaliableAgentPackageVersionsSuse')
+  @patch.object(setup_agent, 'getAvaliableAgentPackageVersions')
   @patch.object(setup_agent, 'is_suse')
-  @patch.object(setup_agent, 'findNearestAgentPackageVersionSuse')
+  @patch.object(setup_agent, 'is_ubuntu')
   @patch.object(setup_agent, 'findNearestAgentPackageVersion')
-  def test_returned_optimal_version_is_initial_on_suse(self, findNearestAgentPackageVersion_method,
-                                                       findNearestAgentPackageVersionSuse_method,
-                                                       is_suse_method, getAvaliableAgentPackageVersionsSuse_method):
-    getAvaliableAgentPackageVersionsSuse_method.return_value = {"exitstatus": 0, "log": "1.1.1"}
+  def test_returned_optimal_version_is_initial_on_suse(self, findNearestAgentPackageVersion_method, is_ubuntu_mock,
+                                                       is_suse_method, getAvaliableAgentPackageVersions_method):
+    getAvaliableAgentPackageVersions_method.return_value = {"exitstatus": 0, "log": "1.1.1"}
     is_suse_method.return_value = True
+    is_ubuntu_mock.return_value = False
 
     projectVersion = "1.1.1"
     result_version = setup_agent.getOptimalVersion(projectVersion)
-    self.assertTrue(findNearestAgentPackageVersionSuse_method.called)
-    self.assertFalse(findNearestAgentPackageVersion_method.called)
+    self.assertTrue(findNearestAgentPackageVersion_method.called)
     self.assertTrue(result_version["exitstatus"] == 1)
     pass
 
+  @patch.object(setup_agent, 'getAvaliableAgentPackageVersions')
   @patch.object(setup_agent, 'is_suse')
-  @patch.object(setup_agent, 'findNearestAgentPackageVersionSuse')
+  @patch.object(setup_agent, 'is_ubuntu')
+  @patch.object(setup_agent, 'findNearestAgentPackageVersion')
+  def test_returned_optimal_version_is_initial_on_ubuntu(self, findNearestAgentPackageVersion_method, is_ubuntu_mock,
+                                                       is_suse_method, getAvaliableAgentPackageVersions_method):
+    getAvaliableAgentPackageVersions_method.return_value = {"exitstatus": 0, "log": "1.1.1"}
+    is_suse_method.return_value = False
+    is_ubuntu_mock.return_value = True
+
+    projectVersion = "1.1.1"
+    result_version = setup_agent.getOptimalVersion(projectVersion)
+    self.assertTrue(findNearestAgentPackageVersion_method.called)
+    self.assertTrue(result_version["exitstatus"] == 1)
+    pass
+
+  @patch.object(setup_agent, 'is_suse')
+  @patch.object(setup_agent, 'is_ubuntu')
   @patch.object(setup_agent, 'findNearestAgentPackageVersion')
   def test_returned_optimal_version_is_nearest_on_suse(self, findNearestAgentPackageVersion_method,
-                                                       findNearestAgentPackageVersionSuse_method,
+                                                       is_ubuntu_method,
                                                        is_suse_method):
     is_suse_method.return_value = True
+    is_ubuntu_method.return_value = False
 
     projectVersion = ""
     nearest_version = projectVersion + "1.1.1"
-    findNearestAgentPackageVersionSuse_method.return_value = {
+    findNearestAgentPackageVersion_method.return_value = {
       "exitstatus" : 0,
       "log": [nearest_version, ""]
     }
 
     result_version = setup_agent.getOptimalVersion(projectVersion)
-
-    self.assertTrue(findNearestAgentPackageVersionSuse_method.called)
-    self.assertFalse(findNearestAgentPackageVersion_method.called)
+    self.assertTrue(findNearestAgentPackageVersion_method.called)
     self.assertTrue(result_version["exitstatus"] == 1)
     pass
 
+  @patch.object(setup_agent, 'is_suse')
+  @patch.object(setup_agent, 'is_ubuntu')
+  @patch.object(setup_agent, 'findNearestAgentPackageVersion')
+  def test_returned_optimal_version_is_nearest_on_ubuntu(self, findNearestAgentPackageVersion_method,
+                                                       is_ubuntu_method,
+                                                       is_suse_method):
+    is_suse_method.return_value = False
+    is_ubuntu_method.return_value = True
+
+    projectVersion = ""
+    nearest_version = projectVersion + "1.1.1"
+    findNearestAgentPackageVersion_method.return_value = {
+      "exitstatus" : 0,
+      "log": [nearest_version, ""]
+    }
+
+    result_version = setup_agent.getOptimalVersion(projectVersion)
+    self.assertTrue(findNearestAgentPackageVersion_method.called)
+    self.assertTrue(result_version["exitstatus"] == 1)
+    pass
 
   @patch.object(setup_agent, 'getAvaliableAgentPackageVersions')
   @patch.object(setup_agent, 'is_suse')
-  @patch.object(setup_agent, 'findNearestAgentPackageVersionSuse')
+  @patch.object(setup_agent, 'is_ubuntu')
   @patch.object(setup_agent, 'findNearestAgentPackageVersion')
   def test_returned_optimal_version_is_initial(self, findNearestAgentPackageVersion_method,
-                                               findNearestAgentPackageVersionSuse_method,
+                                               is_ubuntu_method,
                                                is_suse_method, getAvaliableAgentPackageVersions_method):
     getAvaliableAgentPackageVersions_method.return_value = {"exitstatus": 0, "log": "1.1.1"}
     is_suse_method.return_value = False
+    is_ubuntu_method.return_value = False
 
     projectVersion = "1.1.1"
     result_version = setup_agent.getOptimalVersion(projectVersion)
-    self.assertFalse(findNearestAgentPackageVersionSuse_method.called)
     self.assertTrue(findNearestAgentPackageVersion_method.called)
     self.assertTrue(result_version["log"] == projectVersion)
     pass
@@ -141,13 +175,14 @@ class TestSetupAgent(TestCase):
 
   @patch.object(setup_agent, 'getAvaliableAgentPackageVersions')
   @patch.object(setup_agent, 'is_suse')
-  @patch.object(setup_agent, 'findNearestAgentPackageVersionSuse')
+  @patch.object(setup_agent, 'is_ubuntu')
   @patch.object(setup_agent, 'findNearestAgentPackageVersion')
   def test_returned_optimal_version_is_default(self, findNearestAgentPackageVersion_method,
-                                               findNearestAgentPackageVersionSuse_method,
+                                               is_ubuntu_method,
                                                is_suse_method, getAvaliableAgentPackageVersions_method):
     getAvaliableAgentPackageVersions_method.return_value = {"exitstatus": 0, "log": "1.1.1"}
     is_suse_method.return_value = False
+    is_ubuntu_method.return_value = False
     findNearestAgentPackageVersion_method.return_value = {
       "exitstatus" : 0,
       "log": ["1.1.1.1", ""]
@@ -156,7 +191,6 @@ class TestSetupAgent(TestCase):
     projectVersion = "1.1.1"
     result_version = setup_agent.getOptimalVersion(projectVersion)
 
-    self.assertFalse(findNearestAgentPackageVersionSuse_method.called)
     self.assertTrue(findNearestAgentPackageVersion_method.called)
     self.assertTrue(result_version["exitstatus"] == 1)
 
@@ -173,27 +207,30 @@ class TestSetupAgent(TestCase):
     f.read.return_value = " suse "
     self.assertTrue(setup_agent.is_suse())
 
-  @patch.object(subprocess, 'Popen')
-  def test_installAgentSuse(self, Popen_mock):
-    self.assertFalse(setup_agent.installAgentSuse("1") == None)
+  @patch("os.path.isfile")
+  @patch("__builtin__.open")
+  def test_is_ubuntu(self, open_mock, isfile_mock):
+    isfile_mock.return_value = True
+    f = open_mock.return_value
+    f.read.return_value = " ubuntu "
+    self.assertTrue(setup_agent.is_ubuntu())
 
   @patch.object(setup_agent, 'isAgentPackageAlreadyInstalled')
   @patch.object(setup_agent, 'runAgent')
   @patch.object(setup_agent, 'configureAgent')
   @patch.object(setup_agent, 'installAgent')
-  @patch.object(setup_agent, 'installAgentSuse')
   @patch.object(setup_agent, 'is_suse')
+  @patch.object(setup_agent, 'is_ubuntu')
   @patch.object(setup_agent, 'getOptimalVersion')
   @patch.object(setup_agent, 'checkServerReachability')
   @patch("sys.exit")
   @patch("os.path.dirname")
   @patch("os.path.realpath")
   def test_setup_agent_main(self, dirname_mock, realpath_mock, exit_mock, checkServerReachability_mock,
-                            getOptimalVersion_mock, is_suse_mock, installAgentSuse_mock,
+                            getOptimalVersion_mock, is_ubuntu_mock, is_suse_mock,
                             installAgent_mock, configureAgent_mock, runAgent_mock,
                             isAgentPackageAlreadyInstalled_mock):
     installAgent_mock.return_value = {'log': 'log', 'exitstatus': 0}
-    installAgentSuse_mock.return_value = {'log': 'log', 'exitstatus': 0}
     runAgent_mock.return_value = 0
     getOptimalVersion_mock.return_value = {'log': '1.1.2, 1.1.3, ', 'exitstatus': 1}
     setup_agent.main(("setupAgent.py","agents_host","password", "server_hostname","1.1.1","8080"))
@@ -201,21 +238,23 @@ class TestSetupAgent(TestCase):
     self.assertTrue(getOptimalVersion_mock.called)
     exit_mock.reset_mock()
     getOptimalVersion_mock.reset_mock()
+
     getOptimalVersion_mock.return_value = {'log': '1.1.1', 'exitstatus': 0}
     isAgentPackageAlreadyInstalled_mock.return_value = False
     is_suse_mock.return_value = True
+    is_ubuntu_mock.return_value = False
     setup_agent.main(("setupAgent.py","agents_host","password", "server_hostname","1.1.1","8080"))
     self.assertTrue(exit_mock.called)
     self.assertTrue(getOptimalVersion_mock.called)
     self.assertTrue(isAgentPackageAlreadyInstalled_mock.called)
-    self.assertTrue(is_suse_mock.called)
-    self.assertTrue(installAgentSuse_mock.called)
-    self.assertFalse(installAgent_mock.called)
+    self.assertTrue(installAgent_mock.called)
+    self.assertFalse(is_suse_mock.called)
+    self.assertFalse(is_ubuntu_mock.called)
     exit_mock.reset_mock()
     getOptimalVersion_mock.reset_mock()
     isAgentPackageAlreadyInstalled_mock.reset_mock()
     is_suse_mock.reset_mock()
-    installAgentSuse_mock.reset_mock()
+    is_ubuntu_mock.reset_mock()
     installAgent_mock.reset_mock()
 
     getOptimalVersion_mock.return_value = {'log': '', 'exitstatus': 0}
@@ -224,23 +263,25 @@ class TestSetupAgent(TestCase):
     self.assertTrue(getOptimalVersion_mock.called)
     self.assertFalse(isAgentPackageAlreadyInstalled_mock.called)
     self.assertFalse(is_suse_mock.called)
-    self.assertFalse(installAgentSuse_mock.called)
+    self.assertFalse(is_ubuntu_mock.called)
+
     exit_mock.reset_mock()
     getOptimalVersion_mock.reset_mock()
     isAgentPackageAlreadyInstalled_mock.reset_mock()
     is_suse_mock.reset_mock()
-    installAgentSuse_mock.reset_mock()
+    is_ubuntu_mock.reset_mock()
     installAgent_mock.reset_mock()
 
-
     is_suse_mock.return_value = False
+    is_ubuntu_mock.return_value = False
     getOptimalVersion_mock.return_value = {'log': '1.1.1', 'exitstatus': 0}
     setup_agent.main(("setupAgent.py","agents_host","password", "server_hostname","1.1.1","8080"))
     self.assertTrue(exit_mock.called)
     self.assertTrue(getOptimalVersion_mock.called)
     self.assertTrue(isAgentPackageAlreadyInstalled_mock.called)
-    self.assertTrue(is_suse_mock.called)
     self.assertTrue(installAgent_mock.called)
+    self.assertFalse(is_suse_mock.called)
+    self.assertFalse(is_ubuntu_mock.called)
     exit_mock.reset_mock()
     getOptimalVersion_mock.reset_mock()
     isAgentPackageAlreadyInstalled_mock.reset_mock()
@@ -248,7 +289,7 @@ class TestSetupAgent(TestCase):
     getOptimalVersion_mock.reset_mock()
     isAgentPackageAlreadyInstalled_mock.reset_mock()
     is_suse_mock.reset_mock()
-    installAgentSuse_mock.reset_mock()
+    is_ubuntu_mock.reset_mock()
     installAgent_mock.reset_mock()
 
     setup_agent.main(("setupAgent.py","agents_host","password", "server_hostname","{ambariVersion}","8080"))
@@ -261,6 +302,7 @@ class TestSetupAgent(TestCase):
     self.assertTrue(getOptimalVersion_mock.called)
     exit_mock.reset_mock()
     is_suse_mock.return_value = False
+    is_ubuntu_mock.return_value = False
     setup_agent.main(("setupAgent.py","agents_host","password", "server_hostname","null","null"))
     self.assertTrue(exit_mock.called)
     exit_mock.reset_mock()
@@ -276,11 +318,13 @@ class TestSetupAgent(TestCase):
         # Expected
         pass
     self.assertTrue(exit_mock.called)
+    installAgent_mock.reset_mock()
     exit_mock.reset_mock()
     #if suse
     is_suse_mock.return_value = True
+    is_ubuntu_mock.return_value = False
     #if "zypper install -y ambari-agent" return not 0 result
-    installAgentSuse_mock.return_value = {'log': 'log', 'exitstatus': 1}
+    installAgent_mock.return_value = {'log': 'log', 'exitstatus': 1}
     try:
         setup_agent.main(("setupAgent.py","agents_host","password", "server_hostname","1.1.1","8080"))
         self.fail("Should throw exception")
@@ -288,15 +332,19 @@ class TestSetupAgent(TestCase):
         # Expected
         pass
     self.assertTrue(exit_mock.called)
+    exit_mock.reset_mock()
+    #if ubuntu
+    is_suse_mock.return_value = False
+    is_ubuntu_mock.return_value = True
 
-
-  @patch.object(setup_agent, 'execOsCommand')
-  def test_findNearestAgentPackageVersionSuse(self, execOsCommand_mock):
-      setup_agent.findNearestAgentPackageVersionSuse("1.1.1")
-      self.assertTrue(execOsCommand_mock.called)
-      execOsCommand_mock.reset_mock()
-      setup_agent.findNearestAgentPackageVersionSuse("")
-      self.assertTrue(execOsCommand_mock.called)
+    installAgent_mock.return_value = {'log': 'log', 'exitstatus': 1}
+    try:
+        setup_agent.main(("setupAgent.py","agents_host","password", "server_hostname","1.1.1","8080"))
+        self.fail("Should throw exception")
+    except Exception:
+        # Expected
+        pass
+    self.assertTrue(exit_mock.called)
 
   @patch.object(setup_agent, 'execOsCommand')
   def test_findNearestAgentPackageVersion(self, execOsCommand_mock):
@@ -322,11 +370,6 @@ class TestSetupAgent(TestCase):
       self.assertTrue(execOsCommand_mock.called)
 
   @patch.object(setup_agent, 'execOsCommand')
-  def test_getAvaliableAgentPackageVersionsSuse(self, execOsCommand_mock):
-      setup_agent.getAvaliableAgentPackageVersionsSuse()
-      self.assertTrue(execOsCommand_mock.called)
-
-  @patch.object(setup_agent, 'execOsCommand')
   def test_installAgent(self, execOsCommand_mock):
     setup_agent.installAgent("1.1.1")
-    self.assertTrue(execOsCommand_mock.called)
\ No newline at end of file
+    self.assertTrue(execOsCommand_mock.called)