Pokud narazíte na chybu Nelze přidat sloupec NOT NULL s výchozí hodnotou NULL při naplňování nebo synchronizaci databáze neutronů, zde je návod, jak to opravit. Než uvidíme řešení, podívejte se na snímek chyby:
# 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']
Chyba je zvláštní, protože moje instalace OpenStack používá databázi MySQL, ale chyba říká SQLite.
Řešení:
Protože moje instalace měla používat databázi MySQL, rychle jsem ověřil neutron.conf soubor, abyste zjistili, zda byla správně nastavena proměnná připojení. Překvapivě existovala další proměnná připojení ukazující na SQLite a to byl v mém případě viník.
# 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
Řešením tedy bylo zakomentovat proměnnou připojení, která ukazuje na sqlite.
# connection = sqlite:////var/lib/neutron/neutron.sqlite
A je to! Pokud vás zajímá, proč sqlite nemohl přidat sloupec address_scopes s omezením jako NOT NULL pro existující tabulku, pak je důvod.
Podle dokumentu SQLite ALTER TABLE, pokud je zadáno omezení NOT NULL, musí mít sloupec výchozí hodnotu jinou než NULL.