uta_20180821をローカルで利用できるようにする

# uta_20180821をローカルで利用できるようにする

[変異のHGVS表記の変換ツールpython hgvsをローカルリソースのみで実行する](https://qiita.com/percipere/items/36c8334da2c5d677c0d4)では、uta_20180821を利用できずにuta_0171026を利用したので改めてuta_20180821環境の構築を行う


発生していた問題は下記に関連するもの
[Local UTA w/Postgres url throws exception: Generator didn't stop after throw #537](https://github.com/biocommons/hgvs/issues/537)

下記でviewをリフレッシュする必要がある事がわかった

```
refresh materialized view ${UTA_VERSION}.exon_set_exons_fp_mv;
refresh materialized view ${UTA_VERSION}.tx_exon_set_summary_mv;
refresh materialized view ${UTA_VERSION}.tx_def_summary_mv;
```

という事でこの手順をpostgresの処理の最後に追加する

## uta_20180821 のDockerをBuildする

imageを作成するためのdockerfileが提供されているので、Docker imageを手元で作成する

- github から biocommons/uta を取得し適切なパラメータを指定してdocker buildを行う
    - git コマンドが利用できるシステム上で実行すること

ソースコードの取得

```terminal
$ git clone https://github.com/biocommons/uta.git
$ pushd uta/misc/docker/
```

postgresのDBを改変する
現在のディレクトリの`load-uta.sh`を下記で置き換える

```bash:load-uta.sh
#!/bin/bash -x
# This file creates a password-less read-only instance of UTA
# (https://bitbucket.org/biocommons/uta/) based on the postgres docker
# image.

# TODO:
# * consider how/whether to cache downloaded dump
# * fetch sha1 and check before loading

# Overwrite pg_hba.conf, including whatever edits might have been made
# by the postgres image
cat <<EOF >"$PGDATA/pg_hba.conf" 
# allow the anonymous user to access uta without password
# These lines must occur before more stringent authentication methods
host   all   anonymous     0.0.0.0/0      trust
host   all   PUBLIC        0.0.0.0/0      trust
local  all   all                          trust
host   all   all         127.0.0.1/32     trust
host   all   all               ::1/128    trust
EOF


# Create required users
createuser --username "$POSTGRES_USER" uta_admin
createuser --username "$POSTGRES_USER" anonymous
createuser --username "$POSTGRES_USER" PUBLIC
createdb   --username "$POSTGRES_USER" -O uta_admin uta

# Stream db dump into psql
# When the image is first run, the output from curl and psql are
# comingled.  This is intentional so that the user can see curl
# progress and pg restore progress.

UTA_BASENAME=${UTA_VERSION}${UTA_SCHEMA_ONLY:+-schema}.pgd.gz
UTA_PGD_URL=http://dl.biocommons.org/uta/${UTA_BASENAME}
UTA_PGD_FN=/tmp/${UTA_BASENAME}

if ! [ -e "${UTA_PGD_FN}" ]; then
    curl -o "${UTA_PGD_FN}.tmp" "$UTA_PGD_URL"
    mv "${UTA_PGD_FN}.tmp" "${UTA_PGD_FN}"
fi

gzip -cdq < "${UTA_PGD_FN}" \
    | psql -1e -U uta_admin -d uta -v ON_ERROR_STOP=1

echo "\
refresh materialized view ${UTA_VERSION}.exon_set_exons_fp_mv;
refresh materialized view ${UTA_VERSION}.tx_exon_set_summary_mv;
refresh materialized view ${UTA_VERSION}.tx_def_summary_mv;" | psql -1e -U uta_admin -d uta -v ON_ERROR_STOP=1

cat <<EOF
=======================================================================
=======================================================================
== 
== $UTA_VERSION installed from
== $UTA_PGD_URL
== 
== You may now connect to uta like this:
== 
== $  psql -h localhost -p <port> -U anonymous -d uta
== 
== No password is required.
== 
=======================================================================
=======================================================================

EOF


date >/tmp/uta-ready
```

`uta/misc/dokcer`ディレクトリに移動してdocker build を実行

```terminal
$ docker build -f uta.dockerfile --build-arg uta_version=uta_20180821 --rm=true -t uta:uta_20180821 .
```

作成されたコンテナを実行する事で、postgres sql上のテーブルの構築とデータのダウンロードを行う

```terminal
$ docker run -dit --name uta_20180821 -p 50827:5432 uta:uta_20180821
```

起動しているツールのログ(log)を参照する

```terminal
$ docker logs -f uta_20180821
```

下記のように表示されたら準備完了

```text
PostgreSQL init process complete; ready for start up.

LOG:  database system was shut down at 2019-05-29 07:39:30 UTC
LOG:  MultiXact member wraparound protections are now enabled
LOG:  database system is ready to accept connections
LOG:  autovacuum launcher started
```

`ctrl+c`でログ参照を終了する

動作の確認には下記のようにしてコンテナを起動する

```
docker run -it -e HGVS_SEQREPO_DIR="/usr/local/share/seqrepo/2018-08-21" -e UTA_DB_URL="postgresql://anonymous:anonymous@172.17.0.1:50827/uta/uta_20180821" --name hgvs_20180821 --volumes-from seqrepo --rm hgvs hgvs-shell
```

実行の確認については
[動作の確認](https://qiita.com/percipere/items/36c8334da2c5d677c0d4#動作の確認)のhgvs-shellのプロンプトが表示される以降と同様

今回はここまで:smile:


###どのようなエラーが発生していたのか

改変を加えずに実行したutaに接続してhgvsを利用すると下記のようなエラーが発生する

> `ObjectNotInPrerequisiteState: materialized view "tx_def_summary_mv" has not been populated`

```python
In [2]: am38.c_to_g(v)
WARNING:hgvs.dataproviders.uta:Lost connection to postgresql://anonymous:anonymous@172.17.0.1:50827/uta/uta_20180821; attempting reconnect
WARNING:hgvs.dataproviders.uta:Reconnected to postgresql://anonymous:anonymous@172.17.0.1:50827/uta/uta_20180821
---------------------------------------------------------------------------
ObjectNotInPrerequisiteState              Traceback (most recent call last)
/usr/local/lib/python3.7/site-packages/hgvs/dataproviders/uta.py in _get_cursor(self, n_retries)
    568 
--> 569                 yield cur
    570 

/usr/local/lib/python3.7/site-packages/hgvs/dataproviders/uta.py in _fetchall(self, sql, *args)
    219         with self._get_cursor() as cur:
--> 220             cur.execute(sql, *args)
    221             return cur.fetchall()

/usr/local/lib/python3.7/site-packages/psycopg2/extras.py in execute(self, query, vars)
    141         self._query_executed = True
--> 142         return super(DictCursor, self).execute(query, vars)
    143 

ObjectNotInPrerequisiteState: materialized view "tx_def_summary_mv" has not been populated
HINT:  Use the REFRESH MATERIALIZED VIEW command.
```