From 84a122f7286f913429754d8a1f5e4c320ba7e9ec Mon Sep 17 00:00:00 2001 From: Tony Mack Date: Wed, 14 Mar 2012 08:48:11 -0400 Subject: [PATCH] initial checkin --- sfa/openstack/image.py | 56 +++++++++++++++++ sfa/openstack/security_group.py | 107 ++++++++++++++++++++++++++++++++ 2 files changed, 163 insertions(+) create mode 100644 sfa/openstack/image.py create mode 100644 sfa/openstack/security_group.py diff --git a/sfa/openstack/image.py b/sfa/openstack/image.py new file mode 100644 index 00000000..973575d2 --- /dev/null +++ b/sfa/openstack/image.py @@ -0,0 +1,56 @@ +from nova.exception import ImageNotFound +from sfa.rspecs.elements.disk_image import DiskImage + +class Image: + + def __init__(self, driver): + self.driver = driver + + @staticmethod + def disk_image_to_rspec_object(image): + img = DiskImage() + img['name'] = image['ami']['name'] + img['description'] = image['ami']['name'] + img['os'] = image['ami']['name'] + img['version'] = image['ami']['name'] + return img + + def get_available_disk_images(self): + # get image records + disk_images = [] + for image in self.driver.shell.image_manager.detail(): + if image['container_format'] == 'ami': + disk_images.append(self.get_machine_image_details(image)) + return disk_images + + def get_machine_image_details(self, image): + """ + Returns a dict that contains the ami, aki and ari details for the specified + ami image. + """ + disk_image = {} + if image['container_format'] == 'ami': + kernel_id = image['properties']['kernel_id'] + ramdisk_id = image['properties']['ramdisk_id'] + disk_image['ami'] = image + disk_image['aki'] = self.driver.shell.image_manager.show(kernel_id) + disk_image['ari'] = self.driver.shell.image_manager.show(ramdisk_id) + return disk_image + + def get_disk_image(self, id=None, name=None): + """ + Look up a image bundle using the specifeid id or name + """ + disk_image = None + try: + if id: + image = self.driver.shell.image_manager.show(image_id) + elif name: + image = self.driver.shell.image_manager.show_by_name(image_name) + if image['container_format'] == 'ami': + disk_image = self.get_machine_image_details(image) + except ImageNotFound: + pass + return disk_image + + diff --git a/sfa/openstack/security_group.py b/sfa/openstack/security_group.py new file mode 100644 index 00000000..f7233129 --- /dev/null +++ b/sfa/openstack/security_group.py @@ -0,0 +1,107 @@ +from sfa.util.sfalogging import logger + +class SecurityGroup: + + def __init__(self, driver): + self.driver = driver + + + def create_security_group(self, name): + conn = self.driver.euca_shell.get_euca_connection() + try: + conn.create_security_group(name=group_name) + except Exception, ex: + logger.log_exc("Failed to add security group") + + def delete_security_group(self, name): + conn = self.driver.euca_shell.get_euca_connection() + try: + conn.delete_security_group(name=group_name) + except Exception, ex: + logger.log_exc("Failed to delete security group") + + + def _validate_port_range(self, port_range): + from_port = to_port = None + if isinstance(port_range, str): + ports = port_range.split('-') + if len(ports) > 1: + from_port = int(ports[0]) + to_port = int(ports[1]) + else: + from_port = to_port = int(ports[0]) + else: + from_port = to_port = None + return (from_port, to_port) + + def _validate_icmp_type_code(self, icmp_type_code): + from_port = to_port = None + if isinstance(icmp_type_code, str): + code_parts = icmp_type_code.split(':') + if len(code_parts) > 1: + try: + from_port = int(code_parts[0]) + to_port = int(code_parts[1]) + except ValueError: + logger.error('port must be an integer.') + return (from_port, to_port) + + + def add_rule_to_group(self, group_name=None, protocol='tcp', cidr_ip='0.0.0.0/0', + port_range=None, icmp_type_code=None, + source_group_name=None, source_group_owner_id=None): + + + from_port, to_port = self._validate_port_range(port_range) + icmp_type = self._validate_icmp_type_code(icmp_type_code) + if icmp_type: + from_port, to_port = icmp_type[0], icmp_type[1] + + if group_name: + if cidr_ip: + euca.validate_address(cidr_ip) + if protocol: + euca.validate_protocol(protocol) + conn = self.driver.euca_shell.get_euca_connection() + try: + conn.authorize_security_group( + group_name=group_name, + src_security_group_name=source_group_name, + src_security_group_owner_id=source_group_owner_id, + ip_protocol=protocol, + from_port=from_port, + to_port=to_port, + cidr_ip=ip, + ) + except Exception, ex: + logger.log_exc("Failed to add rule to group %s" % group_name) + + + def remove_rule_from_group(self, group_name=None, protocol='tcp', cidr_ip='0.0.0.0/0', + port_range=None, icmp_type_code=None, + source_group_name=None, source_group_owner_id=None): + + from_port, to_port = self._validate_port_range(port_range) + icmp_type = self._validate_icmp_type_code(icmp_type_code) + if icmp_type: + from_port, to_port = icmp_type[0], icmp_type[1] + + if group_name: + if cidr_ip: + euca.validate_address(cidr_ip) + if protocol: + euca.validate_protocol(protocol) + conn = self.driver.euca_shell.get_euca_connection() + try: + conn.revoke_security_group( + group_name=group_name, + src_security_group_name=source_group_name, + src_security_group_owner_id=source_group_owner_id, + ip_protocol=protocol, + from_port=from_port, + to_port=to_port, + cidr_ip=ip, + ) + except Exception, ex: + logger.log_exc("Failed to remove rule from group %s" % group_name) + -- 2.43.0