diff --git a/HACKING.rst b/HACKING.rst index 0f8b94f9f3..12d4640c09 100644 --- a/HACKING.rst +++ b/HACKING.rst @@ -47,6 +47,7 @@ Nova Specific Commandments - [N334] Change assertTrue/False(A in/not in B, message) to the more specific assertIn/NotIn(A, B, message) - [N335] Check for usage of deprecated assertRaisesRegexp +- [N336] Must use a dict comprehension instead of a dict constructor with a sequence of key-value pairs. Creating Unit Tests ------------------- diff --git a/nova/api/ec2/ec2utils.py b/nova/api/ec2/ec2utils.py index a941f90b29..4c19767c06 100644 --- a/nova/api/ec2/ec2utils.py +++ b/nova/api/ec2/ec2utils.py @@ -440,8 +440,8 @@ def dict_from_dotted_str(items): def search_opts_from_filters(filters): - return dict((f['name'].replace('-', '_'), f['value']['1']) - for f in filters if f['value']['1']) if filters else {} + return {f['name'].replace('-', '_'): f['value']['1'] + for f in filters if f['value']['1']} if filters else {} def regex_from_ec2_regex(ec2_re): diff --git a/nova/api/openstack/compute/contrib/cells.py b/nova/api/openstack/compute/contrib/cells.py index 6a7793b359..8a9702546f 100644 --- a/nova/api/openstack/compute/contrib/cells.py +++ b/nova/api/openstack/compute/contrib/cells.py @@ -44,7 +44,7 @@ def _filter_keys(item, keys): item is a dict """ - return dict((k, v) for k, v in item.iteritems() if k in keys) + return {k: v for k, v in item.iteritems() if k in keys} def _fixup_cell_info(cell_info, keys): diff --git a/nova/api/openstack/compute/contrib/console_auth_tokens.py b/nova/api/openstack/compute/contrib/console_auth_tokens.py index a56e636b89..9b41f41bf4 100644 --- a/nova/api/openstack/compute/contrib/console_auth_tokens.py +++ b/nova/api/openstack/compute/contrib/console_auth_tokens.py @@ -47,10 +47,10 @@ class ConsoleAuthTokensController(wsgi.Controller): "accessible")) return {'console': - dict([(i, connect_info[i]) - for i in ['instance_uuid', 'host', 'port', - 'internal_access_path'] - if i in connect_info])} + {i: connect_info[i] + for i in ['instance_uuid', 'host', 'port', + 'internal_access_path'] + if i in connect_info}} class Console_auth_tokens(extensions.ExtensionDescriptor): diff --git a/nova/api/openstack/compute/contrib/hosts.py b/nova/api/openstack/compute/contrib/hosts.py index bf8201448e..7c96ce17a2 100644 --- a/nova/api/openstack/compute/contrib/hosts.py +++ b/nova/api/openstack/compute/contrib/hosts.py @@ -112,7 +112,7 @@ class HostController(object): context = req.environ['nova.context'] authorize(context) # See what the user wants to 'update' - params = dict([(k.strip().lower(), v) for k, v in body.iteritems()]) + params = {k.strip().lower(): v for k, v in body.iteritems()} orig_status = status = params.pop('status', None) orig_maint_mode = maint_mode = params.pop('maintenance_mode', None) # Validate the request diff --git a/nova/api/openstack/compute/contrib/instance_usage_audit_log.py b/nova/api/openstack/compute/contrib/instance_usage_audit_log.py index 90805469dc..5e4c2c0d01 100644 --- a/nova/api/openstack/compute/contrib/instance_usage_audit_log.py +++ b/nova/api/openstack/compute/contrib/instance_usage_audit_log.py @@ -100,11 +100,11 @@ class InstanceUsageAuditLogController(object): running_hosts.add(tlog['host']) total_errors += tlog['errors'] total_items += tlog['task_items'] - log = dict((tl['host'], dict(state=tl['state'], - instances=tl['task_items'], - errors=tl['errors'], - message=tl['message'])) - for tl in task_logs) + log = {tl['host']: dict(state=tl['state'], + instances=tl['task_items'], + errors=tl['errors'], + message=tl['message']) + for tl in task_logs} missing_hosts = hosts - seen_hosts overall_status = "%s hosts done. %s errors." % ( 'ALL' if len(done_hosts) == len(hosts) diff --git a/nova/api/openstack/compute/contrib/os_tenant_networks.py b/nova/api/openstack/compute/contrib/os_tenant_networks.py index 56fc00fea1..8925017d73 100644 --- a/nova/api/openstack/compute/contrib/os_tenant_networks.py +++ b/nova/api/openstack/compute/contrib/os_tenant_networks.py @@ -152,7 +152,7 @@ class NetworkController(object): network = body["network"] keys = ["cidr", "cidr_v6", "ipam", "vlan_start", "network_size", "num_networks"] - kwargs = dict((k, network.get(k)) for k in keys) + kwargs = {k: network.get(k) for k in keys} label = network["label"] diff --git a/nova/api/openstack/compute/contrib/quotas.py b/nova/api/openstack/compute/contrib/quotas.py index 163c743a50..6c0af03c70 100644 --- a/nova/api/openstack/compute/contrib/quotas.py +++ b/nova/api/openstack/compute/contrib/quotas.py @@ -97,7 +97,7 @@ class QuotaSetsController(wsgi.Controller): if usages: return values else: - return dict((k, v['limit']) for k, v in values.items()) + return {k: v['limit'] for k, v in values.items()} def show(self, req, id): context = req.environ['nova.context'] diff --git a/nova/api/openstack/compute/limits.py b/nova/api/openstack/compute/limits.py index 518205436c..4c586af25d 100644 --- a/nova/api/openstack/compute/limits.py +++ b/nova/api/openstack/compute/limits.py @@ -64,7 +64,7 @@ class LimitsController(object): project_id = req.params.get('tenant_id', context.project_id) quotas = QUOTAS.get_project_quotas(context, project_id, usages=False) - abs_limits = dict((k, v['limit']) for k, v in quotas.items()) + abs_limits = {k: v['limit'] for k, v in quotas.items()} rate_limits = req.environ.get("nova.limits", []) builder = self._get_view_builder(req) @@ -101,7 +101,7 @@ def create_resource(): class Limit(object): """Stores information about a limit for HTTP requests.""" - UNITS = dict([(v, k) for k, v in utils.TIME_UNITS.items()]) + UNITS = {v: k for k, v in utils.TIME_UNITS.items()} def __init__(self, verb, uri, regex, value, unit): """Initialize a new `Limit`. diff --git a/nova/api/openstack/compute/plugins/v3/cells.py b/nova/api/openstack/compute/plugins/v3/cells.py index 859c431b72..317e45a505 100644 --- a/nova/api/openstack/compute/plugins/v3/cells.py +++ b/nova/api/openstack/compute/plugins/v3/cells.py @@ -46,7 +46,7 @@ def _filter_keys(item, keys): """Filters all model attributes except for keys item is a dict """ - return dict((k, v) for k, v in item.iteritems() if k in keys) + return {k: v for k, v in item.iteritems() if k in keys} def _fixup_cell_info(cell_info, keys): diff --git a/nova/api/openstack/compute/plugins/v3/console_auth_tokens.py b/nova/api/openstack/compute/plugins/v3/console_auth_tokens.py index 280ee81e08..0047742905 100644 --- a/nova/api/openstack/compute/plugins/v3/console_auth_tokens.py +++ b/nova/api/openstack/compute/plugins/v3/console_auth_tokens.py @@ -52,10 +52,10 @@ class ConsoleAuthTokensController(wsgi.Controller): "accessible")) return {'console': - dict([(i, connect_info[i]) - for i in ['instance_uuid', 'host', 'port', - 'internal_access_path'] - if i in connect_info])} + {i: connect_info[i] + for i in ['instance_uuid', 'host', 'port', + 'internal_access_path'] + if i in connect_info}} class ConsoleAuthTokens(extensions.V3APIExtensionBase): diff --git a/nova/api/openstack/compute/plugins/v3/instance_usage_audit_log.py b/nova/api/openstack/compute/plugins/v3/instance_usage_audit_log.py index 4d872f1f2f..8305b8d03b 100644 --- a/nova/api/openstack/compute/plugins/v3/instance_usage_audit_log.py +++ b/nova/api/openstack/compute/plugins/v3/instance_usage_audit_log.py @@ -103,11 +103,11 @@ class InstanceUsageAuditLogController(wsgi.Controller): running_hosts.add(tlog['host']) total_errors += tlog['errors'] total_items += tlog['task_items'] - log = dict((tl['host'], dict(state=tl['state'], - instances=tl['task_items'], - errors=tl['errors'], - message=tl['message'])) - for tl in task_logs) + log = {tl['host']: dict(state=tl['state'], + instances=tl['task_items'], + errors=tl['errors'], + message=tl['message']) + for tl in task_logs} missing_hosts = hosts - seen_hosts overall_status = "%s hosts done. %s errors." % ( 'ALL' if len(done_hosts) == len(hosts) diff --git a/nova/api/openstack/compute/plugins/v3/limits.py b/nova/api/openstack/compute/plugins/v3/limits.py index 9fd844cf6c..662ec4db53 100644 --- a/nova/api/openstack/compute/plugins/v3/limits.py +++ b/nova/api/openstack/compute/plugins/v3/limits.py @@ -34,7 +34,7 @@ class LimitsController(wsgi.Controller): project_id = req.params.get('tenant_id', context.project_id) quotas = QUOTAS.get_project_quotas(context, project_id, usages=False) - abs_limits = dict((k, v['limit']) for k, v in quotas.items()) + abs_limits = {k: v['limit'] for k, v in quotas.items()} rate_limits = req.environ.get("nova.limits", []) builder = self._get_view_builder(req) diff --git a/nova/api/openstack/compute/plugins/v3/quota_sets.py b/nova/api/openstack/compute/plugins/v3/quota_sets.py index f9f57ebc69..dabda37963 100644 --- a/nova/api/openstack/compute/plugins/v3/quota_sets.py +++ b/nova/api/openstack/compute/plugins/v3/quota_sets.py @@ -80,7 +80,7 @@ class QuotaSetsController(wsgi.Controller): if usages: return values else: - return dict((k, v['limit']) for k, v in values.items()) + return {k: v['limit'] for k, v in values.items()} @extensions.expected_errors(403) def show(self, req, id): diff --git a/nova/api/openstack/compute/plugins/v3/tenant_networks.py b/nova/api/openstack/compute/plugins/v3/tenant_networks.py index 6f1cb2e2dd..0261cedb07 100644 --- a/nova/api/openstack/compute/plugins/v3/tenant_networks.py +++ b/nova/api/openstack/compute/plugins/v3/tenant_networks.py @@ -144,7 +144,7 @@ class TenantNetworkController(wsgi.Controller): network = body["network"] keys = ["cidr", "cidr_v6", "ipam", "vlan_start", "network_size", "num_networks"] - kwargs = dict((k, network.get(k)) for k in keys) + kwargs = {k: network.get(k) for k in keys} label = network["label"] diff --git a/nova/block_device.py b/nova/block_device.py index 13b9eec4f8..31a9cbc593 100644 --- a/nova/block_device.py +++ b/nova/block_device.py @@ -86,9 +86,7 @@ class BlockDeviceDict(dict): if bdm_dict.get('device_name'): bdm_dict['device_name'] = prepend_dev(bdm_dict['device_name']) # NOTE (ndipanov): Never default db fields - self.update( - dict((field, None) - for field in self._fields - do_not_default)) + self.update({field: None for field in self._fields - do_not_default}) self.update(list(bdm_dict.iteritems())) def _validate(self, bdm_dict): @@ -139,8 +137,8 @@ class BlockDeviceDict(dict): non_computable_fields = set(['boot_index', 'disk_bus', 'guest_format', 'device_type']) - new_bdm = dict((fld, val) for fld, val in legacy_bdm.iteritems() - if fld in copy_over_fields) + new_bdm = {fld: val for fld, val in legacy_bdm.iteritems() + if fld in copy_over_fields} virt_name = legacy_bdm.get('virtual_name') @@ -203,8 +201,8 @@ class BlockDeviceDict(dict): copy_over_fields |= (bdm_db_only_fields | bdm_db_inherited_fields) - legacy_block_device = dict((field, self.get(field)) - for field in copy_over_fields if field in self) + legacy_block_device = {field: self.get(field) + for field in copy_over_fields if field in self} source_type = self.get('source_type') destination_type = self.get('destination_type') diff --git a/nova/cells/state.py b/nova/cells/state.py index 2258fa5a0d..326218ce3b 100644 --- a/nova/cells/state.py +++ b/nova/cells/state.py @@ -74,9 +74,8 @@ class CellState(object): def update_db_info(self, cell_db_info): """Update cell credentials from db.""" - self.db_info = dict( - [(k, v) for k, v in cell_db_info.iteritems() - if k != 'name']) + self.db_info = {k: v for k, v in cell_db_info.iteritems() + if k != 'name'} def update_capabilities(self, cell_metadata): """Update cell capabilities for a cell.""" @@ -440,7 +439,7 @@ class CellStateManagerDB(CellStateManager): self.last_cell_db_check = timeutils.utcnow() ctxt = context.get_admin_context() db_cells = self.db.cell_get_all(ctxt) - db_cells_dict = dict((cell['name'], cell) for cell in db_cells) + db_cells_dict = {cell['name']: cell for cell in db_cells} self._refresh_cells_from_dict(db_cells_dict) self._update_our_capacity(ctxt) diff --git a/nova/cmd/manage.py b/nova/cmd/manage.py index 485b1741a1..ba95213ea8 100644 --- a/nova/cmd/manage.py +++ b/nova/cmd/manage.py @@ -536,8 +536,8 @@ class NetworkCommands(object): dns1=None, dns2=None, project_id=None, priority=None, uuid=None, fixed_cidr=None): """Creates fixed ips for host by range.""" - kwargs = dict(((k, v) for k, v in locals().iteritems() - if v and k != "self")) + kwargs = {k: v for k, v in locals().iteritems() + if v and k != "self"} if multi_host is not None: kwargs['multi_host'] = multi_host == 'T' net_manager = importutils.import_object(CONF.network_manager) diff --git a/nova/compute/api.py b/nova/compute/api.py index 730236ca82..2ef01ae717 100644 --- a/nova/compute/api.py +++ b/nova/compute/api.py @@ -254,7 +254,7 @@ def _diff_dict(orig, new): element, giving the updated value. """ # Figure out what keys went away - result = dict((k, ['-']) for k in set(orig.keys()) - set(new.keys())) + result = {k: ['-'] for k in set(orig.keys()) - set(new.keys())} # Compute the updates for key, value in new.items(): if key not in orig or value != orig[key]: @@ -358,9 +358,9 @@ class API(base.Base): raise exception.OnsetFileContentLimitExceeded() def _get_headroom(self, quotas, usages, deltas): - headroom = dict((res, quotas[res] - - (usages[res]['in_use'] + usages[res]['reserved'])) - for res in quotas.keys()) + headroom = {res: quotas[res] - + (usages[res]['in_use'] + usages[res]['reserved']) + for res in quotas.keys()} # If quota_cores is unlimited [-1]: # - set cores headroom based on instances headroom: if quotas.get('cores') == -1: diff --git a/nova/compute/manager.py b/nova/compute/manager.py index 3ec0782504..140504ce86 100644 --- a/nova/compute/manager.py +++ b/nova/compute/manager.py @@ -704,7 +704,7 @@ class ComputeManager(manager.Manager): driver_instances = self.driver.list_instances() instances = objects.InstanceList.get_by_filters(context, filters, use_slave=True) - name_map = dict((instance.name, instance) for instance in instances) + name_map = {instance.name: instance for instance in instances} local_instances = [] for driver_instance in driver_instances: instance = name_map.get(driver_instance) diff --git a/nova/compute/monitors/__init__.py b/nova/compute/monitors/__init__.py index 9e214fc55d..e6435e3e30 100644 --- a/nova/compute/monitors/__init__.py +++ b/nova/compute/monitors/__init__.py @@ -152,8 +152,7 @@ class ResourceMonitorHandler(loadables.BaseLoader): """ monitor_classes = self.get_matching_classes( CONF.compute_available_monitors) - monitor_class_map = dict((cls.__name__, cls) - for cls in monitor_classes) + monitor_class_map = {cls.__name__: cls for cls in monitor_classes} monitor_cls_names = CONF.compute_monitors good_monitors = [] bad_monitors = [] diff --git a/nova/db/sqlalchemy/api.py b/nova/db/sqlalchemy/api.py index ac7b828561..eda8180935 100644 --- a/nova/db/sqlalchemy/api.py +++ b/nova/db/sqlalchemy/api.py @@ -659,8 +659,8 @@ def compute_node_statistics(context): fields = ('count', 'vcpus', 'memory_mb', 'local_gb', 'vcpus_used', 'memory_mb_used', 'local_gb_used', 'free_ram_mb', 'free_disk_gb', 'current_workload', 'running_vms', 'disk_available_least') - return dict((field, int(result[idx] or 0)) - for idx, field in enumerate(fields)) + return {field: int(result[idx] or 0) + for idx, field in enumerate(fields)} ################### @@ -3481,8 +3481,8 @@ def quota_reserve(context, resources, project_quotas, user_quotas, deltas, usages = project_usages else: usages = user_usages - usages = dict((k, dict(in_use=v['in_use'], reserved=v['reserved'])) - for k, v in usages.items()) + usages = {k: dict(in_use=v['in_use'], reserved=v['reserved']) + for k, v in usages.items()} LOG.debug('Raise OverQuota exception because: ' 'project_quotas: %(project_quotas)s, ' 'user_quotas: %(user_quotas)s, deltas: %(deltas)s, ' @@ -4503,8 +4503,8 @@ def _dict_with_extra_specs(inst_type_query): """ inst_type_dict = dict(inst_type_query) - extra_specs = dict([(x['key'], x['value']) - for x in inst_type_query['extra_specs']]) + extra_specs = {x['key']: x['value'] + for x in inst_type_query['extra_specs']} inst_type_dict['extra_specs'] = extra_specs return inst_type_dict @@ -4711,7 +4711,7 @@ def _flavor_extra_specs_get_query(context, flavor_id, session=None): @require_context def flavor_extra_specs_get(context, flavor_id): rows = _flavor_extra_specs_get_query(context, flavor_id).all() - return dict([(row['key'], row['value']) for row in rows]) + return {row['key']: row['value'] for row in rows} @require_context @@ -4835,7 +4835,7 @@ def _instance_metadata_get_query(context, instance_uuid, session=None): @require_context def instance_metadata_get(context, instance_uuid): rows = _instance_metadata_get_query(context, instance_uuid).all() - return dict((row['key'], row['value']) for row in rows) + return {row['key']: row['value'] for row in rows} @require_context @@ -4901,7 +4901,7 @@ def _instance_system_metadata_get_query(context, instance_uuid, session=None): @require_context def instance_system_metadata_get(context, instance_uuid): rows = _instance_system_metadata_get_query(context, instance_uuid).all() - return dict((row['key'], row['value']) for row in rows) + return {row['key']: row['value'] for row in rows} @require_context @@ -5417,7 +5417,7 @@ def aggregate_metadata_get(context, aggregate_id): models.AggregateMetadata).\ filter_by(aggregate_id=aggregate_id).all() - return dict([(r['key'], r['value']) for r in rows]) + return {r['key']: r['value'] for r in rows} @require_aggregate_exists diff --git a/nova/db/sqlalchemy/models.py b/nova/db/sqlalchemy/models.py index 82f6a58f87..0d876105f9 100644 --- a/nova/db/sqlalchemy/models.py +++ b/nova/db/sqlalchemy/models.py @@ -1132,7 +1132,7 @@ class Aggregate(BASE, NovaBase): @property def metadetails(self): - return dict([(m.key, m.value) for m in self._metadata]) + return {m.key: m.value for m in self._metadata} @property def availability_zone(self): diff --git a/nova/db/sqlalchemy/utils.py b/nova/db/sqlalchemy/utils.py index 77733b5362..0e4b335f98 100644 --- a/nova/db/sqlalchemy/utils.py +++ b/nova/db/sqlalchemy/utils.py @@ -60,8 +60,8 @@ def check_shadow_table(migrate_engine, table_name): shadow_table = Table(db._SHADOW_TABLE_PREFIX + table_name, meta, autoload=True) - columns = dict([(c.name, c) for c in table.columns]) - shadow_columns = dict([(c.name, c) for c in shadow_table.columns]) + columns = {c.name: c for c in table.columns} + shadow_columns = {c.name: c for c in shadow_table.columns} for name, column in columns.iteritems(): if name not in shadow_columns: diff --git a/nova/exception.py b/nova/exception.py index 13d74ecfb3..24180196af 100644 --- a/nova/exception.py +++ b/nova/exception.py @@ -55,7 +55,7 @@ class ConvertedException(webob.exc.WSGIHTTPException): def _cleanse_dict(original): """Strip all admin_password, new_pass, rescue_pass keys from a dict.""" - return dict((k, v) for k, v in original.iteritems() if "_pass" not in k) + return {k: v for k, v in original.iteritems() if "_pass" not in k} def wrap_exception(notifier=None, get_notifier=None): diff --git a/nova/hacking/checks.py b/nova/hacking/checks.py index d49b6ebc0b..2495bb229c 100644 --- a/nova/hacking/checks.py +++ b/nova/hacking/checks.py @@ -91,6 +91,7 @@ underscore_import_check = re.compile(r"(.)*import _(.)*") # We need this for cases where they have created their own _ function. custom_underscore_check = re.compile(r"(.)*_\s*=\s*(.)*") api_version_re = re.compile(r"@.*api_version") +dict_constructor_with_list_copy_re = re.compile(r".*\bdict\((\[)?(\(|\[)") # TODO(dims): When other oslo libraries switch over non-namespace'd # imports, we need to add them to the regexp below. @@ -490,6 +491,14 @@ def assert_raises_regexp(logical_line): "of assertRaisesRegexp") +def dict_constructor_with_list_copy(logical_line): + msg = ("N336: Must use a dict comprehension instead of a dict constructor" + " with a sequence of key-value pairs." + ) + if dict_constructor_with_list_copy_re.match(logical_line): + yield (0, msg) + + def factory(register): register(import_no_db_in_virt) register(no_db_session_in_public_api) @@ -513,3 +522,4 @@ def factory(register): register(CheckForTransAdd) register(check_oslo_namespace_imports) register(assert_true_or_false_with_in) + register(dict_constructor_with_list_copy) diff --git a/nova/network/model.py b/nova/network/model.py index 23888dc888..b5b1b64764 100644 --- a/nova/network/model.py +++ b/nova/network/model.py @@ -26,7 +26,7 @@ from nova.i18n import _ def ensure_string_keys(d): # http://bugs.python.org/issue4978 - return dict([(str(k), v) for k, v in d.iteritems()]) + return {str(k): v for k, v in d.iteritems()} # Constants for the 'vif_type' field in VIF class VIF_TYPE_OVS = 'ovs' diff --git a/nova/network/neutronv2/api.py b/nova/network/neutronv2/api.py index a8811a6ea2..4c30642ee5 100644 --- a/nova/network/neutronv2/api.py +++ b/nova/network/neutronv2/api.py @@ -537,8 +537,7 @@ class API(base_api.NetworkAPI): extensions_list = neutron.list_extensions()['extensions'] self.last_neutron_extension_sync = time.time() self.extensions.clear() - self.extensions = dict((ext['name'], ext) - for ext in extensions_list) + self.extensions = {ext['name']: ext for ext in extensions_list} def _has_port_binding_extension(self, context, refresh_cache=False, neutron=None): @@ -1099,12 +1098,12 @@ class API(base_api.NetworkAPI): def _setup_pools_dict(self, client): pools = self._get_floating_ip_pools(client) - return dict([(i['id'], i) for i in pools]) + return {i['id']: i for i in pools} def _setup_ports_dict(self, client, project_id=None): search_opts = {'tenant_id': project_id} if project_id else {} ports = client.list_ports(**search_opts)['ports'] - return dict([(p['id'], p) for p in ports]) + return {p['id']: p for p in ports} def get_floating_ip(self, context, id): """Return floating ip object given the floating ip id.""" diff --git a/nova/objects/base.py b/nova/objects/base.py index 2efe831255..7d5f4406c1 100644 --- a/nova/objects/base.py +++ b/nova/objects/base.py @@ -780,8 +780,8 @@ class NovaObjectSerializer(messaging.NoOpSerializer): """ iterable = values.__class__ if issubclass(iterable, dict): - return iterable(**dict((k, action_fn(context, v)) - for k, v in six.iteritems(values))) + return iterable(**{k: action_fn(context, v) + for k, v in six.iteritems(values)}) else: # NOTE(danms): A set can't have an unhashable value inside, such as # a dict. Convert sets to tuples, which is fine, since we can't diff --git a/nova/objects/fields.py b/nova/objects/fields.py index 5aee74d220..26a1c0768b 100644 --- a/nova/objects/fields.py +++ b/nova/objects/fields.py @@ -455,15 +455,15 @@ class DictProxyField(object): return self if getattr(obj, self._fld_name) is None: return - return dict((self._key_type(k), v) - for k, v in six.iteritems(getattr(obj, self._fld_name))) + return {self._key_type(k): v + for k, v in six.iteritems(getattr(obj, self._fld_name))} def __set__(self, obj, val): if val is None: setattr(obj, self._fld_name, val) else: - setattr(obj, self._fld_name, dict((six.text_type(k), v) - for k, v in six.iteritems(val))) + setattr(obj, self._fld_name, {six.text_type(k): v + for k, v in six.iteritems(val)}) class Set(CompoundFieldType): diff --git a/nova/pci/stats.py b/nova/pci/stats.py index d49d723dc9..03fe60566a 100644 --- a/nova/pci/stats.py +++ b/nova/pci/stats.py @@ -85,7 +85,7 @@ class PciDeviceStats(object): if not devspec: return tags = devspec.get_tags() - pool = dict((k, dev.get(k)) for k in self.pool_keys) + pool = {k: dev.get(k) for k in self.pool_keys} if tags: pool.update(tags) return pool @@ -217,7 +217,7 @@ class PciDeviceStats(object): # 'devices' shouldn't be part of stats pools = [] for pool in self.pools: - tmp = dict((k, v) for k, v in pool.iteritems() if k != 'devices') + tmp = {k: v for k, v in pool.iteritems() if k != 'devices'} pools.append(tmp) return iter(pools) diff --git a/nova/quota.py b/nova/quota.py index 71d0eff5cd..a19959e387 100644 --- a/nova/quota.py +++ b/nova/quota.py @@ -372,8 +372,8 @@ class DbQuotaDriver(object): else: sync_filt = lambda x: not hasattr(x, 'sync') desired = set(keys) - sub_resources = dict((k, v) for k, v in resources.items() - if k in desired and sync_filt(v)) + sub_resources = {k: v for k, v in resources.items() + if k in desired and sync_filt(v)} # Make sure we accounted for all of them... if len(keys) != len(sub_resources): @@ -394,7 +394,7 @@ class DbQuotaDriver(object): usages=False, project_quotas=project_quotas) - return dict((k, v['limit']) for k, v in quotas.items()) + return {k: v['limit'] for k, v in quotas.items()} def limit_check(self, context, resources, values, project_id=None, user_id=None): diff --git a/nova/scheduler/host_manager.py b/nova/scheduler/host_manager.py index 8194174571..5f81fca642 100644 --- a/nova/scheduler/host_manager.py +++ b/nova/scheduler/host_manager.py @@ -283,8 +283,7 @@ class HostManager(object): self.filter_handler = filters.HostFilterHandler() filter_classes = self.filter_handler.get_matching_classes( CONF.scheduler_available_filters) - self.filter_cls_map = dict( - (cls.__name__, cls) for cls in filter_classes) + self.filter_cls_map = {cls.__name__: cls for cls in filter_classes} self.filter_obj_map = {} self.weight_handler = weights.HostWeightHandler() weigher_classes = self.weight_handler.get_matching_classes( @@ -372,7 +371,7 @@ class HostManager(object): if ignore_hosts or force_hosts or force_nodes: # NOTE(deva): we can't assume "host" is unique because # one host may have many nodes. - name_to_cls_map = dict([((x.host, x.nodename), x) for x in hosts]) + name_to_cls_map = {(x.host, x.nodename): x for x in hosts} if ignore_hosts: _strip_ignore_hosts(name_to_cls_map, ignore_hosts) if not name_to_cls_map: diff --git a/nova/tests/functional/test_servers.py b/nova/tests/functional/test_servers.py index 6b294cfc11..35fb6effc9 100644 --- a/nova/tests/functional/test_servers.py +++ b/nova/tests/functional/test_servers.py @@ -316,7 +316,7 @@ class ServersTest(integrated_helpers._IntegratedTestBase): # The server should also be in the all-servers details list servers = self.api.get_servers(detail=True) - server_map = dict((server['id'], server) for server in servers) + server_map = {server['id']: server for server in servers} found_server = server_map.get(created_server_id) self.assertTrue(found_server) # Details do include metadata @@ -324,7 +324,7 @@ class ServersTest(integrated_helpers._IntegratedTestBase): # The server should also be in the all-servers summary list servers = self.api.get_servers(detail=False) - server_map = dict((server['id'], server) for server in servers) + server_map = {server['id']: server for server in servers} found_server = server_map.get(created_server_id) self.assertTrue(found_server) # Summary should not include metadata @@ -453,7 +453,7 @@ class ServersTest(integrated_helpers._IntegratedTestBase): # lookup servers created by the first request. servers = self.api.get_servers(detail=True, search_opts={'reservation_id': reservation_id}) - server_map = dict((server['id'], server) for server in servers) + server_map = {server['id']: server for server in servers} found_server = server_map.get(created_server_id) # The server from the 2nd request should not be there. self.assertIsNone(found_server) diff --git a/nova/tests/unit/api/openstack/compute/contrib/test_quotas.py b/nova/tests/unit/api/openstack/compute/contrib/test_quotas.py index 0fa402ad75..dd90ccd1ef 100644 --- a/nova/tests/unit/api/openstack/compute/contrib/test_quotas.py +++ b/nova/tests/unit/api/openstack/compute/contrib/test_quotas.py @@ -347,7 +347,7 @@ class ExtendedQuotasTestV21(BaseQuotaSetsTest): if usages: return self.fake_quotas else: - return dict((k, v['limit']) for k, v in self.fake_quotas.items()) + return {k: v['limit'] for k, v in self.fake_quotas.items()} def fake_get_settable_quotas(self, context, project_id, user_id=None): return { diff --git a/nova/tests/unit/api/openstack/compute/test_limits.py b/nova/tests/unit/api/openstack/compute/test_limits.py index 29f15fe3b9..0c7615ddf1 100644 --- a/nova/tests/unit/api/openstack/compute/test_limits.py +++ b/nova/tests/unit/api/openstack/compute/test_limits.py @@ -62,8 +62,8 @@ class BaseLimitTestSuite(test.NoDBTestCase): self.absolute_limits = {} def stub_get_project_quotas(context, project_id, usages=True): - return dict((k, dict(limit=v)) - for k, v in self.absolute_limits.items()) + return {k: dict(limit=v) + for k, v in self.absolute_limits.items()} self.stubs.Set(nova.quota.QUOTAS, "get_project_quotas", stub_get_project_quotas) @@ -197,8 +197,7 @@ class LimitsControllerTestV21(BaseLimitTestSuite): } def _get_project_quotas(context, project_id, usages=True): - return dict((k, dict(limit=v)) - for k, v in self.absolute_limits.items()) + return {k: dict(limit=v) for k, v in self.absolute_limits.items()} with mock.patch('nova.quota.QUOTAS.get_project_quotas') as \ get_project_quotas: diff --git a/nova/tests/unit/compute/test_compute.py b/nova/tests/unit/compute/test_compute.py index d22ea09d61..78c6d51cdd 100644 --- a/nova/tests/unit/compute/test_compute.py +++ b/nova/tests/unit/compute/test_compute.py @@ -5815,10 +5815,10 @@ class ComputeTestCase(BaseTestCase): self.assertIsNone(instances[0]['task_state']) def _fill_fault(self, values): - extra = dict([(x, None) for x in ['created_at', - 'deleted_at', - 'updated_at', - 'deleted']]) + extra = {x: None for x in ['created_at', + 'deleted_at', + 'updated_at', + 'deleted']} extra['id'] = 1 extra['details'] = '' extra.update(values) @@ -7579,8 +7579,8 @@ class ComputeAPITestCase(BaseTestCase): instance.refresh() self.assertEqual(instance.task_state, task_states.REBUILDING) - sys_meta = dict([(k, v) for k, v in instance.system_metadata.items() - if not k.startswith('instance_type')]) + sys_meta = {k: v for k, v in instance.system_metadata.items() + if not k.startswith('instance_type')} self.assertEqual(sys_meta, {'image_kernel_id': 'fake_kernel_id', 'image_min_disk': '1', diff --git a/nova/tests/unit/compute/test_compute_api.py b/nova/tests/unit/compute/test_compute_api.py index c9f90289d9..a6c0c483f0 100644 --- a/nova/tests/unit/compute/test_compute_api.py +++ b/nova/tests/unit/compute/test_compute_api.py @@ -164,8 +164,8 @@ class _ComputeAPIUnitTestMixIn(object): self.mox.StubOutWithMock(quota.QUOTAS, "reserve") quotas = {'instances': 1, 'cores': 1, 'ram': 1} - usages = dict((r, {'in_use': 1, 'reserved': 1}) for r in - ['instances', 'cores', 'ram']) + usages = {r: {'in_use': 1, 'reserved': 1} for r in + ['instances', 'cores', 'ram']} quota_exception = exception.OverQuota(quotas=quotas, usages=usages, overs=['instances']) diff --git a/nova/tests/unit/compute/test_resource_tracker.py b/nova/tests/unit/compute/test_resource_tracker.py index e7f259d092..ceaba9e210 100644 --- a/nova/tests/unit/compute/test_resource_tracker.py +++ b/nova/tests/unit/compute/test_resource_tracker.py @@ -1201,7 +1201,7 @@ class ResizeClaimTestCase(BaseTrackerTestCase): src_dict = { 'memory_mb': 1, 'root_gb': 1, 'ephemeral_gb': 0, 'vcpus': 1} - dest_dict = dict((k, v + 1) for (k, v) in src_dict.iteritems()) + dest_dict = {k: v + 1 for (k, v) in src_dict.iteritems()} src_type = self._fake_flavor_create( id=10, name="srcflavor", **src_dict) dest_type = self._fake_flavor_create( diff --git a/nova/tests/unit/db/test_db_api.py b/nova/tests/unit/db/test_db_api.py index d45cc0c9a1..d17ecf4823 100644 --- a/nova/tests/unit/db/test_db_api.py +++ b/nova/tests/unit/db/test_db_api.py @@ -1240,8 +1240,8 @@ class ModelsObjectComparatorMixin(object): def _dict_from_object(self, obj, ignored_keys): if ignored_keys is None: ignored_keys = [] - return dict([(k, v) for k, v in obj.iteritems() - if k not in ignored_keys]) + return {k: v for k, v in obj.iteritems() + if k not in ignored_keys} def _assertEqualObjects(self, obj1, obj2, ignored_keys=None): obj1 = self._dict_from_object(obj1, ignored_keys) @@ -6478,8 +6478,8 @@ class CertificateTestCase(test.TestCase, ModelsObjectComparatorMixin): 'project_id': 'project', 'file_name': 'filename' } - return [dict((k, v + str(x)) for k, v in base_values.iteritems()) - for x in xrange(1, 4)] + return [{k: v + str(x) for k, v in base_values.iteritems()} + for x in xrange(1, 4)] def _certificates_create(self): return [db.certificate_create(self.ctxt, cert) @@ -6535,11 +6535,11 @@ class ConsoleTestCase(test.TestCase, ModelsObjectComparatorMixin): for val in pools_data] instance_uuid = uuidutils.generate_uuid() db.instance_create(self.ctxt, {'uuid': instance_uuid}) - self.console_data = [dict([('instance_name', 'name' + str(x)), - ('instance_uuid', instance_uuid), - ('password', 'pass' + str(x)), - ('port', 7878 + x), - ('pool_id', self.console_pools[x]['id'])]) + self.console_data = [{'instance_name': 'name' + str(x), + 'instance_uuid': instance_uuid, + 'password': 'pass' + str(x), + 'port': 7878 + x, + 'pool_id': self.console_pools[x]['id']} for x in xrange(len(pools_data))] self.consoles = [db.console_create(self.ctxt, val) for val in self.console_data] @@ -6644,8 +6644,8 @@ class CellTestCase(test.TestCase, ModelsObjectComparatorMixin): def _create_cells(self): test_values = [] for x in xrange(1, 4): - modified_val = dict([(k, self._cell_value_modify(v, x)) - for k, v in self._get_cell_base_values().iteritems()]) + modified_val = {k: self._cell_value_modify(v, x) + for k, v in self._get_cell_base_values().iteritems()} db.cell_create(self.ctxt, modified_val) test_values.append(modified_val) return test_values @@ -6689,8 +6689,8 @@ class CellTestCase(test.TestCase, ModelsObjectComparatorMixin): new_cells = self._create_cells() cells = db.cell_get_all(self.ctxt) self.assertEqual(len(new_cells), len(cells)) - cells_byname = dict([(newcell['name'], - newcell) for newcell in new_cells]) + cells_byname = {newcell['name']: newcell + for newcell in new_cells} for cell in cells: self._assertEqualObjects(cell, cells_byname[cell['name']], self._ignored_keys) diff --git a/nova/tests/unit/fake_ldap.py b/nova/tests/unit/fake_ldap.py index aea46c94c7..ca834b3d0a 100644 --- a/nova/tests/unit/fake_ldap.py +++ b/nova/tests/unit/fake_ldap.py @@ -234,7 +234,7 @@ class FakeLDAP(object): raise SERVER_DOWN() key = "%s%s" % (self.__prefix, dn) - value_dict = dict([(k, _to_json(v)) for k, v in attr]) + value_dict = {k: _to_json(v) for k, v in attr} Store.instance().hmset(key, value_dict) def delete_s(self, dn): @@ -313,13 +313,12 @@ class FakeLDAP(object): # get the attributes from the store attrs = store.hgetall(key) # turn the values from the store into lists - attrs = dict([(k, _from_json(v)) - for k, v in attrs.iteritems()]) + attrs = {k: _from_json(v) for k, v in attrs.iteritems()} # filter the objects by query if not query or _match_query(query, attrs): # filter the attributes by fields - attrs = dict([(k, v) for k, v in attrs.iteritems() - if not fields or k in fields]) + attrs = {k: v for k, v in attrs.iteritems() + if not fields or k in fields} objects.append((key[len(self.__prefix):], attrs)) return objects diff --git a/nova/tests/unit/policy_fixture.py b/nova/tests/unit/policy_fixture.py index cf28875240..29a808416f 100644 --- a/nova/tests/unit/policy_fixture.py +++ b/nova/tests/unit/policy_fixture.py @@ -41,8 +41,8 @@ class PolicyFixture(fixtures.Fixture): def set_rules(self, rules): policy = nova.policy._ENFORCER - policy.set_rules(dict((k, common_policy.parse_rule(v)) - for k, v in rules.items())) + policy.set_rules({k: common_policy.parse_rule(v) + for k, v in rules.items()}) class RoleBasedPolicyFixture(fixtures.Fixture): diff --git a/nova/tests/unit/test_hacking.py b/nova/tests/unit/test_hacking.py index e20ce8c05f..78b994cccf 100644 --- a/nova/tests/unit/test_hacking.py +++ b/nova/tests/unit/test_hacking.py @@ -455,3 +455,31 @@ class HackingTestCase(test.NoDBTestCase): """ errors = [] self._assert_has_errors(code, checker, expected_errors=errors) + + def test_dict_constructor_with_list_copy(self): + self.assertEqual(1, len(list(checks.dict_constructor_with_list_copy( + " dict([(i, connect_info[i])")))) + + self.assertEqual(1, len(list(checks.dict_constructor_with_list_copy( + " attrs = dict([(k, _from_json(v))")))) + + self.assertEqual(1, len(list(checks.dict_constructor_with_list_copy( + " type_names = dict((value, key) for key, value in")))) + + self.assertEqual(1, len(list(checks.dict_constructor_with_list_copy( + " dict((value, key) for key, value in")))) + + self.assertEqual(1, len(list(checks.dict_constructor_with_list_copy( + "foo(param=dict((k, v) for k, v in bar.items()))")))) + + self.assertEqual(1, len(list(checks.dict_constructor_with_list_copy( + " dict([[i,i] for i in range(3)])")))) + + self.assertEqual(1, len(list(checks.dict_constructor_with_list_copy( + " dd = dict([i,i] for i in range(3))")))) + + self.assertEqual(0, len(list(checks.dict_constructor_with_list_copy( + " create_kwargs = dict(snapshot=snapshot,")))) + + self.assertEqual(0, len(list(checks.dict_constructor_with_list_copy( + " self._render_dict(xml, data_el, data.__dict__)")))) diff --git a/nova/tests/unit/test_policy.py b/nova/tests/unit/test_policy.py index 59663076be..725a80f7c3 100644 --- a/nova/tests/unit/test_policy.py +++ b/nova/tests/unit/test_policy.py @@ -75,8 +75,8 @@ class PolicyTestCase(test.NoDBTestCase): } policy.reset() policy.init() - policy.set_rules(dict((k, common_policy.parse_rule(v)) - for k, v in rules.items())) + policy.set_rules({k: common_policy.parse_rule(v) + for k, v in rules.items()}) self.context = context.RequestContext('fake', 'fake', roles=['member']) self.target = {} @@ -161,8 +161,8 @@ class DefaultPolicyTestCase(test.NoDBTestCase): def _set_rules(self, default_rule): policy.reset() - rules = dict((k, common_policy.parse_rule(v)) - for k, v in self.rules.items()) + rules = {k: common_policy.parse_rule(v) + for k, v in self.rules.items()} policy.init(rules=rules, default_rule=default_rule, use_conf=False) def test_policy_called(self): diff --git a/nova/tests/unit/test_quota.py b/nova/tests/unit/test_quota.py index 41bca1b3c9..df8c12dbac 100644 --- a/nova/tests/unit/test_quota.py +++ b/nova/tests/unit/test_quota.py @@ -1960,8 +1960,7 @@ class DbQuotaDriverTestCase(test.TestCase): usages=True, remains=False, project_quotas=None): self.calls.append('get_project_quotas') - return dict((k, dict(limit=v.default)) - for k, v in resources.items()) + return {k: dict(limit=v.default) for k, v in resources.items()} self.stubs.Set(self.driver, 'get_project_quotas', fake_get_project_quotas) diff --git a/nova/tests/unit/virt/vmwareapi/fake.py b/nova/tests/unit/virt/vmwareapi/fake.py index e5ed91da2c..8112e97ccc 100644 --- a/nova/tests/unit/virt/vmwareapi/fake.py +++ b/nova/tests/unit/virt/vmwareapi/fake.py @@ -274,8 +274,8 @@ class ManagedObject(object): return prefix + "-" + str(self.__class__._counter) def __repr__(self): - return jsonutils.dumps(dict([(elem.name, elem.val) - for elem in self.propSet])) + return jsonutils.dumps({elem.name: elem.val + for elem in self.propSet}) class DataObject(object): diff --git a/nova/tests/unit/virt/vmwareapi/test_driver_api.py b/nova/tests/unit/virt/vmwareapi/test_driver_api.py index 0486f56e3a..7d828dc39a 100644 --- a/nova/tests/unit/virt/vmwareapi/test_driver_api.py +++ b/nova/tests/unit/virt/vmwareapi/test_driver_api.py @@ -1658,7 +1658,7 @@ class VMwareAPIVMTestCase(test.NoDBTestCase): 'overallCpuUsage': 0, 'powerState': 'poweredOn', 'cpuReservation': 0, 'overallCpuDemand': 0, 'numVirtualDisks': 1, 'hostMemoryUsage': 141} - expected = dict([('vmware:' + k, v) for k, v in expected.items()]) + expected = {'vmware:' + k: v for k, v in expected.items()} self.assertThat( self.conn.get_diagnostics({'name': 1, 'uuid': self.uuid, 'node': self.instance_node}), diff --git a/nova/virt/block_device.py b/nova/virt/block_device.py index 495692694e..d32da09314 100644 --- a/nova/virt/block_device.py +++ b/nova/virt/block_device.py @@ -96,8 +96,7 @@ class DriverBlockDevice(dict): if self._bdm_obj.no_device: raise _NotTransformable() - self.update(dict((field, None) - for field in self._fields)) + self.update({field: None for field in self._fields}) self._transform() def __getattr__(self, name): @@ -122,7 +121,7 @@ class DriverBlockDevice(dict): Basic method will just drop the fields that are not in _legacy_fields set. Override this in subclass if needed. """ - return dict((key, self.get(key)) for key in self._legacy_fields) + return {key: self.get(key) for key in self._legacy_fields} def attach(self, **kwargs): """Make the device available to be used by VMs. @@ -201,8 +200,8 @@ class DriverVolumeBlockDevice(DriverBlockDevice): raise _InvalidType self.update( - dict((k, v) for k, v in self._bdm_obj.iteritems() - if k in self._new_fields | set(['delete_on_termination'])) + {k: v for k, v in self._bdm_obj.iteritems() + if k in self._new_fields | set(['delete_on_termination'])} ) self['mount_device'] = self._bdm_obj.device_name try: diff --git a/nova/virt/hyperv/vmutils.py b/nova/virt/hyperv/vmutils.py index b826b781f7..404ccf5eac 100644 --- a/nova/virt/hyperv/vmutils.py +++ b/nova/virt/hyperv/vmutils.py @@ -94,8 +94,8 @@ class VMUtils(object): constants.HYPERV_VM_STATE_SUSPENDED: 32769} def __init__(self, host='.'): - self._enabled_states_map = dict((v, k) for k, v in - self._vm_power_states_map.iteritems()) + self._enabled_states_map = {v: k for k, v in + self._vm_power_states_map.iteritems()} if sys.platform == 'win32': self._init_hyperv_wmi_conn(host) self._conn_cimv2 = wmi.WMI(moniker='//%s/root/cimv2' % host) diff --git a/nova/virt/libvirt/blockinfo.py b/nova/virt/libvirt/blockinfo.py index 8916a9ee0b..86a9b5f4ca 100644 --- a/nova/virt/libvirt/blockinfo.py +++ b/nova/virt/libvirt/blockinfo.py @@ -365,8 +365,7 @@ def get_info_from_bdm(virt_type, bdm, mapping=None, disk_bus=None, if not device_name: if assigned_devices: - padded_mapping = dict((dev, {'dev': dev}) - for dev in assigned_devices) + padded_mapping = {dev: {'dev': dev} for dev in assigned_devices} padded_mapping.update(mapping) else: padded_mapping = mapping diff --git a/nova/virt/vmwareapi/vmops.py b/nova/virt/vmwareapi/vmops.py index b1dd2de0c0..29844bb66d 100644 --- a/nova/virt/vmwareapi/vmops.py +++ b/nova/virt/vmwareapi/vmops.py @@ -1286,7 +1286,7 @@ class VMwareVMOps(object): """Return data about VM diagnostics.""" data = self._get_diagnostics(instance) # Add a namespace to all of the diagnostsics - return dict([('vmware:' + k, v) for k, v in data.items()]) + return {'vmware:' + k: v for k, v in data.items()} def get_instance_diagnostics(self, instance): """Return data about VM diagnostics.""" diff --git a/nova/virt/xenapi/driver.py b/nova/virt/xenapi/driver.py index 3f02cb6212..fd56bc15de 100644 --- a/nova/virt/xenapi/driver.py +++ b/nova/virt/xenapi/driver.py @@ -351,7 +351,7 @@ class XenAPIDriver(driver.ComputeDriver): # we only care about VMs that correspond to a nova-managed # instance: - imap = dict([(inst['name'], inst['uuid']) for inst in instances]) + imap = {inst['name']: inst['uuid'] for inst in instances} bwcounters = [] # get a dictionary of instance names. values are dictionaries diff --git a/nova/virt/xenapi/fake.py b/nova/virt/xenapi/fake.py index b6787da757..7aba8f39cf 100644 --- a/nova/virt/xenapi/fake.py +++ b/nova/virt/xenapi/fake.py @@ -478,8 +478,7 @@ class Failure(Exception): return "XenAPI Fake Failure: %s" % str(self.details) def _details_map(self): - return dict([(str(i), self.details[i]) - for i in range(len(self.details))]) + return {str(i): self.details[i] for i in range(len(self.details))} class SessionBase(object): diff --git a/nova/virt/xenapi/vmops.py b/nova/virt/xenapi/vmops.py index 8c1c3140bc..19b45b19df 100644 --- a/nova/virt/xenapi/vmops.py +++ b/nova/virt/xenapi/vmops.py @@ -2143,7 +2143,7 @@ class VMOps(object): sr_ref = vm_utils.safe_find_sr(self._session) vm_vdis = vm_utils.get_instance_vdis_for_sr(self._session, vm_ref, sr_ref) - return dict((vdi, destination_sr_ref) for vdi in vm_vdis) + return {vdi: destination_sr_ref for vdi in vm_vdis} def _call_live_migrate_command(self, command_name, vm_ref, migrate_data): """unpack xapi specific parameters, and call a live migrate command."""