Merge branch 'upstreammaster'
[sfa.git] / sfa / openstack / security_group.py
1 from sfa.util.sfalogging import logger
2
3 class SecurityGroup:
4
5     def __init__(self, driver):
6         self.driver = driver
7
8         
9     def create_security_group(self, name):
10         conn = self.driver.euca_shell.get_euca_connection()
11         try:
12             conn.create_security_group(name=name, description="")
13         except Exception, ex:
14             logger.log_exc("Failed to add security group")
15
16     def delete_security_group(self, name):
17         conn = self.driver.euca_shell.get_euca_connection()
18         try:
19             conn.delete_security_group(name=name)
20         except Exception, ex:
21             logger.log_exc("Failed to delete security group")
22
23
24     def _validate_port_range(self, port_range):
25         from_port = to_port = None
26         if isinstance(port_range, str):
27             ports = port_range.split('-')
28             if len(ports) > 1:
29                 from_port = int(ports[0])
30                 to_port = int(ports[1])
31             else:
32                 from_port = to_port = int(ports[0])
33         else:
34             from_port = to_port = None
35         return (from_port, to_port)
36
37     def _validate_icmp_type_code(self, icmp_type_code):
38         from_port = to_port = None
39         if isinstance(icmp_type_code, str):
40             code_parts = icmp_type_code.split(':')
41             if len(code_parts) > 1:
42                 try:
43                     from_port = int(code_parts[0])
44                     to_port = int(code_parts[1])
45                 except ValueError:
46                     logger.error('port must be an integer.')
47         return (from_port, to_port)
48
49
50     def add_rule_to_group(self, group_name=None, protocol='tcp', cidr_ip='0.0.0.0/0',
51                           port_range=None, icmp_type_code=None,
52                           source_group_name=None, source_group_owner_id=None):
53
54         from_port, to_port = self._validate_port_range(port_range)
55         icmp_type = self._validate_icmp_type_code(icmp_type_code)
56         if icmp_type:
57             from_port, to_port = icmp_type[0], icmp_type[1]
58
59         if group_name:
60             conn = self.driver.euca_shell.get_euca_connection()
61             try:
62                 conn.authorize_security_group(
63                     group_name=group_name,
64                     src_security_group_name=source_group_name,
65                     src_security_group_owner_id=source_group_owner_id,
66                     ip_protocol=protocol,
67                     from_port=from_port,
68                     to_port=to_port,
69                     cidr_ip=cidr_ip,
70                     )
71             except Exception, ex:
72                 logger.log_exc("Failed to add rule to group %s" % group_name)
73
74
75     def remove_rule_from_group(self, group_name=None, protocol='tcp', cidr_ip='0.0.0.0/0',
76                           port_range=None, icmp_type_code=None,
77                           source_group_name=None, source_group_owner_id=None):
78
79         from_port, to_port = self._validate_port_range(port_range)
80         icmp_type = self._validate_icmp_type_code(icmp_type_code)
81         if icmp_type:
82             from_port, to_port = icmp_type[0], icmp_type[1]
83
84         if group_name:
85             conn = self.driver.euca_shell.get_euca_connection()
86             try:
87                 conn.revoke_security_group(
88                     group_name=group_name,
89                     src_security_group_name=source_group_name,
90                     src_security_group_owner_id=source_group_owner_id,
91                     ip_protocol=protocol,
92                     from_port=from_port,
93                     to_port=to_port,
94                     cidr_ip=ip,
95                     )
96             except Exception, ex:
97                 logger.log_exc("Failed to remove rule from group %s" % group_name) 
98