]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
qa/tasks: use next(iter(..)) for accessing first element in a view
authorKefu Chai <kchai@redhat.com>
Tue, 31 Mar 2020 02:16:40 +0000 (10:16 +0800)
committerKefu Chai <kchai@redhat.com>
Tue, 2 Jun 2020 02:32:23 +0000 (10:32 +0800)
in python2, dict.values() and dict.keys() return lists. but in python3,
they return views, which cannot be indexed directly using an integer index.

there are three use cases when we access these views in python3:

1. get the first element
2. get all the elements and then *might* want to access them by index
3. get the first element assuming there is only a single element in
   the view
4. iterate thru the view

in the 1st case, we cannot assume the number of elements, so to be
python3 compatible, we should use `next(iter(a_dict))` instead.

in the 2nd case, in this change, the view is materialized using
`list(a_dict)`.

in the 3rd case, we can just continue using the short hand of
```py
(first_element,) = a_dict.keys()
```
to unpack the view. this works in both python2 and python3.

in the 4th case, the existing code works in both python2 and python3, as
both list and view can be iterated using `iter`, and `len` works as
well.

Signed-off-by: Kefu Chai <kchai@redhat.com>
(cherry picked from commit d7258ea7fdcd81d4a88028a25b32ed5b278d0752)

Conflicts:
qa/tasks/barbican.py
qa/tasks/cbt.py
qa/tasks/vault.py: trivial resolutions

qa/tasks/cbt.py
qa/tasks/ceph_manager.py
qa/tasks/ceph_objectstore_tool.py
qa/tasks/cephfs/filesystem.py
qa/tasks/check_counter.py
qa/tasks/devstack.py
qa/tasks/dnsmasq.py
qa/tasks/filestore_idempotent.py
qa/tasks/mgr/test_crash.py
qa/tasks/radosgw_admin.py
qa/tasks/radosgw_admin_rest.py

index 941694802cf6200c9eb8c58a315511cc16a2a667..e234eff907b27b10831a015851b8feda525a3384 100644 (file)
@@ -44,7 +44,7 @@ class CBT(Task):
             )
 
         benchmark_config = self.config.get('benchmarks')
-        benchmark_type = benchmark_config.keys()[0]
+        benchmark_type = next(iter(benchmark_config.keys()))
         if benchmark_type == 'librbdfio':
           testdir = misc.get_testdir(self.ctx)
           benchmark_config['librbdfio']['cmd_path'] = os.path.join(testdir, 'fio/fio')
@@ -78,7 +78,7 @@ class CBT(Task):
             cbt_depends = ['python3-yaml', 'python3-lxml', 'librbd-dev', 'collectl']
         self.first_mon.run(args=install_cmd + cbt_depends)
 
-        benchmark_type = self.cbt_config.get('benchmarks').keys()[0]
+        benchmark_type = next(iter(self.cbt_config.get('benchmarks').keys()))
         self.log.info('benchmark: %s', benchmark_type)
 
         if benchmark_type == 'librbdfio':
@@ -192,7 +192,7 @@ class CBT(Task):
 
     def setup(self):
         super(CBT, self).setup()
-        self.first_mon = self.ctx.cluster.only(misc.get_first_mon(self.ctx, self.config)).remotes.keys()[0]
+        self.first_mon = next(iter(self.ctx.cluster.only(misc.get_first_mon(self.ctx, self.config)).remotes.keys()))
         self.cbt_config = self.generate_cbt_config()
         self.log.info('cbt configuration is %s', self.cbt_config)
         self.cbt_dir = os.path.join(misc.get_archive_dir(self.ctx), 'cbt')
@@ -224,7 +224,7 @@ class CBT(Task):
                 '{tdir}/cbt'.format(tdir=testdir),
             ]
         )
