From bc25877a6bf4d579508b1ee9df3ca7870757f029 Mon Sep 17 00:00:00 2001 From: Tyler Lubeck Date: Sun, 29 Dec 2019 15:51:41 -0800 Subject: Implement __eq__ and __hash__ for ACL objects (#1955) --- kafka/admin/acl_resource.py | 34 +++++++++++++++- test/test_acl_comparisons.py | 92 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 125 insertions(+), 1 deletion(-) create mode 100644 test/test_acl_comparisons.py diff --git a/kafka/admin/acl_resource.py b/kafka/admin/acl_resource.py index 7a012d2..fd997a1 100644 --- a/kafka/admin/acl_resource.py +++ b/kafka/admin/acl_resource.py @@ -112,6 +112,24 @@ class ACLFilter(object): resource=self.resource_pattern ) + def __eq__(self, other): + return all(( + self.principal == other.principal, + self.host == other.host, + self.operation == other.operation, + self.permission_type == other.permission_type, + self.resource_pattern == other.resource_pattern + )) + + def __hash__(self): + return hash(( + self.principal, + self.host, + self.operation, + self.permission_type, + self.resource_pattern, + )) + class ACL(ACLFilter): """Represents a concrete ACL for a specific ResourcePattern @@ -181,6 +199,20 @@ class ResourcePatternFilter(object): self.pattern_type.name ) + def __eq__(self, other): + return all(( + self.resource_type == other.resource_type, + self.resource_name == other.resource_name, + self.pattern_type == other.pattern_type, + )) + + def __hash__(self): + return hash(( + self.resource_type, + self.resource_name, + self.pattern_type + )) + class ResourcePattern(ResourcePatternFilter): """A resource pattern to apply the ACL to @@ -209,4 +241,4 @@ class ResourcePattern(ResourcePatternFilter): if self.pattern_type in [ACLResourcePatternType.ANY, ACLResourcePatternType.MATCH]: raise IllegalArgumentError( "pattern_type cannot be {} on a concrete ResourcePattern".format(self.pattern_type.name) - ) \ No newline at end of file + ) diff --git a/test/test_acl_comparisons.py b/test/test_acl_comparisons.py new file mode 100644 index 0000000..291bf0e --- /dev/null +++ b/test/test_acl_comparisons.py @@ -0,0 +1,92 @@ +from kafka.admin.acl_resource import ACL +from kafka.admin.acl_resource import ACLOperation +from kafka.admin.acl_resource import ACLPermissionType +from kafka.admin.acl_resource import ResourcePattern +from kafka.admin.acl_resource import ResourceType +from kafka.admin.acl_resource import ACLResourcePatternType + + +def test_different_acls_are_different(): + one = ACL( + principal='User:A', + host='*', + operation=ACLOperation.ALL, + permission_type=ACLPermissionType.ALLOW, + resource_pattern=ResourcePattern( + resource_type=ResourceType.TOPIC, + resource_name='some-topic', + pattern_type=ACLResourcePatternType.LITERAL + ) + ) + + two = ACL( + principal='User:B', # Different principal + host='*', + operation=ACLOperation.ALL, + permission_type=ACLPermissionType.ALLOW, + resource_pattern=ResourcePattern( + resource_type=ResourceType.TOPIC, + resource_name='some-topic', + pattern_type=ACLResourcePatternType.LITERAL + ) + ) + + assert one != two + assert hash(one) != hash(two) + +def test_different_acls_are_different_with_glob_topics(): + one = ACL( + principal='User:A', + host='*', + operation=ACLOperation.ALL, + permission_type=ACLPermissionType.ALLOW, + resource_pattern=ResourcePattern( + resource_type=ResourceType.TOPIC, + resource_name='*', + pattern_type=ACLResourcePatternType.LITERAL + ) + ) + + two = ACL( + principal='User:B', # Different principal + host='*', + operation=ACLOperation.ALL, + permission_type=ACLPermissionType.ALLOW, + resource_pattern=ResourcePattern( + resource_type=ResourceType.TOPIC, + resource_name='*', + pattern_type=ACLResourcePatternType.LITERAL + ) + ) + + assert one != two + assert hash(one) != hash(two) + +def test_same_acls_are_same(): + one = ACL( + principal='User:A', + host='*', + operation=ACLOperation.ALL, + permission_type=ACLPermissionType.ALLOW, + resource_pattern=ResourcePattern( + resource_type=ResourceType.TOPIC, + resource_name='some-topic', + pattern_type=ACLResourcePatternType.LITERAL + ) + ) + + two = ACL( + principal='User:A', + host='*', + operation=ACLOperation.ALL, + permission_type=ACLPermissionType.ALLOW, + resource_pattern=ResourcePattern( + resource_type=ResourceType.TOPIC, + resource_name='some-topic', + pattern_type=ACLResourcePatternType.LITERAL + ) + ) + + assert one == two + assert hash(one) == hash(two) + assert len(set((one, two))) == 1 -- cgit v1.2.1