Si tiene un error No se puede agregar una columna NOT NULL con valor predeterminado NULL mientras rellena o sincroniza la base de datos de neutrones, así es como puede solucionarlo. Antes de que veamos la solución, echa un vistazo a la instantánea del error:
# su -s /bin/sh -c "neutron-db-manage --config-file /etc/neutron/neutron.conf --config-file /etc/neutron/plugins/ml2/ml2_conf.ini upgrade head" neutron sqlalchemy.exc.OperationalError: (sqlite3.OperationalError) Cannot add a NOT NULL column with default value NULL [SQL: u'ALTER TABLE address_scopes ADD COLUMN ip_version INTEGER NOT NULL']
El error es extraño porque mi instalación de OpenStack usa la base de datos MySQL, pero el error dice SQLite.
Como se suponía que mi instalación usaba la base de datos MySQL, verifiqué rápidamente neutron.conf para ver si la variable de conexión se configuró correctamente. Sorprendentemente, había una variable de conexión adicional que apuntaba a SQLite y ese fue el culpable en mi caso.
# vim /etc/neutron/neutron.conf
[database] connection = mysql+pymysql://neutron:osneutron@controller/neutron The SQLAlchemy connection string to use to connect to the database. (string # value) # Deprecated group/name - [DEFAULT]/sql_connection # Deprecated group/name - [DATABASE]/sql_connection # Deprecated group/name - [sql]/connection connection = sqlite:////var/lib/neutron/neutron.sqlite
Entonces, la solución fue comentar la variable de conexión que apunta a sqlite.
# connection = sqlite:////var/lib/neutron/neutron.sqlite
¡Eso es todo! Si está interesado en saber por qué sqlite no pudo agregar una columna address_scopes con una restricción NOT NULL a una tabla existente, esta es la razón.
De acuerdo con el documento ALTER TABLE de SQLite, si se especifica la restricción NOT NULL, la columna debe tener un valor predeterminado que no sea NULL.