def decorator(func): # TODO: This is not ideal, should change this to support # multiple versions required_version = required_versions[0] auth_data = ObjectStorageAuthComposite() objectstorage_api_config = ObjectStorageAPIConfig() client = ObjectStorageAPIClient(auth_data.storage_url, auth_data.auth_token) behaviors = ObjectStorageAPI_Behaviors( client=client, config=objectstorage_api_config) swift_version = objectstorage_api_config.version if not swift_version and objectstorage_api_config.use_swift_info: info = behaviors.get_swift_info() swift_version = info.get('swift', { 'version': None }).get('version', None) if not swift_version: return func if required_version.startswith('<'): required_version = required_version.lstrip('<') compare_func = lambda sv, tv: sv < tv extra_message = ' less than' elif required_version.startswith('>'): required_version = required_version.lstrip('>') compare_func = lambda sv, tv: sv > tv extra_message = ' greater than' else: required_version = required_version.lstrip('=') compare_func = lambda sv, tv: sv.startswith(tv) extra_message = '' if compare_func(swift_version, required_version): func setattr(func, '__unittest_skip__', True) setattr( func, '__unittest_skip_why__', 'swift running version {0}, requires version{1}: {2}'.format( swift_version, extra_message, required_version)) return func
def decorator(func): # TODO: This is not ideal, should change this to support # multiple versions required_version = required_versions[0] auth_data = ObjectStorageAuthComposite() objectstorage_api_config = ObjectStorageAPIConfig() client = ObjectStorageAPIClient(auth_data.storage_url, auth_data.auth_token) behaviors = ObjectStorageAPI_Behaviors( client=client, config=objectstorage_api_config) swift_version = objectstorage_api_config.version if not swift_version and objectstorage_api_config.use_swift_info: info = behaviors.get_swift_info() swift_version = info.get( 'swift', {'version': None}).get('version', None) if not swift_version: return func if required_version.startswith('<'): required_version = required_version.lstrip('<') compare_func = lambda sv, tv: sv < tv extra_message = ' less than' elif required_version.startswith('>'): required_version = required_version.lstrip('>') compare_func = lambda sv, tv: sv > tv extra_message = ' greater than' else: required_version = required_version.lstrip('=') compare_func = lambda sv, tv: sv.startswith(tv) extra_message = '' if compare_func(swift_version, required_version): func setattr(func, '__unittest_skip__', True) setattr( func, '__unittest_skip_why__', 'swift running version {0}, requires version{1}: {2}'.format( swift_version, extra_message, required_version)) return func
def required_version(cls, required_version): """ Test decorator to skip tests if the version of swift does not match the required version provided. If unable to retrieve the version, the default behavior will be to run the test. Configuration of what version swift is running can be done from the objectstorage config file. Note: "lambda func: func" is from the Python unit tests example "25.3.6. Skipping tests and expected failures": def skipUnlessHasattr(obj, attr): if hasattr(obj, attr): return lambda func: func return unittest.skip("{!r} doesn't have {!r}".format(obj, attr)) http://docs.python.org/2/library/unittest.html @param required_version: condition and version required to run the test. examples: '=1.11.0.54' - run if swift version is == '1.11.0.54' - same as above '<1.11.0.54' - run if swift version is < '>1.11.0.54' - run if swift version is > @type required_version: string @return: a function indicating either to run or skip the test based on the results of the version comparison. @rtype: function """ auth_data = ObjectStorageAuthComposite() objectstorage_api_config = ObjectStorageAPIConfig() client = ObjectStorageAPIClient(auth_data.storage_url, auth_data.auth_token) behaviors = ObjectStorageAPI_Behaviors( client=client, config=objectstorage_api_config) swift_version = objectstorage_api_config.version if not swift_version and objectstorage_api_config.use_swift_info: info = behaviors.get_swift_info() swift_version = info.get( 'swift', {'version': None}).get('version', None) if not swift_version: return lambda func: func if required_version.startswith('<'): required_version = required_version.lstrip('<') compare_func = lambda sv, tv: sv < tv extra_message = ' less than' elif required_version.startswith('>'): required_version = required_version.lstrip('>') compare_func = lambda sv, tv: sv > tv extra_message = ' greater than' else: required_version = required_version.lstrip('=') compare_func = lambda sv, tv: sv.startswith(tv) extra_message = '' if compare_func(swift_version, required_version): return lambda func: func return unittest.skip( 'swift running version {0}, requires version{1}: {2}'.format( swift_version, extra_message, required_version))