OpenStack keystoneをwindowsで構築してみた

# 始め
KeystoneをcloneしてPycharmで開いてみた。色んなmissing packagesの警告が出た。
「これ嫌だな。」
この話はここから始まった。

何年か前にPycharmのmissing packagesを解消しようとしたことがあった。その時にはPyPIとwindows用wheelで解決しようとしたが、結局失敗。名前は思い出さないがWindows用のpackageがないものがあった。

それを今回は`conda install -c conda-forge`を利用してやってみた。これだけ使っては上手くいけない場合もあったのでPyPIも使いながらインストールすると何となくdependencyを揃うことが出来た。(私はconda3をインストールしたのでpython3.6の環境だ。)
時には　`pip install "pysaml2<4.0.3,>=4.0.2"`　こんなコマンドも使った。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/12587/52658445-c3f6-4d97-1555-ecb1ef99f198.png)

#「へー、もし動ける？」

結果、動けた。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/12587/fb59c1dc-d392-1220-d418-430193a2d8c8.png)

参考文書はやっぱりopenstack document。
https://docs.openstack.org/keystone/latest/install/keystone-install-rdo.html#install-and-configure-components

基本コンセプトは、以下をWindows上に実行すること

- `conda create -n openstack && activate openstack`
- `cd c:\dev\keystone && pip install -e .`
- package 設置
- mysqlをインストール
- `keystone-manage db_sync`でテーブル自動生成する
- `keystone-manage bootstrap`でテーブルに基本情報を`Insert`する
- apache24をインストールする
- mod_wsgiをインストールする
- http.confを設定する
- apache24を起動

## `conda create -n openstack && activate openstack`

virtualenvも良いけどconda-forgeが提供するwindows用packageは最高。今はvirtualenvは使わない。pycharmもinterpreter設定画面でcondaをサポートしてくれてるし。

## cd c:\dev\keystone && pip install -e .

keystoneをforkしてからcloneした。これから沢山のbranchを作りながらいじってみるから。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/12587/f10103e6-30c2-c805-8524-874b67849c9e.png)

## package 設置
ここは`conda search <packagename>`や`pip search <packagename>`で何となく出来る

