Merge "Allow CSV upload of auto-discovered nodes"

This commit is contained in:
Jenkins 2014-09-23 22:25:12 +00:00 committed by Gerrit Code Review
commit 2941976ee5
6 changed files with 99 additions and 10 deletions

View File

@ -12,10 +12,12 @@
# License for the specific language governing permissions and limitations
# under the License.
import csv
import django.forms
from django.utils.translation import ugettext_lazy as _
from horizon import exceptions
from horizon import forms
from tuskar_ui import api
import tuskar_ui.forms
@ -53,6 +55,19 @@ def get_driver_info_dict(data):
return driver_dict
def auto_discover_node(request, kwargs):
node = api.node.Node.create(
request,
**kwargs
)
api.node.Node.set_maintenance(request,
node.uuid,
True)
api.node.Node.set_power_state(request,
node.uuid,
'reboot')
class BaseNodeForm(django.forms.Form):
id = django.forms.IntegerField(
label="",
@ -214,18 +229,10 @@ class AutoDiscoverNodeForm(BaseNodeForm):
def create_node(self, request, data):
kwargs = get_driver_info_dict(data)
node = api.node.Node.create(
request,
kwargs.update(
mac_addresses=data['mac_addresses'].split(),
**kwargs
)
api.node.Node.set_maintenance(request,
node.uuid,
True)
api.node.Node.set_power_state(request,
node.uuid,
'reboot')
auto_discover_node(request, kwargs)
class BaseNodeFormset(tuskar_ui.forms.SelfHandlingFormset):
@ -249,3 +256,40 @@ RegisterNodeFormset = django.forms.formsets.formset_factory(
AutoDiscoverNodeFormset = django.forms.formsets.formset_factory(
AutoDiscoverNodeForm, extra=1,
formset=BaseNodeFormset)
class AutoDiscoverCSVNodeForm(forms.SelfHandlingForm):
csv_file = forms.FileField(label=_("CSV File"),
required=False)
def handle(self, request, data):
success = True
all_node_data = csv.reader(data['csv_file'])
for node_data in all_node_data:
driver = node_data[0]
kwargs = {
'driver': driver
}
if driver == 'pxe_ssh':
kwargs.update(
ssh_address=node_data[1],
ssh_username=node_data[2],
ssh_key_contents=node_data[3],
mac_addresses=node_data[4].split()
)
else:
kwargs.update(
ipmi_address=node_data[1],
ipmi_username=node_data[2],
ipmi_password=node_data[3],
)
try:
auto_discover_node(request, kwargs)
except Exception:
success = False
exceptions.handle(request, _('Unable to register node.'))
# TODO(tzumainn) If there is a failure between steps, do we
# have to unregister nodes, delete ports, etc?
return success

View File

@ -0,0 +1,21 @@
{% extends "horizon/common/_modal_form.html" %}
{% load i18n %}
{% load url from future %}
{% block form_id %}autodiscover_csv_nodes_form{% endblock %}
{% block form_action %}{% url 'horizon:infrastructure:nodes:auto-discover-csv' %}{% endblock %}
{% block modal_id %}autodiscover_csv_nodes_modal{% endblock %}
{% block modal-header %}{% trans "Auto-Discover Nodes (Upload CSV)" %}{% endblock %}
{% block form_attrs %}enctype="multipart/form-data"{% endblock %}
{% block modal-body %}
{% include "horizon/common/_form_fields.html" %}
{% endblock %}
{% block modal-footer %}
<input class="btn btn-primary pull-right" type="submit"
value="{% trans "Register Nodes" %}" />
<a href="{% url 'horizon:infrastructure:nodes:index' %}"
class="btn secondary cancel close">{% trans "Cancel" %}</a>
{% endblock %}

View File

@ -0,0 +1,11 @@
{% extends "infrastructure/base.html" %}
{% load i18n %}
{% block title %}{% trans "Auto-Discover Nodes (Upload CSV)" %}{% endblock %}
{% block page_header %}
{% include "horizon/common/_page_header.html" with title=_("Auto-Discover Nodes (Upload CSV)") %}
{% endblock %}
{% block main %}
{% include "infrastructure/nodes/_auto_discover_csv.html" %}
{% endblock %}

View File

@ -20,6 +20,10 @@
<span class="fa fa-search-plus"></span>
{% trans 'Auto-Discover Nodes' %}
</a>
<a href="{% url 'horizon:infrastructure:nodes:auto-discover-csv' %}" class="btn btn-primary ajax-modal">
<span class="fa fa-search-plus"></span>
{% trans 'Auto-Discover Nodes (Upload CSV)' %}
</a>
{% endif %}
</div>
{{ tab_group.render }}

View File

@ -24,6 +24,8 @@ urlpatterns = urls.patterns(
name='register'),
urls.url(r'^auto-discover/$', views.AutoDiscoverView.as_view(),
name='auto-discover'),
urls.url(r'^auto-discover-csv/$', views.AutoDiscoverCSVView.as_view(),
name='auto-discover-csv'),
urls.url(r'^nodes_performance/$',
views.PerformanceView.as_view(), name='nodes_performance'),
urls.url(r'^(?P<node_uuid>[^/]+)/$', views.DetailView.as_view(),

View File

@ -72,6 +72,13 @@ class AutoDiscoverView(horizon_forms.ModalFormView):
prefix=self.form_prefix)
class AutoDiscoverCSVView(horizon_forms.ModalFormView):
form_class = forms.AutoDiscoverCSVNodeForm
template_name = 'infrastructure/nodes/auto_discover_csv.html'
success_url = reverse_lazy(
'horizon:infrastructure:nodes:index')
class DetailView(horizon_tabs.TabView):
tab_group_class = tabs.NodeDetailTabs
template_name = 'infrastructure/nodes/detail.html'