def _GetSafeServerInstance(self): '''Returns a ServerInstance with a host file system at a safe revision, meaning the last revision that the current running version of the server existed. ''' delegate = self._delegate server_instance_at_head = self._CreateServerInstance(None) app_yaml_handler = AppYamlHelper( svn_constants.APP_YAML_PATH, server_instance_at_head.host_file_system, server_instance_at_head.object_store_creator, server_instance_at_head.host_file_system_creator) if app_yaml_handler.IsUpToDate(delegate.GetAppVersion()): # TODO(kalman): return a new ServerInstance at an explicit revision in # case the HEAD version changes underneath us. return server_instance_at_head # The version in app.yaml is greater than the currently running app's. # The safe version is the one before it changed. safe_revision = app_yaml_handler.GetFirstRevisionGreaterThan( delegate.GetAppVersion()) - 1 logging.info('cron: app version %s is out of date, safe is %s' % (delegate.GetAppVersion(), safe_revision)) return self._CreateServerInstance(safe_revision)
def _GetSafeServerInstance(self): '''Returns a ServerInstance with a host file system at a safe revision, meaning the last revision that the current running version of the server existed. ''' delegate = self._delegate # IMPORTANT: Get a ServerInstance pinned to the most recent revision, not # HEAD. These cron jobs take a while and run very frequently such that # there is usually one running at any given time, and eventually a file # that we're dealing with will change underneath it, putting the server in # an undefined state. server_instance_near_head = self._CreateServerInstance( self._GetMostRecentRevision()) app_yaml_handler = AppYamlHelper( server_instance_near_head.object_store_creator, server_instance_near_head.host_file_system_provider) if app_yaml_handler.IsUpToDate(delegate.GetAppVersion()): return server_instance_near_head # The version in app.yaml is greater than the currently running app's. # The safe version is the one before it changed. safe_revision = app_yaml_handler.GetFirstRevisionGreaterThan( delegate.GetAppVersion()) - 1 _cronlog.info('app version %s is out of date, safe is %s', delegate.GetAppVersion(), safe_revision) return self._CreateServerInstance(safe_revision)
def _GetSafeServerInstance(self): '''Returns a ServerInstance with a host file system at a safe revision, meaning the last revision that the current running version of the server existed. ''' channel = self._channel delegate = self._delegate server_instance_at_head = self._CreateServerInstance(channel, None) get_branch_for_channel = self._GetBranchForChannel class AppYamlHelperDelegate(AppYamlHelper.Delegate): def GetHostFileSystemForRevision(self, revision): return delegate.CreateHostFileSystemForBranchAndRevision( get_branch_for_channel(channel), revision) app_yaml_handler = AppYamlHelper( svn_constants.APP_YAML_PATH, server_instance_at_head.host_file_system, AppYamlHelperDelegate(), server_instance_at_head.object_store_creator) if app_yaml_handler.IsUpToDate(delegate.GetAppVersion()): # TODO(kalman): return a new ServerInstance at an explicit revision in # case the HEAD version changes underneath us. return server_instance_at_head # The version in app.yaml is greater than the currently running app's. # The safe version is the one before it changed. safe_revision = app_yaml_handler.GetFirstRevisionGreaterThan( delegate.GetAppVersion()) - 1 logging.info('cron/%s: app version %s is out of date, safe is %s' % ( channel, delegate.GetAppVersion(), safe_revision)) return self._CreateServerInstance(channel, safe_revision)
def testInstanceMethods(self): test_data = { 'server2': { 'app.yaml': _GenerateAppYaml('1-0'), 'app_yaml_helper.py': 'Copyright notice etc' } } updates = [] # Pass a specific file system at head to the HostFileSystemProvider so that # we know it's always going to be backed by a MockFileSystem. The Provider # may decide to wrap it in caching etc. file_system_at_head = MockFileSystem(TestFileSystem(test_data)) def apply_update(update): file_system_at_head.Update(update) updates.append(update) def host_file_system_constructor(branch, revision=None): self.assertEqual('trunk', branch) self.assertTrue(revision is not None) return MockFileSystem.Create(TestFileSystem(test_data), updates[:revision]) object_store_creator = ObjectStoreCreator.ForTest() host_file_system_provider = HostFileSystemProvider( object_store_creator, default_trunk_instance=file_system_at_head, constructor_for_test=host_file_system_constructor) helper = AppYamlHelper('server2/app.yaml', object_store_creator, host_file_system_provider) def assert_is_up_to_date(version): self.assertTrue(helper.IsUpToDate(version), '%s is not up to date' % version) self.assertRaises(ValueError, helper.GetFirstRevisionGreaterThan, version) self.assertEqual(0, helper.GetFirstRevisionGreaterThan('0-5-0')) assert_is_up_to_date('1-0-0') assert_is_up_to_date('1-5-0') # Revision 1. apply_update({'server2': {'app.yaml': _GenerateAppYaml('1-5-0')}}) self.assertEqual(0, helper.GetFirstRevisionGreaterThan('0-5-0')) self.assertEqual(1, helper.GetFirstRevisionGreaterThan('1-0-0')) assert_is_up_to_date('1-5-0') assert_is_up_to_date('2-5-0') # Revision 2. apply_update({'server2': {'app_yaml_helper.py': 'fixed a bug'}}) self.assertEqual(0, helper.GetFirstRevisionGreaterThan('0-5-0')) self.assertEqual(1, helper.GetFirstRevisionGreaterThan('1-0-0')) assert_is_up_to_date('1-5-0') assert_is_up_to_date('2-5-0') # Revision 3. apply_update({'server2': {'app.yaml': _GenerateAppYaml('1-6-0')}}) self.assertEqual(0, helper.GetFirstRevisionGreaterThan('0-5-0')) self.assertEqual(1, helper.GetFirstRevisionGreaterThan('1-0-0')) self.assertEqual(3, helper.GetFirstRevisionGreaterThan('1-5-0')) assert_is_up_to_date('2-5-0') # Revision 4. apply_update({'server2': {'app.yaml': _GenerateAppYaml('1-8-0')}}) # Revision 5. apply_update({'server2': {'app.yaml': _GenerateAppYaml('2-0-0')}}) # Revision 6. apply_update({'server2': {'app.yaml': _GenerateAppYaml('2-2-0')}}) # Revision 7. apply_update({'server2': {'app.yaml': _GenerateAppYaml('2-4-0')}}) # Revision 8. apply_update({'server2': {'app.yaml': _GenerateAppYaml('2-6-0')}}) self.assertEqual(0, helper.GetFirstRevisionGreaterThan('0-5-0')) self.assertEqual(1, helper.GetFirstRevisionGreaterThan('1-0-0')) self.assertEqual(3, helper.GetFirstRevisionGreaterThan('1-5-0')) self.assertEqual(5, helper.GetFirstRevisionGreaterThan('1-8-0')) self.assertEqual(6, helper.GetFirstRevisionGreaterThan('2-0-0')) self.assertEqual(6, helper.GetFirstRevisionGreaterThan('2-1-0')) self.assertEqual(7, helper.GetFirstRevisionGreaterThan('2-2-0')) self.assertEqual(7, helper.GetFirstRevisionGreaterThan('2-3-0')) self.assertEqual(8, helper.GetFirstRevisionGreaterThan('2-4-0')) self.assertEqual(8, helper.GetFirstRevisionGreaterThan('2-5-0')) assert_is_up_to_date('2-6-0') assert_is_up_to_date('2-7-0')
def testInstanceMethods(self): test_data = { 'server2': { 'app.yaml': _GenerateAppYaml('1-0'), 'app_yaml_helper.py': 'Copyright notice etc' } } updates = [] file_system_at_head = MockFileSystem(TestFileSystem(test_data)) def apply_update(update): file_system_at_head.Update(update) updates.append(update) def constructor(branch, revision=None): return MockFileSystem.Create(TestFileSystem(test_data), updates[:revision]) host_file_system_creator = HostFileSystemCreator( ObjectStoreCreator.ForTest(), constructor_for_test=constructor) helper = AppYamlHelper( 'server2/app.yaml', file_system_at_head, ObjectStoreCreator.ForTest(disable_wrappers=False), host_file_system_creator) def assert_is_up_to_date(version): self.assertTrue(helper.IsUpToDate(version), '%s is not up to date' % version) self.assertRaises(ValueError, helper.GetFirstRevisionGreaterThan, version) self.assertEqual(0, helper.GetFirstRevisionGreaterThan('0-5-0')) assert_is_up_to_date('1-0-0') assert_is_up_to_date('1-5-0') # Revision 1. apply_update({'server2': {'app.yaml': _GenerateAppYaml('1-5-0')}}) self.assertEqual(0, helper.GetFirstRevisionGreaterThan('0-5-0')) self.assertEqual(1, helper.GetFirstRevisionGreaterThan('1-0-0')) assert_is_up_to_date('1-5-0') assert_is_up_to_date('2-5-0') # Revision 2. apply_update({'server2': {'app_yaml_helper.py': 'fixed a bug'}}) self.assertEqual(0, helper.GetFirstRevisionGreaterThan('0-5-0')) self.assertEqual(1, helper.GetFirstRevisionGreaterThan('1-0-0')) assert_is_up_to_date('1-5-0') assert_is_up_to_date('2-5-0') # Revision 3. apply_update({'server2': {'app.yaml': _GenerateAppYaml('1-6-0')}}) self.assertEqual(0, helper.GetFirstRevisionGreaterThan('0-5-0')) self.assertEqual(1, helper.GetFirstRevisionGreaterThan('1-0-0')) self.assertEqual(3, helper.GetFirstRevisionGreaterThan('1-5-0')) assert_is_up_to_date('2-5-0') # Revision 4. apply_update({'server2': {'app.yaml': _GenerateAppYaml('1-8-0')}}) # Revision 5. apply_update({'server2': {'app.yaml': _GenerateAppYaml('2-0-0')}}) # Revision 6. apply_update({'server2': {'app.yaml': _GenerateAppYaml('2-2-0')}}) # Revision 7. apply_update({'server2': {'app.yaml': _GenerateAppYaml('2-4-0')}}) # Revision 8. apply_update({'server2': {'app.yaml': _GenerateAppYaml('2-6-0')}}) self.assertEqual(0, helper.GetFirstRevisionGreaterThan('0-5-0')) self.assertEqual(1, helper.GetFirstRevisionGreaterThan('1-0-0')) self.assertEqual(3, helper.GetFirstRevisionGreaterThan('1-5-0')) self.assertEqual(5, helper.GetFirstRevisionGreaterThan('1-8-0')) self.assertEqual(6, helper.GetFirstRevisionGreaterThan('2-0-0')) self.assertEqual(6, helper.GetFirstRevisionGreaterThan('2-1-0')) self.assertEqual(7, helper.GetFirstRevisionGreaterThan('2-2-0')) self.assertEqual(7, helper.GetFirstRevisionGreaterThan('2-3-0')) self.assertEqual(8, helper.GetFirstRevisionGreaterThan('2-4-0')) self.assertEqual(8, helper.GetFirstRevisionGreaterThan('2-5-0')) assert_is_up_to_date('2-6-0') assert_is_up_to_date('2-7-0')