예제 #1
0
 def setUp(self):
     self.buildMirrorSegs = GpMirrorListToBuild(
         toBuild = [],
         pool = None, 
         quiet = True, 
         parallelDegree = 0
         )
예제 #2
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)
예제 #3
0
 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)
예제 #7
0
 def setUp(self):
     self.buildMirrorSegs = GpMirrorListToBuild(
         toBuild = [],
         pool = None, 
         quiet = True, 
         parallelDegree = 0
         )
예제 #8
0
    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)
예제 #13
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
            )
예제 #14
0
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)
예제 #15
0
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'
        ))
예제 #16
0
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()])
예제 #17
0
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()])
예제 #18
0
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')
예제 #19
0
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)