Skip to content

Commit 1772a35

Browse files
authored
Make the IP Address Chooser configurable (#395)
* Make the IP address chooser configurable * IP Chooser: Make all arguments optional, provide servertype * Find free IP addresses by given attribute * Standardize the choose_ip_address to full long name * Allow for specifying networks to look for free IP addresses in
1 parent e331e84 commit 1772a35

File tree

8 files changed

+39
-34
lines changed

8 files changed

+39
-34
lines changed

adminapi/dataset.py

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -199,27 +199,28 @@ def _build_commit_object(self):
199199

200200
return commit
201201

202-
def get_network_ip_addrs(self):
203-
if self._restrict is not None and 'intern_ip' not in self._restrict:
204-
raise DatasetError('"intern_ip" is not queried')
202+
def get_network_ip_addrs(self, attr='intern_ip'):
203+
if self._restrict is not None and attr not in self._restrict:
204+
raise DatasetError(f'"{attr}" is not queried')
205205

206206
for obj in self:
207-
addr = obj['intern_ip']
207+
addr = obj[attr]
208208
if isinstance(addr, (IPv4Network, IPv6Network)):
209209
yield addr
210210

211-
def get_free_ip_addrs(self):
212-
networks = list(self.get_network_ip_addrs())
211+
def get_free_ip_addrs(self, attr='intern_ip', networks=None):
212+
if networks is None:
213+
networks = list(self.get_network_ip_addrs(attr))
213214
if not networks:
214215
raise DatasetError('No networks')
215216

216217
# Index host and network addresses separately
217218
used_hosts = set()
218219
used_networks = list()
219220
for obj in type(self)({
220-
'intern_ip': Any(*(ContainedOnlyBy(n) for n in networks)),
221-
}, ['intern_ip']):
222-
addr = obj['intern_ip']
221+
attr: Any(*(ContainedOnlyBy(n) for n in networks)),
222+
}, [attr]):
223+
addr = obj[attr]
223224
if isinstance(addr, (IPv4Address, IPv6Address)):
224225
used_hosts.add(addr)
225226
else:

