# Copyright 2013 Nebula, Inc.
#
#    Licensed under the Apache License, Version 2.0 (the "License"); you may
#    not use this file except in compliance with the License. You may obtain
#    a copy of the License at
#
#         http://www.apache.org/licenses/LICENSE-2.0
#
#    Unless required by applicable law or agreed to in writing, software
#    distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
#    License for the specific language governing permissions and limitations
#    under the License.
from collections import OrderedDict
from django.utils.translation import ugettext_lazy as _
from horizon import exceptions
from horizon import tabs
from openstack_dashboard import api
from openstack_dashboard import policy
from openstack_dashboard.dashboards.project.volumes.backups \
    import tables as backups_tables
from openstack_dashboard.dashboards.project.volumes.cg_snapshots \
    import tables as cg_snapshots_tables
from openstack_dashboard.dashboards.project.volumes.cgroups \
    import tables as cgroup_tables
from openstack_dashboard.dashboards.project.volumes.snapshots \
    import tables as vol_snapshot_tables
from openstack_dashboard.dashboards.project.volumes.volumes \
    import tables as volume_tables
[docs]class PagedTableMixin(object):
    def __init__(self, *args, **kwargs):
        super(PagedTableMixin, self).__init__(*args, **kwargs)
        self._has_prev_data = False
        self._has_more_data = False
[docs]    def has_prev_data(self, table):
        return self._has_prev_data
 
[docs]    def has_more_data(self, table):
        return self._has_more_data
 
    def _get_marker(self):
        meta = self.table_classes[0]._meta
        prev_marker = self.request.GET.get(meta.prev_pagination_param, None)
        if prev_marker:
            return prev_marker, "asc"
        else:
            marker = self.request.GET.get(meta.pagination_param, None)
            if marker:
                return marker, "desc"
            return None, "desc"
 
[docs]class SnapshotTab(PagedTableMixin, tabs.TableTab):
    table_classes = (vol_snapshot_tables.VolumeSnapshotsTable,)
    name = _("Volume Snapshots")
    slug = "snapshots_tab"
    template_name = ("horizon/common/_detail_table.html")
    preload = False
[docs]    def get_volume_snapshots_data(self):
        snapshots = []
        volumes = {}
        if api.base.is_service_enabled(self.request, 'volumev2'):
            try:
                marker, sort_dir = self._get_marker()
                snapshots, self._has_more_data, self._has_prev_data = \
                    
api.cinder.volume_snapshot_list_paged(
                        self.request, paginate=True, marker=marker,
                        sort_dir=sort_dir)
                volumes = api.cinder.volume_list(self.request)
                volumes = dict((v.id, v) for v in volumes)
            except Exception:
                exceptions.handle(self.request, _("Unable to retrieve "
                                                  "volume snapshots."))
        for snapshot in snapshots:
            volume = volumes.get(snapshot.volume_id)
            setattr(snapshot, '_volume', volume)
        return snapshots
  
[docs]class BackupsTab(PagedTableMixin, tabs.TableTab, VolumeTableMixIn):
    table_classes = (backups_tables.BackupsTable,)
    name = _("Volume Backups")
    slug = "backups_tab"
    template_name = ("horizon/common/_detail_table.html")
    preload = False
[docs]    def allowed(self, request):
        return api.cinder.volume_backup_supported(self.request)
 
[docs]    def get_volume_backups_data(self):
        try:
            marker, sort_dir = self._get_marker()
            backups, self._has_more_data, self._has_prev_data = \
                
api.cinder.volume_backup_list_paged(
                    self.request, marker=marker, sort_dir=sort_dir,
                    paginate=True)
            volumes = api.cinder.volume_list(self.request)
            volumes = dict((v.id, v) for v in volumes)
            for backup in backups:
                backup.volume = volumes.get(backup.volume_id)
        except Exception:
            backups = []
            exceptions.handle(self.request, _("Unable to retrieve "
                                              "volume backups."))
        return backups
  
[docs]class CGroupsTab(tabs.TableTab):
    table_classes = (cgroup_tables.VolumeCGroupsTable,)
    name = _("Consistency Groups")
    slug = "cgroups_tab"
    template_name = ("horizon/common/_detail_table.html")
    preload = False
[docs]    def allowed(self, request):
        return policy.check(
            (("volume", "consistencygroup:get_all"),),
            request
        )
 
[docs]    def get_volume_cgroups_data(self):
        try:
            cgroups = api.cinder.volume_cgroup_list_with_vol_type_names(
                self.request)
        except Exception:
            cgroups = []
            exceptions.handle(self.request, _("Unable to retrieve "
                                              "volume consistency groups."))
        return cgroups
  
[docs]class CGSnapshotsTab(tabs.TableTab):
    table_classes = (cg_snapshots_tables.CGSnapshotsTable,)
    name = _("Consistency Group Snapshots")
    slug = "cg_snapshots_tab"
    template_name = ("horizon/common/_detail_table.html")
    preload = False
[docs]    def allowed(self, request):
        return policy.check(
            (("volume", "consistencygroup:get_all_cgsnapshots"),),
            request
        )
 
[docs]    def get_volume_cg_snapshots_data(self):
        try:
            cg_snapshots = api.cinder.volume_cg_snapshot_list(
                self.request)
        except Exception:
            cg_snapshots = []
            exceptions.handle(self.request, _("Unable to retrieve "
                                              "volume consistency group "
                                              "snapshots."))
        return cg_snapshots
  
[docs]class VolumeAndSnapshotTabs(tabs.TabGroup):
    slug = "volumes_and_snapshots"
    tabs = (VolumeTab, SnapshotTab, BackupsTab, CGroupsTab, CGSnapshotsTab)
    sticky = True