Enable E128 check for line indentation
E127/E128 checks helps us to keep code more readable, so these rules should be allowed, when pep8 runs. Enabled check E128 - continuation line under-indented for visual indent. Change-Id: Ic17a7ba47d555183ff26a5dc5f6ec27c0461725a
This commit is contained in:
parent
772aafbce6
commit
e85b19e619
3
tox.ini
3
tox.ini
@ -32,10 +32,9 @@ downloadcache = ~/cache/pip
|
|||||||
[flake8]
|
[flake8]
|
||||||
builtins = _
|
builtins = _
|
||||||
exclude = .venv,.git,.tox,dist,doc,*openstack/common*,*lib/python*,*egg,build,panel_template,dash_template,local_settings.py
|
exclude = .venv,.git,.tox,dist,doc,*openstack/common*,*lib/python*,*egg,build,panel_template,dash_template,local_settings.py
|
||||||
# E128 continuation line under-indented for visual indent
|
|
||||||
# F403 'from <smth> import *' used; unable to detect undefined names
|
# F403 'from <smth> import *' used; unable to detect undefined names
|
||||||
# F999 syntax error in doctest
|
# F999 syntax error in doctest
|
||||||
# H4xx docstrings
|
# H4xx docstrings
|
||||||
# H701 empty localization string
|
# H701 empty localization string
|
||||||
# H702 Formatting operation should be outside of localization method call
|
# H702 Formatting operation should be outside of localization method call
|
||||||
ignore = E128,F403,F999,H4,H701,H702
|
ignore = F403,F999,H4,H701,H702
|
||||||
|
@ -47,11 +47,13 @@ def tuskarclient(request):
|
|||||||
|
|
||||||
def baremetalclient(request):
|
def baremetalclient(request):
|
||||||
def create_remote_nova_client_baremetal():
|
def create_remote_nova_client_baremetal():
|
||||||
nc = nova.nova_client.Client(REMOTE_NOVA_BAREMETAL_CREDS['user'],
|
nc = nova.nova_client.Client(
|
||||||
REMOTE_NOVA_BAREMETAL_CREDS['password'],
|
REMOTE_NOVA_BAREMETAL_CREDS['user'],
|
||||||
REMOTE_NOVA_BAREMETAL_CREDS['tenant'],
|
REMOTE_NOVA_BAREMETAL_CREDS['password'],
|
||||||
auth_url=REMOTE_NOVA_BAREMETAL_CREDS['auth_url'],
|
REMOTE_NOVA_BAREMETAL_CREDS['tenant'],
|
||||||
bypass_url=REMOTE_NOVA_BAREMETAL_CREDS['bypass_url'])
|
auth_url=REMOTE_NOVA_BAREMETAL_CREDS['auth_url'],
|
||||||
|
bypass_url=REMOTE_NOVA_BAREMETAL_CREDS['bypass_url'],
|
||||||
|
)
|
||||||
return nc
|
return nc
|
||||||
|
|
||||||
def create_nova_client_baremetal():
|
def create_nova_client_baremetal():
|
||||||
@ -205,7 +207,7 @@ class BaremetalNode(StringIdAPIResourceWrapper):
|
|||||||
node.ip_address_other = (", "
|
node.ip_address_other = (", "
|
||||||
.join([addr['addr'] for addr in addresses]))
|
.join([addr['addr'] for addr in addresses]))
|
||||||
node.status = (nova_instance._apiresource.
|
node.status = (nova_instance._apiresource.
|
||||||
_info['OS-EXT-STS:vm_state'])
|
_info['OS-EXT-STS:vm_state'])
|
||||||
node.power_management = ""
|
node.power_management = ""
|
||||||
if node.pm_user:
|
if node.pm_user:
|
||||||
node.power_management = node.pm_user + "/********"
|
node.power_management = node.pm_user + "/********"
|
||||||
@ -452,7 +454,7 @@ class Rack(StringIdAPIResourceWrapper):
|
|||||||
def list_baremetal_nodes(self):
|
def list_baremetal_nodes(self):
|
||||||
if not hasattr(self, '_baremetal_nodes'):
|
if not hasattr(self, '_baremetal_nodes'):
|
||||||
self._baremetal_nodes = [node.nova_baremetal_node
|
self._baremetal_nodes = [node.nova_baremetal_node
|
||||||
for node in self.list_nodes]
|
for node in self.list_nodes]
|
||||||
return self._baremetal_nodes
|
return self._baremetal_nodes
|
||||||
|
|
||||||
@property
|
@property
|
||||||
@ -739,8 +741,9 @@ class ResourceClass(StringIdAPIResourceWrapper):
|
|||||||
def aggregated_alerts(self):
|
def aggregated_alerts(self):
|
||||||
# FIXME: for now return only list of racks (particular alerts are not
|
# FIXME: for now return only list of racks (particular alerts are not
|
||||||
# used)
|
# used)
|
||||||
return [rack for rack in self.list_racks if (rack.alerts +
|
return [rack
|
||||||
rack.aggregated_alerts)]
|
for rack in self.list_racks
|
||||||
|
if rack.alerts + rack.aggregated_alerts]
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def has_provisioned_rack(self):
|
def has_provisioned_rack(self):
|
||||||
|
@ -17,6 +17,7 @@ from django.conf.urls import defaults
|
|||||||
from tuskar_ui.infrastructure.overview import views
|
from tuskar_ui.infrastructure.overview import views
|
||||||
|
|
||||||
|
|
||||||
urlpatterns = defaults.patterns('',
|
urlpatterns = defaults.patterns(
|
||||||
|
'',
|
||||||
defaults.url(r'^$', views.IndexView.as_view(), name='index'),
|
defaults.url(r'^$', views.IndexView.as_view(), name='index'),
|
||||||
)
|
)
|
||||||
|
@ -36,7 +36,8 @@ class FlavorForm(forms.Form):
|
|||||||
name = forms.RegexField(label=_("Name"),
|
name = forms.RegexField(label=_("Name"),
|
||||||
max_length=25,
|
max_length=25,
|
||||||
regex=r'^[\w\.\- ]+$',
|
regex=r'^[\w\.\- ]+$',
|
||||||
error_messages={'invalid': _('Name may only '
|
error_messages={'invalid': _(
|
||||||
|
'Name may only '
|
||||||
'contain letters, numbers, underscores, '
|
'contain letters, numbers, underscores, '
|
||||||
'periods and hyphens.')},
|
'periods and hyphens.')},
|
||||||
widget=forms.TextInput(attrs={
|
widget=forms.TextInput(attrs={
|
||||||
|
@ -63,6 +63,7 @@ class FlavorsTests(test.BaseAdminViewTests):
|
|||||||
args=[resource_class.id, flavor.id])
|
args=[resource_class.id, flavor.id])
|
||||||
res = self.client.get(url)
|
res = self.client.get(url)
|
||||||
|
|
||||||
self.assertRedirectsNoFollow(res,
|
self.assertRedirectsNoFollow(
|
||||||
|
res,
|
||||||
urlresolvers.reverse('horizon:infrastructure:resource_management:'
|
urlresolvers.reverse('horizon:infrastructure:resource_management:'
|
||||||
'index'))
|
'index'))
|
||||||
|
@ -21,7 +21,8 @@ from tuskar_ui.infrastructure.resource_management.flavors import views
|
|||||||
VIEW_MOD = 'tuskar_ui.infrastructure.' \
|
VIEW_MOD = 'tuskar_ui.infrastructure.' \
|
||||||
'resource_management.flavors.views'
|
'resource_management.flavors.views'
|
||||||
|
|
||||||
urlpatterns = defaults.patterns(VIEW_MOD,
|
urlpatterns = defaults.patterns(
|
||||||
|
VIEW_MOD,
|
||||||
defaults.url(r'^(?P<flavor_id>[^/]+)/$',
|
defaults.url(r'^(?P<flavor_id>[^/]+)/$',
|
||||||
views.DetailView.as_view(),
|
views.DetailView.as_view(),
|
||||||
name='detail')
|
name='detail')
|
||||||
|
@ -19,27 +19,33 @@ import tuskar_ui.forms
|
|||||||
|
|
||||||
|
|
||||||
class NodeForm(django.forms.Form):
|
class NodeForm(django.forms.Form):
|
||||||
id = django.forms.IntegerField(required=False,
|
id = django.forms.IntegerField(
|
||||||
|
required=False,
|
||||||
widget=django.forms.HiddenInput())
|
widget=django.forms.HiddenInput())
|
||||||
|
|
||||||
service_host = django.forms.CharField(label=_("Service Host"),
|
service_host = django.forms.CharField(
|
||||||
|
label=_("Service Host"),
|
||||||
widget=django.forms.TextInput(attrs={'class': 'input input-mini'}),
|
widget=django.forms.TextInput(attrs={'class': 'input input-mini'}),
|
||||||
required=True)
|
required=True)
|
||||||
mac_address = tuskar_ui.forms.MACField(label=_("MAC Address"),
|
mac_address = tuskar_ui.forms.MACField(
|
||||||
|
label=_("MAC Address"),
|
||||||
widget=django.forms.TextInput(attrs={'class': 'input input-mini'}),
|
widget=django.forms.TextInput(attrs={'class': 'input input-mini'}),
|
||||||
required=True)
|
required=True)
|
||||||
|
|
||||||
# Hardware Specifications
|
# Hardware Specifications
|
||||||
cpus = django.forms.IntegerField(label=_("CPUs"), required=True,
|
cpus = django.forms.IntegerField(
|
||||||
|
label=_("CPUs"), required=True,
|
||||||
min_value=1, widget=tuskar_ui.forms.NumberInput(attrs={
|
min_value=1, widget=tuskar_ui.forms.NumberInput(attrs={
|
||||||
'class': 'input number_input_slim',
|
'class': 'input number_input_slim',
|
||||||
}))
|
}))
|
||||||
memory_mb = django.forms.IntegerField(label=_("Memory"),
|
memory_mb = django.forms.IntegerField(
|
||||||
required=True, min_value=1, widget=tuskar_ui.forms.NumberInput(attrs={
|
label=_("Memory"), required=True, min_value=1,
|
||||||
|
widget=tuskar_ui.forms.NumberInput(attrs={
|
||||||
'class': 'input number_input_slim',
|
'class': 'input number_input_slim',
|
||||||
}))
|
}))
|
||||||
local_gb = django.forms.IntegerField(label=_("Local Disk (GB)"),
|
local_gb = django.forms.IntegerField(
|
||||||
min_value=1, widget=tuskar_ui.forms.NumberInput(attrs={
|
label=_("Local Disk (GB)"), min_value=1,
|
||||||
|
widget=tuskar_ui.forms.NumberInput(attrs={
|
||||||
'class': 'input number_input_slim',
|
'class': 'input number_input_slim',
|
||||||
}), required=True)
|
}), required=True)
|
||||||
|
|
||||||
@ -47,15 +53,19 @@ class NodeForm(django.forms.Form):
|
|||||||
pm_address = django.forms.GenericIPAddressField(
|
pm_address = django.forms.GenericIPAddressField(
|
||||||
widget=django.forms.TextInput(attrs={'class': 'input input-mini'}),
|
widget=django.forms.TextInput(attrs={'class': 'input input-mini'}),
|
||||||
label=_("Power Management IP"), required=False)
|
label=_("Power Management IP"), required=False)
|
||||||
pm_user = django.forms.CharField(label=_("Power Management User"),
|
pm_user = django.forms.CharField(
|
||||||
|
label=_("Power Management User"),
|
||||||
widget=django.forms.TextInput(attrs={'class': 'input input-mini'}),
|
widget=django.forms.TextInput(attrs={'class': 'input input-mini'}),
|
||||||
required=False)
|
required=False)
|
||||||
pm_password = django.forms.CharField(label=_("Power Management Password"),
|
pm_password = django.forms.CharField(
|
||||||
required=False, widget=django.forms.PasswordInput(render_value=False,
|
label=_("Power Management Password"),
|
||||||
|
required=False, widget=django.forms.PasswordInput(
|
||||||
|
render_value=False,
|
||||||
attrs={'class': 'input input-mini'}))
|
attrs={'class': 'input input-mini'}))
|
||||||
|
|
||||||
# Access
|
# Access
|
||||||
terminal_port = django.forms.IntegerField(label=_("Terminal Port"),
|
terminal_port = django.forms.IntegerField(
|
||||||
|
label=_("Terminal Port"),
|
||||||
required=False, min_value=0, max_value=1024,
|
required=False, min_value=0, max_value=1024,
|
||||||
widget=tuskar_ui.forms.NumberInput(attrs={
|
widget=tuskar_ui.forms.NumberInput(attrs={
|
||||||
'class': 'input number_input_slim',
|
'class': 'input number_input_slim',
|
||||||
@ -84,5 +94,5 @@ class BaseNodeFormSet(django.forms.formsets.BaseFormSet):
|
|||||||
values[field][value] = form
|
values[field][value] = form
|
||||||
|
|
||||||
|
|
||||||
NodeFormset = django.forms.formsets.formset_factory(NodeForm, extra=1,
|
NodeFormset = django.forms.formsets.formset_factory(
|
||||||
can_delete=True, formset=BaseNodeFormSet)
|
NodeForm, extra=1, can_delete=True, formset=BaseNodeFormSet)
|
||||||
|
@ -32,8 +32,8 @@ class DeleteNodes(tables.DeleteAction):
|
|||||||
node = tuskar.Node.get(request, obj_id)
|
node = tuskar.Node.get(request, obj_id)
|
||||||
rack = node.rack
|
rack = node.rack
|
||||||
nodes = [{'id': node_id}
|
nodes = [{'id': node_id}
|
||||||
for node_id in rack.node_ids
|
for node_id in rack.node_ids
|
||||||
if node_id != obj_id]
|
if node_id != obj_id]
|
||||||
tuskar.Rack.update(request, rack.id, {'nodes': nodes})
|
tuskar.Rack.update(request, rack.id, {'nodes': nodes})
|
||||||
except Exception:
|
except Exception:
|
||||||
exceptions.handle(request, _("Error deleting node."))
|
exceptions.handle(request, _("Error deleting node."))
|
||||||
@ -54,7 +54,7 @@ class NodesTable(tables.DataTable):
|
|||||||
link=("horizon:infrastructure:resource_management:nodes:detail"))
|
link=("horizon:infrastructure:resource_management:nodes:detail"))
|
||||||
mac_address = tables.Column("mac_address", verbose_name=_("MAC Address"))
|
mac_address = tables.Column("mac_address", verbose_name=_("MAC Address"))
|
||||||
pm_address = tables.Column("pm_address",
|
pm_address = tables.Column("pm_address",
|
||||||
verbose_name=_("Management Address"))
|
verbose_name=_("Management Address"))
|
||||||
status = tables.Column("status", verbose_name=_("Status"))
|
status = tables.Column("status", verbose_name=_("Status"))
|
||||||
usage = tables.Column("usage", verbose_name=_("Usage"))
|
usage = tables.Column("usage", verbose_name=_("Usage"))
|
||||||
|
|
||||||
@ -87,13 +87,13 @@ class NodesFormsetTable(tuskar_ui.tables.FormsetDataTable):
|
|||||||
local_gb = tables.Column('local_gb', verbose_name=_("Local Disk (GB)"))
|
local_gb = tables.Column('local_gb', verbose_name=_("Local Disk (GB)"))
|
||||||
|
|
||||||
pm_address = tables.Column('pm_address',
|
pm_address = tables.Column('pm_address',
|
||||||
verbose_name=_("Power Management IP"))
|
verbose_name=_("Power Management IP"))
|
||||||
pm_user = tables.Column('pm_user', verbose_name=_("Power Management User"))
|
pm_user = tables.Column('pm_user', verbose_name=_("Power Management User"))
|
||||||
pm_password = tables.Column('pm_password',
|
pm_password = tables.Column('pm_password',
|
||||||
verbose_name=_("Power Management Password"))
|
verbose_name=_("Power Management Password"))
|
||||||
|
|
||||||
terminal_port = tables.Column('terminal_port',
|
terminal_port = tables.Column('terminal_port',
|
||||||
verbose_name=_("Terminal Port"))
|
verbose_name=_("Terminal Port"))
|
||||||
|
|
||||||
# This is needed for the formset with can_delete=True
|
# This is needed for the formset with can_delete=True
|
||||||
DELETE = tables.Column('DELETE', verbose_name=_("Delete"))
|
DELETE = tables.Column('DELETE', verbose_name=_("Delete"))
|
||||||
|
@ -32,7 +32,8 @@ class OverviewTab(tabs.Tab):
|
|||||||
running_instances = len(node.running_virtual_machines)
|
running_instances = len(node.running_virtual_machines)
|
||||||
except requests.exceptions.ConnectionError:
|
except requests.exceptions.ConnectionError:
|
||||||
running_instances = _("Unknown")
|
running_instances = _("Unknown")
|
||||||
messages.warning(request,
|
messages.warning(
|
||||||
|
request,
|
||||||
_("Can't retrieve the running instances from the overcloud."))
|
_("Can't retrieve the running instances from the overcloud."))
|
||||||
return {
|
return {
|
||||||
'node': node,
|
'node': node,
|
||||||
|
@ -34,8 +34,9 @@ class NodeViewTests(test.BaseAdminViewTests):
|
|||||||
self.mox.ReplayAll()
|
self.mox.ReplayAll()
|
||||||
|
|
||||||
res = self.client.get(self.unracked_page)
|
res = self.client.get(self.unracked_page)
|
||||||
self.assertTemplateUsed(res,
|
self.assertTemplateUsed(
|
||||||
'infrastructure/resource_management/nodes/unracked.html')
|
res,
|
||||||
|
'infrastructure/resource_management/nodes/unracked.html')
|
||||||
|
|
||||||
unracked_nodes_table = res.context['unracked_nodes_table'].data
|
unracked_nodes_table = res.context['unracked_nodes_table'].data
|
||||||
self.assertItemsEqual(unracked_nodes_table, unracked_nodes)
|
self.assertItemsEqual(unracked_nodes_table, unracked_nodes)
|
||||||
@ -86,6 +87,7 @@ class NodeViewTests(test.BaseAdminViewTests):
|
|||||||
args=[node.id])
|
args=[node.id])
|
||||||
res = self.client.get(url)
|
res = self.client.get(url)
|
||||||
|
|
||||||
self.assertRedirectsNoFollow(res,
|
self.assertRedirectsNoFollow(
|
||||||
|
res,
|
||||||
urlresolvers.reverse('horizon:infrastructure:resource_management:'
|
urlresolvers.reverse('horizon:infrastructure:resource_management:'
|
||||||
'index'))
|
'index'))
|
||||||
|
@ -21,7 +21,8 @@ NODES = r'^(?P<node_id>[^/]+)/%s$'
|
|||||||
VIEW_MOD = 'tuskar_ui.infrastructure.resource_management.nodes.views'
|
VIEW_MOD = 'tuskar_ui.infrastructure.resource_management.nodes.views'
|
||||||
|
|
||||||
|
|
||||||
urlpatterns = defaults.patterns(VIEW_MOD,
|
urlpatterns = defaults.patterns(
|
||||||
|
VIEW_MOD,
|
||||||
defaults.url(NODES % 'detail', views.DetailView.as_view(), name='detail'),
|
defaults.url(NODES % 'detail', views.DetailView.as_view(), name='detail'),
|
||||||
defaults.url(r'^unracked/$',
|
defaults.url(r'^unracked/$',
|
||||||
views.UnrackedView.as_view(),
|
views.UnrackedView.as_view(),
|
||||||
|
@ -77,7 +77,7 @@ class UploadRack(forms.SelfHandlingForm):
|
|||||||
racks = CSVRack.from_str(base64.b64decode(racks_str))
|
racks = CSVRack.from_str(base64.b64decode(racks_str))
|
||||||
# get the resource class ids by resource class names
|
# get the resource class ids by resource class names
|
||||||
rclass_ids = dict((rc.name, rc.id) for rc in
|
rclass_ids = dict((rc.name, rc.id) for rc in
|
||||||
tuskar.ResourceClass.list(request))
|
tuskar.ResourceClass.list(request))
|
||||||
for rack in racks:
|
for rack in racks:
|
||||||
try:
|
try:
|
||||||
tuskar.Rack.create(
|
tuskar.Rack.create(
|
||||||
|
@ -117,7 +117,7 @@ class RackViewTests(test.BaseAdminViewTests):
|
|||||||
self.mox.ReplayAll()
|
self.mox.ReplayAll()
|
||||||
|
|
||||||
url = urlresolvers.reverse('horizon:infrastructure:'
|
url = urlresolvers.reverse('horizon:infrastructure:'
|
||||||
'resource_management:racks:edit', args=[1])
|
'resource_management:racks:edit', args=[1])
|
||||||
res = self.client.get(url)
|
res = self.client.get(url)
|
||||||
self.assertEqual(res.status_code, 200)
|
self.assertEqual(res.status_code, 200)
|
||||||
self.assertTemplateUsed(res, 'infrastructure/_workflow_base.html')
|
self.assertTemplateUsed(res, 'infrastructure/_workflow_base.html')
|
||||||
@ -232,12 +232,12 @@ class RackViewTests(test.BaseAdminViewTests):
|
|||||||
rack = self.client.get(url)
|
rack = self.client.get(url)
|
||||||
|
|
||||||
self.assertEqual(rack.status_code, 200)
|
self.assertEqual(rack.status_code, 200)
|
||||||
self.assertTemplateUsed(rack,
|
self.assertTemplateUsed(
|
||||||
'infrastructure/resource_management/racks/upload.html')
|
rack, 'infrastructure/resource_management/racks/upload.html')
|
||||||
|
|
||||||
def test_upload_rack_upload(self):
|
def test_upload_rack_upload(self):
|
||||||
csv_data = ('Rack1,rclass1,192.168.111.0/24,regionX,f0:dd:f1:da:f9:b5 '
|
csv_data = ('Rack1,rclass1,192.168.111.0/24,regionX,f0:dd:f1:da:f9:b5 '
|
||||||
'f2:de:f1:da:f9:66 f2:de:ff:da:f9:67')
|
'f2:de:f1:da:f9:66 f2:de:ff:da:f9:67')
|
||||||
temp_file = tempfile.TemporaryFile()
|
temp_file = tempfile.TemporaryFile()
|
||||||
temp_file.write(csv_data)
|
temp_file.write(csv_data)
|
||||||
temp_file.flush()
|
temp_file.flush()
|
||||||
@ -247,37 +247,37 @@ class RackViewTests(test.BaseAdminViewTests):
|
|||||||
url = urlresolvers.reverse('horizon:infrastructure:'
|
url = urlresolvers.reverse('horizon:infrastructure:'
|
||||||
'resource_management:racks:upload')
|
'resource_management:racks:upload')
|
||||||
resp = self.client.post(url, data)
|
resp = self.client.post(url, data)
|
||||||
self.assertTemplateUsed(resp,
|
self.assertTemplateUsed(
|
||||||
'infrastructure/resource_management/racks/upload.html')
|
resp, 'infrastructure/resource_management/racks/upload.html')
|
||||||
self.assertNoFormErrors(resp)
|
self.assertNoFormErrors(resp)
|
||||||
self.assertEqual(resp.context['form']['uploaded_data'].value(),
|
self.assertEqual(resp.context['form']['uploaded_data'].value(),
|
||||||
base64.b64encode(csv_data))
|
base64.b64encode(csv_data))
|
||||||
|
|
||||||
def test_upload_rack_upload_with_error(self):
|
def test_upload_rack_upload_with_error(self):
|
||||||
data = {'upload': '1'}
|
data = {'upload': '1'}
|
||||||
url = urlresolvers.reverse('horizon:infrastructure:'
|
url = urlresolvers.reverse('horizon:infrastructure:'
|
||||||
'resource_management:racks:upload')
|
'resource_management:racks:upload')
|
||||||
resp = self.client.post(url, data)
|
resp = self.client.post(url, data)
|
||||||
self.assertTemplateUsed(resp,
|
self.assertTemplateUsed(
|
||||||
'infrastructure/resource_management/racks/upload.html')
|
resp, 'infrastructure/resource_management/racks/upload.html')
|
||||||
self.assertFormErrors(resp, 1)
|
self.assertFormErrors(resp, 1)
|
||||||
self.assertEqual(resp.context['form']['uploaded_data'].value(),
|
self.assertEqual(resp.context['form']['uploaded_data'].value(),
|
||||||
None)
|
None)
|
||||||
|
|
||||||
@test.create_stubs({tuskar.Rack: ('create',),
|
@test.create_stubs({tuskar.Rack: ('create',),
|
||||||
tuskar.ResourceClass: ('list',)})
|
tuskar.ResourceClass: ('list',)})
|
||||||
def test_upload_rack_create(self):
|
def test_upload_rack_create(self):
|
||||||
tuskar.Rack.create(mox.IsA(http.HttpRequest),
|
tuskar.Rack.create(mox.IsA(http.HttpRequest),
|
||||||
name='Rack1',
|
name='Rack1',
|
||||||
resource_class_id='1',
|
resource_class_id='1',
|
||||||
location='regionX',
|
location='regionX',
|
||||||
subnet='192.168.111.0/24').AndReturn(None)
|
subnet='192.168.111.0/24').AndReturn(None)
|
||||||
tuskar.ResourceClass.list(
|
tuskar.ResourceClass.list(
|
||||||
mox.IsA(http.HttpRequest)).AndReturn(
|
mox.IsA(http.HttpRequest)).AndReturn(
|
||||||
self.tuskar_resource_classes.list())
|
self.tuskar_resource_classes.list())
|
||||||
self.mox.ReplayAll()
|
self.mox.ReplayAll()
|
||||||
csv_data = ('Rack1,rclass1,192.168.111.0/24,regionX,f0:dd:f1:da:f9:b5 '
|
csv_data = ('Rack1,rclass1,192.168.111.0/24,regionX,f0:dd:f1:da:f9:b5 '
|
||||||
'f2:de:f1:da:f9:66 f2:de:ff:da:f9:67')
|
'f2:de:f1:da:f9:66 f2:de:ff:da:f9:67')
|
||||||
|
|
||||||
data = {'uploaded_data': base64.b64encode(csv_data), 'add_racks': '1'}
|
data = {'uploaded_data': base64.b64encode(csv_data), 'add_racks': '1'}
|
||||||
url = urlresolvers.reverse('horizon:infrastructure:'
|
url = urlresolvers.reverse('horizon:infrastructure:'
|
||||||
@ -369,7 +369,7 @@ class RackViewTests(test.BaseAdminViewTests):
|
|||||||
|
|
||||||
@test.create_stubs({
|
@test.create_stubs({
|
||||||
tuskar.Rack: ('get', 'list_nodes', 'list_flavors', 'update',
|
tuskar.Rack: ('get', 'list_nodes', 'list_flavors', 'update',
|
||||||
'node_ids'),
|
'node_ids'),
|
||||||
tuskar.ResourceClass: ('get',),
|
tuskar.ResourceClass: ('get',),
|
||||||
tuskar.Node: ('get',),
|
tuskar.Node: ('get',),
|
||||||
tuskar.BaremetalNode: ('get',),
|
tuskar.BaremetalNode: ('get',),
|
||||||
@ -387,12 +387,13 @@ class RackViewTests(test.BaseAdminViewTests):
|
|||||||
|
|
||||||
tuskar.Rack.get(mox.IsA(http.HttpRequest), rack.id).AndReturn(rack)
|
tuskar.Rack.get(mox.IsA(http.HttpRequest), rack.id).AndReturn(rack)
|
||||||
tuskar.Node.get(mox.IsA(http.HttpRequest),
|
tuskar.Node.get(mox.IsA(http.HttpRequest),
|
||||||
baremetal_node.id).AndReturn(tuskar_node)
|
baremetal_node.id).AndReturn(tuskar_node)
|
||||||
tuskar.Rack.get(None, rack.id).AndReturn(rack) # called by node.rack
|
tuskar.Rack.get(None, rack.id).AndReturn(rack) # called by node.rack
|
||||||
tuskar.Rack.update(mox.IsA(http.HttpRequest), rack.id,
|
tuskar.Rack.update(mox.IsA(http.HttpRequest), rack.id,
|
||||||
{'nodes': [{'id': node_id}
|
{'nodes': [{'id': node_id}
|
||||||
for node_id in tuskar.Rack.node_ids
|
for node_id in tuskar.Rack.node_ids
|
||||||
if node_id != baremetal_node.id]}).AndReturn(rack)
|
if node_id != baremetal_node.id]}
|
||||||
|
).AndReturn(rack)
|
||||||
self.mox.ReplayAll()
|
self.mox.ReplayAll()
|
||||||
|
|
||||||
url = urlresolvers.reverse(
|
url = urlresolvers.reverse(
|
||||||
|
@ -20,7 +20,8 @@ RACKS = r'^(?P<rack_id>[^/]+)/%s$'
|
|||||||
VIEW_MOD = 'tuskar_ui.infrastructure.resource_management.racks.views'
|
VIEW_MOD = 'tuskar_ui.infrastructure.resource_management.racks.views'
|
||||||
|
|
||||||
|
|
||||||
urlpatterns = urls.patterns(VIEW_MOD,
|
urlpatterns = urls.patterns(
|
||||||
|
VIEW_MOD,
|
||||||
urls.url(r'^create/$', views.CreateView.as_view(), name='create'),
|
urls.url(r'^create/$', views.CreateView.as_view(), name='create'),
|
||||||
urls.url(r'^upload/$', views.UploadView.as_view(), name='upload'),
|
urls.url(r'^upload/$', views.UploadView.as_view(), name='upload'),
|
||||||
urls.url(r'^usage_data$',
|
urls.url(r'^usage_data$',
|
||||||
|
@ -33,7 +33,8 @@ class RackCreateInfoAction(workflows.Action):
|
|||||||
name = forms.RegexField(label=_("Name"),
|
name = forms.RegexField(label=_("Name"),
|
||||||
max_length=25,
|
max_length=25,
|
||||||
regex=r'^[\w\.\- ]+$',
|
regex=r'^[\w\.\- ]+$',
|
||||||
error_messages={'invalid': _('Name may only '
|
error_messages={'invalid': _(
|
||||||
|
'Name may only '
|
||||||
'contain letters, numbers, underscores, '
|
'contain letters, numbers, underscores, '
|
||||||
'periods and hyphens.')})
|
'periods and hyphens.')})
|
||||||
location = forms.CharField(label=_("Location"))
|
location = forms.CharField(label=_("Location"))
|
||||||
@ -50,7 +51,7 @@ class RackCreateInfoAction(workflows.Action):
|
|||||||
except Exception:
|
except Exception:
|
||||||
racks = []
|
racks = []
|
||||||
exceptions.check_message(['Connection', 'refused'],
|
exceptions.check_message(['Connection', 'refused'],
|
||||||
_("Unable to retrieve rack list."))
|
_("Unable to retrieve rack list."))
|
||||||
raise
|
raise
|
||||||
|
|
||||||
# Validations: detect duplicates
|
# Validations: detect duplicates
|
||||||
@ -213,7 +214,8 @@ class CreateRack(workflows.Workflow):
|
|||||||
node_ids.append({'id': node_id})
|
node_ids.append({'id': node_id})
|
||||||
try:
|
try:
|
||||||
# Then, register the Rack, including the nodes
|
# Then, register the Rack, including the nodes
|
||||||
tuskar.Rack.create(request, name=data['name'],
|
tuskar.Rack.create(
|
||||||
|
request, name=data['name'],
|
||||||
resource_class_id=data['resource_class_id'],
|
resource_class_id=data['resource_class_id'],
|
||||||
location=data['location'], subnet=data['subnet'],
|
location=data['location'], subnet=data['subnet'],
|
||||||
nodes=node_ids)
|
nodes=node_ids)
|
||||||
@ -239,7 +241,7 @@ class EditRack(CreateRack):
|
|||||||
|
|
||||||
def handle(self, request, data):
|
def handle(self, request, data):
|
||||||
node_ids = [{'id': self.create_or_update_node(node_data)}
|
node_ids = [{'id': self.create_or_update_node(node_data)}
|
||||||
for node_data in data['nodes']]
|
for node_data in data['nodes']]
|
||||||
try:
|
try:
|
||||||
rack_id = self.context['rack_id']
|
rack_id = self.context['rack_id']
|
||||||
data['nodes'] = node_ids
|
data['nodes'] = node_ids
|
||||||
|
@ -70,14 +70,15 @@ class ResourcesClassFilterAction(tables.FilterAction):
|
|||||||
|
|
||||||
|
|
||||||
class ResourceClassesTable(tables.DataTable):
|
class ResourceClassesTable(tables.DataTable):
|
||||||
name = tables.Column("name", link=("horizon:infrastructure:"
|
name = tables.Column(
|
||||||
"resource_management:resource_classes:detail"),
|
"name", link=("horizon:infrastructure:"
|
||||||
|
"resource_management:resource_classes:detail"),
|
||||||
verbose_name=_("Class Name"))
|
verbose_name=_("Class Name"))
|
||||||
service_type = tables.Column("service_type", verbose_name=_("Class Type"))
|
service_type = tables.Column("service_type", verbose_name=_("Class Type"))
|
||||||
racks_count = tables.Column("racks_count", verbose_name=_("Racks"),
|
racks_count = tables.Column("racks_count", verbose_name=_("Racks"),
|
||||||
empty_value="0")
|
empty_value="0")
|
||||||
nodes_count = tables.Column("nodes_count", verbose_name=_("Nodes"),
|
nodes_count = tables.Column("nodes_count", verbose_name=_("Nodes"),
|
||||||
empty_value="0")
|
empty_value="0")
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
name = "resource_classes"
|
name = "resource_classes"
|
||||||
@ -130,7 +131,7 @@ class UpdateRacksClass(tables.LinkAction):
|
|||||||
|
|
||||||
def get_link_url(self, datum=None):
|
def get_link_url(self, datum=None):
|
||||||
url = ("horizon:infrastructure:resource_management:resource_classes:"
|
url = ("horizon:infrastructure:resource_management:resource_classes:"
|
||||||
"update_racks")
|
"update_racks")
|
||||||
return "%s?step=%s" % (
|
return "%s?step=%s" % (
|
||||||
urlresolvers.reverse(
|
urlresolvers.reverse(
|
||||||
url,
|
url,
|
||||||
@ -145,7 +146,7 @@ class UpdateFlavorsClass(tables.LinkAction):
|
|||||||
|
|
||||||
def get_link_url(self, datum=None):
|
def get_link_url(self, datum=None):
|
||||||
url = ("horizon:infrastructure:resource_management:resource_classes:"
|
url = ("horizon:infrastructure:resource_management:resource_classes:"
|
||||||
"update_flavors")
|
"update_flavors")
|
||||||
resource_class_id = self.table.kwargs.get('resource_class_id')
|
resource_class_id = self.table.kwargs.get('resource_class_id')
|
||||||
return "%s?step=%s" % (
|
return "%s?step=%s" % (
|
||||||
urlresolvers.reverse(url, args=(resource_class_id,)),
|
urlresolvers.reverse(url, args=(resource_class_id,)),
|
||||||
@ -200,7 +201,7 @@ class FlavorsTable(tables.DataTable):
|
|||||||
|
|
||||||
|
|
||||||
class FlavorsFormsetTable(tuskar_ui.tables.FormsetDataTableMixin,
|
class FlavorsFormsetTable(tuskar_ui.tables.FormsetDataTableMixin,
|
||||||
FlavorsTable):
|
FlavorsTable):
|
||||||
|
|
||||||
name = tables.Column(
|
name = tables.Column(
|
||||||
'name',
|
'name',
|
||||||
|
@ -56,7 +56,7 @@ class FlavorsTab(tabs.TableTab):
|
|||||||
name = _("Flavors")
|
name = _("Flavors")
|
||||||
slug = "flavors"
|
slug = "flavors"
|
||||||
template_name = ("infrastructure/resource_management/resource_classes/"
|
template_name = ("infrastructure/resource_management/resource_classes/"
|
||||||
"_detail_flavors.html")
|
"_detail_flavors.html")
|
||||||
|
|
||||||
def get_flavors_table_data(self):
|
def get_flavors_table_data(self):
|
||||||
try:
|
try:
|
||||||
|
@ -149,7 +149,8 @@ class ResourceClassViewTests(test.BaseAdminViewTests):
|
|||||||
'racks-MAX_NUM_FORMS': 1000,
|
'racks-MAX_NUM_FORMS': 1000,
|
||||||
}
|
}
|
||||||
res = self.client.post(url, form_data)
|
res = self.client.post(url, form_data)
|
||||||
self.assertRedirectsNoFollow(res,
|
self.assertRedirectsNoFollow(
|
||||||
|
res,
|
||||||
("%s?tab=resource_management_tabs__resource_classes_tab" %
|
("%s?tab=resource_management_tabs__resource_classes_tab" %
|
||||||
urlresolvers.
|
urlresolvers.
|
||||||
reverse("horizon:infrastructure:resource_management:index")))
|
reverse("horizon:infrastructure:resource_management:index")))
|
||||||
@ -354,7 +355,8 @@ class ResourceClassViewTests(test.BaseAdminViewTests):
|
|||||||
self.assertItemsEqual(res.context['flavors_table_table'].data, flavors)
|
self.assertItemsEqual(res.context['flavors_table_table'].data, flavors)
|
||||||
self.assertItemsEqual(res.context['racks_table_table'].data, racks)
|
self.assertItemsEqual(res.context['racks_table_table'].data, racks)
|
||||||
self.assertEqual(res.status_code, 200)
|
self.assertEqual(res.status_code, 200)
|
||||||
self.assertTemplateUsed(res,
|
self.assertTemplateUsed(
|
||||||
|
res,
|
||||||
'infrastructure/resource_management/resource_classes/detail.html')
|
'infrastructure/resource_management/resource_classes/detail.html')
|
||||||
|
|
||||||
@test.create_stubs({
|
@test.create_stubs({
|
||||||
|
@ -63,7 +63,7 @@ class UpdateView(tuskar_workflows.WorkflowView):
|
|||||||
resource_class_id)
|
resource_class_id)
|
||||||
except Exception:
|
except Exception:
|
||||||
redirect = urlresolvers.reverse('horizon:infrastructure:'
|
redirect = urlresolvers.reverse('horizon:infrastructure:'
|
||||||
'resource_management:index')
|
'resource_management:index')
|
||||||
msg = _('Unable to retrieve resource class details.')
|
msg = _('Unable to retrieve resource class details.')
|
||||||
exceptions.handle(self.request, msg, redirect=redirect)
|
exceptions.handle(self.request, msg, redirect=redirect)
|
||||||
|
|
||||||
|
@ -65,7 +65,7 @@ class ResourceClassInfoAction(workflows.Action):
|
|||||||
images, more = glance.image_list_detailed(self.request)
|
images, more = glance.image_list_detailed(self.request)
|
||||||
except Exception:
|
except Exception:
|
||||||
exceptions.handle(self.request,
|
exceptions.handle(self.request,
|
||||||
_('Unable to retrieve image list.'))
|
_('Unable to retrieve image list.'))
|
||||||
else:
|
else:
|
||||||
self.fields['image_id'].choices = [
|
self.fields['image_id'].choices = [
|
||||||
(image.id, image.name) for image in images]
|
(image.id, image.name) for image in images]
|
||||||
@ -141,7 +141,7 @@ class CreateResourceClassFlavors(tuskar_ui.workflows.TableStep):
|
|||||||
except Exception:
|
except Exception:
|
||||||
flavors = []
|
flavors = []
|
||||||
exceptions.handle(self.workflow.request,
|
exceptions.handle(self.workflow.request,
|
||||||
_('Unable to retrieve resource flavors list.'))
|
_('Unable to retrieve resource flavors list.'))
|
||||||
return flavors
|
return flavors
|
||||||
|
|
||||||
|
|
||||||
|
@ -71,7 +71,7 @@ class RacksTab(ProvisioningInfoMixin, tabs.TableTab):
|
|||||||
name = _("Racks")
|
name = _("Racks")
|
||||||
slug = "racks_tab"
|
slug = "racks_tab"
|
||||||
template_name = ("infrastructure/resource_management/"
|
template_name = ("infrastructure/resource_management/"
|
||||||
"racks/_index_table.html")
|
"racks/_index_table.html")
|
||||||
|
|
||||||
def get_racks_data(self):
|
def get_racks_data(self):
|
||||||
try:
|
try:
|
||||||
@ -98,7 +98,7 @@ class ResourceClassesTab(ProvisioningInfoMixin, tabs.TableTab):
|
|||||||
name = _("Classes")
|
name = _("Classes")
|
||||||
slug = "resource_classes_tab"
|
slug = "resource_classes_tab"
|
||||||
template_name = ("infrastructure/resource_management/"
|
template_name = ("infrastructure/resource_management/"
|
||||||
"resource_classes/_index_table.html")
|
"resource_classes/_index_table.html")
|
||||||
#preload = False buggy, checkboxes doesn't work wit table actions
|
#preload = False buggy, checkboxes doesn't work wit table actions
|
||||||
|
|
||||||
def get_resource_classes_data(self):
|
def get_resource_classes_data(self):
|
||||||
|
@ -25,7 +25,8 @@ from tuskar_ui.infrastructure.resource_management import views
|
|||||||
from tuskar_ui.test import urls as test_urls
|
from tuskar_ui.test import urls as test_urls
|
||||||
|
|
||||||
|
|
||||||
urlpatterns = defaults.patterns('',
|
urlpatterns = defaults.patterns(
|
||||||
|
'',
|
||||||
defaults.url(r'^$', views.IndexView.as_view(), name='index'),
|
defaults.url(r'^$', views.IndexView.as_view(), name='index'),
|
||||||
defaults.url(r'^provision$', views.ProvisionView.as_view(),
|
defaults.url(r'^provision$', views.ProvisionView.as_view(),
|
||||||
name='provision'),
|
name='provision'),
|
||||||
@ -39,5 +40,6 @@ urlpatterns = defaults.patterns('',
|
|||||||
)
|
)
|
||||||
|
|
||||||
if conf.settings.DEBUG:
|
if conf.settings.DEBUG:
|
||||||
urlpatterns += defaults.patterns('', defaults.url(r'^qunit$',
|
urlpatterns += defaults.patterns(
|
||||||
defaults.include(test_urls, namespace='tests')))
|
'', defaults.url(r'^qunit$',
|
||||||
|
defaults.include(test_urls, namespace='tests')))
|
||||||
|
@ -17,6 +17,7 @@ from django.conf.urls import defaults
|
|||||||
from tuskar_ui.infrastructure.service_management import views
|
from tuskar_ui.infrastructure.service_management import views
|
||||||
|
|
||||||
|
|
||||||
urlpatterns = defaults.patterns('',
|
urlpatterns = defaults.patterns(
|
||||||
|
'',
|
||||||
defaults.url(r'^$', views.IndexView.as_view(), name='index'),
|
defaults.url(r'^$', views.IndexView.as_view(), name='index'),
|
||||||
)
|
)
|
||||||
|
@ -110,8 +110,8 @@ class FormsetCell(BaseCell):
|
|||||||
self.field = None
|
self.field = None
|
||||||
else:
|
else:
|
||||||
if self.field.errors:
|
if self.field.errors:
|
||||||
self.attrs['class'] = (self.attrs.get('class', '') +
|
self.attrs['class'] = (
|
||||||
' error control-group')
|
'%s error control-group' % self.attrs.get('class', ''))
|
||||||
self.attrs['title'] = ' '.join(
|
self.attrs['title'] = ' '.join(
|
||||||
unicode(error) for error in self.field.errors)
|
unicode(error) for error in self.field.errors)
|
||||||
|
|
||||||
@ -137,7 +137,7 @@ class FormsetRow(BaseRow):
|
|||||||
|
|
||||||
def render(self):
|
def render(self):
|
||||||
return loader.render_to_string(self.template_path,
|
return loader.render_to_string(self.template_path,
|
||||||
{"row": self, "form": self.form})
|
{"row": self, "form": self.form})
|
||||||
|
|
||||||
|
|
||||||
class FormsetDataTableMixin(object):
|
class FormsetDataTableMixin(object):
|
||||||
|
@ -58,7 +58,8 @@ class TuskarApiTests(test.APITestCase):
|
|||||||
node = self.baremetalclient_nodes.first()
|
node = self.baremetalclient_nodes.first()
|
||||||
|
|
||||||
self.mox.StubOutWithMock(baremetal.BareMetalNodeManager, 'create')
|
self.mox.StubOutWithMock(baremetal.BareMetalNodeManager, 'create')
|
||||||
baremetal.BareMetalNodeManager.create('node', 1, 1024, 10,
|
baremetal.BareMetalNodeManager.create(
|
||||||
|
'node', 1, 1024, 10,
|
||||||
'aa:bb:cc:dd:ee', None, None, '', None).AndReturn(node)
|
'aa:bb:cc:dd:ee', None, None, '', None).AndReturn(node)
|
||||||
self.mox.ReplayAll()
|
self.mox.ReplayAll()
|
||||||
|
|
||||||
|
@ -37,7 +37,7 @@ class FormsetTableTests(test.TestCase):
|
|||||||
value = django.forms.IntegerField()
|
value = django.forms.IntegerField()
|
||||||
|
|
||||||
TableFormset = django.forms.formsets.formset_factory(TableForm,
|
TableFormset = django.forms.formsets.formset_factory(TableForm,
|
||||||
extra=0)
|
extra=0)
|
||||||
|
|
||||||
class Table(tuskar_ui.tables.FormsetDataTable):
|
class Table(tuskar_ui.tables.FormsetDataTable):
|
||||||
formset_class = TableFormset
|
formset_class = TableFormset
|
||||||
|
@ -16,6 +16,7 @@ from django.conf.urls import defaults
|
|||||||
from django.views import generic
|
from django.views import generic
|
||||||
|
|
||||||
|
|
||||||
urlpatterns = defaults.patterns('', defaults.url(r'^$',
|
urlpatterns = defaults.patterns('', defaults.url(
|
||||||
|
r'^$',
|
||||||
generic.TemplateView.as_view(template_name="infrastructure/qunit.html"),
|
generic.TemplateView.as_view(template_name="infrastructure/qunit.html"),
|
||||||
name='qunit_tests'))
|
name='qunit_tests'))
|
||||||
|
Loading…
x
Reference in New Issue
Block a user