def setUp(self): self.buildMirrorSegs = GpMirrorListToBuild( toBuild = [], pool = None, quiet = True, parallelDegree = 0 )
def setUp(self): self.master = Segment(content=-1, preferred_role='p', dbid=1, role='p', mode='s', status='u', hostname='masterhost', address='masterhost-1', port=1111, datadir='/masterdir') self.primary = Segment(content=0, preferred_role='p', dbid=2, role='p', mode='s', status='u', hostname='primaryhost', address='primaryhost-1', port=3333, datadir='/primary') self.logger = Mock( spec=['log', 'warn', 'info', 'debug', 'error', 'warning', 'fatal']) self.apply_patches([]) self.buildMirrorSegs = GpMirrorListToBuild(toBuild=[], pool=None, quiet=True, parallelDegree=0, logger=self.logger)
def setUp(self): self.pool = Mock(spec=base.WorkerPool) self.buildMirrorSegs = GpMirrorListToBuild( toBuild=[], pool=self.pool, quiet=True, parallelDegree=0, logger=Mock(spec=logging.Logger))
def setUp(self): self.logger = Mock( spec=['log', 'warn', 'info', 'debug', 'error', 'warning', 'fatal']) self.apply_patches([]) self.buildMirrorSegs = GpMirrorListToBuild(toBuild=[], pool=None, quiet=True, parallelDegree=0, logger=self.logger)
def _run_buildMirrors(self, mirrors_to_build): buildMirrorSegs_obj = GpMirrorListToBuild(toBuild=mirrors_to_build, pool=None, quiet=True, parallelDegree=0, logger=self.mock_logger) self._setup_mocks(buildMirrorSegs_obj) self.assertTrue( buildMirrorSegs_obj.buildMirrors(self.action, self.gpEnv, self.gpArray)) return buildMirrorSegs_obj
def test_buildMirrors_noMirrors(self): buildMirrorSegs_obj = GpMirrorListToBuild(toBuild=[], pool=None, quiet=True, parallelDegree=0, logger=self.mock_logger) self.assertTrue(buildMirrorSegs_obj.buildMirrors(None, None, None)) self.assertTrue( buildMirrorSegs_obj.buildMirrors(self.action, None, None)) self.assertEqual( [call('No segments to None'), call('No segments to recover')], self.mock_logger.info.call_args_list)
def test_pg_rewind_parallel_execution(self): self.apply_patches([ # Mock CHECKPOINT command in run_pg_rewind() as successful patch('gppylib.db.dbconn.connect', return_value=Mock()), patch('gppylib.db.dbconn.execSQL', return_value=Mock()), # Mock the command to remove postmaster.pid as successful patch('gppylib.commands.base.Command.run', return_value=Mock()), patch('gppylib.commands.base.Command.get_return_code', return_value=0), # Mock gplog which is used in RewindSegmentInfo below patch('gppylib.gplog.get_logger_dir', return_value=Mock()), # Mock all pg_rewind commands to be not successful patch('gppylib.commands.base.Command.was_successful', return_value=False), patch('gppylib.commands.base.Command.get_stdout', return_value='Mocking results'), patch('gppylib.commands.base.Command.results', return_value=CommandResult(1, 'stdout:Failed', 'stderr:Failed', True, False)) ]) from gppylib.operations.buildMirrorSegments import GpMirrorListToBuild # WorkerPool is the only valid parameter required in this test # case. The test expects the workers to get a pg_rewind # command to run (and the command should fail to run). g = GpMirrorListToBuild(1, self.pool, 1, 1) rewindInfo = {} p0 = Segment.initFromString( "2|0|p|p|s|u|sdw1|sdw1|40000|/data/primary0") p1 = Segment.initFromString( "3|1|p|p|s|u|sdw2|sdw2|40001|/data/primary1") m0 = Segment.initFromString( "4|0|m|m|s|u|sdw2|sdw2|50000|/data/mirror0") m1 = Segment.initFromString( "5|1|m|m|s|u|sdw1|sdw1|50001|/data/mirror1") rewindInfo[p0.dbid] = GpMirrorListToBuild.RewindSegmentInfo( p0, p0.address, p0.port, "unused_timestamp") rewindInfo[p1.dbid] = GpMirrorListToBuild.RewindSegmentInfo( p1, p1.address, p1.port, "unused_timestamp") rewindInfo[m0.dbid] = GpMirrorListToBuild.RewindSegmentInfo( m0, m0.address, m0.port, "unused_timestamp") rewindInfo[m1.dbid] = GpMirrorListToBuild.RewindSegmentInfo( m1, m1.address, m1.port, "unused_timestamp") # Test1: all 4 pg_rewind commands should fail due the "was_successful" patch failedSegments = g.run_pg_rewind(rewindInfo) self.assertEqual(len(failedSegments), 4) # The returned list of failed segments should contain items of # type gparray.Segment failedSegments.remove(p0) self.assertTrue(failedSegments[0].getSegmentDbId() > 0) # Test2: patch it such that no failures this time patch('gppylib.commands.base.Command.was_successful', return_value=True).start() failedSegments = g.run_pg_rewind(rewindInfo) self.assertEqual(len(failedSegments), 0)
def test_buildMirrors_failed_seg_in_gparray_fail(self): tests = [{ "name": "failed_seg_exists_in_gparray1", "failed": self.create_primary(status='d'), "failover": self.create_primary(status='d'), "live": self.create_mirror(), "forceFull": True, "forceoverwrite": False }, { "name": "failed_seg_exists_in_gparray2", "failed": self.create_primary(dbid='3', status='d'), "failover": self.create_primary(dbid='3', status='d'), "live": self.create_mirror(dbid='4'), "forceFull": False, "forceoverwrite": False }, { "name": "failed_seg_exists_in_gparray2", "failed": self.create_primary(dbid='3', status='d'), "failover": self.create_primary(dbid='3', status='d'), "live": self.create_mirror(dbid='4'), "forceFull": False, "forceoverwrite": True }] for test in tests: mirror_to_build = GpMirrorToBuild(test["failed"], test["live"], test["failover"], test["forceFull"]) buildMirrorSegs_obj = GpMirrorListToBuild( toBuild=[ mirror_to_build, ], pool=None, quiet=True, parallelDegree=0, logger=self.mock_logger, forceoverwrite=test['forceoverwrite']) self._setup_mocks(buildMirrorSegs_obj) local_gp_array = GpArray([self.coordinator, test["failed"]]) expected_error = "failed segment should not be in the new configuration if failing over to" with self.subTest(msg=test["name"]): with self.assertRaisesRegex(Exception, expected_error): buildMirrorSegs_obj.buildMirrors(self.action, self.gpEnv, local_gp_array)
def test_buildMirrors_forceoverwrite_true(self): failed = self.create_primary(status='d') live = self.create_mirror() failover = self.create_primary(host='sdw3') buildMirrorSegs_obj = GpMirrorListToBuild( toBuild=[GpMirrorToBuild(failed, live, failover, False)], pool=None, quiet=True, parallelDegree=0, logger=self.mock_logger, forceoverwrite=True) self._setup_mocks(buildMirrorSegs_obj) self.assertTrue( buildMirrorSegs_obj.buildMirrors(self.action, self.gpEnv, self.gpArray)) self._common_asserts_with_stop_and_logger( buildMirrorSegs_obj, "Ensuring 1 failed segment(s) are stopped", [failed], [failover], [], {1: True}, 0) self.assertEqual('n', live.getSegmentMode()) self.assertEqual('d', failover.getSegmentStatus()) self.assertEqual('n', failover.getSegmentMode())
def test_clean_up_failed_segments(self): failed1 = self.create_primary(status='d') live1 = self.create_mirror() failed2 = self.create_primary(dbid='3', status='d') failover2 = self.create_primary(dbid='3', status='d') live2 = self.create_mirror(dbid='4') failed3 = self.create_primary(dbid='5') live3 = self.create_mirror(dbid='6') failed4 = self.create_primary(dbid='5') live4 = self.create_mirror(dbid='7') inplace_full1 = GpMirrorToBuild(failed1, live1, None, True) not_inplace_full = GpMirrorToBuild(failed2, live2, failover2, True) inplace_full2 = GpMirrorToBuild(failed3, live3, None, True) inplace_not_full = GpMirrorToBuild(failed4, live4, None, False) buildMirrorSegs_obj = GpMirrorListToBuild(toBuild=[ inplace_full1, not_inplace_full, inplace_full2, inplace_not_full ], pool=None, quiet=True, parallelDegree=0, logger=self.mock_logger, forceoverwrite=True) buildMirrorSegs_obj._GpMirrorListToBuild__runWaitAndCheckWorkerPoolForErrorsAndClear = Mock( ) buildMirrorSegs_obj._clean_up_failed_segments() self.mock_get_segments_by_hostname.assert_called_once_with( [failed1, failed3]) self.mock_logger.info.called_once_with( '"Cleaning files from 2 segment(s)')
def test_clean_up_failed_segments_no_segs_to_cleanup(self): failed2 = self.create_primary(dbid='3', status='d') failover2 = self.create_primary(dbid='3', status='d') live2 = self.create_mirror(dbid='4') failed4 = self.create_primary(dbid='5') live4 = self.create_mirror(dbid='7') not_inplace_full = GpMirrorToBuild(failed2, live2, failover2, True) inplace_not_full = GpMirrorToBuild(failed4, live4, None, False) buildMirrorSegs_obj = GpMirrorListToBuild( toBuild=[not_inplace_full, inplace_not_full], pool=None, quiet=True, parallelDegree=0, logger=self.mock_logger, forceoverwrite=True) buildMirrorSegs_obj._GpMirrorListToBuild__runWaitAndCheckWorkerPoolForErrorsAndClear = Mock( ) buildMirrorSegs_obj._clean_up_failed_segments() self.assertEqual(0, self.mock_get_segments_by_hostname.call_count) self.assertEqual(0, self.mock_logger.info.call_count)
def setUp(self): self.master = Segment(content=-1, preferred_role='p', dbid=1, role='p', mode='s', status='u', hostname='masterhost', address='masterhost-1', port=1111, datadir='/masterdir') self.primary = Segment(content=0, preferred_role='p', dbid=2, role='p', mode='s', status='u', hostname='primaryhost', address='primaryhost-1', port=3333, datadir='/primary') self.logger = Mock(spec=['log', 'warn', 'info', 'debug', 'error', 'warning', 'fatal']) self.apply_patches([ ]) self.buildMirrorSegs = GpMirrorListToBuild( toBuild = [], pool = None, quiet = True, parallelDegree = 0, logger=self.logger )
class buildMirrorSegmentsTestCase(GpTestCase): def setUp(self): self.master = Segment(content=-1, preferred_role='p', dbid=1, role='p', mode='s', status='u', hostname='masterhost', address='masterhost-1', port=1111, datadir='/masterdir') self.primary = Segment(content=0, preferred_role='p', dbid=2, role='p', mode='s', status='u', hostname='primaryhost', address='primaryhost-1', port=3333, datadir='/primary') self.logger = Mock( spec=['log', 'warn', 'info', 'debug', 'error', 'warning', 'fatal']) self.apply_patches([]) self.buildMirrorSegs = GpMirrorListToBuild(toBuild=[], pool=None, quiet=True, parallelDegree=0, logger=self.logger) @patch('gppylib.operations.buildMirrorSegments.get_pid_from_remotehost') @patch('gppylib.operations.buildMirrorSegments.is_pid_postmaster') @patch('gppylib.operations.buildMirrorSegments.check_pid_on_remotehost') def test_get_running_postgres_segments_empty_segs(self, mock1, mock2, mock3): toBuild = [] expected_output = [] segs = self.buildMirrorSegs._get_running_postgres_segments(toBuild) self.assertEquals(segs, expected_output) @patch('gppylib.operations.buildMirrorSegments.get_pid_from_remotehost') @patch('gppylib.operations.buildMirrorSegments.is_pid_postmaster', return_value=True) @patch('gppylib.operations.buildMirrorSegments.check_pid_on_remotehost', return_value=True) def test_get_running_postgres_segments_all_pid_postmaster( self, mock1, mock2, mock3): mock_segs = [Mock(), Mock()] segs = self.buildMirrorSegs._get_running_postgres_segments(mock_segs) self.assertEquals(segs, mock_segs) @patch('gppylib.operations.buildMirrorSegments.get_pid_from_remotehost') @patch('gppylib.operations.buildMirrorSegments.is_pid_postmaster', side_effect=[True, False]) @patch('gppylib.operations.buildMirrorSegments.check_pid_on_remotehost', return_value=True) def test_get_running_postgres_segments_some_pid_postmaster( self, mock1, mock2, mock3): mock_segs = [Mock(), Mock()] expected_output = [] expected_output.append(mock_segs[0]) segs = self.buildMirrorSegs._get_running_postgres_segments(mock_segs) self.assertEquals(segs, expected_output) @patch('gppylib.operations.buildMirrorSegments.get_pid_from_remotehost') @patch('gppylib.operations.buildMirrorSegments.is_pid_postmaster', side_effect=[True, False]) @patch('gppylib.operations.buildMirrorSegments.check_pid_on_remotehost', side_effect=[True, False]) def test_get_running_postgres_segments_one_pid_postmaster( self, mock1, mock2, mock3): mock_segs = [Mock(), Mock()] expected_output = [] expected_output.append(mock_segs[0]) segs = self.buildMirrorSegs._get_running_postgres_segments(mock_segs) self.assertEquals(segs, expected_output) @patch('gppylib.operations.buildMirrorSegments.get_pid_from_remotehost') @patch('gppylib.operations.buildMirrorSegments.is_pid_postmaster', side_effect=[False, False]) @patch('gppylib.operations.buildMirrorSegments.check_pid_on_remotehost', side_effect=[True, False]) def test_get_running_postgres_segments_no_pid_postmaster( self, mock1, mock2, mock3): mock_segs = [Mock(), Mock()] expected_output = [] segs = self.buildMirrorSegs._get_running_postgres_segments(mock_segs) self.assertEquals(segs, expected_output) @patch('gppylib.operations.buildMirrorSegments.get_pid_from_remotehost') @patch('gppylib.operations.buildMirrorSegments.is_pid_postmaster', side_effect=[False, False]) @patch('gppylib.operations.buildMirrorSegments.check_pid_on_remotehost', side_effect=[False, False]) def test_get_running_postgres_segments_no_pid_running( self, mock1, mock2, mock3): mock_segs = [Mock(), Mock()] expected_output = [] segs = self.buildMirrorSegs._get_running_postgres_segments(mock_segs) self.assertEquals(segs, expected_output) @patch('gppylib.commands.base.Command.run') @patch('gppylib.commands.base.Command.get_results', return_value=CommandResult(rc=0, stdout='/tmp/seg0', stderr='', completed=True, halt=False)) def test_dereference_remote_symlink_valid_symlink(self, mock1, mock2): datadir = '/tmp/link/seg0' host = 'h1' self.assertEqual( self.buildMirrorSegs.dereference_remote_symlink(datadir, host), '/tmp/seg0') @patch('gppylib.commands.base.Command.run') @patch('gppylib.commands.base.Command.get_results', return_value=CommandResult(rc=1, stdout='', stderr='', completed=True, halt=False)) def test_dereference_remote_symlink_unable_to_determine_symlink( self, mock1, mock2): datadir = '/tmp/seg0' host = 'h1' self.assertEqual( self.buildMirrorSegs.dereference_remote_symlink(datadir, host), '/tmp/seg0') self.logger.warning.assert_any_call( 'Unable to determine if /tmp/seg0 is symlink. Assuming it is not symlink' ) def test_ensureSharedMemCleaned_no_segments(self): self.buildMirrorSegs._GpMirrorListToBuild__ensureSharedMemCleaned( Mock(), []) self.assertEquals(self.logger.call_count, 0) @patch('gppylib.operations.utils.ParallelOperation.run') @patch('gppylib.gparray.Segment.getSegmentHostName', side_effect=['foo1', 'foo2']) def test_ensureSharedMemCleaned(self, mock1, mock2): self.buildMirrorSegs._GpMirrorListToBuild__ensureSharedMemCleaned( Mock(), [Mock(), Mock()]) self.logger.info.assert_any_call( 'Ensuring that shared memory is cleaned up for stopped segments') self.assertEquals(self.logger.warning.call_count, 0) @patch('gppylib.operations.buildMirrorSegments.read_era') @patch('gppylib.operations.startSegments.StartSegmentsOperation') def test_startAll_succeeds(self, mock1, mock2): result = StartSegmentsResult() result.getFailedSegmentObjs() mock1.return_value.startSegments.return_value = result result = self.buildMirrorSegs._GpMirrorListToBuild__startAll( Mock(), [Mock(), Mock()], []) self.assertTrue(result) @patch('gppylib.operations.buildMirrorSegments.read_era') @patch('gppylib.operations.startSegments.StartSegmentsOperation') def test_startAll_fails(self, mock1, mock2): result = StartSegmentsResult() failed_segment = Segment.initFromString( "2|0|p|p|s|u|sdw1|sdw1|40000|/data/primary0") result.addFailure(failed_segment, 'reason', 'reasoncode') mock1.return_value.startSegments.return_value = result result = self.buildMirrorSegs._GpMirrorListToBuild__startAll( Mock(), [Mock(), Mock()], []) self.assertFalse(result) self.logger.warn.assert_any_call( 'Failed to start segment. The fault prober will shortly mark it as down. ' 'Segment: sdw1:/data/primary0:content=0:dbid=2:role=p:preferred_role=p:mode=s:status=u: REASON: reason' ) @patch('gppylib.operations.buildMirrorSegments.dbconn.connect') @patch('gppylib.operations.buildMirrorSegments.dbconn.execSQL') def test_registerMirrorsInCatalog_succeeds(self, mock1, mock2): gpArray = self._createGpArrayWith2Primary2Mirrors() self.buildMirrorSegs._GpMirrorListToBuild__registerMirrorsInCatalog( gpArray) self.logger.info.assert_any_call( "Updating gp_segment_configuration with mirror info") self.logger.info.assert_any_call( "Successfully updated gp_segment_configuration with mirror info") @patch('gppylib.operations.buildMirrorSegments.dbconn.connect') @patch('gppylib.operations.buildMirrorSegments.dbconn.execSQL', side_effect=Exception("boom")) def test_registerMirrorsInCatalog_fails(self, mock1, mock2): gpArray = self._createGpArrayWith2Primary2Mirrors() with self.assertRaisesRegexp(Exception, "boom"): self.buildMirrorSegs._GpMirrorListToBuild__registerMirrorsInCatalog( gpArray) self.logger.info.assert_any_call( "Updating gp_segment_configuration with mirror info") self.logger.error.assert_any_call( "Failed while updating mirror info in gp_segment_configuration: boom" ) def _createGpArrayWith2Primary2Mirrors(self): self.master = Segment.initFromString( "1|-1|p|p|s|u|mdw|mdw|5432|/data/master") self.primary0 = Segment.initFromString( "2|0|p|p|s|u|sdw1|sdw1|40000|/data/primary0") self.primary1 = Segment.initFromString( "3|1|p|p|s|u|sdw2|sdw2|40001|/data/primary1") mirror0 = Segment.initFromString( "4|0|m|m|s|u|sdw2|sdw2|50000|/data/mirror0") mirror1 = Segment.initFromString( "5|1|m|m|s|u|sdw1|sdw1|50001|/data/mirror1") return GpArray( [self.master, self.primary0, self.primary1, mirror0, mirror1]) def test_checkForPortAndDirectoryConflicts__given_the_same_host_checks_ports_differ( self): self.master.hostname = "samehost" self.primary.hostname = "samehost" self.master.port = 1111 self.primary.port = 1111 gpArray = GpArray([self.master, self.primary]) with self.assertRaisesRegexp( Exception, r"Segment dbid's 2 and 1 on host samehost cannot have the same port 1111." ): self.buildMirrorSegs.checkForPortAndDirectoryConflicts(gpArray) def test_checkForPortAndDirectoryConflicts__given_the_same_host_checks_data_directories_differ( self): self.master.hostname = "samehost" self.primary.hostname = "samehost" self.master.datadir = "/data" self.primary.datadir = "/data" gpArray = GpArray([self.master, self.primary]) with self.assertRaisesRegexp( Exception, r"Segment dbid's 2 and 1 on host samehost cannot have the same data directory '/data'." ): self.buildMirrorSegs.checkForPortAndDirectoryConflicts(gpArray)
class SegmentProgressTestCase(GpTestCase): """ Test case for GpMirrorListToBuild._join_and_show_segment_progress(). """ def setUp(self): self.pool = Mock(spec=base.WorkerPool) self.buildMirrorSegs = GpMirrorListToBuild( toBuild=[], pool=self.pool, quiet=True, parallelDegree=0, logger=Mock(spec=logging.Logger) ) def test_command_output_is_displayed_once_after_worker_pool_completes(self): cmd = Mock(spec=base.Command) cmd.remoteHost = 'localhost' cmd.dbid = 2 cmd.get_results.return_value.stdout = "string 1\n" cmd2 = Mock(spec=base.Command) cmd2.remoteHost = 'host2' cmd2.dbid = 4 cmd2.get_results.return_value.stdout = "string 2\n" outfile = io.StringIO() self.pool.join.return_value = True self.buildMirrorSegs._join_and_show_segment_progress([cmd, cmd2], outfile=outfile) results = outfile.getvalue() self.assertEqual(results, ( 'localhost (dbid 2): string 1\n' 'host2 (dbid 4): string 2\n' )) def test_command_output_is_displayed_once_for_every_blocked_join(self): cmd = Mock(spec=base.Command) cmd.remoteHost = 'localhost' cmd.dbid = 2 cmd.get_results.side_effect = [Mock(stdout="string 1"), Mock(stdout="string 2")] outfile = io.StringIO() self.pool.join.side_effect = [False, True] self.buildMirrorSegs._join_and_show_segment_progress([cmd], outfile=outfile) results = outfile.getvalue() self.assertEqual(results, ( 'localhost (dbid 2): string 1\n' 'localhost (dbid 2): string 2\n' )) def test_inplace_display_uses_ansi_escapes_to_overwrite_previous_output(self): cmd = Mock(spec=base.Command) cmd.remoteHost = 'localhost' cmd.dbid = 2 cmd.get_results.side_effect = [Mock(stdout="string 1"), Mock(stdout="string 2")] cmd2 = Mock(spec=base.Command) cmd2.remoteHost = 'host2' cmd2.dbid = 4 cmd2.get_results.side_effect = [Mock(stdout="string 3"), Mock(stdout="string 4")] outfile = io.StringIO() self.pool.join.side_effect = [False, True] self.buildMirrorSegs._join_and_show_segment_progress([cmd, cmd2], inplace=True, outfile=outfile) results = outfile.getvalue() self.assertEqual(results, ( 'localhost (dbid 2): string 1\x1b[K\n' 'host2 (dbid 4): string 3\x1b[K\n' '\x1b[2A' 'localhost (dbid 2): string 2\x1b[K\n' 'host2 (dbid 4): string 4\x1b[K\n' )) def test_errors_during_command_execution_are_displayed(self): cmd = Mock(spec=base.Command) cmd.remoteHost = 'localhost' cmd.dbid = 2 cmd.get_results.return_value.stderr = "some error\n" cmd.run.side_effect = base.ExecutionError("Some exception", cmd) cmd2 = Mock(spec=base.Command) cmd2.remoteHost = 'host2' cmd2.dbid = 4 cmd2.get_results.return_value.stderr = '' cmd2.run.side_effect = base.ExecutionError("Some exception", cmd2) outfile = io.StringIO() self.pool.join.return_value = True self.buildMirrorSegs._join_and_show_segment_progress([cmd, cmd2], outfile=outfile) results = outfile.getvalue() self.assertEqual(results, ( 'localhost (dbid 2): some error\n' 'host2 (dbid 4): \n' ))
class buildMirrorSegmentsTestCase(unittest.TestCase): def setUp(self): self.buildMirrorSegs = GpMirrorListToBuild( toBuild = [], pool = None, quiet = True, parallelDegree = 0 ) @patch('gppylib.operations.buildMirrorSegments.get_pid_from_remotehost') @patch('gppylib.operations.buildMirrorSegments.is_pid_postmaster') @patch('gppylib.operations.buildMirrorSegments.check_pid_on_remotehost') def test_get_running_postgres_segments_empty_segs(self, mock1, mock2, mock3): toBuild = [] expected_output = [] segs = self.buildMirrorSegs._get_running_postgres_segments(toBuild) self.assertEquals(segs, expected_output) @patch('gppylib.operations.buildMirrorSegments.get_pid_from_remotehost') @patch('gppylib.operations.buildMirrorSegments.is_pid_postmaster', return_value=True) @patch('gppylib.operations.buildMirrorSegments.check_pid_on_remotehost', return_value=True) def test_get_running_postgres_segments_all_pid_postmaster(self, mock1, mock2, mock3): mock_segs = [Mock(), Mock()] segs = self.buildMirrorSegs._get_running_postgres_segments(mock_segs) self.assertEquals(segs, mock_segs) @patch('gppylib.operations.buildMirrorSegments.get_pid_from_remotehost') @patch('gppylib.operations.buildMirrorSegments.is_pid_postmaster', side_effect=[True, False]) @patch('gppylib.operations.buildMirrorSegments.check_pid_on_remotehost', return_value=True) def test_get_running_postgres_segments_some_pid_postmaster(self, mock1, mock2, mock3): mock_segs = [Mock(), Mock()] expected_output = [] expected_output.append(mock_segs[0]) segs = self.buildMirrorSegs._get_running_postgres_segments(mock_segs) self.assertEquals(segs, expected_output) @patch('gppylib.operations.buildMirrorSegments.get_pid_from_remotehost') @patch('gppylib.operations.buildMirrorSegments.is_pid_postmaster', side_effect=[True, False]) @patch('gppylib.operations.buildMirrorSegments.check_pid_on_remotehost', side_effect=[True, False]) def test_get_running_postgres_segments_one_pid_postmaster(self, mock1, mock2, mock3): mock_segs = [Mock(), Mock()] expected_output = [] expected_output.append(mock_segs[0]) segs = self.buildMirrorSegs._get_running_postgres_segments(mock_segs) self.assertEquals(segs, expected_output) @patch('gppylib.operations.buildMirrorSegments.get_pid_from_remotehost') @patch('gppylib.operations.buildMirrorSegments.is_pid_postmaster', side_effect=[False, False]) @patch('gppylib.operations.buildMirrorSegments.check_pid_on_remotehost', side_effect=[True, False]) def test_get_running_postgres_segments_no_pid_postmaster(self, mock1, mock2, mock3): mock_segs = [Mock(), Mock()] expected_output = [] segs = self.buildMirrorSegs._get_running_postgres_segments(mock_segs) self.assertEquals(segs, expected_output) @patch('gppylib.operations.buildMirrorSegments.get_pid_from_remotehost') @patch('gppylib.operations.buildMirrorSegments.is_pid_postmaster', side_effect=[False, False]) @patch('gppylib.operations.buildMirrorSegments.check_pid_on_remotehost', side_effect=[False, False]) def test_get_running_postgres_segments_no_pid_running(self, mock1, mock2, mock3): mock_segs = [Mock(), Mock()] expected_output = [] segs = self.buildMirrorSegs._get_running_postgres_segments(mock_segs) self.assertEquals(segs, expected_output) @patch('gppylib.commands.base.Command.run') @patch('gppylib.commands.base.Command.get_results', return_value=CommandResult(rc=0, stdout='/tmp/seg0', stderr='', completed=True, halt=False)) def test_dereference_remote_symlink_valid_symlink(self, mock1, mock2): datadir = '/tmp/link/seg0' host = 'h1' self.assertEqual(self.buildMirrorSegs.dereference_remote_symlink(datadir, host), '/tmp/seg0') @patch('gppylib.commands.base.Command.run') @patch('gppylib.commands.base.Command.get_results', return_value=CommandResult(rc=1, stdout='', stderr='', completed=True, halt=False)) def test_dereference_remote_symlink_unable_to_determine_symlink(self, mock1, mock2): datadir = '/tmp/seg0' host = 'h1' self.assertEqual(self.buildMirrorSegs.dereference_remote_symlink(datadir, host), '/tmp/seg0') def test_ensureSharedMemCleaned_no_segments(self): self.buildMirrorSegs._GpMirrorListToBuild__ensureSharedMemCleaned(Mock(), []) @patch('gppylib.gparray.GpDB.getSegmentHostName', side_effect=['foo1', 'foo2']) def test_ensureSharedMemCleaned(self, mock1): self.buildMirrorSegs._GpMirrorListToBuild__ensureSharedMemCleaned(Mock(), [Mock(), Mock()])
class buildMirrorSegmentsTestCase(GpTestCase): def setUp(self): self.logger = Mock(spec=['log', 'warn', 'info', 'debug', 'error', 'warning', 'fatal']) self.apply_patches([ ]) self.buildMirrorSegs = GpMirrorListToBuild( toBuild = [], pool = None, quiet = True, parallelDegree = 0, logger=self.logger ) @patch('gppylib.operations.buildMirrorSegments.get_pid_from_remotehost') @patch('gppylib.operations.buildMirrorSegments.is_pid_postmaster') @patch('gppylib.operations.buildMirrorSegments.check_pid_on_remotehost') def test_get_running_postgres_segments_empty_segs(self, mock1, mock2, mock3): toBuild = [] expected_output = [] segs = self.buildMirrorSegs._get_running_postgres_segments(toBuild) self.assertEquals(segs, expected_output) @patch('gppylib.operations.buildMirrorSegments.get_pid_from_remotehost') @patch('gppylib.operations.buildMirrorSegments.is_pid_postmaster', return_value=True) @patch('gppylib.operations.buildMirrorSegments.check_pid_on_remotehost', return_value=True) def test_get_running_postgres_segments_all_pid_postmaster(self, mock1, mock2, mock3): mock_segs = [Mock(), Mock()] segs = self.buildMirrorSegs._get_running_postgres_segments(mock_segs) self.assertEquals(segs, mock_segs) @patch('gppylib.operations.buildMirrorSegments.get_pid_from_remotehost') @patch('gppylib.operations.buildMirrorSegments.is_pid_postmaster', side_effect=[True, False]) @patch('gppylib.operations.buildMirrorSegments.check_pid_on_remotehost', return_value=True) def test_get_running_postgres_segments_some_pid_postmaster(self, mock1, mock2, mock3): mock_segs = [Mock(), Mock()] expected_output = [] expected_output.append(mock_segs[0]) segs = self.buildMirrorSegs._get_running_postgres_segments(mock_segs) self.assertEquals(segs, expected_output) @patch('gppylib.operations.buildMirrorSegments.get_pid_from_remotehost') @patch('gppylib.operations.buildMirrorSegments.is_pid_postmaster', side_effect=[True, False]) @patch('gppylib.operations.buildMirrorSegments.check_pid_on_remotehost', side_effect=[True, False]) def test_get_running_postgres_segments_one_pid_postmaster(self, mock1, mock2, mock3): mock_segs = [Mock(), Mock()] expected_output = [] expected_output.append(mock_segs[0]) segs = self.buildMirrorSegs._get_running_postgres_segments(mock_segs) self.assertEquals(segs, expected_output) @patch('gppylib.operations.buildMirrorSegments.get_pid_from_remotehost') @patch('gppylib.operations.buildMirrorSegments.is_pid_postmaster', side_effect=[False, False]) @patch('gppylib.operations.buildMirrorSegments.check_pid_on_remotehost', side_effect=[True, False]) def test_get_running_postgres_segments_no_pid_postmaster(self, mock1, mock2, mock3): mock_segs = [Mock(), Mock()] expected_output = [] segs = self.buildMirrorSegs._get_running_postgres_segments(mock_segs) self.assertEquals(segs, expected_output) @patch('gppylib.operations.buildMirrorSegments.get_pid_from_remotehost') @patch('gppylib.operations.buildMirrorSegments.is_pid_postmaster', side_effect=[False, False]) @patch('gppylib.operations.buildMirrorSegments.check_pid_on_remotehost', side_effect=[False, False]) def test_get_running_postgres_segments_no_pid_running(self, mock1, mock2, mock3): mock_segs = [Mock(), Mock()] expected_output = [] segs = self.buildMirrorSegs._get_running_postgres_segments(mock_segs) self.assertEquals(segs, expected_output) @patch('gppylib.commands.base.Command.run') @patch('gppylib.commands.base.Command.get_results', return_value=CommandResult(rc=0, stdout='/tmp/seg0', stderr='', completed=True, halt=False)) def test_dereference_remote_symlink_valid_symlink(self, mock1, mock2): datadir = '/tmp/link/seg0' host = 'h1' self.assertEqual(self.buildMirrorSegs.dereference_remote_symlink(datadir, host), '/tmp/seg0') @patch('gppylib.commands.base.Command.run') @patch('gppylib.commands.base.Command.get_results', return_value=CommandResult(rc=1, stdout='', stderr='', completed=True, halt=False)) def test_dereference_remote_symlink_unable_to_determine_symlink(self, mock1, mock2): datadir = '/tmp/seg0' host = 'h1' self.assertEqual(self.buildMirrorSegs.dereference_remote_symlink(datadir, host), '/tmp/seg0') self.logger.warning.assert_any_call('Unable to determine if /tmp/seg0 is symlink. Assuming it is not symlink') def test_ensureSharedMemCleaned_no_segments(self): self.buildMirrorSegs._GpMirrorListToBuild__ensureSharedMemCleaned(Mock(), []) self.assertEquals(self.logger.call_count, 0) @patch('gppylib.operations.utils.ParallelOperation.run') @patch('gppylib.gparray.Segment.getSegmentHostName', side_effect=['foo1', 'foo2']) def test_ensureSharedMemCleaned(self, mock1, mock2): self.buildMirrorSegs._GpMirrorListToBuild__ensureSharedMemCleaned(Mock(), [Mock(), Mock()]) self.logger.info.assert_any_call('Ensuring that shared memory is cleaned up for stopped segments') self.assertEquals(self.logger.warning.call_count, 0) @patch('gppylib.operations.buildMirrorSegments.read_era') @patch('gppylib.operations.startSegments.StartSegmentsOperation') def test_startAll_succeeds(self, mock1, mock2): result = StartSegmentsResult() result.getFailedSegmentObjs() mock1.return_value.startSegments.return_value = result result = self.buildMirrorSegs._GpMirrorListToBuild__startAll(Mock(), [Mock(), Mock()], []) self.assertTrue(result) @patch('gppylib.operations.buildMirrorSegments.read_era') @patch('gppylib.operations.startSegments.StartSegmentsOperation') def test_startAll_fails(self, mock1, mock2): result = StartSegmentsResult() failed_segment = Segment.initFromString( "2|0|p|p|s|u|sdw1|sdw1|40000|/data/primary0") result.addFailure(failed_segment, 'reason', 'reasoncode') mock1.return_value.startSegments.return_value = result result = self.buildMirrorSegs._GpMirrorListToBuild__startAll(Mock(), [Mock(), Mock()], []) self.assertFalse(result) self.logger.warn.assert_any_call('Failed to start segment. The fault prober will shortly mark it as down. ' 'Segment: sdw1:/data/primary0:content=0:dbid=2:mode=s:status=u: REASON: reason')
class buildMirrorSegmentsTestCase(GpTestCase): def setUp(self): self.master = Segment(content=-1, preferred_role='p', dbid=1, role='p', mode='s', status='u', hostname='masterhost', address='masterhost-1', port=1111, datadir='/masterdir') self.primary = Segment(content=0, preferred_role='p', dbid=2, role='p', mode='s', status='u', hostname='primaryhost', address='primaryhost-1', port=3333, datadir='/primary') self.logger = Mock(spec=['log', 'warn', 'info', 'debug', 'error', 'warning', 'fatal']) self.apply_patches([ ]) self.buildMirrorSegs = GpMirrorListToBuild( toBuild = [], pool = None, quiet = True, parallelDegree = 0, logger=self.logger ) @patch('gppylib.operations.buildMirrorSegments.get_pid_from_remotehost') @patch('gppylib.operations.buildMirrorSegments.is_pid_postmaster') @patch('gppylib.operations.buildMirrorSegments.check_pid_on_remotehost') def test_get_running_postgres_segments_empty_segs(self, mock1, mock2, mock3): toBuild = [] expected_output = [] segs = self.buildMirrorSegs._get_running_postgres_segments(toBuild) self.assertEquals(segs, expected_output) @patch('gppylib.operations.buildMirrorSegments.get_pid_from_remotehost') @patch('gppylib.operations.buildMirrorSegments.is_pid_postmaster', return_value=True) @patch('gppylib.operations.buildMirrorSegments.check_pid_on_remotehost', return_value=True) def test_get_running_postgres_segments_all_pid_postmaster(self, mock1, mock2, mock3): mock_segs = [Mock(), Mock()] segs = self.buildMirrorSegs._get_running_postgres_segments(mock_segs) self.assertEquals(segs, mock_segs) @patch('gppylib.operations.buildMirrorSegments.get_pid_from_remotehost') @patch('gppylib.operations.buildMirrorSegments.is_pid_postmaster', side_effect=[True, False]) @patch('gppylib.operations.buildMirrorSegments.check_pid_on_remotehost', return_value=True) def test_get_running_postgres_segments_some_pid_postmaster(self, mock1, mock2, mock3): mock_segs = [Mock(), Mock()] expected_output = [] expected_output.append(mock_segs[0]) segs = self.buildMirrorSegs._get_running_postgres_segments(mock_segs) self.assertEquals(segs, expected_output) @patch('gppylib.operations.buildMirrorSegments.get_pid_from_remotehost') @patch('gppylib.operations.buildMirrorSegments.is_pid_postmaster', side_effect=[True, False]) @patch('gppylib.operations.buildMirrorSegments.check_pid_on_remotehost', side_effect=[True, False]) def test_get_running_postgres_segments_one_pid_postmaster(self, mock1, mock2, mock3): mock_segs = [Mock(), Mock()] expected_output = [] expected_output.append(mock_segs[0]) segs = self.buildMirrorSegs._get_running_postgres_segments(mock_segs) self.assertEquals(segs, expected_output) @patch('gppylib.operations.buildMirrorSegments.get_pid_from_remotehost') @patch('gppylib.operations.buildMirrorSegments.is_pid_postmaster', side_effect=[False, False]) @patch('gppylib.operations.buildMirrorSegments.check_pid_on_remotehost', side_effect=[True, False]) def test_get_running_postgres_segments_no_pid_postmaster(self, mock1, mock2, mock3): mock_segs = [Mock(), Mock()] expected_output = [] segs = self.buildMirrorSegs._get_running_postgres_segments(mock_segs) self.assertEquals(segs, expected_output) @patch('gppylib.operations.buildMirrorSegments.get_pid_from_remotehost') @patch('gppylib.operations.buildMirrorSegments.is_pid_postmaster', side_effect=[False, False]) @patch('gppylib.operations.buildMirrorSegments.check_pid_on_remotehost', side_effect=[False, False]) def test_get_running_postgres_segments_no_pid_running(self, mock1, mock2, mock3): mock_segs = [Mock(), Mock()] expected_output = [] segs = self.buildMirrorSegs._get_running_postgres_segments(mock_segs) self.assertEquals(segs, expected_output) @patch('gppylib.commands.base.Command.run') @patch('gppylib.commands.base.Command.get_results', return_value=CommandResult(rc=0, stdout='/tmp/seg0', stderr='', completed=True, halt=False)) def test_dereference_remote_symlink_valid_symlink(self, mock1, mock2): datadir = '/tmp/link/seg0' host = 'h1' self.assertEqual(self.buildMirrorSegs.dereference_remote_symlink(datadir, host), '/tmp/seg0') @patch('gppylib.commands.base.Command.run') @patch('gppylib.commands.base.Command.get_results', return_value=CommandResult(rc=1, stdout='', stderr='', completed=True, halt=False)) def test_dereference_remote_symlink_unable_to_determine_symlink(self, mock1, mock2): datadir = '/tmp/seg0' host = 'h1' self.assertEqual(self.buildMirrorSegs.dereference_remote_symlink(datadir, host), '/tmp/seg0') self.logger.warning.assert_any_call('Unable to determine if /tmp/seg0 is symlink. Assuming it is not symlink') def test_ensureSharedMemCleaned_no_segments(self): self.buildMirrorSegs._GpMirrorListToBuild__ensureSharedMemCleaned(Mock(), []) self.assertEquals(self.logger.call_count, 0) @patch('gppylib.operations.utils.ParallelOperation.run') @patch('gppylib.gparray.Segment.getSegmentHostName', side_effect=['foo1', 'foo2']) def test_ensureSharedMemCleaned(self, mock1, mock2): self.buildMirrorSegs._GpMirrorListToBuild__ensureSharedMemCleaned(Mock(), [Mock(), Mock()]) self.logger.info.assert_any_call('Ensuring that shared memory is cleaned up for stopped segments') self.assertEquals(self.logger.warning.call_count, 0) @patch('gppylib.operations.buildMirrorSegments.read_era') @patch('gppylib.operations.startSegments.StartSegmentsOperation') def test_startAll_succeeds(self, mock1, mock2): result = StartSegmentsResult() result.getFailedSegmentObjs() mock1.return_value.startSegments.return_value = result result = self.buildMirrorSegs._GpMirrorListToBuild__startAll(Mock(), [Mock(), Mock()], []) self.assertTrue(result) @patch('gppylib.operations.buildMirrorSegments.read_era') @patch('gppylib.operations.startSegments.StartSegmentsOperation') def test_startAll_fails(self, mock1, mock2): result = StartSegmentsResult() failed_segment = Segment.initFromString( "2|0|p|p|s|u|sdw1|sdw1|40000|/data/primary0") result.addFailure(failed_segment, 'reason', 'reasoncode') mock1.return_value.startSegments.return_value = result result = self.buildMirrorSegs._GpMirrorListToBuild__startAll(Mock(), [Mock(), Mock()], []) self.assertFalse(result) self.logger.warn.assert_any_call('Failed to start segment. The fault prober will shortly mark it as down. ' 'Segment: sdw1:/data/primary0:content=0:dbid=2:role=p:preferred_role=p:mode=s:status=u: REASON: reason') @patch('gppylib.operations.buildMirrorSegments.dbconn.connect') @patch('gppylib.operations.buildMirrorSegments.dbconn.execSQL') def test_registerMirrorsInCatalog_succeeds(self, mock1, mock2): gpArray = self._createGpArrayWith2Primary2Mirrors() self.buildMirrorSegs._GpMirrorListToBuild__registerMirrorsInCatalog(gpArray) self.logger.info.assert_any_call("Updating gp_segment_configuration with mirror info") self.logger.info.assert_any_call("Successfully updated gp_segment_configuration with mirror info") @patch('gppylib.operations.buildMirrorSegments.dbconn.connect') @patch('gppylib.operations.buildMirrorSegments.dbconn.execSQL', side_effect=Exception("boom")) def test_registerMirrorsInCatalog_fails(self, mock1, mock2): gpArray = self._createGpArrayWith2Primary2Mirrors() with self.assertRaisesRegexp(Exception, "boom"): self.buildMirrorSegs._GpMirrorListToBuild__registerMirrorsInCatalog(gpArray) self.logger.info.assert_any_call("Updating gp_segment_configuration with mirror info") self.logger.error.assert_any_call("Failed while updating mirror info in gp_segment_configuration: boom") def _createGpArrayWith2Primary2Mirrors(self): self.master = Segment.initFromString( "1|-1|p|p|s|u|mdw|mdw|5432|/data/master") self.primary0 = Segment.initFromString( "2|0|p|p|s|u|sdw1|sdw1|40000|/data/primary0") self.primary1 = Segment.initFromString( "3|1|p|p|s|u|sdw2|sdw2|40001|/data/primary1") mirror0 = Segment.initFromString( "4|0|m|m|s|u|sdw2|sdw2|50000|/data/mirror0") mirror1 = Segment.initFromString( "5|1|m|m|s|u|sdw1|sdw1|50001|/data/mirror1") return GpArray([self.master, self.primary0, self.primary1, mirror0, mirror1]) def test_checkForPortAndDirectoryConflicts__given_the_same_host_checks_ports_differ(self): self.master.hostname = "samehost" self.primary.hostname = "samehost" self.master.port = 1111 self.primary.port = 1111 gpArray = GpArray([self.master, self.primary]) with self.assertRaisesRegexp(Exception, r"Segment dbid's 2 and 1 on host samehost cannot have the same port 1111."): self.buildMirrorSegs.checkForPortAndDirectoryConflicts(gpArray) def test_checkForPortAndDirectoryConflicts__given_the_same_host_checks_data_directories_differ(self): self.master.hostname = "samehost" self.primary.hostname = "samehost" self.master.datadir = "/data" self.primary.datadir = "/data" gpArray = GpArray([self.master, self.primary]) with self.assertRaisesRegexp(Exception, r"Segment dbid's 2 and 1 on host samehost cannot have the same data directory '/data'."): self.buildMirrorSegs.checkForPortAndDirectoryConflicts(gpArray)