serveradmin/servershell/static/js/servershell/choose_ip_address.js

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,9 @@
55
*
66
* @param intern_ip e.g. 10.0.0.1
77
*/
8-
servershell.choose_ip_address = function(intern_ip) {
9-
let data = {
10-
network: intern_ip,
11-
async: false,
12-
};
13-
8+
servershell.choose_ip_address = function(params) {
149
spinner.enable('choose_ip_address');
15-
$.get(servershell.urls.choose_ip_address, data, function(html) {
10+
$.get(servershell.urls.choose_ip_address, params, function(html) {
1611
let modal = $('#modal_choose_ip_address');
1712

1813
$('#modal_choose_ip_address .modal-body').html(html);

serveradmin/servershell/templates/servershell/choose_ip_addr.html renamed to serveradmin/servershell/templates/servershell/choose_ip_address.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@
3030
</thead>
3131
<tbody>
3232
{% for server in servers %}
33-
<tr onclick="servershell.choose_ip_address('{{ server.intern_ip }}')"
33+
<tr onclick="servershell.choose_ip_address({network:'{{ server.intern_ip }}'})"
3434
data-search-values="{{ server.hostname }}, {{ server.intern_ip }}">
3535
<td>{{ server.hostname }}</td>
3636
<td>{{ server.intern_ip }}</td>

serveradmin/servershell/templates/servershell/edit.html

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ <h3>
5656
size="70" {% if field.readonly or field.type == 'related' %}disabled="disabled" {% endif %}
5757
{% if field.regexp %}data-pattern="{{ field.regexp }}"{% endif %}
5858
{% if field.required %} required {% endif %}
59-
{% if field.key == 'intern_ip' %}readonly onclick="servershell.choose_ip_address();"{% endif %}
59+
{% if field.key == 'intern_ip' %}readonly onclick="servershell.choose_ip_address({servertype:'{{ servertype }}'});"{% endif %}
6060
/>
6161
{% endif %}
6262
</td>
@@ -83,17 +83,17 @@ <h3>
8383
</div>
8484
</form>
8585

86-
{% include "servershell/modals/choose_ip_address.html" %}
86+
{% include choose_ip_address.include %}
8787
{% endblock %}
8888

8989
{% block additional_scripts %}
9090
<script src="{{ STATIC_URL }}js/jquery-ui.min.js"></script>
9191
<script src="{{ STATIC_URL }}js/servershell.js"></script>
9292
<script src="{{ STATIC_URL }}js/servershell/validate.js"></script>
93-
<script src="{{ STATIC_URL }}js/servershell/choose_ip_address.js"></script>
93+
<script src="{{ STATIC_URL }}{{ choose_ip_address.js }}"></script>
9494
<script>
9595
servershell.urls = {
96-
choose_ip_address: "{% url 'servershell_choose_ip_addr' %}",
96+
choose_ip_address: "{{ choose_ip_address.url }}",
9797
};
9898
</script>
9999
{% endblock %}

serveradmin/servershell/templates/servershell/index.html

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@
1212
{% endblock %}
1313

1414
{% block content %}
15+
{% include choose_ip_address.include %}
16+
1517
<!-- Servershell JS alerts -->
1618
<div id="alerts">
1719
<div id="alert-template" class="alert" style="display: none;">
@@ -191,7 +193,7 @@
191193
<script src="{{ STATIC_URL }}js/servershell/result.js"></script>
192194
<script src="{{ STATIC_URL }}js/servershell/command.js"></script>
193195
<script src="{{ STATIC_URL }}js/servershell/validate.js"></script>
194-
<script src="{{ STATIC_URL }}js/servershell/choose_ip_address.js"></script>
196+
<script src="{{ STATIC_URL }}{{ choose_ip_address.js }}"></script>
195197
<script src="{{ STATIC_URL }}js/servershell/autocomplete/search.js"></script>
196198
<script src="{{ STATIC_URL }}js/servershell/autocomplete/command.js"></script>
197199
<script>
@@ -220,7 +222,7 @@
220222
// We define the URLs once here so that we can render them with
221223
// template engine from the backend and can access them everywhere
222224
servershell.urls = {
223-
choose_ip_address: "{% url 'servershell_choose_ip_addr' %}",
225+
choose_ip_address: "{{ choose_ip_address.url }}",
224226
inspect: "{% url 'servershell_inspect' %}",
225227
edit: "{% url 'servershell_edit' %}",
226228
graphite: "{% url 'graphite_graph_table' %}",

serveradmin/servershell/urls.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
commit,
1616
new_object,
1717
clone_object,
18-
choose_ip_addr,
18+
choose_ip_address,
1919
settings, diff,
2020
)
2121

@@ -29,7 +29,7 @@
2929
path('commit', commit, name='servershell_commit'),
3030
path('new', new_object, name='servershell_new'),
3131
path('clone', clone_object, name='servershell_clone'),
32-
path('choose_ip_addr', choose_ip_addr, name='servershell_choose_ip_addr'),
32+
path('choose_ip_address', choose_ip_address, name='servershell_choose_ip_address'),
3333
path('settings', settings, name='servershell_save_settings'),
3434
path('diff', diff, name='servershell_diff'),
3535
path('opensearch.xml', TemplateView.as_view(template_name='servershell/opensearch.xml'), name='opensearch.xml'),

serveradmin/servershell/views.py

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
from ipaddress import IPv6Address, IPv4Address, ip_interface
99
from itertools import islice, chain
1010

11+
from django.conf import settings as django_settings
1112
from django.contrib import messages
1213
from django.contrib.auth.decorators import login_required
1314
from django.core.exceptions import (
@@ -31,7 +32,7 @@
3132
from django.views.defaults import bad_request
3233

3334
from adminapi.datatype import DatatypeError
34-
from adminapi.filters import Any, ContainedOnlyBy, filter_classes, Not
35+
from adminapi.filters import Any, ContainedOnlyBy, filter_classes
3536
from adminapi.parse import parse_query
3637
from adminapi.request import json_encode_extra
3738

@@ -109,6 +110,7 @@ def index(request):
109110
'filters': sorted([(f.__name__, f.__doc__) for f in filter_classes]),
110111
'search_settings': search_settings,
111112
'servershell_plugins': servershell_plugins(),
113+
'choose_ip_address': django_settings.CHOOSE_IP_ADDRESS,
112114
})
113115

114116

@@ -392,6 +394,8 @@ def _edit(request: HttpRequest, server, edit_mode=False, template='edit'): # NO
392394
'fields': fields,
393395
'base_template': 'base.html',
394396
'link': request.get_full_path(),
397+
'choose_ip_address': django_settings.CHOOSE_IP_ADDRESS,
398+
'servertype': server['servertype'],
395399
})
396400

397401

@@ -467,13 +471,13 @@ def clone_object(request):
467471

468472

469473
@login_required
470-
def choose_ip_addr(request):
474+
def choose_ip_address(request):
471475
if 'network' not in request.GET:
472476
servers = list(
473477
Query({'servertype': 'route_network'}, ['hostname', 'intern_ip'],
474478
['hostname']))
475479

476-
return TemplateResponse(request, 'servershell/choose_ip_addr.html',
480+
return TemplateResponse(request, 'servershell/choose_ip_address.html',
477481
{'servers': servers})
478482

479483
network = request.GET['network']
@@ -490,15 +494,12 @@ def choose_ip_addr(request):
490494
))
491495

492496
if servers:
493-
return TemplateResponse(request, 'servershell/choose_ip_addr.html',
497+
return TemplateResponse(request, 'servershell/choose_ip_address.html',
494498
{'servers': servers})
495499

496-
# TODO: This is specific to our data model, we should get it independent
497-
network_query = Query(
498-
{'intern_ip': network, 'servertype': Not('provider_network')},
499-
['intern_ip', 'servertype'])
500+
network_query = Query({'intern_ip': network}, ['intern_ip'])
500501

501-
return TemplateResponse(request, 'servershell/choose_ip_addr.html', {
502+
return TemplateResponse(request, 'servershell/choose_ip_address.html', {
502503
'ip_addrs': islice(network_query.get_free_ip_addrs(), 50)})
503504

504505

serveradmin/settings.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -196,6 +196,12 @@
196196
'graphOnly=true'
197197
)
198198

199+
CHOOSE_IP_ADDRESS = {
200+
'include': 'servershell/modals/choose_ip_address.html',
201+
'url': '/servershell/choose_ip_address',
202+
'js': 'js/servershell/choose_ip_address.js',
203+
}
204+
199205
# Using exec certainly isn't an awesome solution but it's the best we've got.
200206
# The problem boils down to django configs being python files but python only
201207
# imports code from modules in its path. One solution would be to generate a

0 commit comments

Comments
 (0)