Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,16 @@ services:
- '--innodb-write-io-threads=8'
- '--innodb-flush-log-at-trx-commit=0'
- '--performance-schema=1'

pgdb:
build:
context: .
dockerfile: docker/pgdb.Dockerfile
restart: unless-stopped
environment:
POSTGRES_PASSWORD: hk2j22sfiv
volumes:
- postgresdb-data:/var/lib/postgresql/data

# Add "forwardPorts": ["5432"] to **devcontainer.json** to forward PostgreSQL locally.
# (Adding the "ports" property to this file will not forward from a Codespace.)
Expand Down Expand Up @@ -101,5 +111,6 @@ services:
# - .:/workspace

volumes:
postgresdb-data:
mariadb-data:
app-assets:
6 changes: 6 additions & 0 deletions docker/app.Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,13 @@ ARG USER_UID=1000
ARG USER_GID=$USER_UID
COPY docker/scripts/app-setup-debian.sh /tmp/library-scripts/docker-setup-debian.sh
RUN sed -i 's/\r$//' /tmp/library-scripts/docker-setup-debian.sh && chmod +x /tmp/library-scripts/docker-setup-debian.sh

# Add Postgresql Apt Repository to get 14
RUN echo "deb http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" | tee /etc/apt/sources.list.d/pgdg.list
RUN wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | apt-key add -

RUN apt-get update && export DEBIAN_FRONTEND=noninteractive \
&& apt-get install -y --no-install-recommends postgresql-client-14 pgloader \
# Remove imagemagick due to https://security-tracker.debian.org/tracker/CVE-2019-10131
&& apt-get purge -y imagemagick imagemagick-6-common \
# Install common packages, non-root user
Expand Down
18 changes: 18 additions & 0 deletions docker/configs/settings_mysqldb.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
DATABASES = {
'default': {
'HOST': 'db',
'PORT': 3306,
'NAME': 'ietf_utf8',
'ENGINE': 'django.db.backends.mysql',
'USER': 'django',
'PASSWORD': 'RkTkDPFnKpko',
'OPTIONS': {
'sql_mode': 'STRICT_TRANS_TABLES',
'init_command': 'SET storage_engine=InnoDB; SET names "utf8"',
},
},
}

DATABASE_TEST_OPTIONS = {
'init_command': 'SET storage_engine=InnoDB',
}
10 changes: 10 additions & 0 deletions docker/configs/settings_postgresqldb.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
DATABASES = {
'default': {
'HOST': 'pgdb',
'PORT': 5432,
'NAME': 'ietf',
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'USER': 'django',
'PASSWORD': 'RkTkDPFnKpko',
},
}
19 changes: 19 additions & 0 deletions docker/pgdb.Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
FROM postgres:14.5
LABEL maintainer="IETF Tools Team <tools-discuss@ietf.org>"

#RUN apt-get update \
# && apt-get install -y --no-install-recommends \
# postgresql-14-pg-catcheck \
# postgresql-14-powa \
# postgresql-14-pg-qualstats \
# postgresql-14-pg-stat-kcache \
# postgresql-14-pg-stat-monitor \
# postgresql-14-pg-top \
# postgresql-14-pg-track_settings \
# postgresql-14-pg-wait_sampling \
# pgsql_tweaks

ENV POSTGRES_PASSWORD=hk2j22sfiv
ENV POSTGRES_HOST_AUTH_METHOD=trust

COPY docker/scripts/pgdb-ietf-init.sh /docker-entrypoint-initdb.d/
39 changes: 37 additions & 2 deletions docker/scripts/app-init.sh
Original file line number Diff line number Diff line change
Expand Up @@ -28,10 +28,17 @@ yarn build
yarn legacy:build

# Copy config files if needed
if [ ! -f "$WORKSPACEDIR/ietf/settings_mysqldb.py" ]; then
cp $WORKSPACEDIR/docker/configs/settings_mysqldb.py $WORKSPACEDIR/ietf/settings_mysqldb.py
fi
if [ ! -f "$WORKSPACEDIR/ietf/settings_postgresqldb.py" ]; then
cp $WORKSPACEDIR/docker/configs/settings_postgresqldb.py $WORKSPACEDIR/ietf/settings_postgresqldb.py
fi

if [ ! -f "$WORKSPACEDIR/ietf/settings_local.py" ]; then
echo "Setting up a default settings_local.py ..."
cp $WORKSPACEDIR/docker/configs/settings_local.py $WORKSPACEDIR/ietf/settings_local.py

