OpenStack Users Advent Calendar 2014 12/5 

　OpenStackに触れ始めてもうすぐ1年、OpenStack的にはHavana世代からとわりと新参者になります。もっぱらの興味はネットワークノードの高可用性なのですが何か述べるにはまだまだ敷居が高いので今日は、novaコマンドの--all-tenantsオプションについて少々述べさせてもらいたいと思います。前日12/4の[habuka036](http://blog.osamu.habuka.jp/blog/2014/12/04/openstack-advent-calendar-2014-4th/)さんに引き続きコマンドネタですが、こちらはもっと初級ネタでございます。

さて、OpenStackはテナント（プロジェクト）毎に異なる独立したネットワークインスタンス、イメージ、ボリュームなどのリソースを作ることができます。また、ユーザに紐づいていないテナント（プロジェクト）のリソースは見えません。しかしユーザは複数の複数のテナントに属せます。その場合場合はどう見えるのかな？という疑問がでますね。それでは、Let's Stack!

#adminでは？
adminはすべてのプロジェクトを見ることできるはずでしょう。ということでまずはadminで出してみたいと思います。

インスタンス一覧は**nova list**よねということでコマンド発行。パスワードと認証URLは環境変数にし、どのユーザでコマンド発行しているかわかるようにユーザ名とテナント名は引数にしてます。

```
$ nova --os-username admin --os-tenant-name admin list
+----+------+--------+------------+-------------+----------+
| ID | Name | Status | Task State | Power State | Networks |
+----+------+--------+------------+-------------+----------+
+----+------+--------+------------+-------------+----------+
```
ありゃりゃ何もない。adminプロジェクトにはインスタンスはないが、他のプロジェクトにインスタンスあるはずなのに！？

実は、novaコマンドの場合は**--all-tenants**引数をつけるとadminですべてのインスタンスを見ることができるようになります。

```
$ nova --os-username admin --os-tenant-name admin list --all-tenants
+--------------------------------------+-------+--------+------------+-------------+--------------------------------------------+
| ID                                   | Name  | Status | Task State | Power State | Networks                                   |
+--------------------------------------+-------+--------+------------+-------------+--------------------------------------------+
| a488a7b8-24b0-41a0-86aa-74f2efdf8305 | test  | ERROR  | -          | NOSTATE     | private=10.0.0.3                           |
| 9e5703a5-a16c-4666-9d67-0ef75eb6b89d | test1 | ACTIVE | -          | Running     | TEST1-LOCALNET=10.100.0.150, 172.24.4.238  |
+--------------------------------------+-------+--------+------------+-------------+--------------------------------------------+
*ERRORなインスタンスがありますが気にしない
```
みえましたね。ああ。よかった。 :smile: 

#一般ユーザでは？
一般ユーザではどうでしょう。次のようにdemoユーザがdemo、TEST1というテナントに属している場合で見てみましょう。 

まずは、それぞれのテナントのインスタンスのリストを出してみます。はじめにTEST1テナント

```
$ nova --os-username demo --os-tenant-name TEST1 list
+--------------------------------------+-------+--------+------------+-------------+-------------------------------------------+
| ID                                   | Name  | Status | Task State | Power State | Networks                                  |
+--------------------------------------+-------+--------+------------+-------------+-------------------------------------------+
| 9e5703a5-a16c-4666-9d67-0ef75eb6b89d | test1 | ACTIVE | -          | Running     | TEST1-LOCALNET=10.100.0.150, 172.24.4.238 |
+--------------------------------------+-------+--------+------------+-------------+-------------------------------------------+
```

続いてdemoテナント

```
$ nova --os-username demo --os-tenant-name demo list
+--------------------------------------+------+--------+------------+-------------+------------------+
| ID                                   | Name | Status | Task State | Power State | Networks         |
+--------------------------------------+------+--------+------------+-------------+------------------+
| a488a7b8-24b0-41a0-86aa-74f2efdf8305 | test | ERROR  | -          | NOSTATE     | private=10.0.0.3 |
+--------------------------------------+------+--------+------------+-------------+------------------+
```
それぞれのインスタンスが出ますね。当然です。

両方のインスタンスを一括で出したいとなった時に**--all-tenants**できるんかなと思ういますがこれはダメで**--os-tenant-name**で指定したものだけが出てしまいます。

```
$ nova --os-username demo --os-tenant-name demo list --all-tenants
+--------------------------------------+------+--------+------------+-------------+------------------+
| ID                                   | Name | Status | Task State | Power State | Networks         |
+--------------------------------------+------+--------+------------+-------------+------------------+
| a488a7b8-24b0-41a0-86aa-74f2efdf8305 | test | ERROR  | -          | NOSTATE     | private=10.0.0.3 |
+--------------------------------------+------+--------+------------+-------------+------------------+
$ nova --os-username demo --os-tenant-name TEST1 list --all-tenants
+--------------------------------------+-------+--------+------------+-------------+-------------------------------------------+
| ID                                   | Name  | Status | Task State | Power State | Networks                                  |
+--------------------------------------+-------+--------+------------+-------------+-------------------------------------------+
| 9e5703a5-a16c-4666-9d67-0ef75eb6b89d | test1 | ACTIVE | -          | Running     | TEST1-LOCALNET=10.100.0.150, 172.24.4.238 |
+--------------------------------------+-------+--------+------------+-------------+-------------------------------------------+
```
なーぜー。

#実は・・・
**--all-tenants**はadminロール専用のオプションでありました。コマンドリファレンスにもAdmin Onlyと書いてあるやんか。

>--all-tenants [0|1]
>Display information from all tenants (Admin only).
http://docs.openstack.org/cli-reference/content/novaclient_commands.html

つまり、テナントに対するユーザのロールに**admin**が付与されていると、**--all-tenants**が使えるようになります。次のようにdemoユーザが次のようにdemoプロジェクトに属し更に、adminロールを付与されている場合インスタンスが全部出ます。

```
$ keystone user-role-list --user demo  --tenant demo
+----------------------------------+----------+----------------------------------+----------------------------------+
|                id                |   name   |             user_id              |            tenant_id             |
+----------------------------------+----------+----------------------------------+----------------------------------+
| 9fe2ff9ee4384b1894a90878d3e92bab | _member_ | f5cbc36f60d444c7be205c5f0123e3e1 | 4a691247c8e74e2f9018af3ffaa18704 |
| 429ab12a59814167ba40be6662dbe24a |  admin   | f5cbc36f60d444c7be205c5f0123e3e1 | 4a691247c8e74e2f9018af3ffaa18704 |
+----------------------------------+----------+----------------------------------+----------------------------------+
```

ほらね↓

```
$ nova --os-username demo --os-tenant-name demo list --all-tenants
+--------------------------------------+-------+--------+------------+-------------+--------------------------------------------+
| ID                                   | Name  | Status | Task State | Power State | Networks                                   |
+--------------------------------------+-------+--------+------------+-------------+--------------------------------------------+
| 1ae3b891-b218-4926-acb0-8a6acb2cbd42 |X | ACTIVE | -          | Running     | XXXX01-LOCALNET=10.100.0.150, 172.24.4.230 |
| a488a7b8-24b0-41a0-86aa-74f2efdf8305 | test  | ERROR  | -          | NOSTATE     | private=10.0.0.3                           |
| 9e5703a5-a16c-4666-9d67-0ef75eb6b89d | test1 | ACTIVE | -          | Running     | TEST1-LOCALNET=10.100.0.150, 172.24.4.238  |
+--------------------------------------+-------+--------+------------+-------------+--------------------------------------------+
```

しかし、TEST1テナントを指定するとTEST1テナントではdemoユーザははadminロールが無いのでTEST1のインスタンスしか出せません。これってちょっと変な気がしますが、こういうものらしいです。

```
$ nova --os-username demo --os-tenant-name TEST1 list --all-tenants
+--------------------------------------+-------+--------+------------+-------------+-------------------------------------------+
| ID                                   | Name  | Status | Task State | Power State | Networks                                  |
+--------------------------------------+-------+--------+------------+-------------+-------------------------------------------+
| 9e5703a5-a16c-4666-9d67-0ef75eb6b89d | test1 | ACTIVE | -          | Running     | TEST1-LOCALNET=10.100.0.150, 172.24.4.238 |
+--------------------------------------+-------+--------+------------+-------------+-------------------------------------------+
```

というわけで**--all-tenants**オプションについて書いてみました。明日12/6は[兵藤茶子](http://www.adventar.org/calendars/569)さんです。よろしくお願いします。