def test_gpstart_fails_if_standby_heap_checksum_doesnt_match_master(self): sys.argv = ["gpstart", "-a"] self.gparray = GpArray([ self.master, self.primary0, self.primary1, self.mirror0, self.mirror1, self.standby ]) self.segments_by_content_id = GpArray.getSegmentsByContentId( self.gparray.getSegDbList()) self.mock_os_path_exists.side_effect = os_exists_check self.subject.unix.PgPortIsActive.local.return_value = False self.mock_heap_checksum.return_value.get_master_value.return_value = 1 self.mock_heap_checksum.return_value.get_standby_value.return_value = 0 parser = self.subject.GpStart.createParser() options, args = parser.parse_args() gpstart = self.subject.GpStart.createProgram(options, args) with patch("gpstart.GpArray.initFromCatalog", return_value=self.gparray): return_code = gpstart.run() self.assertEqual(return_code, 1) self.subject.logger.warning.assert_any_call( "Heap checksum settings on standby master do not match master <<<<<<<<" ) self.subject.logger.error.assert_any_call( "gpstart error: Heap checksum settings are not consistent across the cluster." )
def test_host_option_if_no_mirrors_fails(self): sys.argv = ["gpstop", "-a", "--host", "sdw2"] parser = self.subject.GpStop.createParser() options, args = parser.parse_args() self.master = GpDB.initFromString( "1|-1|p|p|s|u|mdw|mdw|5432|None|/data/master||/data/master/base/10899,/data/master/base/1,/data/master/base/10898,/data/master/base/25780,/data/master/base/34782" ) self.standby = GpDB.initFromString( "2|-1|m|m|s|u|sdw1|sdw1|25432|None|/data/master||/data/master/base/10899,/data/master/base/1,/data/master/base/10898,/data/master/base/25780,/data/master/base/34782" ) self.primary0 = GpDB.initFromString( "3|0|p|p|s|u|sdw1|sdw1|40000|41000|/data/primary0||/data/primary0/base/10899,/data/primary0/base/1,/data/primary0/base/10898,/data/primary0/base/25780,/data/primary0/base/34782" ) self.primary1 = GpDB.initFromString( "4|0|p|p|s|u|sdw2|sdw2|40001|41001|/data/primary1||/data/primary1/base/10899,/data/primary1/base/1,/data/primary1/base/10898,/data/primary1/base/25780,/data/primary1/base/34782" ) self.mock_gparray.return_value = GpArray( [self.master, self.standby, self.primary0, self.primary1]) gpstop = self.subject.GpStop.createProgram(options, args) with self.assertRaisesRegexp( Exception, "Cannot perform host-specific gpstop on a cluster without segment mirroring." ): gpstop.run() self.assertEquals(0, self.mock_GpSegStopCmdInit.call_count)
def test_host_option_if_standby_running_on_the_host_fails(self): sys.argv = ["gpstop", "-a", "--host", "sdw1"] parser = self.subject.GpStop.createParser() options, args = parser.parse_args() self.master = GpDB.initFromString( "1|-1|p|p|s|u|mdw|mdw|5432|None|/data/master||/data/master/base/10899,/data/master/base/1,/data/master/base/10898,/data/master/base/25780,/data/master/base/34782" ) self.standby = GpDB.initFromString( "2|-1|m|m|s|u|sdw1|sdw1|25432|None|/data/master||/data/master/base/10899,/data/master/base/1,/data/master/base/10898,/data/master/base/25780,/data/master/base/34782" ) self.primary0 = GpDB.initFromString( "3|0|p|p|s|u|sdw1|sdw1|40000|41000|/data/primary0||/data/primary0/base/10899,/data/primary0/base/1,/data/primary0/base/10898,/data/primary0/base/25780,/data/primary0/base/34782" ) self.mirror0 = GpDB.initFromString( "4|0|m|m|s|u|sdw2|sdw2|50000|51000|/data/mirror0||/data/mirror0/base/10899,/data/mirror0/base/1,/data/mirror0/base/10898,/data/mirror0/base/25780,/data/mirror0/base/34782" ) self.mock_gparray.return_value = GpArray( [self.master, self.standby, self.primary0, self.mirror0]) gpstop = self.subject.GpStop.createProgram(options, args) with self.assertRaisesRegexp( Exception, "Specified host '%s' has the master or standby master on it. This node can only be stopped as part of a full-cluster gpstop, without '--host'." % self.standby.getSegmentHostName()): gpstop.run() self.assertEquals(0, self.mock_GpSegStopCmdInit.call_count)
def test_host_option_segment_on_same_host_with_mirror_fails(self): sys.argv = ["gpstop", "-a", "--host", "sdw1"] parser = self.subject.GpStop.createParser() options, args = parser.parse_args() self.master = GpDB.initFromString( "1|-1|p|p|s|u|mdw|mdw|5432|None|/data/master||/data/master/base/10899,/data/master/base/1,/data/master/base/10898,/data/master/base/25780,/data/master/base/34782" ) self.primary0 = GpDB.initFromString( "2|0|p|p|s|u|sdw1|sdw1|40000|41000|/data/primary0||/data/primary0/base/10899,/data/primary0/base/1,/data/primary0/base/10898,/data/primary0/base/25780,/data/primary0/base/34782" ) self.mirror0 = GpDB.initFromString( "3|0|m|m|s|u|sdw1|sdw1|50000|51000|/data/mirror0||/data/mirror0/base/10899,/data/mirror0/base/1,/data/mirror0/base/10898,/data/mirror0/base/25780,/data/mirror0/base/34782" ) self.mock_gparray.return_value = GpArray( [self.master, self.primary0, self.mirror0]) gpstop = self.subject.GpStop.createProgram(options, args) with self.assertRaisesRegexp( Exception, "Segment host '%s' has both of corresponding primary '%s' and mirror '%s'. Aborting." % (self.primary0.getSegmentHostName(), self.primary0, self.mirror0)): gpstop.run() self.assertEquals(0, self.mock_GpSegStopCmdInit.call_count)
def test_prepare_segment_start_returns_up_and_down_segments(self): # Boilerplate: create a gpstart object parser = self.subject.GpStart.createParser() options, args = parser.parse_args([]) gpstart = self.subject.GpStart.createProgram(options, args) # Up segments master = Segment.initFromString( "1|-1|p|p|n|u|mdw|mdw|5432|/data/master") primary1 = Segment.initFromString( "3|1|p|p|n|u|sdw2|sdw2|40001|/data/primary1") mirror0 = Segment.initFromString( "4|0|m|m|n|u|sdw2|sdw2|50000|/data/mirror0") # Down segments primary0 = Segment.initFromString( "2|0|p|p|n|d|sdw1|sdw1|40000|/data/primary0") mirror1 = Segment.initFromString( "5|1|m|m|n|d|sdw1|sdw1|50001|/data/mirror1") standby = Segment.initFromString( "6|-1|m|m|n|d|sdw3|sdw3|5433|/data/standby") gpstart.gparray = GpArray( [master, primary0, primary1, mirror0, mirror1, standby]) up, down = gpstart._prepare_segment_start() # The master and standby should not be accounted for in these lists. self.assertItemsEqual(up, [primary1, mirror0]) self.assertItemsEqual(down, [primary0, mirror1])
def test_host_option_segment_down_is_skipped_succeeds(self): sys.argv = ["gpstop", "-a", "--host", "sdw1"] parser = self.subject.GpStop.createParser() options, args = parser.parse_args() self.primary0 = Segment.initFromString( "2|0|m|p|s|d|sdw1|sdw1|40000|/data/primary0") self.mirror0 = Segment.initFromString( "6|0|p|m|c|u|sdw2|sdw2|50000|/data/mirror0") self.mock_gparray.return_value = GpArray([ self.master, self.primary0, self.primary1, self.primary2, self.primary3, self.mirror0, self.mirror1, self.mirror2, self.mirror3 ]) gpstop = self.subject.GpStop.createProgram(options, args) gpstop.run() log_messages = self.get_info_messages() self.assertEquals(2, self.mock_GpSegStopCmdInit.call_count) self.assertIn( "Targeting dbid %s for shutdown" % [ self.primary1.getSegmentDbId(), self.mirror2.getSegmentDbId(), self.mirror3.getSegmentDbId() ], log_messages) self.assertIn("Successfully shutdown 3 of 8 segment instances ", log_messages)
def createGpArrayWith4Primary4Mirrors(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|sdw1|sdw1|40001|/data/primary1") self.primary2 = Segment.initFromString( "4|2|p|p|s|u|sdw2|sdw2|40002|/data/primary2") self.primary3 = Segment.initFromString( "5|3|p|p|s|u|sdw2|sdw2|40003|/data/primary3") self.mirror0 = Segment.initFromString( "6|0|m|m|s|u|sdw2|sdw2|50000|/data/mirror0") self.mirror1 = Segment.initFromString( "7|1|m|m|s|u|sdw2|sdw2|50001|/data/mirror1") self.mirror2 = Segment.initFromString( "8|2|m|m|s|u|sdw1|sdw1|50002|/data/mirror2") self.mirror3 = Segment.initFromString( "9|3|m|m|s|u|sdw1|sdw1|50003|/data/mirror3") return GpArray([ self.master, self.primary0, self.primary1, self.primary2, self.primary3, self.mirror0, self.mirror1, self.mirror2, self.mirror3 ])
def createGpArrayWith4Primary4Mirrors(self): self.master = GpDB.initFromString( "1|-1|p|p|s|u|mdw|mdw|5432|None|/data/master||/data/master/base/10899,/data/master/base/1,/data/master/base/10898,/data/master/base/25780,/data/master/base/34782" ) self.primary0 = GpDB.initFromString( "2|0|p|p|s|u|sdw1|sdw1|40000|41000|/data/primary0||/data/primary0/base/10899,/data/primary0/base/1,/data/primary0/base/10898,/data/primary0/base/25780,/data/primary0/base/34782" ) self.primary1 = GpDB.initFromString( "3|1|p|p|s|u|sdw1|sdw1|40001|41001|/data/primary1||/data/primary1/base/10899,/data/primary1/base/1,/data/primary1/base/10898,/data/primary1/base/25780,/data/primary1/base/34782" ) self.primary2 = GpDB.initFromString( "4|2|p|p|s|u|sdw2|sdw2|40002|41002|/data/primary2||/data/primary2/base/10899,/data/primary2/base/1,/data/primary2/base/10898,/data/primary2/base/25780,/data/primary2/base/34782" ) self.primary3 = GpDB.initFromString( "5|3|p|p|s|u|sdw2|sdw2|40003|41003|/data/primary3||/data/primary3/base/10899,/data/primary3/base/1,/data/primary3/base/10898,/data/primary3/base/25780,/data/primary3/base/34782" ) self.mirror0 = GpDB.initFromString( "6|0|m|m|s|u|sdw2|sdw2|50000|51000|/data/mirror0||/data/mirror0/base/10899,/data/mirror0/base/1,/data/mirror0/base/10898,/data/mirror0/base/25780,/data/mirror0/base/34782" ) self.mirror1 = GpDB.initFromString( "7|1|m|m|s|u|sdw2|sdw2|50001|51001|/data/mirror1||/data/mirror1/base/10899,/data/mirror1/base/1,/data/mirror1/base/10898,/data/mirror1/base/25780,/data/mirror1/base/34782" ) self.mirror2 = GpDB.initFromString( "8|2|m|m|s|u|sdw1|sdw1|50002|51002|/data/mirror2||/data/mirror2/base/10899,/data/mirror2/base/1,/data/mirror2/base/10898,/data/mirror2/base/25780,/data/mirror2/base/34782" ) self.mirror3 = GpDB.initFromString( "9|3|m|m|s|u|sdw1|sdw1|50003|51003|/data/mirror3||/data/mirror3/base/10899,/data/mirror3/base/1,/data/mirror3/base/10898,/data/mirror3/base/25780,/data/mirror3/base/34782" ) return GpArray([ self.master, self.primary0, self.primary1, self.primary2, self.primary3, self.mirror0, self.mirror1, self.mirror2, self.mirror3 ])
def createGpArrayWith2Primary2Mirrors(self): master = GpDB.initFromString("1|-1|p|p|s|u|mdw|mdw|5432|None|/data/master||/data/master/base/10899,/data/master/base/1,/data/master/base/10898,/data/master/base/25780,/data/master/base/34782") primary0 = GpDB.initFromString("2|0|p|p|s|u|sdw1|sdw1|40000|41000|/data/primary0||/data/primary0/base/10899,/data/primary0/base/1,/data/primary0/base/10898,/data/primary0/base/25780,/data/primary0/base/34782") primary1 = GpDB.initFromString("3|1|p|p|s|u|sdw2|sdw2|40001|41001|/data/primary1||/data/primary1/base/10899,/data/primary1/base/1,/data/primary1/base/10898,/data/primary1/base/25780,/data/primary1/base/34782") mirror0 = GpDB.initFromString("4|0|m|m|s|u|sdw2|sdw2|50000|51000|/data/mirror0||/data/mirror0/base/10899,/data/mirror0/base/1,/data/mirror0/base/10898,/data/mirror0/base/25780,/data/mirror0/base/34782") mirror1 = GpDB.initFromString("5|1|m|m|s|u|sdw1|sdw1|50001|51001|/data/mirror1||/data/mirror1/base/10899,/data/mirror1/base/1,/data/mirror1/base/10898,/data/mirror1/base/25780,/data/mirror1/base/34782") return GpArray([master, primary0, primary1, mirror0, mirror1])
def test_datadir_interview(self): self.input_mock.side_effect = ["/tmp/datadirs/mirror1", "/tmp/datadirs/mirror2", "/tmp/datadirs/mirror3"] sys.argv = ['gpaddmirrors', '-p', '5000'] options, _ = self.parser.parse_args() self.config_provider_mock.loadSystemConfig.return_value = GpArray([self.master, self.primary0, self.primary1]) self.subject = GpAddMirrorsProgram(options) directories = self.subject._GpAddMirrorsProgram__getDataDirectoriesForMirrors(3, None) self.assertEqual(len(directories), 3)
def test_reload_config_use_local_context(self): self.mock_socket.return_value = 'mdw' sys.argv = ["gpstop", "-u"] parser = self.subject.GpStop.createParser() options, args = parser.parse_args() self.mock_gparray.return_value = GpArray( [self.master, self.primary0, self.primary1]) gpstop = self.subject.GpStop.createProgram(options, args) gpstop.gparray = GpArray([self.master, self.primary0, self.primary1]) gpstop._sighup_cluster() self.assertEquals(3, self.mock_workerpool.addCommand.call_count) self.assertEquals( None, self.mock_workerpool.addCommand.call_args_list[0][0][0].remoteHost) self.assertEquals( "sdw1", self.mock_workerpool.addCommand.call_args_list[1][0][0].remoteHost) self.assertEquals( "sdw1", self.mock_workerpool.addCommand.call_args_list[2][0][0].remoteHost)
def createGpArrayWith2Primary2Mirrors(self): master = GpDB.initFromString( "1|-1|p|p|s|u|mdw|mdw|5432|None|/data/master||/data/master/base/10899,/data/master/base/1,/data/master/base/10898,/data/master/base/25780,/data/master/base/34782") self.primary0 = GpDB.initFromString( "2|0|p|p|s|u|aspen|sdw1|40000|41000|/Users/pivotal/workspace/gpdb/gpAux/gpdemo/datadirs/qddir/demoDataDir-1||/data/primary0/base/10899,/data/primary0/base/1,/data/primary0/base/10898,/data/primary0/base/25780,/data/primary0/base/34782") primary1 = GpDB.initFromString( "3|1|p|p|s|u|sdw2|sdw2|40001|41001|/data/primary1||/data/primary1/base/10899,/data/primary1/base/1,/data/primary1/base/10898,/data/primary1/base/25780,/data/primary1/base/34782") mirror0 = GpDB.initFromString( "4|0|m|m|s|u|sdw2|sdw2|50000|51000|/data/mirror0||/data/mirror0/base/10899,/data/mirror0/base/1,/data/mirror0/base/10898,/data/mirror0/base/25780,/data/mirror0/base/34782") mirror1 = GpDB.initFromString( "5|1|m|m|s|u|sdw1|sdw1|50001|51001|/data/mirror1||/data/mirror1/base/10899,/data/mirror1/base/1,/data/mirror1/base/10898,/data/mirror1/base/25780,/data/mirror1/base/34782") return GpArray([master, self.primary0, primary1, mirror0, mirror1])
def createGpArrayWith2Primary2Mirrors(self): master = Segment.initFromString( "1|-1|p|p|s|u|mdw|mdw|5432|/data/master") primary0 = Segment.initFromString( "2|0|p|p|s|u|sdw1|sdw1|40000|/data/primary0") 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([master, primary0, primary1, mirror0, mirror1])
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|aspen|sdw1|40000|/Users/pivotal/workspace/gpdb/gpAux/gpdemo/datadirs/qddir/demoDataDir-1") self.primary1 = Segment.initFromString( "3|1|p|p|s|u|sdw2|sdw2|40001|/data/primary1") self.mirror0 = Segment.initFromString( "4|0|m|m|s|u|sdw2|sdw2|50000|/data/mirror0") self.mirror1 = Segment.initFromString( "5|1|m|m|s|u|sdw1|sdw1|50001|/data/mirror1") return GpArray([self.master, self.primary0, self.primary1, self.mirror0, self.mirror1])
def _create_gparray_with_2_primary_2_mirrors(): master = Segment.initFromString( "1|-1|p|p|s|u|mdw|mdw|5432|/data/master") primary0 = Segment.initFromString( "2|0|p|p|s|u|sdw1|sdw1|40000|/data/primary0") 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([master, primary0, primary1, mirror0, mirror1])
def test_generated_file_contains_default_port_offsets(self): datadir_config = _write_datadir_config(self.mdd) mirror_config_output_file = "/tmp/test_gpaddmirrors.config" sys.argv = ['gpaddmirrors', '-o', mirror_config_output_file, '-m', datadir_config] self.config_provider_mock.loadSystemConfig.return_value = GpArray([self.master, self.primary0, self.primary1]) options, _ = self.parser.parse_args() self.subject = GpAddMirrorsProgram(options) self.subject.run() with open(mirror_config_output_file, 'r') as fp: result = fp.readlines() self.assertIn("41000", result[0])
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") self.mirror0 = Segment.initFromString( "4|0|m|m|s|u|sdw2|sdw2|50000|/data/mirror0") self.mirror1 = Segment.initFromString( "5|1|m|m|s|u|sdw1|sdw1|50001|/data/mirror1") self.standby = Segment.initFromString( "6|-1|m|m|s|u|sdw3|sdw3|5433|/data/standby") return GpArray([self.master, self.primary0, self.primary1, self.mirror0, self.mirror1])
def createGpArrayWith2Primary2Mirrors(self): coordinator = Segment.initFromString( "1|-1|p|p|s|u|cdw|cdw|5432|/data/coordinator") self.primary0 = Segment.initFromString( "2|0|p|p|s|u|aspen|sdw1|40000|/Users/pivotal/workspace/gpdb/gpAux/gpdemo/datadirs/qddir/demoDataDir-1") 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") standby_coordinator = Segment.initFromString( "6|-1|m|m|s|u|cdw_standby|cdw_standby|25432|/data/standby_coordinator") return GpArray([coordinator, self.primary0, primary1, mirror0, mirror1, standby_coordinator])
def get_gp_array(gparray_str, unreachable_existing_hosts=None): with tempfile.NamedTemporaryFile() as f: f.write(gparray_str.encode('utf-8')) f.flush() gparray = GpArray.initFromFile(f.name) if not unreachable_existing_hosts: return gparray # the caller of the function under test sets to True the "unreachable" # member on any segment on an unreachable host; we emulate that here. for seg in gparray.getSegDbList(): if seg.getSegmentHostName() in unreachable_existing_hosts: seg.unreachable = True return gparray
def test_host_option_segment_in_resynchronizing_mode_fails(self): sys.argv = ["gpstop", "-a", "--host", "sdw1"] parser = self.subject.GpStop.createParser() options, args = parser.parse_args() self.primary0 = Segment.initFromString( "2|0|p|p|r|u|sdw1|sdw1|40000|/data/primary0") self.mirror0 = Segment.initFromString( "6|0|m|m|r|u|sdw2|sdw2|50000|/data/mirror0") self.mock_gparray.return_value = GpArray([self.master, self.primary0, self.primary1, self.primary2, self.primary3, self.mirror0, self.mirror1, self.mirror2, self.mirror3]) gpstop = self.subject.GpStop.createProgram(options, args) with self.assertRaisesRegexp(Exception,"Segment '%s' not synchronized. Aborting." % self.primary0): gpstop.run() self.assertEquals(0, self.mock_GpSegStopCmdInit.call_count)
def test_stop_standby_option(self, mock): self.standby = Segment.initFromString( "10|-1|m|m|s|u|smdw|smdw|5432|/data/standby_master") self.gparray = GpArray([ self.master, self.primary0, self.primary1, self.primary2, self.primary3, self.mirror0, self.mirror1, self.mirror2, self.mirror3, self.standby ]) self.mock_gparray.return_value = self.gparray sys.argv = ["gpstop", "-a", "-y"] parser = self.subject.GpStop.createParser() options, args = parser.parse_args() gpstop = self.subject.GpStop.createProgram(options, args) gpstop.run() assert not mock.called log_message = self.get_info_messages() self.assertTrue( "Stopping master standby host smdw mode=fast" not in log_message) self.assertTrue("No standby master host configured" not in log_message)
def _createGpArrayWith2Primary2Mirrors(self): self.master = GpDB.initFromString( "1|-1|p|p|s|u|mdw|mdw|5432|5532|/data/master||/data/master/base/10899,/data/master/base/1,/data/master/base/10898,/data/master/base/25780,/data/master/base/34782" ) self.primary0 = GpDB.initFromString( "2|0|p|p|s|u|sdw1|sdw1|40000|41000|/data/primary0||/data/primary0/base/10899,/data/primary0/base/1,/data/primary0/base/10898,/data/primary0/base/25780,/data/primary0/base/34782" ) self.primary1 = GpDB.initFromString( "3|1|p|p|s|u|sdw2|sdw2|40001|41001|/data/primary1||/data/primary1/base/10899,/data/primary1/base/1,/data/primary1/base/10898,/data/primary1/base/25780,/data/primary1/base/34782" ) self.mirror0 = GpDB.initFromString( "4|0|m|m|s|u|sdw2|sdw2|50000|51000|/data/mirror0||/data/mirror0/base/10899,/data/mirror0/base/1,/data/mirror0/base/10898,/data/mirror0/base/25780,/data/mirror0/base/34782" ) self.mirror1 = GpDB.initFromString( "5|1|m|m|s|u|sdw1|sdw1|50001|51001|/data/mirror1||/data/mirror1/base/10899,/data/mirror1/base/1,/data/mirror1/base/10898,/data/mirror1/base/25780,/data/mirror1/base/34782" ) self.standby = GpDB.initFromString( "6|-1|m|m|s|u|sdw3|sdw3|5433|5533|/data/standby||/data/standby/base/10899,/data/standby/base/1,/data/standby/base/10898,/data/standby/base/25780,/data/standby/base/34782" ) return GpArray([ self.master, self.primary0, self.primary1, self.mirror0, self.mirror1 ])
def setUp(self): # because gpstart does not have a .py extension, # we have to use imp to import it # if we had a gpstart.py, this is equivalent to: # import gpstart # self.subject = gpstart gpstart_file = os.path.abspath( os.path.dirname(__file__) + "/../../../gpstart") self.subject = imp.load_source('gpstart', gpstart_file) self.subject.logger = Mock(spec=[ 'log', 'warn', 'info', 'debug', 'error', 'warning', 'fatal', 'warning_to_file_only' ]) self.os_environ = dict(MASTER_DATA_DIRECTORY='/tmp/mdd', GPHOME='/tmp/gphome', GP_MGMT_PROCESS_COUNT=1, LANGUAGE=None) self.gparray = self._createGpArrayWith2Primary2Mirrors() self.segments_by_content_id = GpArray.getSegmentsByContentId( self.gparray.getSegDbList()) start_result = StartSegmentsResult() start_result.addSuccess(self.primary0) self.apply_patches([ patch('os.getenv', side_effect=self._get_env), patch('gpstart.os.path.exists'), patch('gpstart.gp'), patch('gpstart.pgconf'), patch('gpstart.unix'), patch('gpstart.dbconn.DbURL'), patch('gpstart.dbconn.connect'), patch('gpstart.GpArray.initFromCatalog', return_value=self.gparray), patch('gpstart.GpArray.getSegmentsByContentId', return_value=self.segments_by_content_id), patch('gpstart.GpArray.getSegmentsGroupedByValue', side_effect=[{ 2: self.primary0, 3: self.primary1 }, [], []]), patch('gpstart.catalog.getCollationSettings', return_value=("x", "x", "x")), patch('gpstart.GpDbidFile'), patch('gpstart.GpEraFile'), patch('gpstart.userinput'), patch('gpstart.HeapChecksum'), patch('gpstart.log_to_file_only'), patch("gpstart.is_filespace_configured", return_value=True), patch("gpstart.CheckFilespaceConsistency"), patch("gpstart.StartSegmentsOperation"), patch("gpstart.base.WorkerPool"), patch("gpstart.gp.MasterStart.local"), patch("gpstart.pg.DbStatus.local"), patch("gpstart.TableLogger"), ]) self.mockFilespaceConsistency = self.get_mock_from_apply_patch( "CheckFilespaceConsistency") self.mockFilespaceConsistency.return_value.run.return_value = True self.mock_start_result = self.get_mock_from_apply_patch( 'StartSegmentsOperation') self.mock_start_result.return_value.startSegments.return_value.getSuccessfulSegments.return_value = start_result.getSuccessfulSegments( ) self.mock_os_path_exists = self.get_mock_from_apply_patch('exists') self.mock_gp = self.get_mock_from_apply_patch('gp') self.mock_pgconf = self.get_mock_from_apply_patch('pgconf') self.mock_userinput = self.get_mock_from_apply_patch('userinput') self.mock_heap_checksum = self.get_mock_from_apply_patch( 'HeapChecksum') self.mock_heap_checksum.return_value.get_segments_checksum_settings.return_value = ( [1], [1]) self.mock_heap_checksum.return_value.are_segments_consistent.return_value = True self.mock_heap_checksum.return_value.check_segment_consistency.return_value = ( [], [], None) self.mock_pgconf.readfile.return_value = Mock() self.mock_gplog_log_to_file_only = self.get_mock_from_apply_patch( "log_to_file_only") self.mock_gp.get_masterdatadir.return_value = 'masterdatadir' self.mock_gp.GpCatVersion.local.return_value = 1 self.mock_gp.GpCatVersionDirectory.local.return_value = 1 sys.argv = ["gpstart"] # reset to relatively empty args list
class GpStart(GpTestCase): def setUp(self): # because gpstart does not have a .py extension, # we have to use imp to import it # if we had a gpstart.py, this is equivalent to: # import gpstart # self.subject = gpstart gpstart_file = os.path.abspath(os.path.dirname(__file__) + "/../../../gpstart") self.subject = imp.load_source('gpstart', gpstart_file) self.subject.logger = Mock( spec=['log', 'warn', 'info', 'debug', 'error', 'warning', 'fatal', 'warning_to_file_only']) self.os_environ = dict(MASTER_DATA_DIRECTORY='/tmp/mdd', GPHOME='/tmp/gphome', GP_MGMT_PROCESS_COUNT=1, LANGUAGE=None) self.gparray = self._createGpArrayWith2Primary2Mirrors() self.segments_by_content_id = GpArray.getSegmentsByContentId(self.gparray.getSegDbList()) start_result = StartSegmentsResult() start_result.addSuccess(self.primary0) self.apply_patches([ patch('os.getenv', side_effect=self._get_env), patch('gpstart.os.path.exists'), patch('gpstart.gp'), patch('gpstart.pgconf'), patch('gpstart.unix'), patch('gpstart.dbconn.DbURL'), patch('gpstart.dbconn.connect'), patch('gpstart.GpArray.initFromCatalog', return_value=self.gparray), patch('gpstart.GpArray.getSegmentsByContentId', return_value=self.segments_by_content_id), patch('gpstart.GpArray.getSegmentsGroupedByValue', side_effect=[{2: self.primary0, 3: self.primary1}, [], []]), patch('gpstart.GpDbidFile'), patch('gpstart.GpEraFile'), patch('gpstart.userinput'), patch('gpstart.HeapChecksum'), patch('gpstart.log_to_file_only'), patch("gpstart.StartSegmentsOperation"), patch("gpstart.base.WorkerPool"), patch("gpstart.gp.MasterStart.local"), patch("gpstart.pg.DbStatus.local"), patch("gpstart.TableLogger"), patch('gpstart.PgControlData'), ]) self.mock_start_result = self.get_mock_from_apply_patch('StartSegmentsOperation') self.mock_start_result.return_value.startSegments.return_value.getSuccessfulSegments.return_value = start_result.getSuccessfulSegments() self.mock_os_path_exists = self.get_mock_from_apply_patch('exists') self.mock_gp = self.get_mock_from_apply_patch('gp') self.mock_pgconf = self.get_mock_from_apply_patch('pgconf') self.mock_userinput = self.get_mock_from_apply_patch('userinput') self.mock_heap_checksum = self.get_mock_from_apply_patch('HeapChecksum') self.mock_heap_checksum.return_value.get_segments_checksum_settings.return_value = ([1], [1]) self.mock_heap_checksum.return_value.are_segments_consistent.return_value = True self.mock_heap_checksum.return_value.check_segment_consistency.return_value = ([], [], None) self.mock_pgconf.readfile.return_value = Mock() self.mock_gplog_log_to_file_only = self.get_mock_from_apply_patch("log_to_file_only") self.mock_gp.get_masterdatadir.return_value = 'masterdatadir' self.mock_gp.GpCatVersion.local.return_value = 1 self.mock_gp.GpCatVersionDirectory.local.return_value = 1 sys.argv = ["gpstart"] # reset to relatively empty args list def tearDown(self): super(GpStart, self).tearDown() def test_option_master_success_without_auto_accept(self): sys.argv = ["gpstart", "-m"] self.mock_userinput.ask_yesno.return_value = True self.subject.unix.PgPortIsActive.local.return_value = False self.mock_os_path_exists.side_effect = os_exists_check parser = self.subject.GpStart.createParser() options, args = parser.parse_args() gpstart = self.subject.GpStart.createProgram(options, args) return_code = gpstart.run() self.assertEqual(self.mock_userinput.ask_yesno.call_count, 1) self.mock_userinput.ask_yesno.assert_called_once_with(None, '\nContinue with master-only startup', 'N') self.subject.logger.info.assert_any_call('Starting Master instance in admin mode') self.subject.logger.info.assert_any_call('Master Started...') self.assertEqual(return_code, 0) def test_option_master_success_with_auto_accept(self): sys.argv = ["gpstart", "-m", "-a"] self.mock_userinput.ask_yesno.return_value = True self.subject.unix.PgPortIsActive.local.return_value = False self.mock_os_path_exists.side_effect = os_exists_check parser = self.subject.GpStart.createParser() options, args = parser.parse_args() gpstart = self.subject.GpStart.createProgram(options, args) return_code = gpstart.run() self.assertEqual(self.mock_userinput.ask_yesno.call_count, 0) self.subject.logger.info.assert_any_call('Starting Master instance in admin mode') self.subject.logger.info.assert_any_call('Master Started...') self.assertEqual(return_code, 0) def test_output_to_stdout_and_log_for_master_only_happens_before_heap_checksum(self): sys.argv = ["gpstart", "-m"] self.mock_userinput.ask_yesno.return_value = True self.subject.unix.PgPortIsActive.local.return_value = False self.mock_os_path_exists.side_effect = os_exists_check parser = self.subject.GpStart.createParser() options, args = parser.parse_args() gpstart = self.subject.GpStart.createProgram(options, args) return_code = gpstart.run() self.assertEqual(return_code, 0) self.assertEqual(self.mock_userinput.ask_yesno.call_count, 1) self.mock_userinput.ask_yesno.assert_called_once_with(None, '\nContinue with master-only startup', 'N') self.subject.logger.info.assert_any_call('Starting Master instance in admin mode') self.subject.logger.info.assert_any_call('Master Started...') self.assertEquals(self.mock_gplog_log_to_file_only.call_count, 0) def test_output_to_stdout_and_log_differs_for_heap_checksum(self): sys.argv = ["gpstart", "-a"] self.mock_heap_checksum.return_value.are_segments_consistent.return_value = False self.subject.unix.PgPortIsActive.local.return_value = False self.mock_os_path_exists.side_effect = os_exists_check self.primary1.heap_checksum = 0 self.master.heap_checksum = '1' self.mock_heap_checksum.return_value.check_segment_consistency.return_value = ( [self.primary0], [self.primary1], self.master.heap_checksum) parser = self.subject.GpStart.createParser() options, args = parser.parse_args() gpstart = self.subject.GpStart.createProgram(options, args) return_code = gpstart.run() self.assertEqual(return_code, 1) self.subject.logger.fatal.assert_any_call('Cluster heap checksum setting differences reported.') self.mock_gplog_log_to_file_only.assert_any_call('Failed checksum consistency validation:', logging.WARN) self.mock_gplog_log_to_file_only.assert_any_call('dbid: %s ' 'checksum set to %s differs from ' 'master checksum set to %s' % (self.primary1.getSegmentDbId(), 0, 1), logging.WARN) self.subject.logger.fatal.assert_any_call("Shutting down master") self.assertEquals(self.mock_gp.GpStop.call_count, 1) def test_failed_to_contact_segments_causes_logging_and_failure(self): sys.argv = ["gpstart", "-a"] self.mock_heap_checksum.return_value.get_segments_checksum_settings.return_value = ([], [1]) self.subject.unix.PgPortIsActive.local.return_value = False self.mock_os_path_exists.side_effect = os_exists_check parser = self.subject.GpStart.createParser() options, args = parser.parse_args() gpstart = self.subject.GpStart.createProgram(options, args) return_code = gpstart.run() self.assertEqual(return_code, 1) self.subject.logger.fatal.assert_any_call( 'No segments responded to ssh query for heap checksum. Not starting the array.') def test_checksum_consistent(self): sys.argv = ["gpstart", "-a"] self.mock_heap_checksum.return_value.get_segments_checksum_settings.return_value = ([1], [1]) self.subject.unix.PgPortIsActive.local.return_value = False self.mock_os_path_exists.side_effect = os_exists_check parser = self.subject.GpStart.createParser() options, args = parser.parse_args() gpstart = self.subject.GpStart.createProgram(options, args) return_code = gpstart.run() self.assertEqual(return_code, 0) self.subject.logger.info.assert_any_call('Heap checksum setting is consistent across the cluster') def test_skip_checksum_validation_succeeds(self): sys.argv = ["gpstart", "-a", "--skip-heap-checksum-validation"] self.mock_heap_checksum.return_value.get_segments_checksum_settings.return_value = ([1], [1]) self.subject.unix.PgPortIsActive.local.return_value = False self.mock_os_path_exists.side_effect = os_exists_check parser = self.subject.GpStart.createParser() options, args = parser.parse_args() gpstart = self.subject.GpStart.createProgram(options, args) return_code = gpstart.run() self.assertEqual(return_code, 0) messages = [msg[0][0] for msg in self.subject.logger.info.call_args_list] self.assertNotIn('Heap checksum setting is consistent across the cluster', messages) self.subject.logger.warning.assert_any_call('Because of --skip-heap-checksum-validation, ' 'the GUC for data_checksums ' 'will not be checked between master and segments') def test_gpstart_fails_if_standby_heap_checksum_doesnt_match_master(self): sys.argv = ["gpstart", "-a"] self.gparray = GpArray([self.master, self.primary0, self.primary1, self.mirror0, self.mirror1, self.standby]) self.segments_by_content_id = GpArray.getSegmentsByContentId(self.gparray.getSegDbList()) self.mock_os_path_exists.side_effect = os_exists_check self.subject.unix.PgPortIsActive.local.return_value = False self.mock_heap_checksum.return_value.get_master_value.return_value = 1 self.mock_heap_checksum.return_value.get_standby_value.return_value = 0 parser = self.subject.GpStart.createParser() options, args = parser.parse_args() gpstart = self.subject.GpStart.createProgram(options, args) with patch("gpstart.GpArray.initFromCatalog", return_value=self.gparray): return_code = gpstart.run() self.assertEqual(return_code, 1) self.subject.logger.warning.assert_any_call("Heap checksum settings on standby master do not match master <<<<<<<<") self.subject.logger.error.assert_any_call("gpstart error: Heap checksum settings are not consistent across the cluster.") 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") self.mirror0 = Segment.initFromString( "4|0|m|m|s|u|sdw2|sdw2|50000|/data/mirror0") self.mirror1 = Segment.initFromString( "5|1|m|m|s|u|sdw1|sdw1|50001|/data/mirror1") self.standby = Segment.initFromString( "6|-1|m|m|s|u|sdw3|sdw3|5433|/data/standby") return GpArray([self.master, self.primary0, self.primary1, self.mirror0, self.mirror1]) def _get_env(self, arg): if arg not in self.os_environ: return None return self.os_environ[arg]
def setUp(self): # because gpstart does not have a .py extension, # we have to use imp to import it # if we had a gpstart.py, this is equivalent to: # import gpstart # self.subject = gpstart gpstart_file = os.path.abspath(os.path.dirname(__file__) + "/../../../gpstart") self.subject = imp.load_source('gpstart', gpstart_file) self.subject.logger = Mock( spec=['log', 'warn', 'info', 'debug', 'error', 'warning', 'fatal', 'warning_to_file_only']) self.os_environ = dict(MASTER_DATA_DIRECTORY='/tmp/mdd', GPHOME='/tmp/gphome', GP_MGMT_PROCESS_COUNT=1, LANGUAGE=None) self.gparray = self._createGpArrayWith2Primary2Mirrors() self.segments_by_content_id = GpArray.getSegmentsByContentId(self.gparray.getSegDbList()) start_result = StartSegmentsResult() start_result.addSuccess(self.primary0) self.apply_patches([ patch('os.getenv', side_effect=self._get_env), patch('gpstart.os.path.exists'), patch('gpstart.gp'), patch('gpstart.pgconf'), patch('gpstart.unix'), patch('gpstart.dbconn.DbURL'), patch('gpstart.dbconn.connect'), patch('gpstart.GpArray.initFromCatalog', return_value=self.gparray), patch('gpstart.GpArray.getSegmentsByContentId', return_value=self.segments_by_content_id), patch('gpstart.GpArray.getSegmentsGroupedByValue', side_effect=[{2: self.primary0, 3: self.primary1}, [], []]), patch('gpstart.catalog.getCollationSettings', return_value=("x", "x", "x")), patch('gpstart.GpDbidFile'), patch('gpstart.GpEraFile'), patch('gpstart.userinput'), patch('gpstart.HeapChecksum'), patch('gpstart.log_to_file_only'), patch("gpstart.is_filespace_configured", return_value=True), patch("gpstart.CheckFilespaceConsistency"), patch("gpstart.StartSegmentsOperation"), patch("gpstart.base.WorkerPool"), patch("gpstart.gp.MasterStart.local"), patch("gpstart.pg.DbStatus.local"), patch("gpstart.TableLogger"), patch('gpstart.PgControlData'), ]) self.mockFilespaceConsistency = self.get_mock_from_apply_patch("CheckFilespaceConsistency") self.mockFilespaceConsistency.return_value.run.return_value = True self.mock_start_result = self.get_mock_from_apply_patch('StartSegmentsOperation') self.mock_start_result.return_value.startSegments.return_value.getSuccessfulSegments.return_value = start_result.getSuccessfulSegments() self.mock_os_path_exists = self.get_mock_from_apply_patch('exists') self.mock_gp = self.get_mock_from_apply_patch('gp') self.mock_pgconf = self.get_mock_from_apply_patch('pgconf') self.mock_userinput = self.get_mock_from_apply_patch('userinput') self.mock_heap_checksum = self.get_mock_from_apply_patch('HeapChecksum') self.mock_heap_checksum.return_value.get_segments_checksum_settings.return_value = ([1], [1]) self.mock_heap_checksum.return_value.are_segments_consistent.return_value = True self.mock_heap_checksum.return_value.check_segment_consistency.return_value = ([], [], None) self.mock_pgconf.readfile.return_value = Mock() self.mock_gplog_log_to_file_only = self.get_mock_from_apply_patch("log_to_file_only") self.mock_gp.get_masterdatadir.return_value = 'masterdatadir' self.mock_gp.GpCatVersion.local.return_value = 1 self.mock_gp.GpCatVersionDirectory.local.return_value = 1 sys.argv = ["gpstart"] # reset to relatively empty args list