123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264 |
- #!/usr/bin/env python2.6
- '''
- Licensed to the Apache Software Foundation (ASF) under one
- or more contributor license agreements. See the NOTICE file
- distributed with this work for additional information
- regarding copyright ownership. The ASF licenses this file
- to you under the Apache License, Version 2.0 (the
- "License"); you may not use this file except in compliance
- with the License. You may obtain a copy of the License at
- http://www.apache.org/licenses/LICENSE-2.0
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- '''
- from unittest import TestCase
- import unittest
- import StringIO
- import socket
- import os, sys, pprint, json
- from mock.mock import patch
- from mock.mock import MagicMock
- from mock.mock import create_autospec
- import os, errno, tempfile
- from ambari_agent import UpgradeExecutor
- import logging
- from ambari_agent import AmbariConfig
- from ambari_agent.StackVersionsFileHandler import StackVersionsFileHandler
- class TestUpgradeExecutor(TestCase):
- logger = logging.getLogger()
- @patch.object(StackVersionsFileHandler, 'write_stack_version')
- @patch('os.path.isdir')
- def test_perform_stack_upgrade(self, isdir_method, write_stack_version_method):
- puppetExecutor = MagicMock()
- executor = UpgradeExecutor.UpgradeExecutor('pythonExecutor',
- puppetExecutor, AmbariConfig.AmbariConfig().getConfig())
- # Checking matching versions
- command = {
- 'commandParams' : {
- 'source_stack_version' : '{\"stackName\":\"HDP\",\"stackVersion\":\"1.3.0\"}',
- 'target_stack_version' : '{\"stackName\":\"HDP\",\"stackVersion\":\"1.3.0\"}',
- },
- 'role' : 'HDFS'
- }
- result = executor.perform_stack_upgrade(command, 'tmpout', 'tmperr')
- self.assertTrue('matches current stack version' in result['stdout'])
- self.assertFalse(write_stack_version_method.called)
- # Checking unsupported update
- write_stack_version_method.reset()
- command = {
- 'commandParams' : {
- 'source_stack_version' : '{\"stackName\":\"HDP\",\"stackVersion\":\"1.0.1\"}',
- 'target_stack_version' : '{\"stackName\":\"HDP\",\"stackVersion\":\"1.3.0\"}',
- },
- 'role' : 'HDFS'
- }
- isdir_method.return_value = False
- result = executor.perform_stack_upgrade(command, 'tmpout', 'tmperr')
- self.assertTrue('not supported' in result['stderr'])
- self.assertFalse(write_stack_version_method.called)
- # Checking wrong source version
- write_stack_version_method.reset()
- command = {
- 'commandParams' : {
- 'source_stack_version' : '{\"stackName\":\"HDP\",\"stackVersion\":\"Wrong\"}',
- 'target_stack_version' : '{\"stackName\":\"HDP\",\"stackVersion\":\"1.3.0\"}',
- },
- 'role' : 'HDFS'
- }
- result = executor.perform_stack_upgrade(command, 'tmpout', 'tmperr')
- self.assertTrue('does not match pattern' in result['stderr'])
- self.assertFalse(write_stack_version_method.called)
- # Checking wrong target version
- write_stack_version_method.reset()
- command = {
- 'commandParams' : {
- 'source_stack_version' : '{\"stackName\":\"HDP\",\"stackVersion\":\"1.3.0\"}',
- 'target_stack_version' : '{\"stackName\":\"HDP\",\"stackVersion\":\"Wrong\"}',
- },
- 'role' : 'HDFS'
- }
- result = executor.perform_stack_upgrade(command, 'tmpout', 'tmperr')
- self.assertTrue('does not match pattern' in result['stderr'])
- self.assertFalse(write_stack_version_method.called)
- # Checking successful result
- write_stack_version_method.reset()
- command = {
- 'commandParams' : {
- 'source_stack_version' : '{\"stackName\":\"HDP\",\"stackVersion\":\"1.0.1\"}',
- 'target_stack_version' : '{\"stackName\":\"HDP\",\"stackVersion\":\"1.3.0\"}',
- },
- 'role' : 'HDFS'
- }
- isdir_method.return_value = True
- executor.execute_dir = lambda command, basedir, dir, tmpout, tmperr : \
- {
- 'exitcode' : 0,
- 'stdout' : "output - %s" % dir,
- 'stderr' : "errors - %s" % dir,
- }
- result = executor.perform_stack_upgrade(command, 'tmpout', 'tmperr')
- self.assertTrue(write_stack_version_method.called)
- self.assertEquals(result['exitcode'],0)
- self.assertEquals(result['stdout'],'output - pre-upgrade.d\noutput - upgrade.d\noutput - post-upgrade.d')
- self.assertEquals(result['stderr'],'errors - pre-upgrade.d\nerrors - upgrade.d\nerrors - post-upgrade.d')
- # Checking failed result
- write_stack_version_method.reset()
- command = {
- 'commandParams' : {
- 'source_stack_version' : '{\"stackName\":\"HDP\",\"stackVersion\":\"1.0.1\"}',
- 'target_stack_version' : '{\"stackName\":\"HDP\",\"stackVersion\":\"1.3.0\"}',
- },
- 'role' : 'HDFS'
- }
- isdir_method.return_value = True
- executor.execute_dir = lambda command, basedir, dir, tmpout, tmperr :\
- {
- 'exitcode' : 1,
- 'stdout' : "output - %s" % dir,
- 'stderr' : "errors - %s" % dir,
- }
- result = executor.perform_stack_upgrade(command, 'tmpout', 'tmperr')
- self.assertTrue(write_stack_version_method.called)
- self.assertEquals(result['exitcode'],1)
- self.assertEquals(result['stdout'],'output - pre-upgrade.d')
- self.assertEquals(result['stderr'],'errors - pre-upgrade.d')
- def test_get_key_func(self):
- executor = UpgradeExecutor.UpgradeExecutor('pythonExecutor',
- 'puppetExecutor', AmbariConfig.AmbariConfig().getConfig())
- # Checking unparseable
- self.assertEqual(executor.get_key_func('fdsfds'), 999)
- self.assertEqual(executor.get_key_func('99dfsfd'), 999)
- self.assertEqual(executor.get_key_func('-fdfds'), 999)
- # checking parseable
- self.assertEqual(executor.get_key_func('99'), 99)
- self.assertEqual(executor.get_key_func('45-install'), 45)
- self.assertEqual(executor.get_key_func('33-install-staff'), 33)
- #checking sorting of full list
- testlist1 = ['7-fdfd', '10-erewfds', '11-fdfdfd', '1-hh', '20-kk', '01-tt']
- testlist1.sort(key = executor.get_key_func)
- self.assertEqual(testlist1,
- ['1-hh', '01-tt', '7-fdfd', '10-erewfds', '11-fdfdfd', '20-kk'])
- def test_split_stack_version(self):
- executor = UpgradeExecutor.UpgradeExecutor('pythonExecutor',
- 'puppetExecutor', AmbariConfig.AmbariConfig().getConfig())
- result = executor.split_stack_version('{\"stackName\":\"HDP\",\"stackVersion\":\"1.2.1\"}')
- self.assertEquals(result, ('HDP', '1', '2'))
- result = executor.split_stack_version('{\"stackName\":\"HDP\",\"stackVersion\":\"1.3\"}')
- self.assertEquals(result, ('HDP', '1', '3'))
- result = executor.split_stack_version('{\"stackName\":\"ComplexStackVersion\",\"stackVersion\":\"1.3.4.2.2\"}')
- self.assertEquals(result, ('ComplexStackVersion', '1', '3'))
- result = executor.split_stack_version('{\"stackName\":\"HDP\",\"stackVersion\":\"1\"}')
- self.assertEquals(result, None)
- pass
- @patch('os.listdir')
- @patch('os.path.isdir')
- @patch.object(UpgradeExecutor.UpgradeExecutor, 'get_key_func')
- def test_execute_dir(self, get_key_func_method, isdir_method, listdir_method):
- pythonExecutor = MagicMock()
- puppetExecutor = MagicMock()
- command = {'debug': 'command'}
- isdir_method.return_value = True
- # Mocking sort() method of list
- class MyList(list):
- pass
- files = MyList(['first.py', 'second.pp', 'third.py', 'fourth.nm',
- 'fifth-failing.py', 'six.py'])
- files.sort = lambda key: None
- listdir_method.return_value = files
- # fifth-failing.py will fail
- pythonExecutor.run_file.side_effect = [
- {'exitcode' : 0,
- 'stdout' : "stdout - first.py",
- 'stderr' : "stderr - first.py"},
- {'exitcode' : 0,
- 'stdout' : "stdout - third.py",
- 'stderr' : "stderr - third.py"},
- {'exitcode' : 1,
- 'stdout' : "stdout - fifth-failing.py",
- 'stderr' : "stderr - fifth-failing.py"},
- {'exitcode' : 0,
- 'stdout' : "stdout - six.py",
- 'stderr' : "stderr - six.py"},
- ]
- puppetExecutor.run_manifest.side_effect = [
- {'exitcode' : 0,
- 'stdout' : "stdout - second.pp",
- 'stderr' : "stderr - second.pp"},
- ]
- executor = UpgradeExecutor.UpgradeExecutor(pythonExecutor,
- puppetExecutor, AmbariConfig.AmbariConfig().getConfig())
- result= executor.execute_dir(command, 'basedir', 'dir', 'tmpout', 'tmperr')
- self.assertEquals(result['exitcode'],1)
- self.assertEquals(result['stdout'],"\nstdout - first.py\nstdout - second.pp\nstdout - third.py\nUnrecognized file type, skipping: basedir/dir/fourth.nm\nstdout - fifth-failing.py")
- self.assertEquals(result['stderr'],"\nstderr - first.py\nstderr - second.pp\nstderr - third.py\nNone\nstderr - fifth-failing.py")
- @patch('os.path.isdir')
- def test_execute_dir_not_existing(self, isdir_method):
- pythonExecutor = MagicMock()
- puppetExecutor = MagicMock()
- command = {'debug': 'command'}
- isdir_method.return_value = False
- executor = UpgradeExecutor.UpgradeExecutor(pythonExecutor,
- puppetExecutor, AmbariConfig.AmbariConfig().getConfig())
- result= executor.execute_dir(command, 'basedir', 'not_existing_dir', 'tmpout', 'tmperr')
- self.assertEquals(result['exitcode'],0)
- self.assertEquals(result['stdout'],'Script directory basedir/not_existing_dir does not exist, skipping')
- self.assertEquals(result['stderr'],'None')
- @patch('os.listdir')
- @patch('os.path.isdir')
- def test_execute_dir_ignore_badly_named(self, isdir_method, listdir_method):
- pythonExecutor = MagicMock()
- puppetExecutor = MagicMock()
- command = {'debug': 'command'}
- isdir_method.return_value = True
- files = ['00-first.py', 'badly-named.pp', '10-second.pp', '20-wrong.cpp']
- listdir_method.return_value = files
- # fifth-failing.py will fail
- pythonExecutor.run_file.side_effect = [
- {'exitcode' : 0,
- 'stdout' : "stdout - python.py",
- 'stderr' : "stderr - python.py"},
- ]
- puppetExecutor.run_manifest.side_effect = [
- {'exitcode' : 0,
- 'stdout' : "stdout - puppet.pp",
- 'stderr' : "stderr - puppet.pp"},
- ]
- executor = UpgradeExecutor.UpgradeExecutor(pythonExecutor,
- puppetExecutor, AmbariConfig.AmbariConfig().getConfig())
- result= executor.execute_dir(command, 'basedir', 'dir', 'tmpout', 'tmperr')
- self.assertEquals(result['exitcode'],0)
- self.assertEquals(result['stdout'],'\nstdout - python.py\nstdout - puppet.pp\nUnrecognized file type, skipping: basedir/dir/20-wrong.cpp')
- self.assertEquals(result['stderr'],'\nstderr - python.py\nstderr - puppet.pp\nNone')
- if __name__ == "__main__":
- unittest.main(verbosity=2)
|