You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudstack.apache.org by bh...@apache.org on 2012/12/07 16:59:27 UTC

[3/4] git commit: api: SecurityGroupResponse and SecurityGroupRuleResponse refactoring

api: SecurityGroupResponse and SecurityGroupRuleResponse refactoring

Signed-off-by: Rohit Yadav <bh...@apache.org>


Project: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/commit/8a313d7f
Tree: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/tree/8a313d7f
Diff: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/diff/8a313d7f

Branch: refs/heads/api_refactoring
Commit: 8a313d7f847f1f1a5aa1d61488e03d5977eb6f03
Parents: eba3530
Author: Min Chen <mi...@citrix.com>
Authored: Thu Dec 6 15:26:18 2012 -0800
Committer: Rohit Yadav <bh...@apache.org>
Committed: Thu Dec 6 16:04:48 2012 -0800

----------------------------------------------------------------------
 .../cloud/api/response/SecurityGroupResponse.java  |   66 ++-
 .../api/response/SecurityGroupRuleResponse.java    |   37 +-
 .../com/cloud/api/view/vo/SecurityGroupJoinVO.java |  466 +++++++++++++++
 .../network/security/SecurityGroupService.java     |    4 +-
 .../apache/cloudstack/api/ResponseGenerator.java   |    6 +-
 .../command/ListSecurityGroupsCmd.java             |   12 +-
 server/src/com/cloud/api/ApiDBUtils.java           |   21 +
 server/src/com/cloud/api/ApiResponseHelper.java    |  142 ++----
 server/src/com/cloud/api/ApiServer.java            |    4 +-
 .../configuration/DefaultComponentLibrary.java     |    2 +
 .../network/security/SecurityGroupManagerImpl.java |   95 ++--
 .../network/security/dao/SecurityGroupJoinDao.java |   37 ++
 .../security/dao/SecurityGroupJoinDaoImpl.java     |  244 ++++++++
 .../security/dao/SecurityGroupVMMapDao.java        |    3 +
 .../security/dao/SecurityGroupVMMapDaoImpl.java    |    9 +
 server/src/com/cloud/vm/dao/UserVmJoinDaoImpl.java |   16 +-
 16 files changed, 972 insertions(+), 192 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/8a313d7f/api/src/com/cloud/api/response/SecurityGroupResponse.java
----------------------------------------------------------------------
diff --git a/api/src/com/cloud/api/response/SecurityGroupResponse.java b/api/src/com/cloud/api/response/SecurityGroupResponse.java
index e993116..c4a9b0f 100644
--- a/api/src/com/cloud/api/response/SecurityGroupResponse.java
+++ b/api/src/com/cloud/api/response/SecurityGroupResponse.java
@@ -16,7 +16,10 @@
 // under the License.
 package com.cloud.api.response;
 
+import java.util.ArrayList;
+import java.util.HashSet;
 import java.util.List;
+import java.util.Set;
 
 import org.apache.cloudstack.api.ApiConstants;
 import org.apache.cloudstack.api.Entity;
@@ -27,9 +30,10 @@ import com.google.gson.annotations.SerializedName;
 
 @SuppressWarnings("unused")
 @Entity(value = SecurityGroup.class)
-public class SecurityGroupResponse extends BaseResponse implements ControlledEntityResponse{
+public class SecurityGroupResponse extends BaseResponse implements ControlledViewEntityResponse{
+
     @SerializedName(ApiConstants.ID) @Param(description="the ID of the security group")
-    private IdentityProxy id = new IdentityProxy("security_group");
+    private String id;
 
     @SerializedName(ApiConstants.NAME) @Param(description="the name of the security group")
     private String name;
@@ -41,34 +45,46 @@ public class SecurityGroupResponse extends BaseResponse implements ControlledEnt
     private String accountName;
 
     @SerializedName(ApiConstants.PROJECT_ID) @Param(description="the project id of the group")
-    private IdentityProxy projectId = new IdentityProxy("projects");
+    private String projectId;
 
     @SerializedName(ApiConstants.PROJECT) @Param(description="the project name of the group")
     private String projectName;
 
     @SerializedName(ApiConstants.DOMAIN_ID) @Param(description="the domain ID of the security group")
-    private IdentityProxy domainId = new IdentityProxy("domain");
+    private String domainId;
 
     @SerializedName(ApiConstants.DOMAIN) @Param(description="the domain name of the security group")
     private String domainName;
 
     @SerializedName("ingressrule")  @Param(description="the list of ingress rules associated with the security group", responseObject = SecurityGroupRuleResponse.class)
-    private List<SecurityGroupRuleResponse> ingressRules;
+    private Set<SecurityGroupRuleResponse> ingressRules;
 
     @SerializedName("egressrule")  @Param(description="the list of egress rules associated with the security group", responseObject = SecurityGroupRuleResponse.class)
-    private List<SecurityGroupRuleResponse> egressRules;
+    private Set<SecurityGroupRuleResponse> egressRules;
 
     @SerializedName(ApiConstants.TAGS)  @Param(description="the list of resource tags associated with the rule", responseObject = ResourceTagResponse.class)
-    private List<ResourceTagResponse> tags;
+    private Set<ResourceTagResponse> tags;
+
+    public SecurityGroupResponse(){
+        this.ingressRules = new HashSet<SecurityGroupRuleResponse>();
+        this.egressRules = new HashSet<SecurityGroupRuleResponse>();
+        this.tags = new HashSet<ResourceTagResponse>();
+    }
 
-    public void setId(Long id) {
-        this.id.setValue(id);
+    @Override
+    public String getObjectUuid() {
+        return this.getId();
     }
 
-    public Long getId() {
-        return id.getValue();
+    public String getId() {
+        return id;
+     }
+
+    public void setId(String id) {
+        this.id = id;
     }
 
+
     public void setName(String name) {
         this.name = name;
     }
@@ -81,25 +97,29 @@ public class SecurityGroupResponse extends BaseResponse implements ControlledEnt
         this.accountName = accountName;
     }
 
-    public void setDomainId(Long domainId) {
-        this.domainId.setValue(domainId);
+    @Override
+    public void setDomainId(String domainId) {
+        this.domainId = domainId;
     }
 
     public void setDomainName(String domainName) {
         this.domainName = domainName;
     }
 
-    public void setSecurityGroupIngressRules(List<SecurityGroupRuleResponse> securityGroupRules) {
+    public void setSecurityGroupIngressRules(Set<SecurityGroupRuleResponse> securityGroupRules) {
         this.ingressRules = securityGroupRules;
     }
 
-    public void setSecurityGroupEgressRules(List<SecurityGroupRuleResponse> securityGroupRules) {
+    public void addSecurityGroupIngressRule(SecurityGroupRuleResponse rule){
+        this.ingressRules.add(rule);
+    }
+
+    public void setSecurityGroupEgressRules(Set<SecurityGroupRuleResponse> securityGroupRules) {
         this.egressRules = securityGroupRules;
     }
 
-    @Override
-    public Long getObjectId() {
-        return getId();
+    public void addSecurityGroupEgressRule(SecurityGroupRuleResponse rule){
+        this.egressRules.add(rule);
     }
 
     @Override
@@ -128,8 +148,8 @@ public class SecurityGroupResponse extends BaseResponse implements ControlledEnt
     }
 
     @Override
-    public void setProjectId(Long projectId) {
-        this.projectId.setValue(projectId);
+    public void setProjectId(String projectId) {
+        this.projectId = projectId;
     }
 
     @Override
@@ -137,7 +157,11 @@ public class SecurityGroupResponse extends BaseResponse implements ControlledEnt
         this.projectName = projectName;
     }
 
-    public void setTags(List<ResourceTagResponse> tags) {
+    public void setTags(Set<ResourceTagResponse> tags) {
         this.tags = tags;
     }
+
+    public void addTag(ResourceTagResponse tag){
+        this.tags.add(tag);
+    }
 }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/8a313d7f/api/src/com/cloud/api/response/SecurityGroupRuleResponse.java
----------------------------------------------------------------------
diff --git a/api/src/com/cloud/api/response/SecurityGroupRuleResponse.java b/api/src/com/cloud/api/response/SecurityGroupRuleResponse.java
index abc3dea..8ef39b0 100644
--- a/api/src/com/cloud/api/response/SecurityGroupRuleResponse.java
+++ b/api/src/com/cloud/api/response/SecurityGroupRuleResponse.java
@@ -23,7 +23,7 @@ import com.google.gson.annotations.SerializedName;
 
 public class SecurityGroupRuleResponse extends BaseResponse {
     @SerializedName("ruleid") @Param(description="the id of the security group rule")
-    private IdentityProxy ruleId = new IdentityProxy("security_group_rule");
+    private String ruleId;
 
     @SerializedName("protocol") @Param(description="the protocol of the security group rule")
     private String protocol;
@@ -49,12 +49,12 @@ public class SecurityGroupRuleResponse extends BaseResponse {
     @SerializedName(ApiConstants.CIDR) @Param(description="the CIDR notation for the base IP address of the security group rule")
     private String cidr;
 
-    public Long getRuleId() {
-        return ruleId.getValue();
+    public String getRuleId() {
+        return ruleId;
     }
 
-    public void setRuleId(Long ruleId) {
-        this.ruleId.setValue(ruleId);
+    public void setRuleId(String ruleId) {
+        this.ruleId = ruleId;
     }
 
     public String getProtocol() {
@@ -120,4 +120,31 @@ public class SecurityGroupRuleResponse extends BaseResponse {
     public void setCidr(String cidr) {
         this.cidr = cidr;
     }
+
+    @Override
+    public int hashCode() {
+        final int prime = 31;
+        int result = 1;
+        String oid = this.getRuleId();
+        result = prime * result + ((oid== null) ? 0 : oid.hashCode());
+        return result;
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj)
+            return true;
+        if (obj == null)
+            return false;
+        if (getClass() != obj.getClass())
+            return false;
+        SecurityGroupRuleResponse other = (SecurityGroupRuleResponse) obj;
+        String oid = this.getRuleId();
+        if (oid == null) {
+            if (other.getRuleId() != null)
+                return false;
+        } else if (!oid.equals(other.getRuleId()))
+            return false;
+        return true;
+    }
 }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/8a313d7f/api/src/com/cloud/api/view/vo/SecurityGroupJoinVO.java
----------------------------------------------------------------------
diff --git a/api/src/com/cloud/api/view/vo/SecurityGroupJoinVO.java b/api/src/com/cloud/api/view/vo/SecurityGroupJoinVO.java
new file mode 100644
index 0000000..c679d3d
--- /dev/null
+++ b/api/src/com/cloud/api/view/vo/SecurityGroupJoinVO.java
@@ -0,0 +1,466 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+// 
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+package com.cloud.api.view.vo;
+
+import java.net.URI;
+import java.util.Date;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.EnumType;
+import javax.persistence.Enumerated;
+import javax.persistence.Table;
+
+import com.cloud.network.Network.GuestType;
+import com.cloud.network.Networks.TrafficType;
+import com.cloud.network.router.VirtualRouter.RedundantState;
+import com.cloud.network.security.SecurityRule.SecurityRuleType;
+import com.cloud.server.ResourceTag.TaggedResourceType;
+import com.cloud.utils.db.GenericDao;
+import com.cloud.vm.VirtualMachine.State;
+
+@Entity
+@Table(name="security_group_view")
+public class SecurityGroupJoinVO implements ControlledViewEntity {
+
+    @Column(name="id", updatable=false, nullable = false)
+    private long id;
+
+    @Column(name="name")
+    private String name;
+
+    @Column(name = "description")
+    private String description;
+
+    @Column(name = "uuid")
+    private String uuid;
+
+    @Column(name="account_id")
+    private long accountId;
+
+    @Column(name="account_uuid")
+    private String accountUuid;
+
+    @Column(name="account_name")
+    private String accountName = null;
+
+    @Column(name="account_type")
+    private short accountType;
+
+    @Column(name="domain_id")
+    private long domainId;
+
+    @Column(name="domain_uuid")
+    private String domainUuid;
+
+    @Column(name="domain_name")
+    private String domainName = null;
+
+    @Column(name="domain_path")
+    private String domainPath = null;
+
+    @Column(name="project_id")
+    private long projectId;
+
+    @Column(name="project_uuid")
+    private String projectUuid;
+
+    @Column(name="project_name")
+    private String projectName;
+
+    @Column(name="job_id")
+    private long jobId;
+
+    @Column(name="job_uuid")
+    private String jobUuid;
+
+    @Column(name="job_status")
+    private int jobStatus;
+
+    @Column(name = "rule_id")
+    private Long ruleId;
+
+    @Column(name = "rule_uuid")
+    private String ruleUuid;
+
+    @Column(name = "rule_start_port")
+    private int ruleStartPort;
+
+    @Column(name = "rule_end_port")
+    private int ruleEndPort;
+
+    @Column(name = "rule_protocol")
+    private String ruleProtocol;
+
+    @Column(name = "rule_type")
+    private String ruleType;
+
+    @Column(name = "rule_allowed_network_id")
+    private Long ruleAllowedNetworkId = null;
+
+    @Column(name = "rule_allowed_ip_cidr")
+    private String ruleAllowedSourceIpCidr = null;
+
+    @Column(name="tag_id")
+    private long tagId;
+
+    @Column(name="tag_uuid")
+    private String tagUuid;
+
+    @Column(name="tag_key")
+    private String tagKey;
+
+    @Column(name="tag_value")
+    private String tagValue;
+
+    @Column(name="tag_domain_id")
+    private long tagDomainId;
+
+    @Column(name="tag_account_id")
+    private long tagAccountId;
+
+    @Column(name="tag_resource_id")
+    private long tagResourceId;
+
+    @Column(name="tag_resource_uuid")
+    private String tagResourceUuid;
+
+    @Column(name="tag_resource_type")
+    @Enumerated(value=EnumType.STRING)
+    private TaggedResourceType tagResourceType;
+
+    @Column(name="tag_customer")
+    private String tagCustomer;
+
+    public SecurityGroupJoinVO() {
+    }
+
+    public String getUuid() {
+        return uuid;
+    }
+
+    public void setUuid(String uuid) {
+        this.uuid = uuid;
+    }
+
+    public long getId() {
+        return id;
+    }
+
+    public void setId(long id) {
+        this.id = id;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public long getAccountId() {
+        return accountId;
+    }
+
+    public void setAccountId(long accountId) {
+        this.accountId = accountId;
+    }
+
+    public String getAccountUuid() {
+        return accountUuid;
+    }
+
+    public void setAccountUuid(String accountUuid) {
+        this.accountUuid = accountUuid;
+    }
+
+    public String getAccountName() {
+        return accountName;
+    }
+
+    public void setAccountName(String accountName) {
+        this.accountName = accountName;
+    }
+
+    public short getAccountType() {
+        return accountType;
+    }
+
+    public void setAccountType(short accountType) {
+        this.accountType = accountType;
+    }
+
+    public long getDomainId() {
+        return domainId;
+    }
+
+    public void setDomainId(long domainId) {
+        this.domainId = domainId;
+    }
+
+    @Override
+    public String getDomainUuid() {
+        return domainUuid;
+    }
+
+    public void setDomainUuid(String domainUuid) {
+        this.domainUuid = domainUuid;
+    }
+
+    public String getDomainName() {
+        return domainName;
+    }
+
+    public void setDomainName(String domainName) {
+        this.domainName = domainName;
+    }
+
+    public String getDomainPath() {
+        return domainPath;
+    }
+
+    public void setDomainPath(String domainPath) {
+        this.domainPath = domainPath;
+    }
+
+    public long getProjectId() {
+        return projectId;
+    }
+
+    public void setProjectId(long projectId) {
+        this.projectId = projectId;
+    }
+
+    public String getProjectUuid() {
+        return projectUuid;
+    }
+
+    public void setProjectUuid(String projectUuid) {
+        this.projectUuid = projectUuid;
+    }
+
+    public String getProjectName() {
+        return projectName;
+    }
+
+    public void setProjectName(String projectName) {
+        this.projectName = projectName;
+    }
+
+    public long getJobId() {
+        return jobId;
+    }
+
+    public void setJobId(long jobId) {
+        this.jobId = jobId;
+    }
+
+    public String getJobUuid() {
+        return jobUuid;
+    }
+
+    public void setJobUuid(String jobUuid) {
+        this.jobUuid = jobUuid;
+    }
+
+    public int getJobStatus() {
+        return jobStatus;
+    }
+
+    public void setJobStatus(int jobStatus) {
+        this.jobStatus = jobStatus;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+    public Long getRuleId() {
+        return ruleId;
+    }
+
+    public void setRuleId(Long ruleId) {
+        this.ruleId = ruleId;
+    }
+
+    public String getRuleUuid() {
+        return ruleUuid;
+    }
+
+    public void setRuleUuid(String ruleUuid) {
+        this.ruleUuid = ruleUuid;
+    }
+
+    public int getRuleStartPort() {
+        return ruleStartPort;
+    }
+
+    public void setRuleStartPort(int ruleStartPort) {
+        this.ruleStartPort = ruleStartPort;
+    }
+
+    public int getRuleEndPort() {
+        return ruleEndPort;
+    }
+
+    public void setRuleEndPort(int ruleEndPort) {
+        this.ruleEndPort = ruleEndPort;
+    }
+
+    public String getRuleProtocol() {
+        return ruleProtocol;
+    }
+
+    public void setRuleProtocol(String ruleProtocol) {
+        this.ruleProtocol = ruleProtocol;
+    }
+
+    public SecurityRuleType getRuleType() {
+        if ("ingress".equalsIgnoreCase(ruleType)) {
+            return SecurityRuleType.IngressRule;
+        } else {
+            return SecurityRuleType.EgressRule;
+        }
+    }
+
+    public void setRuleType(String ruleType) {
+        this.ruleType = ruleType;
+    }
+
+    public Long getRuleAllowedNetworkId() {
+        return ruleAllowedNetworkId;
+    }
+
+    public void setRuleAllowedNetworkId(Long ruleAllowedNetworkId) {
+        this.ruleAllowedNetworkId = ruleAllowedNetworkId;
+    }
+
+    public String getRuleAllowedSourceIpCidr() {
+        return ruleAllowedSourceIpCidr;
+    }
+
+    public void setRuleAllowedSourceIpCidr(String ruleAllowedSourceIpCidr) {
+        this.ruleAllowedSourceIpCidr = ruleAllowedSourceIpCidr;
+    }
+
+    public long getTagId() {
+        return tagId;
+    }
+
+    public void setTagId(long tagId) {
+        this.tagId = tagId;
+    }
+
+    public String getTagUuid() {
+        return tagUuid;
+    }
+
+    public void setTagUuid(String tagUuid) {
+        this.tagUuid = tagUuid;
+    }
+
+    public String getTagKey() {
+        return tagKey;
+    }
+
+    public void setTagKey(String tagKey) {
+        this.tagKey = tagKey;
+    }
+
+    public String getTagValue() {
+        return tagValue;
+    }
+
+    public void setTagValue(String tagValue) {
+        this.tagValue = tagValue;
+    }
+
+    public long getTagDomainId() {
+        return tagDomainId;
+    }
+
+    public void setTagDomainId(long tagDomainId) {
+        this.tagDomainId = tagDomainId;
+    }
+
+    public long getTagAccountId() {
+        return tagAccountId;
+    }
+
+    public void setTagAccountId(long tagAccountId) {
+        this.tagAccountId = tagAccountId;
+    }
+
+    public long getTagResourceId() {
+        return tagResourceId;
+    }
+
+    public void setTagResourceId(long tagResourceId) {
+        this.tagResourceId = tagResourceId;
+    }
+
+    public String getTagResourceUuid() {
+        return tagResourceUuid;
+    }
+
+    public void setTagResourceUuid(String tagResourceUuid) {
+        this.tagResourceUuid = tagResourceUuid;
+    }
+
+    public TaggedResourceType getTagResourceType() {
+        return tagResourceType;
+    }
+
+    public void setTagResourceType(TaggedResourceType tagResourceType) {
+        this.tagResourceType = tagResourceType;
+    }
+
+    public String getTagCustomer() {
+        return tagCustomer;
+    }
+
+    public void setTagCustomer(String tagCustomer) {
+        this.tagCustomer = tagCustomer;
+    }
+
+    @Override
+    public int hashCode() {
+        final int prime = 31;
+        int result = 1;
+        result = prime * result + (int) (id ^ (id >>> 32));
+        return result;
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj)
+            return true;
+        if (obj == null)
+            return false;
+        if (getClass() != obj.getClass())
+            return false;
+        SecurityGroupJoinVO other = (SecurityGroupJoinVO) obj;
+        if (id != other.id)
+            return false;
+        return true;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/8a313d7f/api/src/com/cloud/network/security/SecurityGroupService.java
----------------------------------------------------------------------
diff --git a/api/src/com/cloud/network/security/SecurityGroupService.java b/api/src/com/cloud/network/security/SecurityGroupService.java
index 51d2682..640b9ac 100644
--- a/api/src/com/cloud/network/security/SecurityGroupService.java
+++ b/api/src/com/cloud/network/security/SecurityGroupService.java
@@ -24,6 +24,8 @@ import org.apache.cloudstack.api.user.securitygroup.command.CreateSecurityGroupC
 import com.cloud.exception.InvalidParameterValueException;
 import com.cloud.exception.PermissionDeniedException;
 import com.cloud.exception.ResourceInUseException;
+import com.cloud.api.view.vo.SecurityGroupJoinVO;
+import com.cloud.utils.Pair;
 
 public interface SecurityGroupService {
     /**
@@ -42,7 +44,7 @@ public interface SecurityGroupService {
      * The search terms are specified in the search criteria.
      * @return the list of security groups and associated ingress rules
      */
-    public List<? extends SecurityGroupRules> searchForSecurityGroupRules(ListSecurityGroupsCmd cmd) throws PermissionDeniedException, InvalidParameterValueException;
+    public Pair<List<SecurityGroupJoinVO>, Integer> searchForSecurityGroupRules(ListSecurityGroupsCmd cmd) throws PermissionDeniedException, InvalidParameterValueException;
 
     public List<? extends SecurityRule> authorizeSecurityGroupIngress(AuthorizeSecurityGroupIngressCmd cmd);
 

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/8a313d7f/api/src/org/apache/cloudstack/api/ResponseGenerator.java
----------------------------------------------------------------------
diff --git a/api/src/org/apache/cloudstack/api/ResponseGenerator.java b/api/src/org/apache/cloudstack/api/ResponseGenerator.java
index aeafe6a..96df77e 100755
--- a/api/src/org/apache/cloudstack/api/ResponseGenerator.java
+++ b/api/src/org/apache/cloudstack/api/ResponseGenerator.java
@@ -153,6 +153,7 @@ import com.cloud.user.UserAccount;
 import com.cloud.uservm.UserVm;
 import com.cloud.vm.InstanceGroup;
 import com.cloud.api.view.vo.DomainRouterJoinVO;
+import com.cloud.api.view.vo.SecurityGroupJoinVO;
 import com.cloud.api.view.vo.UserVmJoinVO;
 import com.cloud.vm.VirtualMachine;
 
@@ -243,7 +244,10 @@ public interface ResponseGenerator {
 
     List<TemplateResponse> createTemplateResponses(long templateId, Long snapshotId, Long volumeId, boolean readyOnly);
 
-    ListResponse<SecurityGroupResponse> createSecurityGroupResponses(List<? extends SecurityGroupRules> networkGroups);
+    //ListResponse<SecurityGroupResponse> createSecurityGroupResponses(List<? extends SecurityGroupRules> networkGroups);
+
+    List<SecurityGroupResponse> createSecurityGroupResponses(List<SecurityGroupJoinVO> securityGroups);
+
 
     SecurityGroupResponse createSecurityGroupResponseFromSecurityGroupRule(List<? extends SecurityRule> SecurityRules);
 

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/8a313d7f/api/src/org/apache/cloudstack/api/user/securitygroup/command/ListSecurityGroupsCmd.java
----------------------------------------------------------------------
diff --git a/api/src/org/apache/cloudstack/api/user/securitygroup/command/ListSecurityGroupsCmd.java b/api/src/org/apache/cloudstack/api/user/securitygroup/command/ListSecurityGroupsCmd.java
index 7b1be82..c2df28b 100644
--- a/api/src/org/apache/cloudstack/api/user/securitygroup/command/ListSecurityGroupsCmd.java
+++ b/api/src/org/apache/cloudstack/api/user/securitygroup/command/ListSecurityGroupsCmd.java
@@ -25,11 +25,14 @@ import org.apache.cloudstack.api.BaseListTaggedResourcesCmd;
 import org.apache.cloudstack.api.IdentityMapper;
 import org.apache.cloudstack.api.Implementation;
 import org.apache.cloudstack.api.Parameter;
+import com.cloud.api.response.DomainRouterResponse;
 import com.cloud.api.response.ListResponse;
 import com.cloud.api.response.SecurityGroupResponse;
+import com.cloud.api.view.vo.DomainRouterJoinVO;
+import com.cloud.api.view.vo.SecurityGroupJoinVO;
 import com.cloud.async.AsyncJob;
 import com.cloud.network.security.SecurityGroupRules;
-
+import com.cloud.utils.Pair;
 
 @Implementation(description="Lists security groups", responseObject=SecurityGroupResponse.class)
 public class ListSecurityGroupsCmd extends BaseListTaggedResourcesCmd {
@@ -78,11 +81,12 @@ public class ListSecurityGroupsCmd extends BaseListTaggedResourcesCmd {
 
     @Override
     public void execute(){
-        List<? extends SecurityGroupRules> securityGroups = _securityGroupService.searchForSecurityGroupRules(this);
+        Pair<List<SecurityGroupJoinVO>, Integer> result = _securityGroupService.searchForSecurityGroupRules(this);
+        ListResponse<SecurityGroupResponse> response = new ListResponse<SecurityGroupResponse>();
+        List<SecurityGroupResponse> routerResponses = _responseGenerator.createSecurityGroupResponses(result.first());
+        response.setResponses(routerResponses, result.second());
 
-        ListResponse<SecurityGroupResponse> response = _responseGenerator.createSecurityGroupResponses(securityGroups);
         response.setResponseName(getCommandName());
-        this.setResponseObject(response);
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/8a313d7f/server/src/com/cloud/api/ApiDBUtils.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/api/ApiDBUtils.java b/server/src/com/cloud/api/ApiDBUtils.java
index a98c5d3..b48cbe6 100755
--- a/server/src/com/cloud/api/ApiDBUtils.java
+++ b/server/src/com/cloud/api/ApiDBUtils.java
@@ -24,8 +24,10 @@ import java.util.Set;
 
 import org.apache.cloudstack.api.ApiConstants.VMDetails;
 import com.cloud.api.response.DomainRouterResponse;
+import com.cloud.api.response.SecurityGroupResponse;
 import com.cloud.api.response.UserVmResponse;
 import com.cloud.api.view.vo.DomainRouterJoinVO;
+import com.cloud.api.view.vo.SecurityGroupJoinVO;
 import com.cloud.api.view.vo.UserVmJoinVO;
 import com.cloud.async.AsyncJobManager;
 import com.cloud.async.AsyncJobVO;
@@ -94,6 +96,7 @@ import com.cloud.network.security.SecurityGroup;
 import com.cloud.network.security.SecurityGroupManager;
 import com.cloud.network.security.SecurityGroupVO;
 import com.cloud.network.security.dao.SecurityGroupDao;
+import com.cloud.network.security.dao.SecurityGroupJoinDao;
 import com.cloud.network.vpc.VpcManager;
 import com.cloud.offering.NetworkOffering;
 import com.cloud.offering.ServiceOffering;
@@ -196,6 +199,7 @@ public class ApiDBUtils {
     private static IPAddressDao _ipAddressDao;
     private static LoadBalancerDao _loadBalancerDao;
     private static SecurityGroupDao _securityGroupDao;
+    private static SecurityGroupJoinDao _securityGroupJoinDao;
     private static NetworkRuleConfigDao _networkRuleConfigDao;
     private static HostPodDao _podDao;
     private static ServiceOfferingDao _serviceOfferingDao;
@@ -283,6 +287,7 @@ public class ApiDBUtils {
         _volumeHostDao = locator.getDao(VolumeHostDao.class);
         _zoneDao = locator.getDao(DataCenterDao.class);
         _securityGroupDao = locator.getDao(SecurityGroupDao.class);
+        _securityGroupJoinDao = locator.getDao(SecurityGroupJoinDao.class);
         _networkOfferingDao = locator.getDao(NetworkOfferingDao.class);
         _networkDao = locator.getDao(NetworkDao.class);
         _configDao = locator.getDao(ConfigurationDao.class);
@@ -925,4 +930,20 @@ public class ApiDBUtils {
     public static List<UserVmJoinVO> newUserVmView(UserVm... userVms){
         return _userVmJoinDao.newUserVmView(userVms);
     }
+
+    public static SecurityGroupResponse newSecurityGroupResponse(SecurityGroupJoinVO vsg, Account caller) {
+        return _securityGroupJoinDao.newSecurityGroupResponse(vsg, caller);
+    }
+
+    public static SecurityGroupResponse fillSecurityGroupDetails(SecurityGroupResponse vsgData, SecurityGroupJoinVO sg){
+         return _securityGroupJoinDao.setSecurityGroupResponse(vsgData, sg);
+    }
+
+    public static List<SecurityGroupJoinVO> newSecurityGroupView(SecurityGroup sg){
+        return _securityGroupJoinDao.newSecurityGroupView(sg);
+    }
+
+    public static List<SecurityGroupJoinVO> findSecurityGroupViewById(Long sgId){
+        return _securityGroupJoinDao.searchByIds(sgId);
+    }
 }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/8a313d7f/server/src/com/cloud/api/ApiResponseHelper.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/api/ApiResponseHelper.java b/server/src/com/cloud/api/ApiResponseHelper.java
index 84950d3..ca39e8d 100755
--- a/server/src/com/cloud/api/ApiResponseHelper.java
+++ b/server/src/com/cloud/api/ApiResponseHelper.java
@@ -118,6 +118,7 @@ import com.cloud.api.response.VpnUsersResponse;
 import com.cloud.api.response.ZoneResponse;
 import com.cloud.api.view.vo.DomainRouterJoinVO;
 import com.cloud.api.view.vo.ControlledViewEntity;
+import com.cloud.api.view.vo.SecurityGroupJoinVO;
 import com.cloud.api.view.vo.UserVmJoinVO;
 import com.cloud.async.AsyncJob;
 import com.cloud.capacity.Capacity;
@@ -2029,91 +2030,31 @@ public class ApiResponseHelper implements ResponseGenerator {
     }
 
     @Override
-    public ListResponse<SecurityGroupResponse> createSecurityGroupResponses(
-            List<? extends SecurityGroupRules> networkGroups) {
-        List<SecurityGroupResultObject> groupResultObjs = SecurityGroupResultObject
-        .transposeNetworkGroups(networkGroups);
-
-        ListResponse<SecurityGroupResponse> response = new ListResponse<SecurityGroupResponse>();
-        List<SecurityGroupResponse> netGrpResponses = new ArrayList<SecurityGroupResponse>();
-        for (SecurityGroupResultObject networkGroup : groupResultObjs) {
-            SecurityGroupResponse netGrpResponse = new SecurityGroupResponse();
-            netGrpResponse.setId(networkGroup.getId());
-            netGrpResponse.setName(networkGroup.getName());
-            netGrpResponse.setDescription(networkGroup.getDescription());
-
-            populateOwner(netGrpResponse, networkGroup);
-
-            List<SecurityGroupRuleResultObject> securityGroupRules = networkGroup
-            .getSecurityGroupRules();
-            if ((securityGroupRules != null) && !securityGroupRules.isEmpty()) {
-                List<SecurityGroupRuleResponse> ingressRulesResponse = new ArrayList<SecurityGroupRuleResponse>();
-                List<SecurityGroupRuleResponse> egressRulesResponse = new ArrayList<SecurityGroupRuleResponse>();
-                for (SecurityGroupRuleResultObject securityGroupRule : securityGroupRules) {
-                    SecurityGroupRuleResponse ruleData = new SecurityGroupRuleResponse();
-                    ruleData.setRuleId(securityGroupRule.getId());
-                    ruleData.setProtocol(securityGroupRule.getProtocol());
-
-                    if ("icmp".equalsIgnoreCase(securityGroupRule.getProtocol())) {
-                        ruleData.setIcmpType(securityGroupRule.getStartPort());
-                        ruleData.setIcmpCode(securityGroupRule.getEndPort());
-                    } else {
-                        ruleData.setStartPort(securityGroupRule.getStartPort());
-                        ruleData.setEndPort(securityGroupRule.getEndPort());
-                    }
-
-                    if (securityGroupRule.getAllowedSecurityGroup() != null) {
-                        ruleData.setSecurityGroupName(securityGroupRule
-                                .getAllowedSecurityGroup());
-                        ruleData.setAccountName(securityGroupRule
-                                .getAllowedSecGroupAcct());
-                    } else {
-                        ruleData.setCidr(securityGroupRule
-                                .getAllowedSourceIpCidr());
-                    }
-
-                    if (securityGroupRule.getRuleType() == SecurityRuleType.IngressRule) {
-                        ruleData.setObjectName("ingressrule");
-                        ingressRulesResponse.add(ruleData);
-                    } else {
-                        ruleData.setObjectName("egressrule");
-                        egressRulesResponse.add(ruleData);
-                    }
-                }
-                //set tag information
-                List<? extends ResourceTag> tags = ApiDBUtils.listByResourceTypeAndId(TaggedResourceType.UserVm, networkGroup.getId());
-                List<ResourceTagResponse> tagResponses = new ArrayList<ResourceTagResponse>();
-                for (ResourceTag tag : tags) {
-                    ResourceTagResponse tagResponse = createResourceTagResponse(tag, true);
-                    tagResponses.add(tagResponse);
-                }
-                netGrpResponse.setTags(tagResponses);
+    public List<SecurityGroupResponse> createSecurityGroupResponses(List<SecurityGroupJoinVO> securityGroups) {
+        Account caller = UserContext.current().getCaller();
+        Hashtable<Long, SecurityGroupResponse> vrDataList = new Hashtable<Long, SecurityGroupResponse>();
+        // Initialise the vrdatalist with the input data
+        for (SecurityGroupJoinVO vr : securityGroups) {
+            SecurityGroupResponse vrData = vrDataList.get(vr.getId());
+            if ( vrData == null ) {
+                // first time encountering this sg
+                vrData = ApiDBUtils.newSecurityGroupResponse(vr, caller);
 
-                netGrpResponse
-                .setSecurityGroupIngressRules(ingressRulesResponse);
-                netGrpResponse.setSecurityGroupEgressRules(egressRulesResponse);
+            } else {
+                // update rules for 1 to many mapping fields
+                vrData = ApiDBUtils.fillSecurityGroupDetails(vrData, vr);
             }
-            netGrpResponse.setObjectName("securitygroup");
-            netGrpResponses.add(netGrpResponse);
+            vrDataList.put(vr.getId(), vrData);
         }
-
-        response.setResponses(netGrpResponses);
-        return response;
+        return new ArrayList<SecurityGroupResponse>(vrDataList.values());
     }
 
     @Override
     public SecurityGroupResponse createSecurityGroupResponse(SecurityGroup group) {
-        SecurityGroupResponse response = new SecurityGroupResponse();
-
-        populateOwner(response, group);
-
-        response.setDescription(group.getDescription());
-        response.setId(group.getId());
-        response.setName(group.getName());
-
-        response.setObjectName("securitygroup");
-        return response;
-
+        List<SecurityGroupJoinVO> viewSgs = ApiDBUtils.newSecurityGroupView(group);
+        List<SecurityGroupResponse> listSgs = createSecurityGroupResponses(viewSgs);
+        assert listSgs != null && listSgs.size() == 1 : "There should be one security group returned";
+        return listSgs.get(0);
     }
 
     @Override
@@ -2471,27 +2412,27 @@ public class ApiResponseHelper implements ResponseGenerator {
         Map<Long, Account> allowedSecuriytGroupAccounts = new HashMap<Long, Account>();
 
         if ((securityRules != null) && !securityRules.isEmpty()) {
-            SecurityGroup securityGroup = ApiDBUtils.findSecurityGroupById(securityRules.get(0).getSecurityGroupId());
-            response.setId(securityGroup.getId());
+            SecurityGroupJoinVO securityGroup = ApiDBUtils.findSecurityGroupViewById(securityRules.get(0).getSecurityGroupId()).get(0);
+            response.setId(securityGroup.getUuid());
             response.setName(securityGroup.getName());
             response.setDescription(securityGroup.getDescription());
 
             Account account = securiytGroupAccounts.get(securityGroup.getAccountId());
 
-            if (account == null) {
-                account = ApiDBUtils.findAccountById(securityGroup.getAccountId());
-                securiytGroupAccounts.put(securityGroup.getAccountId(), account);
+            if (securityGroup.getAccountType() == Account.ACCOUNT_TYPE_PROJECT) {
+                response.setProjectId(securityGroup.getProjectUuid());
+                response.setProjectName(securityGroup.getProjectName());
+            } else {
+                response.setAccountName(securityGroup.getAccountName());
             }
 
-            populateAccount(response, account.getId());
-            populateDomain(response, account.getDomainId());
+            response.setDomainId(securityGroup.getDomainUuid());
+            response.setDomainName(securityGroup.getDomainName());
 
-            List<SecurityGroupRuleResponse> egressResponses = new ArrayList<SecurityGroupRuleResponse>();
-            List<SecurityGroupRuleResponse> ingressResponses = new ArrayList<SecurityGroupRuleResponse>();
             for (SecurityRule securityRule : securityRules) {
                 SecurityGroupRuleResponse securityGroupData = new SecurityGroupRuleResponse();
 
-                securityGroupData.setRuleId(securityRule.getId());
+                securityGroupData.setRuleId(securityRule.getUuid());
                 securityGroupData.setProtocol(securityRule.getProtocol());
                 if ("icmp".equalsIgnoreCase(securityRule.getProtocol())) {
                     securityGroupData.setIcmpType(securityRule.getStartPort());
@@ -2503,35 +2444,24 @@ public class ApiResponseHelper implements ResponseGenerator {
 
                 Long allowedSecurityGroupId = securityRule.getAllowedNetworkId();
                 if (allowedSecurityGroupId != null) {
-                    SecurityGroup allowedSecurityGroup = allowedSecurityGroups.get(allowedSecurityGroupId);
-                    if (allowedSecurityGroup == null) {
-                        allowedSecurityGroup = ApiDBUtils.findSecurityGroupById(allowedSecurityGroupId);
-                        allowedSecurityGroups.put(allowedSecurityGroupId, allowedSecurityGroup);
+                    List<SecurityGroupJoinVO> sgs = ApiDBUtils.findSecurityGroupViewById(allowedSecurityGroupId);
+                    if (sgs != null && sgs.size() > 0) {
+                        SecurityGroupJoinVO sg = sgs.get(0);
+                        securityGroupData.setSecurityGroupName(sg.getName());
+                        securityGroupData.setAccountName(sg.getAccountName());
                     }
-
-                    securityGroupData.setSecurityGroupName(allowedSecurityGroup.getName());
-
-                    Account allowedAccount = allowedSecuriytGroupAccounts.get(allowedSecurityGroup.getAccountId());
-                    if (allowedAccount == null) {
-                        allowedAccount = ApiDBUtils.findAccountById(allowedSecurityGroup.getAccountId());
-                        allowedSecuriytGroupAccounts.put(allowedAccount.getId(), allowedAccount);
-                    }
-
-                    securityGroupData.setAccountName(allowedAccount.getAccountName());
                 } else {
                     securityGroupData.setCidr(securityRule.getAllowedSourceIpCidr());
                 }
                 if (securityRule.getRuleType() == SecurityRuleType.IngressRule) {
                     securityGroupData.setObjectName("ingressrule");
-                    ingressResponses.add(securityGroupData);
+                    response.addSecurityGroupIngressRule(securityGroupData);
                 } else {
                     securityGroupData.setObjectName("egressrule");
-                    egressResponses.add(securityGroupData);
+                    response.addSecurityGroupEgressRule(securityGroupData);
                 }
 
             }
-            response.setSecurityGroupIngressRules(ingressResponses);
-            response.setSecurityGroupEgressRules(egressResponses);
             response.setObjectName("securitygroup");
 
         }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/8a313d7f/server/src/com/cloud/api/ApiServer.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/api/ApiServer.java b/server/src/com/cloud/api/ApiServer.java
index d75c8e1..bacec72 100755
--- a/server/src/com/cloud/api/ApiServer.java
+++ b/server/src/com/cloud/api/ApiServer.java
@@ -79,6 +79,7 @@ import org.apache.http.protocol.ResponseServer;
 import org.apache.log4j.Logger;
 
 import org.apache.cloudstack.api.admin.router.command.ListRoutersCmd;
+import org.apache.cloudstack.api.user.securitygroup.command.ListSecurityGroupsCmd;
 import org.apache.cloudstack.api.user.vm.command.ListVMsCmd;
 import com.cloud.acl.ControlledEntity;
 import com.cloud.api.response.ApiResponseSerializer;
@@ -437,7 +438,8 @@ public class ApiServer implements HttpRequestHandler {
 
             // if the command is of the listXXXCommand, we will need to also return the
             // the job id and status if possible
-            if (cmdObj instanceof BaseListCmd && !(cmdObj instanceof ListVMsCmd) && !(cmdObj instanceof ListRoutersCmd)) {
+            if (cmdObj instanceof BaseListCmd && !(cmdObj instanceof ListVMsCmd) && !(cmdObj instanceof ListRoutersCmd)
+                    && !(cmdObj instanceof ListSecurityGroupsCmd)) {
                 buildAsyncListResponse((BaseListCmd) cmdObj, caller);
             }
 

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/8a313d7f/server/src/com/cloud/configuration/DefaultComponentLibrary.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/configuration/DefaultComponentLibrary.java b/server/src/com/cloud/configuration/DefaultComponentLibrary.java
index ec543ed..1e292c4 100755
--- a/server/src/com/cloud/configuration/DefaultComponentLibrary.java
+++ b/server/src/com/cloud/configuration/DefaultComponentLibrary.java
@@ -117,6 +117,7 @@ import com.cloud.network.rules.RulesManagerImpl;
 import com.cloud.network.rules.dao.PortForwardingRulesDaoImpl;
 import com.cloud.network.security.SecurityGroupManagerImpl2;
 import com.cloud.network.security.dao.SecurityGroupDaoImpl;
+import com.cloud.network.security.dao.SecurityGroupJoinDaoImpl;
 import com.cloud.network.security.dao.SecurityGroupRuleDaoImpl;
 import com.cloud.network.security.dao.SecurityGroupRulesDaoImpl;
 import com.cloud.network.security.dao.SecurityGroupVMMapDaoImpl;
@@ -220,6 +221,7 @@ public class DefaultComponentLibrary extends ComponentLibraryBase implements Com
         addDao("UserVmDao", UserVmDaoImpl.class);
         addDao("UserVmJoinDao", UserVmJoinDaoImpl.class);
         addDao("DomainRouterJoinDao", DomainRouterJoinDaoImpl.class);
+        addDao("SecurityGroupJoinDao", SecurityGroupJoinDaoImpl.class);
         ComponentInfo<? extends GenericDao<?, ? extends Serializable>> info = addDao("ServiceOfferingDao", ServiceOfferingDaoImpl.class);
         info.addParameter("cache.size", "50");
         info.addParameter("cache.time.to.live", "600");

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/8a313d7f/server/src/com/cloud/network/security/SecurityGroupManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/security/SecurityGroupManagerImpl.java b/server/src/com/cloud/network/security/SecurityGroupManagerImpl.java
index be8635c..8421a80 100755
--- a/server/src/com/cloud/network/security/SecurityGroupManagerImpl.java
+++ b/server/src/com/cloud/network/security/SecurityGroupManagerImpl.java
@@ -46,6 +46,8 @@ import com.cloud.agent.api.SecurityGroupRulesCmd;
 import com.cloud.agent.api.SecurityGroupRulesCmd.IpPortAndProto;
 import com.cloud.agent.manager.Commands;
 import org.apache.cloudstack.api.user.securitygroup.command.RevokeSecurityGroupEgressCmd;
+import com.cloud.api.view.vo.SecurityGroupJoinVO;
+import com.cloud.api.view.vo.UserVmJoinVO;
 import com.cloud.configuration.Config;
 import com.cloud.configuration.dao.ConfigurationDao;
 import com.cloud.domain.dao.DomainDao;
@@ -64,6 +66,7 @@ import com.cloud.network.NetworkManager;
 import com.cloud.network.security.SecurityGroupWork.Step;
 import com.cloud.network.security.SecurityRule.SecurityRuleType;
 import com.cloud.network.security.dao.SecurityGroupDao;
+import com.cloud.network.security.dao.SecurityGroupJoinDao;
 import com.cloud.network.security.dao.SecurityGroupRuleDao;
 import com.cloud.network.security.dao.SecurityGroupRulesDao;
 import com.cloud.network.security.dao.SecurityGroupVMMapDao;
@@ -95,6 +98,7 @@ import com.cloud.utils.db.JoinBuilder;
 import com.cloud.utils.db.SearchBuilder;
 import com.cloud.utils.db.SearchCriteria;
 import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.SearchCriteria.Func;
 import com.cloud.utils.exception.CloudRuntimeException;
 import com.cloud.utils.fsm.StateListener;
 import com.cloud.utils.net.NetUtils;
@@ -119,6 +123,8 @@ public class SecurityGroupManagerImpl implements SecurityGroupManager, SecurityG
     @Inject
     SecurityGroupDao _securityGroupDao;
     @Inject
+    SecurityGroupJoinDao _securityGroupJoinDao;
+    @Inject
     SecurityGroupRuleDao _securityGroupRuleDao;
     @Inject
     SecurityGroupVMMapDao _securityGroupVMMapDao;
@@ -1087,7 +1093,7 @@ public class SecurityGroupManagerImpl implements SecurityGroupManager, SecurityG
     }
 
     @Override
-    public List<SecurityGroupRulesVO> searchForSecurityGroupRules(ListSecurityGroupsCmd cmd) throws PermissionDeniedException, InvalidParameterValueException {
+    public Pair<List<SecurityGroupJoinVO>, Integer> searchForSecurityGroupRules(ListSecurityGroupsCmd cmd) throws PermissionDeniedException, InvalidParameterValueException {
         Account caller = UserContext.current().getCaller();
         Long instanceId = cmd.getVirtualMachineId();
         String securityGroup = cmd.getSecurityGroupName();
@@ -1102,38 +1108,33 @@ public class SecurityGroupManagerImpl implements SecurityGroupManager, SecurityG
                 throw new InvalidParameterValueException("Unable to list network groups for virtual machine instance " + instanceId + "; instance not found.");
             }
             _accountMgr.checkAccess(caller, null, true, userVM);
-            return listSecurityGroupRulesByVM(instanceId.longValue());
+            return listSecurityGroupRulesByVM(instanceId.longValue(), cmd.getStartIndex(), cmd.getPageSizeVal());
         }
 
-        List<SecurityGroupRulesVO> securityRulesList = new ArrayList<SecurityGroupRulesVO>();
-        
         Ternary<Long, Boolean, ListProjectResourcesCriteria> domainIdRecursiveListProject = new Ternary<Long, Boolean, ListProjectResourcesCriteria>(cmd.getDomainId(), cmd.isRecursive(), null);
         _accountMgr.buildACLSearchParameters(caller, id, cmd.getAccountName(), cmd.getProjectId(), permittedAccounts, domainIdRecursiveListProject, cmd.listAll(), false);
         Long domainId = domainIdRecursiveListProject.first();
         Boolean isRecursive = domainIdRecursiveListProject.second();
-        ListProjectResourcesCriteria listProjectResourcesCriteria = domainIdRecursiveListProject.third();        
-        
-        Filter searchFilter = new Filter(SecurityGroupVO.class, "id", true, cmd.getStartIndex(), cmd.getPageSizeVal());
-        SearchBuilder<SecurityGroupVO> sb = _securityGroupDao.createSearchBuilder();
-        _accountMgr.buildACLSearchBuilder(sb, domainId, isRecursive, permittedAccounts, listProjectResourcesCriteria);
+        ListProjectResourcesCriteria listProjectResourcesCriteria = domainIdRecursiveListProject.third();
+
+        Filter searchFilter = new Filter(SecurityGroupJoinVO.class, "id", true, cmd.getStartIndex(), cmd.getPageSizeVal());
+        SearchBuilder<SecurityGroupJoinVO> sb = _securityGroupJoinDao.createSearchBuilder();
+        sb.select(null, Func.DISTINCT, sb.entity().getId()); // select distinct ids
+        _accountMgr.buildACLViewSearchBuilder(sb, domainId, isRecursive, permittedAccounts, listProjectResourcesCriteria);
 
         sb.and("id", sb.entity().getId(), SearchCriteria.Op.EQ);
         sb.and("name", sb.entity().getName(), SearchCriteria.Op.EQ);
         
         if (tags != null && !tags.isEmpty()) {
-            SearchBuilder<ResourceTagVO> tagSearch = _resourceTagDao.createSearchBuilder();
             for (int count=0; count < tags.size(); count++) {
-                tagSearch.or().op("key" + String.valueOf(count), tagSearch.entity().getKey(), SearchCriteria.Op.EQ);
-                tagSearch.and("value" + String.valueOf(count), tagSearch.entity().getValue(), SearchCriteria.Op.EQ);
-                tagSearch.cp();
+                sb.or().op("key" + String.valueOf(count), sb.entity().getTagKey(), SearchCriteria.Op.EQ);
+                sb.and("value" + String.valueOf(count), sb.entity().getTagValue(), SearchCriteria.Op.EQ);
+                sb.cp();
             }
-            tagSearch.and("resourceType", tagSearch.entity().getResourceType(), SearchCriteria.Op.EQ);
-            sb.groupBy(sb.entity().getId());
-            sb.join("tagSearch", tagSearch, sb.entity().getId(), tagSearch.entity().getResourceId(), JoinBuilder.JoinType.INNER);
         }
 
-        SearchCriteria<SecurityGroupVO> sc = sb.create();
-        _accountMgr.buildACLSearchCriteria(sc, domainId, isRecursive, permittedAccounts, listProjectResourcesCriteria);
+        SearchCriteria<SecurityGroupJoinVO> sc = sb.create();
+        _accountMgr.buildACLViewSearchCriteria(sc, domainId, isRecursive, permittedAccounts, listProjectResourcesCriteria);
 
         if (id != null) {
             sc.setParameters("id", id);
@@ -1141,12 +1142,11 @@ public class SecurityGroupManagerImpl implements SecurityGroupManager, SecurityG
         
         if (tags != null && !tags.isEmpty()) {
             int count = 0;
-            sc.setJoinParameters("tagSearch", "resourceType", TaggedResourceType.SecurityGroup.toString());
             for (String key : tags.keySet()) {
-                sc.setJoinParameters("tagSearch", "key" + String.valueOf(count), key);
-                sc.setJoinParameters("tagSearch", "value" + String.valueOf(count), tags.get(key));
-                count++;
-            }
+               sc.setParameters("key" + String.valueOf(count), key);
+               sc.setParameters("value" + String.valueOf(count), tags.get(key));
+               count++;
+           }
         }
 
         if (securityGroup != null) {
@@ -1154,33 +1154,46 @@ public class SecurityGroupManagerImpl implements SecurityGroupManager, SecurityG
         }
 
         if (keyword != null) {
-            SearchCriteria<SecurityGroupRulesVO> ssc = _securityGroupRulesDao.createSearchCriteria();
+            SearchCriteria<SecurityGroupJoinVO> ssc = _securityGroupJoinDao.createSearchCriteria();
             ssc.addOr("name", SearchCriteria.Op.LIKE, "%" + keyword + "%");
             ssc.addOr("description", SearchCriteria.Op.LIKE, "%" + keyword + "%");
             sc.addAnd("name", SearchCriteria.Op.SC, ssc);
         }
 
-        List<SecurityGroupVO> securityGroups = _securityGroupDao.search(sc, searchFilter);
-        for (SecurityGroupVO group : securityGroups) {
-            securityRulesList.addAll(_securityGroupRulesDao.listSecurityRulesByGroupId(group.getId()));
+        // search security group together with rules
+        Pair<List<SecurityGroupJoinVO>, Integer> uniqueSgPair =  _securityGroupJoinDao.searchAndCount(sc, searchFilter);
+        Integer count = uniqueSgPair.second();
+        if ( count.intValue() == 0 ){
+            // handle empty result cases
+            return uniqueSgPair;
         }
 
-        return securityRulesList;
+        List<SecurityGroupJoinVO> uniqueSgs = uniqueSgPair.first();
+        Long[] sgIds = new Long[uniqueSgs.size()];
+        int i = 0;
+        for (SecurityGroupJoinVO v : uniqueSgs ){
+            sgIds[i++] = v.getId();
+        }
+        List<SecurityGroupJoinVO> sgs = _securityGroupJoinDao.searchByIds(sgIds);
+        return new Pair<List<SecurityGroupJoinVO>, Integer>(sgs, count);
     }
 
-    private List<SecurityGroupRulesVO> listSecurityGroupRulesByVM(long vmId) {
-        List<SecurityGroupRulesVO> results = new ArrayList<SecurityGroupRulesVO>();
-        List<SecurityGroupVMMapVO> networkGroupMappings = _securityGroupVMMapDao.listByInstanceId(vmId);
-        if (networkGroupMappings != null) {
-            for (SecurityGroupVMMapVO networkGroupMapping : networkGroupMappings) {
-                SecurityGroupVO group = _securityGroupDao.findById(networkGroupMapping.getSecurityGroupId());
-                List<SecurityGroupRulesVO> rules = _securityGroupRulesDao.listSecurityGroupRules(group.getAccountId(), networkGroupMapping.getGroupName());
-                if (rules != null) {
-                    results.addAll(rules);
-                }
-            }
-        }
-        return results;
+    private Pair<List<SecurityGroupJoinVO>, Integer> listSecurityGroupRulesByVM(long vmId, long pageInd, long pageSize) {
+        Filter sf = new Filter(SecurityGroupVMMapVO.class, null, true, pageInd, pageSize);
+        Pair<List<SecurityGroupVMMapVO>, Integer> sgVmMappingPair = _securityGroupVMMapDao.listByInstanceId(vmId, sf);
+        Integer count = sgVmMappingPair.second();
+        if (count.intValue() == 0) {
+            // handle empty result cases
+            return new Pair<List<SecurityGroupJoinVO>, Integer>(new ArrayList<SecurityGroupJoinVO>(), count);
+        }
+        List<SecurityGroupVMMapVO> sgVmMappings = sgVmMappingPair.first();
+        Long[] sgIds = new Long[sgVmMappings.size()];
+        int i = 0;
+        for (SecurityGroupVMMapVO sgVm : sgVmMappings) {
+            sgIds[i++] = sgVm.getSecurityGroupId();
+        }
+        List<SecurityGroupJoinVO> sgs = _securityGroupJoinDao.searchByIds(sgIds);
+        return new Pair<List<SecurityGroupJoinVO>, Integer>(sgs, count);
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/8a313d7f/server/src/com/cloud/network/security/dao/SecurityGroupJoinDao.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/security/dao/SecurityGroupJoinDao.java b/server/src/com/cloud/network/security/dao/SecurityGroupJoinDao.java
new file mode 100644
index 0000000..cc79cda
--- /dev/null
+++ b/server/src/com/cloud/network/security/dao/SecurityGroupJoinDao.java
@@ -0,0 +1,37 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+package com.cloud.network.security.dao;
+
+import java.util.List;
+
+import com.cloud.api.response.SecurityGroupResponse;
+import com.cloud.api.view.vo.SecurityGroupJoinVO;
+import com.cloud.network.security.SecurityGroup;
+import com.cloud.user.Account;
+import com.cloud.utils.db.GenericDao;
+
+public interface SecurityGroupJoinDao extends GenericDao<SecurityGroupJoinVO, Long> {
+
+    SecurityGroupResponse newSecurityGroupResponse(SecurityGroupJoinVO vsg, Account caller);
+
+    SecurityGroupResponse setSecurityGroupResponse(SecurityGroupResponse vsgData, SecurityGroupJoinVO vsg);
+
+    List<SecurityGroupJoinVO> newSecurityGroupView(SecurityGroup sg);
+
+    List<SecurityGroupJoinVO> searchByIds(Long... ids);
+}
+

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/8a313d7f/server/src/com/cloud/network/security/dao/SecurityGroupJoinDaoImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/security/dao/SecurityGroupJoinDaoImpl.java b/server/src/com/cloud/network/security/dao/SecurityGroupJoinDaoImpl.java
new file mode 100644
index 0000000..2237112
--- /dev/null
+++ b/server/src/com/cloud/network/security/dao/SecurityGroupJoinDaoImpl.java
@@ -0,0 +1,244 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+package com.cloud.network.security.dao;
+
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Hashtable;
+import java.util.List;
+
+import javax.ejb.Local;
+
+import org.apache.log4j.Logger;
+
+import com.cloud.api.ApiDBUtils;
+import com.cloud.api.ApiResponseHelper;
+import com.cloud.api.response.DomainRouterResponse;
+import com.cloud.api.response.NicResponse;
+import com.cloud.api.response.ResourceTagResponse;
+import com.cloud.api.response.SecurityGroupResponse;
+import com.cloud.api.response.SecurityGroupRuleResponse;
+import com.cloud.api.response.UserVmResponse;
+import com.cloud.api.view.vo.DomainRouterJoinVO;
+import com.cloud.api.view.vo.SecurityGroupJoinVO;
+import com.cloud.dc.DataCenter;
+import com.cloud.network.Network;
+import com.cloud.network.Networks.TrafficType;
+import com.cloud.network.router.VirtualRouter;
+import com.cloud.network.security.SecurityGroup;
+import com.cloud.network.security.SecurityRule.SecurityRuleType;
+import com.cloud.offering.ServiceOffering;
+import com.cloud.user.Account;
+import com.cloud.uservm.UserVm;
+import com.cloud.utils.Pair;
+import com.cloud.utils.db.Attribute;
+import com.cloud.utils.db.DB;
+import com.cloud.utils.db.Filter;
+import com.cloud.utils.db.GenericDaoBase;
+import com.cloud.utils.db.JoinBuilder;
+import com.cloud.utils.db.SearchBuilder;
+import com.cloud.utils.db.SearchCriteria;
+import com.cloud.utils.db.Transaction;
+import com.cloud.utils.exception.CloudRuntimeException;
+import com.cloud.vm.NicProfile;
+
+@Local(value={SecurityGroupJoinDao.class})
+public class SecurityGroupJoinDaoImpl extends GenericDaoBase<SecurityGroupJoinVO, Long> implements SecurityGroupJoinDao {
+    public static final Logger s_logger = Logger.getLogger(SecurityGroupJoinDaoImpl.class);
+
+    private SearchBuilder<SecurityGroupJoinVO> sgSearch;
+
+    private SearchBuilder<SecurityGroupJoinVO> sgIdSearch;
+
+    protected SecurityGroupJoinDaoImpl() {
+
+        sgSearch = createSearchBuilder();
+        sgSearch.and("idIN", sgSearch.entity().getId(), SearchCriteria.Op.IN);
+        sgSearch.done();
+
+        sgIdSearch = createSearchBuilder();
+        sgIdSearch.and("id", sgIdSearch.entity().getId(), SearchCriteria.Op.EQ);
+        sgIdSearch.done();
+
+        this._count = "select count(distinct id) from security_group_view WHERE ";
+    }
+
+    @Override
+    public SecurityGroupResponse newSecurityGroupResponse(SecurityGroupJoinVO vsg, Account caller) {
+        SecurityGroupResponse sgResponse = new SecurityGroupResponse();
+        sgResponse.setId(vsg.getUuid());
+        sgResponse.setName(vsg.getName());
+        sgResponse.setDescription(vsg.getDescription());
+
+        ApiResponseHelper.populateOwner(sgResponse, vsg);
+
+        Long rule_id = vsg.getRuleId();
+        if (rule_id != null && rule_id.longValue() > 0) {
+            SecurityGroupRuleResponse ruleData = new SecurityGroupRuleResponse();
+            ruleData.setRuleId(vsg.getRuleUuid());
+            ruleData.setProtocol(vsg.getRuleProtocol());
+
+            if ("icmp".equalsIgnoreCase(vsg.getRuleProtocol())) {
+                ruleData.setIcmpType(vsg.getRuleStartPort());
+                ruleData.setIcmpCode(vsg.getRuleEndPort());
+            } else {
+                ruleData.setStartPort(vsg.getRuleStartPort());
+                ruleData.setEndPort(vsg.getRuleEndPort());
+            }
+
+            if (vsg.getRuleAllowedNetworkId() != null) {
+                List<SecurityGroupJoinVO> sgs = this.searchByIds(vsg.getRuleAllowedNetworkId());
+                if (sgs != null && sgs.size() > 0) {
+                    SecurityGroupJoinVO sg = sgs.get(0);
+                    ruleData.setSecurityGroupName(sg.getName());
+                    ruleData.setAccountName(sg.getAccountName());
+                }
+            } else {
+                ruleData.setCidr(vsg.getRuleAllowedSourceIpCidr());
+            }
+
+            if (vsg.getRuleType() == SecurityRuleType.IngressRule) {
+                ruleData.setObjectName("ingressrule");
+                sgResponse.addSecurityGroupIngressRule(ruleData);
+            } else {
+                ruleData.setObjectName("egressrule");
+                sgResponse.addSecurityGroupEgressRule(ruleData);
+            }
+        }
+
+        // update tag information
+        Long tag_id = vsg.getTagId();
+        if (tag_id != null && tag_id.longValue() > 0) {
+            ResourceTagResponse tag = new ResourceTagResponse();
+            tag.setKey(vsg.getTagKey());
+            tag.setValue(vsg.getTagValue());
+            if (vsg.getTagResourceType() != null) {
+                tag.setResourceType(vsg.getTagResourceType().toString());
+            }
+            tag.setId(vsg.getTagResourceUuid()); // tag resource uuid
+            tag.setCustomer(vsg.getTagCustomer());
+            // TODO: assuming tagAccountId and tagDomainId are the same as VM
+            // accountId and domainId
+            tag.setDomainId(vsg.getTagDomainId());
+            if (vsg.getAccountType() == Account.ACCOUNT_TYPE_PROJECT) {
+                tag.setProjectId(vsg.getProjectId());
+                tag.setProjectName(vsg.getProjectName());
+            } else {
+                tag.setAccountName(vsg.getAccountName());
+            }
+            tag.setDomainId(vsg.getDomainId()); // TODO: pending tag resource
+                                                // response uuid change
+            tag.setDomainName(vsg.getDomainName());
+
+            tag.setObjectName("tag");
+            sgResponse.addTag(tag);
+        }
+        sgResponse.setObjectName("securitygroup");
+
+        return sgResponse;
+    }
+
+    @Override
+    public SecurityGroupResponse setSecurityGroupResponse(SecurityGroupResponse vsgData, SecurityGroupJoinVO vsg) {
+        Long rule_id = vsg.getRuleId();
+        if (rule_id != null && rule_id.longValue() > 0) {
+            SecurityGroupRuleResponse ruleData = new SecurityGroupRuleResponse();
+            ruleData.setRuleId(vsg.getRuleUuid());
+            ruleData.setProtocol(vsg.getRuleProtocol());
+
+            if ("icmp".equalsIgnoreCase(vsg.getRuleProtocol())) {
+                ruleData.setIcmpType(vsg.getRuleStartPort());
+                ruleData.setIcmpCode(vsg.getRuleEndPort());
+            } else {
+                ruleData.setStartPort(vsg.getRuleStartPort());
+                ruleData.setEndPort(vsg.getRuleEndPort());
+            }
+
+            if (vsg.getRuleAllowedNetworkId() != null) {
+                List<SecurityGroupJoinVO> sgs = this.searchByIds(vsg.getRuleAllowedNetworkId());
+                if (sgs != null && sgs.size() > 0) {
+                    SecurityGroupJoinVO sg = sgs.get(0);
+                    ruleData.setSecurityGroupName(sg.getName());
+                    ruleData.setAccountName(sg.getAccountName());
+                }
+            } else {
+                ruleData.setCidr(vsg.getRuleAllowedSourceIpCidr());
+            }
+
+            if (vsg.getRuleType() == SecurityRuleType.IngressRule) {
+                ruleData.setObjectName("ingressrule");
+                vsgData.addSecurityGroupIngressRule(ruleData);
+            } else {
+                ruleData.setObjectName("egressrule");
+                vsgData.addSecurityGroupEgressRule(ruleData);
+            }
+        }
+
+        // update tag information
+        Long tag_id = vsg.getTagId();
+        if (tag_id != null && tag_id.longValue() > 0 ) {
+            ResourceTagResponse tag = new ResourceTagResponse();
+            tag.setKey(vsg.getTagKey());
+            tag.setValue(vsg.getTagValue());
+            if (vsg.getTagResourceType() != null) {
+                tag.setResourceType(vsg.getTagResourceType().toString());
+            }
+            tag.setId(vsg.getTagResourceUuid()); // tag resource uuid
+            tag.setCustomer(vsg.getTagCustomer());
+            // TODO: assuming tagAccountId and tagDomainId are the same as VM
+            // accountId and domainId
+            tag.setDomainId(vsg.getTagDomainId());
+            if (vsg.getAccountType() == Account.ACCOUNT_TYPE_PROJECT) {
+                tag.setProjectId(vsg.getProjectId());
+                tag.setProjectName(vsg.getProjectName());
+            } else {
+                tag.setAccountName(vsg.getAccountName());
+            }
+            tag.setDomainId(vsg.getDomainId()); // TODO: pending tag resource
+                                                // response uuid change
+            tag.setDomainName(vsg.getDomainName());
+
+            tag.setObjectName("tag");
+            vsgData.addTag(tag);
+        }
+        return vsgData;
+    }
+
+    @Override
+    public List<SecurityGroupJoinVO> newSecurityGroupView(SecurityGroup sg) {
+        List<SecurityGroupJoinVO> uvList = new ArrayList<SecurityGroupJoinVO>();
+        SearchCriteria<SecurityGroupJoinVO> sc = sgIdSearch.create();
+        sc.setParameters("id", sg.getId());
+        List<SecurityGroupJoinVO> sgs = searchIncludingRemoved(sc, null, null, false);
+        if (sgs != null) {
+            for (SecurityGroupJoinVO uvm : sgs) {
+                uvList.add(uvm);
+            }
+        }
+        return uvList;
+    }
+
+    @Override
+    public List<SecurityGroupJoinVO> searchByIds(Long... ids) {
+        SearchCriteria<SecurityGroupJoinVO> sc = sgSearch.create();
+        sc.setParameters("idIN", ids);
+        return searchIncludingRemoved(sc, null, null, false);
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/8a313d7f/server/src/com/cloud/network/security/dao/SecurityGroupVMMapDao.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/security/dao/SecurityGroupVMMapDao.java b/server/src/com/cloud/network/security/dao/SecurityGroupVMMapDao.java
index cc842df..cbeae4f 100644
--- a/server/src/com/cloud/network/security/dao/SecurityGroupVMMapDao.java
+++ b/server/src/com/cloud/network/security/dao/SecurityGroupVMMapDao.java
@@ -19,12 +19,15 @@ package com.cloud.network.security.dao;
 import java.util.List;
 
 import com.cloud.network.security.SecurityGroupVMMapVO;
+import com.cloud.utils.Pair;
+import com.cloud.utils.db.Filter;
 import com.cloud.utils.db.GenericDao;
 import com.cloud.vm.VirtualMachine.State;
 
 public interface SecurityGroupVMMapDao extends GenericDao<SecurityGroupVMMapVO, Long> {
     List<SecurityGroupVMMapVO> listByIpAndInstanceId(String ipAddress, long instanceId);
     List<SecurityGroupVMMapVO> listByInstanceId(long instanceId);
+    Pair<List<SecurityGroupVMMapVO>, Integer> listByInstanceId(long instanceId, Filter filter);
     List<SecurityGroupVMMapVO> listByIp(String ipAddress);
     List<SecurityGroupVMMapVO> listBySecurityGroup(long securityGroupId);
     List<SecurityGroupVMMapVO> listBySecurityGroup(long securityGroupId, State ... vmStates);

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/8a313d7f/server/src/com/cloud/network/security/dao/SecurityGroupVMMapDaoImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/security/dao/SecurityGroupVMMapDaoImpl.java b/server/src/com/cloud/network/security/dao/SecurityGroupVMMapDaoImpl.java
index db6c002..95dd7f3 100644
--- a/server/src/com/cloud/network/security/dao/SecurityGroupVMMapDaoImpl.java
+++ b/server/src/com/cloud/network/security/dao/SecurityGroupVMMapDaoImpl.java
@@ -24,6 +24,8 @@ import com.cloud.dc.VlanVO;
 import com.cloud.dc.Vlan.VlanType;
 import com.cloud.network.IPAddressVO;
 import com.cloud.network.security.SecurityGroupVMMapVO;
+import com.cloud.utils.Pair;
+import com.cloud.utils.db.Filter;
 import com.cloud.utils.db.GenericDaoBase;
 import com.cloud.utils.db.GenericSearchBuilder;
 import com.cloud.utils.db.JoinBuilder;
@@ -115,6 +117,13 @@ public class SecurityGroupVMMapDaoImpl extends GenericDaoBase<SecurityGroupVMMap
     }
 
     @Override
+    public Pair<List<SecurityGroupVMMapVO>, Integer> listByInstanceId(long instanceId, Filter filter) {
+        SearchCriteria<SecurityGroupVMMapVO> sc = ListByVmId.create();
+        sc.setParameters("instanceId", instanceId);
+        return this.searchAndCount(sc, filter);
+    }
+
+    @Override
     public int deleteVM(long instanceId) {
     	SearchCriteria<SecurityGroupVMMapVO> sc = ListByVmId.create();
         sc.setParameters("instanceId", instanceId);

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/8a313d7f/server/src/com/cloud/vm/dao/UserVmJoinDaoImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/vm/dao/UserVmJoinDaoImpl.java b/server/src/com/cloud/vm/dao/UserVmJoinDaoImpl.java
index 4df9f88..63ebb26 100644
--- a/server/src/com/cloud/vm/dao/UserVmJoinDaoImpl.java
+++ b/server/src/com/cloud/vm/dao/UserVmJoinDaoImpl.java
@@ -164,16 +164,12 @@ public class UserVmJoinDaoImpl extends GenericDaoBase<UserVmJoinVO, Long> implem
             Long securityGroupId = userVm.getSecurityGroupId();
             if (securityGroupId != null && securityGroupId.longValue() != 0) {
                 SecurityGroupResponse resp = new SecurityGroupResponse();
-                resp.setId(userVm.getSecurityGroupId()); // TODO: change
-                                                         // SecurityGroupResponse
-                                                         // IdentityProxy
+                resp.setId(userVm.getSecurityGroupUuid());
                 resp.setName(userVm.getSecurityGroupName());
                 resp.setDescription(userVm.getSecurityGroupDescription());
                 resp.setObjectName("securitygroup");
                 if (userVm.getAccountType() == Account.ACCOUNT_TYPE_PROJECT) {
-                    resp.setProjectId(userVm.getProjectId()); // TODO: pending
-                                                              // SecurityGroupResponse
-                                                              // uuid change
+                    resp.setProjectId(userVm.getProjectUuid());
                     resp.setProjectName(userVm.getProjectName());
                 } else {
                     resp.setAccountName(userVm.getAccountName());
@@ -246,16 +242,12 @@ public class UserVmJoinDaoImpl extends GenericDaoBase<UserVmJoinVO, Long> implem
         Long securityGroupId = uvo.getSecurityGroupId();
         if (securityGroupId != null && securityGroupId.longValue() != 0) {
             SecurityGroupResponse resp = new SecurityGroupResponse();
-            resp.setId(uvo.getSecurityGroupId()); // TODO: change
-                                                  // SecurityGroupResponse
-                                                  // IdentityProxy
+            resp.setId(uvo.getSecurityGroupUuid());
             resp.setName(uvo.getSecurityGroupName());
             resp.setDescription(uvo.getSecurityGroupDescription());
             resp.setObjectName("securitygroup");
             if (uvo.getAccountType() == Account.ACCOUNT_TYPE_PROJECT) {
-                resp.setProjectId(uvo.getProjectId()); // TODO: pending
-                                                       // SecurityGroupResponse
-                                                       // uuid change
+                resp.setProjectId(uvo.getProjectUuid());
                 resp.setProjectName(uvo.getProjectName());
             } else {
                 resp.setAccountName(uvo.getAccountName());