2012-02-27 15:40:07 -08:00
|
|
|
# Copyright 2012 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.
|
|
|
|
|
2014-01-03 17:31:49 +01:00
|
|
|
from django.conf import settings
|
2017-12-12 13:30:33 +09:00
|
|
|
from django.urls import reverse
|
2022-01-26 22:42:15 +09:00
|
|
|
from django.utils.translation import gettext_lazy as _
|
2012-02-27 15:40:07 -08:00
|
|
|
|
|
|
|
from horizon import exceptions
|
|
|
|
from horizon import tabs
|
|
|
|
|
2014-07-14 13:02:45 -07:00
|
|
|
from openstack_dashboard.dashboards.project.instances \
|
|
|
|
import audit_tables as a_tables
|
|
|
|
|
2012-10-04 15:43:40 -07:00
|
|
|
from openstack_dashboard import api
|
2014-03-05 10:56:25 -03:00
|
|
|
from openstack_dashboard.dashboards.project.instances import console
|
2018-02-17 22:03:50 +09:00
|
|
|
from openstack_dashboard.dashboards.project.instances import interfaces_tables
|
2021-02-10 14:08:57 -06:00
|
|
|
from openstack_dashboard import policy
|
2019-04-16 13:46:31 +09:00
|
|
|
from openstack_dashboard.utils import settings as settings_utils
|
2012-10-04 15:43:40 -07:00
|
|
|
|
2012-02-27 15:40:07 -08:00
|
|
|
|
|
|
|
class OverviewTab(tabs.Tab):
|
|
|
|
name = _("Overview")
|
|
|
|
slug = "overview"
|
2012-10-03 14:29:24 -07:00
|
|
|
template_name = ("project/instances/"
|
2012-02-27 15:40:07 -08:00
|
|
|
"_detail_overview.html")
|
|
|
|
|
|
|
|
def get_context_data(self, request):
|
2019-11-13 14:09:24 +01:00
|
|
|
instance = self.tab_group.kwargs['instance']
|
|
|
|
if instance.volumes and not instance.image:
|
|
|
|
try:
|
|
|
|
volume = api.cinder.volume_get(
|
|
|
|
self.request, volume_id=instance.volumes[0].volumeId)
|
|
|
|
except Exception:
|
|
|
|
exceptions.handle(self.request,
|
|
|
|
_('Failed to get attached volume.'))
|
2021-02-26 03:44:15 +09:00
|
|
|
try:
|
|
|
|
instance.image = {
|
|
|
|
'id': volume.volume_image_metadata['image_id'],
|
|
|
|
'name': volume.volume_image_metadata['image_name'],
|
|
|
|
}
|
|
|
|
except (AttributeError, KeyError):
|
|
|
|
# AttributeError is raised when volume_image_metadata does not
|
|
|
|
# exist. KeyError is raised when volume_image_metadata exists
|
|
|
|
# but image_id or image_name is not included.
|
|
|
|
instance.image = None
|
2019-11-13 14:09:24 +01:00
|
|
|
return {"instance": instance}
|
2012-02-27 15:40:07 -08:00
|
|
|
|
|
|
|
|
2021-02-10 14:08:57 -06:00
|
|
|
class InterfacesTab(policy.PolicyTargetMixin, tabs.TableTab):
|
2018-02-17 22:03:50 +09:00
|
|
|
name = _("Interfaces")
|
|
|
|
slug = "interfaces"
|
|
|
|
table_classes = (interfaces_tables.InterfacesTable, )
|
|
|
|
template_name = "horizon/common/_detail_table.html"
|
|
|
|
preload = False
|
2021-02-10 14:08:57 -06:00
|
|
|
policy_rules = (("compute", "os_compute_api:os-attach-interfaces"),)
|
2018-02-17 22:03:50 +09:00
|
|
|
|
|
|
|
def get_interfaces_data(self):
|
|
|
|
instance = self.tab_group.kwargs['instance']
|
|
|
|
try:
|
|
|
|
ports = api.neutron.port_list(self.request, device_id=instance.id)
|
|
|
|
if ports:
|
|
|
|
net_ids = [p.network_id for p in ports]
|
|
|
|
networks = api.neutron.network_list(self.request, id=net_ids)
|
|
|
|
net_dict = dict((n.id, n.name_or_id) for n in networks)
|
|
|
|
else:
|
|
|
|
net_dict = {}
|
|
|
|
for p in ports:
|
|
|
|
p.network = net_dict.get(p.network_id)
|
|
|
|
except Exception:
|
|
|
|
exceptions.handle(self.request,
|
|
|
|
_('Failed to get instance interfaces.'))
|
|
|
|
ports = []
|
|
|
|
return ports
|
|
|
|
|
|
|
|
|
2021-02-10 14:08:57 -06:00
|
|
|
class LogTab(policy.PolicyTargetMixin, tabs.Tab):
|
2012-02-27 15:40:07 -08:00
|
|
|
name = _("Log")
|
|
|
|
slug = "log"
|
2012-10-03 14:29:24 -07:00
|
|
|
template_name = "project/instances/_detail_log.html"
|
2012-02-27 15:40:07 -08:00
|
|
|
preload = False
|
2021-02-10 14:08:57 -06:00
|
|
|
policy_rules = (("compute", "os_compute_api:os-console-output"),)
|
2012-02-27 15:40:07 -08:00
|
|
|
|
|
|
|
def get_context_data(self, request):
|
|
|
|
instance = self.tab_group.kwargs['instance']
|
2019-04-16 13:46:31 +09:00
|
|
|
log_length = settings_utils.get_log_length(request)
|
2012-02-27 15:40:07 -08:00
|
|
|
try:
|
2013-01-20 00:50:11 +09:00
|
|
|
data = api.nova.server_console_output(request,
|
|
|
|
instance.id,
|
2014-10-31 15:31:23 +05:30
|
|
|
tail_length=log_length)
|
2013-08-13 16:54:59 +10:00
|
|
|
except Exception:
|
2012-02-27 15:40:07 -08:00
|
|
|
data = _('Unable to get log for instance "%s".') % instance.id
|
|
|
|
exceptions.handle(request, ignore=True)
|
|
|
|
return {"instance": instance,
|
2014-10-31 15:31:23 +05:30
|
|
|
"console_log": data,
|
|
|
|
"log_length": log_length}
|
2012-02-27 15:40:07 -08:00
|
|
|
|
|
|
|
|
2021-02-10 14:08:57 -06:00
|
|
|
class ConsoleTab(policy.PolicyTargetMixin, tabs.Tab):
|
2013-01-02 18:35:04 +00:00
|
|
|
name = _("Console")
|
|
|
|
slug = "console"
|
|
|
|
template_name = "project/instances/_detail_console.html"
|
2012-02-27 15:40:07 -08:00
|
|
|
preload = False
|
2021-02-10 14:08:57 -06:00
|
|
|
policy_rules = (("compute", "os_compute_api:os-consoles:show"),)
|
2012-02-27 15:40:07 -08:00
|
|
|
|
|
|
|
def get_context_data(self, request):
|
|
|
|
instance = self.tab_group.kwargs['instance']
|
2019-04-11 08:47:44 +09:00
|
|
|
console_type = settings.CONSOLE_TYPE
|
2014-03-05 10:56:25 -03:00
|
|
|
console_url = None
|
|
|
|
try:
|
2014-12-31 14:51:20 -05:00
|
|
|
console_type, console_url = console.get_console(
|
|
|
|
request, console_type, instance)
|
|
|
|
# For serial console, the url is different from VNC, etc.
|
2016-07-27 17:32:33 +03:00
|
|
|
# because it does not include params for title and token
|
2014-12-31 14:51:20 -05:00
|
|
|
if console_type == "SERIAL":
|
2015-06-26 17:14:05 +08:00
|
|
|
console_url = reverse('horizon:project:instances:serial',
|
|
|
|
args=[instance.id])
|
2014-03-05 10:56:25 -03:00
|
|
|
except exceptions.NotAvailable:
|
2014-05-22 11:12:05 -07:00
|
|
|
exceptions.handle(request, ignore=True, force_log=True)
|
2013-05-28 17:42:24 +08:00
|
|
|
|
2014-12-31 14:51:20 -05:00
|
|
|
return {'console_url': console_url, 'instance_id': instance.id,
|
|
|
|
'console_type': console_type}
|
2012-02-27 15:40:07 -08:00
|
|
|
|
2014-07-11 13:57:01 +02:00
|
|
|
def allowed(self, request):
|
|
|
|
# The ConsoleTab is available if settings.CONSOLE_TYPE is not set at
|
|
|
|
# all, or if it's set to any value other than None or False.
|
2019-04-11 08:47:44 +09:00
|
|
|
return bool(settings.CONSOLE_TYPE)
|
2014-07-11 13:57:01 +02:00
|
|
|
|
2012-02-27 15:40:07 -08:00
|
|
|
|
2021-02-10 14:08:57 -06:00
|
|
|
class AuditTab(policy.PolicyTargetMixin, tabs.TableTab):
|
2014-07-14 13:02:45 -07:00
|
|
|
name = _("Action Log")
|
|
|
|
slug = "audit"
|
|
|
|
table_classes = (a_tables.AuditTable,)
|
|
|
|
template_name = "project/instances/_detail_audit.html"
|
|
|
|
preload = False
|
2021-02-10 14:08:57 -06:00
|
|
|
policy_rules = (("compute", "os_compute_api:os-instance-usage-audit-log"),)
|
2014-07-14 13:02:45 -07:00
|
|
|
|
|
|
|
def get_audit_data(self):
|
|
|
|
actions = []
|
|
|
|
try:
|
|
|
|
actions = api.nova.instance_action_list(
|
|
|
|
self.request, self.tab_group.kwargs['instance_id'])
|
|
|
|
except Exception:
|
|
|
|
exceptions.handle(self.request,
|
|
|
|
_('Unable to retrieve instance action list.'))
|
|
|
|
|
|
|
|
return sorted(actions, reverse=True, key=lambda y: y.start_time)
|
|
|
|
|
|
|
|
|
2021-02-10 14:08:57 -06:00
|
|
|
class InstanceDetailTabs(policy.PolicyTargetMixin, tabs.DetailTabsGroup):
|
2012-02-27 15:40:07 -08:00
|
|
|
slug = "instance_details"
|
2018-02-17 22:03:50 +09:00
|
|
|
tabs = (OverviewTab, InterfacesTab, LogTab, ConsoleTab, AuditTab)
|
2012-07-29 15:12:23 -07:00
|
|
|
sticky = True
|
2021-02-10 14:08:57 -06:00
|
|
|
policy_rules = (("compute", "os_compute_api:os-consoles:show"),)
|