From 33c6d61d2d58548e01a4df6114d41cac4c4759b4 Mon Sep 17 00:00:00 2001 From: Nikolai Kristiansen Date: Sat, 3 Oct 2015 14:28:37 +0200 Subject: [PATCH] Fixes some ipaddress api changes, adds puppet host validation endpoint with test --- mdb/api/serializers.py | 46 + mdb/api/views.py | 19 +- mdb/fixtures/test_data.json | 2722 +++++++++++++++++++++ mdb/migrations/0007_auto_20151003_1313.py | 24 + mdb/models.py | 26 +- mdb/tests.py | 26 +- mdb/validators.py | 5 +- mdbsite/settings.py | 1 + requirements.txt | 3 +- 9 files changed, 2849 insertions(+), 23 deletions(-) create mode 100644 mdb/fixtures/test_data.json create mode 100644 mdb/migrations/0007_auto_20151003_1313.py diff --git a/mdb/api/serializers.py b/mdb/api/serializers.py index e69de29..17a1fec 100644 --- a/mdb/api/serializers.py +++ b/mdb/api/serializers.py @@ -0,0 +1,46 @@ +from mdb.models import Host, Interface, Domain +from rest_framework import serializers +from rest_framework.exceptions import ValidationError + + +class HostValidateSecretSerializer(serializers.Serializer): + certname = serializers.CharField(required=True) + pxe_key = serializers.CharField(required=True) + host = None + + def _host_in_domain_exists(self, attrs): + fqdn = attrs['certname'] + host_name = fqdn.split('.')[0] + domain = '.'.join(fqdn.split('.')[1:]) + + try: + return Host.objects.get(hostname=host_name, interface__domain__domain_name=domain) + except (Host.DoesNotExist, Host.MultipleObjectsReturned): + return None + + def validate(self, attrs): + # custom validation + host = self._host_in_domain_exists(attrs) + + if host is None: + raise ValidationError('Host \'{}\' not found'.format(attrs['certname'])) + + if not host.pxe_installable: + raise ValidationError('Host is marked as not installable via PXE.') + + if not host.pxe_key: + raise ValidationError('Host has no pxe_key.') + + if host.pxe_key != attrs['pxe_key']: + raise ValidationError('Supplied pxe_key does not match host.') + + self.host = host + + return attrs + + def create(self, validated_data): + # Make requests kind of idempotent by only allowing 1 request / installation + self.host.pxe_installable = False + self.host.save() + + return self.host diff --git a/mdb/api/views.py b/mdb/api/views.py index c8c2bee..8b2b1f8 100644 --- a/mdb/api/views.py +++ b/mdb/api/views.py @@ -1,7 +1,20 @@ +from rest_framework.authentication import TokenAuthentication +from rest_framework.permissions import IsAuthenticated +from rest_framework.response import Response from rest_framework.views import APIView +from mdb.api.serializers import HostValidateSecretSerializer + class ValidatePuppetHostSecret(APIView): - def post(self): - # TODO - pass + authentication_classes = [TokenAuthentication] + permission_classes = [IsAuthenticated] + + def post(self, request): + serializer = HostValidateSecretSerializer(data=request.data) + + serializer.is_valid(raise_exception=True) + + serializer.save() # sets pxe_installable=False + + return Response({'valid_secret': True}) diff --git a/mdb/fixtures/test_data.json b/mdb/fixtures/test_data.json new file mode 100644 index 0000000..0ef9f9a --- /dev/null +++ b/mdb/fixtures/test_data.json @@ -0,0 +1,2722 @@ +[ +{ + "pk": 1, + "fields": { + "hostname": "sega.neuf.no" + }, + "model": "mdb.nameserver" +}, +{ + "pk": 2, + "fields": { + "hostname": "atari.neuf.no" + }, + "model": "mdb.nameserver" +}, +{ + "pk": 1, + "fields": { + "priority": 10, + "hostname": "mx.neuf.no" + }, + "model": "mdb.mailexchange" +}, +{ + "pk": 1, + "fields": { + "domain_admin": "sysadmin@neuf.no", + "created_date": "2015-10-03T13:02:53.581", + "domain_ipaddr": "127.0.0.1", + "domain_retry": 7200, + "domain_active_serial": 0, + "domain_nameservers": [ + 1, + 2 + ], + "domain_mailexchanges": [ + 1 + ], + "domain_serial": 2015100301, + "domain_refresh": 28800, + "domain_name": "edb.technology", + "domain_filename": "/tmp/mdb/bind/edb.technology", + "domain_minimum_ttl": 86400, + "domain_expire": 604800, + "domain_soa": "sega.neuf.no", + "domain_ttl": 3600 + }, + "model": "mdb.domain" +}, +{ + "pk": 1, + "fields": { + "log_facility": "local7", + "name": "default", + "max_lease_time": 7200, + "default_lease_time": 600, + "authoritative": false, + "ddns_update_style": "none", + "active_serial": 1, + "serial": 2015100302 + }, + "model": "mdb.dhcpconfig" +}, +{ + "pk": 1, + "fields": { + "created_date": "2015-10-03T13:08:17.765", + "network": "10.0.3.0", + "name": "clients", + "domain_retry": 7200, + "domain_active_serial": 0, + "domain_nameservers": [ + 1, + 2 + ], + "dhcp_dynamic_end": "10.0.3.254", + "domain_serial": 2015100301, + "dhcp_config": 1, + "domain_refresh": 28800, + "domain_name": "3.0.10.in-addr.arpa", + "netmask": "255.255.255.0", + "dhcp_dynamic_start": "10.0.3.2", + "domain_admin": "sysadmin@neuf.no", + "domain_filename": "/tmp/mdb/bind/3.0.10.in-addr.arpa", + "domain_minimum_ttl": 86400, + "domain_expire": 604800, + "dhcp_dynamic": true, + "domain_soa": "sega.neuf.no", + "domain_ttl": 3600 + }, + "model": "mdb.ip4subnet" +}, +{ + "pk": 1, + "fields": { + "ip4subnet": 1, + "key": "domain-name", + "value": "\"edb.technology\"" + }, + "model": "mdb.dhcpoption" +}, +{ + "pk": 2, + "fields": { + "ip4subnet": 1, + "key": "domain-name-servers", + "value": "158.36.190.194, 158.36.190.199, 8.8.8.8" + }, + "model": "mdb.dhcpoption" +}, +{ + "pk": 3, + "fields": { + "ip4subnet": 1, + "key": "routers", + "value": "158.36.186.1" + }, + "model": "mdb.dhcpoption" +}, +{ + "pk": 1, + "fields": { + "ip4subnet": 1, + "value": "deny unknown-clients" + }, + "model": "mdb.dhcpcustomfield" +}, +{ + "pk": 1, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.1" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 2, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.2" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 3, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.3" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 4, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.4" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 5, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.5" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 6, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.6" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 7, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.7" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 8, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.8" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 9, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.9" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 10, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.10" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 11, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.11" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 12, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.12" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 13, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.13" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 14, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.14" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 15, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.15" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 16, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.16" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 17, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.17" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 18, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.18" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 19, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.19" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 20, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.20" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 21, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.21" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 22, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.22" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 23, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.23" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 24, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.24" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 25, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.25" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 26, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.26" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 27, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.27" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 28, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.28" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 29, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.29" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 30, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.30" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 31, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.31" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 32, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.32" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 33, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.33" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 34, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.34" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 35, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.35" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 36, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.36" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 37, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.37" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 38, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.38" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 39, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.39" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 40, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.40" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 41, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.41" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 42, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.42" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 43, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.43" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 44, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.44" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 45, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.45" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 46, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.46" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 47, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.47" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 48, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.48" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 49, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.49" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 50, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.50" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 51, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.51" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 52, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.52" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 53, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.53" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 54, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.54" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 55, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.55" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 56, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.56" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 57, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.57" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 58, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.58" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 59, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.59" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 60, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.60" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 61, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.61" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 62, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.62" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 63, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.63" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 64, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.64" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 65, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.65" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 66, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.66" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 67, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.67" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 68, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.68" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 69, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.69" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 70, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.70" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 71, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.71" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 72, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.72" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 73, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.73" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 74, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.74" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 75, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.75" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 76, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.76" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 77, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.77" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 78, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.78" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 79, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.79" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 80, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.80" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 81, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.81" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 82, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.82" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 83, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.83" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 84, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.84" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 85, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.85" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 86, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.86" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 87, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.87" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 88, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.88" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 89, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.89" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 90, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.90" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 91, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.91" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 92, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.92" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 93, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.93" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 94, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.94" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 95, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.95" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 96, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.96" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 97, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.97" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 98, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.98" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 99, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.99" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 100, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.100" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 101, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.101" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 102, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.102" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 103, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.103" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 104, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.104" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 105, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.105" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 106, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.106" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 107, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.107" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 108, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.108" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 109, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.109" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 110, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.110" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 111, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.111" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 112, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.112" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 113, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.113" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 114, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.114" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 115, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.115" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 116, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.116" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 117, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.117" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 118, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.118" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 119, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.119" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 120, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.120" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 121, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.121" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 122, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.122" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 123, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.123" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 124, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.124" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 125, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.125" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 126, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.126" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 127, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.127" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 128, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.128" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 129, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.129" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 130, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.130" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 131, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.131" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 132, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.132" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 133, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.133" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 134, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.134" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 135, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.135" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 136, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.136" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 137, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.137" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 138, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.138" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 139, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.139" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 140, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.140" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 141, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.141" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 142, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.142" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 143, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.143" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 144, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.144" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 145, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.145" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 146, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.146" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 147, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.147" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 148, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.148" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 149, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.149" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 150, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.150" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 151, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.151" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 152, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.152" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 153, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.153" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 154, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.154" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 155, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.155" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 156, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.156" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 157, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.157" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 158, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.158" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 159, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.159" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 160, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.160" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 161, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.161" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 162, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.162" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 163, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.163" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 164, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.164" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 165, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.165" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 166, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.166" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 167, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.167" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 168, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.168" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 169, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.169" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 170, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.170" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 171, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.171" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 172, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.172" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 173, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.173" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 174, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.174" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 175, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.175" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 176, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.176" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 177, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.177" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 178, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.178" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 179, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.179" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 180, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.180" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 181, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.181" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 182, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.182" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 183, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.183" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 184, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.184" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 185, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.185" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 186, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.186" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 187, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.187" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 188, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.188" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 189, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.189" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 190, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.190" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 191, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.191" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 192, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.192" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 193, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.193" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 194, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.194" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 195, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.195" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 196, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.196" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 197, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.197" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 198, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.198" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 199, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.199" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 200, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.200" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 201, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.201" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 202, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.202" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 203, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.203" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 204, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.204" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 205, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.205" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 206, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.206" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 207, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.207" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 208, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.208" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 209, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.209" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 210, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.210" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 211, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.211" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 212, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.212" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 213, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.213" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 214, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.214" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 215, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.215" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 216, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.216" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 217, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.217" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 218, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.218" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 219, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.219" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 220, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.220" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 221, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.221" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 222, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.222" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 223, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.223" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 224, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.224" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 225, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.225" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 226, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.226" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 227, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.227" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 228, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.228" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 229, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.229" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 230, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.230" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 231, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.231" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 232, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.232" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 233, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.233" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 234, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.234" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 235, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.235" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 236, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.236" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 237, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.237" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 238, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.238" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 239, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.239" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 240, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.240" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 241, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.241" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 242, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.242" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 243, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.243" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 244, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.244" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 245, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.245" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 246, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.246" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 247, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.247" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 248, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.248" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 249, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.249" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 250, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.250" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 251, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.251" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 252, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.252" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 253, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.253" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 254, + "fields": { + "ping_avg_rtt": null, + "subnet": 1, + "last_contact": null, + "address": "10.0.3.254" + }, + "model": "mdb.ip4address" +}, +{ + "pk": 1, + "fields": { + "description": "Client machine (puppet controlled)", + "host_type": "client" + }, + "model": "mdb.hosttype" +}, +{ + "pk": 1, + "fields": { + "name": "ubuntu", + "arch": "x86_64", + "version": "14.04" + }, + "model": "mdb.operatingsystem" +}, +{ + "pk": 1, + "fields": { + "created_date": "2015-10-03T13:23:37.061", + "owner": "edb", + "serial_number": "12345678", + "kerberos_principal_created": false, + "model": "OptiPlex 760", + "pxe_key": "snop", + "kerberos_principal_name": "", + "kerberos_principal_created_date": null, + "pxe_installable": true, + "description": "testclient", + "host_type": 1, + "location": "kak", + "operating_system": 1, + "virtual": false, + "brand": "Dell", + "request_kerberos_principal": false, + "hostname": "tut" + }, + "model": "mdb.host" +}, +{ + "pk": 1, + "fields": { + "created_date": "2015-10-03T13:23:37.063", + "name": "eth0", + "ip4address": 2, + "host": 1, + "domain": 1, + "pxe_filename": "pxelinux.0", + "macaddr": "f0:de:f1:58:be:1a", + "dhcp_client": true + }, + "model": "mdb.interface" +} +] diff --git a/mdb/migrations/0007_auto_20151003_1313.py b/mdb/migrations/0007_auto_20151003_1313.py new file mode 100644 index 0000000..27db5c3 --- /dev/null +++ b/mdb/migrations/0007_auto_20151003_1313.py @@ -0,0 +1,24 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('mdb', '0006_auto_20151001_2235'), + ] + + operations = [ + migrations.AddField( + model_name='host', + name='pxe_installable', + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name='host', + name='pxe_key', + field=models.CharField(max_length=254, blank=True), + ), + ] diff --git a/mdb/models.py b/mdb/models.py index de4904f..d55a720 100644 --- a/mdb/models.py +++ b/mdb/models.py @@ -346,19 +346,19 @@ class Ip4Subnet(models.Model): def num_addresses(self): subnet = ipaddress.IPv4Network(self.network + "/" + self.netmask) - return subnet.numhosts + return subnet.num_addresses def broadcast_address(self): subnet = ipaddress.IPv4Network(self.network + "/" + self.netmask) - return subnet.broadcast + return subnet.broadcast_address def first_address(self): subnet = ipaddress.IPv4Network(self.network + "/" + self.netmask) - return subnet.iterhosts().next() + return next(subnet.hosts()) def last_address(self): subnet = ipaddress.IPv4Network(self.network + "/" + self.netmask) - for curr in subnet.iterhosts(): + for curr in subnet.hosts(): pass # horribly inefficient return curr @@ -448,15 +448,14 @@ class Ip4Address(models.Model): ping_avg_rtt = models.FloatField(null=True, blank=True) def __str__(self): - # FIXME: generates 2 SQL queries - _if = self.interface_set.all() - if not _if: + # FIXME: generates 2 SQL queries? + if not hasattr(self, 'interface'): return self.address - return "{} ({})".format(self.address, _if.get().host.hostname) + return "{} ({})".format(self.address, self.interface.host.hostname) def assigned_to_host(self): - return self.interface_set.get().host + return self.interface.host assigned_to_host.short_description = "Assigned to Host" @@ -523,12 +522,15 @@ class Host(models.Model): kerberos_principal_name = models.CharField(max_length=256, editable=False) kerberos_principal_created_date = models.DateTimeField(null=True, blank=True, editable=False) + pxe_key = models.CharField(max_length=254, blank=True) + pxe_installable = models.BooleanField(default=False) + def __str__(self): return self.hostname def in_domain(self): domains = self.interface_set.values_list('domain__domain_name', flat=True) - return u",".join(domains) + return ",".join(domains) in_domain.short_description = "in domains" @@ -562,7 +564,7 @@ class Interface(models.Model): return "%s (%s on %s)" % (self.macaddr, self.name, self.host.hostname) def ipv6_enabled(self): - return self.ip6address_set.count() > 0 + return self.ip6address_set.exists() @python_2_unicode_compatible @@ -624,7 +626,7 @@ def create_ips_for_subnet(sender, instance, created, **kwargs): subnet = ipaddress.IPv4Network(instance.network + "/" + instance.netmask) - for addr in subnet.iterhosts(): + for addr in subnet.hosts(): address = Ip4Address(address=str(addr), subnet=instance) address.save() diff --git a/mdb/tests.py b/mdb/tests.py index f699e78..bfd4846 100644 --- a/mdb/tests.py +++ b/mdb/tests.py @@ -1,12 +1,28 @@ +from django.contrib.auth.models import User from django.core.urlresolvers import reverse +from mdb.models import Host +from rest_framework.authtoken.models import Token from rest_framework.test import APITestCase -class APITestCases(APITestCase): +class MyAPITestCases(APITestCase): + fixtures = ['test_data'] + + def create_user_with_token(self): + self.user = User.objects.create(username='admin') + self.token = Token.objects.create(user=self.user) + self.host = Host.objects.first() + + def setUp(self): + self.create_user_with_token() + return super(MyAPITestCases, self).setUp() + def test_validate_puppet_host_by_secret(self): data = { - 'secret': 'something', - 'certname': 'arnold.neuf.no' + 'pxe_key': self.host.pxe_key, + 'certname': '{}.{}'.format(self.host.hostname, self.host.interface_set.first().domain.domain_name) } - res = self.client.post(reverse('api-validate-host-secret'), data) - self.fail() + self.client.credentials(HTTP_AUTHORIZATION='Token {}'.format(self.token.key)) + res = self.client.post(reverse('api-validate-host-secret'), data, format='json') + self.assertEquals(res.status_code, 200, res.content) + self.assertFalse(Host.objects.get(pk=self.host.pk).pxe_installable) diff --git a/mdb/validators.py b/mdb/validators.py index 58bfb1b..5959f1b 100644 --- a/mdb/validators.py +++ b/mdb/validators.py @@ -1,3 +1,4 @@ +from __future__ import unicode_literals from django.core.validators import RegexValidator import re @@ -5,11 +6,11 @@ import re hostname_re = re.compile(r'^(?!-)[-a-z0-9]+(?=1.8,<1.9 django-auth-ldap -django-suit==0.2.15 +django-extensions==1.5.7 djangorestframework==3.2.4 +django-suit==0.2.15 ipaddress==1.0.14 mysqlclient==1.3.6