Si vous êtes bloqué avec une erreur Impossible d'ajouter une colonne NOT NULL avec la valeur par défaut NULL lors du remplissage ou de la synchronisation de la base de données de neutrons, voici comment vous pouvez y remédier. Avant de voir la solution, jetez un œil à l'instantané de l'erreur :
# 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']
L'erreur est étrange car mon installation OpenStack utilise la base de données MySQL, mais l'erreur indique SQLite.
Solution :
Comme mon installation devait utiliser la base de données MySQL, j'ai rapidement vérifié neutron.conf fichier pour voir si la variable de connexion a été définie correctement. Étonnamment, il y avait une variable de connexion supplémentaire pointant vers SQLite et c'était le coupable dans mon cas.
# 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
La solution était donc de commenter la variable de connexion qui pointe vers sqlite.
# connection = sqlite:////var/lib/neutron/neutron.sqlite
C'est ça! Si vous souhaitez savoir pourquoi sqlite n'a pas pu ajouter une colonne address_scopes avec une contrainte NOT NULL sur une table existante, voici la raison.
Selon la documentation SQLite ALTER TABLE, si la contrainte NOT NULL est spécifiée, la colonne doit avoir une valeur par défaut autre que NULL.