diff --git a/horizon/dashboards/nova/instances_and_volumes/instances/tables.py b/horizon/dashboards/nova/instances_and_volumes/instances/tables.py index ba379220830..1901adbf7ee 100644 --- a/horizon/dashboards/nova/instances_and_volumes/instances/tables.py +++ b/horizon/dashboards/nova/instances_and_volumes/instances/tables.py @@ -24,6 +24,8 @@ from horizon import tables from horizon.templatetags import sizeformat +from .tabs import InstanceDetailTabs, LogTab, VNCTab + LOG = logging.getLogger(__name__) @@ -158,22 +160,32 @@ def allowed(self, request, instance=None): class ConsoleLink(tables.LinkAction): name = "console" verbose_name = _("VNC Console") - url = "horizon:nova:instances_and_volumes:instances:vnc" + url = "horizon:nova:instances_and_volumes:instances:detail" classes = ("btn-console",) def allowed(self, request, instance=None): return instance.status in ACTIVE_STATES + def get_link_url(self, datum): + base_url = super(ConsoleLink, self).get_link_url(datum) + tab_query_string = VNCTab(InstanceDetailTabs).get_query_string() + return "?".join([base_url, tab_query_string]) + class LogLink(tables.LinkAction): name = "log" verbose_name = _("View Log") - url = "horizon:nova:instances_and_volumes:instances:console" + url = "horizon:nova:instances_and_volumes:instances:detail" classes = ("btn-log",) def allowed(self, request, instance=None): return instance.status in ACTIVE_STATES + def get_link_url(self, datum): + base_url = super(LogLink, self).get_link_url(datum) + tab_query_string = LogTab(InstanceDetailTabs).get_query_string() + return "?".join([base_url, tab_query_string]) + class UpdateRow(tables.Row): ajax = True diff --git a/horizon/tabs/base.py b/horizon/tabs/base.py index 1ce106d84b0..d0c8ea6f158 100644 --- a/horizon/tabs/base.py +++ b/horizon/tabs/base.py @@ -247,7 +247,7 @@ class Tab(html.HTMLElement): preload = True _active = None - def __init__(self, tab_group, request): + def __init__(self, tab_group, request=None): super(Tab, self).__init__() # Priority: constructor, class-defined, fallback if not self.name: @@ -255,10 +255,11 @@ def __init__(self, tab_group, request): self.name = unicode(self.name) # Force unicode. if not self.slug: raise ValueError("%s must have a slug." % self.__class__.__name__) - self.request = request self.tab_group = tab_group - self._allowed = self.allowed(request) - self._enabled = self.enabled(request) + self.request = request + if request: + self._allowed = self.allowed(request) + self._enabled = self.enabled(request) def __repr__(self): return "<%s: %s>" % (self.__class__.__name__, self.slug) @@ -314,6 +315,9 @@ def get_id(self): """ return SEPARATOR.join([self.tab_group.slug, self.slug]) + def get_query_string(self): + return "=".join((self.tab_group.param_name, self.get_id())) + def get_default_classes(self): """ Returns a list of the default classes for the tab. Defaults to