nova/nova/db/sqlalchemy
melanie witt 416290f193 Remove redundant call to get/create default security group
In the instance_create DB API method, it ensures the (legacy) default
security group gets created for the specified project_id if it does
not already exist. If the security group does not exist, it is created
in a separate transaction.

Later in the instance_create method, it reads the default security group
back that it wrote earlier (via the same ensure default security group
code). But since it was written in a separate transaction, the current
transaction will not be able to see it and will get back 0 rows. So, it
creates a duplicate default security group record if project_id=NULL
(which it will be, if running nova-manage db online_data_migrations,
which uses an anonymous RequestContext with project_id=NULL). This
succeeds despite the unique constraint on project_id because in MySQL,
unique constraints are only enforced on non-NULL values [1].

To avoid creation of a duplicate default security group for
project_id=NULL, we can use the default security group object that was
returned from the first security_group_ensure_default call earlier in
instance_create method and remove the second, redundant call.

This also breaks out the security groups setup code from a nested
method as it was causing confusion during code review and is not being
used for any particular purpose. Inspection of the original commit
where it was added in 2012 [2] did not contain any comments about the
nested method and it appeared to either be a way to organize the code
or a way to reuse the 'models' module name as a local variable name.

Closes-Bug: #1824435

[1] https://dev.mysql.com/doc/refman/8.0/en/create-index.html#create-index-unique
[2] https://review.opendev.org/#/c/8973/2/nova/db/sqlalchemy/api.py@1339

Change-Id: Idb205ab5b16bbf96965418cd544016fa9cc92de9
(cherry picked from commit 6ea945e3b1)
2019-10-25 17:40:05 +00:00
..
api_migrations Add placeholder migrations for Stein backports 2019-04-08 18:08:40 +01:00
migrate_repo db: Add resources column in instance_extra table 2019-09-13 08:50:32 +00:00
__init__.py Remove SQLite BigInteger/Integer translation logic 2015-12-07 12:49:22 -05:00
api.py Remove redundant call to get/create default security group 2019-10-25 17:40:05 +00:00
api_models.py Drop delete_build_requests_with_no_instance_uuid online migration 2019-04-08 17:48:14 -04:00
migration.py Delete the placement code 2019-04-28 20:06:15 +00:00
models.py db: Add resources column in instance_extra table 2019-09-13 08:50:32 +00:00
types.py Use is_valid_cidr and is_valid_ipv6_cidr from oslo_utils 2017-01-31 11:45:00 +00:00
utils.py Remove translation of log messages 2017-07-18 09:03:39 +00:00