ShinobiLayer: CDNキャッシュを明示的にPurgeする方法(slコマンド編）

#はじめに
前回（http://qiita.com/testnin2/items/3668db3411164b704649）、SoftLayerのCustomer Portalを使ってCDNキャッシュを明示的にPurgeする方法を紹介しましたが、実際の運用を鑑みると、コマンドからできた方が便利そうです。SoftLayerのslコマンドにもcdnのオプションは存在するし、実際に動かしてみよう・・・と思ったらバグを見つけてしまったので、そのデバッグ方法と解決方法も併せて紹介します。

#とりあえず実行してみる

まず、sl cdn purgeのヘルプを引いてみると、idとurlが引数になっているようです。

```
# sl cdn purge --help
usage: sl cdn purge <account> <content_url>... [options]

Purge one or more cached files from all edge nodes

Required:
  account      The CDN account ID to purge content from
  content_url  The CDN URL(s) or CDN CNAME-based URL(s) for the content
                 you wish to cache (can be repeated)

Standard Options:
  --format=ARG            Output format. [Options: table, raw] [Default: table]
  -C FILE --config=FILE   Config file location. [Default: ~/.softlayer]
  --debug=LEVEL           Specifies the debug noise level
                           1=warn, 2=info, 3=debug
  --timings               Time each API call and display after results
  --proxy=PROTO:PROXY_URL HTTP[s] proxy to be use to make API calls
  -h --help               Show this screen
```

ということで、sl cdn listからcustomer portalに載っているaccount_nameに該当するIDを見つけます。今回は分かりやすいように、customer portalに載っているCDN account nameが11188、CDN IDが14180であるとしましょう。そうすると以下のような出力結果になっているかと思います。

```
# sl cdn list
:.......:..............:.............:...........................:.......:
:   id  : account_name :     type    :          created          : notes :
:.......:..............:.............:...........................:.......:
: 14180 :    11188     : ORIGIN_PULL : 2014-09-28T23:57:14-07:00 :   -   :
:.......:..............:.............:...........................:.......:

```

あとは、CDN IDとURLを指定してsl cdn purgeを実行するだけですが。。。

```
# sl cdn purge 14180 http://11188.http.cdn.softlayer.net/8011188/origin.mysl01.com/cdn/*
SoftLayerAPIError(Client): Function ("purgeContent") is not a valid method for this service
```

なぬ？invalid method？**purgeContentというmethodが無い**というようなメッセージにも見えますが、debugコマンドを付けて再度実行してみます。

```
[root@sing ~]# sl cdn purge 14180 http://11188.http.cdn.softlayer.net/8011188/origin.mysl01.com/cdn/* --debug=3
=== REQUEST ===
POST https://api.service.softlayer.com/xmlrpc/v3.1/SoftLayer_Network_ContentDelivery_Account
{'Content-Type': 'application/xml', 'Accept-Encoding': 'gzip, deflate, compress', 'Accept': '*/*', 'User-Agent': 'SoftLayer Python v3.3.1'}
<?xml version='1.0'?>
<methodCall>
<methodName>purgeContent</methodName>
<params>
<param>
<value><struct>
<member>
<name>headers</name>
<value><struct>
<member>
<name>authenticate</name>
（以下略）
```

うん、たしかに**purgeContent**というmethodを実行しているね、と思いAPI Referenceを見てみます。すると、、、うん、**purgeContentなんてmethodは存在しないね、確かに。。。purgeCacheだよ。。**と、若干脱力しましたが、コードの修正にかかりましょう。
http://sldn.softlayer.com/reference/services/SoftLayer_Network_ContentDelivery_Account
http://sldn.softlayer.com/reference/services/SoftLayer_Network_ContentDelivery_Account/purgeCache

![purgeCache.jpg](https://qiita-image-store.s3.amazonaws.com/0/62127/0f2803c2-7521-8b3c-a5f8-48c827b414e3.jpeg)


# SLコマンドソースの修正

CDNなので、cdnという名前のソースを探します。

```
# locate cdn
/usr/lib/python2.6/site-packages/SoftLayer/CLI/modules/cdn.py
/usr/lib/python2.6/site-packages/SoftLayer/CLI/modules/cdn.pyc
/usr/lib/python2.6/site-packages/SoftLayer/managers/cdn.py
/usr/lib/python2.6/site-packages/SoftLayer/managers/cdn.pyc
```

/usr/lib/python2.6/site-packages/SoftLayer/managers/cdn.pyにて、**purgeContent**となっている部分を、**purgeCache**に修正します。


```
# vi /usr/lib/python2.6/site-packages/SoftLayer/managers/cdn.py
(135行目前後)
        for i in range(0, len(urls), MAX_URLS_PER_PURGE):
            #result = self.account.purgeContent(urls[i:i + MAX_URLS_PER_PURGE],
            result = self.account.purgeCache(urls[i:i + MAX_URLS_PER_PURGE],
                                               id=account_id)
            if not result:
                return result
```


#再実行

今度はエラーが発生せずにうまく行きます。コマンドを実行しても何も結果は返ってきませんが、1-2分もするとキャッシュが消えたことを確認できます。

```
# sl cdn purge 14180 http://11188.http.cdn.softlayer.net/8011188/origin.mysl01.com/cdn/*
# echo $?
0
```

#終わりに
多分、昔はpurgeContentという名前だったんだろうなぁと思いながら、こんな基本的なバグが見つかっていないなんて結局世界中で誰も使っていないんだろうかと思ってしまったり。。。あとでissueリストに載せるか、pull request投げておこう。。。