-        benchmark_type = self.cbt_config.get('benchmarks').keys()[0]
+        benchmark_type = next(iter(self.cbt_config.get('benchmarks').keys()))
         if benchmark_type == 'librbdfio':
             self.first_mon.run(
                 args=[
index a2479c6f997bea9463a265be625bda4e0f356577..d02f14592b7c6dcd0b9d4740b00d1df0db9017ff 100644 (file)
@@ -1046,8 +1046,8 @@ class ObjectStoreTool:
             self.pgid = self.manager.get_object_pg_with_shard(self.pool,
                                                               self.object_name,
                                                               self.osd)
-        self.remote = self.manager.ctx.\
-            cluster.only('osd.{o}'.format(o=self.osd)).remotes.keys()[0]
+        self.remote = next(iter(self.manager.ctx.\
+            cluster.only('osd.{o}'.format(o=self.osd)).remotes.keys()))
         path = self.manager.get_filepath().format(id=self.osd)
         self.paths = ("--data-path {path} --journal-path {path}/journal".
                       format(path=path))
index 9598e9073dd1b49eae3dcb3e8a7781e057767390..94b9d19e913fcbccea2741e61c3ba35752904a02 100644 (file)
@@ -242,7 +242,7 @@ def test_objectstore(ctx, config, cli_remote, REP_POOL, REP_NAME, ec=False):
                          REP_NAME, DATALINECOUNT)
     allremote = []
     allremote.append(cli_remote)
-    allremote += osds.remotes.keys()
+    allremote += list(osds.remotes.keys())
     allremote = list(set(allremote))
     for remote in allremote:
         cod_setup_remote_data(log, ctx, remote, NUM_OBJECTS, DATADIR,
index e02d822e26ff1271b258f78d4df34b56d900ecc6..d149387a6984b282f36bcff427f75a62ad6053c6 100644 (file)
@@ -662,7 +662,7 @@ class Filesystem(MDSCluster):
         if refresh or self.data_pools is None:
             self.get_pool_names(refresh = True)
         assert(len(self.data_pools) == 1)
-        return self.data_pools.values()[0]
+        return next(iter(self.data_pools.values()))
 
     def get_data_pool_id(self, refresh = False):
         """
@@ -672,12 +672,12 @@ class Filesystem(MDSCluster):
         if refresh or self.data_pools is None:
             self.get_pool_names(refresh = True)
         assert(len(self.data_pools) == 1)
-        return self.data_pools.keys()[0]
+        return next(iter(self.data_pools.keys()))
 
     def get_data_pool_names(self, refresh = False):
         if refresh or self.data_pools is None:
             self.get_pool_names(refresh = True)
-        return self.data_pools.values()
+        return list(self.data_pools.values())
 
     def get_metadata_pool_name(self):
         return self.metadata_pool_name
index fc877f285b6c8174204ef23f2c4b084f2f7e22f5..daa81973be7358256646eb8dddcdb1b8251ca2f9 100644 (file)
@@ -45,7 +45,7 @@ class CheckCounter(Task):
         targets = self.config.get('counters', {})
 
         if cluster_name is None:
-            cluster_name = self.ctx.managers.keys()[0]
+            cluster_name = next(iter(self.ctx.managers.keys()))
 
         for daemon_type, counters in targets.items():
             # List of 'a', 'b', 'c'...
index dc1c6a1f961beeebaf6e34d1790b1537f386094e..35620f7ea82a635867fa43619e44afb690efe621 100644 (file)
@@ -59,8 +59,8 @@ def install(ctx, config):
     if not isinstance(config, dict):
         raise TypeError("config must be a dict")
 
-    devstack_node = ctx.cluster.only(is_devstack_node).remotes.keys()[0]
-    an_osd_node = ctx.cluster.only(is_osd_node).remotes.keys()[0]
+    devstack_node = next(iter(ctx.cluster.only(is_devstack_node).remotes.keys()))
+    an_osd_node = next(iter(ctx.cluster.only(is_osd_node).remotes.keys()))
 
     devstack_branch = config.get("branch", "master")
     install_devstack(devstack_node, devstack_branch)
@@ -306,7 +306,7 @@ def exercise(ctx, config):
     if not isinstance(config, dict):
         raise TypeError("config must be a dict")
 
-    devstack_node = ctx.cluster.only(is_devstack_node).remotes.keys()[0]
+    devstack_node = next(iter(ctx.cluster.only(is_devstack_node).remotes.keys()))
 
     # TODO: save the log *and* preserve failures
     #devstack_archive_dir = create_devstack_archive(ctx, devstack_node)
@@ -333,8 +333,8 @@ def create_devstack_archive(ctx, devstack_node):
 def smoke(ctx, config):
     log.info("Running a basic smoketest...")
 
-    devstack_node = ctx.cluster.only(is_devstack_node).remotes.keys()[0]
-    an_osd_node = ctx.cluster.only(is_osd_node).remotes.keys()[0]
+    devstack_node = next(iter(ctx.cluster.only(is_devstack_node).remotes.keys()))
+    an_osd_node = next(iter(ctx.cluster.only(is_osd_node).remotes.keys()))
 
     try:
         create_volume(devstack_node, an_osd_node, 'smoke0', 1)
index 717c9f01930ae4c379d04e48a85e53229c0ffa13..352ed246b6eb48a930e245563081e1b5399334fa 100644 (file)
@@ -83,7 +83,7 @@ def setup_dnsmasq(remote, testdir, cnames):
     # restart dnsmasq
     remote.run(args=['sudo', 'systemctl', 'restart', 'dnsmasq'])
     # verify dns name is set
-    remote.run(args=['ping', '-c', '4', cnames.keys()[0]])
+    remote.run(args=['ping', '-c', '4', next(iter(cnames.keys()))])
 
     try:
         yield
index 01b562905b212408f09d89060a689e875035cdfc..319bef7686c71d8ad0a25b62a6607411a1ff354c 100644 (file)
@@ -31,7 +31,7 @@ def task(ctx, config):
     clients = config.keys()
 
     # just use the first client...
-    client = clients[0];
+    client = next(iter(clients))
     (remote,) = ctx.cluster.only(client).remotes.keys()
 
     testdir = teuthology.get_testdir(ctx)
index c45c24a48dbbe39327c2d4e2eccf80e48ab60285..6607bec7d736d627ea02924adc1f6ea380c36654 100644 (file)
@@ -73,7 +73,7 @@ class TestCrash(MgrTestCase):
             self.assertIn(crash['crash_id'], retstr)
 
     def test_rm(self):
-        crashid = self.crashes.keys()[0]
+        crashid = next(iter(self.crashes.keys()))
         self.assertEqual(
             0,
             self.mgr_cluster.mon_manager.raw_cluster_cmd_result(
index 63cb1375f35d58a4a32433e409fd14b2f9042217..b8e6008ce3ef1717d2fbbf5b14b4dcfabc6bfa3d 100644 (file)
@@ -272,7 +272,7 @@ def task(ctx, config):
     clients_from_config = config.keys()
 
     # choose first client as default
-    client = clients_from_config[0]
+    client = next(iter(clients_from_config))
 
     # once the client is chosen, pull the host name and  assigned port out of
     # the role_endpoints that were assigned by the rgw task
index a2724e3ffb3b1d805e2fc6d63bdd1a5578b5e2f7..8902ca15c6e2039fd2dbacf1bec707d2bdeeee66 100644 (file)
@@ -130,7 +130,7 @@ def task(ctx, config):
     clients = config.keys()
 
     # just use the first client...
-    client = clients[0]
+    client = next(iter(clients))
 
     ##
     admin_user = 'ada'