1
# vim: tabstop=4 shiftwidth=4 softtabstop=4
3
# Copyright 2011 United States Government as represented by the
4
# Administrator of the National Aeronautics and Space Administration.
7
# Copyright 2011 Nebula, Inc.
9
# Licensed under the Apache License, Version 2.0 (the "License"); you may
10
# not use this file except in compliance with the License. You may obtain
11
# a copy of the License at
13
# http://www.apache.org/licenses/LICENSE-2.0
15
# Unless required by applicable law or agreed to in writing, software
16
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
17
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
18
# License for the specific language governing permissions and limitations
24
from django import http
25
from django.contrib import messages
26
from django.core.urlresolvers import reverse
27
from django.utils.translation import ugettext as _
28
from keystoneclient import exceptions as api_exceptions
30
from horizon import api
31
from horizon import exceptions
32
from horizon import forms
33
from horizon import tables
34
from horizon import usage
35
from .forms import AddUser, CreateTenant, UpdateTenant, UpdateQuotas
36
from .tables import TenantsTable, TenantUsersTable, AddUsersTable
39
LOG = logging.getLogger(__name__)
42
class IndexView(tables.DataTableView):
43
table_class = TenantsTable
44
template_name = 'syspanel/tenants/index.html'
49
tenants = api.tenant_list(self.request)
50
except api_exceptions.AuthorizationFailure, e:
51
LOG.exception("Unauthorized attempt to list tenants.")
52
messages.error(self.request, _('Unable to get tenant info: %s')
55
LOG.exception('Exception while getting tenant list')
56
if not hasattr(e, 'message'):
58
messages.error(self.request, _('Unable to get tenant info: %s')
60
tenants.sort(key=lambda x: x.id, reverse=True)
64
class CreateView(forms.ModalFormView):
65
form_class = CreateTenant
66
template_name = 'syspanel/tenants/create.html'
69
class UpdateView(forms.ModalFormView):
70
form_class = UpdateTenant
71
template_name = 'syspanel/tenants/update.html'
72
context_object_name = 'tenant'
74
def get_object(self, *args, **kwargs):
75
tenant_id = kwargs['tenant_id']
77
return api.tenant_get(self.request, tenant_id)
78
except Exception as e:
79
LOG.exception('Error fetching tenant with id "%s"' % tenant_id)
80
messages.error(self.request, _('Unable to update tenant: %s')
82
raise http.Http404("Tenant with ID %s not found." % tenant_id)
84
def get_initial(self):
85
return {'id': self.object.id,
86
'name': self.object.name,
87
'description': getattr(self.object, "description", ""),
88
'enabled': self.object.enabled}
91
class UsersView(tables.MultiTableView):
92
table_classes = (TenantUsersTable, AddUsersTable)
93
template_name = 'syspanel/tenants/users.html'
95
def get_data(self, *args, **kwargs):
96
tenant_id = self.kwargs["tenant_id"]
98
self.tenant = api.keystone.tenant_get(self.request, tenant_id)
99
self.all_users = api.keystone.user_list(self.request)
100
self.tenant_users = api.keystone.user_list(self.request, tenant_id)
102
redirect = reverse("horizon:syspanel:tenants:index")
103
exceptions.handle(self.request,
104
_("Unable to retrieve users."),
106
return super(UsersView, self).get_data(*args, **kwargs)
108
def get_tenant_users_data(self):
109
return self.tenant_users
111
def get_add_users_data(self):
112
tenant_user_ids = [user.id for user in self.tenant_users]
113
return [user for user in self.all_users if
114
user.id not in tenant_user_ids]
116
def get_context_data(self, **kwargs):
117
context = super(UsersView, self).get_context_data(**kwargs)
118
context['tenant'] = self.tenant
122
class AddUserView(forms.ModalFormView):
124
template_name = 'syspanel/tenants/add_user.html'
125
context_object_name = 'tenant'
127
def get_object(self, *args, **kwargs):
128
return api.keystone.tenant_get(self.request, kwargs["tenant_id"])
130
def get_context_data(self, **kwargs):
131
context = super(AddUserView, self).get_context_data(**kwargs)
132
context['tenant_id'] = self.kwargs["tenant_id"]
133
context['user_id'] = self.kwargs["user_id"]
136
def get_form_kwargs(self):
137
kwargs = super(AddUserView, self).get_form_kwargs()
139
roles = api.keystone.role_list(self.request)
141
redirect = reverse("horizon:syspanel:tenants:users",
142
args=(self.kwargs["tenant_id"],))
143
exceptions.handle(self.request,
144
_("Unable to retrieve roles."),
146
roles.sort(key=operator.attrgetter("id"))
147
kwargs['roles'] = roles
150
def get_initial(self):
151
default_role = api.keystone.get_default_role(self.request)
152
return {'tenant_id': self.kwargs['tenant_id'],
153
'user_id': self.kwargs['user_id'],
154
'role_id': getattr(default_role, "id", None)}
157
class QuotasView(forms.ModalFormView):
158
form_class = UpdateQuotas
159
template_name = 'syspanel/tenants/quotas.html'
160
context_object_name = 'tenant'
162
def get_object(self, *args, **kwargs):
163
return api.keystone.tenant_get(self.request, kwargs["tenant_id"])
165
def get_initial(self):
166
quotas = api.nova.tenant_quota_get(self.request,
167
self.kwargs['tenant_id'])
169
'tenant_id': self.kwargs['tenant_id'],
170
'metadata_items': quotas.metadata_items,
171
'injected_file_content_bytes': quotas.injected_file_content_bytes,
172
'volumes': quotas.volumes,
173
'gigabytes': quotas.gigabytes,
174
'ram': int(quotas.ram),
175
'floating_ips': quotas.floating_ips,
176
'instances': quotas.instances,
177
'injected_files': quotas.injected_files,
178
'cores': quotas.cores}
181
class TenantUsageView(usage.UsageView):
182
table_class = usage.TenantUsageTable
183
usage_class = usage.TenantUsage
184
template_name = 'syspanel/tenants/usage.html'
187
super(TenantUsageView, self).get_data()
188
return self.usage.get_instances()