def setUp(self): super(MySqlAppTest, self).setUp() self.orig_utils_execute_with_timeout = dbaas.utils.execute_with_timeout self.orig_time_sleep = time.sleep util.init_db() self.FAKE_ID = randint(1, 10000) InstanceServiceStatus.create(instance_id=self.FAKE_ID, status=ServiceStatuses.NEW) self.appStatus = FakeAppStatus(self.FAKE_ID, ServiceStatuses.NEW) self.mySqlApp = MySqlApp(self.appStatus) time.sleep = Mock()
def test_secure_keep_root(self): mock_conn = mock_sql_connection() when(mock_conn).execute(any()).thenReturn(None) when(utils).execute_with_timeout("sudo", any(str), "stop").thenReturn( None) when(pkg).pkg_install("dbaas-mycnf", any()).thenReturn(None) # skip writing the file for now when(os.path).isfile(any()).thenReturn(False) when(utils).execute_with_timeout( "sudo", "chmod", any(), any()).thenReturn(None) MySqlAppMockTest.stub_file("/etc/mysql/my.cnf") MySqlAppMockTest.stub_file("/etc/dbaas/my.cnf/my.cnf.2048M") MySqlAppMockTest.stub_file("/tmp/my.cnf.tmp") mock_status = mock(MySqlAppStatus) when(mock_status).wait_for_real_status_to_change_to( any(), any(), any()).thenReturn(True) app = MySqlApp(mock_status) app.secure(2048) verify(mock_conn, never).execute(TextClauseMatcher('root'))
def test_secure_keep_root(self): mock_conn = mock_sql_connection() when(mock_conn).execute(any()).thenReturn(None) when(utils).execute_with_timeout("sudo", any(str), "stop").thenReturn(None) when(pkg).pkg_install("dbaas-mycnf", any()).thenReturn(None) # skip writing the file for now when(os.path).isfile(any()).thenReturn(False) when(utils).execute_with_timeout("sudo", "chmod", any(), any()).thenReturn(None) MySqlAppMockTest.stub_file("/etc/mysql/my.cnf") MySqlAppMockTest.stub_file("/etc/dbaas/my.cnf/my.cnf.2048M") MySqlAppMockTest.stub_file("/tmp/my.cnf.tmp") mock_status = mock(MySqlAppStatus) when(mock_status).wait_for_real_status_to_change_to( any(), any(), any()).thenReturn(True) app = MySqlApp(mock_status) app.secure(2048) verify(mock_conn, never).execute(TextClauseMatcher('root'))
def test_secure_with_mycnf_error(self): mock_conn = mock_sql_connection() when(mock_conn).execute(any()).thenReturn(None) when(utils).execute_with_timeout("sudo", any(str), "stop").thenReturn(None) when(pkg).pkg_install("dbaas-mycnf", any()).thenRaise( pkg.PkgPackageStateError("Install error")) # skip writing the file for now when(os.path).isfile(any()).thenReturn(False) mock_status = mock(MySqlAppStatus) when(mock_status).wait_for_real_status_to_change_to( any(), any(), any()).thenReturn(True) app = MySqlApp(mock_status) self.assertRaises(pkg.PkgPackageStateError, app.secure, 2048) verify(mock_conn, atleast=2).execute(any()) inorder.verify(mock_status).wait_for_real_status_to_change_to( ServiceStatuses.SHUTDOWN, any(), any()) verifyNoMoreInteractions(mock_status)
def prepare(self, context, databases, memory_mb, users, device_path=None, mount_point=None, backup_id=None): """Makes ready DBAAS on a Guest container.""" MySqlAppStatus.get().begin_mysql_install() # status end_mysql_install set with secure() app = MySqlApp(MySqlAppStatus.get()) restart_mysql = False if device_path: device = volume.VolumeDevice(device_path) device.format() #if a /var/lib/mysql folder exists, back it up. if os.path.exists(CONF.mount_point): #stop and do not update database app.stop_db() #rsync exiting data if not backup_id: restart_mysql = True device.migrate_data(CONF.mount_point) #mount the volume device.mount(mount_point) LOG.debug(_("Mounted the volume.")) #check mysql was installed and stopped if restart_mysql: app.start_mysql() app.install_if_needed() if backup_id: self._perform_restore(backup_id, context, CONF.mount_point, app) LOG.info(_("Securing mysql now.")) app.secure(memory_mb) if backup_id and MySqlAdmin().is_root_enabled(): MySqlAdmin().report_root_enabled(context) else: app.secure_root() app.complete_install_or_restart() if databases: self.create_database(context, databases) if users: self.create_user(context, users) LOG.info('"prepare" call has finished.')
def stop_db(self, context, do_not_start_on_reboot=False): app = MySqlApp(MySqlAppStatus.get()) app.stop_db(do_not_start_on_reboot=do_not_start_on_reboot)
def start_db_with_conf_changes(self, context, updated_memory_size): app = MySqlApp(MySqlAppStatus.get()) app.start_db_with_conf_changes(updated_memory_size)
def restart(self, context): app = MySqlApp(MySqlAppStatus.get()) app.restart()
class MySqlAppTest(testtools.TestCase): def setUp(self): super(MySqlAppTest, self).setUp() self.orig_utils_execute_with_timeout = dbaas.utils.execute_with_timeout self.orig_time_sleep = time.sleep util.init_db() self.FAKE_ID = randint(1, 10000) InstanceServiceStatus.create(instance_id=self.FAKE_ID, status=ServiceStatuses.NEW) self.appStatus = FakeAppStatus(self.FAKE_ID, ServiceStatuses.NEW) self.mySqlApp = MySqlApp(self.appStatus) time.sleep = Mock() def tearDown(self): super(MySqlAppTest, self).tearDown() dbaas.utils.execute_with_timeout = self.orig_utils_execute_with_timeout time.sleep = self.orig_time_sleep InstanceServiceStatus.find_by(instance_id=self.FAKE_ID).delete() def assert_reported_status(self, expected_status): service_status = InstanceServiceStatus.find_by( instance_id=self.FAKE_ID) self.assertEqual(expected_status, service_status.status) def mysql_starts_successfully(self): def start(update_db=False): self.appStatus.set_next_status(ServiceStatuses.RUNNING) self.mySqlApp.start_mysql.side_effect = start def mysql_starts_unsuccessfully(self): def start(): raise RuntimeError("MySQL failed to start!") self.mySqlApp.start_mysql.side_effect = start def mysql_stops_successfully(self): def stop(): self.appStatus.set_next_status(ServiceStatuses.SHUTDOWN) self.mySqlApp.stop_db.side_effect = stop def mysql_stops_unsuccessfully(self): def stop(): raise RuntimeError("MySQL failed to stop!") self.mySqlApp.stop_db.side_effect = stop def test_stop_mysql(self): dbaas.utils.execute_with_timeout = Mock() self.appStatus.set_next_status(ServiceStatuses.SHUTDOWN) self.mySqlApp.stop_db() self.assert_reported_status(ServiceStatuses.NEW) def test_stop_mysql_with_db_update(self): dbaas.utils.execute_with_timeout = Mock() self.appStatus.set_next_status(ServiceStatuses.SHUTDOWN) self.mySqlApp.stop_db(True) self.assert_reported_status(ServiceStatuses.SHUTDOWN) def test_stop_mysql_error(self): dbaas.utils.execute_with_timeout = Mock() self.appStatus.set_next_status(ServiceStatuses.RUNNING) self.mySqlApp.state_change_wait_time = 1 self.assertRaises(RuntimeError, self.mySqlApp.stop_db) def test_restart_is_successful(self): self.mySqlApp.start_mysql = Mock() self.mySqlApp.stop_db = Mock() self.mysql_stops_successfully() self.mysql_starts_successfully() self.mySqlApp.restart() self.assertTrue(self.mySqlApp.stop_db.called) self.assertTrue(self.mySqlApp.start_mysql.called) self.assert_reported_status(ServiceStatuses.RUNNING) def test_restart_mysql_wont_start_up(self): self.mySqlApp.start_mysql = Mock() self.mySqlApp.stop_db = Mock() self.mysql_stops_unsuccessfully() self.mysql_starts_unsuccessfully() self.assertRaises(RuntimeError, self.mySqlApp.restart) self.assertTrue(self.mySqlApp.stop_db.called) self.assertFalse(self.mySqlApp.start_mysql.called) self.assert_reported_status(ServiceStatuses.NEW) def test_wipe_ib_logfiles_no_file(self): from reddwarf.common.exception import ProcessExecutionError processexecerror = ProcessExecutionError('No such file or directory') dbaas.utils.execute_with_timeout = Mock(side_effect=processexecerror) self.mySqlApp.wipe_ib_logfiles() def test_wipe_ib_logfiles_error(self): from reddwarf.common.exception import ProcessExecutionError mocked = Mock(side_effect=ProcessExecutionError('Error')) dbaas.utils.execute_with_timeout = mocked self.assertRaises(ProcessExecutionError, self.mySqlApp.wipe_ib_logfiles) def test_start_mysql(self): dbaas.utils.execute_with_timeout = Mock() self.appStatus.set_next_status(ServiceStatuses.RUNNING) self.mySqlApp.start_mysql() self.assert_reported_status(ServiceStatuses.NEW) def test_start_mysql_with_db_update(self): dbaas.utils.execute_with_timeout = Mock() self.appStatus.set_next_status(ServiceStatuses.RUNNING) self.mySqlApp.start_mysql(True) self.assert_reported_status(ServiceStatuses.RUNNING) def test_start_mysql_runs_forever(self): dbaas.utils.execute_with_timeout = Mock() self.mySqlApp.state_change_wait_time = 1 self.appStatus.set_next_status(ServiceStatuses.SHUTDOWN) self.assertRaises(RuntimeError, self.mySqlApp.start_mysql) self.assert_reported_status(ServiceStatuses.SHUTDOWN) def test_start_mysql_error(self): self.mySqlApp._enable_mysql_on_boot = Mock() from reddwarf.common.exception import ProcessExecutionError mocked = Mock(side_effect=ProcessExecutionError('Error')) dbaas.utils.execute_with_timeout = mocked self.assertRaises(RuntimeError, self.mySqlApp.start_mysql) def test_start_db_with_conf_changes(self): self.mySqlApp.start_mysql = Mock() self.mySqlApp._write_mycnf = Mock() self.mysql_starts_successfully() self.appStatus.status = ServiceStatuses.SHUTDOWN self.mySqlApp.start_db_with_conf_changes(Mock()) self.assertTrue(self.mySqlApp._write_mycnf.called) self.assertTrue(self.mySqlApp.start_mysql.called) self.assertEqual(self.appStatus._get_actual_db_status(), ServiceStatuses.RUNNING) def test_start_db_with_conf_changes_mysql_is_running(self): self.mySqlApp.start_mysql = Mock() self.mySqlApp._write_mycnf = Mock() self.appStatus.status = ServiceStatuses.RUNNING self.assertRaises(RuntimeError, self.mySqlApp.start_db_with_conf_changes, Mock())
def prepare(self, context, databases, memory_mb, users, device_path=None, mount_point=None, backup_id=None): """Makes ready DBAAS on a Guest container.""" MySqlAppStatus.get().begin_mysql_install() # status end_mysql_install set with secure() app = MySqlApp(MySqlAppStatus.get()) restart_mysql = False if device_path: device = volume.VolumeDevice(device_path) device.format() #if a /var/lib/mysql folder exists, back it up. if os.path.exists(CONF.mount_point): #stop and do not update database app.stop_db() #rsync exiting data if not backup_id: restart_mysql = True device.migrate_data(CONF.mount_point) #mount the volume device.mount(mount_point) LOG.debug(_("Mounted the volume.")) #check mysql was installed and stopped if restart_mysql: app.start_mysql() app.install_if_needed() if backup_id: self._perform_restore(backup_id, context, CONF.mount_point) LOG.info(_("Securing mysql now.")) app.secure(memory_mb) if backup_id and MySqlAdmin().is_root_enabled(): MySqlAdmin().report_root_enabled(context) else: app.secure_root() app.complete_install_or_restart() if databases: self.create_database(context, databases) if users: self.create_user(context, users) LOG.info('"prepare" call has finished.')