diff --git a/app/admin/views.py b/app/admin/views.py index 69aad416a49850f6927de0a9b15f5427eb978a44..998718ff6f595c17b2de2a2a5895b0db0f806be7 100644 --- a/app/admin/views.py +++ b/app/admin/views.py @@ -85,9 +85,3 @@ class NetworkAdmin(AdminModelView): form_overrides = { 'vlan_name': fields.StringField, } - - form_args = { - 'gateway': { - 'filters': [lambda x: x or None], - }, - } diff --git a/app/defaults.py b/app/defaults.py index 737f7d689004860a7391c24051620c5ad790623f..4eaf8a1c2b5f9177ebe4e2fcd7ebc083b4a6707d 100644 --- a/app/defaults.py +++ b/app/defaults.py @@ -28,6 +28,5 @@ defaults = [ models.DeviceType(name='VME'), models.DeviceType(name='PLC'), - models.Tag(name='gateway', admin_only=True), models.Tag(name='IOC', admin_only=False), ] diff --git a/app/models.py b/app/models.py index dc1cf05fae08b5e92bd30e5f21312640e55ee7ec..2dd4a6b70547a9a2f9060f056e85b2f1a9e6ca85 100644 --- a/app/models.py +++ b/app/models.py @@ -511,12 +511,10 @@ class Network(CreatedMixin, db.Model): return [addr for addr in self.ip_range() if addr not in self.used_ips()] + @property def gateway(self): - """Return the network gateway""" - for interface in self.interfaces: - if 'gateway' in [tag.name for tag in interface.tags]: - return interface - return None + """Return the network gateway IP""" + return list(self.network_ip.hosts())[-1] @staticmethod def ip_in_network(ip, address): diff --git a/app/network/forms.py b/app/network/forms.py index ff5222bc2bedb217747a7f236ec9c724a504338d..37b9a7fe8599e51e0fb41a1368aa93bec177c93b 100644 --- a/app/network/forms.py +++ b/app/network/forms.py @@ -34,17 +34,6 @@ def starts_with_hostname(form, field): raise validators.ValidationError(f'Interface name shall start with the hostname "{hostname}"') -def validate_tags(form, field): - choices = dict(field.choices) - for tag_id in field.data: - tag_name = choices.get(tag_id) - if tag_name == 'gateway': - network = models.Network.query.get(form.network_id.data) - existing_gateway = network.gateway() - if existing_gateway is not None: - raise validators.ValidationError(f'A gateway is already defined for network {network}: {existing_gateway}') - - def ip_in_network(form, field): """Check that the IP is in the network""" network_id_field = form['network_id'] @@ -149,8 +138,7 @@ class InterfaceForm(CSEntryForm): description='space separated list of cnames (must be 2-20 characters long and contain only letters, numbers and dash)', validators=[validators.Optional(), RegexpList(HOST_NAME_RE)]) - tags = SelectMultipleField('Tags', coerce=utils.coerce_to_str_or_none, - validators=[validate_tags]) + tags = SelectMultipleField('Tags', coerce=utils.coerce_to_str_or_none) def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) diff --git a/tests/functional/test_models.py b/tests/functional/test_models.py index fd5063d27d0ebf29bc37fc5bd06a6ffa1ea99789..bf2185fc105750f86464cca751a209e2cde1dec2 100644 --- a/tests/functional/test_models.py +++ b/tests/functional/test_models.py @@ -94,6 +94,13 @@ def test_network_available_and_used_ips(network_factory, interface_factory): assert list(network2.available_ips()) == [] +def test_network_gateway(network_factory): + network = network_factory(address='192.168.0.0/24') + assert str(network.gateway) == '192.168.0.254' + network = network_factory(address='172.16.110.0/23') + assert str(network.gateway) == '172.16.111.254' + + def test_mac_address_validation(mac_factory): mac = mac_factory(address='F4:A7:39:15:DA:01') assert mac.address == 'f4:a7:39:15:da:01'