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)
示例#2
0
    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)
示例#3
0
  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)
示例#4
0
    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')
示例#5
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')