Merge "Allow CSV upload of auto-discovered nodes"
This commit is contained in:
commit
2941976ee5
@ -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
|
||||
|
@ -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 %}
|
||||
|
@ -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 %}
|
@ -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 }}
|
||||
|
@ -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(),
|
||||
|
@ -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'
|
||||
|
Loading…
x
Reference in New Issue
Block a user