minishift V1.28.0でDjango2を動かす③：s2iソースの修正＆ビルド

# はじめに
前回まででほぼminishiftでDjango2を動作させるところまで来ましたが
oenshiftのreadinessProbeおよびlivenessProbeに対応できておらず
Crash Loop Back-offになっていました。

- [Win10環境でDjango2のREST APIを試してみる](https://qiita.com/imp555sti/items/cbe579fbbfa3837075f3)
- [minishift V1.28.0でDjango2を動かす①：テンプレート確認](https://qiita.com/imp555sti/items/7fcb6d507c4e0eae5b3a)
- [minishift V1.28.0でDjango2を動かす②：テンプレート＆s2iソースの作成](https://qiita.com/imp555sti/items/728e774cd54e5781884b)
- [minishift V1.28.0でDjango2を動かす③：s2iソースの修正＆ビルド](https://qiita.com/imp555sti/items/f6ea232c1935f7c9042c)
- [minishift V1.28.0でDjango2を動かす④：残課題](https://qiita.com/imp555sti/items/ac7839d2a846f69a2bc1)
- [minishift V1.28.0でnginx+gunicorn+Django2を動かす](https://qiita.com/imp555sti/items/7733b48f41fc37ddda24)
- [minishift V1.28.0でnginx+gunicorn+Django2を動かす。あっcreatesuperuser忘れてた(笑)](https://qiita.com/imp555sti/items/e4ce4524fe8535313616)
- [openshiftに対応するためのDjango2コーディング時に気を付けるべき点](https://qiita.com/imp555sti/items/e9b37f0d5430220da690)

そこでDjango2 Projectにhealthcheckを追加してPodを生成します。

# openshiftのreadinessProbe、livenessProbeに対応させる
podのLogsを確認すると
readinessProbeおよびlivenessProbeはすべて`GET / HTTP/1.1`となっていました。
つまりなんでも良いので`/`でアクセスしたときに`200 OK`を返せればOKとなります。

そこで上で作ったProjectに`/`でのアクセスしたときにコンテンツを返すよう修正します。
本当はコンテンツ空っぽで`status.HTTP_200_OK`でもOKなんですが、一応REST APIらしくそれっぽいコンテンツを返すようにしました(笑)

```python:sample/urls.py
"""sample URL Configuration

The `urlpatterns` list routes URLs to views. For more information please see:
    https://docs.djangoproject.com/en/2.1/topics/http/urls/
Examples:
Function views
    1. Add an import:  from my_app import views
    2. Add a URL to urlpatterns:  path('', views.home, name='home')
Class-based views
    1. Add an import:  from other_app.views import Home
    2. Add a URL to urlpatterns:  path('', Home.as_view(), name='home')
Including another URLconf
    1. Import the include() function: from django.urls import include, path
    2. Add a URL to urlpatterns:  path('blog/', include('blog.urls'))
"""
from django.contrib import admin
from django.urls import path
from restapi import views

urlpatterns = [
    path('admin/', admin.site.urls),
    path('api/', views.current_time, name='current_time'),
    path('', views.health, name='health'),         # ここを追加
]
```

```python:restapi/views.py
from datetime import datetime
from django.shortcuts import render
from django.http import JsonResponse
from rest_framework import status
from rest_framework.decorators import api_view

# Create your views here.

@api_view(['GET'])
def current_time(request):
    ret = {'now':str(datetime.now())}
    return JsonResponse(ret, status=status.HTTP_200_OK)

def health(request):
    return JsonResponse({'health':'ok'}, status=status.HTTP_200_OK)
```

```python:restapi/tests.py
from django.urls import reverse
from rest_framework import status
from rest_framework.test import APITestCase

# Create your tests here.
class restapiTest(APITestCase):
    def test_current_time(self):
        url = reverse('current_time')
        response = self.client.get(url, '')

        self.assertEqual(response.status_code, status.HTTP_200_OK)


    def test_health(self):
        url = reverse('health')
        response = self.client.get(url, '')

        self.assertEqual(response.status_code, status.HTTP_200_OK)
```

# Let's Build
それでは実際にBuildしてみます。
![40.png](https://qiita-image-store.s3.amazonaws.com/0/324255/7239e082-f229-4004-1893-e400506da33f.png)
無事Buildに成功しPodが作成されました♪

Podのログを確認すると...いい感じ♪

```
---> Migrating database ...
Operations to perform:
  Apply all migrations: admin, auth, contenttypes, sessions
Running migrations:
  Applying contenttypes.0001_initial... OK
  Applying auth.0001_initial... OK
  Applying admin.0001_initial... OK
  Applying admin.0002_logentry_remove_auto_add... OK
  Applying admin.0003_logentry_add_action_flag_choices... OK
  Applying contenttypes.0002_remove_content_type_name... OK
  Applying auth.0002_alter_permission_name_max_length... OK
  Applying auth.0003_alter_user_email_max_length... OK
  Applying auth.0004_alter_user_username_opts... OK
  Applying auth.0005_alter_user_last_login_null... OK
  Applying auth.0006_require_contenttypes_0002... OK
  Applying auth.0007_alter_validators_add_error_messages... OK
  Applying auth.0008_alter_user_username_max_length... OK
  Applying auth.0009_alter_user_last_name_max_length... OK
  Applying sessions.0001_initial... OK
---> Serving application with gunicorn (wsgi) ...
[2018-12-28 23:47:05 +0000] [1] [INFO] Starting gunicorn 19.9.0
[2018-12-28 23:47:05 +0000] [1] [INFO] Listening at: http://0.0.0.0:8080  (1)
[2018-12-28 23:47:05 +0000] [1] [INFO] Using worker: sync
[2018-12-28 23:47:05 +0000] [35] [INFO] Booting worker with pid: 35
[2018-12-28 23:47:05 +0000] [36] [INFO] Booting worker with pid: 36
[2018-12-28 23:47:05 +0000] [37] [INFO] Booting worker with pid: 37
[2018-12-28 23:47:05 +0000] [38] [INFO] Booting worker with pid: 38
172.17.0.1 - - [29/Dec/2018:08:47:12 +0900] "GET / HTTP/1.1" 200 16 "-" "kube-probe/1.11+"
172.17.0.1 - - [29/Dec/2018:08:47:22 +0900] "GET / HTTP/1.1" 200 16 "-" "kube-probe/1.11+"
172.17.0.1 - - [29/Dec/2018:08:47:30 +0900] "GET / HTTP/1.1" 200 16 "-" "kube-probe/1.11+"
172.17.0.1 - - [29/Dec/2018:08:47:32 +0900] "GET / HTTP/1.1" 200 16 "-" "kube-probe/1.11+"
172.17.0.1 - - [29/Dec/2018:08:47:40 +0900] "GET / HTTP/1.1" 200 16 "-" "kube-probe/1.11+"
172.17.0.1 - - [29/Dec/2018:08:47:42 +0900] "GET / HTTP/1.1" 200 16 "-" "kube-probe/1.11+" 
```

実際にルート`http://django2-example-django2.192.168.42.246.nip.io/`にアクセスしてみると

```json
{"health": "ok"}
```

REST-APIのパス`http://django2-example-django2.192.168.42.246.nip.io/api/`にアクセスしてみると

```json
{"now": "2018-12-29 09:12:58.410133"}
```

うまく行きました(^^♪