internlm/SWE-Fixer-Train-110K huggingface dataset:
Repository: rucio/rucio

Issue:
replicas: sort pfns inside rse structure for protocol priority
Motivation
----------

list_replicas reply should now enforce protocol priority in rse contents:

```
  u'rses': {u'CERN-PROD_DATADISK': [u'gsiftp://eosatlassftp.cern.ch:2811/eos/atlas/atlasdatadisk/rucio/mc16_13TeV/22/b5/HITS.10701323._005432.pool.root.1',
    u'davs://eosatlashttp.cern.ch:443/eos/atlas/atlasdatadisk/rucio/mc16_13TeV/22/b5/HITS.10701323._005432.pool.root.1',
    u'root://eosatlas.cern.ch:1094//eos/atlas/atlasdatadisk/rucio/mc16_13TeV/22/b5/HITS.10701323._005432.pool.root.1',
    u'srm://srm-eosatlas.cern.ch:8443/srm/v2/server?SFN=/eos/atlas/atlasdatadisk/rucio/mc16_13TeV/22/b5/HITS.10701323._005432.pool.root.1']},
```

Sort PFNs based on protocol priority per RSE, e.g., in this case, root, gsiftp, davs, srm.


Discussion:

Resolving patch:
diff --git a/lib/rucio/core/replica.py b/lib/rucio/core/replica.py
--- a/lib/rucio/core/replica.py
+++ b/lib/rucio/core/replica.py
@@ -986,7 +986,14 @@ def _list_replicas(dataset_clause, file_clause, state_clause, show_pfns,
 
     if 'scope' in file and 'name' in file:
         file['rses'] = {}
-        for t_rse, t_pfn in [(file['pfns'][t_pfn]['rse'], t_pfn) for t_pfn in file['pfns']]:
+
+        # also sort the pfns inside the rse structure
+        rse_pfns = []
+        for t_rse, t_priority, t_pfn in [(file['pfns'][t_pfn]['rse'], file['pfns'][t_pfn]['priority'], t_pfn) for t_pfn in file['pfns']]:
+            rse_pfns.append((t_rse, t_priority, t_pfn))
+            rse_pfns = sorted(rse_pfns)
+
+        for t_rse, t_priority, t_pfn in rse_pfns:
             if(t_rse in file['rses']):
                 file['rses'][t_rse].append(t_pfn)
             else:


Test patch:
Repository: rucio/rucio

Issue:
replicas: sort pfns inside rse structure for protocol priority
Motivation
----------

list_replicas reply should now enforce protocol priority in rse contents:

```
  u'rses': {u'CERN-PROD_DATADISK': [u'gsiftp://eosatlassftp.cern.ch:2811/eos/atlas/atlasdatadisk/rucio/mc16_13TeV/22/b5/HITS.10701323._005432.pool.root.1',
    u'davs://eosatlashttp.cern.ch:443/eos/atlas/atlasdatadisk/rucio/mc16_13TeV/22/b5/HITS.10701323._005432.pool.root.1',
    u'root://eosatlas.cern.ch:1094//eos/atlas/atlasdatadisk/rucio/mc16_13TeV/22/b5/HITS.10701323._005432.pool.root.1',
    u'srm://srm-eosatlas.cern.ch:8443/srm/v2/server?SFN=/eos/atlas/atlasdatadisk/rucio/mc16_13TeV/22/b5/HITS.10701323._005432.pool.root.1']},
```

Sort PFNs based on protocol priority per RSE, e.g., in this case, root, gsiftp, davs, srm.
Regression in bulk_group_transfer due to missing key
Motivation
----------
Due to the new verify_checksum mapping.
```
2018-04-24 14:36:42,467 2991    INFO    0:0 Got 1 transfers for Functional Test XrootD
2018-04-24 14:36:42,468 2991    INFO    0:0 Starting to group transfers for Functional Test XrootD
2018-04-24 14:36:42,468 2991    CRITICAL        0:0 Traceback (most recent call last):
File “/usr/lib/python2.7/site-packages/rucio/daemons/conveyor/submitter.py”, line 157, in submitter
  grouped_jobs = bulk_group_transfer(transfers, group_policy, group_bulk, fts_source_strategy, max_time_in_queue)
File “/usr/lib/python2.7/site-packages/rucio/daemons/conveyor/common.py”, line 156, in bulk_group_transfer
  ‘verify_checksum’: transfer[‘verify_checksum’],
KeyError: ‘verify_checksum’
```
Bug due to move to heartbeat
Motivation
----------
The heart_beat in the conveyor is done using the full executable + arguments. One should only keep the executable + the activity option.
In addition a bug has been introduced by moving from `type(request_type) is not list`  to `isinstance(request_type, list)`



Discussion:

Resolving patch:
diff --git a/lib/rucio/core/replica.py b/lib/rucio/core/replica.py
--- a/lib/rucio/core/replica.py
+++ b/lib/rucio/core/replica.py
@@ -986,7 +986,14 @@ def _list_replicas(dataset_clause, file_clause, state_clause, show_pfns,
 
     if 'scope' in file and 'name' in file:
         file['rses'] = {}
-        for t_rse, t_pfn in [(file['pfns'][t_pfn]['rse'], t_pfn) for t_pfn in file['pfns']]:
+
+        # also sort the pfns inside the rse structure
+        rse_pfns = []
+        for t_rse, t_priority, t_pfn in [(file['pfns'][t_pfn]['rse'], file['pfns'][t_pfn]['priority'], t_pfn) for t_pfn in file['pfns']]:
+            rse_pfns.append((t_rse, t_priority, t_pfn))
+            rse_pfns = sorted(rse_pfns)
+
+        for t_rse, t_priority, t_pfn in rse_pfns:
             if(t_rse in file['rses']):
                 file['rses'][t_rse].append(t_pfn)
             else:


Test patch:
Repository: rucio/rucio

Issue:
Mention upload with PFN should also be with no_register
Motivation
----------
if we use PFN, we should explain that also no_register is required
https://rucio.readthedocs.io/en/latest/api/upload.html?highlight=pfn

Modification
------------



Discussion:

Resolving patch:
diff --git a/lib/rucio/client/uploadclient.py b/lib/rucio/client/uploadclient.py
--- a/lib/rucio/client/uploadclient.py
+++ b/lib/rucio/client/uploadclient.py
@@ -74,7 +74,7 @@ def upload(self, items, summary_file_path=None):
             dataset_scope    - Optional: custom dataset scope
             dataset_name     - Optional: custom dataset name
             force_scheme     - Optional: force a specific scheme (if PFN upload this will be overwritten) (Default: None)
-            pfn              - Optional: use a given PFN (this sets no_register to True)
+            pfn              - Optional: use a given PFN (this sets no_register to True, and no_register becomes mandatory)
             no_register      - Optional: if True, the file will not be registered in the rucio catalogue
             lifetime         - Optional: the lifetime of the file after it was uploaded
             transfer_timeout - Optional: time after the upload will be aborted


Test patch:
Repository: rucio/rucio

Issue:
readthedocs build fails due to pycurl
Motivation
----------
Currently the build process on readthedocs fails.

```
Collecting pycurl>=7.19 (from fts3-rest-API==3.7.1->-r requirements.readthedocs.txt (line 44))
  Using cached https://files.pythonhosted.org/packages/e8/e4/0dbb8735407189f00b33d84122b9be52c790c7c3b25286826f4e1bdb7bde/pycurl-7.43.0.2.tar.gz
    Complete output from command python setup.py egg_info:
    Traceback (most recent call last):
      File "<string>", line 1, in <module>
      File "/tmp/pip-build-jSh8ZH/pycurl/setup.py", line 913, in <module>
        ext = get_extension(sys.argv, split_extension_source=split_extension_source)
      File "/tmp/pip-build-jSh8ZH/pycurl/setup.py", line 582, in get_extension
        ext_config = ExtensionConfiguration(argv)
      File "/tmp/pip-build-jSh8ZH/pycurl/setup.py", line 99, in __init__
        self.configure()
      File "/tmp/pip-build-jSh8ZH/pycurl/setup.py", line 227, in configure_unix
        raise ConfigurationError(msg)
    __main__.ConfigurationError: Could not run curl-config: [Errno 2] No such file or directory
    
    ----------------------------------------
Command "python setup.py egg_info" failed with error code 1 in /tmp/pip-build-jSh8ZH/pycurl/
You are using pip version 9.0.1, however version 18.0 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.
```



Discussion:
Still does not work: https://readthedocs.org/projects/rucio/builds/7547086/
So this probably needs to wait until pycurl is an extra in the fts3-rest-api package. For now, although only the requirements.readthedocs.txt should be used, it seems like rucio as a package is pulled in as well, which then requires pycurl via fts3-rest-api, crashing readthedocs build.
Needs a version > 3.7.1 https://pypi.org/project/fts3-rest-API/#history

Resolving patch:
diff --git a/doc/source/conf.py b/doc/source/conf.py
--- a/doc/source/conf.py
+++ b/doc/source/conf.py
@@ -17,9 +17,24 @@
 # documentation root, use os.path.abspath to make it absolute, like shown here.
 #
 import os
-# import sys
+import sys
 # sys.path.insert(0, os.path.abspath('.'))
 
+from mock import Mock as MagicMock
+
+
+class Mock(MagicMock):
+    @classmethod
+    def __getattr__(cls, name):
+        return Mock()
+
+    @classmethod
+    def __getitem__(cls, name):
+        return Mock()
+
+
+MOCK_MODULES = ['pycurl']
+sys.modules.update((mod_name, Mock()) for mod_name in MOCK_MODULES)
 
 # -- General configuration ------------------------------------------------
 


Test patch:
Repository: rucio/rucio

Issue:
Add a --allow-tape option in rucio download
Motivation
----------
`rucio download` does a check at the beginning to see if the account is an admin one in case the replica is on tape. It puts unneeded load on the servers.

Modification
------------
Propose to forbid any access to replicas on TAPE by defaut and add a `--alllowtape` option. If this option is set to True, then the admin check is done



Discussion:
suggestion: "--allow-tape" :-)


Resolving patch:
diff --git a/lib/rucio/client/downloadclient.py b/lib/rucio/client/downloadclient.py
--- a/lib/rucio/client/downloadclient.py
+++ b/lib/rucio/client/downloadclient.py
@@ -45,7 +45,7 @@
 
 class DownloadClient:
 
-    def __init__(self, client=None, logger=None):
+    def __init__(self, client=None, logger=None, check_admin=False):
         """
         Initialises the basic settings for an DownloadClient object
 
@@ -62,12 +62,13 @@ def __init__(self, client=None, logger=None):
 
         self.client_location = detect_client_location()
 
-        account_attributes = [acc for acc in self.client.list_account_attributes(self.client.account)]
         self.is_admin = False
-        for attr in account_attributes[0]:
-            if attr['key'] == 'admin':
-                self.is_admin = attr['value'] is True
-                break
+        if check_admin:
+            account_attributes = list(self.client.list_account_attributes(self.client.account))
+            for attr in account_attributes[0]:
+                if attr['key'] == 'admin':
+                    self.is_admin = attr['value'] is True
+                    break
         if self.is_admin:
             logger.debug('Admin mode enabled')
 
diff --git a/lib/rucio/vcsversion.py b/lib/rucio/vcsversion.py
--- a/lib/rucio/vcsversion.py
+++ b/lib/rucio/vcsversion.py
@@ -4,8 +4,8 @@
 '''
 VERSION_INFO = {
     'final': True,
-    'version': '1.17.6',
-    'branch_nick': 'patch-0-1_17_6_preparation',
-    'revision_id': '9757e02054c66fd10cb29ad520da0e73a9645ef7',
-    'revno': 6883
+    'version': '1.17.7',
+    'branch_nick': 'patch-0-1_17_7_release_preparation',
+    'revision_id': '9b733f0793b98677aa5fc65713d0026ce478e0c1',
+    'revno': 6932
 }


Test patch:
diff --git a/lib/rucio/tests/test_bin_rucio.py b/lib/rucio/tests/test_bin_rucio.py
--- a/lib/rucio/tests/test_bin_rucio.py
+++ b/lib/rucio/tests/test_bin_rucio.py
@@ -36,6 +36,7 @@
 from rucio.client.replicaclient import ReplicaClient
 from rucio.common.config import config_get
 from rucio.common.utils import generate_uuid, md5
+from rucio.core.rse import add_rse_attribute
 from rucio.tests.common import execute, account_name_generator, rse_name_generator, file_generator, scope_name_generator
 from rucio.rse import rsemanager as rsemgr
 
@@ -58,6 +59,8 @@ def setup(self):
         self.account_client = AccountLimitClient()
         self.account_client.set_account_limit('root', self.def_rse, -1)
 
+        add_rse_attribute(self.def_rse, 'istape', 'False')
+
         self.upload_success_str = 'Successfully uploaded file %s'
 
     def test_rucio_version(self):
Repository: rucio/rucio

Issue:
readthedocs build fails due to pycurl
Motivation
----------
Currently the build process on readthedocs fails.

```
Collecting pycurl>=7.19 (from fts3-rest-API==3.7.1->-r requirements.readthedocs.txt (line 44))
  Using cached https://files.pythonhosted.org/packages/e8/e4/0dbb8735407189f00b33d84122b9be52c790c7c3b25286826f4e1bdb7bde/pycurl-7.43.0.2.tar.gz
    Complete output from command python setup.py egg_info:
    Traceback (most recent call last):
      File "<string>", line 1, in <module>
      File "/tmp/pip-build-jSh8ZH/pycurl/setup.py", line 913, in <module>
        ext = get_extension(sys.argv, split_extension_source=split_extension_source)
      File "/tmp/pip-build-jSh8ZH/pycurl/setup.py", line 582, in get_extension
        ext_config = ExtensionConfiguration(argv)
      File "/tmp/pip-build-jSh8ZH/pycurl/setup.py", line 99, in __init__
        self.configure()
      File "/tmp/pip-build-jSh8ZH/pycurl/setup.py", line 227, in configure_unix
        raise ConfigurationError(msg)
    __main__.ConfigurationError: Could not run curl-config: [Errno 2] No such file or directory
    
    ----------------------------------------
Command "python setup.py egg_info" failed with error code 1 in /tmp/pip-build-jSh8ZH/pycurl/
You are using pip version 9.0.1, however version 18.0 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.
```



Discussion:
Still does not work: https://readthedocs.org/projects/rucio/builds/7547086/
So this probably needs to wait until pycurl is an extra in the fts3-rest-api package. For now, although only the requirements.readthedocs.txt should be used, it seems like rucio as a package is pulled in as well, which then requires pycurl via fts3-rest-api, crashing readthedocs build.
Needs a version > 3.7.1 https://pypi.org/project/fts3-rest-API/#history

Resolving patch:
diff --git a/doc/source/conf.py b/doc/source/conf.py
--- a/doc/source/conf.py
+++ b/doc/source/conf.py
@@ -17,9 +17,24 @@
 # documentation root, use os.path.abspath to make it absolute, like shown here.
 #
 import os
-# import sys
+import sys
 # sys.path.insert(0, os.path.abspath('.'))
 
+from mock import Mock as MagicMock
+
+
+class Mock(MagicMock):
+    @classmethod
+    def __getattr__(cls, name):
+        return Mock()
+
+    @classmethod
+    def __getitem__(cls, name):
+        return Mock()
+
+
+MOCK_MODULES = ['pycurl', 'M2Crypto']
+sys.modules.update((mod_name, Mock()) for mod_name in MOCK_MODULES)
 
 # -- General configuration ------------------------------------------------
 


Test patch:
Repository: rucio/rucio

Issue:
Typos and other small fixes
Motivation
----------

Stumbled upon them while using Rucio. This issue collects them, though they aren’t related.

Modification
------------

Small patches of little consequence.


Discussion:

Resolving patch:
diff --git a/lib/rucio/daemons/bb8/common.py b/lib/rucio/daemons/bb8/common.py
--- a/lib/rucio/daemons/bb8/common.py
+++ b/lib/rucio/daemons/bb8/common.py
@@ -263,5 +263,5 @@ def rebalance_rse(rse, max_bytes=1E9, max_files=None, dry_run=False, exclude_exp
             print 'Exception %s occured while rebalancing %s:%s, rule_id: %s!' % (str(error), scope, name, str(rule_id))
             raise error
 
-    print 'BB8 is rebalancing %d Gb of data (%d rules)' % (int(rebalanced_bytes / 1E9), len(rebalanced_datasets))
+    print 'BB8 is rebalancing %d GB of data (%d rules)' % (int(rebalanced_bytes / 1E9), len(rebalanced_datasets))
     return rebalanced_datasets


Test patch:
Repository: rucio/rucio

Issue:
If policy section not available in client config, no exception should be raised
Motivation
----------
There are two `config_get('policy', ...)` calls in the bin/rucio code. However, if the policy section is not available in the config an error is raised. This should not happen. Default values should be used. ("")
Typos and other small fixes
Motivation
----------

Stumbled upon them while using Rucio. This issue collects them, though they aren’t related.

Modification
------------

Small patches of little consequence.


Discussion:

Resolving patch:
diff --git a/lib/rucio/daemons/bb8/common.py b/lib/rucio/daemons/bb8/common.py
--- a/lib/rucio/daemons/bb8/common.py
+++ b/lib/rucio/daemons/bb8/common.py
@@ -263,5 +263,5 @@ def rebalance_rse(rse, max_bytes=1E9, max_files=None, dry_run=False, exclude_exp
             print 'Exception %s occured while rebalancing %s:%s, rule_id: %s!' % (str(error), scope, name, str(rule_id))
             raise error
 
-    print 'BB8 is rebalancing %d Gb of data (%d rules)' % (int(rebalanced_bytes / 1E9), len(rebalanced_datasets))
+    print 'BB8 is rebalancing %d GB of data (%d rules)' % (int(rebalanced_bytes / 1E9), len(rebalanced_datasets))
     return rebalanced_datasets


Test patch:
Repository: rucio/rucio

Issue:
removing download() method from downloadclient
Motivation
----------

this functionality should be replaced by the other methods, also in rucio_sitemover in pilot. For now, schemes: [protocol] -> protocol, otherwise the list_replicas with metalink won't work.

Modification
------------



Discussion:
Would be solved by:
https://github.com/PanDAWMS/pilot/pull/218

Resolving patch:
diff --git a/lib/rucio/client/downloadclient.py b/lib/rucio/client/downloadclient.py
--- a/lib/rucio/client/downloadclient.py
+++ b/lib/rucio/client/downloadclient.py
@@ -527,41 +527,6 @@ def _download_item(self, item, trace, log_prefix=''):
             logger.info('%sFile %s successfully downloaded in %s seconds' % (log_prefix, did_str, duration))
         return item
 
-    def download(self, dids, rse=None, archive=None, protocol=None, pfn=None, nrandom=None, nprocs=3, user_agent='rucio_clients', dir='.', no_subd=False, transfer_timeout=None):
-        """
-        OBSOLETE! This function is kept for compability reasons and will be removed in a future release!
-        """
-        item_tpl = {'rse': rse,
-                    'force_scheme': protocol,
-                    'nrandom': nrandom,
-                    'base_dir': dir,
-                    'no_subdir': no_subd,
-                    'transfer_timeout': transfer_timeout}
-        if pfn:
-            item_tpl['pfn'] = pfn
-        input_items = []
-        for did in dids:
-            item = {}
-            item.update(item_tpl)
-            item['did'] = did
-            if archive:
-                item['archive'] = archive
-            input_items.append(item)
-
-        trace_pattern = {'appid': os.environ.get('RUCIO_TRACE_APPID', None),
-                         'dataset': os.environ.get('RUCIO_TRACE_DATASET', None),
-                         'datasetScope': os.environ.get('RUCIO_TRACE_DATASETSCOPE', None),
-                         'pq': os.environ.get('RUCIO_TRACE_PQ', None),
-                         'taskid': os.environ.get('RUCIO_TRACE_TASKID', None),
-                         'usrdn': os.environ.get('RUCIO_TRACE_USRDN', None)}
-
-        if pfn:
-            return self.download_pfns(input_items, nprocs, trace_pattern)
-        elif archive:
-            self.download_file_from_archive(input_items, trace_pattern)
-        else:
-            return self.download_dids(input_items, nprocs, trace_pattern)
-
     def download_aria2c(self, items, trace_custom_fields={}):
         """
         Uses aria2c to download the items with given DIDs. This function can also download datasets and wildcarded DIDs.


Test patch:
Repository: rucio/rucio

Issue:
Rucio UI RSE admin view
_Migrated from JIRA [RUCIO-2850](https://its.cern.ch/jira/browse/RUCIO-2850)_


Discussion:

Resolving patch:
diff --git a/lib/rucio/web/ui/main.py b/lib/rucio/web/ui/main.py
--- a/lib/rucio/web/ui/main.py
+++ b/lib/rucio/web/ui/main.py
@@ -53,6 +53,10 @@
     '/r2d2/request', 'RequestRule',
     '/r2d2/manage_quota', 'RSEAccountUsage',
     '/r2d2', 'ListRules',
+    '/rse', 'RSE',
+    '/rse/protocol/add', 'AddRSEProtocol',
+    '/rses', 'RSES',
+    '/rses/add', 'AddRSE',
     '/rse_usage', 'RSEUsage',
     '/rse_locks', 'RSELocks',
     '/rule', 'Rule',
@@ -113,6 +117,22 @@ def GET(self):  # pylint:disable=no-self-use,invalid-name
         return check_token(render.account_rse_usage())
 
 
+class AddRSE(object):
+    """ Add RSE """
+    def GET(self):  # pylint:disable=no-self-use,invalid-name
+        """ GET """
+        render = template.render(join(dirname(__file__), 'templates/'))
+        return check_token(render.add_rse())
+
+
+class AddRSEProtocol(object):
+    """ Add protocol to RSE """
+    def GET(self):  # pylint:disable=no-self-use,invalid-name
+        """ GET """
+        render = template.render(join(dirname(__file__), 'templates/'))
+        return check_token(render.rse_add_protocol())
+
+
 class ApproveRules(object):
     """ R2D2 rule approval overview """
     def GET(self):  # pylint:disable=no-self-use,invalid-name
@@ -319,6 +339,22 @@ def GET(self):  # pylint:disable=no-self-use,invalid-name
         return check_token(render.infrastructure())
 
 
+class RSE(object):
+    """ RSE detail page """
+    def GET(self):  # pylint:disable=no-self-use,invalid-name
+        """ GET """
+        render = template.render(join(dirname(__file__), 'templates/'))
+        return check_token(render.rse())
+
+
+class RSES(object):
+    """ List of all RSEs """
+    def GET(self):  # pylint:disable=no-self-use,invalid-name
+        """ GET """
+        render = template.render(join(dirname(__file__), 'templates/'))
+        return check_token(render.rses())
+
+
 class Rules(object):
     """ Rules list """
     def GET(self):  # pylint:disable=no-self-use,invalid-name


Test patch:
Repository: rucio/rucio

Issue:
Problems with accessing the REST API and the WebUI in the development docker container
Motivation
----------
It is not possible to access the REST API under 'https://localhost/proxy' and to access the Web UI under 'https://localhost/ui/' within the docker container build with the Dockerfile under /etc/docker/dev.

Modification
------------
A few modifications can be copied from the demo environment.
Typos and other small fixes
Motivation
----------

Stumbled upon them while using Rucio. This issue collects them, though they aren’t related.

Modification
------------

Small patches of little consequence.


Discussion:

Resolving patch:
diff --git a/lib/rucio/daemons/bb8/common.py b/lib/rucio/daemons/bb8/common.py
--- a/lib/rucio/daemons/bb8/common.py
+++ b/lib/rucio/daemons/bb8/common.py
@@ -263,5 +263,5 @@ def rebalance_rse(rse, max_bytes=1E9, max_files=None, dry_run=False, exclude_exp
             print 'Exception %s occured while rebalancing %s:%s, rule_id: %s!' % (str(error), scope, name, str(rule_id))
             raise error
 
-    print 'BB8 is rebalancing %d Gb of data (%d rules)' % (int(rebalanced_bytes / 1E9), len(rebalanced_datasets))
+    print 'BB8 is rebalancing %d GB of data (%d rules)' % (int(rebalanced_bytes / 1E9), len(rebalanced_datasets))
     return rebalanced_datasets


Test patch:
Repository: rucio/rucio

Issue:
Change urllib3 version to >=1.23
Motivation
----------
There was a bug with the certificate chains in pyopenssl for urllib3 https://github.com/urllib3/urllib3/issues/1060 which has been fixed in urrlib3 version 1.23
We should change the version from `urllib3>=1.10.2` to `urllib3>1.23`

We can probably also remove the direct dependency to pyopenssl in tools/pip-requires, but this has to be checked.


Discussion:
Reminder: For ATLAS we need to remove the puppet monkey patch were we update /usr/lib/python2.7/site-packages/urllib3/contrib/pyopenssl.py

Resolving patch:
diff --git a/setup_rucio.py b/setup_rucio.py
--- a/setup_rucio.py
+++ b/setup_rucio.py
@@ -220,7 +220,6 @@ def get_file_list(self):
         'Operating System :: POSIX :: Linux',
         'Natural Language :: English',
         'Programming Language :: Python',
-        'Programming Language :: Python :: 2.6',
         'Programming Language :: Python :: 2.7',
         'Environment :: No Input/Output (Daemon)', ],
     install_requires=requires,


Test patch: