You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@libcloud.apache.org by "sebastien goasguen (JIRA)" <ji...@apache.org> on 2013/05/28 12:12:20 UTC

[dev] [jira] [Commented] (LIBCLOUD-332) CloudStack driver does not deal with security groups

    [ https://issues.apache.org/jira/browse/LIBCLOUD-332?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13668219#comment-13668219 ] 

sebastien goasguen commented on LIBCLOUD-332:
---------------------------------------------

Hi, find below a basic fix for this. I am aware that there are no tests for this, I only tested it with a production cloud.
I am interested by your code convention and how you prefer to deal with optional arguments. Note that optional arguments do not have a default value. Let me know:

>From 372346b849a8c7e712fdd2243c38bfab5269da4c Mon Sep 17 00:00:00 2001
From: Sebastien Goasguen <ru...@gmail.com>
Date: Tue, 28 May 2013 06:09:26 -0400
Subject: [PATCH] LIBCLOUD-332: Proposed fix for SG in CloudStack driver

---
 libcloud/compute/drivers/cloudstack.py | 82 ++++++++++++++++++++++++++++++++++
 1 file changed, 82 insertions(+)

diff --git libcloud/compute/drivers/cloudstack.py libcloud/compute/drivers/cloudstack.py
index e2c85dd..855e618 100644
--- libcloud/compute/drivers/cloudstack.py
+++ libcloud/compute/drivers/cloudstack.py
@@ -463,6 +463,88 @@ class CloudStackNodeDriver(CloudStackDriverMixIn, NodeDriver):
         self._async_request('deleteIpForwardingRule', id=rule.id)
         return True
 
+    def ex_list_security_groups(self, **kwargs):
+        """
+        Lists Security Groups
+        Optional parameters:
+        Parameters
+		==========
+		domainid = (uuid) list only resources belonging to the domain specified
+		account = (string) list resources by account. Must be used with the domainId parameter.
+		listall = (boolean) If set to false, list only resources belonging to the command's caller; if set to true - list resources that the caller is authorized to see. Default value is false
+		pagesize = (integer) 
+		keyword = (string) List by keyword
+		tags = (map) List resources by tags (key/value pairs)
+		id = (uuid) list the security group by the id provided
+		securitygroupname = (string) lists security groups by name
+		virtualmachineid = (uuid) lists security groups by virtual machine id
+		projectid = (uuid) list objects by project
+		isrecursive = (boolean) defaults to false, but if true, lists all resources from the parent specified by the domainId till leaves.
+		page = (integer) 
+        """
+
+        extra_args = kwargs        
+
+        return self._sync_request('listSecurityGroups',**extra_args)
+
+    def ex_create_security_group(self, name, **kwargs):
+        """
+        Creates a new Security Group
+       	Parameters
+		==========
+		account = (string) an optional account for the security group. Must be used with domainId.
+		domainid = (uuid) an optional domainId for the security group. If the account parameter is used, domainId must also be used.
+		name = (string) name of the security group
+		description = (string) the description of the security group
+		projectid = (uuid) Deploy vm for the project
+        """
+
+        extra_args = {}
+        for key in kwargs.keys():
+            extra_args[key] = kwargs.pop(key)
+
+        'Check that the security group name does not already exists'
+        list_sg = self.ex_list_security_groups()
+        for sg in list_sg['securitygroup']:
+            if name in sg['name']:
+                raise LibcloudError('This Security Group name already exists.')
+
+        return self._sync_request('createSecurityGroup',name=name,**extra_args)
+
+    def ex_authorize_security_group_ingress(self,securitygroupname,protocol,cidrlist,startport,endport=None):
+        """
+        Creates a new Security Group Ingress rule
+       	Parameters
+		==========
+		domainid = (uuid) an optional domainId for the security group. If the account parameter is used, domainId must also be used.
+		startport = (integer) start port for this ingress rule
+		securitygroupid = (uuid) The ID of the security group. Mutually exclusive with securityGroupName parameter
+		cidrlist = (list) the cidr list associated
+		usersecuritygrouplist = (map) user to security group mapping
+		securitygroupname = (string) The name of the security group. Mutually exclusive with securityGroupName parameter
+		account = (string) an optional account for the security group. Must be used with domainId.
+		icmpcode = (integer) error code for this icmp message
+		protocol = (string) TCP is default. UDP is the other supported protocol
+		icmptype = (integer) type of the icmp message being sent
+		projectid = (uuid) an optional project of the security group
+		endport = (integer) end port for this ingress rule
+        """
+
+        protocol = protocol.upper()
+        if protocol not in ('TCP', 'ICMP'):
+            raise LibcloudError('Only TCP and ICMP are allowed')
+
+        args = {
+            'securitygroupname': securitygroupname,
+            'protocol': protocol,
+            'startport': int(startport),
+            'cidrlist': cidrlist
+        }
+        if endport is None:
+            args['endport'] = int(startport)
+
+        return self._async_request('authorizeSecurityGroupIngress', **args)
+
     def ex_register_iso(self, name, url, location=None, **kwargs):
         """
         Registers an existing ISO by URL.
-- 
1.8.1.3


                
> CloudStack driver does not deal with security groups
> ----------------------------------------------------
>
>                 Key: LIBCLOUD-332
>                 URL: https://issues.apache.org/jira/browse/LIBCLOUD-332
>             Project: Libcloud
>          Issue Type: Bug
>          Components: Compute
>    Affects Versions: 0.12.3
>         Environment: trunk
>            Reporter: sebastien goasguen
>
> There are no extension functions to deal with security groups in the CloudStack driver.

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira