Skip to content

Commit 975fbd7

Browse files
authored
Merge pull request #1480 from sangramaltur/development
Add Device DOS support
2 parents 22773b6 + 0d3c610 commit 975fbd7

3 files changed

Lines changed: 100 additions & 1 deletion

File tree

f5/bigip/tm/security/dos.py

Lines changed: 40 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@
3232
from f5.bigip.resource import OrganizingCollection
3333
from f5.bigip.resource import Resource
3434
from f5.sdk_exception import NonExtantApplication
35+
from f5.sdk_exception import UnsupportedOperation
36+
3537

3638
from distutils.version import LooseVersion
3739

@@ -41,7 +43,9 @@ class Dos(OrganizingCollection):
4143

4244
def __init__(self, security):
4345
super(Dos, self).__init__(security)
44-
self._meta_data['allowed_lazy_attributes'] = [Profiles]
46+
self._meta_data['allowed_lazy_attributes'] = [
47+
Profiles,
48+
Device_Configs]
4549

4650

4751
class Profiles(Collection):
@@ -297,3 +301,38 @@ def _exists_11_6(self, **kwargs):
297301

298302
return self._check_existence_by_collection(
299303
self._meta_data['container'], kwargs['name'])
304+
305+
306+
class Device_Configs(Collection):
307+
"""BIG-IP® Dos Device collection"""
308+
def __init__(self, dos):
309+
super(Device_Configs, self).__init__(dos)
310+
self._meta_data['allowed_lazy_attributes'] = [Device_Config]
311+
self._meta_data['attribute_registry'] = \
312+
{'tm:security:dos:device-config:device-configstate': Device_Config}
313+
314+
315+
class Device_Config(Resource):
316+
"""BIG-IP® Dos Device resource"""
317+
def __init__(self, device_configs):
318+
super(Device_Config, self).__init__(device_configs)
319+
self._meta_data['required_json_kind'] = \
320+
'tm:security:dos:device-config:device-configstate'
321+
322+
def create(self, **kwargs):
323+
"""Create is not supported for Device_Config
324+
325+
:raises: UnsupportedOperation
326+
"""
327+
raise UnsupportedOperation(
328+
"%s does not support the update method" % self.__class__.__name__
329+
)
330+
331+
def delete(self, **kwargs):
332+
"""Delete is not supported for Device_Config
333+
334+
:raises: UnsupportedOperation
335+
"""
336+
raise UnsupportedOperation(
337+
"%s does not support the delete method" % self.__class__.__name__
338+
)

f5/bigip/tm/security/test/functional/test_dos.py

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727

2828
DESC = 'TESTCHANGEDIT'
2929
ATCK = [{'name': 'tcp-rst-flood', 'rateLimit': 100, 'rateThreshold': 50}]
30+
DIV_ATCK = [{'name': 'tcp-syn-flood', 'defaultInternalRateLimit': 100, 'detectionThresholdPps': 10}]
3031

3132

3233
@pytest.fixture(scope='function')
@@ -37,6 +38,13 @@ def dos_profile(mgmt_root):
3738
profile.delete()
3839

3940

41+
@pytest.fixture(scope='function')
42+
def dos_device_config(mgmt_root):
43+
device_config = mgmt_root.tm.security.dos.device_configs.device_config.load(
44+
name='dos-device-config', partition='Common')
45+
yield device_config
46+
47+
4048
class TestDosProfiles(object):
4149
def test_create_req_arg(self, dos_profile):
4250
r1 = dos_profile
@@ -602,3 +610,28 @@ def test_sip_subcollection(self, dos_profile):
602610
assert isinstance(rc, list)
603611
assert len(rc)
604612
assert isinstance(rc[0], Protocol_Sip)
613+
614+
615+
class TestDeviceConfig(object):
616+
"""Dos device config functional tests, cant create or delete"""
617+
def test_load_req_arg(self, dos_device_config):
618+
r1 = dos_device_config
619+
URI = 'https://localhost/mgmt/tm/security/dos/device-config/~Common' \
620+
'~dos-device-config'
621+
assert r1.name == 'dos-device-config'
622+
assert r1.partition == 'Common'
623+
assert r1.selfLink.startswith(URI)
624+
625+
def test_load_and_update(self, dos_device_config, mgmt_root):
626+
r1 = dos_device_config
627+
r2 = mgmt_root.tm.security.dos.device_configs.device_config.load(name='dos-device-config', partition='Common')
628+
assert r1.name == r2.name
629+
assert r1.selfLink == r2.selfLink
630+
assert r1.dosDeviceVector == r2.dosDeviceVector
631+
r2.dosDeviceVector = DIV_ATCK
632+
r2.update()
633+
assert r1.selfLink == r2.selfLink
634+
assert r1.name == r2.name
635+
assert r1.dosDeviceVector != r2.dosDeviceVector
636+
r1.refresh()
637+
assert r1.dosDeviceVector == r2.dosDeviceVector

f5/bigip/tm/security/test/unit/test_dos.py

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
from f5.bigip import ManagementRoot
2020
from f5.bigip.tm.security.dos import Application
2121
from f5.bigip.tm.security.dos import Applications
22+
from f5.bigip.tm.security.dos import Device_Config
2223
from f5.bigip.tm.security.dos import Dos_Network
2324
from f5.bigip.tm.security.dos import Dos_Networks
2425
from f5.bigip.tm.security.dos import Profile
@@ -27,7 +28,10 @@
2728
from f5.bigip.tm.security.dos import Protocol_Sip
2829
from f5.bigip.tm.security.dos import Protocol_Sips
2930

31+
3032
from f5.sdk_exception import MissingRequiredCreationParameter
33+
from f5.sdk_exception import MissingRequiredReadParameter
34+
from f5.sdk_exception import UnsupportedOperation
3135

3236
from six import iterkeys
3337

@@ -39,6 +43,13 @@ def FakeProfile():
3943
return fake_profile
4044

4145

46+
@pytest.fixture
47+
def FakeDeviceConfig():
48+
fake_device_configs = mock.MagicMock()
49+
fake_device_config = Device_Config(fake_device_configs)
50+
return fake_device_config
51+
52+
4253
def Makeprofile(fakeicontrolsession):
4354
b = ManagementRoot('192.168.1.1', 'admin', 'admin')
4455
p = b.tm.security.dos.profiles.profile
@@ -150,3 +161,19 @@ def test_sip_create_no_args_v11(self, fakeicontrolsession):
150161
pc = Protocol_Sips(Makeprofile(fakeicontrolsession))
151162
with pytest.raises(MissingRequiredCreationParameter):
152163
pc.protocol_sip.create()
164+
165+
166+
class TestDosDeviceConfig(object):
167+
def test_create_raises(self, fakeicontrolsession):
168+
b = ManagementRoot('192.168.1.1', 'admin', 'admin')
169+
with pytest.raises(UnsupportedOperation):
170+
b.tm.security.dos.device_configs.device_config.create()
171+
172+
def test_delete_raises(self, fakeicontrolsession):
173+
b = ManagementRoot('192.168.1.1', 'admin', 'admin')
174+
with pytest.raises(UnsupportedOperation):
175+
b.tm.security.dos.device_configs.device_config.delete()
176+
177+
def test_load_no_args(self, FakeDeviceConfig):
178+
with pytest.raises(MissingRequiredReadParameter):
179+
FakeDeviceConfig.load()

0 commit comments

Comments
 (0)