Page MenuHomePhabricator
Paste P91349

(An Untitled Masterwork)
ActivePublic

Authored by taavi on Apr 23 2026, 10:24 AM.
Project Tags
None
Referenced Files
F77452497: raw-paste-data.txt
Apr 23 2026, 10:25 AM
F77452411: raw-paste-data.txt
Apr 23 2026, 10:24 AM
F77452319: raw-paste-data.txt
Apr 23 2026, 10:24 AM
Subscribers
None
#!/usr/bin/python3
# SPDX-License-Identifier: Apache-2.0
import openstack
import pymysql
from oslo_config import cfg
from oslo_log import log as logging
logger = logging.getLogger(__name__)
def configure_logger():
logging.register_options(cfg.CONF)
logging.setup(cfg.CONF, "puppet-enc-backfill")
def configure_options():
cfgGroup = cfg.OptGroup("enc")
opts = [
cfg.StrOpt("mysql_host"),
cfg.StrOpt("mysql_db"),
cfg.StrOpt("mysql_username", secret=True),
cfg.StrOpt("mysql_password"),
]
cfg.CONF.register_group(cfgGroup)
cfg.CONF.register_opts(opts, group=cfgGroup)
cfg.CONF(default_config_files=["/etc/puppet-enc-api/config.ini"])
class Database:
def __init__(self, **kwargs):
self.connection_params = kwargs
def connection(self):
return pymysql.connect(
**self.connection_params,
charset="utf8",
cursorclass=pymysql.cursors.DictCursor,
)
def query_one(self, sql: str, params=None):
with self.connection() as connection:
with connection.cursor() as cursor:
cursor.execute(sql, params)
return cursor.fetchone()
def query_all(self, sql: str, params=None):
with self.connection() as connection:
with connection.cursor() as cursor:
cursor.execute(sql, params)
return cursor.fetchall()
def insert(self, sql: str, params=None):
with self.connection() as connection:
with connection.cursor() as cursor:
cursor.execute(sql, params)
connection.commit()
return cursor.lastrowid
def update(self, sql: str, params=None):
with self.connection() as connection:
with connection.cursor() as cursor:
cursor.execute(sql, params)
connection.commit()
def main():
configure_logger()
configure_options()
database = Database(
host=cfg.CONF.enc.mysql_host,
db=cfg.CONF.enc.mysql_db,
user=cfg.CONF.enc.mysql_username,
passwd=cfg.CONF.enc.mysql_password,
)
conn = openstack.connect(cloud="novaobserver")
for row in database.query_all(
"""
SELECT DISTINCT project FROM prefix
WHERE prefix_project_id IS NULL
"""
):
try:
project = conn.identity.get_project(row["project"])
except openstack.exceptions.ResourceNotFound:
print("unknown project", row["project"])
continue
project_id = None
project_row = database.query_one(
"""
SELECT project_id, project_name, project_openstack_id
FROM project
WHERE project_openstack_id = %s
""",
[row["project"]],
)
if project_row:
project_id = project_row["project_id"]
else:
project_id = database.insert(
"""
INSERT INTO project (project_name, project_openstack_id)
VALUES (%s, %s)
""",
[project.name, project.id],
)
print("created project", project.name, project.id, project_id)
if not project_id:
print("unable to determine project id", row["project"])
print("setting project id", row["project"], project_id)
database.update(
"""
UPDATE prefix SET prefix_project_id = %s
WHERE project = %s
""",
[project_id, row["project"]]
)
return
if __name__ == "__main__":
main()