openstack的dashboard页面报Invalid service catalog service: compute

今天在dashboard页面创建image失败后(可能和这个操作无关),大多数页面就报Invalid service catalog service: compute的错,然后就动手解决这个问题了,过程如下:

1、去/var/log/httpd/error_log文件里面去看错误日志,一个主要的截图如下:

    openstack的dashboard页面报Invalid service catalog service: compute

2、然后去看最后一个报错的文件base.py,并打开它,找到报错的代码

    openstack的dashboard页面报Invalid service catalog service: compute

    openstack的dashboard页面报Invalid service catalog service: compute

经过调试发现get_service_from_catalog对数据的处理有问题,if 'type' not in service这句代码只能过滤type字段不存在的情况,不能过滤type为compute且没有url的情况。

3、原因找到了,所以解决方法有两种

    1)代码层面:直接改源码,把漏掉的情况也过滤掉

    2)运维层面:找到出现这种情况的原因,把‘脏数据’去掉

4、解决问题

    1)修改代码很简单:在那句代码后面加上or notservice.get('endpoints')然后重启httpd就好了

    2)从第一张代码的截图可以看到数据是从变量catalog里面获取的,可以用openstack catalog list看到,截图如下:

    openstack的dashboard页面报Invalid service catalog service: compute

      从截图可以看到type为compute的endpoint有两条数据,第一条没有url,第二条有,所以把第一条没有url的数据删掉就好了,但是发现只有openstack catalog list,没有openstack catalog delete命令,后来查看keystone的配置文件keystone.conf发现如下配置:

    openstack的dashboard页面报Invalid service catalog service: compute

从配置文件和一些资料看出catalog是从mysql里面读取的数据,然后从mysql的keystone库中的service表里找到了脏数据,然后知道了用openstack service delete去删除‘脏数据’,问题就解决了。