else
echo "Using existing ietf/settings_local.py file"
if ! cmp -s $WORKSPACEDIR/docker/configs/settings_local.py $WORKSPACEDIR/ietf/settings_local.py; then
Expand Down Expand Up @@ -73,6 +80,10 @@ else
fi
fi

# Recondition settings to make changing databases easier. (Remember that we may have developers starting with settings_local from earlier work)
python docker/scripts/db-include-fix.py
cat $WORKSPACEDIR/ietf/settings_local.py | sed 's/from ietf.settings_postgresqldb import DATABASES/from ietf.settings_mysqldb import DATABASES/' > /tmp/settings_local.py && mv /tmp/settings_local.py $WORKSPACEDIR/ietf/settings_local.py

# Create data directories

echo "Creating data directories..."
Expand All @@ -88,7 +99,8 @@ curl -fsSL https://github.com/ietf-tools/datatracker/releases/download/baseline/

if [ -n "$EDITOR_VSCODE" ]; then
echo "Waiting for DB container to come online ..."
/usr/local/bin/wait-for localhost:3306 -- echo "DB ready"
/usr/local/bin/wait-for db:3306 -- echo "MariaDB ready"
/usr/local/bin/wait-for pgdb:5432 -- echo "Postgresql ready"
fi

# Run memcached
Expand All @@ -112,7 +124,11 @@ if ietf/manage.py showmigrations | grep "\[ \] 0003_pause_to_change_use_tz"; the
# This is expected to exit non-zero at the pause
/usr/local/bin/python $WORKSPACEDIR/ietf/manage.py migrate --settings=settings_local || true
cat $WORKSPACEDIR/ietf/settings_local.py | sed 's/USE_TZ.*$/USE_TZ = True/' > /tmp/settings_local.py && mv /tmp/settings_local.py $WORKSPACEDIR/ietf/settings_local.py
/usr/local/bin/python $WORKSPACEDIR/ietf/manage.py migrate --settings=settings_local
# This is also expected to exit non-zero at the 2nd pause
echo "DEBUGGING pt 1 - this should say mysqldb"
grep "DATA" $WORKSPACEDIR/ietf/settings_local.py
/usr/local/bin/python $WORKSPACEDIR/ietf/manage.py migrate --settings=settings_local || true
# More migrations after the move to postgres below.

else
if grep "USE_TZ" $WORKSPACEDIR/ietf/settings_local.py; then
Expand All @@ -123,6 +139,25 @@ else
fi
fi

echo "DEBUGGING pt 2 - this should say mysqldb"
grep "DATA" $WORKSPACEDIR/ietf/settings_local.py
cat $WORKSPACEDIR/ietf/settings_local.py | sed 's/from ietf.settings_mysqldb import DATABASES/from ietf.settings_postgresqldb import DATABASES/' > /tmp/settings_local.py && mv /tmp/settings_local.py $WORKSPACEDIR/ietf/settings_local.py
echo "DEBUGGING pt 3 - this should say postgresdb"
grep "DATA" $WORKSPACEDIR/ietf/settings_local.py

# Now transfer the migrated database from mysql to postgres unless that's already happened.
if psql -U django -h pgdb -d ietf -c "\dt" 2>&1 | grep -q "Did not find any relations."; then
cat << EOF > cast.load
LOAD DATABASE
FROM mysql://django:RkTkDPFnKpko@db/ietf_utf8
INTO postgresql://django:RkTkDPFnKpko@pgdb/ietf
CAST type varchar to text drop typemod;
EOF
time pgloader --verbose --logfile=ietf_pgloader.run --summary=ietf_pgloader.summary cast.load
rm cast.load
/usr/local/bin/python $WORKSPACEDIR/ietf/manage.py migrate --settings=settings_local
fi

echo "-----------------------------------------------------------------"
echo "Done!"
echo "-----------------------------------------------------------------"
Expand Down
33 changes: 33 additions & 0 deletions docker/scripts/db-include-fix.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
from pathlib import Path
content = Path('/workspace/ietf/settings_local.py').read_text()
newcontent = content.replace(
"""DATABASES = {
'default': {
'HOST': 'db',
'PORT': 3306,
'NAME': 'ietf_utf8',
'ENGINE': 'django.db.backends.mysql',
'USER': 'django',
'PASSWORD': 'RkTkDPFnKpko',
'OPTIONS': {
'sql_mode': 'STRICT_TRANS_TABLES',
'init_command': 'SET storage_engine=InnoDB; SET names "utf8"',
},
},
}""",
"from ietf.settings_mysqldb import DATABASES",
).replace(
"""DATABASES = {
'default': {
'HOST': 'pgdb',
'PORT': 5432,
'NAME': 'ietf',
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'USER': 'django',
'PASSWORD': 'RkTkDPFnKpko',
},
}""",
"from ietf.settings_postgresqldb import DATABASES",
)
with Path('/workspace/ietf/settings_local.py').open('w') as replacementfile:
replacementfile.write(newcontent)
9 changes: 9 additions & 0 deletions docker/scripts/pgdb-ietf-init.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
#!/bin/bash
set -e

