読者です 読者をやめる 読者になる 読者になる

NTNX>日記

個人的な趣味による Nutanix Community Edition 日記。Japanese のみですみません。

Nutanix OVM 2015.1.0 の OpenStack Horizon Dashboard でのオブジェクト削除時の問題対応。

Nutanix OpenStack Servieice VM(OVM)2015.1.0 で、Horizon ダッシュボードでオブジェクト(インスタンスなど)を削除すると必ずエラーになってしまいます。

問題の様子

ためしに、インスタンスを削除すると・・・

f:id:gowatana:20160507101317p:plain

どこかがおかしくなりました。

f:id:gowatana:20160507101329p:plain

しかし「ホーム」リンクなどから戻ると、オブジェクトは削除できています。

f:id:gowatana:20160507101417p:plain

今回の OVM はこれです。

[root@ovm02 ~]# ovmctl --show | tail -n 6
Version:
--------
Version     : 2015.1.0
Release     : 1
Summary     : Acropolis drivers for Openstack Kilo.

Horizon Dashboard の RPM はこれです。

[root@ovm02 ~]# rpm -qa | grep horizon
python-django-horizon-2015.1.1-1.el7.noarch

対処方法

この問題と同じようです。どうやら、Horizon のバグのようです。

bugs.launchpad.net

下記のあるような感じで、OpenStack コントローラ にある Horizon 関連のファイルを編集してしまいます。

https://review.openstack.org/gitweb?p=openstack/horizon.git;a=commitdiff;h=0b873d69ef4b55c065898df25d0521c77a432fe4

とりあえず、下記のファイルだけ修正します。

/usr/lib/python2.7/site-packages/horizon/tables/actions.py

ちなみにこのファイルは、python-django-horizon に含まれています。

[root@ovm02 ~]# rpm -qf /usr/lib/python2.7/site-packages/horizon/tables/actions.py
python-django-horizon-2015.1.1-1.el7.noarch

編集するのは、対象ファイルのこのあたりです。
とりあえず周辺の 20行を表示しておきます。

[root@ovm02 ~]# cat -n /usr/lib/python2.7/site-packages/horizon/tables/actions.py | sed 800,820p -n
   800          action_not_allowed = []
   801          for datum_id in obj_ids:
   802              datum = table.get_object_by_id(datum_id)
   803              datum_display = table.get_object_display(datum) or datum_id
   804              if not table._filter_action(self, request, datum):
   805                  action_not_allowed.append(datum_display)
   806                  LOG.info('Permission denied to %s: "%s"' %
   807                           (self._get_action_name(past=True).lower(),
   808                            datum_display))
   809                  continue
   810              try:
   811                  self.action(request, datum_id)
   812                  # Call update to invoke changes if needed
   813                  self.update(request, datum)
   814                  action_success.append(datum_display)
   815                  self.success_ids.append(datum_id)
   816                  LOG.info('%s: "%s"' %
   817                           (self._get_action_name(past=True), datum_display))
   818              except Exception as ex:
   819                  # Handle the exception but silence it since we'll display
   820                  # an aggregate error message later. Otherwise we'd get

編集します。

[root@ovm02 ~]# cp -p /usr/lib/python2.7/site-packages/horizon/tables/actions.py actions.py_bk
[root@ovm02 ~]# sed -i -e '800,820 s/LOG.info(/LOG.warning(u/g' /usr/lib/python2.7/site-packages/horizon/tables/actions.py

編集した内容です。

[root@ovm02 ~]# diff actions.py_bk /usr/lib/python2.7/site-packages/horizon/tables/actions.py
806c806
<                 LOG.info('Permission denied to %s: "%s"' %
---
>                 LOG.warning(u'Permission denied to %s: "%s"' %
816c816
<                 LOG.info('%s: "%s"' %
---
>                 LOG.warning(u'%s: "%s"' %

そして HTTPD を再起動しておきます。

[root@ovm02 ~]# systemctl restart httpd

これで、オブジェクトを削除してもエラー画面が表示されなくなります。

ログファイルの様子

ためしに、インスタンスを削除した時の /var/log/horizon/horizon.log ファイルを見てみました。

対処前

2016-05-06 17:49:01,653 4974 ERROR django.request Internal Server Error: /dashboard/project/instances/
Traceback (most recent call last):
  File "/usr/lib/python2.7/site-packages/django/core/handlers/base.py", line 132, in get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/usr/lib/python2.7/site-packages/horizon/decorators.py", line 36, in dec
    return view_func(request, *args, **kwargs)
  File "/usr/lib/python2.7/site-packages/horizon/decorators.py", line 52, in dec
    return view_func(request, *args, **kwargs)
  File "/usr/lib/python2.7/site-packages/horizon/decorators.py", line 36, in dec
    return view_func(request, *args, **kwargs)
  File "/usr/lib/python2.7/site-packages/horizon/decorators.py", line 84, in dec
    return view_func(request, *args, **kwargs)
  File "/usr/lib/python2.7/site-packages/django/views/generic/base.py", line 71, in view
    return self.dispatch(request, *args, **kwargs)
  File "/usr/lib/python2.7/site-packages/django/views/generic/base.py", line 89, in dispatch
    return handler(request, *args, **kwargs)
  File "/usr/lib/python2.7/site-packages/horizon/tables/views.py", line 223, in post
    return self.get(request, *args, **kwargs)
  File "/usr/lib/python2.7/site-packages/horizon/tables/views.py", line 159, in get
    handled = self.construct_tables()
  File "/usr/lib/python2.7/site-packages/horizon/tables/views.py", line 150, in construct_tables
    handled = self.handle_table(table)
  File "/usr/lib/python2.7/site-packages/horizon/tables/views.py", line 125, in handle_table
    handled = self._tables[name].maybe_handle()
  File "/usr/lib/python2.7/site-packages/horizon/tables/base.py", line 1640, in maybe_handle
    return self.take_action(action_name, obj_id)
  File "/usr/lib/python2.7/site-packages/horizon/tables/base.py", line 1482, in take_action
    response = action.multiple(self, self.request, obj_ids)
  File "/usr/lib/python2.7/site-packages/horizon/tables/actions.py", line 302, in multiple
    return self.handle(data_table, request, object_ids)
  File "/usr/lib/python2.7/site-packages/horizon/tables/actions.py", line 827, in handle
    exceptions.handle(request, ignore=ignore)
  File "/usr/lib/python2.7/site-packages/horizon/exceptions.py", line 364, in handle
    six.reraise(exc_type, exc_value, exc_traceback)
  File "/usr/lib/python2.7/site-packages/horizon/tables/actions.py", line 817, in handle
    (self._get_action_name(past=True), datum_display))
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe3 in position 0: ordinal not in range(128)

対処後

2016-05-06 17:54:59,535 14754 WARNING horizon.tables.actions インスタンスの終了を予約しました。: "vm01"

以上。