Openstack horizon 通過policy進行定製化


Openstack的horzion組件目前只提供了部分的Openstack管理操作,有些功能只能通過命令行完成,命令行對於沒有技術背景的客戶來說是一種很糟糕的體驗。同時,horzion中一些功能的默認權限可能並不完全符合某些客戶的應用場景,所有經常有必要對horizon進行一些定製化的處理。


Openstack admin guide只介紹了簡單的定製化處理,包括網站的標題、logo以及一些css樣式的定製化,遠遠沒法滿足定製化的需求。


這裏簡單記錄一下通過policy來定製化horizon。  

nova、keystone以及glance中默認的policy.json文件中只能識別admin角色:所有不需要admin角色的操作可以被相應tenant中的擁有任何角色的任何用戶執行。

horizon中也會保存各個組件相應的policy.json文件,默認存放在horizon/openstack_dashboard/conf中。horizon會根據policy.json文件中的內容來爲不同的用戶顯示不同的內容。下面舉一個簡單的例子說明:

 需求: 默認情況下,普通的用戶也可以創建網絡,客戶希望網絡只能由管理員來創建。 

 實現: 修改horizon/openstack_dashboard/conf/neutron_policy.json 

"create_network": "",  修改爲 "create_network": "rule:admin_only"     實現起來很簡單。


同時,horizon是怎麼知道Openstack中開啓了哪些服務:例如你的Openstack環境中沒有啓動swift服務,而此時horizon中卻顯示了對象存儲服務的話,就會出現問題。

其實horizon根據的是keystone中是否存在相應service_type的endpoint。

代碼見 openstack_auth項目的backend.py文件:

   def get_all_permissions(self, user, obj=None):
        """Returns a set of permission strings that this user has through
           his/her Keystone "roles".

          The permissions are returned as ``"openstack.{{ role.name }}"``.
        """
        if user.is_anonymous() or obj is not None:
            return set()
        # TODO(gabrielhurley): Integrate policy-driven RBAC
        #                      when supported by Keystone.
        role_perms = set(["openstack.roles.%s" % role['name'].lower()
                          for role in user.roles])
        service_perms = set(["openstack.services.%s" % service['type'].lower()
                             for service in user.service_catalog
                             if user.services_region in
                             [endpoint.get('region', None) for endpoint
                              in service.get('endpoints', [])]])
        return role_perms | service_perms
比如openstack_dashboard/dashboards/project/containers/panel.py 中

class Containers(horizon.Panel):
    name = _("Containers")
    slug = 'containers'
    permissions = ('openstack.services.object-store',)

permission是"openstack.services.object-store" 表示keystone中必須有一個service_type爲object-store的service,並且這個service存在endpoint。這樣的基礎上,horizon纔會在project中顯示相應的對象存儲選項。


keystone中的service_type挺重要的,不能隨便設置。


接下來希望對horizon的代碼進行進一步的瞭解。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章