psql -v ON_ERROR_STOP=1 --username postgres --dbname postgres <<-EOSQL
CREATE USER django PASSWORD 'RkTkDPFnKpko';
CREATE DATABASE ietf;
GRANT ALL PRIVILEGES ON DATABASE ietf TO django;
ALTER USER django set search_path=ietf_utf8,django,public;
EOSQL
2 changes: 2 additions & 0 deletions ietf/.gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,6 @@
/settings_local_debug.py
/settings_local_sqlitetest.py
/settings_local_vite.py
/settings_mysqldb.py
/settings_postgresqldb.py
/ietfdb.sql.gz
21 changes: 21 additions & 0 deletions ietf/community/migrations/0010_doc_ids_are_ints.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
# Generated by Django 2.2.28 on 2022-11-05 11:07

from django.db import migrations


class Migration(migrations.Migration):

dependencies = [
('community', '0009_add_group_exp_rule_to_groups'),
]

operations = [
migrations.RunSQL(
sql="alter table community_communitylist_added_docs modify document_id int unsigned not null;",
reverse_sql="alter table community_communitylist_added_docs modify document_id varchar(255) not null;"
),
migrations.RunSQL(
sql="alter table community_searchrule_name_contains_index modify document_id int unsigned not null;",
reverse_sql="alter table community_searchrule_name_contains_index modify document_id varchar(255) not null;"
),
]
23 changes: 23 additions & 0 deletions ietf/meeting/migrations/0059_durationfield_are_intervals.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
# Generated by Django 2.2.28 on 2022-11-10 02:35

from django.db import migrations


class Migration(migrations.Migration):

dependencies = [
('meeting', '0058_meeting_time_zone_not_blank'),
('utils', '0004_pause_to_change_database_engines'),
]

operations = [
# reversesql is intentionally not provided. There is no looking back...
migrations.RunSQL(sql="update meeting_meeting set idsubmit_cutoff_time_utc=idsubmit_cutoff_time_utc/1000"),
migrations.RunSQL(sql="alter table meeting_meeting alter column idsubmit_cutoff_time_utc type interval using (idsubmit_cutoff_time_utc::text||' milliseconds')::interval;"),
migrations.RunSQL(sql="update meeting_meeting set idsubmit_cutoff_warning_days=idsubmit_cutoff_warning_days/1000"),
migrations.RunSQL(sql="alter table meeting_meeting alter column idsubmit_cutoff_warning_days type interval using (idsubmit_cutoff_warning_days::text||' milliseconds')::interval;"),
migrations.RunSQL(sql="update meeting_timeslot set duration=duration/1000"),
migrations.RunSQL(sql="alter table meeting_timeslot alter column duration type interval using (duration::text||' milliseconds')::interval;"),
migrations.RunSQL(sql="update meeting_session set requested_duration=requested_duration/1000"),
migrations.RunSQL(sql="alter table meeting_session alter column requested_duration type interval using (requested_duration::text||' milliseconds')::interval;"),
]
20 changes: 20 additions & 0 deletions ietf/utils/migrations/0004_pause_to_change_database_engines.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
# Generated by Django 2.2.28 on 2022-11-10 09:27

from django.conf import settings
from django.db import migrations

def forward(apps, schema_editor):
assert settings.DATABASES['default']['ENGINE'] == 'django.db.backends.postgresql_psycopg2', 'Please change to use postgres before continuing'

def reverse(apps, schema_editor):
assert settings.DATABASES['default']['ENGINE'] == 'django.db.backends.mysql', 'Please change to use mariadb before continuing'

class Migration(migrations.Migration):

dependencies = [
('utils', '0003_pause_to_change_use_tz'),
]

operations = [
migrations.RunPython(forward, reverse),
]
1 change: 1 addition & 0 deletions requirements.txt
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@ mypy>=0.782,<0.790 # Version requirements determined by django-stubs.
mysqlclient>=2.1.0
oic>=1.3 # Used only by tests
Pillow>=9.1.0
psycopg2<2.9
pyang>=2.5.3
pyflakes>=2.4.0
pyopenssl>=22.0.0 # Used by urllib3.contrib, which is used by PyQuery but not marked as a dependency
Expand Down