## mysqlをインストール
![image.png](https://qiita-image-store.s3.amazonaws.com/0/12587/351d8301-8504-d258-7a3b-033eb4351ea3.png)

一応最新をインストールした。「No thanks, just start my download」
設置したコンポネントは`server only`

## `keystone-manage db_sync`でテーブル自動生成する
## `keystone-manage bootstrap`でテーブルに基本情報を`Insert`する
![image.png](https://qiita-image-store.s3.amazonaws.com/0/12587/81904be5-7a64-3847-1233-ec3072b0dab0.png)

## apache24をインストールする
![image.png](https://qiita-image-store.s3.amazonaws.com/0/12587/fe07072c-4dac-d153-0574-79bf68a2b587.png)
apacheloungeで最新をインストールした。

## mod_wsgiをインストールする
![image.png](https://qiita-image-store.s3.amazonaws.com/0/12587/6b356738-770a-d3f9-401a-f239a76fed98.png)
windows用precompiled wheelをダウンロードした。


## http.confを設定する

![image.png](https://qiita-image-store.s3.amazonaws.com/0/12587/ca72fb72-522a-ca93-108a-5b088f9c0d35.png)

```
LoadFile "c:/programdata/anaconda3/envs/openstack/python36.dll"
LoadModule wsgi_module "c:/programdata/anaconda3/envs/openstack/lib/site-packages/mod_wsgi/server/mod_wsgi.cp36-win_amd64.pyd"
WSGIPythonHome "c:/programdata/anaconda3/envs/openstack"
Include conf/wsgi-keystone.conf
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/12587/c597fb43-39dd-7d80-8763-d7c54e055bea.png)


![image.png](https://qiita-image-store.s3.amazonaws.com/0/12587/ce46a4cb-c351-0159-e9bc-06f8ce8c30a0.png)
wsgi-keystone.confは最初は`c:\dev\keystone\httpd\wsgi-keystone.conf`をcopyしてやってみた。失敗。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/12587/e6265872-1636-2817-1416-1b676da2f457.png)

理由はWindows用のmod_wsgiには具現されてないfeatureがあったこと。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/12587/d08bce1d-0e0a-66ab-17e1-08483474d685.png)

色々工夫して成功したのが以下の内容だ。

```bash
Listen 5000
Listen 35357

<VirtualHost *:5000>
    # WSGIDaemonProcess keystone-public processes=5 threads=1 user=keystone group=keystone display-name=%{GROUP}
    # WSGIProcessGroup keystone-public
    # WSGIScriptAlias / /usr/local/bin/keystone-wsgi-public
    WSGIScriptAlias / /usr/bin/keystone-wsgi-public.py
    WSGIApplicationGroup %{GLOBAL}
    WSGIPassAuthorization On
    # LimitRequestBody 114688
    #<IfVersion >= 2.4>
      ErrorLogFormat "%{cu}t %M"
    #</IfVersion>
    ErrorLog /var/log/apache2/keystone.log
    CustomLog /var/log/apache2/keystone_access.log combined

    # <Directory /usr/local/bin>
    <Directory /usr/bin>
        # <IfVersion >= 2.4>
            Require all granted
        # </IfVersion>
        # <IfVersion < 2.4>
        #    Order allow,deny
        #    Allow from all
        # </IfVersion>
    </Directory>
</VirtualHost>

<VirtualHost *:35357>
    # WSGIDaemonProcess keystone-admin processes=5 threads=1 user=keystone group=keystone display-name=%{GROUP}
    # WSGIProcessGroup keystone-admin
    # WSGIScriptAlias / /usr/local/bin/keystone-wsgi-admin
    WSGIScriptAlias / /usr/bin/keystone-wsgi-admin.py
    WSGIApplicationGroup %{GLOBAL}
    WSGIPassAuthorization On
    # LimitRequestBody 114688
    #<IfVersion >= 2.4>
      ErrorLogFormat "%{cu}t %M"
    #</IfVersion>
    ErrorLog /var/log/apache2/keystone.log
    CustomLog /var/log/apache2/keystone_access.log combined

    # <Directory /usr/local/bin>
    <Directory /usr/bin>
        # <IfVersion >= 2.4>
            Require all granted
        # </IfVersion>
        #<IfVersion < 2.4>
        #    Order allow,deny
        #    Allow from all
        #</IfVersion>
    </Directory>
</VirtualHost>

# Alias /identity /usr/local/bin/keystone-wsgi-public
Alias /identity /usr/bin/keystone-wsgi-public.py
<Location /identity>
    SetHandler wsgi-script
    Options +ExecCGI

    # WSGIProcessGroup keystone-public
    WSGIApplicationGroup %{GLOBAL}
    WSGIPassAuthorization On
</Location>

# Alias /identity_admin /usr/local/bin/keystone-wsgi-admin
Alias /identity_admin /usr/bin/keystone-wsgi-admin.py
<Location /identity_admin>
    SetHandler wsgi-script
    Options +ExecCGI

    # WSGIProcessGroup keystone-admin
    WSGIApplicationGroup %{GLOBAL}
    WSGIPassAuthorization On
</Location>

```

keystone-wsgi-public.pyとkeystone-wsgi-admin.pyはkeystone repositoryでは提供されてないので、ubuntuのやつをcopyしてshebangだけ`#!/ProgramData/Anaconda3/envs/openstack/python`にした。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/12587/b45d975e-4c7c-de63-ec57-a6b5a3e667a2.png)

## apache24を起動

![image.png](https://qiita-image-store.s3.amazonaws.com/0/12587/940d51f3-578c-14b5-4310-41cb5b985a6e.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/12587/1a566e0a-ed6d-9f1b-7be6-ee731a1546ed.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/12587/a6ad44cb-68c8-95a8-34c6-58d694a4b65a.png)

# 次やってみたいこと
一応、dbからではなくcsvファイルから認証するようにするにはことをいじればいいか調べたい。
以上。

# 後書き
![image.png](https://qiita-image-store.s3.amazonaws.com/0/12587/b72e48b6-2913-9c5c-9093-15e847764322.png)

Apacheなしで起動することもできた。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/12587/f1cfcf2c-079f-020c-ab36-aecda36e1b2a.png)

このファイルをPycharmでDebugモードで実行することもできる。