You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudstack.apache.org by ah...@apache.org on 2013/05/14 02:42:24 UTC

[01/50] [abbrv] git commit: updated refs/heads/vmsync to d403974

Updated Branches:
  refs/heads/vmsync c7530dbd7 -> d4039743d


CLOUDSTACK-702: Tests for Multiple IP Ranges-R4

Add ip range overlapped with two ip ranges in the exiting cidr

Signed-off-by: sanjeevneelarapu <sa...@citrix.com>
Signed-off-by: Prasanna Santhanam <ts...@apache.org>


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

Branch: refs/heads/vmsync
Commit: 53e496517ed51bab2c81084a02f49b0408b19a37
Parents: b8358e1
Author: sanjeevneelarapu <sa...@citrix.com>
Authored: Mon May 6 20:38:54 2013 +0530
Committer: Prasanna Santhanam <ts...@apache.org>
Committed: Wed May 8 14:37:29 2013 +0530

----------------------------------------------------------------------
 .../component/test_multiple_ip_ranges.py           |   58 +++++++++++++++
 1 files changed, 58 insertions(+), 0 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/53e49651/test/integration/component/test_multiple_ip_ranges.py
----------------------------------------------------------------------
diff --git a/test/integration/component/test_multiple_ip_ranges.py b/test/integration/component/test_multiple_ip_ranges.py
index 29942bd..7e9eeb1 100644
--- a/test/integration/component/test_multiple_ip_ranges.py
+++ b/test/integration/component/test_multiple_ip_ranges.py
@@ -368,3 +368,61 @@ class TestMultipleIpRanges(cloudstackTestCase):
         #Test will reach here there is a bug in overlap ip range checking
         self.fail("CS should not accept overlapped ip ranges in guest traffic, but it allowed")
         return
+
+    @attr(tags=["advanced_sg", "sg"])
+    def test_06_add_ip_range_overlapped_with_two_ranges(self):
+        """Test adding overlapped ip range in existing cidr
+
+            1.Add ip range in new cidr e.g:10.147.40.2-10.147.40.10
+            2.Add another ip range in the same cidr e.g:10.147.40.20-10.147.40.30
+            2.Add ip range overlapped with both the ip ranges e.g.10.147.40.10-20
+        """
+        #call increment_cidr function to get exiting cidr from the setup and increment it
+        ip2 = self.increment_cidr()
+        test_nw = ip2.network
+        ip = IPAddress(test_nw)
+        #Add IP range in the new CIDR
+        test_gateway = ip.__add__(1)
+        test_startIp = ip.__add__(2)
+        test_endIp = ip.__add__(10)
+        test_startIp2 = ip.__add__(20)
+        test_endIp2 = ip.__add__(30)
+        test_startIp3 = ip.__add__(10)
+        test_endIp3 = ip.__add__(20)
+        #Populating services with new IP range
+        self.services["vlan_ip_range"]["startip"] = test_startIp
+        self.services["vlan_ip_range"]["endip"] = test_endIp
+        self.services["vlan_ip_range"]["gateway"] = test_gateway
+        self.services["vlan_ip_range"]["netmask"] = self.netmask
+        self.services["vlan_ip_range"]["zoneid"] = self.zone.id
+        self.services["vlan_ip_range"]["podid"] = self.pod.id
+        #create new vlan ip range
+        new_vlan = PublicIpRange.create(self.apiclient, self.services["vlan_ip_range"])
+        self.debug("Created new vlan range with startip:%s and endip:%s" %(test_startIp,test_endIp))
+        self.cleanup.append(new_vlan)
+        new_vlan_res = new_vlan.list(self.apiclient,id=new_vlan.vlan.id)
+        #Compare list output with configured values
+        self.verify_vlan_range(new_vlan_res,self.services["vlan_ip_range"])
+        #Add 2nd IP range in the same CIDR
+        self.services["vlan_ip_range"]["startip"] = test_startIp2
+        self.services["vlan_ip_range"]["endip"] = test_endIp2
+        new_vlan = PublicIpRange.create(self.apiclient, self.services["vlan_ip_range"])
+        self.debug("Created new vlan range with startip:%s and endip:%s" %(test_startIp2,test_endIp2))
+        self.cleanup.append(new_vlan)
+        new_vlan_res = new_vlan.list(self.apiclient,id=new_vlan.vlan.id)
+        #Compare list output with configured values
+        self.verify_vlan_range(new_vlan_res,self.services["vlan_ip_range"])
+        #Add ip range which will overlap with two existing ip ranges in the same CIDR
+        #Populating services with new IP range
+        self.services["vlan_ip_range"]["startip"] = test_startIp3
+        self.services["vlan_ip_range"]["endip"] = test_endIp3
+        #Try to create ip range overlapped with exiting ip range
+        try:
+            PublicIpRange.create(self.apiclient, self.services["vlan_ip_range"])
+        except cloudstackAPIException as cs:
+            self.debug(cs.errorMsg)
+            self.assertTrue(cs.errorMsg.find("already has IPs that overlap with the new range")>0, msg="Fail:CS allowed adding overlapped ip ranges in guest cidr")
+            return
+        #Test will reach here there is a bug in overlap ip range checking
+        self.fail("CS should not accept overlapped ip ranges in guest traffic, but it allowed")
+        return


[38/50] [abbrv] git commit: updated refs/heads/vmsync to d403974

Posted by ah...@apache.org.
Documentation - replace cloud-(management|usage|agent) by cloudstack-(management|usage|agent), and some typo


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

Branch: refs/heads/vmsync
Commit: 80dd9f28c5f0b84cde46f3cfb9335140ac49fa53
Parents: 59316a4
Author: Milamber <mi...@apache.org>
Authored: Fri May 10 19:06:23 2013 +0100
Committer: Milamber <mi...@apache.org>
Committed: Fri May 10 19:10:51 2013 +0100

----------------------------------------------------------------------
 docs/en-US/Release_Notes.xml                       |   12 ++++++------
 docs/en-US/aws-ec2-configuration.xml               |    2 +-
 docs/en-US/change-database-password.xml            |    6 +++---
 docs/en-US/citrix-xenserver-installation.xml       |    2 +-
 docs/en-US/configure-usage-server.xml              |    4 ++--
 docs/en-US/creating-network-offerings.xml          |    2 +-
 docs/en-US/database-replication.xml                |    6 +++---
 docs/en-US/hypervisor-host-install-agent.xml       |    6 +++---
 docs/en-US/hypervisor-host-install-libvirt.xml     |    2 +-
 .../increase-management-server-max-memory.xml      |    2 +-
 docs/en-US/install-usage-server.xml                |    2 +-
 docs/en-US/lxc-install.xml                         |    4 ++--
 docs/en-US/set-global-project-resource-limits.xml  |    2 +-
 docs/en-US/set-projects-creator-permissions.xml    |    2 +-
 docs/en-US/set-up-invitations.xml                  |    2 +-
 docs/en-US/stop-restart-management-server.xml      |    6 +++---
 docs/en-US/sys-offering-sysvm.xml                  |    2 +-
 docs/en-US/zone-add.xml                            |    2 +-
 18 files changed, 33 insertions(+), 33 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/80dd9f28/docs/en-US/Release_Notes.xml
----------------------------------------------------------------------
diff --git a/docs/en-US/Release_Notes.xml b/docs/en-US/Release_Notes.xml
index cda8d72..dca95d3 100644
--- a/docs/en-US/Release_Notes.xml
+++ b/docs/en-US/Release_Notes.xml
@@ -5113,7 +5113,7 @@ service cloudstack-agent start
         <listitem>
           <para>Start the first Management Server. Do not start any other Management Server nodes
             yet.</para>
-          <programlisting language="Bash"><prompt>#</prompt> service cloud-management start</programlisting>
+          <programlisting language="Bash"><prompt>#</prompt> service cloudstack-management start</programlisting>
           <para>Wait until the databases are upgraded. Ensure that the database upgrade is complete.
             After confirmation, start the other Management Servers one at a time by running the same
             command on each node.</para>
@@ -5126,7 +5126,7 @@ service cloudstack-agent start
         <listitem>
           <para>Start all Usage Servers (if they were running on your previous version). Perform
             this on each Usage Server host.</para>
-          <para><command># service cloud-usage start</command></para>
+          <para><command># service cloudstack-usage start</command></para>
         </listitem>
         <listitem>
           <note>
@@ -5152,7 +5152,7 @@ service cloudstack-agent start
             </listitem>
             <listitem>
               <para>Start the agent.</para>
-              <programlisting># service cloud-agent start</programlisting>
+              <programlisting># service cloudstack-agent start</programlisting>
             </listitem>
             <listitem>
               <para>Edit <filename>/etc/cloud/agent/agent.properties</filename> to change the
@@ -5742,7 +5742,7 @@ service cloudstack-agent start
         <listitem>
           <para>Start the first Management Server. Do not start any other Management Server nodes
             yet.</para>
-          <programlisting language="Bash"><prompt>#</prompt> service cloud-management start</programlisting>
+          <programlisting language="Bash"><prompt>#</prompt> service cloudstack-management start</programlisting>
           <para>Wait until the databases are upgraded. Ensure that the database upgrade is complete.
             You should see a message like "Complete! Done." After confirmation, start the other
             Management Servers one at a time by running the same command on each node.</para>
@@ -5750,7 +5750,7 @@ service cloudstack-agent start
         <listitem>
           <para>Start all Usage Servers (if they were running on your previous version). Perform
             this on each Usage Server host.</para>
-          <programlisting language="Bash"><prompt>#</prompt> service cloud-usage start</programlisting>
+          <programlisting language="Bash"><prompt>#</prompt> service cloudstack-usage start</programlisting>
         </listitem>
         <listitem>
           <para>(KVM only) Additional steps are required for each KVM host. These steps will not
@@ -5776,7 +5776,7 @@ service cloudstack-agent start
             </listitem>
             <listitem>
               <para>Start the agent.</para>
-              <programlisting># service cloud-agent start</programlisting>
+              <programlisting># service cloudstack-agent start</programlisting>
             </listitem>
             <listitem>
               <para> Copy the contents of the <filename>agent.properties</filename> file to the new

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/80dd9f28/docs/en-US/aws-ec2-configuration.xml
----------------------------------------------------------------------
diff --git a/docs/en-US/aws-ec2-configuration.xml b/docs/en-US/aws-ec2-configuration.xml
index dd7732e..d6dd2b5 100644
--- a/docs/en-US/aws-ec2-configuration.xml
+++ b/docs/en-US/aws-ec2-configuration.xml
@@ -35,7 +35,7 @@
                   <warning><para>Be sure you have included the Amazon default service offering, m1.small. As well as any EC2 instance types that you will use.</para></warning>
         </listitem>
         <listitem><para>If you did not already do so when you set the configuration parameter in step <xref linkend="set-global-config"/>, restart the Management Server.</para>
-                  <programlisting># service cloud-management restart</programlisting>
+                  <programlisting># service cloudstack-management restart</programlisting>
         </listitem>
     </orderedlist>
     <para>The following sections provides details to perform these steps</para>

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/80dd9f28/docs/en-US/change-database-password.xml
----------------------------------------------------------------------
diff --git a/docs/en-US/change-database-password.xml b/docs/en-US/change-database-password.xml
index 0ab5267..b0021a4 100644
--- a/docs/en-US/change-database-password.xml
+++ b/docs/en-US/change-database-password.xml
@@ -29,8 +29,8 @@
     <listitem>
         <para>Before changing the password, you'll need to stop CloudStack's management server and the usage engine if you've deployed that component.</para>
 <screen>
-<command># service cloud-management stop</command>
-<command># service cloud-usage stop</command>
+<command># service cloudstack-management stop</command>
+<command># service cloudstack-usage stop</command>
 </screen>
     </listitem>
     <listitem>
@@ -68,7 +68,7 @@ db.usage.password=ENC(encrypted_password_from_above)
 <listitem>
     <para>After copying the new password over, you can now start CloudStack (and the usage engine, if necessary).</para>
     <screen>
-        <command># service cloud-management start</command>
+        <command># service cloudstack-management start</command>
         <command># service cloud-usage start</command>
     </screen>
 </listitem>

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/80dd9f28/docs/en-US/citrix-xenserver-installation.xml
----------------------------------------------------------------------
diff --git a/docs/en-US/citrix-xenserver-installation.xml b/docs/en-US/citrix-xenserver-installation.xml
index 2cd39a4..a5118d7 100644
--- a/docs/en-US/citrix-xenserver-installation.xml
+++ b/docs/en-US/citrix-xenserver-installation.xml
@@ -610,7 +610,7 @@ master-password=[your password]</programlisting>
           <listitem>
             <para>Restart the Management Server and Usage Server. You only need to do this once for
               all clusters.</para>
-            <programlisting># service cloud-management start
+            <programlisting># service cloudstack-management start
 # service cloud-usage start</programlisting>
           </listitem>
         </orderedlist>

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/80dd9f28/docs/en-US/configure-usage-server.xml
----------------------------------------------------------------------
diff --git a/docs/en-US/configure-usage-server.xml b/docs/en-US/configure-usage-server.xml
index 173f4a5..83bed07 100644
--- a/docs/en-US/configure-usage-server.xml
+++ b/docs/en-US/configure-usage-server.xml
@@ -32,8 +32,8 @@
         <listitem><para>In Actions, click the Edit icon.</para></listitem>
         <listitem><para>Type the desired value and click the Save icon.</para></listitem>
         <listitem><para>Restart the Management Server (as usual with any global configuration change) and also the Usage Server:</para>
-         <programlisting># service cloud-management restart
-# service cloud-usage restart 
+         <programlisting language="Bash"># service cloudstack-management restart
+# service cloudstack-usage restart 
 </programlisting></listitem>
     </orderedlist>
     <para>The following table shows the global configuration settings that control the behavior of the Usage Server.</para>

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/80dd9f28/docs/en-US/creating-network-offerings.xml
----------------------------------------------------------------------
diff --git a/docs/en-US/creating-network-offerings.xml b/docs/en-US/creating-network-offerings.xml
index 2b23ca8..260751e 100644
--- a/docs/en-US/creating-network-offerings.xml
+++ b/docs/en-US/creating-network-offerings.xml
@@ -253,7 +253,7 @@
             mode. In this mode, network resources are allocated only when the first virtual machine
             starts in the network. When conservative mode is off, the public IP can only be used for
             a single service. For example, a public IP used for a port forwarding rule cannot be
-            used for defining other services, such as SaticNAT or load balancing. When the conserve
+            used for defining other services, such as StaticNAT or load balancing. When the conserve
             mode is on, you can define more than one service on the same public IP.</para>
           <note>
             <para>If StaticNAT is enabled, irrespective of the status of the conserve mode, no port

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/80dd9f28/docs/en-US/database-replication.xml
----------------------------------------------------------------------
diff --git a/docs/en-US/database-replication.xml b/docs/en-US/database-replication.xml
index 718c349..bb14457 100644
--- a/docs/en-US/database-replication.xml
+++ b/docs/en-US/database-replication.xml
@@ -121,14 +121,14 @@ mysql> start slave;
     <title>Failover</title>
     <para>This will provide for a replicated database that can be used to implement manual failover for the Management Servers. &PRODUCT; failover from one MySQL instance to another is performed by the administrator. In the event of a database failure you should:</para>
     <orderedlist>
-        <listitem><para>Stop the Management Servers (via service cloud-management stop).</para></listitem>
+        <listitem><para>Stop the Management Servers (via service cloudstack-management stop).</para></listitem>
         <listitem><para>Change the replica's configuration to be a master and restart it.</para></listitem>
         <listitem><para>Ensure that the replica's port 3306 is open to the Management Servers.</para></listitem>
-        <listitem><para>Make a change so that the Management Server uses the new database. The simplest process here is to put the IP address of the new database server into each Management Server's /etc/cloud/management/db.properties.</para></listitem>
+        <listitem><para>Make a change so that the Management Server uses the new database. The simplest process here is to put the IP address of the new database server into each Management Server's /etc/cloudstack/management/db.properties.</para></listitem>
         <listitem>
         <para>Restart the Management Servers:</para>
         <programlisting>
-# service cloud-management start
+# service cloudstack-management start
         </programlisting>
         </listitem>
     </orderedlist>

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/80dd9f28/docs/en-US/hypervisor-host-install-agent.xml
----------------------------------------------------------------------
diff --git a/docs/en-US/hypervisor-host-install-agent.xml b/docs/en-US/hypervisor-host-install-agent.xml
index e5bfa37..41b6719 100644
--- a/docs/en-US/hypervisor-host-install-agent.xml
+++ b/docs/en-US/hypervisor-host-install-agent.xml
@@ -27,8 +27,8 @@
     <para>To manage KVM instances on the host &PRODUCT; uses a Agent. This Agent communicates with the Management server and controls all the instances on the host.</para>
     <para>First we start by installing the agent:</para>
     <para>In RHEL or CentOS:</para>
-    <programlisting language="Bash"><command>$ yum install cloud-agent</command></programlisting>
+    <programlisting language="Bash"><command>$ yum install cloudstack-agent</command></programlisting>
     <para>In Ubuntu:</para>
-    <programlisting language="Bash"><command>$ apt-get install cloud-agent</command></programlisting>
+    <programlisting language="Bash"><command>$ apt-get install cloudstack-agent</command></programlisting>
     <para>The host is now ready to be added to a cluster. This is covered in a later section, see <xref linkend="host-add" />. It is recommended that you continue to read the documentation before adding the host!</para>
-</section>
\ No newline at end of file
+</section>

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/80dd9f28/docs/en-US/hypervisor-host-install-libvirt.xml
----------------------------------------------------------------------
diff --git a/docs/en-US/hypervisor-host-install-libvirt.xml b/docs/en-US/hypervisor-host-install-libvirt.xml
index f3ff090..d3d6b9b 100644
--- a/docs/en-US/hypervisor-host-install-libvirt.xml
+++ b/docs/en-US/hypervisor-host-install-libvirt.xml
@@ -24,7 +24,7 @@
 
 <section id="hypervisor-host-install-libvirt">
     <title>Install and Configure libvirt</title>
-    <para>&PRODUCT; uses libvirt for managing virtual machines. Therefore it is vital that libvirt is configured correctly. Libvirt is a dependency of cloud-agent and should already be installed.</para>
+    <para>&PRODUCT; uses libvirt for managing virtual machines. Therefore it is vital that libvirt is configured correctly. Libvirt is a dependency of cloudstack-agent and should already be installed.</para>
     <orderedlist>
         <listitem>
             <para>In order to have live migration working libvirt has to listen for unsecured TCP connections. We also need to turn off libvirts attempt to use Multicast DNS advertising. Both of these settings are in <filename>/etc/libvirt/libvirtd.conf</filename></para>

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/80dd9f28/docs/en-US/increase-management-server-max-memory.xml
----------------------------------------------------------------------
diff --git a/docs/en-US/increase-management-server-max-memory.xml b/docs/en-US/increase-management-server-max-memory.xml
index 16d18e7..51c8724 100644
--- a/docs/en-US/increase-management-server-max-memory.xml
+++ b/docs/en-US/increase-management-server-max-memory.xml
@@ -28,7 +28,7 @@
     <orderedlist>
         <listitem><para>Edit the Tomcat configuration file:</para><programlisting>/etc/cloud/management/tomcat6.conf</programlisting></listitem>
         <listitem><para>Change the command-line parameter -XmxNNNm to a higher value of N.</para><para>For example, if the current value is -Xmx128m, change it to -Xmx1024m or higher.</para></listitem>
-        <listitem><para>To put the new setting into effect, restart the Management Server.</para><programlisting># service cloud-management restart</programlisting></listitem>
+        <listitem><para>To put the new setting into effect, restart the Management Server.</para><programlisting># service cloudstack-management restart</programlisting></listitem>
       </orderedlist>
     <para>For more information about memory issues, see "FAQ: Memory" at <ulink url="http://wiki.apache.org/tomcat/FAQ/Memory">Tomcat Wiki.</ulink></para>
 </section>

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/80dd9f28/docs/en-US/install-usage-server.xml
----------------------------------------------------------------------
diff --git a/docs/en-US/install-usage-server.xml b/docs/en-US/install-usage-server.xml
index 9dde552..ffd748d 100644
--- a/docs/en-US/install-usage-server.xml
+++ b/docs/en-US/install-usage-server.xml
@@ -52,7 +52,7 @@
         <listitem>
         <para>Once installed, start the Usage Server with the following command.</para>
         <programlisting>
-# service cloud-usage start
+# service cloudstack-usage start
         </programlisting>
         </listitem>
     </orderedlist>

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/80dd9f28/docs/en-US/lxc-install.xml
----------------------------------------------------------------------
diff --git a/docs/en-US/lxc-install.xml b/docs/en-US/lxc-install.xml
index a80c18a..40f6a0a 100644
--- a/docs/en-US/lxc-install.xml
+++ b/docs/en-US/lxc-install.xml
@@ -74,9 +74,9 @@
     <para>To manage LXC instances on the host &PRODUCT; uses a Agent. This Agent communicates with the Management server and controls all the instances on the host.</para>
     <para>First we start by installing the agent:</para>
     <para>In RHEL or CentOS:</para>
-    <programlisting language="Bash"><command>$ yum install cloud-agent</command></programlisting>
+    <programlisting language="Bash"><command>$ yum install cloudstack-agent</command></programlisting>
     <para>In Ubuntu:</para>
-    <programlisting language="Bash"><command>$ apt-get install cloud-agent</command></programlisting>
+    <programlisting language="Bash"><command>$ apt-get install cloudstack-agent</command></programlisting>
     <para>Next step is to update the Agent configuration setttings. The settings are in <filename>/etc/cloudstack/agent/agent.properties</filename></para>
     <orderedlist>
       <listitem>

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/80dd9f28/docs/en-US/set-global-project-resource-limits.xml
----------------------------------------------------------------------
diff --git a/docs/en-US/set-global-project-resource-limits.xml b/docs/en-US/set-global-project-resource-limits.xml
index d91942a..8ec1325 100644
--- a/docs/en-US/set-global-project-resource-limits.xml
+++ b/docs/en-US/set-global-project-resource-limits.xml
@@ -76,7 +76,7 @@
     </listitem>
     <listitem>
       <para>Restart the Management Server.</para>
-      <programlisting># service cloud-management restart</programlisting>
+      <programlisting># service cloudstack-management restart</programlisting>
     </listitem>
   </orderedlist>
 </section>

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/80dd9f28/docs/en-US/set-projects-creator-permissions.xml
----------------------------------------------------------------------
diff --git a/docs/en-US/set-projects-creator-permissions.xml b/docs/en-US/set-projects-creator-permissions.xml
index 9b272f6..dd9cfe9 100644
--- a/docs/en-US/set-projects-creator-permissions.xml
+++ b/docs/en-US/set-projects-creator-permissions.xml
@@ -56,7 +56,7 @@
     </listitem>
     <listitem>
       <para>Restart the Management Server.</para>
-      <programlisting># service cloud-management restart</programlisting>
+      <programlisting># service cloudstack-management restart</programlisting>
     </listitem>
   </orderedlist>
 </section>

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/80dd9f28/docs/en-US/set-up-invitations.xml
----------------------------------------------------------------------
diff --git a/docs/en-US/set-up-invitations.xml b/docs/en-US/set-up-invitations.xml
index c1303cf..180c041 100644
--- a/docs/en-US/set-up-invitations.xml
+++ b/docs/en-US/set-up-invitations.xml
@@ -89,7 +89,7 @@
             </informaltable>
         </listitem>
         <listitem><para>Restart the Management Server:</para>
-        <programlisting>service cloud-management restart</programlisting></listitem>
+        <programlisting>service cloudstack-management restart</programlisting></listitem>
     </orderedlist>
     
 </section>

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/80dd9f28/docs/en-US/stop-restart-management-server.xml
----------------------------------------------------------------------
diff --git a/docs/en-US/stop-restart-management-server.xml b/docs/en-US/stop-restart-management-server.xml
index 5c1bcec..74a687c 100644
--- a/docs/en-US/stop-restart-management-server.xml
+++ b/docs/en-US/stop-restart-management-server.xml
@@ -26,9 +26,9 @@
     <para>The root administrator will need to stop and restart the Management Server from time to time.</para>
     <para>For example, after changing a global configuration parameter, a restart is required. If you have multiple Management Server nodes, restart all of them to put the new parameter value into effect consistently throughout the cloud..</para>
     <para>To stop the Management Server, issue the following command at the operating system prompt on the Management Server node:</para>
-    <programlisting># service cloud-management stop</programlisting>
+    <programlisting># service cloudstack-management stop</programlisting>
     <para>To start the Management Server:</para>
-    <programlisting># service cloud-management start</programlisting>
+    <programlisting># service cloudstack-management start</programlisting>
     <para>To stop the Management Server:</para>
-    <programlisting># service cloud-management stop</programlisting>
+    <programlisting># service cloudstack-management stop</programlisting>
 </section>

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/80dd9f28/docs/en-US/sys-offering-sysvm.xml
----------------------------------------------------------------------
diff --git a/docs/en-US/sys-offering-sysvm.xml b/docs/en-US/sys-offering-sysvm.xml
index cccf3e0..563dd6f 100644
--- a/docs/en-US/sys-offering-sysvm.xml
+++ b/docs/en-US/sys-offering-sysvm.xml
@@ -65,7 +65,7 @@
     <listitem>
       <para>Restart &PRODUCT; Management Server. Restarting is required because the default
         offerings are loaded into the memory at startup.</para>
-      <programlisting>service cloud-management restart</programlisting>
+      <programlisting>service cloudstack-management restart</programlisting>
     </listitem>
     <listitem>
       <para>Destroy the existing CPVM or SSVM offerings and wait for them to be recreated. The new

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/80dd9f28/docs/en-US/zone-add.xml
----------------------------------------------------------------------
diff --git a/docs/en-US/zone-add.xml b/docs/en-US/zone-add.xml
index 4f6606f..3ca5789 100644
--- a/docs/en-US/zone-add.xml
+++ b/docs/en-US/zone-add.xml
@@ -42,7 +42,7 @@
                 </para>
                 </listitem>
                 <listitem><para>Restart the Management Server.</para>
-                    <programlisting># service cloud-management restart</programlisting>
+                    <programlisting># service cloudstack-management restart</programlisting>
                 </listitem>
                 <listitem><para>Refresh the &PRODUCT; UI browser tab and log back in.</para></listitem>
             </orderedlist>


[12/50] [abbrv] git commit: updated refs/heads/vmsync to d403974

Posted by ah...@apache.org.
CLOUDSTACK-2408: Object name is Null with list VNMC/List ASA API response

Setting object name correctly in response


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

Branch: refs/heads/vmsync
Commit: bde9ad3c13397758cce0b69414c0a70904947d11
Parents: 2e21060
Author: Koushik Das <ko...@citrix.com>
Authored: Thu May 9 15:49:36 2013 +0530
Committer: Koushik Das <ko...@citrix.com>
Committed: Thu May 9 15:49:36 2013 +0530

----------------------------------------------------------------------
 .../commands/ListCiscoAsa1000vResourcesCmd.java    |    1 +
 .../api/commands/ListCiscoVnmcResourcesCmd.java    |   15 +++--
 .../response/CiscoAsa1000vResourceResponse.java    |   45 +++++++++------
 .../api/response/CiscoVnmcResourceResponse.java    |   42 ++++++++-----
 4 files changed, 62 insertions(+), 41 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/bde9ad3c/plugins/network-elements/cisco-vnmc/src/com/cloud/api/commands/ListCiscoAsa1000vResourcesCmd.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/cisco-vnmc/src/com/cloud/api/commands/ListCiscoAsa1000vResourcesCmd.java b/plugins/network-elements/cisco-vnmc/src/com/cloud/api/commands/ListCiscoAsa1000vResourcesCmd.java
index 509d39f..7a4db69 100755
--- a/plugins/network-elements/cisco-vnmc/src/com/cloud/api/commands/ListCiscoAsa1000vResourcesCmd.java
+++ b/plugins/network-elements/cisco-vnmc/src/com/cloud/api/commands/ListCiscoAsa1000vResourcesCmd.java
@@ -89,6 +89,7 @@ public class ListCiscoAsa1000vResourcesCmd extends BaseListCmd {
             if (ciscoAsa1000vDevices != null && !ciscoAsa1000vDevices.isEmpty()) {
                 for (CiscoAsa1000vDevice ciscoAsa1000vDeviceVO : ciscoAsa1000vDevices) {
                     CiscoAsa1000vResourceResponse ciscoAsa1000vResourceResponse = _ciscoAsa1000vService.createCiscoAsa1000vResourceResponse(ciscoAsa1000vDeviceVO);
+                    ciscoAsa1000vResourceResponse.setObjectName("asa1000v");
                     ciscoAsa1000vResourcesResponse.add(ciscoAsa1000vResourceResponse);
                 }
             }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/bde9ad3c/plugins/network-elements/cisco-vnmc/src/com/cloud/api/commands/ListCiscoVnmcResourcesCmd.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/cisco-vnmc/src/com/cloud/api/commands/ListCiscoVnmcResourcesCmd.java b/plugins/network-elements/cisco-vnmc/src/com/cloud/api/commands/ListCiscoVnmcResourcesCmd.java
index ab553ee..b15c4e1 100644
--- a/plugins/network-elements/cisco-vnmc/src/com/cloud/api/commands/ListCiscoVnmcResourcesCmd.java
+++ b/plugins/network-elements/cisco-vnmc/src/com/cloud/api/commands/ListCiscoVnmcResourcesCmd.java
@@ -77,18 +77,19 @@ public class ListCiscoVnmcResourcesCmd extends BaseListCmd {
     @Override
     public void execute() throws ResourceUnavailableException, InsufficientCapacityException, ServerApiException, ConcurrentOperationException, ResourceAllocationException {
         try {
-            List<CiscoVnmcControllerVO> CiscoVnmcResources = _ciscoVnmcElementService.listCiscoVnmcResources(this);
+            List<CiscoVnmcControllerVO> ciscoVnmcResources = _ciscoVnmcElementService.listCiscoVnmcResources(this);
             ListResponse<CiscoVnmcResourceResponse> response = new ListResponse<CiscoVnmcResourceResponse>();
-            List<CiscoVnmcResourceResponse> CiscoVnmcResourcesResponse = new ArrayList<CiscoVnmcResourceResponse>();
+            List<CiscoVnmcResourceResponse> ciscoVnmcResourcesResponse = new ArrayList<CiscoVnmcResourceResponse>();
 
-            if (CiscoVnmcResources != null && !CiscoVnmcResources.isEmpty()) {
-                for (CiscoVnmcController CiscoVnmcResourceVO : CiscoVnmcResources) {
-                    CiscoVnmcResourceResponse CiscoVnmcResourceResponse = _ciscoVnmcElementService.createCiscoVnmcResourceResponse(CiscoVnmcResourceVO);
-                    CiscoVnmcResourcesResponse.add(CiscoVnmcResourceResponse);
+            if (ciscoVnmcResources != null && !ciscoVnmcResources.isEmpty()) {
+                for (CiscoVnmcController ciscoVnmcResourceVO : ciscoVnmcResources) {
+                    CiscoVnmcResourceResponse ciscoVnmcResourceResponse = _ciscoVnmcElementService.createCiscoVnmcResourceResponse(ciscoVnmcResourceVO);
+                    ciscoVnmcResourceResponse.setObjectName("vnmc");
+                    ciscoVnmcResourcesResponse.add(ciscoVnmcResourceResponse);
                 }
             }
 
-            response.setResponses(CiscoVnmcResourcesResponse);
+            response.setResponses(ciscoVnmcResourcesResponse);
             response.setResponseName(getCommandName());
             this.setResponseObject(response);
         }  catch (InvalidParameterValueException invalidParamExcp) {

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/bde9ad3c/plugins/network-elements/cisco-vnmc/src/com/cloud/api/response/CiscoAsa1000vResourceResponse.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/cisco-vnmc/src/com/cloud/api/response/CiscoAsa1000vResourceResponse.java b/plugins/network-elements/cisco-vnmc/src/com/cloud/api/response/CiscoAsa1000vResourceResponse.java
index 9cd87da..f857b35 100755
--- a/plugins/network-elements/cisco-vnmc/src/com/cloud/api/response/CiscoAsa1000vResourceResponse.java
+++ b/plugins/network-elements/cisco-vnmc/src/com/cloud/api/response/CiscoAsa1000vResourceResponse.java
@@ -29,60 +29,69 @@ import com.google.gson.annotations.SerializedName;
 
 @EntityReference(value = CiscoAsa1000vDevice.class)
 public class CiscoAsa1000vResourceResponse extends BaseResponse {
-    public static final String RESOURCE_NAME = "resourcename";
 
-    @SerializedName(ApiConstants.RESOURCE_ID) @Parameter(description="resource id of the Cisco ASA 1000v appliance")
+    @SerializedName(ApiConstants.RESOURCE_ID)
+    @Parameter(description="resource id of the Cisco ASA 1000v appliance")
     private String id;
 
     @SerializedName(ApiConstants.PHYSICAL_NETWORK_ID) 
     @Parameter(description="the physical network to which this ASA 1000v belongs to", entityType = PhysicalNetworkResponse.class)
-    private Long physicalNetworkId ;
-
-    public Long getPhysicalNetworkId() {
-        return physicalNetworkId;
-    }
+    private Long physicalNetworkId;
 
     @SerializedName(ApiConstants.HOST_NAME)
     @Parameter(description="management ip address of ASA 1000v")
     private String managementIp;
 
-    public String getManagementIp() {
-        return managementIp;
-    }
-
     @SerializedName(ApiConstants.ASA_INSIDE_PORT_PROFILE)
-    @Parameter(description="management ip address of ASA 1000v")
+    @Parameter(description="port profile associated with inside interface of ASA 1000v")
     private String inPortProfile;
 
-    public String getInPortProfile() {
-        return inPortProfile;
-    }
-
     @SerializedName(ApiConstants.NETWORK_ID)
     @Parameter(description="the guest network to which ASA 1000v is associated", entityType = NetworkResponse.class)
     private Long guestNetworkId;
 
-    public Long getGuestNetworkId() {
-        return guestNetworkId;
+    public String getId() {
+        return id;
     }
 
     public void setId(String ciscoAsa1000vResourceId) {
         this.id = ciscoAsa1000vResourceId;
     }
 
+    public Long getPhysicalNetworkId() {
+        return physicalNetworkId;
+    }
+
     public void setPhysicalNetworkId(Long physicalNetworkId) {
         this.physicalNetworkId = physicalNetworkId;
     }
 
+    public String getManagementIp() {
+        return managementIp;
+    }
+
     public void setManagementIp(String managementIp) {
         this.managementIp = managementIp;
     }
 
+    public String getInPortProfile() {
+        return inPortProfile;
+    }
+
     public void setInPortProfile(String inPortProfile) {
         this.inPortProfile = inPortProfile;
     }     
 
+    public Long getGuestNetworkId() {
+        return guestNetworkId;
+    }
+
     public void setGuestNetworkId(Long guestNetworkId) {
         this.guestNetworkId = guestNetworkId;
     }
+
+    @Override
+    public String getObjectId() {
+        return this.getId();
+    }
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/bde9ad3c/plugins/network-elements/cisco-vnmc/src/com/cloud/api/response/CiscoVnmcResourceResponse.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/cisco-vnmc/src/com/cloud/api/response/CiscoVnmcResourceResponse.java b/plugins/network-elements/cisco-vnmc/src/com/cloud/api/response/CiscoVnmcResourceResponse.java
index f5c9b72..92a766d 100644
--- a/plugins/network-elements/cisco-vnmc/src/com/cloud/api/response/CiscoVnmcResourceResponse.java
+++ b/plugins/network-elements/cisco-vnmc/src/com/cloud/api/response/CiscoVnmcResourceResponse.java
@@ -25,6 +25,7 @@ import org.apache.cloudstack.api.response.PhysicalNetworkResponse;
 
 import com.cloud.network.cisco.CiscoVnmcController;
 import com.google.gson.annotations.SerializedName;
+
 @EntityReference(value = CiscoVnmcController.class)
 public class CiscoVnmcResourceResponse extends BaseResponse {
     public static final String RESOURCE_NAME = "resourcename";
@@ -33,43 +34,52 @@ public class CiscoVnmcResourceResponse extends BaseResponse {
     @Parameter(description="resource id of the Cisco VNMC controller")
     private String id;
 
-    @SerializedName(ApiConstants.PHYSICAL_NETWORK_ID) 
+    @SerializedName(ApiConstants.PHYSICAL_NETWORK_ID)
     @Parameter(description="the physical network to which this VNMC belongs to", entityType = PhysicalNetworkResponse.class)
     private Long physicalNetworkId;
 
-    public Long getPhysicalNetworkId() {
-        return physicalNetworkId;
-    }
-
-    public String getProviderName() {
-        return providerName;
-    }
-
-    public String getResourceName() {
-        return resourceName;
-    }
-
-    @SerializedName(ApiConstants.PROVIDER) @Parameter(description="name of the provider")
+    @SerializedName(ApiConstants.PROVIDER)
+    @Parameter(description="name of the provider")
     private String providerName;
 
-    @SerializedName(RESOURCE_NAME) 
+    @SerializedName(RESOURCE_NAME)
     @Parameter(description="Cisco VNMC resource name")
     private String resourceName;
 
+    public String getId() {
+        return id;
+    }
+
     public void setId(String ciscoVnmcResourceId) {
         this.id = ciscoVnmcResourceId;
     }
 
+    public Long getPhysicalNetworkId() {
+        return physicalNetworkId;
+    }
+
     public void setPhysicalNetworkId(Long physicalNetworkId) {
         this.physicalNetworkId = physicalNetworkId;
     }
 
+    public String getProviderName() {
+        return providerName;
+    }
+
     public void setProviderName(String providerName) {
         this.providerName = providerName;
     }
 
+    public String getResourceName() {
+        return resourceName;
+    }
+
     public void setResourceName(String resourceName) {
         this.resourceName = resourceName;
-    }     
+    }
 
+    @Override
+    public String getObjectId() {
+        return this.getId();
+    }
 }


[30/50] [abbrv] git commit: updated refs/heads/vmsync to d403974

Posted by ah...@apache.org.
CLOUDSTACK-2035: Fix source NAT configuration with Cisco VNMC/ASA

Due to VNMC limitation source nat ip cannot be assigned to ASA 1000v outside interface. Working around this issue by acquiring additional public ip during network implement and assigning that to outside interface of ASA. Also made changes to ensure that source nat policy comes after pf and static nat policies in terms of evaluation by assigning a high 'order' value for it.


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

Branch: refs/heads/vmsync
Commit: c704c90b1163d0f3386370e75fc5903dd76498c5
Parents: dfad178
Author: Koushik Das <ko...@citrix.com>
Authored: Fri May 10 16:35:15 2013 +0530
Committer: Koushik Das <ko...@citrix.com>
Committed: Fri May 10 16:35:15 2013 +0530

----------------------------------------------------------------------
 .../network/cisco/CiscoVnmcConnectionImpl.java     |   35 +++++++++-----
 .../cloud/network/element/CiscoVnmcElement.java    |   33 ++++++++++++--
 2 files changed, 50 insertions(+), 18 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/c704c90b/plugins/network-elements/cisco-vnmc/src/com/cloud/network/cisco/CiscoVnmcConnectionImpl.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/cisco-vnmc/src/com/cloud/network/cisco/CiscoVnmcConnectionImpl.java b/plugins/network-elements/cisco-vnmc/src/com/cloud/network/cisco/CiscoVnmcConnectionImpl.java
index 527fb04..714eb82 100644
--- a/plugins/network-elements/cisco-vnmc/src/com/cloud/network/cisco/CiscoVnmcConnectionImpl.java
+++ b/plugins/network-elements/cisco-vnmc/src/com/cloud/network/cisco/CiscoVnmcConnectionImpl.java
@@ -279,7 +279,7 @@ public class CiscoVnmcConnectionImpl implements CiscoVnmcConnection {
         String xml = VnmcXml.CREATE_VDC.getXml();
         String service = VnmcXml.CREATE_VDC.getService();
         xml = replaceXmlValue(xml, "cookie", _cookie);
-        xml = replaceXmlValue(xml, "descr", "VDC for Tenant" + tenantName);
+        xml = replaceXmlValue(xml, "descr", "VDC for Tenant " + tenantName);
         xml = replaceXmlValue(xml, "name", getNameForTenantVDC(tenantName));
         xml = replaceXmlValue(xml, "dn", getDnForTenantVDC(tenantName));
 
@@ -304,7 +304,7 @@ public class CiscoVnmcConnectionImpl implements CiscoVnmcConnection {
         String xml = VnmcXml.CREATE_EDGE_DEVICE_PROFILE.getXml();
         String service = VnmcXml.CREATE_EDGE_DEVICE_PROFILE.getService();
         xml = replaceXmlValue(xml, "cookie", _cookie);
-        xml = replaceXmlValue(xml, "descr", "Edge Device Profile for Tenant VDC" + tenantName);
+        xml = replaceXmlValue(xml, "descr", "Edge Device Profile for Tenant VDC " + tenantName);
         xml = replaceXmlValue(xml, "name", getNameForEdgeDeviceServiceProfile(tenantName));
         xml = replaceXmlValue(xml, "dn", getDnForTenantVDCEdgeDeviceProfile(tenantName));
 
@@ -407,7 +407,7 @@ public class CiscoVnmcConnectionImpl implements CiscoVnmcConnection {
         String xml = VnmcXml.CREATE_EDGE_SECURITY_PROFILE.getXml();
         String service = VnmcXml.CREATE_EDGE_SECURITY_PROFILE.getService();
         xml = replaceXmlValue(xml, "cookie", _cookie);
-        xml = replaceXmlValue(xml, "descr", "Edge Security Profile for Tenant VDC" + tenantName);
+        xml = replaceXmlValue(xml, "descr", "Edge Security Profile for Tenant VDC " + tenantName);
         xml = replaceXmlValue(xml, "name", getNameForEdgeDeviceSecurityProfile(tenantName));
         xml = replaceXmlValue(xml, "espdn", getDnForTenantVDCEdgeSecurityProfile(tenantName));
         xml = replaceXmlValue(xml, "egressref", "default-egress");
@@ -505,7 +505,8 @@ public class CiscoVnmcConnectionImpl implements CiscoVnmcConnection {
         return createTenantVDCNatPolicyRef(
                 getDnForSourceNatPolicyRef(tenantName),
                 getNameForSourceNatPolicy(tenantName),
-                tenantName);
+                tenantName,
+                true);
     }
 
     @Override
@@ -545,7 +546,7 @@ public class CiscoVnmcConnectionImpl implements CiscoVnmcConnection {
         String xml = VnmcXml.RESOLVE_NAT_POLICY_SET.getXml();
         String service = VnmcXml.RESOLVE_NAT_POLICY_SET.getService();
         xml = replaceXmlValue(xml, "cookie", _cookie);
-        xml = replaceXmlValue(xml, "descr", "Edge Security Profile for Tenant VDC" + tenantName);
+        xml = replaceXmlValue(xml, "descr", "Edge Security Profile for Tenant VDC " + tenantName);
         xml = replaceXmlValue(xml, "name", getNameForEdgeDeviceSecurityProfile(tenantName));
         xml = replaceXmlValue(xml, "espdn", getDnForTenantVDCEdgeSecurityProfile(tenantName));
         xml = replaceXmlValue(xml, "natpolicysetname", getNameForNatPolicySet(tenantName));
@@ -656,7 +657,7 @@ public class CiscoVnmcConnectionImpl implements CiscoVnmcConnection {
         String xml = VnmcXml.RESOLVE_ACL_POLICY_SET.getXml();
         String service = VnmcXml.RESOLVE_ACL_POLICY_SET.getService();
         xml = replaceXmlValue(xml, "cookie", _cookie);
-        xml = replaceXmlValue(xml, "descr", "Edge Security Profile for Tenant VDC" + tenantName);
+        xml = replaceXmlValue(xml, "descr", "Edge Security Profile for Tenant VDC " + tenantName);
         xml = replaceXmlValue(xml, "name", getNameForEdgeDeviceSecurityProfile(tenantName));
         xml = replaceXmlValue(xml, "espdn", getDnForTenantVDCEdgeSecurityProfile(tenantName));
         //xml = replaceXmlValue(xml, "egresspolicysetname", getNameForAclPolicySet(tenantName, false));
@@ -838,17 +839,23 @@ public class CiscoVnmcConnectionImpl implements CiscoVnmcConnection {
         return verifySuccess(response);
     }
 
-    private boolean createTenantVDCNatPolicyRef(String policyRefDn, String name, String tenantName) throws ExecutionException {
+    private boolean createTenantVDCNatPolicyRef(String policyRefDn, String name, String tenantName, boolean isSourceNat) throws ExecutionException {
         String xml = VnmcXml.CREATE_NAT_POLICY_REF.getXml();
         String service = VnmcXml.CREATE_NAT_POLICY_REF.getService();
         xml = replaceXmlValue(xml, "cookie", _cookie);
         xml = replaceXmlValue(xml, "natpolicyrefdn", policyRefDn);
         xml = replaceXmlValue(xml, "natpolicyname", name);
 
-        List<String> policies = listNatPolicies(tenantName);
-        int order = 100;
-        if (policies != null) {
-            order += policies.size();
+        // PF and static NAT policies need to come before source NAT, so leaving buffer
+        // and creating source NAT with a high order value.
+        // Initially tried setting MAX_INT as the order but VNMC complains about it
+        int order = 10000; // TODO: For now value should be sufficient, if required may need to increase
+        if (!isSourceNat) {
+            List<String> policies = listNatPolicies(tenantName);
+            order = 100; // order starts at 100
+            if (policies != null) {
+                order += policies.size();
+            }
         }
         xml = replaceXmlValue(xml, "order", Integer.toString(order));
 
@@ -1062,7 +1069,8 @@ public class CiscoVnmcConnectionImpl implements CiscoVnmcConnection {
         return createTenantVDCNatPolicyRef(
                 getDnForPFPolicyRef(tenantName, identifier),
                 getNameForPFPolicy(tenantName, identifier),
-                tenantName);
+                tenantName,
+                false);
     }
 
     @Override
@@ -1180,7 +1188,8 @@ public class CiscoVnmcConnectionImpl implements CiscoVnmcConnection {
         return createTenantVDCNatPolicyRef(
                 getDnForDNatPolicyRef(tenantName, identifier),
                 getNameForDNatPolicy(tenantName, identifier),
-                tenantName);
+                tenantName,
+                false);
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/c704c90b/plugins/network-elements/cisco-vnmc/src/com/cloud/network/element/CiscoVnmcElement.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/cisco-vnmc/src/com/cloud/network/element/CiscoVnmcElement.java b/plugins/network-elements/cisco-vnmc/src/com/cloud/network/element/CiscoVnmcElement.java
index 470c4e8..33cc40a 100644
--- a/plugins/network-elements/cisco-vnmc/src/com/cloud/network/element/CiscoVnmcElement.java
+++ b/plugins/network-elements/cisco-vnmc/src/com/cloud/network/element/CiscoVnmcElement.java
@@ -70,6 +70,7 @@ import com.cloud.deploy.DeployDestination;
 import com.cloud.exception.ConcurrentOperationException;
 import com.cloud.exception.InsufficientCapacityException;
 import com.cloud.exception.InvalidParameterValueException;
+import com.cloud.exception.ResourceAllocationException;
 import com.cloud.exception.ResourceUnavailableException;
 import com.cloud.host.DetailVO;
 import com.cloud.host.Host;
@@ -113,6 +114,7 @@ import com.cloud.resource.ResourceStateAdapter;
 import com.cloud.resource.ServerResource;
 import com.cloud.resource.UnableDeleteHostException;
 import com.cloud.user.Account;
+import com.cloud.user.UserContext;
 import com.cloud.utils.component.AdapterBase;
 import com.cloud.utils.db.Transaction;
 import com.cloud.utils.exception.CloudRuntimeException;
@@ -338,10 +340,31 @@ public class CiscoVnmcElement extends AdapterBase implements SourceNatServicePro
                 publicGateways.add(vlanVO.getVlanGateway());
             }
 
+            // due to VNMC limitation of not allowing source NAT ip as the outside ip of firewall,
+            // an additional public ip needs to acquired for assigning as firewall outside ip
+            IpAddress outsideIp = null;
+            try {
+                Account caller = UserContext.current().getCaller();
+                long callerUserId = UserContext.current().getCallerUserId();
+                outsideIp = _networkMgr.allocateIp(owner, false, caller, callerUserId, zone);
+            } catch (ResourceAllocationException e) {
+                s_logger.error("Unable to allocate additional public Ip address. Exception details " + e);
+                return false;
+            }
+
+            try {
+                outsideIp = _networkMgr.associateIPToGuestNetwork(outsideIp.getId(), network.getId(), true);
+            } catch (ResourceAllocationException e) {
+                s_logger.error("Unable to assign allocated additional public Ip " + outsideIp.getAddress().addr() + " to network with vlan " + vlanId + ". Exception details " + e);
+                return false;
+            }
+
             // create logical edge firewall in VNMC
             String gatewayNetmask = NetUtils.getCidrNetmask(network.getCidr());
+            // due to ASA limitation of allowing single subnet to be assigned to firewall interfaces,
+            // all public ip addresses must be from same subnet, this essentially means single public subnet in zone
             if (!createLogicalEdgeFirewall(vlanId, network.getGateway(), gatewayNetmask,
-                    sourceNatIp.getAddress().addr(), sourceNatIp.getNetmask(), publicGateways, ciscoVnmcHost.getId())) {
+                    outsideIp.getAddress().addr(), sourceNatIp.getNetmask(), publicGateways, ciscoVnmcHost.getId())) {
                 s_logger.error("Failed to create logical edge firewall in Cisco VNMC device for network " + network.getName());
                 return false;
             }
@@ -356,10 +379,10 @@ public class CiscoVnmcElement extends AdapterBase implements SourceNatServicePro
             }
 
             // configure source NAT
-            //if (!configureSourceNat(vlanId, network.getCidr(), sourceNatIp, ciscoVnmcHost.getId())) {
-            //    s_logger.error("Failed to configure source NAT in Cisco VNMC device for network " + network.getName());
-            //    return false;
-            //}
+            if (!configureSourceNat(vlanId, network.getCidr(), sourceNatIp, ciscoVnmcHost.getId())) {
+                s_logger.error("Failed to configure source NAT in Cisco VNMC device for network " + network.getName());
+                return false;
+            }
 
             // associate Asa 1000v instance with logical edge firewall
             if (!associateAsaWithLogicalEdgeFirewall(vlanId, assignedAsa.getManagementIp(), ciscoVnmcHost.getId())) {


[37/50] [abbrv] git commit: updated refs/heads/vmsync to d403974

Posted by ah...@apache.org.
VPC:

1) In unittest, removed the unsed Dao from components scan
2) Netscaler and InternalLb element shouldn't impelement VPC provider as they provide only LB services support


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

Branch: refs/heads/vmsync
Commit: 59316a4d190bc5e999a2070f5731bbe197b84a0a
Parents: 846729a
Author: Alena Prokharchyk <al...@citrix.com>
Authored: Fri May 10 09:58:55 2013 -0700
Committer: Alena Prokharchyk <al...@citrix.com>
Committed: Fri May 10 10:42:56 2013 -0700

----------------------------------------------------------------------
 .../ElementChildTestConfiguration.java             |    3 +-
 .../internallbvmmgr/LbChildTestConfiguration.java  |    4 +-
 .../cloud/network/element/NetscalerElement.java    |   30 +--------------
 .../src/com/cloud/network/vpc/VpcManagerImpl.java  |    2 -
 .../cloudstack/lb/ChildTestConfiguration.java      |    4 +-
 5 files changed, 9 insertions(+), 34 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/59316a4d/plugins/network-elements/internal-loadbalancer/test/org/apache/cloudstack/internallbelement/ElementChildTestConfiguration.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/internal-loadbalancer/test/org/apache/cloudstack/internallbelement/ElementChildTestConfiguration.java b/plugins/network-elements/internal-loadbalancer/test/org/apache/cloudstack/internallbelement/ElementChildTestConfiguration.java
index 6959b95..8a67e84 100644
--- a/plugins/network-elements/internal-loadbalancer/test/org/apache/cloudstack/internallbelement/ElementChildTestConfiguration.java
+++ b/plugins/network-elements/internal-loadbalancer/test/org/apache/cloudstack/internallbelement/ElementChildTestConfiguration.java
@@ -40,12 +40,13 @@ import com.cloud.network.dao.NetworkServiceMapDao;
 import com.cloud.network.dao.PhysicalNetworkServiceProviderDao;
 import com.cloud.network.dao.VirtualRouterProviderDao;
 import com.cloud.user.AccountManager;
+import com.cloud.utils.net.NetUtils;
 import com.cloud.vm.dao.DomainRouterDao;
 
 @Configuration
 @ComponentScan(
     basePackageClasses={
-        AccountVlanMapDaoImpl.class
+            NetUtils.class,
     },
     includeFilters={@Filter(value=ElementChildTestConfiguration.Library.class, type=FilterType.CUSTOM)},
     useDefaultFilters=false

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/59316a4d/plugins/network-elements/internal-loadbalancer/test/org/apache/cloudstack/internallbvmmgr/LbChildTestConfiguration.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/internal-loadbalancer/test/org/apache/cloudstack/internallbvmmgr/LbChildTestConfiguration.java b/plugins/network-elements/internal-loadbalancer/test/org/apache/cloudstack/internallbvmmgr/LbChildTestConfiguration.java
index 0f24f96..79354ef 100644
--- a/plugins/network-elements/internal-loadbalancer/test/org/apache/cloudstack/internallbvmmgr/LbChildTestConfiguration.java
+++ b/plugins/network-elements/internal-loadbalancer/test/org/apache/cloudstack/internallbvmmgr/LbChildTestConfiguration.java
@@ -46,14 +46,16 @@ import com.cloud.server.ConfigurationServer;
 import com.cloud.service.dao.ServiceOfferingDao;
 import com.cloud.storage.dao.VMTemplateDao;
 import com.cloud.user.AccountManager;
+import com.cloud.utils.net.NetUtils;
 import com.cloud.vm.VirtualMachineManager;
 import com.cloud.vm.dao.DomainRouterDao;
 import com.cloud.vm.dao.NicDao;
 
+
 @Configuration
 @ComponentScan(
     basePackageClasses={
-        AccountVlanMapDaoImpl.class
+            NetUtils.class,
     },
     includeFilters={@Filter(value=LbChildTestConfiguration.Library.class, type=FilterType.CUSTOM)},
     useDefaultFilters=false

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/59316a4d/plugins/network-elements/netscaler/src/com/cloud/network/element/NetscalerElement.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/netscaler/src/com/cloud/network/element/NetscalerElement.java b/plugins/network-elements/netscaler/src/com/cloud/network/element/NetscalerElement.java
index 4f2a0a1..60d6674 100644
--- a/plugins/network-elements/netscaler/src/com/cloud/network/element/NetscalerElement.java
+++ b/plugins/network-elements/netscaler/src/com/cloud/network/element/NetscalerElement.java
@@ -120,7 +120,7 @@ import com.google.gson.Gson;
 @Local(value = {NetworkElement.class, StaticNatServiceProvider.class, LoadBalancingServiceProvider.class, GslbServiceProvider.class})
 public class NetscalerElement extends ExternalLoadBalancerDeviceManagerImpl implements LoadBalancingServiceProvider,
         NetscalerLoadBalancerElementService, ExternalLoadBalancerDeviceManager, IpDeployer, StaticNatServiceProvider,
-        GslbServiceProvider, VpcProvider {
+        GslbServiceProvider {
 
     private static final Logger s_logger = Logger.getLogger(NetscalerElement.class);
     public static final AutoScaleCounterType AutoScaleCounterSnmp = new AutoScaleCounterType("snmp");
@@ -1003,32 +1003,4 @@ public class NetscalerElement extends ExternalLoadBalancerDeviceManagerImpl impl
         return true;
     }
 
-    @Override
-    public boolean implementVpc(Vpc vpc, DeployDestination dest, ReservationContext context)
-            throws ConcurrentOperationException, ResourceUnavailableException, InsufficientCapacityException {
-        return true;
-    }
-
-    @Override
-    public boolean shutdownVpc(Vpc vpc, ReservationContext context) throws ConcurrentOperationException,
-            ResourceUnavailableException {
-        return true;
-    }
-
-    @Override
-    public boolean createPrivateGateway(PrivateGateway gateway) throws ConcurrentOperationException,
-            ResourceUnavailableException {
-        return true;
-    }
-
-    @Override
-    public boolean deletePrivateGateway(PrivateGateway privateGateway) throws ConcurrentOperationException,
-            ResourceUnavailableException {
-        return true;
-    }
-
-    @Override
-    public boolean applyStaticRoutes(Vpc vpc, List<StaticRouteProfile> routes) throws ResourceUnavailableException {
-        return true;
-    }
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/59316a4d/server/src/com/cloud/network/vpc/VpcManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/vpc/VpcManagerImpl.java b/server/src/com/cloud/network/vpc/VpcManagerImpl.java
index 3e6a598..09776ae 100644
--- a/server/src/com/cloud/network/vpc/VpcManagerImpl.java
+++ b/server/src/com/cloud/network/vpc/VpcManagerImpl.java
@@ -1184,8 +1184,6 @@ public class VpcManagerImpl extends ManagerBase implements VpcManager, VpcProvis
         if (vpcElements == null) {
             vpcElements = new ArrayList<VpcProvider>();
             vpcElements.add((VpcProvider)_ntwkModel.getElementImplementingProvider(Provider.VPCVirtualRouter.getName()));
-            vpcElements.add((VpcProvider)_ntwkModel.getElementImplementingProvider(Provider.Netscaler.getName()));
-            vpcElements.add((VpcProvider)_ntwkModel.getElementImplementingProvider(Provider.InternalLbVm.getName()));
         }
 
         if (vpcElements == null) {

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/59316a4d/server/test/org/apache/cloudstack/lb/ChildTestConfiguration.java
----------------------------------------------------------------------
diff --git a/server/test/org/apache/cloudstack/lb/ChildTestConfiguration.java b/server/test/org/apache/cloudstack/lb/ChildTestConfiguration.java
index 918de81..a5b84ed 100644
--- a/server/test/org/apache/cloudstack/lb/ChildTestConfiguration.java
+++ b/server/test/org/apache/cloudstack/lb/ChildTestConfiguration.java
@@ -38,11 +38,13 @@ import com.cloud.network.dao.FirewallRulesDao;
 import com.cloud.network.lb.LoadBalancingRulesManager;
 import com.cloud.tags.dao.ResourceTagDao;
 import com.cloud.user.AccountManager;
+import com.cloud.utils.net.NetUtils;
+
 
 @Configuration
 @ComponentScan(
     basePackageClasses={
-        AccountVlanMapDaoImpl.class
+        NetUtils.class
     },
     includeFilters={@Filter(value=ChildTestConfiguration.Library.class, type=FilterType.CUSTOM)},
     useDefaultFilters=false


[23/50] [abbrv] git commit: updated refs/heads/vmsync to d403974

Posted by ah...@apache.org.
Marvin test: exclude sandbox.cfg from the rat check


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

Branch: refs/heads/vmsync
Commit: 19f014585e1d2a85b66ecd5ad57ee0c6338beb4c
Parents: 2660a6b
Author: Alena Prokharchyk <al...@citrix.com>
Authored: Thu May 9 14:47:49 2013 -0700
Committer: Alena Prokharchyk <al...@citrix.com>
Committed: Thu May 9 14:54:31 2013 -0700

----------------------------------------------------------------------
 pom.xml |    1 +
 1 files changed, 1 insertions(+), 0 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/19f01458/pom.xml
----------------------------------------------------------------------
diff --git a/pom.xml b/pom.xml
index 9dbd1bf..e8fdb2f 100644
--- a/pom.xml
+++ b/pom.xml
@@ -437,6 +437,7 @@
               <exclude>patches/systemvm/debian/config/var/www/html/latest/.htaccess</exclude>
               <exclude>patches/systemvm/debian/vpn/etc/ipsec.d/l2tp.conf</exclude>
               <exclude>tools/transifex/.tx/config</exclude>
+              <exclude>tools/marvin/marvin/sandbox/advanced/sandbox.cfg</exclude>
             </excludes>
           </configuration>
         </plugin>


[05/50] [abbrv] git commit: updated refs/heads/vmsync to d403974

Posted by ah...@apache.org.
CLOUDSTACK-2318: update volumes.path to fix stop/start vm error after
upgrade from 2.2.14 to 3.0.0

Signed-off-by: Chip Childers <ch...@gmail.com>


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

Branch: refs/heads/vmsync
Commit: 99d0936314571e645f62e40bf4d227232be89632
Parents: 44f3f5e
Author: Wei Zhou <w....@leaseweb.com>
Authored: Wed May 8 17:44:46 2013 +0100
Committer: Chip Childers <ch...@gmail.com>
Committed: Wed May 8 17:45:56 2013 +0100

----------------------------------------------------------------------
 setup/db/db/schema-2214to30.sql |    1 +
 1 files changed, 1 insertions(+), 0 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/99d09363/setup/db/db/schema-2214to30.sql
----------------------------------------------------------------------
diff --git a/setup/db/db/schema-2214to30.sql b/setup/db/db/schema-2214to30.sql
index 60eceea..e288b0f 100755
--- a/setup/db/db/schema-2214to30.sql
+++ b/setup/db/db/schema-2214to30.sql
@@ -664,6 +664,7 @@ ALTER TABLE `cloud`.`dc_storage_network_ip_range` ADD COLUMN `gateway` varchar(1
 
 ALTER TABLE `cloud`.`volumes` ADD COLUMN `last_pool_id` bigint unsigned;
 UPDATE `cloud`.`volumes` SET `last_pool_id` = `pool_id`;
+UPDATE `cloud`.`volumes` SET `path` = SUBSTRING_INDEX(`path`, '/', -1);
 
 ALTER TABLE `cloud`.`user_ip_address` ADD COLUMN `is_system` int(1) unsigned NOT NULL default '0';
 ALTER TABLE `cloud`.`volumes` ADD COLUMN `update_count` bigint unsigned NOT NULL DEFAULT 0;


[31/50] [abbrv] git commit: updated refs/heads/vmsync to d403974

Posted by ah...@apache.org.
CLOUDSTACK-760:Allow ACL on all layer 4 protocols


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

Branch: refs/heads/vmsync
Commit: edd2fbb266d316fc130520876dfb2f7152223d37
Parents: dfad178
Author: Pranav Saxena <pr...@citrix.com>
Authored: Fri May 10 16:47:09 2013 +0530
Committer: Pranav Saxena <pr...@citrix.com>
Committed: Fri May 10 16:47:09 2013 +0530

----------------------------------------------------------------------
 ui/scripts/vpc.js |   33 +++++++++++++++++++++++++++++++--
 1 files changed, 31 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/edd2fbb2/ui/scripts/vpc.js
----------------------------------------------------------------------
diff --git a/ui/scripts/vpc.js b/ui/scripts/vpc.js
index db964e6..dc26265 100644
--- a/ui/scripts/vpc.js
+++ b/ui/scripts/vpc.js
@@ -48,6 +48,22 @@
               return name != 'icmptype' && name != 'icmpcode' && name != 'cidrlist';
             });
 
+            var $protocolinput = args.$form.find('th,td');
+            var $protocolFields = $protocolinput.filter(function(){
+             var name = $(this).attr('rel');
+
+             return  $.inArray(name,['protocolnumber']) > -1;
+            });
+
+           if($(this).val() == 'protocolnumber' ){
+
+             $protocolFields.show();
+            }
+            else{
+             $protocolFields.hide();
+            }
+
+
             if ($(this).val() == 'icmp') {
               $icmpFields.show();
               $icmpFields.attr('disabled', false);
@@ -68,11 +84,16 @@
             data: [
               { name: 'tcp', description: 'TCP' },
               { name: 'udp', description: 'UDP' },
-              { name: 'icmp', description: 'ICMP' }
+              { name: 'icmp', description: 'ICMP' },
+              { name: 'all', description: 'ALL'},
+              { name: 'protocolnumber', description: 'Protocol Number'}
+
             ]
           });
         }
       },
+
+      'protocolnumber': {label:'Protocol Number',isDisabled:true,isHidden:true,edit:true},
       'startport': { edit: true, label: 'label.start.port' },
       'endport': { edit: true, label: 'label.end.port' },
       'networkid': {
@@ -136,7 +157,15 @@
       label: 'label.add',
       action: function(args) {
         var $multi = args.$multi;
-        
+        //Support for Protocol Number between 0 to 255
+        if(args.data.protocol == 'protocolnumber'){
+            $.extend(args.data,{protocol:args.data.protocolnumber});
+            delete args.data.protocolnumber;
+        }
+        else
+          delete args.data.protocolnumber;
+
+       
         $.ajax({
           url: createURL('createNetworkACL'),
           data: $.extend(args.data, {


[14/50] [abbrv] CLOUDSTACK-747: Internal LB between VPC tiers support

Posted by ah...@apache.org.
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2660a6b7/server/test/org/apache/cloudstack/lb/ApplicationLoadBalancerTest.java
----------------------------------------------------------------------
diff --git a/server/test/org/apache/cloudstack/lb/ApplicationLoadBalancerTest.java b/server/test/org/apache/cloudstack/lb/ApplicationLoadBalancerTest.java
new file mode 100644
index 0000000..461cbbd
--- /dev/null
+++ b/server/test/org/apache/cloudstack/lb/ApplicationLoadBalancerTest.java
@@ -0,0 +1,292 @@
+// 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 org.apache.cloudstack.lb;
+
+import java.lang.reflect.Field;
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.inject.Inject;
+
+import junit.framework.TestCase;
+
+import org.apache.cloudstack.lb.dao.ApplicationLoadBalancerRuleDao;
+import org.apache.cloudstack.network.lb.ApplicationLoadBalancerManagerImpl;
+import org.apache.cloudstack.network.lb.ApplicationLoadBalancerRule;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mockito;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+
+import com.cloud.event.dao.UsageEventDao;
+import com.cloud.exception.InsufficientAddressCapacityException;
+import com.cloud.exception.InsufficientVirtualNetworkCapcityException;
+import com.cloud.exception.InvalidParameterValueException;
+import com.cloud.exception.NetworkRuleConflictException;
+import com.cloud.exception.UnsupportedServiceException;
+import com.cloud.network.Network;
+import com.cloud.network.Network.Capability;
+import com.cloud.network.Network.Service;
+import com.cloud.network.NetworkModel;
+import com.cloud.network.Networks.TrafficType;
+import com.cloud.network.dao.FirewallRulesDao;
+import com.cloud.network.dao.NetworkVO;
+import com.cloud.network.lb.LoadBalancingRule;
+import com.cloud.network.lb.LoadBalancingRulesManager;
+import com.cloud.network.rules.FirewallRuleVO;
+import com.cloud.network.rules.LoadBalancerContainer.Scheme;
+import com.cloud.user.AccountManager;
+import com.cloud.user.AccountVO;
+import com.cloud.user.UserContext;
+import com.cloud.user.UserVO;
+import com.cloud.utils.component.ComponentContext;
+import com.cloud.utils.exception.CloudRuntimeException;
+import com.cloud.utils.net.Ip;
+import com.cloud.utils.net.NetUtils;
+
+/**
+ * This class is responsible for unittesting the methods defined in ApplicationLoadBalancerService
+ *
+ */
+
+@RunWith(SpringJUnit4ClassRunner.class)
+@ContextConfiguration(locations="classpath:/appLoadBalancer.xml")
+public class ApplicationLoadBalancerTest extends TestCase{
+    //The interface to test
+    @Inject ApplicationLoadBalancerManagerImpl _appLbSvc;
+    
+    //The interfaces below are mocked
+    @Inject ApplicationLoadBalancerRuleDao _lbDao;
+    @Inject LoadBalancingRulesManager _lbMgr;
+    @Inject NetworkModel _ntwkModel;
+    @Inject AccountManager _accountMgr;
+    @Inject FirewallRulesDao _firewallDao;
+    @Inject UsageEventDao _usageEventDao;
+
+    
+    public static long existingLbId = 1L;
+    public static long nonExistingLbId = 2L;
+    
+    public static long validGuestNetworkId = 1L;
+    public static long invalidGuestNetworkId = 2L;
+    public static long validPublicNetworkId = 3L;
+    
+    public static long validAccountId = 1L;
+    public static long invalidAccountId = 2L;
+    
+    public String validRequestedIp = "10.1.1.1";
+
+
+    
+    @Before
+    public void setUp() {
+        ComponentContext.initComponentsLifeCycle();
+        //mockito for .getApplicationLoadBalancer tests
+        Mockito.when(_lbDao.findById(1L)).thenReturn(new ApplicationLoadBalancerRuleVO());
+        Mockito.when(_lbDao.findById(2L)).thenReturn(null);
+        
+        //mockito for .deleteApplicationLoadBalancer tests
+        Mockito.when(_lbMgr.deleteLoadBalancerRule(existingLbId, true)).thenReturn(true);
+        Mockito.when(_lbMgr.deleteLoadBalancerRule(nonExistingLbId, true)).thenReturn(false);
+        
+        //mockito for .createApplicationLoadBalancer tests
+        NetworkVO guestNetwork = new NetworkVO(TrafficType.Guest, null, null, 1,
+                null, 1, 1L);
+        setId(guestNetwork, validGuestNetworkId);
+        guestNetwork.setCidr("10.1.1.1/24");
+        
+        NetworkVO publicNetwork = new NetworkVO(TrafficType.Public, null, null, 1,
+                null, 1, 1L);
+   
+        Mockito.when(_ntwkModel.getNetwork(validGuestNetworkId)).thenReturn(guestNetwork);
+        Mockito.when(_ntwkModel.getNetwork(invalidGuestNetworkId)).thenReturn(null);
+        Mockito.when(_ntwkModel.getNetwork(validPublicNetworkId)).thenReturn(publicNetwork);
+
+        Mockito.when(_accountMgr.getAccount(validAccountId)).thenReturn(new AccountVO());
+        Mockito.when(_accountMgr.getAccount(invalidAccountId)).thenReturn(null);
+        Mockito.when(_ntwkModel.areServicesSupportedInNetwork(validGuestNetworkId, Service.Lb)).thenReturn(true);
+        Mockito.when(_ntwkModel.areServicesSupportedInNetwork(invalidGuestNetworkId, Service.Lb)).thenReturn(false);
+        
+        ApplicationLoadBalancerRuleVO lbRule = new ApplicationLoadBalancerRuleVO("new", "new", 22, 22, "roundrobin",
+                validGuestNetworkId, validAccountId, 1L, new Ip(validRequestedIp), validGuestNetworkId, Scheme.Internal);
+        Mockito.when(_lbDao.persist(Mockito.any(ApplicationLoadBalancerRuleVO.class))).thenReturn(lbRule);
+        
+        Mockito.when(_lbMgr.validateLbRule(Mockito.any(LoadBalancingRule.class))).thenReturn(true);
+        
+        Mockito.when(_firewallDao.setStateToAdd(Mockito.any(FirewallRuleVO.class))).thenReturn(true);
+        
+        Mockito.when(_accountMgr.getSystemUser()).thenReturn(new UserVO(1));
+        Mockito.when(_accountMgr.getSystemAccount()).thenReturn(new AccountVO(2));
+        UserContext.registerContext(_accountMgr.getSystemUser().getId(), _accountMgr.getSystemAccount(), null, false);
+        
+        Mockito.when(_ntwkModel.areServicesSupportedInNetwork(Mockito.anyLong(), Mockito.any(Network.Service.class))).thenReturn(true);
+        
+        Map<Network.Capability, String> caps = new HashMap<Network.Capability, String>();
+        caps.put(Capability.SupportedProtocols, NetUtils.TCP_PROTO);
+        Mockito.when(_ntwkModel.getNetworkServiceCapabilities(Mockito.anyLong(), Mockito.any(Network.Service.class))).thenReturn(caps);
+        
+        
+        Mockito.when(_lbDao.countBySourceIp(new Ip(validRequestedIp), validGuestNetworkId)).thenReturn(1L);
+        
+    }
+    
+    /**
+     * TESTS FOR .getApplicationLoadBalancer
+     */
+    
+    @Test
+    //Positive test - retrieve existing lb
+    public void searchForExistingLoadBalancer() {
+        ApplicationLoadBalancerRule rule = _appLbSvc.getApplicationLoadBalancer(existingLbId);
+        assertNotNull("Couldn't find existing application load balancer", rule);
+    }
+    
+    @Test
+    //Negative test - try to retrieve non-existing lb
+    public void searchForNonExistingLoadBalancer() {
+        boolean notFound = false;
+        ApplicationLoadBalancerRule rule = null;
+        try {
+            rule = _appLbSvc.getApplicationLoadBalancer(nonExistingLbId);
+            if (rule != null) {
+                notFound = false; 
+            }
+        } catch (InvalidParameterValueException ex) {
+            notFound = true;
+        }
+        
+        assertTrue("Found non-existing load balancer; no invalid parameter value exception was thrown", notFound);
+    }
+    
+    /**
+     * TESTS FOR .deleteApplicationLoadBalancer
+     */
+    
+    
+    @Test
+    //Positive test - delete existing lb
+    public void deleteExistingLoadBalancer() {
+        boolean result = false; 
+        try {
+            result = _appLbSvc.deleteApplicationLoadBalancer(existingLbId);
+        } finally {
+            assertTrue("Couldn't delete existing application load balancer", result);   
+        }
+    }
+    
+    
+    @Test
+    //Negative test - try to delete non-existing lb
+    public void deleteNonExistingLoadBalancer() {
+        boolean result = true;
+        try {
+            result = _appLbSvc.deleteApplicationLoadBalancer(nonExistingLbId);
+        } finally {
+            assertFalse("Didn't fail when try to delete non-existing load balancer", result);
+        }
+    }
+    
+    /**
+     * TESTS FOR .createApplicationLoadBalancer
+     * @throws NetworkRuleConflictException 
+     * @throws InsufficientVirtualNetworkCapcityException 
+     * @throws InsufficientAddressCapacityException 
+     */
+    
+    @Test (expected = CloudRuntimeException.class)
+    //Positive test
+    public void createValidLoadBalancer() throws InsufficientAddressCapacityException,
+        InsufficientVirtualNetworkCapcityException, NetworkRuleConflictException {    
+        _appLbSvc.createApplicationLoadBalancer("alena", "alena", Scheme.Internal, validGuestNetworkId, validRequestedIp,
+                            22, 22, "roundrobin", validGuestNetworkId, validAccountId); 
+    }
+    
+    
+    @Test(expected = UnsupportedServiceException.class)
+    //Negative test - only internal scheme value is supported in the current release
+    public void createPublicLoadBalancer() throws InsufficientAddressCapacityException,
+    InsufficientVirtualNetworkCapcityException, NetworkRuleConflictException {
+        _appLbSvc.createApplicationLoadBalancer("alena", "alena", Scheme.Public, validGuestNetworkId, validRequestedIp,
+                            22, 22, "roundrobin", validGuestNetworkId, validAccountId);
+    }
+    
+    
+    @Test(expected = InvalidParameterValueException.class)
+    //Negative test - invalid SourcePort
+    public void createWithInvalidSourcePort() throws InsufficientAddressCapacityException,
+        InsufficientVirtualNetworkCapcityException, NetworkRuleConflictException {        
+        _appLbSvc.createApplicationLoadBalancer("alena", "alena", Scheme.Internal, validGuestNetworkId, validRequestedIp,
+                    65536, 22, "roundrobin", validGuestNetworkId, validAccountId);
+    }
+    
+    @Test(expected = InvalidParameterValueException.class)
+    //Negative test - invalid instancePort
+    public void createWithInvalidInstandePort() throws InsufficientAddressCapacityException,
+        InsufficientVirtualNetworkCapcityException, NetworkRuleConflictException {
+        _appLbSvc.createApplicationLoadBalancer("alena", "alena", Scheme.Internal, validGuestNetworkId, validRequestedIp,
+                22, 65536, "roundrobin", validGuestNetworkId, validAccountId);
+        
+    }
+    
+    
+    @Test(expected = InvalidParameterValueException.class)
+    //Negative test - invalid algorithm
+    public void createWithInvalidAlgorithm() throws InsufficientAddressCapacityException, InsufficientVirtualNetworkCapcityException, NetworkRuleConflictException {
+        String expectedExcText = null;
+        _appLbSvc.createApplicationLoadBalancer("alena", "alena", Scheme.Internal, validGuestNetworkId, validRequestedIp,
+                22, 22, "invalidalgorithm", validGuestNetworkId, validAccountId);
+        
+    }
+    
+    @Test(expected = InvalidParameterValueException.class)
+    //Negative test - invalid sourceNetworkId (of Public type, which is not supported)
+    public void createWithInvalidSourceIpNtwk() throws InsufficientAddressCapacityException,
+        InsufficientVirtualNetworkCapcityException, NetworkRuleConflictException {
+        _appLbSvc.createApplicationLoadBalancer("alena", "alena", Scheme.Internal, validPublicNetworkId, validRequestedIp,
+                22, 22, "roundrobin", validGuestNetworkId, validAccountId);
+        
+    }
+    
+    
+    @Test(expected = InvalidParameterValueException.class)
+    //Negative test - invalid requested IP (outside of guest network cidr range)
+    public void createWithInvalidRequestedIp() throws InsufficientAddressCapacityException,
+        InsufficientVirtualNetworkCapcityException, NetworkRuleConflictException {
+       
+        _appLbSvc.createApplicationLoadBalancer("alena", "alena", Scheme.Internal, validGuestNetworkId, "10.2.1.1",
+                    22, 22, "roundrobin", validGuestNetworkId, validAccountId);
+    }
+    
+    
+    private static NetworkVO setId(NetworkVO vo, long id) {
+        NetworkVO voToReturn = vo;
+        Class<?> c = voToReturn.getClass();
+        try {
+            Field f = c.getDeclaredField("id");
+            f.setAccessible(true);
+            f.setLong(voToReturn, id);
+        } catch (NoSuchFieldException ex) {
+           return null;
+        } catch (IllegalAccessException ex) {
+            return null;
+        }
+        
+        return voToReturn;
+    }
+}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2660a6b7/server/test/org/apache/cloudstack/lb/ChildTestConfiguration.java
----------------------------------------------------------------------
diff --git a/server/test/org/apache/cloudstack/lb/ChildTestConfiguration.java b/server/test/org/apache/cloudstack/lb/ChildTestConfiguration.java
new file mode 100644
index 0000000..918de81
--- /dev/null
+++ b/server/test/org/apache/cloudstack/lb/ChildTestConfiguration.java
@@ -0,0 +1,103 @@
+// 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 org.apache.cloudstack.lb;
+
+import java.io.IOException;
+
+import org.apache.cloudstack.lb.dao.ApplicationLoadBalancerRuleDao;
+import org.apache.cloudstack.test.utils.SpringUtils;
+import org.mockito.Mockito;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.context.annotation.ComponentScan.Filter;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.FilterType;
+import org.springframework.core.type.classreading.MetadataReader;
+import org.springframework.core.type.classreading.MetadataReaderFactory;
+import org.springframework.core.type.filter.TypeFilter;
+
+import com.cloud.dc.dao.AccountVlanMapDaoImpl;
+import com.cloud.event.dao.UsageEventDao;
+import com.cloud.network.NetworkManager;
+import com.cloud.network.NetworkModel;
+import com.cloud.network.dao.FirewallRulesDao;
+import com.cloud.network.lb.LoadBalancingRulesManager;
+import com.cloud.tags.dao.ResourceTagDao;
+import com.cloud.user.AccountManager;
+
+@Configuration
+@ComponentScan(
+    basePackageClasses={
+        AccountVlanMapDaoImpl.class
+    },
+    includeFilters={@Filter(value=ChildTestConfiguration.Library.class, type=FilterType.CUSTOM)},
+    useDefaultFilters=false
+    )
+
+    public class ChildTestConfiguration {
+        
+        public static class Library implements TypeFilter {
+            
+            @Bean
+            public ApplicationLoadBalancerRuleDao applicationLoadBalancerDao() {
+                return Mockito.mock(ApplicationLoadBalancerRuleDao.class);
+            }
+            
+            @Bean
+            public NetworkModel networkModel() {
+                return Mockito.mock(NetworkModel.class);
+            }
+            
+            @Bean
+            public AccountManager accountManager() {
+                return Mockito.mock(AccountManager.class);
+            }
+            
+            @Bean
+            public LoadBalancingRulesManager loadBalancingRulesManager() {
+                return Mockito.mock(LoadBalancingRulesManager.class);
+            }
+            
+            @Bean
+            public FirewallRulesDao firewallRulesDao() {
+                return Mockito.mock(FirewallRulesDao.class);
+            }
+            
+            @Bean
+            public ResourceTagDao resourceTagDao() {
+                return Mockito.mock(ResourceTagDao.class);
+            }
+            
+            @Bean
+            public NetworkManager networkManager() {
+                return Mockito.mock(NetworkManager.class);
+            }
+            
+            @Bean
+            public UsageEventDao UsageEventDao() {
+                return Mockito.mock(UsageEventDao.class);
+            }
+            
+            @Override
+            public boolean match(MetadataReader mdr, MetadataReaderFactory arg1) throws IOException {
+                mdr.getClassMetadata().getClassName();
+                ComponentScan cs = ChildTestConfiguration.class.getAnnotation(ComponentScan.class);
+                return SpringUtils.includedInBasePackageClasses(mdr.getClassMetadata().getClassName(), cs);
+            }
+    
+        }
+}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2660a6b7/server/test/org/apache/cloudstack/networkoffering/CreateNetworkOfferingTest.java
----------------------------------------------------------------------
diff --git a/server/test/org/apache/cloudstack/networkoffering/CreateNetworkOfferingTest.java b/server/test/org/apache/cloudstack/networkoffering/CreateNetworkOfferingTest.java
index 7946c1a..92aa2a2 100644
--- a/server/test/org/apache/cloudstack/networkoffering/CreateNetworkOfferingTest.java
+++ b/server/test/org/apache/cloudstack/networkoffering/CreateNetworkOfferingTest.java
@@ -84,6 +84,7 @@ public class CreateNetworkOfferingTest extends TestCase{
         Mockito.when(configDao.findByName(Mockito.anyString())).thenReturn(configVO);
         
         Mockito.when(offDao.persist(Mockito.any(NetworkOfferingVO.class))).thenReturn(new NetworkOfferingVO());
+        Mockito.when(offDao.persist(Mockito.any(NetworkOfferingVO.class), Mockito.anyMap())).thenReturn(new NetworkOfferingVO());
         Mockito.when(mapDao.persist(Mockito.any(NetworkOfferingServiceMapVO.class))).thenReturn(new NetworkOfferingServiceMapVO());
         Mockito.when(accountMgr.getSystemUser()).thenReturn(new UserVO(1));
         Mockito.when(accountMgr.getSystemAccount()).thenReturn(new AccountVO(2));
@@ -96,7 +97,7 @@ public class CreateNetworkOfferingTest extends TestCase{
     public void createSharedNtwkOffWithVlan() {
         NetworkOfferingVO off = configMgr.createNetworkOffering("shared", "shared", TrafficType.Guest, null, true,
                 Availability.Optional, 200, null, false, Network.GuestType.Shared, false,
-                null, false, null, true, false);
+                null, false, null, true, false, null);
         assertNotNull("Shared network offering with specifyVlan=true failed to create ", off);
     }
     
@@ -105,7 +106,7 @@ public class CreateNetworkOfferingTest extends TestCase{
         try {
             NetworkOfferingVO off = configMgr.createNetworkOffering("shared", "shared", TrafficType.Guest, null, false,
                     Availability.Optional, 200, null, false, Network.GuestType.Shared, false,
-                    null, false, null, true, false);
+                    null, false, null, true, false, null);
             assertNull("Shared network offering with specifyVlan=false was created", off);
         } catch (InvalidParameterValueException ex) {
         }
@@ -115,7 +116,7 @@ public class CreateNetworkOfferingTest extends TestCase{
     public void createSharedNtwkOffWithSpecifyIpRanges() {
         NetworkOfferingVO off = configMgr.createNetworkOffering("shared", "shared", TrafficType.Guest, null, true,
                 Availability.Optional, 200, null, false, Network.GuestType.Shared, false,
-                null, false, null, true, false);
+                null, false, null, true, false, null);
         
         assertNotNull("Shared network offering with specifyIpRanges=true failed to create ", off);
     }
@@ -125,7 +126,7 @@ public class CreateNetworkOfferingTest extends TestCase{
         try {
             NetworkOfferingVO off = configMgr.createNetworkOffering("shared", "shared", TrafficType.Guest, null, true,
                     Availability.Optional, 200, null, false, Network.GuestType.Shared, false,
-                    null, false, null, false, false);
+                    null, false, null, false, false, null);
             assertNull("Shared network offering with specifyIpRanges=false was created", off);
         } catch (InvalidParameterValueException ex) {
         }
@@ -140,7 +141,7 @@ public class CreateNetworkOfferingTest extends TestCase{
         serviceProviderMap.put(Network.Service.SourceNat, vrProvider);
         NetworkOfferingVO off = configMgr.createNetworkOffering("isolated", "isolated", TrafficType.Guest, null, false,
                 Availability.Optional, 200, serviceProviderMap, false, Network.GuestType.Isolated, false,
-                null, false, null, false, false);
+                null, false, null, false, false, null);
         
         assertNotNull("Isolated network offering with specifyIpRanges=false failed to create ", off);
     }
@@ -153,7 +154,7 @@ public class CreateNetworkOfferingTest extends TestCase{
         serviceProviderMap.put(Network.Service.SourceNat, vrProvider);
         NetworkOfferingVO off = configMgr.createNetworkOffering("isolated", "isolated", TrafficType.Guest, null, true,
                 Availability.Optional, 200, serviceProviderMap, false, Network.GuestType.Isolated, false,
-                null, false, null, false, false);
+                null, false, null, false, false, null);
         assertNotNull("Isolated network offering with specifyVlan=true wasn't created", off);
        
     }
@@ -167,7 +168,7 @@ public class CreateNetworkOfferingTest extends TestCase{
             serviceProviderMap.put(Network.Service.SourceNat, vrProvider);
             NetworkOfferingVO off = configMgr.createNetworkOffering("isolated", "isolated", TrafficType.Guest, null, false,
                     Availability.Optional, 200, serviceProviderMap, false, Network.GuestType.Isolated, false,
-                    null, false, null, true, false);
+                    null, false, null, true, false, null);
             assertNull("Isolated network offering with specifyIpRanges=true and source nat service enabled, was created", off);
         } catch (InvalidParameterValueException ex) {
         }
@@ -180,7 +181,7 @@ public class CreateNetworkOfferingTest extends TestCase{
         Set<Network.Provider> vrProvider = new HashSet<Network.Provider>();
         NetworkOfferingVO off = configMgr.createNetworkOffering("isolated", "isolated", TrafficType.Guest, null, false,
                 Availability.Optional, 200, serviceProviderMap, false, Network.GuestType.Isolated, false,
-                null, false, null, true, false);
+                null, false, null, true, false, null);
         assertNotNull("Isolated network offering with specifyIpRanges=true and with no sourceNatService, failed to create", off);
         
     }
@@ -198,7 +199,7 @@ public class CreateNetworkOfferingTest extends TestCase{
         serviceProviderMap.put(Network.Service.Lb , vrProvider);
         NetworkOfferingVO off = configMgr.createNetworkOffering("isolated", "isolated", TrafficType.Guest, null, true,
                 Availability.Optional, 200, serviceProviderMap, false, Network.GuestType.Isolated, false,
-                null, false, null, false, false);
+                null, false, null, false, false, null);
         // System.out.println("Creating Vpc Network Offering");
         assertNotNull("Vpc Isolated network offering with Vpc provider ", off);
     }
@@ -218,7 +219,7 @@ public class CreateNetworkOfferingTest extends TestCase{
         serviceProviderMap.put(Network.Service.Lb, lbProvider);
         NetworkOfferingVO off = configMgr.createNetworkOffering("isolated", "isolated", TrafficType.Guest, null, true,
                 Availability.Optional, 200, serviceProviderMap, false, Network.GuestType.Isolated, false, null, false,
-                null, false, false);
+                null, false, false, null);
         // System.out.println("Creating Vpc Network Offering");
         assertNotNull("Vpc Isolated network offering with Vpc and Netscaler provider ", off);
     }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2660a6b7/server/test/resources/appLoadBalancer.xml
----------------------------------------------------------------------
diff --git a/server/test/resources/appLoadBalancer.xml b/server/test/resources/appLoadBalancer.xml
new file mode 100644
index 0000000..d7c1502
--- /dev/null
+++ b/server/test/resources/appLoadBalancer.xml
@@ -0,0 +1,43 @@
+<!-- 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. -->
+<beans xmlns="http://www.springframework.org/schema/beans"
+  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
+  xmlns:tx="http://www.springframework.org/schema/tx" xmlns:aop="http://www.springframework.org/schema/aop"
+  xsi:schemaLocation="http://www.springframework.org/schema/beans
+                      http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
+                      http://www.springframework.org/schema/tx 
+                      http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
+                      http://www.springframework.org/schema/aop
+                      http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
+                      http://www.springframework.org/schema/context
+                      http://www.springframework.org/schema/context/spring-context-3.0.xsd">
+
+     <context:annotation-config />
+
+    <!-- @DB support -->
+      
+  <bean id="componentContext" class="com.cloud.utils.component.ComponentContext" />
+
+  <bean id="transactionContextBuilder" class="com.cloud.utils.db.TransactionContextBuilder" />
+  <bean id="actionEventInterceptor" class="com.cloud.event.ActionEventInterceptor" />
+  <bean id="instantiatePostProcessor" class="com.cloud.utils.component.ComponentInstantiationPostProcessor">
+    <property name="Interceptors">
+        <list>
+            <ref bean="transactionContextBuilder" />
+        </list>
+    </property> </bean> 
+    <bean id="ApplicationLoadBalancerManager" class="org.apache.cloudstack.network.lb.ApplicationLoadBalancerManagerImpl">
+        <property name="name" value="ApplicationLoadBalancerManager"/>
+    </bean>
+  
+    <bean class="org.apache.cloudstack.lb.ChildTestConfiguration" />
+    
+</beans>

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2660a6b7/setup/db/db/schema-40to410.sql
----------------------------------------------------------------------
diff --git a/setup/db/db/schema-40to410.sql b/setup/db/db/schema-40to410.sql
index a3426e2..b7b1c7a 100644
--- a/setup/db/db/schema-40to410.sql
+++ b/setup/db/db/schema-40to410.sql
@@ -644,6 +644,7 @@ CREATE VIEW `cloud`.`domain_router_view` AS
         data_center.id data_center_id,
         data_center.uuid data_center_uuid,
         data_center.name data_center_name,
+        data_center.networktype data_center_type,
         data_center.dns1 dns1,
         data_center.dns2 dns2,
         data_center.ip6_dns1 ip6_dns1,
@@ -684,7 +685,8 @@ CREATE VIEW `cloud`.`domain_router_view` AS
         domain_router.scripts_version scripts_version,
         domain_router.is_redundant_router is_redundant_router,
         domain_router.redundant_state redundant_state,
-        domain_router.stop_pending stop_pending
+        domain_router.stop_pending stop_pending,
+        domain_router.role role
     from
         `cloud`.`domain_router`
             inner join

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2660a6b7/setup/db/db/schema-410to420.sql
----------------------------------------------------------------------
diff --git a/setup/db/db/schema-410to420.sql b/setup/db/db/schema-410to420.sql
index c8ac1ec..065b35c 100644
--- a/setup/db/db/schema-410to420.sql
+++ b/setup/db/db/schema-410to420.sql
@@ -339,7 +339,7 @@ CREATE TABLE `cloud`.`vm_snapshots` (
 ALTER TABLE `cloud`.`hypervisor_capabilities` ADD COLUMN `vm_snapshot_enabled` tinyint(1) DEFAULT 0 NOT NULL COMMENT 'Whether VM snapshot is supported by hypervisor';
 UPDATE `cloud`.`hypervisor_capabilities` SET `vm_snapshot_enabled`=1 WHERE `hypervisor_type` in ('VMware', 'XenServer');
 
-			
+      
 DROP VIEW IF EXISTS `cloud`.`user_vm_view`;
 CREATE VIEW `cloud`.`user_vm_view` AS
     select 
@@ -450,7 +450,7 @@ CREATE VIEW `cloud`.`user_vm_view` AS
         async_job.uuid job_uuid,
         async_job.job_status job_status,
         async_job.account_id job_account_id,
-		affinity_group.id affinity_group_id,
+    affinity_group.id affinity_group_id,
         affinity_group.uuid affinity_group_uuid,
         affinity_group.name affinity_group_name,
         affinity_group.description affinity_group_description
@@ -515,7 +515,7 @@ CREATE VIEW `cloud`.`user_vm_view` AS
             and async_job.job_status = 0
             left join
         `cloud`.`affinity_group_vm_map` ON vm_instance.id = affinity_group_vm_map.instance_id
-			left join
+      left join
         `cloud`.`affinity_group` ON affinity_group_vm_map.affinity_group_id = affinity_group.id;
 
 DROP VIEW IF EXISTS `cloud`.`affinity_group_view`;
@@ -844,7 +844,8 @@ CREATE VIEW `cloud`.`domain_router_view` AS
         domain_router.scripts_version scripts_version,
         domain_router.is_redundant_router is_redundant_router,
         domain_router.redundant_state redundant_state,
-        domain_router.stop_pending stop_pending
+        domain_router.stop_pending stop_pending,
+        domain_router.role role
     from
         `cloud`.`domain_router`
             inner join
@@ -919,7 +920,7 @@ CREATE TABLE `cloud`.`network_asa1000v_map` (
 ALTER TABLE `cloud`.`network_offerings` ADD COLUMN `eip_associate_public_ip` int(1) unsigned NOT NULL DEFAULT 0 COMMENT 'true if public IP is associated with user VM creation by default when EIP service is enabled.' AFTER `elastic_ip_service`;
 
 -- Re-enable foreign key checking, at the end of the upgrade path
-SET foreign_key_checks = 1;			
+SET foreign_key_checks = 1;     
 
 
 -- Add "default" field to account/user tables
@@ -1116,6 +1117,40 @@ CREATE VIEW `cloud`.`account_view` AS
             and async_job.job_status = 0;
 
 
+
+ALTER TABLE `cloud`.`load_balancing_rules` ADD COLUMN `source_ip_address` varchar(40) COMMENT 'source ip address for the load balancer rule';
+ALTER TABLE `cloud`.`load_balancing_rules` ADD COLUMN `source_ip_address_network_id` bigint unsigned COMMENT 'the id of the network where source ip belongs to';
+ALTER TABLE `cloud`.`load_balancing_rules` ADD COLUMN `scheme` varchar(40) NOT NULL COMMENT 'load balancer scheme; can be Internal or Public';
+UPDATE `cloud`.`load_balancing_rules` SET `scheme`='Public';
+
+
+
+-- Add details talbe for the network offering
+CREATE TABLE `cloud`.`network_offering_details` (
+  `id` bigint unsigned NOT NULL auto_increment,
+  `network_offering_id` bigint unsigned NOT NULL COMMENT 'network offering id',
+  `name` varchar(255) NOT NULL,
+  `value` varchar(1024) NOT NULL,
+  PRIMARY KEY (`id`),
+  CONSTRAINT `fk_network_offering_details__network_offering_id` FOREIGN KEY `fk_network_offering_details__network_offering_id`(`network_offering_id`) REFERENCES `network_offerings`(`id`) ON DELETE CASCADE
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+
+-- Change the constraint for the network service map table. Now we support multiple provider for the same service
+ALTER TABLE `cloud`.`ntwk_service_map` DROP FOREIGN KEY `fk_ntwk_service_map__network_id`;
+ALTER TABLE `cloud`.`ntwk_service_map` DROP INDEX `network_id`;
+
+ALTER TABLE `cloud`.`ntwk_service_map` ADD UNIQUE `network_id` (`network_id`,`service`,`provider`);
+ALTER TABLE `cloud`.`ntwk_service_map` ADD  CONSTRAINT `fk_ntwk_service_map__network_id` FOREIGN KEY (`network_id`) REFERENCES `networks` (`id`) ON DELETE CASCADE;
+
+
+ALTER TABLE `cloud`.`network_offerings` ADD COLUMN `internal_lb` int(1) unsigned NOT NULL DEFAULT '0' COMMENT 'true if the network offering supports Internal lb service';
+ALTER TABLE `cloud`.`network_offerings` ADD COLUMN `public_lb` int(1) unsigned NOT NULL DEFAULT '0' COMMENT 'true if the network offering supports Public lb service';
+UPDATE `cloud`.`network_offerings` SET public_lb=1 where id IN (SELECT DISTINCT network_offering_id FROM `cloud`.`ntwk_offering_service_map` WHERE service='Lb');
+
+
+INSERT IGNORE INTO `cloud`.`configuration` VALUES ('Advanced', 'DEFAULT', 'NetworkManager', 'internallbvm.service.offering', null, 'Uuid of the service offering used by internal lb vm; if NULL - default system internal lb offering will be used');
+
+
 alter table `cloud_usage`.`usage_network_offering` add column nic_id bigint(20) unsigned NOT NULL;
 ALTER TABLE `cloud`.`data_center_details` MODIFY value varchar(1024);
 ALTER TABLE `cloud`.`cluster_details` MODIFY value varchar(255);

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2660a6b7/setup/dev/advanced.cfg
----------------------------------------------------------------------
diff --git a/setup/dev/advanced.cfg b/setup/dev/advanced.cfg
index 63e435b..8335786 100644
--- a/setup/dev/advanced.cfg
+++ b/setup/dev/advanced.cfg
@@ -45,6 +45,10 @@
                         {
                             "broadcastdomainrange": "ZONE",
                             "name": "VpcVirtualRouter"
+                        },
+                        {
+                            "broadcastdomainrange": "ZONE",
+                            "name": "InternalLbVm"
                         }
                     ],
                     "isolationmethods": [

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2660a6b7/test/integration/component/test_multiple_ip_ranges.py
----------------------------------------------------------------------
diff --git a/test/integration/component/test_multiple_ip_ranges.py b/test/integration/component/test_multiple_ip_ranges.py
index 7e9eeb1..7e9e712 100644
--- a/test/integration/component/test_multiple_ip_ranges.py
+++ b/test/integration/component/test_multiple_ip_ranges.py
@@ -369,6 +369,7 @@ class TestMultipleIpRanges(cloudstackTestCase):
         self.fail("CS should not accept overlapped ip ranges in guest traffic, but it allowed")
         return
 
+
     @attr(tags=["advanced_sg", "sg"])
     def test_06_add_ip_range_overlapped_with_two_ranges(self):
         """Test adding overlapped ip range in existing cidr

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2660a6b7/test/integration/smoke/test_guest_vlan_range.py
----------------------------------------------------------------------
diff --git a/test/integration/smoke/test_guest_vlan_range.py b/test/integration/smoke/test_guest_vlan_range.py
index bd53343..704fe59 100644
--- a/test/integration/smoke/test_guest_vlan_range.py
+++ b/test/integration/smoke/test_guest_vlan_range.py
@@ -44,6 +44,7 @@ class Services:
                                     "password": "password",
                          },
                         "name": "testphysicalnetwork",
+
                         "vlan": "2118-2120",
                     }
 
@@ -149,6 +150,19 @@ class TestDedicateGuestVlanRange(cloudstackTestCase):
                         )
 
         self.debug("Releasing guest vlan range");
+<<<<<<< HEAD
+        dedicated_guest_vlan_response.release(self.apiclient)
+        list_dedicated_guest_vlan_range_response = PhysicalNetwork.listDedicated(
+                                                self.apiclient,
+                                                id=dedicate_guest_vlan_range_response.id
+                                        )
+        dedicated_guest_vlan_response = list_dedicated_guest_vlan_range_response[0]
+        self.assertEqual(
+                            dedicated_guest_vlan_response.account,
+                            "system",
+                            "Check account name is system account in listDedicatedGuestVlanRanges"
+                        )
+=======
         dedicate_guest_vlan_range_response.release(self.apiclient)
         list_dedicated_guest_vlan_range_response = PhysicalNetwork.listDedicated(self.apiclient)
         self.assertEqual(
@@ -157,4 +171,5 @@ class TestDedicateGuestVlanRange(cloudstackTestCase):
                         "Check vlan range is not available in listDedicatedGuestVlanRanges"
 
                         )                    
+>>>>>>> master
         

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2660a6b7/test/integration/smoke/test_internal_lb.py
----------------------------------------------------------------------
diff --git a/test/integration/smoke/test_internal_lb.py b/test/integration/smoke/test_internal_lb.py
new file mode 100644
index 0000000..ae64297
--- /dev/null
+++ b/test/integration/smoke/test_internal_lb.py
@@ -0,0 +1,250 @@
+# 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.
+""" Tests for configuring Internal Load Balancing Rules.
+"""
+#Import Local Modules
+from marvin.cloudstackTestCase import *
+from marvin.cloudstackAPI import *
+from marvin.integration.lib.utils import *
+from marvin.integration.lib.base import *
+from marvin.integration.lib.common import *
+
+
+class TestInternalLb(cloudstackTestCase):
+    networkOfferingId = None
+    networkId = None
+    vmId = None
+    lbId = None
+
+    zoneId = 1
+    serviceOfferingId = 1 
+    templateId = 5
+
+
+    serviceProviderList = [
+        {
+            "provider": "VpcVirtualRouter",
+            "service": "Vpn"
+        },
+        {
+            "provider": "VpcVirtualRouter",
+            "service": "UserData"
+        },
+        {
+            "provider": "VpcVirtualRouter",
+            "service": "Dhcp"
+        },
+        {
+            "provider": "VpcVirtualRouter",
+            "service": "Dns"
+        },
+        {
+            "provider": "InternalLbVM",
+            "service": "Lb"
+        },
+        {
+            "provider": "VpcVirtualRouter",
+            "service": "SourceNat"
+        },
+        {
+            "provider": "VpcVirtualRouter",
+            "service": "StaticNat"
+        },
+        {
+            "provider": "VpcVirtualRouter",
+            "service": "PortForwarding"
+        },
+        {
+            "provider": "VpcVirtualRouter",
+            "service": "NetworkACL"
+        }
+    ]
+
+    serviceCapsList = [
+        {
+            "service": "SourceNat",
+            "capabilitytype": "SupportedSourceNatTypes",
+            "capabilityvalue": "peraccount"
+        },
+        {
+            "service": "Lb",
+            "capabilitytype": "SupportedLbIsolation",
+            "capabilityvalue": "dedicated"
+        },
+        {
+            "service": "Lb",
+            "capabilitytype": "lbSchemes",
+            "capabilityvalue": "internal"
+        }
+    ]
+
+    def setUp(self):
+        self.apiClient = self.testClient.getApiClient()
+
+
+    
+    def test_internallb(self):
+
+        #1) Create and enable network offering with Internal Lb vm service
+        self.createNetworkOffering()
+        
+        #2) Create VPC and network in it
+        self.createNetwork()
+      
+        #3) Deploy a vm 
+        self.deployVm()
+        
+        #4) Create an Internal Load Balancer
+        self.createInternalLoadBalancer()
+
+        #5) Assign the VM to the Internal Load Balancer
+        self.assignToLoadBalancerRule()
+
+        #6) Remove the vm from the Interanl Load Balancer
+        self.removeFromLoadBalancerRule()
+
+        #7) Delete the Load Balancer
+        self.deleteLoadBalancer()
+
+
+    def deployVm(self):
+        deployVirtualMachineCmd = deployVirtualMachine.deployVirtualMachineCmd()
+        deployVirtualMachineCmd.networkids = TestInternalLb.networkId
+        deployVirtualMachineCmd.serviceofferingid = TestInternalLb.serviceOfferingId
+        deployVirtualMachineCmd.zoneid = TestInternalLb.zoneId
+        deployVirtualMachineCmd.templateid = TestInternalLb.templateId
+        deployVirtualMachineCmd.hypervisor = "XenServer"
+        deployVMResponse = self.apiClient.deployVirtualMachine(deployVirtualMachineCmd)
+        TestInternalLb.vmId = deployVMResponse.id
+
+
+    def createInternalLoadBalancer(self):
+        createLoadBalancerCmd = createLoadBalancer.createLoadBalancerCmd()
+        createLoadBalancerCmd.name = "lb rule"
+        createLoadBalancerCmd.sourceport = 22
+        createLoadBalancerCmd.instanceport = 22
+        createLoadBalancerCmd.algorithm = "roundrobin"
+        createLoadBalancerCmd.scheme = "internal"
+        createLoadBalancerCmd.sourceipaddressnetworkid = TestInternalLb.networkId
+        createLoadBalancerCmd.networkid = TestInternalLb.networkId
+        createLoadBalancerResponse = self.apiClient.createLoadBalancer(createLoadBalancerCmd)
+        TestInternalLb.lbId = createLoadBalancerResponse.id
+        self.assertIsNotNone(createLoadBalancerResponse.id, "Failed to create a load balancer")
+
+
+    def assignToLoadBalancerRule(self):
+        assignToLoadBalancerRuleCmd = assignToLoadBalancerRule.assignToLoadBalancerRuleCmd()
+        assignToLoadBalancerRuleCmd.id = TestInternalLb.lbId
+        assignToLoadBalancerRuleCmd.virtualMachineIds = TestInternalLb.vmId
+        assignToLoadBalancerRuleResponse = self.apiClient.assignToLoadBalancerRule(assignToLoadBalancerRuleCmd)
+        self.assertTrue(assignToLoadBalancerRuleResponse.success, "Failed to assign the vm to the load balancer")
+
+
+
+    def removeFromLoadBalancerRule(self):
+        removeFromLoadBalancerRuleCmd = removeFromLoadBalancerRule.removeFromLoadBalancerRuleCmd()
+        removeFromLoadBalancerRuleCmd.id = TestInternalLb.lbId
+        removeFromLoadBalancerRuleCmd.virtualMachineIds = TestInternalLb.vmId
+        removeFromLoadBalancerRuleResponse = self.apiClient.removeFromLoadBalancerRule(removeFromLoadBalancerRuleCmd)
+        self.assertTrue(removeFromLoadBalancerRuleResponse.success, "Failed to remove the vm from the load balancer")
+
+
+
+    #def removeInternalLoadBalancer(self):
+    def deleteLoadBalancer(self):
+        deleteLoadBalancerCmd = deleteLoadBalancer.deleteLoadBalancerCmd()
+        deleteLoadBalancerCmd.id = TestInternalLb.lbId
+        deleteLoadBalancerResponse = self.apiClient.deleteLoadBalancer(deleteLoadBalancerCmd)
+        self.assertTrue(deleteLoadBalancerResponse.success, "Failed to remove the load balancer")
+
+
+
+    def createNetwork(self):
+        createVPCCmd = createVPC.createVPCCmd()
+        createVPCCmd.name = "new vpc"
+        createVPCCmd.cidr = "10.1.1.0/24"
+        createVPCCmd.displaytext = "new vpc"
+        createVPCCmd.vpcofferingid = 1
+        createVPCCmd.zoneid = self.zoneId
+        createVPCResponse = self.apiClient.createVPC(createVPCCmd)
+
+
+        createNetworkCmd = createNetwork.createNetworkCmd()
+        createNetworkCmd.name = "vpc network"
+        createNetworkCmd.displaytext = "vpc network"
+        createNetworkCmd.netmask = "255.255.255.0"
+        createNetworkCmd.gateway = "10.1.1.1"
+        createNetworkCmd.zoneid = self.zoneId
+        createNetworkCmd.vpcid = createVPCResponse.id
+        createNetworkCmd.networkofferingid = TestInternalLb.networkOfferingId
+        createNetworkResponse = self.apiClient.createNetwork(createNetworkCmd)
+        TestInternalLb.networkId = createNetworkResponse.id
+
+        self.assertIsNotNone(createNetworkResponse.id, "Network failed to create")
+
+
+    def createNetworkOffering(self):
+            createNetworkOfferingCmd = createNetworkOffering.createNetworkOfferingCmd()
+            createNetworkOfferingCmd.name = "Network offering for internal lb service - " + str(random.randrange(1,100+1))
+            createNetworkOfferingCmd.displaytext = "Network offering for internal lb service"
+            createNetworkOfferingCmd.guestiptype = "isolated"
+            createNetworkOfferingCmd.traffictype = "Guest"
+            createNetworkOfferingCmd.conservemode = "false"
+            createNetworkOfferingCmd.supportedservices = "Vpn,Dhcp,Dns,Lb,UserData,SourceNat,StaticNat,PortForwarding,NetworkACL"
+
+
+            createNetworkOfferingCmd.serviceproviderlist = []
+            for item in self.serviceProviderList:
+                createNetworkOfferingCmd.serviceproviderlist.append({
+                                                'service': item['service'],
+                                                'provider': item['provider']
+                                               })
+                
+            createNetworkOfferingCmd.servicecapabilitylist = []
+            for item in self.serviceCapsList:
+                createNetworkOfferingCmd.servicecapabilitylist.append({
+                                                'service': item['service'],
+                                                'capabilitytype': item['capabilitytype'],
+                                                'capabilityvalue': item['capabilityvalue']
+                                               })
+
+
+            createNetworkOfferingResponse = self.apiClient.createNetworkOffering(createNetworkOfferingCmd)
+            TestInternalLb.networkOfferingId = createNetworkOfferingResponse.id
+
+            #enable network offering
+            updateNetworkOfferingCmd = updateNetworkOffering.updateNetworkOfferingCmd()
+            updateNetworkOfferingCmd.id = TestInternalLb.networkOfferingId
+            updateNetworkOfferingCmd.state = "Enabled"
+            updateNetworkOfferingResponse = self.apiClient.updateNetworkOffering(updateNetworkOfferingCmd)
+
+
+            #list network offering to see if its enabled
+            listNetworkOfferingsCmd = listNetworkOfferings.listNetworkOfferingsCmd()
+            listNetworkOfferingsCmd.id = TestInternalLb.networkOfferingId
+            listOffResponse = self.apiClient.listNetworkOfferings(listNetworkOfferingsCmd)
+
+            self.assertNotEqual(len(listOffResponse), 0, "Check if the list network offerings API \
+                                returns a non-empty response")
+
+
+    def tearDown(self):
+        #destroy the vm
+        if TestInternalLb.vmId is not None:
+            destroyVirtualMachineCmd = destroyVirtualMachine.destroyVirtualMachineCmd()
+            destroyVirtualMachineCmd.id = TestInternalLb.vmId
+            destroyVirtualMachineResponse = self.apiClient.destroyVirtualMachine(destroyVirtualMachineCmd)

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2660a6b7/tools/apidoc/gen_toc.py
----------------------------------------------------------------------
diff --git a/tools/apidoc/gen_toc.py b/tools/apidoc/gen_toc.py
index f8bdae2..bd8c0f1 100644
--- a/tools/apidoc/gen_toc.py
+++ b/tools/apidoc/gen_toc.py
@@ -140,6 +140,7 @@ known_categories = {
     'removeIpFromNic': 'Nic',
     'listNics':'Nic',
 	'AffinityGroup': 'Affinity Group',
+    'InternalLoadBalancer': 'Internal LB',
     }
 
 

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2660a6b7/tools/marvin/marvin/deployDataCenter.py
----------------------------------------------------------------------
diff --git a/tools/marvin/marvin/deployDataCenter.py b/tools/marvin/marvin/deployDataCenter.py
index 2168592..7059059 100644
--- a/tools/marvin/marvin/deployDataCenter.py
+++ b/tools/marvin/marvin/deployDataCenter.py
@@ -216,6 +216,18 @@ class deployDataCenters():
                     vrconfig.id = vrprovid
                     self.apiClient.configureVirtualRouterElement(vrconfig)
                     self.enableProvider(pnetprovres[0].id)
+                elif provider.name == 'InternalLbVm':
+                    internallbprov = listInternalLoadBalancerElements.listInternalLoadBalancerElementsCmd() 
+                    internallbprov.nspid = pnetprovres[0].id
+                    internallbresponse = self.apiClient.listInternalLoadBalancerElements(internallbprov)
+                    internallbid = internallbresponse[0].id
+
+                    internallbconfig = \
+                            configureInternalLoadBalancerElement.configureInternalLoadBalancerElementCmd()
+                    internallbconfig.enabled = "true"
+                    internallbconfig.id = internallbid
+                    self.apiClient.configureInternalLoadBalancerElement(internallbconfig)
+                    self.enableProvider(pnetprovres[0].id)
                 elif provider.name == 'SecurityGroupProvider':
                     self.enableProvider(pnetprovres[0].id)
             elif provider.name in ['Netscaler', 'JuniperSRX', 'F5BigIp']:

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2660a6b7/tools/marvin/marvin/sandbox/advanced/advanced_env.py
----------------------------------------------------------------------
diff --git a/tools/marvin/marvin/sandbox/advanced/advanced_env.py b/tools/marvin/marvin/sandbox/advanced/advanced_env.py
index bf880f3..6343293 100644
--- a/tools/marvin/marvin/sandbox/advanced/advanced_env.py
+++ b/tools/marvin/marvin/sandbox/advanced/advanced_env.py
@@ -50,6 +50,9 @@ def describeResources(config):
     
     vpcprovider = provider()
     vpcprovider.name = 'VpcVirtualRouter'
+
+    lbprovider = provider()
+    lbprovider.name = 'InternalLbVm'
     
     pn = physical_network()
     pn.name = "Sandbox-pnet"
@@ -60,6 +63,7 @@ def describeResources(config):
             traffictype("Public", {"simulator":"cloud-simulator-public"})]
     pn.isolationmethods = ["VLAN"]
     pn.providers.append(vpcprovider)
+    pn.providers.append(lbprovider)
 
     pn2 = physical_network()
     pn2.name = "Sandbox-pnet2"
@@ -68,6 +72,7 @@ def describeResources(config):
     pn2.traffictypes = [traffictype('Guest', {'simulator': 'cloud-simulator-guest'})]
     pn2.isolationmethods = ["VLAN"]
     pn2.providers.append(vpcprovider)
+    pn2.providers.append(lbprovider)
     
     z.physical_networks.append(pn)
     z.physical_networks.append(pn2)

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2660a6b7/tools/marvin/marvin/sandbox/advanced/sandbox.cfg
----------------------------------------------------------------------
diff --git a/tools/marvin/marvin/sandbox/advanced/sandbox.cfg b/tools/marvin/marvin/sandbox/advanced/sandbox.cfg
new file mode 100644
index 0000000..01a8473
--- /dev/null
+++ b/tools/marvin/marvin/sandbox/advanced/sandbox.cfg
@@ -0,0 +1,209 @@
+{
+    "zones": [
+        {
+            "name": "Sandbox-Simulator", 
+            "guestcidraddress": "10.1.1.0/24", 
+            "dns1": "10.147.28.6", 
+            "physical_networks": [
+                {
+                    "providers": [
+                        {
+                            "broadcastdomainrange": "ZONE", 
+                            "name": "VirtualRouter"
+                        }, 
+                        {
+                            "broadcastdomainrange": "ZONE", 
+                            "name": "VpcVirtualRouter"
+                        }, 
+                        {
+                            "broadcastdomainrange": "ZONE", 
+                            "name": "InternalLb"
+                        }
+                    ], 
+                    "name": "Sandbox-pnet", 
+                    "tags": [
+                        "cloud-simulator-public"
+                    ], 
+                    "broadcastdomainrange": "Zone", 
+                    "vlan": "675-679", 
+                    "traffictypes": [
+                        {
+                            "typ": "Guest"
+                        }, 
+                        {
+                            "typ": "Management", 
+                            "simulator": "cloud-simulator-mgmt"
+                        }, 
+                        {
+                            "typ": "Public", 
+                            "simulator": "cloud-simulator-public"
+                        }
+                    ], 
+                    "isolationmethods": [
+                        "VLAN"
+                    ]
+                }, 
+                {
+                    "providers": [
+                        {
+                            "broadcastdomainrange": "ZONE", 
+                            "name": "VirtualRouter"
+                        }, 
+                        {
+                            "broadcastdomainrange": "ZONE", 
+                            "name": "VpcVirtualRouter"
+                        }, 
+                        {
+                            "broadcastdomainrange": "ZONE", 
+                            "name": "InternalLb"
+                        }
+                    ], 
+                    "name": "Sandbox-pnet2", 
+                    "tags": [
+                        "cloud-simulator-guest"
+                    ], 
+                    "broadcastdomainrange": "Zone", 
+                    "vlan": "800-1000", 
+                    "traffictypes": [
+                        {
+                            "typ": "Guest", 
+                            "simulator": "cloud-simulator-guest"
+                        }
+                    ], 
+                    "isolationmethods": [
+                        "VLAN"
+                    ]
+                }
+            ], 
+            "securitygroupenabled": "false", 
+            "ipranges": [
+                {
+                    "startip": "10.147.31.150", 
+                    "endip": "10.147.31.159", 
+                    "netmask": "255.255.255.0", 
+                    "vlan": "31", 
+                    "gateway": "10.147.31.1"
+                }
+            ], 
+            "networktype": "Advanced", 
+            "pods": [
+                {
+                    "endip": "10.147.29.159", 
+                    "name": "POD0", 
+                    "startip": "10.147.29.150", 
+                    "netmask": "255.255.255.0", 
+                    "clusters": [
+                        {
+                            "clustername": "C0", 
+                            "hypervisor": "Simulator", 
+                            "hosts": [
+                                {
+                                    "username": "root", 
+                                    "url": "http://simulator0", 
+                                    "password": "password"
+                                }
+                            ], 
+                            "clustertype": "CloudManaged", 
+                            "primaryStorages": [
+                                {
+                                    "url": "nfs://10.147.28.6:/export/home/sandbox/primary", 
+                                    "name": "PS0"
+                                }
+                            ]
+                        }
+                    ], 
+                    "gateway": "10.147.29.1"
+                }
+            ], 
+            "internaldns1": "10.147.28.6", 
+            "secondaryStorages": [
+                {
+                    "url": "nfs://10.147.28.6:/export/home/sandbox/sstor"
+                }
+            ]
+        }
+    ], 
+    "dbSvr": {
+        "dbSvr": "localhost", 
+        "passwd": "cloud", 
+        "db": "cloud", 
+        "port": 3306, 
+        "user": "cloud"
+    }, 
+    "logger": [
+        {
+            "name": "TestClient", 
+            "file": "testclient.log"
+        }, 
+        {
+            "name": "TestCase", 
+            "file": "testcase.log"
+        }
+    ], 
+    "globalConfig": [
+        {
+            "name": "storage.cleanup.interval", 
+            "value": "300"
+        }, 
+        {
+            "name": "direct.agent.load.size", 
+            "value": "1000"
+        }, 
+        {
+            "name": "default.page.size", 
+            "value": "10000"
+        }, 
+        {
+            "name": "instance.name", 
+            "value": "QA"
+        }, 
+        {
+            "name": "workers", 
+            "value": "10"
+        }, 
+        {
+            "name": "vm.op.wait.interval", 
+            "value": "5"
+        }, 
+        {
+            "name": "account.cleanup.interval", 
+            "value": "600"
+        }, 
+        {
+            "name": "guest.domain.suffix", 
+            "value": "sandbox.simulator"
+        }, 
+        {
+            "name": "expunge.delay", 
+            "value": "60"
+        }, 
+        {
+            "name": "vm.allocation.algorithm", 
+            "value": "random"
+        }, 
+        {
+            "name": "expunge.interval", 
+            "value": "60"
+        }, 
+        {
+            "name": "expunge.workers", 
+            "value": "3"
+        }, 
+        {
+            "name": "secstorage.allowed.internal.sites", 
+            "value": "10.147.28.0/24"
+        }, 
+        {
+            "name": "check.pod.cidrs", 
+            "value": "true"
+        }
+    ], 
+    "mgtSvr": [
+        {
+            "mgtSvrIp": "localhost", 
+            "passwd": "password", 
+            "user": "root", 
+            "port": 8096
+        }
+    ]
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2660a6b7/ui/scripts/zoneWizard.js
----------------------------------------------------------------------
diff --git a/ui/scripts/zoneWizard.js b/ui/scripts/zoneWizard.js
index b282585..9b28c32 100755
--- a/ui/scripts/zoneWizard.js
+++ b/ui/scripts/zoneWizard.js
@@ -2376,6 +2376,110 @@
                             });
 														// ***** Virtual Router ***** (end) *****
 														
+							// ***** Internal LB ***** (begin) *****
+							var internalLbProviderId;
+							$.ajax({
+								url: createURL("listNetworkServiceProviders&name=Internallbvm&physicalNetworkId=" + thisPhysicalNetwork.id),
+								dataType: "json",
+								async: false,
+								success: function(json) {
+									var items = json.listnetworkserviceprovidersresponse.networkserviceprovider;
+									if(items != null && items.length > 0) {
+										internalLbProviderId = items[0].id;
+									}
+								}
+							});
+							if(internalLbProviderId == null) {
+								alert("error: listNetworkServiceProviders API doesn't return internalLb provider ID");
+								return;
+							}
+
+							var internalLbElementId;
+							$.ajax({
+								url: createURL("listInternalLoadBalancerElements&nspid=" + internalLbProviderId),
+								dataType: "json",
+								async: false,
+								success: function(json) {
+									var items = json.listinternalloadbalancerelementsresponse.internalloadbalancerelement;
+									if(items != null && items.length > 0) {
+										internalLbElementId = items[0].id;
+									}
+								}
+							});
+							if(internalLbElementId == null) {
+								alert("error: listInternalLoadBalancerElements API doesn't return Internal LB Element Id");
+								return;
+							}
+
+							$.ajax({
+								url: createURL("configureInternalLoadBalancerElement&enabled=true&id=" + internalLbElementId),
+								dataType: "json",
+								async: false,
+								success: function(json) {
+									var jobId = json.configureinternalloadbalancerelementresponse.jobid;                                
+									var enableInternalLbElementIntervalID = setInterval(function() { 	
+										$.ajax({
+											url: createURL("queryAsyncJobResult&jobId="+jobId),
+											dataType: "json",
+											success: function(json) {
+												var result = json.queryasyncjobresultresponse;
+												if (result.jobstatus == 0) {
+													return; //Job has not completed
+												}
+												else {                                        
+													clearInterval(enableInternalLbElementIntervalID); 
+													
+													if (result.jobstatus == 1) { //configureVirtualRouterElement succeeded
+														$.ajax({
+															url: createURL("updateNetworkServiceProvider&state=Enabled&id=" + internalLbProviderId),
+															dataType: "json",
+															async: false,
+															success: function(json) {
+																var jobId = json.updatenetworkserviceproviderresponse.jobid;                                             
+																var enableInternalLbProviderIntervalID = setInterval(function() { 	
+																	$.ajax({
+																		url: createURL("queryAsyncJobResult&jobId="+jobId),
+																		dataType: "json",
+																		success: function(json) {
+																			var result = json.queryasyncjobresultresponse;
+																			if (result.jobstatus == 0) {
+																				return; //Job has not completed
+																			}
+																			else {                                                      
+																				clearInterval(enableInternalLbProviderIntervalID); 
+																				
+																				if (result.jobstatus == 1) { //Internal LB has been enabled successfully
+																					//don't need to do anything here
+																				}
+																				else if (result.jobstatus == 2) {
+																					alert("failed to enable Internal LB Provider. Error: " + _s(result.jobresult.errortext));
+																				}
+																			}
+																		},
+																		error: function(XMLHttpResponse) {
+																			var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
+																			alert("failed to enable Internal LB Provider. Error: " + errorMsg);
+																		}
+																	});                                              
+																}, g_queryAsyncJobResultInterval); 	
+															}
+														});
+													}
+													else if (result.jobstatus == 2) {
+														alert("configureVirtualRouterElement failed. Error: " + _s(result.jobresult.errortext));
+													}
+												}
+											},
+											error: function(XMLHttpResponse) {
+												var errorMsg = parseXMLHttpResponse(XMLHttpResponse);
+												alert("configureVirtualRouterElement failed. Error: " + errorMsg);
+											}
+										});                                
+									}, g_queryAsyncJobResultInterval); 	
+								}
+							});
+							// ***** Internal LB ***** (end) *****
+                            
 														if(args.data.zone.sgEnabled != true) { //Advanced SG-disabled zone
 															// ***** VPC Virtual Router ***** (begin) *****
 															var vpcVirtualRouterProviderId;


[09/50] [abbrv] git commit: updated refs/heads/vmsync to d403974

Posted by ah...@apache.org.
fix CLOUDSTACK-2277 Add approriate message for the user informing about the absence of vm-tools when adding nics to vm on vmware


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

Branch: refs/heads/vmsync
Commit: 600f140df67e8521e118691f92b460d55e7ec656
Parents: 6ef615e
Author: Mice Xia <mi...@tcloudcomputing.com>
Authored: Thu May 9 14:27:13 2013 +0800
Committer: Mice Xia <mi...@tcloudcomputing.com>
Committed: Thu May 9 14:27:13 2013 +0800

----------------------------------------------------------------------
 .../hypervisor/vmware/resource/VmwareResource.java |   18 +++++++++++++++
 server/src/com/cloud/vm/UserVmManagerImpl.java     |    4 +-
 2 files changed, 20 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/600f140d/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java b/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java
index 030eff0..d87da64 100755
--- a/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java
+++ b/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java
@@ -237,6 +237,7 @@ import com.vmware.vim25.ClusterDasConfigInfo;
 import com.vmware.vim25.ComputeResourceSummary;
 import com.vmware.vim25.DatastoreSummary;
 import com.vmware.vim25.DynamicProperty;
+import com.vmware.vim25.GuestInfo;
 import com.vmware.vim25.HostCapability;
 import com.vmware.vim25.HostFirewallInfo;
 import com.vmware.vim25.HostFirewallRuleset;
@@ -1326,6 +1327,12 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa
                 throw new Exception(msg);
             }
 
+            if(!isVMWareToolsInstalled(vmMo)){
+                String errMsg = "vmware tools is not installed or not running, cannot add nic to vm " + vmName;
+                s_logger.debug(errMsg);
+                return new PlugNicAnswer(cmd, false, "Unable to execute PlugNicCommand due to " + errMsg); 
+            }
+
             // TODO need a way to specify the control of NIC device type
             VirtualEthernetCardType nicDeviceType = VirtualEthernetCardType.E1000;
 
@@ -1400,6 +1407,12 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa
                 throw new Exception(msg);
             }
 
+            if(!isVMWareToolsInstalled(vmMo)){
+                String errMsg = "vmware tools not installed or not running, cannot remove nic from vm " + vmName;
+                s_logger.debug(errMsg);
+                return new UnPlugNicAnswer(cmd, false, "Unable to execute unPlugNicCommand due to " + errMsg);
+            }
+
             VirtualDevice nic = findVirtualNicDevice(vmMo, cmd.getNic().getMac());
             if ( nic == null ) {
                 return new UnPlugNicAnswer(cmd, true, "success");
@@ -5237,4 +5250,9 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa
 		// TODO Auto-generated method stub
 
 	}
+
+    private boolean isVMWareToolsInstalled(VirtualMachineMO vmMo) throws Exception{
+        GuestInfo guestInfo = vmMo.getVmGuestInfo();
+        return (guestInfo != null && guestInfo.getGuestState() != null && guestInfo.getGuestState().equalsIgnoreCase("running"));
+    }	
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/600f140d/server/src/com/cloud/vm/UserVmManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/vm/UserVmManagerImpl.java b/server/src/com/cloud/vm/UserVmManagerImpl.java
index 644f5ed..eee8503 100755
--- a/server/src/com/cloud/vm/UserVmManagerImpl.java
+++ b/server/src/com/cloud/vm/UserVmManagerImpl.java
@@ -4248,7 +4248,7 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Use
                 _agentMgr.send(dest.getHost().getId(),cmds);
                 PlugNicAnswer plugNicAnswer = cmds.getAnswer(PlugNicAnswer.class);
                 if (!(plugNicAnswer != null && plugNicAnswer.getResult())) {
-                    s_logger.warn("Unable to plug nic for " + vmVO);
+                    s_logger.warn("Unable to plug nic for " + vmVO + " due to: " + " due to: " + plugNicAnswer.getDetails());
                     return false;
                 }
             } catch (OperationTimedoutException e) {
@@ -4276,7 +4276,7 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Use
                 _agentMgr.send(dest.getHost().getId(),cmds);
                 UnPlugNicAnswer unplugNicAnswer = cmds.getAnswer(UnPlugNicAnswer.class);
                 if (!(unplugNicAnswer != null && unplugNicAnswer.getResult())) {
-                    s_logger.warn("Unable to unplug nic for " + vmVO);
+                    s_logger.warn("Unable to unplug nic for " + vmVO + " due to: " + unplugNicAnswer.getDetails());
                     return false;
                 }
             } catch (OperationTimedoutException e) {


[06/50] [abbrv] git commit: updated refs/heads/vmsync to d403974

Posted by ah...@apache.org.
CLOUDSTACK-1907: Debian Squeeze 6.0 (64-bit) is not experimental any more


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

Branch: refs/heads/vmsync
Commit: 738d35a61d12aa4ff11114aef89f546a077e8629
Parents: 99d0936
Author: Edison Su <su...@gmail.com>
Authored: Wed May 8 11:40:37 2013 -0700
Committer: Chip Childers <ch...@gmail.com>
Committed: Wed May 8 19:54:54 2013 +0100

----------------------------------------------------------------------
 .../xen/discoverer/XcpServerDiscoverer.java        |    7 +-
 .../hypervisor/xen/resource/CitrixHelper.java      |   87 +++++++++++++++
 .../hypervisor/xen/resource/XcpServerResource.java |   11 ++-
 3 files changed, 100 insertions(+), 5 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/738d35a6/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/discoverer/XcpServerDiscoverer.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/discoverer/XcpServerDiscoverer.java b/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/discoverer/XcpServerDiscoverer.java
index 89bc1cf..562a7fe 100755
--- a/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/discoverer/XcpServerDiscoverer.java
+++ b/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/discoverer/XcpServerDiscoverer.java
@@ -427,8 +427,11 @@ public class XcpServerDiscoverer extends DiscovererBase implements Discoverer, L
     		prodVersion = prodVersion.trim();
     	}
 
-        if(prodBrand.equals("XCP") && (prodVersion.equals("1.0.0") ||  prodVersion.equals("1.1.0") || prodVersion.equals("5.6.100") || prodVersion.startsWith("1.4") || prodVersion.startsWith("1.6")))
-            return new XcpServerResource();
+        if(prodBrand.equals("XCP") && (prodVersion.equals("1.0.0") ||  prodVersion.equals("1.1.0") || prodVersion.equals("5.6.100") || prodVersion.startsWith("1.4"))) {
+            return new XcpServerResource("1.1");
+        } else if (prodBrand.equals("XCP") && prodVersion.startsWith("1.6")) {
+        	return new XcpServerResource("1.6");
+        }
 
     	if(prodBrand.equals("XenServer") && prodVersion.equals("5.6.0")) 
     		return new XenServer56Resource();

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/738d35a6/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/CitrixHelper.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/CitrixHelper.java b/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/CitrixHelper.java
index 5bcec13..34b8f29 100644
--- a/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/CitrixHelper.java
+++ b/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/CitrixHelper.java
@@ -28,6 +28,7 @@ import org.apache.log4j.Logger;
 public class CitrixHelper {
     private static final Logger s_logger = Logger.getLogger(CitrixHelper.class);
     private static final HashMap<String, String> _xcp100GuestOsMap = new HashMap<String, String>(70);
+    private static final HashMap<String, String> _xcp160GuestOsMap = new HashMap<String, String>(70);
     private static final HashMap<String, String> _xenServerGuestOsMap = new HashMap<String, String>(70);
     private static final HashMap<String, String> _xenServer56FP1GuestOsMap = new HashMap<String, String>(70);
     private static final HashMap<String, String> _xenServer56FP2GuestOsMap = new HashMap<String, String>(70);
@@ -114,6 +115,83 @@ public class CitrixHelper {
         _xcp100GuestOsMap.put("Other PV (64-bit)", "CentOS 5 (64-bit)");
     }
     
+    static {
+        _xcp160GuestOsMap.put("CentOS 4.5 (32-bit)", "CentOS 4.5 (32-bit)");
+        _xcp160GuestOsMap.put("CentOS 4.6 (32-bit)", "CentOS 4.6 (32-bit)");
+        _xcp160GuestOsMap.put("CentOS 4.7 (32-bit)", "CentOS 4.7 (32-bit)");
+        _xcp160GuestOsMap.put("CentOS 4.8 (32-bit)", "CentOS 4.8 (32-bit)");
+        _xcp160GuestOsMap.put("CentOS 5.0 (32-bit)", "CentOS 5 (32-bit)");
+        _xcp160GuestOsMap.put("CentOS 5.0 (64-bit)", "CentOS 5 (64-bit)");
+        _xcp160GuestOsMap.put("CentOS 5.1 (32-bit)", "CentOS 5 (32-bit)");
+        _xcp160GuestOsMap.put("CentOS 5.1 (64-bit)", "CentOS 5 (64-bit)");
+        _xcp160GuestOsMap.put("CentOS 5.2 (32-bit)", "CentOS 5 (32-bit)");
+        _xcp160GuestOsMap.put("CentOS 5.2 (64-bit)", "CentOS 5 (64-bit)");
+        _xcp160GuestOsMap.put("CentOS 5.3 (32-bit)", "CentOS 5 (32-bit)");
+        _xcp160GuestOsMap.put("CentOS 5.3 (64-bit)", "CentOS 5 (64-bit)");
+        _xcp160GuestOsMap.put("CentOS 5.4 (32-bit)", "CentOS 5 (32-bit)");
+        _xcp160GuestOsMap.put("CentOS 5.4 (64-bit)", "CentOS 5 (64-bit)");
+        _xcp160GuestOsMap.put("CentOS 5.5 (32-bit)", "CentOS 5 (32-bit)");
+        _xcp160GuestOsMap.put("CentOS 5.5 (64-bit)", "CentOS 5 (64-bit)");
+        _xcp160GuestOsMap.put("Debian GNU/Linux 5.0 (32-bit)", "Debian Lenny 5.0 (32-bit)");
+        _xcp160GuestOsMap.put("Debian GNU/Linux 6(32-bit)", "Debian Squeeze 6.0 (32-bit)");
+        _xcp160GuestOsMap.put("Debian GNU/Linux 6(64-bit)", "Debian Squeeze 6.0 (64-bit)");
+        _xcp160GuestOsMap.put("Oracle Enterprise Linux 5.0 (32-bit)", "Oracle Enterprise Linux 5 (32-bit)");
+        _xcp160GuestOsMap.put("Oracle Enterprise Linux 5.0 (64-bit)", "Oracle Enterprise Linux 5 (64-bit)");
+        _xcp160GuestOsMap.put("Oracle Enterprise Linux 5.1 (32-bit)", "Oracle Enterprise Linux 5 (32-bit)");
+        _xcp160GuestOsMap.put("Oracle Enterprise Linux 5.1 (64-bit)", "Oracle Enterprise Linux 5 (64-bit)");
+        _xcp160GuestOsMap.put("Oracle Enterprise Linux 5.2 (32-bit)", "Oracle Enterprise Linux 5 (32-bit)");
+        _xcp160GuestOsMap.put("Oracle Enterprise Linux 5.2 (64-bit)", "Oracle Enterprise Linux 5 (64-bit)");
+        _xcp160GuestOsMap.put("Oracle Enterprise Linux 5.3 (32-bit)", "Oracle Enterprise Linux 5 (32-bit)");
+        _xcp160GuestOsMap.put("Oracle Enterprise Linux 5.3 (64-bit)", "Oracle Enterprise Linux 5 (64-bit)");
+        _xcp160GuestOsMap.put("Oracle Enterprise Linux 5.4 (32-bit)", "Oracle Enterprise Linux 5 (32-bit)");
+        _xcp160GuestOsMap.put("Oracle Enterprise Linux 5.4 (64-bit)", "Oracle Enterprise Linux 5 (64-bit)");
+        _xcp160GuestOsMap.put("Oracle Enterprise Linux 5.5 (32-bit)", "Oracle Enterprise Linux 5 (32-bit)");
+        _xcp160GuestOsMap.put("Oracle Enterprise Linux 5.5 (64-bit)", "Oracle Enterprise Linux 5 (64-bit)");
+        _xcp160GuestOsMap.put("Red Hat Enterprise Linux 4.5 (32-bit)", "Red Hat Enterprise Linux 4.5 (32-bit)");
+        _xcp160GuestOsMap.put("Red Hat Enterprise Linux 4.6 (32-bit)", "Red Hat Enterprise Linux 4.6 (32-bit)");
+        _xcp160GuestOsMap.put("Red Hat Enterprise Linux 4.7 (32-bit)", "Red Hat Enterprise Linux 4.7 (32-bit)");
+        _xcp160GuestOsMap.put("Red Hat Enterprise Linux 4.8 (32-bit)", "Red Hat Enterprise Linux 4.8 (32-bit)");
+        _xcp160GuestOsMap.put("Red Hat Enterprise Linux 5.0 (32-bit)", "Red Hat Enterprise Linux 5 (32-bit)");
+        _xcp160GuestOsMap.put("Red Hat Enterprise Linux 5.0 (64-bit)", "Red Hat Enterprise Linux 5 (64-bit)");
+        _xcp160GuestOsMap.put("Red Hat Enterprise Linux 5.1 (32-bit)", "Red Hat Enterprise Linux 5 (32-bit)");
+        _xcp160GuestOsMap.put("Red Hat Enterprise Linux 5.1 (64-bit)", "Red Hat Enterprise Linux 5 (64-bit)");
+        _xcp160GuestOsMap.put("Red Hat Enterprise Linux 5.2 (32-bit)", "Red Hat Enterprise Linux 5 (32-bit)");
+        _xcp160GuestOsMap.put("Red Hat Enterprise Linux 5.2 (64-bit)", "Red Hat Enterprise Linux 5 (64-bit)");
+        _xcp160GuestOsMap.put("Red Hat Enterprise Linux 5.3 (32-bit)", "Red Hat Enterprise Linux 5 (32-bit)");
+        _xcp160GuestOsMap.put("Red Hat Enterprise Linux 5.3 (64-bit)", "Red Hat Enterprise Linux 5 (64-bit)");
+        _xcp160GuestOsMap.put("Red Hat Enterprise Linux 5.4 (32-bit)", "Red Hat Enterprise Linux 5 (32-bit)");
+        _xcp160GuestOsMap.put("Red Hat Enterprise Linux 5.4 (64-bit)", "Red Hat Enterprise Linux 5 (64-bit)");
+        _xcp160GuestOsMap.put("Red Hat Enterprise Linux 5.5 (32-bit)", "Red Hat Enterprise Linux 5 (32-bit)");
+        _xcp160GuestOsMap.put("Red Hat Enterprise Linux 5.5 (64-bit)", "Red Hat Enterprise Linux 5 (64-bit)");
+        _xcp160GuestOsMap.put("Red Hat Enterprise Linux 6.0 (32-bit)", "Red Hat Enterprise Linux 6 (32-bit)");
+        _xcp160GuestOsMap.put("Red Hat Enterprise Linux 6.0 (64-bit)", "Red Hat Enterprise Linux 6 (64-bit)");
+        _xcp160GuestOsMap.put("SUSE Linux Enterprise Server 9 SP4 (32-bit)", "SUSE Linux Enterprise Server 9 SP4");
+        _xcp160GuestOsMap.put("SUSE Linux Enterprise Server 10 SP1 (32-bit)", "SUSE Linux Enterprise Server 10 SP1");
+        _xcp160GuestOsMap.put("SUSE Linux Enterprise Server 10 SP1 (64-bit)", "SUSE Linux Enterprise Server 10 SP1 x64");
+        _xcp160GuestOsMap.put("SUSE Linux Enterprise Server 10 SP2 (32-bit)", "SUSE Linux Enterprise Server 10 SP2");
+        _xcp160GuestOsMap.put("SUSE Linux Enterprise Server 10 SP2 (64-bit)", "SUSE Linux Enterprise Server 10 SP2 x64");
+        _xcp160GuestOsMap.put("SUSE Linux Enterprise Server 10 SP3 (64-bit)", "Other install media");
+        _xcp160GuestOsMap.put("SUSE Linux Enterprise Server 11 (32-bit)", "SUSE Linux Enterprise Server 11");
+        _xcp160GuestOsMap.put("SUSE Linux Enterprise Server 11 (64-bit)", "SUSE Linux Enterprise Server 11 x64");
+        _xcp160GuestOsMap.put("SUSE Linux Enterprise Server 11 SP1 (32-bit)", "SUSE Linux Enterprise Server 11 SP1 (32-bit)");
+        _xcp160GuestOsMap.put("SUSE Linux Enterprise Server 11 SP1 (64-bit)", "SUSE Linux Enterprise Server 11 SP1 (64-bit)");
+        _xcp160GuestOsMap.put("Windows 7 (32-bit)", "Windows 7 (32-bit)");
+        _xcp160GuestOsMap.put("Windows 7 (64-bit)", "Windows 7 (64-bit)");
+        _xcp160GuestOsMap.put("Windows Server 2003 (32-bit)", "Windows Server 2003 (32-bit)");
+        _xcp160GuestOsMap.put("Windows Server 2003 (64-bit)", "Windows Server 2003 (64-bit)");
+        _xcp160GuestOsMap.put("Windows Server 2008 (32-bit)", "Windows Server 2008 (32-bit)");
+        _xcp160GuestOsMap.put("Windows Server 2008 (64-bit)", "Windows Server 2008 (64-bit)");
+        _xcp160GuestOsMap.put("Windows Server 2008 R2 (64-bit)", "Windows Server 2008 R2 (64-bit)");
+        _xcp160GuestOsMap.put("Windows XP SP3 (32-bit)", "Windows XP SP3 (32-bit)");
+        _xcp160GuestOsMap.put("Windows Vista (32-bit)", "Windows Vista (32-bit)");
+        _xcp160GuestOsMap.put("Ubuntu 10.04 (32-bit)", "Ubuntu Lucid Lynx 10.04 (32-bit) (experimental)");
+        _xcp160GuestOsMap.put("Ubuntu 10.04 (64-bit)", "Ubuntu Lucid Lynx 10.04 (64-bit) (experimental)");
+        _xcp160GuestOsMap.put("Other Linux (32-bit)", "Other install media");
+        _xcp160GuestOsMap.put("Other Linux (64-bit)", "Other install media");
+        _xcp160GuestOsMap.put("Other PV (32-bit)", "CentOS 5 (32-bit)");
+        _xcp160GuestOsMap.put("Other PV (64-bit)", "CentOS 5 (64-bit)");
+    }
+    
 
     static {
     	_xenServerGuestOsMap.put("CentOS 4.5 (32-bit)", "CentOS 4.5 (32-bit)");
@@ -694,6 +772,15 @@ public class CitrixHelper {
         return guestOS;
     }
     
+    public static String getXcp160GuestOsType(String stdType) {
+        String guestOS =  _xcp160GuestOsMap.get(stdType);
+        if (guestOS == null) {
+        	s_logger.debug("Can't find the guest os: " + stdType + " mapping into XCP's guestOS type, start it as HVM guest");
+        	guestOS = "Other install media";
+        }
+        return guestOS;
+    }
+    
     
     public static String getXenServerGuestOsType(String stdType, boolean bootFromCD) {
         String guestOS =  _xenServerGuestOsMap.get(stdType);

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/738d35a6/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/XcpServerResource.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/XcpServerResource.java b/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/XcpServerResource.java
index 7a95870..6baf6a0 100644
--- a/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/XcpServerResource.java
+++ b/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/XcpServerResource.java
@@ -39,9 +39,10 @@ import com.xensource.xenapi.Types.XenAPIException;
 @Local(value=ServerResource.class)
 public class XcpServerResource extends CitrixResourceBase {
 	  private final static Logger s_logger = Logger.getLogger(XcpServerResource.class);
-	  
-    public XcpServerResource() {
+	  private String version;
+    public XcpServerResource(String version) {
         super();
+        this.version = version;
     }
     
     @Override
@@ -55,7 +56,11 @@ public class XcpServerResource extends CitrixResourceBase {
     
     @Override
     protected String getGuestOsType(String stdType, boolean bootFromCD) {
-        return CitrixHelper.getXcpGuestOsType(stdType);
+    	if (version.equalsIgnoreCase("1.6")) {
+    		return CitrixHelper.getXcp160GuestOsType(stdType);
+    	} else {
+    		return CitrixHelper.getXcpGuestOsType(stdType);
+    	}
     }
 
     @Override


[07/50] [abbrv] git commit: updated refs/heads/vmsync to d403974

Posted by ah...@apache.org.
Made a cast so we don't get warnings


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

Branch: refs/heads/vmsync
Commit: 3c59747635bd859bc0db6aa1f4ede6a37732237f
Parents: 738d35a
Author: Alex Huang <al...@gmail.com>
Authored: Wed May 8 15:37:29 2013 -0700
Committer: Alex Huang <al...@gmail.com>
Committed: Wed May 8 15:38:00 2013 -0700

----------------------------------------------------------------------
 .../com/cloud/resource/ResourceManagerImpl.java    |   12 +++++++++---
 1 files changed, 9 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/3c597476/server/src/com/cloud/resource/ResourceManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/resource/ResourceManagerImpl.java b/server/src/com/cloud/resource/ResourceManagerImpl.java
index c9c3f9c..0ab35dd 100755
--- a/server/src/com/cloud/resource/ResourceManagerImpl.java
+++ b/server/src/com/cloud/resource/ResourceManagerImpl.java
@@ -30,7 +30,6 @@ import javax.ejb.Local;
 import javax.inject.Inject;
 import javax.naming.ConfigurationException;
 
-import com.cloud.dc.*;
 import org.apache.cloudstack.api.ApiConstants;
 import org.apache.cloudstack.api.command.admin.cluster.AddClusterCmd;
 import org.apache.cloudstack.api.command.admin.cluster.DeleteClusterCmd;
@@ -74,6 +73,13 @@ import com.cloud.cluster.ManagementServerNode;
 import com.cloud.configuration.Config;
 import com.cloud.configuration.ConfigurationManager;
 import com.cloud.configuration.dao.ConfigurationDao;
+import com.cloud.dc.ClusterDetailsDao;
+import com.cloud.dc.ClusterDetailsVO;
+import com.cloud.dc.ClusterVO;
+import com.cloud.dc.DataCenterIpAddressVO;
+import com.cloud.dc.DataCenterVO;
+import com.cloud.dc.HostPodVO;
+import com.cloud.dc.PodCluster;
 import com.cloud.dc.dao.ClusterDao;
 import com.cloud.dc.dao.ClusterVSMMapDao;
 import com.cloud.dc.dao.DataCenterDao;
@@ -1638,10 +1644,10 @@ public class ResourceManagerImpl extends ManagerBase implements ResourceManager,
 	private Object dispatchToStateAdapters(ResourceStateAdapter.Event event,
 			boolean singleTaker, Object... args) {
         synchronized (_resourceStateAdapters) {
-            Iterator it = _resourceStateAdapters.entrySet().iterator();
+            Iterator<Map.Entry<String, ResourceStateAdapter>> it = _resourceStateAdapters.entrySet().iterator();
             Object result = null;
             while (it.hasNext()) {
-				Map.Entry<String, ResourceStateAdapter> item = (Map.Entry<String, ResourceStateAdapter>) it
+				Map.Entry<String, ResourceStateAdapter> item = it
 						.next();
                 ResourceStateAdapter adapter = item.getValue();
 


[21/50] [abbrv] CLOUDSTACK-747: Internal LB between VPC tiers support

Posted by ah...@apache.org.
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2660a6b7/api/src/org/apache/cloudstack/api/command/admin/internallb/ListInternalLBVMsCmd.java
----------------------------------------------------------------------
diff --git a/api/src/org/apache/cloudstack/api/command/admin/internallb/ListInternalLBVMsCmd.java b/api/src/org/apache/cloudstack/api/command/admin/internallb/ListInternalLBVMsCmd.java
new file mode 100644
index 0000000..e314b32
--- /dev/null
+++ b/api/src/org/apache/cloudstack/api/command/admin/internallb/ListInternalLBVMsCmd.java
@@ -0,0 +1,151 @@
+// 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 org.apache.cloudstack.api.command.admin.internallb;
+
+import org.apache.cloudstack.api.APICommand;
+import org.apache.cloudstack.api.ApiConstants;
+import org.apache.cloudstack.api.BaseListProjectAndAccountResourcesCmd;
+import org.apache.cloudstack.api.Parameter;
+import org.apache.cloudstack.api.response.DomainRouterResponse;
+import org.apache.cloudstack.api.response.HostResponse;
+import org.apache.cloudstack.api.response.ListResponse;
+import org.apache.cloudstack.api.response.NetworkResponse;
+import org.apache.cloudstack.api.response.PodResponse;
+import org.apache.cloudstack.api.response.UserVmResponse;
+import org.apache.cloudstack.api.response.VpcResponse;
+import org.apache.cloudstack.api.response.ZoneResponse;
+import org.apache.log4j.Logger;
+
+import com.cloud.async.AsyncJob;
+import com.cloud.network.router.VirtualRouter.Role;
+
+@APICommand(name = "listInternalLoadBalancerVMs", description="List internal LB VMs.", responseObject=DomainRouterResponse.class)
+public class ListInternalLBVMsCmd extends BaseListProjectAndAccountResourcesCmd {
+    public static final Logger s_logger = Logger.getLogger(ListInternalLBVMsCmd.class.getName());
+
+    private static final String s_name = "listinternallbvmssresponse";
+
+    /////////////////////////////////////////////////////
+    //////////////// API parameters /////////////////////
+    /////////////////////////////////////////////////////
+
+    @Parameter(name=ApiConstants.HOST_ID, type=CommandType.UUID, entityType=HostResponse.class,
+            description="the host ID of the Internal LB VM")
+    private Long hostId;
+
+    @Parameter(name=ApiConstants.ID, type=CommandType.UUID, entityType=UserVmResponse.class,
+            description="the ID of the Internal LB VM")
+    private Long id;
+
+    @Parameter(name=ApiConstants.NAME, type=CommandType.STRING, description="the name of the Internal LB VM")
+    private String routerName;
+
+    @Parameter(name=ApiConstants.POD_ID, type=CommandType.UUID, entityType=PodResponse.class,
+            description="the Pod ID of the Internal LB VM")
+    private Long podId;
+
+    @Parameter(name=ApiConstants.STATE, type=CommandType.STRING, description="the state of the Internal LB VM")
+    private String state;
+
+    @Parameter(name=ApiConstants.ZONE_ID, type=CommandType.UUID, entityType=ZoneResponse.class,
+            description="the Zone ID of the Internal LB VM")
+    private Long zoneId;
+
+    @Parameter(name=ApiConstants.NETWORK_ID, type=CommandType.UUID, entityType=NetworkResponse.class,
+            description="list by network id")
+    private Long networkId;
+
+    @Parameter(name=ApiConstants.VPC_ID, type=CommandType.UUID, entityType=VpcResponse.class,
+            description="List Internal LB VMs by VPC")
+    private Long vpcId;
+
+    @Parameter(name=ApiConstants.FOR_VPC, type=CommandType.BOOLEAN, description="if true is passed for this parameter, list only VPC Internal LB VMs")
+    private Boolean forVpc;
+    
+    @Parameter(name=ApiConstants.ZONE_TYPE, type=CommandType.STRING, description="the network type of the zone that the virtual machine belongs to")
+    private String zoneType;
+    
+
+    /////////////////////////////////////////////////////
+    /////////////////// Accessors ///////////////////////
+    /////////////////////////////////////////////////////
+
+    public Long getHostId() {
+        return hostId;
+    }
+
+    public Long getId() {
+        return id;
+    }
+
+    public String getRouterName() {
+        return routerName;
+    }
+
+    public Long getPodId() {
+        return podId;
+    }
+
+    public String getState() {
+        return state;
+    }
+
+    public Long getZoneId() {
+        return zoneId;
+    }
+
+    public Long getNetworkId() {
+        return networkId;
+    }
+
+    public Long getVpcId() {
+        return vpcId;
+    }
+
+    public Boolean getForVpc() {
+        return forVpc;
+    }
+    
+    public String getRole() {
+        return Role.INTERNAL_LB_VM.toString();
+    }
+    
+    public String getZoneType() {
+        return zoneType;
+    }
+
+    /////////////////////////////////////////////////////
+    /////////////// API Implementation///////////////////
+    /////////////////////////////////////////////////////
+
+    @Override
+    public String getCommandName() {
+        return s_name;
+    }
+
+    @Override
+    public AsyncJob.Type getInstanceType() {
+        return AsyncJob.Type.DomainRouter;
+    }
+
+    @Override
+    public void execute(){
+        ListResponse<DomainRouterResponse> response = _queryService.searchForInternalLbVms(this);
+        response.setResponseName(getCommandName());
+        this.setResponseObject(response);
+    }
+}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2660a6b7/api/src/org/apache/cloudstack/api/command/admin/internallb/ListInternalLoadBalancerElementsCmd.java
----------------------------------------------------------------------
diff --git a/api/src/org/apache/cloudstack/api/command/admin/internallb/ListInternalLoadBalancerElementsCmd.java b/api/src/org/apache/cloudstack/api/command/admin/internallb/ListInternalLoadBalancerElementsCmd.java
new file mode 100644
index 0000000..1853619
--- /dev/null
+++ b/api/src/org/apache/cloudstack/api/command/admin/internallb/ListInternalLoadBalancerElementsCmd.java
@@ -0,0 +1,99 @@
+// 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 org.apache.cloudstack.api.command.admin.internallb;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.inject.Inject;
+
+import org.apache.cloudstack.api.APICommand;
+import org.apache.cloudstack.api.ApiConstants;
+import org.apache.cloudstack.api.BaseListCmd;
+import org.apache.cloudstack.api.Parameter;
+import org.apache.cloudstack.api.ServerApiException;
+import org.apache.cloudstack.api.response.InternalLoadBalancerElementResponse;
+import org.apache.cloudstack.api.response.ListResponse;
+import org.apache.cloudstack.api.response.ProviderResponse;
+import org.apache.cloudstack.network.element.InternalLoadBalancerElementService;
+import org.apache.log4j.Logger;
+
+import com.cloud.exception.ConcurrentOperationException;
+import com.cloud.exception.InsufficientCapacityException;
+import com.cloud.exception.ResourceAllocationException;
+import com.cloud.exception.ResourceUnavailableException;
+import com.cloud.network.VirtualRouterProvider;
+
+@APICommand(name = "listInternalLoadBalancerElements", description="Lists all available Internal Load Balancer elements.",
+            responseObject=InternalLoadBalancerElementResponse.class, since="4.2.0")
+public class ListInternalLoadBalancerElementsCmd extends BaseListCmd {
+    public static final Logger s_logger = Logger.getLogger(ListInternalLoadBalancerElementsCmd.class.getName());
+    private static final String _name = "listinternalloadbalancerelementsresponse";
+
+    @Inject
+    private InternalLoadBalancerElementService _service;
+
+    /////////////////////////////////////////////////////
+    //////////////// API parameters /////////////////////
+    /////////////////////////////////////////////////////
+    @Parameter(name=ApiConstants.ID, type=CommandType.UUID, entityType = InternalLoadBalancerElementResponse.class,
+            description="list internal load balancer elements by id")
+    private Long id;
+
+    @Parameter(name=ApiConstants.NSP_ID, type=CommandType.UUID, entityType = ProviderResponse.class,
+            description="list internal load balancer elements by network service provider id")
+    private Long nspId;
+
+    @Parameter(name=ApiConstants.ENABLED, type=CommandType.BOOLEAN, description="list internal load balancer elements by enabled state")
+    private Boolean enabled;
+
+    /////////////////////////////////////////////////////
+    /////////////////// Accessors ///////////////////////
+    /////////////////////////////////////////////////////
+
+    public Long getId() {
+        return id;
+    }
+
+    public Long getNspId() {
+        return nspId;
+    }
+
+    public Boolean getEnabled() {
+        return enabled;
+    }
+
+    @Override
+    public String getCommandName() {
+        return _name;
+    }
+
+    @Override
+    public void execute() throws ResourceUnavailableException, InsufficientCapacityException, ServerApiException, ConcurrentOperationException, ResourceAllocationException {
+        List<? extends VirtualRouterProvider> providers = _service.searchForInternalLoadBalancerElements(getId(), getNspId(), getEnabled());
+        ListResponse<InternalLoadBalancerElementResponse> response = new ListResponse<InternalLoadBalancerElementResponse>();
+        List<InternalLoadBalancerElementResponse> providerResponses = new ArrayList<InternalLoadBalancerElementResponse>();
+        for (VirtualRouterProvider provider : providers) {
+            InternalLoadBalancerElementResponse providerResponse = _responseGenerator.createInternalLbElementResponse(provider);
+            providerResponses.add(providerResponse);
+        }
+        response.setResponses(providerResponses);
+        response.setResponseName(getCommandName());
+        this.setResponseObject(response);
+
+    }
+}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2660a6b7/api/src/org/apache/cloudstack/api/command/admin/internallb/StartInternalLBVMCmd.java
----------------------------------------------------------------------
diff --git a/api/src/org/apache/cloudstack/api/command/admin/internallb/StartInternalLBVMCmd.java b/api/src/org/apache/cloudstack/api/command/admin/internallb/StartInternalLBVMCmd.java
new file mode 100644
index 0000000..31d132b
--- /dev/null
+++ b/api/src/org/apache/cloudstack/api/command/admin/internallb/StartInternalLBVMCmd.java
@@ -0,0 +1,120 @@
+// 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 org.apache.cloudstack.api.command.admin.internallb;
+
+import org.apache.cloudstack.api.APICommand;
+import org.apache.cloudstack.api.ApiConstants;
+import org.apache.cloudstack.api.ApiErrorCode;
+import org.apache.cloudstack.api.BaseAsyncCmd;
+import org.apache.cloudstack.api.Parameter;
+import org.apache.cloudstack.api.ServerApiException;
+import org.apache.cloudstack.api.response.DomainRouterResponse;
+import org.apache.log4j.Logger;
+
+import com.cloud.async.AsyncJob;
+import com.cloud.event.EventTypes;
+import com.cloud.exception.ConcurrentOperationException;
+import com.cloud.exception.InsufficientCapacityException;
+import com.cloud.exception.InvalidParameterValueException;
+import com.cloud.exception.ResourceUnavailableException;
+import com.cloud.network.router.VirtualRouter;
+import com.cloud.network.router.VirtualRouter.Role;
+import com.cloud.user.UserContext;
+
+@APICommand(name = "startInternalLoadBalancerVM", responseObject=DomainRouterResponse.class, description="Starts an existing internal lb vm.")
+public class StartInternalLBVMCmd extends BaseAsyncCmd {
+    public static final Logger s_logger = Logger.getLogger(StartInternalLBVMCmd.class.getName());
+    private static final String s_name = "startinternallbvmresponse";
+
+
+    /////////////////////////////////////////////////////
+    //////////////// API parameters /////////////////////
+    /////////////////////////////////////////////////////
+
+    @Parameter(name=ApiConstants.ID, type=CommandType.UUID, entityType=DomainRouterResponse.class,
+            required=true, description="the ID of the internal lb vm")
+    private Long id;
+
+    /////////////////////////////////////////////////////
+    /////////////////// Accessors ///////////////////////
+    /////////////////////////////////////////////////////
+
+    public Long getId() {
+        return id;
+    }
+
+    /////////////////////////////////////////////////////
+    /////////////// API Implementation///////////////////
+    /////////////////////////////////////////////////////
+
+    @Override
+    public String getCommandName() {
+        return s_name;
+    }
+
+    public static String getResultObjectName() {
+        return "router";
+    }
+
+    @Override
+    public long getEntityOwnerId() {
+        VirtualRouter router = _entityMgr.findById(VirtualRouter.class, getId());
+        if (router != null && router.getRole() == Role.INTERNAL_LB_VM) {
+            return router.getAccountId();
+        } else {
+            throw new InvalidParameterValueException("Unable to find internal lb vm by id");
+        } 
+    }
+
+    @Override
+    public String getEventType() {
+        return EventTypes.EVENT_INTERNAL_LB_VM_START;
+    }
+
+    @Override
+    public String getEventDescription() {
+        return  "starting internal lb vm: " + getId();
+    }
+
+    public AsyncJob.Type getInstanceType() {
+        return AsyncJob.Type.InternalLbVm;
+    }
+
+    public Long getInstanceId() {
+        return getId();
+    }
+
+    @Override
+    public void execute() throws ConcurrentOperationException, ResourceUnavailableException, InsufficientCapacityException{
+        UserContext.current().setEventDetails("Internal Lb Vm Id: "+getId());
+        VirtualRouter result = null;
+        VirtualRouter router = _routerService.findRouter(getId());
+        if (router == null || router.getRole() != Role.INTERNAL_LB_VM) {
+            throw new InvalidParameterValueException("Can't find internal lb vm by id");
+        } else {
+            result = _internalLbSvc.startInternalLbVm(getId(), UserContext.current().getCaller(), UserContext.current().getCallerUserId());
+        }
+        
+        if (result != null){
+            DomainRouterResponse routerResponse = _responseGenerator.createDomainRouterResponse(result);
+            routerResponse.setResponseName(getCommandName());
+            this.setResponseObject(routerResponse);
+        } else {
+            throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to start internal lb vm");
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2660a6b7/api/src/org/apache/cloudstack/api/command/admin/internallb/StopInternalLBVMCmd.java
----------------------------------------------------------------------
diff --git a/api/src/org/apache/cloudstack/api/command/admin/internallb/StopInternalLBVMCmd.java b/api/src/org/apache/cloudstack/api/command/admin/internallb/StopInternalLBVMCmd.java
new file mode 100644
index 0000000..f40db49
--- /dev/null
+++ b/api/src/org/apache/cloudstack/api/command/admin/internallb/StopInternalLBVMCmd.java
@@ -0,0 +1,123 @@
+// 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 org.apache.cloudstack.api.command.admin.internallb;
+
+import org.apache.cloudstack.api.APICommand;
+import org.apache.cloudstack.api.ApiConstants;
+import org.apache.cloudstack.api.ApiErrorCode;
+import org.apache.cloudstack.api.BaseAsyncCmd;
+import org.apache.cloudstack.api.Parameter;
+import org.apache.cloudstack.api.ServerApiException;
+import org.apache.cloudstack.api.response.DomainRouterResponse;
+import org.apache.log4j.Logger;
+
+import com.cloud.async.AsyncJob;
+import com.cloud.event.EventTypes;
+import com.cloud.exception.ConcurrentOperationException;
+import com.cloud.exception.InvalidParameterValueException;
+import com.cloud.exception.ResourceUnavailableException;
+import com.cloud.network.router.VirtualRouter;
+import com.cloud.network.router.VirtualRouter.Role;
+import com.cloud.user.UserContext;
+
+@APICommand(name = "stopInternalLoadBalancerVM", description = "Stops an Internal LB vm.", responseObject = DomainRouterResponse.class)
+public class StopInternalLBVMCmd extends BaseAsyncCmd {
+    public static final Logger s_logger = Logger.getLogger(StopInternalLBVMCmd.class.getName());
+    private static final String s_name = "stopinternallbvmresponse";
+
+    // ///////////////////////////////////////////////////
+    // ////////////// API parameters /////////////////////
+    // ///////////////////////////////////////////////////
+
+    @Parameter(name = ApiConstants.ID, type = CommandType.UUID, entityType = DomainRouterResponse.class,
+            required = true, description = "the ID of the internal lb vm")
+    private Long id;
+
+    @Parameter(name = ApiConstants.FORCED, type = CommandType.BOOLEAN, required = false, description = "Force stop the VM. The caller knows the VM is stopped.")
+    private Boolean forced;
+
+    // ///////////////////////////////////////////////////
+    // ///////////////// Accessors ///////////////////////
+    // ///////////////////////////////////////////////////
+
+    public Long getId() {
+        return id;
+    }
+
+    // ///////////////////////////////////////////////////
+    // ///////////// API Implementation///////////////////
+    // ///////////////////////////////////////////////////
+
+    @Override
+    public String getCommandName() {
+        return s_name;
+    }
+
+    @Override
+    public long getEntityOwnerId() {
+        VirtualRouter vm = _entityMgr.findById(VirtualRouter.class, getId());
+        if (vm != null && vm.getRole() == Role.INTERNAL_LB_VM) {
+            return vm.getAccountId();
+        } else {
+            throw new InvalidParameterValueException("Unable to find internal lb vm by id");
+        }
+    }
+
+    @Override
+    public String getEventType() {
+        return EventTypes.EVENT_INTERNAL_LB_VM_STOP;
+    }
+
+    @Override
+    public String getEventDescription() {
+        return "stopping internal lb vm: " + getId();
+    }
+
+    @Override
+    public AsyncJob.Type getInstanceType() {
+        return AsyncJob.Type.InternalLbVm;
+    }
+
+    @Override
+    public Long getInstanceId() {
+        return getId();
+    }
+
+    public boolean isForced() {
+        return (forced != null) ? forced : false;
+    }
+
+    @Override
+    public void execute() throws ConcurrentOperationException, ResourceUnavailableException {
+        UserContext.current().setEventDetails("Internal lb vm Id: "+getId());
+        VirtualRouter result = null;
+        VirtualRouter vm = _routerService.findRouter(getId());
+        if (vm == null || vm.getRole() != Role.INTERNAL_LB_VM) {
+            throw new InvalidParameterValueException("Can't find internal lb vm by id");
+        } else {
+            result = _internalLbSvc.stopInternalLbVm(getId(), isForced(), UserContext.current().getCaller(), UserContext.current().getCallerUserId());
+        } 
+        
+        if (result != null) {
+            DomainRouterResponse response = _responseGenerator.createDomainRouterResponse(result);
+            response.setResponseName(getCommandName());
+            this.setResponseObject(response);
+        } else {
+            throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to stop internal lb vm");
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2660a6b7/api/src/org/apache/cloudstack/api/command/admin/network/CreateNetworkOfferingCmd.java
----------------------------------------------------------------------
diff --git a/api/src/org/apache/cloudstack/api/command/admin/network/CreateNetworkOfferingCmd.java b/api/src/org/apache/cloudstack/api/command/admin/network/CreateNetworkOfferingCmd.java
index b48bf9e..6410715 100644
--- a/api/src/org/apache/cloudstack/api/command/admin/network/CreateNetworkOfferingCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/admin/network/CreateNetworkOfferingCmd.java
@@ -31,7 +31,6 @@ import org.apache.cloudstack.api.Parameter;
 import org.apache.cloudstack.api.ServerApiException;
 import org.apache.cloudstack.api.response.NetworkOfferingResponse;
 import org.apache.cloudstack.api.response.ServiceOfferingResponse;
-
 import org.apache.log4j.Logger;
 
 import com.cloud.exception.InvalidParameterValueException;
@@ -95,6 +94,10 @@ public class CreateNetworkOfferingCmd extends BaseCmd {
 
     @Parameter(name=ApiConstants.IS_PERSISTENT, type=CommandType.BOOLEAN, description="true if network offering supports persistent networks; defaulted to false if not specified")
     private Boolean isPersistent;
+    
+    @Parameter(name=ApiConstants.DETAILS, type=CommandType.MAP, since="4.2.0", description="Template details in key/value pairs." +
+    		" Supported keys are internallbprovider/publiclbprovider with service provider as a value")
+    protected Map details;
 
     /////////////////////////////////////////////////////
     /////////////////// Accessors ///////////////////////
@@ -215,6 +218,16 @@ public class CreateNetworkOfferingCmd extends BaseCmd {
 
         return capabilityMap;
     }
+    
+    public Map<String, String> getDetails() {
+        if (details == null || details.isEmpty()) {
+            return null;
+        }
+
+        Collection paramsCollection = details.values();
+        Map<String, String> params = (Map<String, String>) (paramsCollection.toArray())[0];
+        return params;
+    }
 
     /////////////////////////////////////////////////////
     /////////////// API Implementation///////////////////

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2660a6b7/api/src/org/apache/cloudstack/api/command/admin/router/CreateVirtualRouterElementCmd.java
----------------------------------------------------------------------
diff --git a/api/src/org/apache/cloudstack/api/command/admin/router/CreateVirtualRouterElementCmd.java b/api/src/org/apache/cloudstack/api/command/admin/router/CreateVirtualRouterElementCmd.java
index 39fac13..b3fca5a 100644
--- a/api/src/org/apache/cloudstack/api/command/admin/router/CreateVirtualRouterElementCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/admin/router/CreateVirtualRouterElementCmd.java
@@ -31,6 +31,7 @@ import org.apache.cloudstack.api.response.VirtualRouterProviderResponse;
 import org.apache.log4j.Logger;
 
 import com.cloud.event.EventTypes;
+import com.cloud.exception.InvalidParameterValueException;
 import com.cloud.exception.ResourceAllocationException;
 import com.cloud.network.VirtualRouterProvider;
 import com.cloud.network.VirtualRouterProvider.VirtualRouterProviderType;
@@ -52,6 +53,9 @@ public class CreateVirtualRouterElementCmd extends BaseAsyncCreateCmd {
 
     @Parameter(name=ApiConstants.NETWORK_SERVICE_PROVIDER_ID, type=CommandType.UUID, entityType = ProviderResponse.class, required=true, description="the network service provider ID of the virtual router element")
     private Long nspId;
+    
+    @Parameter(name=ApiConstants.PROVIDER_TYPE, type=CommandType.UUID, entityType = ProviderResponse.class, description="The provider type. Supported types are VirtualRouter (default) and VPCVirtualRouter")
+    private String providerType;
 
     /////////////////////////////////////////////////////
     /////////////////// Accessors ///////////////////////
@@ -61,16 +65,27 @@ public class CreateVirtualRouterElementCmd extends BaseAsyncCreateCmd {
         this.nspId = nspId;
     }
 
-
-
     public Long getNspId() {
         return nspId;
     }
+    
+    public VirtualRouterProviderType getProviderType() {
+        if (providerType != null) {
+            if (providerType.equalsIgnoreCase(VirtualRouterProviderType.VirtualRouter.toString())) {
+                return VirtualRouterProviderType.VirtualRouter;
+            } else if (providerType.equalsIgnoreCase(VirtualRouterProviderType.VPCVirtualRouter.toString())) {
+                return VirtualRouterProviderType.VPCVirtualRouter;
+            } else throw new InvalidParameterValueException("Invalid providerType specified");
+        } 
+        return VirtualRouterProviderType.VirtualRouter;
+    }
 
     /////////////////////////////////////////////////////
     /////////////// API Implementation///////////////////
     /////////////////////////////////////////////////////
 
+
+
     @Override
     public String getCommandName() {
         return s_name;
@@ -96,7 +111,7 @@ public class CreateVirtualRouterElementCmd extends BaseAsyncCreateCmd {
 
     @Override
     public void create() throws ResourceAllocationException {
-        VirtualRouterProvider result = _service.get(0).addElement(getNspId(), VirtualRouterProviderType.VirtualRouter);
+        VirtualRouterProvider result = _service.get(0).addElement(getNspId(), getProviderType());
         if (result != null) {
             setEntityId(result.getId());
             setEntityUuid(result.getUuid());

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2660a6b7/api/src/org/apache/cloudstack/api/command/admin/router/ListRoutersCmd.java
----------------------------------------------------------------------
diff --git a/api/src/org/apache/cloudstack/api/command/admin/router/ListRoutersCmd.java b/api/src/org/apache/cloudstack/api/command/admin/router/ListRoutersCmd.java
index 9fbc940..78c3554 100644
--- a/api/src/org/apache/cloudstack/api/command/admin/router/ListRoutersCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/admin/router/ListRoutersCmd.java
@@ -31,6 +31,7 @@ import org.apache.cloudstack.api.response.ZoneResponse;
 import org.apache.log4j.Logger;
 
 import com.cloud.async.AsyncJob;
+import com.cloud.network.router.VirtualRouter.Role;
 
 @APICommand(name = "listRouters", description="List routers.", responseObject=DomainRouterResponse.class)
 public class ListRoutersCmd extends BaseListProjectAndAccountResourcesCmd {
@@ -77,7 +78,7 @@ public class ListRoutersCmd extends BaseListProjectAndAccountResourcesCmd {
 
     @Parameter(name=ApiConstants.FOR_VPC, type=CommandType.BOOLEAN, description="if true is passed for this parameter, list only VPC routers")
     private Boolean forVpc;
-
+    
     /////////////////////////////////////////////////////
     /////////////////// Accessors ///////////////////////
     /////////////////////////////////////////////////////
@@ -121,6 +122,10 @@ public class ListRoutersCmd extends BaseListProjectAndAccountResourcesCmd {
     public Boolean getForVpc() {
         return forVpc;
     }
+    
+    public String getRole() {
+        return Role.VIRTUAL_ROUTER.toString();
+    }
 
     /////////////////////////////////////////////////////
     /////////////// API Implementation///////////////////

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2660a6b7/api/src/org/apache/cloudstack/api/command/admin/router/StartRouterCmd.java
----------------------------------------------------------------------
diff --git a/api/src/org/apache/cloudstack/api/command/admin/router/StartRouterCmd.java b/api/src/org/apache/cloudstack/api/command/admin/router/StartRouterCmd.java
index 1d3930b..ad0461e 100644
--- a/api/src/org/apache/cloudstack/api/command/admin/router/StartRouterCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/admin/router/StartRouterCmd.java
@@ -29,8 +29,10 @@ import com.cloud.async.AsyncJob;
 import com.cloud.event.EventTypes;
 import com.cloud.exception.ConcurrentOperationException;
 import com.cloud.exception.InsufficientCapacityException;
+import com.cloud.exception.InvalidParameterValueException;
 import com.cloud.exception.ResourceUnavailableException;
 import com.cloud.network.router.VirtualRouter;
+import com.cloud.network.router.VirtualRouter.Role;
 import com.cloud.user.Account;
 import com.cloud.user.UserContext;
 
@@ -100,7 +102,13 @@ public class StartRouterCmd extends BaseAsyncCmd {
     @Override
     public void execute() throws ConcurrentOperationException, ResourceUnavailableException, InsufficientCapacityException{
         UserContext.current().setEventDetails("Router Id: "+getId());
-        VirtualRouter result = _routerService.startRouter(id);
+        VirtualRouter result = null;
+        VirtualRouter router = _routerService.findRouter(getId());
+        if (router == null || router.getRole() != Role.VIRTUAL_ROUTER) {
+            throw new InvalidParameterValueException("Can't find router by id");
+        } else {
+            result = _routerService.startRouter(getId());
+        }
         if (result != null){
             DomainRouterResponse routerResponse = _responseGenerator.createDomainRouterResponse(result);
             routerResponse.setResponseName(getCommandName());

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2660a6b7/api/src/org/apache/cloudstack/api/command/admin/router/StopRouterCmd.java
----------------------------------------------------------------------
diff --git a/api/src/org/apache/cloudstack/api/command/admin/router/StopRouterCmd.java b/api/src/org/apache/cloudstack/api/command/admin/router/StopRouterCmd.java
index 60dd938..94473cf 100644
--- a/api/src/org/apache/cloudstack/api/command/admin/router/StopRouterCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/admin/router/StopRouterCmd.java
@@ -28,8 +28,10 @@ import org.apache.log4j.Logger;
 import com.cloud.async.AsyncJob;
 import com.cloud.event.EventTypes;
 import com.cloud.exception.ConcurrentOperationException;
+import com.cloud.exception.InvalidParameterValueException;
 import com.cloud.exception.ResourceUnavailableException;
 import com.cloud.network.router.VirtualRouter;
+import com.cloud.network.router.VirtualRouter.Role;
 import com.cloud.user.Account;
 import com.cloud.user.UserContext;
 
@@ -103,7 +105,14 @@ public class StopRouterCmd extends BaseAsyncCmd {
     @Override
     public void execute() throws ConcurrentOperationException, ResourceUnavailableException {
         UserContext.current().setEventDetails("Router Id: "+getId());
-        VirtualRouter result = _routerService.stopRouter(getId(), isForced());
+        VirtualRouter result = null;
+        VirtualRouter router = _routerService.findRouter(getId());
+        if (router == null || router.getRole() != Role.VIRTUAL_ROUTER) {
+            throw new InvalidParameterValueException("Can't find router by id");
+        } else {
+            result = _routerService.stopRouter(getId(), isForced());
+        }
+        
         if (result != null) {
             DomainRouterResponse response = _responseGenerator.createDomainRouterResponse(result);
             response.setResponseName(getCommandName());

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2660a6b7/api/src/org/apache/cloudstack/api/command/user/loadbalancer/CreateApplicationLoadBalancerCmd.java
----------------------------------------------------------------------
diff --git a/api/src/org/apache/cloudstack/api/command/user/loadbalancer/CreateApplicationLoadBalancerCmd.java b/api/src/org/apache/cloudstack/api/command/user/loadbalancer/CreateApplicationLoadBalancerCmd.java
new file mode 100644
index 0000000..17ae959
--- /dev/null
+++ b/api/src/org/apache/cloudstack/api/command/user/loadbalancer/CreateApplicationLoadBalancerCmd.java
@@ -0,0 +1,218 @@
+// 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 org.apache.cloudstack.api.command.user.loadbalancer;
+
+import org.apache.cloudstack.api.APICommand;
+import org.apache.cloudstack.api.ApiConstants;
+import org.apache.cloudstack.api.ApiErrorCode;
+import org.apache.cloudstack.api.BaseAsyncCreateCmd;
+import org.apache.cloudstack.api.Parameter;
+import org.apache.cloudstack.api.ServerApiException;
+import org.apache.cloudstack.api.response.ApplicationLoadBalancerResponse;
+import org.apache.cloudstack.api.response.NetworkResponse;
+import org.apache.cloudstack.network.lb.ApplicationLoadBalancerRule;
+import org.apache.log4j.Logger;
+
+import com.cloud.async.AsyncJob;
+import com.cloud.event.EventTypes;
+import com.cloud.exception.InsufficientAddressCapacityException;
+import com.cloud.exception.InsufficientVirtualNetworkCapcityException;
+import com.cloud.exception.InvalidParameterValueException;
+import com.cloud.exception.NetworkRuleConflictException;
+import com.cloud.exception.ResourceAllocationException;
+import com.cloud.exception.ResourceUnavailableException;
+import com.cloud.network.Network;
+import com.cloud.network.rules.LoadBalancerContainer.Scheme;
+import com.cloud.user.UserContext;
+import com.cloud.utils.net.NetUtils;
+
+@APICommand(name = "createLoadBalancer", description="Creates a Load Balancer", responseObject=ApplicationLoadBalancerResponse.class, since="4.2.0")
+public class CreateApplicationLoadBalancerCmd extends BaseAsyncCreateCmd {
+    public static final Logger s_logger = Logger.getLogger(CreateApplicationLoadBalancerCmd.class.getName());
+
+    private static final String s_name = "createloadbalancerresponse";
+
+    /////////////////////////////////////////////////////
+    //////////////// API parameters /////////////////////
+    /////////////////////////////////////////////////////
+    @Parameter(name=ApiConstants.NAME, type=CommandType.STRING, required=true, description="name of the Load Balancer")
+    private String loadBalancerName;
+    
+    @Parameter(name=ApiConstants.DESCRIPTION, type=CommandType.STRING, description="the description of the Load Balancer", length=4096)
+    private String description;
+    
+    @Parameter(name=ApiConstants.NETWORK_ID, type=CommandType.UUID, required=true, entityType = NetworkResponse.class,
+            description="The guest network the Load Balancer will be created for")
+    private Long networkId;
+    
+    @Parameter(name=ApiConstants.SOURCE_PORT, type=CommandType.INTEGER, required=true, description="the source port the network traffic will be load balanced from")
+    private Integer sourcePort;
+
+    @Parameter(name=ApiConstants.ALGORITHM, type=CommandType.STRING, required=true, description="load balancer algorithm (source, roundrobin, leastconn)")
+    private String algorithm;
+
+    @Parameter(name=ApiConstants.INSTANCE_PORT, type=CommandType.INTEGER, required=true, description="the TCP port of the virtual machine where the network traffic will be load balanced to")
+    private Integer instancePort;
+
+    @Parameter(name=ApiConstants.SOURCE_IP, type=CommandType.STRING, description="the source ip address the network traffic will be load balanced from")
+    private String sourceIp;
+    
+    @Parameter(name=ApiConstants.SOURCE_IP_NETWORK_ID, type=CommandType.UUID, entityType = NetworkResponse.class, required=true,
+            description="the network id of the source ip address")
+    private Long sourceIpNetworkId;
+    
+    @Parameter(name=ApiConstants.SCHEME, type=CommandType.STRING, required=true, description="the load balancer scheme. Supported value in this release is Internal")
+    private String scheme;
+
+
+
+    /////////////////////////////////////////////////////
+    /////////////////// Accessors ///////////////////////
+    /////////////////////////////////////////////////////
+
+    public String getAlgorithm() {
+        return algorithm;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    public String getLoadBalancerName() {
+        return loadBalancerName;
+    }
+
+    public Integer getPrivatePort() {
+        return instancePort;
+    }
+
+    public long getNetworkId() {
+        return networkId;
+    }
+
+    public String getName() {
+        return loadBalancerName;
+    }
+    
+    public Integer getSourcePort() {
+        return sourcePort.intValue();
+    }
+
+    public String getProtocol() {
+        return NetUtils.TCP_PROTO;
+    }
+
+    public long getAccountId() {
+        //get account info from the network object
+        Network ntwk = _networkService.getNetwork(networkId);
+        if (ntwk == null) {
+            throw new InvalidParameterValueException("Invalid network id specified");
+        }
+       
+        return ntwk.getAccountId();
+        
+    }
+
+    public int getInstancePort() {
+        return instancePort.intValue();
+    }
+
+    @Override
+    public String getEventType() {
+        return EventTypes.EVENT_LOAD_BALANCER_CREATE;
+    }
+
+    @Override
+    public String getEventDescription() {
+        return "creating load balancer: " + getName() + " account: " + getAccountId();
+
+    }
+
+    @Override
+    public AsyncJob.Type getInstanceType() {
+        return AsyncJob.Type.LoadBalancerRule;
+    }
+    
+    public String getSourceIp() {
+        return sourceIp;
+    }
+
+    public long getSourceIpNetworkId() {
+        return sourceIpNetworkId;
+    }
+
+    public Scheme getScheme() {
+        if (scheme.equalsIgnoreCase(Scheme.Internal.toString())) {
+            return Scheme.Internal;
+        } else {
+            throw new InvalidParameterValueException("Invalid value for scheme. Supported value is Internal");
+        }
+    }
+    
+    @Override
+    public long getEntityOwnerId() {
+       return getAccountId();
+    }
+
+    /////////////////////////////////////////////////////
+    /////////////// API Implementation///////////////////
+    /////////////////////////////////////////////////////
+    @Override
+    public String getCommandName() {
+        return s_name;
+    }
+
+    @Override
+    public void execute() throws ResourceAllocationException, ResourceUnavailableException {
+        ApplicationLoadBalancerRule rule = null;
+        try {
+            UserContext.current().setEventDetails("Load Balancer Id: " + getEntityId());
+            // State might be different after the rule is applied, so get new object here
+            rule = _entityMgr.findById(ApplicationLoadBalancerRule.class, getEntityId());
+            ApplicationLoadBalancerResponse lbResponse = _responseGenerator.createLoadBalancerContainerReponse(rule, _lbService.getLbInstances(getEntityId()));
+            setResponseObject(lbResponse);
+            lbResponse.setResponseName(getCommandName());
+        } catch (Exception ex) {
+            s_logger.warn("Failed to create Load Balancer due to exception ", ex);
+        } finally {
+            if (rule == null) {
+                throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to create Load Balancer");
+            }
+        }
+    }
+
+    @Override
+    public void create() {
+        try {
+            
+            ApplicationLoadBalancerRule result = _appLbService.createApplicationLoadBalancer(getName(), getDescription(), getScheme(),
+                    getSourceIpNetworkId(), getSourceIp(), getSourcePort(), getInstancePort(), getAlgorithm(), getNetworkId(), getEntityOwnerId());
+            this.setEntityId(result.getId());
+            this.setEntityUuid(result.getUuid());
+        }catch (NetworkRuleConflictException e) {
+            s_logger.warn("Exception: ", e);
+            throw new ServerApiException(ApiErrorCode.NETWORK_RULE_CONFLICT_ERROR, e.getMessage());
+        } catch (InsufficientAddressCapacityException e) {
+            s_logger.warn("Exception: ", e);
+            throw new ServerApiException(ApiErrorCode.INSUFFICIENT_CAPACITY_ERROR, e.getMessage());
+        } catch (InsufficientVirtualNetworkCapcityException e) {
+            s_logger.warn("Exception: ", e);
+            throw new ServerApiException(ApiErrorCode.INSUFFICIENT_CAPACITY_ERROR, e.getMessage());
+        }
+    }
+}
+

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2660a6b7/api/src/org/apache/cloudstack/api/command/user/loadbalancer/CreateLoadBalancerRuleCmd.java
----------------------------------------------------------------------
diff --git a/api/src/org/apache/cloudstack/api/command/user/loadbalancer/CreateLoadBalancerRuleCmd.java b/api/src/org/apache/cloudstack/api/command/user/loadbalancer/CreateLoadBalancerRuleCmd.java
index 5f1d97b..f6cc1f1 100644
--- a/api/src/org/apache/cloudstack/api/command/user/loadbalancer/CreateLoadBalancerRuleCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/loadbalancer/CreateLoadBalancerRuleCmd.java
@@ -148,7 +148,7 @@ public class CreateLoadBalancerRuleCmd extends BaseAsyncCreateCmd  /*implements
     }
 
 
-    public Long getNetworkId() {
+    public long getNetworkId() {
         if (networkId != null) {
             return networkId;
         }
@@ -278,7 +278,9 @@ public class CreateLoadBalancerRuleCmd extends BaseAsyncCreateCmd  /*implements
             throw new InvalidParameterValueException("Parameter cidrList is deprecated; if you need to open firewall rule for the specific cidr, please refer to createFirewallRule command");
         }
         try {
-            LoadBalancer result = _lbService.createLoadBalancerRule(this, getOpenFirewall());
+            LoadBalancer result = _lbService.createPublicLoadBalancerRule(getXid(), getName(), getDescription(), 
+                    getSourcePortStart(), getSourcePortEnd(), getDefaultPortStart(), getDefaultPortEnd(), getSourceIpAddressId(), getProtocol(), getAlgorithm(),
+                    getNetworkId(), getEntityOwnerId(), getOpenFirewall());
             this.setEntityId(result.getId());
             this.setEntityUuid(result.getUuid());
         } catch (NetworkRuleConflictException e) {

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2660a6b7/api/src/org/apache/cloudstack/api/command/user/loadbalancer/DeleteApplicationLoadBalancerCmd.java
----------------------------------------------------------------------
diff --git a/api/src/org/apache/cloudstack/api/command/user/loadbalancer/DeleteApplicationLoadBalancerCmd.java b/api/src/org/apache/cloudstack/api/command/user/loadbalancer/DeleteApplicationLoadBalancerCmd.java
new file mode 100644
index 0000000..bc6cd09
--- /dev/null
+++ b/api/src/org/apache/cloudstack/api/command/user/loadbalancer/DeleteApplicationLoadBalancerCmd.java
@@ -0,0 +1,116 @@
+// 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 org.apache.cloudstack.api.command.user.loadbalancer;
+
+import org.apache.cloudstack.api.APICommand;
+import org.apache.cloudstack.api.ApiConstants;
+import org.apache.cloudstack.api.ApiErrorCode;
+import org.apache.cloudstack.api.BaseAsyncCmd;
+import org.apache.cloudstack.api.Parameter;
+import org.apache.cloudstack.api.ServerApiException;
+import org.apache.cloudstack.api.response.FirewallRuleResponse;
+import org.apache.cloudstack.api.response.SuccessResponse;
+import org.apache.cloudstack.network.lb.ApplicationLoadBalancerRule;
+import org.apache.log4j.Logger;
+
+import com.cloud.async.AsyncJob;
+import com.cloud.event.EventTypes;
+import com.cloud.exception.InvalidParameterValueException;
+import com.cloud.user.UserContext;
+
+@APICommand(name = "deleteLoadBalancer", description="Deletes a load balancer", responseObject=SuccessResponse.class, since="4.2.0")
+public class DeleteApplicationLoadBalancerCmd extends BaseAsyncCmd {
+    public static final Logger s_logger = Logger.getLogger(DeleteApplicationLoadBalancerCmd.class.getName());
+    private static final String s_name = "deleteloadbalancerresponse";
+    /////////////////////////////////////////////////////
+    //////////////// API parameters /////////////////////
+    /////////////////////////////////////////////////////
+
+    @Parameter(name=ApiConstants.ID, type=CommandType.UUID, entityType = FirewallRuleResponse.class,
+            required=true, description="the ID of the Load Balancer")
+    private Long id;
+
+
+    /////////////////////////////////////////////////////
+    /////////////////// Accessors ///////////////////////
+    /////////////////////////////////////////////////////
+
+    public Long getId() {
+        return id;
+    }
+
+    /////////////////////////////////////////////////////
+    /////////////// API Implementation///////////////////
+    /////////////////////////////////////////////////////
+
+    @Override
+    public String getCommandName() {
+        return s_name;
+    }
+
+    @Override
+    public long getEntityOwnerId() {
+        ApplicationLoadBalancerRule lb = _entityMgr.findById(ApplicationLoadBalancerRule.class, getId());
+        if (lb != null) {
+            return lb.getAccountId();
+        } else {
+            throw new InvalidParameterValueException("Can't find load balancer by id specified");
+        }
+    }
+
+    @Override
+    public String getEventType() {
+        return EventTypes.EVENT_LOAD_BALANCER_DELETE;
+    }
+
+    @Override
+    public String getEventDescription() {
+        return  "deleting load balancer: " + getId();
+    }
+
+    @Override
+    public void execute(){
+        UserContext.current().setEventDetails("Load balancer Id: " + getId());
+        boolean result = _appLbService.deleteApplicationLoadBalancer(getId());
+
+        if (result) {
+            SuccessResponse response = new SuccessResponse(getCommandName());
+            this.setResponseObject(response);
+        } else {
+            throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to delete load balancer");
+        }
+    }
+
+    @Override
+    public String getSyncObjType() {
+        return BaseAsyncCmd.networkSyncObject;
+    }
+
+    @Override
+    public Long getSyncObjId() {
+        ApplicationLoadBalancerRule lb = _appLbService.getApplicationLoadBalancer(id);
+        if(lb == null){
+            throw new InvalidParameterValueException("Unable to find load balancer by id ");
+        }
+        return lb.getNetworkId();
+    }
+
+    @Override
+    public AsyncJob.Type getInstanceType() {
+        return AsyncJob.Type.FirewallRule;
+    }
+}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2660a6b7/api/src/org/apache/cloudstack/api/command/user/loadbalancer/ListApplicationLoadBalancersCmd.java
----------------------------------------------------------------------
diff --git a/api/src/org/apache/cloudstack/api/command/user/loadbalancer/ListApplicationLoadBalancersCmd.java b/api/src/org/apache/cloudstack/api/command/user/loadbalancer/ListApplicationLoadBalancersCmd.java
new file mode 100644
index 0000000..8e5df31
--- /dev/null
+++ b/api/src/org/apache/cloudstack/api/command/user/loadbalancer/ListApplicationLoadBalancersCmd.java
@@ -0,0 +1,131 @@
+// 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 org.apache.cloudstack.api.command.user.loadbalancer;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.cloudstack.api.APICommand;
+import org.apache.cloudstack.api.ApiConstants;
+import org.apache.cloudstack.api.BaseListTaggedResourcesCmd;
+import org.apache.cloudstack.api.Parameter;
+import org.apache.cloudstack.api.response.ApplicationLoadBalancerResponse;
+import org.apache.cloudstack.api.response.FirewallRuleResponse;
+import org.apache.cloudstack.api.response.ListResponse;
+import org.apache.cloudstack.api.response.NetworkResponse;
+import org.apache.cloudstack.network.lb.ApplicationLoadBalancerRule;
+import org.apache.log4j.Logger;
+
+import com.cloud.exception.InvalidParameterValueException;
+import com.cloud.network.rules.LoadBalancerContainer.Scheme;
+import com.cloud.utils.Pair;
+
+@APICommand(name = "listLoadBalancers", description = "Lists Load Balancers", responseObject = ApplicationLoadBalancerResponse.class, since="4.2.0")
+public class ListApplicationLoadBalancersCmd extends BaseListTaggedResourcesCmd {
+    public static final Logger s_logger = Logger.getLogger(ListApplicationLoadBalancersCmd.class.getName());
+
+    private static final String s_name = "listloadbalancerssresponse";
+
+    // ///////////////////////////////////////////////////
+    // ////////////// API parameters /////////////////////
+    // ///////////////////////////////////////////////////
+
+    @Parameter(name = ApiConstants.ID, type = CommandType.UUID, entityType = FirewallRuleResponse.class,
+            description = "the ID of the Load Balancer")
+    private Long id;
+
+    @Parameter(name = ApiConstants.NAME, type = CommandType.STRING, description = "the name of the Load Balancer")
+    private String loadBalancerName;
+    
+    @Parameter(name = ApiConstants.SOURCE_IP, type = CommandType.STRING, description = "the source ip address of the Load Balancer")
+    private String sourceIp;
+
+    @Parameter(name=ApiConstants.SOURCE_IP_NETWORK_ID, type=CommandType.UUID, entityType = NetworkResponse.class, 
+            description="the network id of the source ip address")
+    private Long sourceIpNetworkId;
+    
+    @Parameter(name = ApiConstants.SCHEME, type = CommandType.STRING, description = "the scheme of the Load Balancer. Supported value is Internal in the current release")
+    private String scheme;
+    
+    @Parameter(name=ApiConstants.NETWORK_ID, type=CommandType.UUID, entityType = NetworkResponse.class, 
+            description="the network id of the Load Balancer")
+    private Long networkId;
+
+
+    // ///////////////////////////////////////////////////
+    // ///////////////// Accessors ///////////////////////
+    // ///////////////////////////////////////////////////
+
+    public Long getId() {
+        return id;
+    }
+
+    public String getLoadBalancerRuleName() {
+        return loadBalancerName;
+    }
+
+    public String getLoadBalancerName() {
+        return loadBalancerName;
+    }
+
+    public String getSourceIp() {
+        return sourceIp;
+    }
+
+    public Long getSourceIpNetworkId() {
+        return sourceIpNetworkId;
+    }
+
+    @Override
+    public String getCommandName() {
+        return s_name;
+    }
+    
+    public Scheme getScheme() {
+        if (scheme != null) {
+            if (scheme.equalsIgnoreCase(Scheme.Internal.toString())) {
+                return Scheme.Internal;
+            } else {
+                throw new InvalidParameterValueException("Invalid value for scheme. Supported value is Internal");
+            }
+        }
+        return null;
+    }
+    
+    public Long getNetworkId() {
+        return networkId;
+    }
+    // ///////////////////////////////////////////////////
+    // ///////////// API Implementation///////////////////
+    // ///////////////////////////////////////////////////
+
+    @Override
+    public void execute() {
+        Pair<List<? extends ApplicationLoadBalancerRule>, Integer> loadBalancers = _appLbService.listApplicationLoadBalancers(this);
+        ListResponse<ApplicationLoadBalancerResponse> response = new ListResponse<ApplicationLoadBalancerResponse>();
+        List<ApplicationLoadBalancerResponse> lbResponses = new ArrayList<ApplicationLoadBalancerResponse>();
+        for (ApplicationLoadBalancerRule loadBalancer : loadBalancers.first()) {
+            ApplicationLoadBalancerResponse lbResponse = _responseGenerator.createLoadBalancerContainerReponse(loadBalancer, _lbService.getLbInstances(loadBalancer.getId()));
+            lbResponse.setObjectName("loadbalancer");
+            lbResponses.add(lbResponse);
+        }
+        response.setResponses(lbResponses, loadBalancers.second());
+        response.setResponseName(getCommandName());
+        this.setResponseObject(response);
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2660a6b7/api/src/org/apache/cloudstack/api/response/ApplicationLoadBalancerInstanceResponse.java
----------------------------------------------------------------------
diff --git a/api/src/org/apache/cloudstack/api/response/ApplicationLoadBalancerInstanceResponse.java b/api/src/org/apache/cloudstack/api/response/ApplicationLoadBalancerInstanceResponse.java
new file mode 100644
index 0000000..2d6614d
--- /dev/null
+++ b/api/src/org/apache/cloudstack/api/response/ApplicationLoadBalancerInstanceResponse.java
@@ -0,0 +1,63 @@
+// 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 org.apache.cloudstack.api.response;
+
+import org.apache.cloudstack.api.ApiConstants;
+import org.apache.cloudstack.api.BaseResponse;
+
+import com.cloud.serializer.Param;
+import com.google.gson.annotations.SerializedName;
+
+/**
+ * 
+ * Load Balancer instance is the User Vm instance participating in the Load Balancer
+ *
+ */
+
+@SuppressWarnings("unused")
+public class ApplicationLoadBalancerInstanceResponse extends BaseResponse{
+    
+    @SerializedName(ApiConstants.ID) @Param(description = "the instance ID")
+    private String id;
+    
+    @SerializedName(ApiConstants.NAME) @Param(description = "the name of the instance")
+    private String name;
+    
+    @SerializedName(ApiConstants.STATE) @Param(description="the state of the instance")
+    private String state;
+    
+    @SerializedName(ApiConstants.IP_ADDRESS)
+    @Param(description="the ip address of the instance")
+    private String ipAddress;
+    
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public void setState(String state) {
+        this.state = state;
+    }
+
+    public void setIpAddress(String ipAddress) {
+        this.ipAddress = ipAddress;
+    }
+}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2660a6b7/api/src/org/apache/cloudstack/api/response/ApplicationLoadBalancerResponse.java
----------------------------------------------------------------------
diff --git a/api/src/org/apache/cloudstack/api/response/ApplicationLoadBalancerResponse.java b/api/src/org/apache/cloudstack/api/response/ApplicationLoadBalancerResponse.java
new file mode 100644
index 0000000..de9bce6
--- /dev/null
+++ b/api/src/org/apache/cloudstack/api/response/ApplicationLoadBalancerResponse.java
@@ -0,0 +1,142 @@
+// 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 org.apache.cloudstack.api.response;
+
+import java.util.LinkedHashSet;
+import java.util.List;
+import java.util.Set;
+
+import org.apache.cloudstack.api.ApiConstants;
+import org.apache.cloudstack.api.BaseResponse;
+
+import com.cloud.serializer.Param;
+import com.google.gson.annotations.SerializedName;
+
+@SuppressWarnings("unused")
+public class ApplicationLoadBalancerResponse extends BaseResponse implements ControlledEntityResponse{
+    @SerializedName(ApiConstants.ID) @Param(description = "the Load Balancer ID")
+    private String id;
+
+    @SerializedName(ApiConstants.NAME) @Param(description = "the name of the Load Balancer")
+    private String name;
+
+    @SerializedName(ApiConstants.DESCRIPTION) @Param(description = "the description of the Load Balancer")
+    private String description;
+    
+    @SerializedName(ApiConstants.ALGORITHM) @Param(description = "the load balancer algorithm (source, roundrobin, leastconn)")
+    private String algorithm;
+    
+    @SerializedName(ApiConstants.NETWORK_ID) @Param(description="Load Balancer network id")
+    private String networkId;
+    
+    @SerializedName(ApiConstants.SOURCE_IP) @Param(description="Load Balancer source ip")
+    private String sourceIp;
+    
+    @SerializedName(ApiConstants.SOURCE_IP_NETWORK_ID) @Param(description="Load Balancer source ip network id")
+    private String sourceIpNetworkId;
+    
+    @SerializedName(ApiConstants.ACCOUNT)
+    @Param(description = "the account of the Load Balancer")
+    private String accountName;
+
+    @SerializedName(ApiConstants.PROJECT_ID) @Param(description="the project id of the Load Balancer")
+    private String projectId;
+
+    @SerializedName(ApiConstants.PROJECT) @Param(description="the project name of the Load Balancer")
+    private String projectName;
+
+    @SerializedName(ApiConstants.DOMAIN_ID)
+    @Param(description = "the domain ID of the Load Balancer")
+    private String domainId;
+    
+    @SerializedName(ApiConstants.DOMAIN)
+    @Param(description = "the domain of the Load Balancer")
+    private String domainName;
+    
+    @SerializedName("loadbalancerrule")  @Param(description="the list of rules associated with the Load Balancer", responseObject = ApplicationLoadBalancerRuleResponse.class)
+    private List<ApplicationLoadBalancerRuleResponse> lbRules;
+    
+    @SerializedName("loadbalancerinstance")  @Param(description="the list of instances associated with the Load Balancer", responseObject = ApplicationLoadBalancerInstanceResponse.class)
+    private List<ApplicationLoadBalancerInstanceResponse> lbInstances;
+    
+    @SerializedName(ApiConstants.TAGS)  @Param(description="the list of resource tags associated with the Load Balancer", responseObject = ResourceTagResponse.class)
+    private List<ResourceTagResponse> tags;
+
+    public void setAccountName(String accountName) {
+        this.accountName = accountName;
+    }
+
+    @Override
+    public void setDomainId(String domainId) {
+        this.domainId = domainId;
+    }
+
+    public void setDomainName(String domainName) {
+        this.domainName = domainName;
+    }
+    
+    @Override
+    public void setProjectId(String projectId) {
+        this.projectId = projectId;
+    }
+
+    @Override
+    public void setProjectName(String projectName) {
+        this.projectName = projectName;
+    }
+
+    public void setTags(List<ResourceTagResponse> tags) {
+        this.tags = tags;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+    public void setAlgorithm(String algorithm) {
+        this.algorithm = algorithm;
+    }
+
+    public void setNetworkId(String networkId) {
+        this.networkId = networkId;
+    }
+
+    public void setSourceIp(String sourceIp) {
+        this.sourceIp = sourceIp;
+    }
+
+    public void setSourceIpNetworkId(String sourceIpNetworkId) {
+        this.sourceIpNetworkId = sourceIpNetworkId;
+    }
+
+    public void setLbRules(List<ApplicationLoadBalancerRuleResponse> lbRules) {
+        this.lbRules = lbRules;
+    }
+
+    public void setLbInstances(List<ApplicationLoadBalancerInstanceResponse> lbInstances) {
+        this.lbInstances = lbInstances;
+    }
+}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2660a6b7/api/src/org/apache/cloudstack/api/response/ApplicationLoadBalancerRuleResponse.java
----------------------------------------------------------------------
diff --git a/api/src/org/apache/cloudstack/api/response/ApplicationLoadBalancerRuleResponse.java b/api/src/org/apache/cloudstack/api/response/ApplicationLoadBalancerRuleResponse.java
new file mode 100644
index 0000000..ffc64d5
--- /dev/null
+++ b/api/src/org/apache/cloudstack/api/response/ApplicationLoadBalancerRuleResponse.java
@@ -0,0 +1,51 @@
+// 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 org.apache.cloudstack.api.response;
+
+import org.apache.cloudstack.api.ApiConstants;
+import org.apache.cloudstack.api.BaseResponse;
+
+import com.cloud.serializer.Param;
+import com.google.gson.annotations.SerializedName;
+
+/**
+ * Subobject of the load balancer container response
+ */
+@SuppressWarnings("unused")
+public class ApplicationLoadBalancerRuleResponse extends BaseResponse{
+    @SerializedName(ApiConstants.SOURCE_PORT) @Param(description = "source port of the load balancer rule")
+    private Integer sourcePort;
+    
+    @SerializedName(ApiConstants.INSTANCE_PORT) @Param(description = "instance port of the load balancer rule")
+    private Integer instancePort;
+    
+    @SerializedName(ApiConstants.STATE) @Param(description = "the state of the load balancer rule")
+    private String state;
+
+    public void setSourcePort(Integer sourcePort) {
+        this.sourcePort = sourcePort;
+    }
+
+    public void setInstancePort(Integer instancePort) {
+        this.instancePort = instancePort;
+    }
+
+    public void setState(String state) {
+        this.state = state;
+    }
+}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2660a6b7/api/src/org/apache/cloudstack/api/response/DomainRouterResponse.java
----------------------------------------------------------------------
diff --git a/api/src/org/apache/cloudstack/api/response/DomainRouterResponse.java b/api/src/org/apache/cloudstack/api/response/DomainRouterResponse.java
index 79c8596..852d988 100644
--- a/api/src/org/apache/cloudstack/api/response/DomainRouterResponse.java
+++ b/api/src/org/apache/cloudstack/api/response/DomainRouterResponse.java
@@ -153,8 +153,11 @@ public class DomainRouterResponse extends BaseResponse implements ControlledView
     @SerializedName("scriptsversion") @Param(description="the version of scripts")
     private String scriptsVersion;
 
-    @SerializedName(ApiConstants.VPC_ID) @Param(description="VPC the network belongs to")
+    @SerializedName(ApiConstants.VPC_ID) @Param(description="VPC the router belongs to")
     private String vpcId;
+    
+    @SerializedName(ApiConstants.ROLE) @Param(description="role of the domain router")
+    private String role;
 
     @SerializedName("nic")  @Param(description="the list of nics associated with the router",
             responseObject = NicResponse.class, since="4.0")
@@ -164,15 +167,11 @@ public class DomainRouterResponse extends BaseResponse implements ControlledView
         nics = new LinkedHashSet<NicResponse>();
     }
 
-
-
     @Override
     public String getObjectId() {
         return this.getId();
     }
 
-
-
     public String getId() {
         return id;
     }
@@ -372,4 +371,8 @@ public class DomainRouterResponse extends BaseResponse implements ControlledView
 	public void setIp6Dns2(String ip6Dns2) {
 		this.ip6Dns2 = ip6Dns2;
 	}
+	
+	public void setRole(String role) {
+        this.role = role;
+    }
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2660a6b7/api/src/org/apache/cloudstack/api/response/InternalLoadBalancerElementResponse.java
----------------------------------------------------------------------
diff --git a/api/src/org/apache/cloudstack/api/response/InternalLoadBalancerElementResponse.java b/api/src/org/apache/cloudstack/api/response/InternalLoadBalancerElementResponse.java
new file mode 100644
index 0000000..b7e8634
--- /dev/null
+++ b/api/src/org/apache/cloudstack/api/response/InternalLoadBalancerElementResponse.java
@@ -0,0 +1,51 @@
+// 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 org.apache.cloudstack.api.response;
+
+import org.apache.cloudstack.api.ApiConstants;
+import org.apache.cloudstack.api.BaseResponse;
+import org.apache.cloudstack.api.EntityReference;
+
+import com.cloud.network.VirtualRouterProvider;
+import com.cloud.serializer.Param;
+import com.google.gson.annotations.SerializedName;
+
+@EntityReference(value=VirtualRouterProvider.class)
+@SuppressWarnings("unused")
+public class InternalLoadBalancerElementResponse extends BaseResponse {
+    @SerializedName(ApiConstants.ID) @Param(description="the id of the internal load balancer element")
+    private String id;
+
+    @SerializedName(ApiConstants.NSP_ID) @Param(description="the physical network service provider id of the element")
+    private String nspId;
+
+    @SerializedName(ApiConstants.ENABLED) @Param(description="Enabled/Disabled the element")
+    private Boolean enabled;
+
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public void setNspId(String nspId) {
+        this.nspId = nspId;
+    }
+
+    public void setEnabled(Boolean enabled) {
+        this.enabled = enabled;
+    }
+}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2660a6b7/api/src/org/apache/cloudstack/api/response/NetworkOfferingResponse.java
----------------------------------------------------------------------
diff --git a/api/src/org/apache/cloudstack/api/response/NetworkOfferingResponse.java b/api/src/org/apache/cloudstack/api/response/NetworkOfferingResponse.java
index b1dcd42..7a7e371 100644
--- a/api/src/org/apache/cloudstack/api/response/NetworkOfferingResponse.java
+++ b/api/src/org/apache/cloudstack/api/response/NetworkOfferingResponse.java
@@ -18,6 +18,7 @@ package org.apache.cloudstack.api.response;
 
 import java.util.Date;
 import java.util.List;
+import java.util.Map;
 
 import org.apache.cloudstack.api.ApiConstants;
 import org.apache.cloudstack.api.BaseResponse;
@@ -83,6 +84,10 @@ public class NetworkOfferingResponse extends BaseResponse {
 
     @SerializedName(ApiConstants.IS_PERSISTENT) @Param(description="true if network offering supports persistent networks, false otherwise")
     private Boolean isPersistent;
+    
+    @SerializedName(ApiConstants.DETAILS) @Param(description="additional key/value details tied with network offering", since="4.2.0")
+    private Map details;
+
 
     public void setId(String id) {
         this.id = id;
@@ -156,5 +161,9 @@ public class NetworkOfferingResponse extends BaseResponse {
     public void setIsPersistent(Boolean isPersistent) {
         this.isPersistent = isPersistent;
     }
+    
+    public void setDetails(Map details) {
+        this.details = details;
+    }
 
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2660a6b7/api/src/org/apache/cloudstack/api/response/VirtualRouterProviderResponse.java
----------------------------------------------------------------------
diff --git a/api/src/org/apache/cloudstack/api/response/VirtualRouterProviderResponse.java b/api/src/org/apache/cloudstack/api/response/VirtualRouterProviderResponse.java
index 92d9a1d..de355bd 100644
--- a/api/src/org/apache/cloudstack/api/response/VirtualRouterProviderResponse.java
+++ b/api/src/org/apache/cloudstack/api/response/VirtualRouterProviderResponse.java
@@ -25,6 +25,7 @@ import com.cloud.serializer.Param;
 import com.google.gson.annotations.SerializedName;
 
 @EntityReference(value=VirtualRouterProvider.class)
+@SuppressWarnings("unused")
 public class VirtualRouterProviderResponse extends BaseResponse implements ControlledEntityResponse {
     @SerializedName(ApiConstants.ID) @Param(description="the id of the router")
     private String id;

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2660a6b7/api/src/org/apache/cloudstack/network/element/InternalLoadBalancerElementService.java
----------------------------------------------------------------------
diff --git a/api/src/org/apache/cloudstack/network/element/InternalLoadBalancerElementService.java b/api/src/org/apache/cloudstack/network/element/InternalLoadBalancerElementService.java
new file mode 100644
index 0000000..33a0c64
--- /dev/null
+++ b/api/src/org/apache/cloudstack/network/element/InternalLoadBalancerElementService.java
@@ -0,0 +1,56 @@
+// 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 org.apache.cloudstack.network.element;
+
+import java.util.List;
+
+
+import com.cloud.network.VirtualRouterProvider;
+import com.cloud.utils.component.PluggableService;
+
+public interface InternalLoadBalancerElementService extends PluggableService{
+    /**
+     * Configures existing Internal Load Balancer Element (enables or disables it)
+     * @param id
+     * @param enable
+     * @return
+     */
+    VirtualRouterProvider configureInternalLoadBalancerElement(long id, boolean enable);
+    
+    /**
+     * Adds Internal Load Balancer element to the Network Service Provider
+     * @param ntwkSvcProviderId
+     * @return
+     */
+    VirtualRouterProvider addInternalLoadBalancerElement(long ntwkSvcProviderId);
+    
+    /**
+     * Retrieves existing Internal Load Balancer element
+     * @param id
+     * @return
+     */
+    VirtualRouterProvider getInternalLoadBalancerElement(long id);
+    
+    /**
+     * Searches for existing Internal Load Balancer elements based on parameters passed to the call
+     * @param id
+     * @param ntwkSvsProviderId
+     * @param enabled
+     * @return
+     */
+    List<? extends VirtualRouterProvider> searchForInternalLoadBalancerElements(Long id, Long ntwkSvsProviderId, Boolean enabled);
+}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2660a6b7/api/src/org/apache/cloudstack/network/lb/ApplicationLoadBalancerContainer.java
----------------------------------------------------------------------
diff --git a/api/src/org/apache/cloudstack/network/lb/ApplicationLoadBalancerContainer.java b/api/src/org/apache/cloudstack/network/lb/ApplicationLoadBalancerContainer.java
new file mode 100644
index 0000000..df94d3d
--- /dev/null
+++ b/api/src/org/apache/cloudstack/network/lb/ApplicationLoadBalancerContainer.java
@@ -0,0 +1,28 @@
+// 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 org.apache.cloudstack.network.lb;
+
+import com.cloud.network.rules.LoadBalancerContainer;
+import com.cloud.utils.net.Ip;
+
+public interface ApplicationLoadBalancerContainer extends LoadBalancerContainer{
+    
+    public Long getSourceIpNetworkId();
+    
+    public Ip getSourceIp();
+
+}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2660a6b7/api/src/org/apache/cloudstack/network/lb/ApplicationLoadBalancerRule.java
----------------------------------------------------------------------
diff --git a/api/src/org/apache/cloudstack/network/lb/ApplicationLoadBalancerRule.java b/api/src/org/apache/cloudstack/network/lb/ApplicationLoadBalancerRule.java
new file mode 100644
index 0000000..f4acb73
--- /dev/null
+++ b/api/src/org/apache/cloudstack/network/lb/ApplicationLoadBalancerRule.java
@@ -0,0 +1,24 @@
+// 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 org.apache.cloudstack.network.lb;
+
+import com.cloud.network.rules.LoadBalancer;
+
+public interface ApplicationLoadBalancerRule extends ApplicationLoadBalancerContainer, LoadBalancer{
+    int getInstancePort();
+}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2660a6b7/api/src/org/apache/cloudstack/network/lb/ApplicationLoadBalancerService.java
----------------------------------------------------------------------
diff --git a/api/src/org/apache/cloudstack/network/lb/ApplicationLoadBalancerService.java b/api/src/org/apache/cloudstack/network/lb/ApplicationLoadBalancerService.java
new file mode 100644
index 0000000..b2ac358
--- /dev/null
+++ b/api/src/org/apache/cloudstack/network/lb/ApplicationLoadBalancerService.java
@@ -0,0 +1,42 @@
+// 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 org.apache.cloudstack.network.lb;
+
+import java.util.List;
+
+import org.apache.cloudstack.api.command.user.loadbalancer.ListApplicationLoadBalancersCmd;
+
+import com.cloud.exception.InsufficientAddressCapacityException;
+import com.cloud.exception.InsufficientVirtualNetworkCapcityException;
+import com.cloud.exception.NetworkRuleConflictException;
+import com.cloud.network.rules.LoadBalancerContainer.Scheme;
+import com.cloud.utils.Pair;
+
+public interface ApplicationLoadBalancerService {
+    
+    ApplicationLoadBalancerRule createApplicationLoadBalancer(String name, String description, Scheme scheme, long sourceIpNetworkId, String sourceIp,
+            int sourcePort, int instancePort, String algorithm, long networkId, long lbOwnerId) throws InsufficientAddressCapacityException,
+            NetworkRuleConflictException, InsufficientVirtualNetworkCapcityException;
+    
+    boolean deleteApplicationLoadBalancer(long id);
+    
+    Pair<List<? extends ApplicationLoadBalancerRule>, Integer> listApplicationLoadBalancers(ListApplicationLoadBalancersCmd cmd);
+    
+    ApplicationLoadBalancerRule getApplicationLoadBalancer(long ruleId);
+
+}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2660a6b7/api/src/org/apache/cloudstack/network/lb/InternalLoadBalancerVMService.java
----------------------------------------------------------------------
diff --git a/api/src/org/apache/cloudstack/network/lb/InternalLoadBalancerVMService.java b/api/src/org/apache/cloudstack/network/lb/InternalLoadBalancerVMService.java
new file mode 100644
index 0000000..91cd88d
--- /dev/null
+++ b/api/src/org/apache/cloudstack/network/lb/InternalLoadBalancerVMService.java
@@ -0,0 +1,34 @@
+// 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 org.apache.cloudstack.network.lb;
+
+import com.cloud.exception.ConcurrentOperationException;
+import com.cloud.exception.InsufficientCapacityException;
+import com.cloud.exception.ResourceUnavailableException;
+import com.cloud.exception.StorageUnavailableException;
+import com.cloud.network.router.VirtualRouter;
+import com.cloud.user.Account;
+
+public interface InternalLoadBalancerVMService {
+
+    VirtualRouter startInternalLbVm(long internalLbVmId, Account caller, long callerUserId) 
+            throws StorageUnavailableException, InsufficientCapacityException, ConcurrentOperationException, ResourceUnavailableException;
+
+    VirtualRouter stopInternalLbVm(long vmId, boolean forced, Account caller, long callerUserId)
+            throws ConcurrentOperationException, ResourceUnavailableException;
+
+}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2660a6b7/api/src/org/apache/cloudstack/query/QueryService.java
----------------------------------------------------------------------
diff --git a/api/src/org/apache/cloudstack/query/QueryService.java b/api/src/org/apache/cloudstack/query/QueryService.java
index 443c5df..2f50d63 100644
--- a/api/src/org/apache/cloudstack/query/QueryService.java
+++ b/api/src/org/apache/cloudstack/query/QueryService.java
@@ -18,6 +18,7 @@ package org.apache.cloudstack.query;
 
 import org.apache.cloudstack.affinity.AffinityGroupResponse;
 import org.apache.cloudstack.api.command.admin.host.ListHostsCmd;
+import org.apache.cloudstack.api.command.admin.internallb.ListInternalLBVMsCmd;
 import org.apache.cloudstack.api.command.admin.router.ListRoutersCmd;
 import org.apache.cloudstack.api.command.admin.storage.ListStoragePoolsCmd;
 import org.apache.cloudstack.api.command.admin.user.ListUsersCmd;
@@ -101,4 +102,6 @@ public interface QueryService {
 
     public ListResponse<AffinityGroupResponse> listAffinityGroups(Long affinityGroupId, String affinityGroupName,
             String affinityGroupType, Long vmId, Long startIndex, Long pageSize);
+
+    ListResponse<DomainRouterResponse> searchForInternalLbVms(ListInternalLBVMsCmd cmd);
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2660a6b7/client/pom.xml
----------------------------------------------------------------------
diff --git a/client/pom.xml b/client/pom.xml
index 147959b..197ba27 100644
--- a/client/pom.xml
+++ b/client/pom.xml
@@ -85,6 +85,11 @@
       <artifactId>cloud-plugin-network-midonet</artifactId>
       <version>${project.version}</version>
     </dependency>
+  <dependency>
+      <groupId>org.apache.cloudstack</groupId>
+      <artifactId>cloud-plugin-network-internallb</artifactId>
+      <version>${project.version}</version>
+    </dependency>
     <dependency>
       <groupId>org.apache.cloudstack</groupId>
       <artifactId>cloud-plugin-hypervisor-xen</artifactId>

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2660a6b7/client/tomcatconf/applicationContext.xml.in
----------------------------------------------------------------------
diff --git a/client/tomcatconf/applicationContext.xml.in b/client/tomcatconf/applicationContext.xml.in
index 36f232c..67c8ccf 100644
--- a/client/tomcatconf/applicationContext.xml.in
+++ b/client/tomcatconf/applicationContext.xml.in
@@ -363,6 +363,9 @@
   <bean id="vpcOfferingServiceMapDaoImpl" class="com.cloud.network.vpc.dao.VpcOfferingServiceMapDaoImpl" />
   <bean id="vpcServiceMapDaoImpl" class="com.cloud.network.vpc.dao.VpcServiceMapDaoImpl" />
   <bean id="vpnUserDaoImpl" class="com.cloud.network.dao.VpnUserDaoImpl" />
+  <bean id="applicationLbRuleDaoImpl" class="org.apache.cloudstack.lb.dao.ApplicationLoadBalancerRuleDaoImpl" />
+  <bean id="networkOfferingDetailsDaoImpl" class="com.cloud.offerings.dao.NetworkOfferingDetailsDaoImpl" />
+
 
   <!--
     Checkers
@@ -406,10 +409,12 @@
   <bean id="VpcVirtualRouter" class="com.cloud.network.element.VpcVirtualRouterElement">
     <property name="name" value="VpcVirtualRouter"/>
   </bean>
-
   <bean id="elasticLoadBalancerElement" class="com.cloud.network.element.ElasticLoadBalancerElement">
     <property name="name" value="ElasticLoadBalancerElement"/>
   </bean>
+  <bean id="InternalLbVm" class="org.apache.cloudstack.network.element.InternalLoadBalancerElement">
+    <property name="name" value="InternalLbVm"/>
+  </bean>
 
   <!-- 
     General allocators
@@ -789,6 +794,8 @@
   <bean id="vMSnapshotManagerImpl" class="com.cloud.vm.snapshot.VMSnapshotManagerImpl" />
   <bean id="volumeManagerImpl" class="com.cloud.storage.VolumeManagerImpl" />
   <bean id="ClassicalPrimaryDataStoreProvider" class="org.apache.cloudstack.storage.datastore.provider.CloudStackPrimaryDataStoreProviderImpl" />
+  <bean id="ApplicationLoadBalancerService" class="org.apache.cloudstack.network.lb.ApplicationLoadBalancerManagerImpl" />
+  <bean id="InternalLoadBalancerVMManager" class="org.apache.cloudstack.network.lb.InternalLoadBalancerVMManagerImpl" />
 
 
 <!--=======================================================================================================-->


[02/50] [abbrv] git commit: updated refs/heads/vmsync to d403974

Posted by ah...@apache.org.
CLOUDSTACK-2171:Unable to Create a VM In the VMware Setup with the latest Master


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

Branch: refs/heads/vmsync
Commit: 76e8afa24fdbdf7d3132c5c5b90320f19bf7ddcb
Parents: 53e4965
Author: Pranav Saxena <pr...@citrix.com>
Authored: Wed May 8 17:05:36 2013 +0530
Committer: Pranav Saxena <pr...@citrix.com>
Committed: Wed May 8 17:05:36 2013 +0530

----------------------------------------------------------------------
 ui/scripts/system.js |    5 -----
 1 files changed, 0 insertions(+), 5 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/76e8afa2/ui/scripts/system.js
----------------------------------------------------------------------
diff --git a/ui/scripts/system.js b/ui/scripts/system.js
index dc09ea8..2746e0d 100644
--- a/ui/scripts/system.js
+++ b/ui/scripts/system.js
@@ -1018,12 +1018,7 @@
                     dataType: "json",
                     success: function(json) {
                       var jobId = json.updatephysicalnetworkresponse.jobid;
-
-                      var trafficType = getTrafficType(selectedPhysicalNetworkObj, 'Guest');
-
-                      updateTrafficLabels(trafficType, args.data, function() {
                         args.response.success({ _custom: { jobId: jobId }});
-                      });
                    },
 
                     error:function(json){


[19/50] [abbrv] CLOUDSTACK-747: Internal LB between VPC tiers support

Posted by ah...@apache.org.
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2660a6b7/plugins/network-elements/internal-loadbalancer/pom.xml
----------------------------------------------------------------------
diff --git a/plugins/network-elements/internal-loadbalancer/pom.xml b/plugins/network-elements/internal-loadbalancer/pom.xml
new file mode 100644
index 0000000..48e664e
--- /dev/null
+++ b/plugins/network-elements/internal-loadbalancer/pom.xml
@@ -0,0 +1,50 @@
+<!--
+  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.
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+  <artifactId>cloud-plugin-network-internallb</artifactId>
+  <name>Apache CloudStack Plugin - Network Internal Load Balancer</name>
+  <parent>
+    <groupId>org.apache.cloudstack</groupId>
+    <artifactId>cloudstack-plugins</artifactId>
+    <version>4.2.0-SNAPSHOT</version>
+    <relativePath>../../pom.xml</relativePath>
+  </parent>
+  <build>
+    <defaultGoal>install</defaultGoal>
+    <sourceDirectory>src</sourceDirectory>
+    <testSourceDirectory>test</testSourceDirectory>
+    <resources>
+      <resource>
+        <directory>resources</directory>
+        <includes>
+          <include>**/*.xml</include>
+        </includes>
+      </resource>
+    </resources>
+    <testResources>
+      <testResource>
+        <directory>test/resources</directory>
+          <excludes>
+              <exclude>%regex[.*[0-9]*To[0-9]*.*Test.*]</exclude>
+          </excludes>
+      </testResource>
+    </testResources>
+  </build>
+</project>

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2660a6b7/plugins/network-elements/internal-loadbalancer/src/org/apache/cloudstack/network/element/InternalLoadBalancerElement.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/internal-loadbalancer/src/org/apache/cloudstack/network/element/InternalLoadBalancerElement.java b/plugins/network-elements/internal-loadbalancer/src/org/apache/cloudstack/network/element/InternalLoadBalancerElement.java
new file mode 100644
index 0000000..4b9308b
--- /dev/null
+++ b/plugins/network-elements/internal-loadbalancer/src/org/apache/cloudstack/network/element/InternalLoadBalancerElement.java
@@ -0,0 +1,548 @@
+// 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 org.apache.cloudstack.network.element;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import javax.ejb.Local;
+import javax.inject.Inject;
+
+import org.apache.cloudstack.api.command.admin.internallb.ConfigureInternalLoadBalancerElementCmd;
+import org.apache.cloudstack.api.command.admin.internallb.CreateInternalLoadBalancerElementCmd;
+import org.apache.cloudstack.api.command.admin.internallb.ListInternalLoadBalancerElementsCmd;
+import org.apache.cloudstack.lb.dao.ApplicationLoadBalancerRuleDao;
+import org.apache.cloudstack.network.lb.InternalLoadBalancerVMManager;
+import org.apache.log4j.Logger;
+
+import com.cloud.agent.api.to.LoadBalancerTO;
+import com.cloud.configuration.ConfigurationManager;
+import com.cloud.dc.DataCenter;
+import com.cloud.dc.DataCenter.NetworkType;
+import com.cloud.deploy.DeployDestination;
+import com.cloud.exception.ConcurrentOperationException;
+import com.cloud.exception.InsufficientCapacityException;
+import com.cloud.exception.InvalidParameterValueException;
+import com.cloud.exception.ResourceUnavailableException;
+import com.cloud.network.Network;
+import com.cloud.network.Network.Capability;
+import com.cloud.network.Network.Provider;
+import com.cloud.network.Network.Service;
+import com.cloud.network.NetworkModel;
+import com.cloud.network.Networks.TrafficType;
+import com.cloud.network.PhysicalNetworkServiceProvider;
+import com.cloud.network.PublicIpAddress;
+import com.cloud.network.VirtualRouterProvider;
+import com.cloud.network.VirtualRouterProvider.VirtualRouterProviderType;
+import com.cloud.network.dao.NetworkServiceMapDao;
+import com.cloud.network.dao.PhysicalNetworkServiceProviderDao;
+import com.cloud.network.dao.VirtualRouterProviderDao;
+import com.cloud.network.element.IpDeployer;
+import com.cloud.network.element.LoadBalancingServiceProvider;
+import com.cloud.network.element.NetworkElement;
+import com.cloud.network.element.VirtualRouterElement;
+import com.cloud.network.element.VirtualRouterProviderVO;
+import com.cloud.network.lb.LoadBalancingRule;
+import com.cloud.network.router.VirtualRouter;
+import com.cloud.network.router.VirtualRouter.Role;
+import com.cloud.network.rules.FirewallRule;
+import com.cloud.network.rules.LoadBalancerContainer;
+import com.cloud.network.rules.LoadBalancerContainer.Scheme;
+import com.cloud.offering.NetworkOffering;
+import com.cloud.user.Account;
+import com.cloud.user.AccountManager;
+import com.cloud.user.User;
+import com.cloud.utils.component.AdapterBase;
+import com.cloud.utils.db.SearchCriteria.Op;
+import com.cloud.utils.db.SearchCriteria2;
+import com.cloud.utils.db.SearchCriteriaService;
+import com.cloud.utils.exception.CloudRuntimeException;
+import com.cloud.utils.net.Ip;
+import com.cloud.vm.DomainRouterVO;
+import com.cloud.vm.NicProfile;
+import com.cloud.vm.ReservationContext;
+import com.cloud.vm.VirtualMachine;
+import com.cloud.vm.VirtualMachineProfile;
+import com.cloud.vm.dao.DomainRouterDao;
+
+@Local(value = {NetworkElement.class})
+public class InternalLoadBalancerElement extends AdapterBase implements LoadBalancingServiceProvider, InternalLoadBalancerElementService, IpDeployer{
+    private static final Logger s_logger = Logger.getLogger(InternalLoadBalancerElement.class);
+    protected static final Map<Service, Map<Capability, String>> capabilities = setCapabilities();
+    private static InternalLoadBalancerElement internalLbElement = null;
+
+    @Inject NetworkModel _ntwkModel;
+    @Inject NetworkServiceMapDao _ntwkSrvcDao;
+    @Inject DomainRouterDao _routerDao;
+    @Inject VirtualRouterProviderDao _vrProviderDao;
+    @Inject PhysicalNetworkServiceProviderDao _pNtwkSvcProviderDao;
+    @Inject InternalLoadBalancerVMManager _internalLbMgr;
+    @Inject ConfigurationManager _configMgr;
+    @Inject AccountManager _accountMgr;
+    @Inject ApplicationLoadBalancerRuleDao _appLbDao;
+    
+    protected InternalLoadBalancerElement() {
+    }
+    
+    
+    public static InternalLoadBalancerElement getInstance() {
+        if ( internalLbElement == null) {
+            internalLbElement = new InternalLoadBalancerElement();
+        }
+        return internalLbElement;
+     }
+    
+    
+    private boolean canHandle(Network config, Scheme lbScheme) {
+        //works in Advance zone only
+        DataCenter dc = _configMgr.getZone(config.getDataCenterId());
+        if (dc.getNetworkType() != NetworkType.Advanced) {
+            s_logger.trace("Not hanling zone of network type " + dc.getNetworkType());
+            return false;
+        }
+        if (config.getGuestType() != Network.GuestType.Isolated || config.getTrafficType() != TrafficType.Guest) {
+            s_logger.trace("Not handling network with Type  " + config.getGuestType() + " and traffic type " + config.getTrafficType());
+            return false;
+        }
+        
+        Map<Capability, String> lbCaps = this.getCapabilities().get(Service.Lb);
+        if (!lbCaps.isEmpty()) {
+            String schemeCaps = lbCaps.get(Capability.LbSchemes);
+            if (schemeCaps != null && lbScheme != null) {
+                if (!schemeCaps.contains(lbScheme.toString())) {
+                    s_logger.debug("Scheme " + lbScheme.toString() + " is not supported by the provider " + this.getName());
+                    return false;
+                }
+            }
+        }
+        
+        if (!_ntwkModel.isProviderSupportServiceInNetwork(config.getId(), Service.Lb, getProvider())) {
+            s_logger.trace("Element " + getProvider().getName() + " doesn't support service " + Service.Lb
+                    + " in the network " + config);
+            return false;
+        }
+        return true;
+    }
+
+    
+    @Override
+    public Map<Service, Map<Capability, String>> getCapabilities() {
+        return capabilities;
+    }
+
+    
+    @Override
+    public Provider getProvider() {
+        return Provider.InternalLbVm;
+    }
+
+    
+    @Override
+    public boolean implement(Network network, NetworkOffering offering, DeployDestination dest, ReservationContext context)
+            throws ConcurrentOperationException, ResourceUnavailableException,
+            InsufficientCapacityException {
+        
+        if (!canHandle(network, null)) {
+            s_logger.trace("No need to implement " + this.getName());
+            return true;
+        }
+        
+        //1) Get all the Ips from the network having LB rules assigned
+        List<String> ips = _appLbDao.listLbIpsBySourceIpNetworkIdAndScheme(network.getId(), Scheme.Internal);
+        
+        //2) Start those vms
+        for (String ip : ips) {
+            Ip sourceIp = new Ip(ip);
+            List<? extends VirtualRouter> internalLbVms;
+            try {
+                internalLbVms = _internalLbMgr.deployInternalLbVm(network, sourceIp, dest, _accountMgr.getAccount(network.getAccountId()), null);
+            } catch (InsufficientCapacityException e) {
+                s_logger.warn("Failed to deploy element " + this.getName() + " for ip " + sourceIp + " due to:", e);
+                return false;
+            } catch (ConcurrentOperationException e) {
+                s_logger.warn("Failed to deploy element " + this.getName() + " for ip " + sourceIp + " due to:", e);
+                return false;
+            }
+            
+            if (internalLbVms == null || internalLbVms.isEmpty()) {
+                throw new ResourceUnavailableException("Can't deploy " + this.getName() + " to handle LB rules",
+                        DataCenter.class, network.getDataCenterId());
+            }
+        }
+       
+        return true;
+    }
+
+    
+    @Override
+    public boolean prepare(Network network, NicProfile nic, VirtualMachineProfile<? extends VirtualMachine> vm, DeployDestination dest, ReservationContext context) throws ConcurrentOperationException,
+            ResourceUnavailableException, InsufficientCapacityException {
+        
+        if (!canHandle(network, null)) {
+            s_logger.trace("No need to prepare " + this.getName());
+            return true;
+        }
+        
+        if (vm.getType() == VirtualMachine.Type.User) {
+          //1) Get all the Ips from the network having LB rules assigned
+            List<String> ips = _appLbDao.listLbIpsBySourceIpNetworkIdAndScheme(network.getId(), Scheme.Internal);
+            
+            //2) Start those vms
+            for (String ip : ips) {
+                Ip sourceIp = new Ip(ip);
+                List<? extends VirtualRouter> internalLbVms;
+                try {
+                    internalLbVms = _internalLbMgr.deployInternalLbVm(network, sourceIp, dest, _accountMgr.getAccount(network.getAccountId()), null);
+                } catch (InsufficientCapacityException e) {
+                    s_logger.warn("Failed to deploy element " + this.getName() + " for ip " + sourceIp + " due to:", e);
+                    return false;
+                } catch (ConcurrentOperationException e) {
+                    s_logger.warn("Failed to deploy element " + this.getName() + " for ip " + sourceIp +  " due to:", e);
+                    return false;
+                }
+                
+                if (internalLbVms == null || internalLbVms.isEmpty()) {
+                    throw new ResourceUnavailableException("Can't deploy " + this.getName() + " to handle LB rules",
+                            DataCenter.class, network.getDataCenterId());
+                }
+            }
+        }
+        
+        return true;
+    }
+
+    @Override
+    public boolean release(Network network, NicProfile nic, VirtualMachineProfile<? extends VirtualMachine> vm, ReservationContext context) throws ConcurrentOperationException, ResourceUnavailableException {
+        return true;
+    }
+
+    
+    @Override
+    public boolean shutdown(Network network, ReservationContext context, boolean cleanup) throws ConcurrentOperationException, ResourceUnavailableException {
+        List<? extends VirtualRouter> internalLbVms = _routerDao.listByNetworkAndRole(network.getId(), Role.INTERNAL_LB_VM);
+        if (internalLbVms == null || internalLbVms.isEmpty()) {
+            return true;
+        }
+        boolean result = true;
+        for (VirtualRouter internalLbVm : internalLbVms) {
+            result = result && _internalLbMgr.destroyInternalLbVm(internalLbVm.getId(),
+                    context.getAccount(), context.getCaller().getId());
+            if (cleanup) {
+                if (!result) {
+                    s_logger.warn("Failed to stop internal lb element " + internalLbVm + ", but would try to process clean up anyway.");
+                }
+                result = (_internalLbMgr.destroyInternalLbVm(internalLbVm.getId(),
+                        context.getAccount(), context.getCaller().getId()));
+                if (!result) {
+                    s_logger.warn("Failed to clean up internal lb element " + internalLbVm);
+                }
+            }
+        }
+        return result;
+    }
+
+    
+    @Override
+    public boolean destroy(Network network, ReservationContext context) throws ConcurrentOperationException, ResourceUnavailableException {
+        List<? extends VirtualRouter> internalLbVms = _routerDao.listByNetworkAndRole(network.getId(), Role.INTERNAL_LB_VM);
+        if (internalLbVms == null || internalLbVms.isEmpty()) {
+            return true;
+        }
+        boolean result = true;
+        for (VirtualRouter internalLbVm : internalLbVms) {
+            result = result && (_internalLbMgr.destroyInternalLbVm(internalLbVm.getId(),
+                    context.getAccount(), context.getCaller().getId()));
+        }
+        return result;
+    }
+
+    
+    @Override
+    public boolean isReady(PhysicalNetworkServiceProvider provider) {
+        VirtualRouterProviderVO element = _vrProviderDao.findByNspIdAndType(provider.getId(), 
+                VirtualRouterProviderType.InternalLbVm);
+        if (element == null) {
+            return false;
+        }
+        return element.isEnabled();
+    }
+
+    
+    @Override
+    public boolean shutdownProviderInstances(PhysicalNetworkServiceProvider provider, ReservationContext context)
+            throws ConcurrentOperationException, ResourceUnavailableException {
+        VirtualRouterProviderVO element = _vrProviderDao.findByNspIdAndType(provider.getId(), 
+                VirtualRouterProviderType.InternalLbVm);
+        if (element == null) {
+            return true;
+        }
+        long elementId = element.getId();
+        List<DomainRouterVO> internalLbVms = _routerDao.listByElementId(elementId);
+        boolean result = true;
+        for (DomainRouterVO internalLbVm : internalLbVms) {
+            result = result && (_internalLbMgr.destroyInternalLbVm(internalLbVm.getId(),
+                    context.getAccount(), context.getCaller().getId()));
+        }
+        _vrProviderDao.remove(elementId);
+        
+        return result;
+    }
+
+    
+    @Override
+    public boolean canEnableIndividualServices() {
+        return true;
+    }
+
+    
+    @Override
+    public boolean verifyServicesCombination(Set<Service> services) {
+        return true;
+    }
+
+    
+    @Override
+    public IpDeployer getIpDeployer(Network network) {
+        return this;
+    }
+
+    
+    @Override
+    public boolean applyLBRules(Network network, List<LoadBalancingRule> rules) throws ResourceUnavailableException {
+        //1) Get Internal LB VMs to destroy
+        Set<Ip> vmsToDestroy = getVmsToDestroy(rules);
+        
+        //2) Get rules to apply
+        Map<Ip, List<LoadBalancingRule>> rulesToApply = getLbRulesToApply(rules);
+        s_logger.debug("Applying " + rulesToApply.size() + " on element " + this.getName());
+
+ 
+        for (Ip sourceIp : rulesToApply.keySet()) {
+            if (vmsToDestroy.contains(sourceIp)) {
+                //2.1 Destroy internal lb vm
+                List<? extends VirtualRouter> vms = _internalLbMgr.findInternalLbVms(network.getId(), sourceIp);
+                if (vms.size() > 0) {
+                    //only one internal lb per IP exists
+                    try {
+                        s_logger.debug("Destroying internal lb vm for ip " + sourceIp.addr() + " as all the rules for this vm are in Revoke state");
+                        return _internalLbMgr.destroyInternalLbVm(vms.get(0).getId(), _accountMgr.getAccount(Account.ACCOUNT_ID_SYSTEM),
+                                _accountMgr.getUserIncludingRemoved(User.UID_SYSTEM).getId());
+                    } catch (ConcurrentOperationException e) {
+                        s_logger.warn("Failed to apply lb rule(s) for ip " + sourceIp.addr() + " on the element " + this.getName() + " due to:", e);
+                        return false;
+                    }
+                }
+            } else {
+                //2.2 Start Internal LB vm per IP address
+                List<? extends VirtualRouter> internalLbVms;
+                try {
+                    DeployDestination dest = new DeployDestination(_configMgr.getZone(network.getDataCenterId()), null, null, null); 
+                    internalLbVms = _internalLbMgr.deployInternalLbVm(network, sourceIp, dest, _accountMgr.getAccount(network.getAccountId()), null);
+                } catch (InsufficientCapacityException e) {
+                    s_logger.warn("Failed to apply lb rule(s) for ip " + sourceIp.addr() + "on the element " + this.getName() + " due to:", e);
+                    return false;
+                } catch (ConcurrentOperationException e) {
+                    s_logger.warn("Failed to apply lb rule(s) for ip " + sourceIp.addr() + "on the element " + this.getName() + " due to:", e);
+                    return false;
+                }
+                
+                if (internalLbVms == null || internalLbVms.isEmpty()) {
+                    throw new ResourceUnavailableException("Can't find/deploy internal lb vm to handle LB rules",
+                            DataCenter.class, network.getDataCenterId());
+                }
+                 
+                //2.3 Apply Internal LB rules on the VM
+                if (!_internalLbMgr.applyLoadBalancingRules(network, rulesToApply.get(sourceIp), internalLbVms)) {
+                    throw new CloudRuntimeException("Failed to apply load balancing rules for ip " + sourceIp.addr() + 
+                            " in network " + network.getId() + " on element " + this.getName());
+                }
+            }
+        }
+
+        return true;    
+    }
+
+    
+    protected Map<Ip, List<LoadBalancingRule>> getLbRulesToApply(List<LoadBalancingRule> rules) {
+        //Group rules by the source ip address as NetworkManager always passes the entire network lb config to the element
+        Map<Ip, List<LoadBalancingRule>> rulesToApply = groupBySourceIp(rules);
+      
+        return rulesToApply;
+    }
+    
+    
+    protected Set<Ip> getVmsToDestroy(List<LoadBalancingRule> rules) {
+        //1) Group rules by the source ip address as NetworkManager always passes the entire network lb config to the element
+        Map<Ip, List<LoadBalancingRule>> groupedRules = groupBySourceIp(rules);
+
+        //2) Count rules in revoke state
+        Set<Ip> vmsToDestroy = new HashSet<Ip>();
+        
+        for (Ip sourceIp : groupedRules.keySet()) {
+            List<LoadBalancingRule> rulesToCheck = groupedRules.get(sourceIp);
+            int revoke = 0;
+            for (LoadBalancingRule ruleToCheck : rulesToCheck) {
+                if (ruleToCheck.getState() == FirewallRule.State.Revoke){
+                    revoke++;
+                }
+            }
+            
+            if (revoke == rulesToCheck.size()) {
+                s_logger.debug("Have to destroy internal lb vm for source ip " + sourceIp);
+                vmsToDestroy.add(sourceIp);
+            } 
+        }        
+        return vmsToDestroy;
+    }
+
+    
+    protected Map<Ip, List<LoadBalancingRule>> groupBySourceIp(List<LoadBalancingRule> rules) {
+        Map<Ip, List<LoadBalancingRule>> groupedRules = new HashMap<Ip, List<LoadBalancingRule>>();
+        for (LoadBalancingRule rule : rules) {
+            Ip sourceIp = rule.getSourceIp();
+            if (!groupedRules.containsKey(sourceIp)) {
+                groupedRules.put(sourceIp, null);
+            }
+            
+            List<LoadBalancingRule> rulesToApply = groupedRules.get(sourceIp);
+            if (rulesToApply == null) {
+                rulesToApply = new ArrayList<LoadBalancingRule>();
+            }
+            rulesToApply.add(rule);
+            groupedRules.put(sourceIp, rulesToApply);
+        }
+        return groupedRules;
+    }
+
+    @Override
+    public boolean validateLBRule(Network network, LoadBalancingRule rule) {
+        List<LoadBalancingRule> rules = new ArrayList<LoadBalancingRule>();
+        rules.add(rule);
+        if (canHandle(network, rule.getScheme())) {
+            List<DomainRouterVO> routers = _routerDao.listByNetworkAndRole(network.getId(), Role.INTERNAL_LB_VM);
+            if (routers == null || routers.isEmpty()) {
+                return true;
+            }
+            return VirtualRouterElement.validateHAProxyLBRule(rule);
+        }
+        return true;
+    }
+
+    @Override
+    public List<LoadBalancerTO> updateHealthChecks(Network network, List<LoadBalancingRule> lbrules) {
+        return null;
+    }
+    
+    private static Map<Service, Map<Capability, String>> setCapabilities() {
+        Map<Service, Map<Capability, String>> capabilities = new HashMap<Service, Map<Capability, String>>();
+
+        // Set capabilities for LB service
+        Map<Capability, String> lbCapabilities = new HashMap<Capability, String>();
+        lbCapabilities.put(Capability.SupportedLBAlgorithms, "roundrobin,leastconn,source");
+        lbCapabilities.put(Capability.SupportedLBIsolation, "dedicated");
+        lbCapabilities.put(Capability.SupportedProtocols, "tcp, udp");
+        lbCapabilities.put(Capability.SupportedStickinessMethods, VirtualRouterElement.getHAProxyStickinessCapability());
+        lbCapabilities.put(Capability.LbSchemes, LoadBalancerContainer.Scheme.Internal.toString());
+
+        capabilities.put(Service.Lb, lbCapabilities);
+        return capabilities;
+    }
+
+    @Override
+    public List<Class<?>> getCommands() {
+        List<Class<?>> cmdList = new ArrayList<Class<?>>();
+        cmdList.add(CreateInternalLoadBalancerElementCmd.class);
+        cmdList.add(ConfigureInternalLoadBalancerElementCmd.class);
+        cmdList.add(ListInternalLoadBalancerElementsCmd.class);
+        return cmdList;
+    }
+
+    @Override
+    public VirtualRouterProvider configureInternalLoadBalancerElement(long id, boolean enable) {
+        VirtualRouterProviderVO element = _vrProviderDao.findById(id);
+        if (element == null || element.getType() != VirtualRouterProviderType.InternalLbVm) {
+            throw new InvalidParameterValueException("Can't find " + this.getName() + " element with network service provider id " + id +
+                    " to be used as a provider for " + this.getName());
+        }
+
+        element.setEnabled(enable);
+        element = _vrProviderDao.persist(element);
+
+        return element;
+    }
+
+    @Override
+    public VirtualRouterProvider addInternalLoadBalancerElement(long ntwkSvcProviderId) {
+        VirtualRouterProviderVO element = _vrProviderDao.findByNspIdAndType(ntwkSvcProviderId, VirtualRouterProviderType.InternalLbVm);
+        if (element != null) {
+            s_logger.debug("There is already an " + this.getName() + " with service provider id " + ntwkSvcProviderId);
+            return null;
+        }
+        
+        PhysicalNetworkServiceProvider provider = _pNtwkSvcProviderDao.findById(ntwkSvcProviderId);
+        if (provider == null || !provider.getProviderName().equalsIgnoreCase(this.getName())) {
+            throw new InvalidParameterValueException("Invalid network service provider is specified");
+        }
+        
+        element = new VirtualRouterProviderVO(ntwkSvcProviderId, VirtualRouterProviderType.InternalLbVm);
+        element = _vrProviderDao.persist(element);
+        return element;
+    }
+
+    
+    @Override
+    public VirtualRouterProvider getInternalLoadBalancerElement(long id) {
+        VirtualRouterProvider provider = _vrProviderDao.findById(id);
+        if (provider == null || provider.getType() != VirtualRouterProviderType.InternalLbVm) {
+            throw new InvalidParameterValueException("Unable to find " + this.getName() + " by id");
+        }
+        return provider;
+    }
+
+    @Override
+    public List<? extends VirtualRouterProvider> searchForInternalLoadBalancerElements(Long id, Long ntwkSvsProviderId, Boolean enabled) {
+
+        SearchCriteriaService<VirtualRouterProviderVO, VirtualRouterProviderVO> sc = SearchCriteria2.create(VirtualRouterProviderVO.class);
+        if (id != null) {
+            sc.addAnd(sc.getEntity().getId(), Op.EQ, id);
+        }
+        if (ntwkSvsProviderId != null) {
+            sc.addAnd(sc.getEntity().getNspId(), Op.EQ, ntwkSvsProviderId);
+        }
+        if (enabled != null) {
+            sc.addAnd(sc.getEntity().isEnabled(), Op.EQ, enabled);
+        }
+        
+        //return only Internal LB elements
+        sc.addAnd(sc.getEntity().getType(), Op.EQ, VirtualRouterProvider.VirtualRouterProviderType.InternalLbVm);
+        
+        return sc.list();
+    }
+
+    @Override
+    public boolean applyIps(Network network, List<? extends PublicIpAddress> ipAddress, Set<Service> services) throws ResourceUnavailableException {
+        //do nothing here; this element just has to extend the ip deployer
+        //as the LB service implements IPDeployerRequester
+        return true;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2660a6b7/plugins/network-elements/internal-loadbalancer/src/org/apache/cloudstack/network/lb/InternalLoadBalancerVMManager.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/internal-loadbalancer/src/org/apache/cloudstack/network/lb/InternalLoadBalancerVMManager.java b/plugins/network-elements/internal-loadbalancer/src/org/apache/cloudstack/network/lb/InternalLoadBalancerVMManager.java
new file mode 100644
index 0000000..9faca56
--- /dev/null
+++ b/plugins/network-elements/internal-loadbalancer/src/org/apache/cloudstack/network/lb/InternalLoadBalancerVMManager.java
@@ -0,0 +1,90 @@
+// 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 org.apache.cloudstack.network.lb;
+
+import java.util.List;
+import java.util.Map;
+
+import com.cloud.deploy.DeployDestination;
+import com.cloud.exception.ConcurrentOperationException;
+import com.cloud.exception.InsufficientCapacityException;
+import com.cloud.exception.ResourceUnavailableException;
+import com.cloud.network.Network;
+import com.cloud.network.lb.LoadBalancingRule;
+import com.cloud.network.router.VirtualRouter;
+import com.cloud.user.Account;
+import com.cloud.utils.component.Manager;
+import com.cloud.utils.net.Ip;
+import com.cloud.vm.VirtualMachineProfile.Param;
+
+public interface InternalLoadBalancerVMManager extends Manager, InternalLoadBalancerVMService{
+    //RAM/CPU for the system offering used by Internal LB VMs
+    public static final int DEFAULT_INTERNALLB_VM_RAMSIZE = 128;            // 128 MB
+    public static final int DEFAULT_INTERNALLB_VM_CPU_MHZ = 256;            // 256 MHz
+    
+    /**
+     * Destroys Internal LB vm instance
+     * @param vmId
+     * @param caller
+     * @param callerUserId
+     * @return 
+     * @throws ResourceUnavailableException
+     * @throws ConcurrentOperationException
+     */
+    boolean destroyInternalLbVm(long vmId, Account caller, Long callerUserId) 
+            throws ResourceUnavailableException, ConcurrentOperationException;
+
+
+    /**
+     * Deploys internal lb vm
+     * @param guestNetwork
+     * @param requestedGuestIp
+     * @param dest
+     * @param owner
+     * @param params
+     * @return
+     * @throws InsufficientCapacityException
+     * @throws ConcurrentOperationException
+     * @throws ResourceUnavailableException
+     */
+    List<? extends VirtualRouter> deployInternalLbVm(Network guestNetwork, Ip requestedGuestIp, DeployDestination dest, Account owner,
+            Map<Param, Object> params) throws InsufficientCapacityException,
+            ConcurrentOperationException, ResourceUnavailableException;
+
+
+
+    /**
+     * 
+     * @param network
+     * @param rules
+     * @param internalLbVms
+     * @return
+     * @throws ResourceUnavailableException
+     */
+    boolean applyLoadBalancingRules(Network network, List<LoadBalancingRule> rules, List<? extends VirtualRouter> internalLbVms)
+            throws ResourceUnavailableException;
+
+
+    /**
+     * Returns existing Internal Load Balancer elements based on guestNetworkId (required) and requestedIp (optional)
+     * @param guestNetworkId
+     * @param requestedGuestIp
+     * @return
+     */
+    List<? extends VirtualRouter> findInternalLbVms(long guestNetworkId, Ip requestedGuestIp);
+
+}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2660a6b7/plugins/network-elements/internal-loadbalancer/src/org/apache/cloudstack/network/lb/InternalLoadBalancerVMManagerImpl.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/internal-loadbalancer/src/org/apache/cloudstack/network/lb/InternalLoadBalancerVMManagerImpl.java b/plugins/network-elements/internal-loadbalancer/src/org/apache/cloudstack/network/lb/InternalLoadBalancerVMManagerImpl.java
new file mode 100644
index 0000000..fe32a7b
--- /dev/null
+++ b/plugins/network-elements/internal-loadbalancer/src/org/apache/cloudstack/network/lb/InternalLoadBalancerVMManagerImpl.java
@@ -0,0 +1,951 @@
+// 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 org.apache.cloudstack.network.lb;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import javax.ejb.Local;
+import javax.inject.Inject;
+import javax.naming.ConfigurationException;
+
+import org.apache.cloudstack.lb.ApplicationLoadBalancerRuleVO;
+import org.apache.cloudstack.lb.dao.ApplicationLoadBalancerRuleDao;
+import org.apache.log4j.Logger;
+import org.springframework.stereotype.Component;
+
+import com.cloud.agent.AgentManager;
+import com.cloud.agent.AgentManager.OnError;
+import com.cloud.agent.api.Answer;
+import com.cloud.agent.api.GetDomRVersionAnswer;
+import com.cloud.agent.api.GetDomRVersionCmd;
+import com.cloud.agent.api.StopAnswer;
+import com.cloud.agent.api.check.CheckSshAnswer;
+import com.cloud.agent.api.check.CheckSshCommand;
+import com.cloud.agent.api.routing.LoadBalancerConfigCommand;
+import com.cloud.agent.api.routing.NetworkElementCommand;
+import com.cloud.agent.api.to.LoadBalancerTO;
+import com.cloud.agent.api.to.NicTO;
+import com.cloud.agent.api.to.VirtualMachineTO;
+import com.cloud.agent.manager.Commands;
+import com.cloud.configuration.Config;
+import com.cloud.configuration.dao.ConfigurationDao;
+import com.cloud.dc.DataCenter;
+import com.cloud.dc.DataCenterVO;
+import com.cloud.dc.dao.DataCenterDao;
+import com.cloud.deploy.DataCenterDeployment;
+import com.cloud.deploy.DeployDestination;
+import com.cloud.deploy.DeploymentPlan;
+import com.cloud.exception.AgentUnavailableException;
+import com.cloud.exception.ConcurrentOperationException;
+import com.cloud.exception.InsufficientAddressCapacityException;
+import com.cloud.exception.InsufficientCapacityException;
+import com.cloud.exception.InsufficientServerCapacityException;
+import com.cloud.exception.InvalidParameterValueException;
+import com.cloud.exception.OperationTimedoutException;
+import com.cloud.exception.ResourceUnavailableException;
+import com.cloud.exception.StorageUnavailableException;
+import com.cloud.hypervisor.Hypervisor.HypervisorType;
+import com.cloud.network.Network;
+import com.cloud.network.Network.Provider;
+import com.cloud.network.Network.Service;
+import com.cloud.network.NetworkManager;
+import com.cloud.network.NetworkModel;
+import com.cloud.network.Networks.TrafficType;
+import com.cloud.network.PhysicalNetworkServiceProvider;
+import com.cloud.network.VirtualRouterProvider;
+import com.cloud.network.VirtualRouterProvider.VirtualRouterProviderType;
+import com.cloud.network.dao.NetworkDao;
+import com.cloud.network.dao.NetworkVO;
+import com.cloud.network.dao.PhysicalNetworkServiceProviderDao;
+import com.cloud.network.dao.VirtualRouterProviderDao;
+import com.cloud.network.lb.LoadBalancingRule;
+import com.cloud.network.lb.LoadBalancingRule.LbDestination;
+import com.cloud.network.lb.LoadBalancingRule.LbHealthCheckPolicy;
+import com.cloud.network.lb.LoadBalancingRule.LbStickinessPolicy;
+import com.cloud.network.lb.LoadBalancingRulesManager;
+import com.cloud.network.router.VirtualRouter;
+import com.cloud.network.router.VirtualRouter.RedundantState;
+import com.cloud.network.router.VirtualRouter.Role;
+import com.cloud.network.rules.FirewallRule;
+import com.cloud.offering.NetworkOffering;
+import com.cloud.offering.ServiceOffering;
+import com.cloud.offerings.dao.NetworkOfferingDao;
+import com.cloud.resource.ResourceManager;
+import com.cloud.server.ConfigurationServer;
+import com.cloud.service.ServiceOfferingVO;
+import com.cloud.service.dao.ServiceOfferingDao;
+import com.cloud.storage.VMTemplateVO;
+import com.cloud.storage.dao.VMTemplateDao;
+import com.cloud.user.Account;
+import com.cloud.user.AccountManager;
+import com.cloud.user.User;
+import com.cloud.utils.Pair;
+import com.cloud.utils.component.ManagerBase;
+import com.cloud.utils.db.DB;
+import com.cloud.utils.exception.CloudRuntimeException;
+import com.cloud.utils.net.Ip;
+import com.cloud.utils.net.NetUtils;
+import com.cloud.vm.DomainRouterVO;
+import com.cloud.vm.Nic;
+import com.cloud.vm.NicProfile;
+import com.cloud.vm.NicVO;
+import com.cloud.vm.ReservationContext;
+import com.cloud.vm.VirtualMachine;
+import com.cloud.vm.VirtualMachine.State;
+import com.cloud.vm.VirtualMachineGuru;
+import com.cloud.vm.VirtualMachineManager;
+import com.cloud.vm.VirtualMachineName;
+import com.cloud.vm.VirtualMachineProfile;
+import com.cloud.vm.VirtualMachineProfile.Param;
+import com.cloud.vm.dao.DomainRouterDao;
+import com.cloud.vm.dao.NicDao;
+
+@Component
+@Local(value = { InternalLoadBalancerVMManager.class, InternalLoadBalancerVMService.class})
+public class InternalLoadBalancerVMManagerImpl extends ManagerBase implements
+    InternalLoadBalancerVMManager, VirtualMachineGuru<DomainRouterVO> {
+    private static final Logger s_logger = Logger
+            .getLogger(InternalLoadBalancerVMManagerImpl.class);
+    static final private String _internalLbVmNamePrefix = "b";
+    
+    private String _instance;
+    private String _mgmtHost;
+    private String _mgmtCidr;
+    private long _internalLbVmOfferingId;
+    
+    @Inject VirtualMachineManager _itMgr;
+    @Inject DomainRouterDao _internalLbVmDao;
+    @Inject ConfigurationDao _configDao;
+    @Inject AgentManager _agentMgr;
+    @Inject DataCenterDao _dcDao;
+    @Inject VirtualRouterProviderDao _vrProviderDao;
+    @Inject ApplicationLoadBalancerRuleDao _lbDao;
+    @Inject NetworkModel _ntwkModel;
+    @Inject LoadBalancingRulesManager _lbMgr;
+    @Inject NicDao _nicDao;
+    @Inject AccountManager _accountMgr;
+    @Inject NetworkDao _networkDao;
+    @Inject NetworkManager _ntwkMgr;
+    @Inject ServiceOfferingDao _serviceOfferingDao;
+    @Inject PhysicalNetworkServiceProviderDao _physicalProviderDao;
+    @Inject NetworkOfferingDao _networkOfferingDao;
+    @Inject VMTemplateDao _templateDao;
+    @Inject ResourceManager _resourceMgr;
+    @Inject ConfigurationServer _configServer;
+
+    @Override
+    public DomainRouterVO findByName(String name) {
+        if (!VirtualMachineName.isValidSystemVmName(name, _instance, _internalLbVmNamePrefix)) {
+            return null;
+        }
+
+        return _internalLbVmDao.findById(VirtualMachineName.getRouterId(name));
+    }
+
+    @Override
+    public DomainRouterVO findById(long id) {
+        return _internalLbVmDao.findById(id);
+    }
+
+    @Override
+    public DomainRouterVO persist(DomainRouterVO vm) {
+        DomainRouterVO virtualRouter =  _internalLbVmDao.persist(vm);
+        return virtualRouter;
+    }
+
+    @Override
+    public boolean finalizeVirtualMachineProfile(VirtualMachineProfile<DomainRouterVO> profile,
+            DeployDestination dest, ReservationContext context) {
+
+        //Internal LB vm starts up with 2 Nics
+        //Nic #1 - Guest Nic with IP address that would act as the LB entry point
+        //Nic #2 - Control/Management Nic
+        
+        StringBuilder buf = profile.getBootArgsBuilder();
+        buf.append(" template=domP");
+        buf.append(" name=").append(profile.getHostName());
+
+        if (Boolean.valueOf(_configDao.getValue("system.vm.random.password"))) {
+            buf.append(" vmpassword=").append(_configDao.getValue("system.vm.password"));
+        }
+        
+        NicProfile controlNic = null;
+        Network guestNetwork = null;
+      
+        for (NicProfile nic : profile.getNics()) {
+            int deviceId = nic.getDeviceId();
+            buf.append(" eth").append(deviceId).append("ip=").append(nic.getIp4Address());
+            buf.append(" eth").append(deviceId).append("mask=").append(nic.getNetmask());
+            
+            if (nic.isDefaultNic()) {
+                buf.append(" gateway=").append(nic.getGateway());
+                buf.append(" dns1=").append(nic.getGateway());
+            }
+
+            if (nic.getTrafficType() == TrafficType.Guest) {
+                guestNetwork = _ntwkModel.getNetwork(nic.getNetworkId());
+            } else if (nic.getTrafficType() == TrafficType.Management) {
+                buf.append(" localgw=").append(dest.getPod().getGateway());
+            } else if (nic.getTrafficType() == TrafficType.Control) {
+                controlNic = nic;
+                // Internal LB control command is sent over management server in VMware
+                if (dest.getHost().getHypervisorType() == HypervisorType.VMware) {
+                    if (s_logger.isInfoEnabled()) {
+                        s_logger.info("Check if we need to add management server explicit route to Internal LB. pod cidr: " 
+                                + dest.getPod().getCidrAddress() + "/" + dest.getPod().getCidrSize()
+                                + ", pod gateway: " + dest.getPod().getGateway() + ", management host: " + _mgmtHost);
+                    }
+
+                    if (s_logger.isInfoEnabled()) {
+                        s_logger.info("Add management server explicit route to Internal LB.");
+                    }
+                    
+               
+                    buf.append(" mgmtcidr=").append(_mgmtCidr);
+                    buf.append(" localgw=").append(dest.getPod().getGateway());
+                }
+            }
+        }
+
+        if (controlNic == null) {
+            throw new CloudRuntimeException("Didn't start a control port");
+        }
+                
+        if (guestNetwork != null) {
+            String domain = guestNetwork.getNetworkDomain();
+            if (domain != null) {
+                buf.append(" domain=" + domain);
+            }
+        }
+
+        String type = "ilbvm";
+        buf.append(" type=" + type);
+
+        if (s_logger.isDebugEnabled()) {
+            s_logger.debug("Boot Args for " + profile + ": " + buf.toString());
+        }
+
+        return true;
+    }
+
+    @Override
+    public boolean finalizeDeployment(Commands cmds, VirtualMachineProfile<DomainRouterVO> profile, DeployDestination dest, ReservationContext context) throws ResourceUnavailableException {
+        DomainRouterVO internalLbVm = profile.getVirtualMachine();
+
+        List<NicProfile> nics = profile.getNics();
+        for (NicProfile nic : nics) {
+            if (nic.getTrafficType() == TrafficType.Control) {
+                internalLbVm.setPrivateIpAddress(nic.getIp4Address());
+                internalLbVm.setPrivateMacAddress(nic.getMacAddress());
+            }
+        }
+        _internalLbVmDao.update(internalLbVm.getId(), internalLbVm);
+
+        finalizeCommandsOnStart(cmds, profile);
+        return true;
+    }
+
+    @Override
+    public boolean finalizeStart(VirtualMachineProfile<DomainRouterVO> profile, long hostId, Commands cmds, ReservationContext context) {
+        DomainRouterVO internalLbVm = profile.getVirtualMachine();
+        
+        boolean result = true;
+
+        Answer answer = cmds.getAnswer("checkSsh");
+        if (answer != null && answer instanceof CheckSshAnswer) {
+            CheckSshAnswer sshAnswer = (CheckSshAnswer) answer;
+            if (sshAnswer == null || !sshAnswer.getResult()) {
+                s_logger.warn("Unable to ssh to the internal LB VM: " + sshAnswer.getDetails());
+                result = false;
+            }
+        } else {
+            result = false;
+        }
+        if (result == false) {
+            return result;
+        }
+        
+        //Get guest network info
+        List<Network> guestNetworks = new ArrayList<Network>();
+        List<? extends Nic> internalLbVmNics = _nicDao.listByVmId(profile.getId());
+        for (Nic internalLbVmNic : internalLbVmNics) {
+            Network network = _ntwkModel.getNetwork(internalLbVmNic.getNetworkId());
+            if (network.getTrafficType() == TrafficType.Guest) {
+                guestNetworks.add(network);
+            }
+        }
+        
+        answer = cmds.getAnswer("getDomRVersion");
+        if (answer != null && answer instanceof GetDomRVersionAnswer) {
+            GetDomRVersionAnswer versionAnswer = (GetDomRVersionAnswer)answer;
+            if (answer == null || !answer.getResult()) {
+                s_logger.warn("Unable to get the template/scripts version of internal LB VM " + internalLbVm.getInstanceName() +
+                        " due to: " + versionAnswer.getDetails());
+                result = false;
+            } else {
+                internalLbVm.setTemplateVersion(versionAnswer.getTemplateVersion());
+                internalLbVm.setScriptsVersion(versionAnswer.getScriptsVersion());
+                internalLbVm = _internalLbVmDao.persist(internalLbVm, guestNetworks);
+            }
+        } else {
+            result = false;
+        }
+
+        return result;
+    }
+
+    @Override
+    public boolean finalizeCommandsOnStart(Commands cmds, VirtualMachineProfile<DomainRouterVO> profile) {
+        DomainRouterVO internalLbVm = profile.getVirtualMachine();
+        NicProfile controlNic = getNicProfileByTrafficType(profile, TrafficType.Control);
+
+        if (controlNic == null) {
+            s_logger.error("Control network doesn't exist for the internal LB vm " + internalLbVm);
+            return false;
+        }
+
+        finalizeSshAndVersionOnStart(cmds, profile, internalLbVm, controlNic);
+
+        // restart network if restartNetwork = false is not specified in profile parameters
+        boolean reprogramGuestNtwk = true;
+        if (profile.getParameter(Param.ReProgramGuestNetworks) != null 
+                && (Boolean) profile.getParameter(Param.ReProgramGuestNetworks) == false) {
+            reprogramGuestNtwk = false;
+        }
+
+        VirtualRouterProvider lbProvider = _vrProviderDao.findById(internalLbVm.getElementId());
+        if (lbProvider == null) {
+            throw new CloudRuntimeException("Cannot find related element " + VirtualRouterProviderType.InternalLbVm + " of vm: " + internalLbVm.getHostName());
+        }
+        
+        Provider provider = Network.Provider.getProvider(lbProvider.getType().toString());
+        if (provider == null) {
+            throw new CloudRuntimeException("Cannot find related provider of provider: " + lbProvider.getType().toString());
+        }
+
+        if (reprogramGuestNtwk) {
+            NicProfile guestNic = getNicProfileByTrafficType(profile, TrafficType.Guest);
+            finalizeLbRulesForIp(cmds, internalLbVm, provider, new Ip(guestNic.getIp4Address()), guestNic.getNetworkId());
+        }
+
+        return true;
+    }
+
+    @Override
+    public void finalizeStop(VirtualMachineProfile<DomainRouterVO> profile, StopAnswer answer) {
+    }
+
+    @Override
+    public void finalizeExpunge(DomainRouterVO vm) {
+    }
+
+    @Override
+    public Long convertToId(String vmName) {
+        if (!VirtualMachineName.isValidSystemVmName(vmName, _instance, _internalLbVmNamePrefix)) {
+            return null;
+        }
+
+        return VirtualMachineName.getRouterId(vmName);
+    }
+
+    @Override
+    public boolean plugNic(Network network, NicTO nic, VirtualMachineTO vm, ReservationContext context, DeployDestination dest) throws ConcurrentOperationException, ResourceUnavailableException,
+            InsufficientCapacityException {        
+        //not supported
+        throw new UnsupportedOperationException("Plug nic is not supported for vm of type " + vm.getType());
+    }
+
+    @Override
+    public boolean unplugNic(Network network, NicTO nic, VirtualMachineTO vm, ReservationContext context, DeployDestination dest) throws ConcurrentOperationException, ResourceUnavailableException {
+        //not supported
+        throw new UnsupportedOperationException("Unplug nic is not supported for vm of type " + vm.getType());
+    }
+
+    @Override
+    public void prepareStop(VirtualMachineProfile<DomainRouterVO> profile) {
+    }
+    
+    @Override
+    public boolean configure(String name, Map<String, Object> params) throws ConfigurationException {
+        final Map<String, String> configs = _configDao.getConfiguration("AgentManager", params);
+        _instance = configs.get("instance.name");
+        if (_instance == null) {
+            _instance = "DEFAULT";
+        }
+        
+        _mgmtHost = configs.get("host");
+        _mgmtCidr = _configDao.getValue(Config.ManagementNetwork.key());
+        
+        String offIdStr = configs.get(Config.InternalLbVmServiceOfferingId.key());
+        if (offIdStr != null && !offIdStr.isEmpty()) {
+            _internalLbVmOfferingId = Long.parseLong(offIdStr);
+        } else {
+            boolean useLocalStorage = Boolean.parseBoolean(configs.get(Config.SystemVMUseLocalStorage.key()));
+            ServiceOfferingVO newOff = new ServiceOfferingVO("System Offering For Internal LB VM", 1, InternalLoadBalancerVMManager.DEFAULT_INTERNALLB_VM_RAMSIZE, InternalLoadBalancerVMManager.DEFAULT_INTERNALLB_VM_CPU_MHZ, null,
+                    null, true, null, useLocalStorage, true, null, true, VirtualMachine.Type.InternalLoadBalancerVm, true);
+            newOff.setUniqueName(ServiceOffering.internalLbVmDefaultOffUniqueName);
+            newOff = _serviceOfferingDao.persistSystemServiceOffering(newOff);
+            _internalLbVmOfferingId = newOff.getId();
+        }
+        
+        _itMgr.registerGuru(VirtualMachine.Type.InternalLoadBalancerVm, this);
+
+        if (s_logger.isInfoEnabled()) {
+            s_logger.info(getName()  +  " has been configured");
+        }
+        
+        return true;
+    }
+    
+    @Override
+    public String getName() {
+        return _name;
+    }
+    
+    protected NicProfile getNicProfileByTrafficType(VirtualMachineProfile<DomainRouterVO> profile, TrafficType trafficType) {
+        for (NicProfile nic : profile.getNics()) {
+            if (nic.getTrafficType() == trafficType && nic.getIp4Address() != null) {
+                return nic;
+            }
+        }
+        return null;
+     }
+    
+    protected void finalizeSshAndVersionOnStart(Commands cmds, VirtualMachineProfile<DomainRouterVO> profile, DomainRouterVO router, NicProfile controlNic) {
+        cmds.addCommand("checkSsh", new CheckSshCommand(profile.getInstanceName(), controlNic.getIp4Address(), 3922));
+
+        // Update internal lb vm template/scripts version
+        final GetDomRVersionCmd command = new GetDomRVersionCmd();
+        command.setAccessDetail(NetworkElementCommand.ROUTER_IP, controlNic.getIp4Address());
+        command.setAccessDetail(NetworkElementCommand.ROUTER_NAME, router.getInstanceName());
+        cmds.addCommand("getDomRVersion", command);
+    }
+    
+    
+    protected void finalizeLbRulesForIp(Commands cmds, DomainRouterVO internalLbVm, Provider provider, Ip sourceIp, long guestNtwkId) {
+        s_logger.debug("Resending load balancing rules as a part of start for " + internalLbVm);
+        List<ApplicationLoadBalancerRuleVO> lbs = _lbDao.listBySrcIpSrcNtwkId(sourceIp, guestNtwkId);
+        List<LoadBalancingRule> lbRules = new ArrayList<LoadBalancingRule>();
+        if (_ntwkModel.isProviderSupportServiceInNetwork(guestNtwkId, Service.Lb, provider)) {
+            // Re-apply load balancing rules
+            for (ApplicationLoadBalancerRuleVO lb : lbs) {
+                List<LbDestination> dstList = _lbMgr.getExistingDestinations(lb.getId());
+                List<LbStickinessPolicy> policyList = _lbMgr.getStickinessPolicies(lb.getId());
+                List<LbHealthCheckPolicy> hcPolicyList = _lbMgr.getHealthCheckPolicies(lb.getId());
+                LoadBalancingRule loadBalancing = new LoadBalancingRule(lb, dstList, policyList, hcPolicyList, sourceIp);
+                lbRules.add(loadBalancing);
+            }
+        }
+
+        s_logger.debug("Found " + lbRules.size() + " load balancing rule(s) to apply as a part of Intenrnal LB vm" + internalLbVm + " start.");
+        if (!lbRules.isEmpty()) {
+            createApplyLoadBalancingRulesCommands(lbRules, internalLbVm, cmds, guestNtwkId);
+        }
+    }
+    
+    private void createApplyLoadBalancingRulesCommands(List<LoadBalancingRule> rules, VirtualRouter internalLbVm, Commands cmds, long guestNetworkId) {
+
+        LoadBalancerTO[] lbs = new LoadBalancerTO[rules.size()];
+        int i = 0;
+        boolean inline = false;
+        for (LoadBalancingRule rule : rules) {
+            boolean revoked = (rule.getState().equals(FirewallRule.State.Revoke));
+            String protocol = rule.getProtocol();
+            String algorithm = rule.getAlgorithm();
+            String uuid = rule.getUuid();
+
+            String srcIp = rule.getSourceIp().addr();
+            int srcPort = rule.getSourcePortStart();
+            List<LbDestination> destinations = rule.getDestinations();
+            List<LbStickinessPolicy> stickinessPolicies = rule.getStickinessPolicies();
+            LoadBalancerTO lb = new LoadBalancerTO(uuid, srcIp, srcPort, protocol, algorithm, revoked, false, inline, destinations, stickinessPolicies);
+            lbs[i++] = lb;
+        }
+        
+        Network guestNetwork = _ntwkModel.getNetwork(guestNetworkId);
+        Nic guestNic = _nicDao.findByNtwkIdAndInstanceId(guestNetwork.getId(), internalLbVm.getId());
+        NicProfile guestNicProfile = new NicProfile(guestNic, guestNetwork, guestNic.getBroadcastUri(), guestNic.getIsolationUri(), 
+                _ntwkModel.getNetworkRate(guestNetwork.getId(), internalLbVm.getId()), 
+                _ntwkModel.isSecurityGroupSupportedInNetwork(guestNetwork), 
+                _ntwkModel.getNetworkTag(internalLbVm.getHypervisorType(), guestNetwork));
+
+        LoadBalancerConfigCommand cmd = new LoadBalancerConfigCommand(lbs, guestNic.getIp4Address(), 
+                guestNic.getIp4Address(), internalLbVm.getPrivateIpAddress(), 
+                _itMgr.toNicTO(guestNicProfile, internalLbVm.getHypervisorType()), internalLbVm.getVpcId());
+
+        cmd.lbStatsVisibility = _configDao.getValue(Config.NetworkLBHaproxyStatsVisbility.key());
+        cmd.lbStatsUri = _configDao.getValue(Config.NetworkLBHaproxyStatsUri.key());
+        cmd.lbStatsAuth = _configDao.getValue(Config.NetworkLBHaproxyStatsAuth.key());
+        cmd.lbStatsPort = _configDao.getValue(Config.NetworkLBHaproxyStatsPort.key());
+
+        cmd.setAccessDetail(NetworkElementCommand.ROUTER_IP, getInternalLbControlIp(internalLbVm.getId()));
+        cmd.setAccessDetail(NetworkElementCommand.ROUTER_GUEST_IP, guestNic.getIp4Address());
+        cmd.setAccessDetail(NetworkElementCommand.ROUTER_NAME, internalLbVm.getInstanceName());
+        DataCenterVO dcVo = _dcDao.findById(internalLbVm.getDataCenterId());
+        cmd.setAccessDetail(NetworkElementCommand.ZONE_NETWORK_TYPE, dcVo.getNetworkType().toString());
+        cmds.addCommand(cmd);
+    }
+    
+    
+    protected String getInternalLbControlIp(long internalLbVmId) {
+        String controlIpAddress = null;
+        List<NicVO> nics = _nicDao.listByVmId(internalLbVmId);
+        for (NicVO nic : nics) {
+            Network ntwk = _ntwkModel.getNetwork(nic.getNetworkId());
+            if (ntwk.getTrafficType() == TrafficType.Control) {
+                controlIpAddress = nic.getIp4Address();
+            }
+        }
+        
+        if(controlIpAddress == null) {
+            s_logger.warn("Unable to find Internal LB control ip in its attached NICs!. Internal LB vm: " + internalLbVmId);
+            DomainRouterVO internalLbVm = _internalLbVmDao.findById(internalLbVmId);
+            return internalLbVm.getPrivateIpAddress();
+        }
+            
+        return controlIpAddress;
+    }
+
+    @Override
+    public boolean destroyInternalLbVm(long vmId, Account caller, Long callerUserId)
+            throws ResourceUnavailableException, ConcurrentOperationException {
+        if (s_logger.isDebugEnabled()) {
+            s_logger.debug("Attempting to destroy Internal LB vm " + vmId);
+        }
+
+        DomainRouterVO internalLbVm = _internalLbVmDao.findById(vmId);
+        if (internalLbVm == null) {
+            return true;
+        }
+
+        _accountMgr.checkAccess(caller, null, true, internalLbVm);
+
+        return _itMgr.expunge(internalLbVm, _accountMgr.getActiveUser(callerUserId), caller); 
+    }
+
+    
+    @Override
+    public VirtualRouter stopInternalLbVm(long vmId, boolean forced, Account caller, long callerUserId) throws ConcurrentOperationException,
+    ResourceUnavailableException {
+        DomainRouterVO internalLbVm = _internalLbVmDao.findById(vmId);
+        if (internalLbVm == null || internalLbVm.getRole() != Role.INTERNAL_LB_VM) {
+            throw new InvalidParameterValueException("Can't find internal lb vm by id specified");
+        }
+        
+        return stopInternalLbVm(internalLbVm, forced, caller, callerUserId);
+    }
+
+    protected VirtualRouter stopInternalLbVm(DomainRouterVO internalLbVm, boolean forced, Account caller, long callerUserId) throws ResourceUnavailableException, ConcurrentOperationException {
+        s_logger.debug("Stopping internal lb vm " + internalLbVm);
+        try {
+            if (_itMgr.advanceStop((DomainRouterVO) internalLbVm, forced, _accountMgr.getActiveUser(callerUserId), caller)) {
+                return _internalLbVmDao.findById(internalLbVm.getId());
+            } else {
+                return null;
+            }
+        } catch (OperationTimedoutException e) {
+            throw new CloudRuntimeException("Unable to stop " + internalLbVm, e);
+        }
+    }
+    
+    
+    @Override
+    public List<DomainRouterVO> deployInternalLbVm(Network guestNetwork, Ip requestedGuestIp, DeployDestination dest, 
+            Account owner, Map<Param, Object> params) throws InsufficientCapacityException,
+            ConcurrentOperationException, ResourceUnavailableException {
+
+        List<DomainRouterVO> internalLbVms = findOrDeployInternalLbVm(guestNetwork, requestedGuestIp, dest, owner, params);
+        
+        return startInternalLbVms(params, internalLbVms);
+    }
+    
+    protected List<DomainRouterVO> startInternalLbVms(Map<Param, Object> params, List<DomainRouterVO> internalLbVms) 
+            throws StorageUnavailableException, InsufficientCapacityException, ConcurrentOperationException, ResourceUnavailableException {
+        List<DomainRouterVO> runningInternalLbVms = null;
+
+        if (internalLbVms != null) {
+            runningInternalLbVms = new ArrayList<DomainRouterVO>();
+        } else {
+            s_logger.debug("Have no internal lb vms to start");
+            return null;
+        }
+
+        for (DomainRouterVO internalLbVm : internalLbVms) {
+            if (internalLbVm.getState() != VirtualMachine.State.Running) {
+                internalLbVm = startInternalLbVm(internalLbVm, _accountMgr.getSystemAccount(), User.UID_SYSTEM, params);
+            }
+            
+            if (internalLbVm != null) {
+                runningInternalLbVms.add(internalLbVm);
+            }
+        }
+        return runningInternalLbVms;
+    }
+    
+    
+    
+    @DB
+    protected List<DomainRouterVO> findOrDeployInternalLbVm(Network guestNetwork, Ip requestedGuestIp, DeployDestination dest, 
+            Account owner, Map<Param, Object> params) throws ConcurrentOperationException, 
+            InsufficientCapacityException, ResourceUnavailableException {
+
+        List<DomainRouterVO> internalLbVms = new ArrayList<DomainRouterVO>();
+        Network lock = _networkDao.acquireInLockTable(guestNetwork.getId(), _ntwkMgr.getNetworkLockTimeout());
+        if (lock == null) {
+            throw new ConcurrentOperationException("Unable to lock network " + guestNetwork.getId());
+        }
+        
+        if (s_logger.isDebugEnabled()) {
+            s_logger.debug("Lock is acquired for network id " + lock.getId() + " as a part of internal lb startup in " + dest);
+        }
+        
+        long internalLbProviderId = getInternalLbProviderId(guestNetwork);
+        
+        try {
+            assert guestNetwork.getState() == Network.State.Implemented || guestNetwork.getState() == Network.State.Setup ||
+                    guestNetwork.getState() == Network.State.Implementing : "Network is not yet fully implemented: "
+                    + guestNetwork;
+            assert guestNetwork.getTrafficType() == TrafficType.Guest;
+
+            //deploy internal lb vm
+            Pair<DeploymentPlan, List<DomainRouterVO>> planAndInternalLbVms = getDeploymentPlanAndInternalLbVms(dest, guestNetwork.getId(), requestedGuestIp);
+            internalLbVms = planAndInternalLbVms.second();
+            DeploymentPlan plan = planAndInternalLbVms.first();
+            
+            if (internalLbVms.size() > 0) {
+                s_logger.debug("Found " + internalLbVms.size() + " internal lb vms for the requested IP " + requestedGuestIp.addr());
+                return internalLbVms;
+            }
+
+            List<Pair<NetworkVO, NicProfile>> networks = createInternalLbVmNetworks(guestNetwork, plan, requestedGuestIp);
+            //Pass startVm=false as we are holding the network lock that needs to be released at the end of vm allocation
+            DomainRouterVO internalLbVm = deployInternalLbVm(owner, dest, plan, params, internalLbProviderId, _internalLbVmOfferingId, guestNetwork.getVpcId(),
+                networks, false);
+            if (internalLbVm != null) {
+                _internalLbVmDao.addRouterToGuestNetwork(internalLbVm, guestNetwork);
+                internalLbVms.add(internalLbVm);
+            }
+        } finally {
+            if (lock != null) {
+                _networkDao.releaseFromLockTable(lock.getId());
+                if (s_logger.isDebugEnabled()) {
+                    s_logger.debug("Lock is released for network id " + lock.getId() + " as a part of internal lb vm startup in " + dest);
+                }
+            }
+        }
+        return internalLbVms;
+    }
+
+    protected long getInternalLbProviderId(Network guestNetwork) {
+        VirtualRouterProviderType type = VirtualRouterProviderType.InternalLbVm;
+        long physicalNetworkId = _ntwkModel.getPhysicalNetworkId(guestNetwork);
+        
+        PhysicalNetworkServiceProvider provider = _physicalProviderDao.findByServiceProvider(physicalNetworkId, type.toString());
+        if (provider == null) {
+            throw new CloudRuntimeException("Cannot find service provider " + type.toString() + " in physical network " + physicalNetworkId);
+        }
+        
+        VirtualRouterProvider internalLbProvider = _vrProviderDao.findByNspIdAndType(provider.getId(), type);
+        if (internalLbProvider == null) {
+            throw new CloudRuntimeException("Cannot find provider " + type.toString() + " as service provider " + provider.getId());
+        }
+        
+        return internalLbProvider.getId();
+    }
+    
+    protected List<Pair<NetworkVO, NicProfile>> createInternalLbVmNetworks(Network guestNetwork, DeploymentPlan plan, Ip guestIp) throws ConcurrentOperationException,
+            InsufficientAddressCapacityException {
+
+        //Form networks
+        List<Pair<NetworkVO, NicProfile>> networks = new ArrayList<Pair<NetworkVO, NicProfile>>(3);
+        
+        //1) Guest network - default
+        if (guestNetwork != null) {
+            s_logger.debug("Adding nic for Internal LB in Guest network " + guestNetwork);
+            NicProfile guestNic = new NicProfile();
+            if (guestIp != null) {
+                guestNic.setIp4Address(guestIp.addr());  
+            } else {
+                guestNic.setIp4Address(_ntwkMgr.acquireGuestIpAddress(guestNetwork, null));
+            }
+            guestNic.setGateway(guestNetwork.getGateway());
+            guestNic.setBroadcastUri(guestNetwork.getBroadcastUri());
+            guestNic.setBroadcastType(guestNetwork.getBroadcastDomainType());
+            guestNic.setIsolationUri(guestNetwork.getBroadcastUri());
+            guestNic.setMode(guestNetwork.getMode());
+            String gatewayCidr = guestNetwork.getCidr();
+            guestNic.setNetmask(NetUtils.getCidrNetmask(gatewayCidr));
+            guestNic.setDefaultNic(true);
+            networks.add(new Pair<NetworkVO, NicProfile>((NetworkVO) guestNetwork, guestNic));
+        }
+
+        //2) Control network
+        s_logger.debug("Adding nic for Internal LB vm in Control network ");
+        List<? extends NetworkOffering> offerings = _ntwkModel.getSystemAccountNetworkOfferings(NetworkOffering.SystemControlNetwork);
+        NetworkOffering controlOffering = offerings.get(0);
+        NetworkVO controlConfig = _ntwkMgr.setupNetwork(_accountMgr.getSystemAccount(), controlOffering, plan, null, null, false).get(0);
+        networks.add(new Pair<NetworkVO, NicProfile>(controlConfig, null));
+
+        return networks;
+    }
+    
+    
+    protected Pair<DeploymentPlan, List<DomainRouterVO>> getDeploymentPlanAndInternalLbVms(DeployDestination dest, long guestNetworkId, Ip requestedGuestIp) {
+        long dcId = dest.getDataCenter().getId();
+        DeploymentPlan plan = new DataCenterDeployment(dcId);
+        List<DomainRouterVO> internalLbVms = findInternalLbVms(guestNetworkId, requestedGuestIp);
+
+        return new Pair<DeploymentPlan, List<DomainRouterVO>>(plan, internalLbVms);
+    
+    }
+
+    @Override
+    public List<DomainRouterVO> findInternalLbVms(long guestNetworkId, Ip requestedGuestIp) {
+        List<DomainRouterVO> internalLbVms = _internalLbVmDao.listByNetworkAndRole(guestNetworkId, Role.INTERNAL_LB_VM);
+        if (requestedGuestIp != null && !internalLbVms.isEmpty()) {
+            Iterator<DomainRouterVO> it = internalLbVms.iterator();
+            while (it.hasNext()) {
+                DomainRouterVO vm = it.next();
+                Nic nic = _nicDao.findByNtwkIdAndInstanceId(guestNetworkId, vm.getId());
+                if (!nic.getIp4Address().equalsIgnoreCase(requestedGuestIp.addr())) {
+                    it.remove();
+                }
+            }
+        }
+        return internalLbVms;
+    }
+    
+    
+    protected DomainRouterVO deployInternalLbVm(Account owner, DeployDestination dest, DeploymentPlan plan, Map<Param, Object> params,
+            long internalLbProviderId, long svcOffId, Long vpcId,
+            List<Pair<NetworkVO, NicProfile>> networks, boolean startVm) throws ConcurrentOperationException,
+            InsufficientAddressCapacityException, InsufficientServerCapacityException, InsufficientCapacityException,
+            StorageUnavailableException, ResourceUnavailableException {
+        
+        long id = _internalLbVmDao.getNextInSequence(Long.class, "id");
+        if (s_logger.isDebugEnabled()) {
+            s_logger.debug("Creating the internal lb vm " + id + " in datacenter "  + dest.getDataCenter());
+        }
+
+        ServiceOfferingVO routerOffering = _serviceOfferingDao.findById(svcOffId);
+
+        // Internal lb is the network element, we don't know the hypervisor type yet.
+        // Try to allocate the internal lb twice using diff hypervisors, and when failed both times, throw the exception up
+        List<HypervisorType> hypervisors = getHypervisors(dest, plan, null);
+
+        int allocateRetry = 0;
+        int startRetry = 0;
+        DomainRouterVO internalLbVm = null;
+        for (Iterator<HypervisorType> iter = hypervisors.iterator(); iter.hasNext();) {
+            HypervisorType hType = iter.next();
+            try {
+                s_logger.debug("Allocating the Internal lb with the hypervisor type " + hType);
+                String templateName = null;
+                switch (hType) {
+                    case XenServer:
+                        templateName = _configServer.getConfigValue(Config.RouterTemplateXen.key(), Config.ConfigurationParameterScope.zone.toString(), dest.getDataCenter().getId());
+                        break;
+                    case KVM:
+                        templateName = _configServer.getConfigValue(Config.RouterTemplateKVM.key(), Config.ConfigurationParameterScope.zone.toString(), dest.getDataCenter().getId());
+                        break;
+                    case VMware:
+                        templateName = _configServer.getConfigValue(Config.RouterTemplateVmware.key(), Config.ConfigurationParameterScope.zone.toString(), dest.getDataCenter().getId());
+                        break;
+                    case Hyperv:
+                        templateName = _configServer.getConfigValue(Config.RouterTemplateHyperv.key(), Config.ConfigurationParameterScope.zone.toString(), dest.getDataCenter().getId());
+                        break;
+                    case LXC:
+                        templateName = _configServer.getConfigValue(Config.RouterTemplateLXC.key(), Config.ConfigurationParameterScope.zone.toString(), dest.getDataCenter().getId());
+                        break;
+                    default: break;
+                }
+                VMTemplateVO template = _templateDao.findRoutingTemplate(hType, templateName);
+
+                if (template == null) {
+                    s_logger.debug(hType + " won't support system vm, skip it");
+                    continue;
+                }
+
+                internalLbVm = new DomainRouterVO(id, routerOffering.getId(), internalLbProviderId, 
+                VirtualMachineName.getSystemVmName(id, _instance, _internalLbVmNamePrefix), template.getId(), template.getHypervisorType(),
+                template.getGuestOSId(), owner.getDomainId(), owner.getId(), false, 0, false, 
+                RedundantState.UNKNOWN, false, false, VirtualMachine.Type.InternalLoadBalancerVm, vpcId);
+                internalLbVm.setRole(Role.INTERNAL_LB_VM);
+                internalLbVm = _itMgr.allocate(internalLbVm, template, routerOffering, networks, plan, null, owner);
+            } catch (InsufficientCapacityException ex) {
+                if (allocateRetry < 2 && iter.hasNext()) {
+                    s_logger.debug("Failed to allocate the Internal lb vm with hypervisor type " + hType + ", retrying one more time");
+                    continue;
+                } else {
+                    throw ex;
+                }
+            } finally {
+                allocateRetry++;
+            }
+
+            if (startVm) {
+                try {
+                    internalLbVm = startInternalLbVm(internalLbVm, _accountMgr.getSystemAccount(), User.UID_SYSTEM, params);
+                    break;
+                } catch (InsufficientCapacityException ex) {
+                    if (startRetry < 2 && iter.hasNext()) {
+                        s_logger.debug("Failed to start the Internal lb vm  " + internalLbVm + " with hypervisor type " + hType + ", " +
+                                "destroying it and recreating one more time");
+                        // destroy the internal lb vm
+                        destroyInternalLbVm(internalLbVm.getId(), _accountMgr.getSystemAccount(), User.UID_SYSTEM);
+                        continue;
+                    } else {
+                        throw ex;
+                    }
+                } finally {
+                    startRetry++;
+                }
+            } else {
+                //return stopped internal lb vm
+                return internalLbVm;
+            }
+        }
+        return internalLbVm;
+    }
+    
+    
+
+    protected DomainRouterVO startInternalLbVm(DomainRouterVO internalLbVm, Account caller, long callerUserId, Map<Param, Object> params) 
+            throws StorageUnavailableException, InsufficientCapacityException,
+            ConcurrentOperationException, ResourceUnavailableException {
+        s_logger.debug("Starting Internal LB VM " + internalLbVm);
+        if (_itMgr.start(internalLbVm, params, _accountMgr.getUserIncludingRemoved(callerUserId), caller, null) != null) {
+            if (internalLbVm.isStopPending()) {
+                s_logger.info("Clear the stop pending flag of Internal LB VM " + internalLbVm.getHostName() + " after start router successfully!");
+                internalLbVm.setStopPending(false);
+                internalLbVm = _internalLbVmDao.persist(internalLbVm);
+            }
+            return _internalLbVmDao.findById(internalLbVm.getId());
+        } else {
+            return null;
+        }
+    }
+    
+    
+    protected List<HypervisorType> getHypervisors(DeployDestination dest, DeploymentPlan plan, 
+            List<HypervisorType> supportedHypervisors) throws InsufficientServerCapacityException {
+        List<HypervisorType> hypervisors = new ArrayList<HypervisorType>();
+
+        HypervisorType defaults = _resourceMgr.getDefaultHypervisor(dest.getDataCenter().getId());
+        if (defaults != HypervisorType.None) {
+            hypervisors.add(defaults);
+        } else {
+            //if there is no default hypervisor, get it from the cluster
+            hypervisors = _resourceMgr.getSupportedHypervisorTypes(dest.getDataCenter().getId(), true,
+                plan.getPodId());
+        }
+
+        //keep only elements defined in supported hypervisors
+        StringBuilder hTypesStr = new StringBuilder();
+        if (supportedHypervisors != null && !supportedHypervisors.isEmpty()) {
+            hypervisors.retainAll(supportedHypervisors);
+            for (HypervisorType hType : supportedHypervisors) {
+                hTypesStr.append(hType).append(" ");
+            }
+        }
+
+        if (hypervisors.isEmpty()) {
+            throw new InsufficientServerCapacityException("Unable to create internal lb vm, " +
+                    "there are no clusters in the zone ", DataCenter.class, dest.getDataCenter().getId());
+        }
+        return hypervisors;
+    }
+    
+    @Override
+    public boolean applyLoadBalancingRules(Network network, final List<LoadBalancingRule> rules, List<? extends VirtualRouter> internalLbVms) 
+            throws ResourceUnavailableException {
+        if (rules == null || rules.isEmpty()) {
+            s_logger.debug("No lb rules to be applied for network " + network);
+            return true;
+        }
+        
+        //only one internal lb vm is supported per ip address at this time
+        if (internalLbVms == null || internalLbVms.isEmpty()) {
+            throw new CloudRuntimeException("Can't apply the lb rules on network " + network + " as the list of internal lb vms is empty");
+        }
+        
+        VirtualRouter lbVm = internalLbVms.get(0);
+        if (lbVm.getState() == State.Running) {
+            return sendLBRules(lbVm, rules, network.getId());
+        } else if (lbVm.getState() == State.Stopped || lbVm.getState() == State.Stopping) {
+            s_logger.debug("Internal LB VM " + lbVm.getInstanceName() + " is in " + lbVm.getState() + 
+                    ", so not sending apply lb rules commands to the backend");
+            return true;
+        } else {
+            s_logger.warn("Unable to apply lb rules, Internal LB VM is not in the right state " + lbVm.getState());
+            throw new ResourceUnavailableException("Unable to apply lb rules; Internal LB VM is not in the right state", DataCenter.class, lbVm.getDataCenterId());
+        }
+    }
+    
+    protected boolean sendLBRules(VirtualRouter internalLbVm, List<LoadBalancingRule> rules, long guestNetworkId) throws ResourceUnavailableException {
+        Commands cmds = new Commands(OnError.Continue);
+        createApplyLoadBalancingRulesCommands(rules, internalLbVm, cmds, guestNetworkId);
+        return sendCommandsToInternalLbVm(internalLbVm, cmds);
+    }
+    
+    
+    protected boolean sendCommandsToInternalLbVm(final VirtualRouter internalLbVm, Commands cmds) throws AgentUnavailableException {
+        Answer[] answers = null;
+        try {
+            answers = _agentMgr.send(internalLbVm.getHostId(), cmds);
+        } catch (OperationTimedoutException e) {
+            s_logger.warn("Timed Out", e);
+            throw new AgentUnavailableException("Unable to send commands to virtual router ", internalLbVm.getHostId(), e);
+        }
+
+        if (answers == null) {
+            return false;
+        }
+
+        if (answers.length != cmds.size()) {
+            return false;
+        }
+
+        boolean result = true;
+        if (answers.length > 0) {
+            for (Answer answer : answers) {
+                if (!answer.getResult()) {
+                    result = false;
+                    break;
+                }
+            }
+        }
+        return result;
+    }
+    
+    
+    @Override
+    public VirtualRouter startInternalLbVm(long internalLbVmId, Account caller, long callerUserId) 
+            throws StorageUnavailableException, InsufficientCapacityException,
+            ConcurrentOperationException, ResourceUnavailableException {
+        
+        DomainRouterVO internalLbVm = _internalLbVmDao.findById(internalLbVmId);
+        if (internalLbVm == null || internalLbVm.getRole() != Role.INTERNAL_LB_VM) {
+            throw new InvalidParameterValueException("Can't find internal lb vm by id specified");
+        }
+        
+        return startInternalLbVm(internalLbVm, caller, callerUserId, null);
+    }
+}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2660a6b7/plugins/network-elements/internal-loadbalancer/test/org/apache/cloudstack/internallbelement/ElementChildTestConfiguration.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/internal-loadbalancer/test/org/apache/cloudstack/internallbelement/ElementChildTestConfiguration.java b/plugins/network-elements/internal-loadbalancer/test/org/apache/cloudstack/internallbelement/ElementChildTestConfiguration.java
new file mode 100644
index 0000000..6959b95
--- /dev/null
+++ b/plugins/network-elements/internal-loadbalancer/test/org/apache/cloudstack/internallbelement/ElementChildTestConfiguration.java
@@ -0,0 +1,124 @@
+// 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 org.apache.cloudstack.internallbelement;
+
+import java.io.IOException;
+
+import org.apache.cloudstack.lb.dao.ApplicationLoadBalancerRuleDao;
+import org.apache.cloudstack.network.lb.InternalLoadBalancerVMManager;
+import org.apache.cloudstack.test.utils.SpringUtils;
+import org.mockito.Mockito;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.context.annotation.ComponentScan.Filter;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.FilterType;
+import org.springframework.core.type.classreading.MetadataReader;
+import org.springframework.core.type.classreading.MetadataReaderFactory;
+import org.springframework.core.type.filter.TypeFilter;
+
+import com.cloud.configuration.ConfigurationManager;
+import com.cloud.dc.dao.AccountVlanMapDaoImpl;
+import com.cloud.dc.dao.DataCenterDao;
+import com.cloud.network.NetworkManager;
+import com.cloud.network.NetworkModel;
+import com.cloud.network.dao.NetworkServiceMapDao;
+import com.cloud.network.dao.PhysicalNetworkServiceProviderDao;
+import com.cloud.network.dao.VirtualRouterProviderDao;
+import com.cloud.user.AccountManager;
+import com.cloud.vm.dao.DomainRouterDao;
+
+@Configuration
+@ComponentScan(
+    basePackageClasses={
+        AccountVlanMapDaoImpl.class
+    },
+    includeFilters={@Filter(value=ElementChildTestConfiguration.Library.class, type=FilterType.CUSTOM)},
+    useDefaultFilters=false
+    )
+
+public class ElementChildTestConfiguration {
+    public static class Library implements TypeFilter { 
+        @Bean
+        public AccountManager accountManager() {
+            return Mockito.mock(AccountManager.class);
+        }
+        
+       
+        @Bean
+        public DomainRouterDao domainRouterDao() {
+            return Mockito.mock(DomainRouterDao.class);
+        }
+        
+        @Bean
+        public VirtualRouterProviderDao virtualRouterProviderDao() {
+            return Mockito.mock(VirtualRouterProviderDao.class);
+        }
+        
+        @Bean
+        public NetworkModel networkModel() {
+            return Mockito.mock(NetworkModel.class);
+        }
+        
+        
+        @Bean
+        public NetworkManager networkManager() {
+            return Mockito.mock(NetworkManager.class);
+        }
+
+        
+        @Bean
+        public PhysicalNetworkServiceProviderDao physicalNetworkServiceProviderDao() {
+            return Mockito.mock(PhysicalNetworkServiceProviderDao.class);
+        }
+        
+        @Bean
+        public NetworkServiceMapDao networkServiceMapDao() {
+            return Mockito.mock(NetworkServiceMapDao.class);
+        }
+        
+        @Bean
+        public InternalLoadBalancerVMManager internalLoadBalancerVMManager() {
+            return Mockito.mock(InternalLoadBalancerVMManager.class);
+        }
+        
+        @Bean
+        public ConfigurationManager confugurationManager() {
+            return Mockito.mock(ConfigurationManager.class);
+        }
+        
+        
+        @Bean
+        public ApplicationLoadBalancerRuleDao applicationLoadBalancerRuleDao() {
+            return Mockito.mock(ApplicationLoadBalancerRuleDao.class);
+        }
+        
+        @Bean
+        public DataCenterDao dataCenterDao() {
+            return Mockito.mock(DataCenterDao.class);
+        }
+        
+        
+        
+        @Override
+        public boolean match(MetadataReader mdr, MetadataReaderFactory arg1) throws IOException {
+            mdr.getClassMetadata().getClassName();
+            ComponentScan cs = ElementChildTestConfiguration.class.getAnnotation(ComponentScan.class);
+            return SpringUtils.includedInBasePackageClasses(mdr.getClassMetadata().getClassName(), cs);
+        }
+    }
+}


[40/50] [abbrv] git commit: updated refs/heads/vmsync to d403974

Posted by ah...@apache.org.
Fix doc: MySQL not Tomcat


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

Branch: refs/heads/vmsync
Commit: 791c68fc11976a0bb9bc46e3a18c9778008bf444
Parents: f12ac95
Author: Milamber <mi...@apache.org>
Authored: Fri May 10 19:56:57 2013 +0100
Committer: Milamber <mi...@apache.org>
Committed: Fri May 10 19:56:57 2013 +0100

----------------------------------------------------------------------
 docs/en-US/set-database-buffer-pool-size.xml |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/791c68fc/docs/en-US/set-database-buffer-pool-size.xml
----------------------------------------------------------------------
diff --git a/docs/en-US/set-database-buffer-pool-size.xml b/docs/en-US/set-database-buffer-pool-size.xml
index 1c75031..8265ae5 100644
--- a/docs/en-US/set-database-buffer-pool-size.xml
+++ b/docs/en-US/set-database-buffer-pool-size.xml
@@ -26,7 +26,7 @@
     <title>Set Database Buffer Pool Size</title>
     <para>It is important to provide enough memory space for the MySQL database to cache data and indexes:</para>
     <orderedlist>
-        <listitem><para>Edit the Tomcat configuration file:</para><programlisting>/etc/my.cnf</programlisting></listitem>
+        <listitem><para>Edit the MySQL configuration file:</para><programlisting>/etc/my.cnf</programlisting></listitem>
         <listitem><para>Insert the following line in the [mysqld] section, below the datadir line. Use a value that is appropriate for your situation. We recommend setting the buffer pool at 40% of RAM if MySQL is on the same server as the management server or 70% of RAM if MySQL has a dedicated server. The following example assumes a dedicated server with 1024M of RAM.</para>
             <programlisting>innodb_buffer_pool_size=700M</programlisting></listitem>
         <listitem><para>Restart the MySQL service.</para><programlisting># service mysqld restart</programlisting></listitem>


[04/50] [abbrv] git commit: updated refs/heads/vmsync to d403974

Posted by ah...@apache.org.
CLOUDSTACK-2145 : Failed to create guest nexus port profile while deploying the First VM on Nexus VMWARE Cluster
Additional stuff needs to be configured in guest port profile when Vnmc is present to provide firewall services.
The xml command used to configure port profile had issues with special characters in the input value for 'org' parameter.


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

Branch: refs/heads/vmsync
Commit: 44f3f5eca529b5f9bfe08a984fed8ce23160b9c5
Parents: 305f3cb
Author: Koushik Das <ko...@citrix.com>
Authored: Wed May 8 17:52:02 2013 +0530
Committer: Koushik Das <ko...@citrix.com>
Committed: Wed May 8 17:52:02 2013 +0530

----------------------------------------------------------------------
 .../com/cloud/utils/cisco/n1kv/vsm/VsmCommand.java |    9 +++++++--
 1 files changed, 7 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/44f3f5ec/utils/src/com/cloud/utils/cisco/n1kv/vsm/VsmCommand.java
----------------------------------------------------------------------
diff --git a/utils/src/com/cloud/utils/cisco/n1kv/vsm/VsmCommand.java b/utils/src/com/cloud/utils/cisco/n1kv/vsm/VsmCommand.java
index fdab390..d86b710 100644
--- a/utils/src/com/cloud/utils/cisco/n1kv/vsm/VsmCommand.java
+++ b/utils/src/com/cloud/utils/cisco/n1kv/vsm/VsmCommand.java
@@ -546,10 +546,15 @@ public class VsmCommand {
         vmware.appendChild(portgroup);
         portProf.appendChild(vmware);
 
-        // org root/%vdc%
+        // org %vdc%
         // vservice node <Node Name> profile <Edge Security Profile Name in VNMC>
+        Element vdcValue = doc.createElement(s_paramvalue);
+        vdcValue.setAttribute("isKey", "true");
+        vdcValue.setTextContent(vdc);
+
         Element org = doc.createElement("org");
-        org.appendChild(doc.createElement(vdc));
+        org.appendChild(doc.createElement("orgname"))
+                .appendChild(vdcValue);
         portProf.appendChild(org);
 
         String asaNodeName = "ASA_" + vlanid;


[33/50] [abbrv] git commit: updated refs/heads/vmsync to d403974

Posted by ah...@apache.org.
CLOUDSTACK-2309: Add fix to handle Vmware 4.0 template upgrade


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

Branch: refs/heads/vmsync
Commit: b4aff6190f741cffa0bd945cfa9d7d7b11ada47b
Parents: 3c433de
Author: Kishan Kavala <ki...@cloud.com>
Authored: Fri May 10 17:27:10 2013 +0530
Committer: Kishan Kavala <ki...@cloud.com>
Committed: Fri May 10 17:27:10 2013 +0530

----------------------------------------------------------------------
 .../src/com/cloud/upgrade/dao/Upgrade302to40.java  |   51 ++++++++++++++-
 1 files changed, 50 insertions(+), 1 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/b4aff619/engine/schema/src/com/cloud/upgrade/dao/Upgrade302to40.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/upgrade/dao/Upgrade302to40.java b/engine/schema/src/com/cloud/upgrade/dao/Upgrade302to40.java
index 753f64e..ecda872 100644
--- a/engine/schema/src/com/cloud/upgrade/dao/Upgrade302to40.java
+++ b/engine/schema/src/com/cloud/upgrade/dao/Upgrade302to40.java
@@ -63,6 +63,7 @@ public class Upgrade302to40 extends Upgrade30xBase implements DbUpgrade {
 
     @Override
     public void performDataMigration(Connection conn) {
+        updateVmWareSystemVms(conn);
         correctVRProviders(conn);
         correctMultiplePhysicaNetworkSetups(conn);
         addHostDetailsUniqueKey(conn);
@@ -82,7 +83,55 @@ public class Upgrade302to40 extends Upgrade30xBase implements DbUpgrade {
 
         return new File[] { new File(script) };
     }
-    
+
+    private void updateVmWareSystemVms(Connection conn){
+        PreparedStatement pstmt = null;
+        ResultSet rs = null;
+        boolean VMware = false;
+        try {
+            pstmt = conn.prepareStatement("select distinct(hypervisor_type) from `cloud`.`cluster` where removed is null");
+            rs = pstmt.executeQuery();
+            while(rs.next()){
+                if("VMware".equals(rs.getString(1))){
+                    VMware = true;
+                }
+            }
+        } catch (SQLException e) {
+            throw new CloudRuntimeException("Error while iterating through list of hypervisors in use", e);
+        }
+        // Just update the VMware system template. Other hypervisor templates are unchanged from previous 3.0.x versions.
+        s_logger.debug("Updating VMware System Vms");
+        try {
+            //Get 4.0 VMware system Vm template Id
+            pstmt = conn.prepareStatement("select id from `cloud`.`vm_template` where name = 'systemvm-vmware-4.0' and removed is null");
+            rs = pstmt.executeQuery();
+            if(rs.next()){
+                long templateId = rs.getLong(1);
+                rs.close();
+                pstmt.close();
+                // change template type to SYSTEM
+                pstmt = conn.prepareStatement("update `cloud`.`vm_template` set type='SYSTEM' where id = ?");
+                pstmt.setLong(1, templateId);
+                pstmt.executeUpdate();
+                pstmt.close();
+                // update templete ID of system Vms
+                pstmt = conn.prepareStatement("update `cloud`.`vm_instance` set vm_template_id = ? where type <> 'User' and hypervisor_type = 'VMware'");
+                pstmt.setLong(1, templateId);
+                pstmt.executeUpdate();
+                pstmt.close();
+            } else {
+                if (VMware){
+                    throw new CloudRuntimeException("4.0 VMware SystemVm template not found. Cannot upgrade system Vms");
+                } else {
+                    s_logger.warn("4.0 VMware SystemVm template not found. VMware hypervisor is not used, so not failing upgrade");
+                }
+            }
+        } catch (SQLException e) {
+            throw new CloudRuntimeException("Error while updating VMware systemVm template", e);
+        }
+        s_logger.debug("Updating System Vm Template IDs Complete");
+    }
+
     private void correctVRProviders(Connection conn) {
         PreparedStatement pstmtVR = null;
         ResultSet rsVR = null;


[20/50] [abbrv] CLOUDSTACK-747: Internal LB between VPC tiers support

Posted by ah...@apache.org.
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2660a6b7/client/tomcatconf/commands.properties.in
----------------------------------------------------------------------
diff --git a/client/tomcatconf/commands.properties.in b/client/tomcatconf/commands.properties.in
index 687c3c1..cdc1992 100644
--- a/client/tomcatconf/commands.properties.in
+++ b/client/tomcatconf/commands.properties.in
@@ -577,6 +577,17 @@ revertToVMSnapshot=15
 #### Baremetal commands
 addBaremetalHost=1
 
+#### New Load Balancer commands
+createLoadBalancer=15
+listLoadBalancers=15
+deleteLoadBalancer=15
+
+#Internal Load Balancer Element commands
+configureInternalLoadBalancerElement=1
+createInternalLoadBalancerElement=1
+listInternalLoadBalancerElements=1
+
+
 #### Affinity group commands
 createAffinityGroup=15
 deleteAffinityGroup=15
@@ -594,5 +605,10 @@ addCiscoAsa1000vResource=1
 deleteCiscoAsa1000vResource=1
 listCiscoAsa1000vResources=1
 
+#### Internal LB VM commands
+stopInternalLoadBalancerVM=1
+startInternalLoadBalancerVM=1
+listInternalLoadBalancerVMs=1
+
 ### Network Isolation methods listing
 listNetworkIsolationMethods=1

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2660a6b7/client/tomcatconf/componentContext.xml.in
----------------------------------------------------------------------
diff --git a/client/tomcatconf/componentContext.xml.in b/client/tomcatconf/componentContext.xml.in
index 7a46981..8a45e5f 100644
--- a/client/tomcatconf/componentContext.xml.in
+++ b/client/tomcatconf/componentContext.xml.in
@@ -198,6 +198,7 @@
           <ref bean="VirtualRouter"/>
           <ref bean="VpcVirtualRouter"/>
           <ref bean="NiciraNvp"/>
+          <ref bean="InternalLbVm"/>
       </list>
     </property>
   </bean>
@@ -241,6 +242,7 @@
           <ref bean="VpcVirtualRouter"/>
           <ref bean="NiciraNvp" />
           <ref bean="MidoNetElement"/>
+          <ref bean="InternalLbVm"/>
 <!--
           <ref bean="BareMetalDhcp"/>
           <ref bean="BareMetalPxe"/>

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2660a6b7/client/tomcatconf/nonossComponentContext.xml.in
----------------------------------------------------------------------
diff --git a/client/tomcatconf/nonossComponentContext.xml.in b/client/tomcatconf/nonossComponentContext.xml.in
index ff52457..1b6ee6e 100644
--- a/client/tomcatconf/nonossComponentContext.xml.in
+++ b/client/tomcatconf/nonossComponentContext.xml.in
@@ -294,6 +294,7 @@
           <ref bean="VirtualRouter"/>
           <ref bean="VpcVirtualRouter"/>
           <ref bean="NiciraNvp"/>
+          <ref bean="InternalLbVm"/>
       </list>
     </property>
   </bean>
@@ -343,6 +344,7 @@
           <ref bean="Ovs"/>
           <ref bean="SecurityGroupProvider"/>
           <ref bean="VpcVirtualRouter"/>
+          <ref bean="InternalLbVm"/>
 <!--
           <ref bean="BareMetalDhcp"/>
           <ref bean="BareMetalPxe"/>

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2660a6b7/client/tomcatconf/simulatorComponentContext.xml.in
----------------------------------------------------------------------
diff --git a/client/tomcatconf/simulatorComponentContext.xml.in b/client/tomcatconf/simulatorComponentContext.xml.in
index 9d8c6c0..652c4c8 100644
--- a/client/tomcatconf/simulatorComponentContext.xml.in
+++ b/client/tomcatconf/simulatorComponentContext.xml.in
@@ -205,6 +205,7 @@
         <ref bean="Ovs"/>
         <ref bean="SecurityGroupProvider"/>
         <ref bean="VpcVirtualRouter"/>
+        <ref bean="InternalLbVm"/>
         <!--
                   <ref bean="BareMetalDhcp"/>
                   <ref bean="BareMetalPxe"/>

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2660a6b7/engine/schema/src/com/cloud/network/dao/FirewallRulesDao.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/network/dao/FirewallRulesDao.java b/engine/schema/src/com/cloud/network/dao/FirewallRulesDao.java
index 0bbaa93..6b9b3bb 100644
--- a/engine/schema/src/com/cloud/network/dao/FirewallRulesDao.java
+++ b/engine/schema/src/com/cloud/network/dao/FirewallRulesDao.java
@@ -18,7 +18,6 @@ package com.cloud.network.dao;
 
 import java.util.List;
 
-import com.cloud.host.HostVO;
 import com.cloud.network.rules.FirewallRule;
 import com.cloud.network.rules.FirewallRuleVO;
 import com.cloud.utils.db.GenericDao;

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2660a6b7/engine/schema/src/com/cloud/network/dao/IPAddressVO.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/network/dao/IPAddressVO.java b/engine/schema/src/com/cloud/network/dao/IPAddressVO.java
index c5c78e5..ae27e95 100644
--- a/engine/schema/src/com/cloud/network/dao/IPAddressVO.java
+++ b/engine/schema/src/com/cloud/network/dao/IPAddressVO.java
@@ -31,12 +31,8 @@ import javax.persistence.Temporal;
 import javax.persistence.TemporalType;
 import javax.persistence.Transient;
 
-import org.apache.cloudstack.api.Identity;
-
 import com.cloud.network.IpAddress;
-import com.cloud.network.IpAddress.State;
 import com.cloud.utils.net.Ip;
-import org.apache.cloudstack.api.InternalIdentity;
 
 /**
  * A bean representing a public IP Address
@@ -304,4 +300,9 @@ public class IPAddressVO implements IpAddress {
     public void setVmIp(String vmIp) {
         this.vmIp = vmIp;
     }
+
+    @Override
+    public Long getNetworkId() {
+        return sourceNetworkId;
+    }
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2660a6b7/engine/schema/src/com/cloud/network/dao/LoadBalancerDao.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/network/dao/LoadBalancerDao.java b/engine/schema/src/com/cloud/network/dao/LoadBalancerDao.java
index 611282e..331f755 100644
--- a/engine/schema/src/com/cloud/network/dao/LoadBalancerDao.java
+++ b/engine/schema/src/com/cloud/network/dao/LoadBalancerDao.java
@@ -18,19 +18,15 @@ package com.cloud.network.dao;
 
 import java.util.List;
 
+import com.cloud.network.rules.LoadBalancerContainer.Scheme;
 import com.cloud.utils.db.GenericDao;
 
 public interface LoadBalancerDao extends GenericDao<LoadBalancerVO, Long> {
-    List<Long> listInstancesByLoadBalancer(long loadBalancerId);
 
     List<LoadBalancerVO> listByIpAddress(long ipAddressId);
 
-    LoadBalancerVO findByIpAddressAndPublicPort(long ipAddressId, String publicPort);
+    List<LoadBalancerVO> listByNetworkIdAndScheme(long networkId, Scheme scheme);
 
-    LoadBalancerVO findByAccountAndName(Long accountId, String name);
-
-    List<LoadBalancerVO> listByNetworkId(long networkId);
-
-    List<LoadBalancerVO> listInTransitionStateByNetworkId(long networkId);
+    List<LoadBalancerVO> listInTransitionStateByNetworkIdAndScheme(long networkId, Scheme scheme);
 
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2660a6b7/engine/schema/src/com/cloud/network/dao/LoadBalancerDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/network/dao/LoadBalancerDaoImpl.java b/engine/schema/src/com/cloud/network/dao/LoadBalancerDaoImpl.java
index f211a7f..c20d8b2 100644
--- a/engine/schema/src/com/cloud/network/dao/LoadBalancerDaoImpl.java
+++ b/engine/schema/src/com/cloud/network/dao/LoadBalancerDaoImpl.java
@@ -16,39 +16,24 @@
 // under the License.
 package com.cloud.network.dao;
 
-import java.sql.PreparedStatement;
-import java.sql.ResultSet;
-import java.util.ArrayList;
 import java.util.List;
 
 import javax.ejb.Local;
 import javax.inject.Inject;
 
-import org.apache.log4j.Logger;
 import org.springframework.stereotype.Component;
 
 import com.cloud.network.rules.FirewallRule.State;
+import com.cloud.network.rules.LoadBalancerContainer.Scheme;
 import com.cloud.utils.db.GenericDaoBase;
 import com.cloud.utils.db.SearchBuilder;
 import com.cloud.utils.db.SearchCriteria;
 import com.cloud.utils.db.SearchCriteria.Op;
-import com.cloud.utils.db.Transaction;
 
 @Component
 @Local(value = { LoadBalancerDao.class })
 public class LoadBalancerDaoImpl extends GenericDaoBase<LoadBalancerVO, Long> implements LoadBalancerDao {
-    private static final Logger s_logger = Logger.getLogger(LoadBalancerDaoImpl.class);
-    private static final String LIST_INSTANCES_BY_LOAD_BALANCER = "SELECT vm.id " +
-            "    FROM vm_instance vm, load_balancer lb, ip_forwarding fwd, user_ip_address ip " +
-            "    WHERE lb.id = ? AND " +
-            "          fwd.group_id = lb.id AND " +
-            "          fwd.forwarding = 0 AND " +
-            "          fwd.private_ip_address = vm.private_ip_address AND " +
-            "          lb.ip_address = ip.public_ip_address AND " +
-            "          ip.data_center_id = vm.data_center_id ";
     private final SearchBuilder<LoadBalancerVO> ListByIp;
-    private final SearchBuilder<LoadBalancerVO> IpAndPublicPortSearch;
-    private final SearchBuilder<LoadBalancerVO> AccountAndNameSearch;
     protected final SearchBuilder<LoadBalancerVO> TransitionStateSearch;
 
     @Inject protected FirewallRulesCidrsDao _portForwardingRulesCidrsDao;
@@ -57,45 +42,16 @@ public class LoadBalancerDaoImpl extends GenericDaoBase<LoadBalancerVO, Long> im
         ListByIp = createSearchBuilder();
         ListByIp.and("ipAddressId", ListByIp.entity().getSourceIpAddressId(), SearchCriteria.Op.EQ);
         ListByIp.and("networkId", ListByIp.entity().getNetworkId(), SearchCriteria.Op.EQ);
+        ListByIp.and("scheme", ListByIp.entity().getScheme(), SearchCriteria.Op.EQ);
         ListByIp.done();
 
-        IpAndPublicPortSearch = createSearchBuilder();
-        IpAndPublicPortSearch.and("ipAddressId", IpAndPublicPortSearch.entity().getSourceIpAddressId(), SearchCriteria.Op.EQ);
-        IpAndPublicPortSearch.and("publicPort", IpAndPublicPortSearch.entity().getSourcePortStart(), SearchCriteria.Op.EQ);
-        IpAndPublicPortSearch.done();
-
-        AccountAndNameSearch = createSearchBuilder();
-        AccountAndNameSearch.and("accountId", AccountAndNameSearch.entity().getAccountId(), SearchCriteria.Op.EQ);
-        AccountAndNameSearch.and("name", AccountAndNameSearch.entity().getName(), SearchCriteria.Op.EQ);
-        AccountAndNameSearch.done();
-
         TransitionStateSearch = createSearchBuilder();
         TransitionStateSearch.and("networkId", TransitionStateSearch.entity().getNetworkId(), Op.EQ);
         TransitionStateSearch.and("state", TransitionStateSearch.entity().getState(), Op.IN);
+        TransitionStateSearch.and("scheme", TransitionStateSearch.entity().getScheme(), Op.EQ);
         TransitionStateSearch.done();
     }
-
-    @Override
-    public List<Long> listInstancesByLoadBalancer(long loadBalancerId) {
-        Transaction txn = Transaction.currentTxn();
-        String sql = LIST_INSTANCES_BY_LOAD_BALANCER;
-        PreparedStatement pstmt = null;
-        List<Long> instanceList = new ArrayList<Long>();
-        try {
-            pstmt = txn.prepareAutoCloseStatement(sql);
-            pstmt.setLong(1, loadBalancerId);
-
-            ResultSet rs = pstmt.executeQuery();
-            while (rs.next()) {
-                Long vmId = rs.getLong(1);
-                instanceList.add(vmId);
-            }
-        } catch (Exception ex) {
-            s_logger.error("error getting recent usage network stats", ex);
-        }
-        return instanceList;
-    }
-
+    
     @Override
     public List<LoadBalancerVO> listByIpAddress(long ipAddressId) {
         SearchCriteria<LoadBalancerVO> sc = ListByIp.create();
@@ -104,33 +60,19 @@ public class LoadBalancerDaoImpl extends GenericDaoBase<LoadBalancerVO, Long> im
     }
 
     @Override
-    public List<LoadBalancerVO> listByNetworkId(long networkId) {
+    public List<LoadBalancerVO> listByNetworkIdAndScheme(long networkId, Scheme scheme) {
         SearchCriteria<LoadBalancerVO> sc = ListByIp.create();
         sc.setParameters("networkId", networkId);
+        sc.setParameters("scheme", scheme);
         return listBy(sc);
     }
 
     @Override
-    public LoadBalancerVO findByIpAddressAndPublicPort(long ipAddressId, String publicPort) {
-        SearchCriteria<LoadBalancerVO> sc = IpAndPublicPortSearch.create();
-        sc.setParameters("ipAddressId", ipAddressId);
-        sc.setParameters("publicPort", publicPort);
-        return findOneBy(sc);
-    }
-
-    @Override
-    public LoadBalancerVO findByAccountAndName(Long accountId, String name) {
-        SearchCriteria<LoadBalancerVO> sc = AccountAndNameSearch.create();
-        sc.setParameters("accountId", accountId);
-        sc.setParameters("name", name);
-        return findOneBy(sc);
-    }
-
-    @Override
-    public List<LoadBalancerVO> listInTransitionStateByNetworkId(long networkId) {
+    public List<LoadBalancerVO> listInTransitionStateByNetworkIdAndScheme(long networkId, Scheme scheme) {
         SearchCriteria<LoadBalancerVO> sc = TransitionStateSearch.create();
         sc.setParameters("networkId", networkId);
         sc.setParameters("state", State.Add.toString(), State.Revoke.toString());
+        sc.setParameters("scheme", scheme);
         return listBy(sc);
     }
 

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2660a6b7/engine/schema/src/com/cloud/network/dao/LoadBalancerVO.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/network/dao/LoadBalancerVO.java b/engine/schema/src/com/cloud/network/dao/LoadBalancerVO.java
index 5422f41..fee88cf 100644
--- a/engine/schema/src/com/cloud/network/dao/LoadBalancerVO.java
+++ b/engine/schema/src/com/cloud/network/dao/LoadBalancerVO.java
@@ -19,6 +19,8 @@ package com.cloud.network.dao;
 import javax.persistence.Column;
 import javax.persistence.DiscriminatorValue;
 import javax.persistence.Entity;
+import javax.persistence.EnumType;
+import javax.persistence.Enumerated;
 import javax.persistence.PrimaryKeyJoinColumn;
 import javax.persistence.Table;
 
@@ -26,6 +28,12 @@ import com.cloud.network.rules.FirewallRuleVO;
 import com.cloud.network.rules.LoadBalancer;
 import com.cloud.utils.net.NetUtils;
 
+/**
+ * This VO represent Public Load Balancer
+ * It references source ip address by its Id. 
+ * To get the VO for Internal Load Balancer rule, please refer to LoadBalancerRuleVO
+ *
+ */
 @Entity
 @Table(name=("load_balancing_rules"))
 @DiscriminatorValue(value="LoadBalancing")
@@ -46,6 +54,10 @@ public class LoadBalancerVO extends FirewallRuleVO implements LoadBalancer {
     
     @Column(name="default_port_end")
     private int defaultPortEnd;
+    
+    @Enumerated(value=EnumType.STRING)
+    @Column(name="scheme")
+    Scheme scheme = Scheme.Public;
 
     public LoadBalancerVO() { 
     }
@@ -57,6 +69,7 @@ public class LoadBalancerVO extends FirewallRuleVO implements LoadBalancer {
         this.algorithm = algorithm;
         this.defaultPortStart = dstPort;
         this.defaultPortEnd = dstPort;
+        this.scheme = Scheme.Public;
     }
     
     @Override
@@ -94,5 +107,10 @@ public class LoadBalancerVO extends FirewallRuleVO implements LoadBalancer {
 
     public void setDescription(String description) {
         this.description = description;
+    }
+
+    @Override
+    public Scheme getScheme() {
+        return scheme;
     }  
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2660a6b7/engine/schema/src/com/cloud/network/dao/NetworkServiceMapDao.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/network/dao/NetworkServiceMapDao.java b/engine/schema/src/com/cloud/network/dao/NetworkServiceMapDao.java
index 79b97be..6d401c4 100644
--- a/engine/schema/src/com/cloud/network/dao/NetworkServiceMapDao.java
+++ b/engine/schema/src/com/cloud/network/dao/NetworkServiceMapDao.java
@@ -35,4 +35,5 @@ public interface NetworkServiceMapDao extends GenericDao<NetworkServiceMapVO, Lo
 	void deleteByNetworkId(long networkId);
 	List<String> getDistinctProviders(long networkId);
 	String isProviderForNetwork(long networkId, Provider provider);
+	List<String> getProvidersForServiceInNetwork(long networkId, Service service);
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2660a6b7/engine/schema/src/com/cloud/network/dao/NetworkServiceMapDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/network/dao/NetworkServiceMapDaoImpl.java b/engine/schema/src/com/cloud/network/dao/NetworkServiceMapDaoImpl.java
index 13fbfbc..3cdd738 100644
--- a/engine/schema/src/com/cloud/network/dao/NetworkServiceMapDaoImpl.java
+++ b/engine/schema/src/com/cloud/network/dao/NetworkServiceMapDaoImpl.java
@@ -56,6 +56,7 @@ public class NetworkServiceMapDaoImpl extends GenericDaoBase<NetworkServiceMapVO
         DistinctProvidersSearch = createSearchBuilder(String.class);
         DistinctProvidersSearch.and("networkId", DistinctProvidersSearch.entity().getNetworkId(), SearchCriteria.Op.EQ);
         DistinctProvidersSearch.and("provider", DistinctProvidersSearch.entity().getProvider(), SearchCriteria.Op.EQ);
+        DistinctProvidersSearch.and("service", DistinctProvidersSearch.entity().getService(), SearchCriteria.Op.EQ);
         DistinctProvidersSearch.selectField(DistinctProvidersSearch.entity().getProvider());
         DistinctProvidersSearch.done();
     }
@@ -163,5 +164,13 @@ public class NetworkServiceMapDaoImpl extends GenericDaoBase<NetworkServiceMapVO
         	return results.get(0);
         }
     }
+
+    @Override
+    public List<String> getProvidersForServiceInNetwork(long networkId, Service service) {
+        SearchCriteria<String> sc = DistinctProvidersSearch.create();
+        sc.setParameters("networkId", networkId);
+        sc.setParameters("service", service.getName());
+        return customSearch(sc, null);
+    }
     
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2660a6b7/engine/schema/src/com/cloud/network/dao/NetworkVO.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/network/dao/NetworkVO.java b/engine/schema/src/com/cloud/network/dao/NetworkVO.java
index 77b40c8..8e728ab 100644
--- a/engine/schema/src/com/cloud/network/dao/NetworkVO.java
+++ b/engine/schema/src/com/cloud/network/dao/NetworkVO.java
@@ -32,9 +32,6 @@ import javax.persistence.Transient;
 import org.apache.cloudstack.acl.ControlledEntity;
 
 import com.cloud.network.Network;
-import com.cloud.network.Networks;
-import com.cloud.network.Network.GuestType;
-import com.cloud.network.Network.State;
 import com.cloud.network.Networks.BroadcastDomainType;
 import com.cloud.network.Networks.Mode;
 import com.cloud.network.Networks.TrafficType;

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2660a6b7/engine/schema/src/com/cloud/network/rules/FirewallRuleVO.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/network/rules/FirewallRuleVO.java b/engine/schema/src/com/cloud/network/rules/FirewallRuleVO.java
index a761520..9f73029 100644
--- a/engine/schema/src/com/cloud/network/rules/FirewallRuleVO.java
+++ b/engine/schema/src/com/cloud/network/rules/FirewallRuleVO.java
@@ -20,7 +20,6 @@ import java.util.Date;
 import java.util.List;
 import java.util.UUID;
 
-import javax.inject.Inject;
 import javax.persistence.Column;
 import javax.persistence.DiscriminatorColumn;
 import javax.persistence.DiscriminatorType;
@@ -35,7 +34,6 @@ import javax.persistence.InheritanceType;
 import javax.persistence.Table;
 import javax.persistence.Transient;
 
-import com.cloud.network.dao.FirewallRulesCidrsDao;
 import com.cloud.utils.db.GenericDao;
 import com.cloud.utils.net.NetUtils;
 

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2660a6b7/engine/schema/src/com/cloud/offerings/NetworkOfferingDetailsVO.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/offerings/NetworkOfferingDetailsVO.java b/engine/schema/src/com/cloud/offerings/NetworkOfferingDetailsVO.java
new file mode 100644
index 0000000..6cd5abc
--- /dev/null
+++ b/engine/schema/src/com/cloud/offerings/NetworkOfferingDetailsVO.java
@@ -0,0 +1,90 @@
+// 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.offerings;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.EnumType;
+import javax.persistence.Enumerated;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.Table;
+
+import org.apache.cloudstack.api.InternalIdentity;
+
+import com.cloud.offering.NetworkOffering;
+import com.cloud.offering.NetworkOffering.Detail;
+
+@Entity
+@Table(name="network_offering_details")
+public class NetworkOfferingDetailsVO implements InternalIdentity {
+    @Id
+    @GeneratedValue(strategy=GenerationType.IDENTITY)
+    @Column(name="id")
+    private long id;
+    
+    @Column(name="network_offering_id")
+    private long offeringId;
+    
+    @Enumerated(value=EnumType.STRING)
+    @Column(name="name")
+    private NetworkOffering.Detail name;
+    
+    @Column(name="value", length=1024)
+    private String value;
+    
+    public NetworkOfferingDetailsVO() {}
+    
+    public NetworkOfferingDetailsVO(long offeringId, Detail detailName, String value) {
+        this.offeringId = offeringId;
+        this.name = detailName;
+        this.value = value;
+    }
+
+    public long getId() {
+        return id;
+    }
+
+    public long getOfferingId() {
+        return offeringId;
+    }
+
+    public NetworkOffering.Detail getName() {
+        return name;
+    }
+
+    public String getValue() {
+        return value;
+    }
+
+    public void setId(long id) {
+        this.id = id;
+    }
+
+    public void setOfferingId(long offeringId) {
+        this.offeringId = offeringId;
+    }
+
+    public void setName(NetworkOffering.Detail name) {
+        this.name = name;
+    }
+
+    public void setValue(String value) {
+        this.value = value;
+    }
+}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2660a6b7/engine/schema/src/com/cloud/offerings/NetworkOfferingVO.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/offerings/NetworkOfferingVO.java b/engine/schema/src/com/cloud/offerings/NetworkOfferingVO.java
index c015989..3ae0bf3 100755
--- a/engine/schema/src/com/cloud/offerings/NetworkOfferingVO.java
+++ b/engine/schema/src/com/cloud/offerings/NetworkOfferingVO.java
@@ -16,15 +16,23 @@
 // under the License.
 package com.cloud.offerings;
 
+import java.util.Date;
+import java.util.UUID;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.EnumType;
+import javax.persistence.Enumerated;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.Table;
+
 import com.cloud.network.Network;
 import com.cloud.network.Networks.TrafficType;
 import com.cloud.offering.NetworkOffering;
 import com.cloud.utils.db.GenericDao;
 
-import javax.persistence.*;
-import java.util.Date;
-import java.util.UUID;
-
 @Entity
 @Table(name = "network_offerings")
 public class NetworkOfferingVO implements NetworkOffering {
@@ -126,6 +134,12 @@ public class NetworkOfferingVO implements NetworkOffering {
     public String getDisplayText() {
         return displayText;
     }
+    
+    @Column(name = "internal_lb")
+    boolean internalLb;
+    
+    @Column(name = "public_lb")
+    boolean publicLb;
 
     @Override
     public long getId() {
@@ -262,7 +276,7 @@ public class NetworkOfferingVO implements NetworkOffering {
     }
 
     public NetworkOfferingVO(String name, String displayText, TrafficType trafficType, boolean systemOnly, boolean specifyVlan, Integer rateMbps, Integer multicastRateMbps, boolean isDefault,
-            Availability availability, String tags, Network.GuestType guestType, boolean conserveMode, boolean specifyIpRanges, boolean isPersistent) {
+            Availability availability, String tags, Network.GuestType guestType, boolean conserveMode, boolean specifyIpRanges, boolean isPersistent, boolean internalLb, boolean publicLb) {
         this.name = name;
         this.displayText = displayText;
         this.rateMbps = rateMbps;
@@ -286,12 +300,14 @@ public class NetworkOfferingVO implements NetworkOffering {
         this.inline = false;
         this.specifyIpRanges = specifyIpRanges;
         this.isPersistent=isPersistent;
+        this.publicLb = publicLb;
+        this.internalLb = internalLb;
     }
 
     public NetworkOfferingVO(String name, String displayText, TrafficType trafficType, boolean systemOnly, boolean specifyVlan, Integer rateMbps, Integer multicastRateMbps, boolean isDefault,
             Availability availability, String tags, Network.GuestType guestType, boolean conserveMode, boolean dedicatedLb, boolean sharedSourceNat, boolean redundantRouter, boolean elasticIp, boolean elasticLb,
-            boolean specifyIpRanges, boolean inline, boolean isPersistent, boolean associatePublicIP) {
-        this(name, displayText, trafficType, systemOnly, specifyVlan, rateMbps, multicastRateMbps, isDefault, availability, tags, guestType, conserveMode, specifyIpRanges, isPersistent);
+            boolean specifyIpRanges, boolean inline, boolean isPersistent, boolean associatePublicIP, boolean publicLb, boolean internalLb) {
+        this(name, displayText, trafficType, systemOnly, specifyVlan, rateMbps, multicastRateMbps, isDefault, availability, tags, guestType, conserveMode, specifyIpRanges, isPersistent, internalLb, publicLb);
         this.dedicatedLB = dedicatedLb;
         this.sharedSourceNat = sharedSourceNat;
         this.redundantRouter = redundantRouter;
@@ -313,13 +329,13 @@ public class NetworkOfferingVO implements NetworkOffering {
      *            TODO
      */
     public NetworkOfferingVO(String name, TrafficType trafficType, boolean specifyIpRanges) {
-        this(name, "System Offering for " + name, trafficType, true, false, 0, 0, true, Availability.Required, null, null, true, specifyIpRanges, false);
+        this(name, "System Offering for " + name, trafficType, true, false, 0, 0, true, Availability.Required, null, null, true, specifyIpRanges, false, false, false);
         this.state = State.Enabled;
     }
 
     public NetworkOfferingVO(String name, Network.GuestType guestType) {
         this(name, "System Offering for " + name, TrafficType.Guest, true, true, 0, 0, true, Availability.Optional,
-                null, Network.GuestType.Isolated, true, false, false);
+                null, Network.GuestType.Isolated, true, false, false, false, false);
         this.state = State.Enabled;
     }
 
@@ -388,4 +404,14 @@ public class NetworkOfferingVO implements NetworkOffering {
         return isPersistent;
     }
 
+    @Override
+    public boolean getInternalLb() {
+        return internalLb;
+    }
+
+    @Override
+    public boolean getPublicLb() {
+        return publicLb;
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2660a6b7/engine/schema/src/com/cloud/offerings/dao/NetworkOfferingDao.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/offerings/dao/NetworkOfferingDao.java b/engine/schema/src/com/cloud/offerings/dao/NetworkOfferingDao.java
index 405d348..5bb79ce 100644
--- a/engine/schema/src/com/cloud/offerings/dao/NetworkOfferingDao.java
+++ b/engine/schema/src/com/cloud/offerings/dao/NetworkOfferingDao.java
@@ -17,11 +17,13 @@
 package com.cloud.offerings.dao;
 
 import java.util.List;
+import java.util.Map;
 
 import com.cloud.network.Network;
 import com.cloud.network.Networks.TrafficType;
 import com.cloud.offering.NetworkOffering;
 import com.cloud.offering.NetworkOffering.Availability;
+import com.cloud.offering.NetworkOffering.Detail;
 import com.cloud.offerings.NetworkOfferingVO;
 import com.cloud.utils.db.GenericDao;
 
@@ -57,4 +59,6 @@ public interface NetworkOfferingDao extends GenericDao<NetworkOfferingVO, Long>
 
     List<NetworkOfferingVO> listByTrafficTypeGuestTypeAndState(NetworkOffering.State state, TrafficType trafficType, Network.GuestType type);
 
+    NetworkOfferingVO persist(NetworkOfferingVO off, Map<Detail, String> details);
+
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2660a6b7/engine/schema/src/com/cloud/offerings/dao/NetworkOfferingDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/offerings/dao/NetworkOfferingDaoImpl.java b/engine/schema/src/com/cloud/offerings/dao/NetworkOfferingDaoImpl.java
index d1e4424..ef8237a 100644
--- a/engine/schema/src/com/cloud/offerings/dao/NetworkOfferingDaoImpl.java
+++ b/engine/schema/src/com/cloud/offerings/dao/NetworkOfferingDaoImpl.java
@@ -17,8 +17,10 @@
 package com.cloud.offerings.dao;
 
 import java.util.List;
+import java.util.Map;
 
 import javax.ejb.Local;
+import javax.inject.Inject;
 import javax.persistence.EntityExistsException;
 
 import org.springframework.stereotype.Component;
@@ -27,6 +29,8 @@ import com.cloud.network.Network;
 import com.cloud.network.Networks.TrafficType;
 import com.cloud.offering.NetworkOffering;
 import com.cloud.offering.NetworkOffering.Availability;
+import com.cloud.offering.NetworkOffering.Detail;
+import com.cloud.offerings.NetworkOfferingDetailsVO;
 import com.cloud.offerings.NetworkOfferingVO;
 import com.cloud.utils.db.DB;
 import com.cloud.utils.db.GenericDaoBase;
@@ -45,6 +49,7 @@ public class NetworkOfferingDaoImpl extends GenericDaoBase<NetworkOfferingVO, Lo
     final SearchBuilder<NetworkOfferingVO> AvailabilitySearch;
     final SearchBuilder<NetworkOfferingVO> AllFieldsSearch;
     private final GenericSearchBuilder<NetworkOfferingVO, Long> UpgradeSearch;
+    @Inject NetworkOfferingDetailsDao _detailsDao;
 
     protected NetworkOfferingDaoImpl() {
         super();
@@ -165,5 +170,24 @@ public class NetworkOfferingDaoImpl extends GenericDaoBase<NetworkOfferingVO, Lo
         sc.setParameters("state", state);
         return listBy(sc, null);
     }
+    
+    @Override
+    @DB
+    public NetworkOfferingVO persist(NetworkOfferingVO off, Map<Detail, String> details) {
+        Transaction txn = Transaction.currentTxn();
+        txn.start();
+        //1) persist the offering
+        NetworkOfferingVO vo = super.persist(off);
+        
+        //2) persist the details
+        if (details != null && !details.isEmpty()) {
+            for (NetworkOffering.Detail detail : details.keySet()) {
+                _detailsDao.persist(new NetworkOfferingDetailsVO(off.getId(), detail, details.get(detail)));
+            }
+        }
+       
+        txn.commit();
+        return vo;
+    }
 
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2660a6b7/engine/schema/src/com/cloud/offerings/dao/NetworkOfferingDetailsDao.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/offerings/dao/NetworkOfferingDetailsDao.java b/engine/schema/src/com/cloud/offerings/dao/NetworkOfferingDetailsDao.java
new file mode 100644
index 0000000..ce209e0
--- /dev/null
+++ b/engine/schema/src/com/cloud/offerings/dao/NetworkOfferingDetailsDao.java
@@ -0,0 +1,31 @@
+// 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.offerings.dao;
+
+
+import java.util.Map;
+
+import com.cloud.offering.NetworkOffering;
+import com.cloud.offering.NetworkOffering.Detail;
+import com.cloud.offerings.NetworkOfferingDetailsVO;
+import com.cloud.utils.db.GenericDao;
+
+public interface NetworkOfferingDetailsDao extends GenericDao<NetworkOfferingDetailsVO, Long>{
+
+    Map<NetworkOffering.Detail,String> getNtwkOffDetails(long offeringId);
+    String getDetail(long offeringId, Detail detailName);
+}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2660a6b7/engine/schema/src/com/cloud/offerings/dao/NetworkOfferingDetailsDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/offerings/dao/NetworkOfferingDetailsDaoImpl.java b/engine/schema/src/com/cloud/offerings/dao/NetworkOfferingDetailsDaoImpl.java
new file mode 100644
index 0000000..068f390
--- /dev/null
+++ b/engine/schema/src/com/cloud/offerings/dao/NetworkOfferingDetailsDaoImpl.java
@@ -0,0 +1,79 @@
+// 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.offerings.dao;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import com.cloud.offering.NetworkOffering;
+import com.cloud.offering.NetworkOffering.Detail;
+import com.cloud.offerings.NetworkOfferingDetailsVO;
+import com.cloud.utils.db.GenericDaoBase;
+import com.cloud.utils.db.GenericSearchBuilder;
+import com.cloud.utils.db.SearchBuilder;
+import com.cloud.utils.db.SearchCriteria;
+import com.cloud.utils.db.SearchCriteria.Func;
+import com.cloud.utils.db.SearchCriteria.Op;
+
+public class NetworkOfferingDetailsDaoImpl extends GenericDaoBase<NetworkOfferingDetailsVO, Long> implements NetworkOfferingDetailsDao{
+    protected final SearchBuilder<NetworkOfferingDetailsVO> DetailSearch;
+    private final GenericSearchBuilder<NetworkOfferingDetailsVO, String> ValueSearch;
+
+    
+    public NetworkOfferingDetailsDaoImpl() {
+        
+        DetailSearch = createSearchBuilder();
+        DetailSearch.and("offeringId", DetailSearch.entity().getOfferingId(), SearchCriteria.Op.EQ);
+        DetailSearch.and("name", DetailSearch.entity().getName(), SearchCriteria.Op.EQ);
+        DetailSearch.done();
+        
+        ValueSearch = createSearchBuilder(String.class);
+        ValueSearch.select(null, Func.DISTINCT, ValueSearch.entity().getValue());
+        ValueSearch.and("offeringId", ValueSearch.entity().getOfferingId(), SearchCriteria.Op.EQ);
+        ValueSearch.and("name", ValueSearch.entity().getName(), Op.EQ);
+        ValueSearch.done();
+    }
+    
+    @Override
+    public Map<NetworkOffering.Detail,String> getNtwkOffDetails(long offeringId) {
+        SearchCriteria<NetworkOfferingDetailsVO> sc = DetailSearch.create();
+        sc.setParameters("offeringId", offeringId);
+        
+        List<NetworkOfferingDetailsVO> results = search(sc, null);
+        Map<NetworkOffering.Detail, String> details = new HashMap<NetworkOffering.Detail, String>(results.size());
+        for (NetworkOfferingDetailsVO result : results) {
+            details.put(result.getName(), result.getValue());
+        }
+        
+        return details;
+    }
+
+    @Override
+    public String getDetail(long offeringId, Detail detailName) {
+        SearchCriteria<String> sc = ValueSearch.create();
+        sc.setParameters("name", detailName);
+        sc.setParameters("offeringId", offeringId);
+        List<String> results = customSearch(sc, null);
+        if (results.isEmpty()) {
+            return null;
+        } else {
+            return results.get(0);
+        }
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2660a6b7/engine/schema/src/com/cloud/upgrade/dao/Upgrade410to420.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/upgrade/dao/Upgrade410to420.java b/engine/schema/src/com/cloud/upgrade/dao/Upgrade410to420.java
index 05e2b49..3a164c4 100644
--- a/engine/schema/src/com/cloud/upgrade/dao/Upgrade410to420.java
+++ b/engine/schema/src/com/cloud/upgrade/dao/Upgrade410to420.java
@@ -17,10 +17,6 @@
 
 package com.cloud.upgrade.dao;
 
-import com.cloud.utils.exception.CloudRuntimeException;
-import com.cloud.utils.script.Script;
-import org.apache.log4j.Logger;
-
 import java.io.File;
 import java.sql.Connection;
 import java.sql.PreparedStatement;
@@ -28,6 +24,11 @@ import java.sql.ResultSet;
 import java.sql.SQLException;
 import java.util.UUID;
 
+import org.apache.log4j.Logger;
+
+import com.cloud.utils.exception.CloudRuntimeException;
+import com.cloud.utils.script.Script;
+
 public class Upgrade410to420 implements DbUpgrade {
 	final static Logger s_logger = Logger.getLogger(Upgrade410to420.class);
 
@@ -66,6 +67,8 @@ public class Upgrade410to420 implements DbUpgrade {
         updatePrimaryStore(conn);
         addEgressFwRulesForSRXGuestNw(conn);
         upgradeEIPNetworkOfferings(conn);
+        upgradeDefaultVpcOffering(conn);
+        upgradePhysicalNtwksWithInternalLbProvider(conn);
     }
 	
 	private void updateSystemVmTemplates(Connection conn) {
@@ -399,4 +402,88 @@ public class Upgrade410to420 implements DbUpgrade {
             }
         }
     }
+    
+    
+    private void upgradeDefaultVpcOffering(Connection conn) {
+
+        PreparedStatement pstmt = null;
+        ResultSet rs = null;
+
+        try {
+            pstmt = conn.prepareStatement("select distinct map.vpc_offering_id from `cloud`.`vpc_offering_service_map` map, `cloud`.`vpc_offerings` off where off.id=map.vpc_offering_id AND service='Lb'");
+            rs = pstmt.executeQuery();
+            while (rs.next()) {
+                long id = rs.getLong(1);
+                //Add internal LB vm as a supported provider for the load balancer service
+                pstmt = conn.prepareStatement("INSERT INTO `cloud`.`vpc_offering_service_map` (vpc_offering_id, service, provider) VALUES (?,?,?)");
+                pstmt.setLong(1, id);
+                pstmt.setString(2, "Lb");
+                pstmt.setString(3, "InternalLbVm");
+                pstmt.executeUpdate();
+            }
+            
+        } catch (SQLException e) {
+            throw new CloudRuntimeException("Unable update the default VPC offering with the internal lb service", e);
+        } finally {
+            try {
+                if (rs != null) {
+                    rs.close();
+                }
+                if (pstmt != null) {
+                    pstmt.close();
+                }
+            } catch (SQLException e) {
+            }
+        }
+    }
+    
+    
+    private void upgradePhysicalNtwksWithInternalLbProvider(Connection conn) {
+
+        PreparedStatement pstmt = null;
+        ResultSet rs = null;
+
+        try {
+            pstmt = conn.prepareStatement("SELECT id FROM `cloud`.`physical_network` where removed is null");
+            rs = pstmt.executeQuery();
+            while (rs.next()) {
+                long pNtwkId = rs.getLong(1);
+                String uuid = UUID.randomUUID().toString();
+                //Add internal LB VM to the list of physical network service providers
+                pstmt = conn.prepareStatement("INSERT INTO `cloud`.`physical_network_service_providers` " +
+                		"(uuid, physical_network_id, provider_name, state, load_balance_service_provided, destination_physical_network_id)" +
+                		" VALUES (?, ?, 'InternalLbVm', 'Enabled', 1, 0)");
+                pstmt.setString(1, uuid);
+                pstmt.setLong(2, pNtwkId);
+                pstmt.executeUpdate();
+                
+                //Add internal lb vm to the list of physical network elements
+                PreparedStatement pstmt1 = conn.prepareStatement("SELECT id FROM `cloud`.`physical_network_service_providers`" +
+                		" WHERE physical_network_id=? AND provider_name='InternalLbVm'");
+                ResultSet rs1 = pstmt1.executeQuery();
+                while (rs1.next()) {
+                    long providerId = rs1.getLong(1);
+                    uuid = UUID.randomUUID().toString();
+                    pstmt1 = conn.prepareStatement("INSERT INTO `cloud`.`virtual_router_providers` (nsp_id, uuid, type, enabled) VALUES (?, ?, 'InternalLbVm', 1)");
+                    pstmt1.setLong(1, providerId);
+                    pstmt1.setString(2, uuid);
+                    pstmt1.executeUpdate();
+                }
+            }
+            
+        } catch (SQLException e) {
+            throw new CloudRuntimeException("Unable existing physical networks with internal lb provider", e);
+        } finally {
+            try {
+                if (rs != null) {
+                    rs.close();
+                }
+                if (pstmt != null) {
+                    pstmt.close();
+                }
+            } catch (SQLException e) {
+            }
+        }
+        
+    }
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2660a6b7/engine/schema/src/com/cloud/vm/dao/NicDao.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/vm/dao/NicDao.java b/engine/schema/src/com/cloud/vm/dao/NicDao.java
index 67c1e07..12efe08 100644
--- a/engine/schema/src/com/cloud/vm/dao/NicDao.java
+++ b/engine/schema/src/com/cloud/vm/dao/NicDao.java
@@ -30,7 +30,7 @@ public interface NicDao extends GenericDao<NicVO, Long> {
     
     List<NicVO> listByNetworkId(long networkId);
     
-    NicVO findByInstanceIdAndNetworkId(long networkId, long instanceId);
+    NicVO findByNtwkIdAndInstanceId(long networkId, long instanceId);
     
     NicVO findByInstanceIdAndNetworkIdIncludingRemoved(long networkId, long instanceId);
     

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2660a6b7/engine/schema/src/com/cloud/vm/dao/NicDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/vm/dao/NicDaoImpl.java b/engine/schema/src/com/cloud/vm/dao/NicDaoImpl.java
index c70d194..fa30168 100644
--- a/engine/schema/src/com/cloud/vm/dao/NicDaoImpl.java
+++ b/engine/schema/src/com/cloud/vm/dao/NicDaoImpl.java
@@ -113,7 +113,7 @@ public class NicDaoImpl extends GenericDaoBase<NicVO, Long> implements NicDao {
     }
     
     @Override
-    public NicVO findByInstanceIdAndNetworkId(long networkId, long instanceId) {
+    public NicVO findByNtwkIdAndInstanceId(long networkId, long instanceId) {
         SearchCriteria<NicVO> sc = AllFieldsSearch.create();
         sc.setParameters("network", networkId);
         sc.setParameters("instance", instanceId);

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2660a6b7/engine/schema/src/org/apache/cloudstack/lb/ApplicationLoadBalancerRuleVO.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/org/apache/cloudstack/lb/ApplicationLoadBalancerRuleVO.java b/engine/schema/src/org/apache/cloudstack/lb/ApplicationLoadBalancerRuleVO.java
new file mode 100644
index 0000000..37a747e
--- /dev/null
+++ b/engine/schema/src/org/apache/cloudstack/lb/ApplicationLoadBalancerRuleVO.java
@@ -0,0 +1,133 @@
+// 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 org.apache.cloudstack.lb;
+
+import javax.persistence.Column;
+import javax.persistence.DiscriminatorValue;
+import javax.persistence.Entity;
+import javax.persistence.EnumType;
+import javax.persistence.Enumerated;
+import javax.persistence.PrimaryKeyJoinColumn;
+import javax.persistence.Table;
+
+import org.apache.cloudstack.network.lb.ApplicationLoadBalancerRule;
+
+import com.cloud.network.rules.FirewallRuleVO;
+import com.cloud.utils.net.Ip;
+import com.cloud.utils.net.NetUtils;
+
+/**
+ * This VO represent Internal Load Balancer rule.
+ * Instead of pointing to the public ip address id directly as External Load Balancer rule does, it refers to the ip address by its value/sourceNetworkid
+ *
+ */
+@Entity
+@Table(name=("load_balancing_rules"))
+@DiscriminatorValue(value="LoadBalancing")
+@PrimaryKeyJoinColumn(name="id")
+public class ApplicationLoadBalancerRuleVO extends FirewallRuleVO implements ApplicationLoadBalancerRule{
+    @Column(name="name")
+    private String name;
+
+    @Column(name="description", length=4096)
+    private String description;
+
+    @Column(name="algorithm")
+    private String algorithm;
+
+    @Column(name="default_port_start")
+    private int defaultPortStart;
+    
+    @Column(name="default_port_end")
+    private int defaultPortEnd;
+    
+    @Column(name="source_ip_address_network_id")
+    Long sourceIpNetworkId;
+    
+    @Column(name="source_ip_address")
+    @Enumerated(value=EnumType.STRING)
+    private Ip sourceIp = null;
+    
+    @Enumerated(value=EnumType.STRING)
+    @Column(name="scheme")
+    Scheme scheme;
+
+
+    public ApplicationLoadBalancerRuleVO() {  
+    }
+    
+    public ApplicationLoadBalancerRuleVO(String name, String description, int srcPort, int instancePort, String algorithm,
+            long networkId, long accountId, long domainId, Ip sourceIp, long sourceIpNtwkId, Scheme scheme) {
+        super(null, null, srcPort, srcPort, NetUtils.TCP_PROTO, networkId, accountId, domainId, Purpose.LoadBalancing, null, null,null, null, null);
+        
+        this.name = name;
+        this.description = description;
+        this.algorithm = algorithm;
+        this.defaultPortStart = instancePort;
+        this.defaultPortEnd = instancePort;
+        this.sourceIp = sourceIp;
+        this.sourceIpNetworkId = sourceIpNtwkId;
+        this.scheme = scheme;
+    }
+    
+    
+    @Override
+    public Long getSourceIpNetworkId() {
+        return sourceIpNetworkId;
+    }
+
+    @Override
+    public Ip getSourceIp() {
+        return sourceIp;
+    }
+    
+    @Override
+    public String getName() {
+        return name;
+    }
+
+    @Override
+    public String getDescription() {
+        return description;
+    }
+
+    @Override
+    public String getAlgorithm() {
+        return algorithm;
+    }
+
+    @Override
+    public int getDefaultPortStart() {
+        return defaultPortStart;
+    }
+
+    @Override
+    public int getDefaultPortEnd() {
+        return defaultPortEnd;
+    }
+
+    @Override
+    public Scheme getScheme() {
+        return scheme;
+    }
+
+    @Override
+    public int getInstancePort() {
+        return defaultPortStart;
+    }
+}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2660a6b7/engine/schema/src/org/apache/cloudstack/lb/dao/ApplicationLoadBalancerRuleDao.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/org/apache/cloudstack/lb/dao/ApplicationLoadBalancerRuleDao.java b/engine/schema/src/org/apache/cloudstack/lb/dao/ApplicationLoadBalancerRuleDao.java
new file mode 100644
index 0000000..c385e62
--- /dev/null
+++ b/engine/schema/src/org/apache/cloudstack/lb/dao/ApplicationLoadBalancerRuleDao.java
@@ -0,0 +1,35 @@
+// 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 org.apache.cloudstack.lb.dao;
+
+import java.util.List;
+
+import org.apache.cloudstack.lb.ApplicationLoadBalancerRuleVO;
+
+import com.cloud.network.rules.LoadBalancerContainer.Scheme;
+import com.cloud.utils.db.GenericDao;
+import com.cloud.utils.net.Ip;
+
+public interface ApplicationLoadBalancerRuleDao extends GenericDao<ApplicationLoadBalancerRuleVO, Long>{
+    List<ApplicationLoadBalancerRuleVO> listBySrcIpSrcNtwkId(Ip sourceIp, long sourceNetworkId);
+    List<String> listLbIpsBySourceIpNetworkId(long sourceIpNetworkId);
+    long countBySourceIp(Ip sourceIp, long sourceIpNetworkId);
+    List<ApplicationLoadBalancerRuleVO> listBySourceIpAndNotRevoked(Ip sourceIp, long sourceNetworkId);
+    List<String> listLbIpsBySourceIpNetworkIdAndScheme(long sourceIpNetworkId, Scheme scheme);
+
+}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2660a6b7/engine/schema/src/org/apache/cloudstack/lb/dao/ApplicationLoadBalancerRuleDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/org/apache/cloudstack/lb/dao/ApplicationLoadBalancerRuleDaoImpl.java b/engine/schema/src/org/apache/cloudstack/lb/dao/ApplicationLoadBalancerRuleDaoImpl.java
new file mode 100644
index 0000000..880c67e
--- /dev/null
+++ b/engine/schema/src/org/apache/cloudstack/lb/dao/ApplicationLoadBalancerRuleDaoImpl.java
@@ -0,0 +1,115 @@
+// 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 org.apache.cloudstack.lb.dao;
+
+import java.util.List;
+
+import javax.ejb.Local;
+
+import org.apache.cloudstack.lb.ApplicationLoadBalancerRuleVO;
+import org.springframework.stereotype.Component;
+
+import com.cloud.network.rules.FirewallRule;
+import com.cloud.network.rules.LoadBalancerContainer.Scheme;
+import com.cloud.utils.db.GenericDaoBase;
+import com.cloud.utils.db.GenericSearchBuilder;
+import com.cloud.utils.db.SearchBuilder;
+import com.cloud.utils.db.SearchCriteria;
+import com.cloud.utils.db.SearchCriteria.Func;
+import com.cloud.utils.db.SearchCriteria.Op;
+import com.cloud.utils.net.Ip;
+
+@Component
+@Local(value = { ApplicationLoadBalancerRuleDao.class })
+public class ApplicationLoadBalancerRuleDaoImpl extends GenericDaoBase<ApplicationLoadBalancerRuleVO, Long> implements ApplicationLoadBalancerRuleDao{
+    protected final SearchBuilder<ApplicationLoadBalancerRuleVO> AllFieldsSearch;
+    final GenericSearchBuilder<ApplicationLoadBalancerRuleVO, String> listIps;
+    final GenericSearchBuilder<ApplicationLoadBalancerRuleVO, Long> CountBy;
+    protected final SearchBuilder<ApplicationLoadBalancerRuleVO> NotRevokedSearch;
+
+
+    
+    protected ApplicationLoadBalancerRuleDaoImpl() {
+        AllFieldsSearch = createSearchBuilder();
+        AllFieldsSearch.and("sourceIp", AllFieldsSearch.entity().getSourceIp(), SearchCriteria.Op.EQ);
+        AllFieldsSearch.and("sourceIpNetworkId", AllFieldsSearch.entity().getSourceIpNetworkId(), SearchCriteria.Op.EQ);
+        AllFieldsSearch.and("networkId", AllFieldsSearch.entity().getNetworkId(), SearchCriteria.Op.EQ);
+        AllFieldsSearch.and("scheme", AllFieldsSearch.entity().getScheme(), SearchCriteria.Op.EQ);
+        AllFieldsSearch.done();
+        
+        listIps = createSearchBuilder(String.class);
+        listIps.select(null, Func.DISTINCT, listIps.entity().getSourceIp());
+        listIps.and("sourceIpNetworkId", listIps.entity().getSourceIpNetworkId(), Op.EQ);
+        listIps.and("scheme", listIps.entity().getScheme(), Op.EQ);
+        listIps.done();
+        
+        CountBy = createSearchBuilder(Long.class);
+        CountBy.select(null, Func.COUNT, CountBy.entity().getId());
+        CountBy.and("sourceIp", CountBy.entity().getSourceIp(), Op.EQ);
+        CountBy.and("sourceIpNetworkId", CountBy.entity().getSourceIpNetworkId(), Op.EQ);
+        CountBy.done();
+        
+        NotRevokedSearch = createSearchBuilder();
+        NotRevokedSearch.and("sourceIp", NotRevokedSearch.entity().getSourceIp(), SearchCriteria.Op.EQ);
+        NotRevokedSearch.and("sourceIpNetworkId", NotRevokedSearch.entity().getSourceIpNetworkId(), SearchCriteria.Op.EQ);
+        NotRevokedSearch.and("state", NotRevokedSearch.entity().getState(), SearchCriteria.Op.NEQ);
+        NotRevokedSearch.done();
+    }
+
+    @Override
+    public List<ApplicationLoadBalancerRuleVO> listBySrcIpSrcNtwkId(Ip sourceIp, long sourceNetworkId) {
+        SearchCriteria<ApplicationLoadBalancerRuleVO> sc = AllFieldsSearch.create();
+        sc.setParameters("sourceIp", sourceIp);
+        sc.setParameters("sourceIpNetworkId", sourceNetworkId);
+        return listBy(sc);
+    }
+
+    @Override
+    public List<String> listLbIpsBySourceIpNetworkId(long sourceIpNetworkId) {
+        SearchCriteria<String> sc = listIps.create();
+        sc.setParameters("sourceIpNetworkId", sourceIpNetworkId);
+        return customSearch(sc, null);
+    }
+
+    @Override
+    public long countBySourceIp(Ip sourceIp, long sourceIpNetworkId) {
+        SearchCriteria<Long> sc = CountBy.create();
+        sc.setParameters("sourceIp", sourceIp);
+        sc.setParameters("sourceIpNetworkId", sourceIpNetworkId);
+        List<Long> results = customSearch(sc, null);
+        return results.get(0);
+    }
+
+    @Override
+    public List<ApplicationLoadBalancerRuleVO> listBySourceIpAndNotRevoked(Ip sourceIp, long sourceNetworkId) {
+        SearchCriteria<ApplicationLoadBalancerRuleVO> sc = NotRevokedSearch.create();
+        sc.setParameters("sourceIp", sourceIp);
+        sc.setParameters("sourceIpNetworkId", sourceNetworkId);
+        sc.setParameters("state", FirewallRule.State.Revoke);
+        return listBy(sc);
+    }
+
+    @Override
+    public List<String> listLbIpsBySourceIpNetworkIdAndScheme(long sourceIpNetworkId, Scheme scheme) {
+        SearchCriteria<String> sc = listIps.create();
+        sc.setParameters("sourceIpNetworkId", sourceIpNetworkId);
+        sc.setParameters("scheme", scheme);
+        return customSearch(sc, null);
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2660a6b7/patches/systemvm/debian/config/etc/init.d/cloud-early-config
----------------------------------------------------------------------
diff --git a/patches/systemvm/debian/config/etc/init.d/cloud-early-config b/patches/systemvm/debian/config/etc/init.d/cloud-early-config
index ed3894f..a457f22 100755
--- a/patches/systemvm/debian/config/etc/init.d/cloud-early-config
+++ b/patches/systemvm/debian/config/etc/init.d/cloud-early-config
@@ -901,6 +901,28 @@ setup_elbvm() {
   chkconfig portmap off
 }
 
+setup_ilbvm() {
+  log_it "Setting up Internal Load Balancer system vm"
+  local hyp=$1
+  setup_common eth0 eth1
+  #eth0 = guest network, eth1=control network
+
+  sed -i  /$NAME/d /etc/hosts
+  echo "$ETH0_IP $NAME" >> /etc/hosts
+
+  cp /etc/iptables/iptables-ilbvm /etc/iptables/rules.v4
+  cp /etc/iptables/iptables-ilbvm /etc/iptables/rules
+  setup_sshd $ETH1_IP "eth1"
+  
+  enable_fwding 0
+  enable_svc haproxy 1
+  enable_svc dnsmasq 0
+  enable_svc cloud-passwd-srvr 0
+  enable_svc cloud 0
+  chkconfig nfs-common off
+  chkconfig portmap off
+}
+
 setup_default() {
   cat > /etc/network/interfaces << EOF
 auto lo
@@ -951,6 +973,10 @@ start() {
          [ "$NAME" == "" ] && NAME=elb
          setup_elbvm
 	  ;;
+     ilbvm)
+         [ "$NAME" == "" ] && NAME=ilb
+         setup_ilbvm
+	  ;;
      unknown)
          [ "$NAME" == "" ] && NAME=systemvm
          setup_default;

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2660a6b7/patches/systemvm/debian/config/etc/iptables/iptables-ilbvm
----------------------------------------------------------------------
diff --git a/patches/systemvm/debian/config/etc/iptables/iptables-ilbvm b/patches/systemvm/debian/config/etc/iptables/iptables-ilbvm
new file mode 100755
index 0000000..8d5ca65
--- /dev/null
+++ b/patches/systemvm/debian/config/etc/iptables/iptables-ilbvm
@@ -0,0 +1,33 @@
+# 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.
+
+*nat
+:PREROUTING ACCEPT [0:0]
+:POSTROUTING ACCEPT [0:0]
+:OUTPUT ACCEPT [0:0]
+COMMIT
+*filter
+:INPUT DROP [0:0]
+:FORWARD DROP [0:0]
+:OUTPUT ACCEPT [0:0]
+-A INPUT -i eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT
+-A INPUT -i eth1 -m state --state RELATED,ESTABLISHED -j ACCEPT
+-A INPUT -p icmp -j ACCEPT
+-A INPUT -i lo -j ACCEPT
+-A INPUT -i eth1 -p tcp -m state --state NEW --dport 3922 -j ACCEPT
+COMMIT
+

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2660a6b7/patches/systemvm/debian/config/opt/cloud/bin/ilb.sh
----------------------------------------------------------------------
diff --git a/patches/systemvm/debian/config/opt/cloud/bin/ilb.sh b/patches/systemvm/debian/config/opt/cloud/bin/ilb.sh
new file mode 100755
index 0000000..2a29892
--- /dev/null
+++ b/patches/systemvm/debian/config/opt/cloud/bin/ilb.sh
@@ -0,0 +1,211 @@
+#!/usr/bin/env bash
+# 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.
+
+source /root/func.sh
+
+lock="biglock"
+locked=$(getLockFile $lock)
+if [ "$locked" != "1" ]
+then
+    exit 1
+fi
+
+usage() {
+  printf "Usage: %s:  -a <added public ip address ip:port> -d <removed ip:port> -f <load balancer config> -s <stats ip ip:port:cidr>  \n" $(basename $0) >&2
+}
+
+#set -x
+
+fw_remove_backup() {
+  logger -t cloud "$(basename $0): Entering fw_remove_backup"
+  local lb_vif_list=eth0
+  for vif in $lb_vif_list; do 
+    sudo iptables -F back_load_balancer_$vif 2> /dev/null
+    sudo iptables -D INPUT -i $vif -p tcp  -j back_load_balancer_$vif 2> /dev/null
+    sudo iptables -X back_load_balancer_$vif 2> /dev/null
+  done
+  sudo iptables -F back_lb_stats 2> /dev/null
+  sudo iptables -D INPUT -p tcp  -j back_lb_stats 2> /dev/null
+  sudo iptables -X back_lb_stats 2> /dev/null
+}
+
+fw_restore() {
+  logger -t cloud "$(basename $0): Entering fw_restore"
+  local lb_vif_list="eth0"
+  for vif in $lb_vif_list; do 
+    sudo iptables -F load_balancer_$vif 2> /dev/null
+    sudo iptables -D INPUT -i $vif -p tcp  -j load_balancer_$vif 2> /dev/null
+    sudo iptables -X load_balancer_$vif 2> /dev/null
+    sudo iptables -E back_load_balancer_$vif load_balancer_$vif 2> /dev/null
+  done
+  sudo iptables -F lb_stats 2> /dev/null
+  sudo iptables -D INPUT -p tcp  -j lb_stats 2> /dev/null
+  sudo iptables -X lb_stats 2> /dev/null
+  sudo iptables -E back_lb_stats lb_stats 2> /dev/null
+}
+
+# firewall entry to ensure that haproxy can receive on specified port
+fw_entry() {
+  logger -t cloud "$(basename $0): Entering fw_entry"
+  local added=$1
+  local removed=$2
+  local stats=$3
+  
+  if [ "$added" == "none" ]
+  then
+  	added=""
+  fi
+  
+  if [ "$removed" == "none" ]
+  then
+  	removed=""
+  fi
+  
+  local a=$(echo $added | cut -d, -f1- --output-delimiter=" ")
+  local r=$(echo $removed | cut -d, -f1- --output-delimiter=" ")
+
+# back up the iptable rules by renaming before creating new. 
+  local lb_vif_list=eth0
+  for vif in $lb_vif_list; do 
+    sudo iptables -E load_balancer_$vif back_load_balancer_$vif 2> /dev/null
+    sudo iptables -N load_balancer_$vif 2> /dev/null
+    sudo iptables -A INPUT -i $vif -p tcp  -j load_balancer_$vif
+  done
+  sudo iptables -E lb_stats back_lb_stats 2> /dev/null
+  sudo iptables -N lb_stats 2> /dev/null
+  sudo iptables -A INPUT  -p tcp  -j lb_stats
+
+  for i in $a
+  do
+    local pubIp=$(echo $i | cut -d: -f1)
+    local dport=$(echo $i | cut -d: -f2)    
+    local lb_vif_list="eth0"
+    for vif in $lb_vif_list; do 
+      sudo iptables -A load_balancer_$vif  -p tcp -d $pubIp --dport $dport -j ACCEPT
+      if [ $? -gt 0 ]
+      then
+        return 1
+      fi
+    done      
+  done
+  local pubIp=$(echo $stats | cut -d: -f1)
+  local dport=$(echo $stats | cut -d: -f2)    
+  local cidrs=$(echo $stats | cut -d: -f3 | sed 's/-/,/')
+  sudo iptables -A lb_stats -s $cidrs -p tcp -m state --state NEW -d $pubIp --dport $dport -j ACCEPT
+ 
+  return 0
+}
+
+#Hot reconfigure HA Proxy in the routing domain
+reconfig_lb() {
+  /root/reconfigLB.sh
+  return $?
+}
+
+# Restore the HA Proxy to its previous state, and revert iptables rules on loadbalancer
+restore_lb() {
+  logger -t cloud "Restoring HA Proxy to previous state"
+  # Copy the old version of haproxy.cfg into the file that reconfigLB.sh uses
+  cp /etc/haproxy/haproxy.cfg.old /etc/haproxy/haproxy.cfg.new
+   
+  if [ $? -eq 0 ]
+  then
+    # Run reconfigLB.sh again
+    /root/reconfigLB.sh
+  fi
+}
+
+
+logger -t cloud "$(basename $0): Entering $(dirname $0)/$(basename $0)"
+
+iflag=
+aflag=
+dflag=
+sflag=
+
+while getopts 'i:a:d:s:' OPTION
+do
+  case $OPTION in
+  i)	iflag=1
+		domRIp="$OPTARG" #unused but passed in
+		;;
+  a)	aflag=1
+		addedIps="$OPTARG"
+		;;
+  d)	dflag=1
+		removedIps="$OPTARG"
+		;;
+
+  s)	sflag=1
+		statsIp="$OPTARG"
+		;;
+  ?)	usage
+                unlock_exit 2 $lock $locked
+		;;
+  esac
+done
+
+if [[ "$aflag$dflag" != "1" && "$aflag$dflag" != "11" ]]
+then
+   usage
+   unlock_exit 2 $lock $locked
+fi
+
+if [ "$addedIps" == "" ]
+then
+  addedIps="none"
+fi
+
+
+if [ "$removedIps" == "" ]
+then
+  removedIps="none"
+fi
+
+
+# hot reconfigure haproxy
+reconfig_lb $cfgfile
+
+if [ $? -gt 0 ]
+then
+  logger -t cloud "Reconfiguring ilb failed"
+  unlock_exit 1 $lock $locked
+fi
+
+logger -t cloud "HAProxy reconfigured successfully, configuring firewall"
+
+# iptables entry to ensure that haproxy receives traffic
+fw_entry $addedIps $removedIps $statsIp
+  	
+if [ $? -gt 0 ]
+then
+  logger -t cloud "Failed to apply firewall rules for internal load balancing, reverting HA Proxy config"
+  # Restore the LB
+  restore_lb
+
+  logger -t cloud "Reverting firewall config"
+  fw_restore
+
+  unlock_exit 1 $lock $locked
+else
+  # Remove backedup iptable rules
+  logger -t cloud "Firewall configured successfully, deleting backup firewall config"
+  fw_remove_backup
+fi
+ 
+unlock_exit 0 $lock $locked

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2660a6b7/patches/systemvm/debian/config/opt/cloud/bin/patchsystemvm.sh
----------------------------------------------------------------------
diff --git a/patches/systemvm/debian/config/opt/cloud/bin/patchsystemvm.sh b/patches/systemvm/debian/config/opt/cloud/bin/patchsystemvm.sh
index 8816ad7..9cb0250 100755
--- a/patches/systemvm/debian/config/opt/cloud/bin/patchsystemvm.sh
+++ b/patches/systemvm/debian/config/opt/cloud/bin/patchsystemvm.sh
@@ -135,6 +135,19 @@ elbvm_svcs() {
    echo "cloud dnsmasq cloud-passwd-srvr apache2 nfs-common portmap" > /var/cache/cloud/disabled_svcs
 }
 
+
+ilbvm_svcs() {
+   chkconfig cloud off
+   chkconfig haproxy on ; 
+   chkconfig ssh on
+   chkconfig nfs-common off
+   chkconfig portmap off
+   chkconfig keepalived off
+   chkconfig conntrackd off
+   echo "ssh haproxy" > /var/cache/cloud/enabled_svcs
+   echo "cloud dnsmasq cloud-passwd-srvr apache2 nfs-common portmap" > /var/cache/cloud/disabled_svcs
+}
+
 enable_pcihotplug() {
    sed -i -e "/acpiphp/d" /etc/modules
    sed -i -e "/pci_hotplug/d" /etc/modules
@@ -253,4 +266,14 @@ then
   fi
 fi
 
+if [ "$TYPE" == "ilbvm" ]
+then
+  ilbvm_svcs
+  if [ $? -gt 0 ]
+  then
+    printf "Failed to execute ilbvm svcs\n" >$logfile
+    exit 9
+  fi
+fi
+
 exit $?

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2660a6b7/patches/systemvm/debian/config/opt/cloud/bin/vpc_loadbalancer.sh
----------------------------------------------------------------------
diff --git a/patches/systemvm/debian/config/opt/cloud/bin/vpc_loadbalancer.sh b/patches/systemvm/debian/config/opt/cloud/bin/vpc_loadbalancer.sh
index 334c617..36a2347 100755
--- a/patches/systemvm/debian/config/opt/cloud/bin/vpc_loadbalancer.sh
+++ b/patches/systemvm/debian/config/opt/cloud/bin/vpc_loadbalancer.sh
@@ -18,6 +18,29 @@
 
 # @VERSION@
 
+do_ilb_if_ilb () {
+  local typ=""
+  local pattern="type=(.*)"
+
+  for keyval in $(cat /var/cache/cloud/cmdline)
+  do    
+     if [[ $keyval =~ $pattern ]]; then      
+        typ=${BASH_REMATCH[1]}; 
+     fi 
+  done
+  if [ "$typ" == "ilbvm" ]
+  then
+     logger -t cloud "$(basename $0): Detected that we are running in an internal load balancer vm"
+     $(dirname $0)/ilb.sh "$@"
+     exit $?
+  fi
+
+}
+
+logger -t cloud "$(basename $0): Entering $(dirname $0)/$(basename $0)"
+
+do_ilb_if_ilb "$@"
+
 source /root/func.sh
 source /opt/cloud/bin/vpc_func.sh
 

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2660a6b7/plugins/network-elements/elastic-loadbalancer/src/com/cloud/network/element/ElasticLoadBalancerElement.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/elastic-loadbalancer/src/com/cloud/network/element/ElasticLoadBalancerElement.java b/plugins/network-elements/elastic-loadbalancer/src/com/cloud/network/element/ElasticLoadBalancerElement.java
index bebba3c..8b1b414 100644
--- a/plugins/network-elements/elastic-loadbalancer/src/com/cloud/network/element/ElasticLoadBalancerElement.java
+++ b/plugins/network-elements/elastic-loadbalancer/src/com/cloud/network/element/ElasticLoadBalancerElement.java
@@ -35,6 +35,7 @@ import com.cloud.deploy.DeployDestination;
 import com.cloud.exception.ConcurrentOperationException;
 import com.cloud.exception.InsufficientCapacityException;
 import com.cloud.exception.ResourceUnavailableException;
+import com.cloud.exception.UnsupportedServiceException;
 import com.cloud.network.Network;
 import com.cloud.network.Network.Capability;
 import com.cloud.network.Network.Provider;
@@ -46,6 +47,7 @@ import com.cloud.network.PublicIpAddress;
 import com.cloud.network.dao.NetworkDao;
 import com.cloud.network.lb.ElasticLoadBalancerManager;
 import com.cloud.network.lb.LoadBalancingRule;
+import com.cloud.network.rules.LoadBalancerContainer;
 import com.cloud.offering.NetworkOffering;
 import com.cloud.offerings.dao.NetworkOfferingDao;
 import com.cloud.utils.component.AdapterBase;
@@ -68,12 +70,25 @@ public class ElasticLoadBalancerElement extends AdapterBase implements LoadBalan
     boolean _enabled;
     TrafficType _frontEndTrafficType = TrafficType.Guest;
     
-    private boolean canHandle(Network network) {
+    private boolean canHandle(Network network, List<LoadBalancingRule> rules) {
         if (network.getGuestType() != Network.GuestType.Shared|| network.getTrafficType() != TrafficType.Guest) {
             s_logger.debug("Not handling network with type  " + network.getGuestType() + " and traffic type " + network.getTrafficType());
             return false;
         }
         
+        Map<Capability, String> lbCaps = this.getCapabilities().get(Service.Lb);
+        if (!lbCaps.isEmpty()) {
+            String schemeCaps = lbCaps.get(Capability.LbSchemes);
+            if (schemeCaps != null) {
+                for (LoadBalancingRule rule : rules) {
+                    if (!schemeCaps.contains(rule.getScheme().toString())) {
+                        s_logger.debug("Scheme " + rules.get(0).getScheme() + " is not supported by the provider " + this.getName());
+                        return false;
+                    }
+                }
+            }
+        }
+        
         return true;
     }
     
@@ -94,6 +109,7 @@ public class ElasticLoadBalancerElement extends AdapterBase implements LoadBalan
         lbCapabilities.put(Capability.SupportedLBAlgorithms, "roundrobin,leastconn,source");
         lbCapabilities.put(Capability.SupportedLBIsolation, "shared");
         lbCapabilities.put(Capability.SupportedProtocols, "tcp, udp");
+        lbCapabilities.put(Capability.LbSchemes, LoadBalancerContainer.Scheme.Public.toString());
         
         capabilities.put(Service.Lb, lbCapabilities);   
         return capabilities;
@@ -139,10 +155,10 @@ public class ElasticLoadBalancerElement extends AdapterBase implements LoadBalan
     
     @Override
     public boolean applyLBRules(Network network, List<LoadBalancingRule> rules) throws ResourceUnavailableException {
-        if (!canHandle(network)) {
+        if (!canHandle(network, rules)) {
             return false;
         }
-        
+                
         return _lbMgr.applyLoadBalancerRules(network, rules);
     }
 

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2660a6b7/plugins/network-elements/elastic-loadbalancer/src/com/cloud/network/lb/ElasticLoadBalancerManager.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/elastic-loadbalancer/src/com/cloud/network/lb/ElasticLoadBalancerManager.java b/plugins/network-elements/elastic-loadbalancer/src/com/cloud/network/lb/ElasticLoadBalancerManager.java
index aea795d..cce2b2c 100644
--- a/plugins/network-elements/elastic-loadbalancer/src/com/cloud/network/lb/ElasticLoadBalancerManager.java
+++ b/plugins/network-elements/elastic-loadbalancer/src/com/cloud/network/lb/ElasticLoadBalancerManager.java
@@ -19,11 +19,11 @@ package com.cloud.network.lb;
 import java.util.List;
 
 import org.apache.cloudstack.api.command.user.loadbalancer.CreateLoadBalancerRuleCmd;
+
 import com.cloud.exception.InsufficientAddressCapacityException;
 import com.cloud.exception.NetworkRuleConflictException;
 import com.cloud.exception.ResourceUnavailableException;
 import com.cloud.network.Network;
-import com.cloud.network.rules.FirewallRule;
 import com.cloud.network.rules.LoadBalancer;
 import com.cloud.user.Account;
 
@@ -32,7 +32,7 @@ public interface ElasticLoadBalancerManager {
     public static final int DEFAULT_ELB_VM_CPU_MHZ = 256;               // 500 MHz
 
     public boolean applyLoadBalancerRules(Network network, 
-            List<? extends FirewallRule> rules) 
+            List<LoadBalancingRule> rules) 
             throws ResourceUnavailableException;
 
     public LoadBalancer handleCreateLoadBalancerRule(CreateLoadBalancerRuleCmd lb, Account caller, long networkId) throws InsufficientAddressCapacityException, NetworkRuleConflictException;

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2660a6b7/plugins/network-elements/elastic-loadbalancer/src/com/cloud/network/lb/ElasticLoadBalancerManagerImpl.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/elastic-loadbalancer/src/com/cloud/network/lb/ElasticLoadBalancerManagerImpl.java b/plugins/network-elements/elastic-loadbalancer/src/com/cloud/network/lb/ElasticLoadBalancerManagerImpl.java
index 283b517..b21e8f9 100644
--- a/plugins/network-elements/elastic-loadbalancer/src/com/cloud/network/lb/ElasticLoadBalancerManagerImpl.java
+++ b/plugins/network-elements/elastic-loadbalancer/src/com/cloud/network/lb/ElasticLoadBalancerManagerImpl.java
@@ -102,7 +102,6 @@ import com.cloud.network.router.VirtualRouter.RedundantState;
 import com.cloud.network.router.VirtualRouter.Role;
 import com.cloud.network.router.VpcVirtualNetworkApplianceManager;
 import com.cloud.network.rules.FirewallRule;
-import com.cloud.network.rules.FirewallRule.Purpose;
 import com.cloud.network.rules.LoadBalancer;
 import com.cloud.offering.NetworkOffering;
 import com.cloud.offering.ServiceOffering;
@@ -118,7 +117,6 @@ import com.cloud.user.UserContext;
 import com.cloud.user.dao.AccountDao;
 import com.cloud.utils.NumbersUtil;
 import com.cloud.utils.Pair;
-import com.cloud.utils.component.Manager;
 import com.cloud.utils.component.ManagerBase;
 import com.cloud.utils.concurrency.NamedThreadFactory;
 import com.cloud.utils.db.DB;
@@ -126,6 +124,7 @@ 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.utils.net.Ip;
 import com.cloud.vm.DomainRouterVO;
 import com.cloud.vm.NicProfile;
 import com.cloud.vm.ReservationContext;
@@ -297,8 +296,7 @@ ElasticLoadBalancerManager, VirtualMachineGuru<DomainRouterVO> {
             String protocol = rule.getProtocol();
             String algorithm = rule.getAlgorithm();
 
-            String elbIp = _networkModel.getIp(rule.getSourceIpAddressId()).getAddress()
-                    .addr();
+            String elbIp = rule.getSourceIp().addr();
             int srcPort = rule.getSourcePortStart();
             String uuid = rule.getUuid();
             List<LbDestination> destinations = rule.getDestinations();
@@ -331,8 +329,10 @@ ElasticLoadBalancerManager, VirtualMachineGuru<DomainRouterVO> {
         return sendCommandsToRouter(elbVm, cmds);
     }
     
-    protected DomainRouterVO findElbVmForLb(FirewallRule lb) {//TODO: use a table to lookup
-        ElasticLbVmMapVO map = _elbVmMapDao.findOneByIp(lb.getSourceIpAddressId());
+    protected DomainRouterVO findElbVmForLb(LoadBalancingRule lb) {//TODO: use a table to lookup
+        Network ntwk = _networkModel.getNetwork(lb.getNetworkId());
+        long sourceIpId = _networkModel.getPublicIpAddress(lb.getSourceIp().addr(), ntwk.getDataCenterId()).getId();
+        ElasticLbVmMapVO map = _elbVmMapDao.findOneByIp(sourceIpId);
         if (map == null) {
             return null;
         }
@@ -342,15 +342,11 @@ ElasticLoadBalancerManager, VirtualMachineGuru<DomainRouterVO> {
 
     @Override
     public boolean applyLoadBalancerRules(Network network,
-            List<? extends FirewallRule> rules)
+            List<LoadBalancingRule> rules)
             throws ResourceUnavailableException {
         if (rules == null || rules.isEmpty()) {
             return true;
         }
-        if (rules.get(0).getPurpose() != Purpose.LoadBalancing) {
-            s_logger.warn("ELB: Not handling non-LB firewall rules");
-            return false;
-        }
         
         DomainRouterVO elbVm = findElbVmForLb(rules.get(0));
                                                                           
@@ -363,14 +359,16 @@ ElasticLoadBalancerManager, VirtualMachineGuru<DomainRouterVO> {
 
         if (elbVm.getState() == State.Running) {
             //resend all rules for the public ip
-            List<LoadBalancerVO> lbs = _lbDao.listByIpAddress(rules.get(0).getSourceIpAddressId());
+            long sourceIpId = _networkModel.getPublicIpAddress(rules.get(0).getSourceIp().addr(), network.getDataCenterId()).getId();
+            List<LoadBalancerVO> lbs = _lbDao.listByIpAddress(sourceIpId);
             List<LoadBalancingRule> lbRules = new ArrayList<LoadBalancingRule>();
             for (LoadBalancerVO lb : lbs) {
                 List<LbDestination> dstList = _lbMgr.getExistingDestinations(lb.getId());
                 List<LbStickinessPolicy> policyList = _lbMgr.getStickinessPolicies(lb.getId());
                 List<LbHealthCheckPolicy> hcPolicyList = _lbMgr.getHealthCheckPolicies(lb.getId());
+                Ip sourceIp = _networkModel.getPublicIpAddress(lb.getSourceIpAddressId()).getAddress();
                 LoadBalancingRule loadBalancing = new LoadBalancingRule(
-                        lb, dstList, policyList, hcPolicyList);
+                        lb, dstList, policyList, hcPolicyList, sourceIp);
                 lbRules.add(loadBalancing);
             }
             return applyLBRules(elbVm, lbRules, network.getId());
@@ -656,7 +654,10 @@ ElasticLoadBalancerManager, VirtualMachineGuru<DomainRouterVO> {
             LoadBalancer result = null;
             try {
                 lb.setSourceIpAddressId(ipId);
-                result = _lbMgr.createLoadBalancer(lb, false);
+                
+                result = _lbMgr.createPublicLoadBalancer(lb.getXid(), lb.getName(), lb.getDescription(), 
+                        lb.getSourcePortStart(), lb.getDefaultPortStart(), ipId.longValue(), lb.getProtocol(),
+                        lb.getAlgorithm(), false, UserContext.current());
             } catch (NetworkRuleConflictException e) {
                 s_logger.warn("Failed to create LB rule, not continuing with ELB deployment");
                 if (newIp) {
@@ -943,7 +944,8 @@ ElasticLoadBalancerManager, VirtualMachineGuru<DomainRouterVO> {
             List<LbDestination> dstList = _lbMgr.getExistingDestinations(lb.getId());
             List<LbStickinessPolicy> policyList = _lbMgr.getStickinessPolicies(lb.getId());
             List<LbHealthCheckPolicy> hcPolicyList = _lbMgr.getHealthCheckPolicies(lb.getId());
-            LoadBalancingRule loadBalancing = new LoadBalancingRule(lb, dstList, policyList, hcPolicyList);
+            Ip sourceIp = _networkModel.getPublicIpAddress(lb.getSourceIpAddressId()).getAddress();
+            LoadBalancingRule loadBalancing = new LoadBalancingRule(lb, dstList, policyList, hcPolicyList, sourceIp);
             lbRules.add(loadBalancing);
         }
 

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2660a6b7/plugins/network-elements/f5/src/com/cloud/network/element/F5ExternalLoadBalancerElement.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/f5/src/com/cloud/network/element/F5ExternalLoadBalancerElement.java b/plugins/network-elements/f5/src/com/cloud/network/element/F5ExternalLoadBalancerElement.java
index e384e3c..80b42e0 100644
--- a/plugins/network-elements/f5/src/com/cloud/network/element/F5ExternalLoadBalancerElement.java
+++ b/plugins/network-elements/f5/src/com/cloud/network/element/F5ExternalLoadBalancerElement.java
@@ -16,9 +16,30 @@
 // under the License.
 package com.cloud.network.element;
 
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import javax.ejb.Local;
+import javax.inject.Inject;
+
+import org.apache.cloudstack.api.response.ExternalLoadBalancerResponse;
+import org.apache.cloudstack.network.ExternalNetworkDeviceManager.NetworkDevice;
+import org.apache.log4j.Logger;
+
 import com.cloud.agent.api.to.LoadBalancerTO;
 import com.cloud.api.ApiDBUtils;
-import com.cloud.api.commands.*;
+import com.cloud.api.commands.AddExternalLoadBalancerCmd;
+import com.cloud.api.commands.AddF5LoadBalancerCmd;
+import com.cloud.api.commands.ConfigureF5LoadBalancerCmd;
+import com.cloud.api.commands.DeleteExternalLoadBalancerCmd;
+import com.cloud.api.commands.DeleteF5LoadBalancerCmd;
+import com.cloud.api.commands.ListExternalLoadBalancersCmd;
+import com.cloud.api.commands.ListF5LoadBalancerNetworksCmd;
+import com.cloud.api.commands.ListF5LoadBalancersCmd;
 import com.cloud.api.response.F5LoadBalancerResponse;
 import com.cloud.configuration.Config;
 import com.cloud.configuration.ConfigurationManager;
@@ -27,22 +48,41 @@ import com.cloud.dc.DataCenter;
 import com.cloud.dc.DataCenterVO;
 import com.cloud.dc.dao.DataCenterDao;
 import com.cloud.deploy.DeployDestination;
-import com.cloud.exception.*;
+import com.cloud.exception.ConcurrentOperationException;
+import com.cloud.exception.InsufficientCapacityException;
+import com.cloud.exception.InsufficientNetworkCapacityException;
+import com.cloud.exception.InvalidParameterValueException;
+import com.cloud.exception.ResourceUnavailableException;
 import com.cloud.host.Host;
 import com.cloud.host.HostVO;
 import com.cloud.host.dao.HostDao;
 import com.cloud.host.dao.HostDetailsDao;
-import com.cloud.network.*;
+import com.cloud.network.ExternalLoadBalancerDeviceManager;
+import com.cloud.network.ExternalLoadBalancerDeviceManagerImpl;
+import com.cloud.network.Network;
 import com.cloud.network.Network.Capability;
 import com.cloud.network.Network.Provider;
 import com.cloud.network.Network.Service;
+import com.cloud.network.NetworkModel;
 import com.cloud.network.Networks.TrafficType;
-import com.cloud.network.dao.*;
+import com.cloud.network.PhysicalNetwork;
+import com.cloud.network.PhysicalNetworkServiceProvider;
+import com.cloud.network.PublicIpAddress;
+import com.cloud.network.dao.ExternalLoadBalancerDeviceDao;
+import com.cloud.network.dao.ExternalLoadBalancerDeviceVO;
 import com.cloud.network.dao.ExternalLoadBalancerDeviceVO.LBDeviceState;
+import com.cloud.network.dao.NetworkDao;
+import com.cloud.network.dao.NetworkExternalLoadBalancerDao;
+import com.cloud.network.dao.NetworkExternalLoadBalancerVO;
+import com.cloud.network.dao.NetworkServiceMapDao;
+import com.cloud.network.dao.NetworkVO;
+import com.cloud.network.dao.PhysicalNetworkDao;
+import com.cloud.network.dao.PhysicalNetworkVO;
 import com.cloud.network.lb.LoadBalancingRule;
 import com.cloud.network.resource.F5BigIpResource;
 import com.cloud.network.rules.LbStickinessMethod;
 import com.cloud.network.rules.LbStickinessMethod.StickinessMethodType;
+import com.cloud.network.rules.LoadBalancerContainer;
 import com.cloud.offering.NetworkOffering;
 import com.cloud.utils.NumbersUtil;
 import com.cloud.utils.exception.CloudRuntimeException;
@@ -51,13 +91,6 @@ import com.cloud.vm.ReservationContext;
 import com.cloud.vm.VirtualMachine;
 import com.cloud.vm.VirtualMachineProfile;
 import com.google.gson.Gson;
-import org.apache.cloudstack.api.response.ExternalLoadBalancerResponse;
-import org.apache.cloudstack.network.ExternalNetworkDeviceManager.NetworkDevice;
-import org.apache.log4j.Logger;
-
-import javax.ejb.Local;
-import javax.inject.Inject;
-import java.util.*;
 
 @Local(value = {NetworkElement.class, LoadBalancingServiceProvider.class, IpDeployer.class})
 public class F5ExternalLoadBalancerElement extends ExternalLoadBalancerDeviceManagerImpl implements LoadBalancingServiceProvider, IpDeployer, F5ExternalLoadBalancerElementService, ExternalLoadBalancerDeviceManager {
@@ -87,11 +120,25 @@ public class F5ExternalLoadBalancerElement extends ExternalLoadBalancerDeviceMan
     @Inject
     ConfigurationDao _configDao;
 
-    private boolean canHandle(Network config) {
+    private boolean canHandle(Network config, List<LoadBalancingRule> rules) {
         if ((config.getGuestType() != Network.GuestType.Isolated && config.getGuestType() != Network.GuestType.Shared) || config.getTrafficType() != TrafficType.Guest) {
+
             s_logger.trace("Not handling network with Type  " + config.getGuestType() + " and traffic type " + config.getTrafficType());
             return false;
         }
+        
+        Map<Capability, String> lbCaps = this.getCapabilities().get(Service.Lb);
+        if (!lbCaps.isEmpty()) {
+            String schemeCaps = lbCaps.get(Capability.LbSchemes);
+            if (schemeCaps != null && rules != null && !rules.isEmpty()) {
+                for (LoadBalancingRule rule : rules) {
+                    if (!schemeCaps.contains(rule.getScheme().toString())) {
+                        s_logger.debug("Scheme " + rules.get(0).getScheme() + " is not supported by the provider " + this.getName());
+                        return false;
+                    }
+                }
+            }
+        }
 
         return (_networkManager.isProviderForNetwork(getProvider(), config.getId()) && _ntwkSrvcDao.canProviderSupportServiceInNetwork(config.getId(), Service.Lb, Network.Provider.F5BigIp));
     }
@@ -100,7 +147,7 @@ public class F5ExternalLoadBalancerElement extends ExternalLoadBalancerDeviceMan
     public boolean implement(Network guestConfig, NetworkOffering offering, DeployDestination dest, ReservationContext context) throws ResourceUnavailableException, ConcurrentOperationException,
     InsufficientNetworkCapacityException {
 
-        if (!canHandle(guestConfig)) {
+        if (!canHandle(guestConfig, null)) {
             return false;
         }
 
@@ -124,7 +171,7 @@ public class F5ExternalLoadBalancerElement extends ExternalLoadBalancerDeviceMan
 
     @Override
     public boolean shutdown(Network guestConfig, ReservationContext context, boolean cleanup) throws ResourceUnavailableException, ConcurrentOperationException {
-        if (!canHandle(guestConfig)) {
+        if (!canHandle(guestConfig, null)) {
             return false;
         }
 
@@ -143,13 +190,16 @@ public class F5ExternalLoadBalancerElement extends ExternalLoadBalancerDeviceMan
 
     @Override
     public boolean validateLBRule(Network network, LoadBalancingRule rule) {
-        String algo = rule.getAlgorithm();
-        return (algo.equals("roundrobin") || algo.equals("leastconn"));
+        if (canHandle(network, new ArrayList<LoadBalancingRule>(Arrays.asList(rule)))) {
+            String algo = rule.getAlgorithm();
+            return (algo.equals("roundrobin") || algo.equals("leastconn"));
+        }
+        return true;
     }
 
     @Override
     public boolean applyLBRules(Network config, List<LoadBalancingRule> rules) throws ResourceUnavailableException {
-        if (!canHandle(config)) {
+        if (!canHandle(config, rules)) {
             return false;
         }
 
@@ -180,6 +230,9 @@ public class F5ExternalLoadBalancerElement extends ExternalLoadBalancerDeviceMan
 
         // Support inline mode with firewall
         lbCapabilities.put(Capability.InlineMode, "true");
+        
+        //support only for public lb
+        lbCapabilities.put(Capability.LbSchemes, LoadBalancerContainer.Scheme.Public.toString());
 
         LbStickinessMethod method;
         List<LbStickinessMethod> methodList = new ArrayList<LbStickinessMethod>();


[48/50] [abbrv] Merged master to vmsync

Posted by ah...@apache.org.
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/d4039743/core/src/com/cloud/agent/api/CheckVirtualMachineAnswer.java
----------------------------------------------------------------------
diff --cc core/src/com/cloud/agent/api/CheckVirtualMachineAnswer.java
index 0000000,3f0ffdb..cebdfd1
mode 000000,100644..100644
--- a/core/src/com/cloud/agent/api/CheckVirtualMachineAnswer.java
+++ b/core/src/com/cloud/agent/api/CheckVirtualMachineAnswer.java
@@@ -1,0 -1,52 +1,52 @@@
+ // 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.agent.api;
+ 
 -import com.cloud.vm.VirtualMachine.State;
++import com.cloud.vm.VirtualMachine.PowerState;
+ 
+ public class CheckVirtualMachineAnswer extends Answer {
+ 
+     Integer vncPort;
 -    State state;
++    PowerState state;
+ 
+ 
+     protected CheckVirtualMachineAnswer() {
+     }
+ 
 -    public CheckVirtualMachineAnswer(CheckVirtualMachineCommand cmd, State state, Integer vncPort, String detail) {
++    public CheckVirtualMachineAnswer(CheckVirtualMachineCommand cmd, PowerState state, Integer vncPort, String detail) {
+         super(cmd, true, detail);
+         this.state = state;
+         this.vncPort = vncPort;
+     }
+ 
 -    public CheckVirtualMachineAnswer(CheckVirtualMachineCommand cmd, State state, Integer vncPort) {
++    public CheckVirtualMachineAnswer(CheckVirtualMachineCommand cmd, PowerState state, Integer vncPort) {
+         this(cmd, state, vncPort, null);
+     }
+ 
+     public CheckVirtualMachineAnswer(CheckVirtualMachineCommand cmd, String detail) {
+         super(cmd, false, detail);
+     }
+ 
+ 
+     public Integer getVncPort() {
+         return vncPort;
+     }
+ 
 -    public State getState() {
++    public PowerState getState() {
+         return state;
+     }
+ }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/d4039743/core/src/com/cloud/agent/api/ClusterSyncAnswer.java
----------------------------------------------------------------------
diff --cc core/src/com/cloud/agent/api/ClusterSyncAnswer.java
index 0000000,99fee2a..44108fe
mode 000000,100644..100644
--- a/core/src/com/cloud/agent/api/ClusterSyncAnswer.java
+++ b/core/src/com/cloud/agent/api/ClusterSyncAnswer.java
@@@ -1,0 -1,55 +1,55 @@@
+ // 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.agent.api;
+ 
+ import java.util.HashMap;
+ 
+ import com.cloud.utils.Pair;
 -import com.cloud.vm.VirtualMachine.State;
++import com.cloud.vm.VirtualMachine.PowerState;
+ 
+ public class ClusterSyncAnswer extends Answer {
+     private long _clusterId;
 -    private HashMap<String, Pair<String, State>> _newStates;
++    private HashMap<String, Pair<String, PowerState>> _newStates;
+     private boolean _isExecuted=false;
+ 
+     // this is here because a cron command answer is being sent twice
+     //  AgentAttache.processAnswers
+     //  AgentManagerImpl.notifyAnswersToMonitors
+     public boolean isExceuted(){
+         return _isExecuted;
+     }
+ 
+     public void setExecuted(){
+         _isExecuted = true;
+     }
+ 
+ 
 -    public ClusterSyncAnswer(long clusterId, HashMap<String, Pair<String, State>> newStates){
++    public ClusterSyncAnswer(long clusterId, HashMap<String, Pair<String, PowerState>> newStates){
+         _clusterId = clusterId;
+         _newStates = newStates;
+         result = true;
+     }
+ 
+     public long getClusterId() {
+         return _clusterId;
+     }
+ 
 -    public HashMap<String, Pair<String, State>> getNewStates() {
++    public HashMap<String, Pair<String, PowerState>> getNewStates() {
+         return _newStates;
+     }
+ 
+ }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/d4039743/core/src/com/cloud/agent/api/PingRoutingCommand.java
----------------------------------------------------------------------
diff --cc core/src/com/cloud/agent/api/PingRoutingCommand.java
index 0000000,e25ac62..8b8b554
mode 000000,100755..100755
--- a/core/src/com/cloud/agent/api/PingRoutingCommand.java
+++ b/core/src/com/cloud/agent/api/PingRoutingCommand.java
@@@ -1,0 -1,54 +1,54 @@@
+ // 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.agent.api;
+ 
+ import java.util.Map;
+ 
+ import com.cloud.host.Host;
 -import com.cloud.vm.VirtualMachine.State;
++import com.cloud.vm.VirtualMachine.PowerState;
+ 
+ public class PingRoutingCommand extends PingCommand {
 -    Map<String, State> newStates;
++    Map<String, PowerState> newStates;
+     boolean _gatewayAccessible = true;
+     boolean _vnetAccessible = true;
+ 
+     protected PingRoutingCommand() {
+     }
+ 
 -    public PingRoutingCommand(Host.Type type, long id, Map<String, State> states) {
++    public PingRoutingCommand(Host.Type type, long id, Map<String, PowerState> states) {
+         super(type, id);
+         this.newStates = states;
+     }
+ 
 -    public Map<String, State> getNewStates() {
++    public Map<String, PowerState> getNewStates() {
+         return newStates;
+     }
+ 
+     public boolean isGatewayAccessible() {
+         return _gatewayAccessible;
+     }
+     public void setGatewayAccessible(boolean gatewayAccessible) {
+         _gatewayAccessible = gatewayAccessible;
+     }
+ 
+     public boolean isVnetAccessible() {
+         return _vnetAccessible;
+     }
+     public void setVnetAccessible(boolean vnetAccessible) {
+         _vnetAccessible = vnetAccessible;
+     }
+ }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/d4039743/core/src/com/cloud/agent/api/PingRoutingWithNwGroupsCommand.java
----------------------------------------------------------------------
diff --cc core/src/com/cloud/agent/api/PingRoutingWithNwGroupsCommand.java
index 0000000,51226bc..bb183bd
mode 000000,100644..100644
--- a/core/src/com/cloud/agent/api/PingRoutingWithNwGroupsCommand.java
+++ b/core/src/com/cloud/agent/api/PingRoutingWithNwGroupsCommand.java
@@@ -1,0 -1,46 +1,46 @@@
+ // 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.agent.api;
+ 
+ import java.util.HashMap;
+ import java.util.Map;
+ 
+ import com.cloud.host.Host;
+ import com.cloud.utils.Pair;
 -import com.cloud.vm.VirtualMachine.State;
++import com.cloud.vm.VirtualMachine.PowerState;
+ 
+ 
+ public class PingRoutingWithNwGroupsCommand extends PingRoutingCommand {
+ 	HashMap<String, Pair<Long, Long>> newGroupStates;
+ 
+ 	protected PingRoutingWithNwGroupsCommand() {
+ 		super();
+ 	}
+ 
 -	public PingRoutingWithNwGroupsCommand(Host.Type type, long id, Map<String, State> states, HashMap<String, Pair<Long, Long>> nwGrpStates) {
++	public PingRoutingWithNwGroupsCommand(Host.Type type, long id, Map<String, PowerState> states, HashMap<String, Pair<Long, Long>> nwGrpStates) {
+ 		super(type, id, states);
+ 		newGroupStates = nwGrpStates;
+ 	}
+ 
+ 	public HashMap<String, Pair<Long, Long>> getNewGroupStates() {
+ 		return newGroupStates;
+ 	}
+ 
+ 	public void setNewGroupStates(HashMap<String, Pair<Long, Long>> newGroupStates) {
+ 		this.newGroupStates = newGroupStates;
+ 	}
+ }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/d4039743/core/src/com/cloud/agent/api/PingRoutingWithOvsCommand.java
----------------------------------------------------------------------
diff --cc core/src/com/cloud/agent/api/PingRoutingWithOvsCommand.java
index 0000000,d44987b..f87bed8
mode 000000,100644..100644
--- a/core/src/com/cloud/agent/api/PingRoutingWithOvsCommand.java
+++ b/core/src/com/cloud/agent/api/PingRoutingWithOvsCommand.java
@@@ -1,0 -1,42 +1,42 @@@
+ // 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.agent.api;
+ 
+ import java.util.List;
+ import java.util.Map;
+ 
+ import com.cloud.host.Host;
+ import com.cloud.utils.Pair;
 -import com.cloud.vm.VirtualMachine.State;
++import com.cloud.vm.VirtualMachine.PowerState;
+ 
+ public class PingRoutingWithOvsCommand extends PingRoutingCommand {
+ 	List<Pair<String, Long>> states;
+ 
+ 	protected PingRoutingWithOvsCommand() {
+ 		super();
+ 	}
+ 
+ 	public PingRoutingWithOvsCommand(Host.Type type, long id,
 -			Map<String, State> states, List<Pair<String, Long>> ovsStates) {
++			Map<String, PowerState> states, List<Pair<String, Long>> ovsStates) {
+ 		super(type, id, states);
+ 		this.states = ovsStates;
+ 	}
+ 
+ 	public List<Pair<String, Long>> getStates() {
+ 		return states;
+ 	}
+ }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/d4039743/core/src/com/cloud/agent/api/StartupRoutingCommand.java
----------------------------------------------------------------------
diff --cc core/src/com/cloud/agent/api/StartupRoutingCommand.java
index 0000000,5961ab0..31db26f
mode 000000,100755..100755
--- a/core/src/com/cloud/agent/api/StartupRoutingCommand.java
+++ b/core/src/com/cloud/agent/api/StartupRoutingCommand.java
@@@ -1,0 -1,224 +1,209 @@@
+ // 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.agent.api;
+ 
+ import java.util.HashMap;
+ import java.util.Map;
+ 
+ import com.cloud.host.Host;
+ import com.cloud.hypervisor.Hypervisor.HypervisorType;
+ import com.cloud.network.Networks.RouterPrivateIpStrategy;
+ import com.cloud.utils.Pair;
 -import com.cloud.vm.VirtualMachine.State;
++import com.cloud.vm.VirtualMachine.PowerState;
+ 
+ public class StartupRoutingCommand extends StartupCommand {
 -    public static class VmState {
 -        State state;
 -        String host;
 -        public VmState() {
 -        }
 -        public VmState(State state, String host) {
 -            this.state = state;
 -            this.host = host;
 -        }
 -        public State getState() {
 -            return state;
 -        }
 -        public String getHost() {
 -            return host;
 -        }
 -    }
+     int cpus;
+     long speed;
+     long memory;
+     long dom0MinMemory;
+     boolean poolSync;
 -    Map<String, VmState> vms;
 -    HashMap<String, Pair<String, State>> _clusterVMStates;
++    Map<String, HostVmStateReportEntry> vms;
++    HashMap<String, Pair<String, PowerState>> _clusterVMStates;
+     String caps;
+     String pool;
+     HypervisorType hypervisorType;
+     Map<String, String> hostDetails; //stuff like host os, cpu capabilities
+     String hypervisorVersion;
+ 
+     public StartupRoutingCommand() {
+         super(Host.Type.Routing);
+         hostDetails = new HashMap<String, String>();
+         getHostDetails().put(RouterPrivateIpStrategy.class.getCanonicalName(), RouterPrivateIpStrategy.DcGlobal.toString());
 -
+     }
+ 
+     public StartupRoutingCommand(int cpus,
+                                    long speed,
+                                    long memory,
+                                    long dom0MinMemory,
+                                    String caps,
+                                    HypervisorType hypervisorType,
+                                    RouterPrivateIpStrategy privIpStrategy,
 -                                   Map<String, VmState> vms) {
 -        this(cpus, speed, memory, dom0MinMemory, caps, hypervisorType, vms);
++                                   Map<String, HostVmStateReportEntry> vms) {
++        
++    	this(cpus, speed, memory, dom0MinMemory, caps, hypervisorType, vms);
+         getHostDetails().put(RouterPrivateIpStrategy.class.getCanonicalName(), privIpStrategy.toString());
+     }
+ 
+     public StartupRoutingCommand(int cpus,
+             long speed,
+             long memory,
+             long dom0MinMemory,
+             String caps,
+             HypervisorType hypervisorType,
+             RouterPrivateIpStrategy privIpStrategy) {
 -this(cpus, speed, memory, dom0MinMemory, caps, hypervisorType, new HashMap<String,String>(), new HashMap<String, VmState>());
 -getHostDetails().put(RouterPrivateIpStrategy.class.getCanonicalName(), privIpStrategy.toString());
 -}
++    
++    	this(cpus, speed, memory, dom0MinMemory, caps, hypervisorType, new HashMap<String,String>(), new HashMap<String, HostVmStateReportEntry>());
++    		getHostDetails().put(RouterPrivateIpStrategy.class.getCanonicalName(), privIpStrategy.toString());
++    }
+ 
+     public StartupRoutingCommand(int cpus,
+             long speed,
+             long memory,
+             long dom0MinMemory,
+             final String caps,
+             final HypervisorType hypervisorType,
+             final Map<String, String> hostDetails,
 -            Map<String, VmState> vms) {
++            Map<String, HostVmStateReportEntry> vms) {
+         super(Host.Type.Routing);
+         this.cpus = cpus;
+         this.speed = speed;
+         this.memory = memory;
+         this.dom0MinMemory = dom0MinMemory;
+         this.vms = vms;
+         this.hypervisorType = hypervisorType;
+         this.hostDetails = hostDetails;
+         this.caps = caps;
+         this.poolSync = false;
+     }
+ 
+     public StartupRoutingCommand(int cpus2, long speed2, long memory2,
+             long dom0MinMemory2, String caps2, HypervisorType hypervisorType2,
 -            Map<String, VmState> vms2) {
++            Map<String, HostVmStateReportEntry> vms2) {
+         this(cpus2, speed2, memory2, dom0MinMemory2, caps2, hypervisorType2, new HashMap<String,String>(), vms2);
+     }
+ 
 -    public StartupRoutingCommand(int cpus, long speed, long memory, long dom0MinMemory, final String caps, final HypervisorType hypervisorType, final Map<String, String> hostDetails, Map<String, VmState> vms, String hypervisorVersion) {
++    public StartupRoutingCommand(int cpus, long speed, long memory, long dom0MinMemory, final String caps, final HypervisorType hypervisorType, final Map<String, String> hostDetails, Map<String, HostVmStateReportEntry> vms, String hypervisorVersion) {
+         this(cpus, speed, memory, dom0MinMemory, caps, hypervisorType, hostDetails, vms);
+         this.hypervisorVersion = hypervisorVersion;
+     }
+ 
 -    public void setChanges(Map<String, VmState> vms) {
++    public void setChanges(Map<String, HostVmStateReportEntry> vms) {
+         this.vms = vms;
+     }
+ 
 -    public void setStateChanges(Map<String, State> vms) {
++    public void setStateChanges(Map<String, PowerState> vms) {
+         for( String vm_name : vms.keySet() ) {
+             if( this.vms == null ) {
 -                this.vms = new HashMap<String, VmState>();
++                this.vms = new HashMap<String, HostVmStateReportEntry>();
+             }
 -            this.vms.put(vm_name, new VmState(vms.get(vm_name), null));
++            this.vms.put(vm_name, new HostVmStateReportEntry(vms.get(vm_name), null));
+         }
+     }
+ 
 -    public void setClusterVMStateChanges(HashMap<String, Pair<String, State>> allStates){
++    public void setClusterVMStateChanges(HashMap<String, Pair<String, PowerState>> allStates){
+     	_clusterVMStates = allStates;
+     }
+ 
+     public int getCpus() {
+         return cpus;
+     }
+ 
+     public String getCapabilities() {
+         return caps;
+     }
+ 
+     public long getSpeed() {
+         return speed;
+     }
+ 
+     public long getMemory() {
+         return memory;
+     }
+ 
+     public long getDom0MinMemory() {
+         return dom0MinMemory;
+     }
+ 
 -    public Map<String, VmState> getVmStates() {
++    public Map<String, HostVmStateReportEntry> getVmStates() {
+         return vms;
+     }
+ 
 -    public HashMap<String, Pair<String, State>> getClusterVMStateChanges() {
++    public HashMap<String, Pair<String, PowerState>> getClusterVMStateChanges() {
+         return _clusterVMStates;
+     }
+ 
+     public void setSpeed(long speed) {
+         this.speed = speed;
+     }
+ 
+     public void setCpus(int cpus) {
+         this.cpus = cpus;
+     }
+ 
+     public void setMemory(long memory) {
+         this.memory = memory;
+     }
+ 
+     public void setDom0MinMemory(long dom0MinMemory) {
+         this.dom0MinMemory = dom0MinMemory;
+     }
+ 
+     public void setCaps(String caps) {
+         this.caps = caps;
+     }
+ 
+     public String getPool() {
+         return pool;
+     }
+ 
+     public void setPool(String pool) {
+         this.pool = pool;
+     }
+ 
+     public boolean isPoolSync() {
+         return poolSync;
+     }
+ 
+     public void setPoolSync(boolean poolSync) {
+         this.poolSync = poolSync;
+     }
+ 
+     public HypervisorType getHypervisorType() {
+         return hypervisorType;
+     }
+ 
+     public void setHypervisorType(HypervisorType hypervisorType) {
+         this.hypervisorType = hypervisorType;
+     }
+ 
+     public Map<String, String> getHostDetails() {
+         return hostDetails;
+     }
+ 
+     public void setHostDetails(Map<String, String> hostDetails) {
+         this.hostDetails = hostDetails;
+     }
+ 
+     public String getHypervisorVersion() {
+         return hypervisorVersion;
+     }
+ 
+     public void setHypervisorVersion(String hypervisorVersion) {
+         this.hypervisorVersion = hypervisorVersion;
+     }
+ }
+ 

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/d4039743/engine/schema/src/com/cloud/vm/UserVmVO.java
----------------------------------------------------------------------
diff --cc engine/schema/src/com/cloud/vm/UserVmVO.java
index 0000000,2e9bdf5..a6b7bb3
mode 000000,100755..100755
--- a/engine/schema/src/com/cloud/vm/UserVmVO.java
+++ b/engine/schema/src/com/cloud/vm/UserVmVO.java
@@@ -1,0 -1,141 +1,141 @@@
+ // 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.vm;
+ 
+ import java.util.HashMap;
+ 
+ import javax.persistence.Basic;
+ import javax.persistence.Column;
+ import javax.persistence.DiscriminatorValue;
+ import javax.persistence.Entity;
+ import javax.persistence.FetchType;
+ import javax.persistence.PrimaryKeyJoinColumn;
+ import javax.persistence.Table;
+ 
+ import com.cloud.hypervisor.Hypervisor.HypervisorType;
+ import com.cloud.uservm.UserVm;
+ 
+ @Entity
+ @Table(name="user_vm")
+ @DiscriminatorValue(value="User")
+ @PrimaryKeyJoinColumn(name="id")
+ public class UserVmVO extends VMInstanceVO implements UserVm {
+ 
+     @Column(name="iso_id", nullable=true, length=17)
+     private Long isoId = null;
+     
+     @Column(name="user_data", updatable=true, nullable=true, length=32768)
+     @Basic(fetch = FetchType.LAZY)
+     private String userData;
+     
+     @Column(name="display_name", updatable=true, nullable=true)
+     private String displayName;
+     
+     @Column(name="update_parameters", updatable=true)
+     protected boolean updateParameters = true;
+     
+     transient String password;
+ 
+     @Override
+     public String getPassword() {
+         return password;
+     }
+     
+     public void setPassword(String password) {
+         this.password = password;
+     }
+ 
+     @Override
+     public Long getIsoId() {
+         return isoId;
+     }
+     
+     @Override
+     public long getServiceOfferingId() {
+         return serviceOfferingId;
+     }
+ 
+     public UserVmVO(long id,
+                     String instanceName,
+                     String displayName,
+                     long templateId,
+                     HypervisorType hypervisorType,
+                     long guestOsId,
+                     boolean haEnabled,
+                     boolean limitCpuUse,
+                     long domainId,
+                     long accountId,
+                     long serviceOfferingId,
+                     String userData,
+                     String name, Long diskOfferingId) {
+         super(id, serviceOfferingId, name, instanceName, Type.User, templateId, hypervisorType, guestOsId, domainId, accountId, haEnabled, limitCpuUse, diskOfferingId);
+         this.userData = userData;
+         this.displayName = displayName;
 -    	this.details = new HashMap<String, String>();
++    	details = new HashMap<String, String>();
+     }
+     
+     protected UserVmVO() {
+         super();
+     }
+ 
+ 	public void setIsoId(Long id) {
 -	    this.isoId = id;
++	    isoId = id;
+ 	}
+ 	
+     @Override
+ 	public void setUserData(String userData) {
+ 		this.userData = userData;
+ 	}
+ 
+     @Override
+ 	public String getUserData() {
+ 		return userData;
+ 	}
+ 	
+ 	@Override
+ 	public String getDisplayName() {
+ 	    return displayName;
+ 	}
+ 	
+ 	public void setDisplayName(String displayName) {
+ 	    this.displayName = displayName;
+ 	}
+ 	
+     @Override
+     public String getDetail(String name) {
+         assert (details != null) : "Did you forget to load the details?";
+         
+         return details != null ? details.get(name) : null;
+     }
+     
+     @Override
+     public void setAccountId(long accountId){
+         this.accountId = accountId;
+     }
+     
+     public void setDomainId(long domainId){
+         this.domainId = domainId;
+     }
+ 
+     public void setUpdateParameters(boolean updateParameters) {
+         this.updateParameters = updateParameters;
+     }
+ 
+     public boolean isUpdateParameters() {
+         return updateParameters;
+     }
+ }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/d4039743/engine/schema/src/com/cloud/vm/VMInstanceVO.java
----------------------------------------------------------------------
diff --cc engine/schema/src/com/cloud/vm/VMInstanceVO.java
index 0000000,5ec2712..28bc5f0
mode 000000,100644..100644
--- a/engine/schema/src/com/cloud/vm/VMInstanceVO.java
+++ b/engine/schema/src/com/cloud/vm/VMInstanceVO.java
@@@ -1,0 -1,482 +1,531 @@@
+ // 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.vm;
+ 
+ import java.util.Date;
+ import java.util.Map;
+ import java.util.Random;
+ import java.util.UUID;
+ 
+ import javax.persistence.Column;
+ import javax.persistence.DiscriminatorColumn;
+ import javax.persistence.DiscriminatorType;
+ import javax.persistence.Entity;
+ import javax.persistence.EnumType;
+ import javax.persistence.Enumerated;
+ import javax.persistence.Id;
+ import javax.persistence.Inheritance;
+ import javax.persistence.InheritanceType;
+ import javax.persistence.Table;
+ import javax.persistence.TableGenerator;
+ import javax.persistence.Temporal;
+ import javax.persistence.TemporalType;
+ import javax.persistence.Transient;
+ 
+ import com.cloud.hypervisor.Hypervisor.HypervisorType;
++import com.cloud.utils.DateUtil;
+ import com.cloud.utils.db.Encrypt;
+ import com.cloud.utils.db.GenericDao;
+ import com.cloud.utils.db.StateMachine;
+ import com.cloud.utils.fsm.FiniteStateObject;
+ import com.cloud.vm.VirtualMachine.State;
+ 
+ @Entity
+ @Table(name="vm_instance")
+ @Inheritance(strategy=InheritanceType.JOINED)
+ @DiscriminatorColumn(name="type", discriminatorType=DiscriminatorType.STRING, length=32)
+ public class VMInstanceVO implements VirtualMachine, FiniteStateObject<State, VirtualMachine.Event> {
+     @Id
+     @TableGenerator(name="vm_instance_sq", table="sequence", pkColumnName="name", valueColumnName="value", pkColumnValue="vm_instance_seq", allocationSize=1)
+     @Column(name="id", updatable=false, nullable = false)
+     protected long id;
+ 
+     @Column(name="name", updatable=false, nullable=false, length=255)
+     protected String hostName = null;
+ 
+     @Encrypt
+     @Column(name="vnc_password", updatable=true, nullable=false, length=255)
+     protected String vncPassword;
+ 
+     @Column(name="proxy_id", updatable=true, nullable=true)
+     protected Long proxyId;
+ 
+     @Temporal(TemporalType.TIMESTAMP)
+     @Column(name="proxy_assign_time", updatable=true, nullable=true)
+     protected Date proxyAssignTime;
+ 
+     /**
+      * Note that state is intentionally missing the setter.  Any updates to
+      * the state machine needs to go through the DAO object because someone
+      * else could be updating it as well.
+      */
+     @Enumerated(value=EnumType.STRING)
+     @StateMachine(state=State.class, event=Event.class)
+     @Column(name="state", updatable=true, nullable=false, length=32)
+     protected State state = null;
+ 
+     @Column(name="private_ip_address", updatable=true)
+     protected String privateIpAddress;
+ 
+     @Column(name="instance_name", updatable=true, nullable=false)
+     protected String instanceName;
+ 
+     @Column(name="vm_template_id", updatable=true, nullable=true, length=17)
+     protected Long templateId = new Long(-1);
+ 
+     @Column(name="guest_os_id", nullable=false, length=17)
+     protected long guestOSId;
+ 
+     @Column(name="host_id", updatable=true, nullable=true)
+     protected Long hostId;
+ 
+     @Column(name="last_host_id", updatable=true, nullable=true)
+     protected Long lastHostId;
+ 
+     @Column(name="pod_id", updatable=true, nullable=false)
+     protected Long podIdToDeployIn;
+ 
+     @Column(name="private_mac_address", updatable=true, nullable=true)
+     protected String privateMacAddress;
+ 
+     @Column(name="data_center_id", updatable=true, nullable=false)
+     protected long dataCenterId;
+ 
+     @Column(name="vm_type", updatable=false, nullable=false, length=32)
+     @Enumerated(value=EnumType.STRING)
+     protected Type type;
+ 
+     @Column(name="ha_enabled", updatable=true, nullable=true)
+     protected boolean haEnabled;
+ 
+     @Column(name="limit_cpu_use", updatable=true, nullable=true)
+     private boolean limitCpuUse;
+ 
+     @Column(name="update_count", updatable = true, nullable=false)
+     protected long updated;	// This field should be updated everytime the state is updated.  There's no set method in the vo object because it is done with in the dao code.
+ 
+     @Column(name=GenericDao.CREATED_COLUMN)
+     protected Date created;
+ 
+     @Column(name=GenericDao.REMOVED_COLUMN)
+     protected Date removed;
+ 
+     @Column(name="update_time", updatable=true)
+     @Temporal(value=TemporalType.TIMESTAMP)
+     protected Date updateTime;
+ 
+     @Column(name="domain_id")
+     protected long domainId;
+ 
+     @Column(name="account_id")
+     protected long accountId;
+ 
+     @Column(name="service_offering_id")
+     protected long serviceOfferingId;
+ 
+     @Column(name="reservation_id")
+     protected String reservationId;
+ 
+     @Column(name="hypervisor_type")
+     @Enumerated(value=EnumType.STRING)
+     protected HypervisorType hypervisorType;
+ 
 -/*
 -    @Column(name="tags")
 -    protected String tags;
 -*/
 -    
+     @Transient
+     Map<String, String> details;
+ 
+     @Column(name="uuid")
+     protected String uuid = UUID.randomUUID().toString();
+ 
+     @Column(name="disk_offering_id")
+     protected Long diskOfferingId;
++
++    //
++    // Power state for VM state sync
++    //
++    @Enumerated(value=EnumType.STRING)
++    @Column(name="power_state", updatable=true)
++    protected PowerState powerState;
++    
++    @Column(name="power_state_update_time", updatable=true, nullable=false)
++    @Temporal(value=TemporalType.TIMESTAMP)
++    protected Date powerStateUpdateTime;
++    
++    @Column(name="power_state_update_count", updatable=true)
++    protected int powerStateUpdateCount;
++ 
++    @Column(name="power_host", updatable=true)
++    protected Long powerHostId;
+     
+     public VMInstanceVO(long id,
+             long serviceOfferingId,
+             String name,
+             String instanceName,
+             Type type,
+             Long vmTemplateId,
+             HypervisorType hypervisorType,
+             long guestOSId,
+             long domainId,
+             long accountId,
+             boolean haEnabled) {
+         this.id = id;
+         this.hostName = name != null ? name : this.uuid;
+         if (vmTemplateId != null) {
+             this.templateId = vmTemplateId;
+         }
+         this.instanceName = instanceName;
+         this.type = type;
+         this.guestOSId = guestOSId;
+         this.haEnabled = haEnabled;
+         this.vncPassword = Long.toHexString(new Random().nextLong());
+         this.state = State.Stopped;
+         this.accountId = accountId;
+         this.domainId = domainId;
+         this.serviceOfferingId = serviceOfferingId;
+         this.hypervisorType = hypervisorType;
+         this.limitCpuUse = false;
++        
++        this.powerState = PowerState.PowerUnknown;
++        this.powerStateUpdateTime = DateUtil.currentGMTTime();
+     }
+ 
+     public VMInstanceVO(long id,
+             long serviceOfferingId,
+             String name,
+             String instanceName,
+             Type type,
+             Long vmTemplateId,
+             HypervisorType hypervisorType,
+             long guestOSId,
+             long domainId,
+             long accountId,
+             boolean haEnabled,
+             boolean limitResourceUse, Long diskOfferingId) {
+         this(id, serviceOfferingId, name, instanceName, type, vmTemplateId, hypervisorType, guestOSId, domainId, accountId, haEnabled);
+         this.limitCpuUse = limitResourceUse;
+         this.diskOfferingId = diskOfferingId;
++
++        this.powerState = PowerState.PowerUnknown;
++        this.powerStateUpdateTime = DateUtil.currentGMTTime();
+     }
+ 
+     protected VMInstanceVO() {
+     }
+ 
+     public Date getRemoved() {
+         return removed;
+     }
+ 
+     @Override
+     public long getDomainId() {
+         return domainId;
+     }
+ 
+     @Override
+     public long getAccountId() {
+         return accountId;
+     }
+ 
+     @Override
+     public Type getType() {
+         return type;
+     }
+ 
+     public long getUpdated() {
+         return updated;
+     }
+ 
+     @Override
+     public long getId() {
+         return id;
+     }
+ 
+     @Override
+     public String getUuid() {
+         return uuid;
+     }
+ 
+     public void setUuid(String uuid) {
+         this.uuid = uuid;
+     }
+ 
+     @Override
+     public HypervisorType getHypervisorType() {
+         return hypervisorType;
+     }
+ 
+     @Override
+     public Date getCreated() {
+         return created;
+     }
+ 
+     public Date getUpdateTime() {
+         return updateTime;
+     }
+ 
+     @Override
+     public long getDataCenterId() {
+         return dataCenterId;
+     }
+ 
+     @Override
+     public String getHostName() {
+         return hostName;
+     }
+ 
+     @Override
+     public String getInstanceName() {
+         return instanceName;
+     }
+ 
+     @Override
+     public State getState() {
+         return state;
+     }
+ 
+     // don't use this directly, use VM state machine instead, this method is added for migration tool only
+     @Override
+     public void setState(State state) {
+         this.state = state;
+     }
+ 
+     @Override
+     public String getPrivateIpAddress() {
+         return privateIpAddress;
+     }
+ 
+     public void setPrivateIpAddress(String address) {
+         privateIpAddress = address;
+     }
+ 
+     public void setVncPassword(String vncPassword) {
+         this.vncPassword = vncPassword;
+     }
+ 
+     @Override
+     public String getVncPassword() {
+         return vncPassword;
+     }
+ 
+     @Override
+     public long getServiceOfferingId() {
+         return serviceOfferingId;
+     }
+ 
+     public Long getProxyId() {
+         return proxyId;
+     }
+ 
+     public void setProxyId(Long proxyId) {
+         this.proxyId = proxyId;
+     }
+ 
+     public Date getProxyAssignTime() {
+         return this.proxyAssignTime;
+     }
+ 
+     public void setProxyAssignTime(Date time) {
+         this.proxyAssignTime = time;
+     }
+ 
+     @Override
+     public long getTemplateId() {
+         if (templateId == null) {
+             return -1;
+         } else {
+             return templateId;
+         }
+     }
+ 
+     public void setTemplateId(Long templateId) {
+         this.templateId = templateId;
+     }
+ 
+     @Override
+     public long getGuestOSId() {
+         return guestOSId;
+     }
+ 
+     public void setGuestOSId(long guestOSId) {
+         this.guestOSId = guestOSId;
+     }
+ 
+     public void incrUpdated() {
+         updated++;
+     }
+ 
+     public void decrUpdated() {
+         updated--;
+     }
+ 
+     @Override
+     public Long getHostId() {
+         return hostId;
+     }
+ 
+     @Override
+     public Long getLastHostId() {
+         return lastHostId;
+     }
+ 
+     public void setLastHostId(Long lastHostId) {
+         this.lastHostId = lastHostId;
+     }
+ 
+     public void setHostId(Long hostId) {
+         this.hostId = hostId;
+     }
+ 
+     @Override
+     public boolean isHaEnabled() {
+         return haEnabled;
+     }
+ 
+     @Override
+     public boolean limitCpuUse() {
+         return limitCpuUse;
+     }
+ 
+     public void setLimitCpuUse(boolean value) {
+         limitCpuUse = value;
+     }
+ 
+     @Override
+     public String getPrivateMacAddress() {
+         return privateMacAddress;
+     }
+ 
+     @Override
+     public Long getPodIdToDeployIn() {
+         return podIdToDeployIn;
+     }
+ 
+     public void setPodId(long podId) {
+         this.podIdToDeployIn = podId;
+     }
+ 
+     public void setPrivateMacAddress(String privateMacAddress) {
+         this.privateMacAddress = privateMacAddress;
+     }
+ 
+     public void setDataCenterId(long dataCenterId) {
+         this.dataCenterId = dataCenterId;
+     }
+ 
+     public boolean isRemoved() {
+         return removed != null;
+     }
+ 
+     public void setHaEnabled(boolean value) {
+         haEnabled = value;
+     }
+ 
+     public void setReservationId(String reservationId) {
+         this.reservationId = reservationId;
+     }
+ 
+     public String getReservationId() {
+         return this.reservationId;
+     }
+ 
+     @Override
+     public Map<String, String> getDetails() {
+         return details;
+     }
+ 
+     public void setDetail(String name, String value) {
+         assert (details != null) : "Did you forget to load the details?";
+ 
+         details.put(name, value);
+     }
+ 
+     public void setDetails(Map<String, String> details) {
+         this.details = details;
+     }
+ 
+     transient String toString;
+     @Override
+     public String toString() {
+         if (toString == null) {
+             toString = new StringBuilder("VM[").append(type.toString()).append("|").append(hostName).append("]").toString();
+         }
+         return toString;
+     }
+ 
+ 
+     @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;
+         VMInstanceVO other = (VMInstanceVO) obj;
+         if (id != other.id)
+             return false;
+         return true;
+     }
+ 
 -
+     public void setServiceOfferingId(long serviceOfferingId) {
+         this.serviceOfferingId = serviceOfferingId;
+     }
+ 
+ 	@Override
+ 	public Long getDiskOfferingId() {
+ 		return diskOfferingId;
+ 	}
 -
++	
++	public VirtualMachine.PowerState getPowerState() {
++		return this.powerState;
++	}
++	
++	public void setPowerState(PowerState powerState) {
++		this.powerState = powerState;
++	}
++	
++	public Date getPowerStateUpdateTime() {
++		return this.powerStateUpdateTime;
++	}
++    
++	public void setPowerStateUpdateTime(Date updateTime) {
++		this.powerStateUpdateTime = updateTime;
++	}
++	
++	public int getPowerStateUpdateCount() {
++		return this.powerStateUpdateCount;
++	}
++	
++	public void setPowerStateUpdateCount(int count) {
++		this.powerStateUpdateCount = count;
++	}
++	
++	public Long getPowerHostId() {
++		return this.powerHostId;
++	}
++	
++	public void setPowerHostId(Long hostId) {
++		this.powerHostId = hostId;
++	}
+ }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/d4039743/engine/schema/src/com/cloud/vm/dao/VMInstanceDao.java
----------------------------------------------------------------------
diff --cc engine/schema/src/com/cloud/vm/dao/VMInstanceDao.java
index 0000000,c604027..ba97585
mode 000000,100644..100644
--- a/engine/schema/src/com/cloud/vm/dao/VMInstanceDao.java
+++ b/engine/schema/src/com/cloud/vm/dao/VMInstanceDao.java
@@@ -1,0 -1,119 +1,122 @@@
+ // 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.vm.dao;
+ 
+ import java.util.Date;
+ import java.util.List;
+ import java.util.Map;
+ 
+ import com.cloud.utils.Pair;
+ import com.cloud.utils.db.GenericDao;
+ import com.cloud.utils.fsm.StateDao;
+ import com.cloud.vm.VMInstanceVO;
+ import com.cloud.vm.VirtualMachine;
+ import com.cloud.vm.VirtualMachine.State;
+ 
+ 
+ /*
+  * Data Access Object for vm_instance table
+  */
+ public interface VMInstanceDao extends GenericDao<VMInstanceVO, Long>, StateDao<State, VirtualMachine.Event, VirtualMachine> {
+     /**
+      * What are the vms running on this host?
+      * @param hostId host.
+      * @return list of VMInstanceVO running on that host.
+      */
+ 	List<VMInstanceVO> listByHostId(long hostId);
+ 	
+ 	/**
+ 	 * List VMs by zone ID
+ 	 * @param zoneId
+ 	 * @return list of VMInstanceVO in the specified zone
+ 	 */
+ 	List<VMInstanceVO> listByZoneId(long zoneId);
+ 	
+ 	/**
+      * List VMs by pod ID
+      * @param podId
+      * @return list of VMInstanceVO in the specified pod
+      */
+     List<VMInstanceVO> listByPodId(long podId);
+ 
+ 	/**
+ 	 * Lists non-expunged VMs by zone ID and templateId
+ 	 * @param zoneId
+ 	 * @return list of VMInstanceVO in the specified zone, deployed from the specified template, that are not expunged
+ 	 */
+ 	public List<VMInstanceVO> listNonExpungedByZoneAndTemplate(long zoneId, long templateId);
+ 	
+     /**
+      * Find vm instance with names like.
+      * 
+      * @param name name that fits SQL like.
+      * @return list of VMInstanceVO
+      */
+     List<VMInstanceVO> findVMInstancesLike(String name);
+     
+     List<VMInstanceVO> findVMInTransition(Date time, State... states);
+ 
+     List<VMInstanceVO> listByTypes(VirtualMachine.Type... types);
+     
+     VMInstanceVO findByIdTypes(long id, VirtualMachine.Type... types);
+     
+     VMInstanceVO findVMByInstanceName(String name);
+ 
+     void updateProxyId(long id, Long proxyId, Date time);
+ 
+     List<VMInstanceVO> listByHostIdTypes(long hostid, VirtualMachine.Type... types);
+     
+     List<VMInstanceVO> listUpByHostIdTypes(long hostid, VirtualMachine.Type... types);
+     List<VMInstanceVO> listByZoneIdAndType(long zoneId, VirtualMachine.Type type);
+ 	List<VMInstanceVO> listUpByHostId(Long hostId);
+ 	List<VMInstanceVO> listByLastHostId(Long hostId);
+ 	
+     List<VMInstanceVO> listByTypeAndState(VirtualMachine.Type type, State state);
+ 
+     List<VMInstanceVO> listByAccountId(long accountId);
+     public Long countAllocatedVirtualRoutersForAccount(long accountId);
+ 
+     List<VMInstanceVO> listByClusterId(long clusterId);  // this does not pull up VMs which are starting
+     List<VMInstanceVO> listLHByClusterId(long clusterId);  // get all the VMs even starting one on this cluster
+     
+     List<VMInstanceVO> listVmsMigratingFromHost(Long hostId);
+     
+     public Long countRunningByHostId(long hostId);
+ 
+     Pair<List<Long>, Map<Long, Double>> listClusterIdsInZoneByVmCount(long zoneId, long accountId);
+ 
+     Pair<List<Long>, Map<Long, Double>> listClusterIdsInPodByVmCount(long podId, long accountId);
+ 
+     Pair<List<Long>, Map<Long, Double>> listPodIdsInZoneByVmCount(long dataCenterId, long accountId);
+ 
+     List<Long> listHostIdsByVmCount(long dcId, Long podId, Long clusterId, long accountId);
+ 
+     Long countRunningByAccount(long accountId);
+     
+     List<VMInstanceVO> listNonRemovedVmsByTypeAndNetwork(long networkId, VirtualMachine.Type... types);
+ 
+     /**
+      * @param networkId
+      * @param types
+      * @return
+      */
+     List<String> listDistinctHostNames(long networkId, VirtualMachine.Type... types);
+ 
++    boolean updatePowerState(long instanceId, long powerHostId, VirtualMachine.PowerState powerState);
++    void resetVmPowerStateTracking(long instanceId);
++    void resetHostPowerStateTracking(long hostId);
+ }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/d4039743/engine/schema/src/com/cloud/vm/dao/VMInstanceDaoImpl.java
----------------------------------------------------------------------
diff --cc engine/schema/src/com/cloud/vm/dao/VMInstanceDaoImpl.java
index 0000000,7198b7c..bb159a4
mode 000000,100644..100644
--- a/engine/schema/src/com/cloud/vm/dao/VMInstanceDaoImpl.java
+++ b/engine/schema/src/com/cloud/vm/dao/VMInstanceDaoImpl.java
@@@ -1,0 -1,628 +1,686 @@@
+ // 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.vm.dao;
+ 
+ 
+ import java.sql.PreparedStatement;
+ import java.sql.ResultSet;
+ import java.sql.SQLException;
+ import java.util.ArrayList;
+ import java.util.Date;
+ import java.util.HashMap;
+ import java.util.List;
+ import java.util.Map;
+ 
+ import javax.annotation.PostConstruct;
+ import javax.ejb.Local;
+ import javax.inject.Inject;
+ 
+ import org.apache.log4j.Logger;
+ import org.springframework.stereotype.Component;
+ 
+ import com.cloud.host.HostVO;
+ import com.cloud.host.dao.HostDao;
+ import com.cloud.server.ResourceTag.TaggedResourceType;
+ import com.cloud.tags.dao.ResourceTagDao;
++import com.cloud.utils.DateUtil;
+ import com.cloud.utils.Pair;
+ import com.cloud.utils.db.Attribute;
+ import com.cloud.utils.db.DB;
+ import com.cloud.utils.db.GenericDaoBase;
+ import com.cloud.utils.db.GenericSearchBuilder;
+ import com.cloud.utils.db.JoinBuilder;
+ import com.cloud.utils.db.JoinBuilder.JoinType;
+ import com.cloud.utils.db.SearchBuilder;
+ import com.cloud.utils.db.SearchCriteria;
+ import com.cloud.utils.db.SearchCriteria.Func;
+ import com.cloud.utils.db.SearchCriteria.Op;
+ import com.cloud.utils.db.Transaction;
+ import com.cloud.utils.db.UpdateBuilder;
+ import com.cloud.utils.exception.CloudRuntimeException;
+ import com.cloud.vm.NicVO;
+ import com.cloud.vm.VMInstanceVO;
+ import com.cloud.vm.VirtualMachine;
+ import com.cloud.vm.VirtualMachine.Event;
+ import com.cloud.vm.VirtualMachine.State;
+ import com.cloud.vm.VirtualMachine.Type;
+ 
+ @Component
+ @Local(value = { VMInstanceDao.class })
+ public class VMInstanceDaoImpl extends GenericDaoBase<VMInstanceVO, Long> implements VMInstanceDao {
+ 
+     public static final Logger s_logger = Logger.getLogger(VMInstanceDaoImpl.class);
++    private static final int MAX_CONSECUTIVE_SAME_STATE_UPDATE_COUNT = 3;
+ 
+     protected SearchBuilder<VMInstanceVO> VMClusterSearch;
+     protected SearchBuilder<VMInstanceVO> LHVMClusterSearch;
+     protected SearchBuilder<VMInstanceVO> IdStatesSearch;
+     protected SearchBuilder<VMInstanceVO> AllFieldsSearch;
+     protected SearchBuilder<VMInstanceVO> ZoneTemplateNonExpungedSearch;
+     protected SearchBuilder<VMInstanceVO> NameLikeSearch;
+     protected SearchBuilder<VMInstanceVO> StateChangeSearch;
+     protected SearchBuilder<VMInstanceVO> TransitionSearch;
+     protected SearchBuilder<VMInstanceVO> TypesSearch;
+     protected SearchBuilder<VMInstanceVO> IdTypesSearch;
+     protected SearchBuilder<VMInstanceVO> HostIdTypesSearch;
+     protected SearchBuilder<VMInstanceVO> HostIdUpTypesSearch;
+     protected SearchBuilder<VMInstanceVO> HostUpSearch;
+     protected SearchBuilder<VMInstanceVO> InstanceNameSearch;
+     protected GenericSearchBuilder<VMInstanceVO, Long> CountVirtualRoutersByAccount;
+     protected GenericSearchBuilder<VMInstanceVO, Long> CountRunningByHost;
+     protected GenericSearchBuilder<VMInstanceVO, Long> CountRunningByAccount;
+     protected SearchBuilder<VMInstanceVO> NetworkTypeSearch;
+     protected GenericSearchBuilder<VMInstanceVO, String> DistinctHostNameSearch;
+     
+     @Inject ResourceTagDao _tagsDao;
+     @Inject NicDao _nicDao;
+     
+     protected Attribute _updateTimeAttr;
+     
+     private static final String ORDER_CLUSTERS_NUMBER_OF_VMS_FOR_ACCOUNT_PART1 = 
+             "SELECT host.cluster_id, SUM(IF(vm.state='Running' AND vm.account_id = ?, 1, 0)) FROM `cloud`.`host` host LEFT JOIN `cloud`.`vm_instance` vm ON host.id = vm.host_id WHERE ";
+     private static final String ORDER_CLUSTERS_NUMBER_OF_VMS_FOR_ACCOUNT_PART2 =
+             " AND host.type = 'Routing' GROUP BY host.cluster_id ORDER BY 2 ASC ";
+     
+     private static final String ORDER_PODS_NUMBER_OF_VMS_FOR_ACCOUNT = "SELECT pod.id, SUM(IF(vm.state='Running' AND vm.account_id = ?, 1, 0)) FROM `cloud`.`host_pod_ref` pod LEFT JOIN `cloud`.`vm_instance` vm ON pod.id = vm.pod_id WHERE pod.data_center_id = ? " +
+                                                                        " GROUP BY pod.id ORDER BY 2 ASC ";
+     
+     private static final String ORDER_HOSTS_NUMBER_OF_VMS_FOR_ACCOUNT =
+             "SELECT host.id, SUM(IF(vm.state='Running' AND vm.account_id = ?, 1, 0)) FROM `cloud`.`host` host LEFT JOIN `cloud`.`vm_instance` vm ON host.id = vm.host_id WHERE host.data_center_id = ? " +
+     		                                                            " AND host.pod_id = ? AND host.cluster_id = ? AND host.type = 'Routing' " +
+     		                                                            " GROUP BY host.id ORDER BY 2 ASC ";
+ 
+     @Inject protected HostDao _hostDao;
+     
+     public VMInstanceDaoImpl() {
+     }
+     
+     @PostConstruct
+     protected void init() {
+ 
+         IdStatesSearch = createSearchBuilder();
+         IdStatesSearch.and("id", IdStatesSearch.entity().getId(), Op.EQ);
+         IdStatesSearch.and("states", IdStatesSearch.entity().getState(), Op.IN);
+         IdStatesSearch.done();
+                
+         VMClusterSearch = createSearchBuilder();
+         SearchBuilder<HostVO> hostSearch = _hostDao.createSearchBuilder();
+         VMClusterSearch.join("hostSearch", hostSearch, hostSearch.entity().getId(), VMClusterSearch.entity().getHostId(), JoinType.INNER);
+         hostSearch.and("clusterId", hostSearch.entity().getClusterId(), SearchCriteria.Op.EQ);
+         VMClusterSearch.done();
+ 
+         
+         LHVMClusterSearch = createSearchBuilder();
+         SearchBuilder<HostVO> hostSearch1 = _hostDao.createSearchBuilder();
+         LHVMClusterSearch.join("hostSearch1", hostSearch1, hostSearch1.entity().getId(), LHVMClusterSearch.entity().getLastHostId(), JoinType.INNER);
+         LHVMClusterSearch.and("hostid", LHVMClusterSearch.entity().getHostId(), Op.NULL);
+         hostSearch1.and("clusterId", hostSearch1.entity().getClusterId(), SearchCriteria.Op.EQ);
+         LHVMClusterSearch.done();
+ 
+         
+         AllFieldsSearch = createSearchBuilder();
+         AllFieldsSearch.and("host", AllFieldsSearch.entity().getHostId(), Op.EQ);
+         AllFieldsSearch.and("lastHost", AllFieldsSearch.entity().getLastHostId(), Op.EQ);
+         AllFieldsSearch.and("state", AllFieldsSearch.entity().getState(), Op.EQ);
+         AllFieldsSearch.and("zone", AllFieldsSearch.entity().getDataCenterId(), Op.EQ);
+         AllFieldsSearch.and("type", AllFieldsSearch.entity().getType(), Op.EQ);
+         AllFieldsSearch.and("account", AllFieldsSearch.entity().getAccountId(), Op.EQ);
+         AllFieldsSearch.done();
+ 
+         ZoneTemplateNonExpungedSearch = createSearchBuilder();
+         ZoneTemplateNonExpungedSearch.and("zone", ZoneTemplateNonExpungedSearch.entity().getDataCenterId(), Op.EQ);
+         ZoneTemplateNonExpungedSearch.and("template", ZoneTemplateNonExpungedSearch.entity().getTemplateId(), Op.EQ);
+         ZoneTemplateNonExpungedSearch.and("state", ZoneTemplateNonExpungedSearch.entity().getState(), Op.NEQ);
+         ZoneTemplateNonExpungedSearch.done();
+ 
+         NameLikeSearch = createSearchBuilder();
+         NameLikeSearch.and("name", NameLikeSearch.entity().getHostName(), Op.LIKE);
+         NameLikeSearch.done();
+ 
+         StateChangeSearch = createSearchBuilder();
+         StateChangeSearch.and("id", StateChangeSearch.entity().getId(), Op.EQ);
+         StateChangeSearch.and("states", StateChangeSearch.entity().getState(), Op.EQ);
+         StateChangeSearch.and("host", StateChangeSearch.entity().getHostId(), Op.EQ);
+         StateChangeSearch.and("update", StateChangeSearch.entity().getUpdated(), Op.EQ);
+         StateChangeSearch.done();
+ 
+         TransitionSearch = createSearchBuilder();
+         TransitionSearch.and("updateTime", TransitionSearch.entity().getUpdateTime(), Op.LT);
+         TransitionSearch.and("states", TransitionSearch.entity().getState(), Op.IN);
+         TransitionSearch.done();
+ 
+         TypesSearch = createSearchBuilder();
+         TypesSearch.and("types", TypesSearch.entity().getType(), Op.IN);
+         TypesSearch.done();
+ 
+         IdTypesSearch = createSearchBuilder();
+         IdTypesSearch.and("id", IdTypesSearch.entity().getId(), Op.EQ);
+         IdTypesSearch.and("types", IdTypesSearch.entity().getType(), Op.IN);
+         IdTypesSearch.done();
+         
+         HostIdTypesSearch = createSearchBuilder();
+         HostIdTypesSearch.and("hostid", HostIdTypesSearch.entity().getHostId(), Op.EQ);
+         HostIdTypesSearch.and("types", HostIdTypesSearch.entity().getType(), Op.IN);
+         HostIdTypesSearch.done();
+         
+         HostIdUpTypesSearch = createSearchBuilder();
+         HostIdUpTypesSearch.and("hostid", HostIdUpTypesSearch.entity().getHostId(), Op.EQ);
+         HostIdUpTypesSearch.and("types", HostIdUpTypesSearch.entity().getType(), Op.IN);
+         HostIdUpTypesSearch.and("states", HostIdUpTypesSearch.entity().getState(), Op.NIN);
+         HostIdUpTypesSearch.done();
+         
+         HostUpSearch = createSearchBuilder();
+         HostUpSearch.and("host", HostUpSearch.entity().getHostId(), Op.EQ);
+         HostUpSearch.and("states", HostUpSearch.entity().getState(), Op.IN);
+         HostUpSearch.done();
+         
+         InstanceNameSearch = createSearchBuilder();
+         InstanceNameSearch.and("instanceName", InstanceNameSearch.entity().getInstanceName(), Op.EQ);
+         InstanceNameSearch.done();
+ 
+         CountVirtualRoutersByAccount = createSearchBuilder(Long.class);
+         CountVirtualRoutersByAccount.select(null, Func.COUNT, null);
+         CountVirtualRoutersByAccount.and("account", CountVirtualRoutersByAccount.entity().getAccountId(), SearchCriteria.Op.EQ);
+         CountVirtualRoutersByAccount.and("type", CountVirtualRoutersByAccount.entity().getType(), SearchCriteria.Op.EQ);
+         CountVirtualRoutersByAccount.and("state", CountVirtualRoutersByAccount.entity().getState(), SearchCriteria.Op.NIN);        
+         CountVirtualRoutersByAccount.done();
+         
+         CountRunningByHost = createSearchBuilder(Long.class);
+         CountRunningByHost.select(null, Func.COUNT, null);
+         CountRunningByHost.and("host", CountRunningByHost.entity().getHostId(), SearchCriteria.Op.EQ);
+         CountRunningByHost.and("state", CountRunningByHost.entity().getState(), SearchCriteria.Op.EQ);
+         CountRunningByHost.done();        
+ 
+         CountRunningByAccount = createSearchBuilder(Long.class);
+         CountRunningByAccount.select(null, Func.COUNT, null);
+         CountRunningByAccount.and("account", CountRunningByAccount.entity().getAccountId(), SearchCriteria.Op.EQ);
+         CountRunningByAccount.and("state", CountRunningByAccount.entity().getState(), SearchCriteria.Op.EQ);
+         CountRunningByAccount.done();        
+         
+         _updateTimeAttr = _allAttributes.get("updateTime");
+         assert _updateTimeAttr != null : "Couldn't get this updateTime attribute";
+     }
+ 
+     @Override
+     public List<VMInstanceVO> listByAccountId(long accountId) {
+         SearchCriteria<VMInstanceVO> sc = AllFieldsSearch.create();
+         sc.setParameters("account", accountId);
+         return listBy(sc);
+     }
+     
+     @Override
+     public List<VMInstanceVO> findVMInstancesLike(String name) {
+         SearchCriteria<VMInstanceVO> sc = NameLikeSearch.create();
+         sc.setParameters("name", "%" + name + "%");
+         return listBy(sc);
+     }
+ 
+     @Override
+     public List<VMInstanceVO> listByHostId(long hostid) {
+         SearchCriteria<VMInstanceVO> sc = AllFieldsSearch.create();
+         sc.setParameters("host", hostid);
+ 
+         return listBy(sc);
+     }
+     
+     @Override
+     public List<VMInstanceVO> listByZoneId(long zoneId) {
+         SearchCriteria<VMInstanceVO> sc = AllFieldsSearch.create();
+         sc.setParameters("zone", zoneId);
+ 
+         return listBy(sc);
+     }
+     
+     @Override
+     public List<VMInstanceVO> listByPodId(long podId) {
+         SearchCriteria<VMInstanceVO> sc = AllFieldsSearch.create();
+         sc.setParameters("pod", podId);
+         return listBy(sc);
+     }
+ 
+     @Override
+     public List<VMInstanceVO> listByClusterId(long clusterId) {
+         SearchCriteria<VMInstanceVO> sc = VMClusterSearch.create();
+         sc.setJoinParameters("hostSearch", "clusterId", clusterId);
+         return listBy(sc);
+     }
+ 
+     @Override
+     public List<VMInstanceVO> listLHByClusterId(long clusterId) {
+         SearchCriteria<VMInstanceVO> sc = LHVMClusterSearch.create();
+         sc.setJoinParameters("hostSearch1", "clusterId", clusterId);
+         return listBy(sc);
+     }
+     
+     @Override
+     public List<VMInstanceVO> listByZoneIdAndType(long zoneId, VirtualMachine.Type type) {
+         SearchCriteria<VMInstanceVO> sc = AllFieldsSearch.create();
+         sc.setParameters("zone", zoneId);
+         sc.setParameters("type", type.toString());
+         return listBy(sc);
+     }
+     
+     
+     @Override
+     public List<VMInstanceVO> listNonExpungedByZoneAndTemplate(long zoneId, long templateId) {
+         SearchCriteria<VMInstanceVO> sc = ZoneTemplateNonExpungedSearch.create();
+ 
+         sc.setParameters("zone", zoneId);
+         sc.setParameters("template", templateId);
+         sc.setParameters("state", State.Expunging);
+ 
+         return listBy(sc);
+     }
+ 
+     @Override
+     public List<VMInstanceVO> findVMInTransition(Date time, State... states) {
+         SearchCriteria<VMInstanceVO> sc = TransitionSearch.create();
+ 
+         sc.setParameters("states", (Object[]) states);
+         sc.setParameters("updateTime", time);
+ 
+         return search(sc, null);
+     }
+ 
+     @Override
+     public List<VMInstanceVO> listByHostIdTypes(long hostid, Type... types) {
+         SearchCriteria<VMInstanceVO> sc = HostIdTypesSearch.create();
+         sc.setParameters("hostid", hostid);
+         sc.setParameters("types", (Object[]) types);
+         return listBy(sc);
+     }
+ 
+     @Override
+     public List<VMInstanceVO> listUpByHostIdTypes(long hostid, Type... types) {
+         SearchCriteria<VMInstanceVO> sc = HostIdUpTypesSearch.create();
+         sc.setParameters("hostid", hostid);
+         sc.setParameters("types", (Object[]) types);
+         sc.setParameters("states", new Object[] {State.Destroyed, State.Stopped, State.Expunging});
+         return listBy(sc);
+     }
+     
+     @Override
+     public List<VMInstanceVO> listUpByHostId(Long hostId) {
+         SearchCriteria<VMInstanceVO> sc = HostUpSearch.create();
+         sc.setParameters("host", hostId);
+         sc.setParameters("states", new Object[] {State.Starting, State.Running});
+         return listBy(sc);
+     }
+     
+     @Override
+     public List<VMInstanceVO> listByTypes(Type... types) {
+         SearchCriteria<VMInstanceVO> sc = TypesSearch.create();
+         sc.setParameters("types", (Object[]) types);
+         return listBy(sc);
+     }
+     
+     @Override
+     public List<VMInstanceVO> listByTypeAndState(VirtualMachine.Type type, State state) {
+         SearchCriteria<VMInstanceVO> sc = AllFieldsSearch.create();
+         sc.setParameters("type", type);
+         sc.setParameters("state", state);
+         return listBy(sc);
+     }
+ 
+     @Override
+     public VMInstanceVO findByIdTypes(long id, Type... types) {
+         SearchCriteria<VMInstanceVO> sc = IdTypesSearch.create();
+         sc.setParameters("id", id);
+         sc.setParameters("types", (Object[]) types);
+         return findOneIncludingRemovedBy(sc);
+     }
+ 
+     @Override
+     public VMInstanceVO findVMByInstanceName(String name) {
+         SearchCriteria<VMInstanceVO> sc = InstanceNameSearch.create();
+         sc.setParameters("instanceName", name);
+         return findOneBy(sc);
+     }
+    
+     @Override
+     public void updateProxyId(long id, Long proxyId, Date time) {
+         VMInstanceVO vo = createForUpdate();
+         vo.setProxyId(proxyId);
+         vo.setProxyAssignTime(time);
+         update(id, vo);
+     }
+ 
+     @Override
+     public boolean updateState(State oldState, Event event,	State newState, VirtualMachine vm, Object opaque) {
+     	if (newState == null) {
+     		if (s_logger.isDebugEnabled()) {
+     			s_logger.debug("There's no way to transition from old state: " + oldState.toString() + " event: " + event.toString());
+     		}
+     		return false;
+     	}
+ 
+     	@SuppressWarnings("unchecked")
+ 		Pair<Long, Long> hosts = (Pair<Long,Long>)opaque;
+ 		Long newHostId = hosts.second();
+     	
+     	VMInstanceVO vmi = (VMInstanceVO)vm;
+     	Long oldHostId = vmi.getHostId();
+     	Long oldUpdated = vmi.getUpdated();
+     	Date oldUpdateDate = vmi.getUpdateTime();
+     	
+     	SearchCriteria<VMInstanceVO> sc = StateChangeSearch.create();
+     	sc.setParameters("id", vmi.getId());
+     	sc.setParameters("states", oldState);
+     	sc.setParameters("host", vmi.getHostId());
+     	sc.setParameters("update", vmi.getUpdated());
+ 
+     	vmi.incrUpdated();
+     	UpdateBuilder ub = getUpdateBuilder(vmi);
+     	
+     	ub.set(vmi, "state", newState);
+     	ub.set(vmi, "hostId", newHostId);
+     	ub.set(vmi, "podIdToDeployIn", vmi.getPodIdToDeployIn());
+     	ub.set(vmi, _updateTimeAttr, new Date());
+ 
+     	int result = update(vmi, sc);
+     	if (result == 0 && s_logger.isDebugEnabled()) {
+ 
+     		VMInstanceVO vo = findByIdIncludingRemoved(vm.getId());
+     		
+     		if (vo != null) {
+         		StringBuilder str = new StringBuilder("Unable to update ").append(vo.toString());
+         		str.append(": DB Data={Host=").append(vo.getHostId()).append("; State=").append(vo.getState().toString()).append("; updated=").append(vo.getUpdated()).append("; time=").append(vo.getUpdateTime());
+         		str.append("} New Data: {Host=").append(vm.getHostId()).append("; State=").append(vm.getState().toString()).append("; updated=").append(vmi.getUpdated()).append("; time=").append(vo.getUpdateTime());
+         		str.append("} Stale Data: {Host=").append(oldHostId).append("; State=").append(oldState).append("; updated=").append(oldUpdated).append("; time=").append(oldUpdateDate).append("}");
+         		s_logger.debug(str.toString());
+ 
+     		} else {
+     		    s_logger.debug("Unable to update the vm id=" + vm.getId() + "; the vm either doesn't exist or already removed");
+     		}
+     	}
+     	return result > 0;
+     }
+     
+     @Override
+ 	public List<VMInstanceVO> listByLastHostId(Long hostId) {
+ 		SearchCriteria<VMInstanceVO> sc = AllFieldsSearch.create();
+ 		sc.setParameters("lastHost", hostId);
+ 		sc.setParameters("state", State.Stopped);
+ 		return listBy(sc);
+ 	}
+     
+     @Override
+     public Long countAllocatedVirtualRoutersForAccount(long accountId) {
+     	SearchCriteria<Long> sc = CountVirtualRoutersByAccount.create();
+         sc.setParameters("account", accountId);
+         sc.setParameters("type", VirtualMachine.Type.DomainRouter);
+ 		sc.setParameters("state", new Object[] {State.Destroyed, State.Error, State.Expunging});
+         return customSearch(sc, null).get(0);
+     }
+     
+     @Override
+     public List<VMInstanceVO> listVmsMigratingFromHost(Long hostId) {
+         SearchCriteria<VMInstanceVO> sc = AllFieldsSearch.create();
+         sc.setParameters("lastHost", hostId);
+         sc.setParameters("state", State.Migrating);
+         return listBy(sc);
+     }
+     
+     @Override
+     public Long countRunningByHostId(long hostId){
+         SearchCriteria<Long> sc = CountRunningByHost.create();
+         sc.setParameters("host", hostId);
+         sc.setParameters("state", State.Running);
+         return customSearch(sc, null).get(0);
+     }
+ 
+     @Override
+     public Pair<List<Long>, Map<Long, Double>> listClusterIdsInZoneByVmCount(long zoneId, long accountId) {
+         Transaction txn = Transaction.currentTxn();
+         PreparedStatement pstmt = null;
+         List<Long> result = new ArrayList<Long>();
+         Map<Long, Double> clusterVmCountMap = new HashMap<Long, Double>();
+ 
+         StringBuilder sql = new StringBuilder(ORDER_CLUSTERS_NUMBER_OF_VMS_FOR_ACCOUNT_PART1);
+         sql.append("host.data_center_id = ?");
+         sql.append(ORDER_CLUSTERS_NUMBER_OF_VMS_FOR_ACCOUNT_PART2);
+         try {
+             pstmt = txn.prepareAutoCloseStatement(sql.toString());
+             pstmt.setLong(1, accountId);
+             pstmt.setLong(2, zoneId);
+             
+             ResultSet rs = pstmt.executeQuery();
+             while (rs.next()) {
+                 Long clusterId = rs.getLong(1);
+                 result.add(clusterId);
+                 clusterVmCountMap.put(clusterId, rs.getDouble(2));
+             }
+             return new Pair<List<Long>, Map<Long, Double>>(result, clusterVmCountMap);
+         } catch (SQLException e) {
+             throw new CloudRuntimeException("DB Exception on: " + sql, e);
+         } catch (Throwable e) {
+             throw new CloudRuntimeException("Caught: " + sql, e);
+         }
+     }
+ 
+     @Override
+     public Pair<List<Long>, Map<Long, Double>> listClusterIdsInPodByVmCount(long podId, long accountId) {
+         Transaction txn = Transaction.currentTxn();
+         PreparedStatement pstmt = null;
+         List<Long> result = new ArrayList<Long>();
+         Map<Long, Double> clusterVmCountMap = new HashMap<Long, Double>();
+ 
+         StringBuilder sql = new StringBuilder(ORDER_CLUSTERS_NUMBER_OF_VMS_FOR_ACCOUNT_PART1);
+         sql.append("host.pod_id = ?");
+         sql.append(ORDER_CLUSTERS_NUMBER_OF_VMS_FOR_ACCOUNT_PART2);
+         try {
+             pstmt = txn.prepareAutoCloseStatement(sql.toString());
+             pstmt.setLong(1, accountId);
+             pstmt.setLong(2, podId);
+             
+             ResultSet rs = pstmt.executeQuery();
+             while (rs.next()) {
+                 Long clusterId = rs.getLong(1);
+                 result.add(clusterId);                
+                 clusterVmCountMap.put(clusterId, rs.getDouble(2));
+             }
+             return new Pair<List<Long>, Map<Long, Double>>(result, clusterVmCountMap);
+         } catch (SQLException e) {
+             throw new CloudRuntimeException("DB Exception on: " + sql, e);
+         } catch (Throwable e) {
+             throw new CloudRuntimeException("Caught: " + sql, e);
+         }
+ 
+     }
+ 
+     @Override
+     public Pair<List<Long>, Map<Long, Double>> listPodIdsInZoneByVmCount(long dataCenterId, long accountId) {
+         Transaction txn = Transaction.currentTxn();
+         PreparedStatement pstmt = null;
+         List<Long> result = new ArrayList<Long>();
+         Map<Long, Double> podVmCountMap = new HashMap<Long, Double>();
+         try {
+             String sql = ORDER_PODS_NUMBER_OF_VMS_FOR_ACCOUNT;
+             pstmt = txn.prepareAutoCloseStatement(sql);
+             pstmt.setLong(1, accountId);
+             pstmt.setLong(2, dataCenterId);
+             
+             ResultSet rs = pstmt.executeQuery();
+             while (rs.next()) {
+                 Long podId = rs.getLong(1);
+                 result.add(podId);                
+                 podVmCountMap.put(podId, rs.getDouble(2));
+             }
+             return new Pair<List<Long>, Map<Long, Double>>(result, podVmCountMap);
+         } catch (SQLException e) {
+             throw new CloudRuntimeException("DB Exception on: " + ORDER_PODS_NUMBER_OF_VMS_FOR_ACCOUNT, e);
+         } catch (Throwable e) {
+             throw new CloudRuntimeException("Caught: " + ORDER_PODS_NUMBER_OF_VMS_FOR_ACCOUNT, e);
+         }        
+     }
+ 
+     @Override
+     public List<Long> listHostIdsByVmCount(long dcId, Long podId, Long clusterId, long accountId) {
+         Transaction txn = Transaction.currentTxn();
+         PreparedStatement pstmt = null;
+         List<Long> result = new ArrayList<Long>();
+         try {
+             String sql = ORDER_HOSTS_NUMBER_OF_VMS_FOR_ACCOUNT;
+             pstmt = txn.prepareAutoCloseStatement(sql);
+             pstmt.setLong(1, accountId);
+             pstmt.setLong(2, dcId);
+             pstmt.setLong(3, podId);
+             pstmt.setLong(4, clusterId);
+             
+             ResultSet rs = pstmt.executeQuery();
+             while (rs.next()) {
+                 result.add(rs.getLong(1));
+             }
+             return result;
+         } catch (SQLException e) {
+             throw new CloudRuntimeException("DB Exception on: " + ORDER_PODS_NUMBER_OF_VMS_FOR_ACCOUNT, e);
+         } catch (Throwable e) {
+             throw new CloudRuntimeException("Caught: " + ORDER_PODS_NUMBER_OF_VMS_FOR_ACCOUNT, e);
+         }   
+     }
+     
+     @Override
+     public Long countRunningByAccount(long accountId){
+         SearchCriteria<Long> sc = CountRunningByAccount.create();
+         sc.setParameters("account", accountId);
+         sc.setParameters("state", State.Running);
+         return customSearch(sc, null).get(0);
+     }
+     
+     @Override
+     public List<VMInstanceVO> listNonRemovedVmsByTypeAndNetwork(long networkId, VirtualMachine.Type... types) {
+         if (NetworkTypeSearch == null) {
+             
+             SearchBuilder<NicVO> nicSearch = _nicDao.createSearchBuilder();
+             nicSearch.and("networkId", nicSearch.entity().getNetworkId(), SearchCriteria.Op.EQ);
+ 
+             NetworkTypeSearch = createSearchBuilder();
+             NetworkTypeSearch.and("types", NetworkTypeSearch.entity().getType(), SearchCriteria.Op.IN);
+             NetworkTypeSearch.and("removed", NetworkTypeSearch.entity().getRemoved(), SearchCriteria.Op.NULL);
+             NetworkTypeSearch.join("nicSearch", nicSearch, NetworkTypeSearch.entity().getId(), 
+                     nicSearch.entity().getInstanceId(), JoinBuilder.JoinType.INNER);
+             NetworkTypeSearch.done();
+         }
+ 
+         SearchCriteria<VMInstanceVO> sc = NetworkTypeSearch.create();
+         if (types != null && types.length != 0) {
+             sc.setParameters("types", (Object[]) types);
+         }        
+         sc.setJoinParameters("nicSearch", "networkId", networkId);
+ 
+         return listBy(sc);
+     }
+     
+     
+     
+     @Override
+     public List<String> listDistinctHostNames(long networkId, VirtualMachine.Type... types) {
+         if (DistinctHostNameSearch == null) {
+             
+             SearchBuilder<NicVO> nicSearch = _nicDao.createSearchBuilder();
+             nicSearch.and("networkId", nicSearch.entity().getNetworkId(), SearchCriteria.Op.EQ);
+ 
+             DistinctHostNameSearch = createSearchBuilder(String.class);
+             DistinctHostNameSearch.selectField(DistinctHostNameSearch.entity().getHostName());
+             
+             DistinctHostNameSearch.and("types", DistinctHostNameSearch.entity().getType(), SearchCriteria.Op.IN);
+             DistinctHostNameSearch.and("removed", DistinctHostNameSearch.entity().getRemoved(), SearchCriteria.Op.NULL);
+             DistinctHostNameSearch.join("nicSearch", nicSearch, DistinctHostNameSearch.entity().getId(), 
+                     nicSearch.entity().getInstanceId(), JoinBuilder.JoinType.INNER);
+             DistinctHostNameSearch.done();
+         }
+ 
+         SearchCriteria<String> sc = DistinctHostNameSearch.create();
+         if (types != null && types.length != 0) {
+             sc.setParameters("types", (Object[]) types);
+         }        
+         sc.setJoinParameters("nicSearch", "networkId", networkId);
+ 
+         return  customSearch(sc, null);
+     }
+     
+     @Override
+     @DB
+     public boolean remove(Long id) {
+         Transaction txn = Transaction.currentTxn();
+         txn.start();
+         VMInstanceVO vm = findById(id);
+         if (vm != null && vm.getType() == Type.User) {
+             _tagsDao.removeByIdAndType(id, TaggedResourceType.UserVm);
+         }
+         boolean result = super.remove(id);
+         txn.commit();
+         return result;
+     }
 -
++    
++    @Override @DB
++    public boolean updatePowerState(long instanceId, long powerHostId, VirtualMachine.PowerState powerState) {
++    	boolean needToUpdate = false;
++        Transaction txn = Transaction.currentTxn();
++        txn.start();
++        
++        VMInstanceVO instance = findById(instanceId);
++        if(instance != null) {
++        	Long savedPowerHostId = instance.getPowerHostId();
++        	if(instance.getPowerState() != powerState || savedPowerHostId == null || savedPowerHostId.longValue() != powerHostId) {
++        		instance.setPowerState(powerState);
++        		instance.setPowerHostId(powerHostId);
++        		instance.setPowerStateUpdateCount(1);
++        		instance.setPowerStateUpdateTime(DateUtil.currentGMTTime());
++        		needToUpdate = true;
++        		update(instanceId, instance);
++        	} else {
++        		// to reduce DB updates, consecutive same state update for more than 3 times
++        		if(instance.getPowerStateUpdateCount() < MAX_CONSECUTIVE_SAME_STATE_UPDATE_COUNT) {
++            		instance.setPowerStateUpdateCount(instance.getPowerStateUpdateCount() + 1);
++            		instance.setPowerStateUpdateTime(DateUtil.currentGMTTime());
++            		needToUpdate = true;
++            		update(instanceId, instance);
++        		}
++        	}
++        }
++        
++        txn.commit();
++        return needToUpdate;
++    }
++    
++    @Override @DB
++    public void resetVmPowerStateTracking(long instanceId) {
++        Transaction txn = Transaction.currentTxn();
++        txn.start();
++        VMInstanceVO instance = findById(instanceId);
++        if(instance != null) {
++        	instance.setPowerStateUpdateCount(0);
++        	instance.setPowerStateUpdateTime(DateUtil.currentGMTTime());
++        	update(instanceId, instance);
++        }
++        
++        txn.commit();
++    }
++    
++    @Override @DB
++    public void resetHostPowerStateTracking(long hostId) {
++    	SearchCriteria<VMInstanceVO> sc = this.createSearchCriteria();
++    	sc.addAnd("powerHostId", SearchCriteria.Op.EQ, hostId);
++    	
++    	VMInstanceVO instance = this.createForUpdate();
++    	instance.setPowerStateUpdateCount(0);
++    	instance.setPowerStateUpdateTime(DateUtil.currentGMTTime());
++    	
++    	this.update(instance, sc);
++    }
+ }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/d4039743/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/d4039743/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/manager/VmwareManagerImpl.java
----------------------------------------------------------------------
diff --cc plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/manager/VmwareManagerImpl.java
index b66693c,9f260f1..1585070
--- a/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/manager/VmwareManagerImpl.java
+++ b/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/manager/VmwareManagerImpl.java
@@@ -317,8 -317,7 +317,7 @@@ public class VmwareManagerImpl extends 
          }
  
          s_logger.info("Preparing network on host " + hostMo.getContext().toString() + " for " + privateTrafficLabel);
 -        HypervisorHostHelper.prepareNetwork(vSwitchName, "cloud.private", hostMo, vlanId, null, null, 180000, false);
 +            HypervisorHostHelper.prepareNetwork(vSwitchName, "cloud.private", hostMo, vlanId, null, null, 180000, false);
- 
      }
  
      @Override

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/d4039743/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java
----------------------------------------------------------------------
diff --cc plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java
index 33ad918,6d7e0e7..68dc7d1
--- a/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java
+++ b/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java
@@@ -2834,11 -2924,7 +2925,7 @@@ public class VmwareResource implements 
                  try {
                      vmMo.setCustomFieldValue(CustomFieldConstants.CLOUD_NIC_MASK, "0");
  
 -                    if (getVmState(vmMo) != State.Stopped) {
 +                    if (getVmState(vmMo) != PowerState.PowerOff) {
- 
-                         // before we stop VM, remove all possible snapshots on the VM to let
-                         // disk chain be collapsed
-                         s_logger.info("Remove all snapshot before stopping VM " + cmd.getVmName());
                          if (vmMo.safePowerOff(_shutdown_waitMs)) {
                              state = State.Stopped;
                              return new StopAnswer(cmd, "Stop VM " + cmd.getVmName() + " Succeed", 0, true);

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/d4039743/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/d4039743/plugins/network-elements/elastic-loadbalancer/src/com/cloud/network/lb/ElasticLoadBalancerManagerImpl.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/d4039743/server/pom.xml
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/d4039743/server/src/com/cloud/api/ApiDBUtils.java
----------------------------------------------------------------------
diff --cc server/src/com/cloud/api/ApiDBUtils.java
index 49bb719,fce1f71..f9bdcf3
--- a/server/src/com/cloud/api/ApiDBUtils.java
+++ b/server/src/com/cloud/api/ApiDBUtils.java
@@@ -25,7 -25,9 +25,10 @@@ import java.util.Set
  import javax.annotation.PostConstruct;
  import javax.inject.Inject;
  
 +import org.apache.cloudstack.api.ApiCommandJobType;
+ import org.apache.cloudstack.affinity.AffinityGroup;
+ import org.apache.cloudstack.affinity.AffinityGroupResponse;
+ import org.apache.cloudstack.affinity.dao.AffinityGroupDao;
  import org.apache.cloudstack.api.ApiConstants.HostDetails;
  import org.apache.cloudstack.api.ApiConstants.VMDetails;
  import org.apache.cloudstack.api.response.AccountResponse;

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/d4039743/server/src/com/cloud/api/ApiDispatcher.java
----------------------------------------------------------------------
diff --cc server/src/com/cloud/api/ApiDispatcher.java
index a859414,b4437ce..afcfda3
--- a/server/src/com/cloud/api/ApiDispatcher.java
+++ b/server/src/com/cloud/api/ApiDispatcher.java
@@@ -127,38 -126,34 +127,37 @@@ public class ApiDispatcher 
      }
  
      public void dispatch(BaseCmd cmd, Map<String, String> params) throws Exception {
 -            processParameters(cmd, params);
 -            UserContext ctx = UserContext.current();
 -            ctx.setAccountId(cmd.getEntityOwnerId());
 -            
 -            if (cmd instanceof BaseAsyncCmd) {
 -
 -                BaseAsyncCmd asyncCmd = (BaseAsyncCmd) cmd;
 -                String startEventId = params.get("ctxStartEventId");
 -                ctx.setStartEventId(Long.valueOf(startEventId));
 -
 -                // Synchronise job on the object if needed
 -                if (asyncCmd.getJob() != null && asyncCmd.getSyncObjId() != null && asyncCmd.getSyncObjType() != null) {
 -                    Long queueSizeLimit = null;
 -                    if (asyncCmd.getSyncObjType() != null && asyncCmd.getSyncObjType().equalsIgnoreCase(BaseAsyncCmd.snapshotHostSyncObject)) {
 -                        queueSizeLimit = _createSnapshotQueueSizeLimit;
 -                    } else {
 -                        queueSizeLimit = 1L;
 -                    }
 -
 -                    if (queueSizeLimit != null) {
 -                    _asyncMgr.syncAsyncJobExecution(asyncCmd.getJob(), asyncCmd.getSyncObjType(), asyncCmd.getSyncObjId().longValue(), queueSizeLimit);
 -                    } else {
 -                        s_logger.trace("The queue size is unlimited, skipping the synchronizing");
 -                    }
 +        processParameters(cmd, params);
 +        UserContext ctx = UserContext.current();
 +        ctx.setAccountId(cmd.getEntityOwnerId());
 +        
 +        if (cmd instanceof BaseAsyncCmd) {
 +
 +            BaseAsyncCmd asyncCmd = (BaseAsyncCmd) cmd;
 +            String startEventId = params.get("ctxStartEventId");
 +            ctx.setStartEventId(Long.valueOf(startEventId));
 +
 +            // Synchronise job on the object if needed
 +            if (asyncCmd.getJob() != null && asyncCmd.getSyncObjId() != null && asyncCmd.getSyncObjType() != null) {
 +                Long queueSizeLimit = null;
 +                if (asyncCmd.getSyncObjType() != null && asyncCmd.getSyncObjType().equalsIgnoreCase(BaseAsyncCmd.snapshotHostSyncObject)) {
 +                    queueSizeLimit = _createSnapshotQueueSizeLimit;
 +                } else {
 +                    queueSizeLimit = 1L;
                  }
 -            }
 -            cmd.execute();
  
 +                if (queueSizeLimit != null) {
 +                	if(AsyncJobExecutionContext.getCurrentExecutionContext() == null) {
 +                		// if we are not within async-execution context, enqueue the command
 +                		_asyncMgr.syncAsyncJobExecution(asyncCmd.getJob(), asyncCmd.getSyncObjType(), asyncCmd.getSyncObjId().longValue(), queueSizeLimit);
 +                		return;
 +                	}
 +                } else {
 +                    s_logger.trace("The queue size is unlimited, skipping the synchronizing");
 +                }
 +            }
 +        }
- 
 +        cmd.execute();
      }
  
      @SuppressWarnings({ "unchecked", "rawtypes" })


[44/50] [abbrv] Merged master to vmsync

Posted by ah...@apache.org.
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/d4039743/server/test/com/cloud/vm/VirtualMachineManagerImplTest.java
----------------------------------------------------------------------
diff --cc server/test/com/cloud/vm/VirtualMachineManagerImplTest.java
index 8e97788,dd51e74..8a5e3ae
--- a/server/test/com/cloud/vm/VirtualMachineManagerImplTest.java
+++ b/server/test/com/cloud/vm/VirtualMachineManagerImplTest.java
@@@ -17,36 -17,89 +17,86 @@@
  
  package com.cloud.vm;
  
++import static org.mockito.Matchers.any;
++import static org.mockito.Matchers.anyLong;
++import static org.mockito.Matchers.isA;
++import static org.mockito.Mockito.doNothing;
++import static org.mockito.Mockito.mock;
++import static org.mockito.Mockito.when;
++
++import java.util.HashMap;
++import java.util.Iterator;
++import java.util.List;
++import java.util.Map;
++
++import org.junit.Before;
++import org.junit.Test;
++import org.mockito.Mock;
++import org.mockito.MockitoAnnotations;
++import org.mockito.Spy;
++
++import org.apache.cloudstack.api.command.user.vm.RestoreVMCmd;
++import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao;
++import org.apache.cloudstack.storage.datastore.db.StoragePoolVO;
++
  import com.cloud.agent.AgentManager;
  import com.cloud.agent.api.Answer;
 -import com.cloud.agent.api.ScaleVmAnswer;
 -import com.cloud.agent.api.ScaleVmCommand;
 -import com.cloud.capacity.CapacityManager;
 -import com.cloud.configuration.ConfigurationManager;
 -import com.cloud.configuration.dao.ConfigurationDao;
 -import com.cloud.deploy.DeployDestination;
 -import com.cloud.host.HostVO;
 -import com.cloud.host.dao.HostDao;
 -import com.cloud.service.ServiceOfferingVO;
 -import com.cloud.storage.VMTemplateVO;
 -import com.cloud.storage.VolumeManager;
 -import com.cloud.storage.VolumeVO;
 -import com.cloud.agent.api.PrepareForMigrationAnswer;
 -import com.cloud.agent.api.PrepareForMigrationCommand;
++import com.cloud.agent.api.CheckVirtualMachineAnswer;
++import com.cloud.agent.api.CheckVirtualMachineCommand;
+ import com.cloud.agent.api.MigrateWithStorageAnswer;
+ import com.cloud.agent.api.MigrateWithStorageCommand;
++import com.cloud.agent.api.MigrateWithStorageCompleteAnswer;
++import com.cloud.agent.api.MigrateWithStorageCompleteCommand;
+ import com.cloud.agent.api.MigrateWithStorageReceiveAnswer;
+ import com.cloud.agent.api.MigrateWithStorageReceiveCommand;
+ import com.cloud.agent.api.MigrateWithStorageSendAnswer;
+ import com.cloud.agent.api.MigrateWithStorageSendCommand;
 -import com.cloud.agent.api.MigrateWithStorageCompleteAnswer;
 -import com.cloud.agent.api.MigrateWithStorageCompleteCommand;
 -import com.cloud.agent.api.CheckVirtualMachineAnswer;
 -import com.cloud.agent.api.CheckVirtualMachineCommand;
++import com.cloud.agent.api.PrepareForMigrationAnswer;
++import com.cloud.agent.api.PrepareForMigrationCommand;
 +import com.cloud.agent.api.ScaleVmAnswer;
 +import com.cloud.agent.api.ScaleVmCommand;
  import com.cloud.capacity.CapacityManager;
  import com.cloud.configuration.ConfigurationManager;
  import com.cloud.configuration.dao.ConfigurationDao;
+ import com.cloud.dc.dao.ClusterDao;
+ import com.cloud.dc.dao.DataCenterDao;
+ import com.cloud.dc.dao.HostPodDao;
 +import com.cloud.deploy.DeployDestination;
+ import com.cloud.exception.ConcurrentOperationException;
+ import com.cloud.exception.ManagementServerException;
++import com.cloud.exception.OperationTimedoutException;
+ import com.cloud.exception.ResourceUnavailableException;
+ import com.cloud.exception.VirtualMachineMigrationException;
 -import com.cloud.exception.OperationTimedoutException;
  import com.cloud.host.HostVO;
  import com.cloud.host.dao.HostDao;
++import com.cloud.hypervisor.Hypervisor.HypervisorType;
+ import com.cloud.hypervisor.HypervisorGuru;
+ import com.cloud.hypervisor.HypervisorGuruManager;
 -import com.cloud.hypervisor.Hypervisor.HypervisorType;
+ import com.cloud.network.NetworkManager;
 +import com.cloud.service.ServiceOfferingVO;
+ import com.cloud.storage.DiskOfferingVO;
+ import com.cloud.storage.StoragePoolHostVO;
 +import com.cloud.storage.VMTemplateVO;
  import com.cloud.storage.VolumeManager;
  import com.cloud.storage.VolumeVO;
+ import com.cloud.storage.dao.DiskOfferingDao;
+ import com.cloud.storage.dao.StoragePoolHostDao;
  import com.cloud.storage.dao.VMTemplateDao;
  import com.cloud.storage.dao.VolumeDao;
--import com.cloud.user.*;
++import com.cloud.user.Account;
++import com.cloud.user.AccountManager;
++import com.cloud.user.AccountVO;
++import com.cloud.user.UserVO;
  import com.cloud.user.dao.AccountDao;
  import com.cloud.user.dao.UserDao;
 -import com.cloud.utils.exception.CloudRuntimeException;
 -import com.cloud.vm.dao.UserVmDao;
 -import com.cloud.vm.dao.VMInstanceDao;
 -import org.apache.cloudstack.api.command.user.vm.RestoreVMCmd;
 -import org.apache.cloudstack.api.command.user.vm.ScaleVMCmd;
+ import com.cloud.utils.Pair;
  import com.cloud.utils.exception.CloudRuntimeException;
++import com.cloud.vm.VirtualMachine.Event;
++import com.cloud.vm.VirtualMachine.PowerState;
++import com.cloud.vm.VirtualMachine.State;
  import com.cloud.vm.dao.UserVmDao;
  import com.cloud.vm.dao.VMInstanceDao;
- import org.apache.cloudstack.api.command.user.vm.RestoreVMCmd;
- import org.junit.Test;
- import org.junit.Before;
- import org.mockito.Mock;
- import org.mockito.MockitoAnnotations;
- import org.mockito.Spy;
- import static org.mockito.Mockito.*;
- import java.util.List;
+ import com.cloud.vm.snapshot.VMSnapshotManager;
 -import com.cloud.vm.VirtualMachine.Event;
 -import com.cloud.vm.VirtualMachine.State;
 -
 -import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao;
 -import org.apache.cloudstack.storage.datastore.db.StoragePoolVO;
 -
 -import org.junit.Test;
 -import org.junit.Before;
 -import org.mockito.Mock;
 -import org.mockito.MockitoAnnotations;
 -import org.mockito.Spy;
 -import static org.mockito.Matchers.anyLong;
 -import static org.mockito.Mockito.*;
 -
 -import java.lang.reflect.Field;
 -import java.util.List;
 -import java.util.Map;
 -import java.util.HashMap;
 -import java.util.Iterator;
  
  public class VirtualMachineManagerImplTest {
  
@@@ -116,10 -187,18 +184,20 @@@
              _vmMgr._capacityMgr = _capacityMgr;
              _vmMgr._hostDao = _hostDao;
              _vmMgr._nodeId = 1L;
- /*            
++/*
              _vmMgr._workDao = _workDao;
- */  
++*/
              _vmMgr._agentMgr = _agentMgr;
+             _vmMgr._podDao = _podDao;
+             _vmMgr._clusterDao = _clusterDao;
+             _vmMgr._dcDao = _dcDao;
+             _vmMgr._diskOfferingDao = _diskOfferingDao;
+             _vmMgr._storagePoolDao = _storagePoolDao;
+             _vmMgr._poolHostDao= _poolHostDao;
+             _vmMgr._networkMgr = _networkMgr;
+             _vmMgr._hvGuruMgr = _hvGuruMgr;
+             _vmMgr._vmSnapshotMgr = _vmSnapshotMgr;
+             _vmMgr._vmDao = _vmInstanceDao;
  
              when(_vmMock.getId()).thenReturn(314l);
              when(_vmInstance.getId()).thenReturn(1L);
@@@ -202,5 -281,155 +280,155 @@@
          return serviceOffering;
      }
  
+     private void initializeMockConfigForMigratingVmWithVolumes() throws OperationTimedoutException,
+         ResourceUnavailableException {
+ 
+         // Mock the source and destination hosts.
+         when(_srcHostMock.getId()).thenReturn(5L);
+         when(_destHostMock.getId()).thenReturn(6L);
+         when(_hostDao.findById(5L)).thenReturn(_srcHostMock);
+         when(_hostDao.findById(6L)).thenReturn(_destHostMock);
+ 
+         // Mock the vm being migrated.
+         when(_vmMock.getId()).thenReturn(1L);
+         when(_vmMock.getHypervisorType()).thenReturn(HypervisorType.XenServer);
+         when(_vmMock.getState()).thenReturn(State.Running).thenReturn(State.Running).thenReturn(State.Migrating)
+             .thenReturn(State.Migrating);
+         when(_vmMock.getHostId()).thenReturn(5L);
+         when(_vmInstance.getId()).thenReturn(1L);
+         when(_vmInstance.getServiceOfferingId()).thenReturn(2L);
+         when(_vmInstance.getInstanceName()).thenReturn("myVm");
+         when(_vmInstance.getHostId()).thenReturn(5L);
+         when(_vmInstance.getType()).thenReturn(VirtualMachine.Type.User);
+         when(_vmInstance.getState()).thenReturn(State.Running).thenReturn(State.Running).thenReturn(State.Migrating)
+             .thenReturn(State.Migrating);
+ 
+         // Mock the work item.
+         when(_workDao.persist(any(ItWorkVO.class))).thenReturn(_work);
+         when(_workDao.update("1", _work)).thenReturn(true);
+         when(_work.getId()).thenReturn("1");
+         doNothing().when(_work).setStep(ItWorkVO.Step.Done);
+ 
+         // Mock the vm guru and the user vm object that gets returned.
+         _vmMgr._vmGurus = new HashMap<VirtualMachine.Type, VirtualMachineGuru<? extends VMInstanceVO>>();
+         UserVmManagerImpl userVmManager = mock(UserVmManagerImpl.class);
+         _vmMgr.registerGuru(VirtualMachine.Type.User, userVmManager);
+         when(userVmManager.findById(anyLong())).thenReturn(_vmMock);
+ 
+         // Mock the iteration over all the volumes of an instance.
+         Iterator<VolumeVO> volumeIterator = mock(Iterator.class);
+         when(_volsDao.findUsableVolumesForInstance(anyLong())).thenReturn(_rootVols);
+         when(_rootVols.iterator()).thenReturn(volumeIterator);
+         when(volumeIterator.hasNext()).thenReturn(true, false);
+         when(volumeIterator.next()).thenReturn(_volumeMock);
+ 
+         // Mock the disk offering and pool objects for a volume.
+         when(_volumeMock.getDiskOfferingId()).thenReturn(5L);
+         when(_volumeMock.getPoolId()).thenReturn(200L);
+         when(_diskOfferingDao.findById(anyLong())).thenReturn(_diskOfferingMock);
+         when(_storagePoolDao.findById(anyLong())).thenReturn(_srcStoragePoolMock);
+ 
+         // Mock the volume to pool mapping.
+         when(_volumeToPoolMock.get(_volumeMock)).thenReturn(_destStoragePoolMock);
+         when(_destStoragePoolMock.getId()).thenReturn(201L);
+         when(_srcStoragePoolMock.getId()).thenReturn(200L);
+         when(_destStoragePoolMock.isLocal()).thenReturn(false);
+         when(_diskOfferingMock.getUseLocalStorage()).thenReturn(false);
+         when(_poolHostDao.findByPoolHost(anyLong(), anyLong())).thenReturn(mock(StoragePoolHostVO.class));
  
+         // Mock hypervisor guru.
+         HypervisorGuru guruMock = mock(HypervisorGuru.class);
+         when(_hvGuruMgr.getGuru(HypervisorType.XenServer)).thenReturn(guruMock);
+ 
+         when(_srcHostMock.getClusterId()).thenReturn(3L);
+         when(_destHostMock.getClusterId()).thenReturn(3L);
+ 
+         // Mock the commands and answers to the agent.
+         PrepareForMigrationAnswer prepAnswerMock = mock(PrepareForMigrationAnswer.class);
+         when(prepAnswerMock.getResult()).thenReturn(true);
+         when(_agentMgr.send(anyLong(), isA(PrepareForMigrationCommand.class))).thenReturn(prepAnswerMock);
+ 
+         MigrateWithStorageAnswer migAnswerMock = mock(MigrateWithStorageAnswer.class);
+         when(migAnswerMock.getResult()).thenReturn(true);
+         when(_agentMgr.send(anyLong(), isA(MigrateWithStorageCommand.class))).thenReturn(migAnswerMock);
+ 
+         MigrateWithStorageReceiveAnswer migRecAnswerMock = mock(MigrateWithStorageReceiveAnswer.class);
+         when(migRecAnswerMock.getResult()).thenReturn(true);
+         when(_agentMgr.send(anyLong(), isA(MigrateWithStorageReceiveCommand.class))).thenReturn(migRecAnswerMock);
+ 
+         MigrateWithStorageSendAnswer migSendAnswerMock = mock(MigrateWithStorageSendAnswer.class);
+         when(migSendAnswerMock.getResult()).thenReturn(true);
+         when(_agentMgr.send(anyLong(), isA(MigrateWithStorageSendCommand.class))).thenReturn(migSendAnswerMock);
+ 
+         MigrateWithStorageCompleteAnswer migCompleteAnswerMock = mock(MigrateWithStorageCompleteAnswer.class);
+         when(migCompleteAnswerMock.getResult()).thenReturn(true);
+         when(_agentMgr.send(anyLong(), isA(MigrateWithStorageCompleteCommand.class))).thenReturn(migCompleteAnswerMock);
+ 
+         CheckVirtualMachineAnswer checkVmAnswerMock = mock(CheckVirtualMachineAnswer.class);
+         when(checkVmAnswerMock.getResult()).thenReturn(true);
 -        when(checkVmAnswerMock.getState()).thenReturn(State.Running);
++        when(checkVmAnswerMock.getState()).thenReturn(PowerState.PowerOn);
+         when(_agentMgr.send(anyLong(), isA(CheckVirtualMachineCommand.class))).thenReturn(checkVmAnswerMock);
+ 
+         // Mock the state transitions of vm.
+         Pair<Long, Long> opaqueMock = new Pair<Long, Long> (_vmMock.getHostId(), _destHostMock.getId());
+         when(_vmSnapshotMgr.hasActiveVMSnapshotTasks(anyLong())).thenReturn(false);
+         when(_vmInstanceDao.updateState(State.Running, Event.MigrationRequested, State.Migrating, _vmMock, opaqueMock))
+             .thenReturn(true);
+         when(_vmInstanceDao.updateState(State.Migrating, Event.OperationSucceeded, State.Running, _vmMock, opaqueMock))
+             .thenReturn(true);
+     }
+ 
+     // Check migration of a vm with its volumes within a cluster.
+     @Test
+     public void testMigrateWithVolumeWithinCluster() throws ResourceUnavailableException, ConcurrentOperationException,
+         ManagementServerException, VirtualMachineMigrationException, OperationTimedoutException {
+ 
+         initializeMockConfigForMigratingVmWithVolumes();
+         when(_srcHostMock.getClusterId()).thenReturn(3L);
+         when(_destHostMock.getClusterId()).thenReturn(3L);
+ 
+         _vmMgr.migrateWithStorage(_vmInstance, _srcHostMock.getId(), _destHostMock.getId(), _volumeToPoolMock);
+     }
+ 
+     // Check migration of a vm with its volumes across a cluster.
+     @Test
+     public void testMigrateWithVolumeAcrossCluster() throws ResourceUnavailableException, ConcurrentOperationException,
+         ManagementServerException, VirtualMachineMigrationException, OperationTimedoutException {
+ 
+         initializeMockConfigForMigratingVmWithVolumes();
+         when(_srcHostMock.getClusterId()).thenReturn(3L);
+         when(_destHostMock.getClusterId()).thenReturn(4L);
+ 
+         _vmMgr.migrateWithStorage(_vmInstance, _srcHostMock.getId(), _destHostMock.getId(), _volumeToPoolMock);
+     }
+ 
+     // Check migration of a vm fails when src and destination pool are not of same type; that is, one is shared and
+     // other is local.
+     @Test(expected=CloudRuntimeException.class)
+     public void testMigrateWithVolumeFail1() throws ResourceUnavailableException, ConcurrentOperationException,
+         ManagementServerException, VirtualMachineMigrationException, OperationTimedoutException {
+ 
+         initializeMockConfigForMigratingVmWithVolumes();
+         when(_srcHostMock.getClusterId()).thenReturn(3L);
+         when(_destHostMock.getClusterId()).thenReturn(3L);
+ 
+         when(_destStoragePoolMock.isLocal()).thenReturn(true);
+         when(_diskOfferingMock.getUseLocalStorage()).thenReturn(false);
+ 
+         _vmMgr.migrateWithStorage(_vmInstance, _srcHostMock.getId(), _destHostMock.getId(), _volumeToPoolMock);
+     }
+ 
+     // Check migration of a vm fails when vm is not in Running state.
+     @Test(expected=ConcurrentOperationException.class)
+     public void testMigrateWithVolumeFail2() throws ResourceUnavailableException, ConcurrentOperationException,
+         ManagementServerException, VirtualMachineMigrationException, OperationTimedoutException {
+ 
+         initializeMockConfigForMigratingVmWithVolumes();
+         when(_srcHostMock.getClusterId()).thenReturn(3L);
+         when(_destHostMock.getClusterId()).thenReturn(3L);
+ 
+         when(_vmMock.getState()).thenReturn(State.Stopped);
+ 
+         _vmMgr.migrateWithStorage(_vmInstance, _srcHostMock.getId(), _destHostMock.getId(), _volumeToPoolMock);
+     }
  }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/d4039743/server/test/com/cloud/vm/VmWorkMockVirtualMachineManagerImpl.java
----------------------------------------------------------------------
diff --cc server/test/com/cloud/vm/VmWorkMockVirtualMachineManagerImpl.java
index c078e39,0000000..4f992d9
mode 100644,000000..100644
--- a/server/test/com/cloud/vm/VmWorkMockVirtualMachineManagerImpl.java
+++ b/server/test/com/cloud/vm/VmWorkMockVirtualMachineManagerImpl.java
@@@ -1,421 -1,0 +1,432 @@@
 +// 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.vm;
 +
 +import java.net.URI;
 +import java.util.Collection;
 +import java.util.List;
 +import java.util.Map;
 +
 +import javax.inject.Inject;
 +import javax.naming.ConfigurationException;
 +
- import org.apache.cloudstack.framework.messagebus.MessageBus;
 +import org.apache.log4j.Logger;
 +
++import org.apache.cloudstack.framework.messagebus.MessageBus;
++import org.apache.cloudstack.storage.datastore.db.StoragePoolVO;
++
 +import com.cloud.agent.api.to.NicTO;
 +import com.cloud.agent.api.to.VirtualMachineTO;
 +import com.cloud.async.AsyncJobConstants;
 +import com.cloud.async.AsyncJobExecutionContext;
 +import com.cloud.deploy.DeployDestination;
 +import com.cloud.deploy.DeploymentPlan;
 +import com.cloud.exception.AgentUnavailableException;
 +import com.cloud.exception.ConcurrentOperationException;
 +import com.cloud.exception.InsufficientCapacityException;
 +import com.cloud.exception.InsufficientServerCapacityException;
 +import com.cloud.exception.ManagementServerException;
 +import com.cloud.exception.OperationTimedoutException;
 +import com.cloud.exception.ResourceUnavailableException;
 +import com.cloud.exception.VirtualMachineMigrationException;
 +import com.cloud.hypervisor.Hypervisor.HypervisorType;
 +import com.cloud.network.Network;
 +import com.cloud.network.dao.NetworkVO;
 +import com.cloud.offering.ServiceOffering;
 +import com.cloud.service.ServiceOfferingVO;
 +import com.cloud.storage.DiskOfferingVO;
 +import com.cloud.storage.StoragePool;
 +import com.cloud.storage.VMTemplateVO;
++import com.cloud.storage.VolumeVO;
 +import com.cloud.user.Account;
 +import com.cloud.user.User;
 +import com.cloud.utils.Pair;
 +import com.cloud.utils.fsm.NoTransitionException;
 +import com.cloud.vm.VirtualMachine.Event;
 +import com.cloud.vm.VirtualMachine.Type;
 +import com.cloud.vm.VirtualMachineProfile.Param;
 +
 +public class VmWorkMockVirtualMachineManagerImpl implements VirtualMachineManager {
 +    private static final Logger s_logger = Logger.getLogger(VmWorkMockVirtualMachineManagerImpl.class);
 +	
 +	@Inject MessageBus _msgBus;
 +	
 +	@Override
 +	public String getName() {
 +		// TODO Auto-generated method stub
 +		return null;
 +	}
 +
 +	@Override
 +	public void setName(String name) {
 +		// TODO Auto-generated method stub
 +	}
 +
 +	@Override
 +	public void setConfigParams(Map<String, Object> params) {
 +		// TODO Auto-generated method stub
 +		
 +	}
 +
 +	@Override
 +	public Map<String, Object> getConfigParams() {
 +		// TODO Auto-generated method stub
 +		return null;
 +	}
 +
 +	@Override
 +	public int getRunLevel() {
 +		// TODO Auto-generated method stub
 +		return 0;
 +	}
 +
 +	@Override
 +	public void setRunLevel(int level) {
 +		// TODO Auto-generated method stub
 +		
 +	}
 +
 +	@Override
 +	public boolean configure(String name, Map<String, Object> params)
 +			throws ConfigurationException {
 +		// TODO Auto-generated method stub
 +		return false;
 +	}
 +
 +	@Override
 +	public boolean start() {
 +		// TODO Auto-generated method stub
 +		return false;
 +	}
 +
 +	@Override
 +	public boolean stop() {
 +		// TODO Auto-generated method stub
 +		return false;
 +	}
 +
 +	@Override
 +	public <T extends VMInstanceVO> T allocate(T vm, VMTemplateVO template,
 +			ServiceOfferingVO serviceOffering,
 +			Pair<? extends DiskOfferingVO, Long> rootDiskOffering,
 +			List<Pair<DiskOfferingVO, Long>> dataDiskOfferings,
 +			List<Pair<NetworkVO, NicProfile>> networks,
 +			Map<Param, Object> params, DeploymentPlan plan,
 +			HypervisorType hyperType, Account owner)
 +			throws InsufficientCapacityException {
 +		// TODO Auto-generated method stub
 +		return null;
 +	}
 +
 +	@Override
 +	public <T extends VMInstanceVO> T allocate(T vm, VMTemplateVO template,
 +			ServiceOfferingVO serviceOffering, Long rootSize,
 +			Pair<DiskOfferingVO, Long> dataDiskOffering,
 +			List<Pair<NetworkVO, NicProfile>> networks, DeploymentPlan plan,
 +			HypervisorType hyperType, Account owner)
 +			throws InsufficientCapacityException {
 +		// TODO Auto-generated method stub
 +		return null;
 +	}
 +
 +	@Override
 +	public <T extends VMInstanceVO> T allocate(T vm, VMTemplateVO template,
 +			ServiceOfferingVO serviceOffering,
 +			List<Pair<NetworkVO, NicProfile>> networkProfiles,
 +			DeploymentPlan plan, HypervisorType hyperType, Account owner)
 +			throws InsufficientCapacityException {
 +		// TODO Auto-generated method stub
 +		return null;
 +	}
 +
 +	@Override
 +	public <T extends VMInstanceVO> T start(T vm, Map<Param, Object> params,
 +			User caller, Account account) throws InsufficientCapacityException,
 +			ResourceUnavailableException {
 +		// TODO Auto-generated method stub
 +		return null;
 +	}
 +
 +	@Override
 +	public <T extends VMInstanceVO> T start(T vm, Map<Param, Object> params,
 +			User caller, Account account, DeploymentPlan planToDeploy)
 +			throws InsufficientCapacityException, ResourceUnavailableException {
 +		// TODO Auto-generated method stub
 +		return null;
 +	}
 +
 +	@Override
 +	public <T extends VMInstanceVO> boolean stop(T vm, User caller,
 +			Account account) throws ResourceUnavailableException {
 +		// TODO Auto-generated method stub
 +		return false;
 +	}
 +
 +	@Override
 +	public <T extends VMInstanceVO> boolean expunge(T vm, User caller,
 +			Account account) throws ResourceUnavailableException {
 +		// TODO Auto-generated method stub
 +		return false;
 +	}
 +
 +	@Override
 +	public <T extends VMInstanceVO> void registerGuru(Type type,
 +			VirtualMachineGuru<T> guru) {
 +		// TODO Auto-generated method stub
 +		
 +	}
 +
 +	@Override
 +	public Collection<VirtualMachineGuru<? extends VMInstanceVO>> getRegisteredGurus() {
 +		// TODO Auto-generated method stub
 +		return null;
 +	}
 +	
++    @Override
 +    public <T extends VMInstanceVO> VirtualMachineGuru<T> getVmGuru(T vm) {
 +		// TODO Auto-generated method stub
 +    	return null;
 +    }
 +
 +	@Override
 +	public boolean stateTransitTo(VMInstanceVO vm, Event e, Long hostId)
 +			throws NoTransitionException {
 +		// TODO Auto-generated method stub
 +		return false;
 +	}
 +
 +	@Override
 +	public <T extends VMInstanceVO> T advanceStart(T vm,
 +			Map<Param, Object> params, User caller, Account account)
 +			throws InsufficientCapacityException, ResourceUnavailableException,
 +			ConcurrentOperationException, OperationTimedoutException {
 +		// TODO Auto-generated method stub
 +		return null;
 +	}
 +
 +	@Override
 +	public <T extends VMInstanceVO> T advanceStart(T vm,
 +			Map<Param, Object> params, User caller, Account account,
 +			DeploymentPlan planToDeploy) throws InsufficientCapacityException,
 +			ResourceUnavailableException, ConcurrentOperationException,
 +			OperationTimedoutException {
 +		// TODO Auto-generated method stub
 +		return null;
 +	}
 +
 +	@Override
 +	public <T extends VMInstanceVO> boolean advanceStop(T vm, boolean forced,
 +			User caller, Account account) throws ResourceUnavailableException,
 +			OperationTimedoutException, ConcurrentOperationException {
 +		// TODO Auto-generated method stub
 +		return false;
 +	}
 +
 +	@Override
 +	public <T extends VMInstanceVO> boolean advanceExpunge(T vm, User caller,
 +			Account account) throws ResourceUnavailableException,
 +			OperationTimedoutException, ConcurrentOperationException {
 +		// TODO Auto-generated method stub
 +		return false;
 +	}
 +
 +	@Override
 +	public <T extends VMInstanceVO> boolean remove(T vm, User caller,
 +			Account account) {
 +		// TODO Auto-generated method stub
 +		return false;
 +	}
 +
 +	@Override
 +	public <T extends VMInstanceVO> boolean destroy(T vm, User caller,
 +			Account account) throws AgentUnavailableException,
 +			OperationTimedoutException, ConcurrentOperationException {
 +		// TODO Auto-generated method stub
 +		return false;
 +	}
 +
 +	@Override
 +	public boolean migrateAway(Type type, long vmid, long hostId)
 +			throws InsufficientServerCapacityException,
 +			VirtualMachineMigrationException {
 +		// TODO Auto-generated method stub
 +		return false;
 +	}
 +
 +	@Override
 +	public <T extends VMInstanceVO> T migrate(T vm, long srcHostId,
 +			DeployDestination dest) throws ResourceUnavailableException,
 +			ConcurrentOperationException, ManagementServerException,
 +			VirtualMachineMigrationException {
 +		// TODO Auto-generated method stub
 +		return null;
 +	}
 +
 +	@Override
 +	public <T extends VMInstanceVO> T reboot(T vm, Map<Param, Object> params,
 +			User caller, Account account) throws InsufficientCapacityException,
 +			ResourceUnavailableException {
 +		// TODO Auto-generated method stub
 +		return null;
 +	}
 +
 +	@Override
 +	public <T extends VMInstanceVO> T advanceReboot(T vm,
 +			Map<Param, Object> params, User caller, Account account)
 +			throws InsufficientCapacityException, ResourceUnavailableException,
 +			ConcurrentOperationException, OperationTimedoutException {
 +		// TODO Auto-generated method stub
 +		return null;
 +	}
 +
 +	@Override
 +	public VMInstanceVO findByIdAndType(Type type, long vmId) {
 +		// TODO Auto-generated method stub
 +		return null;
 +	}
 +
 +	@Override
 +	public boolean isVirtualMachineUpgradable(VirtualMachine vm,
 +			ServiceOffering offering) {
 +		// TODO Auto-generated method stub
 +		return false;
 +	}
 +
 +	@Override
 +	public VMInstanceVO findById(long vmId) {
 +		// TODO Auto-generated method stub
 +		return null;
 +	}
 +
 +	@Override
 +	public <T extends VMInstanceVO> T storageMigration(T vm,
 +			StoragePool storagePoolId) {
 +		// TODO Auto-generated method stub
 +		return null;
 +	}
 +
 +	@Override
 +	public void checkIfCanUpgrade(VirtualMachine vmInstance,
 +			long newServiceOfferingId) {
 +		// TODO Auto-generated method stub
 +		
 +	}
 +
 +	@Override
 +	public boolean upgradeVmDb(long vmId, long serviceOfferingId) {
 +		// TODO Auto-generated method stub
 +		return false;
 +	}
 +
 +	@Override
 +	public NicProfile addVmToNetwork(VirtualMachine vm, Network network,
 +			NicProfile requested) throws ConcurrentOperationException,
 +			ResourceUnavailableException, InsufficientCapacityException {
 +		// TODO Auto-generated method stub
 +		return null;
 +	}
 +
 +	@Override
 +	public boolean removeNicFromVm(VirtualMachine vm, NicVO nic)
 +			throws ConcurrentOperationException, ResourceUnavailableException {
 +		// TODO Auto-generated method stub
 +		return false;
 +	}
 +
 +	@Override
 +	public boolean removeVmFromNetwork(VirtualMachine vm, Network network,
 +			URI broadcastUri) throws ConcurrentOperationException,
 +			ResourceUnavailableException {
 +		// TODO Auto-generated method stub
 +		return false;
 +	}
 +
 +	@Override
 +	public NicTO toNicTO(NicProfile nic, HypervisorType hypervisorType) {
 +		// TODO Auto-generated method stub
 +		return null;
 +	}
 +
 +	@Override
 +	public VirtualMachineTO toVmTO(
 +			VirtualMachineProfile<? extends VMInstanceVO> profile) {
 +		// TODO Auto-generated method stub
 +		return null;
 +	}
 +
 +	@Override
 +	public VMInstanceVO reConfigureVm(VMInstanceVO vm,
 +			ServiceOffering newServiceOffering, boolean sameHost)
 +			throws ResourceUnavailableException, ConcurrentOperationException {
 +		// TODO Auto-generated method stub
 +		return null;
 +	}
 +
 +	@Override
 +	public VMInstanceVO findHostAndMigrate(Type vmType, VMInstanceVO vm,
 +			Long newSvcOfferingId) throws InsufficientCapacityException,
 +			ConcurrentOperationException, ResourceUnavailableException,
 +			VirtualMachineMigrationException, ManagementServerException {
 +		// TODO Auto-generated method stub
 +		return null;
 +	}
 +
 +	@Override
 +	public <T extends VMInstanceVO> T migrateForScale(T vm, long srcHostId,
 +			DeployDestination dest, Long newSvcOfferingId)
 +			throws ResourceUnavailableException, ConcurrentOperationException,
 +			ManagementServerException, VirtualMachineMigrationException {
 +		// TODO Auto-generated method stub
 +		return null;
 +	}
 +
 +	@Override
 +    public <T extends VMInstanceVO> T processVmStartWork(T vm, Map<VirtualMachineProfile.Param, Object> params, User caller, Account account, DeploymentPlan planToDeploy)
 +            throws InsufficientCapacityException, ConcurrentOperationException, ResourceUnavailableException {
 +    	
 +		try {
 +			Thread.sleep(120000);
 +		} catch (InterruptedException e) {
 +		}
 +    	
 +    	return vm;
 +    }
 +
 +	int wakeupCount = 0;
 +	public void processVmStartWakeup() {
 +		s_logger.info("processVmStartWakeup. job-" + AsyncJobExecutionContext.getCurrentExecutionContext().getJob().getId());
 +		
 +		if(wakeupCount++ < 3) {
 +			AsyncJobExecutionContext.getCurrentExecutionContext().resetSyncSource();
 +		} else {
 +			AsyncJobExecutionContext.getCurrentExecutionContext().completeAsyncJob(AsyncJobConstants.STATUS_SUCCEEDED, 0, null);
 +		}
 +	}
 +	
 +	@Override
-     public <T extends VMInstanceVO> boolean processVmStopWork(T vm, boolean forced, User user, Account account) 
++    public <T extends VMInstanceVO> boolean processVmStopWork(T vm, boolean forced, User user, Account account)
 +        throws AgentUnavailableException, OperationTimedoutException, ConcurrentOperationException {
 +    	return true;
 +    }
++
++    @Override
++    public <T extends VMInstanceVO> T migrateWithStorage(T vm, long srcId, long destId, Map<VolumeVO, StoragePoolVO> volumeToPool) throws ResourceUnavailableException,
++            ConcurrentOperationException, ManagementServerException, VirtualMachineMigrationException {
++        // TODO Auto-generated method stub
++        return null;
++    }
 +}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/d4039743/setup/db/db/schema-410to420.sql
----------------------------------------------------------------------
diff --cc setup/db/db/schema-410to420.sql
index 16f93b2,065b35c..75eec59
--- a/setup/db/db/schema-410to420.sql
+++ b/setup/db/db/schema-410to420.sql
@@@ -391,83 -1116,65 +1116,132 @@@ CREATE VIEW `cloud`.`account_view` A
              and async_job.instance_type = 'Account'
              and async_job.job_status = 0;
  
- ALTER TABLE `cloud`.`remote_access_vpn` ADD COLUMN `id` bigint unsigned NOT NULL UNIQUE AUTO_INCREMENT COMMENT 'id';
- ALTER TABLE `cloud`.`remote_access_vpn` ADD COLUMN `uuid` varchar(40) UNIQUE;
  
- -- START: support for LXC
 -
 + 
- INSERT IGNORE INTO `cloud`.`hypervisor_capabilities`(hypervisor_type, hypervisor_version, max_guests_limit, security_group_enabled) VALUES ('LXC', 'default', 50, 1);
- ALTER TABLE `cloud`.`physical_network_traffic_types` ADD COLUMN `lxc_network_label` varchar(255) DEFAULT 'cloudbr0' COMMENT 'The network name label of the physical device dedicated to this traffic on a LXC host';
+ ALTER TABLE `cloud`.`load_balancing_rules` ADD COLUMN `source_ip_address` varchar(40) COMMENT 'source ip address for the load balancer rule';
+ ALTER TABLE `cloud`.`load_balancing_rules` ADD COLUMN `source_ip_address_network_id` bigint unsigned COMMENT 'the id of the network where source ip belongs to';
+ ALTER TABLE `cloud`.`load_balancing_rules` ADD COLUMN `scheme` varchar(40) NOT NULL COMMENT 'load balancer scheme; can be Internal or Public';
+ UPDATE `cloud`.`load_balancing_rules` SET `scheme`='Public';
 + 
- UPDATE configuration SET value='KVM,XenServer,VMware,BareMetal,Ovm,LXC' WHERE name='hypervisor.list';
 + 
- INSERT INTO `cloud`.`vm_template` (id, unique_name, name, public, created, type, hvm, bits, account_id, url, checksum, enable_password, display_text, format, guest_os_id, featured, cross_zones, hypervisor_type)
-      VALUES (10, 'routing-10', 'SystemVM Template (LXC)', 0, now(), 'SYSTEM', 0, 64, 1, 'http://download.cloud.com/templates/acton/acton-systemvm-02062012.qcow2.bz2', '2755de1f9ef2ce4d6f2bee2efbb4da92', 0, 'SystemVM Template (LXC)', 'QCOW2', 15, 0, 1, 'LXC');
 +
 +-- END: support for LXC
 +
 +ALTER TABLE `cloud`.`async_job` DROP COLUMN `session_key`;
 +ALTER TABLE `cloud`.`async_job` DROP COLUMN `job_cmd_originator`;
 +ALTER TABLE `cloud`.`async_job` DROP COLUMN `callback_type`;
 +ALTER TABLE `cloud`.`async_job` DROP COLUMN `callback_address`;
 +
 +ALTER TABLE `cloud`.`async_job` ADD COLUMN `job_type` VARCHAR(32);
 +ALTER TABLE `cloud`.`async_job` ADD COLUMN `job_dispatcher` VARCHAR(64);
 +ALTER TABLE `cloud`.`async_job` ADD COLUMN `job_executing_msid` bigint;
 +ALTER TABLE `cloud`.`async_job` ADD COLUMN `job_pending_signals` int(10) NOT NULL DEFAULT 0;
  
 +ALTER TABLE `cloud`.`vm_instance` ADD COLUMN `power_state` VARCHAR(74) DEFAULT 'PowerUnknown';
 +ALTER TABLE `cloud`.`vm_instance` ADD COLUMN `power_state_update_time` DATETIME;
 +ALTER TABLE `cloud`.`vm_instance` ADD COLUMN `power_state_update_count` INT DEFAULT 0;
 +ALTER TABLE `cloud`.`vm_instance` ADD COLUMN `power_host` bigint unsigned;
 +ALTER TABLE `cloud`.`vm_instance` ADD CONSTRAINT `fk_vm_instance__power_host` FOREIGN KEY (`power_host`) REFERENCES `cloud`.`host`(`id`);
  
 +CREATE TABLE `cloud`.`vm_work_job` (
 +  `id` bigint unsigned UNIQUE NOT NULL,
 +  `step` char(32) NOT NULL COMMENT 'state',
 +  `vm_type` char(32) NOT NULL COMMENT 'type of vm',
 +  `vm_instance_id` bigint unsigned NOT NULL COMMENT 'vm instance',
 +  PRIMARY KEY (`id`),
 +  CONSTRAINT `fk_vm_work_job__instance_id` FOREIGN KEY (`vm_instance_id`) REFERENCES `vm_instance`(`id`) ON DELETE CASCADE,
 +  INDEX `i_vm_work_job__vm`(`vm_type`, `vm_instance_id`),
 +  INDEX `i_vm_work_job__step`(`step`)
 +) ENGINE=InnoDB DEFAULT CHARSET=utf8;
 +
 +CREATE TABLE `cloud`.`async_job_journal` (
 +  `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'id',
 +  `job_id` bigint unsigned NOT NULL,
 +  `journal_type` varchar(32),
 +  `journal_text` varchar(1024) COMMENT 'journal descriptive informaton',
 +  `journal_obj` varchar(1024) COMMENT 'journal strutural information, JSON encoded object',
 +  `created` datetime NOT NULL COMMENT 'date created',
 +  PRIMARY KEY (`id`),
 +  CONSTRAINT `fk_async_job_journal__job_id` FOREIGN KEY (`job_id`) REFERENCES `async_job`(`id`) ON DELETE CASCADE
 +) ENGINE=InnoDB DEFAULT CHARSET=utf8;
 +
 +CREATE TABLE `cloud`.`async_job_join_map` (
 +  `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'id',
 +  `job_id` bigint unsigned NOT NULL,
 +  `join_job_id` bigint unsigned NOT NULL,
 +  `join_status` int NOT NULL,
 +  `join_result` varchar(1024),
 +  `join_msid` bigint,
 +  `complete_msid` bigint,
 +  `sync_source_id` bigint COMMENT 'upper-level job sync source info before join',
 +  `wakeup_handler` varchar(64),
 +  `wakeup_dispatcher` varchar(64),
 +  `wakeup_interval` bigint NOT NULL DEFAULT 3000 COMMENT 'wakeup interval in seconds',
 +  `created` datetime NOT NULL,
 +  `last_updated` datetime,
 +  `next_wakeup` datetime,
 +  `expiration` datetime,
 +  PRIMARY KEY (`id`),
 +  CONSTRAINT `fk_async_job_join_map__job_id` FOREIGN KEY (`job_id`) REFERENCES `async_job`(`id`) ON DELETE CASCADE,
 +  CONSTRAINT `fk_async_job_join_map__join_job_id` FOREIGN KEY (`join_job_id`) REFERENCES `async_job`(`id`),
 +  CONSTRAINT `fk_async_job_join_map__join` UNIQUE (`job_id`, `join_job_id`),
 +  INDEX `i_async_job_join_map__join_job_id`(`join_job_id`),
 +  INDEX `i_async_job_join_map__created`(`created`),
 +  INDEX `i_async_job_join_map__last_updated`(`last_updated`),
 +  INDEX `i_async_job_join_map__next_wakeup`(`next_wakeup`),
 +  INDEX `i_async_job_join_map__expiration`(`expiration`)
 +) ENGINE=InnoDB DEFAULT CHARSET=utf8;
  
+ -- Add details talbe for the network offering
+ CREATE TABLE `cloud`.`network_offering_details` (
+   `id` bigint unsigned NOT NULL auto_increment,
+   `network_offering_id` bigint unsigned NOT NULL COMMENT 'network offering id',
+   `name` varchar(255) NOT NULL,
+   `value` varchar(1024) NOT NULL,
+   PRIMARY KEY (`id`),
+   CONSTRAINT `fk_network_offering_details__network_offering_id` FOREIGN KEY `fk_network_offering_details__network_offering_id`(`network_offering_id`) REFERENCES `network_offerings`(`id`) ON DELETE CASCADE
+ ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+ 
+ -- Change the constraint for the network service map table. Now we support multiple provider for the same service
+ ALTER TABLE `cloud`.`ntwk_service_map` DROP FOREIGN KEY `fk_ntwk_service_map__network_id`;
+ ALTER TABLE `cloud`.`ntwk_service_map` DROP INDEX `network_id`;
+ 
+ ALTER TABLE `cloud`.`ntwk_service_map` ADD UNIQUE `network_id` (`network_id`,`service`,`provider`);
+ ALTER TABLE `cloud`.`ntwk_service_map` ADD  CONSTRAINT `fk_ntwk_service_map__network_id` FOREIGN KEY (`network_id`) REFERENCES `networks` (`id`) ON DELETE CASCADE;
+ 
+ 
+ ALTER TABLE `cloud`.`network_offerings` ADD COLUMN `internal_lb` int(1) unsigned NOT NULL DEFAULT '0' COMMENT 'true if the network offering supports Internal lb service';
+ ALTER TABLE `cloud`.`network_offerings` ADD COLUMN `public_lb` int(1) unsigned NOT NULL DEFAULT '0' COMMENT 'true if the network offering supports Public lb service';
+ UPDATE `cloud`.`network_offerings` SET public_lb=1 where id IN (SELECT DISTINCT network_offering_id FROM `cloud`.`ntwk_offering_service_map` WHERE service='Lb');
+ 
+ 
+ INSERT IGNORE INTO `cloud`.`configuration` VALUES ('Advanced', 'DEFAULT', 'NetworkManager', 'internallbvm.service.offering', null, 'Uuid of the service offering used by internal lb vm; if NULL - default system internal lb offering will be used');
+ 
+ 
+ alter table `cloud_usage`.`usage_network_offering` add column nic_id bigint(20) unsigned NOT NULL;
+ ALTER TABLE `cloud`.`data_center_details` MODIFY value varchar(1024);
+ ALTER TABLE `cloud`.`cluster_details` MODIFY value varchar(255);
+ ALTER TABLE `cloud`.`storage_pool_details` MODIFY value varchar(255);
+ ALTER TABLE `cloud`.`account_details` MODIFY value varchar(255);
+ 
+ INSERT IGNORE INTO `cloud`.`configuration` VALUES ('Network', 'DEFAULT', 'management-server', 'midonet.apiserver.address', 'http://localhost:8081', 'Specify the address at which the Midonet API server can be contacted (if using Midonet)');
+ INSERT IGNORE INTO `cloud`.`configuration` VALUES ('Network', 'DEFAULT', 'management-server', 'midonet.providerrouter.id', 'd7c5e6a3-e2f4-426b-b728-b7ce6a0448e5', 'Specifies the UUID of the Midonet provider router (if using Midonet)');
+ 
+ alter table cloud.vpc_gateways add column source_nat boolean default false;
+ alter table cloud.private_ip_address add column source_nat boolean default false;
+ 
+ CREATE TABLE `cloud`.`account_vnet_map` (
+   `id` bigint unsigned NOT NULL UNIQUE AUTO_INCREMENT,
+   `uuid` varchar(255) UNIQUE,
+   `vnet_range` varchar(255) NOT NULL COMMENT 'dedicated guest vlan range',
+   `account_id` bigint unsigned NOT NULL COMMENT 'account id. foreign key to account table',
+   `physical_network_id` bigint unsigned NOT NULL COMMENT 'physical network id. foreign key to the the physical network table',
+   PRIMARY KEY (`id`),
+   CONSTRAINT `fk_account_vnet_map__physical_network_id` FOREIGN KEY (`physical_network_id`) REFERENCES `physical_network` (`id`) ON DELETE CASCADE,
+   INDEX `i_account_vnet_map__physical_network_id`(`physical_network_id`),
+   CONSTRAINT `fk_account_vnet_map__account_id` FOREIGN KEY (`account_id`) REFERENCES `account` (`id`) ON DELETE CASCADE,
+   INDEX `i_account_vnet_map__account_id`(`account_id`)
+ ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+ 
+ ALTER TABLE `cloud`.`op_dc_vnet_alloc` ADD COLUMN account_vnet_map_id bigint unsigned;
+ ALTER TABLE `cloud`.`op_dc_vnet_alloc` ADD CONSTRAINT `fk_op_dc_vnet_alloc__account_vnet_map_id` FOREIGN KEY `fk_op_dc_vnet_alloc__account_vnet_map_id` (`account_vnet_map_id`) REFERENCES `account_vnet_map` (`id`);


[18/50] [abbrv] CLOUDSTACK-747: Internal LB between VPC tiers support

Posted by ah...@apache.org.
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2660a6b7/plugins/network-elements/internal-loadbalancer/test/org/apache/cloudstack/internallbelement/InternalLbElementServiceTest.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/internal-loadbalancer/test/org/apache/cloudstack/internallbelement/InternalLbElementServiceTest.java b/plugins/network-elements/internal-loadbalancer/test/org/apache/cloudstack/internallbelement/InternalLbElementServiceTest.java
new file mode 100644
index 0000000..f0e951c
--- /dev/null
+++ b/plugins/network-elements/internal-loadbalancer/test/org/apache/cloudstack/internallbelement/InternalLbElementServiceTest.java
@@ -0,0 +1,190 @@
+// 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 org.apache.cloudstack.internallbelement;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+import javax.inject.Inject;
+
+import org.apache.cloudstack.network.element.InternalLoadBalancerElementService;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mockito;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+
+import com.cloud.exception.InvalidParameterValueException;
+import com.cloud.network.VirtualRouterProvider;
+import com.cloud.network.VirtualRouterProvider.VirtualRouterProviderType;
+import com.cloud.network.dao.PhysicalNetworkServiceProviderDao;
+import com.cloud.network.dao.PhysicalNetworkServiceProviderVO;
+import com.cloud.network.dao.VirtualRouterProviderDao;
+import com.cloud.network.element.VirtualRouterProviderVO;
+import com.cloud.user.AccountManager;
+import com.cloud.utils.component.ComponentContext;
+
+@RunWith(SpringJUnit4ClassRunner.class)
+@ContextConfiguration(locations="classpath:/lb_element.xml")
+public class InternalLbElementServiceTest {
+    //The interface to test
+    @Inject InternalLoadBalancerElementService _lbElSvc;
+    
+    //Mocked interfaces
+    @Inject AccountManager _accountMgr;
+    @Inject VirtualRouterProviderDao _vrProviderDao;
+    @Inject PhysicalNetworkServiceProviderDao _pNtwkProviderDao;
+    
+    long validElId = 1L;
+    long nonExistingElId = 2L;
+    long invalidElId = 3L; //not of VirtualRouterProviderType
+    
+    long validProviderId = 1L;
+    long nonExistingProviderId = 2L;
+    long invalidProviderId = 3L;
+        
+
+    @Before
+    public void setUp() {
+        
+        ComponentContext.initComponentsLifeCycle();
+        VirtualRouterProviderVO validElement = new VirtualRouterProviderVO(1, VirtualRouterProviderType.InternalLbVm);
+        VirtualRouterProviderVO invalidElement = new VirtualRouterProviderVO(1, VirtualRouterProviderType.VirtualRouter);
+        
+        Mockito.when(_vrProviderDao.findById(validElId)).thenReturn(validElement);
+        Mockito.when(_vrProviderDao.findById(invalidElId)).thenReturn(invalidElement);
+        
+        Mockito.when(_vrProviderDao.persist(validElement)).thenReturn(validElement);
+        
+        Mockito.when(_vrProviderDao.findByNspIdAndType(validProviderId, VirtualRouterProviderType.InternalLbVm)).thenReturn(validElement);
+        
+        PhysicalNetworkServiceProviderVO validProvider = new PhysicalNetworkServiceProviderVO(1, "InternalLoadBalancerElement");
+        PhysicalNetworkServiceProviderVO invalidProvider = new PhysicalNetworkServiceProviderVO(1, "Invalid name!");
+
+        Mockito.when(_pNtwkProviderDao.findById(validProviderId)).thenReturn(validProvider);
+        Mockito.when(_pNtwkProviderDao.findById(invalidProviderId)).thenReturn(invalidProvider);
+        
+        Mockito.when(_vrProviderDao.persist(Mockito.any(VirtualRouterProviderVO.class))).thenReturn(validElement); 
+    }
+    
+    //TESTS FOR getInternalLoadBalancerElement METHOD
+    
+    
+    @Test (expected = InvalidParameterValueException.class)
+    public void findNonExistingVm() {
+        String expectedExcText = null;
+        try {
+            _lbElSvc.getInternalLoadBalancerElement(nonExistingElId); 
+        } catch (InvalidParameterValueException e) {
+            expectedExcText = e.getMessage();
+            throw e;
+        } finally {
+            assertEquals("Test failed. The non-existing intenral lb provider was found"
+        + expectedExcText, expectedExcText, "Unable to find InternalLoadBalancerElementService by id");
+        }
+    }
+    
+    
+    @Test (expected = InvalidParameterValueException.class)
+    public void findInvalidVm() {
+        String expectedExcText = null;
+        try {
+            _lbElSvc.getInternalLoadBalancerElement(invalidElId); 
+        } catch (InvalidParameterValueException e) {
+            expectedExcText = e.getMessage();
+            throw e;
+        } finally {
+            assertEquals("Test failed. The non-existing intenral lb provider was found"
+                    + expectedExcText, expectedExcText, "Unable to find InternalLoadBalancerElementService by id");
+        }
+    }
+    
+    
+    @Test
+    public void findValidVm() {
+        VirtualRouterProvider provider = null;
+        try {
+            provider = _lbElSvc.getInternalLoadBalancerElement(validElId); 
+        } finally {
+            assertNotNull("Test failed. Couldn't find the VR provider by the valid id",provider); 
+        }
+    }
+    
+    
+    //TESTS FOR configureInternalLoadBalancerElement METHOD
+    
+    @Test (expected = InvalidParameterValueException.class)
+    public void configureNonExistingVm() {
+        
+        _lbElSvc.configureInternalLoadBalancerElement(nonExistingElId, true); 
+        
+    }
+    
+    
+    @Test (expected = InvalidParameterValueException.class)
+    public void ConfigureInvalidVm() {
+        _lbElSvc.configureInternalLoadBalancerElement(invalidElId, true);    
+    }
+    
+    
+    @Test
+    public void enableProvider() {
+        VirtualRouterProvider provider = null;
+        try {
+            provider = _lbElSvc.configureInternalLoadBalancerElement(validElId, true); 
+        } finally {
+            assertNotNull("Test failed. Couldn't find the VR provider by the valid id ",provider);
+            assertTrue("Test failed. The provider wasn't eanbled ", provider.isEnabled()); 
+        }
+    }
+    
+    @Test
+    public void disableProvider() {
+        VirtualRouterProvider provider = null;
+        try {
+            provider = _lbElSvc.configureInternalLoadBalancerElement(validElId, false); 
+        } finally {
+            assertNotNull("Test failed. Couldn't find the VR provider by the valid id ",provider);
+            assertFalse("Test failed. The provider wasn't disabled ", provider.isEnabled()); 
+        }
+    } 
+    
+    //TESTS FOR addInternalLoadBalancerElement METHOD
+    
+    @Test (expected = InvalidParameterValueException.class)
+    public void addToNonExistingProvider() {
+        
+        _lbElSvc.addInternalLoadBalancerElement(nonExistingProviderId); 
+        
+    }
+    
+    @Test (expected = InvalidParameterValueException.class)
+    public void addToInvalidProvider() {
+        _lbElSvc.addInternalLoadBalancerElement(invalidProviderId);   
+    }
+    
+    @Test
+    public void addToExistingProvider() {
+        _lbElSvc.addInternalLoadBalancerElement(validProviderId);
+    }
+
+}
+
+

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2660a6b7/plugins/network-elements/internal-loadbalancer/test/org/apache/cloudstack/internallbelement/InternalLbElementTest.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/internal-loadbalancer/test/org/apache/cloudstack/internallbelement/InternalLbElementTest.java b/plugins/network-elements/internal-loadbalancer/test/org/apache/cloudstack/internallbelement/InternalLbElementTest.java
new file mode 100644
index 0000000..f19612f
--- /dev/null
+++ b/plugins/network-elements/internal-loadbalancer/test/org/apache/cloudstack/internallbelement/InternalLbElementTest.java
@@ -0,0 +1,226 @@
+// 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 org.apache.cloudstack.internallbelement;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+
+import java.lang.reflect.Field;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+
+import javax.inject.Inject;
+
+import org.apache.cloudstack.lb.ApplicationLoadBalancerRuleVO;
+import org.apache.cloudstack.network.element.InternalLoadBalancerElement;
+import org.apache.cloudstack.network.lb.InternalLoadBalancerVMManager;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mockito;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+
+import com.cloud.agent.api.to.LoadBalancerTO;
+import com.cloud.configuration.ConfigurationManager;
+import com.cloud.dc.DataCenter.NetworkType;
+import com.cloud.dc.DataCenterVO;
+import com.cloud.exception.ResourceUnavailableException;
+import com.cloud.network.Network.Provider;
+import com.cloud.network.Network.Service;
+import com.cloud.network.VirtualRouterProvider.VirtualRouterProviderType;
+import com.cloud.network.addr.PublicIp;
+import com.cloud.network.dao.NetworkVO;
+import com.cloud.network.dao.PhysicalNetworkServiceProviderDao;
+import com.cloud.network.dao.PhysicalNetworkServiceProviderVO;
+import com.cloud.network.dao.VirtualRouterProviderDao;
+import com.cloud.network.element.VirtualRouterProviderVO;
+import com.cloud.network.lb.LoadBalancingRule;
+import com.cloud.network.rules.FirewallRule;
+import com.cloud.network.rules.LoadBalancerContainer.Scheme;
+import com.cloud.user.AccountManager;
+import com.cloud.utils.component.ComponentContext;
+import com.cloud.utils.net.Ip;
+
+@RunWith(SpringJUnit4ClassRunner.class)
+@ContextConfiguration(locations="classpath:/lb_element.xml")
+public class InternalLbElementTest {
+    //The class to test
+    @Inject InternalLoadBalancerElement _lbEl;
+    
+    //Mocked interfaces
+    @Inject AccountManager _accountMgr;
+    @Inject VirtualRouterProviderDao _vrProviderDao;
+    @Inject PhysicalNetworkServiceProviderDao _pNtwkProviderDao;
+    @Inject InternalLoadBalancerVMManager _internalLbMgr;
+    @Inject ConfigurationManager _configMgr;
+    
+    long validElId = 1L;
+    long nonExistingElId = 2L;
+    long invalidElId = 3L; //not of VirtualRouterProviderType
+    long notEnabledElId = 4L;
+    
+    long validProviderId = 1L;
+    long nonExistingProviderId = 2L;
+    long invalidProviderId = 3L;
+        
+
+    @Before
+    public void setUp() {
+        
+        ComponentContext.initComponentsLifeCycle();
+        VirtualRouterProviderVO validElement = new VirtualRouterProviderVO(1, VirtualRouterProviderType.InternalLbVm);
+        validElement.setEnabled(true);
+        VirtualRouterProviderVO invalidElement = new VirtualRouterProviderVO(1, VirtualRouterProviderType.VirtualRouter);
+        VirtualRouterProviderVO notEnabledElement = new VirtualRouterProviderVO(1, VirtualRouterProviderType.InternalLbVm);
+ 
+        Mockito.when(_vrProviderDao.findByNspIdAndType(validElId, VirtualRouterProviderType.InternalLbVm)).thenReturn(validElement);
+        Mockito.when(_vrProviderDao.findByNspIdAndType(invalidElId, VirtualRouterProviderType.InternalLbVm)).thenReturn(invalidElement);
+        Mockito.when(_vrProviderDao.findByNspIdAndType(notEnabledElId, VirtualRouterProviderType.InternalLbVm)).thenReturn(notEnabledElement);
+
+        Mockito.when(_vrProviderDao.persist(validElement)).thenReturn(validElement);
+        
+        Mockito.when(_vrProviderDao.findByNspIdAndType(validProviderId, VirtualRouterProviderType.InternalLbVm)).thenReturn(validElement);
+        
+        PhysicalNetworkServiceProviderVO validProvider = new PhysicalNetworkServiceProviderVO(1, "InternalLoadBalancerElement");
+        PhysicalNetworkServiceProviderVO invalidProvider = new PhysicalNetworkServiceProviderVO(1, "Invalid name!");
+
+        Mockito.when(_pNtwkProviderDao.findById(validProviderId)).thenReturn(validProvider);
+        Mockito.when(_pNtwkProviderDao.findById(invalidProviderId)).thenReturn(invalidProvider);
+        
+        Mockito.when(_vrProviderDao.persist(Mockito.any(VirtualRouterProviderVO.class))).thenReturn(validElement);
+        
+        DataCenterVO dc = new DataCenterVO
+                (1L, null, null, null, null, null, null, null, null, null, NetworkType.Advanced, null, null);
+        Mockito.when(_configMgr.getZone(Mockito.anyLong())).thenReturn(dc);
+    }
+    
+    //TEST FOR getProvider() method
+    
+    @Test 
+    public void verifyProviderName() {  
+       Provider pr = _lbEl.getProvider();
+       assertEquals("Wrong provider is returned", pr.getName(), Provider.InternalLbVm.getName());
+    }
+    
+    //TEST FOR isReady() METHOD
+    
+    @Test 
+    public void verifyValidProviderState() {
+       PhysicalNetworkServiceProviderVO provider = new PhysicalNetworkServiceProviderVO();
+       provider = setId(provider, validElId);
+       boolean isReady = _lbEl.isReady(provider);
+       assertTrue("Valid provider is returned as not ready", isReady);
+    }
+    
+    
+    @Test 
+    public void verifyNonExistingProviderState() {
+       PhysicalNetworkServiceProviderVO provider = new PhysicalNetworkServiceProviderVO();
+       provider = setId(provider, nonExistingElId);
+       boolean isReady = _lbEl.isReady(provider);
+       assertFalse("Non existing provider is returned as ready", isReady);
+    }
+    
+    
+    @Test 
+    public void verifyInvalidProviderState() {
+       PhysicalNetworkServiceProviderVO provider = new PhysicalNetworkServiceProviderVO();
+       provider = setId(provider, invalidElId);
+       boolean isReady = _lbEl.isReady(provider);
+       assertFalse("Not valid provider is returned as ready", isReady);
+    }
+    
+    @Test 
+    public void verifyNotEnabledProviderState() {
+       PhysicalNetworkServiceProviderVO provider = new PhysicalNetworkServiceProviderVO();
+       provider = setId(provider, notEnabledElId);
+       boolean isReady = _lbEl.isReady(provider);
+       assertFalse("Not enabled provider is returned as ready", isReady);
+    }
+    
+    //TEST FOR canEnableIndividualServices METHOD
+    @Test 
+    public void verifyCanEnableIndividualSvc() {  
+       boolean result = _lbEl.canEnableIndividualServices();
+       assertTrue("Wrong value is returned by canEnableIndividualSvc", result);
+    }
+    
+    //TEST FOR verifyServicesCombination METHOD
+    @Test 
+    public void verifyServicesCombination() {  
+       boolean result = _lbEl.verifyServicesCombination(new HashSet<Service>());
+       assertTrue("Wrong value is returned by verifyServicesCombination", result);
+    }
+    
+    
+    //TEST FOR applyIps METHOD
+    @Test 
+    public void verifyApplyIps() throws ResourceUnavailableException {
+       List<PublicIp> ips = new ArrayList<PublicIp>();
+       boolean result = _lbEl.applyIps(new NetworkVO(), ips, new HashSet<Service>());
+       assertTrue("Wrong value is returned by applyIps method", result);
+    }
+    
+    
+    //TEST FOR updateHealthChecks METHOD
+    @Test 
+    public void verifyUpdateHealthChecks() throws ResourceUnavailableException {
+       List<LoadBalancerTO> check = _lbEl.updateHealthChecks(new NetworkVO(), new ArrayList<LoadBalancingRule>());
+       assertNull("Wrong value is returned by updateHealthChecks method", check);
+    }
+    
+    //TEST FOR validateLBRule METHOD
+    @Test 
+    public void verifyValidateLBRule() throws ResourceUnavailableException {
+        ApplicationLoadBalancerRuleVO lb = new ApplicationLoadBalancerRuleVO(null, null, 22, 22, "roundrobin",
+                1L, 1L, 1L, new Ip("10.10.10.1"), 1L, Scheme.Internal);
+        lb.setState(FirewallRule.State.Add);
+        
+        LoadBalancingRule rule = new LoadBalancingRule(lb, null,
+                null, null, new Ip("10.10.10.1"));
+        
+        
+        boolean result = _lbEl.validateLBRule(new NetworkVO(), rule);
+        assertTrue("Wrong value is returned by validateLBRule method", result);
+    }
+    
+    
+    private static PhysicalNetworkServiceProviderVO setId(PhysicalNetworkServiceProviderVO vo, long id) {
+        PhysicalNetworkServiceProviderVO voToReturn = vo;
+        Class<?> c = voToReturn.getClass();
+        try {
+            Field f = c.getDeclaredField("id");
+            f.setAccessible(true);
+            f.setLong(voToReturn, id);
+        } catch (NoSuchFieldException ex) {
+           return null;
+        } catch (IllegalAccessException ex) {
+            return null;
+        }
+        
+        return voToReturn;
+    }
+    
+    
+    
+}
+
+

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2660a6b7/plugins/network-elements/internal-loadbalancer/test/org/apache/cloudstack/internallbvmmgr/InternalLBVMManagerTest.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/internal-loadbalancer/test/org/apache/cloudstack/internallbvmmgr/InternalLBVMManagerTest.java b/plugins/network-elements/internal-loadbalancer/test/org/apache/cloudstack/internallbvmmgr/InternalLBVMManagerTest.java
new file mode 100644
index 0000000..a19a82e
--- /dev/null
+++ b/plugins/network-elements/internal-loadbalancer/test/org/apache/cloudstack/internallbvmmgr/InternalLBVMManagerTest.java
@@ -0,0 +1,388 @@
+// 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 org.apache.cloudstack.internallbvmmgr;
+
+import java.lang.reflect.Field;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.inject.Inject;
+
+import junit.framework.TestCase;
+
+import org.apache.cloudstack.lb.ApplicationLoadBalancerRuleVO;
+import org.apache.cloudstack.network.lb.InternalLoadBalancerVMManager;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mockito;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+
+import com.cloud.agent.AgentManager;
+import com.cloud.agent.api.Answer;
+import com.cloud.agent.manager.Commands;
+import com.cloud.dc.DataCenter.NetworkType;
+import com.cloud.dc.DataCenterVO;
+import com.cloud.dc.dao.DataCenterDao;
+import com.cloud.exception.AgentUnavailableException;
+import com.cloud.exception.ConcurrentOperationException;
+import com.cloud.exception.OperationTimedoutException;
+import com.cloud.exception.ResourceUnavailableException;
+import com.cloud.hypervisor.Hypervisor.HypervisorType;
+import com.cloud.network.NetworkModel;
+import com.cloud.network.dao.NetworkVO;
+import com.cloud.network.lb.LoadBalancingRule;
+import com.cloud.network.router.VirtualRouter;
+import com.cloud.network.router.VirtualRouter.Role;
+import com.cloud.network.rules.FirewallRule;
+import com.cloud.network.rules.LoadBalancerContainer.Scheme;
+import com.cloud.service.ServiceOfferingVO;
+import com.cloud.service.dao.ServiceOfferingDao;
+import com.cloud.user.Account;
+import com.cloud.user.AccountManager;
+import com.cloud.user.AccountVO;
+import com.cloud.user.User;
+import com.cloud.utils.component.ComponentContext;
+import com.cloud.utils.exception.CloudRuntimeException;
+import com.cloud.utils.net.Ip;
+import com.cloud.vm.DomainRouterVO;
+import com.cloud.vm.NicProfile;
+import com.cloud.vm.NicVO;
+import com.cloud.vm.VirtualMachine;
+import com.cloud.vm.VirtualMachine.State;
+import com.cloud.vm.VirtualMachineManager;
+import com.cloud.vm.dao.DomainRouterDao;
+import com.cloud.vm.dao.NicDao;
+
+/**
+ * Set of unittests for InternalLoadBalancerVMManager
+ *
+ */
+
+@RunWith(SpringJUnit4ClassRunner.class)
+@ContextConfiguration(locations="classpath:/lb_mgr.xml")
+public class InternalLBVMManagerTest extends TestCase {
+    //The interface to test
+    @Inject InternalLoadBalancerVMManager _lbVmMgr;
+    
+    //Mocked interfaces
+    @Inject AccountManager _accountMgr;
+    @Inject ServiceOfferingDao _svcOffDao;
+    @Inject DomainRouterDao _domainRouterDao;
+    @Inject NicDao _nicDao;
+    @Inject AgentManager _agentMgr;
+    @Inject NetworkModel _ntwkModel;
+    @Inject VirtualMachineManager _itMgr;
+    @Inject DataCenterDao _dcDao;
+    
+    long validNtwkId = 1L;
+    long invalidNtwkId = 2L;
+    String requestedIp = "10.1.1.1";
+    DomainRouterVO vm = null;
+    NetworkVO ntwk = createNetwork();
+    long validVmId = 1L;
+    long invalidVmId = 2L;
+    
+    @Before
+    public void setUp() {
+        //mock system offering creation as it's used by configure() method called by initComponentsLifeCycle
+        Mockito.when(_accountMgr.getAccount(1L)).thenReturn(new AccountVO());
+        ServiceOfferingVO off = new ServiceOfferingVO("alena", 1, 1,
+                1, 1, 1, false, "alena", false, false, null, false, VirtualMachine.Type.InternalLoadBalancerVm, false);
+        off = setId(off, 1);
+        Mockito.when(_svcOffDao.persistSystemServiceOffering(Mockito.any(ServiceOfferingVO.class))).thenReturn(off);
+        
+        ComponentContext.initComponentsLifeCycle();
+        
+        vm = new DomainRouterVO(1L,off.getId(),1,"alena",1,HypervisorType.XenServer,1,1,1,
+                false, 0,false,null,false,false,
+                VirtualMachine.Type.InternalLoadBalancerVm, null);
+        vm.setRole(Role.INTERNAL_LB_VM);
+        vm = setId(vm, 1);
+        vm.setPrivateIpAddress("10.2.2.2");
+        NicVO nic = new NicVO("somereserver", 1L, 1L, VirtualMachine.Type.InternalLoadBalancerVm);
+        nic.setIp4Address(requestedIp);
+        
+        List<DomainRouterVO> emptyList = new ArrayList<DomainRouterVO>();
+        List<DomainRouterVO> nonEmptyList = new ArrayList<DomainRouterVO>();
+        nonEmptyList.add(vm);
+        
+        Mockito.when(_domainRouterDao.listByNetworkAndRole(invalidNtwkId, Role.INTERNAL_LB_VM)).thenReturn(emptyList);
+        Mockito.when(_domainRouterDao.listByNetworkAndRole(validNtwkId, Role.INTERNAL_LB_VM)).thenReturn(nonEmptyList);
+        
+        Mockito.when(_nicDao.findByNtwkIdAndInstanceId(validNtwkId, 1)).thenReturn(nic);
+        Mockito.when(_nicDao.findByNtwkIdAndInstanceId(invalidNtwkId, 1)).thenReturn(nic);
+
+        Answer answer= new Answer(null, true, null);
+        Answer[] answers = new Answer[1];
+        answers[0] = answer;
+        
+        try {
+            Mockito.when(_agentMgr.send(Mockito.anyLong(), Mockito.any(Commands.class))).thenReturn(answers);
+        } catch (AgentUnavailableException e) {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+        } catch (OperationTimedoutException e) {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+        }
+        
+        createNetwork();
+        Mockito.when(_ntwkModel.getNetwork(Mockito.anyLong())).thenReturn(ntwk);
+
+        
+        Mockito.when(_itMgr.toNicTO(Mockito.any(NicProfile.class), Mockito.any(HypervisorType.class))).thenReturn(null);
+        Mockito.when(_domainRouterDao.findById(Mockito.anyLong())).thenReturn(vm);
+        DataCenterVO dc = new DataCenterVO
+                (1L, null, null, null, null, null, null, null, null, null, NetworkType.Advanced, null, null);
+        Mockito.when(_dcDao.findById(Mockito.anyLong())).thenReturn(dc);
+        
+        
+        try {
+            Mockito.when(_itMgr.expunge(Mockito.any(DomainRouterVO.class), Mockito.any(User.class), Mockito.any(Account.class))).thenReturn(true);
+        } catch (ResourceUnavailableException e) {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+        } 
+        
+        Mockito.when(_domainRouterDao.findById(validVmId)).thenReturn(vm);
+        Mockito.when(_domainRouterDao.findById(invalidVmId)).thenReturn(null);
+
+    }
+
+    protected NetworkVO createNetwork() {
+        ntwk = new NetworkVO();
+        try {
+            ntwk.setBroadcastUri(new URI("somevlan"));
+        } catch (URISyntaxException e) {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+        }
+        ntwk = setId(ntwk, 1L);
+        return ntwk;
+    }
+    
+    //TESTS FOR findInternalLbVms METHOD
+    
+    @Test
+    public void findInternalLbVmsForInvalidNetwork() {
+        List<? extends VirtualRouter> vms = _lbVmMgr.findInternalLbVms(invalidNtwkId, new Ip(requestedIp));
+        assertTrue("Non empty vm list was returned for invalid network id", vms.isEmpty());
+    }
+    
+    @Test
+    public void findInternalLbVmsForValidNetwork() {
+        List<? extends VirtualRouter> vms = _lbVmMgr.findInternalLbVms(validNtwkId, new Ip(requestedIp));
+        assertTrue("Empty vm list was returned for valid network id", !vms.isEmpty());
+    }
+    
+    
+    //TESTS FOR applyLoadBalancingRules METHOD
+    @Test
+    public void applyEmptyRulesSet() {
+        boolean result = false;
+        List<DomainRouterVO> vms = new ArrayList<DomainRouterVO>();
+        try {
+            result = _lbVmMgr.applyLoadBalancingRules(new NetworkVO(), new ArrayList<LoadBalancingRule>(), vms);
+        } catch (ResourceUnavailableException e) {
+
+        } finally {
+            assertTrue("Got failure when tried to apply empty list of rules", result);
+        }
+    }
+    
+    @Test (expected = CloudRuntimeException.class)
+    public void applyWithEmptyVmsSet() {
+        boolean result = false;
+        List<DomainRouterVO> vms = new ArrayList<DomainRouterVO>();
+        List<LoadBalancingRule> rules = new ArrayList<LoadBalancingRule>();
+        LoadBalancingRule rule = new LoadBalancingRule(null, null,
+                null, null, null);
+        
+        rules.add(rule);
+        try {
+            result = _lbVmMgr.applyLoadBalancingRules(new NetworkVO(), rules, vms);
+        } catch (ResourceUnavailableException e) {
+        } finally {
+            assertFalse("Got success when tried to apply with the empty internal lb vm list", result);
+        }
+    }
+    
+    @Test (expected = ResourceUnavailableException.class)
+    public void applyToVmInStartingState() throws ResourceUnavailableException {
+        boolean result = false;
+        List<DomainRouterVO> vms = new ArrayList<DomainRouterVO>();
+        vm.setState(State.Starting);
+        vms.add(vm);
+        
+        List<LoadBalancingRule> rules = new ArrayList<LoadBalancingRule>();
+        LoadBalancingRule rule = new LoadBalancingRule(null, null,
+                null, null, null);
+        
+        rules.add(rule);
+        try {
+            result = _lbVmMgr.applyLoadBalancingRules(new NetworkVO(), rules, vms);
+        } finally {
+            assertFalse("Rules were applied to vm in Starting state", result);
+        }
+    }
+    
+    
+    @Test
+    public void applyToVmInStoppedState() throws ResourceUnavailableException {
+        boolean result = false;
+        List<DomainRouterVO> vms = new ArrayList<DomainRouterVO>();
+        vm.setState(State.Stopped);
+        vms.add(vm);
+        
+        List<LoadBalancingRule> rules = new ArrayList<LoadBalancingRule>();
+        LoadBalancingRule rule = new LoadBalancingRule(null, null,
+                null, null, null);
+        
+        rules.add(rule);
+        try {
+            result = _lbVmMgr.applyLoadBalancingRules(new NetworkVO(), rules, vms);
+        } finally {
+            assertTrue("Rules failed to apply to vm in Stopped state", result);
+        }
+    }
+    
+    
+    @Test
+    public void applyToVmInStoppingState() throws ResourceUnavailableException {
+        boolean result = false;
+        List<DomainRouterVO> vms = new ArrayList<DomainRouterVO>();
+        vm.setState(State.Stopping);
+        vms.add(vm);
+        
+        List<LoadBalancingRule> rules = new ArrayList<LoadBalancingRule>();
+        LoadBalancingRule rule = new LoadBalancingRule(null, null,
+                null, null, null);
+        
+        rules.add(rule);
+        try {
+            result = _lbVmMgr.applyLoadBalancingRules(new NetworkVO(), rules, vms);
+        } finally {
+            assertTrue("Rules failed to apply to vm in Stopping state", result);
+        }
+    }
+    
+    
+    @Test
+    public void applyToVmInRunningState() throws ResourceUnavailableException {
+        boolean result = false;
+        List<DomainRouterVO> vms = new ArrayList<DomainRouterVO>();
+        vm.setState(State.Running);
+        vms.add(vm);
+        
+        List<LoadBalancingRule> rules = new ArrayList<LoadBalancingRule>();
+        ApplicationLoadBalancerRuleVO lb = new ApplicationLoadBalancerRuleVO(null, null, 22, 22, "roundrobin",
+                1L, 1L, 1L, new Ip(requestedIp), 1L, Scheme.Internal);
+        lb.setState(FirewallRule.State.Add);
+        
+        LoadBalancingRule rule = new LoadBalancingRule(lb, null,
+                null, null, new Ip(requestedIp));
+        
+        rules.add(rule);
+        
+        ntwk.getId();
+        
+        try {
+            result = _lbVmMgr.applyLoadBalancingRules(ntwk, rules, vms);
+        } finally {
+            assertTrue("Rules failed to apply to vm in Running state", result);
+        }
+    }
+    
+    
+    //TESTS FOR destroyInternalLbVm METHOD
+    @Test
+    public void destroyNonExistingVM() throws ResourceUnavailableException, ConcurrentOperationException {
+        boolean result = false;
+        
+        try {
+             result = _lbVmMgr.destroyInternalLbVm(invalidVmId, new AccountVO(), 1L);
+        } finally {
+            assertTrue("Failed to destroy non-existing vm", result);
+        }
+    }
+    
+    @Test
+    public void destroyExistingVM() throws ResourceUnavailableException, ConcurrentOperationException {
+        boolean result = false;
+        
+        try {
+             result = _lbVmMgr.destroyInternalLbVm(validVmId, new AccountVO(), 1L);
+        } finally {
+            assertTrue("Failed to destroy valid vm", result);
+        }
+    }
+    
+    
+    private static ServiceOfferingVO setId(ServiceOfferingVO vo, long id) {
+        ServiceOfferingVO voToReturn = vo;
+        Class<?> c = voToReturn.getClass();
+        try {
+            Field f = c.getSuperclass().getDeclaredField("id");
+            f.setAccessible(true);
+            f.setLong(voToReturn, id);
+        } catch (NoSuchFieldException ex) {
+           return null;
+        } catch (IllegalAccessException ex) {
+            return null;
+        }
+        
+        return voToReturn;
+    }
+    
+    
+    private static NetworkVO setId(NetworkVO vo, long id) {
+        NetworkVO voToReturn = vo;
+        Class<?> c = voToReturn.getClass();
+        try {
+            Field f = c.getDeclaredField("id");
+            f.setAccessible(true);
+            f.setLong(voToReturn, id);
+        } catch (NoSuchFieldException ex) {
+           return null;
+        } catch (IllegalAccessException ex) {
+            return null;
+        }
+        
+        return voToReturn;
+    }
+    
+    private static DomainRouterVO setId(DomainRouterVO vo, long id) {
+        DomainRouterVO voToReturn = vo;
+        Class<?> c = voToReturn.getClass();
+        try {
+            Field f = c.getSuperclass().getDeclaredField("id");
+            f.setAccessible(true);
+            f.setLong(voToReturn, id);
+        } catch (NoSuchFieldException ex) {
+           return null;
+        } catch (IllegalAccessException ex) {
+            return null;
+        }
+        
+        return voToReturn;
+    }
+    
+}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2660a6b7/plugins/network-elements/internal-loadbalancer/test/org/apache/cloudstack/internallbvmmgr/InternalLBVMServiceTest.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/internal-loadbalancer/test/org/apache/cloudstack/internallbvmmgr/InternalLBVMServiceTest.java b/plugins/network-elements/internal-loadbalancer/test/org/apache/cloudstack/internallbvmmgr/InternalLBVMServiceTest.java
new file mode 100644
index 0000000..75f54fa
--- /dev/null
+++ b/plugins/network-elements/internal-loadbalancer/test/org/apache/cloudstack/internallbvmmgr/InternalLBVMServiceTest.java
@@ -0,0 +1,291 @@
+// 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 org.apache.cloudstack.internallbvmmgr;
+
+import java.lang.reflect.Field;
+import java.util.Map;
+
+import javax.inject.Inject;
+
+import junit.framework.TestCase;
+
+import org.apache.cloudstack.network.lb.InternalLoadBalancerVMService;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mockito;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+
+import com.cloud.deploy.DeploymentPlan;
+import com.cloud.exception.ConcurrentOperationException;
+import com.cloud.exception.InsufficientCapacityException;
+import com.cloud.exception.InvalidParameterValueException;
+import com.cloud.exception.OperationTimedoutException;
+import com.cloud.exception.ResourceUnavailableException;
+import com.cloud.exception.StorageUnavailableException;
+import com.cloud.hypervisor.Hypervisor.HypervisorType;
+import com.cloud.network.router.VirtualRouter;
+import com.cloud.network.router.VirtualRouter.Role;
+import com.cloud.service.ServiceOfferingVO;
+import com.cloud.service.dao.ServiceOfferingDao;
+import com.cloud.user.Account;
+import com.cloud.user.AccountManager;
+import com.cloud.user.AccountVO;
+import com.cloud.user.User;
+import com.cloud.utils.component.ComponentContext;
+import com.cloud.vm.DomainRouterVO;
+import com.cloud.vm.VirtualMachine;
+import com.cloud.vm.VirtualMachineManager;
+import com.cloud.vm.dao.DomainRouterDao;
+
+/**
+ * Set of unittests for InternalLoadBalancerVMService
+ *
+ */
+
+@RunWith(SpringJUnit4ClassRunner.class)
+@ContextConfiguration(locations="classpath:/lb_svc.xml")
+@SuppressWarnings("unchecked")
+public class InternalLBVMServiceTest extends TestCase {
+    //The interface to test
+    @Inject InternalLoadBalancerVMService _lbVmSvc;
+    
+    //Mocked interfaces
+    @Inject AccountManager _accountMgr;
+    @Inject ServiceOfferingDao _svcOffDao;
+    @Inject DomainRouterDao _domainRouterDao;
+    @Inject VirtualMachineManager _itMgr;
+    
+    long validVmId = 1L;
+    long nonExistingVmId = 2L;
+    long nonInternalLbVmId = 3L;
+    
+    @Before
+    public void setUp() {
+        //mock system offering creation as it's used by configure() method called by initComponentsLifeCycle
+        Mockito.when(_accountMgr.getAccount(1L)).thenReturn(new AccountVO());
+        ServiceOfferingVO off = new ServiceOfferingVO("alena", 1, 1,
+                1, 1, 1, false, "alena", false, false, null, false, VirtualMachine.Type.InternalLoadBalancerVm, false);
+        off = setId(off, 1);
+        Mockito.when(_svcOffDao.persistSystemServiceOffering(Mockito.any(ServiceOfferingVO.class))).thenReturn(off);
+        
+        ComponentContext.initComponentsLifeCycle();
+        
+        DomainRouterVO validVm = new DomainRouterVO(validVmId,off.getId(),1,"alena",1,HypervisorType.XenServer,1,1,1,
+                false, 0,false,null,false,false,
+                VirtualMachine.Type.InternalLoadBalancerVm, null);
+        validVm.setRole(Role.INTERNAL_LB_VM);
+        DomainRouterVO nonInternalLbVm = new DomainRouterVO(validVmId,off.getId(),1,"alena",1,HypervisorType.XenServer,1,1,1,
+                false, 0,false,null,false,false,
+                VirtualMachine.Type.DomainRouter, null);
+        nonInternalLbVm.setRole(Role.VIRTUAL_ROUTER);
+        
+        Mockito.when(_domainRouterDao.findById(validVmId)).thenReturn(validVm);
+        Mockito.when(_domainRouterDao.findById(nonExistingVmId)).thenReturn(null);
+        Mockito.when(_domainRouterDao.findById(nonInternalLbVmId)).thenReturn(nonInternalLbVm);
+        
+        try {
+            Mockito.when(_itMgr.start(Mockito.any(DomainRouterVO.class),
+                    Mockito.any(Map.class), Mockito.any(User.class), Mockito.any(Account.class), Mockito.any(DeploymentPlan.class))).thenReturn(validVm);
+        } catch (InsufficientCapacityException e) {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+        } catch (ResourceUnavailableException e) {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+        }
+        
+        try {
+            Mockito.when(_itMgr.advanceStop(Mockito.any(DomainRouterVO.class), Mockito.any(Boolean.class), Mockito.any(User.class), Mockito.any(Account.class))).thenReturn(true);
+        } catch (ResourceUnavailableException e) {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+        } catch (OperationTimedoutException e) {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+        } catch (ConcurrentOperationException e) {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+        }
+
+    }
+    
+    //TESTS FOR START COMMAND
+    
+    
+    @Test (expected = InvalidParameterValueException.class)
+    public void startNonExistingVm() {
+        String expectedExcText = null;
+        try {
+            _lbVmSvc.startInternalLbVm(nonExistingVmId, _accountMgr.getAccount(1L), 1L);
+        } catch (StorageUnavailableException e) {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+        } catch (InsufficientCapacityException e) {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+        } catch (ConcurrentOperationException e) {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+        } catch (ResourceUnavailableException e) {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+        } catch (InvalidParameterValueException e) {
+            expectedExcText = e.getMessage();
+            throw e;
+        } finally {
+            assertEquals("Test failed. The non-existing internal lb vm was attempted to start"
+        + expectedExcText, expectedExcText, "Can't find internal lb vm by id specified");
+        }
+    }
+    
+    @Test (expected = InvalidParameterValueException.class)
+    public void startNonInternalLbVmVm() {
+        String expectedExcText = null;
+        try {
+            _lbVmSvc.startInternalLbVm(nonInternalLbVmId, _accountMgr.getAccount(1L), 1L);
+        } catch (StorageUnavailableException e) {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+        } catch (InsufficientCapacityException e) {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+        } catch (ConcurrentOperationException e) {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+        } catch (ResourceUnavailableException e) {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+        }catch (InvalidParameterValueException e) {
+            expectedExcText = e.getMessage();
+            throw e;
+        } finally {
+            assertEquals("Test failed. The existing vm of not Internal lb vm type was attempted to start"
+        + expectedExcText, expectedExcText, "Can't find internal lb vm by id specified");
+        }
+    }
+    
+    @Test
+    public void startValidLbVmVm() {
+        VirtualRouter vr = null;
+        try {
+            vr = _lbVmSvc.startInternalLbVm(validVmId, _accountMgr.getAccount(1L), 1L);
+        } catch (StorageUnavailableException e) {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+        } catch (InsufficientCapacityException e) {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+        } catch (ConcurrentOperationException e) {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+        } catch (ResourceUnavailableException e) {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+        } finally {
+            assertNotNull("Internal LB vm is null which means it failed to start " + vr, vr);
+        }
+    }
+    
+    
+    //TEST FOR STOP COMMAND
+    @Test (expected = InvalidParameterValueException.class)
+    public void stopNonExistingVm() {
+        String expectedExcText = null;
+        try {
+            _lbVmSvc.stopInternalLbVm(nonExistingVmId, false,_accountMgr.getAccount(1L), 1L);
+        } catch (StorageUnavailableException e) {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+        } catch (ConcurrentOperationException e) {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+        } catch (ResourceUnavailableException e) {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+        } catch (InvalidParameterValueException e) {
+            expectedExcText = e.getMessage();
+            throw e;
+        } finally {
+            assertEquals("Test failed. The non-existing internal lb vm was attempted to stop"
+        + expectedExcText, expectedExcText, "Can't find internal lb vm by id specified");
+        }
+    }
+    
+    
+    @Test (expected = InvalidParameterValueException.class)
+    public void stopNonInternalLbVmVm() {
+        String expectedExcText = null;
+        try {
+            _lbVmSvc.stopInternalLbVm(nonInternalLbVmId, false, _accountMgr.getAccount(1L), 1L);
+        } catch (StorageUnavailableException e) {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+        } catch (ConcurrentOperationException e) {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+        } catch (ResourceUnavailableException e) {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+        }catch (InvalidParameterValueException e) {
+            expectedExcText = e.getMessage();
+            throw e;
+        } finally {
+            assertEquals("Test failed. The existing vm of not Internal lb vm type was attempted to stop"
+        + expectedExcText, expectedExcText, "Can't find internal lb vm by id specified");
+        }
+    }
+    
+    
+    @Test
+    public void stopValidLbVmVm() {
+        VirtualRouter vr = null;
+        try {
+            vr = _lbVmSvc.stopInternalLbVm(validVmId, false, _accountMgr.getAccount(1L), 1L);
+        } catch (StorageUnavailableException e) {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+        } catch (ConcurrentOperationException e) {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+        } catch (ResourceUnavailableException e) {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+        } finally {
+            assertNotNull("Internal LB vm is null which means it failed to stop " + vr, vr);
+        }
+    }
+    
+    
+    
+    private static ServiceOfferingVO setId(ServiceOfferingVO vo, long id) {
+        ServiceOfferingVO voToReturn = vo;
+        Class<?> c = voToReturn.getClass();
+        try {
+            Field f = c.getSuperclass().getDeclaredField("id");
+            f.setAccessible(true);
+            f.setLong(voToReturn, id);
+        } catch (NoSuchFieldException ex) {
+           return null;
+        } catch (IllegalAccessException ex) {
+            return null;
+        }
+        
+        return voToReturn;
+    }
+}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2660a6b7/plugins/network-elements/internal-loadbalancer/test/org/apache/cloudstack/internallbvmmgr/LbChildTestConfiguration.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/internal-loadbalancer/test/org/apache/cloudstack/internallbvmmgr/LbChildTestConfiguration.java b/plugins/network-elements/internal-loadbalancer/test/org/apache/cloudstack/internallbvmmgr/LbChildTestConfiguration.java
new file mode 100644
index 0000000..0f24f96
--- /dev/null
+++ b/plugins/network-elements/internal-loadbalancer/test/org/apache/cloudstack/internallbvmmgr/LbChildTestConfiguration.java
@@ -0,0 +1,170 @@
+// 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 org.apache.cloudstack.internallbvmmgr;
+
+import java.io.IOException;
+
+import org.apache.cloudstack.lb.dao.ApplicationLoadBalancerRuleDao;
+import org.apache.cloudstack.test.utils.SpringUtils;
+import org.mockito.Mockito;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.context.annotation.ComponentScan.Filter;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.FilterType;
+import org.springframework.core.type.classreading.MetadataReader;
+import org.springframework.core.type.classreading.MetadataReaderFactory;
+import org.springframework.core.type.filter.TypeFilter;
+
+import com.cloud.agent.AgentManager;
+import com.cloud.configuration.dao.ConfigurationDao;
+import com.cloud.dc.dao.AccountVlanMapDaoImpl;
+import com.cloud.dc.dao.DataCenterDao;
+import com.cloud.network.NetworkManager;
+import com.cloud.network.NetworkModel;
+import com.cloud.network.dao.NetworkDao;
+import com.cloud.network.dao.PhysicalNetworkServiceProviderDao;
+import com.cloud.network.dao.VirtualRouterProviderDao;
+import com.cloud.network.lb.LoadBalancingRulesManager;
+import com.cloud.offerings.dao.NetworkOfferingDao;
+import com.cloud.resource.ResourceManager;
+import com.cloud.server.ConfigurationServer;
+import com.cloud.service.dao.ServiceOfferingDao;
+import com.cloud.storage.dao.VMTemplateDao;
+import com.cloud.user.AccountManager;
+import com.cloud.vm.VirtualMachineManager;
+import com.cloud.vm.dao.DomainRouterDao;
+import com.cloud.vm.dao.NicDao;
+
+@Configuration
+@ComponentScan(
+    basePackageClasses={
+        AccountVlanMapDaoImpl.class
+    },
+    includeFilters={@Filter(value=LbChildTestConfiguration.Library.class, type=FilterType.CUSTOM)},
+    useDefaultFilters=false
+    )
+
+    public class LbChildTestConfiguration {
+        
+        public static class Library implements TypeFilter {
+            
+          
+            @Bean
+            public AccountManager accountManager() {
+                return Mockito.mock(AccountManager.class);
+            }
+            
+            @Bean
+            public VirtualMachineManager virtualMachineManager() {
+                return Mockito.mock(VirtualMachineManager.class);
+            }
+            
+            @Bean
+            public DomainRouterDao domainRouterDao() {
+                return Mockito.mock(DomainRouterDao.class);
+            }
+            
+            @Bean
+            public ConfigurationDao configurationDao() {
+                return Mockito.mock(ConfigurationDao.class);
+            }
+            
+            @Bean
+            public VirtualRouterProviderDao virtualRouterProviderDao() {
+                return Mockito.mock(VirtualRouterProviderDao.class);
+            }
+            
+            @Bean
+            public ApplicationLoadBalancerRuleDao applicationLoadBalancerRuleDao() {
+                return Mockito.mock(ApplicationLoadBalancerRuleDao.class);
+            }
+            
+            @Bean
+            public NetworkModel networkModel() {
+                return Mockito.mock(NetworkModel.class);
+            }
+            
+            @Bean
+            public LoadBalancingRulesManager loadBalancingRulesManager() {
+                return Mockito.mock(LoadBalancingRulesManager.class);
+            }
+            
+            @Bean
+            public NicDao nicDao() {
+                return Mockito.mock(NicDao.class);
+            }
+            
+            @Bean
+            public NetworkDao networkDao() {
+                return Mockito.mock(NetworkDao.class);
+            }
+            
+            @Bean
+            public NetworkManager networkManager() {
+                return Mockito.mock(NetworkManager.class);
+            }
+            
+            @Bean
+            public ServiceOfferingDao serviceOfferingDao() {
+                return Mockito.mock(ServiceOfferingDao.class);
+            }
+            
+            @Bean
+            public PhysicalNetworkServiceProviderDao physicalNetworkServiceProviderDao() {
+                return Mockito.mock(PhysicalNetworkServiceProviderDao.class);
+            }
+            
+            @Bean
+            public NetworkOfferingDao networkOfferingDao() {
+                return Mockito.mock(NetworkOfferingDao.class);
+            }
+            
+            @Bean
+            public VMTemplateDao vmTemplateDao() {
+                return Mockito.mock(VMTemplateDao.class);
+            }
+            
+            @Bean
+            public ResourceManager resourceManager() {
+                return Mockito.mock(ResourceManager.class);
+            }
+            
+            @Bean
+            public AgentManager agentManager() {
+                return Mockito.mock(AgentManager.class);
+            }
+            
+            @Bean
+            public DataCenterDao dataCenterDao() {
+                return Mockito.mock(DataCenterDao.class);
+            }
+            
+            @Bean
+            public ConfigurationServer configurationServer() {
+                return Mockito.mock(ConfigurationServer.class);
+            }
+            
+            @Override
+            public boolean match(MetadataReader mdr, MetadataReaderFactory arg1) throws IOException {
+                mdr.getClassMetadata().getClassName();
+                ComponentScan cs = LbChildTestConfiguration.class.getAnnotation(ComponentScan.class);
+                return SpringUtils.includedInBasePackageClasses(mdr.getClassMetadata().getClassName(), cs);
+            }
+    
+        }
+}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2660a6b7/plugins/network-elements/internal-loadbalancer/test/resources/lb_element.xml
----------------------------------------------------------------------
diff --git a/plugins/network-elements/internal-loadbalancer/test/resources/lb_element.xml b/plugins/network-elements/internal-loadbalancer/test/resources/lb_element.xml
new file mode 100644
index 0000000..5dec9c3
--- /dev/null
+++ b/plugins/network-elements/internal-loadbalancer/test/resources/lb_element.xml
@@ -0,0 +1,46 @@
+<!-- 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. -->
+<beans xmlns="http://www.springframework.org/schema/beans"
+  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
+  xmlns:tx="http://www.springframework.org/schema/tx" xmlns:aop="http://www.springframework.org/schema/aop"
+  xsi:schemaLocation="http://www.springframework.org/schema/beans
+                      http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
+                      http://www.springframework.org/schema/tx 
+                      http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
+                      http://www.springframework.org/schema/aop
+                      http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
+                      http://www.springframework.org/schema/context
+                      http://www.springframework.org/schema/context/spring-context-3.0.xsd">
+
+     <context:annotation-config />
+
+    <!-- @DB support -->
+      
+  <bean id="componentContext" class="com.cloud.utils.component.ComponentContext" />
+
+  <bean id="transactionContextBuilder" class="com.cloud.utils.db.TransactionContextBuilder" />
+  <bean id="actionEventInterceptor" class="com.cloud.event.ActionEventInterceptor" />
+  <bean id="instantiatePostProcessor" class="com.cloud.utils.component.ComponentInstantiationPostProcessor">
+    <property name="Interceptors">
+        <list>
+            <ref bean="transactionContextBuilder" />
+            <ref bean="actionEventInterceptor" />
+        </list>
+    </property>
+  </bean>
+
+    <bean id="InternalLoadBalancerElementService" class="org.apache.cloudstack.network.element.InternalLoadBalancerElement">
+        <property name="name" value="InternalLoadBalancerElementService"/>
+    </bean>
+  
+    <bean class="org.apache.cloudstack.internallbelement.ElementChildTestConfiguration" />
+    
+</beans>

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2660a6b7/plugins/network-elements/internal-loadbalancer/test/resources/lb_mgr.xml
----------------------------------------------------------------------
diff --git a/plugins/network-elements/internal-loadbalancer/test/resources/lb_mgr.xml b/plugins/network-elements/internal-loadbalancer/test/resources/lb_mgr.xml
new file mode 100644
index 0000000..1ad6403
--- /dev/null
+++ b/plugins/network-elements/internal-loadbalancer/test/resources/lb_mgr.xml
@@ -0,0 +1,46 @@
+<!-- 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. -->
+<beans xmlns="http://www.springframework.org/schema/beans"
+  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
+  xmlns:tx="http://www.springframework.org/schema/tx" xmlns:aop="http://www.springframework.org/schema/aop"
+  xsi:schemaLocation="http://www.springframework.org/schema/beans
+                      http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
+                      http://www.springframework.org/schema/tx 
+                      http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
+                      http://www.springframework.org/schema/aop
+                      http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
+                      http://www.springframework.org/schema/context
+                      http://www.springframework.org/schema/context/spring-context-3.0.xsd">
+
+     <context:annotation-config />
+
+    <!-- @DB support -->
+      
+  <bean id="componentContext" class="com.cloud.utils.component.ComponentContext" />
+
+  <bean id="transactionContextBuilder" class="com.cloud.utils.db.TransactionContextBuilder" />
+  <bean id="actionEventInterceptor" class="com.cloud.event.ActionEventInterceptor" />
+  <bean id="instantiatePostProcessor" class="com.cloud.utils.component.ComponentInstantiationPostProcessor">
+    <property name="Interceptors">
+        <list>
+            <ref bean="transactionContextBuilder" />
+            <ref bean="actionEventInterceptor" />
+        </list>
+    </property>
+  </bean>
+
+    <bean id="InternalLoadBalancerVMManager" class="org.apache.cloudstack.network.lb.InternalLoadBalancerVMManagerImpl">
+        <property name="name" value="InternalLoadBalancerVMManager"/>
+    </bean>
+  
+    <bean class="org.apache.cloudstack.internallbvmmgr.LbChildTestConfiguration" />
+    
+</beans>

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2660a6b7/plugins/network-elements/internal-loadbalancer/test/resources/lb_svc.xml
----------------------------------------------------------------------
diff --git a/plugins/network-elements/internal-loadbalancer/test/resources/lb_svc.xml b/plugins/network-elements/internal-loadbalancer/test/resources/lb_svc.xml
new file mode 100644
index 0000000..fa822f3
--- /dev/null
+++ b/plugins/network-elements/internal-loadbalancer/test/resources/lb_svc.xml
@@ -0,0 +1,46 @@
+<!-- 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. -->
+<beans xmlns="http://www.springframework.org/schema/beans"
+  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
+  xmlns:tx="http://www.springframework.org/schema/tx" xmlns:aop="http://www.springframework.org/schema/aop"
+  xsi:schemaLocation="http://www.springframework.org/schema/beans
+                      http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
+                      http://www.springframework.org/schema/tx 
+                      http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
+                      http://www.springframework.org/schema/aop
+                      http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
+                      http://www.springframework.org/schema/context
+                      http://www.springframework.org/schema/context/spring-context-3.0.xsd">
+
+     <context:annotation-config />
+
+    <!-- @DB support -->
+      
+  <bean id="componentContext" class="com.cloud.utils.component.ComponentContext" />
+
+  <bean id="transactionContextBuilder" class="com.cloud.utils.db.TransactionContextBuilder" />
+  <bean id="actionEventInterceptor" class="com.cloud.event.ActionEventInterceptor" />
+  <bean id="instantiatePostProcessor" class="com.cloud.utils.component.ComponentInstantiationPostProcessor">
+    <property name="Interceptors">
+        <list>
+            <ref bean="transactionContextBuilder" />
+            <ref bean="actionEventInterceptor" />
+        </list>
+    </property>
+  </bean>
+
+    <bean id="InternalLoadBalancerVMService" class="org.apache.cloudstack.network.lb.InternalLoadBalancerVMManagerImpl">
+        <property name="name" value="InternalLoadBalancerVMService"/>
+    </bean>
+  
+    <bean class="org.apache.cloudstack.internallbvmmgr.LbChildTestConfiguration" />
+    
+</beans>

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2660a6b7/plugins/network-elements/netscaler/src/com/cloud/network/element/NetscalerElement.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/netscaler/src/com/cloud/network/element/NetscalerElement.java b/plugins/network-elements/netscaler/src/com/cloud/network/element/NetscalerElement.java
index b814430..4f2a0a1 100644
--- a/plugins/network-elements/netscaler/src/com/cloud/network/element/NetscalerElement.java
+++ b/plugins/network-elements/netscaler/src/com/cloud/network/element/NetscalerElement.java
@@ -16,6 +16,22 @@
 // under the License.
 package com.cloud.network.element;
 
+import java.net.URI;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import javax.ejb.Local;
+import javax.inject.Inject;
+
+import org.apache.cloudstack.api.ApiConstants;
+import org.apache.cloudstack.network.ExternalNetworkDeviceManager.NetworkDevice;
+import org.apache.cloudstack.region.gslb.GslbServiceProvider;
+import org.apache.log4j.Logger;
+
 import com.cloud.agent.AgentManager;
 import com.cloud.agent.api.Answer;
 import com.cloud.agent.api.routing.GlobalLoadBalancerConfigCommand;
@@ -27,7 +43,11 @@ import com.cloud.agent.api.routing.SetStaticNatRulesCommand;
 import com.cloud.agent.api.to.LoadBalancerTO;
 import com.cloud.agent.api.to.StaticNatRuleTO;
 import com.cloud.api.ApiDBUtils;
-import com.cloud.api.commands.*;
+import com.cloud.api.commands.AddNetscalerLoadBalancerCmd;
+import com.cloud.api.commands.ConfigureNetscalerLoadBalancerCmd;
+import com.cloud.api.commands.DeleteNetscalerLoadBalancerCmd;
+import com.cloud.api.commands.ListNetscalerLoadBalancerNetworksCmd;
+import com.cloud.api.commands.ListNetscalerLoadBalancersCmd;
 import com.cloud.api.response.NetscalerLoadBalancerResponse;
 import com.cloud.configuration.Config;
 import com.cloud.configuration.ConfigurationManager;
@@ -39,27 +59,48 @@ import com.cloud.dc.HostPodVO;
 import com.cloud.dc.dao.DataCenterDao;
 import com.cloud.dc.dao.DataCenterIpAddressDao;
 import com.cloud.deploy.DeployDestination;
-import com.cloud.exception.*;
+import com.cloud.exception.ConcurrentOperationException;
+import com.cloud.exception.InsufficientCapacityException;
+import com.cloud.exception.InsufficientNetworkCapacityException;
+import com.cloud.exception.InvalidParameterValueException;
+import com.cloud.exception.ResourceUnavailableException;
 import com.cloud.host.Host;
 import com.cloud.host.HostVO;
 import com.cloud.host.dao.HostDao;
 import com.cloud.host.dao.HostDetailsDao;
-import com.cloud.network.*;
+import com.cloud.network.ExternalLoadBalancerDeviceManager;
+import com.cloud.network.ExternalLoadBalancerDeviceManagerImpl;
+import com.cloud.network.IpAddress;
+import com.cloud.network.NetScalerPodVO;
+import com.cloud.network.Network;
 import com.cloud.network.Network.Capability;
 import com.cloud.network.Network.Provider;
 import com.cloud.network.Network.Service;
+import com.cloud.network.NetworkModel;
 import com.cloud.network.Networks.TrafficType;
+import com.cloud.network.PhysicalNetwork;
+import com.cloud.network.PhysicalNetworkServiceProvider;
+import com.cloud.network.PublicIpAddress;
 import com.cloud.network.as.AutoScaleCounter;
 import com.cloud.network.as.AutoScaleCounter.AutoScaleCounterType;
-import com.cloud.network.dao.*;
+import com.cloud.network.dao.ExternalLoadBalancerDeviceDao;
+import com.cloud.network.dao.ExternalLoadBalancerDeviceVO;
 import com.cloud.network.dao.ExternalLoadBalancerDeviceVO.LBDeviceState;
+import com.cloud.network.dao.NetScalerPodDao;
+import com.cloud.network.dao.NetworkDao;
+import com.cloud.network.dao.NetworkExternalLoadBalancerDao;
+import com.cloud.network.dao.NetworkExternalLoadBalancerVO;
+import com.cloud.network.dao.NetworkServiceMapDao;
+import com.cloud.network.dao.NetworkVO;
+import com.cloud.network.dao.PhysicalNetworkDao;
+import com.cloud.network.dao.PhysicalNetworkVO;
 import com.cloud.network.lb.LoadBalancingRule;
 import com.cloud.network.lb.LoadBalancingRule.LbDestination;
 import com.cloud.network.resource.NetscalerResource;
 import com.cloud.network.rules.FirewallRule;
-import com.cloud.network.rules.FirewallRule.Purpose;
 import com.cloud.network.rules.LbStickinessMethod;
 import com.cloud.network.rules.LbStickinessMethod.StickinessMethodType;
+import com.cloud.network.rules.LoadBalancerContainer;
 import com.cloud.network.rules.StaticNat;
 import com.cloud.network.vpc.PrivateGateway;
 import com.cloud.network.vpc.StaticRouteProfile;
@@ -75,15 +116,6 @@ import com.cloud.vm.ReservationContext;
 import com.cloud.vm.VirtualMachine;
 import com.cloud.vm.VirtualMachineProfile;
 import com.google.gson.Gson;
-import org.apache.cloudstack.api.ApiConstants;
-import org.apache.cloudstack.network.ExternalNetworkDeviceManager.NetworkDevice;
-import org.apache.cloudstack.region.gslb.GslbServiceProvider;
-import org.apache.log4j.Logger;
-
-import javax.ejb.Local;
-import javax.inject.Inject;
-import java.net.URI;
-import java.util.*;
 
 @Local(value = {NetworkElement.class, StaticNatServiceProvider.class, LoadBalancingServiceProvider.class, GslbServiceProvider.class})
 public class NetscalerElement extends ExternalLoadBalancerDeviceManagerImpl implements LoadBalancingServiceProvider,
@@ -207,6 +239,10 @@ public class NetscalerElement extends ExternalLoadBalancerDeviceManagerImpl impl
         if (!canHandle(config, Service.Lb)) {
             return false;
         }
+        
+        if (canHandleLbRules(rules)) {
+            return false;
+        }
 
         if (isBasicZoneNetwok(config)) {
             return applyElasticLoadBalancerRules(config, rules);
@@ -237,6 +273,9 @@ public class NetscalerElement extends ExternalLoadBalancerDeviceManagerImpl impl
         // Specifies that load balancing rules can only be made with public IPs that aren't source NAT IPs
         lbCapabilities.put(Capability.LoadBalancingSupportedIps, "additional");
 
+        // Supports only Public load balancing
+        lbCapabilities.put(Capability.LbSchemes, LoadBalancerContainer.Scheme.Public.toString());
+        
         // Specifies that load balancing rules can support autoscaling and the list of counters it supports
         AutoScaleCounter counter;
         List<AutoScaleCounter> counterList = new ArrayList<AutoScaleCounter>();
@@ -644,14 +683,7 @@ public class NetscalerElement extends ExternalLoadBalancerDeviceManagerImpl impl
         return this;
     }
 
-    public boolean applyElasticLoadBalancerRules(Network network, List<? extends FirewallRule> rules) throws ResourceUnavailableException {
-
-        List<LoadBalancingRule> loadBalancingRules = new ArrayList<LoadBalancingRule>();
-        for (FirewallRule rule : rules) {
-            if (rule.getPurpose().equals(Purpose.LoadBalancing)) {
-                loadBalancingRules.add((LoadBalancingRule) rule);
-            }
-        }
+    public boolean applyElasticLoadBalancerRules(Network network, List<LoadBalancingRule> loadBalancingRules) throws ResourceUnavailableException {
 
         if (loadBalancingRules == null || loadBalancingRules.isEmpty()) {
             return true;
@@ -682,7 +714,7 @@ public class NetscalerElement extends ExternalLoadBalancerDeviceManagerImpl impl
             String protocol = rule.getProtocol();
             String algorithm = rule.getAlgorithm();
             String lbUuid = rule.getUuid();
-            String srcIp = _networkMgr.getIp(rule.getSourceIpAddressId()).getAddress().addr();
+            String srcIp = rule.getSourceIp().addr();
             int srcPort = rule.getSourcePortStart();
             List<LbDestination> destinations = rule.getDestinations();
 
@@ -813,16 +845,10 @@ public class NetscalerElement extends ExternalLoadBalancerDeviceManagerImpl impl
         return null;
     }
 
-    public List<LoadBalancerTO> getElasticLBRulesHealthCheck(Network network, List<? extends FirewallRule> rules)
+    public List<LoadBalancerTO> getElasticLBRulesHealthCheck(Network network, List<LoadBalancingRule> loadBalancingRules)
             throws ResourceUnavailableException {
 
         HealthCheckLBConfigAnswer answer = null;
-        List<LoadBalancingRule> loadBalancingRules = new ArrayList<LoadBalancingRule>();
-        for (FirewallRule rule : rules) {
-            if (rule.getPurpose().equals(Purpose.LoadBalancing)) {
-                loadBalancingRules.add((LoadBalancingRule) rule);
-            }
-        }
 
         if (loadBalancingRules == null || loadBalancingRules.isEmpty()) {
             return null;
@@ -849,7 +875,7 @@ public class NetscalerElement extends ExternalLoadBalancerDeviceManagerImpl impl
             String protocol = rule.getProtocol();
             String algorithm = rule.getAlgorithm();
             String lbUuid = rule.getUuid();
-            String srcIp = _networkMgr.getIp(rule.getSourceIpAddressId()).getAddress().addr();
+            String srcIp = rule.getSourceIp().addr();
             int srcPort = rule.getSourcePortStart();
             List<LbDestination> destinations = rule.getDestinations();
 
@@ -874,7 +900,7 @@ public class NetscalerElement extends ExternalLoadBalancerDeviceManagerImpl impl
 
     public List<LoadBalancerTO> updateHealthChecks(Network network, List<LoadBalancingRule> lbrules) {
 
-        if (canHandle(network, Service.Lb)) {
+        if (canHandle(network, Service.Lb) && canHandleLbRules(lbrules)) {
             try {
 
                 if (isBasicZoneNetwok(network)) {
@@ -891,7 +917,7 @@ public class NetscalerElement extends ExternalLoadBalancerDeviceManagerImpl impl
         return null;
     }
 
-    public List<LoadBalancerTO> getLBHealthChecks(Network network, List<? extends FirewallRule> rules)
+    public List<LoadBalancerTO> getLBHealthChecks(Network network, List<LoadBalancingRule> rules)
             throws ResourceUnavailableException {
         return super.getLBHealthChecks(network, rules);
     }
@@ -960,6 +986,22 @@ public class NetscalerElement extends ExternalLoadBalancerDeviceManagerImpl impl
         }
         return null;
     }
+    
+    private boolean canHandleLbRules(List<LoadBalancingRule> rules) {
+        Map<Capability, String> lbCaps = this.getCapabilities().get(Service.Lb);
+        if (!lbCaps.isEmpty()) {
+            String schemeCaps = lbCaps.get(Capability.LbSchemes);
+            if (schemeCaps != null) {
+                for (LoadBalancingRule rule : rules) {
+                    if (!schemeCaps.contains(rule.getScheme().toString())) {
+                        s_logger.debug("Scheme " + rules.get(0).getScheme() + " is not supported by the provider " + this.getName());
+                        return false;
+                    }
+                }
+            }
+        }
+        return true;
+    }
 
     @Override
     public boolean implementVpc(Vpc vpc, DeployDestination dest, ReservationContext context)

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2660a6b7/plugins/pom.xml
----------------------------------------------------------------------
diff --git a/plugins/pom.xml b/plugins/pom.xml
index b940271..e49fac9 100755
--- a/plugins/pom.xml
+++ b/plugins/pom.xml
@@ -62,6 +62,7 @@
     <module>storage/volume/default</module>
     <module>alert-handlers/snmp-alerts</module>
     <module>alert-handlers/syslog-alerts</module>
+    <module>network-elements/internal-loadbalancer</module>
   </modules>
 
   <dependencies>

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2660a6b7/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 b8eea12..fce1f71 100755
--- a/server/src/com/cloud/api/ApiDBUtils.java
+++ b/server/src/com/cloud/api/ApiDBUtils.java
@@ -25,8 +25,6 @@ import java.util.Set;
 import javax.annotation.PostConstruct;
 import javax.inject.Inject;
 
-import com.cloud.network.rules.LoadBalancer;
-import com.cloud.region.ha.GlobalLoadBalancingRulesService;
 import org.apache.cloudstack.affinity.AffinityGroup;
 import org.apache.cloudstack.affinity.AffinityGroupResponse;
 import org.apache.cloudstack.affinity.dao.AffinityGroupDao;
@@ -37,8 +35,8 @@ import org.apache.cloudstack.api.response.AsyncJobResponse;
 import org.apache.cloudstack.api.response.DiskOfferingResponse;
 import org.apache.cloudstack.api.response.DomainRouterResponse;
 import org.apache.cloudstack.api.response.EventResponse;
-import org.apache.cloudstack.api.response.HostResponse;
 import org.apache.cloudstack.api.response.HostForMigrationResponse;
+import org.apache.cloudstack.api.response.HostResponse;
 import org.apache.cloudstack.api.response.InstanceGroupResponse;
 import org.apache.cloudstack.api.response.ProjectAccountResponse;
 import org.apache.cloudstack.api.response.ProjectInvitationResponse;
@@ -52,6 +50,7 @@ import org.apache.cloudstack.api.response.UserResponse;
 import org.apache.cloudstack.api.response.UserVmResponse;
 import org.apache.cloudstack.api.response.VolumeResponse;
 import org.apache.cloudstack.api.response.ZoneResponse;
+import org.apache.cloudstack.lb.dao.ApplicationLoadBalancerRuleDao;
 import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao;
 import org.apache.cloudstack.storage.datastore.db.StoragePoolVO;
 import org.springframework.stereotype.Component;
@@ -157,6 +156,8 @@ import com.cloud.network.as.dao.AutoScaleVmGroupPolicyMapDao;
 import com.cloud.network.as.dao.AutoScaleVmProfileDao;
 import com.cloud.network.as.dao.ConditionDao;
 import com.cloud.network.as.dao.CounterDao;
+import com.cloud.network.dao.AccountGuestVlanMapDao;
+import com.cloud.network.dao.AccountGuestVlanMapVO;
 import com.cloud.network.dao.FirewallRulesCidrsDao;
 import com.cloud.network.dao.FirewallRulesDao;
 import com.cloud.network.dao.IPAddressDao;
@@ -181,6 +182,7 @@ import com.cloud.network.dao.Site2SiteVpnGatewayDao;
 import com.cloud.network.dao.Site2SiteVpnGatewayVO;
 import com.cloud.network.router.VirtualRouter;
 import com.cloud.network.rules.FirewallRuleVO;
+import com.cloud.network.rules.LoadBalancer;
 import com.cloud.network.security.SecurityGroup;
 import com.cloud.network.security.SecurityGroupManager;
 import com.cloud.network.security.SecurityGroupVO;
@@ -204,6 +206,7 @@ import com.cloud.projects.Project;
 import com.cloud.projects.ProjectAccount;
 import com.cloud.projects.ProjectInvitation;
 import com.cloud.projects.ProjectService;
+import com.cloud.region.ha.GlobalLoadBalancingRulesService;
 import com.cloud.resource.ResourceManager;
 import com.cloud.server.Criteria;
 import com.cloud.server.ManagementServer;
@@ -499,6 +502,7 @@ public class ApiDBUtils {
     @Inject private VMSnapshotDao vmSnapshotDao;
     @Inject private NicSecondaryIpDao nicSecondaryIpDao;
     @Inject private VpcProvisioningService vpcProvSvc;
+    @Inject private ApplicationLoadBalancerRuleDao _appLbDao;
     @Inject private AffinityGroupDao affinityGroupDao;
     @Inject private AffinityGroupJoinDao affinityGroupJoinDao;
     @Inject private GlobalLoadBalancingRulesService gslbService;

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2660a6b7/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 d7eaa26..d5960ab 100755
--- a/server/src/com/cloud/api/ApiResponseHelper.java
+++ b/server/src/com/cloud/api/ApiResponseHelper.java
@@ -44,6 +44,9 @@ import org.apache.cloudstack.api.BaseCmd;
 import org.apache.cloudstack.api.ResponseGenerator;
 import org.apache.cloudstack.api.command.user.job.QueryAsyncJobResultCmd;
 import org.apache.cloudstack.api.response.AccountResponse;
+import org.apache.cloudstack.api.response.ApplicationLoadBalancerInstanceResponse;
+import org.apache.cloudstack.api.response.ApplicationLoadBalancerResponse;
+import org.apache.cloudstack.api.response.ApplicationLoadBalancerRuleResponse;
 import org.apache.cloudstack.api.response.AsyncJobResponse;
 import org.apache.cloudstack.api.response.AutoScalePolicyResponse;
 import org.apache.cloudstack.api.response.AutoScaleVmGroupResponse;
@@ -72,6 +75,7 @@ import org.apache.cloudstack.api.response.HostResponse;
 import org.apache.cloudstack.api.response.HypervisorCapabilitiesResponse;
 import org.apache.cloudstack.api.response.IPAddressResponse;
 import org.apache.cloudstack.api.response.InstanceGroupResponse;
+import org.apache.cloudstack.api.response.InternalLoadBalancerElementResponse;
 import org.apache.cloudstack.api.response.IpForwardingRuleResponse;
 import org.apache.cloudstack.api.response.IsolationMethodResponse;
 import org.apache.cloudstack.api.response.LBHealthCheckPolicyResponse;
@@ -130,6 +134,7 @@ import org.apache.cloudstack.api.response.VpcOfferingResponse;
 import org.apache.cloudstack.api.response.VpcResponse;
 import org.apache.cloudstack.api.response.VpnUsersResponse;
 import org.apache.cloudstack.api.response.ZoneResponse;
+import org.apache.cloudstack.network.lb.ApplicationLoadBalancerRule;
 import org.apache.cloudstack.region.Region;
 import org.apache.cloudstack.storage.datastore.db.StoragePoolVO;
 import org.apache.cloudstack.usage.Usage;
@@ -189,6 +194,7 @@ import com.cloud.network.Network;
 import com.cloud.network.Network.Capability;
 import com.cloud.network.Network.Provider;
 import com.cloud.network.Network.Service;
+import com.cloud.network.NetworkModel;
 import com.cloud.network.NetworkProfile;
 import com.cloud.network.Networks.IsolationType;
 import com.cloud.network.Networks.TrafficType;
@@ -216,6 +222,7 @@ import com.cloud.network.rules.FirewallRule;
 import com.cloud.network.rules.FirewallRuleVO;
 import com.cloud.network.rules.HealthCheckPolicy;
 import com.cloud.network.rules.LoadBalancer;
+import com.cloud.network.rules.LoadBalancerContainer.Scheme;
 import com.cloud.network.rules.PortForwardingRule;
 import com.cloud.network.rules.StaticNatRule;
 import com.cloud.network.rules.StickinessPolicy;
@@ -229,6 +236,7 @@ import com.cloud.network.vpc.Vpc;
 import com.cloud.network.vpc.VpcOffering;
 import com.cloud.offering.DiskOffering;
 import com.cloud.offering.NetworkOffering;
+import com.cloud.offering.NetworkOffering.Detail;
 import com.cloud.offering.ServiceOffering;
 import com.cloud.offerings.NetworkOfferingVO;
 import com.cloud.org.Cluster;
@@ -269,6 +277,7 @@ import com.cloud.user.UserContext;
 import com.cloud.uservm.UserVm;
 import com.cloud.utils.Pair;
 import com.cloud.utils.StringUtils;
+import com.cloud.utils.net.Ip;
 import com.cloud.utils.net.NetUtils;
 import com.cloud.vm.ConsoleProxyVO;
 import com.cloud.vm.InstanceGroup;
@@ -289,6 +298,7 @@ public class ApiResponseHelper implements ResponseGenerator {
     private static final DecimalFormat s_percentFormat = new DecimalFormat("##.##");
     @Inject private EntityManager _entityMgr = null;
     @Inject private UsageService _usageSvc = null;
+    @Inject NetworkModel _ntwkModel;
 
     @Override
     public UserResponse createUserResponse(User user) {
@@ -750,7 +760,7 @@ public class ApiResponseHelper implements ResponseGenerator {
         }
 
         //set tag information
-        List<? extends ResourceTag> tags = ApiDBUtils.listByResourceTypeAndId(TaggedResourceType.UserVm, loadBalancer.getId());
+        List<? extends ResourceTag> tags = ApiDBUtils.listByResourceTypeAndId(TaggedResourceType.LoadBalancer, loadBalancer.getId());
         List<ResourceTagResponse> tagResponses = new ArrayList<ResourceTagResponse>();
         for (ResourceTag tag : tags) {
             ResourceTagResponse tagResponse = createResourceTagResponse(tag, true);
@@ -2263,6 +2273,13 @@ public class ApiResponseHelper implements ResponseGenerator {
         response.setForVpc(ApiDBUtils.isOfferingForVpc(offering));
 
         response.setServices(serviceResponses);
+        
+        //set network offering details
+        Map<Detail, String> details = _ntwkModel.getNtwkOffDetails(offering.getId());
+        if (details != null && !details.isEmpty()) {
+            response.setDetails(details);
+        }
+        
         response.setObjectName("networkoffering");
         return response;
     }
@@ -2826,6 +2843,11 @@ public class ApiResponseHelper implements ResponseGenerator {
 
     @Override
     public VirtualRouterProviderResponse createVirtualRouterProviderResponse(VirtualRouterProvider result) {
+        //generate only response of the VR/VPCVR provider type
+        if (!(result.getType() == VirtualRouterProvider.VirtualRouterProviderType.VirtualRouter
+                || result.getType() == VirtualRouterProvider.VirtualRouterProviderType.VPCVirtualRouter)) {
+            return null;
+        }
         VirtualRouterProviderResponse response = new VirtualRouterProviderResponse();
         response.setId(result.getUuid());
         PhysicalNetworkServiceProvider nsp = ApiDBUtils.findPhysicalNetworkServiceProviderById(result.getNspId());
@@ -3689,6 +3711,73 @@ public class ApiResponseHelper implements ResponseGenerator {
         return response;
     }
 
+    
+    @Override
+    public ApplicationLoadBalancerResponse createLoadBalancerContainerReponse(ApplicationLoadBalancerRule lb, Map<Ip, UserVm> lbInstances) {
+
+        ApplicationLoadBalancerResponse lbResponse = new ApplicationLoadBalancerResponse();
+        lbResponse.setId(lb.getUuid());
+        lbResponse.setName(lb.getName());
+        lbResponse.setDescription(lb.getDescription());
+        lbResponse.setAlgorithm(lb.getAlgorithm());
+        Network nw = ApiDBUtils.findNetworkById(lb.getNetworkId());
+        lbResponse.setNetworkId(nw.getUuid());
+        populateOwner(lbResponse, lb);
+        
+        if (lb.getScheme() == Scheme.Internal) {
+            lbResponse.setSourceIp(lb.getSourceIp().addr());
+            //TODO - create the view for the load balancer rule to reflect the network uuid
+            Network network = ApiDBUtils.findNetworkById(lb.getNetworkId());
+            lbResponse.setSourceIpNetworkId(network.getUuid());
+        } else {
+            //for public, populate the ip information from the ip address
+            IpAddress publicIp = ApiDBUtils.findIpAddressById(lb.getSourceIpAddressId());
+            lbResponse.setSourceIp(publicIp.getAddress().addr());
+            Network ntwk = ApiDBUtils.findNetworkById(publicIp.getNetworkId());
+            lbResponse.setSourceIpNetworkId(ntwk.getUuid());
+        }
+        
+        //set load balancer rules information (only one rule per load balancer in this release)
+        List<ApplicationLoadBalancerRuleResponse> ruleResponses = new ArrayList<ApplicationLoadBalancerRuleResponse>();
+        ApplicationLoadBalancerRuleResponse ruleResponse = new ApplicationLoadBalancerRuleResponse();
+        ruleResponse.setInstancePort(lb.getDefaultPortStart());
+        ruleResponse.setSourcePort(lb.getSourcePortStart());
+        String stateToSet = lb.getState().toString();
+        if (stateToSet.equals(FirewallRule.State.Revoke)) {
+            stateToSet = "Deleting";
+        }
+        ruleResponse.setState(stateToSet);
+        ruleResponse.setObjectName("loadbalancerrule");
+        ruleResponses.add(ruleResponse);
+        lbResponse.setLbRules(ruleResponses);
+        
+        //set Lb instances information
+        List<ApplicationLoadBalancerInstanceResponse> instanceResponses = new ArrayList<ApplicationLoadBalancerInstanceResponse>();
+        for (Ip ip : lbInstances.keySet()) {
+            ApplicationLoadBalancerInstanceResponse instanceResponse = new ApplicationLoadBalancerInstanceResponse();
+            instanceResponse.setIpAddress(ip.addr());
+            UserVm vm = lbInstances.get(ip);
+            instanceResponse.setId(vm.getUuid());
+            instanceResponse.setName(vm.getInstanceName());
+            instanceResponse.setObjectName("loadbalancerinstance");
+            instanceResponses.add(instanceResponse);
+        }
+        
+        lbResponse.setLbInstances(instanceResponses);
+
+        //set tag information
+        List<? extends ResourceTag> tags = ApiDBUtils.listByResourceTypeAndId(TaggedResourceType.LoadBalancer, lb.getId());
+        List<ResourceTagResponse> tagResponses = new ArrayList<ResourceTagResponse>();
+        for (ResourceTag tag : tags) {
+            ResourceTagResponse tagResponse = createResourceTagResponse(tag, true);
+            tagResponses.add(tagResponse);
+        }
+        lbResponse.setTags(tagResponses);
+
+        lbResponse.setObjectName("loadbalancer");
+        return lbResponse;
+    }
+
     @Override
     public AffinityGroupResponse createAffinityGroupResponse(AffinityGroup group) {
 
@@ -3719,8 +3808,25 @@ public class ApiResponseHelper implements ResponseGenerator {
         }
     }
 
+    
+    @Override
+    public InternalLoadBalancerElementResponse createInternalLbElementResponse(VirtualRouterProvider result) {
+        if (result.getType() != VirtualRouterProvider.VirtualRouterProviderType.InternalLbVm) {
+            return null;
+        }
+        InternalLoadBalancerElementResponse response = new InternalLoadBalancerElementResponse();
+        response.setId(result.getUuid());
+        PhysicalNetworkServiceProvider nsp = ApiDBUtils.findPhysicalNetworkServiceProviderById(result.getNspId());
+        if (nsp != null) {
+            response.setNspId(nsp.getUuid());
+        }
+        response.setEnabled(result.isEnabled());
 
+        response.setObjectName("internalloadbalancerelement");
+        return response;
+    }
 
+    
     @Override
     public IsolationMethodResponse createIsolationMethodResponse(IsolationType method) {
         IsolationMethodResponse response = new IsolationMethodResponse();


[29/50] [abbrv] git commit: updated refs/heads/vmsync to d403974

Posted by ah...@apache.org.
Bug CLOUDSTACK-1390: Allow Root/Domain admin to move a User VM to another user under a different domain
Add unit tests


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

Branch: refs/heads/vmsync
Commit: dfad178a9e334776e4ba6c056523b5bd627ccace
Parents: e40aba3
Author: Likitha Shetty <li...@citrix.com>
Authored: Mon May 6 09:58:18 2013 +0530
Committer: Likitha Shetty <li...@citrix.com>
Committed: Fri May 10 12:18:43 2013 +0530

----------------------------------------------------------------------
 client/tomcatconf/commands.properties.in        |    2 +-
 server/src/com/cloud/vm/UserVmManagerImpl.java  |   14 +--
 server/test/com/cloud/vm/UserVmManagerTest.java |   83 +++++++++++++++++-
 3 files changed, 88 insertions(+), 11 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/dfad178a/client/tomcatconf/commands.properties.in
----------------------------------------------------------------------
diff --git a/client/tomcatconf/commands.properties.in b/client/tomcatconf/commands.properties.in
index cdc1992..0a6ec70 100644
--- a/client/tomcatconf/commands.properties.in
+++ b/client/tomcatconf/commands.properties.in
@@ -67,7 +67,7 @@ getVMPassword=15
 restoreVirtualMachine=15
 changeServiceForVirtualMachine=15
 scaleVirtualMachine=15
-assignVirtualMachine=1
+assignVirtualMachine=7
 migrateVirtualMachine=1
 migrateVirtualMachineWithVolume=1
 recoverVirtualMachine=7

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/dfad178a/server/src/com/cloud/vm/UserVmManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/vm/UserVmManagerImpl.java b/server/src/com/cloud/vm/UserVmManagerImpl.java
index 9fbc509..f7f5fc7 100755
--- a/server/src/com/cloud/vm/UserVmManagerImpl.java
+++ b/server/src/com/cloud/vm/UserVmManagerImpl.java
@@ -3725,19 +3725,14 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Use
                     + cmd.getAccountName() + " is disabled.");
         }
 
-        // make sure the accounts are under same domain
-        if (oldAccount.getDomainId() != newAccount.getDomainId()) {
-            throw new InvalidParameterValueException(
-                    "The account should be under same domain for moving VM between two accounts. Old owner domain ="
-                            + oldAccount.getDomainId()
-                            + " New owner domain="
-                            + newAccount.getDomainId());
-        }
+        //check caller has access to both the old and new account 
+        _accountMgr.checkAccess(caller, null, true, oldAccount);
+        _accountMgr.checkAccess(caller, null, true, newAccount);
 
         // make sure the accounts are not same
         if (oldAccount.getAccountId() == newAccount.getAccountId()) {
             throw new InvalidParameterValueException(
-                    "The account should be same domain for moving VM between two accounts. Account id ="
+                    "The new account is the same as the old account. Account id ="
                             + oldAccount.getAccountId());
         }
 
@@ -3829,6 +3824,7 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Use
             _resourceLimitMgr.decrementResourceCount(oldAccount.getAccountId(), ResourceType.primary_storage,
                     new Long(volume.getSize()));
             volume.setAccountId(newAccount.getAccountId());
+            volume.setDomainId(newAccount.getDomainId());
             _volsDao.persist(volume);
             _resourceLimitMgr.incrementResourceCount(newAccount.getAccountId(), ResourceType.volume);
             _resourceLimitMgr.incrementResourceCount(newAccount.getAccountId(), ResourceType.primary_storage,

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/dfad178a/server/test/com/cloud/vm/UserVmManagerTest.java
----------------------------------------------------------------------
diff --git a/server/test/com/cloud/vm/UserVmManagerTest.java b/server/test/com/cloud/vm/UserVmManagerTest.java
index 08f2a9c..dfd7465 100755
--- a/server/test/com/cloud/vm/UserVmManagerTest.java
+++ b/server/test/com/cloud/vm/UserVmManagerTest.java
@@ -17,19 +17,26 @@
 
 package com.cloud.vm;
 
+import static org.mockito.Matchers.any;
 import static org.mockito.Matchers.anyBoolean;
 import static org.mockito.Matchers.anyFloat;
 import static org.mockito.Matchers.anyInt;
 import static org.mockito.Matchers.anyLong;
+import static org.mockito.Matchers.anyString;
 import static org.mockito.Matchers.eq;
 import static org.mockito.Mockito.doNothing;
 import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.doThrow;
 import static org.mockito.Mockito.when;
 
 import java.lang.reflect.Field;
 import java.util.List;
+import java.util.UUID;
 
+import org.apache.cloudstack.acl.ControlledEntity;
+import org.apache.cloudstack.acl.SecurityChecker.AccessType;
 import org.apache.cloudstack.api.ServerApiException;
+import org.apache.cloudstack.api.command.admin.vm.AssignVMCmd;
 import org.apache.cloudstack.api.command.user.vm.RestoreVMCmd;
 import org.apache.cloudstack.api.command.user.vm.ScaleVMCmd;
 import org.junit.Before;
@@ -44,9 +51,11 @@ import com.cloud.configuration.dao.ConfigurationDao;
 import com.cloud.exception.ConcurrentOperationException;
 import com.cloud.exception.InsufficientCapacityException;
 import com.cloud.exception.InvalidParameterValueException;
+import com.cloud.exception.PermissionDeniedException;
 import com.cloud.exception.ResourceAllocationException;
 import com.cloud.exception.ResourceUnavailableException;
 import com.cloud.hypervisor.Hypervisor;
+import com.cloud.hypervisor.Hypervisor.HypervisorType;
 import com.cloud.offering.ServiceOffering;
 import com.cloud.service.ServiceOfferingVO;
 import com.cloud.storage.VMTemplateVO;
@@ -57,6 +66,7 @@ import com.cloud.storage.dao.VMTemplateDao;
 import com.cloud.storage.dao.VolumeDao;
 import com.cloud.user.Account;
 import com.cloud.user.AccountManager;
+import com.cloud.user.AccountService;
 import com.cloud.user.AccountVO;
 import com.cloud.user.UserContext;
 import com.cloud.user.UserVO;
@@ -73,6 +83,7 @@ public class UserVmManagerTest {
     @Mock VolumeManager _storageMgr;
     @Mock Account _account;
     @Mock AccountManager _accountMgr;
+    @Mock AccountService _accountService;
     @Mock ConfigurationManager _configMgr;
     @Mock CapacityManager _capacityMgr;
     @Mock AccountDao _accountDao;
@@ -91,6 +102,7 @@ public class UserVmManagerTest {
     @Mock VMTemplateVO _templateMock;
     @Mock VolumeVO _volumeMock;
     @Mock List<VolumeVO> _rootVols;
+    @Mock Account _accountMock2;
     @Before
     public void setup(){
         MockitoAnnotations.initMocks(this);
@@ -102,6 +114,7 @@ public class UserVmManagerTest {
         _userVmMgr._itMgr = _itMgr;
         _userVmMgr.volumeMgr = _storageMgr;
         _userVmMgr._accountDao = _accountDao;
+        _userVmMgr._accountService = _accountService;
         _userVmMgr._userDao = _userDao;
         _userVmMgr._accountMgr = _accountMgr;
         _userVmMgr._configMgr = _configMgr;
@@ -370,6 +383,74 @@ public class UserVmManagerTest {
         return serviceOffering;
     }
 
- 
+    // Test Move VM b/w accounts where caller is not ROOT/Domain admin
+    @Test(expected=InvalidParameterValueException.class)
+    public void testMoveVmToUser1()  throws Exception {
+        AssignVMCmd cmd = new AssignVMCmd();
+        Class<?> _class = cmd.getClass();
+
+        Field virtualmachineIdField = _class.getDeclaredField("virtualMachineId");
+        virtualmachineIdField.setAccessible(true);
+        virtualmachineIdField.set(cmd, 1L);
+
+        Field accountNameField = _class.getDeclaredField("accountName");
+        accountNameField.setAccessible(true);
+        accountNameField.set(cmd, "account");
+
+        Field domainIdField = _class.getDeclaredField("domainId");
+        domainIdField.setAccessible(true);
+        domainIdField.set(cmd, 1L);
+
+        // caller is of type 0
+        Account caller = (Account) new AccountVO("testaccount", 1, "networkdomain", (short) 0,
+                UUID.randomUUID().toString());
+        UserContext.registerContext(1, caller, null, true);
+
+        _userVmMgr.moveVMToUser(cmd);
+    }
+
+
+    // Test Move VM b/w accounts where caller doesn't have access to the old or new account
+    @Test(expected=PermissionDeniedException.class)
+    public void testMoveVmToUser2()  throws Exception {
+        AssignVMCmd cmd = new AssignVMCmd();
+        Class<?> _class = cmd.getClass();
+
+        Field virtualmachineIdField = _class.getDeclaredField("virtualMachineId");
+        virtualmachineIdField.setAccessible(true);
+        virtualmachineIdField.set(cmd, 1L);
+
+        Field accountNameField = _class.getDeclaredField("accountName");
+        accountNameField.setAccessible(true);
+        accountNameField.set(cmd, "account");
+
+        Field domainIdField = _class.getDeclaredField("domainId");
+        domainIdField.setAccessible(true);
+        domainIdField.set(cmd, 1L);
+
+        // caller is of type 0
+        Account caller = (Account) new AccountVO("testaccount", 1, "networkdomain", (short) 1,
+                UUID.randomUUID().toString());
+        UserContext.registerContext(1, caller, null, true);
+
+        Account oldAccount = (Account) new AccountVO("testaccount", 1, "networkdomain", (short) 0,
+                UUID.randomUUID().toString());
+        Account newAccount = (Account) new AccountVO("testaccount", 1, "networkdomain", (short) 1,
+                UUID.randomUUID().toString());
+
+        UserVmVO vm = new UserVmVO(10L, "test", "test", 1L, HypervisorType.Any, 1L, false, false, 1L, 1L,
+                5L, "test", "test", 1L);
+        vm.setState(VirtualMachine.State.Stopped);
+        when(_vmDao.findById(anyLong())).thenReturn(vm);
+
+        when(_accountService.getActiveAccountById(anyLong())).thenReturn(oldAccount);
+
+        when(_accountService.getActiveAccountByName(anyString(), anyLong())).thenReturn(newAccount);
+
+        doThrow(new PermissionDeniedException("Access check failed")).when(_accountMgr).checkAccess(any(Account.class), any(AccessType.class),
+                any(Boolean.class), any(ControlledEntity.class));
+
+        _userVmMgr.moveVMToUser(cmd);
+    }
 
 }
\ No newline at end of file


[47/50] [abbrv] Merged master to vmsync

Posted by ah...@apache.org.
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/d4039743/server/src/com/cloud/api/ApiServer.java
----------------------------------------------------------------------
diff --cc server/src/com/cloud/api/ApiServer.java
index ca5dfd6,497be50..0f375b8
--- a/server/src/com/cloud/api/ApiServer.java
+++ b/server/src/com/cloud/api/ApiServer.java
@@@ -16,87 -16,141 +16,141 @@@
  // under the License.
  package com.cloud.api;
  
- import com.cloud.api.response.ApiResponseSerializer;
- import com.cloud.async.AsyncJob;
- import com.cloud.async.AsyncJobManager;
- import com.cloud.async.AsyncJobVO;
- import com.cloud.configuration.Config;
- import com.cloud.configuration.ConfigurationVO;
- import com.cloud.configuration.dao.ConfigurationDao;
- import com.cloud.domain.Domain;
- import com.cloud.domain.DomainVO;
- import com.cloud.event.ActionEventUtils;
- import com.cloud.exception.*;
- import com.cloud.user.*;
- import com.cloud.utils.NumbersUtil;
- import com.cloud.utils.Pair;
- import com.cloud.utils.StringUtils;
- import com.cloud.utils.component.ComponentContext;
- import com.cloud.utils.component.PluggableService;
- import com.cloud.utils.concurrency.NamedThreadFactory;
- import com.cloud.utils.db.SearchCriteria;
- import com.cloud.utils.db.Transaction;
- import com.cloud.utils.exception.CloudRuntimeException;
+ import java.io.ByteArrayInputStream;
+ import java.io.IOException;
+ import java.io.InterruptedIOException;
+ import java.net.InetAddress;
+ import java.net.ServerSocket;
+ import java.net.Socket;
+ import java.net.URI;
+ import java.net.URISyntaxException;
+ import java.net.URLEncoder;
+ import java.security.SecureRandom;
+ import java.text.DateFormat;
+ import java.text.ParseException;
+ import java.text.SimpleDateFormat;
+ import java.util.ArrayList;
+ import java.util.Collections;
+ import java.util.Date;
+ import java.util.HashMap;
+ import java.util.HashSet;
+ import java.util.Iterator;
+ import java.util.List;
+ import java.util.Map;
+ import java.util.Set;
+ import java.util.TimeZone;
+ import java.util.concurrent.ExecutorService;
+ import java.util.concurrent.LinkedBlockingQueue;
+ import java.util.concurrent.ThreadPoolExecutor;
+ import java.util.concurrent.TimeUnit;
+ 
+ import javax.annotation.PostConstruct;
+ import javax.crypto.Mac;
+ import javax.crypto.spec.SecretKeySpec;
+ import javax.inject.Inject;
+ import javax.naming.ConfigurationException;
+ import javax.servlet.http.HttpServletResponse;
+ import javax.servlet.http.HttpSession;
+ 
 -import org.apache.cloudstack.acl.APIChecker;
 -import org.apache.cloudstack.api.APICommand;
 -import org.apache.cloudstack.api.ApiErrorCode;
 -import org.apache.cloudstack.api.BaseAsyncCmd;
 -import org.apache.cloudstack.api.BaseAsyncCreateCmd;
 -import org.apache.cloudstack.api.BaseCmd;
 -import org.apache.cloudstack.api.BaseListCmd;
 -import org.apache.cloudstack.api.ResponseObject;
 -import org.apache.cloudstack.api.ServerApiException;
 -import org.apache.cloudstack.api.command.admin.host.ListHostsCmd;
 -import org.apache.cloudstack.api.command.admin.router.ListRoutersCmd;
 -import org.apache.cloudstack.api.command.admin.storage.ListStoragePoolsCmd;
 -import org.apache.cloudstack.api.command.admin.user.ListUsersCmd;
 -import com.cloud.event.ActionEventUtils;
 -import org.apache.cloudstack.api.command.user.account.ListAccountsCmd;
 -import org.apache.cloudstack.api.command.user.account.ListProjectAccountsCmd;
 -import org.apache.cloudstack.api.command.user.event.ListEventsCmd;
 -import org.apache.cloudstack.api.command.user.offering.ListDiskOfferingsCmd;
 -import org.apache.cloudstack.api.command.user.offering.ListServiceOfferingsCmd;
 -import org.apache.cloudstack.api.command.user.project.ListProjectInvitationsCmd;
 -import org.apache.cloudstack.api.command.user.project.ListProjectsCmd;
 -import org.apache.cloudstack.api.command.user.securitygroup.ListSecurityGroupsCmd;
 -import org.apache.cloudstack.api.command.user.tag.ListTagsCmd;
 -import org.apache.cloudstack.api.command.user.vm.ListVMsCmd;
 -import org.apache.cloudstack.api.command.user.vmgroup.ListVMGroupsCmd;
 -import org.apache.cloudstack.api.command.user.volume.ListVolumesCmd;
 -import org.apache.cloudstack.api.command.user.zone.ListZonesByCmd;
 -import org.apache.cloudstack.api.response.ExceptionResponse;
 -import org.apache.cloudstack.api.response.ListResponse;
 -import org.apache.cloudstack.region.RegionManager;
+ import org.apache.commons.codec.binary.Base64;
+ import org.apache.http.ConnectionClosedException;
+ import org.apache.http.HttpException;
+ import org.apache.http.HttpRequest;
+ import org.apache.http.HttpResponse;
+ import org.apache.http.HttpServerConnection;
+ import org.apache.http.HttpStatus;
+ import org.apache.http.NameValuePair;
+ import org.apache.http.client.utils.URLEncodedUtils;
+ import org.apache.http.entity.BasicHttpEntity;
+ import org.apache.http.impl.DefaultHttpResponseFactory;
+ import org.apache.http.impl.DefaultHttpServerConnection;
+ import org.apache.http.impl.NoConnectionReuseStrategy;
+ import org.apache.http.impl.SocketHttpServerConnection;
+ import org.apache.http.params.BasicHttpParams;
+ import org.apache.http.params.CoreConnectionPNames;
+ import org.apache.http.params.CoreProtocolPNames;
+ import org.apache.http.params.HttpParams;
+ import org.apache.http.protocol.BasicHttpContext;
+ import org.apache.http.protocol.BasicHttpProcessor;
+ import org.apache.http.protocol.HttpContext;
+ import org.apache.http.protocol.HttpRequestHandler;
+ import org.apache.http.protocol.HttpRequestHandlerRegistry;
+ import org.apache.http.protocol.HttpService;
+ import org.apache.http.protocol.ResponseConnControl;
+ import org.apache.http.protocol.ResponseContent;
+ import org.apache.http.protocol.ResponseDate;
+ import org.apache.http.protocol.ResponseServer;
+ import org.apache.log4j.Logger;
+ import org.springframework.stereotype.Component;
+ 
 +import org.apache.cloudstack.acl.APIChecker;
- import org.apache.cloudstack.api.*;
++import org.apache.cloudstack.api.APICommand;
++import org.apache.cloudstack.api.ApiErrorCode;
++import org.apache.cloudstack.api.BaseAsyncCmd;
++import org.apache.cloudstack.api.BaseAsyncCreateCmd;
++import org.apache.cloudstack.api.BaseCmd;
++import org.apache.cloudstack.api.BaseListCmd;
++import org.apache.cloudstack.api.ResponseObject;
++import org.apache.cloudstack.api.ServerApiException;
 +import org.apache.cloudstack.api.command.admin.host.ListHostsCmd;
 +import org.apache.cloudstack.api.command.admin.router.ListRoutersCmd;
 +import org.apache.cloudstack.api.command.admin.storage.ListStoragePoolsCmd;
 +import org.apache.cloudstack.api.command.admin.user.ListUsersCmd;
 +import org.apache.cloudstack.api.command.user.account.ListAccountsCmd;
 +import org.apache.cloudstack.api.command.user.account.ListProjectAccountsCmd;
 +import org.apache.cloudstack.api.command.user.event.ListEventsCmd;
 +import org.apache.cloudstack.api.command.user.offering.ListDiskOfferingsCmd;
 +import org.apache.cloudstack.api.command.user.offering.ListServiceOfferingsCmd;
 +import org.apache.cloudstack.api.command.user.project.ListProjectInvitationsCmd;
 +import org.apache.cloudstack.api.command.user.project.ListProjectsCmd;
 +import org.apache.cloudstack.api.command.user.securitygroup.ListSecurityGroupsCmd;
 +import org.apache.cloudstack.api.command.user.tag.ListTagsCmd;
 +import org.apache.cloudstack.api.command.user.vm.ListVMsCmd;
 +import org.apache.cloudstack.api.command.user.vmgroup.ListVMGroupsCmd;
 +import org.apache.cloudstack.api.command.user.volume.ListVolumesCmd;
 +import org.apache.cloudstack.api.command.user.zone.ListZonesByCmd;
 +import org.apache.cloudstack.api.response.ExceptionResponse;
 +import org.apache.cloudstack.api.response.ListResponse;
 +import org.apache.cloudstack.region.RegionManager;
- import org.apache.commons.codec.binary.Base64;
- import org.apache.http.*;
- import org.apache.http.client.utils.URLEncodedUtils;
- import org.apache.http.entity.BasicHttpEntity;
- import org.apache.http.impl.DefaultHttpResponseFactory;
- import org.apache.http.impl.DefaultHttpServerConnection;
- import org.apache.http.impl.NoConnectionReuseStrategy;
- import org.apache.http.impl.SocketHttpServerConnection;
- import org.apache.http.params.BasicHttpParams;
- import org.apache.http.params.CoreConnectionPNames;
- import org.apache.http.params.CoreProtocolPNames;
- import org.apache.http.params.HttpParams;
- import org.apache.http.protocol.*;
- import org.apache.log4j.Logger;
- import org.springframework.stereotype.Component;
 +
- import javax.annotation.PostConstruct;
- import javax.crypto.Mac;
- import javax.crypto.spec.SecretKeySpec;
- import javax.inject.Inject;
- import javax.servlet.http.HttpServletResponse;
- import javax.servlet.http.HttpSession;
- import java.io.ByteArrayInputStream;
- import java.io.IOException;
- import java.io.InterruptedIOException;
- import java.net.*;
- import java.security.SecureRandom;
- import java.text.DateFormat;
- import java.text.ParseException;
- import java.text.SimpleDateFormat;
- import java.util.*;
- import java.util.concurrent.ExecutorService;
- import java.util.concurrent.LinkedBlockingQueue;
- import java.util.concurrent.ThreadPoolExecutor;
- import java.util.concurrent.TimeUnit;
+ import com.cloud.api.response.ApiResponseSerializer;
 -import com.cloud.async.AsyncCommandQueued;
+ import com.cloud.async.AsyncJob;
+ import com.cloud.async.AsyncJobManager;
+ import com.cloud.async.AsyncJobVO;
+ import com.cloud.configuration.Config;
+ import com.cloud.configuration.ConfigurationVO;
+ import com.cloud.configuration.dao.ConfigurationDao;
+ import com.cloud.domain.Domain;
+ import com.cloud.domain.DomainVO;
++import com.cloud.event.ActionEventUtils;
+ import com.cloud.exception.AccountLimitException;
+ import com.cloud.exception.CloudAuthenticationException;
+ import com.cloud.exception.InsufficientCapacityException;
+ import com.cloud.exception.InvalidParameterValueException;
+ import com.cloud.exception.PermissionDeniedException;
+ import com.cloud.exception.RequestLimitException;
+ import com.cloud.exception.ResourceAllocationException;
+ import com.cloud.exception.ResourceUnavailableException;
+ import com.cloud.user.Account;
+ import com.cloud.user.AccountManager;
+ import com.cloud.user.DomainManager;
+ import com.cloud.user.User;
+ import com.cloud.user.UserAccount;
+ import com.cloud.user.UserContext;
+ import com.cloud.user.UserVO;
+ import com.cloud.utils.NumbersUtil;
+ import com.cloud.utils.Pair;
+ import com.cloud.utils.StringUtils;
+ import com.cloud.utils.component.ComponentContext;
+ import com.cloud.utils.component.ManagerBase;
+ import com.cloud.utils.component.PluggableService;
+ import com.cloud.utils.concurrency.NamedThreadFactory;
+ import com.cloud.utils.db.SearchCriteria;
+ import com.cloud.utils.db.Transaction;
+ import com.cloud.utils.exception.CloudRuntimeException;
  
--@Component
- public class ApiServer implements HttpRequestHandler, ApiServerService {
++@Component 
+ public class ApiServer extends ManagerBase implements HttpRequestHandler, ApiServerService {
      private static final Logger s_logger = Logger.getLogger(ApiServer.class.getName());
      private static final Logger s_accessLogger = Logger.getLogger("apiserver." + ApiServer.class.getName());
  
@@@ -133,7 -186,14 +186,14 @@@
      public static ApiServer getInstance() {
          return s_instance;
      }
 -    
 +
+ 	@Override
+ 	public boolean configure(String name, Map<String, Object> params)
+ 			throws ConfigurationException {
+ 		init();
+ 		return true;
+ 	}
+  
      public void init() {
          Integer apiPort = null; // api port, null by default
          SearchCriteria<ConfigurationVO> sc = _configDao.createSearchCriteria();

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/d4039743/server/src/com/cloud/async/AsyncJobVO.java
----------------------------------------------------------------------
diff --cc server/src/com/cloud/async/AsyncJobVO.java
index 0000000,c40fc98..93b72d6
mode 000000,100644..100644
--- a/server/src/com/cloud/async/AsyncJobVO.java
+++ b/server/src/com/cloud/async/AsyncJobVO.java
@@@ -1,0 -1,401 +1,382 @@@
+ // 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.async;
+ 
+ import java.util.Date;
+ import java.util.UUID;
+ 
+ import javax.persistence.Column;
++import javax.persistence.DiscriminatorColumn;
++import javax.persistence.DiscriminatorType;
+ import javax.persistence.Entity;
 -import javax.persistence.EnumType;
 -import javax.persistence.Enumerated;
+ import javax.persistence.GeneratedValue;
+ import javax.persistence.GenerationType;
+ import javax.persistence.Id;
++import javax.persistence.Inheritance;
++import javax.persistence.InheritanceType;
+ import javax.persistence.Table;
+ import javax.persistence.Temporal;
+ import javax.persistence.TemporalType;
+ import javax.persistence.Transient;
+ 
+ import com.cloud.utils.db.GenericDao;
 -import org.apache.cloudstack.api.InternalIdentity;
+ 
+ @Entity
+ @Table(name="async_job")
++@Inheritance(strategy=InheritanceType.JOINED)
++@DiscriminatorColumn(name="job_type", discriminatorType=DiscriminatorType.STRING, length=32)
+ public class AsyncJobVO implements AsyncJob {
 -	public static final int CALLBACK_POLLING = 0;
 -	public static final int CALLBACK_EMAIL = 1;
+ 	
+ 	@Id
+     @GeneratedValue(strategy=GenerationType.IDENTITY)
+     @Column(name="id")
+     private Long id = null;
 -
++	
++    @Column(name="job_type", length=32)
++    protected String type;
++    
++    @Column(name="job_dispatcher", length=64)
++    protected String dispatcher;
++    
++    @Column(name="job_pending_signals")
++    protected int pendingSignals;
++    
+     @Column(name="user_id")
+     private long userId;
+     
+     @Column(name="account_id")
+     private long accountId;
+     
 -    @Column(name="session_key")
 -    private String sessionKey;
 -    
+ 	@Column(name="job_cmd")
+     private String cmd;
 -	
 -	@Column(name="job_cmd_originator")
 -	private String cmdOriginator;
 -    
++
+ 	@Column(name="job_cmd_ver")
+     private int cmdVersion;
 -    
++	
+     @Column(name="job_cmd_info", length=65535)
+     private String cmdInfo;
 -    
 -    @Column(name="callback_type")
 -    private int callbackType;
 -    
 -    @Column(name="callback_address")
 -    private String callbackAddress;
 -    
++  
+     @Column(name="job_status")
+     private int status;
+     
+     @Column(name="job_process_status")
+     private int processStatus;
+     
+     @Column(name="job_result_code")
+     private int resultCode;
+     
+     @Column(name="job_result", length=65535)
+     private String result;
+     
 -    @Enumerated(value=EnumType.STRING)
+     @Column(name="instance_type", length=64)
 -    private Type instanceType;
++    private String instanceType;
+     
+ 	@Column(name="instance_id", length=64)
+     private Long instanceId;
+     
+     @Column(name="job_init_msid")
+     private Long initMsid;
+ 
+     @Column(name="job_complete_msid")
+     private Long completeMsid;
+     
++    @Column(name="job_executing_msid")
++    private Long executingMsid;
++
+     @Column(name=GenericDao.CREATED_COLUMN)
+     private Date created;
+     
+     @Column(name="last_updated")
+     @Temporal(TemporalType.TIMESTAMP)
+     private Date lastUpdated;
+     
+     @Column(name="last_polled")
+     @Temporal(TemporalType.TIMESTAMP)
+     private Date lastPolled;
+     
+     @Column(name=GenericDao.REMOVED_COLUMN)
+     private Date removed;
+     
+     @Column(name="uuid")
 -    private String uuid;
++    private String uuid;    
+ 
+     @Transient
 -    private SyncQueueItemVO syncSource = null;
++    private SyncQueueItem syncSource = null;
+ 
 -    @Transient
 -    private boolean fromPreviousSession = false;
 -
 -    
+     public AsyncJobVO() {
+         this.uuid = UUID.randomUUID().toString();
+     }
+ 
 -    public AsyncJobVO(long userId, long accountId, String cmd, String cmdInfo, Long instanceId, Type instanceType) {
 -	this.userId = userId;
 -	this.accountId = accountId;
 -	this.cmd = cmd;
 -	this.cmdInfo = cmdInfo;
 -    	this.callbackType = CALLBACK_POLLING;
 -    	this.uuid = UUID.randomUUID().toString();
 -        this.instanceId = instanceId;
 -        this.instanceType = instanceType;
++    public AsyncJobVO(long userId, long accountId, String cmd, String cmdInfo, Long instanceId, String instanceType) {
++		this.userId = userId;
++		this.accountId = accountId;
++		this.cmd = cmd;
++		this.cmdInfo = cmdInfo;
++	    this.uuid = UUID.randomUUID().toString();
++	    this.instanceId = instanceId;
++	    this.instanceType = instanceType;
+     }
+ 
+     public AsyncJobVO(long userId, long accountId, String cmd, String cmdInfo,
+ 	int callbackType, String callbackAddress, Long instanceId, Type instanceType) {
 -
 -	this(userId, accountId, cmd, cmdInfo, instanceId, instanceType);
 -	this.callbackType = callbackType;
 -	this.callbackAddress = callbackAddress;
 -    	this.uuid = UUID.randomUUID().toString();
++	    
++	    this.type ="AsyncJobVO";
+     }
+ 
 -
+     @Override
+     public long getId() {
+ 		return id;
+ 	}
+ 
+ 	public void setId(Long id) {
+ 		this.id = id;
+ 	}
++	
++	@Override
++	public String getType() {
++		return this.type;
++	}
++	
++	public void setType(String type) {
++		this.type = type;
++	}
++	
++	@Override
++	public String getDispatcher() {
++		return this.dispatcher;
++	}
++	
++	public void setDispatcher(String dispatcher) {
++		this.dispatcher = dispatcher;
++	}
++	
++	@Override
++	public int getPendingSignals() {
++		return this.pendingSignals;
++	}
++	
++	public void setPendingSignals(int signals) {
++		this.pendingSignals = signals;
++	}
+ 
+ 	@Override
+     public long getUserId() {
+ 		return userId;
+ 	}
+ 
+ 	public void setUserId(long userId) {
+ 		this.userId = userId;
+ 	}
+ 
+ 	@Override
+     public long getAccountId() {
+ 		return accountId;
+ 	}
+ 
+ 	public void setAccountId(long accountId) {
+ 		this.accountId = accountId;
+ 	}
+ 
+ 	@Override
+     public String getCmd() {
+ 		return cmd;
+ 	}
+ 
+ 	public void setCmd(String cmd) {
+ 		this.cmd = cmd;
+ 	}
+ 	
+ 	@Override
+     public int getCmdVersion() {
+ 		return cmdVersion;
+ 	}
+ 	
+ 	public void setCmdVersion(int version) {
+ 		cmdVersion = version;
+ 	}
+ 
+ 	@Override
+     public String getCmdInfo() {
+ 		return cmdInfo;
+ 	}
+ 
+ 	public void setCmdInfo(String cmdInfo) {
+ 		this.cmdInfo = cmdInfo;
+ 	}
 -
 -	@Override
 -    public int getCallbackType() {
 -		return callbackType;
 -	}
 -
 -	public void setCallbackType(int callbackType) {
 -		this.callbackType = callbackType;
 -	}
 -
 -	@Override
 -    public String getCallbackAddress() {
 -		return callbackAddress;
 -	}
 -
 -	public void setCallbackAddress(String callbackAddress) {
 -		this.callbackAddress = callbackAddress;
 -	}
 -
++	
+ 	@Override
+     public int getStatus() {
+ 		return status;
+ 	}
+ 
+ 	public void setStatus(int status) {
+ 		this.status = status;
+ 	}
+ 	
+ 	@Override
+     public int getProcessStatus() {
+ 		return processStatus;
+ 	}
+ 	
+ 	public void setProcessStatus(int status) {
+ 		processStatus = status;
+ 	}
+ 	
+ 	@Override
+     public int getResultCode() {
+ 		return resultCode;
+ 	}
+ 	
+ 	public void setResultCode(int resultCode) {
+ 		this.resultCode = resultCode;
+ 	}
+ 
+ 	@Override
+     public String getResult() {
+ 		return result;
+ 	}
+ 
+ 	public void setResult(String result) {
+ 		this.result = result;
+ 	}
+ 
+ 	@Override
+     public Long getInitMsid() {
+ 		return initMsid;
+ 	}
+ 
++	@Override
+ 	public void setInitMsid(Long initMsid) {
+ 		this.initMsid = initMsid;
+ 	}
++	
++	@Override
++	public Long getExecutingMsid() {
++		return this.executingMsid;
++	}
++	
++	public void setExecutingMsid(Long executingMsid) {
++		this.executingMsid = executingMsid;
++	}
+ 
+ 	@Override
+     public Long getCompleteMsid() {
+ 		return completeMsid;
+ 	}
+ 
++	@Override
+ 	public void setCompleteMsid(Long completeMsid) {
+ 		this.completeMsid = completeMsid;
+ 	}
+ 
+ 	@Override
+     public Date getCreated() {
+ 		return created;
+ 	}
+ 
+ 	public void setCreated(Date created) {
+ 		this.created = created;
+ 	}
+ 
+ 	@Override
+     public Date getLastUpdated() {
+ 		return lastUpdated;
+ 	}
+ 
+ 	public void setLastUpdated(Date lastUpdated) {
+ 		this.lastUpdated = lastUpdated;
+ 	}
+ 
+ 	@Override
+     public Date getLastPolled() {
+ 		return lastPolled;
+ 	}
+ 
+ 	public void setLastPolled(Date lastPolled) {
+ 		this.lastPolled = lastPolled;
+ 	}
+ 
+ 	@Override
+     public Date getRemoved() {
+ 		return removed;
+ 	}
+ 
+ 	public void setRemoved(Date removed) {
+ 		this.removed = removed;
+ 	}
+ 	
+     @Override
 -    public Type getInstanceType() {
++    public String getInstanceType() {
+ 		return instanceType;
+ 	}
+ 
 -	public void setInstanceType(Type instanceType) {
++	public void setInstanceType(String instanceType) {
+ 		this.instanceType = instanceType;
+ 	}
+ 
+ 	@Override
+     public Long getInstanceId() {
+ 		return instanceId;
+ 	}
+ 
+ 	public void setInstanceId(Long instanceId) {
+ 		this.instanceId = instanceId;
+ 	}
+ 	
 -    @Override
 -    public String getSessionKey() {
 -		return sessionKey;
 -	}
 -
 -	public void setSessionKey(String sessionKey) {
 -		this.sessionKey = sessionKey;
 -	}
 -	
 -    @Override
 -    public String getCmdOriginator() {
 -		return cmdOriginator;
 -	}
 -
 -	public void setCmdOriginator(String cmdOriginator) {
 -		this.cmdOriginator = cmdOriginator;
 -	}
 -	
+ 	@Override
 -    public SyncQueueItemVO getSyncSource() {
++    public SyncQueueItem getSyncSource() {
+         return syncSource;
+     }
+     
 -    public void setSyncSource(SyncQueueItemVO syncSource) {
++	@Override
++    public void setSyncSource(SyncQueueItem syncSource) {
+         this.syncSource = syncSource;
+     }
+     
+     @Override
 -    public boolean isFromPreviousSession() {
 -        return fromPreviousSession;
 -    }
 -    
 -    public void setFromPreviousSession(boolean fromPreviousSession) {
 -        this.fromPreviousSession = fromPreviousSession;
 -    }
 -    
 -    @Override
+     public String getUuid() {
+     	return this.uuid;
+     }
+     
+     public void setUuid(String uuid) {
+     	this.uuid = uuid;
+     }
+     
+ 	@Override
+     public String toString() {
+ 		StringBuffer sb = new StringBuffer();
+ 		sb.append("AsyncJobVO {id:").append(getId());
+ 		sb.append(", userId: ").append(getUserId());
+ 		sb.append(", accountId: ").append(getAccountId());
 -		sb.append(", sessionKey: ").append(getSessionKey());
+ 		sb.append(", instanceType: ").append(getInstanceType());
+ 		sb.append(", instanceId: ").append(getInstanceId());
+ 		sb.append(", cmd: ").append(getCmd());
 -		sb.append(", cmdOriginator: ").append(getCmdOriginator());
+ 		sb.append(", cmdInfo: ").append(getCmdInfo());
+ 		sb.append(", cmdVersion: ").append(getCmdVersion());
 -		sb.append(", callbackType: ").append(getCallbackType());
 -		sb.append(", callbackAddress: ").append(getCallbackAddress());
+ 		sb.append(", status: ").append(getStatus());
+ 		sb.append(", processStatus: ").append(getProcessStatus());
+ 		sb.append(", resultCode: ").append(getResultCode());
+ 		sb.append(", result: ").append(getResult());
+ 		sb.append(", initMsid: ").append(getInitMsid());
+ 		sb.append(", completeMsid: ").append(getCompleteMsid());
+ 		sb.append(", lastUpdated: ").append(getLastUpdated());
+ 		sb.append(", lastPolled: ").append(getLastPolled());
+ 		sb.append(", created: ").append(getCreated());
+ 		sb.append("}");
+ 		return sb.toString();
+ 	}
+ }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/d4039743/server/src/com/cloud/async/SyncQueueItemVO.java
----------------------------------------------------------------------
diff --cc server/src/com/cloud/async/SyncQueueItemVO.java
index 0000000,b0546a7..21fbb91
mode 000000,100644..100644
--- a/server/src/com/cloud/async/SyncQueueItemVO.java
+++ b/server/src/com/cloud/async/SyncQueueItemVO.java
@@@ -1,0 -1,141 +1,142 @@@
+ // 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.async;
+ 
+ import org.apache.cloudstack.api.InternalIdentity;
+ 
+ import java.util.Date;
+ 
+ import javax.persistence.Column;
+ import javax.persistence.Entity;
+ import javax.persistence.GeneratedValue;
+ import javax.persistence.GenerationType;
+ import javax.persistence.Id;
+ import javax.persistence.Table;
+ import javax.persistence.Temporal;
+ import javax.persistence.TemporalType;
+ 
+ @Entity
+ @Table(name="sync_queue_item")
+ public class SyncQueueItemVO implements SyncQueueItem, InternalIdentity {
+ 
+     @Id
+     @GeneratedValue(strategy=GenerationType.IDENTITY)
+     @Column(name="id")
+     private Long id = null;
+     
+     @Column(name="queue_id")
+     private Long queueId;
+     
+     @Column(name="content_type")
+     private String contentType;
+     
+     @Column(name="content_id")
+     private Long contentId;
+     
+     @Column(name="queue_proc_msid")
+     private Long lastProcessMsid;
+ 
+     @Column(name="queue_proc_number")
+     private Long lastProcessNumber;
+     
+     @Column(name="queue_proc_time")
+     @Temporal(TemporalType.TIMESTAMP)
+     private Date lastProcessTime;
+     
+     @Column(name="created")
+     private Date created;
+     
+     public long getId() {
+         return id;
+     }
+ 
+     public void setId(Long id) {
+         this.id = id;
+     }
+ 
++    @Override
+     public Long getQueueId() {
+         return queueId;
+     }
+ 
+     public void setQueueId(Long queueId) {
+         this.queueId = queueId;
+     }
+ 
+     @Override
+     public String getContentType() {
+         return contentType;
+     }
+ 
+     public void setContentType(String contentType) {
+         this.contentType = contentType;
+     }
+     
+     @Override
+     public Long getContentId() {
+         return contentId;
+     }
+ 
+     public void setContentId(Long contentId) {
+         this.contentId = contentId;
+     }
+ 
+     public Long getLastProcessMsid() {
+         return lastProcessMsid;
+     }
+ 
+     public void setLastProcessMsid(Long lastProcessMsid) {
+         this.lastProcessMsid = lastProcessMsid;
+     }
+ 
+     public Long getLastProcessNumber() {
+         return lastProcessNumber;
+     }
+ 
+     public void setLastProcessNumber(Long lastProcessNumber) {
+         this.lastProcessNumber = lastProcessNumber;
+     }
+ 
+     public Date getCreated() {
+         return created;
+     }
+ 
+     public void setCreated(Date created) {
+         this.created = created;
+     }
+ 
+     public String toString() {
+         StringBuffer sb = new StringBuffer();
+         sb.append("SyncQueueItemVO {id:").append(getId()).append(", queueId: ").append(getQueueId());
+         sb.append(", contentType: ").append(getContentType());
+         sb.append(", contentId: ").append(getContentId());
+         sb.append(", lastProcessMsid: ").append(getLastProcessMsid());
+         sb.append(", lastprocessNumber: ").append(getLastProcessNumber());
+         sb.append(", lastProcessTime: ").append(getLastProcessTime());
+         sb.append(", created: ").append(getCreated());
+         sb.append("}");
+         return sb.toString();
+     }
+ 
+        public Date getLastProcessTime() {
+             return lastProcessTime;
+         }
+ 
+         public void setLastProcessTime(Date lastProcessTime) {
+             this.lastProcessTime = lastProcessTime;
+         }
+ }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/d4039743/server/src/com/cloud/consoleproxy/AgentBasedConsoleProxyManager.java
----------------------------------------------------------------------
diff --cc server/src/com/cloud/consoleproxy/AgentBasedConsoleProxyManager.java
index 58cd660,df53e0d..0d47207
--- a/server/src/com/cloud/consoleproxy/AgentBasedConsoleProxyManager.java
+++ b/server/src/com/cloud/consoleproxy/AgentBasedConsoleProxyManager.java
@@@ -274,95 -214,4 +214,5 @@@ public class AgentBasedConsoleProxyMana
      public String getName() {
          return _name;
      }
 +
-     @Override
-     public Long convertToId(String vmName) {
-         if (!VirtualMachineName.isValidConsoleProxyName(vmName, _instance)) {
-             return null;
-         }
-         return VirtualMachineName.getConsoleProxyId(vmName);
-     }
- 
-     @Override
-     public ConsoleProxyVO findByName(String name) {
-         // TODO Auto-generated method stub
-         return null;
-     }
- 
-     @Override
-     public ConsoleProxyVO findById(long id) {
-         // TODO Auto-generated method stub
-         return null;
-     }
- 
-     @Override
-     public ConsoleProxyVO persist(ConsoleProxyVO vm) {
-         // TODO Auto-generated method stub
-         return null;
-     }
- 
-     @Override
-     public boolean finalizeVirtualMachineProfile(VirtualMachineProfile<ConsoleProxyVO> profile, DeployDestination dest, ReservationContext context) {
-         // TODO Auto-generated method stub
-         return false;
-     }
- 
-     @Override
-     public boolean finalizeDeployment(Commands cmds, VirtualMachineProfile<ConsoleProxyVO> profile, DeployDestination dest, ReservationContext context) {
-         // TODO Auto-generated method stub
-         return false;
-     }
- 
-     @Override
-     public boolean finalizeCommandsOnStart(Commands cmds, VirtualMachineProfile<ConsoleProxyVO> profile) {
-         // TODO Auto-generated method stub
-         return false;
-     }
- 
-     @Override
-     public boolean finalizeStart(VirtualMachineProfile<ConsoleProxyVO> profile, long hostId, Commands cmds, ReservationContext context) {
-         // TODO Auto-generated method stub
-         return false;
-     }
- 
-     @Override
-     public void finalizeStop(VirtualMachineProfile<ConsoleProxyVO> profile, StopAnswer answer) {
-         // TODO Auto-generated method stub
-     }
- 
-     @Override 
-     public void finalizeExpunge(ConsoleProxyVO proxy) {
-     }
- 
-     @Override
-     public boolean plugNic(Network network, NicTO nic, VirtualMachineTO vm,
-             ReservationContext context, DeployDestination dest) throws ConcurrentOperationException, ResourceUnavailableException,
-             InsufficientCapacityException {
-         //not supported
-         throw new UnsupportedOperationException("Plug nic is not supported for vm of type " + vm.getType());
-     }
- 
- 
-     @Override
-     public boolean unplugNic(Network network, NicTO nic, VirtualMachineTO vm,
-             ReservationContext context, DeployDestination dest) throws ConcurrentOperationException, ResourceUnavailableException {
-         //not supported
-         throw new UnsupportedOperationException("Unplug nic is not supported for vm of type " + vm.getType());
-     }
- 
-     @Override
-     public void prepareStop(VirtualMachineProfile<ConsoleProxyVO> profile) {
-     }
-     
-     @Override
-     public void vmWorkStart(VmWork work) {
-     }
-     
-     @Override
-     public void vmWorkStop(VmWork work) {
-     }
  }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/d4039743/server/src/com/cloud/consoleproxy/ConsoleProxyManagerImpl.java
----------------------------------------------------------------------
diff --cc server/src/com/cloud/consoleproxy/ConsoleProxyManagerImpl.java
index 3e011dc,9a7a46f..5950a99
--- a/server/src/com/cloud/consoleproxy/ConsoleProxyManagerImpl.java
+++ b/server/src/com/cloud/consoleproxy/ConsoleProxyManagerImpl.java
@@@ -30,19 -28,13 +28,17 @@@ import javax.ejb.Local
  import javax.inject.Inject;
  import javax.naming.ConfigurationException;
  
- import org.apache.cloudstack.api.ServerApiException;
++import org.apache.log4j.Logger;
++
++import com.google.gson.Gson;
++import com.google.gson.GsonBuilder;
++
  import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao;
  import org.apache.cloudstack.storage.datastore.db.StoragePoolVO;
--import org.apache.log4j.Logger;
  
  import com.cloud.agent.AgentManager;
- import com.cloud.agent.api.AgentControlAnswer;
  import com.cloud.agent.api.Answer;
- import com.cloud.agent.api.ConsoleAccessAuthenticationAnswer;
- import com.cloud.agent.api.ConsoleAccessAuthenticationCommand;
  import com.cloud.agent.api.ConsoleProxyLoadReportCommand;
- import com.cloud.agent.api.GetVncPortAnswer;
- import com.cloud.agent.api.GetVncPortCommand;
  import com.cloud.agent.api.RebootCommand;
  import com.cloud.agent.api.StartupCommand;
  import com.cloud.agent.api.StartupProxyCommand;
@@@ -53,11 -45,6 +49,8 @@@ import com.cloud.agent.api.proxy.Consol
  import com.cloud.agent.api.to.NicTO;
  import com.cloud.agent.api.to.VirtualMachineTO;
  import com.cloud.agent.manager.Commands;
- import com.cloud.api.commands.DestroyConsoleProxyCmd;
 +import com.cloud.async.AsyncJobConstants;
 +import com.cloud.async.AsyncJobExecutionContext;
- import com.cloud.async.AsyncJobResult;
  import com.cloud.certificate.dao.CertificateDao;
  import com.cloud.cluster.ClusterManager;
  import com.cloud.configuration.Config;
@@@ -111,10 -94,9 +101,10 @@@ import com.cloud.resource.ResourceManag
  import com.cloud.resource.ResourceStateAdapter;
  import com.cloud.resource.ServerResource;
  import com.cloud.resource.UnableDeleteHostException;
 +import com.cloud.serializer.SerializerHelper;
+ import com.cloud.server.ManagementServer;
  import com.cloud.service.ServiceOfferingVO;
  import com.cloud.service.dao.ServiceOfferingDao;
- import com.cloud.servlet.ConsoleProxyServlet;
  import com.cloud.storage.StorageManager;
  import com.cloud.storage.StoragePoolStatus;
  import com.cloud.storage.VMTemplateHostVO;
@@@ -159,13 -136,11 +146,12 @@@ import com.cloud.vm.VirtualMachineGuru
  import com.cloud.vm.VirtualMachineManager;
  import com.cloud.vm.VirtualMachineName;
  import com.cloud.vm.VirtualMachineProfile;
++import com.cloud.vm.VmWork;
 +import com.cloud.vm.VmWorkStart;
 +import com.cloud.vm.VmWorkStop;
  import com.cloud.vm.dao.ConsoleProxyDao;
  import com.cloud.vm.dao.UserVmDetailsDao;
  import com.cloud.vm.dao.VMInstanceDao;
--import com.google.gson.Gson;
--import com.google.gson.GsonBuilder;
  
  //
  // Possible console proxy state transition cases
@@@ -244,9 -220,8 +231,11 @@@ public class ConsoleProxyManagerImpl ex
      TemplateManager templateMgr;
      @Inject
      IPAddressDao _ipAddressDao;
+     @Inject
+     ManagementServer _ms;
 +    
 +    @Inject
 +    EntityManager _entityMgr;
  
      private ConsoleProxyListener _listener;
  

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/d4039743/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java
----------------------------------------------------------------------
diff --cc server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java
index 7eff938,e3dd06b..994a5c3
--- a/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java
+++ b/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java
@@@ -40,10 -40,11 +40,11 @@@ import javax.ejb.Local
  import javax.inject.Inject;
  import javax.naming.ConfigurationException;
  
  import org.apache.log4j.Logger;
  import org.springframework.stereotype.Component;
  
++import org.apache.cloudstack.api.command.admin.router.UpgradeRouterCmd;
++
  import com.cloud.agent.AgentManager;
  import com.cloud.agent.AgentManager.OnError;
  import com.cloud.agent.Listener;
@@@ -183,6 -185,6 +185,7 @@@ import com.cloud.offering.NetworkOfferi
  import com.cloud.offering.ServiceOffering;
  import com.cloud.offerings.dao.NetworkOfferingDao;
  import com.cloud.resource.ResourceManager;
++import com.cloud.server.ConfigurationServer;
  import com.cloud.service.ServiceOfferingVO;
  import com.cloud.service.dao.ServiceOfferingDao;
  import com.cloud.storage.GuestOSVO;
@@@ -235,6 -237,6 +238,7 @@@ import com.cloud.vm.VirtualMachineManag
  import com.cloud.vm.VirtualMachineName;
  import com.cloud.vm.VirtualMachineProfile;
  import com.cloud.vm.VirtualMachineProfile.Param;
++import com.cloud.vm.VmWork;
  import com.cloud.vm.dao.DomainRouterDao;
  import com.cloud.vm.dao.NicDao;
  import com.cloud.vm.dao.UserVmDao;
@@@ -3317,7 -3342,33 +3344,33 @@@ public class VirtualNetworkApplianceMan
              }
          });
      }
 -    
 +
+     
+     @Override
+     public boolean applyLoadBalancingRules(Network network, final List<? extends LoadBalancingRule> rules, List<? extends VirtualRouter> routers) throws ResourceUnavailableException {
+         if (rules == null || rules.isEmpty()) {
+             s_logger.debug("No lb rules to be applied for network " + network.getId());
+             return true;
+         }
+         return applyRules(network, routers, "loadbalancing rules", false, null, false, new RuleApplier() {
+             @Override
+             public boolean execute(Network network, VirtualRouter router) throws ResourceUnavailableException {
+                 // for load balancer we have to resend all lb rules for the network
+                 List<LoadBalancerVO> lbs = _loadBalancerDao.listByNetworkIdAndScheme(network.getId(), Scheme.Public);
+                 List<LoadBalancingRule> lbRules = new ArrayList<LoadBalancingRule>();
+                 for (LoadBalancerVO lb : lbs) {
+                     List<LbDestination> dstList = _lbMgr.getExistingDestinations(lb.getId());
+                     List<LbStickinessPolicy> policyList = _lbMgr.getStickinessPolicies(lb.getId());
+                     List<LbHealthCheckPolicy> hcPolicyList = _lbMgr.getHealthCheckPolicies(lb.getId());
+                     Ip sourceIp = _networkModel.getPublicIpAddress(lb.getSourceIpAddressId()).getAddress();
+                     LoadBalancingRule loadBalancing = new LoadBalancingRule(lb, dstList, policyList, hcPolicyList, sourceIp);
+                     lbRules.add(loadBalancing);
+                 }
+                 return sendLBRules(router, lbRules, network.getId());  
+             }
+         });
+     }
+ 
      protected boolean sendLBRules(VirtualRouter router, List<LoadBalancingRule> rules, long guestNetworkId) throws ResourceUnavailableException {
          Commands cmds = new Commands(OnError.Continue);
          createApplyLoadBalancingRulesCommands(rules, router, cmds, guestNetworkId);
@@@ -3713,12 -3764,11 +3766,18 @@@
              }
          }
      }
 -
 +    
 +    @Override
 +    public void vmWorkStart(VmWork work) {
 +    }
 +    
 +    @Override
 +    public void vmWorkStop(VmWork work) {
 +    }
+ 
+ 
+     @Override
+     public VirtualRouter findRouter(long routerId) {
+         return _routerDao.findById(routerId);
+     }
  }


[03/50] [abbrv] git commit: updated refs/heads/vmsync to d403974

Posted by ah...@apache.org.
CLOUDSTACK-2387:Addition/Deletion of a VLAN Range from UI calls updateTrafficType API which makes all networklabels as undefined which finally results in failure to deploy VMs


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

Branch: refs/heads/vmsync
Commit: 305f3cb8a503df84875fe7e066ca60fe186da22e
Parents: 76e8afa
Author: Pranav Saxena <pr...@citrix.com>
Authored: Wed May 8 17:07:46 2013 +0530
Committer: Pranav Saxena <pr...@citrix.com>
Committed: Wed May 8 17:07:46 2013 +0530

----------------------------------------------------------------------
 ui/scripts/system.js |    3 ---
 1 files changed, 0 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/305f3cb8/ui/scripts/system.js
----------------------------------------------------------------------
diff --git a/ui/scripts/system.js b/ui/scripts/system.js
index 2746e0d..34ba64c 100644
--- a/ui/scripts/system.js
+++ b/ui/scripts/system.js
@@ -1066,10 +1066,7 @@
                     dataType: "json",
                     success: function(json) {
                       var jobId = json.updatephysicalnetworkresponse.jobid;
-                      var trafficType = getTrafficType(selectedPhysicalNetworkObj, 'Guest');
-                      updateTrafficLabels(trafficType, args.data, function() {
                         args.response.success({ _custom: { jobId: jobId }});
-                      });
                    },
 
                    error:function(json){


[42/50] [abbrv] git commit: updated refs/heads/vmsync to d403974

Posted by ah...@apache.org.
CLOUDSTACK-1828:NAT on private gateway UI support


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

Branch: refs/heads/vmsync
Commit: 7ca488334f4fd48c150b31b73ad5be34052a19c8
Parents: b7f10bf
Author: Pranav Saxena <pr...@citrix.com>
Authored: Sat May 11 02:50:16 2013 +0530
Committer: Pranav Saxena <pr...@citrix.com>
Committed: Sat May 11 02:50:16 2013 +0530

----------------------------------------------------------------------
 ui/scripts/ui-custom/vpc.js |    1 +
 ui/scripts/vpc.js           |   37 +++++++++++++++++++++++++++++++++++--
 2 files changed, 36 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/7ca48833/ui/scripts/ui-custom/vpc.js
----------------------------------------------------------------------
diff --git a/ui/scripts/ui-custom/vpc.js b/ui/scripts/ui-custom/vpc.js
index 2bd26b1..4edccf1 100644
--- a/ui/scripts/ui-custom/vpc.js
+++ b/ui/scripts/ui-custom/vpc.js
@@ -152,6 +152,7 @@
 
                   addAction.action({
                     data: data,
+                    $form:args.$form,
                     context: gateways.context,
                     response: {
                       success: function(args) {

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/7ca48833/ui/scripts/vpc.js
----------------------------------------------------------------------
diff --git a/ui/scripts/vpc.js b/ui/scripts/vpc.js
index dc26265..17cf42a 100644
--- a/ui/scripts/vpc.js
+++ b/ui/scripts/vpc.js
@@ -717,12 +717,28 @@
             netmask: {
               label: 'label.netmask', validation: { required: true },
               docID: 'helpVPCGatewayNetmask'
+            },
+             sourceNat:{
+              label:'Source NAT',
+              isBoolean:true,
+              isChecked:false
+
             }
+
+         
           }
         },
         action: function(args) {
+           var array1=[];
+            if(args.$form.find('.form-item[rel=sourceNat]').find('input[type=checkbox]').is(':Checked')== true)  {
+               array1.push("&sourcenatsupported=true");
+             }
+             else
+              array1.push("&sourcenatsupported=false");
+
+
           $.ajax({
-            url: createURL('createPrivateGateway'),
+            url: createURL('createPrivateGateway'+ array1.join("")),
             data: {
 						  physicalnetworkid: args.data.physicalnetworkid,
               vpcid: args.context.vpc[0].id,
@@ -811,15 +827,32 @@
             netmask: {
               label: 'label.netmask', validation: { required: true },
               docID: 'helpVPCGatewayNetmask'
+            },
+
+             sourceNat:{
+              label:'Source NAT',
+              isBoolean:true,
+              isChecked:false
+
             }
+
           }
 
 
 
             },
             action:function(args){
+
+             var array1=[];
+            if(args.$form.find('.form-item[rel=sourceNat]').find('input[type=checkbox]').is(':Checked')== true)  {
+               array1.push("&sourcenatsupported=true");
+             }
+             else
+              array1.push("&sourcenatsupported=false");
+
+
                        $.ajax({
-            url: createURL('createPrivateGateway'),
+            url: createURL('createPrivateGateway'+ array1.join("")),
             data: {
                                                   physicalnetworkid: args.data.physicalnetworkid,
               vpcid: args.context.vpc[0].id,


[36/50] [abbrv] git commit: updated refs/heads/vmsync to d403974

Posted by ah...@apache.org.
Fixed VPC start - added internallb element to the list of supported providers


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

Branch: refs/heads/vmsync
Commit: 846729a3ab17919e4eb5c1181397e54b57603896
Parents: da74554
Author: Alena Prokharchyk <al...@citrix.com>
Authored: Fri May 10 09:07:03 2013 -0700
Committer: Alena Prokharchyk <al...@citrix.com>
Committed: Fri May 10 09:07:03 2013 -0700

----------------------------------------------------------------------
 .../src/com/cloud/network/vpc/VpcManagerImpl.java  |    1 +
 1 files changed, 1 insertions(+), 0 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/846729a3/server/src/com/cloud/network/vpc/VpcManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/vpc/VpcManagerImpl.java b/server/src/com/cloud/network/vpc/VpcManagerImpl.java
index 55656d8..3e6a598 100644
--- a/server/src/com/cloud/network/vpc/VpcManagerImpl.java
+++ b/server/src/com/cloud/network/vpc/VpcManagerImpl.java
@@ -1185,6 +1185,7 @@ public class VpcManagerImpl extends ManagerBase implements VpcManager, VpcProvis
             vpcElements = new ArrayList<VpcProvider>();
             vpcElements.add((VpcProvider)_ntwkModel.getElementImplementingProvider(Provider.VPCVirtualRouter.getName()));
             vpcElements.add((VpcProvider)_ntwkModel.getElementImplementingProvider(Provider.Netscaler.getName()));
+            vpcElements.add((VpcProvider)_ntwkModel.getElementImplementingProvider(Provider.InternalLbVm.getName()));
         }
 
         if (vpcElements == null) {


[45/50] [abbrv] Merged master to vmsync

Posted by ah...@apache.org.
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/d4039743/server/src/com/cloud/vm/VirtualMachineManagerImpl.java
----------------------------------------------------------------------
diff --cc server/src/com/cloud/vm/VirtualMachineManagerImpl.java
index 5a4f179,521b5e0..752eb73
--- a/server/src/com/cloud/vm/VirtualMachineManagerImpl.java
+++ b/server/src/com/cloud/vm/VirtualMachineManagerImpl.java
@@@ -32,29 -36,45 +32,46 @@@ import javax.ejb.Local
  import javax.inject.Inject;
  import javax.naming.ConfigurationException;
  
- import com.cloud.capacity.CapacityManager;
++import org.apache.log4j.Logger;
++
  import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager;
+ import org.apache.cloudstack.engine.subsystem.api.storage.StoragePoolAllocator;
+ import org.apache.cloudstack.engine.subsystem.api.storage.VolumeDataFactory;
 +import org.apache.cloudstack.framework.messagebus.MessageBus;
 +import org.apache.cloudstack.messagebus.TopicConstants;
  import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao;
- 
- import com.cloud.dc.*;
- import com.cloud.agent.api.*;
- import org.apache.log4j.Logger;
+ import org.apache.cloudstack.storage.datastore.db.StoragePoolVO;
 -import org.apache.log4j.Logger;
  
  import com.cloud.agent.AgentManager;
  import com.cloud.agent.AgentManager.OnError;
  import com.cloud.agent.Listener;
+ import com.cloud.agent.api.AgentControlAnswer;
+ import com.cloud.agent.api.AgentControlCommand;
+ import com.cloud.agent.api.Answer;
+ import com.cloud.agent.api.CheckVirtualMachineAnswer;
+ import com.cloud.agent.api.CheckVirtualMachineCommand;
+ import com.cloud.agent.api.ClusterSyncAnswer;
 -import com.cloud.agent.api.ClusterSyncCommand;
+ import com.cloud.agent.api.Command;
 -import com.cloud.agent.api.MigrateAnswer;
 -import com.cloud.agent.api.MigrateCommand;
+ import com.cloud.agent.api.PingRoutingCommand;
 -import com.cloud.agent.api.PrepareForMigrationAnswer;
 -import com.cloud.agent.api.PrepareForMigrationCommand;
+ import com.cloud.agent.api.RebootAnswer;
+ import com.cloud.agent.api.RebootCommand;
 -import com.cloud.agent.api.ScaleVmCommand;
+ import com.cloud.agent.api.StartAnswer;
+ import com.cloud.agent.api.StartCommand;
+ import com.cloud.agent.api.StartupCommand;
+ import com.cloud.agent.api.StartupRoutingCommand;
 -import com.cloud.agent.api.StartupRoutingCommand.VmState;
+ import com.cloud.agent.api.StopAnswer;
+ import com.cloud.agent.api.StopCommand;
  import com.cloud.agent.api.to.NicTO;
  import com.cloud.agent.api.to.VirtualMachineTO;
  import com.cloud.agent.manager.Commands;
  import com.cloud.agent.manager.allocator.HostAllocator;
  import com.cloud.alert.AlertManager;
 +import com.cloud.api.ApiSerializerHelper;
 +import com.cloud.async.AsyncJob;
 +import com.cloud.async.AsyncJobConstants;
 +import com.cloud.async.AsyncJobExecutionContext;
 +import com.cloud.async.AsyncJobManager;
+ import com.cloud.capacity.CapacityManager;
  import com.cloud.cluster.ClusterManager;
  import com.cloud.configuration.Config;
  import com.cloud.configuration.ConfigurationManager;
@@@ -133,16 -165,17 +164,16 @@@ import com.cloud.utils.exception.CloudR
  import com.cloud.utils.exception.ExecutionException;
  import com.cloud.utils.fsm.NoTransitionException;
  import com.cloud.utils.fsm.StateMachine2;
--import com.cloud.vm.ItWorkVO.Step;
  import com.cloud.vm.VirtualMachine.Event;
 +import com.cloud.vm.VirtualMachine.PowerState;
  import com.cloud.vm.VirtualMachine.State;
++import com.cloud.vm.VmWorkJobVO.Step;
  import com.cloud.vm.dao.NicDao;
  import com.cloud.vm.dao.UserVmDao;
+ import com.cloud.vm.dao.UserVmDetailsDao;
  import com.cloud.vm.dao.VMInstanceDao;
 -import com.cloud.vm.snapshot.VMSnapshot;
  import com.cloud.vm.snapshot.VMSnapshotManager;
 -import com.cloud.vm.snapshot.VMSnapshotVO;
  import com.cloud.vm.snapshot.dao.VMSnapshotDao;
- import com.cloud.vm.dao.UserVmDetailsDao;
  
  @Local(value = VirtualMachineManager.class)
  public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMachineManager, Listener {
@@@ -172,12 -207,8 +205,12 @@@
      protected DomainDao _domainDao;
      @Inject
      protected ClusterManager _clusterMgr;
 +   
- /*    
++/*
      @Inject
      protected ItWorkDao _workDao;
 +*/
 +    
      @Inject
      protected UserVmDao _userVmDao;
      @Inject
@@@ -229,10 -270,16 +272,16 @@@
  		this._hostAllocators = _hostAllocators;
  	}
  
 -    @Inject
 +	@Inject
+     protected List<StoragePoolAllocator> _storagePoolAllocators;
+ 
+     @Inject
      protected ResourceManager _resourceMgr;
 -
 +    
-     @Inject 
+     @Inject
+     protected SnapshotManager _snapshotMgr;
+ 
+     @Inject
      protected VMSnapshotManager _vmSnapshotMgr = null;
      @Inject
      protected ClusterDetailsDao  _clusterDetailsDao;
@@@ -243,11 -290,9 +292,13 @@@
      protected ConfigurationDao _configDao;
      @Inject
      VolumeManager volumeMgr;
 -
 +    
 +    @Inject protected MessageBus _messageBus;
 +    @Inject protected VirtualMachinePowerStateSync _syncMgr;
 +    @Inject protected VmWorkJobDao _workJobDao;
 +    @Inject protected AsyncJobManager _jobMgr;
+     @Inject
+     DeploymentPlanningManager _dpMgr;
  
      Map<VirtualMachine.Type, VirtualMachineGuru<? extends VMInstanceVO>> _vmGurus = new HashMap<VirtualMachine.Type, VirtualMachineGuru<? extends VMInstanceVO>>();
      protected StateMachine2<State, VirtualMachine.Event, VirtualMachine> _stateMachine;
@@@ -327,15 -359,15 +378,15 @@@
          }
  
          if (template.getFormat() == ImageFormat.ISO) {
--            this.volumeMgr.allocateRawVolume(Type.ROOT, "ROOT-" + vm.getId(), rootDiskOffering.first(), rootDiskOffering.second(), vm, owner);
++            volumeMgr.allocateRawVolume(Type.ROOT, "ROOT-" + vm.getId(), rootDiskOffering.first(), rootDiskOffering.second(), vm, owner);
          } else if (template.getFormat() == ImageFormat.BAREMETAL) {
              // Do nothing
          } else {
--            this.volumeMgr.allocateTemplatedVolume(Type.ROOT, "ROOT-" + vm.getId(), rootDiskOffering.first(), template, vm, owner);
++            volumeMgr.allocateTemplatedVolume(Type.ROOT, "ROOT-" + vm.getId(), rootDiskOffering.first(), template, vm, owner);
          }
  
          for (Pair<DiskOfferingVO, Long> offering : dataDiskOfferings) {
--            this.volumeMgr.allocateRawVolume(Type.DATADISK, "DATA-" + vm.getId(), offering.first(), offering.second(), vm, owner);
++            volumeMgr.allocateRawVolume(Type.DATADISK, "DATA-" + vm.getId(), offering.first(), offering.second(), vm, owner);
          }
  
          txn.commit();
@@@ -413,7 -450,8 +464,8 @@@
          s_logger.debug("Cleaning up NICS");
          _networkMgr.cleanupNics(profile);
          // Clean up volumes based on the vm's instance id
-         this.volumeMgr.cleanupVolumes(vm.getId());
+         List<VolumeVO> rootVol = _volsDao.findByInstanceAndType(vm.getId(), Volume.Type.ROOT);
 -        this.volumeMgr.cleanupVolumes(vm.getId());
++        volumeMgr.cleanupVolumes(vm.getId());
  
          VirtualMachineGuru<T> guru = getVmGuru(vm);
          guru.finalizeExpunge(vm);
@@@ -483,255 -550,143 +564,256 @@@
          }
      }
  
- /*    
--    protected boolean checkWorkItems(VMInstanceVO vm, State state) throws ConcurrentOperationException {
--        while (true) {
--            ItWorkVO vo = _workDao.findByOutstandingWork(vm.getId(), state);
--            if (vo == null) {
--                if (s_logger.isDebugEnabled()) {
--                    s_logger.debug("Unable to find work for VM: " + vm + " and state: " + state);
++    /*
++        protected boolean checkWorkItems(VMInstanceVO vm, State state) throws ConcurrentOperationException {
++            while (true) {
++                VmWorkJobVO vo = _workDao.findByOutstandingWork(vm.getId(), state);
++                if (vo == null) {
++                    if (s_logger.isDebugEnabled()) {
++                        s_logger.debug("Unable to find work for VM: " + vm + " and state: " + state);
++                    }
++                    return true;
                  }
--                return true;
--            }
  
--            if (vo.getStep() == Step.Done) {
--                if (s_logger.isDebugEnabled()) {
--                    s_logger.debug("Work for " + vm + " is " + vo.getStep());
++                if (vo.getStep() == Step.Done) {
++                    if (s_logger.isDebugEnabled()) {
++                        s_logger.debug("Work for " + vm + " is " + vo.getStep());
++                    }
++                    return true;
                  }
--                return true;
--            }
  
--            if (vo.getSecondsTaskIsInactive() > _cancelWait) {
--                s_logger.warn("The task item for vm " + vm + " has been inactive for " + vo.getSecondsTaskIsInactive());
--                return false;
--            }
++                if (vo.getSecondsTaskIsInactive() > _cancelWait) {
++                    s_logger.warn("The task item for vm " + vm + " has been inactive for " + vo.getSecondsTaskIsInactive());
++                    return false;
++                }
  
--            try {
--                Thread.sleep(_opWaitInterval);
--            } catch (InterruptedException e) {
--                s_logger.info("Waiting for " + vm + " but is interrupted");
--                throw new ConcurrentOperationException("Waiting for " + vm + " but is interrupted");
++                try {
++                    Thread.sleep(_opWaitInterval);
++                } catch (InterruptedException e) {
++                    s_logger.info("Waiting for " + vm + " but is interrupted");
++                    throw new ConcurrentOperationException("Waiting for " + vm + " but is interrupted");
++                }
++                s_logger.debug("Waiting some more to make sure there's no activity on " + vm);
              }
--            s_logger.debug("Waiting some more to make sure there's no activity on " + vm);
          }
-     }
- */
++    */
 +    
- /*    
-     @DB
-     protected <T extends VMInstanceVO> Ternary<T, ReservationContext, ItWorkVO> changeToStartState(VirtualMachineGuru<T> vmGuru, T vm, User caller, Account account)
-             throws ConcurrentOperationException {
-         long vmId = vm.getId();
++    /*
++        @DB
++        protected <T extends VMInstanceVO> Ternary<T, ReservationContext, VmWorkJobVO> changeToStartState(VirtualMachineGuru<T> vmGuru, T vm, User caller, Account account)
++                throws ConcurrentOperationException {
++            long vmId = vm.getId();
  
-         ItWorkVO work = new ItWorkVO(UUID.randomUUID().toString(), _nodeId, State.Starting, vm.getType(), vm.getId());
-         int retry = _lockStateRetry;
-         while (retry-- != 0) {
-             Transaction txn = Transaction.currentTxn();
-             Ternary<T, ReservationContext, ItWorkVO> result = null;
-             txn.start();
-             try {
-                 Journal journal = new Journal.LogJournal("Creating " + vm, s_logger);
-                 work = _workDao.persist(work);
-                 ReservationContextImpl context = new ReservationContextImpl(work.getId(), journal, caller, account);
 -    }
 -
 -    @DB
 -    protected <T extends VMInstanceVO> Ternary<T, ReservationContext, ItWorkVO> changeToStartState(VirtualMachineGuru<T> vmGuru, T vm, User caller, Account account)
 -            throws ConcurrentOperationException {
 -        long vmId = vm.getId();
 -
 -        ItWorkVO work = new ItWorkVO(UUID.randomUUID().toString(), _nodeId, State.Starting, vm.getType(), vm.getId());
 -        int retry = _lockStateRetry;
 -        while (retry-- != 0) {
 -            Transaction txn = Transaction.currentTxn();
 -            Ternary<T, ReservationContext, ItWorkVO> result = null;
 -            txn.start();
 -            try {
 -                Journal journal = new Journal.LogJournal("Creating " + vm, s_logger);
 -                work = _workDao.persist(work);
 -                ReservationContextImpl context = new ReservationContextImpl(work.getId(), journal, caller, account);
++            VmWorkJobVO work = new VmWorkJobVO(UUID.randomUUID().toString(), _nodeId, State.Starting, vm.getType(), vm.getId());
++            int retry = _lockStateRetry;
++            while (retry-- != 0) {
++                Transaction txn = Transaction.currentTxn();
++                Ternary<T, ReservationContext, VmWorkJobVO> result = null;
++                txn.start();
++                try {
++                    Journal journal = new Journal.LogJournal("Creating " + vm, s_logger);
++                    work = _workDao.persist(work);
++                    ReservationContextImpl context = new ReservationContextImpl(work.getId(), journal, caller, account);
  
--                if (stateTransitTo(vm, Event.StartRequested, null, work.getId())) {
++                    if (stateTransitTo(vm, Event.StartRequested, null, work.getId())) {
++                        if (s_logger.isDebugEnabled()) {
++                            s_logger.debug("Successfully transitioned to start state for " + vm + " reservation id = " + work.getId());
++                        }
++                        result = new Ternary<T, ReservationContext, VmWorkJobVO>(vmGuru.findById(vmId), context, work);
++                        txn.commit();
++                        return result;
++                    }
++                } catch (NoTransitionException e) {
                      if (s_logger.isDebugEnabled()) {
--                        s_logger.debug("Successfully transitioned to start state for " + vm + " reservation id = " + work.getId());
++                        s_logger.debug("Unable to transition into Starting state due to " + e.getMessage());
++                    }
++                } finally {
++                    if (result == null) {
++                        txn.rollback();
                      }
--                    result = new Ternary<T, ReservationContext, ItWorkVO>(vmGuru.findById(vmId), context, work);
--                    txn.commit();
--                    return result;
--                }
--            } catch (NoTransitionException e) {
--                if (s_logger.isDebugEnabled()) {
--                    s_logger.debug("Unable to transition into Starting state due to " + e.getMessage());
                  }
--            } finally {
--                if (result == null) {
--                    txn.rollback();
++
++                VMInstanceVO instance = _vmDao.findById(vmId);
++                if (instance == null) {
++                    throw new ConcurrentOperationException("Unable to acquire lock on " + vm);
                  }
--            }
  
--            VMInstanceVO instance = _vmDao.findById(vmId);
--            if (instance == null) {
--                throw new ConcurrentOperationException("Unable to acquire lock on " + vm);
--            }
++                if (s_logger.isDebugEnabled()) {
++                    s_logger.debug("Determining why we're unable to update the state to Starting for " + instance + ".  Retry=" + retry);
++                }
  
--            if (s_logger.isDebugEnabled()) {
--                s_logger.debug("Determining why we're unable to update the state to Starting for " + instance + ".  Retry=" + retry);
--            }
++                State state = instance.getState();
++                if (state == State.Running) {
++                    if (s_logger.isDebugEnabled()) {
++                        s_logger.debug("VM is already started: " + vm);
++                    }
++                    return null;
++                }
  
--            State state = instance.getState();
--            if (state == State.Running) {
--                if (s_logger.isDebugEnabled()) {
--                    s_logger.debug("VM is already started: " + vm);
++                if (state.isTransitional()) {
++                    if (!checkWorkItems(vm, state)) {
++                        throw new ConcurrentOperationException("There are concurrent operations on " + vm);
++                    } else {
++                        continue;
++                    }
                  }
--                return null;
--            }
  
--            if (state.isTransitional()) {
--                if (!checkWorkItems(vm, state)) {
--                    throw new ConcurrentOperationException("There are concurrent operations on " + vm);
--                } else {
--                    continue;
++                if (state != State.Stopped) {
++                    s_logger.debug("VM " + vm + " is not in a state to be started: " + state);
++                    return null;
                  }
              }
  
--            if (state != State.Stopped) {
--                s_logger.debug("VM " + vm + " is not in a state to be started: " + state);
--                return null;
--            }
++            throw new ConcurrentOperationException("Unable to change the state of " + vm);
          }
- 
-         throw new ConcurrentOperationException("Unable to change the state of " + vm);
-     }
- */
++    */
  
 +    @DB
 +    protected <T extends VMInstanceVO> Ternary<T, ReservationContext, VmWorkJobVO> changeToStartState(VirtualMachineGuru<T> vmGuru, T vm, User caller, Account account)
 +        throws ConcurrentOperationException {
 +    	
 +        long vmId = vm.getId();
 +        
 +        Ternary<T, ReservationContext, VmWorkJobVO> result = null;
 +        Transaction txn = Transaction.currentTxn();
 +        txn.start();
 +        try {
- 	        VmWorkJobVO work = this._workJobDao.findById(AsyncJobExecutionContext.getCurrentExecutionContext().getJob().getId());
++	        VmWorkJobVO work = _workJobDao.findById(AsyncJobExecutionContext.getCurrentExecutionContext().getJob().getId());
 +	        
 +	        Journal journal = new Journal.LogJournal("Creating " + vm, s_logger);
 +	        ReservationContextImpl context = new ReservationContextImpl(work.getUuid(), journal, caller, account);
 +	        if (stateTransitTo(vm, Event.StartRequested, null, work.getUuid())) {
 +	            if (s_logger.isDebugEnabled()) {
 +	                s_logger.debug("Successfully transitioned to start state for " + vm + " reservation id = " + work.getId());
 +	            }
 +	            result = new Ternary<T, ReservationContext, VmWorkJobVO>(vmGuru.findById(vmId), context, work);
 +	            txn.commit();
 +	            return result;
 +	        }
 +        } catch (NoTransitionException e) {
 +            s_logger.warn("Unable to transition into Starting state due to " + e.getMessage());
 +        } finally {
 +        	if(result == null)
 +        		txn.rollback();
 +        }
 +        
          throw new ConcurrentOperationException("Unable to change the state of " + vm);
      }
 -
 -    protected <T extends VMInstanceVO> boolean changeState(T vm, Event event, Long hostId, ItWorkVO work, Step step) throws NoTransitionException {
 +    
 +    protected <T extends VMInstanceVO> boolean changeState(T vm, Event event, Long hostId, VmWorkJobVO work, Step step) throws NoTransitionException {
          // FIXME: We should do this better.
 -        Step previousStep = work.getStep();
 -        _workDao.updateStep(work, step);
 +        VmWorkJobVO.Step previousStep = work.getStep();
 +        
          boolean result = false;
          try {
              result = stateTransitTo(vm, event, hostId);
              return result;
          } finally {
              if (!result) {
 -                _workDao.updateStep(work, previousStep);
 +            	work.setStep(previousStep);
-             	this._workJobDao.update(work.getId(), work);
++            	_workJobDao.update(work.getId(), work);
              }
          }
      }
 -
 +    
      @Override
      public <T extends VMInstanceVO> T advanceStart(T vm, Map<VirtualMachineProfile.Param, Object> params, User caller, Account account) throws InsufficientCapacityException,
 -    ConcurrentOperationException, ResourceUnavailableException {
 +    	ConcurrentOperationException, ResourceUnavailableException {
          return advanceStart(vm, params, caller, account, null);
      }
 +    
++    @Override
 +    @DB
 +    public <T extends VMInstanceVO> T advanceStart(final T vm, Map<VirtualMachineProfile.Param, Object> params, User caller, Account account, DeploymentPlan planToDeploy)
 +        throws InsufficientCapacityException, ConcurrentOperationException, ResourceUnavailableException {
 +    	
 +    	VmWorkJobVO workJob = null;
 +    	Transaction txn = Transaction.currentTxn();
 +    	try {
 +        	txn.start();
 +        	
 +        	_vmDao.lockRow(vm.getId(), true);
 +        	
 +        	List<VmWorkJobVO> pendingWorkJobs = _workJobDao.listPendingWorkJobs(
 +        		VirtualMachine.Type.Instance, vm.getId(), VmWorkConstants.VM_WORK_START);
 +        	
 +        	if(pendingWorkJobs != null && pendingWorkJobs.size() > 0) {
 +        		assert(pendingWorkJobs.size() == 1);
 +        		workJob = pendingWorkJobs.get(0);
 +        	} else {
 +        		workJob = new VmWorkJobVO();
 +        	
 +        		workJob.setDispatcher(VmWorkConstants.VM_WORK_JOB_DISPATCHER);
 +        		workJob.setCmd(VmWorkConstants.VM_WORK_START);
 +        		
 +        		workJob.setAccountId(account.getId());
 +        		workJob.setUserId(caller.getId());
 +        		workJob.setStep(VmWorkJobVO.Step.Starting);
 +        		workJob.setVmType(vm.getType());
 +        		workJob.setVmInstanceId(vm.getId());
 +
 +        		// save work context info (there are some duplications)
 +        		VmWorkStart workInfo = new VmWorkStart();
 +        		workInfo.setAccountId(account.getId());
 +        		workInfo.setUserId(caller.getId());
 +        		workInfo.setVmId(vm.getId());
 +        		workInfo.setPlan(planToDeploy);
 +        		workInfo.setParams(params);
 +        		workJob.setCmdInfo(ApiSerializerHelper.toSerializedString(workInfo));
 +        		
 +        		_jobMgr.submitAsyncJob(workJob, VmWorkConstants.VM_WORK_QUEUE, vm.getId());
 +        	}
 +    	
 +        	txn.commit();
 +    	} catch(Throwable e) {
 +    		s_logger.error("Unexpected exception", e);
 +    		txn.rollback();
 +    		throw new ConcurrentOperationException("Unhandled exception, converted to ConcurrentOperationException");
 +    	}
 +
 +    	final long jobId = workJob.getId();
 +    	
-     	AsyncJobExecutionContext.getCurrentExecutionContext().joinJob(jobId); 
++    	AsyncJobExecutionContext.getCurrentExecutionContext().joinJob(jobId);
 +
 +    	//
 +    	// TODO : this will be replaced with fully-asynchronized way later so that we don't need
 +    	// to wait here. The reason we do it synchronized here is that callers of advanceStart is expecting
 +    	// synchronized semantics
-     	// 
++    	//
 +    	//
 +    	_jobMgr.waitAndCheck(
-     		new String[] { TopicConstants.VM_POWER_STATE, TopicConstants.JOB_STATE }, 
++    		new String[] { TopicConstants.VM_POWER_STATE, TopicConstants.JOB_STATE },
 +    		3000L, 600000L, new Predicate() {
 +
 +				@Override
 +				public boolean checkCondition() {
 +					VMInstanceVO instance = _vmDao.findById(vm.getId());
 +					if(instance.getPowerState() == VirtualMachine.PowerState.PowerOn)
 +						return true;
 +			
 +					VmWorkJobVO workJob = _workJobDao.findById(jobId);
 +					if(workJob.getStatus() != AsyncJobConstants.STATUS_IN_PROGRESS)
 +						return true;
 +					
 +					return false;
 +				}
 +    		});
 +    	AsyncJobExecutionContext.getCurrentExecutionContext().disjoinJob(jobId);
 +    	
 +    	return vm;
 +    }
  
      @Override
 -    public <T extends VMInstanceVO> T advanceStart(T vm, Map<VirtualMachineProfile.Param, Object> params, User caller, Account account, DeploymentPlan planToDeploy)
 +    public <T extends VMInstanceVO> T processVmStartWork(T vm, Map<VirtualMachineProfile.Param, Object> params, User caller, Account account, DeploymentPlan planToDeploy)
              throws InsufficientCapacityException, ConcurrentOperationException, ResourceUnavailableException {
 -        long vmId = vm.getId();
          VirtualMachineGuru<T> vmGuru = getVmGuru(vm);
 -
          vm = vmGuru.findById(vm.getId());
 -        Ternary<T, ReservationContext, ItWorkVO> start = changeToStartState(vmGuru, vm, caller, account);
 -        if (start == null) {
 -            return vmGuru.findById(vmId);
 -        }
 +  
 +        Ternary<T, ReservationContext, VmWorkJobVO> start = changeToStartState(vmGuru, vm, caller, account);
 +        assert(start != null);
  
 -        vm = start.first();
          ReservationContext ctx = start.second();
 -        ItWorkVO work = start.third();
 +        VmWorkJobVO work = start.third();
  
          T startedVm = null;
          ServiceOfferingVO offering = _offeringDao.findById(vm.getServiceOfferingId());
@@@ -822,20 -780,15 +904,14 @@@
  
                  VirtualMachineProfileImpl<T> vmProfile = new VirtualMachineProfileImpl<T>(vm, template, offering, account, params);
                  DeployDestination dest = null;
-                 for (DeploymentPlanner planner : _planners) {
-                     if (planner.canHandle(vmProfile, plan, avoids)) {
-                         dest = planner.plan(vmProfile, plan, avoids);
-                     } else {
-                         continue;
-                     }
-                     if (dest != null) {
-                         avoids.addHost(dest.getHost().getId());
-                         AsyncJobExecutionContext.getCurrentExecutionContext().logJobJournal(
-                         	AsyncJob.JournalType.SUCCESS, "Deployment found, dest host: " + dest.getHost().getId(), null);
-                         break;
-                     }
-                 }
+                 try {
+                     dest = _dpMgr.planDeployment(vmProfile, plan, avoids);
+                 } catch (AffinityConflictException e2) {
+                     s_logger.warn("Unable to create deployment, affinity rules associted to the VM conflict", e2);
+                     throw new CloudRuntimeException(
+                             "Unable to create deployment, affinity rules associted to the VM conflict");
  
+                 }
 -
                  if (dest == null) {
                      if (planChangedByVolume) {
                          plan = originalPlan;
@@@ -847,6 -800,11 +923,13 @@@
                      throw new InsufficientServerCapacityException("Unable to create a deployment for " + vmProfile, DataCenter.class, plan.getDataCenterId());
                  }
  
+                 if (dest != null) {
+                     avoids.addHost(dest.getHost().getId());
 -                    journal.record("Deployment found ", vmProfile, dest);
++                    AsyncJobExecutionContext.getCurrentExecutionContext().logJobJournal(
++                            AsyncJob.JournalType.SUCCESS, "Deployment found, dest host: " + dest.getHost().getId(), null);
++                    break;
+                 }
+ 
                  long destHostId = dest.getHost().getId();
                  vm.setPodId(dest.getPod().getId());
                  Long cluster_id = dest.getCluster().getId();
@@@ -867,9 -825,9 +950,9 @@@
                      if (s_logger.isDebugEnabled()) {
                          s_logger.debug("VM is being created in podId: " + vm.getPodIdToDeployIn());
                      }
-                     _networkMgr.prepare(vmProfile, dest, ctx); 
+                     _networkMgr.prepare(vmProfile, dest, ctx);
                      if (vm.getHypervisorType() != HypervisorType.BareMetal) {
--                        this.volumeMgr.prepare(vmProfile, dest);
++                        volumeMgr.prepare(vmProfile, dest);
                      }
                      //since StorageMgr succeeded in volume creation, reuse Volume for further tries until current cluster has capacity
                      if(!reuseVolume){
@@@ -984,9 -946,14 +1067,14 @@@
              }
          }
  
+         if (startedVm == null) {
+             throw new CloudRuntimeException("Unable to start instance '" + vm.getHostName()
+                             + "' (" + vm.getUuid() + "), see management server log for details");
+         }
+ 
          return startedVm;
      }
 -
 +    
      @Override
      public <T extends VMInstanceVO> boolean stop(T vm, User user, Account account) throws ResourceUnavailableException {
          try {
@@@ -1080,96 -1047,34 +1168,96 @@@
              s_logger.warn("Unable to release some network resources.", e);
          }
  
--        this.volumeMgr.release(profile);
++        volumeMgr.release(profile);
          s_logger.debug("Successfully cleanued up resources for the vm " + vm + " in " + state + " state");
          return true;
      }
 +    
 +    @Override
 +    public <T extends VMInstanceVO> boolean advanceStop(final T vm, boolean forced, User user, Account account) throws AgentUnavailableException, OperationTimedoutException, ConcurrentOperationException {
 +    	VmWorkJobVO workJob = null;
 +    	Transaction txn = Transaction.currentTxn();
 +    	try {
 +        	txn.start();
 +        	
 +        	_vmDao.lockRow(vm.getId(), true);
 +        	
 +        	List<VmWorkJobVO> pendingWorkJobs = _workJobDao.listPendingWorkJobs(
 +        		VirtualMachine.Type.Instance, vm.getId(), VmWorkConstants.VM_WORK_STOP);
 +        	
 +        	if(pendingWorkJobs != null && pendingWorkJobs.size() > 0) {
 +        		assert(pendingWorkJobs.size() == 1);
 +        		workJob = pendingWorkJobs.get(0);
 +        	} else {
 +        		workJob = new VmWorkJobVO();
 +        	
 +        		workJob.setDispatcher(VmWorkConstants.VM_WORK_JOB_DISPATCHER);
 +        		workJob.setCmd(VmWorkConstants.VM_WORK_STOP);
 +        		
 +        		workJob.setAccountId(account.getId());
 +        		workJob.setUserId(user.getId());
 +        		workJob.setStep(VmWorkJobVO.Step.Prepare);
 +        		workJob.setVmType(vm.getType());
 +        		workJob.setVmInstanceId(vm.getId());
 +
 +        		// save work context info (there are some duplications)
 +        		VmWorkStop workInfo = new VmWorkStop();
 +        		workInfo.setAccountId(account.getId());
 +        		workInfo.setUserId(user.getId());
 +        		workInfo.setVmId(vm.getId());
 +        		workInfo.setForceStop(forced);
 +        		workJob.setCmdInfo(ApiSerializerHelper.toSerializedString(workInfo));
 +        		
 +        		_jobMgr.submitAsyncJob(workJob, VmWorkConstants.VM_WORK_QUEUE, vm.getId());
 +        	}
 +    	
 +        	txn.commit();
 +    	} catch(Throwable e) {
 +    		s_logger.error("Unexpected exception", e);
 +    		txn.rollback();
 +    		throw new ConcurrentOperationException("Unhandled exception, converted to ConcurrentOperationException");
 +    	}
 +
 +    	final long jobId = workJob.getId();
 +    	AsyncJobExecutionContext.getCurrentExecutionContext().joinJob(jobId);
 +    	
 +    	//
 +    	// TODO : this will be replaced with fully-asynchronized way later so that we don't need
 +    	// to wait here. The reason we do it synchronized here is that callers of advanceStart is expecting
 +    	// synchronized semantics
-     	// 
++    	//
 +    	//
 +    	_jobMgr.waitAndCheck(
-     		new String[] { TopicConstants.VM_POWER_STATE, TopicConstants.JOB_STATE }, 
++    		new String[] { TopicConstants.VM_POWER_STATE, TopicConstants.JOB_STATE },
 +    		3000L, 600000L, new Predicate() {
 +
 +				@Override
 +				public boolean checkCondition() {
 +					VMInstanceVO instance = _vmDao.findById(vm.getId());
 +					if(instance.getPowerState() == VirtualMachine.PowerState.PowerOff)
 +						return true;
 +			
 +					VmWorkJobVO workJob = _workJobDao.findById(jobId);
 +					if(workJob.getStatus() != AsyncJobConstants.STATUS_IN_PROGRESS)
 +						return true;
 +					
 +					return false;
 +				}
 +    		});
 +    	
 +    	try {
 +    		AsyncJobExecutionContext.getCurrentExecutionContext().disjoinJob(jobId);
 +    	} catch(Exception e) {
 +    		s_logger.error("Unexpected exception", e);
 +    		return false;
 +    	}
 +    	return true;
 +    }
  
      @Override
 -    public <T extends VMInstanceVO> boolean advanceStop(T vm, boolean forced, User user, Account account) throws AgentUnavailableException, OperationTimedoutException, ConcurrentOperationException {
 -        State state = vm.getState();
 -        if (state == State.Stopped) {
 -            if (s_logger.isDebugEnabled()) {
 -                s_logger.debug("VM is already stopped: " + vm);
 -            }
 -            return true;
 -        }
 +    public <T extends VMInstanceVO> boolean processVmStopWork(T vm, boolean forced, User user, Account account) throws AgentUnavailableException, OperationTimedoutException, ConcurrentOperationException {
 +        VmWorkJobVO work = _workJobDao.findById(AsyncJobExecutionContext.getCurrentExecutionContext().getJob().getId());
  
 -        if (state == State.Destroyed || state == State.Expunging || state == State.Error) {
 -            if (s_logger.isDebugEnabled()) {
 -                s_logger.debug("Stopped called on " + vm + " but the state is " + state);
 -            }
 -            return true;
 -        }
 -        // grab outstanding work item if any
 -        ItWorkVO work = _workDao.findByOutstandingWork(vm.getId(), vm.getState());
 -        if (work != null) {
 -            if (s_logger.isDebugEnabled()) {
 -                s_logger.debug("Found an outstanding work item for this vm " + vm + " with state:" + vm.getState() + ", work id:" + work.getId());
 -            }
 -        }
          Long hostId = vm.getHostId();
          if (hostId == null) {
              if (!forced) {
@@@ -1277,7 -1198,7 +1365,7 @@@
  
          try {
              if (vm.getHypervisorType() != HypervisorType.BareMetal) {
--                this.volumeMgr.release(profile);
++                volumeMgr.release(profile);
                  s_logger.debug("Successfully released storage resources for the vm " + vm);
              }
          } catch (Exception e) {
@@@ -1299,174 -1221,6 +1387,176 @@@
          }
      }
  
- /*    
-     @Override
-     public <T extends VMInstanceVO> boolean advanceStop(T vm, boolean forced, User user, Account account) throws AgentUnavailableException, OperationTimedoutException, ConcurrentOperationException {
-         State state = vm.getState();
-         if (state == State.Stopped) {
-             if (s_logger.isDebugEnabled()) {
-                 s_logger.debug("VM is already stopped: " + vm);
++    /*
++        @Override
++        public <T extends VMInstanceVO> boolean advanceStop(T vm, boolean forced, User user, Account account) throws AgentUnavailableException, OperationTimedoutException, ConcurrentOperationException {
++            State state = vm.getState();
++            if (state == State.Stopped) {
++                if (s_logger.isDebugEnabled()) {
++                    s_logger.debug("VM is already stopped: " + vm);
++                }
++                return true;
 +            }
-             return true;
-         }
 +
-         if (state == State.Destroyed || state == State.Expunging || state == State.Error) {
-             if (s_logger.isDebugEnabled()) {
-                 s_logger.debug("Stopped called on " + vm + " but the state is " + state);
-             }
-             return true;
-         }
-         // grab outstanding work item if any
-         ItWorkVO work = _workDao.findByOutstandingWork(vm.getId(), vm.getState());
-         if (work != null) {
-             if (s_logger.isDebugEnabled()) {
-                 s_logger.debug("Found an outstanding work item for this vm " + vm + " with state:" + vm.getState() + ", work id:" + work.getId());
-             }
-         }
-         Long hostId = vm.getHostId();
-         if (hostId == null) {
-             if (!forced) {
++            if (state == State.Destroyed || state == State.Expunging || state == State.Error) {
 +                if (s_logger.isDebugEnabled()) {
-                     s_logger.debug("HostId is null but this is not a forced stop, cannot stop vm " + vm + " with state:" + vm.getState());
++                    s_logger.debug("Stopped called on " + vm + " but the state is " + state);
 +                }
-                 return false;
-             }
-             try {
-                 stateTransitTo(vm, Event.AgentReportStopped, null, null);
-             } catch (NoTransitionException e) {
-                 s_logger.warn(e.getMessage());
++                return true;
 +            }
-             // mark outstanding work item if any as done
++            // grab outstanding work item if any
++            VmWorkJobVO work = _workDao.findByOutstandingWork(vm.getId(), vm.getState());
 +            if (work != null) {
 +                if (s_logger.isDebugEnabled()) {
-                     s_logger.debug("Updating work item to Done, id:" + work.getId());
++                    s_logger.debug("Found an outstanding work item for this vm " + vm + " with state:" + vm.getState() + ", work id:" + work.getId());
 +                }
-                 work.setStep(Step.Done);
-                 _workDao.update(work.getId(), work);
-             }
-             return true;
-         }
- 
-         VirtualMachineGuru<T> vmGuru = getVmGuru(vm);
-         VirtualMachineProfile<T> profile = new VirtualMachineProfileImpl<T>(vm);
- 
-         try {
-             if (!stateTransitTo(vm, Event.StopRequested, vm.getHostId())) {
-                 throw new ConcurrentOperationException("VM is being operated on.");
-             }
-         } catch (NoTransitionException e1) {
-             if (!forced) {
-                 throw new CloudRuntimeException("We cannot stop " + vm + " when it is in state " + vm.getState());
-             }
-             boolean doCleanup = false;
-             if (s_logger.isDebugEnabled()) {
-                 s_logger.debug("Unable to transition the state but we're moving on because it's forced stop");
 +            }
-             if (state == State.Starting || state == State.Migrating) {
++            Long hostId = vm.getHostId();
++            if (hostId == null) {
++                if (!forced) {
++                    if (s_logger.isDebugEnabled()) {
++                        s_logger.debug("HostId is null but this is not a forced stop, cannot stop vm " + vm + " with state:" + vm.getState());
++                    }
++                    return false;
++                }
++                try {
++                    stateTransitTo(vm, Event.AgentReportStopped, null, null);
++                } catch (NoTransitionException e) {
++                    s_logger.warn(e.getMessage());
++                }
++                // mark outstanding work item if any as done
 +                if (work != null) {
-                     doCleanup = true;
-                 } else {
 +                    if (s_logger.isDebugEnabled()) {
-                         s_logger.debug("Unable to cleanup VM: " + vm + " ,since outstanding work item is not found");
++                        s_logger.debug("Updating work item to Done, id:" + work.getId());
 +                    }
-                     throw new CloudRuntimeException("Work item not found, We cannot stop " + vm + " when it is in state " + vm.getState());
++                    work.setStep(Step.Done);
++                    _workDao.update(work.getId(), work);
 +                }
-             } else if (state == State.Stopping) {
-                 doCleanup = true;
++                return true;
 +            }
 +
-             if (doCleanup) {
-                 if (cleanup(vmGuru, new VirtualMachineProfileImpl<T>(vm), work, Event.StopRequested, forced, user, account)) {
-                     try {
++            VirtualMachineGuru<T> vmGuru = getVmGuru(vm);
++            VirtualMachineProfile<T> profile = new VirtualMachineProfileImpl<T>(vm);
++
++            try {
++                if (!stateTransitTo(vm, Event.StopRequested, vm.getHostId())) {
++                    throw new ConcurrentOperationException("VM is being operated on.");
++                }
++            } catch (NoTransitionException e1) {
++                if (!forced) {
++                    throw new CloudRuntimeException("We cannot stop " + vm + " when it is in state " + vm.getState());
++                }
++                boolean doCleanup = false;
++                if (s_logger.isDebugEnabled()) {
++                    s_logger.debug("Unable to transition the state but we're moving on because it's forced stop");
++                }
++                if (state == State.Starting || state == State.Migrating) {
++                    if (work != null) {
++                        doCleanup = true;
++                    } else {
 +                        if (s_logger.isDebugEnabled()) {
-                             s_logger.debug("Updating work item to Done, id:" + work.getId());
++                            s_logger.debug("Unable to cleanup VM: " + vm + " ,since outstanding work item is not found");
 +                        }
-                         return changeState(vm, Event.AgentReportStopped, null, work, Step.Done);
-                     } catch (NoTransitionException e) {
-                         s_logger.warn("Unable to cleanup " + vm);
-                         return false;
++                        throw new CloudRuntimeException("Work item not found, We cannot stop " + vm + " when it is in state " + vm.getState());
 +                    }
-                 } else {
-                     if (s_logger.isDebugEnabled()) {
-                         s_logger.debug("Failed to cleanup VM: " + vm);
++                } else if (state == State.Stopping) {
++                    doCleanup = true;
++                }
++
++                if (doCleanup) {
++                    if (cleanup(vmGuru, new VirtualMachineProfileImpl<T>(vm), work, Event.StopRequested, forced, user, account)) {
++                        try {
++                            if (s_logger.isDebugEnabled()) {
++                                s_logger.debug("Updating work item to Done, id:" + work.getId());
++                            }
++                            return changeState(vm, Event.AgentReportStopped, null, work, Step.Done);
++                        } catch (NoTransitionException e) {
++                            s_logger.warn("Unable to cleanup " + vm);
++                            return false;
++                        }
++                    } else {
++                        if (s_logger.isDebugEnabled()) {
++                            s_logger.debug("Failed to cleanup VM: " + vm);
++                        }
++                        throw new CloudRuntimeException("Failed to cleanup " + vm + " , current state " + vm.getState());
 +                    }
-                     throw new CloudRuntimeException("Failed to cleanup " + vm + " , current state " + vm.getState());
 +                }
 +            }
-         }
- 
-         if (vm.getState() != State.Stopping) {
-             throw new CloudRuntimeException("We cannot proceed with stop VM " + vm + " since it is not in 'Stopping' state, current state: " + vm.getState());
-         }
 +
-         vmGuru.prepareStop(profile);
-         
-         StopCommand stop = new StopCommand(vm);
-         boolean stopped = false;
-         StopAnswer answer = null;
-         try {
-             answer = (StopAnswer) _agentMgr.send(vm.getHostId(), stop);
-             stopped = answer.getResult();
-             if (!stopped) {
-                 throw new CloudRuntimeException("Unable to stop the virtual machine due to " + answer.getDetails());
++            if (vm.getState() != State.Stopping) {
++                throw new CloudRuntimeException("We cannot proceed with stop VM " + vm + " since it is not in 'Stopping' state, current state: " + vm.getState());
 +            }
-             vmGuru.finalizeStop(profile, answer);
 +
-         } catch (AgentUnavailableException e) {
-         } catch (OperationTimedoutException e) {
-         } finally {
-             if (!stopped) {
-                 if (!forced) {
-                     s_logger.warn("Unable to stop vm " + vm);
-                     try {
-                         stateTransitTo(vm, Event.OperationFailed, vm.getHostId());
-                     } catch (NoTransitionException e) {
-                         s_logger.warn("Unable to transition the state " + vm);
++            vmGuru.prepareStop(profile);
++            
++            StopCommand stop = new StopCommand(vm);
++            boolean stopped = false;
++            StopAnswer answer = null;
++            try {
++                answer = (StopAnswer) _agentMgr.send(vm.getHostId(), stop);
++                stopped = answer.getResult();
++                if (!stopped) {
++                    throw new CloudRuntimeException("Unable to stop the virtual machine due to " + answer.getDetails());
++                }
++                vmGuru.finalizeStop(profile, answer);
++
++            } catch (AgentUnavailableException e) {
++                s_logger.warn("Unable to stop vm, agent unavailable: " + e.toString());
++            } catch (OperationTimedoutException e) {
++                s_logger.warn("Unable to stop vm, operation timed out: " + e.toString());
++            } finally {
++                if (!stopped) {
++                    if (!forced) {
++                        s_logger.warn("Unable to stop vm " + vm);
++                        try {
++                            stateTransitTo(vm, Event.OperationFailed, vm.getHostId());
++                        } catch (NoTransitionException e) {
++                            s_logger.warn("Unable to transition the state " + vm);
++                        }
++                        return false;
++                    } else {
++                        s_logger.warn("Unable to actually stop " + vm + " but continue with release because it's a force stop");
++                        vmGuru.finalizeStop(profile, answer);
 +                    }
-                     return false;
-                 } else {
-                     s_logger.warn("Unable to actually stop " + vm + " but continue with release because it's a force stop");
-                     vmGuru.finalizeStop(profile, answer);
 +                }
 +            }
-         }
 +
-         if (s_logger.isDebugEnabled()) {
-             s_logger.debug(vm + " is stopped on the host.  Proceeding to release resource held.");
-         }
++            if (s_logger.isDebugEnabled()) {
++                s_logger.debug(vm + " is stopped on the host.  Proceeding to release resource held.");
++            }
 +
-         try {
-             _networkMgr.release(profile, forced);
-             s_logger.debug("Successfully released network resources for the vm " + vm);
-         } catch (Exception e) {
-             s_logger.warn("Unable to release some network resources.", e);
-         }
- 
-         try {
-             if (vm.getHypervisorType() != HypervisorType.BareMetal) {
-                 this.volumeMgr.release(profile);
-                 s_logger.debug("Successfully released storage resources for the vm " + vm);
++            try {
++                _networkMgr.release(profile, forced);
++                s_logger.debug("Successfully released network resources for the vm " + vm);
++            } catch (Exception e) {
++                s_logger.warn("Unable to release some network resources.", e);
 +            }
-         } catch (Exception e) {
-             s_logger.warn("Unable to release storage resources.", e);
-         }
 +
-         try {
-             if (work != null) {
-                 if (s_logger.isDebugEnabled()) {
-                     s_logger.debug("Updating the outstanding work item to Done, id:" + work.getId());
++            try {
++                if (vm.getHypervisorType() != HypervisorType.BareMetal) {
++                    this.volumeMgr.release(profile);
++                    s_logger.debug("Successfully released storage resources for the vm " + vm);
 +                }
-                 work.setStep(Step.Done);
-                 _workDao.update(work.getId(), work);
++            } catch (Exception e) {
++                s_logger.warn("Unable to release storage resources.", e);
 +            }
 +
-             return stateTransitTo(vm, Event.OperationSucceeded, null, null);
-         } catch (NoTransitionException e) {
-             s_logger.warn(e.getMessage());
-             return false;
++            try {
++                if (work != null) {
++                    if (s_logger.isDebugEnabled()) {
++                        s_logger.debug("Updating the outstanding work item to Done, id:" + work.getId());
++                    }
++                    work.setStep(Step.Done);
++                    _workDao.update(work.getId(), work);
++                }
++
++                return stateTransitTo(vm, Event.OperationSucceeded, null);
++            } catch (NoTransitionException e) {
++                s_logger.warn(e.getMessage());
++                return false;
++            }
 +        }
-     }
- */
++    */
      private void setStateMachine() {
          _stateMachine = VirtualMachine.State.getStateMachine();
      }
@@@ -1478,16 -1232,12 +1568,16 @@@
  
      @Override
      public boolean stateTransitTo(VMInstanceVO vm, VirtualMachine.Event e, Long hostId) throws NoTransitionException {
 +
 +/*
 + *  TODO ???
-  *      	
++ * 
          // if there are active vm snapshots task, state change is not allowed
 -        if(_vmSnapshotMgr.hasActiveVMSnapshotTasks(vm.getId())){
 +        if(_vmSnapshotMgr.hasActiveVMSnapshotTasks(vm.getId())) {
              s_logger.error("State transit with event: " + e + " failed due to: " + vm.getInstanceName() + " has active VM snapshots tasks");
              return false;
          }
- */        
 -
++*/
          State oldState = vm.getState();
          if (oldState == State.Starting) {
              if (e == Event.OperationSucceeded) {
@@@ -1567,7 -1317,7 +1657,7 @@@
          VirtualMachineProfile<VMInstanceVO> profile = new VirtualMachineProfileImpl<VMInstanceVO>(vm);
          boolean migrationResult = false;
          try {
--            migrationResult = this.volumeMgr.storageMigration(profile, destPool);
++            migrationResult = volumeMgr.storageMigration(profile, destPool);
  
              if (migrationResult) {
                  //if the vm is migrated to different pod in basic mode, need to reallocate ip
@@@ -1610,40 -1360,267 +1700,271 @@@
  
      @Override
      public <T extends VMInstanceVO> T migrate(T vm, long srcHostId, DeployDestination dest) throws ResourceUnavailableException, ConcurrentOperationException, ManagementServerException,
 -    VirtualMachineMigrationException {
 +    	VirtualMachineMigrationException {
          s_logger.info("Migrating " + vm + " to " + dest);
 +        
 +        return vm;
 +        
- /*
-         long dstHostId = dest.getHost().getId();
-         Host fromHost = _hostDao.findById(srcHostId);
-         if (fromHost == null) {
-             s_logger.info("Unable to find the host to migrate from: " + srcHostId);
-             throw new CloudRuntimeException("Unable to find the host to migrate from: " + srcHostId);
++        /*
++                long dstHostId = dest.getHost().getId();
++                Host fromHost = _hostDao.findById(srcHostId);
++                if (fromHost == null) {
++                    s_logger.info("Unable to find the host to migrate from: " + srcHostId);
++                    throw new CloudRuntimeException("Unable to find the host to migrate from: " + srcHostId);
++                }
+ 
 -        long dstHostId = dest.getHost().getId();
 -        Host fromHost = _hostDao.findById(srcHostId);
 -        if (fromHost == null) {
 -            s_logger.info("Unable to find the host to migrate from: " + srcHostId);
 -            throw new CloudRuntimeException("Unable to find the host to migrate from: " + srcHostId);
 -        }
++                if (fromHost.getClusterId().longValue() != dest.getCluster().getId()) {
++                    s_logger.info("Source and destination host are not in same cluster, unable to migrate to host: " + dest.getHost().getId());
++                    throw new CloudRuntimeException("Source and destination host are not in same cluster, unable to migrate to host: " + dest.getHost().getId());
++                }
+ 
 -        if (fromHost.getClusterId().longValue() != dest.getCluster().getId()) {
 -            s_logger.info("Source and destination host are not in same cluster, unable to migrate to host: " + dest.getHost().getId());
 -            throw new CloudRuntimeException("Source and destination host are not in same cluster, unable to migrate to host: " + dest.getHost().getId());
 -        }
++                VirtualMachineGuru<T> vmGuru = getVmGuru(vm);
+ 
 -        VirtualMachineGuru<T> vmGuru = getVmGuru(vm);
++                long vmId = vm.getId();
++                vm = vmGuru.findById(vmId);
++                if (vm == null) {
++                    if (s_logger.isDebugEnabled()) {
++                        s_logger.debug("Unable to find the vm " + vm);
++                    }
++                    throw new ManagementServerException("Unable to find a virtual machine with id " + vmId);
++                }
+ 
 -        long vmId = vm.getId();
 -        vm = vmGuru.findById(vmId);
 -        if (vm == null) {
 -            if (s_logger.isDebugEnabled()) {
 -                s_logger.debug("Unable to find the vm " + vm);
 -            }
 -            throw new ManagementServerException("Unable to find a virtual machine with id " + vmId);
 -        }
 -
 -        if (vm.getState() != State.Running) {
 -            if (s_logger.isDebugEnabled()) {
 -                s_logger.debug("VM is not Running, unable to migrate the vm " + vm);
 -            }
 -            throw new VirtualMachineMigrationException("VM is not Running, unable to migrate the vm currently " + vm + " , current state: " + vm.getState().toString());
 -        }
++                if (vm.getState() != State.Running) {
++                    if (s_logger.isDebugEnabled()) {
++                        s_logger.debug("VM is not Running, unable to migrate the vm " + vm);
++                    }
++                    throw new VirtualMachineMigrationException("VM is not Running, unable to migrate the vm currently " + vm + " , current state: " + vm.getState().toString());
++                }
+ 
 -        short alertType = AlertManager.ALERT_TYPE_USERVM_MIGRATE;
 -        if (VirtualMachine.Type.DomainRouter.equals(vm.getType())) {
 -            alertType = AlertManager.ALERT_TYPE_DOMAIN_ROUTER_MIGRATE;
 -        } else if (VirtualMachine.Type.ConsoleProxy.equals(vm.getType())) {
 -            alertType = AlertManager.ALERT_TYPE_CONSOLE_PROXY_MIGRATE;
 -        }
++                short alertType = AlertManager.ALERT_TYPE_USERVM_MIGRATE;
++                if (VirtualMachine.Type.DomainRouter.equals(vm.getType())) {
++                    alertType = AlertManager.ALERT_TYPE_DOMAIN_ROUTER_MIGRATE;
++                } else if (VirtualMachine.Type.ConsoleProxy.equals(vm.getType())) {
++                    alertType = AlertManager.ALERT_TYPE_CONSOLE_PROXY_MIGRATE;
++                }
+ 
 -        VirtualMachineProfile<VMInstanceVO> profile = new VirtualMachineProfileImpl<VMInstanceVO>(vm);
 -        _networkMgr.prepareNicForMigration(profile, dest);
 -        this.volumeMgr.prepareForMigration(profile, dest);
++                VirtualMachineProfile<VMInstanceVO> profile = new VirtualMachineProfileImpl<VMInstanceVO>(vm);
++                _networkMgr.prepareNicForMigration(profile, dest);
++                this.volumeMgr.prepareForMigration(profile, dest);
+ 
 -        VirtualMachineTO to = toVmTO(profile);
 -        PrepareForMigrationCommand pfmc = new PrepareForMigrationCommand(to);
++                VirtualMachineTO to = toVmTO(profile);
++                PrepareForMigrationCommand pfmc = new PrepareForMigrationCommand(to);
+ 
 -        ItWorkVO work = new ItWorkVO(UUID.randomUUID().toString(), _nodeId, State.Migrating, vm.getType(), vm.getId());
 -        work.setStep(Step.Prepare);
 -        work.setResourceType(ItWorkVO.ResourceType.Host);
 -        work.setResourceId(dstHostId);
 -        work = _workDao.persist(work);
++                VmWorkJobVO work = new VmWorkJobVO(UUID.randomUUID().toString(), _nodeId, State.Migrating, vm.getType(), vm.getId());
++                work.setStep(Step.Prepare);
++                work.setResourceType(VmWorkJobVO.ResourceType.Host);
++                work.setResourceId(dstHostId);
++                work = _workDao.persist(work);
+ 
 -        PrepareForMigrationAnswer pfma = null;
 -        try {
 -            pfma = (PrepareForMigrationAnswer) _agentMgr.send(dstHostId, pfmc);
 -            if (!pfma.getResult()) {
 -                String msg = "Unable to prepare for migration due to " + pfma.getDetails();
 -                pfma = null;
 -                throw new AgentUnavailableException(msg, dstHostId);
 -            }
 -        } catch (OperationTimedoutException e1) {
 -            throw new AgentUnavailableException("Operation timed out", dstHostId);
 -        } finally {
 -            if (pfma == null) {
 -                work.setStep(Step.Done);
 -                _workDao.update(work.getId(), work);
 -            }
 -        }
++                PrepareForMigrationAnswer pfma = null;
++                try {
++                    pfma = (PrepareForMigrationAnswer) _agentMgr.send(dstHostId, pfmc);
++                    if (!pfma.getResult()) {
++                        String msg = "Unable to prepare for migration due to " + pfma.getDetails();
++                        pfma = null;
++                        throw new AgentUnavailableException(msg, dstHostId);
++                    }
++                } catch (OperationTimedoutException e1) {
++                    throw new AgentUnavailableException("Operation timed out", dstHostId);
++                } finally {
++                    if (pfma == null) {
++                        work.setStep(Step.Done);
++                        _workDao.update(work.getId(), work);
++                    }
++                }
+ 
 -        vm.setLastHostId(srcHostId);
 -        try {
 -            if (vm == null || vm.getHostId() == null || vm.getHostId() != srcHostId || !changeState(vm, Event.MigrationRequested, dstHostId, work, Step.Migrating)) {
 -                s_logger.info("Migration cancelled because state has changed: " + vm);
 -                throw new ConcurrentOperationException("Migration cancelled because state has changed: " + vm);
 -            }
 -        } catch (NoTransitionException e1) {
 -            s_logger.info("Migration cancelled because " + e1.getMessage());
 -            throw new ConcurrentOperationException("Migration cancelled because " + e1.getMessage());
 -        }
++                vm.setLastHostId(srcHostId);
++                try {
++                    if (vm == null || vm.getHostId() == null || vm.getHostId() != srcHostId || !changeState(vm, Event.MigrationRequested, dstHostId, work, Step.Migrating)) {
++                        s_logger.info("Migration cancelled because state has changed: " + vm);
++                        throw new ConcurrentOperationException("Migration cancelled because state has changed: " + vm);
++                    }
++                } catch (NoTransitionException e1) {
++                    s_logger.info("Migration cancelled because " + e1.getMessage());
++                    throw new ConcurrentOperationException("Migration cancelled because " + e1.getMessage());
++                }
+ 
 -        boolean migrated = false;
 -        try {
 -            boolean isWindows = _guestOsCategoryDao.findById(_guestOsDao.findById(vm.getGuestOSId()).getCategoryId()).getName().equalsIgnoreCase("Windows");
 -            MigrateCommand mc = new MigrateCommand(vm.getInstanceName(), dest.getHost().getPrivateIpAddress(), isWindows);
 -            mc.setHostGuid(dest.getHost().getGuid());
++                boolean migrated = false;
++                try {
++                    boolean isWindows = _guestOsCategoryDao.findById(_guestOsDao.findById(vm.getGuestOSId()).getCategoryId()).getName().equalsIgnoreCase("Windows");
++                    MigrateCommand mc = new MigrateCommand(vm.getInstanceName(), dest.getHost().getPrivateIpAddress(), isWindows);
++                    mc.setHostGuid(dest.getHost().getGuid());
+ 
 -            try {
 -                MigrateAnswer ma = (MigrateAnswer) _agentMgr.send(vm.getLastHostId(), mc);
 -                if (!ma.getResult()) {
 -                    s_logger.error("Unable to migrate due to " + ma.getDetails());
 -                    return null;
 -                }
 -            } catch (OperationTimedoutException e) {
 -                if (e.isActive()) {
 -                    s_logger.warn("Active migration command so scheduling a restart for " + vm);
 -                    _haMgr.scheduleRestart(vm, true);
 -                }
 -                throw new AgentUnavailableException("Operation timed out on migrating " + vm, dstHostId);
 -            }
++                    try {
++                        MigrateAnswer ma = (MigrateAnswer) _agentMgr.send(vm.getLastHostId(), mc);
++                        if (!ma.getResult()) {
++                            s_logger.error("Unable to migrate due to " + ma.getDetails());
++                            return null;
++                        }
++                    } catch (OperationTimedoutException e) {
++                        if (e.isActive()) {
++                            s_logger.warn("Active migration command so scheduling a restart for " + vm);
++                            _haMgr.scheduleRestart(vm, true);
++                        }
++                        throw new AgentUnavailableException("Operation timed out on migrating " + vm, dstHostId);
++                    }
+ 
 -            try {
 -                if (!changeState(vm, VirtualMachine.Event.OperationSucceeded, dstHostId, work, Step.Started)) {
 -                    throw new ConcurrentOperationException("Unable to change the state for " + vm);
 -                }
 -            } catch (NoTransitionException e1) {
 -                throw new ConcurrentOperationException("Unable to change state due to " + e1.getMessage());
 -            }
++                    try {
++                        if (!changeState(vm, VirtualMachine.Event.OperationSucceeded, dstHostId, work, Step.Started)) {
++                            throw new ConcurrentOperationException("Unable to change the state for " + vm);
++                        }
++                    } catch (NoTransitionException e1) {
++                        throw new ConcurrentOperationException("Unable to change state due to " + e1.getMessage());
++                    }
+ 
 -            try {
 -                if (!checkVmOnHost(vm, dstHostId)) {
 -                    s_logger.error("Unable to complete migration for " + vm);
+                     try {
 -                        _agentMgr.send(srcHostId, new Commands(cleanup(vm)), null);
 -                    } catch (AgentUnavailableException e) {
 -                        s_logger.error("AgentUnavailableException while cleanup on source host: " + srcHostId);
++                        if (!checkVmOnHost(vm, dstHostId)) {
++                            s_logger.error("Unable to complete migration for " + vm);
++                            try {
++                                _agentMgr.send(srcHostId, new Commands(cleanup(vm)), null);
++                            } catch (AgentUnavailableException e) {
++                                s_logger.error("AgentUnavailableException while cleanup on source host: " + srcHostId);
++                            }
++                            cleanup(vmGuru, new VirtualMachineProfileImpl<T>(vm), work, Event.AgentReportStopped, true, _accountMgr.getSystemUser(), _accountMgr.getSystemAccount());
++                            return null;
++                        }
++                    } catch (OperationTimedoutException e) {
+                     }
 -                    cleanup(vmGuru, new VirtualMachineProfileImpl<T>(vm), work, Event.AgentReportStopped, true, _accountMgr.getSystemUser(), _accountMgr.getSystemAccount());
 -                    return null;
 -                }
 -            } catch (OperationTimedoutException e) {
 -            }
+ 
 -            migrated = true;
 -            return vm;
 -        } finally {
 -            if (!migrated) {
 -                s_logger.info("Migration was unsuccessful.  Cleaning up: " + vm);
++                    migrated = true;
++                    return vm;
++                } finally {
++                    if (!migrated) {
++                        s_logger.info("Migration was unsuccessful.  Cleaning up: " + vm);
+ 
 -                _alertMgr.sendAlert(alertType, fromHost.getDataCenterId(), fromHost.getPodId(), "Unable to migrate vm " + vm.getInstanceName() + " from host " + fromHost.getName() + " in zone "
 -                        + dest.getDataCenter().getName() + " and pod " + dest.getPod().getName(), "Migrate Command failed.  Please check logs.");
 -                try {
 -                    _agentMgr.send(dstHostId, new Commands(cleanup(vm)), null);
 -                } catch (AgentUnavailableException ae) {
 -                    s_logger.info("Looks like the destination Host is unavailable for cleanup");
 -                }
++                        _alertMgr.sendAlert(alertType, fromHost.getDataCenterId(), fromHost.getPodId(), "Unable to migrate vm " + vm.getInstanceName() + " from host " + fromHost.getName() + " in zone "
++                                + dest.getDataCenter().getName() + " and pod " + dest.getPod().getName(), "Migrate Command failed.  Please check logs.");
++                        try {
++                            _agentMgr.send(dstHostId, new Commands(cleanup(vm)), null);
++                        } catch (AgentUnavailableException ae) {
++                            s_logger.info("Looks like the destination Host is unavailable for cleanup");
++                        }
+ 
 -                try {
 -                    stateTransitTo(vm, Event.OperationFailed, srcHostId);
 -                } catch (NoTransitionException e) {
 -                    s_logger.warn(e.getMessage());
 -                }
 -            }
++                        try {
++                            stateTransitTo(vm, Event.OperationFailed, srcHostId);
++                        } catch (NoTransitionException e) {
++                            s_logger.warn(e.getMessage());
++                        }
++                    }
+ 
 -            work.setStep(Step.Done);
 -            _workDao.update(work.getId(), work);
 -        }
++                    work.setStep(Step.Done);
++                    _workDao.update(work.getId(), work);
++                }
++        */
+     }
+ 
+     private Map<VolumeVO, StoragePoolVO> getPoolListForVolumesForMigration(VirtualMachineProfile<VMInstanceVO> profile,
+             Host host, Map<VolumeVO, StoragePoolVO> volumeToPool) {
+         List<VolumeVO> allVolumes = _volsDao.findUsableVolumesForInstance(profile.getId());
+         for (VolumeVO volume : allVolumes) {
+             StoragePoolVO pool = volumeToPool.get(volume);
+             DiskOfferingVO diskOffering = _diskOfferingDao.findById(volume.getDiskOfferingId());
+             StoragePoolVO currentPool = _storagePoolDao.findById(volume.getPoolId());
+             if (pool != null) {
+                 // Check if pool is accessible from the destination host and disk offering with which the volume was
+                 // created is compliant with the pool type.
+                 if (_poolHostDao.findByPoolHost(pool.getId(), host.getId()) == null ||
+                         pool.isLocal() != diskOffering.getUseLocalStorage()) {
+                     // Cannot find a pool for the volume. Throw an exception.
+                     throw new CloudRuntimeException("Cannot migrate volume " + volume + " to storage pool " + pool +
+                             " while migrating vm to host " + host + ". Either the pool is not accessible from the " +
+                             "host or because of the offering with which the volume is created it cannot be placed on " +
+                             "the given pool.");
+                 } else if (pool.getId() == currentPool.getId()){
+                     // If the pool to migrate too is the same as current pool, remove the volume from the list of
+                     // volumes to be migrated.
+                     volumeToPool.remove(volume);
+                 }
+             } else {
+                 // Find a suitable pool for the volume. Call the storage pool allocator to find the list of pools.
+                 DiskProfile diskProfile = new DiskProfile(volume, diskOffering, profile.getHypervisorType());
+                 DataCenterDeployment plan = new DataCenterDeployment(host.getDataCenterId(), host.getPodId(),
+                         host.getClusterId(), host.getId(), null, null);
+                 ExcludeList avoid = new ExcludeList();
+                 boolean currentPoolAvailable = false;
+ 
+                 for (StoragePoolAllocator allocator : _storagePoolAllocators) {
+                     List<StoragePool> poolList = allocator.allocateToPool(diskProfile, profile, plan, avoid,
+                             StoragePoolAllocator.RETURN_UPTO_ALL);
+                     if (poolList != null && !poolList.isEmpty()) {
+                         // Volume needs to be migrated. Pick the first pool from the list. Add a mapping to migrate the
+                         // volume to a pool only if it is required; that is the current pool on which the volume resides
+                         // is not available on the destination host.
+                         if (poolList.contains(currentPool)) {
+                             currentPoolAvailable = true;
+                         } else {
+                             volumeToPool.put(volume, _storagePoolDao.findByUuid(poolList.get(0).getUuid()));
+                         }
+ 
+                         break;
+                     }
+                 }
+ 
+                 if (!currentPoolAvailable && !volumeToPool.containsKey(volume)) {
+                     // Cannot find a pool for the volume. Throw an exception.
+                     throw new CloudRuntimeException("Cannot find a storage pool which is available for volume " +
+                             volume + " while migrating virtual machine " + profile.getVirtualMachine() + " to host " +
+                             host);
+                 }
+             }
+         }
+ 
+         return volumeToPool;
+     }
+ 
 -    private <T extends VMInstanceVO> void moveVmToMigratingState(T vm, Long hostId, ItWorkVO work)
++    private <T extends VMInstanceVO> void moveVmToMigratingState(T vm, Long hostId, VmWorkJobVO work)
+             throws ConcurrentOperationException {
+         // Put the vm in migrating state.
+         try {
+             if (!changeState(vm, Event.MigrationRequested, hostId, work, Step.Migrating)) {
+                 s_logger.info("Migration cancelled because state has changed: " + vm);
+                 throw new ConcurrentOperationException("Migration cancelled because state has changed: " + vm);
+             }
+         } catch (NoTransitionException e) {
+             s_logger.info("Migration cancelled because " + e.getMessage());
+             throw new ConcurrentOperationException("Migration cancelled because " + e.getMessage());
          }
+     }
  
-         if (fromHost.getClusterId().longValue() != dest.getCluster().getId()) {
-             s_logger.info("Source and destination host are not in same cluster, unable to migrate to host: " + dest.getHost().getId());
-             throw new CloudRuntimeException("Source and destination host are not in same cluster, unable to migrate to host: " + dest.getHost().getId());
 -    private <T extends VMInstanceVO> void moveVmOutofMigratingStateOnSuccess(T vm, Long hostId, ItWorkVO work)
++    private <T extends VMInstanceVO> void moveVmOutofMigratingStateOnSuccess(T vm, Long hostId, VmWorkJobVO work)
+             throws ConcurrentOperationException {
+         // Put the vm in running state.
+         try {
+             if (!changeState(vm, Event.OperationSucceeded, hostId, work, Step.Started)) {
+                 s_logger.error("Unable to change the state for " + vm);
+                 throw new ConcurrentOperationException("Unable to change the state for " + vm);
+             }
+         } catch (NoTransitionException e) {
+             s_logger.error("Unable to change state due to " + e.getMessage());
+             throw new ConcurrentOperationException("Unable to change state due to " + e.getMessage());
          }
+     }
+ 
+     @Override
+     public <T extends VMInstanceVO> T migrateWithStorage(T vm, long srcHostId, long destHostId,
+             Map<VolumeVO, StoragePoolVO> volumeToPool) throws ResourceUnavailableException, ConcurrentOperationException,
+             ManagementServerException, VirtualMachineMigrationException {
  
+         HostVO srcHost = _hostDao.findById(srcHostId);
+         HostVO destHost = _hostDao.findById(destHostId);
          VirtualMachineGuru<T> vmGuru = getVmGuru(vm);
  
+         DataCenterVO dc = _dcDao.findById(destHost.getDataCenterId());
+         HostPodVO pod = _podDao.findById(destHost.getPodId());
+         Cluster cluster = _clusterDao.findById(destHost.getClusterId());
+         DeployDestination destination = new DeployDestination(dc, pod, cluster, destHost);
+ 
+         // Create a map of which volume should go in which storage pool.
          long vmId = vm.getId();
          vm = vmGuru.findById(vmId);
-         if (vm == null) {
-             if (s_logger.isDebugEnabled()) {
-                 s_logger.debug("Unable to find the vm " + vm);
-             }
-             throw new ManagementServerException("Unable to find a virtual machine with id " + vmId);
-         }
+         VirtualMachineProfile<VMInstanceVO> profile = new VirtualMachineProfileImpl<VMInstanceVO>(vm);
+         volumeToPool = getPoolListForVolumesForMigration(profile, destHost, volumeToPool);
  
-         if (vm.getState() != State.Running) {
-             if (s_logger.isDebugEnabled()) {
-                 s_logger.debug("VM is not Running, unable to migrate the vm " + vm);
-             }
-             throw new VirtualMachineMigrationException("VM is not Running, unable to migrate the vm currently " + vm + " , current state: " + vm.getState().toString());
+         // If none of the volumes have to be migrated, fail the call. Administrator needs to make a call for migrating
+         // a vm and not migrating a vm with storage.
+         if (volumeToPool.isEmpty()) {
+             throw new InvalidParameterValueException("Migration of the vm " + vm + "from host " + srcHost +
+                     " to destination host " + destHost + " doesn't involve migrating the volumes.");
          }
  
          short alertType = AlertManager.ALERT_TYPE_USERVM_MIGRATE;
@@@ -1653,80 -1630,34 +1974,35 @@@
              alertType = AlertManager.ALERT_TYPE_CONSOLE_PROXY_MIGRATE;
          }
  
-         VirtualMachineProfile<VMInstanceVO> profile = new VirtualMachineProfileImpl<VMInstanceVO>(vm);
-         _networkMgr.prepareNicForMigration(profile, dest);
-         this.volumeMgr.prepareForMigration(profile, dest);
- 
-         VirtualMachineTO to = toVmTO(profile);
-         PrepareForMigrationCommand pfmc = new PrepareForMigrationCommand(to);
+         _networkMgr.prepareNicForMigration(profile, destination);
 -        this.volumeMgr.prepareForMigration(profile, destination);
++        volumeMgr.prepareForMigration(profile, destination);
+         HypervisorGuru hvGuru = _hvGuruMgr.getGuru(vm.getHypervisorType());
+         VirtualMachineTO to = hvGuru.implement(profile);
  
--        ItWorkVO work = new ItWorkVO(UUID.randomUUID().toString(), _nodeId, State.Migrating, vm.getType(), vm.getId());
--        work.setStep(Step.Prepare);
--        work.setResourceType(ItWorkVO.ResourceType.Host);
-         work.setResourceId(dstHostId);
-         work = _workDao.persist(work);
- 
-         PrepareForMigrationAnswer pfma = null;
-         try {
-             pfma = (PrepareForMigrationAnswer) _agentMgr.send(dstHostId, pfmc);
-             if (!pfma.getResult()) {
-                 String msg = "Unable to prepare for migration due to " + pfma.getDetails();
-                 pfma = null;
-                 throw new AgentUnavailableException(msg, dstHostId);
-             }
-         } catch (OperationTimedoutException e1) {
-             throw new AgentUnavailableException("Operation timed out", dstHostId);
-         } finally {
-             if (pfma == null) {
-                 work.setStep(Step.Done);
-                 _workDao.update(work.getId(), work);
-             }
-         }
 -        work.setResourceId(destHostId);
 -        work = _workDao.persist(work);
++        VmWorkJobVO work = new VmWorkJobVO();
++//        VmWorkJobVO work = new VmWorkJobVO(UUID.randomUUID().toString(), _nodeId, State.Migrating, vm.getType(), vm.getId());
++//        work.setStep(Step.Prepare);
++//        work.setResourceType(ItWorkVO.ResourceType.Host);
++//        work.setResourceId(destHostId);
++//        work = _workDao.persist(work);
  
+         // Put the vm in migrating state.
          vm.setLastHostId(srcHostId);
-         try {
-             if (vm == null || vm.getHostId() == null || vm.getHostId() != srcHostId || !changeState(vm, Event.MigrationRequested, dstHostId, work, Step.Migrating)) {
-                 s_logger.info("Migration cancelled because state has changed: " + vm);
-                 throw new ConcurrentOperationException("Migration cancelled because state has changed: " + vm);
-             }
-         } catch (NoTransitionException e1) {
-             s_logger.info("Migration cancelled because " + e1.getMessage());
-             throw new ConcurrentOperationException("Migration cancelled because " + e1.getMessage());
-         }
+         moveVmToMigratingState(vm, destHostId, work);
  
          boolean migrated = false;
          try {
-             boolean isWindows = _guestOsCategoryDao.findById(_guestOsDao.findById(vm.getGuestOSId()).getCategoryId()).getName().equalsIgnoreCase("Windows");
-             MigrateCommand mc = new MigrateCommand(vm.getInstanceName(), dest.getHost().getPrivateIpAddress(), isWindows);
-             mc.setHostGuid(dest.getHost().getGuid());
+             // Migrate the vm and its volume.
 -            this.volumeMgr.migrateVolumes(vm, to, srcHost, destHost, volumeToPool);
++            volumeMgr.migrateVolumes(vm, to, srcHost, destHost, volumeToPool);
  
-             try {
-                 MigrateAnswer ma = (MigrateAnswer) _agentMgr.send(vm.getLastHostId(), mc);
-                 if (!ma.getResult()) {
-                     s_logger.error("Unable to migrate due to " + ma.getDetails());
-                     return null;
-                 }
-             } catch (OperationTimedoutException e) {
-                 if (e.isActive()) {
-                     s_logger.warn("Active migration command so scheduling a restart for " + vm);
-                     _haMgr.scheduleRestart(vm, true);
-                 }
-                 throw new AgentUnavailableException("Operation timed out on migrating " + vm, dstHostId);
-             }
+             // Put the vm back to running state.
+             moveVmOutofMigratingStateOnSuccess(vm, destHost.getId(), work);
  
              try {
-                 if (!changeState(vm, VirtualMachine.Event.OperationSucceeded, dstHostId, work, Step.Started)) {
-                     throw new ConcurrentOperationException("Unable to change the state for " + vm);
-                 }
-             } catch (NoTransitionException e1) {
-                 throw new ConcurrentOperationException("Unable to change state due to " + e1.getMessage());
-             }
- 
-             try {
-                 if (!checkVmOnHost(vm, dstHostId)) {
-                     s_logger.error("Unable to complete migration for " + vm);
+                 if (!checkVmOnHost(vm, destHostId)) {
+                     s_logger.error("Vm not found on destination host. Unable to complete migration for " + vm);
                      try {
-                         _agentMgr.send(srcHostId, new Commands(cleanup(vm)), null);
+                         _agentMgr.send(srcHostId, new Commands(cleanup(vm.getInstanceName())), null);
                      } catch (AgentUnavailableException e) {
                          s_logger.error("AgentUnavailableException while cleanup on source host: " + srcHostId);
                      }
@@@ -1758,9 -1688,8 +2033,8 @@@
              }
  
              work.setStep(Step.Done);
--            _workDao.update(work.getId(), work);
++            // FIXME  _workDao.update(work.getId(), work);
          }
- */        
      }
  
      @Override
@@@ -1768,47 -1697,45 +2042,47 @@@
          HypervisorGuru hvGuru = _hvGuruMgr.getGuru(profile.getVirtualMachine().getHypervisorType());
          VirtualMachineTO to = hvGuru.implement(profile);
          return to;
 -    }
 +    	}
  
      protected void cancelWorkItems(long nodeId) {
- /*    	
--        GlobalLock scanLock = GlobalLock.getInternLock("vmmgr.cancel.workitem");
++        /*
++                GlobalLock scanLock = GlobalLock.getInternLock("vmmgr.cancel.workitem");
  
--        try {
--            if (scanLock.lock(3)) {
                  try {
--                    List<ItWorkVO> works = _workDao.listWorkInProgressFor(nodeId);
--                    for (ItWorkVO work : works) {
--                        s_logger.info("Handling unfinished work item: " + work);
++                    if (scanLock.lock(3)) {
                          try {
--                            VMInstanceVO vm = _vmDao.findById(work.getInstanceId());
--                            if (vm != null) {
--                                if (work.getType() == State.Starting) {
--                                    _haMgr.scheduleRestart(vm, true);
--                                    work.setManagementServerId(_nodeId);
--                                    _workDao.update(work.getId(), work);
--                                } else if (work.getType() == State.Stopping) {
--                                    _haMgr.scheduleStop(vm, vm.getHostId(), WorkType.CheckStop);
--                                    work.setManagementServerId(_nodeId);
--                                    _workDao.update(work.getId(), work);
--                                } else if (work.getType() == State.Migrating) {
--                                    _haMgr.scheduleMigration(vm);
--                                    work.setStep(Step.Done);
--                                    _workDao.update(work.getId(), work);
++                            List<VmWorkJobVO> works = _workDao.listWorkInProgressFor(nodeId);
++                            for (VmWorkJobVO work : works) {
++                                s_logger.info("Handling unfinished work item: " + work);
++                                try {
++                                    VMInstanceVO vm = _vmDao.findById(work.getInstanceId());
++                                    if (vm != null) {
++                                        if (work.getType() == State.Starting) {
++                                            _haMgr.scheduleRestart(vm, true);
++                                            work.setManagementServerId(_nodeId);
++                                            _workDao.update(work.getId(), work);
++                                        } else if (work.getType() == State.Stopping) {
++                                            _haMgr.scheduleStop(vm, vm.getHostId(), WorkType.CheckStop);
++                                            work.setManagementServerId(_nodeId);
++                                            _workDao.update(work.getId(), work);
++                                        } else if (work.getType() == State.Migrating) {
++                                            _haMgr.scheduleMigration(vm);
++                                            work.setStep(Step.Done);
++                                            _workDao.update(work.getId(), work);
++                                        }
++                                    }
++                                } catch (Exception e) {
++                                    s_logger.error("Error while handling " + work, e);
                                  }
                              }
--                        } catch (Exception e) {
--                            s_logger.error("Error while handling " + work, e);
++                        } finally {
++                            scanLock.unlock();
                          }
                      }
                  } finally {
--                    scanLock.unlock();
++                    scanLock.releaseRef();
                  }
--            }
--        } finally {
--            scanLock.releaseRef();
--        }
- */        
++        */
      }
  
      @Override
@@@ -1836,25 -1763,23 +2110,23 @@@
  
          DeployDestination dest = null;
          while (true) {
-             for (DeploymentPlanner planner : _planners) {
-                 if (planner.canHandle(profile, plan, excludes)) {
-                     dest = planner.plan(profile, plan, excludes);
-                 } else {
-                     continue;
+ 
+             try {
+                 dest = _dpMgr.planDeployment(profile, plan, excludes);
+             } catch (AffinityConflictException e2) {
+                 s_logger.warn("Unable to create deployment, affinity rules associted to the VM conflict", e2);
+                 throw new CloudRuntimeException(
+                         "Unable to create deployment, affinity rules associted to the VM conflict");
 -            }
 +                }
  
 -            if (dest != null) {
 -                if (s_logger.isDebugEnabled()) {
 +                if (dest != null) {
 +                    if (s_logger.isDebugEnabled()) {
-                         s_logger.debug("Planner " + planner + " found " + dest + " for migrating to.");
-                     }
-                     break;
+                     s_logger.debug("Found destination " + dest + " for migrating to.");
                  }
+             } else {
                  if (s_logger.isDebugEnabled()) {
-                     s_logger.debug("Planner " + planner + " was unable to find anything.");
+                     s_logger.debug("Unable to find destination for migrating the vm " + profile);
                  }
-             }
- 
-             if (dest == null) {
                  throw new InsufficientServerCapacityException("Unable to find a server to migrate to.", host.getClusterId());
              }
  
@@@ -1899,21 -1823,11 +2171,21 @@@
          @Override
          public void run() {
              s_logger.trace("VM Operation Thread Running");
 +            
 +            try {
 +	            Date cutDate = DateUtil.currentGMTTime();
 +	            cutDate = new Date(cutDate.getTime() - 60000);
 +	            _workJobDao.expungeCompletedWorkJobs(cutDate);
 +            } catch(Throwable e) {
 +            	s_logger.error("Unexpected exception", e);
 +            }
- /*            
++/*
              try {
                  _workDao.cleanup(_cleanupWait);
              } catch (Exception e) {
                  s_logger.error("VM Operations failed due to ", e);
              }
- */            
++*/
          }
      }
  
@@@ -1987,8 -1901,8 +2259,8 @@@
      public Command cleanup(String vmName) {
          return new StopCommand(vmName);
      }
 -
 +/*
-     public Commands fullHostSync(final long hostId, StartupRoutingCommand startup) {  
+     public Commands fullHostSync(final long hostId, StartupRoutingCommand startup) {
          Commands commands = new Commands(OnError.Continue);
  
          Map<Long, AgentVmInfo> infos = convertToInfos(startup);
@@@ -2112,132 -2029,138 +2384,132 @@@
              }
          }
      }
 -
 +*/
  
      public void fullSync(final long clusterId, Map<String, Pair<String, State>> newStates) {
- /*    	
--        if (newStates==null)return;
--        Map<Long, AgentVmInfo> infos = convertToInfos(newStates);
--        Set<VMInstanceVO> set_vms = Collections.synchronizedSet(new HashSet<VMInstanceVO>());
--        set_vms.addAll(_vmDao.listByClusterId(clusterId));
--        set_vms.addAll(_vmDao.listLHByClusterId(clusterId));
--
--        for (VMInstanceVO vm : set_vms) {
--            AgentVmInfo info =  infos.remove(vm.getId());
--            VMInstanceVO castedVm = null;
-             
-             // sync VM Snapshots related transient states
-             List<VMSnapshotVO> vmSnapshotsInExpungingStates = _vmSnapshotDao.listByInstanceId(vm.getId(), VMSnapshot.State.Expunging, VMSnapshot.State.Cre

<TRUNCATED>
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/d4039743/server/test/com/cloud/vm/MockUserVmManagerImpl.java
----------------------------------------------------------------------


[35/50] [abbrv] git commit: updated refs/heads/vmsync to d403974

Posted by ah...@apache.org.
CLOUDSTACK-893 conceptual info around gslb


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

Branch: refs/heads/vmsync
Commit: da74554ba1cce53a939d115cab04ce965b68617b
Parents: 530b0be
Author: Radhika PC <ra...@citrix.com>
Authored: Fri May 10 18:26:10 2013 +0530
Committer: Radhika PC <ra...@citrix.com>
Committed: Fri May 10 18:26:46 2013 +0530

----------------------------------------------------------------------
 .../external-firewalls-and-load-balancers.xml      |    1 +
 docs/en-US/gslb.xml                                |  654 ++++++++++-----
 docs/en-US/images/gslb.png                         |  Bin 184080 -> 60354 bytes
 docs/en-US/networks.xml                            |    3 +-
 4 files changed, 426 insertions(+), 232 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/da74554b/docs/en-US/external-firewalls-and-load-balancers.xml
----------------------------------------------------------------------
diff --git a/docs/en-US/external-firewalls-and-load-balancers.xml b/docs/en-US/external-firewalls-and-load-balancers.xml
index b947daf..42ecacf 100644
--- a/docs/en-US/external-firewalls-and-load-balancers.xml
+++ b/docs/en-US/external-firewalls-and-load-balancers.xml
@@ -29,5 +29,6 @@
     xmlns:xi="http://www.w3.org/2001/XInclude"/>
   <xi:include href="ongoing-config-of-external-firewalls-lb.xml"
     xmlns:xi="http://www.w3.org/2001/XInclude"/>
+  <xi:include href="load-balancer-rules.xml" xmlns:xi="http://www.w3.org/2001/XInclude"/>
   <xi:include href="autoscale.xml" xmlns:xi="http://www.w3.org/2001/XInclude"/>
 </section>

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/da74554b/docs/en-US/gslb.xml
----------------------------------------------------------------------
diff --git a/docs/en-US/gslb.xml b/docs/en-US/gslb.xml
index ac17d61..2303331 100644
--- a/docs/en-US/gslb.xml
+++ b/docs/en-US/gslb.xml
@@ -26,7 +26,7 @@
     achieve this by extending its functionality of integrating with NetScaler Application Delivery
     Controller (ADC), which also provides various GSLB capabilities, such as disaster recovery and
     load balancing. The DNS redirection technique is used to achieve GSLB in &PRODUCT;. </para>
-  <para>In order to support his functionality, region level services and service provider are
+  <para>In order to support this functionality, region level services and service provider are
     introduced. A new service 'GSLB' is introduced as a region level service. The GSLB service
     provider is introduced that will provider the GSLB service. Currently, NetScaler is the
     supported GSLB provider in &PRODUCT;. GSLB functionality works in an Active-Active data center
@@ -40,264 +40,456 @@
       multiple data centers situated at geographically separated locations. GSLB can also provide an
       alternate location for accessing a resource in the event of a failure, or to provide a means
       of shifting traffic easily to simplify maintenance, or both.</para>
-  </section>
-  <section id="gslb-comp">
-    <title>Components of GSLB</title>
-    <para>A typical GSLB environment is comprised of the following components:</para>
-    <itemizedlist>
-      <listitem>
-        <para><emphasis role="bold">GSLB Site</emphasis>: In &PRODUCT;terminology, GSLB sites are
-          represented by zones that are mapped to data centers, each of which has various network
-          appliances. Each GSLB site is managed by a NetScaler appliance that is local to that site.
-          Each of these appliances treats its own site as the local site and all other sites,
-          managed by other appliances, as remote sites.</para>
-      </listitem>
-      <listitem>
-        <para><emphasis role="bold">GSLB Services</emphasis>: A GSLB service is typically
-          represented by a load balancing or content switching virtual server. In a GSLB
-          environment, you can have a local as well as remote GSLB services. A local GSLB service
-          represents a local load balancing or content switching virtual server. A remote GSLB
-          service is the one configured at one of the other sites in the GSLB setup. At each site in
-          the GSLB setup, you can create one local GSLB service and any number of remote GSLB
-          services.</para>
-      </listitem>
-      <listitem>
-        <para><emphasis role="bold">GSLB Virtual Servers</emphasis>: A GSLB virtual server refers to
-          one or more GSLB services and balances traffic between traffic across the VMs in multiple
-          zones by using the &PRODUCT; functionality. It evaluates the configured GSLB methods or
-          algorithms to select a GSLB service to which to send the client requests. One or more
-          virtual servers from different zones are bound to the GSLB virtual server. GSLB virtual
-          server does not have a public IP associated with it, instead it will have a FQDN DNS
-          name.</para>
-      </listitem>
-      <listitem>
-        <para><emphasis role="bold">Load Balancing or Content Switching Virtual Servers</emphasis>:
-          According to Citrix NetScaler terminology, a load balancing or content switching virtual
-          server represents one or many servers on the local network. Clients send their requests to
-          the load balancing or content switching virtual server’s virtual IP (VIP) address, and the
-          virtual server balances the load across the local servers. After a GSLB virtual server
-          selects a GSLB service representing either a local or a remote load balancing or content
-          switching virtual server, the client sends the request to that virtual server’s VIP
-          address.</para>
-      </listitem>
-      <listitem>
-        <para><emphasis role="bold">DNS VIPs</emphasis>: DNS virtual IP represents a load balancing
-          DNS virtual server on the GSLB service provider. The DNS requests for domains for which
-          the GSLB service provider is authoritative can be sent to a DNS VIP.</para>
-      </listitem>
-      <listitem>
-        <para><emphasis role="bold">ADNS</emphasis>: ADNS (Authoritative Domain Name Server) is a
-          service that provides actual answer to DNS queries, such as web site IP address. In a GSLB
-          environment, an ADNS service responds only to DNS requests for domains for which the GSLB
-          service provider is authoritative. When an ADNS service is configured, the service
-          provider owns that IP address and advertises it. When you create an ADNS service, the
-          NetScaler responds to DNS queries on the configured ADNS service IP and port.</para>
-      </listitem>
-    </itemizedlist>
-  </section>
-  <section id="prereq-gslb">
-    <title>Prerequisites and Guidelines</title>
-    <itemizedlist>
-      <listitem>
-        <para>The GSLB functionality is supported both Basic and Advanced zones.</para>
-      </listitem>
-      <listitem>
-        <para>GSLB is added as a new network service.</para>
-      </listitem>
-      <listitem>
-        <para>GSLB service provider can be added to a physical network in a zone.</para>
-      </listitem>
-      <listitem>
-        <para>The admin is allowed to enable or disable GSLB functionality at region level.</para>
-      </listitem>
-      <listitem>
-        <para>The admin is allowed to configure a zone as GSLB capable or enabled. </para>
-        <para>A zone shall be considered as GSLB capable only if a GSLB service provider is
-          provisioned in the zone.</para>
-      </listitem>
-      <listitem>
-        <para>When users have VMs deployed in multiple availability zones which are GSLB enabled,
-          they can use the GSLB functionality to load balance traffic across the VMs in multiple
-          zones.</para>
-      </listitem>
-      <listitem>
-        <para>The users can use GSLB to load balance across the VMs across zones in a region only if
-          the admin has enabled GSLB in that region. </para>
-      </listitem>
-      <listitem>
-        <para>The users can load balance traffic across the availability zones in the same region or
-          different regions.</para>
-      </listitem>
-      <listitem>
-        <para>The admin can configure DNS name for the entire cloud.</para>
-      </listitem>
-      <listitem>
-        <para>The users can specify an unique name across the cloud for a globally load balanced
-          service. The provided name is used as the domain name under the DNS name associated with
-          the cloud.</para>
-        <para>The user-provided name along with the admin-provided DNS name is used to produce a
-          globally resolvable FQDN for the globally load balanced service of the user. For example,
-          if the admin has configured xyztelco.com as the DNS name for the cloud, and user specifies
-          'foo' for the GSLB virtual service, then the FQDN name of the GSLB virtual service is
-          foo.xyztelco.com.</para>
-      </listitem>
-      <listitem>
-        <para>While setting up GSLB, users can select a load balancing method, such as round robin,
-          for using across the zones that are part of GSLB.</para>
-      </listitem>
-      <listitem>
-        <para>The user shall be able to set weight to zone-level virtual server. Weight shall be
-          considered by the load balancing method for distributing the traffic.</para>
-      </listitem>
-      <listitem>
-        <para>The GSLB functionality shall support session persistence, where series of client
-          requests for particular domain name is sent to a virtual server on the same zone. </para>
-        <para>Statistics is collected from each GSLB virtual server.</para>
-      </listitem>
-    </itemizedlist>
+    <section id="gslb-comp">
+      <title>Components of GSLB</title>
+      <para>A typical GSLB environment is comprised of the following components:</para>
+      <itemizedlist>
+        <listitem>
+          <para><emphasis role="bold">GSLB Site</emphasis>: In &PRODUCT;terminology, GSLB sites are
+            represented by zones that are mapped to data centers, each of which has various network
+            appliances. Each GSLB site is managed by a NetScaler appliance that is local to that
+            site. Each of these appliances treats its own site as the local site and all other
+            sites, managed by other appliances, as remote sites. It is the central entity in a GSLB
+            deployment, and is represented by a name and an IP address.</para>
+        </listitem>
+        <listitem>
+          <para><emphasis role="bold">GSLB Services</emphasis>: A GSLB service is typically
+            represented by a load balancing or content switching virtual server. In a GSLB
+            environment, you can have a local as well as remote GSLB services. A local GSLB service
+            represents a local load balancing or content switching virtual server. A remote GSLB
+            service is the one configured at one of the other sites in the GSLB setup. At each site
+            in the GSLB setup, you can create one local GSLB service and any number of remote GSLB
+            services.</para>
+        </listitem>
+        <listitem>
+          <para><emphasis role="bold">GSLB Virtual Servers</emphasis>: A GSLB virtual server refers
+            to one or more GSLB services and balances traffic between traffic across the VMs in
+            multiple zones by using the &PRODUCT; functionality. It evaluates the configured GSLB
+            methods or algorithms to select a GSLB service to which to send the client requests. One
+            or more virtual servers from different zones are bound to the GSLB virtual server. GSLB
+            virtual server does not have a public IP associated with it, instead it will have a FQDN
+            DNS name.</para>
+        </listitem>
+        <listitem>
+          <para><emphasis role="bold">Load Balancing or Content Switching Virtual
+            Servers</emphasis>: According to Citrix NetScaler terminology, a load balancing or
+            content switching virtual server represents one or many servers on the local network.
+            Clients send their requests to the load balancing or content switching virtual server’s
+            virtual IP (VIP) address, and the virtual server balances the load across the local
+            servers. After a GSLB virtual server selects a GSLB service representing either a local
+            or a remote load balancing or content switching virtual server, the client sends the
+            request to that virtual server’s VIP address.</para>
+        </listitem>
+        <listitem>
+          <para><emphasis role="bold">DNS VIPs</emphasis>: DNS virtual IP represents a load
+            balancing DNS virtual server on the GSLB service provider. The DNS requests for domains
+            for which the GSLB service provider is authoritative can be sent to a DNS VIP.</para>
+        </listitem>
+        <listitem>
+          <para><emphasis role="bold">Authoritative DNS</emphasis>: ADNS (Authoritative Domain Name
+            Server) is a service that provides actual answer to DNS queries, such as web site IP
+            address. In a GSLB environment, an ADNS service responds only to DNS requests for
+            domains for which the GSLB service provider is authoritative. When an ADNS service is
+            configured, the service provider owns that IP address and advertises it. When you create
+            an ADNS service, the NetScaler responds to DNS queries on the configured ADNS service IP
+            and port.</para>
+        </listitem>
+      </itemizedlist>
+    </section>
+    <section id="concept-gslb">
+      <title>How Does GSLB Works in &PRODUCT;?</title>
+      <para>Global server load balancing is used to manage the traffic flow to a web site hosted on
+        two separate zones that ideally are in different geographic locations. The following is an
+        illustration of how GLSB functionality is provided in &PRODUCT;: An organization, xyztelco,
+        has set up a public cloud that spans two zones, Zone-1 and Zone-2, across geographically
+        separated data centers that are managed by &PRODUCT;. Tenant-A of the cloud launches a
+        highly available solution by using xyztelco cloud. For that purpose, they launch two
+        instances each in both the zones: VM1 and VM2 in Zone-1 and VM5 and VM6 in Zone-2. Tenant-A
+        acquires a public IP, IP-1 in Zone-1, and configures a load balancer rule to load balance
+        the traffic between VM1 and VM2 instances. &PRODUCT; orchestrates setting up a virtual
+        server on the LB service provider in Zone-1. Virtual server 1 that is set up on the LB
+        service provider in Zone-1 represents a publicly accessible virtual server that client
+        reaches at IP-1. The client traffic to virtual server 1 at IP-1 will be load balanced across
+        VM1 and VM2 instances. </para>
+      <para>Tenant-A acquires another public IP, IP-2 in Zone-2 and sets up a load balancer rule to
+        load balance the traffic between VM5 and VM6 instances. Similarly in Zone-2, &PRODUCT;
+        orchestrates setting up a virtual server on the LB service provider. Virtual server 2 that
+        is setup on the LB service provider in Zone-2 represents a publicly accessible virtual
+        server that client reaches at IP-2. The client traffic that reaches virtual server 2 at IP-2
+        is load balanced across VM5 and VM6 instances. At this point Tenant-A has the service
+        enabled in both the zones, but has no means to set up a disaster recovery plan if one of the
+        zone fails. Additionally, there is no way for Tenant-A to load balance the traffic
+        intelligently to one of the zones based on load, proximity and so on. The cloud
+        administrator of xyztelco provisions a GSLB service provider to both the zones. A GSLB
+        provider is typically an ADC that has the ability to act as an ADNS (Authoritative Domain
+        Name Server) and has the mechanism to monitor health of virtual servers both at local and
+        remote sites. The cloud admin enables GSLB as a service to the tenants that use zones 1 and
+        2. </para>
+      <mediaobject>
+        <imageobject>
+          <imagedata fileref="./images/gslb.png"/>
+        </imageobject>
+        <textobject>
+          <phrase>gslb.png: GSLB architecture</phrase>
+        </textobject>
+      </mediaobject>
+      <para>Tenant-A wishes to leverage the GSLB service provided by the xyztelco cloud. Tenant-A
+        configures a GSLB rule to load balance traffic across virtual server 1 at Zone-1 and virtual
+        server 2 at Zone-2. The domain name is provided as A.xyztelco.com. &PRODUCT; orchestrates
+        setting up GSLB virtual server 1 on the GSLB service provider at Zone-1. &PRODUCT; binds
+        virtual server 1 of Zone-1 and virtual server 2 of Zone-2 to GLSB virtual server 1. GSLB
+        virtual server 1 is configured to start monitoring the health of virtual server 1 and 2 in
+        Zone-1. &PRODUCT; will also orchestrate setting up GSLB virtual server 2 on GSLB service
+        provider at Zone-2. &PRODUCT; will bind virtual server 1 of Zone-1 and virtual server 2 of
+        Zone-2 to GLSB virtual server 2. GSLB virtual server 2 is configured to start monitoring the
+        health of virtual server 1 and 2. &PRODUCT; will bind the domain A.xyztelco.com to both the
+        GSLB virtual server 1 and 2. At this point, Tenant-A service will be globally reachable at
+        A.xyztelco.com. The private DNS server for the domain xyztelcom.com is configured by the
+        admin out-of-band to resolve the domain A.xyztelco.com to the GSLB providers at both the
+        zones, which are configured as ADNS for the domain A.xyztelco.com. A client when sends a DNS
+        request to resolve A.xyztelcom.com, will eventually get DNS delegation to the address of
+        GSLB providers at zone 1 and 2. A client DNS request will be received by the GSLB provider.
+        The GSLB provider, depending on the domain for which it needs to resolve, will pick up the
+        GSLB virtual server associated with the domain. Depending on the health of the virtual
+        servers being load balanced, DNS request for the domain will be resolved to the public IP
+        associated with the selected virtual server.</para>
+    </section>
   </section>
   <section id="gslb-workflow">
     <title>Configuring GSLB</title>
+    <para>A GSLB deployment is the logical collection of GSLB virtual server, GSLB service, LB
+      virtual server, service, domain, and ADNS service. To create a GSLB site, you must configure
+      load balancing in the zone. You must create GSLB vservers and GSLB services for each site. You
+      must bind GSLB services to GSLB vservers. You must then create an ADNS service that provides
+      the IP address of the best performing site to the client's request. A GSLB vserver is an
+      entity that performs load balancing for the domains bound to it by returning the IP address of
+      the best GSLB service. A GSLB service is a representation of the load balancing/content
+      switching vserver. An LB vserver load balances incoming traffic by identifying the best
+      server, then directs traffic to the corresponding service. It can also load-balance external
+      DNS name servers. Services are entities that represent the servers. The domain is the domain
+      name for which the system is the authoritative DNS server. By creating an ADNS service, the
+      system can be configured as an authoritative DNS server.</para>
     <para>To configure GSLB in your cloud environment, as a cloud administrator you must perform the
       following.</para>
     <para>To configure such a GSLB setup, you must first configure a standard load balancing setup
-      for each server farm or data center. This enables you to balance load across the different
-      servers in each server farm. Then, configure both NetScaler appliances as authoritative DNS
-      (ADNS) servers. Next, create a GSLB site for each server farm, configure GSLB virtual servers
-      for each site, create GLSB services, and bind the GSLB services to the GSLB virtual servers.
-      Finally, bind the domain to the GSLB virtual servers. The GSLB configurations on the two
-      appliances at the two different sites are identical, although each sites load-balancing
-      configuration is specific to that site.</para>
+      for each zone. This enables you to balance load across the different servers in each zone in
+      the region. Then, configure both NetScaler appliances that you plan to add to each zone as
+      authoritative DNS (ADNS) servers. Next, create a GSLB site for each zone, configure GSLB
+      virtual servers for each site, create GLSB services, and bind the GSLB services to the GSLB
+      virtual servers. Finally, bind the domain to the GSLB virtual servers. The GSLB configurations
+      on the two appliances at the two different sites are identical, although each sites
+      load-balancing configuration is specific to that site.</para>
+    <para>Perform the following as a cloud administrator. As per the above example, the
+      administrator of xyztelco is the one who sets up GSLB:</para>
     <orderedlist>
       <listitem>
-        <para/>
-      </listitem>
-    </orderedlist>
-  </section>
-  <section id="gslb-add">
-    <title>Adding a GSLB Rule</title>
-    <orderedlist>
-      <listitem>
-        <para>Log in to the &PRODUCT; UI as administrator.</para>
-      </listitem>
-      <listitem>
-        <para>In the left navigation pane, click Region.</para>
-      </listitem>
-      <listitem>
-        <para>Select the region for which you want to create a GSLB rule.</para>
-      </listitem>
-      <listitem>
-        <para>In the Details tab, click View GSLB.</para>
-      </listitem>
-      <listitem>
-        <para>Click Add GSLB.</para>
-        <para>The Add GSLB page is displayed as follows:</para>
-        <mediaobject>
-          <imageobject>
-            <imagedata fileref="./images/add-gslb.png"/>
-          </imageobject>
-          <textobject>
-            <phrase>gslb-add.png: adding a gslb rule</phrase>
-          </textobject>
-        </mediaobject>
+        <para>In the cloud.dns.name global parameter, specify the DNS name of your tenant's cloud
+          that make use of the GSLB service.</para>
       </listitem>
       <listitem>
-        <para>Specify the following:</para>
-        <itemizedlist>
+        <para>On the NetScaler side, configure GSLB as given in <ulink
+            url="http://support.citrix.com/proddocs/topic/netscaler-traffic-management-10-map/ns-gslb-config-con.html"
+            >Configuring Global Server Load Balancing (GSLB)</ulink>:</para>
+        <orderedlist>
           <listitem>
-            <para><emphasis role="bold">Name</emphasis>: Name for the GSLB rule.</para>
+            <para>Configuring a standard load balancing setup.</para>
           </listitem>
           <listitem>
-            <para><emphasis role="bold">Description</emphasis>: (Optional) A short description of
-              the GSLB rule that can be displayed to users.</para>
+            <para>Configure Authoritative DNS, as explained in <ulink
+                url="http://support.citrix.com/proddocs/topic/netscaler-traffic-management-10-map/ns-gslb-config-adns-svc-tsk.html"
+                >Configuring an Authoritative DNS Service</ulink>.</para>
           </listitem>
           <listitem>
-            <para><emphasis role="bold">GSLB Domain Name</emphasis>: A preferred domain name for the
-              service.</para>
+            <para>Configure a GSLB site with site name formed from the domain name details.</para>
+            <para>For more information, see <ulink
+                url="http://support.citrix.com/proddocs/topic/netscaler-traffic-management-10-map/ns-gslb-config-basic-site-tsk.html"
+                >Configuring a Basic GSLB Site</ulink>.</para>
           </listitem>
           <listitem>
-            <para><emphasis role="bold">Algorithm</emphasis>: (Optional) The algorithm to use to
-              load balance the traffic across the zones. The options are Round Robin, Least
-              Connection, and Proximity.</para>
+            <para>Configure a GSLB virtual server.</para>
+            <para>For more information, see <ulink
+                url="http://support.citrix.com/proddocs/topic/netscaler-traffic-management-10-map/ns-gslb-config-vsvr-tsk.html"
+                >Configuring a GSLB Virtual Server</ulink>.</para>
           </listitem>
           <listitem>
-            <para><emphasis role="bold">Service Type</emphasis>: The transport protocol to use for
-              GSLB. The options are TCP and UDP.</para>
+            <para>Configure a GSLB service for each virtual server.</para>
+            <para>For more information, see <ulink
+                url="http://support.citrix.com/proddocs/topic/netscaler-traffic-management-10-map/ns-gslb-config-svc-tsk.html"
+                >Configuring a GSLB Service</ulink>.</para>
           </listitem>
           <listitem>
-            <para><emphasis role="bold">Domain</emphasis>: (Optional) The domain for which you want
-              to create the GSLB rule.</para>
+            <para>Bind the GSLB services to the GSLB virtual server.</para>
+            <para>For more information, see <ulink
+                url="http://support.citrix.com/proddocs/topic/netscaler-traffic-management-10-map/ns-gslb-bind-svc-vsvr-tsk.html"
+                >Binding GSLB Services to a GSLB Virtual Server</ulink>.</para>
           </listitem>
           <listitem>
-            <para><emphasis role="bold">Account</emphasis>: (Optional) The account on which you want
-              to apply the GSLB rule.</para>
+            <para>Bind domain name to GSLB virtual server. Domain name is obtained from the domain
+              details.</para>
+            <para>For more information, see <ulink
+                url="http://support.citrix.com/proddocs/topic/netscaler-traffic-management-10-map/ns-gslb-bind-dom-vsvr-tsk.html"
+                >Binding a Domain to a GSLB Virtual Server</ulink>.</para>
           </listitem>
-        </itemizedlist>
+        </orderedlist>
       </listitem>
       <listitem>
-        <para>Click OK to confirm.</para>
+        <para>In each zone that are participating in GSLB, add GSLB-enabled NetScaler device.</para>
+        <para>For more information, see <xref linkend="enable-glsb-ns"/>.</para>
       </listitem>
     </orderedlist>
-  </section>
-  <section id="assign-lb-gslb">
-    <title>Assigning Load Balancing Rules to GSLB</title>
-    <para/>
-  </section>
-  <section id="concept-gslb">
-    <title>How Does GSLB Works in &PRODUCT;?</title>
-    <para>Global server load balancing is used to manage traffic flow to a web site hosted on two
-      separate zones that ideally are in different geographic locations. The following is an
-      illustration of how GLSB functionality is provided in &PRODUCT;: An organization, xyztelco,
-      has set up a public cloud that spans two zones, Zone-1 and Zone-2, across geographically
-      separated data centers that are managed by &PRODUCT;. Tenant-A of the cloud launches a highly
-      available solution by using xyztelco cloud. For that purpose, they launch two instances each
-      in both the zones: VM1 and VM2 in Zone-1 and VM5 and VM6 in Zone-2. Tenant-A acquires a public
-      IP, IP-1 in Zone-1, and configures a load balancer rule to load balance the traffic between
-      VM1 and VM2 instances. &PRODUCT; orchestrates setting up a virtual server on the LB service
-      provider in Zone-1. Virtual server 1 that is set up on the LB service provider in Zone-1
-      represents a publicly accessible virtual server that client reaches at IP-1. The client
-      traffic to virtual server 1 at IP-1 will be load balanced across VM1 and VM2 instances. </para>
-    <para>Tenant-A acquires another public IP, IP-2 in Zone-2 and sets up a load balancer rule to
-      load balance the traffic between VM5 and VM6 instances. Similarly in Zone-2, &PRODUCT;
-      orchestrates setting up a virtual server on the LB service provider. Virtual server 2 that is
-      setup on the LB service provider in Zone-2 represents a publicly accessible virtual server
-      that client reaches at IP-2. The client traffic that reaches virtual server 2 at IP-2 is load
-      balanced across VM5 and VM6 instances. At this point Tenant-A has the service enabled in both
-      the zones, but has no means to set up a disaster recovery plan if one of the zone fails.
-      Additionally, there is no way for Tenant-A to load balance the traffic intelligently to one of
-      the zones based on load, proximity and so on. The cloud administrator of xyztelco provisions a
-      GSLB service provider to both the zones. A GSLB provider is typically an ADC that has the
-      ability to act as an ADNS (Authoritative Domain Name Server) and has the mechanism to monitor
-      health of virtual servers both at local and remote sites. The cloud admin enables GSLB as a
-      service to the tenants that use zones 1 and 2. </para>
-    <mediaobject>
-      <imageobject>
-        <imagedata fileref="./images/gslb.png"/>
-      </imageobject>
-      <textobject>
-        <phrase>gslb.png: GSLB architecture</phrase>
-      </textobject>
-    </mediaobject>
-    <para>Tenant-A wishes to leverage the GSLB service provided by the xyztelco cloud. Tenant-A
-      configures a GSLB rule to load balance traffic across virtual server 1 at Zone-1 and virtual
-      server 2 at Zone-2. The domain name is provided as A.xyztelco.com. &PRODUCT; orchestrates
-      setting up GSLB virtual server 1 on the GSLB service provider at Zone-1. &PRODUCT; binds
-      virtual server 1 of Zone-1 and virtual server 2 of Zone-2 to GLSB virtual server 1. GSLB
-      virtual server 1 is configured to start monitoring the health of virtual server 1 and 2 in
-      Zone-1. &PRODUCT; will also orchestrate setting up GSLB virtual server 2 on GSLB service
-      provider at Zone-2. &PRODUCT; will bind virtual server 1 of Zone-1 and virtual server 2 of
-      Zone-2 to GLSB virtual server 2. GSLB virtual server 2 is configured to start monitoring the
-      health of virtual server 1 and 2. &PRODUCT; will bind the domain A.xyztelco.com to both the
-      GSLB virtual server 1 and 2. At this point, Tenant-A service will be globally reachable at
-      A.xyztelco.com. The private DNS server for the domain xyztelcom.com is configured by the admin
-      out-of-band to resolve the domain A.xyztelco.com to the GSLB providers at both the zones,
-      which are configured as ADNS for the domain A.xyztelco.com. A client when sends a DNS request
-      to resolve A.xyztelcom.com, will eventually get DNS delegation to the address of GSLB
-      providers at Zone 1 and 2. A client DNS request will be received by the GSLB provider. The
-      GSLB provider, depending on the domain for which it needs to resolve, will pick up the GSLB
-      virtual server associated with the domain. Depending on the health of the virtual servers
-      being load balanced, DNS request for the domain will be resolved to the public IP associated
-      with the selected virtual server.</para>
+    <para>As a domain administrator/ user perform the following:</para>
+    <orderedlist>
+      <listitem>
+        <para>Add a GSLB rule on both the sites.</para>
+        <para>See <xref linkend="gslb-add"/>.</para>
+      </listitem>
+      <listitem>
+        <para>Assign load balancer rules.</para>
+        <para>See <xref linkend="assign-lb-gslb"/>.</para>
+      </listitem>
+    </orderedlist>
+    <section id="prereq-gslb">
+      <title>Prerequisites and Guidelines</title>
+      <itemizedlist>
+        <listitem>
+          <para>The GSLB functionality is supported both Basic and Advanced zones.</para>
+        </listitem>
+        <listitem>
+          <para>GSLB is added as a new network service.</para>
+        </listitem>
+        <listitem>
+          <para>GSLB service provider can be added to a physical network in a zone.</para>
+        </listitem>
+        <listitem>
+          <para>The admin is allowed to enable or disable GSLB functionality at region level.</para>
+        </listitem>
+        <listitem>
+          <para>The admin is allowed to configure a zone as GSLB capable or enabled. </para>
+          <para>A zone shall be considered as GSLB capable only if a GSLB service provider is
+            provisioned in the zone.</para>
+        </listitem>
+        <listitem>
+          <para>When users have VMs deployed in multiple availability zones which are GSLB enabled,
+            they can use the GSLB functionality to load balance traffic across the VMs in multiple
+            zones.</para>
+        </listitem>
+        <listitem>
+          <para>The users can use GSLB to load balance across the VMs across zones in a region only
+            if the admin has enabled GSLB in that region. </para>
+        </listitem>
+        <listitem>
+          <para>The users can load balance traffic across the availability zones in the same region
+            or different regions.</para>
+        </listitem>
+        <listitem>
+          <para>The admin can configure DNS name for the entire cloud.</para>
+        </listitem>
+        <listitem>
+          <para>The users can specify an unique name across the cloud for a globally load balanced
+            service. The provided name is used as the domain name under the DNS name associated with
+            the cloud.</para>
+          <para>The user-provided name along with the admin-provided DNS name is used to produce a
+            globally resolvable FQDN for the globally load balanced service of the user. For
+            example, if the admin has configured xyztelco.com as the DNS name for the cloud, and
+            user specifies 'foo' for the GSLB virtual service, then the FQDN name of the GSLB
+            virtual service is foo.xyztelco.com.</para>
+        </listitem>
+        <listitem>
+          <para>While setting up GSLB, users can select a load balancing method, such as round
+            robin, for using across the zones that are part of GSLB.</para>
+        </listitem>
+        <listitem>
+          <para>The user shall be able to set weight to zone-level virtual server. Weight shall be
+            considered by the load balancing method for distributing the traffic.</para>
+        </listitem>
+        <listitem>
+          <para>The GSLB functionality shall support session persistence, where series of client
+            requests for particular domain name is sent to a virtual server on the same zone. </para>
+          <para>Statistics is collected from each GSLB virtual server.</para>
+        </listitem>
+      </itemizedlist>
+    </section>
+    <section id="enable-glsb-ns">
+      <title>Enabling GSLB in NetScaler</title>
+      <para>In each zone, add GSLB-enabled NetScaler device for load balancing.</para>
+      <orderedlist>
+        <listitem>
+          <para>Log in as administrator to the &PRODUCT; UI.</para>
+        </listitem>
+        <listitem>
+          <para>In the left navigation bar, click Infrastructure.</para>
+        </listitem>
+        <listitem>
+          <para>In Zones, click View More.</para>
+        </listitem>
+        <listitem>
+          <para>Choose the zone you want to work with.</para>
+        </listitem>
+        <listitem>
+          <para>Click the Physical Network tab, then click the name of the physical network. </para>
+        </listitem>
+        <listitem>
+          <para>In the Network Service Providers node of the diagram, click Configure. </para>
+          <para>You might have to scroll down to see this.</para>
+        </listitem>
+        <listitem>
+          <para>Click NetScaler.</para>
+        </listitem>
+        <listitem>
+          <para>Click Add NetScaler device and provide the following:</para>
+          <para>For NetScaler:</para>
+          <itemizedlist>
+            <listitem>
+              <para><emphasis role="bold">IP Address</emphasis>: The IP address of the SRX.</para>
+            </listitem>
+            <listitem>
+              <para><emphasis role="bold">Username/Password</emphasis>: The authentication
+                credentials to access the device. &PRODUCT; uses these credentials to access the
+                device.</para>
+            </listitem>
+            <listitem>
+              <para><emphasis role="bold">Type</emphasis>: The type of device that is being added.
+                It could be F5 Big Ip Load Balancer, NetScaler VPX, NetScaler MPX, or NetScaler SDX.
+                For a comparison of the NetScaler types, see the &PRODUCT; Administration
+                Guide.</para>
+            </listitem>
+            <listitem>
+              <para><emphasis role="bold">Public interface</emphasis>: Interface of device that is
+                configured to be part of the public network.</para>
+            </listitem>
+            <listitem>
+              <para><emphasis role="bold">Private interface</emphasis>: Interface of device that is
+                configured to be part of the private network.</para>
+            </listitem>
+            <listitem>
+              <para><emphasis role="bold">GSLB service</emphasis>: Select this option.</para>
+            </listitem>
+            <listitem>
+              <para><emphasis role="bold">GSLB service Public IP</emphasis>: The public IP address
+                of the NAT translator for a GSLB service that is on a private network.</para>
+            </listitem>
+            <listitem>
+              <para><emphasis role="bold">GSLB service Private IP</emphasis>: The private IP of the
+                GSLB service.</para>
+            </listitem>
+            <listitem>
+              <para><emphasis role="bold">Number of Retries</emphasis>. Number of times to attempt a
+                command on the device before considering the operation failed. Default is 2.</para>
+            </listitem>
+            <listitem>
+              <para><emphasis role="bold">Capacity</emphasis>: The number of networks the device can
+                handle.</para>
+            </listitem>
+            <listitem>
+              <para><emphasis role="bold">Dedicated</emphasis>: When marked as dedicated, this
+                device will be dedicated to a single account. When Dedicated is checked, the value
+                in the Capacity field has no significance implicitly, its value is 1.</para>
+            </listitem>
+          </itemizedlist>
+        </listitem>
+        <listitem>
+          <para>Click OK.</para>
+        </listitem>
+      </orderedlist>
+    </section>
+    <section id="gslb-add">
+      <title>Adding a GSLB Rule</title>
+      <orderedlist>
+        <listitem>
+          <para>Log in to the &PRODUCT; UI as a domain administrator or user.</para>
+        </listitem>
+        <listitem>
+          <para>In the left navigation pane, click Region.</para>
+        </listitem>
+        <listitem>
+          <para>Select the region for which you want to create a GSLB rule.</para>
+        </listitem>
+        <listitem>
+          <para>In the Details tab, click View GSLB.</para>
+        </listitem>
+        <listitem>
+          <para>Click Add GSLB.</para>
+          <para>The Add GSLB page is displayed as follows:</para>
+          <mediaobject>
+            <imageobject>
+              <imagedata fileref="./images/add-gslb.png"/>
+            </imageobject>
+            <textobject>
+              <phrase>gslb-add.png: adding a gslb rule</phrase>
+            </textobject>
+          </mediaobject>
+        </listitem>
+        <listitem>
+          <para>Specify the following:</para>
+          <itemizedlist>
+            <listitem>
+              <para><emphasis role="bold">Name</emphasis>: Name for the GSLB rule.</para>
+            </listitem>
+            <listitem>
+              <para><emphasis role="bold">Description</emphasis>: (Optional) A short description of
+                the GSLB rule that can be displayed to users.</para>
+            </listitem>
+            <listitem>
+              <para><emphasis role="bold">GSLB Domain Name</emphasis>: A preferred domain name for
+                the service.</para>
+            </listitem>
+            <listitem>
+              <para><emphasis role="bold">Algorithm</emphasis>: (Optional) The algorithm to use to
+                load balance the traffic across the zones. The options are Round Robin, Least
+                Connection, and Proximity.</para>
+            </listitem>
+            <listitem>
+              <para><emphasis role="bold">Service Type</emphasis>: The transport protocol to use for
+                GSLB. The options are TCP and UDP.</para>
+            </listitem>
+            <listitem>
+              <para><emphasis role="bold">Domain</emphasis>: (Optional) The domain for which you
+                want to create the GSLB rule.</para>
+            </listitem>
+            <listitem>
+              <para><emphasis role="bold">Account</emphasis>: (Optional) The account on which you
+                want to apply the GSLB rule.</para>
+            </listitem>
+          </itemizedlist>
+        </listitem>
+        <listitem>
+          <para>Click OK to confirm.</para>
+        </listitem>
+      </orderedlist>
+    </section>
+    <section id="assign-lb-gslb">
+      <title>Assigning Load Balancing Rules to GSLB</title>
+      <para/>
+      <orderedlist>
+        <listitem>
+          <para>Log in to the &PRODUCT; UI as a domain administrator or user.</para>
+        </listitem>
+        <listitem>
+          <para>In the left navigation pane, click Region.</para>
+        </listitem>
+        <listitem>
+          <para>Select the region for which you want to create a GSLB rule.</para>
+        </listitem>
+        <listitem>
+          <para>In the Details tab, click View GSLB.</para>
+        </listitem>
+        <listitem>
+          <para>Select the desired GSLB.</para>
+        </listitem>
+        <listitem>
+          <para>Click view assigned load balancing.</para>
+        </listitem>
+        <listitem>
+          <para>Click assign more load balancing.</para>
+        </listitem>
+        <listitem>
+          <para>Select the load balancing rule you have created for the zone.</para>
+        </listitem>
+        <listitem>
+          <para>Click OK to confirm.</para>
+        </listitem>
+      </orderedlist>
+    </section>
   </section>
   <section id="limitation-gslb">
     <title>Known Limitation</title>

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/da74554b/docs/en-US/images/gslb.png
----------------------------------------------------------------------
diff --git a/docs/en-US/images/gslb.png b/docs/en-US/images/gslb.png
index 8d1a389..9f13580 100644
Binary files a/docs/en-US/images/gslb.png and b/docs/en-US/images/gslb.png differ

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/da74554b/docs/en-US/networks.xml
----------------------------------------------------------------------
diff --git a/docs/en-US/networks.xml b/docs/en-US/networks.xml
index c2090d2..8a7405a 100644
--- a/docs/en-US/networks.xml
+++ b/docs/en-US/networks.xml
@@ -36,7 +36,8 @@
   <xi:include href="security-groups.xml" xmlns:xi="http://www.w3.org/2001/XInclude"/>
   <xi:include href="external-firewalls-and-load-balancers.xml"
     xmlns:xi="http://www.w3.org/2001/XInclude"/>
-  <xi:include href="load-balancer-rules.xml" xmlns:xi="http://www.w3.org/2001/XInclude"/>
+  <xi:include href="gslb.xml"
+    xmlns:xi="http://www.w3.org/2001/XInclude"/>
   <xi:include href="guest-ip-ranges.xml" xmlns:xi="http://www.w3.org/2001/XInclude"/>
   <xi:include href="acquire-new-ip-address.xml" xmlns:xi="http://www.w3.org/2001/XInclude"/>
   <xi:include href="release-ip-address.xml" xmlns:xi="http://www.w3.org/2001/XInclude"/>


[08/50] [abbrv] git commit: updated refs/heads/vmsync to d403974

Posted by ah...@apache.org.
fix bug CLOUDSTACK-2341 remove network from VM is not removing PF/LB/static nat rules for the VM


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

Branch: refs/heads/vmsync
Commit: 6ef615e40dd56f57813f0fec78ad2bd9e394b8c7
Parents: 3c59747
Author: Mice Xia <mi...@tcloudcomputing.com>
Authored: Thu May 9 11:03:43 2013 +0800
Committer: Mice Xia <mi...@tcloudcomputing.com>
Committed: Thu May 9 11:04:30 2013 +0800

----------------------------------------------------------------------
 .../src/com/cloud/network/rules/RulesManager.java  |    3 +
 .../com/cloud/network/rules/RulesManagerImpl.java  |   38 +++++++++++
 server/src/com/cloud/vm/UserVmManagerImpl.java     |    6 ++
 .../com/cloud/vm/VirtualMachineManagerImpl.java    |   50 +++++++++++----
 .../com/cloud/network/MockRulesManagerImpl.java    |    8 +++
 5 files changed, 92 insertions(+), 13 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/6ef615e4/server/src/com/cloud/network/rules/RulesManager.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/rules/RulesManager.java b/server/src/com/cloud/network/rules/RulesManager.java
index 4b83e04..cede987 100644
--- a/server/src/com/cloud/network/rules/RulesManager.java
+++ b/server/src/com/cloud/network/rules/RulesManager.java
@@ -24,6 +24,7 @@ import com.cloud.exception.ResourceUnavailableException;
 import com.cloud.network.IpAddress;
 import com.cloud.user.Account;
 import com.cloud.uservm.UserVm;
+import com.cloud.vm.Nic;
 import com.cloud.vm.VirtualMachine;
 
 /**
@@ -87,4 +88,6 @@ public interface RulesManager extends RulesService {
      */
     boolean applyStaticNatForNetwork(long networkId, boolean continueOnError, Account caller, boolean forRevoke);
 
+    List<FirewallRuleVO> listAssociatedRulesForGuestNic(Nic nic);
+
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/6ef615e4/server/src/com/cloud/network/rules/RulesManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/rules/RulesManagerImpl.java b/server/src/com/cloud/network/rules/RulesManagerImpl.java
index 2355635..c9b47b4 100755
--- a/server/src/com/cloud/network/rules/RulesManagerImpl.java
+++ b/server/src/com/cloud/network/rules/RulesManagerImpl.java
@@ -50,8 +50,11 @@ import com.cloud.network.dao.FirewallRulesCidrsDao;
 import com.cloud.network.dao.FirewallRulesDao;
 import com.cloud.network.dao.IPAddressDao;
 import com.cloud.network.dao.IPAddressVO;
+import com.cloud.network.dao.LoadBalancerVMMapDao;
+import com.cloud.network.dao.LoadBalancerVMMapVO;
 import com.cloud.network.rules.FirewallRule.FirewallRuleType;
 import com.cloud.network.rules.FirewallRule.Purpose;
+import com.cloud.network.rules.FirewallRule.TrafficType;
 import com.cloud.network.rules.dao.PortForwardingRulesDao;
 import com.cloud.network.vpc.VpcManager;
 import com.cloud.offering.NetworkOffering;
@@ -77,6 +80,7 @@ import com.cloud.utils.db.SearchCriteria.Op;
 import com.cloud.utils.db.Transaction;
 import com.cloud.utils.exception.CloudRuntimeException;
 import com.cloud.utils.net.Ip;
+import com.cloud.utils.net.NetUtils;
 import com.cloud.vm.Nic;
 import com.cloud.vm.NicSecondaryIp;
 import com.cloud.vm.UserVmVO;
@@ -132,6 +136,8 @@ public class RulesManagerImpl extends ManagerBase implements RulesManager, Rules
     VpcManager _vpcMgr;
     @Inject
     NicSecondaryIpDao _nicSecondaryDao;
+    @Inject
+    LoadBalancerVMMapDao _loadBalancerVMMapDao;
 
     @Override
     public void checkIpAndUserVm(IpAddress ipAddress, UserVm userVm, Account caller) {
@@ -1467,4 +1473,36 @@ public class RulesManagerImpl extends ManagerBase implements RulesManager, Rules
     protected void removePFRule(PortForwardingRuleVO rule) {
         _portForwardingDao.remove(rule.getId());
     }
+    
+    @Override
+    public List<FirewallRuleVO> listAssociatedRulesForGuestNic(Nic nic){
+        List<FirewallRuleVO> result = new ArrayList<FirewallRuleVO>();
+        // add PF rules
+        result.addAll(_portForwardingDao.listByDestIpAddr(nic.getIp4Address()));
+        // add static NAT rules
+        List<FirewallRuleVO> staticNatRules = _firewallDao.listStaticNatByVmId(nic.getInstanceId());
+        for(FirewallRuleVO rule : staticNatRules){
+            if(rule.getNetworkId() == nic.getNetworkId())
+                result.add(rule);
+        }
+        List<? extends IpAddress> staticNatIps = _ipAddressDao.listStaticNatPublicIps(nic.getNetworkId());
+        for(IpAddress ip : staticNatIps){
+            if(ip.getVmIp() != null && ip.getVmIp().equals(nic.getIp4Address())){
+                VMInstanceVO vm = _vmInstanceDao.findById(nic.getInstanceId());
+                // generate a static Nat rule on the fly because staticNATrule does not persist into db anymore
+                // FIX ME
+                FirewallRuleVO staticNatRule = new FirewallRuleVO(null, ip.getId(), 0, 65535, NetUtils.ALL_PROTO.toString(), 
+                        nic.getNetworkId(), vm.getAccountId(), vm.getDomainId(), Purpose.StaticNat, null, null, null, null, null);
+                result.add(staticNatRule);
+            }
+        }
+        // add LB rules
+        List<LoadBalancerVMMapVO> lbMapList = _loadBalancerVMMapDao.listByInstanceId(nic.getInstanceId());
+        for(LoadBalancerVMMapVO lb : lbMapList){
+            FirewallRuleVO lbRule = _firewallDao.findById(lb.getLoadBalancerId());
+            if(lbRule.getNetworkId() == nic.getNetworkId())
+                result.add(lbRule);
+        }
+        return result;
+    }
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/6ef615e4/server/src/com/cloud/vm/UserVmManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/vm/UserVmManagerImpl.java b/server/src/com/cloud/vm/UserVmManagerImpl.java
index bc25bed..644f5ed 100755
--- a/server/src/com/cloud/vm/UserVmManagerImpl.java
+++ b/server/src/com/cloud/vm/UserVmManagerImpl.java
@@ -831,6 +831,12 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Use
         if(network == null) {
             throw new InvalidParameterValueException("unable to find a network with id " + networkId);
         }
+        List<NicVO> allNics = _nicDao.listByVmId(vmInstance.getId());
+        for(NicVO nic : allNics){
+            if(nic.getNetworkId() == network.getId())
+                throw new CloudRuntimeException("A NIC already exists for VM:" + vmInstance.getInstanceName() + " in network: " + network.getUuid());
+        }
+
         NicProfile profile = new NicProfile(null, null);
         if(ipAddress != null) {
             profile = new NicProfile(ipAddress, null);

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/6ef615e4/server/src/com/cloud/vm/VirtualMachineManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/vm/VirtualMachineManagerImpl.java b/server/src/com/cloud/vm/VirtualMachineManagerImpl.java
index afffbec..521b5e0 100755
--- a/server/src/com/cloud/vm/VirtualMachineManagerImpl.java
+++ b/server/src/com/cloud/vm/VirtualMachineManagerImpl.java
@@ -24,7 +24,6 @@ import java.util.Collections;
 import java.util.Date;
 import java.util.HashMap;
 import java.util.HashSet;
-import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -37,40 +36,56 @@ import javax.ejb.Local;
 import javax.inject.Inject;
 import javax.naming.ConfigurationException;
 
-import com.cloud.capacity.CapacityManager;
 import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager;
-import org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreStateMachine;
 import org.apache.cloudstack.engine.subsystem.api.storage.StoragePoolAllocator;
 import org.apache.cloudstack.engine.subsystem.api.storage.VolumeDataFactory;
-import org.apache.cloudstack.engine.subsystem.api.storage.VolumeInfo;
 import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao;
 import org.apache.cloudstack.storage.datastore.db.StoragePoolVO;
-
-import com.cloud.dc.*;
-import com.cloud.agent.api.*;
 import org.apache.log4j.Logger;
 
 import com.cloud.agent.AgentManager;
 import com.cloud.agent.AgentManager.OnError;
 import com.cloud.agent.Listener;
+import com.cloud.agent.api.AgentControlAnswer;
+import com.cloud.agent.api.AgentControlCommand;
+import com.cloud.agent.api.Answer;
+import com.cloud.agent.api.CheckVirtualMachineAnswer;
+import com.cloud.agent.api.CheckVirtualMachineCommand;
+import com.cloud.agent.api.ClusterSyncAnswer;
+import com.cloud.agent.api.ClusterSyncCommand;
+import com.cloud.agent.api.Command;
+import com.cloud.agent.api.MigrateAnswer;
+import com.cloud.agent.api.MigrateCommand;
+import com.cloud.agent.api.PingRoutingCommand;
+import com.cloud.agent.api.PrepareForMigrationAnswer;
+import com.cloud.agent.api.PrepareForMigrationCommand;
+import com.cloud.agent.api.RebootAnswer;
+import com.cloud.agent.api.RebootCommand;
+import com.cloud.agent.api.ScaleVmCommand;
+import com.cloud.agent.api.StartAnswer;
+import com.cloud.agent.api.StartCommand;
+import com.cloud.agent.api.StartupCommand;
+import com.cloud.agent.api.StartupRoutingCommand;
 import com.cloud.agent.api.StartupRoutingCommand.VmState;
+import com.cloud.agent.api.StopAnswer;
+import com.cloud.agent.api.StopCommand;
 import com.cloud.agent.api.to.NicTO;
 import com.cloud.agent.api.to.VirtualMachineTO;
-import com.cloud.agent.api.to.StorageFilerTO;
-import com.cloud.agent.api.to.VolumeTO;
 import com.cloud.agent.manager.Commands;
 import com.cloud.agent.manager.allocator.HostAllocator;
 import com.cloud.alert.AlertManager;
+import com.cloud.capacity.CapacityManager;
 import com.cloud.cluster.ClusterManager;
 import com.cloud.configuration.Config;
 import com.cloud.configuration.ConfigurationManager;
 import com.cloud.configuration.Resource.ResourceType;
 import com.cloud.configuration.dao.ConfigurationDao;
-import com.cloud.dc.dao.ClusterDao;
+import com.cloud.dc.ClusterDetailsDao;
+import com.cloud.dc.ClusterDetailsVO;
 import com.cloud.dc.DataCenter;
 import com.cloud.dc.DataCenterVO;
 import com.cloud.dc.HostPodVO;
-import com.cloud.consoleproxy.ConsoleProxyManager;
+import com.cloud.dc.dao.ClusterDao;
 import com.cloud.dc.dao.DataCenterDao;
 import com.cloud.dc.dao.HostPodDao;
 import com.cloud.deploy.DataCenterDeployment;
@@ -109,6 +124,7 @@ import com.cloud.network.NetworkManager;
 import com.cloud.network.NetworkModel;
 import com.cloud.network.dao.NetworkDao;
 import com.cloud.network.dao.NetworkVO;
+import com.cloud.network.rules.RulesManager;
 import com.cloud.offering.ServiceOffering;
 import com.cloud.org.Cluster;
 import com.cloud.resource.ResourceManager;
@@ -126,9 +142,9 @@ import com.cloud.storage.VolumeVO;
 import com.cloud.storage.dao.DiskOfferingDao;
 import com.cloud.storage.dao.GuestOSCategoryDao;
 import com.cloud.storage.dao.GuestOSDao;
+import com.cloud.storage.dao.StoragePoolHostDao;
 import com.cloud.storage.dao.VMTemplateDao;
 import com.cloud.storage.dao.VolumeDao;
-import com.cloud.storage.dao.StoragePoolHostDao;
 import com.cloud.storage.snapshot.SnapshotManager;
 import com.cloud.user.Account;
 import com.cloud.user.AccountManager;
@@ -154,12 +170,12 @@ import com.cloud.vm.VirtualMachine.Event;
 import com.cloud.vm.VirtualMachine.State;
 import com.cloud.vm.dao.NicDao;
 import com.cloud.vm.dao.UserVmDao;
+import com.cloud.vm.dao.UserVmDetailsDao;
 import com.cloud.vm.dao.VMInstanceDao;
 import com.cloud.vm.snapshot.VMSnapshot;
 import com.cloud.vm.snapshot.VMSnapshotManager;
 import com.cloud.vm.snapshot.VMSnapshotVO;
 import com.cloud.vm.snapshot.dao.VMSnapshotDao;
-import com.cloud.vm.dao.UserVmDetailsDao;
 
 @Local(value = VirtualMachineManager.class)
 public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMachineManager, Listener {
@@ -235,6 +251,8 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
     protected VolumeDataFactory volFactory;
     @Inject
     protected ResourceLimitService _resourceLimitMgr;
+    @Inject
+    protected RulesManager rulesMgr;
 
     protected List<DeploymentPlanner> _planners;
     public List<DeploymentPlanner> getPlanners() {
@@ -2845,6 +2863,12 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
             s_logger.warn("Failed to remove nic from " + vm + " in " + network + ", nic is default.");
             throw new CloudRuntimeException("Failed to remove nic from " + vm + " in " + network + ", nic is default.");
         }
+        
+        // if specified nic is associated with PF/LB/Static NAT
+        if(rulesMgr.listAssociatedRulesForGuestNic(nic).size() > 0){
+            throw new CloudRuntimeException("Failed to remove nic from " + vm + " in " + network 
+                    + ", nic has associated Port forwarding or Load balancer or Static NAT rules.");
+        }
 
         NicProfile nicProfile = new NicProfile(nic, network, nic.getBroadcastUri(), nic.getIsolationUri(),
                 _networkModel.getNetworkRate(network.getId(), vm.getId()),

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/6ef615e4/server/test/com/cloud/network/MockRulesManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/test/com/cloud/network/MockRulesManagerImpl.java b/server/test/com/cloud/network/MockRulesManagerImpl.java
index 200fd2c..82a3e93 100644
--- a/server/test/com/cloud/network/MockRulesManagerImpl.java
+++ b/server/test/com/cloud/network/MockRulesManagerImpl.java
@@ -28,6 +28,7 @@ import com.cloud.exception.InsufficientAddressCapacityException;
 import com.cloud.exception.NetworkRuleConflictException;
 import com.cloud.exception.ResourceUnavailableException;
 import com.cloud.network.rules.FirewallRule;
+import com.cloud.network.rules.FirewallRuleVO;
 import com.cloud.network.rules.PortForwardingRule;
 import com.cloud.network.rules.PortForwardingRuleVO;
 import com.cloud.network.rules.RulesManager;
@@ -40,6 +41,7 @@ import com.cloud.utils.Pair;
 import com.cloud.utils.component.Manager;
 import com.cloud.utils.component.ManagerBase;
 import com.cloud.utils.net.Ip;
+import com.cloud.vm.Nic;
 import com.cloud.vm.VirtualMachine;
 
 @Local(value = {RulesManager.class, RulesService.class})
@@ -310,4 +312,10 @@ public class MockRulesManagerImpl extends ManagerBase implements RulesManager, R
         return null;
     }
 
+    @Override
+    public List<FirewallRuleVO> listAssociatedRulesForGuestNic(Nic nic) {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
 }


[11/50] [abbrv] git commit: updated refs/heads/vmsync to d403974

Posted by ah...@apache.org.
CLOUDSTACK-869 nTier Apps 2.0 : Support NetScalar as external LB provider


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

Branch: refs/heads/vmsync
Commit: 2e2106002865cff8eb06b5c3a42bfd6f0f6848fb
Parents: 2e1877a
Author: Rajesh Battala <ra...@citrix.com>
Authored: Wed May 8 18:46:51 2013 +0530
Committer: Murali Reddy <mu...@gmail.com>
Committed: Thu May 9 15:23:00 2013 +0530

----------------------------------------------------------------------
 api/src/com/cloud/network/vpc/VpcOffering.java     |    1 +
 .../cloud/network/element/NetscalerElement.java    |   34 ++-
 server/pom.xml                                     |    4 +-
 .../src/com/cloud/network/NetworkServiceImpl.java  |    6 +-
 .../network/guru/ExternalGuestNetworkGuru.java     |   40 ++-
 .../src/com/cloud/network/vpc/VpcManagerImpl.java  |   32 ++-
 server/test/com/cloud/vpc/VpcTest.java             |  269 +++++++++++++++
 .../networkoffering/CreateNetworkOfferingTest.java |   43 +++
 8 files changed, 406 insertions(+), 23 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2e210600/api/src/com/cloud/network/vpc/VpcOffering.java
----------------------------------------------------------------------
diff --git a/api/src/com/cloud/network/vpc/VpcOffering.java b/api/src/com/cloud/network/vpc/VpcOffering.java
index 3961d0a..3ec81e6 100644
--- a/api/src/com/cloud/network/vpc/VpcOffering.java
+++ b/api/src/com/cloud/network/vpc/VpcOffering.java
@@ -26,6 +26,7 @@ public interface VpcOffering extends InternalIdentity, Identity {
     }
 
     public static final String defaultVPCOfferingName = "Default VPC offering";
+    public static final String defaultVPCNSOfferingName = "Default VPC  offering with Netscaler";
 
     /**
      * 

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2e210600/plugins/network-elements/netscaler/src/com/cloud/network/element/NetscalerElement.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/netscaler/src/com/cloud/network/element/NetscalerElement.java b/plugins/network-elements/netscaler/src/com/cloud/network/element/NetscalerElement.java
index 7bd9c2e..b814430 100644
--- a/plugins/network-elements/netscaler/src/com/cloud/network/element/NetscalerElement.java
+++ b/plugins/network-elements/netscaler/src/com/cloud/network/element/NetscalerElement.java
@@ -61,6 +61,9 @@ import com.cloud.network.rules.FirewallRule.Purpose;
 import com.cloud.network.rules.LbStickinessMethod;
 import com.cloud.network.rules.LbStickinessMethod.StickinessMethodType;
 import com.cloud.network.rules.StaticNat;
+import com.cloud.network.vpc.PrivateGateway;
+import com.cloud.network.vpc.StaticRouteProfile;
+import com.cloud.network.vpc.Vpc;
 import com.cloud.offering.NetworkOffering;
 import com.cloud.utils.NumbersUtil;
 import com.cloud.utils.db.DB;
@@ -85,7 +88,7 @@ import java.util.*;
 @Local(value = {NetworkElement.class, StaticNatServiceProvider.class, LoadBalancingServiceProvider.class, GslbServiceProvider.class})
 public class NetscalerElement extends ExternalLoadBalancerDeviceManagerImpl implements LoadBalancingServiceProvider,
         NetscalerLoadBalancerElementService, ExternalLoadBalancerDeviceManager, IpDeployer, StaticNatServiceProvider,
-        GslbServiceProvider {
+        GslbServiceProvider, VpcProvider {
 
     private static final Logger s_logger = Logger.getLogger(NetscalerElement.class);
     public static final AutoScaleCounterType AutoScaleCounterSnmp = new AutoScaleCounterType("snmp");
@@ -957,4 +960,33 @@ public class NetscalerElement extends ExternalLoadBalancerDeviceManagerImpl impl
         }
         return null;
     }
+
+    @Override
+    public boolean implementVpc(Vpc vpc, DeployDestination dest, ReservationContext context)
+            throws ConcurrentOperationException, ResourceUnavailableException, InsufficientCapacityException {
+        return true;
+    }
+
+    @Override
+    public boolean shutdownVpc(Vpc vpc, ReservationContext context) throws ConcurrentOperationException,
+            ResourceUnavailableException {
+        return true;
+    }
+
+    @Override
+    public boolean createPrivateGateway(PrivateGateway gateway) throws ConcurrentOperationException,
+            ResourceUnavailableException {
+        return true;
+    }
+
+    @Override
+    public boolean deletePrivateGateway(PrivateGateway privateGateway) throws ConcurrentOperationException,
+            ResourceUnavailableException {
+        return true;
+    }
+
+    @Override
+    public boolean applyStaticRoutes(Vpc vpc, List<StaticRouteProfile> routes) throws ResourceUnavailableException {
+        return true;
+    }
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2e210600/server/pom.xml
----------------------------------------------------------------------
diff --git a/server/pom.xml b/server/pom.xml
index 808dd3e..004d9c8 100644
--- a/server/pom.xml
+++ b/server/pom.xml
@@ -154,7 +154,9 @@
             <exclude>com/cloud/network/vpn/RemoteAccessVpnTest.java</exclude>
             <exclude>com/cloud/network/security/SecurityGroupManagerImpl2Test.java</exclude>
             <exclude>com/cloud/network/security/SecurityGroupManagerImpl2Test.java</exclude>
-            <exclude>com/cloud/vpc/*</exclude>
+            <exclude>com/cloud/vpc/VpcTestConfiguration.java</exclude>
+            <exclude>com/cloud/vpc/VpcApiUnitTest.java</exclude>
+            <exclude>com/cloud/vpc/VpcManagerTest.java</exclude>
           </excludes>
         </configuration>
       </plugin>

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2e210600/server/src/com/cloud/network/NetworkServiceImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/NetworkServiceImpl.java b/server/src/com/cloud/network/NetworkServiceImpl.java
index 5e8be92..f44688c 100755
--- a/server/src/com/cloud/network/NetworkServiceImpl.java
+++ b/server/src/com/cloud/network/NetworkServiceImpl.java
@@ -1121,7 +1121,11 @@ public class NetworkServiceImpl extends ManagerBase implements  NetworkService {
                 // validate if CIDR specified overlaps with any of the CIDR's allocated for isolated networks and shared networks in the zone
                 checkSharedNetworkCidrOverlap(zoneId, pNtwk.getId(), cidr);
             } else {
-                throw new InvalidParameterValueException("Cannot specify CIDR when using network offering with external devices!");
+                // if the guest network is for the VPC, if any External Provider are supported in VPC
+                // cidr will not be null as it is generated from the super cidr of vpc.
+                // if cidr is not null and network is not part of vpc then throw the exception
+                if (vpcId == null)
+                    throw new InvalidParameterValueException("Cannot specify CIDR when using network offering with external devices!");
             }
         }
 

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2e210600/server/src/com/cloud/network/guru/ExternalGuestNetworkGuru.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/guru/ExternalGuestNetworkGuru.java b/server/src/com/cloud/network/guru/ExternalGuestNetworkGuru.java
index b1606db..fe9e01f 100644
--- a/server/src/com/cloud/network/guru/ExternalGuestNetworkGuru.java
+++ b/server/src/com/cloud/network/guru/ExternalGuestNetworkGuru.java
@@ -118,7 +118,7 @@ public class ExternalGuestNetworkGuru extends GuestNetworkGuru {
         if (Boolean.parseBoolean(_configDao.getValue(Config.OvsTunnelNetwork.key()))) {
             return null;
         }
-        
+
         if (!_networkModel.networkIsConfiguredForExternalNetworking(config.getDataCenterId(), config.getId())) {
             return super.implement(config, offering, dest, context);
         }
@@ -145,25 +145,31 @@ public class ExternalGuestNetworkGuru extends GuestNetworkGuru {
             implemented.setBroadcastUri(config.getBroadcastUri());
         }
 
-        // Determine the offset from the lowest vlan tag
-        int offset = getVlanOffset(config.getPhysicalNetworkId(), vlanTag);
-
         // Determine the new gateway and CIDR
         String[] oldCidr = config.getCidr().split("/");
         String oldCidrAddress = oldCidr[0];
-        int cidrSize = getGloballyConfiguredCidrSize();
-
-        // If the offset has more bits than there is room for, return null
-        long bitsInOffset = 32 - Integer.numberOfLeadingZeros(offset);
-        if (bitsInOffset > (cidrSize - 8)) {
-            throw new CloudRuntimeException("The offset " + offset + " needs " + bitsInOffset + " bits, but only have " + (cidrSize - 8) + " bits to work with.");
+        int cidrSize = Integer.parseInt(oldCidr[1]);
+        long newCidrAddress = (NetUtils.ip2Long(oldCidrAddress));
+        // if the implementing network is for vpc, no need to generate newcidr, use the cidr that came from super cidr
+        if (config.getVpcId() != null) {
+            implemented.setGateway(config.getGateway());
+            implemented.setCidr(config.getCidr());
+            implemented.setState(State.Implemented);
+        } else {
+            // Determine the offset from the lowest vlan tag
+            int offset = getVlanOffset(config.getPhysicalNetworkId(), vlanTag);
+            cidrSize = getGloballyConfiguredCidrSize();
+            // If the offset has more bits than there is room for, return null
+            long bitsInOffset = 32 - Integer.numberOfLeadingZeros(offset);
+            if (bitsInOffset > (cidrSize - 8)) {
+                throw new CloudRuntimeException("The offset " + offset + " needs " + bitsInOffset + " bits, but only have " + (cidrSize - 8) + " bits to work with.");
+            }
+            newCidrAddress = (NetUtils.ip2Long(oldCidrAddress) & 0xff000000) | (offset << (32 - cidrSize));
+            implemented.setGateway(NetUtils.long2Ip(newCidrAddress + 1));
+            implemented.setCidr(NetUtils.long2Ip(newCidrAddress) + "/" + cidrSize);
+            implemented.setState(State.Implemented);
         }
 
-        long newCidrAddress = (NetUtils.ip2Long(oldCidrAddress) & 0xff000000) | (offset << (32 - cidrSize));
-        implemented.setGateway(NetUtils.long2Ip(newCidrAddress + 1));
-        implemented.setCidr(NetUtils.long2Ip(newCidrAddress) + "/" + cidrSize);
-        implemented.setState(State.Implemented);
-
         // Mask the Ipv4 address of all nics that use this network with the new guest VLAN offset
         List<NicVO> nicsInNetwork = _nicDao.listByNetworkId(config.getId());
         for (NicVO nic : nicsInNetwork) {
@@ -172,8 +178,8 @@ public class ExternalGuestNetworkGuru extends GuestNetworkGuru {
                 nic.setIp4Address(NetUtils.long2Ip(newCidrAddress | ipMask));
                 _nicDao.persist(nic);
             }
-        }       
-        
+        }
+
         // Mask the destination address of all port forwarding rules in this network with the new guest VLAN offset
         List<PortForwardingRuleVO> pfRulesInNetwork = _pfRulesDao.listByNetwork(config.getId());
         for (PortForwardingRuleVO pfRule : pfRulesInNetwork) {

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2e210600/server/src/com/cloud/network/vpc/VpcManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/vpc/VpcManagerImpl.java b/server/src/com/cloud/network/vpc/VpcManagerImpl.java
index a7f06e9..9be2208 100644
--- a/server/src/com/cloud/network/vpc/VpcManagerImpl.java
+++ b/server/src/com/cloud/network/vpc/VpcManagerImpl.java
@@ -184,8 +184,7 @@ public class VpcManagerImpl extends ManagerBase implements VpcManager, VpcProvis
     private final ScheduledExecutorService _executor = Executors.newScheduledThreadPool(1, new NamedThreadFactory("VpcChecker"));
     private List<VpcProvider> vpcElements = null;
     private final List<Service> nonSupportedServices = Arrays.asList(Service.SecurityGroup, Service.Firewall);
-    private final List<Provider> supportedProviders = Arrays.asList(Provider.VPCVirtualRouter, Provider.NiciraNvp);
-     
+    private final List<Provider> supportedProviders = Arrays.asList(Provider.VPCVirtualRouter, Provider.NiciraNvp, Provider.Netscaler);
     int _cleanupInterval;
     int _maxNetworks;
     SearchBuilder<IPAddressVO> IpAddressSearch;
@@ -215,7 +214,27 @@ public class VpcManagerImpl extends ManagerBase implements VpcManager, VpcProvis
             createVpcOffering(VpcOffering.defaultVPCOfferingName, VpcOffering.defaultVPCOfferingName, svcProviderMap, 
                     true, State.Enabled);
         }
-                
+
+        //configure default vpc offering with Netscaler as LB Provider
+        if (_vpcOffDao.findByUniqueName(VpcOffering.defaultVPCNSOfferingName ) == null) {
+            s_logger.debug("Creating default VPC offering with Netscaler as LB Provider" + VpcOffering.defaultVPCNSOfferingName);
+            Map<Service, Set<Provider>> svcProviderMap = new HashMap<Service, Set<Provider>>();
+            Set<Provider> defaultProviders = new HashSet<Provider>();
+            defaultProviders.add(Provider.VPCVirtualRouter);
+            for (Service svc : getSupportedServices()) {
+                if (svc == Service.Lb) {
+                    Set<Provider> lbProviders = new HashSet<Provider>();
+                    lbProviders.add(Provider.Netscaler);
+                    lbProviders.add(Provider.VPCVirtualRouter);
+                    svcProviderMap.put(svc, lbProviders);
+                } else {
+                    svcProviderMap.put(svc, defaultProviders);
+                }
+            }
+            createVpcOffering(VpcOffering.defaultVPCNSOfferingName, VpcOffering.defaultVPCNSOfferingName,
+                    svcProviderMap, false, State.Enabled);
+        }
+
         txn.commit();
         
         Map<String, String> configs = _configDao.getConfiguration(params);
@@ -1084,6 +1103,12 @@ public class VpcManagerImpl extends ManagerBase implements VpcManager, VpcProvis
         if (guestNtwkOff.isConserveMode()) {
             throw new InvalidParameterValueException("Only networks with conserve mode Off can belong to VPC");
         }
+
+       //5) If Netscaler is LB provider make sure it is in dedicated mode
+        if ( providers.contains(Provider.Netscaler)  && !guestNtwkOff.getDedicatedLB() ) {
+            throw new InvalidParameterValueException("Netscaler only with Dedicated LB can belong to VPC");
+        }
+        return ;
     }
 
     @DB
@@ -1155,6 +1180,7 @@ public class VpcManagerImpl extends ManagerBase implements VpcManager, VpcProvis
         if (vpcElements == null) {
             vpcElements = new ArrayList<VpcProvider>();
             vpcElements.add((VpcProvider)_ntwkModel.getElementImplementingProvider(Provider.VPCVirtualRouter.getName()));
+            vpcElements.add((VpcProvider)_ntwkModel.getElementImplementingProvider(Provider.Netscaler.getName()));
         }
 
         if (vpcElements == null) {

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2e210600/server/test/com/cloud/vpc/VpcTest.java
----------------------------------------------------------------------
diff --git a/server/test/com/cloud/vpc/VpcTest.java b/server/test/com/cloud/vpc/VpcTest.java
new file mode 100644
index 0000000..52e837e
--- /dev/null
+++ b/server/test/com/cloud/vpc/VpcTest.java
@@ -0,0 +1,269 @@
+// 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.vpc;
+
+import com.cloud.configuration.ConfigurationManager;
+import com.cloud.configuration.dao.ConfigurationDao;
+import com.cloud.dc.dao.DataCenterDao;
+import com.cloud.dc.dao.VlanDao;
+import com.cloud.network.NetworkManager;
+import com.cloud.network.NetworkModel;
+import com.cloud.network.NetworkService;
+import com.cloud.network.dao.FirewallRulesDao;
+import com.cloud.network.dao.IPAddressDao;
+import com.cloud.network.dao.NetworkDao;
+import com.cloud.network.dao.PhysicalNetworkDao;
+import com.cloud.network.dao.Site2SiteVpnGatewayDao;
+import com.cloud.network.vpc.*;
+import com.cloud.network.vpc.dao.PrivateIpDao;
+import com.cloud.network.vpc.dao.StaticRouteDao;
+import com.cloud.network.vpc.dao.VpcDao;
+import com.cloud.network.vpc.dao.VpcGatewayDao;
+import com.cloud.network.vpc.dao.VpcOfferingDao;
+import com.cloud.network.vpc.dao.VpcOfferingServiceMapDao;
+import com.cloud.network.vpc.dao.VpcServiceMapDao;
+import com.cloud.network.vpn.Site2SiteVpnManager;
+import com.cloud.offerings.dao.NetworkOfferingServiceMapDao;
+import com.cloud.server.ConfigurationServer;
+import com.cloud.tags.dao.ResourceTagDao;
+import com.cloud.user.Account;
+import com.cloud.user.AccountManager;
+import com.cloud.user.AccountVO;
+import com.cloud.user.ResourceLimitService;
+import com.cloud.user.UserContext;
+import com.cloud.utils.component.ComponentContext;
+import com.cloud.vm.dao.DomainRouterDao;
+
+import junit.framework.TestCase;
+import org.apache.cloudstack.api.command.user.network.CreateNetworkACLCmd;
+import org.apache.cloudstack.api.command.user.vpc.CreateVPCCmd;
+import org.apache.cloudstack.test.utils.SpringUtils;
+import org.apache.log4j.Logger;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mockito;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.FilterType;
+import org.springframework.core.type.classreading.MetadataReader;
+import org.springframework.core.type.classreading.MetadataReaderFactory;
+import org.springframework.core.type.filter.TypeFilter;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+import org.springframework.test.context.support.AnnotationConfigContextLoader;
+
+import javax.inject.Inject;
+import java.io.IOException;
+import java.util.UUID;
+
+@RunWith(SpringJUnit4ClassRunner.class)
+@ContextConfiguration(loader = AnnotationConfigContextLoader.class)
+public class VpcTest extends TestCase {
+
+    @Inject
+    VpcService _vpcService;
+
+    @Inject
+    AccountManager _accountMgr;
+
+    @Inject
+    VpcManager _vpcMgr;
+
+    @Inject
+    VpcDao _vpcDao;
+
+    @Inject
+    VpcOfferingDao _vpcOfferinDao;
+
+    private VpcVO vpc;
+    private static final Logger s_logger = Logger.getLogger(VpcTest.class);
+
+    @Before
+    public void setUp() {
+        ComponentContext.initComponentsLifeCycle();
+        Account account = new AccountVO("testaccount", 1, "testdomain", (short) 0, UUID.randomUUID().toString());
+        UserContext.registerContext(1, account, null, true);
+        vpc = new VpcVO(1, "myvpc", "myvpc", 2, 1, 1, "10.0.1.0/16", "mydomain");
+    }
+
+    @Test
+    public void testCreateVpc() throws Exception {
+        Mockito.when(
+                _vpcMgr.createVpc(Mockito.anyLong(), Mockito.anyLong(), Mockito.anyLong(), Mockito.anyString(),
+                        Mockito.anyString(), Mockito.anyString(), Mockito.anyString())).thenReturn(vpc);
+        Mockito.when(_vpcOfferinDao.persist(Mockito.any(VpcOfferingVO.class))).thenReturn(
+                new VpcOfferingVO("test", "test", 1L));
+        Vpc vpc1 = _vpcMgr.createVpc(1, 1, 1, "myVpc", "my Vpc", "10.0.0.0/16", "test");
+        assertNotNull("Vpc is created", vpc1);
+    }
+
+    @Configuration
+    @ComponentScan(basePackageClasses = { VpcManager.class }, includeFilters = { @ComponentScan.Filter(value = VpcTestConfiguration.Library.class, type = FilterType.CUSTOM) }, useDefaultFilters = false)
+    public static class VpcTestConfiguration extends SpringUtils.CloudStackTestConfiguration {
+
+        @Bean
+        public AccountManager accountManager() {
+            return Mockito.mock(AccountManager.class);
+        }
+
+        @Bean
+        public NetworkManager networkManager() {
+            return Mockito.mock(NetworkManager.class);
+        }
+
+        @Bean
+        public NetworkModel networkModel() {
+            return Mockito.mock(NetworkModel.class);
+        }
+
+        @Bean
+        public VpcManager vpcManager() {
+            return Mockito.mock(VpcManager.class);
+        }
+
+        @Bean
+        public ResourceTagDao resourceTagDao() {
+            return Mockito.mock(ResourceTagDao.class);
+        }
+
+        @Bean
+        public VpcDao VpcDao() {
+            return Mockito.mock(VpcDao.class);
+        }
+
+        @Bean
+        public VpcOfferingDao vpcOfferingDao() {
+            return Mockito.mock(VpcOfferingDao.class);
+        }
+
+        @Bean
+        public VpcOfferingServiceMapDao vpcOfferingServiceMapDao() {
+            return Mockito.mock(VpcOfferingServiceMapDao.class);
+        }
+
+        @Bean
+        public ConfigurationDao configurationDao() {
+            return Mockito.mock(ConfigurationDao.class);
+        }
+
+        @Bean
+        public ConfigurationManager configurationManager() {
+            return Mockito.mock(ConfigurationManager.class);
+        }
+
+        @Bean
+        public NetworkDao networkDao() {
+            return Mockito.mock(NetworkDao.class);
+        }
+
+        @Bean
+        public NetworkACLManager networkACLManager() {
+            return Mockito.mock(NetworkACLManager.class);
+        }
+
+        @Bean
+        public IPAddressDao ipAddressDao() {
+            return Mockito.mock(IPAddressDao.class);
+        }
+
+        @Bean
+        public DomainRouterDao domainRouterDao() {
+            return Mockito.mock(DomainRouterDao.class);
+        }
+
+        @Bean
+        public VpcGatewayDao vpcGatewayDao() {
+            return Mockito.mock(VpcGatewayDao.class);
+        }
+
+        @Bean
+        public PrivateIpDao privateIpDao() {
+            return Mockito.mock(PrivateIpDao.class);
+        }
+
+        @Bean
+        public StaticRouteDao staticRouteDao() {
+            return Mockito.mock(StaticRouteDao.class);
+        }
+
+        @Bean
+        public NetworkOfferingServiceMapDao networkOfferingServiceMapDao() {
+            return Mockito.mock(NetworkOfferingServiceMapDao.class);
+        }
+
+        @Bean
+        public PhysicalNetworkDao physicalNetworkDao() {
+            return Mockito.mock(PhysicalNetworkDao.class);
+        }
+
+        @Bean
+        public FirewallRulesDao firewallRulesDao() {
+            return Mockito.mock(FirewallRulesDao.class);
+        }
+
+        @Bean
+        public Site2SiteVpnGatewayDao site2SiteVpnGatewayDao() {
+            return Mockito.mock(Site2SiteVpnGatewayDao.class);
+        }
+
+        @Bean
+        public Site2SiteVpnManager site2SiteVpnManager() {
+            return Mockito.mock(Site2SiteVpnManager.class);
+        }
+
+        @Bean
+        public VlanDao vlanDao() {
+            return Mockito.mock(VlanDao.class);
+        }
+
+        @Bean
+        public ResourceLimitService resourceLimitService() {
+            return Mockito.mock(ResourceLimitService.class);
+        }
+
+        @Bean
+        public VpcServiceMapDao vpcServiceMapDao() {
+            return Mockito.mock(VpcServiceMapDao.class);
+        }
+
+        @Bean
+        public NetworkService networkService() {
+            return Mockito.mock(NetworkService.class);
+        }
+
+        @Bean
+        public DataCenterDao dataCenterDao() {
+            return Mockito.mock(DataCenterDao.class);
+        }
+
+        @Bean
+        public ConfigurationServer configurationServer() {
+            return Mockito.mock(ConfigurationServer.class);
+        }
+
+        public static class Library implements TypeFilter {
+            @Override
+            public boolean match(MetadataReader mdr, MetadataReaderFactory arg1) throws IOException {
+                mdr.getClassMetadata().getClassName();
+                ComponentScan cs = VpcTestConfiguration.class.getAnnotation(ComponentScan.class);
+                return SpringUtils.includedInBasePackageClasses(mdr.getClassMetadata().getClassName(), cs);
+            }
+        }
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2e210600/server/test/org/apache/cloudstack/networkoffering/CreateNetworkOfferingTest.java
----------------------------------------------------------------------
diff --git a/server/test/org/apache/cloudstack/networkoffering/CreateNetworkOfferingTest.java b/server/test/org/apache/cloudstack/networkoffering/CreateNetworkOfferingTest.java
index cbb6c00..7946c1a 100644
--- a/server/test/org/apache/cloudstack/networkoffering/CreateNetworkOfferingTest.java
+++ b/server/test/org/apache/cloudstack/networkoffering/CreateNetworkOfferingTest.java
@@ -41,6 +41,7 @@ import com.cloud.network.Network;
 import com.cloud.network.Network.Provider;
 import com.cloud.network.Network.Service;
 import com.cloud.network.Networks.TrafficType;
+import com.cloud.network.vpc.VpcManager;
 import com.cloud.offering.NetworkOffering.Availability;
 import com.cloud.offerings.NetworkOfferingServiceMapVO;
 import com.cloud.offerings.NetworkOfferingVO;
@@ -72,6 +73,9 @@ public class CreateNetworkOfferingTest extends TestCase{
     @Inject
     AccountManager accountMgr;
     
+    @Inject
+    VpcManager vpcMgr;
+
     @Before
     public void setUp() {
     	ComponentContext.initComponentsLifeCycle();
@@ -180,4 +184,43 @@ public class CreateNetworkOfferingTest extends TestCase{
         assertNotNull("Isolated network offering with specifyIpRanges=true and with no sourceNatService, failed to create", off);
         
     }
+
+    @Test
+    public void createVpcNtwkOff() {
+        Map<Service, Set<Provider>> serviceProviderMap = new HashMap<Network.Service, Set<Network.Provider>>();
+        Set<Network.Provider> vrProvider = new HashSet<Network.Provider>();
+        vrProvider.add(Provider.VPCVirtualRouter);
+        serviceProviderMap.put(Network.Service.Dhcp , vrProvider);
+        serviceProviderMap.put(Network.Service.Dns , vrProvider);
+        serviceProviderMap.put(Network.Service.Lb , vrProvider);
+        serviceProviderMap.put(Network.Service.SourceNat , vrProvider);
+        serviceProviderMap.put(Network.Service.Gateway , vrProvider);
+        serviceProviderMap.put(Network.Service.Lb , vrProvider);
+        NetworkOfferingVO off = configMgr.createNetworkOffering("isolated", "isolated", TrafficType.Guest, null, true,
+                Availability.Optional, 200, serviceProviderMap, false, Network.GuestType.Isolated, false,
+                null, false, null, false, false);
+        // System.out.println("Creating Vpc Network Offering");
+        assertNotNull("Vpc Isolated network offering with Vpc provider ", off);
+    }
+
+    @Test
+    public void createVpcNtwkOffWithNetscaler() {
+        Map<Service, Set<Provider>> serviceProviderMap = new HashMap<Network.Service, Set<Network.Provider>>();
+        Set<Network.Provider> vrProvider = new HashSet<Network.Provider>();
+        Set<Network.Provider> lbProvider = new HashSet<Network.Provider>();
+        vrProvider.add(Provider.VPCVirtualRouter);
+        lbProvider.add(Provider.Netscaler);
+        serviceProviderMap.put(Network.Service.Dhcp, vrProvider);
+        serviceProviderMap.put(Network.Service.Dns, vrProvider);
+        serviceProviderMap.put(Network.Service.Lb, vrProvider);
+        serviceProviderMap.put(Network.Service.SourceNat, vrProvider);
+        serviceProviderMap.put(Network.Service.Gateway, vrProvider);
+        serviceProviderMap.put(Network.Service.Lb, lbProvider);
+        NetworkOfferingVO off = configMgr.createNetworkOffering("isolated", "isolated", TrafficType.Guest, null, true,
+                Availability.Optional, 200, serviceProviderMap, false, Network.GuestType.Isolated, false, null, false,
+                null, false, false);
+        // System.out.println("Creating Vpc Network Offering");
+        assertNotNull("Vpc Isolated network offering with Vpc and Netscaler provider ", off);
+    }
+
 }


[15/50] [abbrv] CLOUDSTACK-747: Internal LB between VPC tiers support

Posted by ah...@apache.org.
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2660a6b7/server/src/com/cloud/server/ManagementServerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/server/ManagementServerImpl.java b/server/src/com/cloud/server/ManagementServerImpl.java
index da8f30e..86c1a64 100755
--- a/server/src/com/cloud/server/ManagementServerImpl.java
+++ b/server/src/com/cloud/server/ManagementServerImpl.java
@@ -34,7 +34,6 @@ import java.util.List;
 import java.util.Map;
 import java.util.Set;
 import java.util.TimeZone;
-import java.util.UUID;
 import java.util.concurrent.Executors;
 import java.util.concurrent.ScheduledExecutorService;
 import java.util.concurrent.TimeUnit;
@@ -44,52 +43,371 @@ import javax.crypto.spec.SecretKeySpec;
 import javax.inject.Inject;
 import javax.naming.ConfigurationException;
 
-import com.cloud.configuration.*;
-import com.cloud.storage.dao.*;
+import org.apache.cloudstack.acl.ControlledEntity;
 import org.apache.cloudstack.acl.SecurityChecker.AccessType;
-import org.apache.cloudstack.api.ApiConstants;
-
-import com.cloud.event.ActionEventUtils;
-import org.apache.cloudstack.api.BaseUpdateTemplateOrIsoCmd;
-import org.apache.cloudstack.api.command.admin.account.*;
-import org.apache.cloudstack.api.command.admin.domain.*;
-import org.apache.cloudstack.api.command.admin.host.*;
-import org.apache.cloudstack.api.command.admin.network.*;
-import org.apache.cloudstack.api.command.admin.offering.*;
-import org.apache.cloudstack.api.command.admin.resource.*;
-import org.apache.cloudstack.api.command.admin.router.*;
-import org.apache.cloudstack.api.command.admin.storage.*;
-import org.apache.cloudstack.api.command.admin.systemvm.*;
-import org.apache.cloudstack.api.command.admin.usage.*;
-import org.apache.cloudstack.api.command.admin.user.*;
-import org.apache.cloudstack.api.command.admin.vlan.*;
-import org.apache.cloudstack.api.command.admin.vpc.*;
-import org.apache.cloudstack.api.command.user.autoscale.*;
-import org.apache.cloudstack.api.command.user.firewall.*;
-import org.apache.cloudstack.api.command.user.iso.*;
-import org.apache.cloudstack.api.command.user.loadbalancer.*;
-import org.apache.cloudstack.api.command.user.nat.*;
-import org.apache.cloudstack.api.command.user.network.*;
-import org.apache.cloudstack.api.command.user.project.*;
-import org.apache.cloudstack.api.command.user.resource.*;
-import org.apache.cloudstack.api.command.user.securitygroup.*;
-import org.apache.cloudstack.api.command.user.snapshot.*;
-import org.apache.cloudstack.api.command.user.template.*;
-import org.apache.cloudstack.api.command.user.vm.*;
-import org.apache.cloudstack.api.command.user.volume.*;
-import org.apache.cloudstack.api.command.user.vpc.*;
-import org.apache.cloudstack.api.command.user.vpn.*;
-import org.apache.cloudstack.api.response.ExtractResponse;
-import org.apache.commons.codec.binary.Base64;
-import org.apache.log4j.Logger;
 import org.apache.cloudstack.affinity.AffinityGroupProcessor;
 import org.apache.cloudstack.affinity.dao.AffinityGroupVMMapDao;
-
+import org.apache.cloudstack.api.ApiConstants;
+import org.apache.cloudstack.api.BaseUpdateTemplateOrIsoCmd;
+import org.apache.cloudstack.api.command.admin.account.CreateAccountCmd;
+import org.apache.cloudstack.api.command.admin.account.DeleteAccountCmd;
+import org.apache.cloudstack.api.command.admin.account.DisableAccountCmd;
+import org.apache.cloudstack.api.command.admin.account.EnableAccountCmd;
+import org.apache.cloudstack.api.command.admin.account.LockAccountCmd;
+import org.apache.cloudstack.api.command.admin.account.UpdateAccountCmd;
+import org.apache.cloudstack.api.command.admin.autoscale.CreateCounterCmd;
+import org.apache.cloudstack.api.command.admin.autoscale.DeleteCounterCmd;
+import org.apache.cloudstack.api.command.admin.cluster.AddClusterCmd;
+import org.apache.cloudstack.api.command.admin.cluster.DeleteClusterCmd;
+import org.apache.cloudstack.api.command.admin.cluster.ListClustersCmd;
+import org.apache.cloudstack.api.command.admin.cluster.UpdateClusterCmd;
+import org.apache.cloudstack.api.command.admin.config.ListCfgsByCmd;
+import org.apache.cloudstack.api.command.admin.config.ListHypervisorCapabilitiesCmd;
+import org.apache.cloudstack.api.command.admin.config.UpdateCfgCmd;
+import org.apache.cloudstack.api.command.admin.config.UpdateHypervisorCapabilitiesCmd;
+import org.apache.cloudstack.api.command.admin.domain.CreateDomainCmd;
+import org.apache.cloudstack.api.command.admin.domain.DeleteDomainCmd;
+import org.apache.cloudstack.api.command.admin.domain.ListDomainChildrenCmd;
+import org.apache.cloudstack.api.command.admin.domain.ListDomainsCmd;
+import org.apache.cloudstack.api.command.admin.domain.UpdateDomainCmd;
+import org.apache.cloudstack.api.command.admin.host.AddHostCmd;
+import org.apache.cloudstack.api.command.admin.host.AddSecondaryStorageCmd;
+import org.apache.cloudstack.api.command.admin.host.CancelMaintenanceCmd;
+import org.apache.cloudstack.api.command.admin.host.DeleteHostCmd;
+import org.apache.cloudstack.api.command.admin.host.FindHostsForMigrationCmd;
+import org.apache.cloudstack.api.command.admin.host.ListHostsCmd;
+import org.apache.cloudstack.api.command.admin.host.PrepareForMaintenanceCmd;
+import org.apache.cloudstack.api.command.admin.host.ReconnectHostCmd;
+import org.apache.cloudstack.api.command.admin.host.UpdateHostCmd;
+import org.apache.cloudstack.api.command.admin.host.UpdateHostPasswordCmd;
+import org.apache.cloudstack.api.command.admin.internallb.ConfigureInternalLoadBalancerElementCmd;
+import org.apache.cloudstack.api.command.admin.internallb.CreateInternalLoadBalancerElementCmd;
+import org.apache.cloudstack.api.command.admin.internallb.ListInternalLBVMsCmd;
+import org.apache.cloudstack.api.command.admin.internallb.ListInternalLoadBalancerElementsCmd;
+import org.apache.cloudstack.api.command.admin.internallb.StartInternalLBVMCmd;
+import org.apache.cloudstack.api.command.admin.internallb.StopInternalLBVMCmd;
+import org.apache.cloudstack.api.command.admin.ldap.LDAPConfigCmd;
+import org.apache.cloudstack.api.command.admin.ldap.LDAPRemoveCmd;
+import org.apache.cloudstack.api.command.admin.network.AddNetworkDeviceCmd;
+import org.apache.cloudstack.api.command.admin.network.AddNetworkServiceProviderCmd;
+import org.apache.cloudstack.api.command.admin.network.CreateNetworkOfferingCmd;
+import org.apache.cloudstack.api.command.admin.network.CreatePhysicalNetworkCmd;
+import org.apache.cloudstack.api.command.admin.network.CreateStorageNetworkIpRangeCmd;
+import org.apache.cloudstack.api.command.admin.network.DedicateGuestVlanRangeCmd;
+import org.apache.cloudstack.api.command.admin.network.DeleteNetworkDeviceCmd;
+import org.apache.cloudstack.api.command.admin.network.DeleteNetworkOfferingCmd;
+import org.apache.cloudstack.api.command.admin.network.DeleteNetworkServiceProviderCmd;
+import org.apache.cloudstack.api.command.admin.network.DeletePhysicalNetworkCmd;
+import org.apache.cloudstack.api.command.admin.network.DeleteStorageNetworkIpRangeCmd;
+import org.apache.cloudstack.api.command.admin.network.ListDedicatedGuestVlanRangesCmd;
+import org.apache.cloudstack.api.command.admin.network.ListNetworkDeviceCmd;
+import org.apache.cloudstack.api.command.admin.network.ListNetworkIsolationMethodsCmd;
+import org.apache.cloudstack.api.command.admin.network.ListNetworkServiceProvidersCmd;
+import org.apache.cloudstack.api.command.admin.network.ListPhysicalNetworksCmd;
+import org.apache.cloudstack.api.command.admin.network.ListStorageNetworkIpRangeCmd;
+import org.apache.cloudstack.api.command.admin.network.ListSupportedNetworkServicesCmd;
+import org.apache.cloudstack.api.command.admin.network.ReleaseDedicatedGuestVlanRangeCmd;
+import org.apache.cloudstack.api.command.admin.network.UpdateNetworkOfferingCmd;
+import org.apache.cloudstack.api.command.admin.network.UpdateNetworkServiceProviderCmd;
+import org.apache.cloudstack.api.command.admin.network.UpdatePhysicalNetworkCmd;
+import org.apache.cloudstack.api.command.admin.network.UpdateStorageNetworkIpRangeCmd;
+import org.apache.cloudstack.api.command.admin.offering.CreateDiskOfferingCmd;
+import org.apache.cloudstack.api.command.admin.offering.CreateServiceOfferingCmd;
+import org.apache.cloudstack.api.command.admin.offering.DeleteDiskOfferingCmd;
+import org.apache.cloudstack.api.command.admin.offering.DeleteServiceOfferingCmd;
+import org.apache.cloudstack.api.command.admin.offering.UpdateDiskOfferingCmd;
+import org.apache.cloudstack.api.command.admin.offering.UpdateServiceOfferingCmd;
+import org.apache.cloudstack.api.command.admin.pod.CreatePodCmd;
+import org.apache.cloudstack.api.command.admin.pod.DeletePodCmd;
+import org.apache.cloudstack.api.command.admin.pod.ListPodsByCmd;
+import org.apache.cloudstack.api.command.admin.pod.UpdatePodCmd;
+import org.apache.cloudstack.api.command.admin.region.AddRegionCmd;
+import org.apache.cloudstack.api.command.admin.region.RemoveRegionCmd;
+import org.apache.cloudstack.api.command.admin.region.UpdateRegionCmd;
+import org.apache.cloudstack.api.command.admin.resource.ArchiveAlertsCmd;
+import org.apache.cloudstack.api.command.admin.resource.DeleteAlertsCmd;
+import org.apache.cloudstack.api.command.admin.resource.ListAlertsCmd;
+import org.apache.cloudstack.api.command.admin.resource.ListCapacityCmd;
+import org.apache.cloudstack.api.command.admin.resource.UploadCustomCertificateCmd;
+import org.apache.cloudstack.api.command.admin.router.ConfigureVirtualRouterElementCmd;
+import org.apache.cloudstack.api.command.admin.router.CreateVirtualRouterElementCmd;
+import org.apache.cloudstack.api.command.admin.router.DestroyRouterCmd;
+import org.apache.cloudstack.api.command.admin.router.ListRoutersCmd;
+import org.apache.cloudstack.api.command.admin.router.ListVirtualRouterElementsCmd;
+import org.apache.cloudstack.api.command.admin.router.RebootRouterCmd;
+import org.apache.cloudstack.api.command.admin.router.StartRouterCmd;
+import org.apache.cloudstack.api.command.admin.router.StopRouterCmd;
+import org.apache.cloudstack.api.command.admin.router.UpgradeRouterCmd;
+import org.apache.cloudstack.api.command.admin.storage.AddS3Cmd;
+import org.apache.cloudstack.api.command.admin.storage.CancelPrimaryStorageMaintenanceCmd;
+import org.apache.cloudstack.api.command.admin.storage.CreateStoragePoolCmd;
+import org.apache.cloudstack.api.command.admin.storage.DeletePoolCmd;
+import org.apache.cloudstack.api.command.admin.storage.FindStoragePoolsForMigrationCmd;
+import org.apache.cloudstack.api.command.admin.storage.ListS3sCmd;
+import org.apache.cloudstack.api.command.admin.storage.ListStoragePoolsCmd;
+import org.apache.cloudstack.api.command.admin.storage.ListStorageProvidersCmd;
+import org.apache.cloudstack.api.command.admin.storage.PreparePrimaryStorageForMaintenanceCmd;
+import org.apache.cloudstack.api.command.admin.storage.UpdateStoragePoolCmd;
+import org.apache.cloudstack.api.command.admin.swift.AddSwiftCmd;
+import org.apache.cloudstack.api.command.admin.swift.ListSwiftsCmd;
+import org.apache.cloudstack.api.command.admin.systemvm.DestroySystemVmCmd;
+import org.apache.cloudstack.api.command.admin.systemvm.ListSystemVMsCmd;
+import org.apache.cloudstack.api.command.admin.systemvm.MigrateSystemVMCmd;
+import org.apache.cloudstack.api.command.admin.systemvm.RebootSystemVmCmd;
+import org.apache.cloudstack.api.command.admin.systemvm.StartSystemVMCmd;
+import org.apache.cloudstack.api.command.admin.systemvm.StopSystemVmCmd;
+import org.apache.cloudstack.api.command.admin.systemvm.UpgradeSystemVMCmd;
+import org.apache.cloudstack.api.command.admin.template.PrepareTemplateCmd;
+import org.apache.cloudstack.api.command.admin.usage.AddTrafficMonitorCmd;
+import org.apache.cloudstack.api.command.admin.usage.AddTrafficTypeCmd;
+import org.apache.cloudstack.api.command.admin.usage.DeleteTrafficMonitorCmd;
+import org.apache.cloudstack.api.command.admin.usage.DeleteTrafficTypeCmd;
+import org.apache.cloudstack.api.command.admin.usage.GenerateUsageRecordsCmd;
+import org.apache.cloudstack.api.command.admin.usage.GetUsageRecordsCmd;
+import org.apache.cloudstack.api.command.admin.usage.ListTrafficMonitorsCmd;
+import org.apache.cloudstack.api.command.admin.usage.ListTrafficTypeImplementorsCmd;
+import org.apache.cloudstack.api.command.admin.usage.ListTrafficTypesCmd;
+import org.apache.cloudstack.api.command.admin.usage.ListUsageTypesCmd;
+import org.apache.cloudstack.api.command.admin.usage.UpdateTrafficTypeCmd;
+import org.apache.cloudstack.api.command.admin.user.CreateUserCmd;
+import org.apache.cloudstack.api.command.admin.user.DeleteUserCmd;
+import org.apache.cloudstack.api.command.admin.user.DisableUserCmd;
+import org.apache.cloudstack.api.command.admin.user.EnableUserCmd;
+import org.apache.cloudstack.api.command.admin.user.GetUserCmd;
+import org.apache.cloudstack.api.command.admin.user.ListUsersCmd;
+import org.apache.cloudstack.api.command.admin.user.LockUserCmd;
+import org.apache.cloudstack.api.command.admin.user.RegisterCmd;
+import org.apache.cloudstack.api.command.admin.user.UpdateUserCmd;
+import org.apache.cloudstack.api.command.admin.vlan.CreateVlanIpRangeCmd;
+import org.apache.cloudstack.api.command.admin.vlan.DedicatePublicIpRangeCmd;
+import org.apache.cloudstack.api.command.admin.vlan.DeleteVlanIpRangeCmd;
+import org.apache.cloudstack.api.command.admin.vlan.ListVlanIpRangesCmd;
+import org.apache.cloudstack.api.command.admin.vlan.ReleasePublicIpRangeCmd;
+import org.apache.cloudstack.api.command.admin.vm.AssignVMCmd;
+import org.apache.cloudstack.api.command.admin.vm.MigrateVMCmd;
+import org.apache.cloudstack.api.command.admin.vm.MigrateVirtualMachineWithVolumeCmd;
+import org.apache.cloudstack.api.command.admin.vm.RecoverVMCmd;
+import org.apache.cloudstack.api.command.admin.vpc.CreatePrivateGatewayCmd;
+import org.apache.cloudstack.api.command.admin.vpc.CreateVPCOfferingCmd;
+import org.apache.cloudstack.api.command.admin.vpc.DeletePrivateGatewayCmd;
+import org.apache.cloudstack.api.command.admin.vpc.DeleteVPCOfferingCmd;
+import org.apache.cloudstack.api.command.admin.vpc.UpdateVPCOfferingCmd;
+import org.apache.cloudstack.api.command.admin.zone.CreateZoneCmd;
+import org.apache.cloudstack.api.command.admin.zone.DeleteZoneCmd;
+import org.apache.cloudstack.api.command.admin.zone.MarkDefaultZoneForAccountCmd;
+import org.apache.cloudstack.api.command.admin.zone.UpdateZoneCmd;
+import org.apache.cloudstack.api.command.user.account.AddAccountToProjectCmd;
+import org.apache.cloudstack.api.command.user.account.DeleteAccountFromProjectCmd;
+import org.apache.cloudstack.api.command.user.account.ListAccountsCmd;
+import org.apache.cloudstack.api.command.user.account.ListProjectAccountsCmd;
+import org.apache.cloudstack.api.command.user.address.AssociateIPAddrCmd;
+import org.apache.cloudstack.api.command.user.address.DisassociateIPAddrCmd;
+import org.apache.cloudstack.api.command.user.address.ListPublicIpAddressesCmd;
 import org.apache.cloudstack.api.command.user.affinitygroup.CreateAffinityGroupCmd;
 import org.apache.cloudstack.api.command.user.affinitygroup.DeleteAffinityGroupCmd;
 import org.apache.cloudstack.api.command.user.affinitygroup.ListAffinityGroupTypesCmd;
 import org.apache.cloudstack.api.command.user.affinitygroup.ListAffinityGroupsCmd;
 import org.apache.cloudstack.api.command.user.affinitygroup.UpdateVMAffinityGroupCmd;
+import org.apache.cloudstack.api.command.user.autoscale.CreateAutoScalePolicyCmd;
+import org.apache.cloudstack.api.command.user.autoscale.CreateAutoScaleVmGroupCmd;
+import org.apache.cloudstack.api.command.user.autoscale.CreateAutoScaleVmProfileCmd;
+import org.apache.cloudstack.api.command.user.autoscale.CreateConditionCmd;
+import org.apache.cloudstack.api.command.user.autoscale.DeleteAutoScalePolicyCmd;
+import org.apache.cloudstack.api.command.user.autoscale.DeleteAutoScaleVmGroupCmd;
+import org.apache.cloudstack.api.command.user.autoscale.DeleteAutoScaleVmProfileCmd;
+import org.apache.cloudstack.api.command.user.autoscale.DeleteConditionCmd;
+import org.apache.cloudstack.api.command.user.autoscale.DisableAutoScaleVmGroupCmd;
+import org.apache.cloudstack.api.command.user.autoscale.EnableAutoScaleVmGroupCmd;
+import org.apache.cloudstack.api.command.user.autoscale.ListAutoScalePoliciesCmd;
+import org.apache.cloudstack.api.command.user.autoscale.ListAutoScaleVmGroupsCmd;
+import org.apache.cloudstack.api.command.user.autoscale.ListAutoScaleVmProfilesCmd;
+import org.apache.cloudstack.api.command.user.autoscale.ListConditionsCmd;
+import org.apache.cloudstack.api.command.user.autoscale.ListCountersCmd;
+import org.apache.cloudstack.api.command.user.autoscale.UpdateAutoScalePolicyCmd;
+import org.apache.cloudstack.api.command.user.autoscale.UpdateAutoScaleVmGroupCmd;
+import org.apache.cloudstack.api.command.user.autoscale.UpdateAutoScaleVmProfileCmd;
+import org.apache.cloudstack.api.command.user.config.ListCapabilitiesCmd;
+import org.apache.cloudstack.api.command.user.event.ArchiveEventsCmd;
+import org.apache.cloudstack.api.command.user.event.DeleteEventsCmd;
+import org.apache.cloudstack.api.command.user.event.ListEventTypesCmd;
+import org.apache.cloudstack.api.command.user.event.ListEventsCmd;
+import org.apache.cloudstack.api.command.user.firewall.CreateEgressFirewallRuleCmd;
+import org.apache.cloudstack.api.command.user.firewall.CreateFirewallRuleCmd;
+import org.apache.cloudstack.api.command.user.firewall.CreatePortForwardingRuleCmd;
+import org.apache.cloudstack.api.command.user.firewall.DeleteEgressFirewallRuleCmd;
+import org.apache.cloudstack.api.command.user.firewall.DeleteFirewallRuleCmd;
+import org.apache.cloudstack.api.command.user.firewall.DeletePortForwardingRuleCmd;
+import org.apache.cloudstack.api.command.user.firewall.ListEgressFirewallRulesCmd;
+import org.apache.cloudstack.api.command.user.firewall.ListFirewallRulesCmd;
+import org.apache.cloudstack.api.command.user.firewall.ListPortForwardingRulesCmd;
+import org.apache.cloudstack.api.command.user.firewall.UpdatePortForwardingRuleCmd;
+import org.apache.cloudstack.api.command.user.guest.ListGuestOsCategoriesCmd;
+import org.apache.cloudstack.api.command.user.guest.ListGuestOsCmd;
+import org.apache.cloudstack.api.command.user.iso.AttachIsoCmd;
+import org.apache.cloudstack.api.command.user.iso.CopyIsoCmd;
+import org.apache.cloudstack.api.command.user.iso.DeleteIsoCmd;
+import org.apache.cloudstack.api.command.user.iso.DetachIsoCmd;
+import org.apache.cloudstack.api.command.user.iso.ExtractIsoCmd;
+import org.apache.cloudstack.api.command.user.iso.ListIsoPermissionsCmd;
+import org.apache.cloudstack.api.command.user.iso.ListIsosCmd;
+import org.apache.cloudstack.api.command.user.iso.RegisterIsoCmd;
+import org.apache.cloudstack.api.command.user.iso.UpdateIsoCmd;
+import org.apache.cloudstack.api.command.user.iso.UpdateIsoPermissionsCmd;
+import org.apache.cloudstack.api.command.user.job.ListAsyncJobsCmd;
+import org.apache.cloudstack.api.command.user.job.QueryAsyncJobResultCmd;
+import org.apache.cloudstack.api.command.user.loadbalancer.AssignToLoadBalancerRuleCmd;
+import org.apache.cloudstack.api.command.user.loadbalancer.CreateApplicationLoadBalancerCmd;
+import org.apache.cloudstack.api.command.user.loadbalancer.CreateLBHealthCheckPolicyCmd;
+import org.apache.cloudstack.api.command.user.loadbalancer.CreateLBStickinessPolicyCmd;
+import org.apache.cloudstack.api.command.user.loadbalancer.CreateLoadBalancerRuleCmd;
+import org.apache.cloudstack.api.command.user.loadbalancer.DeleteApplicationLoadBalancerCmd;
+import org.apache.cloudstack.api.command.user.loadbalancer.DeleteLBHealthCheckPolicyCmd;
+import org.apache.cloudstack.api.command.user.loadbalancer.DeleteLBStickinessPolicyCmd;
+import org.apache.cloudstack.api.command.user.loadbalancer.DeleteLoadBalancerRuleCmd;
+import org.apache.cloudstack.api.command.user.loadbalancer.ListApplicationLoadBalancersCmd;
+import org.apache.cloudstack.api.command.user.loadbalancer.ListLBHealthCheckPoliciesCmd;
+import org.apache.cloudstack.api.command.user.loadbalancer.ListLBStickinessPoliciesCmd;
+import org.apache.cloudstack.api.command.user.loadbalancer.ListLoadBalancerRuleInstancesCmd;
+import org.apache.cloudstack.api.command.user.loadbalancer.ListLoadBalancerRulesCmd;
+import org.apache.cloudstack.api.command.user.loadbalancer.RemoveFromLoadBalancerRuleCmd;
+import org.apache.cloudstack.api.command.user.loadbalancer.UpdateLoadBalancerRuleCmd;
+import org.apache.cloudstack.api.command.user.nat.CreateIpForwardingRuleCmd;
+import org.apache.cloudstack.api.command.user.nat.DeleteIpForwardingRuleCmd;
+import org.apache.cloudstack.api.command.user.nat.DisableStaticNatCmd;
+import org.apache.cloudstack.api.command.user.nat.EnableStaticNatCmd;
+import org.apache.cloudstack.api.command.user.nat.ListIpForwardingRulesCmd;
+import org.apache.cloudstack.api.command.user.network.CreateNetworkACLCmd;
+import org.apache.cloudstack.api.command.user.network.CreateNetworkCmd;
+import org.apache.cloudstack.api.command.user.network.DeleteNetworkACLCmd;
+import org.apache.cloudstack.api.command.user.network.DeleteNetworkCmd;
+import org.apache.cloudstack.api.command.user.network.ListNetworkACLsCmd;
+import org.apache.cloudstack.api.command.user.network.ListNetworkOfferingsCmd;
+import org.apache.cloudstack.api.command.user.network.ListNetworksCmd;
+import org.apache.cloudstack.api.command.user.network.RestartNetworkCmd;
+import org.apache.cloudstack.api.command.user.network.UpdateNetworkCmd;
+import org.apache.cloudstack.api.command.user.offering.ListDiskOfferingsCmd;
+import org.apache.cloudstack.api.command.user.offering.ListServiceOfferingsCmd;
+import org.apache.cloudstack.api.command.user.project.ActivateProjectCmd;
+import org.apache.cloudstack.api.command.user.project.CreateProjectCmd;
+import org.apache.cloudstack.api.command.user.project.DeleteProjectCmd;
+import org.apache.cloudstack.api.command.user.project.DeleteProjectInvitationCmd;
+import org.apache.cloudstack.api.command.user.project.ListProjectInvitationsCmd;
+import org.apache.cloudstack.api.command.user.project.ListProjectsCmd;
+import org.apache.cloudstack.api.command.user.project.SuspendProjectCmd;
+import org.apache.cloudstack.api.command.user.project.UpdateProjectCmd;
+import org.apache.cloudstack.api.command.user.project.UpdateProjectInvitationCmd;
+import org.apache.cloudstack.api.command.user.region.ListRegionsCmd;
+import org.apache.cloudstack.api.command.user.region.ha.gslb.AssignToGlobalLoadBalancerRuleCmd;
+import org.apache.cloudstack.api.command.user.region.ha.gslb.CreateGlobalLoadBalancerRuleCmd;
+import org.apache.cloudstack.api.command.user.region.ha.gslb.DeleteGlobalLoadBalancerRuleCmd;
+import org.apache.cloudstack.api.command.user.region.ha.gslb.ListGlobalLoadBalancerRuleCmd;
+import org.apache.cloudstack.api.command.user.region.ha.gslb.RemoveFromGlobalLoadBalancerRuleCmd;
+import org.apache.cloudstack.api.command.user.resource.GetCloudIdentifierCmd;
+import org.apache.cloudstack.api.command.user.resource.ListHypervisorsCmd;
+import org.apache.cloudstack.api.command.user.resource.ListResourceLimitsCmd;
+import org.apache.cloudstack.api.command.user.resource.UpdateResourceCountCmd;
+import org.apache.cloudstack.api.command.user.resource.UpdateResourceLimitCmd;
+import org.apache.cloudstack.api.command.user.securitygroup.AuthorizeSecurityGroupEgressCmd;
+import org.apache.cloudstack.api.command.user.securitygroup.AuthorizeSecurityGroupIngressCmd;
+import org.apache.cloudstack.api.command.user.securitygroup.CreateSecurityGroupCmd;
+import org.apache.cloudstack.api.command.user.securitygroup.DeleteSecurityGroupCmd;
+import org.apache.cloudstack.api.command.user.securitygroup.ListSecurityGroupsCmd;
+import org.apache.cloudstack.api.command.user.securitygroup.RevokeSecurityGroupEgressCmd;
+import org.apache.cloudstack.api.command.user.securitygroup.RevokeSecurityGroupIngressCmd;
+import org.apache.cloudstack.api.command.user.snapshot.CreateSnapshotCmd;
+import org.apache.cloudstack.api.command.user.snapshot.CreateSnapshotPolicyCmd;
+import org.apache.cloudstack.api.command.user.snapshot.DeleteSnapshotCmd;
+import org.apache.cloudstack.api.command.user.snapshot.DeleteSnapshotPoliciesCmd;
+import org.apache.cloudstack.api.command.user.snapshot.ListSnapshotPoliciesCmd;
+import org.apache.cloudstack.api.command.user.snapshot.ListSnapshotsCmd;
+import org.apache.cloudstack.api.command.user.ssh.CreateSSHKeyPairCmd;
+import org.apache.cloudstack.api.command.user.ssh.DeleteSSHKeyPairCmd;
+import org.apache.cloudstack.api.command.user.ssh.ListSSHKeyPairsCmd;
+import org.apache.cloudstack.api.command.user.ssh.RegisterSSHKeyPairCmd;
+import org.apache.cloudstack.api.command.user.tag.CreateTagsCmd;
+import org.apache.cloudstack.api.command.user.tag.DeleteTagsCmd;
+import org.apache.cloudstack.api.command.user.tag.ListTagsCmd;
+import org.apache.cloudstack.api.command.user.template.CopyTemplateCmd;
+import org.apache.cloudstack.api.command.user.template.CreateTemplateCmd;
+import org.apache.cloudstack.api.command.user.template.DeleteTemplateCmd;
+import org.apache.cloudstack.api.command.user.template.ExtractTemplateCmd;
+import org.apache.cloudstack.api.command.user.template.ListTemplatePermissionsCmd;
+import org.apache.cloudstack.api.command.user.template.ListTemplatesCmd;
+import org.apache.cloudstack.api.command.user.template.RegisterTemplateCmd;
+import org.apache.cloudstack.api.command.user.template.UpdateTemplateCmd;
+import org.apache.cloudstack.api.command.user.template.UpdateTemplatePermissionsCmd;
+import org.apache.cloudstack.api.command.user.vm.AddIpToVmNicCmd;
+import org.apache.cloudstack.api.command.user.vm.AddNicToVMCmd;
+import org.apache.cloudstack.api.command.user.vm.DeployVMCmd;
+import org.apache.cloudstack.api.command.user.vm.DestroyVMCmd;
+import org.apache.cloudstack.api.command.user.vm.GetVMPasswordCmd;
+import org.apache.cloudstack.api.command.user.vm.ListNicsCmd;
+import org.apache.cloudstack.api.command.user.vm.ListVMsCmd;
+import org.apache.cloudstack.api.command.user.vm.RebootVMCmd;
+import org.apache.cloudstack.api.command.user.vm.RemoveIpFromVmNicCmd;
+import org.apache.cloudstack.api.command.user.vm.RemoveNicFromVMCmd;
+import org.apache.cloudstack.api.command.user.vm.ResetVMPasswordCmd;
+import org.apache.cloudstack.api.command.user.vm.ResetVMSSHKeyCmd;
+import org.apache.cloudstack.api.command.user.vm.RestoreVMCmd;
+import org.apache.cloudstack.api.command.user.vm.ScaleVMCmd;
+import org.apache.cloudstack.api.command.user.vm.StartVMCmd;
+import org.apache.cloudstack.api.command.user.vm.StopVMCmd;
+import org.apache.cloudstack.api.command.user.vm.UpdateDefaultNicForVMCmd;
+import org.apache.cloudstack.api.command.user.vm.UpdateVMCmd;
+import org.apache.cloudstack.api.command.user.vm.UpgradeVMCmd;
+import org.apache.cloudstack.api.command.user.vmgroup.CreateVMGroupCmd;
+import org.apache.cloudstack.api.command.user.vmgroup.DeleteVMGroupCmd;
+import org.apache.cloudstack.api.command.user.vmgroup.ListVMGroupsCmd;
+import org.apache.cloudstack.api.command.user.vmgroup.UpdateVMGroupCmd;
+import org.apache.cloudstack.api.command.user.vmsnapshot.CreateVMSnapshotCmd;
+import org.apache.cloudstack.api.command.user.vmsnapshot.DeleteVMSnapshotCmd;
+import org.apache.cloudstack.api.command.user.vmsnapshot.ListVMSnapshotCmd;
+import org.apache.cloudstack.api.command.user.vmsnapshot.RevertToVMSnapshotCmd;
+import org.apache.cloudstack.api.command.user.volume.AttachVolumeCmd;
+import org.apache.cloudstack.api.command.user.volume.CreateVolumeCmd;
+import org.apache.cloudstack.api.command.user.volume.DeleteVolumeCmd;
+import org.apache.cloudstack.api.command.user.volume.DetachVolumeCmd;
+import org.apache.cloudstack.api.command.user.volume.ExtractVolumeCmd;
+import org.apache.cloudstack.api.command.user.volume.ListVolumesCmd;
+import org.apache.cloudstack.api.command.user.volume.MigrateVolumeCmd;
+import org.apache.cloudstack.api.command.user.volume.ResizeVolumeCmd;
+import org.apache.cloudstack.api.command.user.volume.UploadVolumeCmd;
+import org.apache.cloudstack.api.command.user.vpc.CreateStaticRouteCmd;
+import org.apache.cloudstack.api.command.user.vpc.CreateVPCCmd;
+import org.apache.cloudstack.api.command.user.vpc.DeleteStaticRouteCmd;
+import org.apache.cloudstack.api.command.user.vpc.DeleteVPCCmd;
+import org.apache.cloudstack.api.command.user.vpc.ListPrivateGatewaysCmd;
+import org.apache.cloudstack.api.command.user.vpc.ListStaticRoutesCmd;
+import org.apache.cloudstack.api.command.user.vpc.ListVPCOfferingsCmd;
+import org.apache.cloudstack.api.command.user.vpc.ListVPCsCmd;
+import org.apache.cloudstack.api.command.user.vpc.RestartVPCCmd;
+import org.apache.cloudstack.api.command.user.vpc.UpdateVPCCmd;
+import org.apache.cloudstack.api.command.user.vpn.AddVpnUserCmd;
+import org.apache.cloudstack.api.command.user.vpn.CreateRemoteAccessVpnCmd;
+import org.apache.cloudstack.api.command.user.vpn.CreateVpnConnectionCmd;
+import org.apache.cloudstack.api.command.user.vpn.CreateVpnCustomerGatewayCmd;
+import org.apache.cloudstack.api.command.user.vpn.CreateVpnGatewayCmd;
+import org.apache.cloudstack.api.command.user.vpn.DeleteRemoteAccessVpnCmd;
+import org.apache.cloudstack.api.command.user.vpn.DeleteVpnConnectionCmd;
+import org.apache.cloudstack.api.command.user.vpn.DeleteVpnCustomerGatewayCmd;
+import org.apache.cloudstack.api.command.user.vpn.DeleteVpnGatewayCmd;
+import org.apache.cloudstack.api.command.user.vpn.ListRemoteAccessVpnsCmd;
+import org.apache.cloudstack.api.command.user.vpn.ListVpnConnectionsCmd;
+import org.apache.cloudstack.api.command.user.vpn.ListVpnCustomerGatewaysCmd;
+import org.apache.cloudstack.api.command.user.vpn.ListVpnGatewaysCmd;
+import org.apache.cloudstack.api.command.user.vpn.ListVpnUsersCmd;
+import org.apache.cloudstack.api.command.user.vpn.RemoveVpnUserCmd;
+import org.apache.cloudstack.api.command.user.vpn.ResetVpnConnectionCmd;
+import org.apache.cloudstack.api.command.user.vpn.UpdateVpnCustomerGatewayCmd;
+import org.apache.cloudstack.api.command.user.zone.ListZonesByCmd;
+import org.apache.cloudstack.api.response.ExtractResponse;
+import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager;
+import org.apache.cloudstack.engine.subsystem.api.storage.StoragePoolAllocator;
+import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao;
+import org.apache.cloudstack.storage.datastore.db.StoragePoolVO;
+import org.apache.commons.codec.binary.Base64;
+import org.apache.log4j.Logger;
+
 import com.cloud.agent.AgentManager;
 import com.cloud.agent.api.GetVncPortAnswer;
 import com.cloud.agent.api.GetVncPortCommand;
@@ -103,28 +421,53 @@ import com.cloud.alert.AlertManager;
 import com.cloud.alert.AlertVO;
 import com.cloud.alert.dao.AlertDao;
 import com.cloud.api.ApiDBUtils;
-import com.cloud.async.*;
+import com.cloud.async.AsyncJobExecutor;
+import com.cloud.async.AsyncJobManager;
+import com.cloud.async.AsyncJobResult;
+import com.cloud.async.AsyncJobVO;
+import com.cloud.async.BaseAsyncJobExecutor;
 import com.cloud.capacity.Capacity;
 import com.cloud.capacity.CapacityVO;
 import com.cloud.capacity.dao.CapacityDao;
 import com.cloud.capacity.dao.CapacityDaoImpl.SummedCapacity;
 import com.cloud.cluster.ClusterManager;
+import com.cloud.configuration.Config;
+import com.cloud.configuration.Configuration;
+import com.cloud.configuration.ConfigurationManager;
+import com.cloud.configuration.ConfigurationVO;
 import com.cloud.configuration.dao.ConfigurationDao;
 import com.cloud.consoleproxy.ConsoleProxyManagementState;
 import com.cloud.consoleproxy.ConsoleProxyManager;
-import com.cloud.dc.*;
+import com.cloud.dc.AccountVlanMapVO;
+import com.cloud.dc.ClusterVO;
+import com.cloud.dc.DataCenterVO;
+import com.cloud.dc.HostPodVO;
+import com.cloud.dc.Pod;
+import com.cloud.dc.PodVlanMapVO;
+import com.cloud.dc.Vlan;
 import com.cloud.dc.Vlan.VlanType;
-import com.cloud.dc.dao.*;
+import com.cloud.dc.VlanVO;
+import com.cloud.dc.dao.AccountVlanMapDao;
+import com.cloud.dc.dao.ClusterDao;
+import com.cloud.dc.dao.DataCenterDao;
+import com.cloud.dc.dao.HostPodDao;
+import com.cloud.dc.dao.PodVlanMapDao;
+import com.cloud.dc.dao.VlanDao;
 import com.cloud.deploy.DataCenterDeployment;
-import com.cloud.deploy.DeploymentPlanner;
 import com.cloud.deploy.DeploymentPlanner.ExcludeList;
 import com.cloud.domain.DomainVO;
 import com.cloud.domain.dao.DomainDao;
 import com.cloud.event.ActionEvent;
+import com.cloud.event.ActionEventUtils;
 import com.cloud.event.EventTypes;
 import com.cloud.event.EventVO;
 import com.cloud.event.dao.EventDao;
-import com.cloud.exception.*;
+import com.cloud.exception.ConcurrentOperationException;
+import com.cloud.exception.InvalidParameterValueException;
+import com.cloud.exception.OperationTimedoutException;
+import com.cloud.exception.PermissionDeniedException;
+import com.cloud.exception.ResourceUnavailableException;
+import com.cloud.exception.StorageUnavailableException;
 import com.cloud.ha.HighAvailabilityManager;
 import com.cloud.host.DetailVO;
 import com.cloud.host.Host;
@@ -141,7 +484,12 @@ import com.cloud.hypervisor.dao.HypervisorCapabilitiesDao;
 import com.cloud.info.ConsoleProxyInfo;
 import com.cloud.keystore.KeystoreManager;
 import com.cloud.network.IpAddress;
-import com.cloud.network.dao.*;
+import com.cloud.network.dao.IPAddressDao;
+import com.cloud.network.dao.IPAddressVO;
+import com.cloud.network.dao.LoadBalancerDao;
+import com.cloud.network.dao.LoadBalancerVO;
+import com.cloud.network.dao.NetworkDao;
+import com.cloud.network.dao.NetworkVO;
 import com.cloud.org.Cluster;
 import com.cloud.org.Grouping.AllocationState;
 import com.cloud.projects.Project;
@@ -150,11 +498,29 @@ import com.cloud.projects.ProjectManager;
 import com.cloud.resource.ResourceManager;
 import com.cloud.server.ResourceTag.TaggedResourceType;
 import com.cloud.server.auth.UserAuthenticator;
-import com.cloud.service.ServiceOfferingVO;
 import com.cloud.service.dao.ServiceOfferingDao;
-import com.cloud.storage.*;
+import com.cloud.storage.DiskOfferingVO;
+import com.cloud.storage.GuestOS;
+import com.cloud.storage.GuestOSCategoryVO;
+import com.cloud.storage.GuestOSVO;
+import com.cloud.storage.GuestOsCategory;
+import com.cloud.storage.Storage;
 import com.cloud.storage.Storage.ImageFormat;
+import com.cloud.storage.StorageManager;
+import com.cloud.storage.StoragePool;
+import com.cloud.storage.Upload;
 import com.cloud.storage.Upload.Mode;
+import com.cloud.storage.UploadVO;
+import com.cloud.storage.VMTemplateVO;
+import com.cloud.storage.Volume;
+import com.cloud.storage.VolumeManager;
+import com.cloud.storage.VolumeVO;
+import com.cloud.storage.dao.DiskOfferingDao;
+import com.cloud.storage.dao.GuestOSCategoryDao;
+import com.cloud.storage.dao.GuestOSDao;
+import com.cloud.storage.dao.UploadDao;
+import com.cloud.storage.dao.VMTemplateDao;
+import com.cloud.storage.dao.VolumeDao;
 import com.cloud.storage.s3.S3Manager;
 import com.cloud.storage.secondary.SecondaryStorageVmManager;
 import com.cloud.storage.snapshot.SnapshotManager;
@@ -164,7 +530,13 @@ import com.cloud.tags.ResourceTagVO;
 import com.cloud.tags.dao.ResourceTagDao;
 import com.cloud.template.TemplateManager;
 import com.cloud.template.VirtualMachineTemplate.TemplateFilter;
-import com.cloud.user.*;
+import com.cloud.user.Account;
+import com.cloud.user.AccountManager;
+import com.cloud.user.SSHKeyPair;
+import com.cloud.user.SSHKeyPairVO;
+import com.cloud.user.User;
+import com.cloud.user.UserContext;
+import com.cloud.user.UserVO;
 import com.cloud.user.dao.AccountDao;
 import com.cloud.user.dao.SSHKeyPairDao;
 import com.cloud.user.dao.UserDao;
@@ -177,91 +549,39 @@ import com.cloud.utils.component.ComponentLifecycle;
 import com.cloud.utils.component.ManagerBase;
 import com.cloud.utils.concurrency.NamedThreadFactory;
 import com.cloud.utils.crypt.DBEncryptionUtil;
-import com.cloud.utils.db.*;
+import com.cloud.utils.db.DB;
+import com.cloud.utils.db.Filter;
+import com.cloud.utils.db.GlobalLock;
+import com.cloud.utils.db.JoinBuilder;
 import com.cloud.utils.db.JoinBuilder.JoinType;
+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.utils.net.MacAddress;
 import com.cloud.utils.net.NetUtils;
 import com.cloud.utils.ssh.SSHKeysHelper;
-import com.cloud.vm.*;
+import com.cloud.vm.ConsoleProxyVO;
+import com.cloud.vm.DiskProfile;
+import com.cloud.vm.InstanceGroupVO;
+import com.cloud.vm.SecondaryStorageVmVO;
+import com.cloud.vm.UserVmVO;
+import com.cloud.vm.VMInstanceVO;
+import com.cloud.vm.VirtualMachine;
 import com.cloud.vm.VirtualMachine.State;
-import com.cloud.vm.dao.*;
+import com.cloud.vm.VirtualMachineManager;
+import com.cloud.vm.VirtualMachineProfile;
+import com.cloud.vm.VirtualMachineProfileImpl;
+import com.cloud.vm.dao.ConsoleProxyDao;
+import com.cloud.vm.dao.DomainRouterDao;
+import com.cloud.vm.dao.InstanceGroupDao;
+import com.cloud.vm.dao.SecondaryStorageVmDao;
+import com.cloud.vm.dao.UserVmDao;
+import com.cloud.vm.dao.VMInstanceDao;
+
 import edu.emory.mathcs.backport.java.util.Arrays;
 import edu.emory.mathcs.backport.java.util.Collections;
-import org.apache.cloudstack.acl.ControlledEntity;
-import org.apache.cloudstack.api.command.admin.autoscale.CreateCounterCmd;
-import org.apache.cloudstack.api.command.admin.autoscale.DeleteCounterCmd;
-import org.apache.cloudstack.api.command.admin.cluster.AddClusterCmd;
-import org.apache.cloudstack.api.command.admin.cluster.DeleteClusterCmd;
-import org.apache.cloudstack.api.command.admin.cluster.ListClustersCmd;
-import org.apache.cloudstack.api.command.admin.cluster.UpdateClusterCmd;
-import org.apache.cloudstack.api.command.admin.config.ListCfgsByCmd;
-import org.apache.cloudstack.api.command.admin.config.ListHypervisorCapabilitiesCmd;
-import org.apache.cloudstack.api.command.admin.config.UpdateCfgCmd;
-import org.apache.cloudstack.api.command.admin.config.UpdateHypervisorCapabilitiesCmd;
-import org.apache.cloudstack.api.command.admin.ldap.LDAPConfigCmd;
-import org.apache.cloudstack.api.command.admin.ldap.LDAPRemoveCmd;
-import org.apache.cloudstack.api.command.admin.pod.CreatePodCmd;
-import org.apache.cloudstack.api.command.admin.pod.DeletePodCmd;
-import org.apache.cloudstack.api.command.admin.pod.ListPodsByCmd;
-import org.apache.cloudstack.api.command.admin.pod.UpdatePodCmd;
-import org.apache.cloudstack.api.command.admin.region.AddRegionCmd;
-import org.apache.cloudstack.api.command.admin.region.RemoveRegionCmd;
-import org.apache.cloudstack.api.command.admin.region.UpdateRegionCmd;
-import org.apache.cloudstack.api.command.admin.swift.AddSwiftCmd;
-import org.apache.cloudstack.api.command.admin.swift.ListSwiftsCmd;
-import org.apache.cloudstack.api.command.admin.template.PrepareTemplateCmd;
-import org.apache.cloudstack.api.command.admin.vlan.CreateVlanIpRangeCmd;
-import org.apache.cloudstack.api.command.admin.vlan.DeleteVlanIpRangeCmd;
-import org.apache.cloudstack.api.command.admin.vlan.ListVlanIpRangesCmd;
-import org.apache.cloudstack.api.command.admin.vm.AssignVMCmd;
-import org.apache.cloudstack.api.command.admin.vm.MigrateVMCmd;
-import org.apache.cloudstack.api.command.admin.vm.MigrateVirtualMachineWithVolumeCmd;
-import org.apache.cloudstack.api.command.admin.vm.RecoverVMCmd;
-import org.apache.cloudstack.api.command.admin.zone.CreateZoneCmd;
-import org.apache.cloudstack.api.command.admin.zone.DeleteZoneCmd;
-import org.apache.cloudstack.api.command.admin.zone.MarkDefaultZoneForAccountCmd;
-import org.apache.cloudstack.api.command.admin.zone.UpdateZoneCmd;
-import org.apache.cloudstack.api.command.user.account.AddAccountToProjectCmd;
-import org.apache.cloudstack.api.command.user.account.DeleteAccountFromProjectCmd;
-import org.apache.cloudstack.api.command.user.account.ListAccountsCmd;
-import org.apache.cloudstack.api.command.user.account.ListProjectAccountsCmd;
-import org.apache.cloudstack.api.command.user.address.AssociateIPAddrCmd;
-import org.apache.cloudstack.api.command.user.address.DisassociateIPAddrCmd;
-import org.apache.cloudstack.api.command.user.address.ListPublicIpAddressesCmd;
-import org.apache.cloudstack.api.command.user.config.ListCapabilitiesCmd;
-import org.apache.cloudstack.api.command.user.event.ArchiveEventsCmd;
-import org.apache.cloudstack.api.command.user.event.DeleteEventsCmd;
-import org.apache.cloudstack.api.command.user.event.ListEventTypesCmd;
-import org.apache.cloudstack.api.command.user.event.ListEventsCmd;
-import org.apache.cloudstack.api.command.user.guest.ListGuestOsCategoriesCmd;
-import org.apache.cloudstack.api.command.user.guest.ListGuestOsCmd;
-import org.apache.cloudstack.api.command.user.job.ListAsyncJobsCmd;
-import org.apache.cloudstack.api.command.user.job.QueryAsyncJobResultCmd;
-import org.apache.cloudstack.api.command.user.offering.ListDiskOfferingsCmd;
-import org.apache.cloudstack.api.command.user.offering.ListServiceOfferingsCmd;
-import org.apache.cloudstack.api.command.user.region.ListRegionsCmd;
-import org.apache.cloudstack.api.command.user.region.ha.gslb.*;
-import org.apache.cloudstack.api.command.user.ssh.CreateSSHKeyPairCmd;
-import org.apache.cloudstack.api.command.user.ssh.DeleteSSHKeyPairCmd;
-import org.apache.cloudstack.api.command.user.ssh.ListSSHKeyPairsCmd;
-import org.apache.cloudstack.api.command.user.ssh.RegisterSSHKeyPairCmd;
-import org.apache.cloudstack.api.command.user.tag.CreateTagsCmd;
-import org.apache.cloudstack.api.command.user.tag.DeleteTagsCmd;
-import org.apache.cloudstack.api.command.user.tag.ListTagsCmd;
-import org.apache.cloudstack.api.command.user.vmgroup.CreateVMGroupCmd;
-import org.apache.cloudstack.api.command.user.vmgroup.DeleteVMGroupCmd;
-import org.apache.cloudstack.api.command.user.vmgroup.ListVMGroupsCmd;
-import org.apache.cloudstack.api.command.user.vmgroup.UpdateVMGroupCmd;
-import org.apache.cloudstack.api.command.user.vmsnapshot.CreateVMSnapshotCmd;
-import org.apache.cloudstack.api.command.user.vmsnapshot.DeleteVMSnapshotCmd;
-import org.apache.cloudstack.api.command.user.vmsnapshot.ListVMSnapshotCmd;
-import org.apache.cloudstack.api.command.user.vmsnapshot.RevertToVMSnapshotCmd;
-import org.apache.cloudstack.api.command.user.zone.ListZonesByCmd;
-import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager;
-import org.apache.cloudstack.engine.subsystem.api.storage.StoragePoolAllocator;
-import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao;
-import org.apache.cloudstack.storage.datastore.db.StoragePoolVO;
+
 
 public class ManagementServerImpl extends ManagerBase implements ManagementServer {
     public static final Logger s_logger = Logger.getLogger(ManagementServerImpl.class.getName());
@@ -2542,11 +2862,21 @@ public class ManagementServerImpl extends ManagerBase implements ManagementServe
         cmdList.add(AssignToGlobalLoadBalancerRuleCmd.class);
         cmdList.add(RemoveFromGlobalLoadBalancerRuleCmd.class);
         cmdList.add(ListStorageProvidersCmd.class);
+        cmdList.add(CreateApplicationLoadBalancerCmd.class);
+        cmdList.add(ListApplicationLoadBalancersCmd.class);
+        cmdList.add(DeleteApplicationLoadBalancerCmd.class);
+        cmdList.add(ConfigureInternalLoadBalancerElementCmd.class);
+        cmdList.add(CreateInternalLoadBalancerElementCmd.class);
+        cmdList.add(ListInternalLoadBalancerElementsCmd.class);
         cmdList.add(CreateAffinityGroupCmd.class);
         cmdList.add(DeleteAffinityGroupCmd.class);
         cmdList.add(ListAffinityGroupsCmd.class);
         cmdList.add(UpdateVMAffinityGroupCmd.class);
         cmdList.add(ListAffinityGroupTypesCmd.class);
+        cmdList.add(StopInternalLBVMCmd.class);
+        cmdList.add(StartInternalLBVMCmd.class);
+        cmdList.add(ListInternalLBVMsCmd.class);
+        cmdList.add(ListNetworkIsolationMethodsCmd.class);
         cmdList.add(ListNetworkIsolationMethodsCmd.class);
 
         return cmdList;

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2660a6b7/server/src/org/apache/cloudstack/network/lb/ApplicationLoadBalancerManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/org/apache/cloudstack/network/lb/ApplicationLoadBalancerManagerImpl.java b/server/src/org/apache/cloudstack/network/lb/ApplicationLoadBalancerManagerImpl.java
new file mode 100644
index 0000000..ec0be8c
--- /dev/null
+++ b/server/src/org/apache/cloudstack/network/lb/ApplicationLoadBalancerManagerImpl.java
@@ -0,0 +1,524 @@
+// 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 org.apache.cloudstack.network.lb;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+import javax.ejb.Local;
+import javax.inject.Inject;
+
+import org.apache.cloudstack.acl.SecurityChecker.AccessType;
+import org.apache.cloudstack.api.command.user.loadbalancer.ListApplicationLoadBalancersCmd;
+import org.apache.cloudstack.lb.ApplicationLoadBalancerRuleVO;
+import org.apache.cloudstack.lb.dao.ApplicationLoadBalancerRuleDao;
+import org.apache.log4j.Logger;
+import org.springframework.stereotype.Component;
+
+import com.cloud.event.ActionEvent;
+import com.cloud.event.EventTypes;
+import com.cloud.event.UsageEventUtils;
+import com.cloud.exception.InsufficientAddressCapacityException;
+import com.cloud.exception.InsufficientVirtualNetworkCapcityException;
+import com.cloud.exception.InvalidParameterValueException;
+import com.cloud.exception.NetworkRuleConflictException;
+import com.cloud.exception.UnsupportedServiceException;
+import com.cloud.network.Network;
+import com.cloud.network.Network.Capability;
+import com.cloud.network.Network.Service;
+import com.cloud.network.NetworkManager;
+import com.cloud.network.NetworkModel;
+import com.cloud.network.Networks.TrafficType;
+import com.cloud.network.dao.FirewallRulesDao;
+import com.cloud.network.lb.LoadBalancingRule;
+import com.cloud.network.lb.LoadBalancingRule.LbDestination;
+import com.cloud.network.lb.LoadBalancingRule.LbHealthCheckPolicy;
+import com.cloud.network.lb.LoadBalancingRule.LbStickinessPolicy;
+import com.cloud.network.lb.LoadBalancingRulesManager;
+import com.cloud.network.rules.FirewallRule.State;
+import com.cloud.network.rules.LoadBalancerContainer.Scheme;
+import com.cloud.projects.Project.ListProjectResourcesCriteria;
+import com.cloud.server.ResourceTag.TaggedResourceType;
+import com.cloud.tags.ResourceTagVO;
+import com.cloud.tags.dao.ResourceTagDao;
+import com.cloud.user.Account;
+import com.cloud.user.AccountManager;
+import com.cloud.user.UserContext;
+import com.cloud.utils.Pair;
+import com.cloud.utils.Ternary;
+import com.cloud.utils.component.ManagerBase;
+import com.cloud.utils.db.DB;
+import com.cloud.utils.db.Filter;
+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.utils.net.Ip;
+import com.cloud.utils.net.NetUtils;
+
+@Component
+@Local(value = { ApplicationLoadBalancerService.class })
+public class ApplicationLoadBalancerManagerImpl extends ManagerBase implements ApplicationLoadBalancerService {
+    private static final Logger s_logger = Logger.getLogger(ApplicationLoadBalancerManagerImpl.class);
+    
+    @Inject NetworkModel _networkModel;
+    @Inject ApplicationLoadBalancerRuleDao _lbDao;
+    @Inject AccountManager _accountMgr;
+    @Inject LoadBalancingRulesManager _lbMgr;
+    @Inject FirewallRulesDao _firewallDao;
+    @Inject ResourceTagDao _resourceTagDao;
+    @Inject NetworkManager _ntwkMgr;
+    
+    
+    @Override
+    @ActionEvent(eventType = EventTypes.EVENT_LOAD_BALANCER_CREATE, eventDescription = "creating load balancer")
+    public ApplicationLoadBalancerRule createApplicationLoadBalancer(String name, String description, Scheme scheme, long sourceIpNetworkId, String sourceIp,
+            int sourcePort, int instancePort, String algorithm, long networkId, long lbOwnerId) throws InsufficientAddressCapacityException,
+            NetworkRuleConflictException, InsufficientVirtualNetworkCapcityException {
+        
+        //Validate LB rule guest network
+        Network guestNtwk = _networkModel.getNetwork(networkId);
+        if (guestNtwk == null || guestNtwk.getTrafficType() != TrafficType.Guest) {
+            throw new InvalidParameterValueException("Can't find guest network by id");
+        }
+        
+        Account caller = UserContext.current().getCaller();
+        _accountMgr.checkAccess(caller, AccessType.UseNetwork, false, guestNtwk);
+        
+        Network sourceIpNtwk = _networkModel.getNetwork(sourceIpNetworkId);
+        if (sourceIpNtwk == null) {
+            throw new InvalidParameterValueException("Can't find source ip network by id");
+        }
+        
+        Account lbOwner = _accountMgr.getAccount(lbOwnerId);
+        if (lbOwner == null) {
+            throw new InvalidParameterValueException("Can't find the lb owner account");
+        }
+        
+        return createApplicationLoadBalancer(name, description, scheme, sourceIpNtwk, sourceIp, sourcePort, instancePort, algorithm, lbOwner, guestNtwk);
+    }
+
+    
+    protected ApplicationLoadBalancerRule createApplicationLoadBalancer(String name, String description, Scheme scheme, Network sourceIpNtwk, String sourceIp, int sourcePort, int instancePort, String algorithm,
+            Account lbOwner, Network guestNtwk) throws NetworkRuleConflictException, InsufficientVirtualNetworkCapcityException {
+        
+        //Only Internal scheme is supported in this release
+        if (scheme != Scheme.Internal) {
+            throw new UnsupportedServiceException("Only scheme of type " + Scheme.Internal + " is supported");
+        }
+        
+        //1) Validate LB rule's parameters
+        validateLbRule(sourcePort, instancePort, algorithm, guestNtwk, scheme);
+        
+        //2) Validate source network
+        validateSourceIpNtwkForLbRule(sourceIpNtwk, scheme);
+        
+        //3) Get source ip address
+        Ip sourceIpAddr = getSourceIp(scheme, sourceIpNtwk, sourceIp);
+               
+        ApplicationLoadBalancerRuleVO newRule = new ApplicationLoadBalancerRuleVO(name, description, sourcePort, instancePort, algorithm, guestNtwk.getId(),
+                lbOwner.getId(), lbOwner.getDomainId(), sourceIpAddr, sourceIpNtwk.getId(), scheme);
+        
+        //4) Validate Load Balancing rule on the providers
+        LoadBalancingRule loadBalancing = new LoadBalancingRule(newRule, new ArrayList<LbDestination>(),
+                new ArrayList<LbStickinessPolicy>(), new ArrayList<LbHealthCheckPolicy>(), sourceIpAddr);
+        if (!_lbMgr.validateLbRule(loadBalancing)) {
+            throw new InvalidParameterValueException("LB service provider cannot support this rule");
+        }
+
+        //5) Persist Load Balancer rule
+        return persistLbRule(newRule);
+    }
+
+    
+    @DB
+    protected ApplicationLoadBalancerRule persistLbRule(ApplicationLoadBalancerRuleVO newRule) throws NetworkRuleConflictException {
+        
+        Transaction txn = Transaction.currentTxn();
+        txn.start();
+        
+        //1) Persist the rule
+        newRule = _lbDao.persist(newRule);
+        boolean success = true;
+
+        try {
+            //2) Detect conflicts
+            detectLbRulesConflicts(newRule);
+            if (!_firewallDao.setStateToAdd(newRule)) {
+                throw new CloudRuntimeException("Unable to update the state to add for " + newRule);
+            }
+            s_logger.debug("Load balancer " + newRule.getId() + " for Ip address " + newRule.getSourceIp().addr() + ", source port "
+                    + newRule.getSourcePortStart() + ", instance port " + newRule.getDefaultPortStart() + " is added successfully.");
+            UserContext.current().setEventDetails("Load balancer Id: " + newRule.getId());
+            Network ntwk = _networkModel.getNetwork(newRule.getNetworkId());
+            UsageEventUtils.publishUsageEvent(EventTypes.EVENT_LOAD_BALANCER_CREATE, newRule.getAccountId(),
+                    ntwk.getDataCenterId(), newRule.getId(), null, LoadBalancingRule.class.getName(),
+                    newRule.getUuid());
+            txn.commit();
+
+            return newRule;
+        } catch (Exception e) {
+            success = false;
+            if (e instanceof NetworkRuleConflictException) {
+                throw (NetworkRuleConflictException) e;
+            }
+            throw new CloudRuntimeException("Unable to add lb rule for ip address " + newRule.getSourceIpAddressId(), e);
+        } finally {
+            if (!success && newRule != null) {
+                _lbMgr.removeLBRule(newRule);
+            }
+        }
+    }
+
+    /**
+     * Validates Lb rule parameters
+     * @param sourcePort
+     * @param instancePort
+     * @param algorithm
+     * @param network
+     * @param scheme TODO
+     * @param networkId
+     */
+    protected void validateLbRule(int sourcePort, int instancePort, String algorithm, Network network, Scheme scheme) {
+        //1) verify that lb service is supported by the network
+        if (!_networkModel.areServicesSupportedInNetwork(network.getId(), Service.Lb)) {
+            InvalidParameterValueException ex = new InvalidParameterValueException(
+                    "LB service is not supported in specified network id");
+            ex.addProxyObject(network, network.getId(), "networkId");
+            throw ex;
+        }
+        
+        //2) verify that lb service is supported by the network
+        _lbMgr.isLbServiceSupportedInNetwork(network.getId(), scheme);
+        
+        Map<Network.Capability, String> caps = _networkModel.getNetworkServiceCapabilities(network.getId(), Service.Lb);
+        String supportedProtocols = caps.get(Capability.SupportedProtocols).toLowerCase();
+        if (!supportedProtocols.contains(NetUtils.TCP_PROTO.toLowerCase())) {
+            throw new InvalidParameterValueException("Protocol " + NetUtils.TCP_PROTO.toLowerCase() + " is not supported in zone " + network.getDataCenterId());
+        }
+        
+        //3) Validate rule parameters
+        if (!NetUtils.isValidPort(instancePort)) {
+            throw new InvalidParameterValueException("Invalid value for instance port: " + instancePort);
+        }
+        
+        if (!NetUtils.isValidPort(sourcePort)) {
+            throw new InvalidParameterValueException("Invalid value for source port: " + sourcePort);
+        }
+       
+        if ((algorithm == null) || !NetUtils.isValidAlgorithm(algorithm)) {
+            throw new InvalidParameterValueException("Invalid algorithm: " + algorithm);
+        }
+    }
+    
+
+    /**
+     * Gets source ip address based on the LB rule scheme/source IP network/requested IP address
+     * @param scheme
+     * @param sourceIpNtwk
+     * @param requestedIp
+     * @return
+     * @throws InsufficientVirtualNetworkCapcityException
+     */
+    protected Ip getSourceIp(Scheme scheme, Network sourceIpNtwk, String requestedIp) throws InsufficientVirtualNetworkCapcityException {       
+        
+        if (requestedIp != null) {
+            if (_lbDao.countBySourceIp(new Ip(requestedIp), sourceIpNtwk.getId()) > 0)  {
+                s_logger.debug("IP address " + requestedIp + " is already used by existing LB rule, returning it");
+                return new Ip(requestedIp);
+            }
+            
+            validateRequestedSourceIpForLbRule(sourceIpNtwk, new Ip(requestedIp), scheme);
+        }
+        
+        requestedIp = allocateSourceIpForLbRule(scheme, sourceIpNtwk, requestedIp);
+        
+        if (requestedIp == null) {
+            throw new InsufficientVirtualNetworkCapcityException("Unable to acquire IP address for network " + sourceIpNtwk, Network.class, sourceIpNtwk.getId());
+        }
+        return new Ip(requestedIp);
+    }
+
+
+    /**
+     * Allocates new Source IP address for the Load Balancer rule based on LB rule scheme/sourceNetwork
+     * @param scheme
+     * @param sourceIpNtwk
+     * @param requestedIp TODO
+     * @param sourceIp
+     * @return
+     */
+    protected String allocateSourceIpForLbRule(Scheme scheme, Network sourceIpNtwk, String requestedIp) {
+        String sourceIp = null;
+        if (scheme != Scheme.Internal) {
+            throw new InvalidParameterValueException("Only scheme " + Scheme.Internal + " is supported");
+        } else {
+            sourceIp = allocateSourceIpForInternalLbRule(sourceIpNtwk, requestedIp);
+        }
+        return sourceIp;
+    }
+    
+
+    /**
+     * Allocates sourceIp for the Internal LB rule
+     * @param sourceIpNtwk
+     * @param requestedIp TODO
+     * @return
+     */
+    protected String allocateSourceIpForInternalLbRule(Network sourceIpNtwk, String requestedIp) {
+        return _ntwkMgr.acquireGuestIpAddress(sourceIpNtwk, requestedIp);
+    }
+
+    
+    /**
+     * Validates requested source ip address of the LB rule based on Lb rule scheme/sourceNetwork
+     * @param sourceIpNtwk
+     * @param requestedSourceIp
+     * @param scheme
+     */
+    void validateRequestedSourceIpForLbRule(Network sourceIpNtwk, Ip requestedSourceIp, Scheme scheme) {
+        //only Internal scheme is supported in this release
+        if (scheme != Scheme.Internal) {
+            throw new UnsupportedServiceException("Only scheme of type " + Scheme.Internal + " is supported");
+        } else {
+            //validate guest source ip
+            validateRequestedSourceIpForInternalLbRule(sourceIpNtwk, requestedSourceIp);
+        }
+    }
+
+    
+    /**
+     * Validates requested source IP address of Internal Lb rule against sourceNetworkId
+     * @param sourceIpNtwk
+     * @param requestedSourceIp
+     */
+    protected void validateRequestedSourceIpForInternalLbRule(Network sourceIpNtwk, Ip requestedSourceIp) {
+        //Check if the IP is within the network cidr
+        Pair<String, Integer> cidr = NetUtils.getCidr(sourceIpNtwk.getCidr());
+        if (!NetUtils.getCidrSubNet(requestedSourceIp.addr(), cidr.second()).equalsIgnoreCase(NetUtils.getCidrSubNet(cidr.first(), cidr.second()))) {
+            throw new InvalidParameterValueException("The requested IP is not in the network's CIDR subnet.");
+        }
+    }
+
+    
+    /**
+     * Validates source IP network for the LB rule
+     * @param sourceNtwk
+     * @param scheme
+     * @return
+     */
+    protected Network validateSourceIpNtwkForLbRule(Network sourceNtwk, Scheme scheme) {
+        //only Internal scheme is supported in this release
+        if (scheme != Scheme.Internal) {
+            throw new UnsupportedServiceException("Only scheme of type " + Scheme.Internal + " is supported");
+        } else {
+            //validate source ip network
+            return validateSourceIpNtwkForInternalLbRule(sourceNtwk);
+        }
+        
+    }
+
+    /**
+     * Validates source IP network for the Internal LB rule
+     * @param sourceIpNtwk
+     * @return
+     */
+    protected Network validateSourceIpNtwkForInternalLbRule(Network sourceIpNtwk) {
+        if (sourceIpNtwk.getTrafficType() != TrafficType.Guest) {
+            throw new InvalidParameterValueException("Only traffic type " + TrafficType.Guest + " is supported");
+        } 
+        
+        //Can't create the LB rule if the network's cidr is NULL
+        String ntwkCidr = sourceIpNtwk.getCidr();
+        if (ntwkCidr == null) {
+            throw new InvalidParameterValueException("Can't create the application load balancer rule for the network having NULL cidr");
+        }
+        
+        //check if the requested ip address is within the cidr
+        return sourceIpNtwk;
+    }
+
+    
+    @Override
+    public boolean deleteApplicationLoadBalancer(long id) {
+        return _lbMgr.deleteLoadBalancerRule(id, true);
+    }
+
+    @Override
+    public Pair<List<? extends ApplicationLoadBalancerRule>, Integer> listApplicationLoadBalancers(ListApplicationLoadBalancersCmd cmd) {
+        Long id = cmd.getId();
+        String name = cmd.getLoadBalancerRuleName();
+        String ip = cmd.getSourceIp();
+        Long ipNtwkId = cmd.getSourceIpNetworkId();
+        String keyword = cmd.getKeyword();
+        Scheme scheme = cmd.getScheme();
+        Long networkId = cmd.getNetworkId();
+        
+        Map<String, String> tags = cmd.getTags();
+
+        Account caller = UserContext.current().getCaller();
+        List<Long> permittedAccounts = new ArrayList<Long>();
+
+        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(ApplicationLoadBalancerRuleVO.class, "id", true, cmd.getStartIndex(), cmd.getPageSizeVal());
+        SearchBuilder<ApplicationLoadBalancerRuleVO> sb = _lbDao.createSearchBuilder();
+        _accountMgr.buildACLSearchBuilder(sb, domainId, isRecursive, permittedAccounts, listProjectResourcesCriteria);
+
+        sb.and("id", sb.entity().getId(), SearchCriteria.Op.EQ);
+        sb.and("name", sb.entity().getName(), SearchCriteria.Op.EQ);
+        sb.and("sourceIpAddress", sb.entity().getSourceIp(), SearchCriteria.Op.EQ);
+        sb.and("sourceIpAddressNetworkId", sb.entity().getSourceIpNetworkId(), SearchCriteria.Op.EQ);
+        sb.and("scheme", sb.entity().getScheme(), SearchCriteria.Op.EQ);
+        sb.and("networkId", sb.entity().getNetworkId(), SearchCriteria.Op.EQ);
+        
+        //list only load balancers having not null sourceIp/sourceIpNtwkId
+        sb.and("sourceIpAddress", sb.entity().getSourceIp(), SearchCriteria.Op.NNULL);
+        sb.and("sourceIpAddressNetworkId", sb.entity().getSourceIpNetworkId(), SearchCriteria.Op.NNULL);
+
+        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();
+            }
+            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<ApplicationLoadBalancerRuleVO> sc = sb.create();
+        _accountMgr.buildACLSearchCriteria(sc, domainId, isRecursive, permittedAccounts, listProjectResourcesCriteria);
+
+        if (keyword != null) {
+            SearchCriteria<ApplicationLoadBalancerRuleVO> ssc = _lbDao.createSearchCriteria();
+            ssc.addOr("name", SearchCriteria.Op.LIKE, "%" + keyword + "%");
+            ssc.addOr("description", SearchCriteria.Op.LIKE, "%" + keyword + "%");
+            sc.addAnd("name", SearchCriteria.Op.SC, ssc);
+        }
+
+        if (name != null) {
+            sc.setParameters("name", name);
+        }
+
+        if (id != null) {
+            sc.setParameters("id", id);
+        }
+        
+        if (ip != null) {
+            sc.setParameters("sourceIpAddress", ip);
+        }
+
+        if (ipNtwkId != null) {
+            sc.setParameters("sourceIpAddressNetworkId", ipNtwkId);
+        }
+        
+        if (scheme != null) {
+            sc.setParameters("scheme", scheme);
+        }
+        
+        if (networkId != null) {
+            sc.setParameters("networkId", networkId);    
+        }
+        
+        if (tags != null && !tags.isEmpty()) {
+            int count = 0;
+            sc.setJoinParameters("tagSearch", "resourceType", TaggedResourceType.LoadBalancer.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++;
+            }
+        }
+        
+        Pair<List<ApplicationLoadBalancerRuleVO>, Integer> result = _lbDao.searchAndCount(sc, searchFilter);
+        return new Pair<List<? extends ApplicationLoadBalancerRule>, Integer>(result.first(), result.second());
+    }
+
+    @Override
+    public ApplicationLoadBalancerRule getApplicationLoadBalancer(long ruleId) {
+        ApplicationLoadBalancerRule lbRule = _lbDao.findById(ruleId);
+        if (lbRule == null) {
+            throw new InvalidParameterValueException("Can't find the load balancer by id");
+        }
+        return lbRule;
+    }
+   
+    
+    /**
+     * Detects lb rule conflicts against other rules
+     * @param newLbRule
+     * @throws NetworkRuleConflictException
+     */
+    protected void detectLbRulesConflicts(ApplicationLoadBalancerRule newLbRule) throws NetworkRuleConflictException {
+        if (newLbRule.getScheme() != Scheme.Internal) {
+            throw new UnsupportedServiceException("Only scheme of type " + Scheme.Internal + " is supported");
+        } else {
+            detectInternalLbRulesConflict(newLbRule);
+        }
+    }
+    
+    
+    /**
+     * Detects Internal Lb Rules conflicts
+     * @param newLbRule
+     * @throws NetworkRuleConflictException
+     */
+    protected void detectInternalLbRulesConflict(ApplicationLoadBalancerRule newLbRule) throws NetworkRuleConflictException {
+        List<ApplicationLoadBalancerRuleVO> lbRules = _lbDao.listBySourceIpAndNotRevoked(newLbRule.getSourceIp(), newLbRule.getSourceIpNetworkId());
+
+        for (ApplicationLoadBalancerRuleVO lbRule : lbRules) {
+            if (lbRule.getId() == newLbRule.getId()) {
+                continue; // Skips my own rule.
+            }
+
+            if (lbRule.getNetworkId() != newLbRule.getNetworkId() && lbRule.getState() != State.Revoke) {
+                throw new NetworkRuleConflictException("New rule is for a different network than what's specified in rule "
+                        + lbRule.getXid());
+            }
+
+          if ((lbRule.getSourcePortStart().intValue() <= newLbRule.getSourcePortStart().intValue() 
+                  && lbRule.getSourcePortEnd().intValue() >= newLbRule.getSourcePortStart().intValue())
+                  || (lbRule.getSourcePortStart().intValue() <= newLbRule.getSourcePortEnd().intValue() 
+                  && lbRule.getSourcePortEnd().intValue() >= newLbRule.getSourcePortEnd().intValue())
+                  || (newLbRule.getSourcePortStart().intValue() <= lbRule.getSourcePortStart().intValue() 
+                  && newLbRule.getSourcePortEnd().intValue() >= lbRule.getSourcePortStart().intValue())
+                  || (newLbRule.getSourcePortStart().intValue() <= lbRule.getSourcePortEnd().intValue() 
+                  && newLbRule.getSourcePortEnd().intValue() >= lbRule.getSourcePortEnd().intValue())) {
+
+
+                    throw new NetworkRuleConflictException("The range specified, " + newLbRule.getSourcePortStart() + "-" + newLbRule.getSourcePortEnd() + ", conflicts with rule " + lbRule.getId()
+                            + " which has " + lbRule.getSourcePortStart() + "-" + lbRule.getSourcePortEnd());
+            }
+        }
+
+        if (s_logger.isDebugEnabled()) {
+            s_logger.debug("No network rule conflicts detected for " + newLbRule + " against " + (lbRules.size() - 1) + " existing rules");
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2660a6b7/server/test/com/cloud/network/MockNetworkManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/test/com/cloud/network/MockNetworkManagerImpl.java b/server/test/com/cloud/network/MockNetworkManagerImpl.java
index 2f717c8..eb5fc25 100755
--- a/server/test/com/cloud/network/MockNetworkManagerImpl.java
+++ b/server/test/com/cloud/network/MockNetworkManagerImpl.java
@@ -16,13 +16,33 @@
 // under the License.
 package com.cloud.network;
 
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import javax.ejb.Local;
+import javax.naming.ConfigurationException;
+
+import org.apache.cloudstack.acl.ControlledEntity.ACLType;
+import org.apache.cloudstack.api.command.admin.usage.ListTrafficTypeImplementorsCmd;
+import org.apache.cloudstack.api.command.user.network.CreateNetworkCmd;
+import org.apache.cloudstack.api.command.user.network.ListNetworksCmd;
+import org.apache.cloudstack.api.command.user.network.RestartNetworkCmd;
+import org.apache.cloudstack.api.command.user.vm.ListNicsCmd;
+import org.springframework.stereotype.Component;
+
 import com.cloud.dc.DataCenter;
 import com.cloud.dc.Pod;
 import com.cloud.dc.Vlan.VlanType;
 import com.cloud.deploy.DataCenterDeployment;
 import com.cloud.deploy.DeployDestination;
 import com.cloud.deploy.DeploymentPlan;
-import com.cloud.exception.*;
+import com.cloud.exception.ConcurrentOperationException;
+import com.cloud.exception.InsufficientAddressCapacityException;
+import com.cloud.exception.InsufficientCapacityException;
+import com.cloud.exception.InsufficientVirtualNetworkCapcityException;
+import com.cloud.exception.ResourceAllocationException;
+import com.cloud.exception.ResourceUnavailableException;
 import com.cloud.network.Network.Provider;
 import com.cloud.network.Network.Service;
 import com.cloud.network.Networks.TrafficType;
@@ -37,6 +57,7 @@ import com.cloud.network.guru.NetworkGuru;
 import com.cloud.network.rules.FirewallRule;
 import com.cloud.network.rules.FirewallRule.Purpose;
 import com.cloud.network.rules.FirewallRule.State;
+import com.cloud.network.rules.LoadBalancerContainer.Scheme;
 import com.cloud.network.rules.StaticNat;
 import com.cloud.offering.NetworkOffering;
 import com.cloud.offerings.NetworkOfferingVO;
@@ -46,6 +67,7 @@ import com.cloud.utils.Pair;
 import com.cloud.utils.component.ManagerBase;
 import com.cloud.vm.*;
 import com.cloud.vm.VirtualMachine.Type;
+import com.cloud.vm.VirtualMachineProfile;
 import org.apache.cloudstack.acl.ControlledEntity.ACLType;
 import org.apache.cloudstack.api.command.admin.network.DedicateGuestVlanRangeCmd;
 import org.apache.cloudstack.api.command.admin.network.ListDedicatedGuestVlanRangesCmd;
@@ -62,6 +84,7 @@ import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
+
 @Component
 @Local(value = { NetworkManager.class, NetworkService.class })
 public class MockNetworkManagerImpl extends ManagerBase implements NetworkManager, NetworkService {
@@ -820,7 +843,7 @@ public class MockNetworkManagerImpl extends ManagerBase implements NetworkManage
     }
 
     @Override
-    public LoadBalancingServiceProvider getLoadBalancingProviderForNetwork(Network network) {
+    public LoadBalancingServiceProvider getLoadBalancingProviderForNetwork(Network network, Scheme lbScheme) {
         // TODO Auto-generated method stub
         return null;
     }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2660a6b7/server/test/com/cloud/network/MockNetworkModelImpl.java
----------------------------------------------------------------------
diff --git a/server/test/com/cloud/network/MockNetworkModelImpl.java b/server/test/com/cloud/network/MockNetworkModelImpl.java
index 7df45a0..c3a0d6c 100644
--- a/server/test/com/cloud/network/MockNetworkModelImpl.java
+++ b/server/test/com/cloud/network/MockNetworkModelImpl.java
@@ -40,6 +40,7 @@ import com.cloud.network.dao.NetworkVO;
 import com.cloud.network.element.NetworkElement;
 import com.cloud.network.element.UserDataServiceProvider;
 import com.cloud.offering.NetworkOffering;
+import com.cloud.offering.NetworkOffering.Detail;
 import com.cloud.offerings.NetworkOfferingVO;
 import com.cloud.user.Account;
 import com.cloud.utils.component.ManagerBase;
@@ -853,6 +854,22 @@ public class MockNetworkModelImpl extends ManagerBase implements NetworkModel {
     }
 
     @Override
+    public IpAddress getPublicIpAddress(String ipAddress, long zoneId) {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    @Override
+    public List<String> getUsedIpsInNetwork(Network network) {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    @Override
+    public Map<Detail, String> getNtwkOffDetails(long offId) {
+        return null;
+    }
+    
     public IsolationType[] listNetworkIsolationMethods() {
         // TODO Auto-generated method stub
         return null;

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2660a6b7/server/test/com/cloud/vpc/MockConfigurationManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/test/com/cloud/vpc/MockConfigurationManagerImpl.java b/server/test/com/cloud/vpc/MockConfigurationManagerImpl.java
index 83b1924..9058798 100755
--- a/server/test/com/cloud/vpc/MockConfigurationManagerImpl.java
+++ b/server/test/com/cloud/vpc/MockConfigurationManagerImpl.java
@@ -501,7 +501,7 @@ public class MockConfigurationManagerImpl extends ManagerBase implements Configu
     @Override
     public NetworkOfferingVO createNetworkOffering(String name, String displayText, TrafficType trafficType, String tags, boolean specifyVlan, Availability availability, Integer networkRate,
             Map<Service, Set<Provider>> serviceProviderMap, boolean isDefault, GuestType type, boolean systemOnly, Long serviceOfferingId, boolean conserveMode,
-            Map<Service, Map<Capability, String>> serviceCapabilityMap, boolean specifyIpRanges, boolean isPersistent) {
+            Map<Service, Map<Capability, String>> serviceCapabilityMap, boolean specifyIpRanges, boolean isPersistent, Map<NetworkOffering.Detail,String> details) {
         // TODO Auto-generated method stub
         return null;
     }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2660a6b7/server/test/com/cloud/vpc/MockNetworkManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/test/com/cloud/vpc/MockNetworkManagerImpl.java b/server/test/com/cloud/vpc/MockNetworkManagerImpl.java
index f884ba1..84ae818 100644
--- a/server/test/com/cloud/vpc/MockNetworkManagerImpl.java
+++ b/server/test/com/cloud/vpc/MockNetworkManagerImpl.java
@@ -16,17 +16,51 @@
 // under the License.
 package com.cloud.vpc;
 
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.ejb.Local;
+import javax.inject.Inject;
+import javax.naming.ConfigurationException;
+
+import org.apache.cloudstack.acl.ControlledEntity.ACLType;
+import org.apache.cloudstack.api.command.admin.network.DedicateGuestVlanRangeCmd;
+import org.apache.cloudstack.api.command.admin.network.ListDedicatedGuestVlanRangesCmd;
+import org.apache.cloudstack.api.command.admin.usage.ListTrafficTypeImplementorsCmd;
+import org.apache.cloudstack.api.command.user.network.CreateNetworkCmd;
+import org.apache.cloudstack.api.command.user.network.ListNetworksCmd;
+import org.apache.cloudstack.api.command.user.network.RestartNetworkCmd;
+import org.apache.cloudstack.api.command.user.vm.ListNicsCmd;
+import org.apache.log4j.Logger;
+import org.springframework.stereotype.Component;
+
 import com.cloud.dc.DataCenter;
 import com.cloud.dc.Pod;
 import com.cloud.dc.Vlan.VlanType;
 import com.cloud.deploy.DataCenterDeployment;
 import com.cloud.deploy.DeployDestination;
 import com.cloud.deploy.DeploymentPlan;
-import com.cloud.exception.*;
-import com.cloud.network.*;
+import com.cloud.exception.ConcurrentOperationException;
+import com.cloud.exception.InsufficientAddressCapacityException;
+import com.cloud.exception.InsufficientCapacityException;
+import com.cloud.exception.InsufficientVirtualNetworkCapcityException;
+import com.cloud.exception.ResourceAllocationException;
+import com.cloud.exception.ResourceUnavailableException;
+import com.cloud.network.GuestVlan;
+import com.cloud.network.IpAddress;
+import com.cloud.network.Network;
 import com.cloud.network.Network.Provider;
 import com.cloud.network.Network.Service;
+import com.cloud.network.NetworkManager;
+import com.cloud.network.NetworkProfile;
+import com.cloud.network.NetworkRuleApplier;
+import com.cloud.network.NetworkService;
 import com.cloud.network.Networks.TrafficType;
+import com.cloud.network.PhysicalNetwork;
+import com.cloud.network.PhysicalNetworkServiceProvider;
+import com.cloud.network.PhysicalNetworkTrafficType;
+import com.cloud.network.PublicIpAddress;
 import com.cloud.network.addr.PublicIp;
 import com.cloud.network.dao.AccountGuestVlanMapVO;
 import com.cloud.network.dao.IPAddressVO;
@@ -40,6 +74,7 @@ import com.cloud.network.guru.NetworkGuru;
 import com.cloud.network.rules.FirewallRule;
 import com.cloud.network.rules.FirewallRule.Purpose;
 import com.cloud.network.rules.FirewallRule.State;
+import com.cloud.network.rules.LoadBalancerContainer.Scheme;
 import com.cloud.network.rules.StaticNat;
 import com.cloud.offering.NetworkOffering;
 import com.cloud.offerings.NetworkOfferingVO;
@@ -48,8 +83,15 @@ import com.cloud.user.Account;
 import com.cloud.user.User;
 import com.cloud.utils.Pair;
 import com.cloud.utils.component.ManagerBase;
-import com.cloud.vm.*;
+import com.cloud.vm.Nic;
+import com.cloud.vm.NicProfile;
+import com.cloud.vm.NicSecondaryIp;
+import com.cloud.vm.NicVO;
+import com.cloud.vm.ReservationContext;
+import com.cloud.vm.VMInstanceVO;
+import com.cloud.vm.VirtualMachine;
 import com.cloud.vm.VirtualMachine.Type;
+import com.cloud.vm.VirtualMachineProfile;
 import org.apache.cloudstack.acl.ControlledEntity.ACLType;
 import org.apache.cloudstack.api.command.admin.network.DedicateGuestVlanRangeCmd;
 import org.apache.cloudstack.api.command.admin.network.ListDedicatedGuestVlanRangesCmd;
@@ -61,12 +103,6 @@ import org.apache.cloudstack.api.command.user.vm.ListNicsCmd;
 import org.apache.log4j.Logger;
 import org.springframework.stereotype.Component;
 
-import javax.ejb.Local;
-import javax.inject.Inject;
-import javax.naming.ConfigurationException;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
 
 @Component
 @Local(value = { NetworkManager.class, NetworkService.class })
@@ -1301,7 +1337,7 @@ public class MockNetworkManagerImpl extends ManagerBase implements NetworkManage
     }
 
     @Override
-    public LoadBalancingServiceProvider getLoadBalancingProviderForNetwork(Network network) {
+    public LoadBalancingServiceProvider getLoadBalancingProviderForNetwork(Network network, Scheme lbScheme) {
         // TODO Auto-generated method stub
         return null;
     }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2660a6b7/server/test/com/cloud/vpc/MockNetworkModelImpl.java
----------------------------------------------------------------------
diff --git a/server/test/com/cloud/vpc/MockNetworkModelImpl.java b/server/test/com/cloud/vpc/MockNetworkModelImpl.java
index c9d043a..d9e33b7 100644
--- a/server/test/com/cloud/vpc/MockNetworkModelImpl.java
+++ b/server/test/com/cloud/vpc/MockNetworkModelImpl.java
@@ -47,6 +47,7 @@ import com.cloud.network.dao.NetworkVO;
 import com.cloud.network.element.NetworkElement;
 import com.cloud.network.element.UserDataServiceProvider;
 import com.cloud.offering.NetworkOffering;
+import com.cloud.offering.NetworkOffering.Detail;
 import com.cloud.offerings.NetworkOfferingVO;
 import com.cloud.offerings.dao.NetworkOfferingServiceMapDao;
 import com.cloud.user.Account;
@@ -865,6 +866,22 @@ public class MockNetworkModelImpl extends ManagerBase implements NetworkModel {
     }
 
     @Override
+    public IpAddress getPublicIpAddress(String ipAddress, long zoneId) {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    @Override
+    public List<String> getUsedIpsInNetwork(Network network) {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    @Override
+    public Map<Detail, String> getNtwkOffDetails(long offId) {
+        return null;
+    }
+    
     public IsolationType[] listNetworkIsolationMethods() {
         // TODO Auto-generated method stub
         return null;

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2660a6b7/server/test/com/cloud/vpc/MockVpcVirtualNetworkApplianceManager.java
----------------------------------------------------------------------
diff --git a/server/test/com/cloud/vpc/MockVpcVirtualNetworkApplianceManager.java b/server/test/com/cloud/vpc/MockVpcVirtualNetworkApplianceManager.java
index ef5478b..9010f1f 100644
--- a/server/test/com/cloud/vpc/MockVpcVirtualNetworkApplianceManager.java
+++ b/server/test/com/cloud/vpc/MockVpcVirtualNetworkApplianceManager.java
@@ -36,6 +36,7 @@ import com.cloud.network.RemoteAccessVpn;
 import com.cloud.network.Site2SiteVpnConnection;
 import com.cloud.network.VpcVirtualNetworkApplianceService;
 import com.cloud.network.VpnUser;
+import com.cloud.network.lb.LoadBalancingRule;
 import com.cloud.network.router.VirtualRouter;
 import com.cloud.network.router.VpcVirtualNetworkApplianceManager;
 import com.cloud.network.rules.FirewallRule;
@@ -46,7 +47,6 @@ import com.cloud.network.vpc.Vpc;
 import com.cloud.user.Account;
 import com.cloud.user.User;
 import com.cloud.uservm.UserVm;
-import com.cloud.utils.component.Manager;
 import com.cloud.utils.component.ManagerBase;
 import com.cloud.vm.DomainRouterVO;
 import com.cloud.vm.NicProfile;
@@ -402,4 +402,16 @@ VpcVirtualNetworkApplianceService {
         return null;
     }
 
+    @Override
+    public boolean applyLoadBalancingRules(Network network, List<? extends LoadBalancingRule> rules, List<? extends VirtualRouter> routers) throws ResourceUnavailableException {
+        // TODO Auto-generated method stub
+        return false;
+    }
+
+    @Override
+    public VirtualRouter findRouter(long routerId) {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2660a6b7/server/test/com/cloud/vpc/dao/MockNetworkOfferingDaoImpl.java
----------------------------------------------------------------------
diff --git a/server/test/com/cloud/vpc/dao/MockNetworkOfferingDaoImpl.java b/server/test/com/cloud/vpc/dao/MockNetworkOfferingDaoImpl.java
index dbf1411..a8208dd 100644
--- a/server/test/com/cloud/vpc/dao/MockNetworkOfferingDaoImpl.java
+++ b/server/test/com/cloud/vpc/dao/MockNetworkOfferingDaoImpl.java
@@ -101,28 +101,28 @@ public class MockNetworkOfferingDaoImpl extends NetworkOfferingDaoImpl implement
         if (id.longValue() == 1) {
             //network offering valid for vpc
             vo = new NetworkOfferingVO("vpc", "vpc", TrafficType.Guest, false, true, null, null, false,
-                    Availability.Optional, null, Network.GuestType.Isolated, false, false, false);
+                    Availability.Optional, null, Network.GuestType.Isolated, false, false, false, false, false);
         } else if (id.longValue() == 2) {
             //invalid offering - source nat is not included
             vo = new NetworkOfferingVO("vpc", "vpc", TrafficType.Guest, false, true, null, null, false,
-                    Availability.Optional, null, Network.GuestType.Isolated, false, false, false);
+                    Availability.Optional, null, Network.GuestType.Isolated, false, false, false, false, false);
         } else if (id.longValue() == 3) {
             //network offering invalid for vpc (conserve mode off)
             vo = new NetworkOfferingVO("non vpc", "non vpc", TrafficType.Guest, false, true, null, null, false,
-                    Availability.Optional, null, Network.GuestType.Isolated, true, false, false);
+                    Availability.Optional, null, Network.GuestType.Isolated, true, false, false, false, false);
         } else if (id.longValue() == 4) {
             //network offering invalid for vpc (Shared)
             vo = new NetworkOfferingVO("non vpc", "non vpc", TrafficType.Guest, false, true, null, null, false,
-                    Availability.Optional, null, Network.GuestType.Shared, false, false, false);
+                    Availability.Optional, null, Network.GuestType.Shared, false, false, false, false, false);
         } else if (id.longValue() == 5) {
             //network offering invalid for vpc (has redundant router)
             vo = new NetworkOfferingVO("vpc", "vpc", TrafficType.Guest, false, true, null, null, false,
-                    Availability.Optional, null, Network.GuestType.Isolated, false, false, false);
+                    Availability.Optional, null, Network.GuestType.Isolated, false, false, false, false, false);
             vo.setRedundantRouter(true);
         } else if (id.longValue() == 6) {
             //network offering invalid for vpc (has lb service)   
             vo = new NetworkOfferingVO("vpc", "vpc", TrafficType.Guest, false, true, null, null, false,
-                    Availability.Optional, null, Network.GuestType.Isolated, false, false, false);
+                    Availability.Optional, null, Network.GuestType.Isolated, false, false, false, false, false);
         }
         
         if (vo != null) {

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2660a6b7/server/test/com/cloud/vpc/dao/MockNetworkServiceMapDaoImpl.java
----------------------------------------------------------------------
diff --git a/server/test/com/cloud/vpc/dao/MockNetworkServiceMapDaoImpl.java b/server/test/com/cloud/vpc/dao/MockNetworkServiceMapDaoImpl.java
index 002b61d..103f04e 100644
--- a/server/test/com/cloud/vpc/dao/MockNetworkServiceMapDaoImpl.java
+++ b/server/test/com/cloud/vpc/dao/MockNetworkServiceMapDaoImpl.java
@@ -95,4 +95,10 @@ public class MockNetworkServiceMapDaoImpl extends GenericDaoBase<NetworkServiceM
         // TODO Auto-generated method stub
         return null;
     }
+
+    @Override
+    public List<String> getProvidersForServiceInNetwork(long networkId, Service service) {
+        // TODO Auto-generated method stub
+        return null;
+    }
 }


[24/50] [abbrv] git commit: updated refs/heads/vmsync to d403974

Posted by ah...@apache.org.
CLOUDSTACK-658 - Adding scale vm support for vmware with unit tests
Signed off by : Nitin Mehta <ni...@citrix.com>


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

Branch: refs/heads/vmsync
Commit: 75a2457af639e6bcf751c2e97d1360df1a0265e4
Parents: 19f0145
Author: Hari Patanala <ha...@citrix.com>
Authored: Fri May 10 09:29:41 2013 +0530
Committer: Nitin Mehta <ni...@citrix.com>
Committed: Fri May 10 09:32:08 2013 +0530

----------------------------------------------------------------------
 plugins/hypervisors/vmware/pom.xml                 |   10 ++
 .../hypervisor/vmware/resource/VmwareResource.java |   31 ++++++-
 .../vmware/resource/VmwareResourceTest.java        |   82 +++++++++++++++
 server/src/com/cloud/vm/UserVmManagerImpl.java     |    2 +-
 .../cloud/hypervisor/vmware/util/VmwareHelper.java |   26 +++++-
 5 files changed, 148 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/75a2457a/plugins/hypervisors/vmware/pom.xml
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/vmware/pom.xml b/plugins/hypervisors/vmware/pom.xml
index d65ef64..79779de 100644
--- a/plugins/hypervisors/vmware/pom.xml
+++ b/plugins/hypervisors/vmware/pom.xml
@@ -58,5 +58,15 @@
       <artifactId>wsdl4j</artifactId>
       <version>1.4</version>
     </dependency>
+      <dependency>
+          <groupId>junit</groupId>
+          <artifactId>junit</artifactId>
+          <version>4.10</version>
+      </dependency>
+      <dependency>
+          <groupId>org.mockito</groupId>
+          <artifactId>mockito-all</artifactId>
+          <version>1.9.5</version>
+      </dependency>
   </dependencies>
 </project>

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/75a2457a/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java b/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java
index d87da64..6d7e0e7 100755
--- a/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java
+++ b/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java
@@ -111,6 +111,8 @@ import com.cloud.agent.api.RebootCommand;
 import com.cloud.agent.api.RebootRouterCommand;
 import com.cloud.agent.api.RevertToVMSnapshotAnswer;
 import com.cloud.agent.api.RevertToVMSnapshotCommand;
+import com.cloud.agent.api.ScaleVmCommand;
+import com.cloud.agent.api.ScaleVmAnswer;
 import com.cloud.agent.api.SetupAnswer;
 import com.cloud.agent.api.SetupCommand;
 import com.cloud.agent.api.SetupGuestNetworkAnswer;
@@ -485,6 +487,8 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa
                 return execute((ResizeVolumeCommand) cmd);
             } else if (clz == UnregisterVMCommand.class) {
                 return execute((UnregisterVMCommand) cmd);
+            } else if (clz == ScaleVmCommand.class) {
+                return execute((ScaleVmCommand) cmd);
             } else {
                 answer = Answer.createUnsupportedCommandAnswer(cmd);
             }
@@ -2088,6 +2092,28 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa
         return validatedDisks.toArray(new VolumeTO[0]);
     }
 
+    protected ScaleVmAnswer execute(ScaleVmCommand cmd) {
+
+        VmwareContext context = getServiceContext();
+        VirtualMachineTO vmSpec = cmd.getVirtualMachine();
+        try{
+            VmwareHypervisorHost hyperHost = getHyperHost(context);
+            VirtualMachineMO vmMo = hyperHost.findVmOnHyperHost(cmd.getVmName());
+            VirtualMachineConfigSpec vmConfigSpec = new VirtualMachineConfigSpec();
+            int ramMb = (int) (vmSpec.getMinRam());
+
+            VmwareHelper.setVmScaleUpConfig(vmConfigSpec, vmSpec.getCpus(), vmSpec.getSpeed(), vmSpec.getSpeed(),(int) (vmSpec.getMaxRam()), ramMb, vmSpec.getLimitCpuUse());
+
+            if(!vmMo.configureVm(vmConfigSpec)) {
+                throw new Exception("Unable to execute ScaleVmCommand");
+            }
+        }catch(Exception e) {
+            s_logger.error("Unexpected exception: ", e);
+            return new ScaleVmAnswer(cmd, false, "Unable to execute ScaleVmCommand due to " + e.toString());
+        }
+        return new ScaleVmAnswer(cmd, true, null);
+    }
+
     protected StartAnswer execute(StartCommand cmd) {
 
         if (s_logger.isInfoEnabled()) {
@@ -2191,7 +2217,10 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa
             VmwareHelper.setBasicVmConfig(vmConfigSpec, vmSpec.getCpus(), vmSpec.getMaxSpeed(),
             vmSpec.getMinSpeed(),(int) (vmSpec.getMaxRam()/(1024*1024)), ramMb,
             translateGuestOsIdentifier(vmSpec.getArch(), vmSpec.getOs()).value(), vmSpec.getLimitCpuUse());
-           
+
+            vmConfigSpec.setMemoryHotAddEnabled(true);
+            vmConfigSpec.setCpuHotAddEnabled(true);
+
             if ("true".equals(vmSpec.getDetails().get(VmDetailConstants.NESTED_VIRTUALIZATION_FLAG))) {
                 s_logger.debug("Nested Virtualization enabled in configuration, checking hypervisor capability");
                 ManagedObjectReference hostMor = vmMo.getRunningHost().getMor();

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/75a2457a/plugins/hypervisors/vmware/test/com/cloud/hypervisor/vmware/resource/VmwareResourceTest.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/vmware/test/com/cloud/hypervisor/vmware/resource/VmwareResourceTest.java b/plugins/hypervisors/vmware/test/com/cloud/hypervisor/vmware/resource/VmwareResourceTest.java
new file mode 100644
index 0000000..3ca0b60
--- /dev/null
+++ b/plugins/hypervisors/vmware/test/com/cloud/hypervisor/vmware/resource/VmwareResourceTest.java
@@ -0,0 +1,82 @@
+// 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.hypervisor.vmware.resource;
+
+import com.cloud.agent.api.Command;
+import com.cloud.agent.api.ScaleVmAnswer;
+import com.cloud.agent.api.ScaleVmCommand;
+import com.cloud.agent.api.to.VirtualMachineTO;
+import com.cloud.hypervisor.vmware.mo.VirtualMachineMO;
+import com.cloud.hypervisor.vmware.mo.VmwareHypervisorHost;
+import com.cloud.hypervisor.vmware.util.VmwareContext;
+import com.cloud.hypervisor.vmware.util.VmwareHelper;
+import com.vmware.vim25.VirtualMachineConfigSpec;
+import org.junit.Test;
+import org.junit.Before;
+
+import org.mockito.Mock;
+import org.mockito.Spy;
+import org.mockito.MockitoAnnotations;
+import static org.mockito.Mockito.*;
+
+
+public class VmwareResourceTest {
+
+    @Spy VmwareResource _resource = new VmwareResource() {
+
+        @Override
+        public ScaleVmAnswer execute(ScaleVmCommand cmd) {
+            return super.execute(cmd);
+        }
+        @Override
+        public VmwareHypervisorHost getHyperHost(VmwareContext context, Command cmd) {
+            return hyperHost;
+        }
+    };
+
+    @Mock VmwareContext context;
+    @Mock ScaleVmCommand cmd;
+    @Mock VirtualMachineTO vmSpec;
+    @Mock
+    VmwareHypervisorHost hyperHost;
+    @Mock VirtualMachineMO vmMo;
+    @Mock VirtualMachineConfigSpec vmConfigSpec;
+
+    @Before
+    public void setup(){
+        MockitoAnnotations.initMocks(this);
+        doReturn(context).when(_resource).getServiceContext(null);
+        when(cmd.getVirtualMachine()).thenReturn(vmSpec);
+    }
+    //Test successful scaling up the vm
+    @Test
+    public void testScaleVMF1() throws Exception {
+        when(_resource.getHyperHost(context, null)).thenReturn(hyperHost);
+        doReturn("i-2-3-VM").when(cmd).getVmName();
+        when(hyperHost.findVmOnHyperHost("i-2-3-VM")).thenReturn(vmMo);
+        doReturn(1024L).when(vmSpec).getMinRam();
+        doReturn(1).when(vmSpec).getCpus();
+        doReturn(1000).when(vmSpec).getSpeed();
+        doReturn(1024L).when(vmSpec).getMaxRam();
+        doReturn(false).when(vmSpec).getLimitCpuUse();
+        when(vmMo.configureVm(vmConfigSpec)).thenReturn(true);
+
+        ScaleVmAnswer answer = _resource.execute(cmd);
+        verify(_resource).execute(cmd);
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/75a2457a/server/src/com/cloud/vm/UserVmManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/vm/UserVmManagerImpl.java b/server/src/com/cloud/vm/UserVmManagerImpl.java
index eee8503..9fbc509 100755
--- a/server/src/com/cloud/vm/UserVmManagerImpl.java
+++ b/server/src/com/cloud/vm/UserVmManagerImpl.java
@@ -1064,7 +1064,7 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Use
 
         // Verify input parameters
         VMInstanceVO vmInstance = _vmInstanceDao.findById(vmId);
-        if(vmInstance.getHypervisorType() != HypervisorType.XenServer){
+        if(vmInstance.getHypervisorType() != HypervisorType.XenServer && vmInstance.getHypervisorType() != HypervisorType.VMware){
             throw new InvalidParameterValueException("This operation not permitted for this hypervisor of the vm");
         }
 

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/75a2457a/vmware-base/src/com/cloud/hypervisor/vmware/util/VmwareHelper.java
----------------------------------------------------------------------
diff --git a/vmware-base/src/com/cloud/hypervisor/vmware/util/VmwareHelper.java b/vmware-base/src/com/cloud/hypervisor/vmware/util/VmwareHelper.java
index 9c467dc..4a6a135 100644
--- a/vmware-base/src/com/cloud/hypervisor/vmware/util/VmwareHelper.java
+++ b/vmware-base/src/com/cloud/hypervisor/vmware/util/VmwareHelper.java
@@ -524,7 +524,31 @@ public class VmwareHelper {
 		return options;
 	}
 
-	public static void setBasicVmConfig(VirtualMachineConfigSpec vmConfig, int cpuCount, int cpuSpeedMHz, int cpuReservedMhz,
+    public static void setVmScaleUpConfig(VirtualMachineConfigSpec vmConfig, int cpuCount, int cpuSpeedMHz, int cpuReservedMhz,
+                                          int memoryMB, int memoryReserveMB, boolean limitCpuUse) {
+
+        // VM config for scaling up
+        vmConfig.setMemoryMB((long)memoryMB);
+        vmConfig.setNumCPUs(cpuCount);
+
+        ResourceAllocationInfo cpuInfo = new ResourceAllocationInfo();
+        if (limitCpuUse) {
+            cpuInfo.setLimit((long)(cpuSpeedMHz * cpuCount));
+        } else {
+            cpuInfo.setLimit(-1L);
+        }
+
+        cpuInfo.setReservation((long)cpuReservedMhz);
+        vmConfig.setCpuAllocation(cpuInfo);
+
+        ResourceAllocationInfo memInfo = new ResourceAllocationInfo();
+        memInfo.setLimit((long)memoryMB);
+        memInfo.setReservation((long)memoryReserveMB);
+        vmConfig.setMemoryAllocation(memInfo);
+
+    }
+
+    public static void setBasicVmConfig(VirtualMachineConfigSpec vmConfig, int cpuCount, int cpuSpeedMHz, int cpuReservedMhz,
 		int memoryMB, int memoryReserveMB, String guestOsIdentifier, boolean limitCpuUse) {
 
 		// VM config basics


[46/50] [abbrv] Merged master to vmsync

Posted by ah...@apache.org.
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/d4039743/server/src/com/cloud/server/ManagementServerImpl.java
----------------------------------------------------------------------
diff --cc server/src/com/cloud/server/ManagementServerImpl.java
index 17a9d58,86c1a64..612a4a0
--- a/server/src/com/cloud/server/ManagementServerImpl.java
+++ b/server/src/com/cloud/server/ManagementServerImpl.java
@@@ -40,73 -41,372 +41,373 @@@ import java.util.concurrent.TimeUnit
  import javax.crypto.Mac;
  import javax.crypto.spec.SecretKeySpec;
  import javax.inject.Inject;
- import javax.management.InstanceAlreadyExistsException;
- import javax.management.MBeanRegistrationException;
- import javax.management.MalformedObjectNameException;
- import javax.management.NotCompliantMBeanException;
  import javax.naming.ConfigurationException;
  
- import com.cloud.storage.dao.*;
++import org.apache.commons.codec.binary.Base64;
++import org.apache.log4j.Logger;
++
+ import org.apache.cloudstack.acl.ControlledEntity;
  import org.apache.cloudstack.acl.SecurityChecker.AccessType;
+ import org.apache.cloudstack.affinity.AffinityGroupProcessor;
+ import org.apache.cloudstack.affinity.dao.AffinityGroupVMMapDao;
  import org.apache.cloudstack.api.ApiConstants;
- 
- import com.cloud.event.ActionEventUtils;
  import org.apache.cloudstack.api.BaseUpdateTemplateOrIsoCmd;
- import org.apache.cloudstack.api.command.admin.account.*;
- import org.apache.cloudstack.api.command.admin.autoscale.*;
- import org.apache.cloudstack.api.command.admin.cluster.*;
- import org.apache.cloudstack.api.command.admin.config.*;
- import org.apache.cloudstack.api.command.admin.domain.*;
- import org.apache.cloudstack.api.command.admin.host.*;
- import org.apache.cloudstack.api.command.admin.ldap.*;
- import org.apache.cloudstack.api.command.admin.network.*;
- import org.apache.cloudstack.api.command.admin.offering.*;
- import org.apache.cloudstack.api.command.admin.pod.*;
- import org.apache.cloudstack.api.command.admin.region.*;
- import org.apache.cloudstack.api.command.admin.resource.*;
- import org.apache.cloudstack.api.command.admin.router.*;
- import org.apache.cloudstack.api.command.admin.storage.*;
- import org.apache.cloudstack.api.command.admin.swift.*;
- import org.apache.cloudstack.api.command.admin.systemvm.*;
- import org.apache.cloudstack.api.command.admin.template.*;
- import org.apache.cloudstack.api.command.admin.usage.*;
- import org.apache.cloudstack.api.command.admin.user.*;
- import org.apache.cloudstack.api.command.admin.vlan.*;
- import org.apache.cloudstack.api.command.admin.vm.*;
- import org.apache.cloudstack.api.command.admin.vpc.*;
- import org.apache.cloudstack.api.command.admin.zone.*;
- import org.apache.cloudstack.api.command.user.account.*;
- import org.apache.cloudstack.api.command.user.address.*;
- import org.apache.cloudstack.api.command.user.autoscale.*;
- import org.apache.cloudstack.api.command.user.config.*;
- import org.apache.cloudstack.api.command.user.event.*;
- import org.apache.cloudstack.api.command.user.firewall.*;
- import org.apache.cloudstack.api.command.user.guest.*;
- import org.apache.cloudstack.api.command.user.iso.*;
- import org.apache.cloudstack.api.command.user.job.*;
- import org.apache.cloudstack.api.command.user.loadbalancer.*;
- import org.apache.cloudstack.api.command.user.nat.*;
- import org.apache.cloudstack.api.command.user.network.*;
- import org.apache.cloudstack.api.command.user.offering.*;
- import org.apache.cloudstack.api.command.user.project.*;
- import org.apache.cloudstack.api.command.user.region.*;
- import org.apache.cloudstack.api.command.user.resource.*;
- import org.apache.cloudstack.api.command.user.securitygroup.*;
- import org.apache.cloudstack.api.command.user.snapshot.*;
- import org.apache.cloudstack.api.command.user.ssh.*;
- import org.apache.cloudstack.api.command.user.tag.*;
- import org.apache.cloudstack.api.command.user.template.*;
- import org.apache.cloudstack.api.command.user.vm.*;
- import org.apache.cloudstack.api.command.user.vmgroup.*;
- import org.apache.cloudstack.api.command.user.volume.*;
- import org.apache.cloudstack.api.command.user.vpc.*;
- import org.apache.cloudstack.api.command.user.vpn.*;
- import org.apache.cloudstack.api.command.user.zone.*;
+ import org.apache.cloudstack.api.command.admin.account.CreateAccountCmd;
+ import org.apache.cloudstack.api.command.admin.account.DeleteAccountCmd;
+ import org.apache.cloudstack.api.command.admin.account.DisableAccountCmd;
+ import org.apache.cloudstack.api.command.admin.account.EnableAccountCmd;
+ import org.apache.cloudstack.api.command.admin.account.LockAccountCmd;
+ import org.apache.cloudstack.api.command.admin.account.UpdateAccountCmd;
+ import org.apache.cloudstack.api.command.admin.autoscale.CreateCounterCmd;
+ import org.apache.cloudstack.api.command.admin.autoscale.DeleteCounterCmd;
+ import org.apache.cloudstack.api.command.admin.cluster.AddClusterCmd;
+ import org.apache.cloudstack.api.command.admin.cluster.DeleteClusterCmd;
+ import org.apache.cloudstack.api.command.admin.cluster.ListClustersCmd;
+ import org.apache.cloudstack.api.command.admin.cluster.UpdateClusterCmd;
+ import org.apache.cloudstack.api.command.admin.config.ListCfgsByCmd;
+ import org.apache.cloudstack.api.command.admin.config.ListHypervisorCapabilitiesCmd;
+ import org.apache.cloudstack.api.command.admin.config.UpdateCfgCmd;
+ import org.apache.cloudstack.api.command.admin.config.UpdateHypervisorCapabilitiesCmd;
+ import org.apache.cloudstack.api.command.admin.domain.CreateDomainCmd;
+ import org.apache.cloudstack.api.command.admin.domain.DeleteDomainCmd;
+ import org.apache.cloudstack.api.command.admin.domain.ListDomainChildrenCmd;
+ import org.apache.cloudstack.api.command.admin.domain.ListDomainsCmd;
+ import org.apache.cloudstack.api.command.admin.domain.UpdateDomainCmd;
+ import org.apache.cloudstack.api.command.admin.host.AddHostCmd;
+ import org.apache.cloudstack.api.command.admin.host.AddSecondaryStorageCmd;
+ import org.apache.cloudstack.api.command.admin.host.CancelMaintenanceCmd;
+ import org.apache.cloudstack.api.command.admin.host.DeleteHostCmd;
+ import org.apache.cloudstack.api.command.admin.host.FindHostsForMigrationCmd;
+ import org.apache.cloudstack.api.command.admin.host.ListHostsCmd;
+ import org.apache.cloudstack.api.command.admin.host.PrepareForMaintenanceCmd;
+ import org.apache.cloudstack.api.command.admin.host.ReconnectHostCmd;
+ import org.apache.cloudstack.api.command.admin.host.UpdateHostCmd;
+ import org.apache.cloudstack.api.command.admin.host.UpdateHostPasswordCmd;
+ import org.apache.cloudstack.api.command.admin.internallb.ConfigureInternalLoadBalancerElementCmd;
+ import org.apache.cloudstack.api.command.admin.internallb.CreateInternalLoadBalancerElementCmd;
+ import org.apache.cloudstack.api.command.admin.internallb.ListInternalLBVMsCmd;
+ import org.apache.cloudstack.api.command.admin.internallb.ListInternalLoadBalancerElementsCmd;
+ import org.apache.cloudstack.api.command.admin.internallb.StartInternalLBVMCmd;
+ import org.apache.cloudstack.api.command.admin.internallb.StopInternalLBVMCmd;
+ import org.apache.cloudstack.api.command.admin.ldap.LDAPConfigCmd;
+ import org.apache.cloudstack.api.command.admin.ldap.LDAPRemoveCmd;
+ import org.apache.cloudstack.api.command.admin.network.AddNetworkDeviceCmd;
+ import org.apache.cloudstack.api.command.admin.network.AddNetworkServiceProviderCmd;
+ import org.apache.cloudstack.api.command.admin.network.CreateNetworkOfferingCmd;
+ import org.apache.cloudstack.api.command.admin.network.CreatePhysicalNetworkCmd;
+ import org.apache.cloudstack.api.command.admin.network.CreateStorageNetworkIpRangeCmd;
+ import org.apache.cloudstack.api.command.admin.network.DedicateGuestVlanRangeCmd;
+ import org.apache.cloudstack.api.command.admin.network.DeleteNetworkDeviceCmd;
+ import org.apache.cloudstack.api.command.admin.network.DeleteNetworkOfferingCmd;
+ import org.apache.cloudstack.api.command.admin.network.DeleteNetworkServiceProviderCmd;
+ import org.apache.cloudstack.api.command.admin.network.DeletePhysicalNetworkCmd;
+ import org.apache.cloudstack.api.command.admin.network.DeleteStorageNetworkIpRangeCmd;
+ import org.apache.cloudstack.api.command.admin.network.ListDedicatedGuestVlanRangesCmd;
+ import org.apache.cloudstack.api.command.admin.network.ListNetworkDeviceCmd;
+ import org.apache.cloudstack.api.command.admin.network.ListNetworkIsolationMethodsCmd;
+ import org.apache.cloudstack.api.command.admin.network.ListNetworkServiceProvidersCmd;
+ import org.apache.cloudstack.api.command.admin.network.ListPhysicalNetworksCmd;
+ import org.apache.cloudstack.api.command.admin.network.ListStorageNetworkIpRangeCmd;
+ import org.apache.cloudstack.api.command.admin.network.ListSupportedNetworkServicesCmd;
+ import org.apache.cloudstack.api.command.admin.network.ReleaseDedicatedGuestVlanRangeCmd;
+ import org.apache.cloudstack.api.command.admin.network.UpdateNetworkOfferingCmd;
+ import org.apache.cloudstack.api.command.admin.network.UpdateNetworkServiceProviderCmd;
+ import org.apache.cloudstack.api.command.admin.network.UpdatePhysicalNetworkCmd;
+ import org.apache.cloudstack.api.command.admin.network.UpdateStorageNetworkIpRangeCmd;
+ import org.apache.cloudstack.api.command.admin.offering.CreateDiskOfferingCmd;
+ import org.apache.cloudstack.api.command.admin.offering.CreateServiceOfferingCmd;
+ import org.apache.cloudstack.api.command.admin.offering.DeleteDiskOfferingCmd;
+ import org.apache.cloudstack.api.command.admin.offering.DeleteServiceOfferingCmd;
+ import org.apache.cloudstack.api.command.admin.offering.UpdateDiskOfferingCmd;
+ import org.apache.cloudstack.api.command.admin.offering.UpdateServiceOfferingCmd;
+ import org.apache.cloudstack.api.command.admin.pod.CreatePodCmd;
+ import org.apache.cloudstack.api.command.admin.pod.DeletePodCmd;
+ import org.apache.cloudstack.api.command.admin.pod.ListPodsByCmd;
+ import org.apache.cloudstack.api.command.admin.pod.UpdatePodCmd;
+ import org.apache.cloudstack.api.command.admin.region.AddRegionCmd;
+ import org.apache.cloudstack.api.command.admin.region.RemoveRegionCmd;
+ import org.apache.cloudstack.api.command.admin.region.UpdateRegionCmd;
+ import org.apache.cloudstack.api.command.admin.resource.ArchiveAlertsCmd;
+ import org.apache.cloudstack.api.command.admin.resource.DeleteAlertsCmd;
+ import org.apache.cloudstack.api.command.admin.resource.ListAlertsCmd;
+ import org.apache.cloudstack.api.command.admin.resource.ListCapacityCmd;
+ import org.apache.cloudstack.api.command.admin.resource.UploadCustomCertificateCmd;
+ import org.apache.cloudstack.api.command.admin.router.ConfigureVirtualRouterElementCmd;
+ import org.apache.cloudstack.api.command.admin.router.CreateVirtualRouterElementCmd;
+ import org.apache.cloudstack.api.command.admin.router.DestroyRouterCmd;
+ import org.apache.cloudstack.api.command.admin.router.ListRoutersCmd;
+ import org.apache.cloudstack.api.command.admin.router.ListVirtualRouterElementsCmd;
+ import org.apache.cloudstack.api.command.admin.router.RebootRouterCmd;
+ import org.apache.cloudstack.api.command.admin.router.StartRouterCmd;
+ import org.apache.cloudstack.api.command.admin.router.StopRouterCmd;
+ import org.apache.cloudstack.api.command.admin.router.UpgradeRouterCmd;
+ import org.apache.cloudstack.api.command.admin.storage.AddS3Cmd;
+ import org.apache.cloudstack.api.command.admin.storage.CancelPrimaryStorageMaintenanceCmd;
+ import org.apache.cloudstack.api.command.admin.storage.CreateStoragePoolCmd;
+ import org.apache.cloudstack.api.command.admin.storage.DeletePoolCmd;
+ import org.apache.cloudstack.api.command.admin.storage.FindStoragePoolsForMigrationCmd;
+ import org.apache.cloudstack.api.command.admin.storage.ListS3sCmd;
+ import org.apache.cloudstack.api.command.admin.storage.ListStoragePoolsCmd;
+ import org.apache.cloudstack.api.command.admin.storage.ListStorageProvidersCmd;
+ import org.apache.cloudstack.api.command.admin.storage.PreparePrimaryStorageForMaintenanceCmd;
+ import org.apache.cloudstack.api.command.admin.storage.UpdateStoragePoolCmd;
+ import org.apache.cloudstack.api.command.admin.swift.AddSwiftCmd;
+ import org.apache.cloudstack.api.command.admin.swift.ListSwiftsCmd;
+ import org.apache.cloudstack.api.command.admin.systemvm.DestroySystemVmCmd;
+ import org.apache.cloudstack.api.command.admin.systemvm.ListSystemVMsCmd;
+ import org.apache.cloudstack.api.command.admin.systemvm.MigrateSystemVMCmd;
+ import org.apache.cloudstack.api.command.admin.systemvm.RebootSystemVmCmd;
+ import org.apache.cloudstack.api.command.admin.systemvm.StartSystemVMCmd;
+ import org.apache.cloudstack.api.command.admin.systemvm.StopSystemVmCmd;
+ import org.apache.cloudstack.api.command.admin.systemvm.UpgradeSystemVMCmd;
+ import org.apache.cloudstack.api.command.admin.template.PrepareTemplateCmd;
+ import org.apache.cloudstack.api.command.admin.usage.AddTrafficMonitorCmd;
+ import org.apache.cloudstack.api.command.admin.usage.AddTrafficTypeCmd;
+ import org.apache.cloudstack.api.command.admin.usage.DeleteTrafficMonitorCmd;
+ import org.apache.cloudstack.api.command.admin.usage.DeleteTrafficTypeCmd;
+ import org.apache.cloudstack.api.command.admin.usage.GenerateUsageRecordsCmd;
+ import org.apache.cloudstack.api.command.admin.usage.GetUsageRecordsCmd;
+ import org.apache.cloudstack.api.command.admin.usage.ListTrafficMonitorsCmd;
+ import org.apache.cloudstack.api.command.admin.usage.ListTrafficTypeImplementorsCmd;
+ import org.apache.cloudstack.api.command.admin.usage.ListTrafficTypesCmd;
+ import org.apache.cloudstack.api.command.admin.usage.ListUsageTypesCmd;
+ import org.apache.cloudstack.api.command.admin.usage.UpdateTrafficTypeCmd;
+ import org.apache.cloudstack.api.command.admin.user.CreateUserCmd;
+ import org.apache.cloudstack.api.command.admin.user.DeleteUserCmd;
+ import org.apache.cloudstack.api.command.admin.user.DisableUserCmd;
+ import org.apache.cloudstack.api.command.admin.user.EnableUserCmd;
+ import org.apache.cloudstack.api.command.admin.user.GetUserCmd;
+ import org.apache.cloudstack.api.command.admin.user.ListUsersCmd;
+ import org.apache.cloudstack.api.command.admin.user.LockUserCmd;
+ import org.apache.cloudstack.api.command.admin.user.RegisterCmd;
+ import org.apache.cloudstack.api.command.admin.user.UpdateUserCmd;
+ import org.apache.cloudstack.api.command.admin.vlan.CreateVlanIpRangeCmd;
+ import org.apache.cloudstack.api.command.admin.vlan.DedicatePublicIpRangeCmd;
+ import org.apache.cloudstack.api.command.admin.vlan.DeleteVlanIpRangeCmd;
+ import org.apache.cloudstack.api.command.admin.vlan.ListVlanIpRangesCmd;
+ import org.apache.cloudstack.api.command.admin.vlan.ReleasePublicIpRangeCmd;
+ import org.apache.cloudstack.api.command.admin.vm.AssignVMCmd;
+ import org.apache.cloudstack.api.command.admin.vm.MigrateVMCmd;
+ import org.apache.cloudstack.api.command.admin.vm.MigrateVirtualMachineWithVolumeCmd;
+ import org.apache.cloudstack.api.command.admin.vm.RecoverVMCmd;
+ import org.apache.cloudstack.api.command.admin.vpc.CreatePrivateGatewayCmd;
+ import org.apache.cloudstack.api.command.admin.vpc.CreateVPCOfferingCmd;
+ import org.apache.cloudstack.api.command.admin.vpc.DeletePrivateGatewayCmd;
+ import org.apache.cloudstack.api.command.admin.vpc.DeleteVPCOfferingCmd;
+ import org.apache.cloudstack.api.command.admin.vpc.UpdateVPCOfferingCmd;
+ import org.apache.cloudstack.api.command.admin.zone.CreateZoneCmd;
+ import org.apache.cloudstack.api.command.admin.zone.DeleteZoneCmd;
+ import org.apache.cloudstack.api.command.admin.zone.MarkDefaultZoneForAccountCmd;
+ import org.apache.cloudstack.api.command.admin.zone.UpdateZoneCmd;
+ import org.apache.cloudstack.api.command.user.account.AddAccountToProjectCmd;
+ import org.apache.cloudstack.api.command.user.account.DeleteAccountFromProjectCmd;
+ import org.apache.cloudstack.api.command.user.account.ListAccountsCmd;
+ import org.apache.cloudstack.api.command.user.account.ListProjectAccountsCmd;
+ import org.apache.cloudstack.api.command.user.address.AssociateIPAddrCmd;
+ import org.apache.cloudstack.api.command.user.address.DisassociateIPAddrCmd;
+ import org.apache.cloudstack.api.command.user.address.ListPublicIpAddressesCmd;
+ import org.apache.cloudstack.api.command.user.affinitygroup.CreateAffinityGroupCmd;
+ import org.apache.cloudstack.api.command.user.affinitygroup.DeleteAffinityGroupCmd;
+ import org.apache.cloudstack.api.command.user.affinitygroup.ListAffinityGroupTypesCmd;
+ import org.apache.cloudstack.api.command.user.affinitygroup.ListAffinityGroupsCmd;
+ import org.apache.cloudstack.api.command.user.affinitygroup.UpdateVMAffinityGroupCmd;
+ import org.apache.cloudstack.api.command.user.autoscale.CreateAutoScalePolicyCmd;
+ import org.apache.cloudstack.api.command.user.autoscale.CreateAutoScaleVmGroupCmd;
+ import org.apache.cloudstack.api.command.user.autoscale.CreateAutoScaleVmProfileCmd;
+ import org.apache.cloudstack.api.command.user.autoscale.CreateConditionCmd;
+ import org.apache.cloudstack.api.command.user.autoscale.DeleteAutoScalePolicyCmd;
+ import org.apache.cloudstack.api.command.user.autoscale.DeleteAutoScaleVmGroupCmd;
+ import org.apache.cloudstack.api.command.user.autoscale.DeleteAutoScaleVmProfileCmd;
+ import org.apache.cloudstack.api.command.user.autoscale.DeleteConditionCmd;
+ import org.apache.cloudstack.api.command.user.autoscale.DisableAutoScaleVmGroupCmd;
+ import org.apache.cloudstack.api.command.user.autoscale.EnableAutoScaleVmGroupCmd;
+ import org.apache.cloudstack.api.command.user.autoscale.ListAutoScalePoliciesCmd;
+ import org.apache.cloudstack.api.command.user.autoscale.ListAutoScaleVmGroupsCmd;
+ import org.apache.cloudstack.api.command.user.autoscale.ListAutoScaleVmProfilesCmd;
+ import org.apache.cloudstack.api.command.user.autoscale.ListConditionsCmd;
+ import org.apache.cloudstack.api.command.user.autoscale.ListCountersCmd;
+ import org.apache.cloudstack.api.command.user.autoscale.UpdateAutoScalePolicyCmd;
+ import org.apache.cloudstack.api.command.user.autoscale.UpdateAutoScaleVmGroupCmd;
+ import org.apache.cloudstack.api.command.user.autoscale.UpdateAutoScaleVmProfileCmd;
+ import org.apache.cloudstack.api.command.user.config.ListCapabilitiesCmd;
+ import org.apache.cloudstack.api.command.user.event.ArchiveEventsCmd;
+ import org.apache.cloudstack.api.command.user.event.DeleteEventsCmd;
+ import org.apache.cloudstack.api.command.user.event.ListEventTypesCmd;
+ import org.apache.cloudstack.api.command.user.event.ListEventsCmd;
+ import org.apache.cloudstack.api.command.user.firewall.CreateEgressFirewallRuleCmd;
+ import org.apache.cloudstack.api.command.user.firewall.CreateFirewallRuleCmd;
+ import org.apache.cloudstack.api.command.user.firewall.CreatePortForwardingRuleCmd;
+ import org.apache.cloudstack.api.command.user.firewall.DeleteEgressFirewallRuleCmd;
+ import org.apache.cloudstack.api.command.user.firewall.DeleteFirewallRuleCmd;
+ import org.apache.cloudstack.api.command.user.firewall.DeletePortForwardingRuleCmd;
+ import org.apache.cloudstack.api.command.user.firewall.ListEgressFirewallRulesCmd;
+ import org.apache.cloudstack.api.command.user.firewall.ListFirewallRulesCmd;
+ import org.apache.cloudstack.api.command.user.firewall.ListPortForwardingRulesCmd;
+ import org.apache.cloudstack.api.command.user.firewall.UpdatePortForwardingRuleCmd;
+ import org.apache.cloudstack.api.command.user.guest.ListGuestOsCategoriesCmd;
+ import org.apache.cloudstack.api.command.user.guest.ListGuestOsCmd;
+ import org.apache.cloudstack.api.command.user.iso.AttachIsoCmd;
+ import org.apache.cloudstack.api.command.user.iso.CopyIsoCmd;
+ import org.apache.cloudstack.api.command.user.iso.DeleteIsoCmd;
+ import org.apache.cloudstack.api.command.user.iso.DetachIsoCmd;
+ import org.apache.cloudstack.api.command.user.iso.ExtractIsoCmd;
+ import org.apache.cloudstack.api.command.user.iso.ListIsoPermissionsCmd;
+ import org.apache.cloudstack.api.command.user.iso.ListIsosCmd;
+ import org.apache.cloudstack.api.command.user.iso.RegisterIsoCmd;
+ import org.apache.cloudstack.api.command.user.iso.UpdateIsoCmd;
+ import org.apache.cloudstack.api.command.user.iso.UpdateIsoPermissionsCmd;
+ import org.apache.cloudstack.api.command.user.job.ListAsyncJobsCmd;
+ import org.apache.cloudstack.api.command.user.job.QueryAsyncJobResultCmd;
+ import org.apache.cloudstack.api.command.user.loadbalancer.AssignToLoadBalancerRuleCmd;
+ import org.apache.cloudstack.api.command.user.loadbalancer.CreateApplicationLoadBalancerCmd;
+ import org.apache.cloudstack.api.command.user.loadbalancer.CreateLBHealthCheckPolicyCmd;
+ import org.apache.cloudstack.api.command.user.loadbalancer.CreateLBStickinessPolicyCmd;
+ import org.apache.cloudstack.api.command.user.loadbalancer.CreateLoadBalancerRuleCmd;
+ import org.apache.cloudstack.api.command.user.loadbalancer.DeleteApplicationLoadBalancerCmd;
+ import org.apache.cloudstack.api.command.user.loadbalancer.DeleteLBHealthCheckPolicyCmd;
+ import org.apache.cloudstack.api.command.user.loadbalancer.DeleteLBStickinessPolicyCmd;
+ import org.apache.cloudstack.api.command.user.loadbalancer.DeleteLoadBalancerRuleCmd;
+ import org.apache.cloudstack.api.command.user.loadbalancer.ListApplicationLoadBalancersCmd;
+ import org.apache.cloudstack.api.command.user.loadbalancer.ListLBHealthCheckPoliciesCmd;
+ import org.apache.cloudstack.api.command.user.loadbalancer.ListLBStickinessPoliciesCmd;
+ import org.apache.cloudstack.api.command.user.loadbalancer.ListLoadBalancerRuleInstancesCmd;
+ import org.apache.cloudstack.api.command.user.loadbalancer.ListLoadBalancerRulesCmd;
+ import org.apache.cloudstack.api.command.user.loadbalancer.RemoveFromLoadBalancerRuleCmd;
+ import org.apache.cloudstack.api.command.user.loadbalancer.UpdateLoadBalancerRuleCmd;
+ import org.apache.cloudstack.api.command.user.nat.CreateIpForwardingRuleCmd;
+ import org.apache.cloudstack.api.command.user.nat.DeleteIpForwardingRuleCmd;
+ import org.apache.cloudstack.api.command.user.nat.DisableStaticNatCmd;
+ import org.apache.cloudstack.api.command.user.nat.EnableStaticNatCmd;
+ import org.apache.cloudstack.api.command.user.nat.ListIpForwardingRulesCmd;
+ import org.apache.cloudstack.api.command.user.network.CreateNetworkACLCmd;
+ import org.apache.cloudstack.api.command.user.network.CreateNetworkCmd;
+ import org.apache.cloudstack.api.command.user.network.DeleteNetworkACLCmd;
+ import org.apache.cloudstack.api.command.user.network.DeleteNetworkCmd;
+ import org.apache.cloudstack.api.command.user.network.ListNetworkACLsCmd;
+ import org.apache.cloudstack.api.command.user.network.ListNetworkOfferingsCmd;
+ import org.apache.cloudstack.api.command.user.network.ListNetworksCmd;
+ import org.apache.cloudstack.api.command.user.network.RestartNetworkCmd;
+ import org.apache.cloudstack.api.command.user.network.UpdateNetworkCmd;
+ import org.apache.cloudstack.api.command.user.offering.ListDiskOfferingsCmd;
+ import org.apache.cloudstack.api.command.user.offering.ListServiceOfferingsCmd;
+ import org.apache.cloudstack.api.command.user.project.ActivateProjectCmd;
+ import org.apache.cloudstack.api.command.user.project.CreateProjectCmd;
+ import org.apache.cloudstack.api.command.user.project.DeleteProjectCmd;
+ import org.apache.cloudstack.api.command.user.project.DeleteProjectInvitationCmd;
+ import org.apache.cloudstack.api.command.user.project.ListProjectInvitationsCmd;
+ import org.apache.cloudstack.api.command.user.project.ListProjectsCmd;
+ import org.apache.cloudstack.api.command.user.project.SuspendProjectCmd;
+ import org.apache.cloudstack.api.command.user.project.UpdateProjectCmd;
+ import org.apache.cloudstack.api.command.user.project.UpdateProjectInvitationCmd;
+ import org.apache.cloudstack.api.command.user.region.ListRegionsCmd;
+ import org.apache.cloudstack.api.command.user.region.ha.gslb.AssignToGlobalLoadBalancerRuleCmd;
+ import org.apache.cloudstack.api.command.user.region.ha.gslb.CreateGlobalLoadBalancerRuleCmd;
+ import org.apache.cloudstack.api.command.user.region.ha.gslb.DeleteGlobalLoadBalancerRuleCmd;
+ import org.apache.cloudstack.api.command.user.region.ha.gslb.ListGlobalLoadBalancerRuleCmd;
+ import org.apache.cloudstack.api.command.user.region.ha.gslb.RemoveFromGlobalLoadBalancerRuleCmd;
+ import org.apache.cloudstack.api.command.user.resource.GetCloudIdentifierCmd;
+ import org.apache.cloudstack.api.command.user.resource.ListHypervisorsCmd;
+ import org.apache.cloudstack.api.command.user.resource.ListResourceLimitsCmd;
+ import org.apache.cloudstack.api.command.user.resource.UpdateResourceCountCmd;
+ import org.apache.cloudstack.api.command.user.resource.UpdateResourceLimitCmd;
+ import org.apache.cloudstack.api.command.user.securitygroup.AuthorizeSecurityGroupEgressCmd;
+ import org.apache.cloudstack.api.command.user.securitygroup.AuthorizeSecurityGroupIngressCmd;
+ import org.apache.cloudstack.api.command.user.securitygroup.CreateSecurityGroupCmd;
+ import org.apache.cloudstack.api.command.user.securitygroup.DeleteSecurityGroupCmd;
+ import org.apache.cloudstack.api.command.user.securitygroup.ListSecurityGroupsCmd;
+ import org.apache.cloudstack.api.command.user.securitygroup.RevokeSecurityGroupEgressCmd;
+ import org.apache.cloudstack.api.command.user.securitygroup.RevokeSecurityGroupIngressCmd;
+ import org.apache.cloudstack.api.command.user.snapshot.CreateSnapshotCmd;
+ import org.apache.cloudstack.api.command.user.snapshot.CreateSnapshotPolicyCmd;
+ import org.apache.cloudstack.api.command.user.snapshot.DeleteSnapshotCmd;
+ import org.apache.cloudstack.api.command.user.snapshot.DeleteSnapshotPoliciesCmd;
+ import org.apache.cloudstack.api.command.user.snapshot.ListSnapshotPoliciesCmd;
+ import org.apache.cloudstack.api.command.user.snapshot.ListSnapshotsCmd;
+ import org.apache.cloudstack.api.command.user.ssh.CreateSSHKeyPairCmd;
+ import org.apache.cloudstack.api.command.user.ssh.DeleteSSHKeyPairCmd;
+ import org.apache.cloudstack.api.command.user.ssh.ListSSHKeyPairsCmd;
+ import org.apache.cloudstack.api.command.user.ssh.RegisterSSHKeyPairCmd;
+ import org.apache.cloudstack.api.command.user.tag.CreateTagsCmd;
+ import org.apache.cloudstack.api.command.user.tag.DeleteTagsCmd;
+ import org.apache.cloudstack.api.command.user.tag.ListTagsCmd;
+ import org.apache.cloudstack.api.command.user.template.CopyTemplateCmd;
+ import org.apache.cloudstack.api.command.user.template.CreateTemplateCmd;
+ import org.apache.cloudstack.api.command.user.template.DeleteTemplateCmd;
+ import org.apache.cloudstack.api.command.user.template.ExtractTemplateCmd;
+ import org.apache.cloudstack.api.command.user.template.ListTemplatePermissionsCmd;
+ import org.apache.cloudstack.api.command.user.template.ListTemplatesCmd;
+ import org.apache.cloudstack.api.command.user.template.RegisterTemplateCmd;
+ import org.apache.cloudstack.api.command.user.template.UpdateTemplateCmd;
+ import org.apache.cloudstack.api.command.user.template.UpdateTemplatePermissionsCmd;
+ import org.apache.cloudstack.api.command.user.vm.AddIpToVmNicCmd;
+ import org.apache.cloudstack.api.command.user.vm.AddNicToVMCmd;
+ import org.apache.cloudstack.api.command.user.vm.DeployVMCmd;
+ import org.apache.cloudstack.api.command.user.vm.DestroyVMCmd;
+ import org.apache.cloudstack.api.command.user.vm.GetVMPasswordCmd;
+ import org.apache.cloudstack.api.command.user.vm.ListNicsCmd;
+ import org.apache.cloudstack.api.command.user.vm.ListVMsCmd;
+ import org.apache.cloudstack.api.command.user.vm.RebootVMCmd;
+ import org.apache.cloudstack.api.command.user.vm.RemoveIpFromVmNicCmd;
+ import org.apache.cloudstack.api.command.user.vm.RemoveNicFromVMCmd;
+ import org.apache.cloudstack.api.command.user.vm.ResetVMPasswordCmd;
+ import org.apache.cloudstack.api.command.user.vm.ResetVMSSHKeyCmd;
+ import org.apache.cloudstack.api.command.user.vm.RestoreVMCmd;
+ import org.apache.cloudstack.api.command.user.vm.ScaleVMCmd;
+ import org.apache.cloudstack.api.command.user.vm.StartVMCmd;
+ import org.apache.cloudstack.api.command.user.vm.StopVMCmd;
+ import org.apache.cloudstack.api.command.user.vm.UpdateDefaultNicForVMCmd;
+ import org.apache.cloudstack.api.command.user.vm.UpdateVMCmd;
+ import org.apache.cloudstack.api.command.user.vm.UpgradeVMCmd;
+ import org.apache.cloudstack.api.command.user.vmgroup.CreateVMGroupCmd;
+ import org.apache.cloudstack.api.command.user.vmgroup.DeleteVMGroupCmd;
+ import org.apache.cloudstack.api.command.user.vmgroup.ListVMGroupsCmd;
+ import org.apache.cloudstack.api.command.user.vmgroup.UpdateVMGroupCmd;
+ import org.apache.cloudstack.api.command.user.vmsnapshot.CreateVMSnapshotCmd;
+ import org.apache.cloudstack.api.command.user.vmsnapshot.DeleteVMSnapshotCmd;
+ import org.apache.cloudstack.api.command.user.vmsnapshot.ListVMSnapshotCmd;
+ import org.apache.cloudstack.api.command.user.vmsnapshot.RevertToVMSnapshotCmd;
+ import org.apache.cloudstack.api.command.user.volume.AttachVolumeCmd;
+ import org.apache.cloudstack.api.command.user.volume.CreateVolumeCmd;
+ import org.apache.cloudstack.api.command.user.volume.DeleteVolumeCmd;
+ import org.apache.cloudstack.api.command.user.volume.DetachVolumeCmd;
+ import org.apache.cloudstack.api.command.user.volume.ExtractVolumeCmd;
+ import org.apache.cloudstack.api.command.user.volume.ListVolumesCmd;
+ import org.apache.cloudstack.api.command.user.volume.MigrateVolumeCmd;
+ import org.apache.cloudstack.api.command.user.volume.ResizeVolumeCmd;
+ import org.apache.cloudstack.api.command.user.volume.UploadVolumeCmd;
+ import org.apache.cloudstack.api.command.user.vpc.CreateStaticRouteCmd;
+ import org.apache.cloudstack.api.command.user.vpc.CreateVPCCmd;
+ import org.apache.cloudstack.api.command.user.vpc.DeleteStaticRouteCmd;
+ import org.apache.cloudstack.api.command.user.vpc.DeleteVPCCmd;
+ import org.apache.cloudstack.api.command.user.vpc.ListPrivateGatewaysCmd;
+ import org.apache.cloudstack.api.command.user.vpc.ListStaticRoutesCmd;
+ import org.apache.cloudstack.api.command.user.vpc.ListVPCOfferingsCmd;
+ import org.apache.cloudstack.api.command.user.vpc.ListVPCsCmd;
+ import org.apache.cloudstack.api.command.user.vpc.RestartVPCCmd;
+ import org.apache.cloudstack.api.command.user.vpc.UpdateVPCCmd;
+ import org.apache.cloudstack.api.command.user.vpn.AddVpnUserCmd;
+ import org.apache.cloudstack.api.command.user.vpn.CreateRemoteAccessVpnCmd;
+ import org.apache.cloudstack.api.command.user.vpn.CreateVpnConnectionCmd;
+ import org.apache.cloudstack.api.command.user.vpn.CreateVpnCustomerGatewayCmd;
+ import org.apache.cloudstack.api.command.user.vpn.CreateVpnGatewayCmd;
+ import org.apache.cloudstack.api.command.user.vpn.DeleteRemoteAccessVpnCmd;
+ import org.apache.cloudstack.api.command.user.vpn.DeleteVpnConnectionCmd;
+ import org.apache.cloudstack.api.command.user.vpn.DeleteVpnCustomerGatewayCmd;
+ import org.apache.cloudstack.api.command.user.vpn.DeleteVpnGatewayCmd;
+ import org.apache.cloudstack.api.command.user.vpn.ListRemoteAccessVpnsCmd;
+ import org.apache.cloudstack.api.command.user.vpn.ListVpnConnectionsCmd;
+ import org.apache.cloudstack.api.command.user.vpn.ListVpnCustomerGatewaysCmd;
+ import org.apache.cloudstack.api.command.user.vpn.ListVpnGatewaysCmd;
+ import org.apache.cloudstack.api.command.user.vpn.ListVpnUsersCmd;
+ import org.apache.cloudstack.api.command.user.vpn.RemoveVpnUserCmd;
+ import org.apache.cloudstack.api.command.user.vpn.ResetVpnConnectionCmd;
+ import org.apache.cloudstack.api.command.user.vpn.UpdateVpnCustomerGatewayCmd;
+ import org.apache.cloudstack.api.command.user.zone.ListZonesByCmd;
  import org.apache.cloudstack.api.response.ExtractResponse;
- import org.apache.commons.codec.binary.Base64;
- import org.apache.log4j.Logger;
- import org.springframework.stereotype.Component;
+ import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager;
+ import org.apache.cloudstack.engine.subsystem.api.storage.StoragePoolAllocator;
+ import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao;
+ import org.apache.cloudstack.storage.datastore.db.StoragePoolVO;
 -import org.apache.commons.codec.binary.Base64;
 -import org.apache.log4j.Logger;
  
  import com.cloud.agent.AgentManager;
  import com.cloud.agent.api.GetVncPortAnswer;
@@@ -119,7 -421,11 +422,10 @@@ import com.cloud.alert.AlertManager
  import com.cloud.alert.AlertVO;
  import com.cloud.alert.dao.AlertDao;
  import com.cloud.api.ApiDBUtils;
- import com.cloud.async.*;
 -import com.cloud.async.AsyncJobExecutor;
++import com.cloud.async.AsyncJob;
++import com.cloud.async.AsyncJobConstants;
++import com.cloud.async.AsyncJobExecutionContext;
+ import com.cloud.async.AsyncJobManager;
 -import com.cloud.async.AsyncJobResult;
 -import com.cloud.async.AsyncJobVO;
 -import com.cloud.async.BaseAsyncJobExecutor;
  import com.cloud.capacity.Capacity;
  import com.cloud.capacity.CapacityVO;
  import com.cloud.capacity.dao.CapacityDao;
@@@ -423,10 -678,10 +678,10 @@@ public class ManagementServerImpl exten
      private LoadBalancerDao _loadbalancerDao;
      @Inject
      private HypervisorCapabilitiesDao _hypervisorCapabilitiesDao;
- 
      private List<HostAllocator> _hostAllocators;
- 
+     @Inject
+     private List<StoragePoolAllocator> _storagePoolAllocators;
 -    @Inject
 +	@Inject
      private ConfigurationManager _configMgr;
      @Inject
      private ResourceTagDao _resourceTagDao;
@@@ -462,6 -720,19 +720,19 @@@
  
      @Inject ClusterManager _clusterMgr;
      private String _hashKey = null;
+     private String _encryptionKey = null;
+     private String _encryptionIV = null;
+     
+     @Inject
+     protected AffinityGroupVMMapDao _affinityGroupVMMapDao;
+ 
+     protected List<AffinityGroupProcessor> _affinityProcessors;
+     public List<AffinityGroupProcessor> getAffinityGroupProcessors() {
+         return _affinityProcessors;
+     }
+     public void setAffinityGroupProcessors(List<AffinityGroupProcessor> affinityProcessors) {
 -        this._affinityProcessors = affinityProcessors;
++        _affinityProcessors = affinityProcessors;
+     }
  
      public ManagementServerImpl() {
      	setRunLevel(ComponentLifecycle.RUN_LEVEL_APPLICATION_MAINLOOP);
@@@ -667,22 -938,39 +938,39 @@@
  
      @Override
      public Pair<List<? extends Cluster>, Integer> searchForClusters(ListClustersCmd cmd) {
-         Filter searchFilter = new Filter(ClusterVO.class, "id", true, cmd.getStartIndex(), cmd.getPageSizeVal());
-         SearchCriteria<ClusterVO> sc = _clusterDao.createSearchCriteria();
- 
 -    	Object id = cmd.getId();
 +        Object id = cmd.getId();
          Object name = cmd.getClusterName();
          Object podId = cmd.getPodId();
          Long zoneId = cmd.getZoneId();
          Object hypervisorType = cmd.getHypervisorType();
          Object clusterType = cmd.getClusterType();
          Object allocationState = cmd.getAllocationState();
+         String zoneType = cmd.getZoneType();
          String keyword = cmd.getKeyword();
- 
          zoneId = _accountMgr.checkAccessAndSpecifyAuthority(UserContext.current().getCaller(), zoneId);
 -    	
 +
+         
+     	Filter searchFilter = new Filter(ClusterVO.class, "id", true, cmd.getStartIndex(), cmd.getPageSizeVal());
+         
 -        SearchBuilder<ClusterVO> sb = _clusterDao.createSearchBuilder();        
 -        sb.and("id", sb.entity().getId(), SearchCriteria.Op.EQ);        
 -        sb.and("name", sb.entity().getName(), SearchCriteria.Op.LIKE);  
 -        sb.and("podId", sb.entity().getPodId(), SearchCriteria.Op.EQ);          
 -        sb.and("dataCenterId", sb.entity().getDataCenterId(), SearchCriteria.Op.EQ);         
++        SearchBuilder<ClusterVO> sb = _clusterDao.createSearchBuilder();
++        sb.and("id", sb.entity().getId(), SearchCriteria.Op.EQ);
++        sb.and("name", sb.entity().getName(), SearchCriteria.Op.LIKE);
++        sb.and("podId", sb.entity().getPodId(), SearchCriteria.Op.EQ);
++        sb.and("dataCenterId", sb.entity().getDataCenterId(), SearchCriteria.Op.EQ);
+         sb.and("hypervisorType", sb.entity().getHypervisorType(), SearchCriteria.Op.EQ);
+         sb.and("clusterType", sb.entity().getClusterType(), SearchCriteria.Op.EQ);
+         sb.and("allocationState", sb.entity().getAllocationState(), SearchCriteria.Op.EQ);
+         
+         if(zoneType != null) {
+             SearchBuilder<DataCenterVO> zoneSb = _dcDao.createSearchBuilder();
 -            zoneSb.and("zoneNetworkType", zoneSb.entity().getNetworkType(), SearchCriteria.Op.EQ);    
++            zoneSb.and("zoneNetworkType", zoneSb.entity().getNetworkType(), SearchCriteria.Op.EQ);
+             sb.join("zoneSb", zoneSb, sb.entity().getDataCenterId(), zoneSb.entity().getId(), JoinBuilder.JoinType.INNER);
+         }
+         
+         
 -        SearchCriteria<ClusterVO> sc = sb.create();        
++        SearchCriteria<ClusterVO> sc = sb.create();
          if (id != null) {
-             sc.addAnd("id", SearchCriteria.Op.EQ, id);
 -            sc.setParameters("id", id);            
++            sc.setParameters("id", id);
          }
  
          if (name != null) {
@@@ -706,9 -994,13 +994,13 @@@
          }
  
          if (allocationState != null) {
-             sc.addAnd("allocationState", SearchCriteria.Op.EQ, allocationState);
+             sc.setParameters("allocationState", allocationState);
+         }
+ 
+         if(zoneType != null) {
 -            sc.setJoinParameters("zoneSb", "zoneNetworkType", zoneType);          
++            sc.setJoinParameters("zoneSb", "zoneNetworkType", zoneType);
          }
 -                
 +
          if (keyword != null) {
              SearchCriteria<ClusterVO> ssc = _clusterDao.createSearchCriteria();
              ssc.addOr("name", SearchCriteria.Op.LIKE, "%" + keyword + "%");
@@@ -792,32 -1081,73 +1081,73 @@@
              ex.addProxyObject(vm, vmId, "vmId");
              throw ex;
          }
-         Long cluster = srcHost.getClusterId();
-         Type hostType = srcHost.getType();
-         if (s_logger.isDebugEnabled()) {
-             s_logger.debug("Searching for all hosts in cluster: " + cluster + " for migrating VM " + vm);
+ 
+         // Check if the vm can be migrated with storage.
+         boolean canMigrateWithStorage = false;
+         HypervisorCapabilitiesVO capabilities = _hypervisorCapabilitiesDao.findByHypervisorTypeAndVersion(
+                 srcHost.getHypervisorType(), srcHost.getHypervisorVersion());
+         if (capabilities != null) {
+             canMigrateWithStorage = capabilities.isStorageMotionSupported();
          }
  
-         Pair<List<HostVO>, Integer> allHostsInClusterPair = searchForServers(startIndex, pageSize, null, hostType, null, null, null, cluster, null, null, null, null);
+         // Check if the vm is using any disks on local storage.
+         VirtualMachineProfile<VMInstanceVO> vmProfile = new VirtualMachineProfileImpl<VMInstanceVO>(vm);
+         List<VolumeVO> volumes = _volumeDao.findCreatedByInstance(vmProfile.getId());
+         boolean usesLocal = false;
+         for (VolumeVO volume : volumes) {
+             DiskOfferingVO diskOffering = _diskOfferingDao.findById(volume.getDiskOfferingId());
+             DiskProfile diskProfile = new DiskProfile(volume, diskOffering, vmProfile.getHypervisorType());
+             if (diskProfile.useLocalStorage()) {
+                 usesLocal = true;
+                 break;
+             }
+         }
  
-         // filter out the current host
-         List<HostVO> allHostsInCluster = allHostsInClusterPair.first();
-         allHostsInCluster.remove(srcHost);
-         Pair<List<? extends Host>, Integer> otherHostsInCluster = new Pair<List <? extends Host>, Integer>(allHostsInCluster, new Integer(allHostsInClusterPair.second().intValue()-1));
+         if (!canMigrateWithStorage && usesLocal) {
+             throw new InvalidParameterValueException("Unsupported operation, VM uses Local storage, cannot migrate");
+         }
  
-         if (s_logger.isDebugEnabled()) {
-             s_logger.debug("Other Hosts in this cluster: " + allHostsInCluster);
+         Type hostType = srcHost.getType();
+         Pair<List<HostVO>, Integer> allHostsPair = null;
+         List<HostVO> allHosts = null;
+         Map<Host, Boolean> requiresStorageMotion = new HashMap<Host, Boolean>();
+         DataCenterDeployment plan = null;
+         if (canMigrateWithStorage) {
+             allHostsPair = searchForServers(startIndex, pageSize, null, hostType, null, srcHost.getDataCenterId(), null,
+                     null, null, null, null, null, srcHost.getHypervisorType(), srcHost.getHypervisorVersion());
+             allHosts = allHostsPair.first();
+             allHosts.remove(srcHost);
+ 
+             // Check if the host has storage pools for all the volumes of the vm to be migrated.
+             for (Host host : allHosts) {
+                 Map<Volume, List<StoragePool>> volumePools = findSuitablePoolsForVolumes(vmProfile, host);
+                 if (volumePools.isEmpty()) {
+                     allHosts.remove(host);
+                 } else {
+                     if (host.getClusterId() != srcHost.getClusterId() || usesLocal) {
+                         requiresStorageMotion.put(host, true);
+                     }
+                 }
 -            }
 +        }
  
+             plan = new DataCenterDeployment(srcHost.getDataCenterId(), null, null, null, null, null);
+         } else {
+             Long cluster = srcHost.getClusterId();
 -            if (s_logger.isDebugEnabled()) {
 +        if (s_logger.isDebugEnabled()) {
-             s_logger.debug("Calling HostAllocators to search for hosts in cluster: " + cluster + " having enough capacity and suitable for migration");
+                 s_logger.debug("Searching for all hosts in cluster " + cluster + " for migrating VM " + vm);
+             }
+             allHostsPair = searchForServers(startIndex, pageSize, null, hostType, null, null, null, cluster, null, null,
+                     null, null, null, null);
+             // Filter out the current host.
+             allHosts = allHostsPair.first();
+             allHosts.remove(srcHost);
+             plan = new DataCenterDeployment(srcHost.getDataCenterId(), srcHost.getPodId(), srcHost.getClusterId(),
+                     null, null, null);
          }
  
+         Pair<List<? extends Host>, Integer> otherHosts = new Pair<List <? extends Host>, Integer>(allHosts,
+                 new Integer(allHosts.size()));
          List<Host> suitableHosts = new ArrayList<Host>();
- 
-         VirtualMachineProfile<VMInstanceVO> vmProfile = new VirtualMachineProfileImpl<VMInstanceVO>(vm);
- 
-         DataCenterDeployment plan = new DataCenterDeployment(srcHost.getDataCenterId(), srcHost.getPodId(), srcHost.getClusterId(), null, null, null);
          ExcludeList excludes = new ExcludeList();
          excludes.addHost(srcHostId);
  
@@@ -828,15 -1174,157 +1174,157 @@@
              }
          }
  
+         if (s_logger.isDebugEnabled()) {
 -            if (suitableHosts.isEmpty()) {
 -                s_logger.debug("No suitable hosts found");
 -            } else {
 +        if (suitableHosts.isEmpty()) {
 +            s_logger.debug("No suitable hosts found");
 +        } else {
-             if (s_logger.isDebugEnabled()) {
                  s_logger.debug("Hosts having capacity and suitable for migration: " + suitableHosts);
              }
          }
  
-         return new Pair<Pair<List<? extends Host>, Integer>, List<? extends Host>>(otherHostsInCluster, suitableHosts);
+         return new Ternary<Pair<List<? extends Host>, Integer>, List<? extends Host>, Map<Host, Boolean>> (otherHosts,
+                 suitableHosts, requiresStorageMotion);
+     }
+ 
+     private Map<Volume, List<StoragePool>> findSuitablePoolsForVolumes(VirtualMachineProfile<VMInstanceVO> vmProfile,
+             Host host) {
+         List<VolumeVO> volumes = _volumeDao.findCreatedByInstance(vmProfile.getId());
+         Map<Volume, List<StoragePool>> suitableVolumeStoragePools = new HashMap<Volume, List<StoragePool>>();
+ 
+         // For each volume find list of suitable storage pools by calling the allocators
+         for (VolumeVO volume : volumes) {
+             DiskOfferingVO diskOffering = _diskOfferingDao.findById(volume.getDiskOfferingId());
+             DiskProfile diskProfile = new DiskProfile(volume, diskOffering, vmProfile.getHypervisorType());
+             DataCenterDeployment plan = new DataCenterDeployment(host.getDataCenterId(), host.getPodId(),
+                     host.getClusterId(), host.getId(), null, null);
+             ExcludeList avoid = new ExcludeList();
+ 
+             boolean foundPools = false;
+             for (StoragePoolAllocator allocator : _storagePoolAllocators) {
+                 List<StoragePool> poolList = allocator.allocateToPool(diskProfile, vmProfile, plan, avoid,
+                         StoragePoolAllocator.RETURN_UPTO_ALL);
+                 if (poolList != null && !poolList.isEmpty()) {
+                     suitableVolumeStoragePools.put(volume, poolList);
+                     foundPools = true;
+                     break;
+                 }
+             }
+ 
+             if (!foundPools) {
+                 suitableVolumeStoragePools.clear();
+                 break;
+             }
+         }
+ 
+         return suitableVolumeStoragePools;
+     }
+ 
+     @Override
+     public Pair<List<? extends StoragePool>, List<? extends StoragePool>> listStoragePoolsForMigrationOfVolume(Long volumeId) {
+         // Access check - only root administrator can migrate volumes.
+         Account caller = UserContext.current().getCaller();
+         if (caller.getType() != Account.ACCOUNT_TYPE_ADMIN) {
+             if (s_logger.isDebugEnabled()) {
+                 s_logger.debug("Caller is not a root admin, permission denied to migrate the volume");
+             }
+             throw new PermissionDeniedException("No permission to migrate volume, only root admin can migrate a volume");
+         }
+ 
+         VolumeVO volume = _volumeDao.findById(volumeId);
+         if (volume == null) {
+             InvalidParameterValueException ex = new InvalidParameterValueException("Unable to find volume with" +
+                     " specified id.");
+             ex.addProxyObject(volume, volumeId, "volumeId");
+             throw ex;
+         }
+ 
+         // Volume must be attached to an instance for live migration.
+         List<StoragePool> allPools = new ArrayList<StoragePool>();
+         List<StoragePool> suitablePools = new ArrayList<StoragePool>();
+         Long instanceId = volume.getInstanceId();
+         VMInstanceVO vm = null;
+         if (instanceId != null) {
+             vm = _vmInstanceDao.findById(instanceId);
+         }
+ 
+         // Check that the VM is in correct state.
+         if (vm == null || vm.getState() != State.Running) {
+             s_logger.info("Volume " + volume + " isn't attached to any running vm. Only volumes attached to a running" +
+                     " VM can be migrated.");
+             return new Pair<List<? extends StoragePool>, List<? extends StoragePool>>(allPools, suitablePools);
+         }
+ 
+         // Volume must be in Ready state to be migrated.
+         if (!Volume.State.Ready.equals(volume.getState())) {
+             s_logger.info("Volume " + volume + " must be in ready state for migration.");
+             return new Pair<List<? extends StoragePool>, List<? extends StoragePool>>(allPools, suitablePools);
+         }
+ 
+         if (!_volumeMgr.volumeOnSharedStoragePool(volume)) {
+             s_logger.info("Volume " + volume + " is on local storage. It cannot be migrated to another pool.");
+             return new Pair<List<? extends StoragePool>, List<? extends StoragePool>>(allPools, suitablePools);
+         }
+ 
+         // Check if the underlying hypervisor supports storage motion.
+         boolean storageMotionSupported = false;
+         Long hostId = vm.getHostId();
+         if (hostId != null) {
+             HostVO host = _hostDao.findById(hostId);
+             HypervisorCapabilitiesVO capabilities = null;
+             if (host != null) {
+                 capabilities = _hypervisorCapabilitiesDao.findByHypervisorTypeAndVersion(host.getHypervisorType(),
+                         host.getHypervisorVersion());
+             } else {
+                 s_logger.error("Details of the host on which the vm " + vm + ", to which volume "+ volume + " is "
+                         + "attached, couldn't be retrieved.");
+             }
+ 
+             if (capabilities != null) {
+                 storageMotionSupported = capabilities.isStorageMotionSupported();
+             } else {
+                 s_logger.error("Capabilities for host " + host + " couldn't be retrieved.");
+             }
+         }
+ 
+         if (storageMotionSupported) {
+             // Source pool of the volume.
+             StoragePoolVO srcVolumePool = _poolDao.findById(volume.getPoolId());
+ 
+             // Get all the pools available. Only shared pools are considered because only a volume on a shared pools
+             // can be live migrated while the virtual machine stays on the same host.
+             List<StoragePoolVO> storagePools = _poolDao.findPoolsByTags(volume.getDataCenterId(),
+                     volume.getPodId(), srcVolumePool.getClusterId(), null);
+             storagePools.remove(srcVolumePool);
+             for (StoragePoolVO pool : storagePools) {
+                 if (pool.isShared()) {
 -                    allPools.add((StoragePool)this.dataStoreMgr.getPrimaryDataStore(pool.getId()));
++                    allPools.add((StoragePool)dataStoreMgr.getPrimaryDataStore(pool.getId()));
+                 }
+             }
+ 
+             // Get all the suitable pools.
+             // Exclude the current pool from the list of pools to which the volume can be migrated.
+             ExcludeList avoid = new ExcludeList();
+             avoid.addPool(srcVolumePool.getId());
+ 
+             // Volume stays in the same cluster after migration.
+             DataCenterDeployment plan = new DataCenterDeployment(volume.getDataCenterId(), volume.getPodId(),
+                     srcVolumePool.getClusterId(), null, null, null);
+             VirtualMachineProfile<VMInstanceVO> profile = new VirtualMachineProfileImpl<VMInstanceVO>(vm);
+ 
+             DiskOfferingVO diskOffering = _diskOfferingDao.findById(volume.getDiskOfferingId());
+             DiskProfile diskProfile = new DiskProfile(volume, diskOffering, profile.getHypervisorType());
+ 
+             // Call the storage pool allocator to find the list of storage pools.
+             for (StoragePoolAllocator allocator : _storagePoolAllocators) {
+                 List<StoragePool> pools = allocator.allocateToPool(diskProfile, profile, plan, avoid,
+                         StoragePoolAllocator.RETURN_UPTO_ALL);
+                 if (pools != null && !pools.isEmpty()) {
+                     suitablePools.addAll(pools);
+                     break;
+                 }
+             }
+         }
+         return new Pair<List<? extends StoragePool>, List<? extends StoragePool>>(allPools, suitablePools);
      }
  
      private Pair<List<HostVO>, Integer> searchForServers(Long startIndex, Long pageSize, Object name, Object type, Object state, Object zone, Object pod, Object cluster, Object id, Object keyword,
@@@ -915,17 -1411,29 +1411,29 @@@
  
      @Override
      public Pair<List<? extends Pod>, Integer> searchForPods(ListPodsByCmd cmd) {
-         Filter searchFilter = new Filter(HostPodVO.class, "dataCenterId", true, cmd.getStartIndex(), cmd.getPageSizeVal());
-         SearchCriteria<HostPodVO> sc = _hostPodDao.createSearchCriteria();
- 
          String podName = cmd.getPodName();
          Long id = cmd.getId();
 -        Long zoneId = cmd.getZoneId();        
 +        Long zoneId = cmd.getZoneId();
          Object keyword = cmd.getKeyword();
          Object allocationState = cmd.getAllocationState();
- 
+         String zoneType = cmd.getZoneType();
          zoneId = _accountMgr.checkAccessAndSpecifyAuthority(UserContext.current().getCaller(), zoneId);
  
+     	
+     	Filter searchFilter = new Filter(HostPodVO.class, "dataCenterId", true, cmd.getStartIndex(), cmd.getPageSizeVal());
 -        SearchBuilder<HostPodVO> sb = _hostPodDao.createSearchBuilder();        
++        SearchBuilder<HostPodVO> sb = _hostPodDao.createSearchBuilder();
+         sb.and("id", sb.entity().getId(), SearchCriteria.Op.EQ);
 -        sb.and("name", sb.entity().getName(), SearchCriteria.Op.LIKE);          
 -        sb.and("dataCenterId", sb.entity().getDataCenterId(), SearchCriteria.Op.EQ);         
++        sb.and("name", sb.entity().getName(), SearchCriteria.Op.LIKE);
++        sb.and("dataCenterId", sb.entity().getDataCenterId(), SearchCriteria.Op.EQ);
+         sb.and("allocationState", sb.entity().getAllocationState(), SearchCriteria.Op.EQ);
+         
+         if(zoneType != null) {
+             SearchBuilder<DataCenterVO> zoneSb = _dcDao.createSearchBuilder();
 -            zoneSb.and("zoneNetworkType", zoneSb.entity().getNetworkType(), SearchCriteria.Op.EQ);    
++            zoneSb.and("zoneNetworkType", zoneSb.entity().getNetworkType(), SearchCriteria.Op.EQ);
+             sb.join("zoneSb", zoneSb, sb.entity().getDataCenterId(), zoneSb.entity().getId(), JoinBuilder.JoinType.INNER);
+         }
+                
+         SearchCriteria<HostPodVO> sc = sb.create();
          if (keyword != null) {
              SearchCriteria<HostPodVO> ssc = _hostPodDao.createSearchCriteria();
              ssc.addOr("name", SearchCriteria.Op.LIKE, "%" + keyword + "%");
@@@ -935,21 -1443,25 +1443,25 @@@
          }
  
          if (id != null) {
-             sc.addAnd("id", SearchCriteria.Op.EQ, id);
+             sc.setParameters("id", id);
          }
 -        
 +
          if (podName != null) {
-             sc.addAnd("name", SearchCriteria.Op.LIKE, "%" + podName + "%");
+             sc.setParameters("name", "%" + podName + "%");
          }
 -        
 +
          if (zoneId != null) {
-             sc.addAnd("dataCenterId", SearchCriteria.Op.EQ, zoneId);
+             sc.setParameters("dataCenterId", zoneId);
          }
 -        
 +
          if (allocationState != null) {
-             sc.addAnd("allocationState", SearchCriteria.Op.EQ, allocationState);
+             sc.setParameters("allocationState", allocationState);
 -        }        
++        }
+     
+         if(zoneType != null) {
 -            sc.setJoinParameters("zoneSb", "zoneNetworkType", zoneType);          
++            sc.setJoinParameters("zoneSb", "zoneNetworkType", zoneType);
          }
 -        
 +
          Pair<List<HostPodVO>, Integer> result = _hostPodDao.searchAndCount(sc, searchFilter);
          return new Pair<List<? extends Pod>, Integer>(result.first(), result.second());
      }
@@@ -2486,6 -3065,12 +3065,12 @@@
              sb.join("volumeSearch", volumeSearch, sb.entity().getId(), volumeSearch.entity().getInstanceId(), JoinBuilder.JoinType.INNER);
          }
  
+         if(zoneType != null) {
+             SearchBuilder<DataCenterVO> zoneSb = _dcDao.createSearchBuilder();
 -            zoneSb.and("zoneNetworkType", zoneSb.entity().getNetworkType(), SearchCriteria.Op.EQ);    
++            zoneSb.and("zoneNetworkType", zoneSb.entity().getNetworkType(), SearchCriteria.Op.EQ);
+             sb.join("zoneSb", zoneSb, sb.entity().getDataCenterId(), zoneSb.entity().getId(), JoinBuilder.JoinType.INNER);
 -        }        
++        }
+         
          SearchCriteria<VMInstanceVO> sc = sb.create();
  
          if (keyword != null) {
@@@ -2526,6 -3111,10 +3111,10 @@@
              sc.setJoinParameters("volumeSearch", "poolId", storageId);
          }
  
+         if(zoneType != null) {
 -            sc.setJoinParameters("zoneSb", "zoneNetworkType", zoneType);          
++            sc.setJoinParameters("zoneSb", "zoneNetworkType", zoneType);
+         }
+         
          Pair<List<VMInstanceVO>, Integer> result = _vmInstanceDao.searchAndCount(sc, searchFilter);
          return new Pair<List<? extends VirtualMachine>, Integer>(result.first(), result.second());
      }
@@@ -2821,8 -3410,8 +3410,8 @@@
          }
  
          long accountId = volume.getAccountId();
--        StoragePool srcPool = (StoragePool)this.dataStoreMgr.getPrimaryDataStore(volume.getPoolId());
--        HostVO sserver = this.templateMgr.getSecondaryStorageHost(zoneId);
++        StoragePool srcPool = (StoragePool)dataStoreMgr.getPrimaryDataStore(volume.getPoolId());
++        HostVO sserver = templateMgr.getSecondaryStorageHost(zoneId);
          String secondaryStorageURL = sserver.getStorageUrl();
  
          List<UploadVO> extractURLList = _uploadDao.listByTypeUploadStatus(volumeId, Upload.Type.VOLUME, UploadVO.Status.DOWNLOAD_URL_CREATED);
@@@ -3034,16 -3636,67 +3636,67 @@@
  
      @Override
      public String getHashKey() {
-         // although we may have race conditioning here, database transaction
-         // serialization should
+         // although we may have race conditioning here, database transaction serialization should
          // give us the same key
          if (_hashKey == null) {
-             _hashKey = _configDao.getValueAndInitIfNotExist(Config.HashKey.key(), Config.HashKey.getCategory(), UUID.randomUUID().toString());
 -            _hashKey = _configDao.getValueAndInitIfNotExist(Config.HashKey.key(), Config.HashKey.getCategory(), 
++            _hashKey = _configDao.getValueAndInitIfNotExist(Config.HashKey.key(), Config.HashKey.getCategory(),
+             	getBase64EncodedRandomKey(128));
          }
          return _hashKey;
      }
  
      @Override
+     public String getEncryptionKey() {
+         if (_encryptionKey == null) {
 -            _encryptionKey = _configDao.getValueAndInitIfNotExist(Config.EncryptionKey.key(), 
 -            	Config.EncryptionKey.getCategory(), 
++            _encryptionKey = _configDao.getValueAndInitIfNotExist(Config.EncryptionKey.key(),
++            	Config.EncryptionKey.getCategory(),
+             	getBase64EncodedRandomKey(128));
+         }
+         return _encryptionKey;
+     }
+     
+     @Override
+     public String getEncryptionIV() {
+         if (_encryptionIV == null) {
 -            _encryptionIV = _configDao.getValueAndInitIfNotExist(Config.EncryptionIV.key(), 
 -            	Config.EncryptionIV.getCategory(), 
++            _encryptionIV = _configDao.getValueAndInitIfNotExist(Config.EncryptionIV.key(),
++            	Config.EncryptionIV.getCategory(),
+             	getBase64EncodedRandomKey(128));
+         }
+         return _encryptionIV;
+     }
+     
+     @Override
+     @DB
+     public void resetEncryptionKeyIV() {
+     	
+     	SearchBuilder<ConfigurationVO> sb = _configDao.createSearchBuilder();
+     	sb.and("name1", sb.entity().getName(), SearchCriteria.Op.EQ);
+     	sb.or("name2", sb.entity().getName(), SearchCriteria.Op.EQ);
+     	sb.done();
+     	
+     	SearchCriteria<ConfigurationVO> sc = sb.create();
+     	sc.setParameters("name1", Config.EncryptionKey.key());
+     	sc.setParameters("name2", Config.EncryptionIV.key());
+     	
+     	_configDao.expunge(sc);
+     	_encryptionKey = null;
+     	_encryptionIV = null;
+     }
+     
+     private static String getBase64EncodedRandomKey(int nBits) {
+ 		SecureRandom random;
+ 		try {
+ 			random = SecureRandom.getInstance("SHA1PRNG");
+ 	        byte[] keyBytes = new byte[nBits/8];
+ 	        random.nextBytes(keyBytes);
+ 	        return Base64.encodeBase64URLSafeString(keyBytes);
+ 		} catch (NoSuchAlgorithmException e) {
+ 			s_logger.error("Unhandled exception: ", e);
+ 		}
+ 		return null;
+     }
+ 
+     @Override
      public SSHKeyPair createSSHKeyPair(CreateSSHKeyPairCmd cmd) {
          Account caller = UserContext.current().getCaller();
          String accountName = cmd.getAccountName();

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/d4039743/server/src/com/cloud/storage/VolumeManagerImpl.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/d4039743/server/src/com/cloud/storage/secondary/SecondaryStorageManagerImpl.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/d4039743/server/src/com/cloud/vm/UserVmManagerImpl.java
----------------------------------------------------------------------
diff --cc server/src/com/cloud/vm/UserVmManagerImpl.java
index 1b00997,f7f5fc7..245e804
--- a/server/src/com/cloud/vm/UserVmManagerImpl.java
+++ b/server/src/com/cloud/vm/UserVmManagerImpl.java
@@@ -1052,8 -1082,8 +1082,8 @@@ public class UserVmManagerImpl extends 
          }
  
          // Dynamically upgrade the running vms
-         if(vmInstance.getState().equals(State.Running)){
 -        boolean success = false;
 +            boolean success = false;
+         if(vmInstance.getState().equals(State.Running)){
              int retry = _scaleRetry;
              while (retry-- != 0) { // It's != so that it can match -1.
                  try{
@@@ -2553,15 -2627,29 +2627,29 @@@
                  throw new InvalidParameterValueException(
                          "User data is not base64 encoded");
              }
-             if (userData.length() >= 2 * MAX_USER_DATA_LENGTH_BYTES) {
+             // If GET, use 4K. If POST, support upto 32K.
+             if (httpmethod.equals(HTTPMethod.GET)) {
+                 if (userData.length() >= MAX_HTTP_GET_LENGTH) {
+                     throw new InvalidParameterValueException(
+                             "User data is too long for an http GET request");
+                 }
+                 decodedUserData = Base64.decodeBase64(userData.getBytes());
+                 if (decodedUserData.length > MAX_HTTP_GET_LENGTH) {
+                     throw new InvalidParameterValueException(
+                         "User data is too long for GET request");
+                 }
+             } else if (httpmethod.equals(HTTPMethod.POST)) {
+                 if (userData.length() >= MAX_HTTP_POST_LENGTH) {
 -                    throw new InvalidParameterValueException(
 +                throw new InvalidParameterValueException(
-                         "User data is too long");
+                             "User data is too long for an http POST request");
 -                }
 -                decodedUserData = Base64.decodeBase64(userData.getBytes());
 +            }
 +            decodedUserData = Base64.decodeBase64(userData.getBytes());
-             if (decodedUserData.length > MAX_USER_DATA_LENGTH_BYTES) {
+                 if (decodedUserData.length > MAX_HTTP_POST_LENGTH) {
 -                    throw new InvalidParameterValueException(
 +                throw new InvalidParameterValueException(
-                         "User data is too long");
+                         "User data is too long for POST request");
 -                }
++            }
              }
+ 
              if (decodedUserData.length < 1) {
                  throw new InvalidParameterValueException(
                          "User data is too short");

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/d4039743/server/src/com/cloud/vm/VirtualMachineManager.java
----------------------------------------------------------------------


[39/50] [abbrv] git commit: updated refs/heads/vmsync to d403974

Posted by ah...@apache.org.
VPC: When Netscaler is LB provider for the VPC, the VpcVirtualRouter can't provide LB services


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

Branch: refs/heads/vmsync
Commit: f12ac95a56983267fd66c215461fa7e17a43525f
Parents: 80dd9f2
Author: Alena Prokharchyk <al...@citrix.com>
Authored: Fri May 10 11:03:34 2013 -0700
Committer: Alena Prokharchyk <al...@citrix.com>
Committed: Fri May 10 11:18:30 2013 -0700

----------------------------------------------------------------------
 .../src/com/cloud/network/vpc/VpcManagerImpl.java  |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f12ac95a/server/src/com/cloud/network/vpc/VpcManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/vpc/VpcManagerImpl.java b/server/src/com/cloud/network/vpc/VpcManagerImpl.java
index 09776ae..e6d71fa 100644
--- a/server/src/com/cloud/network/vpc/VpcManagerImpl.java
+++ b/server/src/com/cloud/network/vpc/VpcManagerImpl.java
@@ -228,7 +228,7 @@ public class VpcManagerImpl extends ManagerBase implements VpcManager, VpcProvis
                 if (svc == Service.Lb) {
                     Set<Provider> lbProviders = new HashSet<Provider>();
                     lbProviders.add(Provider.Netscaler);
-                    lbProviders.add(Provider.VPCVirtualRouter);
+                    lbProviders.add(Provider.InternalLbVm);
                     svcProviderMap.put(svc, lbProviders);
                 } else {
                     svcProviderMap.put(svc, defaultProviders);


[10/50] [abbrv] git commit: updated refs/heads/vmsync to d403974

Posted by ah...@apache.org.
CLOUDSTACK-2413 - Display the Name of compute offering in dialog box Change Service Offering (was Description field before)


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

Branch: refs/heads/vmsync
Commit: 2e1877af33a49d4d18d3e024abca16b3d72dbf4e
Parents: 600f140
Author: Milamber <mi...@apache.org>
Authored: Thu May 9 10:46:05 2013 +0100
Committer: Milamber <mi...@apache.org>
Committed: Thu May 9 10:50:04 2013 +0100

----------------------------------------------------------------------
 ui/scripts/instances.js |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2e1877af/ui/scripts/instances.js
----------------------------------------------------------------------
diff --git a/ui/scripts/instances.js b/ui/scripts/instances.js
index e5d7d14..c76d843 100644
--- a/ui/scripts/instances.js
+++ b/ui/scripts/instances.js
@@ -934,7 +934,7 @@
                         var serviceofferings = json.listserviceofferingsresponse.serviceoffering;
                         var items = [];
                         $(serviceofferings).each(function() {
-                          items.push({id: this.id, description: this.displaytext});
+                          items.push({id: this.id, description: this.name});
                         });
                         args.response.success({data: items});
                       }


[43/50] [abbrv] git commit: updated refs/heads/vmsync to d403974

Posted by ah...@apache.org.
CLOUDSTACK-2324 Since wheezy (temporarily) does not have haproxy, install from squeeze. We cannot install from sid since that version depends on libc6(>=2.15) while wheezy has libc6 at 2.13-38


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

Branch: refs/heads/vmsync
Commit: 074901365fa46bc10953051686a975026758618c
Parents: 7ca4883
Author: Chiradeep Vittal <ch...@apache.org>
Authored: Fri May 10 17:11:12 2013 -0700
Committer: Chiradeep Vittal <ch...@apache.org>
Committed: Fri May 10 17:11:12 2013 -0700

----------------------------------------------------------------------
 .../definitions/systemvmtemplate/postinstall.sh    |    8 ++++++--
 .../definitions/systemvmtemplate64/postinstall.sh  |    8 ++++++--
 2 files changed, 12 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/07490136/tools/appliance/definitions/systemvmtemplate/postinstall.sh
----------------------------------------------------------------------
diff --git a/tools/appliance/definitions/systemvmtemplate/postinstall.sh b/tools/appliance/definitions/systemvmtemplate/postinstall.sh
index 38363d9..f532f88 100644
--- a/tools/appliance/definitions/systemvmtemplate/postinstall.sh
+++ b/tools/appliance/definitions/systemvmtemplate/postinstall.sh
@@ -37,8 +37,7 @@ install_packages() {
   apt-get --no-install-recommends -q -y --force-yes install sysstat
   # apache
   apt-get --no-install-recommends -q -y --force-yes install apache2 ssl-cert
-  # haproxy
-  apt-get --no-install-recommends -q -y --force-yes install haproxy
+
   # dnsmasq
   apt-get --no-install-recommends -q -y --force-yes install dnsmasq dnsmasq-utils
   # nfs client
@@ -78,6 +77,11 @@ install_packages() {
   # cd $PREV
   # rm -fr /opt/vmware-tools-distrib
   # apt-get -q -y --force-yes purge build-essential
+
+  # haproxy. Wheezy doesn't have haproxy, install from backports
+  #apt-get --no-install-recommends -q -y --force-yes install haproxy
+  wget http://ftp.us.debian.org/debian/pool/main/h/haproxy/haproxy_1.4.8-1_i386.deb
+  dpkg -i haproxy_1.4.8-1_i386.deb
 }
 
 setup_accounts() {

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/07490136/tools/appliance/definitions/systemvmtemplate64/postinstall.sh
----------------------------------------------------------------------
diff --git a/tools/appliance/definitions/systemvmtemplate64/postinstall.sh b/tools/appliance/definitions/systemvmtemplate64/postinstall.sh
index 38363d9..3ccf3ce 100644
--- a/tools/appliance/definitions/systemvmtemplate64/postinstall.sh
+++ b/tools/appliance/definitions/systemvmtemplate64/postinstall.sh
@@ -37,8 +37,7 @@ install_packages() {
   apt-get --no-install-recommends -q -y --force-yes install sysstat
   # apache
   apt-get --no-install-recommends -q -y --force-yes install apache2 ssl-cert
-  # haproxy
-  apt-get --no-install-recommends -q -y --force-yes install haproxy
+
   # dnsmasq
   apt-get --no-install-recommends -q -y --force-yes install dnsmasq dnsmasq-utils
   # nfs client
@@ -78,6 +77,11 @@ install_packages() {
   # cd $PREV
   # rm -fr /opt/vmware-tools-distrib
   # apt-get -q -y --force-yes purge build-essential
+
+  # haproxy. Wheezy doesn't have haproxy temporarily, install from backports
+  #apt-get --no-install-recommends -q -y --force-yes install haproxy
+  wget http://ftp.us.debian.org/debian/pool/main/h/haproxy/haproxy_1.4.8-1_amd64.deb
+  dpkg -i haproxy_1.4.8-1_amd64.deb
 }
 
 setup_accounts() {


[34/50] [abbrv] git commit: updated refs/heads/vmsync to d403974

Posted by ah...@apache.org.
CLOUDSTACK-2417: NPE while creating Egress rules with Networking using Cisco ASA firewall provider

An input parameter was incorrectly interpreted during egress rule creation and so resulted in NPE. Created a new vnmc xml for handling creation of egress rule with protocol as 'All'


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

Branch: refs/heads/vmsync
Commit: 530b0beb3c8b172fbfaf89584cd24785b7513998
Parents: b4aff61
Author: Koushik Das <ko...@citrix.com>
Authored: Fri May 10 17:54:59 2013 +0530
Committer: Koushik Das <ko...@citrix.com>
Committed: Fri May 10 17:54:59 2013 +0530

----------------------------------------------------------------------
 .../network/cisco/create-egress-acl-rule.xml       |   53 ++-------
 .../create-generic-egress-acl-no-protocol-rule.xml |   94 +++++++++++++++
 .../cisco/create-generic-egress-acl-rule.xml       |    1 -
 .../network/cisco/create-ingress-acl-rule.xml      |   43 +------
 .../cloud/network/cisco/CiscoVnmcConnection.java   |   10 +-
 .../network/cisco/CiscoVnmcConnectionImpl.java     |   30 +++---
 .../cloud/network/element/CiscoVnmcElement.java    |    9 +-
 .../cloud/network/resource/CiscoVnmcResource.java  |   12 +-
 .../network/resource/CiscoVnmcResourceTest.java    |    4 +-
 9 files changed, 144 insertions(+), 112 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/530b0beb/plugins/network-elements/cisco-vnmc/scripts/network/cisco/create-egress-acl-rule.xml
----------------------------------------------------------------------
diff --git a/plugins/network-elements/cisco-vnmc/scripts/network/cisco/create-egress-acl-rule.xml b/plugins/network-elements/cisco-vnmc/scripts/network/cisco/create-egress-acl-rule.xml
index 930272e..05c066d 100755
--- a/plugins/network-elements/cisco-vnmc/scripts/network/cisco/create-egress-acl-rule.xml
+++ b/plugins/network-elements/cisco-vnmc/scripts/network/cisco/create-egress-acl-rule.xml
@@ -118,70 +118,38 @@ under the License.
       <policyNetworkExpression
         dn="%aclruledn%/rule-cond-4/nw-expr2"
         id="2"
-        opr="eq"
+        opr="range"
         status="created"/>
     </pair>
     <pair key="%aclruledn%/rule-cond-4/nw-expr2/nw-attr-qual">
       <policyNwAttrQualifier
-        attrEp="source"
+        attrEp="destination"
         dn="%aclruledn%/rule-cond-4/nw-expr2/nw-attr-qual"
         status="created"/>
     </pair>
-    <pair key="%aclruledn%/rule-cond-4/nw-expr2/nw-ip-2">
-      <policyIPAddress
-        dataType="string"
-        descr=""
-        dn="%aclruledn%/rule-cond-4/nw-expr2/nw-ip-2"
-        id="2"
-        name=""
-        placement="none"
-        status="created"
-        value="%sourceip%"/>
-    </pair>
-
-    <pair key="%aclruledn%/rule-cond-5">
-      <policyRuleCondition
-        dn="%aclruledn%/rule-cond-5"
-        id="5"
-        order="unspecified"
-        status="created"/>
-    </pair>
-    <pair key="%aclruledn%/rule-cond-5/nw-expr2">
-      <policyNetworkExpression
-        dn="%aclruledn%/rule-cond-5/nw-expr2"
-        id="2"
-        opr="range"
-        status="created"/>
-    </pair>
-    <pair key="%aclruledn%/rule-cond-5/nw-expr2/nw-attr-qual">
-      <policyNwAttrQualifier
-        attrEp="source"
-        dn="%aclruledn%/rule-cond-5/nw-expr2/nw-attr-qual"
-        status="created"/>
-    </pair>
-    <pair key="%aclruledn%/rule-cond-5/nw-expr2/nw-port-2">
+    <pair key="%aclruledn%/rule-cond-4/nw-expr2/nw-port-2">
       <policyNetworkPort
         appType="Other"
         dataType="string"
         descr=""
-        dn="%aclruledn%/rule-cond-5/nw-expr2/nw-port-2"
+        dn="%aclruledn%/rule-cond-4/nw-expr2/nw-port-2"
         id="2"
         name=""
         placement="begin"
         status="created"
-        value="%sourcestartport%"/>
+        value="%deststartport%"/>
     </pair>
-    <pair key="%aclruledn%/rule-cond-5/nw-expr2/nw-port-3">
+    <pair key="%aclruledn%/rule-cond-4/nw-expr2/nw-port-3">
       <policyNetworkPort
         appType="Other"
         dataType="string"
         descr=""
-        dn="%aclruledn%/rule-cond-5/nw-expr2/nw-port-3"
+        dn="%aclruledn%/rule-cond-4/nw-expr2/nw-port-3"
         id="3"
         name=""
         placement="end"
         status="created"
-        value="%sourceendport%"/>
+        value="%destendport%"/>
     </pair>
 
   </inConfigs>
@@ -195,7 +163,6 @@ under the License.
     protocolvalue = "TCP" or "UDP"
     deststartip="destination start ip"
     destendip="destination end ip"
-    sourcestartport="start port at source"
-    sourceendport="end port at source"
-    sourceip="source ip"
+    deststartport="start port at destination"
+    destendport="end port at destination"
 --!>

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/530b0beb/plugins/network-elements/cisco-vnmc/scripts/network/cisco/create-generic-egress-acl-no-protocol-rule.xml
----------------------------------------------------------------------
diff --git a/plugins/network-elements/cisco-vnmc/scripts/network/cisco/create-generic-egress-acl-no-protocol-rule.xml b/plugins/network-elements/cisco-vnmc/scripts/network/cisco/create-generic-egress-acl-no-protocol-rule.xml
new file mode 100755
index 0000000..17cfa54
--- /dev/null
+++ b/plugins/network-elements/cisco-vnmc/scripts/network/cisco/create-generic-egress-acl-no-protocol-rule.xml
@@ -0,0 +1,94 @@
+<!--
+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.
+-->
+<configConfMos
+  cookie="%cookie%"
+  inHierarchical="false">
+  <inConfigs>
+
+    <pair key="%aclruledn%">
+      <policyRule
+        descr="%descr%"
+        dn="%aclruledn%"
+        name="%aclrulename%"
+        order="%order%"
+        status="created"/>
+    </pair>
+
+    <pair key="%aclruledn%/rule-action-0">
+      <fwpolicyAction
+        actionType="%actiontype%"
+        dn="%aclruledn%/rule-action-0"
+        id="0"
+        status="created"/>
+    </pair>
+
+    <pair key="%aclruledn%/rule-cond-2">
+      <policyRuleCondition
+        dn="%aclruledn%/rule-cond-2"
+        id="2"
+        order="unspecified"
+        status="created"/>
+    </pair>
+    <pair key="%aclruledn%/rule-cond-2/nw-expr2">
+      <policyNetworkExpression
+        dn="%aclruledn%/rule-cond-2/nw-expr2"
+        id="2"
+        opr="range"
+        status="created"/>
+    </pair>
+    <pair key="%aclruledn%/rule-cond-2/nw-expr2/nw-attr-qual">
+      <policyNwAttrQualifier
+        attrEp="destination"
+        dn="%aclruledn%/rule-cond-2/nw-expr2/nw-attr-qual"
+        status="created"/>
+    </pair>
+    <pair key="%aclruledn%/rule-cond-2/nw-expr2/nw-ip-2">
+      <policyIPAddress
+        dataType="string"
+        descr=""
+        dn="%aclruledn%/rule-cond-2/nw-expr2/nw-ip-2"
+        id="2"
+        name=""
+        placement="begin"
+        status="created"
+        value="%deststartip%"/>
+    </pair>
+    <pair key="%aclruledn%/rule-cond-2/nw-expr2/nw-ip-3">
+      <policyIPAddress
+        dataType="string"
+        descr=""
+        dn="%aclruledn%/rule-cond-2/nw-expr2/nw-ip-3"
+        id="3"
+        name=""
+        placement="end"
+        status="created"
+        value="%destendip%"/>
+    </pair>
+
+  </inConfigs>
+</configConfMos>
+
+<!--
+    aclruledn="org-root/org-vlan-123/org-VDC-vlan-123/pol-test_policy/rule-dummy"
+    aclrulename="dummy"
+    descr=value
+    actiontype="drop" or "permit"
+    deststartip="destination start ip"
+    destendip="destination end ip"
+--!>

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/530b0beb/plugins/network-elements/cisco-vnmc/scripts/network/cisco/create-generic-egress-acl-rule.xml
----------------------------------------------------------------------
diff --git a/plugins/network-elements/cisco-vnmc/scripts/network/cisco/create-generic-egress-acl-rule.xml b/plugins/network-elements/cisco-vnmc/scripts/network/cisco/create-generic-egress-acl-rule.xml
index 92c2504..436e3ea 100755
--- a/plugins/network-elements/cisco-vnmc/scripts/network/cisco/create-generic-egress-acl-rule.xml
+++ b/plugins/network-elements/cisco-vnmc/scripts/network/cisco/create-generic-egress-acl-rule.xml
@@ -118,5 +118,4 @@ under the License.
     protocolvalue = "TCP" or "UDP" or "ICMP"
     deststartip="destination start ip"
     destendip="destination end ip"
-    sourceip="source ip"
 --!>

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/530b0beb/plugins/network-elements/cisco-vnmc/scripts/network/cisco/create-ingress-acl-rule.xml
----------------------------------------------------------------------
diff --git a/plugins/network-elements/cisco-vnmc/scripts/network/cisco/create-ingress-acl-rule.xml b/plugins/network-elements/cisco-vnmc/scripts/network/cisco/create-ingress-acl-rule.xml
index 1af30b4..f283ffe 100755
--- a/plugins/network-elements/cisco-vnmc/scripts/network/cisco/create-ingress-acl-rule.xml
+++ b/plugins/network-elements/cisco-vnmc/scripts/network/cisco/create-ingress-acl-rule.xml
@@ -118,7 +118,7 @@ under the License.
       <policyNetworkExpression
         dn="%aclruledn%/rule-cond-4/nw-expr2"
         id="2"
-        opr="eq"
+        opr="range"
         status="created"/>
     </pair>
     <pair key="%aclruledn%/rule-cond-4/nw-expr2/nw-attr-qual">
@@ -127,56 +127,24 @@ under the License.
         dn="%aclruledn%/rule-cond-4/nw-expr2/nw-attr-qual"
         status="created"/>
     </pair>
-    <pair key="%aclruledn%/rule-cond-4/nw-expr2/nw-ip-2">
-      <policyIPAddress
-        dataType="string"
-        descr=""
-        dn="%aclruledn%/rule-cond-4/nw-expr2/nw-ip-2"
-        id="2"
-        name=""
-        placement="none"
-        status="created"
-        value="%destip%"/>
-    </pair>
-
-    <pair key="%aclruledn%/rule-cond-5">
-      <policyRuleCondition
-        dn="%aclruledn%/rule-cond-5"
-        id="5"
-        order="unspecified"
-        status="created"/>
-    </pair>
-    <pair key="%aclruledn%/rule-cond-5/nw-expr2">
-      <policyNetworkExpression
-        dn="%aclruledn%/rule-cond-5/nw-expr2"
-        id="2"
-        opr="range"
-        status="created"/>
-    </pair>
-    <pair key="%aclruledn%/rule-cond-5/nw-expr2/nw-attr-qual">
-      <policyNwAttrQualifier
-        attrEp="destination"
-        dn="%aclruledn%/rule-cond-5/nw-expr2/nw-attr-qual"
-        status="created"/>
-    </pair>
-    <pair key="%aclruledn%/rule-cond-5/nw-expr2/nw-port-2">
+    <pair key="%aclruledn%/rule-cond-4/nw-expr2/nw-port-2">
       <policyNetworkPort
         appType="Other"
         dataType="string"
         descr=""
-        dn="%aclruledn%/rule-cond-5/nw-expr2/nw-port-2"
+        dn="%aclruledn%/rule-cond-4/nw-expr2/nw-port-2"
         id="2"
         name=""
         placement="begin"
         status="created"
         value="%deststartport%"/>
     </pair>
-    <pair key="%aclruledn%/rule-cond-5/nw-expr2/nw-port-3">
+    <pair key="%aclruledn%/rule-cond-4/nw-expr2/nw-port-3">
       <policyNetworkPort
         appType="Other"
         dataType="string"
         descr=""
-        dn="%aclruledn%/rule-cond-5/nw-expr2/nw-port-3"
+        dn="%aclruledn%/rule-cond-4/nw-expr2/nw-port-3"
         id="3"
         name=""
         placement="end"
@@ -197,5 +165,4 @@ under the License.
     sourceendip="source end ip"
     deststartport="start port at destination"
     destendport="end port at destination"
-    destip="destination ip"
 --!>

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/530b0beb/plugins/network-elements/cisco-vnmc/src/com/cloud/network/cisco/CiscoVnmcConnection.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/cisco-vnmc/src/com/cloud/network/cisco/CiscoVnmcConnection.java b/plugins/network-elements/cisco-vnmc/src/com/cloud/network/cisco/CiscoVnmcConnection.java
index f137148..fed6724 100644
--- a/plugins/network-elements/cisco-vnmc/src/com/cloud/network/cisco/CiscoVnmcConnection.java
+++ b/plugins/network-elements/cisco-vnmc/src/com/cloud/network/cisco/CiscoVnmcConnection.java
@@ -140,23 +140,23 @@ public interface CiscoVnmcConnection {
     public boolean createTenantVDCIngressAclRule(String tenantName,
             String identifier, String policyIdentifier,
             String protocol, String sourceStartIp, String sourceEndIp,
-            String destStartPort, String destEndPort, String destIp)
+            String destStartPort, String destEndPort)
             throws ExecutionException;
 
     public boolean createTenantVDCIngressAclRule(String tenantName,
             String identifier, String policyIdentifier,
-            String protocol, String sourceStartIp, String sourceEndIp, String destIp)
+            String protocol, String sourceStartIp, String sourceEndIp)
             throws ExecutionException;
 
     public boolean createTenantVDCEgressAclRule(String tenantName,
             String identifier, String policyIdentifier,
-            String protocol, String sourceStartPort, String sourceEndPort, String sourceIp,
-            String destStartIp, String destEndIp)
+            String protocol, String destStartIp, String destEndIp,
+            String destStartPort, String destEndPort)
             throws ExecutionException;
 
     public boolean createTenantVDCEgressAclRule(String tenantName,
             String identifier, String policyIdentifier,
-            String protocol, String sourceIp, String destStartIp, String destEndIp)
+            String protocol, String destStartIp, String destEndIp)
             throws ExecutionException;
 
     public boolean deleteTenantVDCAclRule(String tenantName,

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/530b0beb/plugins/network-elements/cisco-vnmc/src/com/cloud/network/cisco/CiscoVnmcConnectionImpl.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/cisco-vnmc/src/com/cloud/network/cisco/CiscoVnmcConnectionImpl.java b/plugins/network-elements/cisco-vnmc/src/com/cloud/network/cisco/CiscoVnmcConnectionImpl.java
index 714eb82..c7380ab 100644
--- a/plugins/network-elements/cisco-vnmc/src/com/cloud/network/cisco/CiscoVnmcConnectionImpl.java
+++ b/plugins/network-elements/cisco-vnmc/src/com/cloud/network/cisco/CiscoVnmcConnectionImpl.java
@@ -95,6 +95,7 @@ public class CiscoVnmcConnectionImpl implements CiscoVnmcConnection {
         CREATE_EGRESS_ACL_RULE("create-egress-acl-rule.xml", "policy-mgr"),
         CREATE_GENERIC_INGRESS_ACL_RULE("create-generic-ingress-acl-rule.xml", "policy-mgr"),
         CREATE_GENERIC_EGRESS_ACL_RULE("create-generic-egress-acl-rule.xml", "policy-mgr"),
+        CREATE_GENERIC_EGRESS_ACL_NO_PROTOCOL_RULE("create-generic-egress-acl-no-protocol-rule.xml", "policy-mgr"),
 
         DELETE_RULE("delete-rule.xml", "policy-mgr"),
 
@@ -660,8 +661,7 @@ public class CiscoVnmcConnectionImpl implements CiscoVnmcConnection {
         xml = replaceXmlValue(xml, "descr", "Edge Security Profile for Tenant VDC " + tenantName);
         xml = replaceXmlValue(xml, "name", getNameForEdgeDeviceSecurityProfile(tenantName));
         xml = replaceXmlValue(xml, "espdn", getDnForTenantVDCEdgeSecurityProfile(tenantName));
-        //xml = replaceXmlValue(xml, "egresspolicysetname", getNameForAclPolicySet(tenantName, false));
-        xml = replaceXmlValue(xml, "egresspolicysetname", "default-egress");
+        xml = replaceXmlValue(xml, "egresspolicysetname", getNameForAclPolicySet(tenantName, false));
         xml = replaceXmlValue(xml, "ingresspolicysetname", getNameForAclPolicySet(tenantName, true));
         xml = replaceXmlValue(xml, "natpolicysetname", getNameForNatPolicySet(tenantName));
 
@@ -673,7 +673,7 @@ public class CiscoVnmcConnectionImpl implements CiscoVnmcConnection {
     public boolean createTenantVDCIngressAclRule(String tenantName,
             String identifier, String policyIdentifier,
             String protocol, String sourceStartIp, String sourceEndIp,
-            String destStartPort, String destEndPort, String destIp) throws ExecutionException {
+            String destStartPort, String destEndPort) throws ExecutionException {
         String xml = VnmcXml.CREATE_INGRESS_ACL_RULE.getXml();
         String service = VnmcXml.CREATE_INGRESS_ACL_RULE.getService();
 
@@ -687,7 +687,6 @@ public class CiscoVnmcConnectionImpl implements CiscoVnmcConnection {
         xml = replaceXmlValue(xml, "sourceendip", sourceEndIp);
         xml = replaceXmlValue(xml, "deststartport", destStartPort);
         xml = replaceXmlValue(xml, "destendport", destEndPort);
-        xml = replaceXmlValue(xml, "destip", destIp);
 
         List<String> rules = listChildren(getDnForAclPolicy(tenantName, policyIdentifier));
         int order = 100;
@@ -703,8 +702,7 @@ public class CiscoVnmcConnectionImpl implements CiscoVnmcConnection {
     @Override
     public boolean createTenantVDCIngressAclRule(String tenantName,
             String identifier, String policyIdentifier,
-            String protocol, String sourceStartIp, String sourceEndIp,
-            String destIp) throws ExecutionException {
+            String protocol, String sourceStartIp, String sourceEndIp) throws ExecutionException {
         String xml = VnmcXml.CREATE_GENERIC_INGRESS_ACL_RULE.getXml();
         String service = VnmcXml.CREATE_GENERIC_INGRESS_ACL_RULE.getService();
 
@@ -731,8 +729,8 @@ public class CiscoVnmcConnectionImpl implements CiscoVnmcConnection {
     @Override
     public boolean createTenantVDCEgressAclRule(String tenantName,
             String identifier, String policyIdentifier,
-            String protocol, String sourceStartPort, String sourceEndPort, String sourceIp,
-            String destStartIp, String destEndIp) throws ExecutionException {
+            String protocol, String destStartIp, String destEndIp,
+            String destStartPort, String destEndPort) throws ExecutionException {
         String xml = VnmcXml.CREATE_EGRESS_ACL_RULE.getXml();
         String service = VnmcXml.CREATE_EGRESS_ACL_RULE.getService();
 
@@ -744,9 +742,8 @@ public class CiscoVnmcConnectionImpl implements CiscoVnmcConnection {
         xml = replaceXmlValue(xml, "protocolvalue", protocol);
         xml = replaceXmlValue(xml, "deststartip", destStartIp);
         xml = replaceXmlValue(xml, "destendip", destEndIp);
-        xml = replaceXmlValue(xml, "sourcestartport", sourceStartPort);
-        xml = replaceXmlValue(xml, "sourceendport", sourceEndPort);
-        xml = replaceXmlValue(xml, "sourceip", sourceIp);
+        xml = replaceXmlValue(xml, "deststartport", destStartPort);
+        xml = replaceXmlValue(xml, "destendport", destEndPort);
 
         List<String> rules = listChildren(getDnForAclPolicy(tenantName, policyIdentifier));
         int order = 100;
@@ -762,17 +759,20 @@ public class CiscoVnmcConnectionImpl implements CiscoVnmcConnection {
     @Override
     public boolean createTenantVDCEgressAclRule(String tenantName,
             String identifier, String policyIdentifier,
-            String protocol, String sourceIp,
-            String destStartIp, String destEndIp) throws ExecutionException {
+            String protocol, String destStartIp, String destEndIp) throws ExecutionException {
         String xml = VnmcXml.CREATE_GENERIC_EGRESS_ACL_RULE.getXml();
         String service = VnmcXml.CREATE_GENERIC_EGRESS_ACL_RULE.getService();
-
+        if (protocol.equalsIgnoreCase("all")) { // any protocol
+            xml = VnmcXml.CREATE_GENERIC_EGRESS_ACL_NO_PROTOCOL_RULE.getXml();
+            service = VnmcXml.CREATE_GENERIC_EGRESS_ACL_NO_PROTOCOL_RULE.getService();
+        } else { // specific protocol
+            xml = replaceXmlValue(xml, "protocolvalue", protocol);
+        }
         xml = replaceXmlValue(xml, "cookie", _cookie);
         xml = replaceXmlValue(xml, "aclruledn", getDnForAclRule(tenantName, identifier, policyIdentifier));
         xml = replaceXmlValue(xml, "aclrulename", getNameForAclRule(tenantName, identifier));
         xml = replaceXmlValue(xml, "descr", "Egress ACL rule for Tenant VDC " + tenantName);
         xml = replaceXmlValue(xml, "actiontype", "permit");
-        xml = replaceXmlValue(xml, "protocolvalue", protocol);
         xml = replaceXmlValue(xml, "deststartip", destStartIp);
         xml = replaceXmlValue(xml, "destendip", destEndIp);
 

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/530b0beb/plugins/network-elements/cisco-vnmc/src/com/cloud/network/element/CiscoVnmcElement.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/cisco-vnmc/src/com/cloud/network/element/CiscoVnmcElement.java b/plugins/network-elements/cisco-vnmc/src/com/cloud/network/element/CiscoVnmcElement.java
index 33cc40a..b335edb 100644
--- a/plugins/network-elements/cisco-vnmc/src/com/cloud/network/element/CiscoVnmcElement.java
+++ b/plugins/network-elements/cisco-vnmc/src/com/cloud/network/element/CiscoVnmcElement.java
@@ -105,6 +105,7 @@ import com.cloud.network.dao.PhysicalNetworkServiceProviderDao;
 import com.cloud.network.dao.PhysicalNetworkServiceProviderVO;
 import com.cloud.network.resource.CiscoVnmcResource;
 import com.cloud.network.rules.FirewallRule;
+import com.cloud.network.rules.FirewallRule.TrafficType;
 import com.cloud.network.rules.PortForwardingRule;
 import com.cloud.network.rules.StaticNat;
 import com.cloud.offering.NetworkOffering;
@@ -677,8 +678,12 @@ public class CiscoVnmcElement extends AdapterBase implements SourceNatServicePro
 
         List<FirewallRuleTO> rulesTO = new ArrayList<FirewallRuleTO>();
         for (FirewallRule rule : rules) {
-            IpAddress sourceIp = _networkModel.getIp(rule.getSourceIpAddressId());
-            FirewallRuleTO ruleTO = new FirewallRuleTO(rule, null, sourceIp.getAddress().addr(), rule.getPurpose(), rule.getTrafficType());
+            String address = "0.0.0.0";
+            if (rule.getTrafficType() == TrafficType.Ingress) {
+                IpAddress sourceIp = _networkModel.getIp(rule.getSourceIpAddressId());
+                address = sourceIp.getAddress().addr();
+            }
+            FirewallRuleTO ruleTO = new FirewallRuleTO(rule, null, address, rule.getPurpose(), rule.getTrafficType());
             rulesTO.add(ruleTO);
         }
 

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/530b0beb/plugins/network-elements/cisco-vnmc/src/com/cloud/network/resource/CiscoVnmcResource.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/cisco-vnmc/src/com/cloud/network/resource/CiscoVnmcResource.java b/plugins/network-elements/cisco-vnmc/src/com/cloud/network/resource/CiscoVnmcResource.java
index 9155978..906e0ae 100644
--- a/plugins/network-elements/cisco-vnmc/src/com/cloud/network/resource/CiscoVnmcResource.java
+++ b/plugins/network-elements/cisco-vnmc/src/com/cloud/network/resource/CiscoVnmcResource.java
@@ -368,29 +368,29 @@ public class CiscoVnmcResource implements ServerResource {
                                 if (!_connection.createTenantVDCIngressAclRule(tenant,
                                         Long.toString(rule.getId()), policyIdentifier,
                                         rule.getProtocol().toUpperCase(), externalIpRange[0], externalIpRange[1],
-                                        Integer.toString(rule.getSrcPortRange()[0]), Integer.toString(rule.getSrcPortRange()[1]), publicIp)) {
+                                        Integer.toString(rule.getSrcPortRange()[0]), Integer.toString(rule.getSrcPortRange()[1]))) {
                                     throw new Exception("Failed to create ACL ingress rule in VNMC for guest network with vlan " + vlanId);
                                 }
                             } else {
                                 if (!_connection.createTenantVDCIngressAclRule(tenant,
                                         Long.toString(rule.getId()), policyIdentifier,
-                                        rule.getProtocol().toUpperCase(), externalIpRange[0], externalIpRange[1], publicIp)) {
+                                        rule.getProtocol().toUpperCase(), externalIpRange[0], externalIpRange[1])) {
                                     throw new Exception("Failed to create ACL ingress rule in VNMC for guest network with vlan " + vlanId);
                                 }
                             }
                         } else {
-                            if (!rule.getProtocol().equalsIgnoreCase("icmp")) {
+                            if (rule.getProtocol().equalsIgnoreCase("tcp") || rule.getProtocol().equalsIgnoreCase("udp")) {
                                 if (!_connection.createTenantVDCEgressAclRule(tenant,
                                         Long.toString(rule.getId()), policyIdentifier,
                                         rule.getProtocol().toUpperCase(),
-                                        Integer.toString(rule.getSrcPortRange()[0]), Integer.toString(rule.getSrcPortRange()[1]), publicIp,
-                                        externalIpRange[0], externalIpRange[1])) {
+                                        externalIpRange[0], externalIpRange[1],
+                                        Integer.toString(rule.getSrcPortRange()[0]), Integer.toString(rule.getSrcPortRange()[1]))) {
                                     throw new Exception("Failed to create ACL egress rule in VNMC for guest network with vlan " + vlanId);
                                 }
                             } else {
                                 if (!_connection.createTenantVDCEgressAclRule(tenant,
                                         Long.toString(rule.getId()), policyIdentifier,
-                                        rule.getProtocol().toUpperCase(), publicIp, externalIpRange[0], externalIpRange[1])) {
+                                        rule.getProtocol().toUpperCase(), externalIpRange[0], externalIpRange[1])) {
                                     throw new Exception("Failed to create ACL egress rule in VNMC for guest network with vlan " + vlanId);
                                 }
                             }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/530b0beb/plugins/network-elements/cisco-vnmc/test/com/cloud/network/resource/CiscoVnmcResourceTest.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/cisco-vnmc/test/com/cloud/network/resource/CiscoVnmcResourceTest.java b/plugins/network-elements/cisco-vnmc/test/com/cloud/network/resource/CiscoVnmcResourceTest.java
index e814fdc..acfc5eb 100755
--- a/plugins/network-elements/cisco-vnmc/test/com/cloud/network/resource/CiscoVnmcResourceTest.java
+++ b/plugins/network-elements/cisco-vnmc/test/com/cloud/network/resource/CiscoVnmcResourceTest.java
@@ -171,11 +171,11 @@ public class CiscoVnmcResourceTest {
         when(_connection.createTenantVDCIngressAclRule(
                 anyString(), anyString(), anyString(),
                 anyString(), anyString(), anyString(),
-                anyString(), anyString(), anyString())).thenReturn(true);
+                anyString(), anyString())).thenReturn(true);
         when(_connection.createTenantVDCEgressAclRule(
                 anyString(), anyString(), anyString(),
                 anyString(), anyString(), anyString(),
-                anyString(), anyString(), anyString())).thenReturn(true);
+                anyString(), anyString())).thenReturn(true);
         when(_connection.associateAclPolicySet(anyString())).thenReturn(true);
 
         Answer answer = _resource.executeRequest(cmd);


[13/50] [abbrv] git commit: updated refs/heads/vmsync to d403974

Posted by ah...@apache.org.
CLOUDSTACK-2408: Object name is Null with list VNMC/List ASA API response

Made the object name consistent between list and add api responses


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

Branch: refs/heads/vmsync
Commit: 8f9a42e0af7424517c7853197a781c0c81addad1
Parents: bde9ad3
Author: Koushik Das <ko...@citrix.com>
Authored: Thu May 9 15:58:59 2013 +0530
Committer: Koushik Das <ko...@citrix.com>
Committed: Thu May 9 15:58:59 2013 +0530

----------------------------------------------------------------------
 .../commands/ListCiscoAsa1000vResourcesCmd.java    |    2 +-
 .../api/commands/ListCiscoVnmcResourcesCmd.java    |    2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/8f9a42e0/plugins/network-elements/cisco-vnmc/src/com/cloud/api/commands/ListCiscoAsa1000vResourcesCmd.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/cisco-vnmc/src/com/cloud/api/commands/ListCiscoAsa1000vResourcesCmd.java b/plugins/network-elements/cisco-vnmc/src/com/cloud/api/commands/ListCiscoAsa1000vResourcesCmd.java
index 7a4db69..88ea270 100755
--- a/plugins/network-elements/cisco-vnmc/src/com/cloud/api/commands/ListCiscoAsa1000vResourcesCmd.java
+++ b/plugins/network-elements/cisco-vnmc/src/com/cloud/api/commands/ListCiscoAsa1000vResourcesCmd.java
@@ -89,7 +89,7 @@ public class ListCiscoAsa1000vResourcesCmd extends BaseListCmd {
             if (ciscoAsa1000vDevices != null && !ciscoAsa1000vDevices.isEmpty()) {
                 for (CiscoAsa1000vDevice ciscoAsa1000vDeviceVO : ciscoAsa1000vDevices) {
                     CiscoAsa1000vResourceResponse ciscoAsa1000vResourceResponse = _ciscoAsa1000vService.createCiscoAsa1000vResourceResponse(ciscoAsa1000vDeviceVO);
-                    ciscoAsa1000vResourceResponse.setObjectName("asa1000v");
+                    ciscoAsa1000vResourceResponse.setObjectName("CiscoAsa1000vResource");
                     ciscoAsa1000vResourcesResponse.add(ciscoAsa1000vResourceResponse);
                 }
             }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/8f9a42e0/plugins/network-elements/cisco-vnmc/src/com/cloud/api/commands/ListCiscoVnmcResourcesCmd.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/cisco-vnmc/src/com/cloud/api/commands/ListCiscoVnmcResourcesCmd.java b/plugins/network-elements/cisco-vnmc/src/com/cloud/api/commands/ListCiscoVnmcResourcesCmd.java
index b15c4e1..73128ec 100644
--- a/plugins/network-elements/cisco-vnmc/src/com/cloud/api/commands/ListCiscoVnmcResourcesCmd.java
+++ b/plugins/network-elements/cisco-vnmc/src/com/cloud/api/commands/ListCiscoVnmcResourcesCmd.java
@@ -84,7 +84,7 @@ public class ListCiscoVnmcResourcesCmd extends BaseListCmd {
             if (ciscoVnmcResources != null && !ciscoVnmcResources.isEmpty()) {
                 for (CiscoVnmcController ciscoVnmcResourceVO : ciscoVnmcResources) {
                     CiscoVnmcResourceResponse ciscoVnmcResourceResponse = _ciscoVnmcElementService.createCiscoVnmcResourceResponse(ciscoVnmcResourceVO);
-                    ciscoVnmcResourceResponse.setObjectName("vnmc");
+                    ciscoVnmcResourceResponse.setObjectName("CiscoVnmcResource");
                     ciscoVnmcResourcesResponse.add(ciscoVnmcResourceResponse);
                 }
             }


[26/50] [abbrv] git commit: updated refs/heads/vmsync to d403974

Posted by ah...@apache.org.
CLOUDSTACK-2419 : Localization - Some Japanese are not working


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

Branch: refs/heads/vmsync
Commit: fa9987753c530c8e9560297986ac8848b7526854
Parents: 7fea21e
Author: Sanjay Tripathi <sa...@citrix.com>
Authored: Thu May 9 18:01:40 2013 +0530
Committer: Pranav Saxena <pr...@citrix.com>
Committed: Fri May 10 10:16:56 2013 +0530

----------------------------------------------------------------------
 services/console-proxy/server/js/ajaxkeys.js |   70 +++++++++++++-------
 1 files changed, 45 insertions(+), 25 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/fa998775/services/console-proxy/server/js/ajaxkeys.js
----------------------------------------------------------------------
diff --git a/services/console-proxy/server/js/ajaxkeys.js b/services/console-proxy/server/js/ajaxkeys.js
index 1ed41c5..5f497bb 100644
--- a/services/console-proxy/server/js/ajaxkeys.js
+++ b/services/console-proxy/server/js/ajaxkeys.js
@@ -155,7 +155,7 @@ KEYBOARD_TYPE_JP = "jp";
 KEYBOARD_TYPE_UK = "uk";
 
 //JP keyboard type
-//
+
 var	keyboardTables = [
            {tindex: 0, keyboardType: KEYBOARD_TYPE_COOKED, mappingTable:
                {X11: [ {keycode: 222, entry: X11_KEY_CIRCUMFLEX_ACCENT},
@@ -220,15 +220,31 @@ var	keyboardTables = [
                   {keycode: JS_KEY_SHIFT,				entry : X11_KEY_SHIFT},
                   {keycode: JS_KEY_CTRL,				entry : X11_KEY_CTRL},
                   {keycode: JS_KEY_ALT,					entry : X11_KEY_ALT},
-                  {keycode: JS_KEY_GRAVE_ACCENT,		entry : X11_KEY_GRAVE_ACCENT},
-                  {keycode: JS_KEY_SUBSTRACT,			entry : X11_KEY_SUBSTRACT},
-                  {keycode: JS_KEY_ADD,					entry : X11_KEY_ADD},
-                  {keycode: JS_KEY_OPEN_BRACKET,		entry : X11_KEY_OPEN_BRACKET},
-                  {keycode: JS_KEY_CLOSE_BRACKET,		entry : X11_KEY_CLOSE_BRACKET},
+                  //{keycode: JS_KEY_GRAVE_ACCENT,		entry : X11_KEY_GRAVE_ACCENT},
+                  //[192 / 64 = "' @"]
+                  {keycode: 192,	entry : 0x5b,	browser: "IE"},
+                  {keycode: 64,		entry : 0x5b, 	browser: "Firefox"},
+                  //{keycode: JS_KEY_ADD,					entry : X11_KEY_ADD},
+                  //[187 / 59 = "; +"]
+                  {keycode: 187,	entry : 0x3a,	browser: "IE"},
+                  {keycode: 59,		entry : 0x3b, 	browser: "Firefox"},
+                  //{keycode: JS_KEY_OPEN_BRACKET,		entry : X11_KEY_OPEN_BRACKET},
+                  //[219 = "[{"]
+                  {keycode: 219,	entry : 0x5d,	browser: "IE"},
+                  {keycode: 219,	entry : 0x5d, 	browser: "Firefox"},
+                  //{keycode: JS_KEY_CLOSE_BRACKET,		entry : X11_KEY_CLOSE_BRACKET},
+                  //[221 = "]}"]
+                  {keycode: 221,	entry : 0x5c,	browser: "IE"},
+                  {keycode: 221,	entry : 0x5c,	browser: "Firefox"},
                   {keycode: JS_KEY_BACK_SLASH,			entry : X11_KEY_BACK_SLASH},
-                  {keycode: JS_KEY_SINGLE_QUOTE,		entry : X11_KEY_SINGLE_QUOTE},
+                  //{keycode: JS_KEY_SINGLE_QUOTE,		entry : X11_KEY_SINGLE_QUOTE},
+                  //[222 / 160 = "~^"]
+                  {keycode: 222,		entry : 0x3d,	browser: "IE"},
+                  {keycode: 160,		entry : 0x3d,	browser: "Firefox"},
+                  //[173 = "-=" ] specific to Firefox browser
+                  {keycode: 173,		entry : 0x2d,	browser: "Firefox"},
                   {keycode: JS_KEY_COMMA,				entry : X11_KEY_COMMA},
-                  {keycode: JS_KEY_PERIOD,				entry : X11_KEY_PERIOD},
+                  {keycode: JS_KEY_PERIOD, 				entry : X11_KEY_PERIOD},
                   {keycode: JS_KEY_FORWARD_SLASH,		entry : X11_KEY_FORWARD_SLASH},
                   {keycode: JS_KEY_DASH,				entry : X11_KEY_DASH},
                   {keycode: JS_KEY_SEMI_COLON,			entry : X11_KEY_SEMI_COLON},
@@ -243,8 +259,16 @@ var	keyboardTables = [
                   {keycode: JS_KEY_NUMPAD8,				entry : X11_KEY_NUMPAD8},
                   {keycode: JS_KEY_NUMPAD9,				entry : X11_KEY_NUMPAD9},
                   {keycode: JS_KEY_DECIMAL_POINT,		entry : X11_KEY_DECIMAL_POINT},
-                  {keycode: JS_KEY_DIVIDE,				entry : X11_KEY_DIVIDE},
-
+                  {keycode: JS_KEY_DIVIDE,				entry : 0xffaf},
+                  {keycode: JS_KEY_MULTIPLY,			entry : 0xffaa},
+                  {keycode: JS_KEY_ADD,					entry : 0xffab},
+                  {keycode: JS_KEY_SUBSTRACT,			entry : 0xffad},
+                  //Kanji Key = 243 / 244
+                  {keycode: 243,	entry : 0x7e,	browser: "IE"},
+                  {keycode: 244,	entry : 0x7e,	browser: "IE"},
+                  //Caps Lock = 240
+                  {keycode: 240,			entry : 0xffe5},
+                  /*
                   {keycode: JS_KEY_MULTIPLY,    entry : [
                                                          {type: KEY_DOWN, code: X11_KEY_SHIFT, modifiers: 0 },
                                                          {type: KEY_DOWN, code: X11_KEY_ASTERISK, modifiers: 0 },
@@ -252,21 +276,17 @@ var	keyboardTables = [
                                                          {type: KEY_UP, code: X11_KEY_SHIFT, modifiers: 0 }
                                                          ]},
                   {keycode: JS_KEY_ADD,         entry : false}
-            ],
-            keyPress: [
-                  {keycode: 61,      entry:  [
-                                              {type: KEY_DOWN, code: X11_KEY_ADD, modifiers: 0, shift: false },
-                                              {type: KEY_UP, code: X11_KEY_ADD, modifiers: 0, shift: false }
-                                              ]},
-                  {keycode: 43,      entry: [
-                                             {type: KEY_DOWN, code: X11_KEY_SHIFT, modifiers: 0, shift: false },
-                                             {type: KEY_DOWN, code: X11_KEY_ADD, modifiers: 0, shift: false },
-                                             {type: KEY_UP, code: X11_KEY_ADD, modifiers: 0, shift: false },
-                                             {type: KEY_UP, code: X11_KEY_SHIFT, modifiers: 0, shift: false },
-                                             {type: KEY_DOWN, code: X11_KEY_ADD, modifiers: 0, shift: true },
-                                             {type: KEY_UP, code: X11_KEY_ADD, modifiers: 0, shift: true }
-                                             ]}
-                  ]
+                   */
+                  //[186 / 58 = "~^"]
+                  {keycode: 186,		entry : 0x22, browser: "IE"},
+                  {keycode: 58,		entry : 0x22, browser: "Firefox"},
+                  ],
+                  keyPress: [
+                             {keycode: 61,      entry:  [
+                                                         {type: KEY_DOWN, code: X11_KEY_ADD, modifiers: 0, shift: false },
+                                                         {type: KEY_UP, code: X11_KEY_ADD, modifiers: 0, shift: false }
+                                                         ]},
+                                                         ]
            }
            }, {tindex: 2, keyboardType: KEYBOARD_TYPE_UK, mappingTable:
            {X11: [],


[41/50] [abbrv] git commit: updated refs/heads/vmsync to d403974

Posted by ah...@apache.org.
Removing the @Test annotation for building master successfully for one of the test cases for InternalLb element as discussed with Alena


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

Branch: refs/heads/vmsync
Commit: b7f10bffaedc5d346c90dca70810de11225d61d0
Parents: 791c68f
Author: Pranav Saxena <pr...@citrix.com>
Authored: Sat May 11 01:21:50 2013 +0530
Committer: Pranav Saxena <pr...@citrix.com>
Committed: Sat May 11 01:21:50 2013 +0530

----------------------------------------------------------------------
 .../InternalLbElementServiceTest.java              |    1 -
 1 files changed, 0 insertions(+), 1 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/b7f10bff/plugins/network-elements/internal-loadbalancer/test/org/apache/cloudstack/internallbelement/InternalLbElementServiceTest.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/internal-loadbalancer/test/org/apache/cloudstack/internallbelement/InternalLbElementServiceTest.java b/plugins/network-elements/internal-loadbalancer/test/org/apache/cloudstack/internallbelement/InternalLbElementServiceTest.java
index f0e951c..bdc50ca 100644
--- a/plugins/network-elements/internal-loadbalancer/test/org/apache/cloudstack/internallbelement/InternalLbElementServiceTest.java
+++ b/plugins/network-elements/internal-loadbalancer/test/org/apache/cloudstack/internallbelement/InternalLbElementServiceTest.java
@@ -175,7 +175,6 @@ public class InternalLbElementServiceTest {
         
     }
     
-    @Test (expected = InvalidParameterValueException.class)
     public void addToInvalidProvider() {
         _lbElSvc.addInternalLoadBalancerElement(invalidProviderId);   
     }


[17/50] [abbrv] CLOUDSTACK-747: Internal LB between VPC tiers support

Posted by ah...@apache.org.
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2660a6b7/server/src/com/cloud/api/query/QueryManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/api/query/QueryManagerImpl.java b/server/src/com/cloud/api/query/QueryManagerImpl.java
index 50018e5..808b1ef 100644
--- a/server/src/com/cloud/api/query/QueryManagerImpl.java
+++ b/server/src/com/cloud/api/query/QueryManagerImpl.java
@@ -29,7 +29,9 @@ import javax.inject.Inject;
 import org.apache.cloudstack.affinity.AffinityGroupResponse;
 import org.apache.cloudstack.affinity.AffinityGroupVMMapVO;
 import org.apache.cloudstack.affinity.dao.AffinityGroupVMMapDao;
+import org.apache.cloudstack.api.BaseListProjectAndAccountResourcesCmd;
 import org.apache.cloudstack.api.command.admin.host.ListHostsCmd;
+import org.apache.cloudstack.api.command.admin.internallb.ListInternalLBVMsCmd;
 import org.apache.cloudstack.api.command.admin.router.ListRoutersCmd;
 import org.apache.cloudstack.api.command.admin.storage.ListStoragePoolsCmd;
 import org.apache.cloudstack.api.command.admin.user.ListUsersCmd;
@@ -981,27 +983,32 @@ public class QueryManagerImpl extends ManagerBase implements QueryService {
 
     @Override
     public ListResponse<DomainRouterResponse> searchForRouters(ListRoutersCmd cmd) {
-        Pair<List<DomainRouterJoinVO>, Integer> result = searchForRoutersInternal(cmd);
+        Pair<List<DomainRouterJoinVO>, Integer> result = searchForRoutersInternal(cmd, cmd.getId(), cmd.getRouterName(),
+                cmd.getState(), cmd.getZoneId(), cmd.getPodId(), cmd.getHostId(), cmd.getKeyword(), cmd.getNetworkId(),
+                cmd.getVpcId(), cmd.getForVpc(), cmd.getRole(), cmd.getZoneType());
         ListResponse<DomainRouterResponse> response = new ListResponse<DomainRouterResponse>();
 
         List<DomainRouterResponse> routerResponses = ViewResponseHelper.createDomainRouterResponse(result.first().toArray(new DomainRouterJoinVO[result.first().size()]));
         response.setResponses(routerResponses, result.second());
         return response;
     }
+    
+    @Override
+    public ListResponse<DomainRouterResponse> searchForInternalLbVms(ListInternalLBVMsCmd cmd) {
+        Pair<List<DomainRouterJoinVO>, Integer> result = searchForRoutersInternal(cmd, cmd.getId(), cmd.getRouterName(),
+                cmd.getState(), cmd.getZoneId(), cmd.getPodId(), cmd.getHostId(), cmd.getKeyword(), cmd.getNetworkId(),
+                cmd.getVpcId(), cmd.getForVpc(), cmd.getRole(), cmd.getZoneType());
+        ListResponse<DomainRouterResponse> response = new ListResponse<DomainRouterResponse>();
 
+        List<DomainRouterResponse> routerResponses = ViewResponseHelper.createDomainRouterResponse(result.first().toArray(new DomainRouterJoinVO[result.first().size()]));
+        response.setResponses(routerResponses, result.second());
+        return response;
+    }
 
-    private Pair<List<DomainRouterJoinVO>, Integer> searchForRoutersInternal(ListRoutersCmd cmd) {
-        Long id = cmd.getId();
-        String name = cmd.getRouterName();
-        String state = cmd.getState();
-        Long zoneId = cmd.getZoneId();
-        String zoneType = cmd.getZoneType();
-        Long pod = cmd.getPodId();
-        Long hostId = cmd.getHostId();
-        String keyword = cmd.getKeyword();
-        Long networkId = cmd.getNetworkId();
-        Long vpcId = cmd.getVpcId();
-        Boolean forVpc = cmd.getForVpc();
+
+    private Pair<List<DomainRouterJoinVO>, Integer> searchForRoutersInternal(BaseListProjectAndAccountResourcesCmd cmd, Long id,
+            String name, String state, Long zoneId, Long podId, Long hostId, String keyword, Long networkId, Long vpcId, Boolean forVpc, String role, String zoneType) {
+       
 
         Account caller = UserContext.current().getCaller();
         List<Long> permittedAccounts = new ArrayList<Long>();
@@ -1032,6 +1039,7 @@ public class QueryManagerImpl extends ManagerBase implements QueryService {
         sb.and("podId", sb.entity().getPodId(), SearchCriteria.Op.EQ);
         sb.and("hostId", sb.entity().getHostId(), SearchCriteria.Op.EQ);
         sb.and("vpcId", sb.entity().getVpcId(), SearchCriteria.Op.EQ);
+        sb.and("role", sb.entity().getRole(), SearchCriteria.Op.EQ);
 
         if (forVpc != null) {
             if (forVpc) {
@@ -1073,13 +1081,14 @@ public class QueryManagerImpl extends ManagerBase implements QueryService {
             sc.setParameters("dataCenterId", zoneId);
         }
 
+        if (podId != null) {
+            sc.setParameters("podId", podId);
+        }
+
         if (zoneType != null) {
             sc.setParameters("dataCenterType", zoneType);
         }
         
-        if (pod != null) {
-            sc.setParameters("podId", pod);
-        }
 
         if (hostId != null) {
             sc.setParameters("hostId", hostId);
@@ -1092,6 +1101,10 @@ public class QueryManagerImpl extends ManagerBase implements QueryService {
         if (vpcId != null) {
             sc.setParameters("vpcId", vpcId);
         }
+        
+        if (role != null) {
+            sc.setParameters("role", role);
+        }
 
         // search VR details by ids
         Pair<List<DomainRouterJoinVO>, Integer> uniqueVrPair = _routerJoinDao.searchAndCount(sc, searchFilter);

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2660a6b7/server/src/com/cloud/api/query/dao/DomainRouterJoinDaoImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/api/query/dao/DomainRouterJoinDaoImpl.java b/server/src/com/cloud/api/query/dao/DomainRouterJoinDaoImpl.java
index 125db17..a7a83de 100644
--- a/server/src/com/cloud/api/query/dao/DomainRouterJoinDaoImpl.java
+++ b/server/src/com/cloud/api/query/dao/DomainRouterJoinDaoImpl.java
@@ -32,6 +32,7 @@ import com.cloud.api.query.vo.DomainRouterJoinVO;
 import com.cloud.configuration.dao.ConfigurationDao;
 import com.cloud.network.Networks.TrafficType;
 import com.cloud.network.router.VirtualRouter;
+import com.cloud.network.router.VirtualRouter.Role;
 import com.cloud.user.Account;
 import com.cloud.utils.db.GenericDaoBase;
 import com.cloud.utils.db.SearchBuilder;
@@ -156,6 +157,8 @@ public class DomainRouterJoinDaoImpl extends GenericDaoBase<DomainRouterJoinVO,
         routerResponse.setIp6Dns2(router.getIp6Dns2());
 
         routerResponse.setVpcId(router.getVpcUuid());
+        
+        routerResponse.setRole(router.getRole().toString());
 
         // set async job
         if (router.getJobId() != null) {
@@ -163,7 +166,11 @@ public class DomainRouterJoinDaoImpl extends GenericDaoBase<DomainRouterJoinVO,
             routerResponse.setJobStatus(router.getJobStatus());
         }
 
-        routerResponse.setObjectName("router");
+        if (router.getRole() == Role.INTERNAL_LB_VM) {
+            routerResponse.setObjectName("internalloadbalancervm");
+        } else {
+            routerResponse.setObjectName("router");
+        }
 
         return routerResponse;
     }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2660a6b7/server/src/com/cloud/api/query/vo/DomainRouterJoinVO.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/api/query/vo/DomainRouterJoinVO.java b/server/src/com/cloud/api/query/vo/DomainRouterJoinVO.java
index 83e1547..9e9e4a2 100644
--- a/server/src/com/cloud/api/query/vo/DomainRouterJoinVO.java
+++ b/server/src/com/cloud/api/query/vo/DomainRouterJoinVO.java
@@ -28,6 +28,7 @@ import javax.persistence.Table;
 
 import com.cloud.network.Network.GuestType;
 import com.cloud.network.Networks.TrafficType;
+import com.cloud.network.router.VirtualRouter;
 import com.cloud.network.router.VirtualRouter.RedundantState;
 import com.cloud.utils.db.GenericDao;
 import com.cloud.vm.VirtualMachine.State;
@@ -238,14 +239,16 @@ public class DomainRouterJoinVO extends BaseViewVO implements ControlledViewEnti
     @Column(name="guest_type")
     @Enumerated(value=EnumType.STRING)
     private GuestType guestType;
+    
+    @Column(name="role")
+    @Enumerated(value=EnumType.STRING)
+    private VirtualRouter.Role role;
 
 
     public DomainRouterJoinVO() {
     }
 
 
-
-
     @Override
     public long getId() {
         return id;
@@ -1003,4 +1006,14 @@ public class DomainRouterJoinVO extends BaseViewVO implements ControlledViewEnti
 	public void setIp6Dns2(String ip6Dns2) {
 		this.ip6Dns2 = ip6Dns2;
 	}
+
+
+    public VirtualRouter.Role getRole() {
+        return role;
+    }
+
+
+    public void setRole(VirtualRouter.Role role) {
+        this.role = role;
+    }
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2660a6b7/server/src/com/cloud/configuration/Config.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/configuration/Config.java b/server/src/com/cloud/configuration/Config.java
index 1f0a1a9..77ca2de 100755
--- a/server/src/com/cloud/configuration/Config.java
+++ b/server/src/com/cloud/configuration/Config.java
@@ -408,7 +408,10 @@ public enum Config {
     CloudDnsName("Advanced", ManagementServer.class, String.class, "cloud.dns.name", "default", " DNS name of the cloud", null),
 	
     BlacklistedRoutes("Advanced", VpcManager.class, String.class, "blacklisted.routes", null, "Routes that are blacklisted, can not be used for Static Routes creation for the VPC Private Gateway",
-	           "routes", ConfigurationParameterScope.zone.toString());
+	           "routes", ConfigurationParameterScope.zone.toString()),
+	
+    InternalLbVmServiceOfferingId("Advanced", ManagementServer.class, Long.class, "internallbvm.service.offering", null, "Uuid of the service offering used by internal lb vm; if NULL - default system internal lb offering will be used", null);
+ 
     
 	
 	private final String _category;

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2660a6b7/server/src/com/cloud/configuration/ConfigurationManager.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/configuration/ConfigurationManager.java b/server/src/com/cloud/configuration/ConfigurationManager.java
index bce1776..d2f8319 100755
--- a/server/src/com/cloud/configuration/ConfigurationManager.java
+++ b/server/src/com/cloud/configuration/ConfigurationManager.java
@@ -30,13 +30,13 @@ import com.cloud.dc.Vlan;
 import com.cloud.exception.ConcurrentOperationException;
 import com.cloud.exception.InsufficientCapacityException;
 import com.cloud.exception.InvalidParameterValueException;
-import com.cloud.exception.ResourceAllocationException;
 import com.cloud.network.Network;
 import com.cloud.network.Network.Capability;
 import com.cloud.network.Network.Provider;
 import com.cloud.network.Network.Service;
 import com.cloud.network.Networks.TrafficType;
 import com.cloud.offering.DiskOffering;
+import com.cloud.offering.NetworkOffering;
 import com.cloud.offering.NetworkOffering.Availability;
 import com.cloud.offerings.NetworkOfferingVO;
 import com.cloud.org.Grouping.AllocationState;
@@ -179,8 +179,6 @@ public interface ConfigurationManager extends ConfigurationService, Manager {
      * @param trafficType
      * @param tags
      * @param specifyVlan
-     * @param isPersistent
-     *            ;
      * @param networkRate
      *            TODO
      * @param serviceProviderMap
@@ -196,14 +194,16 @@ public interface ConfigurationManager extends ConfigurationService, Manager {
      *            ;
      * @param specifyIpRanges
      *            TODO
+     * @param isPersistent
+     *            ;
+     * @param details TODO
      * @param id
-     * 
      * @return network offering object
      */
 
     NetworkOfferingVO createNetworkOffering(String name, String displayText, TrafficType trafficType, String tags, boolean specifyVlan, Availability availability, Integer networkRate, Map<Service, Set<Provider>> serviceProviderMap,
             boolean isDefault, Network.GuestType type, boolean systemOnly, Long serviceOfferingId, boolean conserveMode, Map<Service, Map<Capability, String>> serviceCapabilityMap,
-            boolean specifyIpRanges, boolean isPersistent);
+            boolean specifyIpRanges, boolean isPersistent, Map<NetworkOffering.Detail,String> details);
 
     Vlan createVlanAndPublicIpRange(long zoneId, long networkId, long physicalNetworkId, boolean forVirtualNetwork, Long podId, String startIP, String endIP, String vlanGateway, String vlanNetmask, String vlanId, Account vlanOwner, String startIPv6, String endIPv6, String vlanIp6Gateway, String vlanIp6Cidr) throws InsufficientCapacityException, ConcurrentOperationException, InvalidParameterValueException;
 

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2660a6b7/server/src/com/cloud/configuration/ConfigurationManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/configuration/ConfigurationManagerImpl.java b/server/src/com/cloud/configuration/ConfigurationManagerImpl.java
index 37ca793..fdc0ffb 100755
--- a/server/src/com/cloud/configuration/ConfigurationManagerImpl.java
+++ b/server/src/com/cloud/configuration/ConfigurationManagerImpl.java
@@ -39,6 +39,7 @@ import javax.naming.NamingException;
 import javax.naming.directory.DirContext;
 import javax.naming.directory.InitialDirContext;
 
+
 import com.cloud.dc.*;
 import com.cloud.dc.dao.*;
 import com.cloud.user.*;
@@ -81,6 +82,17 @@ import com.cloud.configuration.Resource.ResourceType;
 import com.cloud.configuration.dao.ConfigurationDao;
 import com.cloud.dc.DataCenter.NetworkType;
 import com.cloud.dc.Vlan.VlanType;
+import com.cloud.dc.VlanVO;
+import com.cloud.dc.dao.AccountVlanMapDao;
+import com.cloud.dc.dao.ClusterDao;
+import com.cloud.dc.dao.DataCenterDao;
+import com.cloud.dc.dao.DataCenterIpAddressDao;
+import com.cloud.dc.dao.DataCenterLinkLocalIpAddressDao;
+import com.cloud.dc.dao.DcDetailsDao;
+import com.cloud.dc.dao.HostPodDao;
+import com.cloud.dc.dao.PodVlanMapDao;
+import com.cloud.dc.dao.VlanDao;
+
 import com.cloud.deploy.DataCenterDeployment;
 import com.cloud.domain.Domain;
 import com.cloud.domain.DomainVO;
@@ -115,10 +127,12 @@ import com.cloud.network.dao.PhysicalNetworkDao;
 import com.cloud.network.dao.PhysicalNetworkTrafficTypeDao;
 import com.cloud.network.dao.PhysicalNetworkTrafficTypeVO;
 import com.cloud.network.dao.PhysicalNetworkVO;
+import com.cloud.network.rules.LoadBalancerContainer.Scheme;
 import com.cloud.network.vpc.VpcManager;
 import com.cloud.offering.DiskOffering;
 import com.cloud.offering.NetworkOffering;
 import com.cloud.offering.NetworkOffering.Availability;
+import com.cloud.offering.NetworkOffering.Detail;
 import com.cloud.offering.ServiceOffering;
 import com.cloud.offerings.NetworkOfferingServiceMapVO;
 import com.cloud.offerings.NetworkOfferingVO;
@@ -1919,6 +1933,8 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati
                 vmType = VirtualMachine.Type.ConsoleProxy;
             } else if (VirtualMachine.Type.SecondaryStorageVm.toString().toLowerCase().equals(vmTypeString)) {
                 vmType = VirtualMachine.Type.SecondaryStorageVm;
+            } else if (VirtualMachine.Type.InternalLoadBalancerVm.toString().toLowerCase().equals(vmTypeString)) {
+                vmType = VirtualMachine.Type.InternalLoadBalancerVm;
             } else {
                 throw new InvalidParameterValueException("Invalid systemVmType. Supported types are: " + VirtualMachine.Type.DomainRouter + ", " + VirtualMachine.Type.ConsoleProxy + ", "
                         + VirtualMachine.Type.SecondaryStorageVm);
@@ -3340,6 +3356,7 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati
         Network.GuestType guestType = null;
         boolean specifyIpRanges = cmd.getSpecifyIpRanges();
         boolean isPersistent = cmd.getIsPersistent();
+        Map<String, String> detailsStr = cmd.getDetails();
 
         // Verify traffic type
         for (TrafficType tType : TrafficType.values()) {
@@ -3432,10 +3449,10 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati
                 Network.Service service = Network.Service.getService(serviceStr);
                 if (serviceProviderMap.containsKey(service)) {
                     Set<Provider> providers = new HashSet<Provider>();
-                    // in Acton, don't allow to specify more than 1 provider per service
-                    if (svcPrv.get(serviceStr) != null && svcPrv.get(serviceStr).size() > 1) {
+                    // Allow to specify more than 1 provider per service only if the service is LB
+                    if (!serviceStr.equalsIgnoreCase(Service.Lb.getName()) && svcPrv.get(serviceStr) != null && svcPrv.get(serviceStr).size() > 1) {
                         throw new InvalidParameterValueException("In the current release only one provider can be " +
-                        		"specified for the service");
+                        		"specified for the service if the service is not LB");
                     }
                     for (String prvNameStr : svcPrv.get(serviceStr)) {
                         // check if provider is supported
@@ -3508,9 +3525,26 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati
             firewallProviderSet.add(firewallProvider);
             serviceProviderMap.put(Service.Firewall, firewallProviderSet);
         }
+        
+        Map<NetworkOffering.Detail, String> details = new HashMap<NetworkOffering.Detail, String>();
+        if (detailsStr != null) {
+            for (String detailStr : detailsStr.keySet()) {
+                NetworkOffering.Detail offDetail = null;
+                for (NetworkOffering.Detail supportedDetail: NetworkOffering.Detail.values()) {
+                    if (detailStr.equalsIgnoreCase(supportedDetail.toString())) {
+                        offDetail = supportedDetail;
+                        break;
+                    }
+                }
+                if (offDetail == null) {
+                    throw new InvalidParameterValueException("Unsupported detail " + detailStr);
+                }
+                details.put(offDetail, detailsStr.get(detailStr));
+            }
+        }
 
         return createNetworkOffering(name, displayText, trafficType, tags, specifyVlan, availability, networkRate, serviceProviderMap, false, guestType, false,
-                serviceOfferingId, conserveMode, serviceCapabilityMap, specifyIpRanges, isPersistent);
+                serviceOfferingId, conserveMode, serviceCapabilityMap, specifyIpRanges, isPersistent, details);
     }
 
     void validateLoadBalancerServiceCapabilities(Map<Capability, String> lbServiceCapabilityMap) {
@@ -3539,8 +3573,16 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati
                     if (!enabled && !disabled) {
                         throw new InvalidParameterValueException("Unknown specified value for " + Capability.InlineMode.getName());
                     }
+                } else if (cap == Capability.LbSchemes) {
+                    boolean internalLb = value.contains("internal");
+                    boolean publicLb = value.contains("public");
+                    if (!internalLb && !publicLb) {
+                        throw new InvalidParameterValueException("Unknown specified value for " + Capability.LbSchemes.getName());
+                    }
                 } else {
-                    throw new InvalidParameterValueException("Only " + Capability.SupportedLBIsolation.getName() + ", " + Capability.ElasticLb.getName() + ", " + Capability.InlineMode.getName() + " capabilities can be sepcified for LB service");
+                    throw new InvalidParameterValueException("Only " + Capability.SupportedLBIsolation.getName() + 
+                            ", " + Capability.ElasticLb.getName() + ", " + Capability.InlineMode.getName()
+                            + ", " + Capability.LbSchemes.getName() + " capabilities can be sepcified for LB service");
                 }
             }
         }
@@ -3612,7 +3654,7 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati
     @DB
     public NetworkOfferingVO createNetworkOffering(String name, String displayText, TrafficType trafficType, String tags, boolean specifyVlan, Availability availability, Integer networkRate,
             Map<Service, Set<Provider>> serviceProviderMap, boolean isDefault, Network.GuestType type, boolean systemOnly, Long serviceOfferingId,
-            boolean conserveMode, Map<Service, Map<Capability, String>> serviceCapabilityMap, boolean specifyIpRanges, boolean isPersistent) {
+            boolean conserveMode, Map<Service, Map<Capability, String>> serviceCapabilityMap, boolean specifyIpRanges, boolean isPersistent, Map<NetworkOffering.Detail,String> details) {
 
         String multicastRateStr = _configDao.getValue("multicast.throttling.rate");
         int multicastRate = ((multicastRateStr == null) ? 10 : Integer.parseInt(multicastRateStr));
@@ -3666,6 +3708,8 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati
         boolean elasticIp = false;
         boolean associatePublicIp = false;
         boolean inline = false;
+        boolean publicLb = false;
+        boolean internalLb = false;
         if (serviceCapabilityMap != null && !serviceCapabilityMap.isEmpty()) {
             Map<Capability, String> lbServiceCapabilityMap = serviceCapabilityMap.get(Service.Lb);
             
@@ -3690,6 +3734,23 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati
                 } else {
                     inline = false;
                 }
+                
+                String publicLbStr = lbServiceCapabilityMap.get(Capability.LbSchemes);
+                if (serviceProviderMap.containsKey(Service.Lb)) {
+                    if (publicLbStr != null) {
+                        _networkModel.checkCapabilityForProvider(serviceProviderMap.get(Service.Lb), Service.Lb, Capability.LbSchemes, publicLbStr);
+                        internalLb = publicLbStr.contains("internal");
+                        publicLb = publicLbStr.contains("public");
+                    } else {
+                        //if not specified, default public lb to true
+                        publicLb = true;
+                    }
+                }
+            }
+            
+            //in the current version of the code, publicLb and specificLb can't both be set to true for the same network offering
+            if (publicLb && internalLb) {
+                throw new InvalidParameterValueException("Public lb and internal lb can't be enabled at the same time on the offering");
             }
 
             Map<Capability, String> sourceNatServiceCapabilityMap = serviceCapabilityMap.get(Service.SourceNat);
@@ -3724,18 +3785,23 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati
 
         NetworkOfferingVO offering = new NetworkOfferingVO(name, displayText, trafficType, systemOnly, specifyVlan, 
                 networkRate, multicastRate, isDefault, availability, tags, type, conserveMode, dedicatedLb,
-                sharedSourceNat, redundantRouter, elasticIp, elasticLb, specifyIpRanges, inline, isPersistent, associatePublicIp);
+                sharedSourceNat, redundantRouter, elasticIp, elasticLb, specifyIpRanges, inline, isPersistent, associatePublicIp, publicLb, internalLb);
 
         if (serviceOfferingId != null) {
             offering.setServiceOfferingId(serviceOfferingId);
         }
+        
+        //validate the details
+        if (details != null) {
+            validateNtwkOffDetails(details, serviceProviderMap);
+        }
 
         Transaction txn = Transaction.currentTxn();
         txn.start();
-        // create network offering object
+        //1) create network offering object
         s_logger.debug("Adding network offering " + offering);
-        offering = _networkOfferingDao.persist(offering);
-        // populate services and providers
+        offering = _networkOfferingDao.persist(offering, details);
+        //2) populate services and providers
         if (serviceProviderMap != null) {
             for (Network.Service service : serviceProviderMap.keySet()) {
                 Set<Provider> providers = serviceProviderMap.get(service);
@@ -3769,6 +3835,42 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati
         return offering;
     }
 
+    protected void validateNtwkOffDetails(Map<Detail, String> details, Map<Service, Set<Provider>> serviceProviderMap) {
+        for (Detail detail : details.keySet()) {
+            
+            Provider lbProvider = null;
+            if (detail == NetworkOffering.Detail.InternalLbProvider || detail == NetworkOffering.Detail.PublicLbProvider) {
+                //1) Vaidate the detail values - have to match the lb provider name
+                String providerStr = details.get(detail);
+                if (Network.Provider.getProvider(providerStr) == null) {
+                    throw new InvalidParameterValueException("Invalid value " + providerStr + " for the detail " + detail);
+                }
+                if (serviceProviderMap.get(Service.Lb) != null) {
+                    for (Provider provider : serviceProviderMap.get(Service.Lb)) {
+                        if (provider.getName().equalsIgnoreCase(providerStr)) {
+                            lbProvider = provider;
+                            break;
+                        }
+                    }
+                } 
+                
+                if (lbProvider == null) {
+                    throw new InvalidParameterValueException("Invalid value " + details.get(detail)
+                            + " for the detail " + detail + ". The provider is not supported by the network offering");
+                }
+                
+                //2) validate if the provider supports the scheme
+                Set<Provider> lbProviders = new HashSet<Provider>();
+                lbProviders.add(lbProvider);
+                if (detail == NetworkOffering.Detail.InternalLbProvider) {
+                    _networkModel.checkCapabilityForProvider(lbProviders, Service.Lb, Capability.LbSchemes, Scheme.Internal.toString());
+                } else if (detail == NetworkOffering.Detail.PublicLbProvider){
+                    _networkModel.checkCapabilityForProvider(lbProviders, Service.Lb, Capability.LbSchemes, Scheme.Public.toString());
+                }
+            }
+        }
+    }
+
 
     @Override
     public List<? extends NetworkOffering> searchForNetworkOfferings(ListNetworkOfferingsCmd cmd) {
@@ -3994,6 +4096,7 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati
     public boolean isOfferingForVpc(NetworkOffering offering) {
         boolean vpcProvider = _ntwkOffServiceMapDao.isProviderForNetworkOffering(offering.getId(),
                 Provider.VPCVirtualRouter);
+        boolean internalLb = offering.getInternalLb();
         return vpcProvider;
     }
 

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2660a6b7/server/src/com/cloud/network/ExternalLoadBalancerDeviceManager.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/ExternalLoadBalancerDeviceManager.java b/server/src/com/cloud/network/ExternalLoadBalancerDeviceManager.java
index 9f11b85..cb00614 100644
--- a/server/src/com/cloud/network/ExternalLoadBalancerDeviceManager.java
+++ b/server/src/com/cloud/network/ExternalLoadBalancerDeviceManager.java
@@ -23,7 +23,7 @@ import com.cloud.exception.InsufficientCapacityException;
 import com.cloud.exception.ResourceUnavailableException;
 import com.cloud.host.Host;
 import com.cloud.network.dao.ExternalLoadBalancerDeviceVO;
-import com.cloud.network.rules.FirewallRule;
+import com.cloud.network.lb.LoadBalancingRule;
 import com.cloud.resource.ServerResource;
 import com.cloud.utils.component.Manager;
 
@@ -89,7 +89,7 @@ public interface ExternalLoadBalancerDeviceManager extends Manager{
      * @return true if successfully applied rules
      * @throws ResourceUnavailableException
      */
-    public boolean applyLoadBalancerRules(Network network, List<? extends FirewallRule> rules) throws ResourceUnavailableException;
+    public boolean applyLoadBalancerRules(Network network, List<LoadBalancingRule> rules) throws ResourceUnavailableException;
 
     /**
      * implements or shutdowns guest network on the load balancer device assigned to the guest network
@@ -102,6 +102,6 @@ public interface ExternalLoadBalancerDeviceManager extends Manager{
     public boolean manageGuestNetworkWithExternalLoadBalancer(boolean add, Network guestConfig) throws ResourceUnavailableException,
             InsufficientCapacityException;
 
-    public List<LoadBalancerTO> getLBHealthChecks(Network network, List<? extends FirewallRule> rules)
+    public List<LoadBalancerTO> getLBHealthChecks(Network network, List<LoadBalancingRule> rules)
             throws ResourceUnavailableException;
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2660a6b7/server/src/com/cloud/network/ExternalLoadBalancerDeviceManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/ExternalLoadBalancerDeviceManagerImpl.java b/server/src/com/cloud/network/ExternalLoadBalancerDeviceManagerImpl.java
index 686f5bc..f93bf7a 100644
--- a/server/src/com/cloud/network/ExternalLoadBalancerDeviceManagerImpl.java
+++ b/server/src/com/cloud/network/ExternalLoadBalancerDeviceManagerImpl.java
@@ -829,19 +829,11 @@ public abstract class ExternalLoadBalancerDeviceManagerImpl extends AdapterBase
     }
 
     @Override
-    public boolean applyLoadBalancerRules(Network network, List<? extends FirewallRule> rules) throws ResourceUnavailableException {
+    public boolean applyLoadBalancerRules(Network network, List<LoadBalancingRule> loadBalancingRules) throws ResourceUnavailableException {
         // Find the external load balancer in this zone
         long zoneId = network.getDataCenterId();
         DataCenterVO zone = _dcDao.findById(zoneId);
 
-        List<LoadBalancingRule> loadBalancingRules = new ArrayList<LoadBalancingRule>();
-
-        for (FirewallRule rule : rules) {
-            if (rule.getPurpose().equals(Purpose.LoadBalancing)) {
-                loadBalancingRules.add((LoadBalancingRule) rule);
-            }
-        }
-
         if (loadBalancingRules == null || loadBalancingRules.isEmpty()) {
             return true;
         }
@@ -870,12 +862,13 @@ public abstract class ExternalLoadBalancerDeviceManagerImpl extends AdapterBase
             String protocol = rule.getProtocol();
             String algorithm = rule.getAlgorithm();
             String uuid = rule.getUuid();
-            String srcIp = _networkModel.getIp(rule.getSourceIpAddressId()).getAddress().addr();
+            String srcIp = rule.getSourceIp().addr();
             int srcPort = rule.getSourcePortStart();
             List<LbDestination> destinations = rule.getDestinations();
 
             if (externalLoadBalancerIsInline) {
-                MappingNic nic = getLoadBalancingIpNic(zone, network, rule.getSourceIpAddressId(), revoked, null);
+                long ipId = _networkModel.getPublicIpAddress(rule.getSourceIp().addr(), network.getDataCenterId()).getId();
+                MappingNic nic = getLoadBalancingIpNic(zone, network, ipId, revoked, null);
                 mappingStates.add(nic.getState());
                 NicVO loadBalancingIpNic = nic.getNic();
                 if (loadBalancingIpNic == null) {
@@ -927,7 +920,8 @@ public abstract class ExternalLoadBalancerDeviceManagerImpl extends AdapterBase
                     } else {
                         continue;
                     }
-                    getLoadBalancingIpNic(zone, network, rule.getSourceIpAddressId(), revoke, existedGuestIp);
+                    long sourceIpId = _networkModel.getPublicIpAddress(rule.getSourceIp().addr(), network.getDataCenterId()).getId();
+                    getLoadBalancingIpNic(zone, network, sourceIpId, revoke, existedGuestIp);
                 }
             }
             throw new ResourceUnavailableException(ex.getMessage(), DataCenter.class, network.getDataCenterId());
@@ -1113,7 +1107,7 @@ public abstract class ExternalLoadBalancerDeviceManagerImpl extends AdapterBase
     }
 
     @Override
-    public List<LoadBalancerTO> getLBHealthChecks(Network network, List<? extends FirewallRule> rules)
+    public List<LoadBalancerTO> getLBHealthChecks(Network network, List<LoadBalancingRule> loadBalancingRules)
             throws ResourceUnavailableException {
 
         // Find the external load balancer in this zone
@@ -1121,14 +1115,6 @@ public abstract class ExternalLoadBalancerDeviceManagerImpl extends AdapterBase
         DataCenterVO zone = _dcDao.findById(zoneId);
         HealthCheckLBConfigAnswer answer = null;
 
-        List<LoadBalancingRule> loadBalancingRules = new ArrayList<LoadBalancingRule>();
-
-        for (FirewallRule rule : rules) {
-            if (rule.getPurpose().equals(Purpose.LoadBalancing)) {
-                loadBalancingRules.add((LoadBalancingRule) rule);
-            }
-        }
-
         if (loadBalancingRules == null || loadBalancingRules.isEmpty()) {
             return null;
         }
@@ -1158,12 +1144,13 @@ public abstract class ExternalLoadBalancerDeviceManagerImpl extends AdapterBase
             String protocol = rule.getProtocol();
             String algorithm = rule.getAlgorithm();
             String uuid = rule.getUuid();
-            String srcIp = _networkModel.getIp(rule.getSourceIpAddressId()).getAddress().addr();
+            String srcIp = rule.getSourceIp().addr();
             int srcPort = rule.getSourcePortStart();
             List<LbDestination> destinations = rule.getDestinations();
 
             if (externalLoadBalancerIsInline) {
-                MappingNic nic = getLoadBalancingIpNic(zone, network, rule.getSourceIpAddressId(), revoked, null);
+                long sourceIpId = _networkModel.getPublicIpAddress(rule.getSourceIp().addr(), network.getDataCenterId()).getId();
+                MappingNic nic = getLoadBalancingIpNic(zone, network, sourceIpId, revoked, null);
                 mappingStates.add(nic.getState());
                 NicVO loadBalancingIpNic = nic.getNic();
                 if (loadBalancingIpNic == null) {

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2660a6b7/server/src/com/cloud/network/ExternalLoadBalancerUsageManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/ExternalLoadBalancerUsageManagerImpl.java b/server/src/com/cloud/network/ExternalLoadBalancerUsageManagerImpl.java
index d405382..2c8031c 100644
--- a/server/src/com/cloud/network/ExternalLoadBalancerUsageManagerImpl.java
+++ b/server/src/com/cloud/network/ExternalLoadBalancerUsageManagerImpl.java
@@ -16,6 +16,22 @@
 // under the License.
 package com.cloud.network;
 
+import java.net.URI;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.TimeUnit;
+
+import javax.ejb.Local;
+import javax.inject.Inject;
+import javax.naming.ConfigurationException;
+
+import org.apache.log4j.Logger;
+import org.springframework.stereotype.Component;
+
 import com.cloud.agent.AgentManager;
 import com.cloud.agent.api.ExternalNetworkResourceUsageAnswer;
 import com.cloud.agent.api.ExternalNetworkResourceUsageCommand;
@@ -48,6 +64,7 @@ import com.cloud.network.dao.NetworkServiceMapDao;
 import com.cloud.network.dao.NetworkVO;
 import com.cloud.network.dao.PhysicalNetworkDao;
 import com.cloud.network.dao.PhysicalNetworkServiceProviderDao;
+import com.cloud.network.rules.LoadBalancerContainer.Scheme;
 import com.cloud.network.rules.PortForwardingRuleVO;
 import com.cloud.network.rules.dao.PortForwardingRulesDao;
 import com.cloud.offerings.dao.NetworkOfferingDao;
@@ -68,20 +85,6 @@ import com.cloud.vm.DomainRouterVO;
 import com.cloud.vm.NicVO;
 import com.cloud.vm.dao.DomainRouterDao;
 import com.cloud.vm.dao.NicDao;
-import org.apache.log4j.Logger;
-import org.springframework.stereotype.Component;
-
-import javax.ejb.Local;
-import javax.inject.Inject;
-import javax.naming.ConfigurationException;
-import java.net.URI;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.concurrent.Executors;
-import java.util.concurrent.ScheduledExecutorService;
-import java.util.concurrent.TimeUnit;
 
 @Component
 @Local(value = { ExternalLoadBalancerUsageManager.class })
@@ -647,9 +650,10 @@ public class ExternalLoadBalancerUsageManagerImpl extends ManagerBase implements
                 // If an external load balancer is added, manage one entry for each load balancing rule in this network
                 if (externalLoadBalancer != null && lbAnswer != null) {
                     boolean inline = _networkMgr.isNetworkInlineMode(network);
-                    List<LoadBalancerVO> loadBalancers = _loadBalancerDao.listByNetworkId(network.getId());
+                    List<LoadBalancerVO> loadBalancers = _loadBalancerDao.listByNetworkIdAndScheme(network.getId(), Scheme.Public);
                     for (LoadBalancerVO loadBalancer : loadBalancers) {
                         String publicIp = _networkMgr.getIp(loadBalancer.getSourceIpAddressId()).getAddress().addr();
+                        
                         if (!createOrUpdateStatsEntry(create, accountId, zoneId, network.getId(), publicIp, externalLoadBalancer.getId(), lbAnswer, inline)) {
                             throw new ExecutionException(networkErrorMsg + ", load balancing rule public IP = " + publicIp);
                         }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2660a6b7/server/src/com/cloud/network/NetworkManager.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/NetworkManager.java b/server/src/com/cloud/network/NetworkManager.java
index 4af716c..34a092a 100755
--- a/server/src/com/cloud/network/NetworkManager.java
+++ b/server/src/com/cloud/network/NetworkManager.java
@@ -43,6 +43,7 @@ import com.cloud.network.element.StaticNatServiceProvider;
 import com.cloud.network.element.UserDataServiceProvider;
 import com.cloud.network.guru.NetworkGuru;
 import com.cloud.network.rules.FirewallRule;
+import com.cloud.network.rules.LoadBalancerContainer.Scheme;
 import com.cloud.network.rules.StaticNat;
 import com.cloud.offering.NetworkOffering;
 import com.cloud.offerings.NetworkOfferingVO;
@@ -333,7 +334,7 @@ public interface NetworkManager  {
 
     int getRuleCountForIp(Long addressId, FirewallRule.Purpose purpose, FirewallRule.State state);
 
-    LoadBalancingServiceProvider getLoadBalancingProviderForNetwork(Network network);
+    LoadBalancingServiceProvider getLoadBalancingProviderForNetwork(Network network, Scheme lbScheme);
 
 
     boolean isSecondaryIpSetForNic(long nicId);

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2660a6b7/server/src/com/cloud/network/NetworkManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/NetworkManagerImpl.java b/server/src/com/cloud/network/NetworkManagerImpl.java
index 4fffbc1..c912430 100755
--- a/server/src/com/cloud/network/NetworkManagerImpl.java
+++ b/server/src/com/cloud/network/NetworkManagerImpl.java
@@ -62,6 +62,13 @@ import com.cloud.network.guru.NetworkGuru;
 import com.cloud.network.lb.LoadBalancingRulesManager;
 import com.cloud.network.rules.*;
 import com.cloud.network.rules.FirewallRule.Purpose;
+import com.cloud.network.rules.FirewallRuleVO;
+import com.cloud.network.rules.LoadBalancerContainer.Scheme;
+import com.cloud.network.rules.PortForwardingRuleVO;
+import com.cloud.network.rules.RulesManager;
+import com.cloud.network.rules.StaticNat;
+import com.cloud.network.rules.StaticNatRule;
+import com.cloud.network.rules.StaticNatRuleImpl;
 import com.cloud.network.rules.dao.PortForwardingRulesDao;
 import com.cloud.network.vpc.NetworkACLManager;
 import com.cloud.network.vpc.VpcManager;
@@ -72,6 +79,7 @@ import com.cloud.offering.NetworkOffering.Availability;
 import com.cloud.offerings.NetworkOfferingServiceMapVO;
 import com.cloud.offerings.NetworkOfferingVO;
 import com.cloud.offerings.dao.NetworkOfferingDao;
+import com.cloud.offerings.dao.NetworkOfferingDetailsDao;
 import com.cloud.offerings.dao.NetworkOfferingServiceMapDao;
 import com.cloud.org.Grouping;
 import com.cloud.user.*;
@@ -156,6 +164,8 @@ public class NetworkManagerImpl extends ManagerBase implements NetworkManager, L
     @Inject
     PodVlanMapDao _podVlanMapDao;
     @Inject
+    NetworkOfferingDetailsDao _ntwkOffDetailsDao;
+    @Inject
     ConfigurationServer _configServer;
     @Inject
     AccountGuestVlanMapDao _accountGuestVlanMapDao;
@@ -948,7 +958,7 @@ public class NetworkManagerImpl extends ManagerBase implements NetworkManager, L
                     _configMgr.createNetworkOffering(NetworkOffering.QuickCloudNoServices,
                             "Offering for QuickCloud with no services", TrafficType.Guest, null, true,
                             Availability.Optional, null, new HashMap<Network.Service, Set<Network.Provider>>(), true,
-                            Network.GuestType.Shared, false, null, true, null, true, false);
+                            Network.GuestType.Shared, false, null, true, null, true, false, null);
             offering.setState(NetworkOffering.State.Enabled);
             _networkOfferingDao.update(offering.getId(), offering);
         }
@@ -957,14 +967,14 @@ public class NetworkManagerImpl extends ManagerBase implements NetworkManager, L
                     _configMgr.createNetworkOffering(NetworkOffering.DefaultSharedNetworkOfferingWithSGService,
                             "Offering for Shared Security group enabled networks", TrafficType.Guest, null, true,
                             Availability.Optional, null, defaultSharedNetworkOfferingProviders, true,
-                            Network.GuestType.Shared, false, null, true, null, true, false);
+                            Network.GuestType.Shared, false, null, true, null, true, false, null);
             offering.setState(NetworkOffering.State.Enabled);
             _networkOfferingDao.update(offering.getId(), offering);
         }
 
         if (_networkOfferingDao.findByUniqueName(NetworkOffering.DefaultSharedNetworkOffering) == null) {
             offering = _configMgr.createNetworkOffering(NetworkOffering.DefaultSharedNetworkOffering, "Offering for Shared networks", TrafficType.Guest, null, true, Availability.Optional, null,
-                    defaultSharedNetworkOfferingProviders, true, Network.GuestType.Shared, false, null, true, null, true, false);
+                    defaultSharedNetworkOfferingProviders, true, Network.GuestType.Shared, false, null, true, null, true, false, null);
             offering.setState(NetworkOffering.State.Enabled);
             _networkOfferingDao.update(offering.getId(), offering);
         }
@@ -987,7 +997,7 @@ public class NetworkManagerImpl extends ManagerBase implements NetworkManager, L
             offering = _configMgr.createNetworkOffering(NetworkOffering.DefaultIsolatedNetworkOfferingWithSourceNatService,
                     "Offering for Isolated networks with Source Nat service enabled", TrafficType.Guest,
                     null, false, Availability.Required, null, defaultINetworkOfferingProvidersForVpcNetwork,
-                    true, Network.GuestType.Isolated, false, null, true, null, false, false);
+                    true, Network.GuestType.Isolated, false, null, true, null, false, false, null);
             offering.setState(NetworkOffering.State.Enabled);
             _networkOfferingDao.update(offering.getId(), offering);
         }
@@ -996,7 +1006,7 @@ public class NetworkManagerImpl extends ManagerBase implements NetworkManager, L
             offering = _configMgr.createNetworkOffering(NetworkOffering.DefaultIsolatedNetworkOfferingForVpcNetworks,
                     "Offering for Isolated VPC networks with Source Nat service enabled", TrafficType.Guest,
                     null, false, Availability.Optional, null, defaultVPCOffProviders,
-                    true, Network.GuestType.Isolated, false, null, false, null, false, false);
+                    true, Network.GuestType.Isolated, false, null, false, null, false, false, null);
             offering.setState(NetworkOffering.State.Enabled);
             _networkOfferingDao.update(offering.getId(), offering);
         }
@@ -1007,7 +1017,7 @@ public class NetworkManagerImpl extends ManagerBase implements NetworkManager, L
             offering = _configMgr.createNetworkOffering(NetworkOffering.DefaultIsolatedNetworkOfferingForVpcNetworksNoLB,
                     "Offering for Isolated VPC networks with Source Nat service enabled and LB service disabled", TrafficType.Guest,
                     null, false, Availability.Optional, null, defaultVPCOffProviders,
-                    true, Network.GuestType.Isolated, false, null, false, null, false, false);
+                    true, Network.GuestType.Isolated, false, null, false, null, false, false, null);
             offering.setState(NetworkOffering.State.Enabled);
             _networkOfferingDao.update(offering.getId(), offering);
         }
@@ -1016,7 +1026,7 @@ public class NetworkManagerImpl extends ManagerBase implements NetworkManager, L
             offering = _configMgr.createNetworkOffering(NetworkOffering.DefaultIsolatedNetworkOffering,
                     "Offering for Isolated networks with no Source Nat service", TrafficType.Guest, null, true,
                     Availability.Optional, null, defaultIsolatedNetworkOfferingProviders, true, Network.GuestType.Isolated,
-                    false, null, true, null, true, false);
+                    false, null, true, null, true, false, null);
             offering.setState(NetworkOffering.State.Enabled);
             _networkOfferingDao.update(offering.getId(), offering);
         }
@@ -1045,7 +1055,7 @@ public class NetworkManagerImpl extends ManagerBase implements NetworkManager, L
 
         if (_networkOfferingDao.findByUniqueName(NetworkOffering.DefaultSharedEIPandELBNetworkOffering) == null) {
             offering = _configMgr.createNetworkOffering(NetworkOffering.DefaultSharedEIPandELBNetworkOffering, "Offering for Shared networks with Elastic IP and Elastic LB capabilities", TrafficType.Guest, null, true,
-                    Availability.Optional, null, netscalerServiceProviders, true, Network.GuestType.Shared, false, null, true, serviceCapabilityMap, true, false);
+                    Availability.Optional, null, netscalerServiceProviders, true, Network.GuestType.Shared, false, null, true, serviceCapabilityMap, true, false, null);
             offering.setState(NetworkOffering.State.Enabled);
             offering.setDedicatedLB(false);
             _networkOfferingDao.update(offering.getId(), offering);
@@ -2651,9 +2661,15 @@ public class NetworkManagerImpl extends ManagerBase implements NetworkManager, L
             success = false;
         }
 
-        // apply load balancer rules
-        if (!_lbMgr.applyLoadBalancersForNetwork(networkId)) {
-            s_logger.warn("Failed to reapply load balancer rules as a part of network id=" + networkId + " restart");
+        // apply public load balancer rules
+        if (!_lbMgr.applyLoadBalancersForNetwork(networkId, Scheme.Public)) {
+            s_logger.warn("Failed to reapply Public load balancer rules as a part of network id=" + networkId + " restart");
+            success = false;
+        }
+        
+        // apply internal load balancer rules
+        if (!_lbMgr.applyLoadBalancersForNetwork(networkId, Scheme.Internal)) {
+            s_logger.warn("Failed to reapply internal load balancer rules as a part of network id=" + networkId + " restart");
             success = false;
         }
 
@@ -3234,12 +3250,22 @@ public class NetworkManagerImpl extends ManagerBase implements NetworkManager, L
         }
 
         try {
-            if (!_lbMgr.revokeLoadBalancersForNetwork(networkId)) {
-                s_logger.warn("Failed to cleanup lb rules as a part of shutdownNetworkRules");
+            if (!_lbMgr.revokeLoadBalancersForNetwork(networkId, Scheme.Public)) {
+                s_logger.warn("Failed to cleanup public lb rules as a part of shutdownNetworkRules");
+                success = false;
+            }
+        } catch (ResourceUnavailableException ex) {
+            s_logger.warn("Failed to cleanup public lb rules as a part of shutdownNetworkRules due to ", ex);
+            success = false;
+        }
+        
+        try {
+            if (!_lbMgr.revokeLoadBalancersForNetwork(networkId, Scheme.Internal)) {
+                s_logger.warn("Failed to cleanup internal lb rules as a part of shutdownNetworkRules");
                 success = false;
             }
         } catch (ResourceUnavailableException ex) {
-            s_logger.warn("Failed to cleanup lb rules as a part of shutdownNetworkRules due to ", ex);
+            s_logger.warn("Failed to cleanup public lb rules as a part of shutdownNetworkRules due to ", ex);
             success = false;
         }
 
@@ -3645,7 +3671,7 @@ public class NetworkManagerImpl extends ManagerBase implements NetworkManager, L
                 }
             }
         } else {
-            NicVO nicVO = _nicDao.findByInstanceIdAndNetworkId(network.getId(), vm.getId());
+            NicVO nicVO = _nicDao.findByNtwkIdAndInstanceId(network.getId(), vm.getId());
             if (nicVO != null) {
                 nic = _networkModel.getNicProfile(vm, network.getId(), null);
             }
@@ -3747,35 +3773,62 @@ public class NetworkManagerImpl extends ManagerBase implements NetworkManager, L
         return null;
     }
 
-    protected NetworkElement getElementForServiceInNetwork(Network network, Service service) {
+    protected List<NetworkElement> getElementForServiceInNetwork(Network network, Service service) {
+        List<NetworkElement> elements = new ArrayList<NetworkElement>();
         List<Provider> providers = getProvidersForServiceInNetwork(network, service);
         //Only support one provider now
         if (providers == null)  {
             s_logger.error("Cannot find " + service.getName() + " provider for network " + network.getId());
             return null;
         }
-        if (providers.size() != 1) {
+        if (providers.size() != 1 && service != Service.Lb) {
+            //support more than one LB providers only
             s_logger.error("Found " + providers.size() + " " + service.getName() + " providers for network!" + network.getId());
             return null;
+        } 
+        
+        for (Provider provider : providers) {
+            NetworkElement element = _networkModel.getElementImplementingProvider(provider.getName());
+            s_logger.info("Let " + element.getName() + " handle " + service.getName() + " in network " + network.getId());
+            elements.add(element);
         }
-        NetworkElement element = _networkModel.getElementImplementingProvider(providers.get(0).getName());
-        s_logger.info("Let " + element.getName() + " handle " + service.getName() + " in network " + network.getId());
-        return element;
+        return elements;
     }
     
     @Override
     public StaticNatServiceProvider getStaticNatProviderForNetwork(Network network) {
-        NetworkElement element = getElementForServiceInNetwork(network, Service.StaticNat);
+        //only one provider per Static nat service is supoprted
+        NetworkElement element = getElementForServiceInNetwork(network, Service.StaticNat).get(0);
         assert element instanceof StaticNatServiceProvider;
         return (StaticNatServiceProvider)element;
     }
 
     @Override
-    public LoadBalancingServiceProvider getLoadBalancingProviderForNetwork(Network network) {
-        NetworkElement element = getElementForServiceInNetwork(network, Service.Lb);
-        assert element instanceof LoadBalancingServiceProvider; 
-        return (LoadBalancingServiceProvider)element;
+    public LoadBalancingServiceProvider getLoadBalancingProviderForNetwork(Network network, Scheme lbScheme) {
+        List<NetworkElement> lbElements = getElementForServiceInNetwork(network, Service.Lb);
+        NetworkElement lbElement = null;
+        if (lbElements.size() > 1) {
+            String providerName = null;
+            //get network offering details
+            NetworkOffering off = _configMgr.getNetworkOffering(network.getNetworkOfferingId());
+            if (lbScheme == Scheme.Public) {
+                providerName = _ntwkOffDetailsDao.getDetail(off.getId(), NetworkOffering.Detail.PublicLbProvider);
+            } else {
+                providerName = _ntwkOffDetailsDao.getDetail(off.getId(), NetworkOffering.Detail.InternalLbProvider);
+            }
+            if (providerName == null) {
+                throw new InvalidParameterValueException("Can't find Lb provider supporting scheme " + lbScheme.toString() + " in network " + network);
+            }
+            lbElement =  _networkModel.getElementImplementingProvider(providerName);
+        } else if (lbElements.size() == 1){
+            lbElement = lbElements.get(0);
+        }
+                
+        assert lbElement != null;
+        assert lbElement instanceof LoadBalancingServiceProvider; 
+        return (LoadBalancingServiceProvider)lbElement;        
     }
+    
     @Override
     public boolean isNetworkInlineMode(Network network) {
         NetworkOfferingVO offering = _networkOfferingDao.findById(network.getNetworkOfferingId());

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2660a6b7/server/src/com/cloud/network/NetworkModelImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/NetworkModelImpl.java b/server/src/com/cloud/network/NetworkModelImpl.java
index eaec6a6..135fd29 100755
--- a/server/src/com/cloud/network/NetworkModelImpl.java
+++ b/server/src/com/cloud/network/NetworkModelImpl.java
@@ -32,6 +32,7 @@ import javax.ejb.Local;
 import javax.inject.Inject;
 import javax.naming.ConfigurationException;
 
+import org.apache.cloudstack.lb.dao.ApplicationLoadBalancerRuleDao;
 import org.apache.log4j.Logger;
 import org.springframework.stereotype.Component;
 
@@ -52,13 +53,11 @@ import com.cloud.exception.InvalidParameterValueException;
 import com.cloud.exception.PermissionDeniedException;
 import com.cloud.exception.UnsupportedServiceException;
 import com.cloud.hypervisor.Hypervisor.HypervisorType;
-import com.cloud.server.ConfigurationServer;
 import com.cloud.network.IpAddress.State;
 import com.cloud.network.Network.Capability;
 import com.cloud.network.Network.GuestType;
 import com.cloud.network.Network.Provider;
 import com.cloud.network.Network.Service;
-import com.cloud.network.Networks.IsolationType;
 import com.cloud.network.Networks.TrafficType;
 import com.cloud.network.addr.PublicIp;
 import com.cloud.network.dao.FirewallRulesDao;
@@ -86,11 +85,14 @@ import com.cloud.network.rules.FirewallRuleVO;
 import com.cloud.network.rules.dao.PortForwardingRulesDao;
 import com.cloud.network.vpc.dao.PrivateIpDao;
 import com.cloud.offering.NetworkOffering;
+import com.cloud.offering.NetworkOffering.Detail;
 import com.cloud.offerings.NetworkOfferingServiceMapVO;
 import com.cloud.offerings.NetworkOfferingVO;
 import com.cloud.offerings.dao.NetworkOfferingDao;
+import com.cloud.offerings.dao.NetworkOfferingDetailsDao;
 import com.cloud.offerings.dao.NetworkOfferingServiceMapDao;
 import com.cloud.projects.dao.ProjectAccountDao;
+import com.cloud.server.ConfigurationServer;
 import com.cloud.user.Account;
 import com.cloud.user.AccountVO;
 import com.cloud.user.DomainManager;
@@ -183,9 +185,13 @@ public class NetworkModelImpl extends ManagerBase implements NetworkModel {
     @Inject
     UserIpv6AddressDao _ipv6Dao;
     @Inject
-    NicSecondaryIpDao _nicSecondaryIpDao;;
+    NicSecondaryIpDao _nicSecondaryIpDao;
+    @Inject
+    ApplicationLoadBalancerRuleDao _appLbRuleDao;
     @Inject
     private ProjectAccountDao _projectAccountDao;
+    @Inject
+    NetworkOfferingDetailsDao _ntwkOffDetailsDao;
 
     private final HashMap<String, NetworkOfferingVO> _systemNetworks = new HashMap<String, NetworkOfferingVO>(5);
     static Long _privateOfferingId = null;
@@ -604,7 +610,6 @@ public class NetworkModelImpl extends ManagerBase implements NetworkModel {
             NetworkElement element = getElementImplementingProvider(instance.getProvider());
             if (element != null) {
                 Map<Service, Map<Capability, String>> elementCapabilities = element.getCapabilities();
-                ;
                 if (elementCapabilities != null) {
                     networkCapabilities.put(service, elementCapabilities.get(service));
                 }
@@ -917,7 +922,7 @@ public class NetworkModelImpl extends ManagerBase implements NetworkModel {
         boolean isUserVmsDefaultNetwork = false;
         boolean isDomRGuestOrPublicNetwork = false;
         if (vm != null) {
-            Nic nic = _nicDao.findByInstanceIdAndNetworkId(networkId, vmId);
+            Nic nic = _nicDao.findByNtwkIdAndInstanceId(networkId, vmId);
             if (vm.getType() == Type.User && nic != null && nic.isDefaultNic()) {
                 isUserVmsDefaultNetwork = true;
             } else if (vm.getType() == Type.DomainRouter && ntwkOff != null && (ntwkOff.getTrafficType() == TrafficType.Public || ntwkOff.getTrafficType() == TrafficType.Guest)) {
@@ -1465,10 +1470,8 @@ public class NetworkModelImpl extends ManagerBase implements NetworkModel {
                     throw new UnsupportedServiceException("Service " + service.getName() + " doesn't have capability " + cap.getName() + " for element=" + element.getName() + " implementing Provider="
                             + provider.getName());
                 }
-    
-                capValue = capValue.toLowerCase();
-    
-                if (!value.contains(capValue)) {
+        
+                if (!value.toLowerCase().contains(capValue.toLowerCase())) {
                     throw new UnsupportedServiceException("Service " + service.getName() + " doesn't support value " + capValue + " for capability " + cap.getName() + " for element=" + element.getName()
                             + " implementing Provider=" + provider.getName());
                 }
@@ -1664,9 +1667,7 @@ public class NetworkModelImpl extends ManagerBase implements NetworkModel {
     @Override
     public Set<Long> getAvailableIps(Network network, String requestedIp) {
         String[] cidr = network.getCidr().split("/");
-        List<String> ips = _nicDao.listIpAddressInNetwork(network.getId());
-        List<String> secondaryIps = _nicSecondaryIpDao.listSecondaryIpAddressInNetwork(network.getId());
-        ips.addAll(secondaryIps);
+        List<String> ips = getUsedIpsInNetwork(network);
         Set<Long> usedIps = new TreeSet<Long>(); 
 
         for (String ip : ips) {
@@ -1677,6 +1678,7 @@ public class NetworkModelImpl extends ManagerBase implements NetworkModel {
 
             usedIps.add(NetUtils.ip2Long(ip));
         }
+
         Set<Long> allPossibleIps = NetUtils.getAllIpsFromCidr(cidr[0], Integer.parseInt(cidr[1]), usedIps);
 
         String gateway = network.getGateway();
@@ -1685,6 +1687,19 @@ public class NetworkModelImpl extends ManagerBase implements NetworkModel {
 
         return allPossibleIps;
     }
+    
+    @Override
+    public List<String> getUsedIpsInNetwork(Network network) {
+        //Get all ips used by vms nics
+        List<String> ips = _nicDao.listIpAddressInNetwork(network.getId());
+        //Get all secondary ips for nics
+        List<String> secondaryIps = _nicSecondaryIpDao.listSecondaryIpAddressInNetwork(network.getId());
+        ips.addAll(secondaryIps);
+        //Get ips used by load balancers
+        List<String> lbIps = _appLbRuleDao.listLbIpsBySourceIpNetworkId(network.getId());
+        ips.addAll(lbIps);
+        return ips;
+    }
 
     @Override
     public String getDomainNetworkDomain(long domainId, long zoneId) {
@@ -1792,7 +1807,7 @@ public class NetworkModelImpl extends ManagerBase implements NetworkModel {
         if (broadcastUri != null) {
             nic = _nicDao.findByNetworkIdInstanceIdAndBroadcastUri(networkId, vm.getId(), broadcastUri);
         } else {
-           nic =  _nicDao.findByInstanceIdAndNetworkId(networkId, vm.getId());
+           nic =  _nicDao.findByNtwkIdAndInstanceId(networkId, vm.getId());
         }
         if (nic == null) {
            return null;
@@ -2051,6 +2066,22 @@ public class NetworkModelImpl extends ManagerBase implements NetworkModel {
         return null;
     }
     
+
+    @Override
+    public IpAddress getPublicIpAddress(String ipAddress, long zoneId) {
+        List<? extends Network> networks = _networksDao.listByZoneAndTrafficType(zoneId, TrafficType.Public);
+        if (networks.isEmpty() || networks.size() > 1) {
+            throw new CloudRuntimeException("Can't find public network in the zone specified");
+        }
+        
+        return _ipAddressDao.findByIpAndSourceNetworkId(networks.get(0).getId(), ipAddress);
+    }
+    
+    @Override
+    public Map<Detail, String> getNtwkOffDetails(long offId) {
+        return _ntwkOffDetailsDao.getNtwkOffDetails(offId);
+    }
+
     
     @Override
     public Networks.IsolationType[] listNetworkIsolationMethods() {

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2660a6b7/server/src/com/cloud/network/NetworkServiceImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/NetworkServiceImpl.java b/server/src/com/cloud/network/NetworkServiceImpl.java
index f44688c..8815558 100755
--- a/server/src/com/cloud/network/NetworkServiceImpl.java
+++ b/server/src/com/cloud/network/NetworkServiceImpl.java
@@ -47,6 +47,7 @@ import org.apache.cloudstack.api.command.user.network.CreateNetworkCmd;
 import org.apache.cloudstack.api.command.user.network.ListNetworksCmd;
 import org.apache.cloudstack.api.command.user.network.RestartNetworkCmd;
 import org.apache.cloudstack.api.command.user.vm.ListNicsCmd;
+import org.apache.cloudstack.network.element.InternalLoadBalancerElementService;
 import org.apache.log4j.Logger;
 import org.springframework.stereotype.Component;
 
@@ -170,6 +171,33 @@ import com.cloud.vm.dao.NicSecondaryIpDao;
 import com.cloud.vm.dao.NicSecondaryIpVO;
 import com.cloud.vm.dao.UserVmDao;
 import com.cloud.vm.dao.VMInstanceDao;
+import com.cloud.vm.*;
+import com.cloud.vm.dao.*;
+import org.apache.cloudstack.acl.ControlledEntity.ACLType;
+import org.apache.cloudstack.acl.SecurityChecker;
+import org.apache.cloudstack.acl.SecurityChecker.AccessType;
+import org.apache.cloudstack.api.command.admin.network.DedicateGuestVlanRangeCmd;
+import org.apache.cloudstack.api.command.admin.network.ListDedicatedGuestVlanRangesCmd;
+import org.apache.cloudstack.api.command.admin.usage.ListTrafficTypeImplementorsCmd;
+import org.apache.cloudstack.api.command.user.network.CreateNetworkCmd;
+import org.apache.cloudstack.api.command.user.network.ListNetworksCmd;
+import org.apache.cloudstack.api.command.user.network.RestartNetworkCmd;
+import org.apache.cloudstack.api.command.user.vm.ListNicsCmd;
+import org.apache.log4j.Logger;
+import org.springframework.stereotype.Component;
+
+import javax.ejb.Local;
+import javax.inject.Inject;
+import javax.naming.ConfigurationException;
+import java.net.Inet6Address;
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+import java.security.InvalidParameterException;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.*;
+
 
 /**
  * NetworkServiceImpl implements NetworkService.
@@ -267,6 +295,8 @@ public class NetworkServiceImpl extends ManagerBase implements  NetworkService {
     HostDao _hostDao;
     @Inject
     HostPodDao _hostPodDao;
+    @Inject 
+    InternalLoadBalancerElementService _internalLbElementSvc;
     @Inject
     DataCenterVnetDao _datacneter_vnet;
     @Inject
@@ -1187,6 +1217,10 @@ public class NetworkServiceImpl extends ManagerBase implements  NetworkService {
             if (_configMgr.isOfferingForVpc(ntwkOff)){
                 throw new InvalidParameterValueException("Network offering can be used for VPC networks only");
             }
+            if (ntwkOff.getInternalLb()) {
+                throw new InvalidParameterValueException("Internal Lb can be enabled on vpc networks only");
+            }
+
             network = _networkMgr.createGuestNetwork(networkOfferingId, name, displayText, gateway, cidr, vlanId,
             		networkDomain, owner, sharedDomainId, pNtwk, zoneId, aclType, subdomainAccess, vpcId, ip6Gateway, ip6Cidr);
         }
@@ -2134,8 +2168,6 @@ public class NetworkServiceImpl extends ManagerBase implements  NetworkService {
     }
 
 
-
-
     protected Set<Long> getAvailableIps(Network network, String requestedIp) {
         String[] cidr = network.getCidr().split("/");
         List<String> ips = _nicDao.listIpAddressInNetwork(network.getId());
@@ -2159,7 +2191,6 @@ public class NetworkServiceImpl extends ManagerBase implements  NetworkService {
     }
 
 
-
     protected boolean canUpgrade(Network network, long oldNetworkOfferingId, long newNetworkOfferingId) {
         NetworkOffering oldNetworkOffering = _networkOfferingDao.findByIdIncludingRemoved(oldNetworkOfferingId);
         NetworkOffering newNetworkOffering = _networkOfferingDao.findById(newNetworkOfferingId);
@@ -2225,6 +2256,14 @@ public class NetworkServiceImpl extends ManagerBase implements  NetworkService {
                 return false;
             }
         }
+        
+        //can't update from internal LB to public LB
+        if (areServicesSupportedByNetworkOffering(oldNetworkOfferingId, Service.Lb) && areServicesSupportedByNetworkOffering(newNetworkOfferingId, Service.Lb)) {
+            if (oldNetworkOffering.getPublicLb() != newNetworkOffering.getPublicLb() || oldNetworkOffering.getInternalLb() != newNetworkOffering.getInternalLb()) {
+                throw new InvalidParameterValueException("Original and new offerings support different types of LB - Internal vs Public," +
+                		" can't upgrade");
+            }
+        }
 
         return canIpsUseOffering(publicIps, newNetworkOfferingId);
     }
@@ -2345,7 +2384,10 @@ public class NetworkServiceImpl extends ManagerBase implements  NetworkService {
 
             // add baremetal as the defualt network service provider
             /* addDefaultBaremetalProvidersToPhysicalNetwork(pNetwork.getId()); */
-
+            
+            //Add Internal Load Balancer element as a default network service provider
+            addDefaultInternalLbProviderToPhysicalNetwork(pNetwork.getId());
+            
             txn.commit();
             return pNetwork;
         } catch (Exception ex) {
@@ -3564,6 +3606,22 @@ public class NetworkServiceImpl extends ManagerBase implements  NetworkService {
 
         return nsp;
     }
+    
+    
+    protected PhysicalNetworkServiceProvider addDefaultInternalLbProviderToPhysicalNetwork(long physicalNetworkId) {
+
+        PhysicalNetworkServiceProvider nsp = addProviderToPhysicalNetwork(physicalNetworkId, 
+                Network.Provider.InternalLbVm.getName(), null, null);
+ 
+        NetworkElement networkElement =  _networkModel.getElementImplementingProvider(Network.Provider.InternalLbVm.getName());
+        if (networkElement == null) {
+            throw new CloudRuntimeException("Unable to find the Network Element implementing the " + Network.Provider.InternalLbVm.getName() + " Provider");
+        }
+        
+        _internalLbElementSvc.addInternalLoadBalancerElement(nsp.getId());
+
+        return nsp;
+    }
 
     protected PhysicalNetworkServiceProvider addDefaultSecurityGroupProviderToPhysicalNetwork(long physicalNetworkId) {
 
@@ -3572,6 +3630,8 @@ public class NetworkServiceImpl extends ManagerBase implements  NetworkService {
 
         return nsp;
     }
+    
+    
 
     private PhysicalNetworkServiceProvider addDefaultBaremetalProvidersToPhysicalNetwork(long physicalNetworkId) {
         PhysicalNetworkVO pvo = _physicalNetworkDao.findById(physicalNetworkId);

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2660a6b7/server/src/com/cloud/network/element/VirtualRouterElement.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/element/VirtualRouterElement.java b/server/src/com/cloud/network/element/VirtualRouterElement.java
index f601f4f..28473cc 100755
--- a/server/src/com/cloud/network/element/VirtualRouterElement.java
+++ b/server/src/com/cloud/network/element/VirtualRouterElement.java
@@ -25,7 +25,6 @@ import java.util.Set;
 import javax.ejb.Local;
 import javax.inject.Inject;
 
-import com.cloud.utils.PropertiesUtil;
 import org.apache.cloudstack.api.command.admin.router.ConfigureVirtualRouterElementCmd;
 import org.apache.cloudstack.api.command.admin.router.CreateVirtualRouterElementCmd;
 import org.apache.cloudstack.api.command.admin.router.ListVirtualRouterElementsCmd;
@@ -66,6 +65,7 @@ import com.cloud.network.router.VpcVirtualNetworkApplianceManager;
 import com.cloud.network.rules.FirewallRule;
 import com.cloud.network.rules.LbStickinessMethod;
 import com.cloud.network.rules.LbStickinessMethod.StickinessMethodType;
+import com.cloud.network.rules.LoadBalancerContainer;
 import com.cloud.network.rules.PortForwardingRule;
 import com.cloud.network.rules.RulesManager;
 import com.cloud.network.rules.StaticNat;
@@ -242,7 +242,7 @@ public class VirtualRouterElement extends AdapterBase implements VirtualRouterEl
      * number like 12 2) time or tablesize like 12h, 34m, 45k, 54m , here
      * last character is non-digit but from known characters .
      */
-    private boolean containsOnlyNumbers(String str, String endChar) {
+    private static boolean containsOnlyNumbers(String str, String endChar) {
         if (str == null)
             return false;
 
@@ -271,7 +271,7 @@ public class VirtualRouterElement extends AdapterBase implements VirtualRouterEl
         return true;
     }
 
-    private boolean validateHAProxyLBRule(LoadBalancingRule rule) {
+    public static boolean validateHAProxyLBRule(LoadBalancingRule rule) {
         String timeEndChar = "dhms";
 
         for (LbStickinessPolicy stickinessPolicy : rule.getStickinessPolicies()) {
@@ -338,7 +338,9 @@ public class VirtualRouterElement extends AdapterBase implements VirtualRouterEl
 
     @Override
     public boolean validateLBRule(Network network, LoadBalancingRule rule) {
-        if (canHandle(network, Service.Lb)) {
+        List<LoadBalancingRule> rules = new ArrayList<LoadBalancingRule>();
+        rules.add(rule);
+        if (canHandle(network, Service.Lb) && canHandleLbRules(rules)) {
             List<DomainRouterVO> routers = _routerDao.listByNetworkAndRole(network.getId(), Role.VIRTUAL_ROUTER);
             if (routers == null || routers.isEmpty()) {
                 return true;
@@ -351,6 +353,10 @@ public class VirtualRouterElement extends AdapterBase implements VirtualRouterEl
     @Override
     public boolean applyLBRules(Network network, List<LoadBalancingRule> rules) throws ResourceUnavailableException {
         if (canHandle(network, Service.Lb)) {
+            if (!canHandleLbRules(rules)) {
+                return false;
+            }
+            
             List<DomainRouterVO> routers = _routerDao.listByNetworkAndRole(network.getId(), Role.VIRTUAL_ROUTER);
             if (routers == null || routers.isEmpty()) {
                 s_logger.debug("Virtual router elemnt doesn't need to apply firewall rules on the backend; virtual " +
@@ -358,8 +364,8 @@ public class VirtualRouterElement extends AdapterBase implements VirtualRouterEl
                 return true;
             }
 
-            if (!_routerMgr.applyFirewallRules(network, rules, routers)) {
-                throw new CloudRuntimeException("Failed to apply firewall rules in network " + network.getId());
+            if (!_routerMgr.applyLoadBalancingRules(network, rules, routers)) {
+                throw new CloudRuntimeException("Failed to apply load balancing rules in network " + network.getId());
             } else {
                 return true;
             }
@@ -452,7 +458,7 @@ public class VirtualRouterElement extends AdapterBase implements VirtualRouterEl
         return capabilities;
     }
 
-    private static String getHAProxyStickinessCapability() {
+    public static String getHAProxyStickinessCapability() {
         LbStickinessMethod method;
         List<LbStickinessMethod> methodList = new ArrayList<LbStickinessMethod>(1);
 
@@ -557,8 +563,8 @@ public class VirtualRouterElement extends AdapterBase implements VirtualRouterEl
         lbCapabilities.put(Capability.SupportedLBAlgorithms, "roundrobin,leastconn,source");
         lbCapabilities.put(Capability.SupportedLBIsolation, "dedicated");
         lbCapabilities.put(Capability.SupportedProtocols, "tcp, udp");
-
         lbCapabilities.put(Capability.SupportedStickinessMethods, getHAProxyStickinessCapability());
+        lbCapabilities.put(Capability.LbSchemes, LoadBalancerContainer.Scheme.Public.toString());
 
         capabilities.put(Service.Lb, lbCapabilities);
 
@@ -715,8 +721,8 @@ public class VirtualRouterElement extends AdapterBase implements VirtualRouterEl
     @Override
     public VirtualRouterProvider configure(ConfigureVirtualRouterElementCmd cmd) {
         VirtualRouterProviderVO element = _vrProviderDao.findById(cmd.getId());
-        if (element == null) {
-            s_logger.debug("Can't find element with network service provider id " + cmd.getId());
+        if (element == null || !(element.getType() == VirtualRouterProviderType.VirtualRouter || element.getType() == VirtualRouterProviderType.VPCVirtualRouter)) {
+            s_logger.debug("Can't find Virtual Router element with network service provider id " + cmd.getId());
             return null;
         }
 
@@ -728,6 +734,10 @@ public class VirtualRouterElement extends AdapterBase implements VirtualRouterEl
 
     @Override
     public VirtualRouterProvider addElement(Long nspId, VirtualRouterProviderType providerType) {
+        if (!(providerType == VirtualRouterProviderType.VirtualRouter || providerType == VirtualRouterProviderType.VPCVirtualRouter)) {
+            throw new InvalidParameterValueException("Element " + this.getName() + " supports only providerTypes: " + 
+        VirtualRouterProviderType.VirtualRouter.toString() + " and " + VirtualRouterProviderType.VPCVirtualRouter);
+        }
         VirtualRouterProviderVO element = _vrProviderDao.findByNspIdAndType(nspId, providerType);
         if (element != null) {
             s_logger.debug("There is already a virtual router element with service provider id " + nspId);
@@ -801,7 +811,11 @@ public class VirtualRouterElement extends AdapterBase implements VirtualRouterEl
 
     @Override
     public VirtualRouterProvider getCreatedElement(long id) {
-        return _vrProviderDao.findById(id);
+        VirtualRouterProvider provider = _vrProviderDao.findById(id);
+        if (!(provider.getType() == VirtualRouterProviderType.VirtualRouter || provider.getType() == VirtualRouterProviderType.VPCVirtualRouter)) {
+            throw new InvalidParameterValueException("Unable to find provider by id");
+        }
+        return provider;
     }
 
     @Override
@@ -911,6 +925,10 @@ public class VirtualRouterElement extends AdapterBase implements VirtualRouterEl
         if (enabled != null) {
             sc.addAnd(sc.getEntity().isEnabled(), Op.EQ, enabled);
         }
+        
+        //return only VR and VPC VR
+        sc.addAnd(sc.getEntity().getType(), Op.IN, VirtualRouterProvider.VirtualRouterProviderType.VPCVirtualRouter, VirtualRouterProvider.VirtualRouterProviderType.VirtualRouter);
+        
         return sc.list();
     }
 
@@ -946,4 +964,20 @@ public class VirtualRouterElement extends AdapterBase implements VirtualRouterEl
 		// TODO Auto-generated method stub
 		return null;
 	}
+	
+	private boolean canHandleLbRules(List<LoadBalancingRule> rules) {
+	    Map<Capability, String> lbCaps = this.getCapabilities().get(Service.Lb);
+	    if (!lbCaps.isEmpty()) {
+	        String schemeCaps = lbCaps.get(Capability.LbSchemes);
+	        if (schemeCaps != null) {
+	            for (LoadBalancingRule rule : rules) {
+	                if (!schemeCaps.contains(rule.getScheme().toString())) {
+	                    s_logger.debug("Scheme " + rules.get(0).getScheme() + " is not supported by the provider " + this.getName());
+	                    return false;
+	                }
+	            }
+	        }
+	    }
+	    return true;
+	}
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2660a6b7/server/src/com/cloud/network/firewall/FirewallManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/firewall/FirewallManagerImpl.java b/server/src/com/cloud/network/firewall/FirewallManagerImpl.java
index 4ad8868..def4c1e 100644
--- a/server/src/com/cloud/network/firewall/FirewallManagerImpl.java
+++ b/server/src/com/cloud/network/firewall/FirewallManagerImpl.java
@@ -27,17 +27,12 @@ import javax.ejb.Local;
 import javax.inject.Inject;
 import javax.naming.ConfigurationException;
 
+import org.apache.cloudstack.api.command.user.firewall.ListEgressFirewallRulesCmd;
 import com.cloud.network.dao.*;
 import org.apache.cloudstack.api.command.user.firewall.ListFirewallRulesCmd;
 import org.apache.log4j.Logger;
 import org.springframework.stereotype.Component;
 
-import com.mysql.jdbc.ConnectionPropertiesImpl;
-import org.apache.log4j.Logger;
-
-import org.apache.cloudstack.api.BaseListCmd;
-import org.apache.cloudstack.api.command.user.firewall.ListEgressFirewallRulesCmd;
-import org.apache.cloudstack.api.command.user.firewall.ListFirewallRulesCmd;
 import com.cloud.configuration.Config;
 import com.cloud.configuration.dao.ConfigurationDao;
 import com.cloud.domain.dao.DomainDao;
@@ -53,7 +48,6 @@ import com.cloud.network.IpAddress;
 import com.cloud.network.Network;
 import com.cloud.network.Network.Capability;
 import com.cloud.network.Network.Service;
-import com.cloud.network.Networks.TrafficType;
 import com.cloud.network.NetworkManager;
 import com.cloud.network.NetworkModel;
 import com.cloud.network.NetworkRuleApplier;
@@ -61,10 +55,15 @@ import com.cloud.network.element.FirewallServiceProvider;
 import com.cloud.network.element.NetworkACLServiceProvider;
 import com.cloud.network.element.PortForwardingServiceProvider;
 import com.cloud.network.element.StaticNatServiceProvider;
-import com.cloud.network.rules.*;
+import com.cloud.network.rules.FirewallManager;
+import com.cloud.network.rules.FirewallRule;
 import com.cloud.network.rules.FirewallRule.FirewallRuleType;
 import com.cloud.network.rules.FirewallRule.Purpose;
 import com.cloud.network.rules.FirewallRule.State;
+import com.cloud.network.rules.FirewallRuleVO;
+import com.cloud.network.rules.PortForwardingRule;
+import com.cloud.network.rules.PortForwardingRuleVO;
+import com.cloud.network.rules.StaticNat;
 import com.cloud.network.rules.dao.PortForwardingRulesDao;
 import com.cloud.network.vpc.VpcManager;
 import com.cloud.projects.Project.ListProjectResourcesCriteria;
@@ -83,8 +82,8 @@ import com.cloud.utils.db.Filter;
 import com.cloud.utils.db.JoinBuilder;
 import com.cloud.utils.db.SearchBuilder;
 import com.cloud.utils.db.SearchCriteria;
-import com.cloud.utils.db.*;
 import com.cloud.utils.db.SearchCriteria.Op;
+import com.cloud.utils.db.Transaction;
 import com.cloud.utils.exception.CloudRuntimeException;
 import com.cloud.utils.net.NetUtils;
 import com.cloud.vm.UserVmVO;
@@ -438,22 +437,28 @@ public class FirewallManagerImpl extends ManagerBase implements FirewallService,
             return;
         }
 
-        if (ipAddress!=null){
-        if (ipAddress.getAssociatedWithNetworkId() == null) {
-                throw new InvalidParameterValueException("Unable to create firewall rule ; ip with specified id is not associated with any network");
-        } else {
-            networkId = ipAddress.getAssociatedWithNetworkId();
-        }
-
+        if (ipAddress != null){
+            if (ipAddress.getAssociatedWithNetworkId() == null) {
+                    throw new InvalidParameterValueException("Unable to create firewall rule ; ip with specified id is not associated with any network");
+            } else {
+                networkId = ipAddress.getAssociatedWithNetworkId();
+            }
+    
             // Validate ip address
             _accountMgr.checkAccess(caller, null, true, ipAddress);
-
+        }
+        
+        //network id either has to be passed explicitly, or implicitly as a part of ipAddress object 
+        if (networkId == null) {
+            throw new InvalidParameterValueException("Unable to retrieve network id to validate the rule");
+        }
+    
         Network network = _networkModel.getNetwork(networkId);
-        assert network != null : "Can't create port forwarding rule as network associated with public ip address is null?";
+        assert network != null : "Can't create rule as network associated with public ip address is null?";
 
-            if (trafficType == FirewallRule.TrafficType.Egress) {
-                _accountMgr.checkAccess(caller, null, true, network);
-            }
+        if (trafficType == FirewallRule.TrafficType.Egress) {
+            _accountMgr.checkAccess(caller, null, true, network);
+        }
 
         // Verify that the network guru supports the protocol specified
         Map<Network.Capability, String> caps = null;
@@ -464,32 +469,32 @@ public class FirewallManagerImpl extends ManagerBase implements FirewallService,
             }
         } else if (purpose == Purpose.PortForwarding) {
             caps = _networkModel.getNetworkServiceCapabilities(network.getId(), Service.PortForwarding);
-            }else if (purpose == Purpose.Firewall){
-                caps = _networkModel.getNetworkServiceCapabilities(network.getId(),Service.Firewall);
+        } else if (purpose == Purpose.Firewall){
+            caps = _networkModel.getNetworkServiceCapabilities(network.getId(),Service.Firewall);
         }
 
         if (caps != null) {
-                String supportedProtocols;
-                String supportedTrafficTypes = null;
-                if (purpose == FirewallRule.Purpose.Firewall) {
-                    supportedTrafficTypes = caps.get(Capability.SupportedTrafficDirection).toLowerCase();
-                }
+            String supportedProtocols;
+            String supportedTrafficTypes = null;
+            if (purpose == FirewallRule.Purpose.Firewall) {
+                supportedTrafficTypes = caps.get(Capability.SupportedTrafficDirection).toLowerCase();
+            }
 
-                if (purpose == FirewallRule.Purpose.Firewall && trafficType == FirewallRule.TrafficType.Egress) {
-                    supportedProtocols = caps.get(Capability.SupportedEgressProtocols).toLowerCase();
-                } else {
-                    supportedProtocols = caps.get(Capability.SupportedProtocols).toLowerCase();
-                }
+            if (purpose == FirewallRule.Purpose.Firewall && trafficType == FirewallRule.TrafficType.Egress) {
+                supportedProtocols = caps.get(Capability.SupportedEgressProtocols).toLowerCase();
+            } else {
+                supportedProtocols = caps.get(Capability.SupportedProtocols).toLowerCase();
+            }
 
             if (!supportedProtocols.contains(proto.toLowerCase())) {
                 throw new InvalidParameterValueException("Protocol " + proto + " is not supported in zone " + network.getDataCenterId());
             } else if (proto.equalsIgnoreCase(NetUtils.ICMP_PROTO) && purpose != Purpose.Firewall) {
                 throw new InvalidParameterValueException("Protocol " + proto + " is currently supported only for rules with purpose " + Purpose.Firewall);
-                } else if (purpose == Purpose.Firewall && !supportedTrafficTypes.contains(trafficType.toString().toLowerCase())) {
-                    throw new InvalidParameterValueException("Traffic Type " + trafficType + " is currently supported by Firewall in network " + networkId);
-                }
+            } else if (purpose == Purpose.Firewall && !supportedTrafficTypes.contains(trafficType.toString().toLowerCase())) {
+                throw new InvalidParameterValueException("Traffic Type " + trafficType + " is currently supported by Firewall in network " + networkId);
             }
         }
+        
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2660a6b7/server/src/com/cloud/network/guru/GuestNetworkGuru.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/guru/GuestNetworkGuru.java b/server/src/com/cloud/network/guru/GuestNetworkGuru.java
index 291e3cc..32ce744 100755
--- a/server/src/com/cloud/network/guru/GuestNetworkGuru.java
+++ b/server/src/com/cloud/network/guru/GuestNetworkGuru.java
@@ -223,48 +223,7 @@ public abstract class GuestNetworkGuru extends AdapterBase implements NetworkGur
             nic.deallocate();
         }
     }
-
-    public Ip4Address acquireIp4Address(Network network, Ip4Address requestedIp, String reservationId) {
-        List<String> ips = _nicDao.listIpAddressInNetwork(network.getId());
-        String[] cidr = network.getCidr().split("/");
-        SortedSet<Long> usedIps = new TreeSet<Long>();
-
-        if (requestedIp != null && requestedIp.equals(network.getGateway())) {
-            s_logger.warn("Requested ip address " + requestedIp + " is used as a gateway address in network " + network);
-            return null;
-        }
-
-        for (String ip : ips) {
-            usedIps.add(NetUtils.ip2Long(ip));
-        }
-
-        if (network.getGateway() != null) {
-            usedIps.add(NetUtils.ip2Long(network.getGateway()));
-        }
-
-        if (requestedIp != null) {
-            if (usedIps.contains(requestedIp.toLong())) {
-                s_logger.warn("Requested ip address " + requestedIp + " is already in used in " + network);
-                return null;
-            }
-            //check that requested ip has the same cidr
-            boolean isSameCidr = NetUtils.sameSubnetCIDR(requestedIp.ip4(), cidr[0], Integer.parseInt(cidr[1]));
-            if (!isSameCidr) {
-                s_logger.warn("Requested ip address " + requestedIp + " doesn't belong to the network " + network + " cidr");
-                return null;
-            }
-
-            return requestedIp;
-        }
-
-        long ip = NetUtils.getRandomIpFromCidr(cidr[0], Integer.parseInt(cidr[1]), usedIps);
-        if (ip == -1) {
-            s_logger.warn("Unable to allocate any more ip address in " + network);
-            return null;
-        }
-
-        return new Ip4Address(ip);
-    }
+    
 
     public int getVlanOffset(long physicalNetworkId, int vlanTag) {
         PhysicalNetworkVO pNetwork = _physicalNetworkDao.findById(physicalNetworkId);

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2660a6b7/server/src/com/cloud/network/lb/LBHealthCheckManager.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/lb/LBHealthCheckManager.java b/server/src/com/cloud/network/lb/LBHealthCheckManager.java
index 2e24965..a9969eb 100644
--- a/server/src/com/cloud/network/lb/LBHealthCheckManager.java
+++ b/server/src/com/cloud/network/lb/LBHealthCheckManager.java
@@ -16,9 +16,11 @@
 // under the License.
 package com.cloud.network.lb;
 
+import com.cloud.network.rules.LoadBalancerContainer.Scheme;
+
 
 public interface LBHealthCheckManager {
 
-    void updateLBHealthCheck();
+    void updateLBHealthCheck(Scheme scheme);
 
 }


[50/50] [abbrv] git commit: updated refs/heads/vmsync to d403974

Posted by ah...@apache.org.
Merged master to vmsync


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

Branch: refs/heads/vmsync
Commit: d4039743d2094ae0868914232de8f397b741a953
Parents: c7530db 0749013
Author: Alex Huang <al...@gmail.com>
Authored: Mon May 13 17:33:53 2013 -0700
Committer: Alex Huang <al...@gmail.com>
Committed: Mon May 13 17:33:53 2013 -0700

----------------------------------------------------------------------
 .gitignore                                         |    6 +-
 CHANGES                                            |  385 +-
 DISCLAIMER                                         |    7 -
 README.md                                          |    6 +-
 agent/conf/agent.properties                        |    2 +-
 agent/src/com/cloud/agent/AgentShell.java          |    3 +-
 .../consoleproxy/ConsoleProxyResource.java         |    4 +-
 .../com/cloud/agent/api/AgentControlAnswer.java    |   30 -
 .../com/cloud/agent/api/AgentControlCommand.java   |   27 -
 api/src/com/cloud/agent/api/AttachIsoCommand.java  |   59 -
 .../com/cloud/agent/api/AttachVolumeAnswer.java    |   58 -
 .../com/cloud/agent/api/AttachVolumeCommand.java   |   99 -
 .../com/cloud/agent/api/BackupSnapshotAnswer.java  |   44 -
 .../com/cloud/agent/api/BackupSnapshotCommand.java |  121 -
 .../com/cloud/agent/api/BumpUpPriorityCommand.java |   30 -
 api/src/com/cloud/agent/api/CancelCommand.java     |   45 -
 api/src/com/cloud/agent/api/ChangeAgentAnswer.java |   26 -
 .../com/cloud/agent/api/ChangeAgentCommand.java    |   46 -
 api/src/com/cloud/agent/api/CheckHealthAnswer.java |   26 -
 .../com/cloud/agent/api/CheckHealthCommand.java    |   30 -
 .../com/cloud/agent/api/CheckNetworkAnswer.java    |   38 -
 .../com/cloud/agent/api/CheckNetworkCommand.java   |   42 -
 api/src/com/cloud/agent/api/CheckOnHostAnswer.java |   48 -
 .../com/cloud/agent/api/CheckOnHostCommand.java    |   42 -
 api/src/com/cloud/agent/api/CheckRouterAnswer.java |   81 -
 .../com/cloud/agent/api/CheckRouterCommand.java    |   30 -
 .../agent/api/CheckS2SVpnConnectionsAnswer.java    |   71 -
 .../agent/api/CheckS2SVpnConnectionsCommand.java   |   39 -
 api/src/com/cloud/agent/api/CheckStateAnswer.java  |   45 -
 api/src/com/cloud/agent/api/CheckStateCommand.java |   40 -
 .../cloud/agent/api/CheckVirtualMachineAnswer.java |   52 -
 .../agent/api/CheckVirtualMachineCommand.java      |   41 -
 .../cloud/agent/api/CleanupNetworkRulesCmd.java    |   47 -
 .../agent/api/CleanupSnapshotBackupCommand.java    |   75 -
 api/src/com/cloud/agent/api/ClusterSyncAnswer.java |   55 -
 .../com/cloud/agent/api/ClusterSyncCommand.java    |   47 -
 .../cloud/agent/api/ComputeChecksumCommand.java    |   40 -
 .../api/ConsoleAccessAuthenticationAnswer.java     |   88 -
 .../api/ConsoleAccessAuthenticationCommand.java    |   68 -
 .../agent/api/ConsoleProxyLoadReportCommand.java   |   39 -
 .../CreatePrivateTemplateFromSnapshotCommand.java  |   82 -
 .../CreatePrivateTemplateFromVolumeCommand.java    |   93 -
 .../cloud/agent/api/CreateStoragePoolCommand.java  |   30 -
 .../cloud/agent/api/CreateVMSnapshotAnswer.java    |   62 -
 .../cloud/agent/api/CreateVMSnapshotCommand.java   |   42 -
 .../agent/api/CreateVolumeFromSnapshotAnswer.java  |   38 -
 .../agent/api/CreateVolumeFromSnapshotCommand.java |   58 -
 .../api/CreateVolumeFromVMSnapshotAnswer.java      |   54 -
 .../api/CreateVolumeFromVMSnapshotCommand.java     |   88 -
 api/src/com/cloud/agent/api/CronCommand.java       |   24 -
 .../agent/api/DeleteObjectFromSwiftCommand.java    |   61 -
 .../agent/api/DeleteSnapshotBackupAnswer.java      |   32 -
 .../agent/api/DeleteSnapshotBackupCommand.java     |   94 -
 .../cloud/agent/api/DeleteSnapshotsDirCommand.java |   63 -
 .../cloud/agent/api/DeleteStoragePoolCommand.java  |   61 -
 .../agent/api/DeleteTemplateFromS3Command.java     |  106 -
 .../cloud/agent/api/DeleteVMSnapshotAnswer.java    |   49 -
 .../cloud/agent/api/DeleteVMSnapshotCommand.java   |   28 -
 .../agent/api/DownloadSnapshotFromS3Command.java   |   61 -
 ...oadTemplateFromS3ToSecondaryStorageCommand.java |   66 -
 api/src/com/cloud/agent/api/FenceAnswer.java       |   36 -
 api/src/com/cloud/agent/api/FenceCommand.java      |   61 -
 .../com/cloud/agent/api/GetDomRVersionAnswer.java  |   45 -
 api/src/com/cloud/agent/api/GetDomRVersionCmd.java |   30 -
 .../com/cloud/agent/api/GetFileStatsAnswer.java    |   37 -
 .../com/cloud/agent/api/GetFileStatsCommand.java   |   41 -
 .../com/cloud/agent/api/GetHostStatsAnswer.java    |   88 -
 .../com/cloud/agent/api/GetHostStatsCommand.java   |   53 -
 .../com/cloud/agent/api/GetStorageStatsAnswer.java |   51 -
 .../cloud/agent/api/GetStorageStatsCommand.java    |   76 -
 api/src/com/cloud/agent/api/GetVmStatsAnswer.java  |   40 -
 api/src/com/cloud/agent/api/GetVmStatsCommand.java |   54 -
 api/src/com/cloud/agent/api/GetVncPortAnswer.java  |   48 -
 api/src/com/cloud/agent/api/GetVncPortCommand.java |   43 -
 api/src/com/cloud/agent/api/HostStatsEntry.java    |  113 -
 api/src/com/cloud/agent/api/MaintainAnswer.java    |   46 -
 api/src/com/cloud/agent/api/MaintainCommand.java   |   28 -
 .../com/cloud/agent/api/ManageSnapshotAnswer.java  |   40 -
 .../com/cloud/agent/api/ManageSnapshotCommand.java |   92 -
 api/src/com/cloud/agent/api/MigrateAnswer.java     |   33 -
 api/src/com/cloud/agent/api/MigrateCommand.java    |   59 -
 .../com/cloud/agent/api/ModifySshKeysCommand.java  |   44 -
 .../cloud/agent/api/ModifyStoragePoolAnswer.java   |   57 -
 .../cloud/agent/api/ModifyStoragePoolCommand.java  |   75 -
 .../com/cloud/agent/api/NetworkUsageAnswer.java    |   61 -
 .../com/cloud/agent/api/NetworkUsageCommand.java   |   98 -
 api/src/com/cloud/agent/api/PingAnswer.java        |   33 -
 api/src/com/cloud/agent/api/PingCommand.java       |   45 -
 .../com/cloud/agent/api/PingRoutingCommand.java    |   54 -
 .../agent/api/PingRoutingWithNwGroupsCommand.java  |   46 -
 .../cloud/agent/api/PingRoutingWithOvsCommand.java |   42 -
 .../com/cloud/agent/api/PingStorageCommand.java    |   37 -
 api/src/com/cloud/agent/api/PingTestCommand.java   |   54 -
 api/src/com/cloud/agent/api/PlugNicAnswer.java     |   25 -
 api/src/com/cloud/agent/api/PlugNicCommand.java    |   46 -
 api/src/com/cloud/agent/api/PoolEjectCommand.java  |   42 -
 .../cloud/agent/api/PrepareForMigrationAnswer.java |   34 -
 .../agent/api/PrepareForMigrationCommand.java      |   39 -
 .../cloud/agent/api/PrepareOCFS2NodesCommand.java  |   44 -
 .../agent/api/PropagateResourceEventCommand.java   |   48 -
 api/src/com/cloud/agent/api/ReadyAnswer.java       |   31 -
 api/src/com/cloud/agent/api/ReadyCommand.java      |   58 -
 api/src/com/cloud/agent/api/RebootAnswer.java      |   42 -
 api/src/com/cloud/agent/api/RebootCommand.java     |   45 -
 .../com/cloud/agent/api/RebootRouterCommand.java   |   38 -
 .../cloud/agent/api/RevertToVMSnapshotAnswer.java  |   63 -
 .../cloud/agent/api/RevertToVMSnapshotCommand.java |   29 -
 api/src/com/cloud/agent/api/ScaleVmAnswer.java     |   28 -
 api/src/com/cloud/agent/api/ScaleVmCommand.java    |  113 -
 .../agent/api/ScheduleHostScanTaskCommand.java     |   32 -
 .../agent/api/SecStorageFirewallCfgCommand.java    |   82 -
 .../com/cloud/agent/api/SecStorageSetupAnswer.java |   33 -
 .../cloud/agent/api/SecStorageSetupCommand.java    |   83 -
 .../cloud/agent/api/SecStorageVMSetupCommand.java  |   57 -
 .../cloud/agent/api/SecurityGroupRuleAnswer.java   |   70 -
 .../com/cloud/agent/api/SecurityGroupRulesCmd.java |  304 -
 api/src/com/cloud/agent/api/SetupAnswer.java       |   37 -
 api/src/com/cloud/agent/api/SetupCommand.java      |   60 -
 .../cloud/agent/api/SetupGuestNetworkAnswer.java   |   25 -
 .../cloud/agent/api/SetupGuestNetworkCommand.java  |   72 -
 api/src/com/cloud/agent/api/ShutdownCommand.java   |   56 -
 api/src/com/cloud/agent/api/SnapshotCommand.java   |  126 -
 api/src/com/cloud/agent/api/StartAnswer.java       |   57 -
 api/src/com/cloud/agent/api/StartCommand.java      |   52 -
 api/src/com/cloud/agent/api/StartupAnswer.java     |   44 -
 api/src/com/cloud/agent/api/StartupCommand.java    |  286 -
 .../agent/api/StartupExternalDhcpCommand.java      |   25 -
 .../agent/api/StartupExternalFirewallCommand.java  |   26 -
 .../api/StartupExternalLoadBalancerCommand.java    |   26 -
 .../com/cloud/agent/api/StartupProxyCommand.java   |   49 -
 .../cloud/agent/api/StartupPxeServerCommand.java   |   25 -
 .../com/cloud/agent/api/StartupRoutingCommand.java |  209 -
 .../agent/api/StartupSecondaryStorageCommand.java  |   32 -
 .../com/cloud/agent/api/StartupStorageCommand.java |  110 -
 .../agent/api/StartupTrafficMonitorCommand.java    |   26 -
 api/src/com/cloud/agent/api/StopAnswer.java        |   45 -
 api/src/com/cloud/agent/api/StopCommand.java       |   71 -
 .../com/cloud/agent/api/TransferAgentCommand.java  |   57 -
 api/src/com/cloud/agent/api/UnPlugNicAnswer.java   |   25 -
 api/src/com/cloud/agent/api/UnPlugNicCommand.java  |   45 -
 .../cloud/agent/api/UpdateHostPasswordCommand.java |   48 -
 api/src/com/cloud/agent/api/UpgradeAnswer.java     |   26 -
 api/src/com/cloud/agent/api/UpgradeCommand.java    |   42 -
 .../cloud/agent/api/UpgradeSnapshotCommand.java    |   64 -
 ...oadTemplateToS3FromSecondaryStorageCommand.java |  121 -
 .../com/cloud/agent/api/VMSnapshotBaseCommand.java |   74 -
 api/src/com/cloud/agent/api/VMSnapshotTO.java      |   90 -
 .../cloud/agent/api/ValidateSnapshotAnswer.java    |   53 -
 .../cloud/agent/api/ValidateSnapshotCommand.java   |   84 -
 api/src/com/cloud/agent/api/VmStatsEntry.java      |   82 -
 .../agent/api/baremetal/IpmISetBootDevCommand.java |   43 -
 .../api/baremetal/IpmiBootorResetCommand.java      |   28 -
 .../api/baremetal/PreparePxeServerAnswer.java      |   29 -
 .../api/baremetal/PreparePxeServerCommand.java     |   80 -
 .../baremetal/prepareCreateTemplateCommand.java    |   66 -
 .../com/cloud/agent/api/check/CheckSshAnswer.java  |   37 -
 .../com/cloud/agent/api/check/CheckSshCommand.java |   65 -
 .../api/downloadSnapshotFromSwiftCommand.java      |   60 -
 ...TemplateFromSwiftToSecondaryStorageCommand.java |   90 -
 .../api/proxy/CheckConsoleProxyLoadCommand.java    |   60 -
 .../agent/api/proxy/ConsoleProxyLoadAnswer.java    |   44 -
 .../com/cloud/agent/api/proxy/ProxyCommand.java    |   25 -
 .../StartConsoleProxyAgentHttpHandlerCommand.java  |   68 -
 .../api/proxy/WatchConsoleProxyLoadCommand.java    |   65 -
 .../CreateLoadBalancerApplianceCommand.java        |   48 -
 .../DestroyLoadBalancerApplianceCommand.java       |   32 -
 .../cloud/agent/api/routing/DhcpEntryCommand.java  |  142 -
 .../routing/GlobalLoadBalancerConfigAnswer.java    |   27 -
 .../routing/GlobalLoadBalancerConfigCommand.java   |  100 -
 .../api/routing/HealthCheckLBConfigAnswer.java     |   42 -
 .../api/routing/HealthCheckLBConfigCommand.java    |   39 -
 .../com/cloud/agent/api/routing/IpAssocAnswer.java |   48 -
 .../cloud/agent/api/routing/IpAssocCommand.java    |   42 -
 .../cloud/agent/api/routing/IpAssocVpcCommand.java |   29 -
 .../api/routing/LoadBalancerConfigCommand.java     |   66 -
 .../agent/api/routing/NetworkElementCommand.java   |   53 -
 .../api/routing/RemoteAccessVpnCfgCommand.java     |   78 -
 .../agent/api/routing/SavePasswordCommand.java     |   54 -
 .../agent/api/routing/SetFirewallRulesAnswer.java  |   36 -
 .../agent/api/routing/SetFirewallRulesCommand.java |   98 -
 .../agent/api/routing/SetNetworkACLAnswer.java     |   36 -
 .../agent/api/routing/SetNetworkACLCommand.java    |   97 -
 .../api/routing/SetPortForwardingRulesAnswer.java  |   37 -
 .../api/routing/SetPortForwardingRulesCommand.java |   40 -
 .../routing/SetPortForwardingRulesVpcCommand.java  |   30 -
 .../agent/api/routing/SetSourceNatAnswer.java      |   27 -
 .../agent/api/routing/SetSourceNatCommand.java     |   42 -
 .../agent/api/routing/SetStaticNatRulesAnswer.java |   37 -
 .../api/routing/SetStaticNatRulesCommand.java      |   47 -
 .../agent/api/routing/SetStaticRouteAnswer.java    |   36 -
 .../agent/api/routing/SetStaticRouteCommand.java   |   62 -
 .../agent/api/routing/Site2SiteVpnCfgCommand.java  |  154 -
 .../agent/api/routing/SiteLoadBalancerConfig.java  |  121 -
 .../cloud/agent/api/routing/UserDataCommand.java   |   63 -
 .../com/cloud/agent/api/routing/VmDataCommand.java |   67 -
 .../agent/api/routing/VpnUsersCfgCommand.java      |   94 -
 .../agent/api/storage/AbstractDownloadCommand.java |   78 -
 .../agent/api/storage/AbstractUploadCommand.java   |   68 -
 .../cloud/agent/api/storage/CopyVolumeAnswer.java  |   42 -
 .../cloud/agent/api/storage/CopyVolumeCommand.java |   72 -
 .../com/cloud/agent/api/storage/CreateAnswer.java  |   53 -
 .../com/cloud/agent/api/storage/CreateCommand.java |   96 -
 .../api/storage/CreateEntityDownloadURLAnswer.java |   37 -
 .../storage/CreateEntityDownloadURLCommand.java    |   72 -
 .../api/storage/CreatePrivateTemplateAnswer.java   |   77 -
 .../api/storage/CreatePrivateTemplateCommand.java  |   90 -
 .../agent/api/storage/CreateVolumeOVAAnswer.java   |   26 +
 .../agent/api/storage/CreateVolumeOVACommand.java  |   60 +
 .../api/storage/DeleteEntityDownloadURLAnswer.java |   37 -
 .../storage/DeleteEntityDownloadURLCommand.java    |   72 -
 .../agent/api/storage/DeleteTemplateCommand.java   |   40 -
 .../agent/api/storage/DeleteVolumeCommand.java     |   38 -
 .../com/cloud/agent/api/storage/DestroyAnswer.java |   31 -
 .../cloud/agent/api/storage/DestroyCommand.java    |   55 -
 .../cloud/agent/api/storage/DownloadAnswer.java    |  141 -
 .../cloud/agent/api/storage/DownloadCommand.java   |  219 -
 .../agent/api/storage/DownloadProgressCommand.java |   48 -
 .../agent/api/storage/ListTemplateAnswer.java      |   53 -
 .../agent/api/storage/ListTemplateCommand.java     |   54 -
 .../cloud/agent/api/storage/ListVolumeAnswer.java  |   53 -
 .../cloud/agent/api/storage/ListVolumeCommand.java |   40 -
 .../storage/ManageVolumeAvailabilityAnswer.java    |   31 -
 .../storage/ManageVolumeAvailabilityCommand.java   |   54 -
 .../agent/api/storage/PrepareOVAPackingAnswer.java |   26 +
 .../api/storage/PrepareOVAPackingCommand.java      |   48 +
 .../api/storage/PrimaryStorageDownloadAnswer.java  |   54 -
 .../api/storage/PrimaryStorageDownloadCommand.java |   87 -
 .../agent/api/storage/ResizeVolumeAnswer.java      |   40 -
 .../agent/api/storage/ResizeVolumeCommand.java     |   85 -
 .../cloud/agent/api/storage/StorageCommand.java    |   26 -
 .../cloud/agent/api/storage/UpgradeDiskAnswer.java |   29 -
 .../agent/api/storage/UpgradeDiskCommand.java      |   50 -
 .../com/cloud/agent/api/storage/UploadAnswer.java  |  123 -
 .../com/cloud/agent/api/storage/UploadCommand.java |  145 -
 .../agent/api/storage/UploadProgressCommand.java   |   48 -
 api/src/com/cloud/agent/api/storage/ssCommand.java |   48 -
 api/src/com/cloud/agent/api/to/FirewallRuleTO.java |    6 +
 ...TemplateToSwiftFromSecondaryStorageCommand.java |   80 -
 api/src/com/cloud/alert/AlertAdapter.java          |   22 +
 .../api/commands/CreatePrivateNetworkCmd.java      |  197 -
 .../cloud/api/commands/DestroyConsoleProxyCmd.java |   93 -
 api/src/com/cloud/async/AsyncJob.java              |   33 +
 .../cloud/configuration/ConfigurationService.java  |   21 +-
 .../cloud/consoleproxy/ConsoleProxyService.java    |   23 -
 api/src/com/cloud/event/EventTypes.java            |   43 +-
 api/src/com/cloud/event/UsageEvent.java            |   33 +
 .../cloud/exception/AffinityConflictException.java |   34 +
 .../exception/AgentControlChannelException.java    |   27 +
 .../cloud/hypervisor/HypervisorCapabilities.java   |    2 +
 api/src/com/cloud/hypervisor/HypervisorGuru.java   |    9 +
 api/src/com/cloud/info/ConsoleProxyLoadInfo.java   |   48 +
 api/src/com/cloud/info/RunningHostCountInfo.java   |   48 +
 api/src/com/cloud/network/GuestVlan.java           |   31 +
 api/src/com/cloud/network/IpAddress.java           |   10 +-
 api/src/com/cloud/network/Network.java             |   18 +-
 api/src/com/cloud/network/NetworkModel.java        |   11 +-
 api/src/com/cloud/network/NetworkService.java      |   19 +-
 api/src/com/cloud/network/PhysicalNetwork.java     |    5 +-
 api/src/com/cloud/network/PublicIpAddress.java     |    3 -
 api/src/com/cloud/network/UserIpv6Address.java     |   52 +
 .../network/VirtualNetworkApplianceService.java    |    2 +
 .../com/cloud/network/VirtualRouterProvider.java   |    3 +-
 api/src/com/cloud/network/element/IpDeployer.java  |    6 +-
 .../com/cloud/network/lb/LoadBalancingRule.java    |   83 +-
 .../network/lb/LoadBalancingRulesService.java      |   16 +-
 .../com/cloud/network/router/VirtualRouter.java    |    2 +-
 api/src/com/cloud/network/rules/LoadBalancer.java  |   10 +-
 .../cloud/network/rules/LoadBalancerContainer.java |   33 +
 api/src/com/cloud/network/rules/RulesService.java  |    2 +-
 .../cloud/network/security/SecurityGroupRules.java |    2 +
 api/src/com/cloud/network/vpc/PrivateIp.java       |    1 +
 api/src/com/cloud/network/vpc/VpcGateway.java      |    4 +
 api/src/com/cloud/network/vpc/VpcOffering.java     |    1 +
 api/src/com/cloud/network/vpc/VpcService.java      |    4 +-
 api/src/com/cloud/offering/NetworkOffering.java    |   14 +
 api/src/com/cloud/offering/ServiceOffering.java    |    1 +
 .../region/ha/GlobalLoadBalancingRulesService.java |    3 +
 .../cloud/resource/UnableDeleteHostException.java  |   28 +
 api/src/com/cloud/server/ManagementService.java    |   21 +-
 .../com/cloud/storage/StoragePoolDiscoverer.java   |   33 +
 .../cloud/storage/snapshot/SnapshotSchedule.java   |   11 +-
 api/src/com/cloud/user/Account.java                |    4 +
 api/src/com/cloud/user/User.java                   |    2 +
 api/src/com/cloud/vm/ConsoleProxy.java             |   27 +
 api/src/com/cloud/vm/DiskProfile.java              |    2 +-
 api/src/com/cloud/vm/SecondaryStorageVm.java       |   26 +
 api/src/com/cloud/vm/SystemVm.java                 |   26 +
 api/src/com/cloud/vm/UserVmService.java            |  231 +-
 api/src/com/cloud/vm/VirtualMachine.java           |    3 +-
 api/src/com/cloud/vm/VirtualMachineName.java       |  190 +
 api/src/com/cloud/vm/VmDetailConstants.java        |   24 +
 .../apache/cloudstack/affinity/AffinityGroup.java  |   31 +
 .../affinity/AffinityGroupProcessor.java           |   49 +
 .../cloudstack/affinity/AffinityGroupResponse.java |  158 +
 .../cloudstack/affinity/AffinityGroupService.java  |   79 +
 .../affinity/AffinityGroupTypeResponse.java        |   48 +
 .../cloudstack/affinity/AffinityProcessorBase.java |   44 +
 .../apache/cloudstack/api/ApiCommandJobType.java   |    6 +-
 .../org/apache/cloudstack/api/ApiConstants.java    |   19 +-
 api/src/org/apache/cloudstack/api/BaseCmd.java     |   43 +-
 .../apache/cloudstack/api/ResponseGenerator.java   |   74 +-
 .../command/admin/account/CreateAccountCmd.java    |   14 +-
 .../api/command/admin/cluster/ListClustersCmd.java |    8 +-
 .../command/admin/cluster/UpdateClusterCmd.java    |   15 +-
 .../api/command/admin/config/ListCfgsByCmd.java    |   44 +-
 .../api/command/admin/config/UpdateCfgCmd.java     |   43 +-
 .../admin/host/FindHostsForMigrationCmd.java       |  107 +
 .../api/command/admin/host/ListHostsCmd.java       |   14 +-
 .../ConfigureInternalLoadBalancerElementCmd.java   |  114 +
 .../CreateInternalLoadBalancerElementCmd.java      |  116 +
 .../admin/internallb/ListInternalLBVMsCmd.java     |  152 +
 .../ListInternalLoadBalancerElementsCmd.java       |   99 +
 .../admin/internallb/StartInternalLBVMCmd.java     |  123 +
 .../admin/internallb/StopInternalLBVMCmd.java      |  124 +
 .../admin/network/CreateNetworkOfferingCmd.java    |   15 +-
 .../admin/network/DedicateGuestVlanRangeCmd.java   |  118 +
 .../network/ListDedicatedGuestVlanRangesCmd.java   |  129 +
 .../network/ListNetworkIsolationMethodsCmd.java    |   58 +
 .../network/ReleaseDedicatedGuestVlanRangeCmd.java |   99 +
 .../admin/network/UpdatePhysicalNetworkCmd.java    |    8 +-
 .../admin/offering/CreateServiceOfferingCmd.java   |    1 +
 .../api/command/admin/pod/ListPodsByCmd.java       |    7 +
 .../router/CreateVirtualRouterElementCmd.java      |   21 +-
 .../api/command/admin/router/ListRoutersCmd.java   |   12 +
 .../api/command/admin/router/StartRouterCmd.java   |   10 +-
 .../api/command/admin/router/StopRouterCmd.java    |   11 +-
 .../storage/FindStoragePoolsForMigrationCmd.java   |  100 +
 .../command/admin/storage/ListStoragePoolsCmd.java |    7 +
 .../command/admin/systemvm/ListSystemVMsCmd.java   |    7 +
 .../admin/vlan/DedicatePublicIpRangeCmd.java       |  108 +
 .../admin/vlan/ReleasePublicIpRangeCmd.java        |   77 +
 .../api/command/admin/vm/MigrateVMCmd.java         |    2 +-
 .../vm/MigrateVirtualMachineWithVolumeCmd.java     |  160 +
 .../command/admin/vpc/CreatePrivateGatewayCmd.java |   14 +-
 .../command/user/address/AssociateIPAddrCmd.java   |   14 +-
 .../user/affinitygroup/CreateAffinityGroupCmd.java |  168 +
 .../user/affinitygroup/DeleteAffinityGroupCmd.java |  155 +
 .../affinitygroup/ListAffinityGroupTypesCmd.java   |   67 +
 .../user/affinitygroup/ListAffinityGroupsCmd.java  |   90 +
 .../affinitygroup/UpdateVMAffinityGroupCmd.java    |  165 +
 .../api/command/user/iso/ListIsosCmd.java          |    7 +
 .../CreateApplicationLoadBalancerCmd.java          |  219 +
 .../loadbalancer/CreateLoadBalancerRuleCmd.java    |    6 +-
 .../DeleteApplicationLoadBalancerCmd.java          |  117 +
 .../ListApplicationLoadBalancersCmd.java           |  131 +
 .../api/command/user/nat/EnableStaticNatCmd.java   |    2 +-
 .../api/command/user/network/ListNetworksCmd.java  |    7 +
 .../ha/gslb/CreateGlobalLoadBalancerRuleCmd.java   |    3 +
 .../command/user/snapshot/CreateSnapshotCmd.java   |    2 +
 .../command/user/snapshot/ListSnapshotsCmd.java    |    7 +
 .../api/command/user/tag/CreateTagsCmd.java        |    2 +-
 .../api/command/user/tag/DeleteTagsCmd.java        |    2 +-
 .../api/command/user/tag/ListTagsCmd.java          |    2 +-
 .../command/user/template/ListTemplatesCmd.java    |    8 +
 .../api/command/user/vm/AddIpToVmNicCmd.java       |    9 +-
 .../api/command/user/vm/DeployVMCmd.java           |   48 +-
 .../cloudstack/api/command/user/vm/ListVMsCmd.java |   21 +-
 .../cloudstack/api/command/user/vm/ScaleVMCmd.java |   10 +-
 .../api/command/user/vm/UpdateVMCmd.java           |    2 +-
 .../user/vmsnapshot/CreateVMSnapshotCmd.java       |    2 +-
 .../user/vmsnapshot/DeleteVMSnapshotCmd.java       |    2 +-
 .../command/user/vmsnapshot/ListVMSnapshotCmd.java |    2 +-
 .../user/vmsnapshot/RevertToSnapshotCmd.java       |   92 -
 .../user/vmsnapshot/RevertToVMSnapshotCmd.java     |   92 +
 .../api/command/user/volume/ListVolumesCmd.java    |    7 +
 .../api/command/user/volume/MigrateVolumeCmd.java  |    8 +
 .../api/command/user/zone/ListZonesByCmd.java      |    8 +
 .../cloudstack/api/response/AccountResponse.java   |    7 +
 .../ApplicationLoadBalancerInstanceResponse.java   |   63 +
 .../response/ApplicationLoadBalancerResponse.java  |  142 +
 .../ApplicationLoadBalancerRuleResponse.java       |   51 +
 .../cloudstack/api/response/ClusterResponse.java   |    9 +-
 .../api/response/ConfigurationResponse.java        |   15 +
 .../api/response/DeploymentPlannersResponse.java   |   37 +
 .../api/response/DomainRouterResponse.java         |   24 +-
 .../api/response/FirewallRuleResponse.java         |   12 +
 .../api/response/GlobalLoadBalancerResponse.java   |   18 +
 .../api/response/GuestVlanRangeResponse.java       |   94 +
 .../api/response/HostForMigrationResponse.java     |  365 +
 .../cloudstack/api/response/HostResponse.java      |   10 +-
 .../InternalLoadBalancerElementResponse.java       |   51 +
 .../api/response/IsolationMethodResponse.java      |   33 +
 .../api/response/NetworkOfferingResponse.java      |    9 +
 .../cloudstack/api/response/NetworkResponse.java   |    7 +
 .../cloudstack/api/response/PodResponse.java       |    9 +-
 .../api/response/PrivateGatewayResponse.java       |   10 +
 .../cloudstack/api/response/SnapshotResponse.java  |   16 +
 .../response/StoragePoolForMigrationResponse.java  |  248 +
 .../api/response/StoragePoolResponse.java          |   18 +-
 .../cloudstack/api/response/SystemVmResponse.java  |   11 +
 .../cloudstack/api/response/TemplateResponse.java  |    7 +
 .../cloudstack/api/response/UserResponse.java      |    8 +
 .../cloudstack/api/response/UserVmResponse.java    |   21 +
 .../response/VirtualRouterProviderResponse.java    |    1 +
 .../cloudstack/api/response/VolumeResponse.java    |    8 +
 .../network/ExternalNetworkDeviceManager.java      |    1 +
 .../InternalLoadBalancerElementService.java        |   56 +
 .../lb/ApplicationLoadBalancerContainer.java       |   28 +
 .../network/lb/ApplicationLoadBalancerRule.java    |   24 +
 .../network/lb/ApplicationLoadBalancerService.java |   42 +
 .../network/lb/InternalLoadBalancerVMService.java  |   34 +
 .../org/apache/cloudstack/query/QueryService.java  |    7 +
 .../api/agent/test/AgentControlAnswerTest.java     |   35 -
 .../api/agent/test/AgentControlCommandTest.java    |   33 -
 .../cloudstack/api/agent/test/AnswerTest.java      |   73 -
 .../api/agent/test/AttachIsoCommandTest.java       |   80 -
 .../api/agent/test/AttachVolumeAnswerTest.java     |   65 -
 .../api/agent/test/AttachVolumeCommandTest.java    |  120 -
 .../api/agent/test/BackupSnapshotAnswerTest.java   |   75 -
 .../api/agent/test/BackupSnapshotCommandTest.java  |  301 -
 .../api/agent/test/BumpUpPriorityCommandTest.java  |   83 -
 .../api/agent/test/CancelCommandTest.java          |   46 -
 .../api/agent/test/ChangeAgentAnswerTest.java      |   44 -
 .../api/agent/test/ChangeAgentCommandTest.java     |   50 -
 .../api/agent/test/CheckHealthAnswerTest.java      |   49 -
 .../api/agent/test/CheckHealthCommandTest.java     |   40 -
 .../api/agent/test/CheckNetworkAnswerTest.java     |   62 -
 .../api/agent/test/CheckNetworkCommandTest.java    |   53 -
 .../api/agent/test/CheckOnHostCommandTest.java     |  483 -
 .../api/agent/test/SnapshotCommandTest.java        |  209 -
 .../api/command/test/AddIpToVmNicTest.java         |    6 +-
 .../api/command/test/ListCfgCmdTest.java           |   89 +
 .../api/command/test/ScaleVMCmdTest.java           |   35 +-
 .../api/command/test/UpdateCfgCmdTest.java         |  116 +
 .../agent/api/test/ResizeVolumeCommandTest.java    |  229 -
 awsapi/pom.xml                                     |   33 +-
 .../com/cloud/bridge/service/EC2RestServlet.java   |    2 +-
 .../com/cloud/bridge/service/core/s3/S3Engine.java |    2 +-
 .../test/com/cloud/gate/model/ModelTestCase.java   |  368 -
 .../com/cloud/gate/persist/PersitTestCase.java     |   73 -
 build/replace.properties                           |    1 +
 .../WEB-INF/classes/resources/messages.properties  | 1753 ++--
 .../classes/resources/messages_ar.properties       |  285 +
 .../classes/resources/messages_ca.properties       |  307 +
 .../classes/resources/messages_de_DE.properties    |  748 ++
 .../classes/resources/messages_es.properties       |  862 ++
 .../classes/resources/messages_fr_FR.properties    | 1880 ++--
 .../classes/resources/messages_it_IT.properties    |  618 ++
 .../classes/resources/messages_ja.properties       | 2904 +++---
 .../classes/resources/messages_ko_KR.properties    | 2883 +++---
 .../classes/resources/messages_nb_NO.properties    |  366 +
 .../classes/resources/messages_pt_BR.properties    | 2092 ++---
 .../classes/resources/messages_ru_RU.properties    | 2890 +++---
 .../classes/resources/messages_zh_CN.properties    | 2986 +++---
 client/pom.xml                                     |   42 +-
 client/tomcatconf/applicationContext.xml.in        |   40 +-
 client/tomcatconf/commands.properties.in           |   48 +-
 client/tomcatconf/componentContext.xml.in          |   22 +-
 client/tomcatconf/nonossComponentContext.xml.in    |   32 +-
 client/tomcatconf/simulatorComponentContext.xml.in |   31 +-
 core/pom.xml                                       |    7 +-
 core/src/com/cloud/agent/RecoveryHandler.java      |   31 -
 .../com/cloud/agent/api/AgentControlAnswer.java    |   30 +
 .../com/cloud/agent/api/AgentControlCommand.java   |   27 +
 core/src/com/cloud/agent/api/AttachIsoCommand.java |   59 +
 .../com/cloud/agent/api/AttachVolumeAnswer.java    |   58 +
 .../com/cloud/agent/api/AttachVolumeCommand.java   |   99 +
 .../com/cloud/agent/api/BackupSnapshotAnswer.java  |   44 +
 .../com/cloud/agent/api/BackupSnapshotCommand.java |  121 +
 .../com/cloud/agent/api/BumpUpPriorityCommand.java |   30 +
 core/src/com/cloud/agent/api/CancelCommand.java    |   45 +
 .../src/com/cloud/agent/api/ChangeAgentAnswer.java |   26 +
 .../com/cloud/agent/api/ChangeAgentCommand.java    |   46 +
 .../src/com/cloud/agent/api/CheckHealthAnswer.java |   26 +
 .../com/cloud/agent/api/CheckHealthCommand.java    |   30 +
 .../com/cloud/agent/api/CheckNetworkAnswer.java    |   38 +
 .../com/cloud/agent/api/CheckNetworkCommand.java   |   42 +
 .../src/com/cloud/agent/api/CheckOnHostAnswer.java |   48 +
 .../com/cloud/agent/api/CheckOnHostCommand.java    |   42 +
 .../src/com/cloud/agent/api/CheckRouterAnswer.java |   81 +
 .../com/cloud/agent/api/CheckRouterCommand.java    |   30 +
 .../agent/api/CheckS2SVpnConnectionsAnswer.java    |   71 +
 .../agent/api/CheckS2SVpnConnectionsCommand.java   |   39 +
 core/src/com/cloud/agent/api/CheckStateAnswer.java |   45 +
 .../src/com/cloud/agent/api/CheckStateCommand.java |   40 +
 .../cloud/agent/api/CheckVirtualMachineAnswer.java |   52 +
 .../agent/api/CheckVirtualMachineCommand.java      |   41 +
 .../cloud/agent/api/CleanupNetworkRulesCmd.java    |   47 +
 .../agent/api/CleanupSnapshotBackupCommand.java    |   75 +
 .../src/com/cloud/agent/api/ClusterSyncAnswer.java |   55 +
 .../com/cloud/agent/api/ClusterSyncCommand.java    |   47 +
 .../cloud/agent/api/ComputeChecksumCommand.java    |   40 +
 .../api/ConsoleAccessAuthenticationAnswer.java     |   88 +
 .../api/ConsoleAccessAuthenticationCommand.java    |   68 +
 .../agent/api/ConsoleProxyLoadReportCommand.java   |   39 +
 .../CreatePrivateTemplateFromSnapshotCommand.java  |   82 +
 .../CreatePrivateTemplateFromVolumeCommand.java    |   93 +
 .../cloud/agent/api/CreateStoragePoolCommand.java  |   30 +
 .../cloud/agent/api/CreateVMSnapshotAnswer.java    |   62 +
 .../cloud/agent/api/CreateVMSnapshotCommand.java   |   42 +
 .../agent/api/CreateVolumeFromSnapshotAnswer.java  |   38 +
 .../agent/api/CreateVolumeFromSnapshotCommand.java |   58 +
 .../api/CreateVolumeFromVMSnapshotAnswer.java      |   54 +
 .../api/CreateVolumeFromVMSnapshotCommand.java     |   88 +
 core/src/com/cloud/agent/api/CronCommand.java      |   24 +
 .../agent/api/DeleteObjectFromSwiftCommand.java    |   61 +
 .../agent/api/DeleteSnapshotBackupAnswer.java      |   32 +
 .../agent/api/DeleteSnapshotBackupCommand.java     |   96 +
 .../cloud/agent/api/DeleteSnapshotsDirCommand.java |   63 +
 .../cloud/agent/api/DeleteStoragePoolCommand.java  |   61 +
 .../agent/api/DeleteTemplateFromS3Command.java     |  106 +
 .../cloud/agent/api/DeleteVMSnapshotAnswer.java    |   49 +
 .../cloud/agent/api/DeleteVMSnapshotCommand.java   |   28 +
 .../agent/api/DownloadSnapshotFromS3Command.java   |   61 +
 .../api/DownloadSnapshotFromSwiftCommand.java      |   60 +
 ...oadTemplateFromS3ToSecondaryStorageCommand.java |   66 +
 ...TemplateFromSwiftToSecondaryStorageCommand.java |   90 +
 core/src/com/cloud/agent/api/FenceAnswer.java      |   36 +
 core/src/com/cloud/agent/api/FenceCommand.java     |   61 +
 .../com/cloud/agent/api/GetDomRVersionAnswer.java  |   45 +
 .../src/com/cloud/agent/api/GetDomRVersionCmd.java |   30 +
 .../com/cloud/agent/api/GetFileStatsAnswer.java    |   37 +
 .../com/cloud/agent/api/GetFileStatsCommand.java   |   41 +
 .../com/cloud/agent/api/GetHostStatsAnswer.java    |   88 +
 .../com/cloud/agent/api/GetHostStatsCommand.java   |   53 +
 .../com/cloud/agent/api/GetStorageStatsAnswer.java |   51 +
 .../cloud/agent/api/GetStorageStatsCommand.java    |   76 +
 core/src/com/cloud/agent/api/GetVmStatsAnswer.java |   40 +
 .../src/com/cloud/agent/api/GetVmStatsCommand.java |   54 +
 core/src/com/cloud/agent/api/GetVncPortAnswer.java |   48 +
 .../src/com/cloud/agent/api/GetVncPortCommand.java |   43 +
 core/src/com/cloud/agent/api/HostStatsEntry.java   |  113 +
 core/src/com/cloud/agent/api/MaintainAnswer.java   |   46 +
 core/src/com/cloud/agent/api/MaintainCommand.java  |   28 +
 .../com/cloud/agent/api/ManageSnapshotAnswer.java  |   40 +
 .../com/cloud/agent/api/ManageSnapshotCommand.java |   92 +
 core/src/com/cloud/agent/api/MigrateAnswer.java    |   33 +
 core/src/com/cloud/agent/api/MigrateCommand.java   |   59 +
 .../cloud/agent/api/MigrateWithStorageAnswer.java  |   39 +
 .../cloud/agent/api/MigrateWithStorageCommand.java |   45 +
 .../api/MigrateWithStorageCompleteAnswer.java      |   38 +
 .../api/MigrateWithStorageCompleteCommand.java     |   36 +
 .../agent/api/MigrateWithStorageReceiveAnswer.java |   55 +
 .../api/MigrateWithStorageReceiveCommand.java      |   45 +
 .../agent/api/MigrateWithStorageSendAnswer.java    |   39 +
 .../agent/api/MigrateWithStorageSendCommand.java   |   58 +
 .../com/cloud/agent/api/ModifySshKeysCommand.java  |   44 +
 .../cloud/agent/api/ModifyStoragePoolAnswer.java   |   57 +
 .../cloud/agent/api/ModifyStoragePoolCommand.java  |   75 +
 .../com/cloud/agent/api/NetworkUsageAnswer.java    |   61 +
 .../com/cloud/agent/api/NetworkUsageCommand.java   |   98 +
 core/src/com/cloud/agent/api/PingAnswer.java       |   33 +
 core/src/com/cloud/agent/api/PingCommand.java      |   45 +
 .../com/cloud/agent/api/PingRoutingCommand.java    |   54 +
 .../agent/api/PingRoutingWithNwGroupsCommand.java  |   46 +
 .../cloud/agent/api/PingRoutingWithOvsCommand.java |   42 +
 .../com/cloud/agent/api/PingStorageCommand.java    |   37 +
 core/src/com/cloud/agent/api/PingTestCommand.java  |   54 +
 core/src/com/cloud/agent/api/PlugNicAnswer.java    |   25 +
 core/src/com/cloud/agent/api/PlugNicCommand.java   |   46 +
 core/src/com/cloud/agent/api/PoolEjectCommand.java |   42 +
 .../cloud/agent/api/PrepareForMigrationAnswer.java |   34 +
 .../agent/api/PrepareForMigrationCommand.java      |   39 +
 .../cloud/agent/api/PrepareOCFS2NodesCommand.java  |   44 +
 .../agent/api/PropagateResourceEventCommand.java   |   48 +
 core/src/com/cloud/agent/api/ReadyAnswer.java      |   31 +
 core/src/com/cloud/agent/api/ReadyCommand.java     |   58 +
 core/src/com/cloud/agent/api/RebootAnswer.java     |   42 +
 core/src/com/cloud/agent/api/RebootCommand.java    |   45 +
 .../com/cloud/agent/api/RebootRouterCommand.java   |   38 +
 .../cloud/agent/api/RevertToVMSnapshotAnswer.java  |   63 +
 .../cloud/agent/api/RevertToVMSnapshotCommand.java |   29 +
 core/src/com/cloud/agent/api/ScaleVmAnswer.java    |   28 +
 core/src/com/cloud/agent/api/ScaleVmCommand.java   |  113 +
 .../agent/api/ScheduleHostScanTaskCommand.java     |   32 +
 .../agent/api/SecStorageFirewallCfgCommand.java    |   82 +
 .../com/cloud/agent/api/SecStorageSetupAnswer.java |   33 +
 .../cloud/agent/api/SecStorageSetupCommand.java    |   83 +
 .../cloud/agent/api/SecStorageVMSetupCommand.java  |   57 +
 .../cloud/agent/api/SecurityGroupRuleAnswer.java   |   70 +
 .../com/cloud/agent/api/SecurityGroupRulesCmd.java |  304 +
 core/src/com/cloud/agent/api/SetupAnswer.java      |   37 +
 core/src/com/cloud/agent/api/SetupCommand.java     |   60 +
 .../cloud/agent/api/SetupGuestNetworkAnswer.java   |   25 +
 .../cloud/agent/api/SetupGuestNetworkCommand.java  |   72 +
 core/src/com/cloud/agent/api/ShutdownCommand.java  |   56 +
 core/src/com/cloud/agent/api/SnapshotCommand.java  |  126 +
 core/src/com/cloud/agent/api/StartAnswer.java      |   57 +
 core/src/com/cloud/agent/api/StartCommand.java     |   52 +
 core/src/com/cloud/agent/api/StartupAnswer.java    |   44 +
 core/src/com/cloud/agent/api/StartupCommand.java   |  286 +
 .../agent/api/StartupExternalDhcpCommand.java      |   25 +
 .../agent/api/StartupExternalFirewallCommand.java  |   26 +
 .../api/StartupExternalLoadBalancerCommand.java    |   26 +
 .../com/cloud/agent/api/StartupProxyCommand.java   |   49 +
 .../cloud/agent/api/StartupPxeServerCommand.java   |   25 +
 .../com/cloud/agent/api/StartupRoutingCommand.java |  209 +
 .../agent/api/StartupSecondaryStorageCommand.java  |   32 +
 .../com/cloud/agent/api/StartupStorageCommand.java |  110 +
 .../agent/api/StartupTrafficMonitorCommand.java    |   26 +
 core/src/com/cloud/agent/api/StopAnswer.java       |   45 +
 core/src/com/cloud/agent/api/StopCommand.java      |   71 +
 .../com/cloud/agent/api/TransferAgentCommand.java  |   57 +
 core/src/com/cloud/agent/api/UnPlugNicAnswer.java  |   25 +
 core/src/com/cloud/agent/api/UnPlugNicCommand.java |   45 +
 .../com/cloud/agent/api/UnregisterVMCommand.java   |   34 +
 .../cloud/agent/api/UpdateHostPasswordCommand.java |   48 +
 core/src/com/cloud/agent/api/UpgradeAnswer.java    |   26 +
 core/src/com/cloud/agent/api/UpgradeCommand.java   |   42 +
 .../cloud/agent/api/UpgradeSnapshotCommand.java    |   64 +
 ...oadTemplateToS3FromSecondaryStorageCommand.java |  121 +
 ...TemplateToSwiftFromSecondaryStorageCommand.java |   80 +
 .../com/cloud/agent/api/VMSnapshotBaseCommand.java |   74 +
 core/src/com/cloud/agent/api/VMSnapshotTO.java     |   90 +
 .../cloud/agent/api/ValidateSnapshotAnswer.java    |   53 +
 .../cloud/agent/api/ValidateSnapshotCommand.java   |   84 +
 core/src/com/cloud/agent/api/VmStatsEntry.java     |   82 +
 .../agent/api/baremetal/IpmISetBootDevCommand.java |   43 +
 .../api/baremetal/IpmiBootorResetCommand.java      |   28 +
 .../api/baremetal/PreparePxeServerAnswer.java      |   29 +
 .../api/baremetal/PreparePxeServerCommand.java     |   80 +
 .../baremetal/prepareCreateTemplateCommand.java    |   66 +
 .../com/cloud/agent/api/check/CheckSshAnswer.java  |   37 +
 .../com/cloud/agent/api/check/CheckSshCommand.java |   65 +
 .../api/proxy/CheckConsoleProxyLoadCommand.java    |   60 +
 .../agent/api/proxy/ConsoleProxyLoadAnswer.java    |   44 +
 .../com/cloud/agent/api/proxy/ProxyCommand.java    |   25 +
 .../StartConsoleProxyAgentHttpHandlerCommand.java  |   68 +
 .../api/proxy/WatchConsoleProxyLoadCommand.java    |   65 +
 .../CreateLoadBalancerApplianceCommand.java        |   48 +
 .../DestroyLoadBalancerApplianceCommand.java       |   32 +
 .../cloud/agent/api/routing/DhcpEntryCommand.java  |  142 +
 .../routing/GlobalLoadBalancerConfigAnswer.java    |   27 +
 .../routing/GlobalLoadBalancerConfigCommand.java   |  100 +
 .../api/routing/HealthCheckLBConfigAnswer.java     |   42 +
 .../api/routing/HealthCheckLBConfigCommand.java    |   39 +
 .../com/cloud/agent/api/routing/IpAssocAnswer.java |   48 +
 .../cloud/agent/api/routing/IpAssocCommand.java    |   42 +
 .../cloud/agent/api/routing/IpAssocVpcCommand.java |   29 +
 .../api/routing/LoadBalancerConfigCommand.java     |   66 +
 .../agent/api/routing/NetworkElementCommand.java   |   53 +
 .../api/routing/RemoteAccessVpnCfgCommand.java     |   78 +
 .../agent/api/routing/SavePasswordCommand.java     |   54 +
 .../agent/api/routing/SetFirewallRulesAnswer.java  |   36 +
 .../agent/api/routing/SetFirewallRulesCommand.java |   98 +
 .../agent/api/routing/SetNetworkACLAnswer.java     |   36 +
 .../agent/api/routing/SetNetworkACLCommand.java    |   97 +
 .../api/routing/SetPortForwardingRulesAnswer.java  |   37 +
 .../api/routing/SetPortForwardingRulesCommand.java |   40 +
 .../routing/SetPortForwardingRulesVpcCommand.java  |   30 +
 .../agent/api/routing/SetSourceNatAnswer.java      |   27 +
 .../agent/api/routing/SetSourceNatCommand.java     |   42 +
 .../agent/api/routing/SetStaticNatRulesAnswer.java |   37 +
 .../api/routing/SetStaticNatRulesCommand.java      |   47 +
 .../agent/api/routing/SetStaticRouteAnswer.java    |   36 +
 .../agent/api/routing/SetStaticRouteCommand.java   |   62 +
 .../agent/api/routing/Site2SiteVpnCfgCommand.java  |  154 +
 .../agent/api/routing/SiteLoadBalancerConfig.java  |  121 +
 .../cloud/agent/api/routing/UserDataCommand.java   |   63 +
 .../com/cloud/agent/api/routing/VmDataCommand.java |   67 +
 .../agent/api/routing/VpnUsersCfgCommand.java      |   94 +
 .../agent/api/storage/AbstractDownloadCommand.java |   78 +
 .../agent/api/storage/AbstractUploadCommand.java   |   68 +
 .../cloud/agent/api/storage/CopyVolumeAnswer.java  |   42 +
 .../cloud/agent/api/storage/CopyVolumeCommand.java |   72 +
 .../com/cloud/agent/api/storage/CreateAnswer.java  |   53 +
 .../com/cloud/agent/api/storage/CreateCommand.java |   96 +
 .../api/storage/CreateEntityDownloadURLAnswer.java |   37 +
 .../storage/CreateEntityDownloadURLCommand.java    |   72 +
 .../api/storage/CreatePrivateTemplateAnswer.java   |   77 +
 .../api/storage/CreatePrivateTemplateCommand.java  |   90 +
 .../api/storage/DeleteEntityDownloadURLAnswer.java |   37 +
 .../storage/DeleteEntityDownloadURLCommand.java    |   72 +
 .../agent/api/storage/DeleteTemplateCommand.java   |   40 +
 .../agent/api/storage/DeleteVolumeCommand.java     |   38 +
 .../com/cloud/agent/api/storage/DestroyAnswer.java |   31 +
 .../cloud/agent/api/storage/DestroyCommand.java    |   55 +
 .../cloud/agent/api/storage/DownloadAnswer.java    |  141 +
 .../cloud/agent/api/storage/DownloadCommand.java   |  219 +
 .../agent/api/storage/DownloadProgressCommand.java |   48 +
 .../agent/api/storage/ListTemplateAnswer.java      |   53 +
 .../agent/api/storage/ListTemplateCommand.java     |   54 +
 .../cloud/agent/api/storage/ListVolumeAnswer.java  |   53 +
 .../cloud/agent/api/storage/ListVolumeCommand.java |   40 +
 .../storage/ManageVolumeAvailabilityAnswer.java    |   31 +
 .../storage/ManageVolumeAvailabilityCommand.java   |   54 +
 .../agent/api/storage/MigrateVolumeAnswer.java     |   38 +
 .../agent/api/storage/MigrateVolumeCommand.java    |   51 +
 .../api/storage/PrimaryStorageDownloadAnswer.java  |   54 +
 .../api/storage/PrimaryStorageDownloadCommand.java |   87 +
 .../agent/api/storage/ResizeVolumeAnswer.java      |   40 +
 .../agent/api/storage/ResizeVolumeCommand.java     |   85 +
 .../cloud/agent/api/storage/StorageCommand.java    |   26 +
 .../cloud/agent/api/storage/UpgradeDiskAnswer.java |   29 +
 .../agent/api/storage/UpgradeDiskCommand.java      |   50 +
 .../com/cloud/agent/api/storage/UploadAnswer.java  |  123 +
 .../com/cloud/agent/api/storage/UploadCommand.java |  145 +
 .../agent/api/storage/UploadProgressCommand.java   |   48 +
 .../src/com/cloud/agent/api/storage/ssCommand.java |   48 +
 .../virtualnetwork/VirtualRoutingResource.java     |   15 +-
 core/src/com/cloud/alert/AlertAdapter.java         |   22 -
 core/src/com/cloud/alert/AlertManager.java         |   58 -
 core/src/com/cloud/alert/AlertVO.java              |  183 -
 core/src/com/cloud/async/AsyncJobVO.java           |  378 -
 core/src/com/cloud/async/SyncQueueItemVO.java      |  142 -
 core/src/com/cloud/async/SyncQueueVO.java          |  137 -
 core/src/com/cloud/capacity/CapacityVO.java        |  204 -
 core/src/com/cloud/certificate/CertificateVO.java  |   63 -
 .../com/cloud/configuration/ConfigurationVO.java   |  107 -
 .../com/cloud/configuration/ResourceCountVO.java   |  131 -
 .../com/cloud/configuration/ResourceLimitVO.java   |  128 -
 core/src/com/cloud/event/EventVO.java              |  194 -
 core/src/com/cloud/event/UsageEvent.java           |   33 -
 core/src/com/cloud/event/UsageEventVO.java         |  216 -
 core/src/com/cloud/event/dao/EventDao.java         |   38 -
 core/src/com/cloud/event/dao/EventDaoImpl.java     |  109 -
 core/src/com/cloud/event/dao/UsageEventDao.java    |   36 -
 .../src/com/cloud/event/dao/UsageEventDaoImpl.java |  187 -
 .../exception/AgentControlChannelException.java    |   27 -
 core/src/com/cloud/host/DetailVO.java              |   73 -
 core/src/com/cloud/host/HostTagVO.java             |   65 -
 core/src/com/cloud/host/HostVO.java                |  732 --
 .../cloud/hypervisor/HypervisorCapabilitiesVO.java |  181 -
 core/src/com/cloud/info/ConsoleProxyLoadInfo.java  |   48 -
 core/src/com/cloud/info/RunningHostCountInfo.java  |   48 -
 core/src/com/cloud/network/VpnUserVO.java          |  131 -
 .../network/security/SecurityGroupRuleVO.java      |  167 -
 .../network/security/SecurityGroupRulesVO.java     |  156 -
 .../network/security/SecurityGroupVMMapVO.java     |   89 -
 .../cloud/network/security/SecurityGroupVO.java    |   99 -
 .../cloud/network/security/SecurityGroupWork.java  |   40 -
 .../network/security/SecurityGroupWorkVO.java      |  135 -
 .../com/cloud/network/security/VmRulesetLogVO.java |   81 -
 core/src/com/cloud/resource/ResourceListener.java  |   40 +-
 .../src/com/cloud/resource/ServerResourceBase.java |    2 +-
 .../cloud/resource/UnableDeleteHostException.java  |   28 -
 core/src/com/cloud/storage/DiskOfferingVO.java     |  318 -
 core/src/com/cloud/storage/GuestOSCategoryVO.java  |   68 -
 core/src/com/cloud/storage/GuestOSVO.java          |   90 -
 core/src/com/cloud/storage/LaunchPermissionVO.java |   57 -
 core/src/com/cloud/storage/S3VO.java               |  209 -
 core/src/com/cloud/storage/SecondaryStorage.java   |   30 -
 .../com/cloud/storage/SecondaryStorageLayer.java   |   39 -
 core/src/com/cloud/storage/SnapshotPolicyVO.java   |  133 -
 core/src/com/cloud/storage/SnapshotScheduleVO.java |  125 -
 core/src/com/cloud/storage/SnapshotVO.java         |  298 -
 .../com/cloud/storage/StoragePoolDiscoverer.java   |   35 -
 .../com/cloud/storage/StoragePoolHostAssoc.java    |   35 -
 core/src/com/cloud/storage/StoragePoolHostVO.java  |  109 -
 core/src/com/cloud/storage/StoragePoolWorkVO.java  |  118 -
 core/src/com/cloud/storage/SwiftVO.java            |  108 -
 core/src/com/cloud/storage/UploadVO.java           |  268 -
 core/src/com/cloud/storage/VMTemplateDetailVO.java |   84 -
 core/src/com/cloud/storage/VMTemplateHostVO.java   |  322 -
 core/src/com/cloud/storage/VMTemplateS3VO.java     |  204 -
 .../com/cloud/storage/VMTemplateStoragePoolVO.java |  275 -
 core/src/com/cloud/storage/VMTemplateSwiftVO.java  |  107 -
 core/src/com/cloud/storage/VMTemplateVO.java       |  534 --
 core/src/com/cloud/storage/VMTemplateZoneVO.java   |  116 -
 core/src/com/cloud/storage/VolumeHostVO.java       |  347 -
 core/src/com/cloud/storage/VolumeVO.java           |  454 -
 .../resource/CifsSecondaryStorageResource.java     |  755 --
 .../resource/LocalSecondaryStorageResource.java    |  246 -
 .../resource/NfsSecondaryStorageResource.java      | 1842 ----
 .../storage/resource/SecondaryStorageResource.java |   28 -
 .../resource/SecondaryStorageResourceHandler.java  |   24 -
 .../storage/resource/StoragePoolResource.java      |    4 +
 .../cloud/storage/snapshot/SnapshotSchedule.java   |   46 -
 .../cloud/storage/template/DownloadManager.java    |  103 -
 .../storage/template/DownloadManagerImpl.java      | 1049 ---
 .../com/cloud/storage/template/UploadManager.java  |   85 -
 .../cloud/storage/template/UploadManagerImpl.java  |  645 --
 core/src/com/cloud/user/AccountVO.java             |  182 -
 core/src/com/cloud/user/SSHKeyPairVO.java          |  119 -
 core/src/com/cloud/user/UserAccountVO.java         |  284 -
 core/src/com/cloud/user/UserStatisticsVO.java      |  165 -
 core/src/com/cloud/user/UserStatsLogVO.java        |  132 -
 core/src/com/cloud/user/UserVO.java                |  265 -
 core/src/com/cloud/vm/ConsoleProxy.java            |   27 -
 core/src/com/cloud/vm/ConsoleProxyVO.java          |  151 -
 core/src/com/cloud/vm/DomainRouterVO.java          |  246 -
 core/src/com/cloud/vm/InstanceGroupVMMapVO.java    |   71 -
 core/src/com/cloud/vm/InstanceGroupVO.java         |  120 -
 core/src/com/cloud/vm/SecondaryStorageVm.java      |   26 -
 core/src/com/cloud/vm/SecondaryStorageVmVO.java    |  135 -
 core/src/com/cloud/vm/SystemVm.java                |   26 -
 core/src/com/cloud/vm/UserVmCloneSettingVO.java    |   50 -
 core/src/com/cloud/vm/UserVmDetailVO.java          |   85 -
 core/src/com/cloud/vm/UserVmVO.java                |  137 -
 core/src/com/cloud/vm/VMInstanceVO.java            |  531 --
 core/src/com/cloud/vm/VirtualDisk.java             |   31 -
 core/src/com/cloud/vm/VirtualMachineName.java      |  190 -
 core/src/com/cloud/vm/VmDetailConstants.java       |   23 -
 core/src/com/cloud/vm/snapshot/VMSnapshotVO.java   |  224 -
 .../api/agent/test/AgentControlAnswerTest.java     |   35 +
 .../api/agent/test/AgentControlCommandTest.java    |   33 +
 .../cloudstack/api/agent/test/AnswerTest.java      |   73 +
 .../api/agent/test/AttachIsoCommandTest.java       |   80 +
 .../api/agent/test/AttachVolumeAnswerTest.java     |   65 +
 .../api/agent/test/AttachVolumeCommandTest.java    |  120 +
 .../api/agent/test/BackupSnapshotAnswerTest.java   |   75 +
 .../api/agent/test/BackupSnapshotCommandTest.java  |  301 +
 .../api/agent/test/BumpUpPriorityCommandTest.java  |   83 +
 .../api/agent/test/CancelCommandTest.java          |   46 +
 .../api/agent/test/ChangeAgentAnswerTest.java      |   44 +
 .../api/agent/test/ChangeAgentCommandTest.java     |   50 +
 .../api/agent/test/CheckHealthAnswerTest.java      |   49 +
 .../api/agent/test/CheckHealthCommandTest.java     |   40 +
 .../api/agent/test/CheckNetworkAnswerTest.java     |   62 +
 .../api/agent/test/CheckNetworkCommandTest.java    |   53 +
 .../api/agent/test/CheckOnHostCommandTest.java     |  483 +
 .../api/agent/test/SnapshotCommandTest.java        |  209 +
 .../agent/api/test/ResizeVolumeCommandTest.java    |  229 +
 debian/cloudstack-awsapi.install                   |   10 +-
 debian/rules                                       |   23 +-
 deps/install-non-oss.sh                            |   13 -
 docs/en-US/Admin_Guide.xml                         |    2 +-
 docs/en-US/Book_Info.xml                           |    2 +-
 docs/en-US/CloudStack_Nicira_NVP_Guide.xml         |    2 +-
 docs/en-US/Common_Content/feedback.xml             |   24 +
 docs/en-US/Developers_Guide.xml                    |    2 +-
 docs/en-US/Installation_Guide.xml                  |    2 +-
 docs/en-US/MidoNet_Plugin_Guide.ent                |   22 +
 docs/en-US/MidoNet_Plugin_Guide.xml                |   52 +
 docs/en-US/Preface.xml                             |    2 +-
 docs/en-US/Release_Notes.xml                       | 7172 ++++++++++++---
 docs/en-US/about-working-with-vms.xml              |   85 +-
 docs/en-US/add-clusters-vsphere.xml                |  104 +-
 docs/en-US/added-API-commands-4.2.xml              |  121 +
 docs/en-US/added-API-commands.xml                  |    2 +-
 docs/en-US/advanced-zone-configuration.xml         |    2 +-
 docs/en-US/advanced-zone-network-traffic-types.xml |    2 +-
 docs/en-US/append-displayname-vms.xml              |   84 +
 docs/en-US/aws-ec2-configuration.xml               |    2 +-
 docs/en-US/aws-ec2-introduction.xml                |    2 +-
 docs/en-US/basic-zone-network-traffic-types.xml    |    4 +-
 docs/en-US/build-nonoss.xml                        |   49 +
 docs/en-US/building-documentation.xml              |    2 +-
 docs/en-US/building-marvin.xml                     |    2 +-
 docs/en-US/building-translation.xml                |    2 +-
 ...change-console-proxy-ssl-certificate-domain.xml |    2 +-
 docs/en-US/change-database-password.xml            |    6 +-
 docs/en-US/changed-API-commands-4.2.xml            |  134 +
 docs/en-US/citrix-xenserver-installation.xml       |    4 +-
 docs/en-US/configure-package-repository.xml        |    2 +-
 docs/en-US/configure-usage-server.xml              |    4 +-
 docs/en-US/configure-vpn.xml                       |    2 +-
 docs/en-US/console-proxy.xml                       |    2 +-
 docs/en-US/creating-network-offerings.xml          |   47 +-
 docs/en-US/database-replication.xml                |    6 +-
 docs/en-US/delete-event-alerts.xml                 |   59 +
 docs/en-US/elastic-ip.xml                          |  103 +
 docs/en-US/events.xml                              |    5 +-
 .../external-firewalls-and-load-balancers.xml      |    1 +
 docs/en-US/feedback.xml                            |   24 +
 docs/en-US/gslb.xml                                |  499 +
 docs/en-US/guest-ip-ranges.xml                     |   10 +-
 docs/en-US/hypervisor-host-install-agent.xml       |    6 +-
 docs/en-US/hypervisor-host-install-libvirt.xml     |    4 +-
 ...hypervisor-host-install-network-openvswitch.xml |    2 +-
 docs/en-US/hypervisor-host-install-network.xml     |    4 +-
 docs/en-US/hypervisor-kvm-install-flow.xml         |    1 +
 .../hypervisor-support-for-primarystorage.xml      |  148 +-
 docs/en-US/images/VMSnapshotButton.png             |  Bin 0 -> 967 bytes
 docs/en-US/images/add-cluster.png                  |  Bin 46302 -> 35697 bytes
 docs/en-US/images/add-gslb.png                     |  Bin 0 -> 17665 bytes
 docs/en-US/images/add-vlan-icon.png                |  Bin 0 -> 860 bytes
 docs/en-US/images/dvswitch-config.png              |  Bin 0 -> 41955 bytes
 docs/en-US/images/dvswitchconfig.png               |  Bin 0 -> 38642 bytes
 docs/en-US/images/eip-ns-basiczone.png             |  Bin 0 -> 63227 bytes
 docs/en-US/images/gslb.png                         |  Bin 0 -> 60354 bytes
 docs/en-US/images/revert-vm.png                    |  Bin 0 -> 860 bytes
 .../increase-management-server-max-memory.xml      |    2 +-
 docs/en-US/install-usage-server.xml                |    2 +-
 docs/en-US/ipv6-support.xml                        |    4 +-
 docs/en-US/libcloud-examples.xml                   |   75 +
 docs/en-US/limit-accounts-domains.xml              |  371 +
 docs/en-US/lxc-install.xml                         |    4 +-
 .../en-US/management-server-install-prepare-os.xml |    2 +-
 docs/en-US/management-server-lb.xml                |    2 +-
 docs/en-US/minimum-system-requirements.xml         |    2 +-
 docs/en-US/multiple-ip-nic.xml                     |   91 +
 docs/en-US/network-offerings.xml                   |   83 +-
 docs/en-US/networks.xml                            |    5 +-
 docs/en-US/non-contiguous-vlan.xml                 |   68 +
 docs/en-US/plugin-midonet-about.xml                |   27 +
 docs/en-US/plugin-midonet-features.xml             |   57 +
 docs/en-US/plugin-midonet-introduction.xml         |   26 +
 docs/en-US/plugin-midonet-preparations.xml         |   90 +
 docs/en-US/plugin-midonet-provider.xml             |   39 +
 docs/en-US/plugin-midonet-revisions.xml            |   45 +
 docs/en-US/plugin-midonet-ui.xml                   |   65 +
 docs/en-US/plugin-midonet-usage.xml                |   29 +
 docs/en-US/set-database-buffer-pool-size.xml       |    2 +-
 docs/en-US/set-global-project-resource-limits.xml  |    2 +-
 docs/en-US/set-projects-creator-permissions.xml    |    2 +-
 docs/en-US/set-up-invitations.xml                  |    2 +-
 docs/en-US/set-up-network-for-users.xml            |   13 +-
 docs/en-US/signing-api-calls-python.xml            |  101 +
 docs/en-US/signing-api-requests.xml                |    3 +
 docs/en-US/source-build.xml                        |    4 +-
 docs/en-US/source.xml                              |    1 +
 docs/en-US/stop-restart-management-server.xml      |    6 +-
 docs/en-US/sys-offering-sysvm.xml                  |    2 +-
 docs/en-US/tools.xml                               |    1 +
 docs/en-US/translating-documentation.xml           |    2 +-
 .../troubleshooting-working-with-server-logs.xml   |    6 +-
 docs/en-US/using-netscaler-load-balancers.xml      |  132 +-
 docs/en-US/using-sshkeys.xml                       |    2 +-
 docs/en-US/virtual-machines.xml                    |    2 +
 docs/en-US/vlan-provisioning.xml                   |    2 +
 docs/en-US/vm-snapshots.xml                        |  148 +
 docs/en-US/vmware-cluster-config-dvswitch.xml      |  193 +
 docs/en-US/vmware-install.xml                      |  511 +-
 docs/en-US/vmware-requirements.xml                 |    2 +-
 docs/en-US/whats-new.xml                           |    6 +-
 docs/en-US/work-with-usage.xml                     |   26 +-
 docs/en-US/writing-new-documentation.xml           |    4 +-
 docs/en-US/zone-add.xml                            |    2 +-
 docs/publican-plugin-midonet.cfg                   |   28 +
 engine/api/pom.xml                                 |   10 +-
 .../subsystem/api/storage/CommandResult.java       |    2 +-
 .../api/storage/ObjectInDataStoreStateMachine.java |    4 +-
 .../subsystem/api/storage/VolumeService.java       |    7 +-
 .../datastore/db/StoragePoolDetailsDao.java        |    1 +
 .../engine/cloud/entity/api/VMEntityManager.java   |    2 +-
 .../cloud/entity/api/VMEntityManagerImpl.java      |  117 +-
 .../cloud/entity/api/VirtualMachineEntityImpl.java |    2 +-
 .../platform/orchestration/CloudOrchestrator.java  |   63 +-
 engine/pom.xml                                     |    2 -
 engine/schema/src/com/cloud/alert/AlertVO.java     |  183 +
 .../schema/src/com/cloud/alert/dao/AlertDao.java   |   33 +
 .../src/com/cloud/alert/dao/AlertDaoImpl.java      |  156 +
 .../schema/src/com/cloud/capacity/CapacityVO.java  |  204 +
 .../src/com/cloud/capacity/dao/CapacityDao.java    |   45 +
 .../com/cloud/capacity/dao/CapacityDaoImpl.java    |  816 ++
 .../src/com/cloud/certificate/CertificateVO.java   |   63 +
 .../com/cloud/certificate/dao/CertificateDao.java  |   24 +
 .../cloud/certificate/dao/CertificateDaoImpl.java  |   63 +
 .../cluster/ClusterInvalidSessionException.java    |   33 +
 .../cloud/cluster/ManagementServerHostPeerVO.java  |  120 +
 .../com/cloud/cluster/ManagementServerHostVO.java  |  182 +
 .../cloud/cluster/agentlb/HostTransferMapVO.java   |   98 +
 .../cluster/agentlb/dao/HostTransferMapDao.java    |   45 +
 .../agentlb/dao/HostTransferMapDaoImpl.java        |  146 +
 .../cloud/cluster/dao/ManagementServerHostDao.java |   48 +
 .../cluster/dao/ManagementServerHostDaoImpl.java   |  276 +
 .../cluster/dao/ManagementServerHostPeerDao.java   |   27 +
 .../dao/ManagementServerHostPeerDaoImpl.java       |  108 +
 .../com/cloud/configuration/ConfigurationVO.java   |  107 +
 .../com/cloud/configuration/ResourceCountVO.java   |  131 +
 .../com/cloud/configuration/ResourceLimitVO.java   |  128 +
 .../cloud/configuration/dao/ConfigurationDao.java  |   69 +
 .../configuration/dao/ConfigurationDaoImpl.java    |  225 +
 .../cloud/configuration/dao/ResourceCountDao.java  |   58 +
 .../configuration/dao/ResourceCountDaoImpl.java    |  222 +
 .../cloud/configuration/dao/ResourceLimitDao.java  |   35 +
 .../configuration/dao/ResourceLimitDaoImpl.java    |  100 +
 .../schema/src/com/cloud/dc/AccountVlanMapVO.java  |   65 +
 .../schema/src/com/cloud/dc/ClusterDetailsDao.java |   32 +
 .../src/com/cloud/dc/ClusterDetailsDaoImpl.java    |  133 +
 .../schema/src/com/cloud/dc/ClusterDetailsVO.java  |   74 +
 engine/schema/src/com/cloud/dc/ClusterVO.java      |  189 +
 .../schema/src/com/cloud/dc/ClusterVSMMapVO.java   |   62 +
 .../src/com/cloud/dc/DataCenterIpAddressVO.java    |  115 +
 .../cloud/dc/DataCenterLinkLocalIpAddressVO.java   |  108 +
 engine/schema/src/com/cloud/dc/DataCenterVO.java   |  460 +
 .../schema/src/com/cloud/dc/DataCenterVnetVO.java  |  120 +
 engine/schema/src/com/cloud/dc/DcDetailVO.java     |   73 +
 engine/schema/src/com/cloud/dc/HostPodVO.java      |  197 +
 engine/schema/src/com/cloud/dc/PodCluster.java     |   67 +
 engine/schema/src/com/cloud/dc/PodVlanMapVO.java   |   62 +
 engine/schema/src/com/cloud/dc/PodVlanVO.java      |   98 +
 .../com/cloud/dc/StorageNetworkIpAddressVO.java    |  120 +
 .../src/com/cloud/dc/StorageNetworkIpRangeVO.java  |  184 +
 engine/schema/src/com/cloud/dc/VlanVO.java         |  196 +
 .../src/com/cloud/dc/dao/AccountVlanMapDao.java    |   30 +
 .../com/cloud/dc/dao/AccountVlanMapDaoImpl.java    |   75 +
 engine/schema/src/com/cloud/dc/dao/ClusterDao.java |   37 +
 .../src/com/cloud/dc/dao/ClusterDaoImpl.java       |  241 +
 .../src/com/cloud/dc/dao/ClusterVSMMapDao.java     |   29 +
 .../src/com/cloud/dc/dao/ClusterVSMMapDaoImpl.java |   95 +
 .../schema/src/com/cloud/dc/dao/DataCenterDao.java |   82 +
 .../src/com/cloud/dc/dao/DataCenterDaoImpl.java    |  425 +
 .../com/cloud/dc/dao/DataCenterIpAddressDao.java   |   38 +
 .../cloud/dc/dao/DataCenterIpAddressDaoImpl.java   |  225 +
 .../dc/dao/DataCenterLinkLocalIpAddressDao.java    |   32 +
 .../dao/DataCenterLinkLocalIpAddressDaoImpl.java   |  188 +
 .../src/com/cloud/dc/dao/DataCenterVnetDao.java    |   49 +
 .../com/cloud/dc/dao/DataCenterVnetDaoImpl.java    |  318 +
 .../schema/src/com/cloud/dc/dao/DcDetailsDao.java  |   32 +
 .../src/com/cloud/dc/dao/DcDetailsDaoImpl.java     |   97 +
 engine/schema/src/com/cloud/dc/dao/HostPodDao.java |   35 +
 .../src/com/cloud/dc/dao/HostPodDaoImpl.java       |  134 +
 engine/schema/src/com/cloud/dc/dao/PodVlanDao.java |   30 +
 .../src/com/cloud/dc/dao/PodVlanDaoImpl.java       |  139 +
 .../schema/src/com/cloud/dc/dao/PodVlanMapDao.java |   30 +
 .../src/com/cloud/dc/dao/PodVlanMapDaoImpl.java    |   75 +
 .../cloud/dc/dao/StorageNetworkIpAddressDao.java   |   32 +
 .../dc/dao/StorageNetworkIpAddressDaoImpl.java     |  114 +
 .../com/cloud/dc/dao/StorageNetworkIpRangeDao.java |   32 +
 .../cloud/dc/dao/StorageNetworkIpRangeDaoImpl.java |   78 +
 engine/schema/src/com/cloud/dc/dao/VlanDao.java    |   55 +
 .../schema/src/com/cloud/dc/dao/VlanDaoImpl.java   |  334 +
 engine/schema/src/com/cloud/domain/DomainVO.java   |  215 +
 .../schema/src/com/cloud/domain/dao/DomainDao.java |   34 +
 .../src/com/cloud/domain/dao/DomainDaoImpl.java    |  278 +
 engine/schema/src/com/cloud/event/EventVO.java     |  194 +
 .../schema/src/com/cloud/event/UsageEventVO.java   |  216 +
 .../schema/src/com/cloud/event/dao/EventDao.java   |   38 +
 .../src/com/cloud/event/dao/EventDaoImpl.java      |  109 +
 .../src/com/cloud/event/dao/UsageEventDao.java     |   35 +
 .../src/com/cloud/event/dao/UsageEventDaoImpl.java |  187 +
 engine/schema/src/com/cloud/host/DetailVO.java     |   73 +
 engine/schema/src/com/cloud/host/HostTagVO.java    |   65 +
 engine/schema/src/com/cloud/host/HostVO.java       |  732 ++
 engine/schema/src/com/cloud/host/dao/HostDao.java  |   83 +
 .../schema/src/com/cloud/host/dao/HostDaoImpl.java |  920 ++
 .../src/com/cloud/host/dao/HostDetailsDao.java     |   32 +
 .../src/com/cloud/host/dao/HostDetailsDaoImpl.java |  110 +
 .../schema/src/com/cloud/host/dao/HostTagsDao.java |   30 +
 .../src/com/cloud/host/dao/HostTagsDaoImpl.java    |   75 +
 .../cloud/hypervisor/HypervisorCapabilitiesVO.java |  212 +
 .../hypervisor/dao/HypervisorCapabilitiesDao.java  |   38 +
 .../dao/HypervisorCapabilitiesDaoImpl.java         |  105 +
 .../schema/src/com/cloud/keystore/KeystoreDao.java |   29 +
 .../src/com/cloud/keystore/KeystoreDaoImpl.java    |  118 +
 .../schema/src/com/cloud/keystore/KeystoreVO.java  |  101 +
 .../src/com/cloud/migration/DiskOffering20Dao.java |   22 +
 .../com/cloud/migration/DiskOffering20DaoImpl.java |   27 +
 .../src/com/cloud/migration/DiskOffering20VO.java  |  113 +
 .../src/com/cloud/migration/DiskOffering21Dao.java |   23 +
 .../com/cloud/migration/DiskOffering21DaoImpl.java |   27 +
 .../src/com/cloud/migration/DiskOffering21VO.java  |  257 +
 .../com/cloud/migration/ServiceOffering20Dao.java  |   22 +
 .../cloud/migration/ServiceOffering20DaoImpl.java  |   27 +
 .../com/cloud/migration/ServiceOffering20VO.java   |  199 +
 .../com/cloud/migration/ServiceOffering21Dao.java  |   22 +
 .../cloud/migration/ServiceOffering21DaoImpl.java  |   27 +
 .../com/cloud/migration/ServiceOffering21VO.java   |  178 +
 .../com/cloud/network/LBHealthCheckPolicyVO.java   |  157 +
 .../src/com/cloud/network/UserIpv6AddressVO.java   |  188 +
 engine/schema/src/com/cloud/network/VpnUserVO.java |  131 +
 .../network/as/AutoScalePolicyConditionMapVO.java  |   61 +
 .../com/cloud/network/as/AutoScalePolicyVO.java    |  134 +
 .../network/as/AutoScaleVmGroupPolicyMapVO.java    |   64 +
 .../com/cloud/network/as/AutoScaleVmGroupVO.java   |  191 +
 .../com/cloud/network/as/AutoScaleVmProfileVO.java |  218 +
 .../src/com/cloud/network/as/ConditionVO.java      |  129 +
 .../schema/src/com/cloud/network/as/CounterVO.java |  111 +
 .../as/dao/AutoScalePolicyConditionMapDao.java     |   28 +
 .../as/dao/AutoScalePolicyConditionMapDaoImpl.java |   61 +
 .../cloud/network/as/dao/AutoScalePolicyDao.java   |   24 +
 .../network/as/dao/AutoScalePolicyDaoImpl.java     |   38 +
 .../cloud/network/as/dao/AutoScaleVmGroupDao.java  |   28 +
 .../network/as/dao/AutoScaleVmGroupDaoImpl.java    |   65 +
 .../as/dao/AutoScaleVmGroupPolicyMapDao.java       |   30 +
 .../as/dao/AutoScaleVmGroupPolicyMapDaoImpl.java   |   77 +
 .../network/as/dao/AutoScaleVmProfileDao.java      |   25 +
 .../network/as/dao/AutoScaleVmProfileDaoImpl.java  |   38 +
 .../src/com/cloud/network/as/dao/ConditionDao.java |   28 +
 .../com/cloud/network/as/dao/ConditionDaoImpl.java |   56 +
 .../src/com/cloud/network/as/dao/CounterDao.java   |   29 +
 .../com/cloud/network/as/dao/CounterDaoImpl.java   |   70 +
 .../cloud/network/dao/AccountGuestVlanMapDao.java  |   34 +
 .../network/dao/AccountGuestVlanMapDaoImpl.java    |   83 +
 .../cloud/network/dao/AccountGuestVlanMapVO.java   |   94 +
 .../network/dao/ExternalFirewallDeviceDao.java     |   58 +
 .../network/dao/ExternalFirewallDeviceDaoImpl.java |   96 +
 .../network/dao/ExternalFirewallDeviceVO.java      |  161 +
 .../network/dao/ExternalLoadBalancerDeviceDao.java |   74 +
 .../dao/ExternalLoadBalancerDeviceDaoImpl.java     |  127 +
 .../network/dao/ExternalLoadBalancerDeviceVO.java  |  227 +
 .../cloud/network/dao/FirewallRulesCidrsDao.java   |   29 +
 .../network/dao/FirewallRulesCidrsDaoImpl.java     |   70 +
 .../cloud/network/dao/FirewallRulesCidrsVO.java    |   65 +
 .../com/cloud/network/dao/FirewallRulesDao.java    |   64 +
 .../cloud/network/dao/FirewallRulesDaoImpl.java    |  352 +
 .../src/com/cloud/network/dao/IPAddressDao.java    |   71 +
 .../com/cloud/network/dao/IPAddressDaoImpl.java    |  376 +
 .../src/com/cloud/network/dao/IPAddressVO.java     |  308 +
 .../network/dao/InlineLoadBalancerNicMapDao.java   |   24 +
 .../dao/InlineLoadBalancerNicMapDaoImpl.java       |   46 +
 .../network/dao/InlineLoadBalancerNicMapVO.java    |   60 +
 .../cloud/network/dao/LBHealthCheckPolicyDao.java  |   35 +
 .../network/dao/LBHealthCheckPolicyDaoImpl.java    |   71 +
 .../cloud/network/dao/LBStickinessPolicyDao.java   |   34 +
 .../network/dao/LBStickinessPolicyDaoImpl.java     |   69 +
 .../cloud/network/dao/LBStickinessPolicyVO.java    |  145 +
 .../src/com/cloud/network/dao/LoadBalancerDao.java |   32 +
 .../com/cloud/network/dao/LoadBalancerDaoImpl.java |   79 +
 .../cloud/network/dao/LoadBalancerVMMapDao.java    |   31 +
 .../network/dao/LoadBalancerVMMapDaoImpl.java      |   97 +
 .../com/cloud/network/dao/LoadBalancerVMMapVO.java |   89 +
 .../src/com/cloud/network/dao/LoadBalancerVO.java  |  116 +
 .../com/cloud/network/dao/NetworkAccountDao.java   |   22 +
 .../cloud/network/dao/NetworkAccountDaoImpl.java   |   29 +
 .../com/cloud/network/dao/NetworkAccountVO.java    |   72 +
 .../src/com/cloud/network/dao/NetworkDao.java      |  114 +
 .../src/com/cloud/network/dao/NetworkDaoImpl.java  |  621 ++
 .../com/cloud/network/dao/NetworkDomainDao.java    |   27 +
 .../cloud/network/dao/NetworkDomainDaoImpl.java    |   75 +
 .../src/com/cloud/network/dao/NetworkDomainVO.java |   72 +
 .../network/dao/NetworkExternalFirewallDao.java    |   38 +
 .../dao/NetworkExternalFirewallDaoImpl.java        |   61 +
 .../network/dao/NetworkExternalFirewallVO.java     |   88 +
 .../dao/NetworkExternalLoadBalancerDao.java        |   38 +
 .../dao/NetworkExternalLoadBalancerDaoImpl.java    |   62 +
 .../network/dao/NetworkExternalLoadBalancerVO.java |   89 +
 .../src/com/cloud/network/dao/NetworkOpDao.java    |   26 +
 .../com/cloud/network/dao/NetworkOpDaoImpl.java    |   84 +
 .../src/com/cloud/network/dao/NetworkOpVO.java     |   76 +
 .../cloud/network/dao/NetworkRuleConfigDao.java    |   26 +
 .../network/dao/NetworkRuleConfigDaoImpl.java      |   51 +
 .../com/cloud/network/dao/NetworkRuleConfigVO.java |   93 +
 .../cloud/network/dao/NetworkServiceMapDao.java    |   39 +
 .../network/dao/NetworkServiceMapDaoImpl.java      |  176 +
 .../com/cloud/network/dao/NetworkServiceMapVO.java |   92 +
 .../src/com/cloud/network/dao/NetworkVO.java       |  540 ++
 .../com/cloud/network/dao/PhysicalNetworkDao.java  |   28 +
 .../cloud/network/dao/PhysicalNetworkDaoImpl.java  |   79 +
 .../dao/PhysicalNetworkIsolationMethodDaoImpl.java |   70 +
 .../dao/PhysicalNetworkIsolationMethodVO.java      |   68 +
 .../dao/PhysicalNetworkServiceProviderDao.java     |   28 +
 .../dao/PhysicalNetworkServiceProviderDaoImpl.java |  131 +
 .../dao/PhysicalNetworkServiceProviderVO.java      |  322 +
 .../network/dao/PhysicalNetworkTagDaoImpl.java     |   63 +
 .../cloud/network/dao/PhysicalNetworkTagVO.java    |   68 +
 .../network/dao/PhysicalNetworkTrafficTypeDao.java |   33 +
 .../dao/PhysicalNetworkTrafficTypeDaoImpl.java     |  143 +
 .../network/dao/PhysicalNetworkTrafficTypeVO.java  |  149 +
 .../com/cloud/network/dao/PhysicalNetworkVO.java   |  246 +
 .../src/com/cloud/network/dao/PortProfileDao.java  |   50 +
 .../com/cloud/network/dao/PortProfileDaoImpl.java  |   89 +
 .../src/com/cloud/network/dao/PortProfileVO.java   |  204 +
 .../com/cloud/network/dao/RemoteAccessVpnDao.java  |   30 +
 .../cloud/network/dao/RemoteAccessVpnDaoImpl.java  |   84 +
 .../com/cloud/network/dao/RemoteAccessVpnVO.java   |  142 +
 .../com/cloud/network/dao/RouterNetworkDao.java    |   26 +
 .../cloud/network/dao/RouterNetworkDaoImpl.java    |   62 +
 .../src/com/cloud/network/dao/RouterNetworkVO.java |   75 +
 .../network/dao/Site2SiteCustomerGatewayDao.java   |   27 +
 .../dao/Site2SiteCustomerGatewayDaoImpl.java       |   66 +
 .../network/dao/Site2SiteCustomerGatewayVO.java    |  206 +
 .../network/dao/Site2SiteVpnConnectionDao.java     |   29 +
 .../network/dao/Site2SiteVpnConnectionDaoImpl.java |   97 +
 .../network/dao/Site2SiteVpnConnectionVO.java      |  143 +
 .../cloud/network/dao/Site2SiteVpnGatewayDao.java  |   23 +
 .../network/dao/Site2SiteVpnGatewayDaoImpl.java    |   50 +
 .../cloud/network/dao/Site2SiteVpnGatewayVO.java   |  114 +
 .../com/cloud/network/dao/UserIpv6AddressDao.java  |   41 +
 .../cloud/network/dao/UserIpv6AddressDaoImpl.java  |  122 +
 .../network/dao/VirtualRouterProviderDao.java      |   31 +
 .../network/dao/VirtualRouterProviderDaoImpl.java  |   79 +
 .../src/com/cloud/network/dao/VpnUserDao.java      |   28 +
 .../src/com/cloud/network/dao/VpnUserDaoImpl.java  |   87 +
 .../network/element/VirtualRouterProviderVO.java   |  120 +
 .../com/cloud/network/rules/FirewallRuleVO.java    |  268 +
 .../cloud/network/rules/PortForwardingRuleVO.java  |   96 +
 .../network/rules/dao/PortForwardingRulesDao.java  |   47 +
 .../rules/dao/PortForwardingRulesDaoImpl.java      |  162 +
 .../network/security/SecurityGroupRuleVO.java      |  167 +
 .../network/security/SecurityGroupRulesVO.java     |  169 +
 .../network/security/SecurityGroupVMMapVO.java     |   89 +
 .../cloud/network/security/SecurityGroupVO.java    |   99 +
 .../cloud/network/security/SecurityGroupWork.java  |   40 +
 .../network/security/SecurityGroupWorkVO.java      |  135 +
 .../com/cloud/network/security/VmRulesetLogVO.java |   81 +
 .../network/security/dao/SecurityGroupDao.java     |   30 +
 .../network/security/dao/SecurityGroupDaoImpl.java |  136 +
 .../network/security/dao/SecurityGroupRuleDao.java |   35 +
 .../security/dao/SecurityGroupRuleDaoImpl.java     |  176 +
 .../security/dao/SecurityGroupRulesDao.java        |   48 +
 .../security/dao/SecurityGroupRulesDaoImpl.java    |   96 +
 .../security/dao/SecurityGroupVMMapDao.java        |   38 +
 .../security/dao/SecurityGroupVMMapDaoImpl.java    |  166 +
 .../network/security/dao/SecurityGroupWorkDao.java |   49 +
 .../security/dao/SecurityGroupWorkDaoImpl.java     |  241 +
 .../network/security/dao/VmRulesetLogDao.java      |   29 +
 .../network/security/dao/VmRulesetLogDaoImpl.java  |  200 +
 .../src/com/cloud/network/vpc/PrivateIpVO.java     |  103 +
 .../src/com/cloud/network/vpc/StaticRouteVO.java   |  141 +
 .../src/com/cloud/network/vpc/VpcGatewayVO.java    |  206 +
 .../cloud/network/vpc/VpcOfferingServiceMapVO.java |   89 +
 .../src/com/cloud/network/vpc/VpcOfferingVO.java   |  151 +
 .../src/com/cloud/network/vpc/VpcServiceMapVO.java |   90 +
 engine/schema/src/com/cloud/network/vpc/VpcVO.java |  181 +
 .../com/cloud/network/vpc/dao/PrivateIpDao.java    |   75 +
 .../cloud/network/vpc/dao/PrivateIpDaoImpl.java    |  156 +
 .../com/cloud/network/vpc/dao/StaticRouteDao.java  |   35 +
 .../cloud/network/vpc/dao/StaticRouteDaoImpl.java  |  119 +
 .../src/com/cloud/network/vpc/dao/VpcDao.java      |   47 +
 .../src/com/cloud/network/vpc/dao/VpcDaoImpl.java  |  152 +
 .../com/cloud/network/vpc/dao/VpcGatewayDao.java   |   26 +
 .../cloud/network/vpc/dao/VpcGatewayDaoImpl.java   |   62 +
 .../com/cloud/network/vpc/dao/VpcOfferingDao.java  |   32 +
 .../cloud/network/vpc/dao/VpcOfferingDaoImpl.java  |   71 +
 .../network/vpc/dao/VpcOfferingServiceMapDao.java  |   41 +
 .../vpc/dao/VpcOfferingServiceMapDaoImpl.java      |  119 +
 .../cloud/network/vpc/dao/VpcServiceMapDao.java    |   40 +
 .../network/vpc/dao/VpcServiceMapDaoImpl.java      |  115 +
 .../cloud/offerings/NetworkOfferingDetailsVO.java  |   90 +
 .../offerings/NetworkOfferingServiceMapVO.java     |   94 +
 .../src/com/cloud/offerings/NetworkOfferingVO.java |  417 +
 .../cloud/offerings/dao/NetworkOfferingDao.java    |   64 +
 .../offerings/dao/NetworkOfferingDaoImpl.java      |  193 +
 .../offerings/dao/NetworkOfferingDetailsDao.java   |   31 +
 .../dao/NetworkOfferingDetailsDaoImpl.java         |   79 +
 .../dao/NetworkOfferingServiceMapDao.java          |   50 +
 .../dao/NetworkOfferingServiceMapDaoImpl.java      |  171 +
 .../src/com/cloud/projects/ProjectAccountVO.java   |   96 +
 .../com/cloud/projects/ProjectInvitationVO.java    |  150 +
 .../schema/src/com/cloud/projects/ProjectVO.java   |  163 +
 .../com/cloud/projects/dao/ProjectAccountDao.java  |   43 +
 .../cloud/projects/dao/ProjectAccountDaoImpl.java  |  157 +
 .../src/com/cloud/projects/dao/ProjectDao.java     |   37 +
 .../src/com/cloud/projects/dao/ProjectDaoImpl.java |  124 +
 .../cloud/projects/dao/ProjectInvitationDao.java   |   44 +
 .../projects/dao/ProjectInvitationDaoImpl.java     |  171 +
 .../com/cloud/secstorage/CommandExecLogDao.java    |   25 +
 .../cloud/secstorage/CommandExecLogDaoImpl.java    |   49 +
 .../src/com/cloud/secstorage/CommandExecLogVO.java |  112 +
 .../src/com/cloud/service/ServiceOfferingVO.java   |  211 +
 .../com/cloud/service/dao/ServiceOfferingDao.java  |   34 +
 .../cloud/service/dao/ServiceOfferingDaoImpl.java  |  157 +
 .../src/com/cloud/storage/DiskOfferingVO.java      |  318 +
 .../src/com/cloud/storage/GuestOSCategoryVO.java   |   68 +
 engine/schema/src/com/cloud/storage/GuestOSVO.java |   90 +
 .../src/com/cloud/storage/LaunchPermissionVO.java  |   57 +
 engine/schema/src/com/cloud/storage/S3VO.java      |  209 +
 .../src/com/cloud/storage/SnapshotPolicyVO.java    |  133 +
 .../src/com/cloud/storage/SnapshotScheduleVO.java  |  125 +
 .../schema/src/com/cloud/storage/SnapshotVO.java   |  298 +
 .../com/cloud/storage/StoragePoolHostAssoc.java    |   35 +
 .../src/com/cloud/storage/StoragePoolHostVO.java   |  109 +
 .../src/com/cloud/storage/StoragePoolWorkVO.java   |  118 +
 engine/schema/src/com/cloud/storage/SwiftVO.java   |  108 +
 engine/schema/src/com/cloud/storage/UploadVO.java  |  268 +
 .../src/com/cloud/storage/VMTemplateDetailVO.java  |   84 +
 .../src/com/cloud/storage/VMTemplateHostVO.java    |  322 +
 .../src/com/cloud/storage/VMTemplateS3VO.java      |  204 +
 .../com/cloud/storage/VMTemplateStoragePoolVO.java |  275 +
 .../src/com/cloud/storage/VMTemplateSwiftVO.java   |  107 +
 .../schema/src/com/cloud/storage/VMTemplateVO.java |  534 ++
 .../src/com/cloud/storage/VMTemplateZoneVO.java    |  116 +
 .../schema/src/com/cloud/storage/VolumeHostVO.java |  347 +
 engine/schema/src/com/cloud/storage/VolumeVO.java  |  454 +
 .../src/com/cloud/storage/dao/DiskOfferingDao.java |   31 +
 .../com/cloud/storage/dao/DiskOfferingDaoImpl.java |  152 +
 .../com/cloud/storage/dao/GuestOSCategoryDao.java  |   24 +
 .../cloud/storage/dao/GuestOSCategoryDaoImpl.java  |   34 +
 .../src/com/cloud/storage/dao/GuestOSDao.java      |   26 +
 .../src/com/cloud/storage/dao/GuestOSDaoImpl.java  |   51 +
 .../com/cloud/storage/dao/LaunchPermissionDao.java |   61 +
 .../cloud/storage/dao/LaunchPermissionDaoImpl.java |  158 +
 engine/schema/src/com/cloud/storage/dao/S3Dao.java |   29 +
 .../src/com/cloud/storage/dao/S3DaoImpl.java       |   50 +
 .../src/com/cloud/storage/dao/SnapshotDao.java     |   54 +
 .../src/com/cloud/storage/dao/SnapshotDaoImpl.java |  357 +
 .../com/cloud/storage/dao/SnapshotPolicyDao.java   |   38 +
 .../cloud/storage/dao/SnapshotPolicyDaoImpl.java   |  105 +
 .../com/cloud/storage/dao/SnapshotScheduleDao.java |   41 +
 .../cloud/storage/dao/SnapshotScheduleDaoImpl.java |  134 +
 .../storage/dao/StoragePoolDetailsDaoImpl.java     |   85 +
 .../com/cloud/storage/dao/StoragePoolHostDao.java  |   42 +
 .../cloud/storage/dao/StoragePoolHostDaoImpl.java  |  184 +
 .../com/cloud/storage/dao/StoragePoolWorkDao.java  |   38 +
 .../cloud/storage/dao/StoragePoolWorkDaoImpl.java  |  136 +
 .../schema/src/com/cloud/storage/dao/SwiftDao.java |   31 +
 .../src/com/cloud/storage/dao/SwiftDaoImpl.java    |   58 +
 .../src/com/cloud/storage/dao/UploadDao.java       |   36 +
 .../src/com/cloud/storage/dao/UploadDaoImpl.java   |   92 +
 .../src/com/cloud/storage/dao/VMTemplateDao.java   |   84 +
 .../com/cloud/storage/dao/VMTemplateDaoImpl.java   | 1136 +++
 .../cloud/storage/dao/VMTemplateDetailsDao.java    |   32 +
 .../storage/dao/VMTemplateDetailsDaoImpl.java      |   99 +
 .../com/cloud/storage/dao/VMTemplateHostDao.java   |   67 +
 .../cloud/storage/dao/VMTemplateHostDaoImpl.java   |  427 +
 .../com/cloud/storage/dao/VMTemplatePoolDao.java   |   49 +
 .../cloud/storage/dao/VMTemplatePoolDaoImpl.java   |  304 +
 .../src/com/cloud/storage/dao/VMTemplateS3Dao.java |   36 +
 .../com/cloud/storage/dao/VMTemplateS3DaoImpl.java |  105 +
 .../com/cloud/storage/dao/VMTemplateSwiftDao.java  |   37 +
 .../cloud/storage/dao/VMTemplateSwiftDaoImpl.java  |   87 +
 .../com/cloud/storage/dao/VMTemplateZoneDao.java   |   33 +
 .../cloud/storage/dao/VMTemplateZoneDaoImpl.java   |   89 +
 .../src/com/cloud/storage/dao/VolumeDao.java       |   92 +
 .../src/com/cloud/storage/dao/VolumeDaoImpl.java   |  459 +
 .../src/com/cloud/storage/dao/VolumeHostDao.java   |   40 +
 .../com/cloud/storage/dao/VolumeHostDaoImpl.java   |  165 +
 .../schema/src/com/cloud/tags/ResourceTagVO.java   |  160 +
 .../src/com/cloud/tags/dao/ResourceTagDao.java     |   37 +
 .../com/cloud/tags/dao/ResourceTagsDaoImpl.java    |   62 +
 .../src/com/cloud/upgrade/DatabaseCreator.java     |  233 +
 .../cloud/upgrade/DatabaseIntegrityChecker.java    |  264 +
 .../com/cloud/upgrade/DatabaseUpgradeChecker.java  |  369 +
 .../upgrade/PremiumDatabaseUpgradeChecker.java     |  148 +
 .../src/com/cloud/upgrade/dao/DbUpgrade.java       |   45 +
 .../src/com/cloud/upgrade/dao/DbUpgradeUtils.java  |  106 +
 .../src/com/cloud/upgrade/dao/Upgrade217to218.java |   66 +
 .../src/com/cloud/upgrade/dao/Upgrade218to22.java  | 2382 +++++
 .../upgrade/dao/Upgrade218to224DomainVlans.java    |  140 +
 .../cloud/upgrade/dao/Upgrade218to22Premium.java   |  100 +
 .../com/cloud/upgrade/dao/Upgrade2210to2211.java   |   64 +
 .../com/cloud/upgrade/dao/Upgrade2211to2212.java   |  139 +
 .../upgrade/dao/Upgrade2211to2212Premium.java      |   55 +
 .../com/cloud/upgrade/dao/Upgrade2212to2213.java   |  104 +
 .../com/cloud/upgrade/dao/Upgrade2213to2214.java   |  308 +
 .../src/com/cloud/upgrade/dao/Upgrade2214to30.java | 1326 +++
 .../src/com/cloud/upgrade/dao/Upgrade221to222.java |   66 +
 .../cloud/upgrade/dao/Upgrade221to222Premium.java  |   61 +
 .../src/com/cloud/upgrade/dao/Upgrade222to224.java |  610 ++
 .../cloud/upgrade/dao/Upgrade222to224Premium.java  |   87 +
 .../src/com/cloud/upgrade/dao/Upgrade224to225.java |  351 +
 .../src/com/cloud/upgrade/dao/Upgrade225to226.java |  108 +
 .../src/com/cloud/upgrade/dao/Upgrade227to228.java |  157 +
 .../cloud/upgrade/dao/Upgrade227to228Premium.java  |  132 +
 .../src/com/cloud/upgrade/dao/Upgrade228to229.java |  138 +
 .../com/cloud/upgrade/dao/Upgrade229to2210.java    |  194 +
 .../src/com/cloud/upgrade/dao/Upgrade301to302.java |  229 +
 .../src/com/cloud/upgrade/dao/Upgrade302to40.java  | 1082 +++
 .../src/com/cloud/upgrade/dao/Upgrade30to301.java  |  124 +
 .../src/com/cloud/upgrade/dao/Upgrade30xBase.java  |  311 +
 .../src/com/cloud/upgrade/dao/Upgrade40to41.java   |  164 +
 .../src/com/cloud/upgrade/dao/Upgrade410to420.java |  489 +
 .../cloud/upgrade/dao/UpgradeSnapshot217to224.java |   60 +
 .../cloud/upgrade/dao/UpgradeSnapshot223to224.java |   60 +
 .../src/com/cloud/upgrade/dao/VersionDao.java      |   25 +
 .../src/com/cloud/upgrade/dao/VersionDaoImpl.java  |  172 +
 .../src/com/cloud/upgrade/dao/VersionVO.java       |   91 +
 .../cloud/usage/ExternalPublicIpStatisticsVO.java  |   98 +
 .../src/com/cloud/usage/UsageIPAddressVO.java      |  121 +
 engine/schema/src/com/cloud/usage/UsageJobVO.java  |  180 +
 .../com/cloud/usage/UsageLoadBalancerPolicyVO.java |   91 +
 .../com/cloud/usage/UsageNetworkOfferingVO.java    |  117 +
 .../schema/src/com/cloud/usage/UsageNetworkVO.java |  144 +
 .../com/cloud/usage/UsagePortForwardingRuleVO.java |   91 +
 .../src/com/cloud/usage/UsageSecurityGroupVO.java  |   97 +
 .../schema/src/com/cloud/usage/UsageStorageVO.java |  115 +
 .../src/com/cloud/usage/UsageVMInstanceVO.java     |  121 +
 engine/schema/src/com/cloud/usage/UsageVO.java     |  260 +
 .../schema/src/com/cloud/usage/UsageVPNUserVO.java |  105 +
 .../schema/src/com/cloud/usage/UsageVolumeVO.java  |  115 +
 .../usage/dao/ExternalPublicIpStatisticsDao.java   |   33 +
 .../dao/ExternalPublicIpStatisticsDaoImpl.java     |   77 +
 .../schema/src/com/cloud/usage/dao/UsageDao.java   |   39 +
 .../src/com/cloud/usage/dao/UsageDaoImpl.java      |  273 +
 .../src/com/cloud/usage/dao/UsageIPAddressDao.java |   28 +
 .../com/cloud/usage/dao/UsageIPAddressDaoImpl.java |  145 +
 .../src/com/cloud/usage/dao/UsageJobDao.java       |   34 +
 .../src/com/cloud/usage/dao/UsageJobDaoImpl.java   |  200 +
 .../usage/dao/UsageLoadBalancerPolicyDao.java      |   29 +
 .../usage/dao/UsageLoadBalancerPolicyDaoImpl.java  |  169 +
 .../src/com/cloud/usage/dao/UsageNetworkDao.java   |   27 +
 .../com/cloud/usage/dao/UsageNetworkDaoImpl.java   |   98 +
 .../cloud/usage/dao/UsageNetworkOfferingDao.java   |   28 +
 .../usage/dao/UsageNetworkOfferingDaoImpl.java     |  153 +
 .../usage/dao/UsagePortForwardingRuleDao.java      |   29 +
 .../usage/dao/UsagePortForwardingRuleDaoImpl.java  |  169 +
 .../com/cloud/usage/dao/UsageSecurityGroupDao.java |   28 +
 .../cloud/usage/dao/UsageSecurityGroupDaoImpl.java |  151 +
 .../src/com/cloud/usage/dao/UsageStorageDao.java   |   31 +
 .../com/cloud/usage/dao/UsageStorageDaoImpl.java   |  211 +
 .../com/cloud/usage/dao/UsageVMInstanceDao.java    |   29 +
 .../cloud/usage/dao/UsageVMInstanceDaoImpl.java    |  137 +
 .../src/com/cloud/usage/dao/UsageVPNUserDao.java   |   28 +
 .../com/cloud/usage/dao/UsageVPNUserDaoImpl.java   |  150 +
 .../src/com/cloud/usage/dao/UsageVolumeDao.java    |   29 +
 .../com/cloud/usage/dao/UsageVolumeDaoImpl.java    |  178 +
 .../schema/src/com/cloud/user/AccountDetailVO.java |   75 +
 .../src/com/cloud/user/AccountDetailsDao.java      |   37 +
 .../src/com/cloud/user/AccountDetailsDaoImpl.java  |   96 +
 engine/schema/src/com/cloud/user/AccountVO.java    |  189 +
 engine/schema/src/com/cloud/user/SSHKeyPairVO.java |  119 +
 .../schema/src/com/cloud/user/UserAccountVO.java   |  284 +
 .../src/com/cloud/user/UserStatisticsVO.java       |  165 +
 .../schema/src/com/cloud/user/UserStatsLogVO.java  |  132 +
 engine/schema/src/com/cloud/user/UserVO.java       |  274 +
 .../schema/src/com/cloud/user/dao/AccountDao.java  |   52 +
 .../src/com/cloud/user/dao/AccountDaoImpl.java     |  267 +
 .../src/com/cloud/user/dao/SSHKeyPairDao.java      |   38 +
 .../src/com/cloud/user/dao/SSHKeyPairDaoImpl.java  |   85 +
 .../src/com/cloud/user/dao/UserAccountDao.java     |   27 +
 .../src/com/cloud/user/dao/UserAccountDaoImpl.java |   69 +
 engine/schema/src/com/cloud/user/dao/UserDao.java  |   52 +
 .../schema/src/com/cloud/user/dao/UserDaoImpl.java |  131 +
 .../src/com/cloud/user/dao/UserStatisticsDao.java  |   35 +
 .../com/cloud/user/dao/UserStatisticsDaoImpl.java  |  137 +
 .../src/com/cloud/user/dao/UserStatsLogDao.java    |   23 +
 .../com/cloud/user/dao/UserStatsLogDaoImpl.java    |   31 +
 engine/schema/src/com/cloud/vm/ConsoleProxyVO.java |  287 +
 engine/schema/src/com/cloud/vm/DomainRouterVO.java |  246 +
 .../src/com/cloud/vm/InstanceGroupVMMapVO.java     |   71 +
 .../schema/src/com/cloud/vm/InstanceGroupVO.java   |  120 +
 engine/schema/src/com/cloud/vm/ItWorkDao.java      |   45 +
 engine/schema/src/com/cloud/vm/ItWorkDaoImpl.java  |  108 +
 engine/schema/src/com/cloud/vm/ItWorkVO.java       |  179 +
 engine/schema/src/com/cloud/vm/NicVO.java          |  365 +
 .../src/com/cloud/vm/SecondaryStorageVmVO.java     |  135 +
 .../src/com/cloud/vm/UserVmCloneSettingVO.java     |   50 +
 engine/schema/src/com/cloud/vm/UserVmDetailVO.java |   85 +
 engine/schema/src/com/cloud/vm/UserVmVO.java       |  141 +
 engine/schema/src/com/cloud/vm/VMInstanceVO.java   |  531 ++
 .../src/com/cloud/vm/dao/ConsoleProxyDao.java      |   47 +
 .../src/com/cloud/vm/dao/ConsoleProxyDaoImpl.java  |  353 +
 .../src/com/cloud/vm/dao/DomainRouterDao.java      |  149 +
 .../src/com/cloud/vm/dao/DomainRouterDaoImpl.java  |  358 +
 .../src/com/cloud/vm/dao/InstanceGroupDao.java     |   36 +
 .../src/com/cloud/vm/dao/InstanceGroupDaoImpl.java |   80 +
 .../com/cloud/vm/dao/InstanceGroupVMMapDao.java    |   28 +
 .../cloud/vm/dao/InstanceGroupVMMapDaoImpl.java    |   75 +
 engine/schema/src/com/cloud/vm/dao/NicDao.java     |   69 +
 engine/schema/src/com/cloud/vm/dao/NicDaoImpl.java |  241 +
 .../src/com/cloud/vm/dao/NicSecondaryIpDao.java    |   53 +
 .../com/cloud/vm/dao/NicSecondaryIpDaoImpl.java    |  138 +
 .../src/com/cloud/vm/dao/NicSecondaryIpVO.java     |  160 +
 .../com/cloud/vm/dao/SecondaryStorageVmDao.java    |   42 +
 .../cloud/vm/dao/SecondaryStorageVmDaoImpl.java    |  269 +
 .../com/cloud/vm/dao/UserVmCloneSettingDao.java    |   37 +
 .../cloud/vm/dao/UserVmCloneSettingDaoImpl.java    |   74 +
 engine/schema/src/com/cloud/vm/dao/UserVmDao.java  |   76 +
 .../schema/src/com/cloud/vm/dao/UserVmDaoImpl.java |  585 ++
 engine/schema/src/com/cloud/vm/dao/UserVmData.java |  723 ++
 .../src/com/cloud/vm/dao/UserVmDetailsDao.java     |   32 +
 .../src/com/cloud/vm/dao/UserVmDetailsDaoImpl.java |   99 +
 .../schema/src/com/cloud/vm/dao/VMInstanceDao.java |  122 +
 .../src/com/cloud/vm/dao/VMInstanceDaoImpl.java    |  686 ++
 .../src/com/cloud/vm/snapshot/VMSnapshotVO.java    |  224 +
 .../com/cloud/vm/snapshot/dao/VMSnapshotDao.java   |   39 +
 .../cloud/vm/snapshot/dao/VMSnapshotDaoImpl.java   |  161 +
 .../cloudstack/affinity/AffinityGroupVMMapVO.java  |   66 +
 .../cloudstack/affinity/AffinityGroupVO.java       |  114 +
 .../cloudstack/affinity/dao/AffinityGroupDao.java  |   30 +
 .../affinity/dao/AffinityGroupDaoImpl.java         |  102 +
 .../affinity/dao/AffinityGroupVMMapDao.java        |   47 +
 .../affinity/dao/AffinityGroupVMMapDaoImpl.java    |  167 +
 .../lb/ApplicationLoadBalancerRuleVO.java          |  133 +
 .../lb/dao/ApplicationLoadBalancerRuleDao.java     |   35 +
 .../lb/dao/ApplicationLoadBalancerRuleDaoImpl.java |  115 +
 .../org/apache/cloudstack/region/RegionSyncVO.java |   93 +
 .../src/org/apache/cloudstack/region/RegionVO.java |   87 +
 .../apache/cloudstack/region/dao/RegionDao.java    |   27 +
 .../cloudstack/region/dao/RegionDaoImpl.java       |   48 +
 .../region/gslb/GlobalLoadBalancerDaoImpl.java     |   58 +
 .../gslb/GlobalLoadBalancerLbRuleMapDao.java       |   30 +
 .../gslb/GlobalLoadBalancerLbRuleMapDaoImpl.java   |   63 +
 .../region/gslb/GlobalLoadBalancerLbRuleMapVO.java |   83 +
 .../region/gslb/GlobalLoadBalancerRuleDao.java     |   28 +
 .../region/gslb/GlobalLoadBalancerRuleVO.java      |  183 +
 .../cloudstack/storage/image/ImageServiceImpl.java |   85 +-
 .../driver/AncientImageDataStoreDriverImpl.java    |   10 +-
 .../image/motion/DefaultImageMotionStrategy.java   |   22 +-
 .../StorageAllocatorTestConfiguration.java         |    4 +-
 .../storage/test/ChildTestConfiguration.java       |    4 +-
 .../cloudstack/storage/test/DirectAgentTest.java   |    4 +-
 .../test/MockHypervisorHostEndPointRpcServer.java  |   72 +
 .../test/MockHypervsiorHostEndPointRpcServer.java  |   72 -
 .../storage/test/MockStorageMotionStrategy.java    |   19 +
 .../integration-test/test/resource/component.xml   |    2 +-
 .../storage/snapshot/SnapshotObject.java           |    2 +-
 .../storage/HypervisorHostEndPointRpcServer.java   |  119 +
 .../storage/HypervsiorHostEndPointRpcServer.java   |  119 -
 .../allocator/AbstractStoragePoolAllocator.java    |    2 +-
 .../allocator/ZoneWideStoragePoolAllocator.java    |    2 +-
 .../command/CreateVolumeFromBaseImageCommand.java  |    6 +-
 .../storage/datastore/DataObjectManagerImpl.java   |    6 +-
 .../provider/DataStoreProviderManagerImpl.java     |    4 +-
 .../storage/motion/AncientDataMotionStrategy.java  |   89 +-
 .../storage/motion/DataMotionService.java          |    9 +
 .../storage/motion/DataMotionServiceImpl.java      |   16 +
 .../storage/motion/DataMotionStrategy.java         |   10 +
 .../storage/to/ImageOnPrimaryDataStoreTO.java      |   44 +
 .../storage/to/ImageOnPrimayDataStoreTO.java       |   44 -
 .../driver/DefaultPrimaryDataStoreDriverImpl.java  |    4 +-
 .../datastore/provider/DefaultHostListener.java    |    2 +-
 .../DefaultPrimaryDatastoreProviderImpl.java       |    6 +-
 .../volume/TemplateInstallStrategyImpl.java        |    6 +-
 .../cloudstack/storage/volume/VolumeObject.java    |    2 +
 .../storage/volume/VolumeServiceImpl.java          |  174 +-
 framework/api/pom.xml                              |   42 -
 .../framework/async/AsyncCallFuture.java           |   84 -
 .../framework/async/AsyncCompletionCallback.java   |   23 -
 framework/events/pom.xml                           |   51 +-
 framework/ipc/pom.xml                              |   20 +-
 .../framework/async/AsyncCallFuture.java           |   84 +
 .../framework/async/AsyncCompletionCallback.java   |   23 +
 .../framework/client/ClientTransportProvider.java  |    2 +-
 framework/jobs/pom.xml                             |   33 +-
 framework/pom.xml                                  |    2 +-
 packaging/centos63/cloud-usage.rc                  |    2 +-
 packaging/centos63/cloud.spec                      |   14 +-
 packaging/centos63/package.sh                      |    5 +-
 packaging/centos63/replace.properties              |    2 +-
 packaging/debian/init/cloud-management             |    2 +-
 packaging/debian/replace.properties                |    2 +-
 patches/systemvm/debian/config/etc/dnsmasq.conf    |  634 --
 .../systemvm/debian/config/etc/dnsmasq.conf.tmpl   |  634 ++
 .../debian/config/etc/init.d/cloud-early-config    |  100 +-
 .../debian/config/etc/iptables/iptables-ilbvm      |   33 +
 patches/systemvm/debian/config/etc/vpcdnsmasq.conf |    3 -
 .../systemvm/debian/config/opt/cloud/bin/ilb.sh    |  211 +
 .../debian/config/opt/cloud/bin/patchsystemvm.sh   |   23 +
 .../config/opt/cloud/bin/vpc_loadbalancer.sh       |   23 +
 .../config/opt/cloud/bin/vpc_privateGateway.sh     |    2 +-
 patches/systemvm/debian/config/root/edithosts.sh   |   31 +-
 .../host-anti-affinity/pom.xml                     |   33 +
 .../affinity/HostAntiAffinityProcessor.java        |   93 +
 .../cloudstack/syslog/AlertsSyslogAppender.java    |    4 +-
 .../discovery/ApiDiscoveryServiceImpl.java         |    4 +
 .../manager/allocator/impl/RandomAllocator.java    |   56 +
 .../hypervisor/kvm/resource/KVMHAMonitor.java      |   54 +-
 .../kvm/resource/LibvirtComputingResource.java     |   27 +-
 .../hypervisor/kvm/resource/LibvirtConnection.java |   14 +-
 .../kvm/storage/KVMStoragePoolManager.java         |   12 +-
 plugins/hypervisors/simulator/pom.xml              |    5 +
 .../cloud/agent/manager/SimulatorManagerImpl.java  |   78 +-
 .../com/cloud/resource/AgentStorageResource.java   |    2 +-
 .../resource/SimulatorSecondaryDiscoverer.java     |    3 +-
 .../src/com/cloud/simulator/MockSecStorageVO.java  |    3 +-
 .../src/com/cloud/simulator/MockStoragePoolVO.java |    3 +-
 .../src/com/cloud/simulator/MockVolumeVO.java      |    3 +-
 plugins/hypervisors/vmware/pom.xml                 |   15 +
 .../src/com/cloud/hypervisor/guru/VMwareGuru.java  |   63 +-
 .../vmware/manager/VmwareManagerImpl.java          |    1 -
 .../vmware/manager/VmwareStorageManager.java       |    4 +
 .../vmware/manager/VmwareStorageManagerImpl.java   |  401 +-
 .../hypervisor/vmware/resource/VmwareResource.java |  189 +-
 .../resource/PremiumSecondaryStorageResource.java  |    2 +
 .../VmwareSecondaryStorageResourceHandler.java     |   25 +
 .../vmware/resource/VmwareResourceTest.java        |   82 +
 .../xen/discoverer/XcpServerDiscoverer.java        |    7 +-
 .../hypervisor/xen/resource/CitrixHelper.java      |   90 +-
 .../xen/resource/CitrixResourceBase.java           |   20 +-
 .../hypervisor/xen/resource/XcpServerResource.java |   11 +-
 .../xen/resource/XenServer56FP1Resource.java       |    1 +
 .../xen/resource/XenServer610Resource.java         |  359 +-
 .../xen/resource/XenServerStorageResource.java     |    4 +-
 .../motion/XenServerStorageMotionStrategy.java     |  239 +
 .../cloud/network/element/BigSwitchVnsElement.java |    4 +-
 plugins/network-elements/cisco-vnmc/pom.xml        |   42 +
 .../scripts/network/cisco/assoc-asa1000v.xml       |   34 +
 .../network/cisco/associate-acl-policy-set.xml     |   37 +
 .../network/cisco/associate-dhcp-policy.xml        |   34 +
 .../network/cisco/associate-dhcp-server.xml        |   32 +
 .../network/cisco/associate-nat-policy-set.xml     |   35 +
 .../network/cisco/associate-route-policy.xml       |   33 +
 .../network/cisco/create-acl-policy-ref.xml        |   38 +
 .../network/cisco/create-acl-policy-set.xml        |   36 +
 .../scripts/network/cisco/create-acl-policy.xml    |   35 +
 .../network/cisco/create-acl-rule-for-dnat.xml     |   82 +
 .../network/cisco/create-acl-rule-for-pf.xml       |  156 +
 .../scripts/network/cisco/create-dhcp-policy.xml   |   72 +
 .../scripts/network/cisco/create-dnat-rule.xml     |   91 +
 .../network/cisco/create-edge-device-profile.xml   |   32 +
 .../cisco/create-edge-device-route-policy.xml      |   30 +
 .../network/cisco/create-edge-device-route.xml     |   35 +
 .../scripts/network/cisco/create-edge-firewall.xml |   89 +
 .../network/cisco/create-edge-security-profile.xml |   41 +
 .../network/cisco/create-egress-acl-rule.xml       |  168 +
 .../create-generic-egress-acl-no-protocol-rule.xml |   94 +
 .../cisco/create-generic-egress-acl-rule.xml       |  121 +
 .../cisco/create-generic-ingress-acl-rule.xml      |  121 +
 .../network/cisco/create-ingress-acl-rule.xml      |  168 +
 .../scripts/network/cisco/create-ip-pool.xml       |   58 +
 .../network/cisco/create-nat-policy-ref.xml        |   38 +
 .../network/cisco/create-nat-policy-set.xml        |   37 +
 .../scripts/network/cisco/create-nat-policy.xml    |   33 +
 .../scripts/network/cisco/create-pf-rule.xml       |  166 +
 .../scripts/network/cisco/create-port-pool.xml     |   72 +
 .../network/cisco/create-source-nat-pool.xml       |   58 +
 .../network/cisco/create-source-nat-rule.xml       |  103 +
 .../scripts/network/cisco/create-tenant.xml        |   29 +
 .../scripts/network/cisco/create-vdc.xml           |   30 +
 .../network/cisco/delete-acl-policy-set.xml        |   30 +
 .../scripts/network/cisco/delete-acl-policy.xml    |   33 +
 .../scripts/network/cisco/delete-edge-firewall.xml |   30 +
 .../network/cisco/delete-edge-security-profile.xml |   38 +
 .../network/cisco/delete-nat-policy-set.xml        |   30 +
 .../scripts/network/cisco/delete-nat-policy.xml    |   33 +
 .../scripts/network/cisco/delete-rule.xml          |   31 +
 .../scripts/network/cisco/delete-tenant.xml        |   30 +
 .../scripts/network/cisco/delete-vdc.xml           |   30 +
 .../scripts/network/cisco/disassoc-asa1000v.xml    |   30 +
 .../scripts/network/cisco/list-acl-policies.xml    |   31 +
 .../scripts/network/cisco/list-children.xml        |   27 +
 .../scripts/network/cisco/list-nat-policies.xml    |   31 +
 .../network/cisco/list-policyrefs-in-policyset.xml |   31 +
 .../scripts/network/cisco/list-tenants.xml         |   26 +
 .../network/cisco/list-unassigned-asa1000v.xml     |   39 +
 .../cisco-vnmc/scripts/network/cisco/login.xml     |   20 +
 ...AssociateAsaWithLogicalEdgeFirewallCommand.java |   53 +
 .../api/CleanupLogicalEdgeFirewallCommand.java     |   43 +
 .../agent/api/ConfigureNexusVsmForAsaCommand.java  |   95 +
 .../api/CreateLogicalEdgeFirewallCommand.java      |   94 +
 .../api/commands/AddCiscoAsa1000vResourceCmd.java  |  116 +
 .../api/commands/AddCiscoVnmcResourceCmd.java      |  115 +
 .../commands/DeleteCiscoAsa1000vResourceCmd.java   |   93 +
 .../api/commands/DeleteCiscoVnmcResourceCmd.java   |   93 +
 .../commands/ListCiscoAsa1000vResourcesCmd.java    |  111 +
 .../api/commands/ListCiscoVnmcResourcesCmd.java    |  107 +
 .../response/CiscoAsa1000vResourceResponse.java    |   97 +
 .../api/response/CiscoVnmcResourceResponse.java    |   85 +
 .../cloud/network/cisco/CiscoAsa1000vDevice.java   |   39 +
 .../cloud/network/cisco/CiscoAsa1000vDeviceVO.java |  101 +
 .../cloud/network/cisco/CiscoVnmcConnection.java   |  196 +
 .../network/cisco/CiscoVnmcConnectionImpl.java     | 1424 +++
 .../cloud/network/cisco/CiscoVnmcController.java   |   40 +
 .../cloud/network/cisco/CiscoVnmcControllerVO.java |  102 +
 .../cloud/network/cisco/NetworkAsa1000vMap.java    |   31 +
 .../cloud/network/cisco/NetworkAsa1000vMapVO.java  |   73 +
 .../com/cloud/network/dao/CiscoAsa1000vDao.java    |   33 +
 .../cloud/network/dao/CiscoAsa1000vDaoImpl.java    |   63 +
 .../src/com/cloud/network/dao/CiscoVnmcDao.java    |   32 +
 .../com/cloud/network/dao/CiscoVnmcDaoImpl.java    |   51 +
 .../cloud/network/dao/NetworkAsa1000vMapDao.java   |   28 +
 .../network/dao/NetworkAsa1000vMapDaoImpl.java     |   61 +
 .../network/element/CiscoAsa1000vService.java      |   43 +
 .../cloud/network/element/CiscoVnmcElement.java    |  954 ++
 .../network/element/CiscoVnmcElementService.java   |   42 +
 .../cloud/network/resource/CiscoVnmcResource.java  |  780 ++
 .../contrib/ssl/EasySSLProtocolSocketFactory.java  |  232 +
 .../contrib/ssl/EasyX509TrustManager.java          |  114 +
 .../network/cisco/CiscoVnmcConnectionTest.java     |  248 +
 .../network/element/CiscoVnmcElementTest.java      |  401 +
 .../network/resource/CiscoVnmcResourceTest.java    |  285 +
 .../dns-notifier/resources/components-example.xml  |    2 +-
 .../element/ElasticLoadBalancerElement.java        |   22 +-
 .../network/lb/ElasticLoadBalancerManager.java     |    4 +-
 .../network/lb/ElasticLoadBalancerManagerImpl.java |   32 +-
 .../element/F5ExternalLoadBalancerElement.java     |   76 +-
 .../network-elements/internal-loadbalancer/pom.xml |   50 +
 .../element/InternalLoadBalancerElement.java       |  548 ++
 .../network/lb/InternalLoadBalancerVMManager.java  |   90 +
 .../lb/InternalLoadBalancerVMManagerImpl.java      |  951 ++
 .../ElementChildTestConfiguration.java             |  125 +
 .../InternalLbElementServiceTest.java              |  189 +
 .../internallbelement/InternalLbElementTest.java   |  226 +
 .../internallbvmmgr/InternalLBVMManagerTest.java   |  388 +
 .../internallbvmmgr/InternalLBVMServiceTest.java   |  291 +
 .../internallbvmmgr/LbChildTestConfiguration.java  |  172 +
 .../test/resources/lb_element.xml                  |   46 +
 .../test/resources/lb_mgr.xml                      |   46 +
 .../test/resources/lb_svc.xml                      |   46 +
 .../element/JuniperSRXExternalFirewallElement.java |   60 +-
 .../cloud/network/resource/JuniperSrxResource.java |  322 +-
 .../cloud/network/element/NetscalerElement.java    |  169 +-
 .../cloud/network/resource/NetscalerResource.java  |  109 +-
 .../api/commands/DeleteNiciraNvpDeviceCmd.java     |    2 +-
 .../cloud/network/element/NiciraNvpElement.java    |    5 +
 .../src/com/cloud/network/nicira/NiciraNvpTag.java |   17 +-
 .../network/element/NiciraNvpElementTest.java      |  238 +-
 .../com/cloud/network/nicira/NiciraTagTest.java    |   54 +
 plugins/pom.xml                                    |    6 +-
 .../CloudStackPrimaryDataStoreLifeCycleImpl.java   |   47 +-
 .../CloudStackPrimaryDataStoreProviderImpl.java    |    6 +-
 pom.xml                                            |  162 +-
 scripts/network/exdhcp/dnsmasq_edithosts.sh        |   19 +-
 scripts/network/juniper/application-add.xml        |    2 +-
 scripts/network/juniper/security-policy-add.xml    |    4 +-
 scripts/vm/hypervisor/kvm/patchviasocket.pl        |    2 +-
 scripts/vm/network/security_group.py               |    2 +-
 scripts/vm/systemvm/injectkeys.sh                  |   26 +-
 server/pom.xml                                     |   53 +-
 .../agent/manager/allocator/HostAllocator.java     |   23 +-
 .../manager/allocator/impl/FirstFitAllocator.java  |   47 +
 .../manager/allocator/impl/TestingAllocator.java   |    7 +
 server/src/com/cloud/alert/AlertManager.java       |   58 +
 server/src/com/cloud/alert/AlertManagerImpl.java   |   30 +-
 server/src/com/cloud/alert/dao/AlertDao.java       |   33 -
 server/src/com/cloud/alert/dao/AlertDaoImpl.java   |  156 -
 server/src/com/cloud/api/ApiDBUtils.java           |   72 +-
 server/src/com/cloud/api/ApiDispatcher.java        |    1 -
 server/src/com/cloud/api/ApiResponseHelper.java    |  271 +-
 server/src/com/cloud/api/ApiServer.java            |  193 +-
 server/src/com/cloud/api/ApiServerService.java     |    1 +
 server/src/com/cloud/api/ApiServlet.java           |    6 +-
 .../src/com/cloud/api/query/QueryManagerImpl.java  |  274 +-
 .../com/cloud/api/query/ViewResponseHelper.java    |   57 +-
 .../cloud/api/query/dao/AccountJoinDaoImpl.java    |   14 +-
 .../cloud/api/query/dao/AffinityGroupJoinDao.java  |   37 +
 .../api/query/dao/AffinityGroupJoinDaoImpl.java    |  143 +
 .../api/query/dao/DomainRouterJoinDaoImpl.java     |   16 +-
 .../src/com/cloud/api/query/dao/HostJoinDao.java   |    5 +
 .../com/cloud/api/query/dao/HostJoinDaoImpl.java   |  142 +-
 .../api/query/dao/SecurityGroupJoinDaoImpl.java    |    6 +-
 .../cloud/api/query/dao/StoragePoolJoinDao.java    |    6 +
 .../api/query/dao/StoragePoolJoinDaoImpl.java      |   66 +-
 .../api/query/dao/UserAccountJoinDaoImpl.java      |    7 +-
 .../com/cloud/api/query/dao/UserVmJoinDaoImpl.java |   34 +-
 .../com/cloud/api/query/dao/VolumeJoinDaoImpl.java |    9 +-
 .../src/com/cloud/api/query/vo/AccountJoinVO.java  |   16 +-
 .../cloud/api/query/vo/AffinityGroupJoinVO.java    |  259 +
 .../com/cloud/api/query/vo/DomainRouterJoinVO.java |   35 +-
 server/src/com/cloud/api/query/vo/HostJoinVO.java  |   17 +-
 .../cloud/api/query/vo/SecurityGroupJoinVO.java    |    6 +-
 .../com/cloud/api/query/vo/StoragePoolJoinVO.java  |   17 +-
 .../com/cloud/api/query/vo/UserAccountJoinVO.java  |   22 +-
 .../src/com/cloud/api/query/vo/UserVmJoinVO.java   |   56 +-
 .../src/com/cloud/api/query/vo/VolumeJoinVO.java   |   21 +-
 server/src/com/cloud/async/AsyncJobVO.java         |  382 +
 server/src/com/cloud/async/SyncQueueItemVO.java    |  142 +
 server/src/com/cloud/async/SyncQueueVO.java        |  137 +
 .../com/cloud/capacity/CapacityManagerImpl.java    |  101 +-
 .../cloud/capacity/StorageCapacityListener.java    |   16 +-
 server/src/com/cloud/capacity/dao/CapacityDao.java |   45 -
 .../com/cloud/capacity/dao/CapacityDaoImpl.java    |  806 --
 .../com/cloud/certificate/dao/CertificateDao.java  |   24 -
 .../cloud/certificate/dao/CertificateDaoImpl.java  |   63 -
 server/src/com/cloud/cluster/CheckPointVO.java     |  121 -
 .../cluster/ClusterInvalidSessionException.java    |   33 -
 .../cloud/cluster/ManagementServerHostPeerVO.java  |  120 -
 .../com/cloud/cluster/ManagementServerHostVO.java  |  182 -
 .../cloud/cluster/agentlb/HostTransferMapVO.java   |   98 -
 .../cluster/agentlb/dao/HostTransferMapDao.java    |   45 -
 .../agentlb/dao/HostTransferMapDaoImpl.java        |  146 -
 .../cloud/cluster/dao/ManagementServerHostDao.java |   48 -
 .../cluster/dao/ManagementServerHostDaoImpl.java   |  276 -
 .../cluster/dao/ManagementServerHostPeerDao.java   |   27 -
 .../dao/ManagementServerHostPeerDaoImpl.java       |  108 -
 server/src/com/cloud/cluster/dao/StackMaidDao.java |   44 -
 .../com/cloud/cluster/dao/StackMaidDaoImpl.java    |  208 -
 server/src/com/cloud/configuration/Config.java     |  110 +-
 .../cloud/configuration/ConfigurationManager.java  |   15 +-
 .../configuration/ConfigurationManagerImpl.java    |  539 +-
 .../cloud/configuration/dao/ConfigurationDao.java  |   68 -
 .../configuration/dao/ConfigurationDaoImpl.java    |  225 -
 .../cloud/configuration/dao/ResourceCountDao.java  |   58 -
 .../configuration/dao/ResourceCountDaoImpl.java    |  222 -
 .../cloud/configuration/dao/ResourceLimitDao.java  |   35 -
 .../configuration/dao/ResourceLimitDaoImpl.java    |  100 -
 .../AgentBasedConsoleProxyManager.java             |  194 +-
 .../src/com/cloud/consoleproxy/AgentHookBase.java  |  288 +
 .../cloud/consoleproxy/ConsoleProxyManager.java    |   17 +-
 .../consoleproxy/ConsoleProxyManagerImpl.java      |  589 +-
 .../cloud/consoleproxy/ConsoleProxyService.java    |   25 +
 .../consoleproxy/StaticConsoleProxyManager.java    |   84 +-
 server/src/com/cloud/dc/AccountVlanMapVO.java      |   65 -
 server/src/com/cloud/dc/ClusterDetailsDao.java     |   32 -
 server/src/com/cloud/dc/ClusterDetailsDaoImpl.java |  125 -
 server/src/com/cloud/dc/ClusterDetailsVO.java      |   74 -
 server/src/com/cloud/dc/ClusterVO.java             |  189 -
 server/src/com/cloud/dc/ClusterVSMMapVO.java       |   62 -
 server/src/com/cloud/dc/DataCenterIpAddressVO.java |  115 -
 .../cloud/dc/DataCenterLinkLocalIpAddressVO.java   |  108 -
 server/src/com/cloud/dc/DataCenterVO.java          |  460 -
 server/src/com/cloud/dc/DataCenterVnetVO.java      |  109 -
 server/src/com/cloud/dc/DcDetailVO.java            |   73 -
 server/src/com/cloud/dc/HostPodVO.java             |  197 -
 server/src/com/cloud/dc/PodCluster.java            |   67 -
 server/src/com/cloud/dc/PodVlanMapVO.java          |   62 -
 server/src/com/cloud/dc/PodVlanVO.java             |   98 -
 .../com/cloud/dc/StorageNetworkIpAddressVO.java    |  120 -
 .../src/com/cloud/dc/StorageNetworkIpRangeVO.java  |  184 -
 server/src/com/cloud/dc/VlanVO.java                |  196 -
 server/src/com/cloud/dc/dao/AccountVlanMapDao.java |   30 -
 .../com/cloud/dc/dao/AccountVlanMapDaoImpl.java    |   75 -
 server/src/com/cloud/dc/dao/ClusterDao.java        |   37 -
 server/src/com/cloud/dc/dao/ClusterDaoImpl.java    |  241 -
 server/src/com/cloud/dc/dao/ClusterVSMMapDao.java  |   29 -
 .../src/com/cloud/dc/dao/ClusterVSMMapDaoImpl.java |   95 -
 server/src/com/cloud/dc/dao/DataCenterDao.java     |   80 -
 server/src/com/cloud/dc/dao/DataCenterDaoImpl.java |  404 -
 .../com/cloud/dc/dao/DataCenterIpAddressDao.java   |   38 -
 .../cloud/dc/dao/DataCenterIpAddressDaoImpl.java   |  225 -
 .../dc/dao/DataCenterLinkLocalIpAddressDao.java    |   32 -
 .../dao/DataCenterLinkLocalIpAddressDaoImpl.java   |  188 -
 server/src/com/cloud/dc/dao/DataCenterVnetDao.java |   38 -
 .../com/cloud/dc/dao/DataCenterVnetDaoImpl.java    |  186 -
 server/src/com/cloud/dc/dao/DcDetailsDao.java      |   32 -
 server/src/com/cloud/dc/dao/DcDetailsDaoImpl.java  |   97 -
 server/src/com/cloud/dc/dao/HostPodDao.java        |   35 -
 server/src/com/cloud/dc/dao/HostPodDaoImpl.java    |  134 -
 server/src/com/cloud/dc/dao/PodVlanDao.java        |   30 -
 server/src/com/cloud/dc/dao/PodVlanDaoImpl.java    |  139 -
 server/src/com/cloud/dc/dao/PodVlanMapDao.java     |   30 -
 server/src/com/cloud/dc/dao/PodVlanMapDaoImpl.java |   75 -
 .../cloud/dc/dao/StorageNetworkIpAddressDao.java   |   32 -
 .../dc/dao/StorageNetworkIpAddressDaoImpl.java     |  114 -
 .../com/cloud/dc/dao/StorageNetworkIpRangeDao.java |   32 -
 .../cloud/dc/dao/StorageNetworkIpRangeDaoImpl.java |   78 -
 server/src/com/cloud/dc/dao/VlanDao.java           |   53 -
 server/src/com/cloud/dc/dao/VlanDaoImpl.java       |  315 -
 .../cloud/deploy/DeploymentPlanningManager.java    |   45 +
 .../deploy/DeploymentPlanningManagerImpl.java      |  106 +
 server/src/com/cloud/deploy/FirstFitPlanner.java   |  158 +-
 server/src/com/cloud/domain/DomainVO.java          |  215 -
 server/src/com/cloud/domain/dao/DomainDao.java     |   34 -
 server/src/com/cloud/domain/dao/DomainDaoImpl.java |  275 -
 server/src/com/cloud/host/dao/HostDao.java         |   83 -
 server/src/com/cloud/host/dao/HostDaoImpl.java     |  920 --
 server/src/com/cloud/host/dao/HostDetailsDao.java  |   32 -
 .../src/com/cloud/host/dao/HostDetailsDaoImpl.java |  110 -
 server/src/com/cloud/host/dao/HostTagsDao.java     |   30 -
 server/src/com/cloud/host/dao/HostTagsDaoImpl.java |   75 -
 .../com/cloud/hypervisor/HypervisorGuruBase.java   |    5 +
 .../hypervisor/dao/HypervisorCapabilitiesDao.java  |   36 -
 .../dao/HypervisorCapabilitiesDaoImpl.java         |   98 -
 server/src/com/cloud/keystore/KeystoreDao.java     |   29 -
 server/src/com/cloud/keystore/KeystoreDaoImpl.java |  118 -
 server/src/com/cloud/keystore/KeystoreVO.java      |  101 -
 server/src/com/cloud/maint/AgentUpgradeVO.java     |   63 -
 server/src/com/cloud/maint/UpgradeManager.java     |   47 -
 server/src/com/cloud/maint/UpgradeManagerImpl.java |  189 -
 .../src/com/cloud/maint/UpgradeManagerMBean.java   |   23 -
 server/src/com/cloud/maint/UpgradeMonitor.java     |   34 -
 server/src/com/cloud/maint/Version.java            |   66 -
 .../src/com/cloud/maint/dao/AgentUpgradeDao.java   |   23 -
 .../com/cloud/maint/dao/AgentUpgradeDaoImpl.java   |   29 -
 .../com/cloud/migration/Db21to22MigrationUtil.java |  228 -
 .../migration/Db22beta4to22GAMigrationUtil.java    |  128 -
 .../src/com/cloud/migration/DiskOffering20Dao.java |   22 -
 .../com/cloud/migration/DiskOffering20DaoImpl.java |   27 -
 .../src/com/cloud/migration/DiskOffering20VO.java  |  113 -
 .../src/com/cloud/migration/DiskOffering21Dao.java |   23 -
 .../com/cloud/migration/DiskOffering21DaoImpl.java |   27 -
 .../src/com/cloud/migration/DiskOffering21VO.java  |  257 -
 .../com/cloud/migration/ServiceOffering20Dao.java  |   22 -
 .../cloud/migration/ServiceOffering20DaoImpl.java  |   27 -
 .../com/cloud/migration/ServiceOffering20VO.java   |  199 -
 .../com/cloud/migration/ServiceOffering21Dao.java  |   22 -
 .../cloud/migration/ServiceOffering21DaoImpl.java  |   27 -
 .../com/cloud/migration/ServiceOffering21VO.java   |  178 -
 .../cloud/network/ExteralIpAddressAllocator.java   |  165 -
 .../network/ExternalFirewallDeviceManagerImpl.java |   26 +-
 .../cloud/network/ExternalIpAddressAllocator.java  |  165 +
 .../network/ExternalLoadBalancerDeviceManager.java |    6 +-
 .../ExternalLoadBalancerDeviceManagerImpl.java     |   39 +-
 .../ExternalLoadBalancerUsageManagerImpl.java      |   34 +-
 server/src/com/cloud/network/IpAddrAllocator.java  |    2 +-
 .../com/cloud/network/LBHealthCheckPolicyVO.java   |  157 -
 server/src/com/cloud/network/NetworkManager.java   |    3 +-
 .../src/com/cloud/network/NetworkManagerImpl.java  |  503 +-
 server/src/com/cloud/network/NetworkModelImpl.java |  106 +-
 .../src/com/cloud/network/NetworkServiceImpl.java  | 1059 ++-
 server/src/com/cloud/network/UserIpv6Address.java  |   52 -
 .../src/com/cloud/network/UserIpv6AddressVO.java   |  188 -
 server/src/com/cloud/network/addr/PublicIp.java    |   18 +-
 .../network/as/AutoScalePolicyConditionMapVO.java  |   61 -
 .../com/cloud/network/as/AutoScalePolicyVO.java    |  134 -
 .../network/as/AutoScaleVmGroupPolicyMapVO.java    |   64 -
 .../com/cloud/network/as/AutoScaleVmGroupVO.java   |  191 -
 .../com/cloud/network/as/AutoScaleVmProfileVO.java |  218 -
 server/src/com/cloud/network/as/ConditionVO.java   |  129 -
 server/src/com/cloud/network/as/CounterVO.java     |  111 -
 .../as/dao/AutoScalePolicyConditionMapDao.java     |   28 -
 .../as/dao/AutoScalePolicyConditionMapDaoImpl.java |   61 -
 .../cloud/network/as/dao/AutoScalePolicyDao.java   |   24 -
 .../network/as/dao/AutoScalePolicyDaoImpl.java     |   38 -
 .../cloud/network/as/dao/AutoScaleVmGroupDao.java  |   28 -
 .../network/as/dao/AutoScaleVmGroupDaoImpl.java    |   65 -
 .../as/dao/AutoScaleVmGroupPolicyMapDao.java       |   30 -
 .../as/dao/AutoScaleVmGroupPolicyMapDaoImpl.java   |   77 -
 .../network/as/dao/AutoScaleVmProfileDao.java      |   25 -
 .../network/as/dao/AutoScaleVmProfileDaoImpl.java  |   38 -
 .../src/com/cloud/network/as/dao/ConditionDao.java |   28 -
 .../com/cloud/network/as/dao/ConditionDaoImpl.java |   56 -
 .../src/com/cloud/network/as/dao/CounterDao.java   |   29 -
 .../com/cloud/network/as/dao/CounterDaoImpl.java   |   70 -
 .../network/dao/ExternalFirewallDeviceDao.java     |   58 -
 .../network/dao/ExternalFirewallDeviceDaoImpl.java |   96 -
 .../network/dao/ExternalFirewallDeviceVO.java      |  161 -
 .../network/dao/ExternalLoadBalancerDeviceDao.java |   74 -
 .../dao/ExternalLoadBalancerDeviceDaoImpl.java     |  127 -
 .../network/dao/ExternalLoadBalancerDeviceVO.java  |  227 -
 .../cloud/network/dao/FirewallRulesCidrsDao.java   |   29 -
 .../network/dao/FirewallRulesCidrsDaoImpl.java     |   70 -
 .../cloud/network/dao/FirewallRulesCidrsVO.java    |   65 -
 .../com/cloud/network/dao/FirewallRulesDao.java    |   65 -
 .../cloud/network/dao/FirewallRulesDaoImpl.java    |  352 -
 server/src/com/cloud/network/dao/IPAddressDao.java |   71 -
 .../com/cloud/network/dao/IPAddressDaoImpl.java    |  376 -
 server/src/com/cloud/network/dao/IPAddressVO.java  |  309 -
 .../network/dao/InlineLoadBalancerNicMapDao.java   |   24 -
 .../dao/InlineLoadBalancerNicMapDaoImpl.java       |   46 -
 .../network/dao/InlineLoadBalancerNicMapVO.java    |   60 -
 .../cloud/network/dao/LBHealthCheckPolicyDao.java  |   35 -
 .../network/dao/LBHealthCheckPolicyDaoImpl.java    |   71 -
 .../cloud/network/dao/LBStickinessPolicyDao.java   |   34 -
 .../network/dao/LBStickinessPolicyDaoImpl.java     |   69 -
 .../cloud/network/dao/LBStickinessPolicyVO.java    |  145 -
 .../src/com/cloud/network/dao/LoadBalancerDao.java |   36 -
 .../com/cloud/network/dao/LoadBalancerDaoImpl.java |  137 -
 .../cloud/network/dao/LoadBalancerVMMapDao.java    |   31 -
 .../network/dao/LoadBalancerVMMapDaoImpl.java      |   97 -
 .../com/cloud/network/dao/LoadBalancerVMMapVO.java |   89 -
 .../src/com/cloud/network/dao/LoadBalancerVO.java  |   98 -
 .../com/cloud/network/dao/NetworkAccountDao.java   |   22 -
 .../cloud/network/dao/NetworkAccountDaoImpl.java   |   29 -
 .../com/cloud/network/dao/NetworkAccountVO.java    |   72 -
 server/src/com/cloud/network/dao/NetworkDao.java   |  114 -
 .../src/com/cloud/network/dao/NetworkDaoImpl.java  |  621 --
 .../com/cloud/network/dao/NetworkDomainDao.java    |   27 -
 .../cloud/network/dao/NetworkDomainDaoImpl.java    |   75 -
 .../src/com/cloud/network/dao/NetworkDomainVO.java |   72 -
 .../network/dao/NetworkExternalFirewallDao.java    |   38 -
 .../dao/NetworkExternalFirewallDaoImpl.java        |   61 -
 .../network/dao/NetworkExternalFirewallVO.java     |   88 -
 .../dao/NetworkExternalLoadBalancerDao.java        |   38 -
 .../dao/NetworkExternalLoadBalancerDaoImpl.java    |   62 -
 .../network/dao/NetworkExternalLoadBalancerVO.java |   89 -
 server/src/com/cloud/network/dao/NetworkOpDao.java |   26 -
 .../com/cloud/network/dao/NetworkOpDaoImpl.java    |   84 -
 server/src/com/cloud/network/dao/NetworkOpVO.java  |   76 -
 .../cloud/network/dao/NetworkRuleConfigDao.java    |   26 -
 .../network/dao/NetworkRuleConfigDaoImpl.java      |   51 -
 .../com/cloud/network/dao/NetworkRuleConfigVO.java |   93 -
 .../cloud/network/dao/NetworkServiceMapDao.java    |   38 -
 .../network/dao/NetworkServiceMapDaoImpl.java      |  167 -
 .../com/cloud/network/dao/NetworkServiceMapVO.java |   92 -
 server/src/com/cloud/network/dao/NetworkVO.java    |  543 --
 .../com/cloud/network/dao/PhysicalNetworkDao.java  |   28 -
 .../cloud/network/dao/PhysicalNetworkDaoImpl.java  |   79 -
 .../dao/PhysicalNetworkIsolationMethodDaoImpl.java |   70 -
 .../dao/PhysicalNetworkIsolationMethodVO.java      |   68 -
 .../dao/PhysicalNetworkServiceProviderDao.java     |   28 -
 .../dao/PhysicalNetworkServiceProviderDaoImpl.java |  131 -
 .../dao/PhysicalNetworkServiceProviderVO.java      |  322 -
 .../network/dao/PhysicalNetworkTagDaoImpl.java     |   63 -
 .../cloud/network/dao/PhysicalNetworkTagVO.java    |   68 -
 .../network/dao/PhysicalNetworkTrafficTypeDao.java |   33 -
 .../dao/PhysicalNetworkTrafficTypeDaoImpl.java     |  143 -
 .../network/dao/PhysicalNetworkTrafficTypeVO.java  |  149 -
 .../com/cloud/network/dao/PhysicalNetworkVO.java   |  234 -
 .../src/com/cloud/network/dao/PortProfileDao.java  |   50 -
 .../com/cloud/network/dao/PortProfileDaoImpl.java  |   89 -
 .../src/com/cloud/network/dao/PortProfileVO.java   |  204 -
 .../com/cloud/network/dao/RemoteAccessVpnDao.java  |   30 -
 .../cloud/network/dao/RemoteAccessVpnDaoImpl.java  |   84 -
 .../com/cloud/network/dao/RemoteAccessVpnVO.java   |  142 -
 .../com/cloud/network/dao/RouterNetworkDao.java    |   26 -
 .../cloud/network/dao/RouterNetworkDaoImpl.java    |   62 -
 .../src/com/cloud/network/dao/RouterNetworkVO.java |   75 -
 .../network/dao/Site2SiteCustomerGatewayDao.java   |   27 -
 .../dao/Site2SiteCustomerGatewayDaoImpl.java       |   66 -
 .../network/dao/Site2SiteCustomerGatewayVO.java    |  206 -
 .../network/dao/Site2SiteVpnConnectionDao.java     |   29 -
 .../network/dao/Site2SiteVpnConnectionDaoImpl.java |   97 -
 .../network/dao/Site2SiteVpnConnectionVO.java      |  143 -
 .../cloud/network/dao/Site2SiteVpnGatewayDao.java  |   23 -
 .../network/dao/Site2SiteVpnGatewayDaoImpl.java    |   50 -
 .../cloud/network/dao/Site2SiteVpnGatewayVO.java   |  114 -
 .../com/cloud/network/dao/UserIpv6AddressDao.java  |   41 -
 .../cloud/network/dao/UserIpv6AddressDaoImpl.java  |  122 -
 .../network/dao/VirtualRouterProviderDao.java      |   31 -
 .../network/dao/VirtualRouterProviderDaoImpl.java  |   79 -
 server/src/com/cloud/network/dao/VpnUserDao.java   |   28 -
 .../src/com/cloud/network/dao/VpnUserDaoImpl.java  |   87 -
 .../network/element/VirtualRouterElement.java      |   58 +-
 .../network/element/VirtualRouterProviderVO.java   |  120 -
 .../network/firewall/FirewallManagerImpl.java      |   89 +-
 .../network/guru/ExternalGuestNetworkGuru.java     |   40 +-
 .../com/cloud/network/guru/GuestNetworkGuru.java   |   57 +-
 .../com/cloud/network/lb/LBHealthCheckManager.java |    4 +-
 .../cloud/network/lb/LBHealthCheckManagerImpl.java |    9 +-
 .../network/lb/LoadBalancingRulesManager.java      |   24 +-
 .../network/lb/LoadBalancingRulesManagerImpl.java  |  402 +-
 .../router/VirtualNetworkApplianceManager.java     |    4 +
 .../router/VirtualNetworkApplianceManagerImpl.java |   85 +-
 .../VpcVirtualNetworkApplianceManagerImpl.java     |    6 +-
 .../com/cloud/network/rules/FirewallRuleVO.java    |  270 -
 .../cloud/network/rules/PortForwardingRuleVO.java  |   96 -
 .../src/com/cloud/network/rules/RulesManager.java  |    3 +
 .../com/cloud/network/rules/RulesManagerImpl.java  |   67 +-
 .../network/rules/dao/PortForwardingRulesDao.java  |   47 -
 .../rules/dao/PortForwardingRulesDaoImpl.java      |  162 -
 .../network/security/dao/SecurityGroupDao.java     |   30 -
 .../network/security/dao/SecurityGroupDaoImpl.java |  136 -
 .../network/security/dao/SecurityGroupRuleDao.java |   35 -
 .../security/dao/SecurityGroupRuleDaoImpl.java     |  176 -
 .../security/dao/SecurityGroupRulesDao.java        |   48 -
 .../security/dao/SecurityGroupRulesDaoImpl.java    |   87 -
 .../security/dao/SecurityGroupVMMapDao.java        |   38 -
 .../security/dao/SecurityGroupVMMapDaoImpl.java    |  166 -
 .../network/security/dao/SecurityGroupWorkDao.java |   49 -
 .../security/dao/SecurityGroupWorkDaoImpl.java     |  242 -
 .../network/security/dao/VmRulesetLogDao.java      |   29 -
 .../network/security/dao/VmRulesetLogDaoImpl.java  |  200 -
 .../cloud/network/vpc/PrivateGatewayProfile.java   |    5 +
 .../com/cloud/network/vpc/PrivateIpAddress.java    |    7 +
 server/src/com/cloud/network/vpc/PrivateIpVO.java  |   95 -
 .../src/com/cloud/network/vpc/StaticRouteVO.java   |  141 -
 server/src/com/cloud/network/vpc/VpcGatewayVO.java |  196 -
 .../src/com/cloud/network/vpc/VpcManagerImpl.java  |   80 +-
 .../cloud/network/vpc/VpcOfferingServiceMapVO.java |   89 -
 .../src/com/cloud/network/vpc/VpcOfferingVO.java   |  151 -
 .../src/com/cloud/network/vpc/VpcServiceMapVO.java |   90 -
 server/src/com/cloud/network/vpc/VpcVO.java        |  181 -
 .../com/cloud/network/vpc/dao/PrivateIpDao.java    |   75 -
 .../cloud/network/vpc/dao/PrivateIpDaoImpl.java    |  156 -
 .../com/cloud/network/vpc/dao/StaticRouteDao.java  |   35 -
 .../cloud/network/vpc/dao/StaticRouteDaoImpl.java  |  119 -
 server/src/com/cloud/network/vpc/dao/VpcDao.java   |   47 -
 .../src/com/cloud/network/vpc/dao/VpcDaoImpl.java  |  152 -
 .../com/cloud/network/vpc/dao/VpcGatewayDao.java   |   26 -
 .../cloud/network/vpc/dao/VpcGatewayDaoImpl.java   |   62 -
 .../com/cloud/network/vpc/dao/VpcOfferingDao.java  |   32 -
 .../cloud/network/vpc/dao/VpcOfferingDaoImpl.java  |   71 -
 .../network/vpc/dao/VpcOfferingServiceMapDao.java  |   41 -
 .../vpc/dao/VpcOfferingServiceMapDaoImpl.java      |  119 -
 .../cloud/network/vpc/dao/VpcServiceMapDao.java    |   40 -
 .../network/vpc/dao/VpcServiceMapDaoImpl.java      |  115 -
 .../network/vpn/RemoteAccessVpnManagerImpl.java    |    6 +-
 .../offerings/NetworkOfferingServiceMapVO.java     |   94 -
 .../src/com/cloud/offerings/NetworkOfferingVO.java |  381 -
 .../cloud/offerings/dao/NetworkOfferingDao.java    |   60 -
 .../offerings/dao/NetworkOfferingDaoImpl.java      |  169 -
 .../dao/NetworkOfferingServiceMapDao.java          |   50 -
 .../dao/NetworkOfferingServiceMapDaoImpl.java      |  171 -
 .../src/com/cloud/projects/ProjectAccountVO.java   |   96 -
 .../com/cloud/projects/ProjectInvitationVO.java    |  150 -
 server/src/com/cloud/projects/ProjectVO.java       |  163 -
 .../com/cloud/projects/dao/ProjectAccountDao.java  |   43 -
 .../cloud/projects/dao/ProjectAccountDaoImpl.java  |  157 -
 server/src/com/cloud/projects/dao/ProjectDao.java  |   37 -
 .../src/com/cloud/projects/dao/ProjectDaoImpl.java |  124 -
 .../cloud/projects/dao/ProjectInvitationDao.java   |   44 -
 .../projects/dao/ProjectInvitationDaoImpl.java     |  171 -
 .../com/cloud/resource/ResourceManagerImpl.java    |   34 +-
 .../resourcelimit/ResourceLimitManagerImpl.java    |    2 +-
 .../com/cloud/secstorage/CommandExecLogDao.java    |   25 -
 .../cloud/secstorage/CommandExecLogDaoImpl.java    |   49 -
 .../src/com/cloud/secstorage/CommandExecLogVO.java |  112 -
 .../PremiumSecondaryStorageManagerImpl.java        |    6 +-
 .../src/com/cloud/server/ConfigurationServer.java  |    5 +
 .../com/cloud/server/ConfigurationServerImpl.java  |  147 +-
 server/src/com/cloud/server/Criteria.java          |   12 +-
 server/src/com/cloud/server/ManagementServer.java  |    3 +
 .../src/com/cloud/server/ManagementServerImpl.java | 1174 ++-
 .../src/com/cloud/service/ServiceOfferingVO.java   |  211 -
 .../com/cloud/service/dao/ServiceOfferingDao.java  |   34 -
 .../cloud/service/dao/ServiceOfferingDaoImpl.java  |  157 -
 .../ConsoleProxyPasswordBasedEncryptor.java        |   99 +-
 .../src/com/cloud/servlet/ConsoleProxyServlet.java |   41 +-
 server/src/com/cloud/storage/OCFS2ManagerImpl.java |   48 +-
 server/src/com/cloud/storage/StorageManager.java   |    2 +
 .../src/com/cloud/storage/StorageManagerImpl.java  |   62 +-
 server/src/com/cloud/storage/VolumeManager.java    |    8 +
 .../src/com/cloud/storage/VolumeManagerImpl.java   |  110 +-
 .../src/com/cloud/storage/dao/DiskOfferingDao.java |   31 -
 .../com/cloud/storage/dao/DiskOfferingDaoImpl.java |  152 -
 .../com/cloud/storage/dao/GuestOSCategoryDao.java  |   24 -
 .../cloud/storage/dao/GuestOSCategoryDaoImpl.java  |   34 -
 server/src/com/cloud/storage/dao/GuestOSDao.java   |   26 -
 .../src/com/cloud/storage/dao/GuestOSDaoImpl.java  |   51 -
 .../com/cloud/storage/dao/LaunchPermissionDao.java |   61 -
 .../cloud/storage/dao/LaunchPermissionDaoImpl.java |  158 -
 server/src/com/cloud/storage/dao/S3Dao.java        |   29 -
 server/src/com/cloud/storage/dao/S3DaoImpl.java    |   50 -
 server/src/com/cloud/storage/dao/SnapshotDao.java  |   54 -
 .../src/com/cloud/storage/dao/SnapshotDaoImpl.java |  357 -
 .../com/cloud/storage/dao/SnapshotPolicyDao.java   |   38 -
 .../cloud/storage/dao/SnapshotPolicyDaoImpl.java   |  105 -
 .../com/cloud/storage/dao/SnapshotScheduleDao.java |   41 -
 .../cloud/storage/dao/SnapshotScheduleDaoImpl.java |  134 -
 .../storage/dao/StoragePoolDetailsDaoImpl.java     |   75 -
 .../com/cloud/storage/dao/StoragePoolHostDao.java  |   42 -
 .../cloud/storage/dao/StoragePoolHostDaoImpl.java  |  184 -
 .../com/cloud/storage/dao/StoragePoolWorkDao.java  |   38 -
 .../cloud/storage/dao/StoragePoolWorkDaoImpl.java  |  136 -
 server/src/com/cloud/storage/dao/SwiftDao.java     |   31 -
 server/src/com/cloud/storage/dao/SwiftDaoImpl.java |   58 -
 server/src/com/cloud/storage/dao/UploadDao.java    |   36 -
 .../src/com/cloud/storage/dao/UploadDaoImpl.java   |   92 -
 .../src/com/cloud/storage/dao/VMTemplateDao.java   |   84 -
 .../com/cloud/storage/dao/VMTemplateDaoImpl.java   | 1122 ---
 .../cloud/storage/dao/VMTemplateDetailsDao.java    |   32 -
 .../storage/dao/VMTemplateDetailsDaoImpl.java      |   99 -
 .../com/cloud/storage/dao/VMTemplateHostDao.java   |   67 -
 .../cloud/storage/dao/VMTemplateHostDaoImpl.java   |  427 -
 .../com/cloud/storage/dao/VMTemplatePoolDao.java   |   49 -
 .../cloud/storage/dao/VMTemplatePoolDaoImpl.java   |  304 -
 .../src/com/cloud/storage/dao/VMTemplateS3Dao.java |   36 -
 .../com/cloud/storage/dao/VMTemplateS3DaoImpl.java |  105 -
 .../com/cloud/storage/dao/VMTemplateSwiftDao.java  |   37 -
 .../cloud/storage/dao/VMTemplateSwiftDaoImpl.java  |   87 -
 .../com/cloud/storage/dao/VMTemplateZoneDao.java   |   33 -
 .../cloud/storage/dao/VMTemplateZoneDaoImpl.java   |   89 -
 server/src/com/cloud/storage/dao/VolumeDao.java    |   92 -
 .../src/com/cloud/storage/dao/VolumeDaoImpl.java   |  459 -
 .../src/com/cloud/storage/dao/VolumeHostDao.java   |   40 -
 .../com/cloud/storage/dao/VolumeHostDaoImpl.java   |  165 -
 .../storage/download/DownloadMonitorImpl.java      |   15 +-
 .../secondary/SecondaryStorageDiscoverer.java      |  322 -
 .../secondary/SecondaryStorageManagerImpl.java     |   10 +-
 .../storage/snapshot/SnapshotManagerImpl.java      |   47 +-
 server/src/com/cloud/tags/ResourceTagVO.java       |  160 -
 server/src/com/cloud/tags/dao/ResourceTagDao.java  |   37 -
 .../com/cloud/tags/dao/ResourceTagsDaoImpl.java    |   62 -
 .../cloud/template/HypervisorTemplateAdapter.java  |   78 +
 server/src/com/cloud/template/TemplateAdapter.java |    3 +
 .../com/cloud/template/TemplateAdapterBase.java    |   20 +-
 .../com/cloud/template/TemplateManagerImpl.java    |   44 +-
 server/src/com/cloud/upgrade/DatabaseCreator.java  |  233 -
 .../cloud/upgrade/DatabaseIntegrityChecker.java    |  264 -
 .../com/cloud/upgrade/DatabaseUpgradeChecker.java  |  369 -
 .../upgrade/PremiumDatabaseUpgradeChecker.java     |  139 -
 server/src/com/cloud/upgrade/dao/DbUpgrade.java    |   45 -
 .../src/com/cloud/upgrade/dao/DbUpgradeUtils.java  |  106 -
 .../src/com/cloud/upgrade/dao/Upgrade217to218.java |   66 -
 .../src/com/cloud/upgrade/dao/Upgrade218to22.java  | 2385 -----
 .../upgrade/dao/Upgrade218to224DomainVlans.java    |  140 -
 .../cloud/upgrade/dao/Upgrade218to22Premium.java   |  100 -
 .../com/cloud/upgrade/dao/Upgrade2210to2211.java   |   64 -
 .../com/cloud/upgrade/dao/Upgrade2211to2212.java   |  139 -
 .../upgrade/dao/Upgrade2211to2212Premium.java      |   55 -
 .../com/cloud/upgrade/dao/Upgrade2212to2213.java   |  104 -
 .../com/cloud/upgrade/dao/Upgrade2213to2214.java   |  308 -
 .../src/com/cloud/upgrade/dao/Upgrade2214to30.java | 1326 ---
 .../src/com/cloud/upgrade/dao/Upgrade221to222.java |   66 -
 .../cloud/upgrade/dao/Upgrade221to222Premium.java  |   61 -
 .../src/com/cloud/upgrade/dao/Upgrade222to224.java |  610 --
 .../cloud/upgrade/dao/Upgrade222to224Premium.java  |   87 -
 .../src/com/cloud/upgrade/dao/Upgrade224to225.java |  351 -
 .../src/com/cloud/upgrade/dao/Upgrade225to226.java |  108 -
 .../src/com/cloud/upgrade/dao/Upgrade227to228.java |  157 -
 .../cloud/upgrade/dao/Upgrade227to228Premium.java  |  132 -
 .../src/com/cloud/upgrade/dao/Upgrade228to229.java |  138 -
 .../com/cloud/upgrade/dao/Upgrade229to2210.java    |  194 -
 .../src/com/cloud/upgrade/dao/Upgrade301to302.java |  229 -
 .../src/com/cloud/upgrade/dao/Upgrade302to40.java  | 1033 ---
 .../src/com/cloud/upgrade/dao/Upgrade30to301.java  |  124 -
 .../src/com/cloud/upgrade/dao/Upgrade30xBase.java  |  311 -
 .../src/com/cloud/upgrade/dao/Upgrade40to41.java   |  164 -
 .../src/com/cloud/upgrade/dao/Upgrade410to420.java |  308 -
 .../cloud/upgrade/dao/UpgradeSnapshot217to224.java |   60 -
 .../cloud/upgrade/dao/UpgradeSnapshot223to224.java |   60 -
 server/src/com/cloud/upgrade/dao/VersionDao.java   |   25 -
 .../src/com/cloud/upgrade/dao/VersionDaoImpl.java  |  172 -
 server/src/com/cloud/upgrade/dao/VersionVO.java    |   91 -
 .../cloud/usage/ExternalPublicIpStatisticsVO.java  |   98 -
 server/src/com/cloud/usage/UsageIPAddressVO.java   |  121 -
 server/src/com/cloud/usage/UsageJobVO.java         |  180 -
 .../com/cloud/usage/UsageLoadBalancerPolicyVO.java |   91 -
 .../com/cloud/usage/UsageNetworkOfferingVO.java    |  105 -
 server/src/com/cloud/usage/UsageNetworkVO.java     |  144 -
 .../com/cloud/usage/UsagePortForwardingRuleVO.java |   91 -
 .../src/com/cloud/usage/UsageSecurityGroupVO.java  |   97 -
 server/src/com/cloud/usage/UsageStorageVO.java     |  115 -
 server/src/com/cloud/usage/UsageVMInstanceVO.java  |  121 -
 server/src/com/cloud/usage/UsageVO.java            |  260 -
 server/src/com/cloud/usage/UsageVPNUserVO.java     |  105 -
 server/src/com/cloud/usage/UsageVolumeVO.java      |  115 -
 .../usage/dao/ExternalPublicIpStatisticsDao.java   |   33 -
 .../dao/ExternalPublicIpStatisticsDaoImpl.java     |   77 -
 server/src/com/cloud/usage/dao/UsageDao.java       |   41 -
 server/src/com/cloud/usage/dao/UsageDaoImpl.java   |  272 -
 .../src/com/cloud/usage/dao/UsageIPAddressDao.java |   28 -
 .../com/cloud/usage/dao/UsageIPAddressDaoImpl.java |  145 -
 server/src/com/cloud/usage/dao/UsageJobDao.java    |   34 -
 .../src/com/cloud/usage/dao/UsageJobDaoImpl.java   |  200 -
 .../usage/dao/UsageLoadBalancerPolicyDao.java      |   29 -
 .../usage/dao/UsageLoadBalancerPolicyDaoImpl.java  |  169 -
 .../src/com/cloud/usage/dao/UsageNetworkDao.java   |   27 -
 .../com/cloud/usage/dao/UsageNetworkDaoImpl.java   |   98 -
 .../cloud/usage/dao/UsageNetworkOfferingDao.java   |   28 -
 .../usage/dao/UsageNetworkOfferingDaoImpl.java     |  152 -
 .../usage/dao/UsagePortForwardingRuleDao.java      |   29 -
 .../usage/dao/UsagePortForwardingRuleDaoImpl.java  |  169 -
 .../com/cloud/usage/dao/UsageSecurityGroupDao.java |   28 -
 .../cloud/usage/dao/UsageSecurityGroupDaoImpl.java |  151 -
 .../src/com/cloud/usage/dao/UsageStorageDao.java   |   31 -
 .../com/cloud/usage/dao/UsageStorageDaoImpl.java   |  211 -
 .../com/cloud/usage/dao/UsageVMInstanceDao.java    |   29 -
 .../cloud/usage/dao/UsageVMInstanceDaoImpl.java    |  137 -
 .../src/com/cloud/usage/dao/UsageVPNUserDao.java   |   28 -
 .../com/cloud/usage/dao/UsageVPNUserDaoImpl.java   |  150 -
 server/src/com/cloud/usage/dao/UsageVolumeDao.java |   29 -
 .../com/cloud/usage/dao/UsageVolumeDaoImpl.java    |  178 -
 server/src/com/cloud/user/AccountDetailVO.java     |   75 -
 server/src/com/cloud/user/AccountDetailsDao.java   |   37 -
 .../src/com/cloud/user/AccountDetailsDaoImpl.java  |   96 -
 server/src/com/cloud/user/AccountManagerImpl.java  |   51 +-
 server/src/com/cloud/user/dao/AccountDao.java      |   52 -
 server/src/com/cloud/user/dao/AccountDaoImpl.java  |  267 -
 server/src/com/cloud/user/dao/SSHKeyPairDao.java   |   38 -
 .../src/com/cloud/user/dao/SSHKeyPairDaoImpl.java  |   85 -
 server/src/com/cloud/user/dao/UserAccountDao.java  |   27 -
 .../src/com/cloud/user/dao/UserAccountDaoImpl.java |   69 -
 server/src/com/cloud/user/dao/UserDao.java         |   52 -
 server/src/com/cloud/user/dao/UserDaoImpl.java     |  131 -
 .../src/com/cloud/user/dao/UserStatisticsDao.java  |   35 -
 .../com/cloud/user/dao/UserStatisticsDaoImpl.java  |  137 -
 server/src/com/cloud/user/dao/UserStatsLogDao.java |   23 -
 .../com/cloud/user/dao/UserStatsLogDaoImpl.java    |   31 -
 server/src/com/cloud/vm/ItWorkDao.java             |   45 -
 server/src/com/cloud/vm/ItWorkDaoImpl.java         |  108 -
 server/src/com/cloud/vm/ItWorkVO.java              |  179 -
 server/src/com/cloud/vm/NicVO.java                 |  365 -
 server/src/com/cloud/vm/UserVmManagerImpl.java     |  341 +-
 server/src/com/cloud/vm/UserVmStateListener.java   |   21 +-
 server/src/com/cloud/vm/VirtualMachineManager.java |    4 +
 .../com/cloud/vm/VirtualMachineManagerImpl.java    | 2121 +++--
 server/src/com/cloud/vm/dao/ConsoleProxyDao.java   |   47 -
 .../src/com/cloud/vm/dao/ConsoleProxyDaoImpl.java  |  353 -
 server/src/com/cloud/vm/dao/DomainRouterDao.java   |  149 -
 .../src/com/cloud/vm/dao/DomainRouterDaoImpl.java  |  358 -
 server/src/com/cloud/vm/dao/InstanceGroupDao.java  |   36 -
 .../src/com/cloud/vm/dao/InstanceGroupDaoImpl.java |   80 -
 .../com/cloud/vm/dao/InstanceGroupVMMapDao.java    |   28 -
 .../cloud/vm/dao/InstanceGroupVMMapDaoImpl.java    |   75 -
 server/src/com/cloud/vm/dao/NicDao.java            |   69 -
 server/src/com/cloud/vm/dao/NicDaoImpl.java        |  241 -
 server/src/com/cloud/vm/dao/NicSecondaryIpDao.java |   53 -
 .../com/cloud/vm/dao/NicSecondaryIpDaoImpl.java    |  138 -
 server/src/com/cloud/vm/dao/NicSecondaryIpVO.java  |  160 -
 .../com/cloud/vm/dao/SecondaryStorageVmDao.java    |   42 -
 .../cloud/vm/dao/SecondaryStorageVmDaoImpl.java    |  269 -
 .../com/cloud/vm/dao/UserVmCloneSettingDao.java    |   37 -
 .../cloud/vm/dao/UserVmCloneSettingDaoImpl.java    |   74 -
 server/src/com/cloud/vm/dao/UserVmDao.java         |   76 -
 server/src/com/cloud/vm/dao/UserVmDaoImpl.java     |  585 --
 server/src/com/cloud/vm/dao/UserVmData.java        |  723 --
 server/src/com/cloud/vm/dao/UserVmDetailsDao.java  |   32 -
 .../src/com/cloud/vm/dao/UserVmDetailsDaoImpl.java |   99 -
 server/src/com/cloud/vm/dao/VMInstanceDao.java     |  122 -
 server/src/com/cloud/vm/dao/VMInstanceDaoImpl.java |  686 --
 .../cloud/vm/snapshot/VMSnapshotManagerImpl.java   |   13 +-
 .../com/cloud/vm/snapshot/dao/VMSnapshotDao.java   |   39 -
 .../cloud/vm/snapshot/dao/VMSnapshotDaoImpl.java   |  161 -
 .../affinity/AffinityGroupServiceImpl.java         |  346 +
 .../lb/ApplicationLoadBalancerManagerImpl.java     |  524 ++
 .../org/apache/cloudstack/region/RegionSyncVO.java |   93 -
 .../src/org/apache/cloudstack/region/RegionVO.java |   87 -
 .../apache/cloudstack/region/dao/RegionDao.java    |   27 -
 .../cloudstack/region/dao/RegionDaoImpl.java       |   48 -
 .../region/gslb/GlobalLoadBalancerDaoImpl.java     |   58 -
 .../gslb/GlobalLoadBalancerLbRuleMapDao.java       |   30 -
 .../gslb/GlobalLoadBalancerLbRuleMapDaoImpl.java   |   63 -
 .../region/gslb/GlobalLoadBalancerLbRuleMapVO.java |   83 -
 .../region/gslb/GlobalLoadBalancerRuleDao.java     |   28 -
 .../region/gslb/GlobalLoadBalancerRuleVO.java      |  183 -
 .../gslb/GlobalLoadBalancingRulesServiceImpl.java  |   25 +
 .../configuration/ConfigurationManagerTest.java    |  413 +
 .../cloud/network/DedicateGuestVlanRangesTest.java |  378 +
 .../com/cloud/network/MockNetworkManagerImpl.java  |   58 +-
 .../com/cloud/network/MockNetworkModelImpl.java    |   26 +-
 .../com/cloud/network/MockRulesManagerImpl.java    |   11 +-
 .../cloud/network/UpdatePhysicalNetworkTest.java   |   68 +
 .../SecurityGroupManagerTestConfiguration.java     |    4 +-
 .../snapshot/SnapshotDaoTestConfiguration.java     |    4 +-
 .../dao/StoragePoolDaoTestConfiguration.java       |    4 +-
 .../test/com/cloud/vm/MockUserVmManagerImpl.java   |   56 +-
 server/test/com/cloud/vm/UserVmManagerTest.java    |  126 +-
 .../cloud/vm/VirtualMachineManagerImplTest.java    |  252 +-
 .../vm/VmWorkMockVirtualMachineManagerImpl.java    |   15 +-
 .../UserVmCloneSettingDaoTestConfiguration.java    |    4 +-
 .../test/com/cloud/vm/dao/UserVmDaoImplTest.java   |   43 +-
 .../cloud/vm/dao/UserVmDaoTestConfiguration.java   |   50 +
 .../cloud/vm/snapshot/VMSnapshotManagerTest.java   |   20 +-
 .../cloud/vpc/MockConfigurationManagerImpl.java    |   34 +-
 .../test/com/cloud/vpc/MockNetworkManagerImpl.java |   44 +-
 .../test/com/cloud/vpc/MockNetworkModelImpl.java   |   26 +-
 server/test/com/cloud/vpc/MockVpcManagerImpl.java  |    2 +-
 .../vpc/MockVpcVirtualNetworkApplianceManager.java |   14 +-
 server/test/com/cloud/vpc/Site2SiteVpnTest.java    |    2 +-
 server/test/com/cloud/vpc/VpcApiUnitTest.java      |  167 +-
 server/test/com/cloud/vpc/VpcTest.java             |  269 +
 .../test/com/cloud/vpc/VpcTestConfiguration.java   |   75 +-
 .../cloud/vpc/dao/MockNetworkOfferingDaoImpl.java  |   12 +-
 .../vpc/dao/MockNetworkServiceMapDaoImpl.java      |    6 +
 .../cloudstack/affinity/AffinityApiUnitTest.java   |  256 +
 .../cloudstack/lb/ApplicationLoadBalancerTest.java |  292 +
 .../cloudstack/lb/ChildTestConfiguration.java      |  105 +
 .../networkoffering/ChildTestConfiguration.java    |   51 +-
 .../networkoffering/CreateNetworkOfferingTest.java |   61 +-
 server/test/resources/UserVMDaoTestContext.xml     |   44 +
 server/test/resources/appLoadBalancer.xml          |   43 +
 server/test/resources/network-mgr-component.xml    |    2 +-
 services/console-proxy/plugin/pom.xml              |    8 +-
 services/console-proxy/pom.xml                     |    4 +-
 .../console-proxy/server/conf/agent.properties     |   17 -
 .../server/conf/environment.properties             |    2 +
 services/console-proxy/server/conf/log4j-cloud.xml |    2 +-
 services/console-proxy/server/css/ajaxviewer.css   |    6 +-
 services/console-proxy/server/js/ajaxkeys.js       |  317 +-
 services/console-proxy/server/js/ajaxviewer.js     |  128 +-
 services/console-proxy/server/pom.xml              |   43 +-
 services/console-proxy/server/scripts/_run.sh      |    3 +-
 .../console-proxy/server/scripts/consoleproxy.sh   |   33 +
 .../console-proxy/server/scripts/secstorage.sh     |   33 +
 .../src/com/cloud/consoleproxy/ConsoleProxy.java   |   16 +-
 .../cloud/consoleproxy/ConsoleProxyClientBase.java |    1 +
 .../ConsoleProxyPasswordBasedEncryptor.java        |  253 +-
 services/pom.xml                                   |    3 +-
 services/secondary-storage/conf/agent.properties   |    2 +
 .../secondary-storage/conf/environment.properties  |    2 +
 services/secondary-storage/conf/log4j-cloud.xml    |  102 +
 services/secondary-storage/pom.xml                 |  103 +
 services/secondary-storage/scripts/_run.sh         |   64 +
 services/secondary-storage/scripts/config_auth.sh  |   69 +
 services/secondary-storage/scripts/config_ssl.sh   |  174 +
 services/secondary-storage/scripts/ipfirewall.sh   |   50 +
 services/secondary-storage/scripts/run-proxy.sh    |   48 +
 services/secondary-storage/scripts/run.bat         |   18 +
 services/secondary-storage/scripts/run.sh          |   45 +
 services/secondary-storage/scripts/ssvm-check.sh   |  136 +
 .../resource/CifsSecondaryStorageResource.java     |  755 ++
 .../resource/LocalSecondaryStorageResource.java    |  246 +
 .../resource/NfsSecondaryStorageResource.java      | 1904 ++++
 .../resource/SecondaryStorageDiscoverer.java       |  320 +
 .../storage/resource/SecondaryStorageResource.java |   28 +
 .../resource/SecondaryStorageResourceHandler.java  |   24 +
 .../storage/template/DownloadManager.java          |  105 +
 .../storage/template/DownloadManagerImpl.java      | 1074 +++
 .../cloudstack/storage/template/UploadManager.java |   87 +
 .../storage/template/UploadManagerImpl.java        |  648 ++
 setup/db/db/schema-2214to30.sql                    |    1 +
 setup/db/db/schema-40to410.sql                     |   41 +-
 setup/db/db/schema-410to420.sql                    |  806 ++-
 setup/db/templates.sql                             |   12 +
 setup/dev/advanced.cfg                             |   13 +-
 setup/dev/basic.cfg                                |    9 +-
 setup/dev/local.cfg                                |   44 +
 test/integration/component/test_accounts.py        |  106 +-
 .../component/test_allocation_states.py            |    4 +-
 test/integration/component/test_asa1000v_fw.py     |  134 +
 test/integration/component/test_blocker_bugs.py    |   98 +-
 test/integration/component/test_egress_rules.py    |  213 +-
 test/integration/component/test_eip_elb.py         |  127 +-
 .../component/test_multiple_ip_ranges.py           |  429 +
 .../integration/component/test_network_offering.py |  225 +-
 test/integration/component/test_project_configs.py |  148 +-
 test/integration/component/test_project_limits.py  |   34 +-
 .../component/test_project_resources.py            |   67 +-
 test/integration/component/test_project_usage.py   |   70 +-
 test/integration/component/test_projects.py        |   94 +-
 test/integration/component/test_regions.py         |  140 +
 .../integration/component/test_regions_accounts.py |  206 +
 test/integration/component/test_resource_limits.py |  102 +-
 test/integration/component/test_routers.py         |  125 +-
 test/integration/component/test_security_groups.py |  217 +-
 test/integration/component/test_snapshots.py       |  100 +-
 test/integration/component/test_storage_motion.py  |  309 +
 test/integration/component/test_templates.py       |   49 +-
 test/integration/component/test_usage.py           |  116 +-
 .../integration/component/test_vm_passwdenabled.py |   13 +-
 test/integration/component/test_volumes.py         |   80 +-
 test/integration/component/test_vpn_users.py       |  447 +
 test/integration/smoke/test_ScaleVm.py             |  221 -
 test/integration/smoke/test_affinity_groups.py     |  194 +
 .../smoke/test_deploy_vm_with_userdata.py          |  146 +
 test/integration/smoke/test_global_settings.py     |   72 +
 test/integration/smoke/test_guest_vlan_range.py    |  175 +
 test/integration/smoke/test_internal_lb.py         |  250 +
 test/integration/smoke/test_iso.py                 |   21 +-
 test/integration/smoke/test_network.py             |  172 +-
 test/integration/smoke/test_nic.py                 |    8 +-
 test/integration/smoke/test_non_contigiousvlan.py  |   86 +
 test/integration/smoke/test_public_ip_range.py     |  173 +
 test/integration/smoke/test_regions.py             |   93 +
 test/integration/smoke/test_routers.py             |   62 +-
 test/integration/smoke/test_scale_vm.py            |  221 +
 test/integration/smoke/test_templates.py           |   48 +-
 test/integration/smoke/test_vm_life_cycle.py       |   32 +-
 test/integration/smoke/test_vm_snapshots.py        |  308 +
 test/integration/smoke/test_volumes.py             |   80 +-
 test/selenium/ReadMe.txt                           |   36 +-
 test/selenium/lib/initialize.py                    |   17 +-
 test/selenium/smoke/Login_and_Accounts.py          |    5 +-
 test/selenium/smoke/main.py                        |    2 +-
 tools/apidoc/gen_toc.py                            |    6 +-
 tools/appliance/build.sh                           |    5 +-
 .../definitions/systemvmtemplate/cleanup.sh        |    1 -
 .../definitions/systemvmtemplate/definition.rb     |    6 +-
 .../definitions/systemvmtemplate/postinstall.sh    |   30 +-
 .../definitions/systemvmtemplate/preseed.cfg       |   14 +-
 .../definitions/systemvmtemplate64/cleanup.sh      |    1 -
 .../definitions/systemvmtemplate64/definition.rb   |    6 +-
 .../definitions/systemvmtemplate64/postinstall.sh  |   30 +-
 .../definitions/systemvmtemplate64/preseed.cfg     |   14 +-
 tools/build/build_asf.sh                           |   91 +-
 tools/build/build_docs.sh                          |   19 +-
 tools/build/setnextversion.sh                      |   75 +
 tools/cli/cloudmonkey/requester.py                 |    4 +-
 tools/devcloud/devcloud.cfg                        |    1 +
 tools/devcloud/pom.xml                             |   33 +
 tools/devcloud/quickcloud.cfg                      |  121 +
 tools/marvin/marvin/asyncJobMgr.py                 |   72 +-
 tools/marvin/marvin/cloudstackConnection.py        |  279 +-
 tools/marvin/marvin/cloudstackTestClient.py        |   56 +-
 tools/marvin/marvin/codegenerator.py               |    4 +-
 tools/marvin/marvin/configGenerator.py             |    1 +
 tools/marvin/marvin/dbConnection.py                |    6 +-
 tools/marvin/marvin/deployDataCenter.py            |   40 +-
 tools/marvin/marvin/integration/lib/base.py        |  864 ++-
 tools/marvin/marvin/integration/lib/common.py      |    4 +-
 tools/marvin/marvin/integration/lib/utils.py       |   17 +-
 tools/marvin/marvin/jsonHelper.py                  |    7 +-
 tools/marvin/marvin/remoteSSHClient.py             |   18 +-
 .../marvin/marvin/sandbox/advanced/advanced_env.py |    8 +
 tools/marvin/marvin/sandbox/advanced/sandbox.cfg   |  209 +
 tools/marvin/marvin/sandbox/basic/basic_env.py     |    1 +
 .../sandbox/demo/simulator/simulator_setup.py      |    2 +
 tools/marvin/pom.xml                               |   91 +-
 tools/marvin/setup.py                              |    1 +
 tools/transifex/.tx/config                         |   32 +
 tools/transifex/README-transifex.txt               |   71 +
 tools/transifex/sync-transifex-ui.sh               |  160 +
 ui/css/cloudstack3.css                             |  241 +-
 ui/dictionary.jsp                                  | 1714 ++--
 ui/images/icons.png                                |  Bin 50745 -> 50052 bytes
 ui/images/sprites.png                              |  Bin 188552 -> 192407 bytes
 ui/index.jsp                                       |   39 +-
 ui/modules/modules.js                              |   20 +
 ui/scripts/accounts.js                             |   58 +
 ui/scripts/affinity.js                             |  183 +
 ui/scripts/cloudStack.js                           |   13 +-
 ui/scripts/configuration.js                        |    2 +-
 ui/scripts/dashboard.js                            |    2 +-
 ui/scripts/domains.js                              |    2 +-
 ui/scripts/events.js                               |    8 +-
 ui/scripts/instanceWizard.js                       |  932 +-
 ui/scripts/instances.js                            |  464 +-
 ui/scripts/network.js                              |  752 ++-
 ui/scripts/plugins.js                              |  114 +-
 ui/scripts/regions.js                              |  419 +-
 ui/scripts/sharedFunctions.js                      |   32 +-
 ui/scripts/storage.js                              |   99 +-
 ui/scripts/system.js                               |  747 ++-
 ui/scripts/templates.js                            |   80 +-
 ui/scripts/ui-custom/affinity.js                   |  173 +
 ui/scripts/ui-custom/granularSettings.js           |   46 +
 ui/scripts/ui-custom/instanceWizard.js             |   42 +-
 ui/scripts/ui-custom/pluginListing.js              |  109 +
 ui/scripts/ui-custom/plugins.js                    |  109 -
 ui/scripts/ui-custom/projectSelect.js              |   66 +
 ui/scripts/ui-custom/projects.js                   |    6 +-
 ui/scripts/ui-custom/regions.js                    |    2 +-
 ui/scripts/ui-custom/vpc.js                        |    1 +
 ui/scripts/ui-custom/zoneFilter.js                 |   39 +
 ui/scripts/ui/widgets/detailView.js                |  157 +-
 ui/scripts/ui/widgets/listView.js                  |   22 +-
 ui/scripts/ui/widgets/multiEdit.js                 |    5 +
 ui/scripts/vm_snapshots.js                         |    2 +-
 ui/scripts/vpc.js                                  |   76 +-
 ui/scripts/zoneWizard.js                           |  159 +-
 usage/pom.xml                                      |    5 +
 usage/src/com/cloud/usage/UsageManagerImpl.java    |   10 +-
 usage/src/com/cloud/usage/UsageServer.java         |   16 +-
 .../cloud/usage/UsageManagerTestConfiguration.java |    5 +-
 utils/pom.xml                                      |   12 +-
 utils/src/com/cloud/maint/Version.java             |   66 +
 utils/src/com/cloud/utils/AnnotationHelper.java    |   28 +-
 utils/src/com/cloud/utils/SerialVersionUID.java    |    1 +
 .../cloud/utils/cisco/n1kv/vsm/NetconfHelper.java  |   22 +
 .../com/cloud/utils/cisco/n1kv/vsm/VsmCommand.java |  218 +
 .../cloud/utils/component/ComponentContext.java    |    4 +-
 .../utils/component/SpringComponentScanUtils.java  |   41 -
 utils/src/com/cloud/utils/net/NetUtils.java        |   10 +-
 utils/src/com/cloud/utils/nio/NioClient.java       |    3 +-
 utils/src/com/cloud/utils/nio/NioConnection.java   |    2 +-
 .../apache/cloudstack/test/utils/SpringUtils.java  |  113 +
 vmware-base/pom.xml                                |    4 -
 .../hypervisor/vmware/mo/HypervisorHostHelper.java |   45 +-
 .../hypervisor/vmware/mo/VirtualMachineMO.java     |    6 +-
 .../cloud/hypervisor/vmware/util/VmwareClient.java |    2 +-
 .../vmware/util/VmwareGuestOsMapper.java           |   11 +-
 .../cloud/hypervisor/vmware/util/VmwareHelper.java |   26 +-
 .../vmware/mo/TestVmwareContextFactory.java        |   43 -
 .../cloud/hypervisor/vmware/mo/TestVmwareMO.java   |   39 -
 .../hypervisor/vmware/util/TestVmwareUtil.java     |  107 -
 vmware-base/test/com/cloud/vmware/TestVMWare.java  | 1342 ---
 2452 files changed, 162799 insertions(+), 113296 deletions(-)
----------------------------------------------------------------------



[25/50] [abbrv] git commit: updated refs/heads/vmsync to d403974

Posted by ah...@apache.org.
CLOUDSTACK-893 conceptual info around gslb


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

Branch: refs/heads/vmsync
Commit: 7fea21e31f25e0a42a4e2d311faa3cba429e0101
Parents: 75a2457
Author: Radhika PC <ra...@citrix.com>
Authored: Fri May 10 10:03:11 2013 +0530
Committer: Radhika PC <ra...@citrix.com>
Committed: Fri May 10 10:04:13 2013 +0530

----------------------------------------------------------------------
 docs/en-US/added-API-commands-4.2.xml |   33 +++++---
 docs/en-US/gslb.xml                   |  120 ++++++++++++++++++++++------
 2 files changed, 118 insertions(+), 35 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/7fea21e3/docs/en-US/added-API-commands-4.2.xml
----------------------------------------------------------------------
diff --git a/docs/en-US/added-API-commands-4.2.xml b/docs/en-US/added-API-commands-4.2.xml
index 7417bd1..3abb780 100644
--- a/docs/en-US/added-API-commands-4.2.xml
+++ b/docs/en-US/added-API-commands-4.2.xml
@@ -91,20 +91,31 @@
     </listitem>
     <listitem>
       <para>listGlobalLoadBalancerRule</para>
-      <para>Lists load balancer rules. account (lists resources by account. Use with the domainId
-        parameter); domainid (lists only resources belonging to the domain specified) id (the unique
-        ID of the global load balancer rule) isrecursive (defaults to false, but if true, lists all
-        resources from the parent specified by the domainId till leaves); keyword (List by keyword);
-        listall (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); page;
-        pagesize; projectid (lists objects by project); regionid (region ID); tags (lists resources
-        by tags: key/value pairs). </para>
+      <para>Lists load balancer rules.</para>
+      <para>The request parameters are: account (lists resources by account. Use with the domainid
+        parameter); domainid (lists only resources belonging to the domain specified); id (the
+        unique ID of the global load balancer rule); isrecursive (defaults to false; but if true,
+        lists all the resources from the parent specified by the domainid); keyword (lists by
+        keyword); listall (if set to false, lists only resources belonging to the command's caller;
+        if set to true, lists resources that the caller is authorized to see. Default value is
+        false); page; pagesize; projectid (lists objects by project); regionid ; tags (lists
+        resources by tags: key/value pairs). </para>
     </listitem>
     <listitem>
       <para>updateGlobalLoadBalancerRule</para>
-      <para>Archives the specified events. The request parameters are: ids (allowed to pass one or
-        more IDs separated by comma); type (string); olderthan (yyyy-mm-dd format).</para>
-      <para>The response parameters are: true, false </para>
+      <para>Updates global load balancer rules.</para>
+      <para>The request parameters are: id (the unique ID of the global load balancer rule); account
+        (lists resources by account. Use with the domainid parameter); description (the description
+        of the load balancer rule); domainid (lists only resources belonging to the domain
+        specified); gslblbmethod (the load balancer algorithm that is used to distributed traffic
+        across the zones participating in global server load balancing, if not specified defaults to
+        round robin); gslbstickysessionmethodname (the session sticky method; if not specified
+        defaults to sourceip); isrecursive (defaults to false, but if true, lists all resources from
+        the parent specified by the domainid till leaves); keyword (lists by keyword); listall (if
+        set to false, list only those resources belonging to the command's caller; if set to true,
+        lists resources that the caller is authorized to see. Default value is false); page;
+        pagesize; projectid (lists objects by project); regionid; tags (lists resources by tags:
+        key/value pairs)</para>
     </listitem>
   </itemizedlist>
 </section>

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/7fea21e3/docs/en-US/gslb.xml
----------------------------------------------------------------------
diff --git a/docs/en-US/gslb.xml b/docs/en-US/gslb.xml
index 385642d..ac17d61 100644
--- a/docs/en-US/gslb.xml
+++ b/docs/en-US/gslb.xml
@@ -41,6 +41,60 @@
       alternate location for accessing a resource in the event of a failure, or to provide a means
       of shifting traffic easily to simplify maintenance, or both.</para>
   </section>
+  <section id="gslb-comp">
+    <title>Components of GSLB</title>
+    <para>A typical GSLB environment is comprised of the following components:</para>
+    <itemizedlist>
+      <listitem>
+        <para><emphasis role="bold">GSLB Site</emphasis>: In &PRODUCT;terminology, GSLB sites are
+          represented by zones that are mapped to data centers, each of which has various network
+          appliances. Each GSLB site is managed by a NetScaler appliance that is local to that site.
+          Each of these appliances treats its own site as the local site and all other sites,
+          managed by other appliances, as remote sites.</para>
+      </listitem>
+      <listitem>
+        <para><emphasis role="bold">GSLB Services</emphasis>: A GSLB service is typically
+          represented by a load balancing or content switching virtual server. In a GSLB
+          environment, you can have a local as well as remote GSLB services. A local GSLB service
+          represents a local load balancing or content switching virtual server. A remote GSLB
+          service is the one configured at one of the other sites in the GSLB setup. At each site in
+          the GSLB setup, you can create one local GSLB service and any number of remote GSLB
+          services.</para>
+      </listitem>
+      <listitem>
+        <para><emphasis role="bold">GSLB Virtual Servers</emphasis>: A GSLB virtual server refers to
+          one or more GSLB services and balances traffic between traffic across the VMs in multiple
+          zones by using the &PRODUCT; functionality. It evaluates the configured GSLB methods or
+          algorithms to select a GSLB service to which to send the client requests. One or more
+          virtual servers from different zones are bound to the GSLB virtual server. GSLB virtual
+          server does not have a public IP associated with it, instead it will have a FQDN DNS
+          name.</para>
+      </listitem>
+      <listitem>
+        <para><emphasis role="bold">Load Balancing or Content Switching Virtual Servers</emphasis>:
+          According to Citrix NetScaler terminology, a load balancing or content switching virtual
+          server represents one or many servers on the local network. Clients send their requests to
+          the load balancing or content switching virtual server’s virtual IP (VIP) address, and the
+          virtual server balances the load across the local servers. After a GSLB virtual server
+          selects a GSLB service representing either a local or a remote load balancing or content
+          switching virtual server, the client sends the request to that virtual server’s VIP
+          address.</para>
+      </listitem>
+      <listitem>
+        <para><emphasis role="bold">DNS VIPs</emphasis>: DNS virtual IP represents a load balancing
+          DNS virtual server on the GSLB service provider. The DNS requests for domains for which
+          the GSLB service provider is authoritative can be sent to a DNS VIP.</para>
+      </listitem>
+      <listitem>
+        <para><emphasis role="bold">ADNS</emphasis>: ADNS (Authoritative Domain Name Server) is a
+          service that provides actual answer to DNS queries, such as web site IP address. In a GSLB
+          environment, an ADNS service responds only to DNS requests for domains for which the GSLB
+          service provider is authoritative. When an ADNS service is configured, the service
+          provider owns that IP address and advertises it. When you create an ADNS service, the
+          NetScaler responds to DNS queries on the configured ADNS service IP and port.</para>
+      </listitem>
+    </itemizedlist>
+  </section>
   <section id="prereq-gslb">
     <title>Prerequisites and Guidelines</title>
     <itemizedlist>
@@ -63,23 +117,23 @@
       </listitem>
       <listitem>
         <para>When users have VMs deployed in multiple availability zones which are GSLB enabled,
-          user is allowed to use the GSLB functionality to load balance traffic across the VMs in
-          multiple zones.</para>
+          they can use the GSLB functionality to load balance traffic across the VMs in multiple
+          zones.</para>
       </listitem>
       <listitem>
-        <para>The users are allowed to use GSLB to load balance across the VMs across zones in a
-          region only if the admin has enabled GSLB in that region. </para>
+        <para>The users can use GSLB to load balance across the VMs across zones in a region only if
+          the admin has enabled GSLB in that region. </para>
       </listitem>
       <listitem>
-        <para>The users are allowed to load balance traffic across the availability zones in the
-          same region or different regions.</para>
+        <para>The users can load balance traffic across the availability zones in the same region or
+          different regions.</para>
       </listitem>
       <listitem>
-        <para>The admin is allowed to configure DNS name for the entire cloud.</para>
+        <para>The admin can configure DNS name for the entire cloud.</para>
       </listitem>
       <listitem>
-        <para>The users can specify an unique name, across the cloud, for a globally load balanced
-          service. The provided name will be used as the domain under the DNS name associated with
+        <para>The users can specify an unique name across the cloud for a globally load balanced
+          service. The provided name is used as the domain name under the DNS name associated with
           the cloud.</para>
         <para>The user-provided name along with the admin-provided DNS name is used to produce a
           globally resolvable FQDN for the globally load balanced service of the user. For example,
@@ -88,13 +142,12 @@
           foo.xyztelco.com.</para>
       </listitem>
       <listitem>
-        <para>While setting up GSLB, users can select a load balancing method, such as round robin
-          or least RTT, that would be the load balance traffic used across the zones that are part
-          of GSLB.</para>
+        <para>While setting up GSLB, users can select a load balancing method, such as round robin,
+          for using across the zones that are part of GSLB.</para>
       </listitem>
       <listitem>
         <para>The user shall be able to set weight to zone-level virtual server. Weight shall be
-          considered by the load balancing method is distributing the traffic.</para>
+          considered by the load balancing method for distributing the traffic.</para>
       </listitem>
       <listitem>
         <para>The GSLB functionality shall support session persistence, where series of client
@@ -103,6 +156,24 @@
       </listitem>
     </itemizedlist>
   </section>
+  <section id="gslb-workflow">
+    <title>Configuring GSLB</title>
+    <para>To configure GSLB in your cloud environment, as a cloud administrator you must perform the
+      following.</para>
+    <para>To configure such a GSLB setup, you must first configure a standard load balancing setup
+      for each server farm or data center. This enables you to balance load across the different
+      servers in each server farm. Then, configure both NetScaler appliances as authoritative DNS
+      (ADNS) servers. Next, create a GSLB site for each server farm, configure GSLB virtual servers
+      for each site, create GLSB services, and bind the GSLB services to the GSLB virtual servers.
+      Finally, bind the domain to the GSLB virtual servers. The GSLB configurations on the two
+      appliances at the two different sites are identical, although each sites load-balancing
+      configuration is specific to that site.</para>
+    <orderedlist>
+      <listitem>
+        <para/>
+      </listitem>
+    </orderedlist>
+  </section>
   <section id="gslb-add">
     <title>Adding a GSLB Rule</title>
     <orderedlist>
@@ -174,17 +245,18 @@
   </section>
   <section id="concept-gslb">
     <title>How Does GSLB Works in &PRODUCT;?</title>
-    <para>The following is an illustrated conceptual model of how GLSB functionality is provided in
-      &PRODUCT;: An organization, xyztelco, has set up a public cloud that spans two zones, Zone-1
-      and Zone-2, across geographically separated data centers that are managed by &PRODUCT;.
-      Tenant-A of the cloud launches a highly available solution by using xyztelco cloud. For that
-      purpose, they launch two instances each in both the zones: VM1 and VM2 in Zone-1 and VM5 and
-      VM6 in Zone-2. Tenant-A acquires a public IP, IP-1 in Zone-1, and configures a load balancer
-      rule to load balance the traffic between VM1 and VM2 instances. &PRODUCT; orchestrates setting
-      up a virtual server on the LB service provider in Zone-1. Virtual server 1 that is set up on
-      the LB service provider in Zone-1 represents a publicly accessible virtual server that client
-      reaches at IP-1. The client traffic to virtual server 1 at IP-1 will be load balanced across
-      VM1 and VM2 instances. </para>
+    <para>Global server load balancing is used to manage traffic flow to a web site hosted on two
+      separate zones that ideally are in different geographic locations. The following is an
+      illustration of how GLSB functionality is provided in &PRODUCT;: An organization, xyztelco,
+      has set up a public cloud that spans two zones, Zone-1 and Zone-2, across geographically
+      separated data centers that are managed by &PRODUCT;. Tenant-A of the cloud launches a highly
+      available solution by using xyztelco cloud. For that purpose, they launch two instances each
+      in both the zones: VM1 and VM2 in Zone-1 and VM5 and VM6 in Zone-2. Tenant-A acquires a public
+      IP, IP-1 in Zone-1, and configures a load balancer rule to load balance the traffic between
+      VM1 and VM2 instances. &PRODUCT; orchestrates setting up a virtual server on the LB service
+      provider in Zone-1. Virtual server 1 that is set up on the LB service provider in Zone-1
+      represents a publicly accessible virtual server that client reaches at IP-1. The client
+      traffic to virtual server 1 at IP-1 will be load balanced across VM1 and VM2 instances. </para>
     <para>Tenant-A acquires another public IP, IP-2 in Zone-2 and sets up a load balancer rule to
       load balance the traffic between VM5 and VM6 instances. Similarly in Zone-2, &PRODUCT;
       orchestrates setting up a virtual server on the LB service provider. Virtual server 2 that is


[49/50] [abbrv] Merged master to vmsync

Posted by ah...@apache.org.
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/d4039743/api/src/com/cloud/async/AsyncJob.java
----------------------------------------------------------------------
diff --cc api/src/com/cloud/async/AsyncJob.java
index 7f03388,ccdc406..41afb79
--- a/api/src/com/cloud/async/AsyncJob.java
+++ b/api/src/com/cloud/async/AsyncJob.java
@@@ -22,17 -22,40 +22,50 @@@ import org.apache.cloudstack.api.Intern
  import java.util.Date;
  
  public interface AsyncJob extends Identity, InternalIdentity {
 +	
 +	public enum JournalType { 
 +		SUCCESS, FAILURE 
 +	};
 +	
 +    String getType();
 +    
 +    String getDispatcher();
 +
 +    int getPendingSignals();
+     public enum Type {
+         None,
+         VirtualMachine,
+         DomainRouter,
+         Volume,
+         ConsoleProxy,
+         Snapshot,
+         Template,
+         Iso,
+         SystemVm,
+         Host,
+         StoragePool,
+         IpAddress,
+         SecurityGroup,
+         PhysicalNetwork,
+         TrafficType,
+         PhysicalNetworkServiceProvider,
+         FirewallRule,
+         Account,
+         User,
+         PrivateGateway,
+         StaticRoute,
+         Counter,
+         Condition,
+         AutoScalePolicy,
+         AutoScaleVmProfile,
+         AutoScaleVmGroup,
+         GlobalLoadBalancerRule,
+         LoadBalancerRule,
+         AffinityGroup,
+         InternalLbVm,
+         DedicatedGuestVlanRange
+     }
 -
 +    
      long getUserId();
  
      long getAccountId();

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/d4039743/api/src/com/cloud/vm/VirtualMachine.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/d4039743/api/src/org/apache/cloudstack/api/ApiCommandJobType.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/ApiCommandJobType.java
index fbe22ef,0000000..5de734a
mode 100644,000000..100644
--- a/api/src/org/apache/cloudstack/api/ApiCommandJobType.java
+++ b/api/src/org/apache/cloudstack/api/ApiCommandJobType.java
@@@ -1,48 -1,0 +1,52 @@@
 +// 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 org.apache.cloudstack.api;
 +
 +public enum ApiCommandJobType {
 +    None,
 +    VirtualMachine,
 +    DomainRouter,
 +    Volume,
 +    ConsoleProxy,
 +    Snapshot,
 +    Template,
 +    Iso,
 +    SystemVm,
 +    Host,
 +    StoragePool,
 +    IpAddress,
 +    SecurityGroup,
 +    PhysicalNetwork,
 +    TrafficType,
 +    PhysicalNetworkServiceProvider,
 +    FirewallRule,
 +    Account,
 +    User,
 +    PrivateGateway,
 +    StaticRoute,
 +    Counter,
 +    Condition,
 +    AutoScalePolicy,
 +    AutoScaleVmProfile,
 +    AutoScaleVmGroup,
-     GlobalLoadBalancerRule
++    GlobalLoadBalancerRule,
++    LoadBalancerRule,
++    AffinityGroup,
++    InternalLbVm,
++    DedicatedGuestVlanRange
 +}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/d4039743/api/src/org/apache/cloudstack/api/command/admin/host/ListHostsCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/admin/host/ListHostsCmd.java
index a33407e,69c6980..ee78442
--- a/api/src/org/apache/cloudstack/api/command/admin/host/ListHostsCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/admin/host/ListHostsCmd.java
@@@ -19,9 -19,9 +19,10 @@@ package org.apache.cloudstack.api.comma
  import java.util.ArrayList;
  import java.util.EnumSet;
  import java.util.List;
+ import java.util.Map;
  
  import org.apache.cloudstack.api.APICommand;
 +import org.apache.cloudstack.api.ApiCommandJobType;
  import org.apache.cloudstack.api.ApiConstants;
  import org.apache.cloudstack.api.ApiConstants.HostDetails;
  import org.apache.cloudstack.api.BaseListCmd;

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/d4039743/api/src/org/apache/cloudstack/api/command/admin/internallb/ListInternalLBVMsCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/admin/internallb/ListInternalLBVMsCmd.java
index 0000000,e314b32..fd1ad57
mode 000000,100644..100644
--- a/api/src/org/apache/cloudstack/api/command/admin/internallb/ListInternalLBVMsCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/admin/internallb/ListInternalLBVMsCmd.java
@@@ -1,0 -1,151 +1,152 @@@
+ // 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 org.apache.cloudstack.api.command.admin.internallb;
+ 
++import org.apache.log4j.Logger;
++
+ import org.apache.cloudstack.api.APICommand;
++import org.apache.cloudstack.api.ApiCommandJobType;
+ import org.apache.cloudstack.api.ApiConstants;
+ import org.apache.cloudstack.api.BaseListProjectAndAccountResourcesCmd;
+ import org.apache.cloudstack.api.Parameter;
+ import org.apache.cloudstack.api.response.DomainRouterResponse;
+ import org.apache.cloudstack.api.response.HostResponse;
+ import org.apache.cloudstack.api.response.ListResponse;
+ import org.apache.cloudstack.api.response.NetworkResponse;
+ import org.apache.cloudstack.api.response.PodResponse;
+ import org.apache.cloudstack.api.response.UserVmResponse;
+ import org.apache.cloudstack.api.response.VpcResponse;
+ import org.apache.cloudstack.api.response.ZoneResponse;
 -import org.apache.log4j.Logger;
+ 
 -import com.cloud.async.AsyncJob;
+ import com.cloud.network.router.VirtualRouter.Role;
+ 
+ @APICommand(name = "listInternalLoadBalancerVMs", description="List internal LB VMs.", responseObject=DomainRouterResponse.class)
+ public class ListInternalLBVMsCmd extends BaseListProjectAndAccountResourcesCmd {
+     public static final Logger s_logger = Logger.getLogger(ListInternalLBVMsCmd.class.getName());
+ 
+     private static final String s_name = "listinternallbvmssresponse";
+ 
+     /////////////////////////////////////////////////////
+     //////////////// API parameters /////////////////////
+     /////////////////////////////////////////////////////
+ 
+     @Parameter(name=ApiConstants.HOST_ID, type=CommandType.UUID, entityType=HostResponse.class,
+             description="the host ID of the Internal LB VM")
+     private Long hostId;
+ 
+     @Parameter(name=ApiConstants.ID, type=CommandType.UUID, entityType=UserVmResponse.class,
+             description="the ID of the Internal LB VM")
+     private Long id;
+ 
+     @Parameter(name=ApiConstants.NAME, type=CommandType.STRING, description="the name of the Internal LB VM")
+     private String routerName;
+ 
+     @Parameter(name=ApiConstants.POD_ID, type=CommandType.UUID, entityType=PodResponse.class,
+             description="the Pod ID of the Internal LB VM")
+     private Long podId;
+ 
+     @Parameter(name=ApiConstants.STATE, type=CommandType.STRING, description="the state of the Internal LB VM")
+     private String state;
+ 
+     @Parameter(name=ApiConstants.ZONE_ID, type=CommandType.UUID, entityType=ZoneResponse.class,
+             description="the Zone ID of the Internal LB VM")
+     private Long zoneId;
+ 
+     @Parameter(name=ApiConstants.NETWORK_ID, type=CommandType.UUID, entityType=NetworkResponse.class,
+             description="list by network id")
+     private Long networkId;
+ 
+     @Parameter(name=ApiConstants.VPC_ID, type=CommandType.UUID, entityType=VpcResponse.class,
+             description="List Internal LB VMs by VPC")
+     private Long vpcId;
+ 
+     @Parameter(name=ApiConstants.FOR_VPC, type=CommandType.BOOLEAN, description="if true is passed for this parameter, list only VPC Internal LB VMs")
+     private Boolean forVpc;
+     
+     @Parameter(name=ApiConstants.ZONE_TYPE, type=CommandType.STRING, description="the network type of the zone that the virtual machine belongs to")
+     private String zoneType;
+     
+ 
+     /////////////////////////////////////////////////////
+     /////////////////// Accessors ///////////////////////
+     /////////////////////////////////////////////////////
+ 
+     public Long getHostId() {
+         return hostId;
+     }
+ 
+     public Long getId() {
+         return id;
+     }
+ 
+     public String getRouterName() {
+         return routerName;
+     }
+ 
+     public Long getPodId() {
+         return podId;
+     }
+ 
+     public String getState() {
+         return state;
+     }
+ 
+     public Long getZoneId() {
+         return zoneId;
+     }
+ 
+     public Long getNetworkId() {
+         return networkId;
+     }
+ 
+     public Long getVpcId() {
+         return vpcId;
+     }
+ 
+     public Boolean getForVpc() {
+         return forVpc;
+     }
+     
+     public String getRole() {
+         return Role.INTERNAL_LB_VM.toString();
+     }
+     
+     public String getZoneType() {
+         return zoneType;
+     }
+ 
+     /////////////////////////////////////////////////////
+     /////////////// API Implementation///////////////////
+     /////////////////////////////////////////////////////
+ 
+     @Override
+     public String getCommandName() {
+         return s_name;
+     }
+ 
+     @Override
 -    public AsyncJob.Type getInstanceType() {
 -        return AsyncJob.Type.DomainRouter;
++    public ApiCommandJobType getInstanceType() {
++        return ApiCommandJobType.DomainRouter;
+     }
+ 
+     @Override
+     public void execute(){
+         ListResponse<DomainRouterResponse> response = _queryService.searchForInternalLbVms(this);
+         response.setResponseName(getCommandName());
 -        this.setResponseObject(response);
++        setResponseObject(response);
+     }
+ }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/d4039743/api/src/org/apache/cloudstack/api/command/admin/internallb/StartInternalLBVMCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/admin/internallb/StartInternalLBVMCmd.java
index 0000000,31d132b..5ca4f4f
mode 000000,100644..100644
--- a/api/src/org/apache/cloudstack/api/command/admin/internallb/StartInternalLBVMCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/admin/internallb/StartInternalLBVMCmd.java
@@@ -1,0 -1,120 +1,123 @@@
+ // 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 org.apache.cloudstack.api.command.admin.internallb;
+ 
++import org.apache.log4j.Logger;
++
+ import org.apache.cloudstack.api.APICommand;
++import org.apache.cloudstack.api.ApiCommandJobType;
+ import org.apache.cloudstack.api.ApiConstants;
+ import org.apache.cloudstack.api.ApiErrorCode;
+ import org.apache.cloudstack.api.BaseAsyncCmd;
+ import org.apache.cloudstack.api.Parameter;
+ import org.apache.cloudstack.api.ServerApiException;
+ import org.apache.cloudstack.api.response.DomainRouterResponse;
 -import org.apache.log4j.Logger;
+ 
 -import com.cloud.async.AsyncJob;
+ import com.cloud.event.EventTypes;
+ import com.cloud.exception.ConcurrentOperationException;
+ import com.cloud.exception.InsufficientCapacityException;
+ import com.cloud.exception.InvalidParameterValueException;
+ import com.cloud.exception.ResourceUnavailableException;
+ import com.cloud.network.router.VirtualRouter;
+ import com.cloud.network.router.VirtualRouter.Role;
+ import com.cloud.user.UserContext;
+ 
+ @APICommand(name = "startInternalLoadBalancerVM", responseObject=DomainRouterResponse.class, description="Starts an existing internal lb vm.")
+ public class StartInternalLBVMCmd extends BaseAsyncCmd {
+     public static final Logger s_logger = Logger.getLogger(StartInternalLBVMCmd.class.getName());
+     private static final String s_name = "startinternallbvmresponse";
+ 
+ 
+     /////////////////////////////////////////////////////
+     //////////////// API parameters /////////////////////
+     /////////////////////////////////////////////////////
+ 
+     @Parameter(name=ApiConstants.ID, type=CommandType.UUID, entityType=DomainRouterResponse.class,
+             required=true, description="the ID of the internal lb vm")
+     private Long id;
+ 
+     /////////////////////////////////////////////////////
+     /////////////////// Accessors ///////////////////////
+     /////////////////////////////////////////////////////
+ 
+     public Long getId() {
+         return id;
+     }
+ 
+     /////////////////////////////////////////////////////
+     /////////////// API Implementation///////////////////
+     /////////////////////////////////////////////////////
+ 
+     @Override
+     public String getCommandName() {
+         return s_name;
+     }
+ 
+     public static String getResultObjectName() {
+         return "router";
+     }
+ 
+     @Override
+     public long getEntityOwnerId() {
+         VirtualRouter router = _entityMgr.findById(VirtualRouter.class, getId());
+         if (router != null && router.getRole() == Role.INTERNAL_LB_VM) {
+             return router.getAccountId();
+         } else {
+             throw new InvalidParameterValueException("Unable to find internal lb vm by id");
 -        } 
++        }
+     }
+ 
+     @Override
+     public String getEventType() {
+         return EventTypes.EVENT_INTERNAL_LB_VM_START;
+     }
+ 
+     @Override
+     public String getEventDescription() {
+         return  "starting internal lb vm: " + getId();
+     }
+ 
 -    public AsyncJob.Type getInstanceType() {
 -        return AsyncJob.Type.InternalLbVm;
++    @Override
++    public ApiCommandJobType getInstanceType() {
++        return ApiCommandJobType.InternalLbVm;
+     }
+ 
++    @Override
+     public Long getInstanceId() {
+         return getId();
+     }
+ 
+     @Override
+     public void execute() throws ConcurrentOperationException, ResourceUnavailableException, InsufficientCapacityException{
+         UserContext.current().setEventDetails("Internal Lb Vm Id: "+getId());
+         VirtualRouter result = null;
+         VirtualRouter router = _routerService.findRouter(getId());
+         if (router == null || router.getRole() != Role.INTERNAL_LB_VM) {
+             throw new InvalidParameterValueException("Can't find internal lb vm by id");
+         } else {
+             result = _internalLbSvc.startInternalLbVm(getId(), UserContext.current().getCaller(), UserContext.current().getCallerUserId());
+         }
+         
+         if (result != null){
+             DomainRouterResponse routerResponse = _responseGenerator.createDomainRouterResponse(result);
+             routerResponse.setResponseName(getCommandName());
 -            this.setResponseObject(routerResponse);
++            setResponseObject(routerResponse);
+         } else {
+             throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to start internal lb vm");
+         }
+     }
+ }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/d4039743/api/src/org/apache/cloudstack/api/command/admin/internallb/StopInternalLBVMCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/admin/internallb/StopInternalLBVMCmd.java
index 0000000,f40db49..be1887e
mode 000000,100644..100644
--- a/api/src/org/apache/cloudstack/api/command/admin/internallb/StopInternalLBVMCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/admin/internallb/StopInternalLBVMCmd.java
@@@ -1,0 -1,123 +1,124 @@@
+ // 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 org.apache.cloudstack.api.command.admin.internallb;
+ 
++import org.apache.log4j.Logger;
++
+ import org.apache.cloudstack.api.APICommand;
++import org.apache.cloudstack.api.ApiCommandJobType;
+ import org.apache.cloudstack.api.ApiConstants;
+ import org.apache.cloudstack.api.ApiErrorCode;
+ import org.apache.cloudstack.api.BaseAsyncCmd;
+ import org.apache.cloudstack.api.Parameter;
+ import org.apache.cloudstack.api.ServerApiException;
+ import org.apache.cloudstack.api.response.DomainRouterResponse;
 -import org.apache.log4j.Logger;
+ 
 -import com.cloud.async.AsyncJob;
+ import com.cloud.event.EventTypes;
+ import com.cloud.exception.ConcurrentOperationException;
+ import com.cloud.exception.InvalidParameterValueException;
+ import com.cloud.exception.ResourceUnavailableException;
+ import com.cloud.network.router.VirtualRouter;
+ import com.cloud.network.router.VirtualRouter.Role;
+ import com.cloud.user.UserContext;
+ 
+ @APICommand(name = "stopInternalLoadBalancerVM", description = "Stops an Internal LB vm.", responseObject = DomainRouterResponse.class)
+ public class StopInternalLBVMCmd extends BaseAsyncCmd {
+     public static final Logger s_logger = Logger.getLogger(StopInternalLBVMCmd.class.getName());
+     private static final String s_name = "stopinternallbvmresponse";
+ 
+     // ///////////////////////////////////////////////////
+     // ////////////// API parameters /////////////////////
+     // ///////////////////////////////////////////////////
+ 
+     @Parameter(name = ApiConstants.ID, type = CommandType.UUID, entityType = DomainRouterResponse.class,
+             required = true, description = "the ID of the internal lb vm")
+     private Long id;
+ 
+     @Parameter(name = ApiConstants.FORCED, type = CommandType.BOOLEAN, required = false, description = "Force stop the VM. The caller knows the VM is stopped.")
+     private Boolean forced;
+ 
+     // ///////////////////////////////////////////////////
+     // ///////////////// Accessors ///////////////////////
+     // ///////////////////////////////////////////////////
+ 
+     public Long getId() {
+         return id;
+     }
+ 
+     // ///////////////////////////////////////////////////
+     // ///////////// API Implementation///////////////////
+     // ///////////////////////////////////////////////////
+ 
+     @Override
+     public String getCommandName() {
+         return s_name;
+     }
+ 
+     @Override
+     public long getEntityOwnerId() {
+         VirtualRouter vm = _entityMgr.findById(VirtualRouter.class, getId());
+         if (vm != null && vm.getRole() == Role.INTERNAL_LB_VM) {
+             return vm.getAccountId();
+         } else {
+             throw new InvalidParameterValueException("Unable to find internal lb vm by id");
+         }
+     }
+ 
+     @Override
+     public String getEventType() {
+         return EventTypes.EVENT_INTERNAL_LB_VM_STOP;
+     }
+ 
+     @Override
+     public String getEventDescription() {
+         return "stopping internal lb vm: " + getId();
+     }
+ 
+     @Override
 -    public AsyncJob.Type getInstanceType() {
 -        return AsyncJob.Type.InternalLbVm;
++    public ApiCommandJobType getInstanceType() {
++        return ApiCommandJobType.InternalLbVm;
+     }
+ 
+     @Override
+     public Long getInstanceId() {
+         return getId();
+     }
+ 
+     public boolean isForced() {
+         return (forced != null) ? forced : false;
+     }
+ 
+     @Override
+     public void execute() throws ConcurrentOperationException, ResourceUnavailableException {
+         UserContext.current().setEventDetails("Internal lb vm Id: "+getId());
+         VirtualRouter result = null;
+         VirtualRouter vm = _routerService.findRouter(getId());
+         if (vm == null || vm.getRole() != Role.INTERNAL_LB_VM) {
+             throw new InvalidParameterValueException("Can't find internal lb vm by id");
+         } else {
+             result = _internalLbSvc.stopInternalLbVm(getId(), isForced(), UserContext.current().getCaller(), UserContext.current().getCallerUserId());
 -        } 
++        }
+         
+         if (result != null) {
+             DomainRouterResponse response = _responseGenerator.createDomainRouterResponse(result);
+             response.setResponseName(getCommandName());
 -            this.setResponseObject(response);
++            setResponseObject(response);
+         } else {
+             throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to stop internal lb vm");
+         }
+     }
+ }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/d4039743/api/src/org/apache/cloudstack/api/command/admin/network/ReleaseDedicatedGuestVlanRangeCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/admin/network/ReleaseDedicatedGuestVlanRangeCmd.java
index 0000000,76cb42d..c06bd51
mode 000000,100644..100644
--- a/api/src/org/apache/cloudstack/api/command/admin/network/ReleaseDedicatedGuestVlanRangeCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/admin/network/ReleaseDedicatedGuestVlanRangeCmd.java
@@@ -1,0 -1,94 +1,99 @@@
+ // 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 org.apache.cloudstack.api.command.admin.network;
+ 
 -import com.cloud.async.AsyncJob;
++import org.apache.log4j.Logger;
++
++import org.apache.cloudstack.api.APICommand;
++import org.apache.cloudstack.api.ApiCommandJobType;
++import org.apache.cloudstack.api.ApiConstants;
++import org.apache.cloudstack.api.ApiErrorCode;
++import org.apache.cloudstack.api.BaseAsyncCmd;
++import org.apache.cloudstack.api.Parameter;
++import org.apache.cloudstack.api.ServerApiException;
++import org.apache.cloudstack.api.response.GuestVlanRangeResponse;
++import org.apache.cloudstack.api.response.SuccessResponse;
++
+ import com.cloud.event.EventTypes;
 -import com.cloud.exception.ResourceInUseException;
+ import com.cloud.user.Account;
+ import com.cloud.user.UserContext;
 -import org.apache.cloudstack.api.*;
 -import org.apache.cloudstack.api.response.CounterResponse;
 -import org.apache.cloudstack.api.response.GuestVlanRangeResponse;
 -import org.apache.cloudstack.api.response.SuccessResponse;
 -import org.apache.log4j.Logger;
+ 
+ @APICommand(name = "releaseDedicatedGuestVlanRange", description = "Releases a dedicated guest vlan range to the system", responseObject = SuccessResponse.class)
+ public class ReleaseDedicatedGuestVlanRangeCmd extends BaseAsyncCmd {
+     public static final Logger s_logger = Logger.getLogger(ReleaseDedicatedGuestVlanRangeCmd.class.getName());
+     private static final String s_name = "releasededicatedguestvlanrangeresponse";
+ 
+     // ///////////////////////////////////////////////////
+     // ////////////// API parameters /////////////////////
+     // ///////////////////////////////////////////////////
+ 
+     @Parameter(name=ApiConstants.ID, type=CommandType.UUID, entityType=GuestVlanRangeResponse.class,
+             required=true, description="the ID of the dedicated guest vlan range")
+     private Long id;
+ 
+     // ///////////////////////////////////////////////////
+     // ///////////////// Accessors ///////////////////////
+     // ///////////////////////////////////////////////////
+ 
+     @Override
+     public String getCommandName() {
+         return s_name;
+     }
+ 
+     public Long getId() {
+         return id;
+     }
+ 
+     @Override
 -    public AsyncJob.Type getInstanceType() {
 -        return AsyncJob.Type.DedicatedGuestVlanRange;
++    public ApiCommandJobType getInstanceType() {
++        return ApiCommandJobType.DedicatedGuestVlanRange;
+     }
+ 
+     @Override
+     public long getEntityOwnerId() {
+         return Account.ACCOUNT_ID_SYSTEM;
+     }
+ 
+     @Override
+     public String getEventType() {
+         return EventTypes.EVENT_DEDICATED_GUEST_VLAN_RANGE_RELEASE;
+     }
+ 
+     @Override
+     public String getEventDescription() {
+         return "Releasing a dedicated guest vlan range.";
+     }
+ 
+     // ///////////////////////////////////////////////////
+     // ///////////// API Implementation///////////////////
+     // ///////////////////////////////////////////////////
+ 
+ 
+     @Override
+     public void execute(){
+         UserContext.current().setEventDetails("Dedicated guest vlan range Id: " + id);
+         boolean result = _networkService.releaseDedicatedGuestVlanRange(getId());
+         if (result) {
+             SuccessResponse response = new SuccessResponse(getCommandName());
 -            this.setResponseObject(response);
++            setResponseObject(response);
+         } else {
+             throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to release dedicated guest vlan range");
+         }
+     }
+ 
+ }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/d4039743/api/src/org/apache/cloudstack/api/command/admin/network/UpdatePhysicalNetworkCmd.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/d4039743/api/src/org/apache/cloudstack/api/command/admin/router/ListRoutersCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/admin/router/ListRoutersCmd.java
index 94480e0,78c3554..c21102c
--- a/api/src/org/apache/cloudstack/api/command/admin/router/ListRoutersCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/admin/router/ListRoutersCmd.java
@@@ -115,7 -122,11 +123,11 @@@ public class ListRoutersCmd extends Bas
      public Boolean getForVpc() {
          return forVpc;
      }
 -    
 +
+     public String getRole() {
+         return Role.VIRTUAL_ROUTER.toString();
+     }
+ 
      /////////////////////////////////////////////////////
      /////////////// API Implementation///////////////////
      /////////////////////////////////////////////////////

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/d4039743/api/src/org/apache/cloudstack/api/command/admin/router/StartRouterCmd.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/d4039743/api/src/org/apache/cloudstack/api/command/admin/router/StopRouterCmd.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/d4039743/api/src/org/apache/cloudstack/api/command/admin/storage/FindStoragePoolsForMigrationCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/admin/storage/FindStoragePoolsForMigrationCmd.java
index 0000000,37d007c..e8c7447
mode 000000,100644..100644
--- a/api/src/org/apache/cloudstack/api/command/admin/storage/FindStoragePoolsForMigrationCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/admin/storage/FindStoragePoolsForMigrationCmd.java
@@@ -1,0 -1,98 +1,100 @@@
+ // 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 org.apache.cloudstack.api.command.admin.storage;
+ 
+ import java.util.ArrayList;
+ import java.util.List;
+ 
 -import org.apache.cloudstack.api.APICommand;
+ import org.apache.log4j.Logger;
+ 
++import org.apache.cloudstack.api.APICommand;
++import org.apache.cloudstack.api.ApiCommandJobType;
+ import org.apache.cloudstack.api.ApiConstants;
+ import org.apache.cloudstack.api.BaseListCmd;
+ import org.apache.cloudstack.api.Parameter;
+ import org.apache.cloudstack.api.response.ListResponse;
+ import org.apache.cloudstack.api.response.StoragePoolForMigrationResponse;
+ import org.apache.cloudstack.api.response.VolumeResponse;
 -import com.cloud.async.AsyncJob;
++
+ import com.cloud.storage.StoragePool;
+ import com.cloud.utils.Pair;
+ 
+ @APICommand(name = "findStoragePoolsForMigration", description="Lists storage pools available for migration of a volume.",
+     responseObject=StoragePoolForMigrationResponse.class)
+ public class FindStoragePoolsForMigrationCmd extends BaseListCmd {
+     public static final Logger s_logger = Logger.getLogger(FindStoragePoolsForMigrationCmd.class.getName());
+ 
+     private static final String s_name = "findstoragepoolsformigrationresponse";
+ 
+     /////////////////////////////////////////////////////
+     //////////////// API parameters /////////////////////
+     /////////////////////////////////////////////////////
+ 
+     @Parameter(name=ApiConstants.ID, type=CommandType.UUID, entityType = VolumeResponse.class, required=true,
+             description="the ID of the volume")
+     private Long id;
+ 
+     /////////////////////////////////////////////////////
+     /////////////////// Accessors ///////////////////////
+     /////////////////////////////////////////////////////
+ 
+     public Long getId() {
+         return id;
+     }
+ 
+     /////////////////////////////////////////////////////
+     /////////////// API Implementation///////////////////
+     /////////////////////////////////////////////////////
+ 
+     @Override
+     public String getCommandName() {
+         return s_name;
+     }
+ 
 -    public AsyncJob.Type getInstanceType() {
 -        return AsyncJob.Type.StoragePool;
++    @Override
++    public ApiCommandJobType getInstanceType() {
++        return ApiCommandJobType.StoragePool;
+     }
+ 
+     @Override
+     public void execute() {
+         Pair<List<? extends StoragePool>, List<? extends StoragePool>> pools =
+                 _mgr.listStoragePoolsForMigrationOfVolume(getId());
+         ListResponse<StoragePoolForMigrationResponse> response = new ListResponse<StoragePoolForMigrationResponse>();
+         List<StoragePoolForMigrationResponse> poolResponses = new ArrayList<StoragePoolForMigrationResponse>();
+ 
+         List<? extends StoragePool> allPools = pools.first();
+         List<? extends StoragePool> suitablePoolList = pools.second();
+         for (StoragePool pool : allPools) {
+             StoragePoolForMigrationResponse poolResponse = _responseGenerator.createStoragePoolForMigrationResponse(pool);
+             Boolean suitableForMigration = false;
+             for (StoragePool suitablePool : suitablePoolList) {
+                 if (suitablePool.getId() == pool.getId()) {
+                     suitableForMigration = true;
+                     break;
+                 }
+             }
+             poolResponse.setSuitableForMigration(suitableForMigration);
+             poolResponse.setObjectName("storagepool");
+             poolResponses.add(poolResponse);
+         }
+ 
+         response.setResponses(poolResponses);
+         response.setResponseName(getCommandName());
 -        this.setResponseObject(response);
++        setResponseObject(response);
+     }
+ }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/d4039743/api/src/org/apache/cloudstack/api/command/admin/storage/ListStoragePoolsCmd.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/d4039743/api/src/org/apache/cloudstack/api/command/admin/systemvm/ListSystemVMsCmd.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/d4039743/api/src/org/apache/cloudstack/api/command/admin/vpc/CreatePrivateGatewayCmd.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/d4039743/api/src/org/apache/cloudstack/api/command/user/address/AssociateIPAddrCmd.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/d4039743/api/src/org/apache/cloudstack/api/command/user/affinitygroup/CreateAffinityGroupCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/affinitygroup/CreateAffinityGroupCmd.java
index 0000000,96de4aa..a160892
mode 000000,100644..100644
--- a/api/src/org/apache/cloudstack/api/command/user/affinitygroup/CreateAffinityGroupCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/affinitygroup/CreateAffinityGroupCmd.java
@@@ -1,0 -1,167 +1,168 @@@
+ // 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 org.apache.cloudstack.api.command.user.affinitygroup;
+ 
++import org.apache.log4j.Logger;
++
+ import org.apache.cloudstack.affinity.AffinityGroup;
+ import org.apache.cloudstack.affinity.AffinityGroupResponse;
+ import org.apache.cloudstack.api.APICommand;
++import org.apache.cloudstack.api.ApiCommandJobType;
+ import org.apache.cloudstack.api.ApiConstants;
+ import org.apache.cloudstack.api.ApiErrorCode;
+ import org.apache.cloudstack.api.BaseAsyncCreateCmd;
+ import org.apache.cloudstack.api.Parameter;
+ import org.apache.cloudstack.api.ServerApiException;
+ import org.apache.cloudstack.api.response.DomainResponse;
 -import org.apache.log4j.Logger;
+ 
 -import com.cloud.async.AsyncJob;
+ import com.cloud.event.EventTypes;
+ import com.cloud.exception.ResourceAllocationException;
+ import com.cloud.user.Account;
+ import com.cloud.user.UserContext;
+ 
+ @APICommand(name = "createAffinityGroup", responseObject = AffinityGroupResponse.class, description = "Creates an affinity/anti-affinity group")
+ public class CreateAffinityGroupCmd extends BaseAsyncCreateCmd {
+     public static final Logger s_logger = Logger.getLogger(CreateAffinityGroupCmd.class.getName());
+ 
+     private static final String s_name = "createaffinitygroupresponse";
+ 
+     // ///////////////////////////////////////////////////
+     // ////////////// API parameters /////////////////////
+     // ///////////////////////////////////////////////////
+ 
+     @Parameter(name = ApiConstants.ACCOUNT, type = CommandType.STRING, description = "an account for the affinity group. Must be used with domainId.")
+     private String accountName;
+ 
+     @Parameter(name = ApiConstants.DOMAIN_ID, type = CommandType.UUID, description = "domainId of the account owning the affinity group", entityType = DomainResponse.class)
+     private Long domainId;
+ 
+     @Parameter(name = ApiConstants.DESCRIPTION, type = CommandType.STRING, description = "optional description of the affinity group")
+     private String description;
+ 
+     @Parameter(name = ApiConstants.NAME, type = CommandType.STRING, required = true, description = "name of the affinity group")
+     private String affinityGroupName;
+ 
+     @Parameter(name = ApiConstants.TYPE, type = CommandType.STRING, required = true, description = "Type of the affinity group from the available affinity/anti-affinity group types")
+     private String affinityGroupType;
+ 
+ 
+     // ///////////////////////////////////////////////////
+     // ///////////////// Accessors ///////////////////////
+     // ///////////////////////////////////////////////////
+ 
+     public String getAccountName() {
+         return accountName;
+     }
+ 
+     public String getDescription() {
+         return description;
+     }
+ 
+     public Long getDomainId() {
+         return domainId;
+     }
+ 
+     public String getAffinityGroupName() {
+         return affinityGroupName;
+     }
+ 
+     public String getAffinityGroupType() {
+         return affinityGroupType;
+     }
+ 
+     // ///////////////////////////////////////////////////
+     // ///////////// API Implementation///////////////////
+     // ///////////////////////////////////////////////////
+ 
+     @Override
+     public String getCommandName() {
+         return s_name;
+     }
+ 
+     @Override
+     public long getEntityOwnerId() {
+         Account account = UserContext.current().getCaller();
+         if ((account == null) || isAdmin(account.getType())) {
+             if ((domainId != null) && (accountName != null)) {
+                 Account userAccount = _responseGenerator.findAccountByNameDomain(accountName, domainId);
+                 if (userAccount != null) {
+                     return userAccount.getId();
+                 }
+             }
+         }
+ 
+         if (account != null) {
+             return account.getId();
+         }
+ 
+         return Account.ACCOUNT_ID_SYSTEM; // no account info given, parent this
+                                           // command to SYSTEM so ERROR events
+                                           // are tracked
+     }
+ 
+     @Override
+     public void execute() {
+         AffinityGroup group = _affinityGroupService.getAffinityGroup(getEntityId());
+         if (group != null) {
+             AffinityGroupResponse response = _responseGenerator.createAffinityGroupResponse(group);
+             response.setResponseName(getCommandName());
 -            this.setResponseObject(response);
++            setResponseObject(response);
+         } else {
+             throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to create affinity group:"
+                     + affinityGroupName);
+         }
+     }
+ 
+     @Override
+     public void create() throws ResourceAllocationException {
+         AffinityGroup result = _affinityGroupService.createAffinityGroup(accountName, domainId, affinityGroupName,
+                 affinityGroupType, description);
+         if (result != null) {
+             setEntityId(result.getId());
+             setEntityUuid(result.getUuid());
+         } else {
+             throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to create affinity group entity" + affinityGroupName);
+         }
+ 
+     }
+ 
+     @Override
+     public String getEventType() {
+         return EventTypes.EVENT_AFFINITY_GROUP_CREATE;
+     }
+ 
+     @Override
+     public String getEventDescription() {
+         return "creating Affinity Group";
+     }
+ 
+     @Override
+     public String getCreateEventType() {
+         return EventTypes.EVENT_AFFINITY_GROUP_CREATE;
+     }
+ 
+     @Override
+     public String getCreateEventDescription() {
+         return "creating Affinity Group";
+     }
+ 
+     @Override
 -    public AsyncJob.Type getInstanceType() {
 -        return AsyncJob.Type.AffinityGroup;
++    public ApiCommandJobType getInstanceType() {
++        return ApiCommandJobType.AffinityGroup;
+     }
+ 
+ }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/d4039743/api/src/org/apache/cloudstack/api/command/user/affinitygroup/DeleteAffinityGroupCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/affinitygroup/DeleteAffinityGroupCmd.java
index 0000000,ea4a010..0eb6a4c
mode 000000,100644..100644
--- a/api/src/org/apache/cloudstack/api/command/user/affinitygroup/DeleteAffinityGroupCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/affinitygroup/DeleteAffinityGroupCmd.java
@@@ -1,0 -1,154 +1,155 @@@
+ // 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 org.apache.cloudstack.api.command.user.affinitygroup;
+ 
++import org.apache.log4j.Logger;
++
+ import org.apache.cloudstack.affinity.AffinityGroupResponse;
+ import org.apache.cloudstack.api.APICommand;
++import org.apache.cloudstack.api.ApiCommandJobType;
+ import org.apache.cloudstack.api.ApiConstants;
+ import org.apache.cloudstack.api.ApiErrorCode;
+ import org.apache.cloudstack.api.BaseAsyncCmd;
+ import org.apache.cloudstack.api.Parameter;
+ import org.apache.cloudstack.api.ServerApiException;
+ import org.apache.cloudstack.api.response.DomainResponse;
+ import org.apache.cloudstack.api.response.SuccessResponse;
 -import org.apache.log4j.Logger;
+ 
 -import com.cloud.async.AsyncJob;
+ import com.cloud.event.EventTypes;
+ import com.cloud.exception.InvalidParameterValueException;
+ import com.cloud.exception.ResourceInUseException;
+ import com.cloud.user.Account;
+ import com.cloud.user.UserContext;
+ 
+ @APICommand(name = "deleteAffinityGroup", description = "Deletes affinity group", responseObject = SuccessResponse.class)
+ public class DeleteAffinityGroupCmd extends BaseAsyncCmd {
+     public static final Logger s_logger = Logger.getLogger(DeleteAffinityGroupCmd.class.getName());
+     private static final String s_name = "deleteaffinitygroupresponse";
+ 
+     /////////////////////////////////////////////////////
+     //////////////// API parameters /////////////////////
+     /////////////////////////////////////////////////////
+ 
+     @Parameter(name = ApiConstants.ACCOUNT, type = CommandType.STRING, description = "the account of the affinity group. Must be specified with domain ID")
+     private String accountName;
+ 
+     @Parameter(name = ApiConstants.DOMAIN_ID, type = CommandType.UUID, description = "the domain ID of account owning the affinity group", entityType = DomainResponse.class)
+     private Long domainId;
+ 
+     @Parameter(name = ApiConstants.ID, type = CommandType.UUID, description = "The ID of the affinity group. Mutually exclusive with name parameter", entityType = AffinityGroupResponse.class)
+     private Long id;
+ 
+     @Parameter(name = ApiConstants.NAME, type = CommandType.STRING, description = "The name of the affinity group. Mutually exclusive with id parameter")
+     private String name;
+ 
+ 
+     /////////////////////////////////////////////////////
+     /////////////////// Accessors ///////////////////////
+     /////////////////////////////////////////////////////
+ 
+     public String getAccountName() {
+         return accountName;
+     }
+ 
+     public Long getDomainId() {
+         return domainId;
+     }
+ 
+ 
+     public Long getId() {
+         if (id != null && name != null) {
+             throw new InvalidParameterValueException("name and id parameters are mutually exclusive");
+         }
+ 
+         if (name != null) {
+             id = _responseGenerator.getAffinityGroupId(name, getEntityOwnerId());
+             if (id == null) {
+                 throw new InvalidParameterValueException("Unable to find affinity group by name " + name
+                         + " for the account id=" + getEntityOwnerId());
+             }
+         }
+ 
+         if (id == null) {
+             throw new InvalidParameterValueException(
+                     "Either id or name parameter is requred by deleteAffinityGroup command");
+         }
+ 
+         return id;
+     }
+ 
+     /////////////////////////////////////////////////////
+     /////////////// API Implementation///////////////////
+     /////////////////////////////////////////////////////
+ 
+     @Override
+     public String getCommandName() {
+         return s_name;
+     }
+ 
+     @Override
+     public long getEntityOwnerId() {
+         Account account = UserContext.current().getCaller();
+         if ((account == null) || isAdmin(account.getType())) {
+             if ((domainId != null) && (accountName != null)) {
+                 Account userAccount = _responseGenerator.findAccountByNameDomain(accountName, domainId);
+                 if (userAccount != null) {
+                     return userAccount.getId();
+                 }
+             }
+         }
+ 
+         if (account != null) {
+             return account.getId();
+         }
+ 
+         return Account.ACCOUNT_ID_SYSTEM; // no account info given, parent this
+                                           // command to SYSTEM so ERROR events
+                                           // are tracked
+ 
+     }
+ 
+     @Override
+     public void execute(){
+         try{
+             boolean result = _affinityGroupService.deleteAffinityGroup(id, accountName, domainId, name);
+             if (result) {
+                 SuccessResponse response = new SuccessResponse(getCommandName());
 -                this.setResponseObject(response);
++                setResponseObject(response);
+             } else {
+                 throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to delete affinity group");
+             }
+         } catch (ResourceInUseException ex) {
+             s_logger.warn("Exception: ", ex);
+             throw new ServerApiException(ApiErrorCode.RESOURCE_IN_USE_ERROR, ex.getMessage());
+         }
+     }
+ 
+     @Override
+     public String getEventType() {
+         return EventTypes.EVENT_AFFINITY_GROUP_DELETE;
+     }
+ 
+     @Override
+     public String getEventDescription() {
+         return "Deleting Affinity Group";
+     }
+ 
+     @Override
 -    public AsyncJob.Type getInstanceType() {
 -        return AsyncJob.Type.AffinityGroup;
++    public ApiCommandJobType getInstanceType() {
++        return ApiCommandJobType.AffinityGroup;
+     }
+ }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/d4039743/api/src/org/apache/cloudstack/api/command/user/affinitygroup/ListAffinityGroupsCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/affinitygroup/ListAffinityGroupsCmd.java
index 0000000,9310fb9..f92c53e
mode 000000,100644..100644
--- a/api/src/org/apache/cloudstack/api/command/user/affinitygroup/ListAffinityGroupsCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/affinitygroup/ListAffinityGroupsCmd.java
@@@ -1,0 -1,90 +1,90 @@@
+ // 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 org.apache.cloudstack.api.command.user.affinitygroup;
+ 
++import org.apache.log4j.Logger;
++
+ import org.apache.cloudstack.affinity.AffinityGroupResponse;
+ import org.apache.cloudstack.api.APICommand;
++import org.apache.cloudstack.api.ApiCommandJobType;
+ import org.apache.cloudstack.api.ApiConstants;
+ import org.apache.cloudstack.api.BaseListCmd;
+ import org.apache.cloudstack.api.Parameter;
+ import org.apache.cloudstack.api.response.ListResponse;
+ import org.apache.cloudstack.api.response.UserVmResponse;
 -import org.apache.log4j.Logger;
 -
 -import com.cloud.async.AsyncJob;
+ 
+ @APICommand(name = "listAffinityGroups", description = "Lists affinity groups", responseObject = AffinityGroupResponse.class)
+ public class ListAffinityGroupsCmd extends BaseListCmd {
+     public static final Logger s_logger = Logger.getLogger(ListAffinityGroupsCmd.class.getName());
+ 
+     private static final String s_name = "listaffinitygroupsresponse";
+ 
+     /////////////////////////////////////////////////////
+     //////////////// API parameters /////////////////////
+     /////////////////////////////////////////////////////
+ 
+     @Parameter(name = ApiConstants.NAME, type = CommandType.STRING, description = "lists affinity groups by name")
+     private String affinityGroupName;
+ 
+     @Parameter(name = ApiConstants.VIRTUAL_MACHINE_ID, type = CommandType.UUID, description = "lists affinity groups by virtual machine id", entityType = UserVmResponse.class)
+     private Long virtualMachineId;
+ 
+     @Parameter(name = ApiConstants.ID, type = CommandType.UUID, description = "list the affinity group by the id provided", entityType = AffinityGroupResponse.class)
+     private Long id;
+ 
+     @Parameter(name = ApiConstants.TYPE, type = CommandType.STRING, description = "lists affinity groups by type")
+     private String affinityGroupType;
+ 
+     /////////////////////////////////////////////////////
+     /////////////////// Accessors ///////////////////////
+     /////////////////////////////////////////////////////
+     public String getAffinityGroupName() {
+         return affinityGroupName;
+     }
+ 
+     public Long getVirtualMachineId() {
+         return virtualMachineId;
+     }
+ 
+     public Long getId(){
+         return id;
+     }
+ 
+     /////////////////////////////////////////////////////
+     /////////////// API Implementation///////////////////
+     /////////////////////////////////////////////////////
+ 
+     @Override
+     public String getCommandName() {
+         return s_name;
+     }
+ 
+     @Override
+     public void execute(){
+ 
+         ListResponse<AffinityGroupResponse> response = _queryService.listAffinityGroups(id, affinityGroupName,
 -                affinityGroupType, virtualMachineId, this.getStartIndex(), this.getPageSizeVal());
++                affinityGroupType, virtualMachineId, getStartIndex(), getPageSizeVal());
+         response.setResponseName(getCommandName());
 -        this.setResponseObject(response);
++        setResponseObject(response);
+ 
+     }
+ 
+     @Override
 -    public AsyncJob.Type getInstanceType() {
 -        return AsyncJob.Type.AffinityGroup;
++    public ApiCommandJobType getInstanceType() {
++        return ApiCommandJobType.AffinityGroup;
+     }
+ }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/d4039743/api/src/org/apache/cloudstack/api/command/user/affinitygroup/UpdateVMAffinityGroupCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/affinitygroup/UpdateVMAffinityGroupCmd.java
index 0000000,44d017b..ae8b682
mode 000000,100644..100644
--- a/api/src/org/apache/cloudstack/api/command/user/affinitygroup/UpdateVMAffinityGroupCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/affinitygroup/UpdateVMAffinityGroupCmd.java
@@@ -1,0 -1,164 +1,165 @@@
+ // 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 org.apache.cloudstack.api.command.user.affinitygroup;
+ 
+ import java.util.ArrayList;
+ import java.util.EnumSet;
+ import java.util.List;
+ 
++import org.apache.log4j.Logger;
++
+ import org.apache.cloudstack.affinity.AffinityGroupResponse;
+ import org.apache.cloudstack.api.ACL;
+ import org.apache.cloudstack.api.APICommand;
++import org.apache.cloudstack.api.ApiCommandJobType;
+ import org.apache.cloudstack.api.ApiConstants;
++import org.apache.cloudstack.api.ApiConstants.VMDetails;
+ import org.apache.cloudstack.api.ApiErrorCode;
+ import org.apache.cloudstack.api.BaseAsyncCmd;
+ import org.apache.cloudstack.api.Parameter;
+ import org.apache.cloudstack.api.ServerApiException;
 -import org.apache.cloudstack.api.ApiConstants.VMDetails;
+ import org.apache.cloudstack.api.response.UserVmResponse;
 -import org.apache.log4j.Logger;
+ 
 -import com.cloud.async.AsyncJob;
+ import com.cloud.event.EventTypes;
+ import com.cloud.exception.InsufficientCapacityException;
+ import com.cloud.exception.InvalidParameterValueException;
+ import com.cloud.exception.ResourceUnavailableException;
+ import com.cloud.user.Account;
+ import com.cloud.user.UserContext;
+ import com.cloud.uservm.UserVm;
+ 
+ 
+ @APICommand(name = "updateVMAffinityGroup", description = "Updates the affinity/anti-affinity group associations of a virtual machine. The VM has to be stopped and restarted for the "
+         + "new properties to take effect.", responseObject = UserVmResponse.class)
+ public class UpdateVMAffinityGroupCmd extends BaseAsyncCmd {
+     public static final Logger s_logger = Logger.getLogger(UpdateVMAffinityGroupCmd.class.getName());
+     private static final String s_name = "updatevirtualmachineresponse";
+ 
+     /////////////////////////////////////////////////////
+     //////////////// API parameters /////////////////////
+     /////////////////////////////////////////////////////
+ 
+ 
+     @ACL
+     @Parameter(name=ApiConstants.ID, type=CommandType.UUID, entityType=UserVmResponse.class,
+             required=true, description="The ID of the virtual machine")
+     private Long id;
+ 
+     @ACL
+     @Parameter(name = ApiConstants.AFFINITY_GROUP_IDS, type = CommandType.LIST, collectionType = CommandType.UUID, entityType = AffinityGroupResponse.class, description = "comma separated list of affinity groups id that are going to be applied to the virtual machine. "
+             + "Should be passed only when vm is created from a zone with Basic Network support."
+             + " Mutually exclusive with securitygroupnames parameter")
+     private List<Long> affinityGroupIdList;
+ 
+     @ACL
+     @Parameter(name = ApiConstants.AFFINITY_GROUP_NAMES, type = CommandType.LIST, collectionType = CommandType.STRING, entityType = AffinityGroupResponse.class, description = "comma separated list of affinity groups names that are going to be applied to the virtual machine."
+             + " Should be passed only when vm is created from a zone with Basic Network support. "
+             + "Mutually exclusive with securitygroupids parameter")
+     private List<String> affinityGroupNameList;
+ 
+     /////////////////////////////////////////////////////
+     /////////////////// Accessors ///////////////////////
+     /////////////////////////////////////////////////////
+ 
+ 
+     public Long getId() {
+         return id;
+     }
+ 
+ 
+     public List<Long> getAffinityGroupIdList() {
+         if (affinityGroupNameList != null && affinityGroupIdList != null) {
+             throw new InvalidParameterValueException(
+                     "affinitygroupids parameter is mutually exclusive with affinitygroupnames parameter");
+         }
+ 
+         // transform group names to ids here
+         if (affinityGroupNameList != null) {
+             List<Long> affinityGroupIds = new ArrayList<Long>();
+             for (String groupName : affinityGroupNameList) {
+                 Long groupId = _responseGenerator.getAffinityGroupId(groupName, getEntityOwnerId());
+                 if (groupId == null) {
+                     throw new InvalidParameterValueException("Unable to find group by name " + groupName
+                             + " for account " + getEntityOwnerId());
+                 } else {
+                     affinityGroupIds.add(groupId);
+                 }
+             }
+             return affinityGroupIds;
+         } else {
+             return affinityGroupIdList;
+         }
+     }
+ 
+     /////////////////////////////////////////////////////
+     /////////////// API Implementation///////////////////
+     /////////////////////////////////////////////////////
+ 
+ 
+     @Override
+     public String getCommandName() {
+         return s_name;
+     }
+ 
+     public static String getResultObjectName() {
+         return "virtualmachine";
+     }
+ 
+     @Override
+     public long getEntityOwnerId() {
+         UserVm userVm = _entityMgr.findById(UserVm.class, getId());
+         if (userVm != null) {
+             return userVm.getAccountId();
+         }
+ 
+         return Account.ACCOUNT_ID_SYSTEM; // no account info given, parent this command to SYSTEM so ERROR events are tracked
+     }
+ 
+     @Override
+     public void execute() throws ResourceUnavailableException,
+             InsufficientCapacityException, ServerApiException {
+         UserContext.current().setEventDetails("Vm Id: "+getId());
+         UserVm result = _affinityGroupService.updateVMAffinityGroups(getId(), getAffinityGroupIdList());
+         ArrayList<VMDetails> dc = new ArrayList<VMDetails>();
+         dc.add(VMDetails.valueOf("affgrp"));
+         EnumSet<VMDetails> details = EnumSet.copyOf(dc);
+ 
+         if (result != null){
+             UserVmResponse response = _responseGenerator.createUserVmResponse("virtualmachine", details, result).get(0);
+             response.setResponseName(getCommandName());
 -            this.setResponseObject(response);
++            setResponseObject(response);
+         } else {
+             throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to update vm's affinity groups");
+         }
+     }
+ 
+     @Override
+     public String getEventType() {
+         return EventTypes.EVENT_VM_AFFINITY_GROUP_UPDATE;
+     }
+ 
+     @Override
+     public String getEventDescription() {
+         return "updating VM Affinity Group";
+     }
+ 
+     @Override
 -    public AsyncJob.Type getInstanceType() {
 -        return AsyncJob.Type.AffinityGroup;
++    public ApiCommandJobType getInstanceType() {
++        return ApiCommandJobType.AffinityGroup;
+     }
+ 
+ }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/d4039743/api/src/org/apache/cloudstack/api/command/user/iso/ListIsosCmd.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/d4039743/api/src/org/apache/cloudstack/api/command/user/loadbalancer/CreateApplicationLoadBalancerCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/loadbalancer/CreateApplicationLoadBalancerCmd.java
index 0000000,17ae959..2dee1ff
mode 000000,100644..100644
--- a/api/src/org/apache/cloudstack/api/command/user/loadbalancer/CreateApplicationLoadBalancerCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/loadbalancer/CreateApplicationLoadBalancerCmd.java
@@@ -1,0 -1,218 +1,219 @@@
+ // 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 org.apache.cloudstack.api.command.user.loadbalancer;
+ 
++import org.apache.log4j.Logger;
++
+ import org.apache.cloudstack.api.APICommand;
++import org.apache.cloudstack.api.ApiCommandJobType;
+ import org.apache.cloudstack.api.ApiConstants;
+ import org.apache.cloudstack.api.ApiErrorCode;
+ import org.apache.cloudstack.api.BaseAsyncCreateCmd;
+ import org.apache.cloudstack.api.Parameter;
+ import org.apache.cloudstack.api.ServerApiException;
+ import org.apache.cloudstack.api.response.ApplicationLoadBalancerResponse;
+ import org.apache.cloudstack.api.response.NetworkResponse;
+ import org.apache.cloudstack.network.lb.ApplicationLoadBalancerRule;
 -import org.apache.log4j.Logger;
+ 
 -import com.cloud.async.AsyncJob;
+ import com.cloud.event.EventTypes;
+ import com.cloud.exception.InsufficientAddressCapacityException;
+ import com.cloud.exception.InsufficientVirtualNetworkCapcityException;
+ import com.cloud.exception.InvalidParameterValueException;
+ import com.cloud.exception.NetworkRuleConflictException;
+ import com.cloud.exception.ResourceAllocationException;
+ import com.cloud.exception.ResourceUnavailableException;
+ import com.cloud.network.Network;
+ import com.cloud.network.rules.LoadBalancerContainer.Scheme;
+ import com.cloud.user.UserContext;
+ import com.cloud.utils.net.NetUtils;
+ 
+ @APICommand(name = "createLoadBalancer", description="Creates a Load Balancer", responseObject=ApplicationLoadBalancerResponse.class, since="4.2.0")
+ public class CreateApplicationLoadBalancerCmd extends BaseAsyncCreateCmd {
+     public static final Logger s_logger = Logger.getLogger(CreateApplicationLoadBalancerCmd.class.getName());
+ 
+     private static final String s_name = "createloadbalancerresponse";
+ 
+     /////////////////////////////////////////////////////
+     //////////////// API parameters /////////////////////
+     /////////////////////////////////////////////////////
+     @Parameter(name=ApiConstants.NAME, type=CommandType.STRING, required=true, description="name of the Load Balancer")
+     private String loadBalancerName;
+     
+     @Parameter(name=ApiConstants.DESCRIPTION, type=CommandType.STRING, description="the description of the Load Balancer", length=4096)
+     private String description;
+     
+     @Parameter(name=ApiConstants.NETWORK_ID, type=CommandType.UUID, required=true, entityType = NetworkResponse.class,
+             description="The guest network the Load Balancer will be created for")
+     private Long networkId;
+     
+     @Parameter(name=ApiConstants.SOURCE_PORT, type=CommandType.INTEGER, required=true, description="the source port the network traffic will be load balanced from")
+     private Integer sourcePort;
+ 
+     @Parameter(name=ApiConstants.ALGORITHM, type=CommandType.STRING, required=true, description="load balancer algorithm (source, roundrobin, leastconn)")
+     private String algorithm;
+ 
+     @Parameter(name=ApiConstants.INSTANCE_PORT, type=CommandType.INTEGER, required=true, description="the TCP port of the virtual machine where the network traffic will be load balanced to")
+     private Integer instancePort;
+ 
+     @Parameter(name=ApiConstants.SOURCE_IP, type=CommandType.STRING, description="the source ip address the network traffic will be load balanced from")
+     private String sourceIp;
+     
+     @Parameter(name=ApiConstants.SOURCE_IP_NETWORK_ID, type=CommandType.UUID, entityType = NetworkResponse.class, required=true,
+             description="the network id of the source ip address")
+     private Long sourceIpNetworkId;
+     
+     @Parameter(name=ApiConstants.SCHEME, type=CommandType.STRING, required=true, description="the load balancer scheme. Supported value in this release is Internal")
+     private String scheme;
+ 
+ 
+ 
+     /////////////////////////////////////////////////////
+     /////////////////// Accessors ///////////////////////
+     /////////////////////////////////////////////////////
+ 
+     public String getAlgorithm() {
+         return algorithm;
+     }
+ 
+     public String getDescription() {
+         return description;
+     }
+ 
+     public String getLoadBalancerName() {
+         return loadBalancerName;
+     }
+ 
+     public Integer getPrivatePort() {
+         return instancePort;
+     }
+ 
+     public long getNetworkId() {
+         return networkId;
+     }
+ 
+     public String getName() {
+         return loadBalancerName;
+     }
+     
+     public Integer getSourcePort() {
+         return sourcePort.intValue();
+     }
+ 
+     public String getProtocol() {
+         return NetUtils.TCP_PROTO;
+     }
+ 
+     public long getAccountId() {
+         //get account info from the network object
+         Network ntwk = _networkService.getNetwork(networkId);
+         if (ntwk == null) {
+             throw new InvalidParameterValueException("Invalid network id specified");
+         }
+        
+         return ntwk.getAccountId();
+         
+     }
+ 
+     public int getInstancePort() {
+         return instancePort.intValue();
+     }
+ 
+     @Override
+     public String getEventType() {
+         return EventTypes.EVENT_LOAD_BALANCER_CREATE;
+     }
+ 
+     @Override
+     public String getEventDescription() {
+         return "creating load balancer: " + getName() + " account: " + getAccountId();
+ 
+     }
+ 
+     @Override
 -    public AsyncJob.Type getInstanceType() {
 -        return AsyncJob.Type.LoadBalancerRule;
++    public ApiCommandJobType getInstanceType() {
++        return ApiCommandJobType.LoadBalancerRule;
+     }
+     
+     public String getSourceIp() {
+         return sourceIp;
+     }
+ 
+     public long getSourceIpNetworkId() {
+         return sourceIpNetworkId;
+     }
+ 
+     public Scheme getScheme() {
+         if (scheme.equalsIgnoreCase(Scheme.Internal.toString())) {
+             return Scheme.Internal;
+         } else {
+             throw new InvalidParameterValueException("Invalid value for scheme. Supported value is Internal");
+         }
+     }
+     
+     @Override
+     public long getEntityOwnerId() {
+        return getAccountId();
+     }
+ 
+     /////////////////////////////////////////////////////
+     /////////////// API Implementation///////////////////
+     /////////////////////////////////////////////////////
+     @Override
+     public String getCommandName() {
+         return s_name;
+     }
+ 
+     @Override
+     public void execute() throws ResourceAllocationException, ResourceUnavailableException {
+         ApplicationLoadBalancerRule rule = null;
+         try {
+             UserContext.current().setEventDetails("Load Balancer Id: " + getEntityId());
+             // State might be different after the rule is applied, so get new object here
+             rule = _entityMgr.findById(ApplicationLoadBalancerRule.class, getEntityId());
+             ApplicationLoadBalancerResponse lbResponse = _responseGenerator.createLoadBalancerContainerReponse(rule, _lbService.getLbInstances(getEntityId()));
+             setResponseObject(lbResponse);
+             lbResponse.setResponseName(getCommandName());
+         } catch (Exception ex) {
+             s_logger.warn("Failed to create Load Balancer due to exception ", ex);
+         } finally {
+             if (rule == null) {
+                 throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to create Load Balancer");
+             }
+         }
+     }
+ 
+     @Override
+     public void create() {
+         try {
+             
+             ApplicationLoadBalancerRule result = _appLbService.createApplicationLoadBalancer(getName(), getDescription(), getScheme(),
+                     getSourceIpNetworkId(), getSourceIp(), getSourcePort(), getInstancePort(), getAlgorithm(), getNetworkId(), getEntityOwnerId());
 -            this.setEntityId(result.getId());
 -            this.setEntityUuid(result.getUuid());
++            setEntityId(result.getId());
++            setEntityUuid(result.getUuid());
+         }catch (NetworkRuleConflictException e) {
+             s_logger.warn("Exception: ", e);
+             throw new ServerApiException(ApiErrorCode.NETWORK_RULE_CONFLICT_ERROR, e.getMessage());
+         } catch (InsufficientAddressCapacityException e) {
+             s_logger.warn("Exception: ", e);
+             throw new ServerApiException(ApiErrorCode.INSUFFICIENT_CAPACITY_ERROR, e.getMessage());
+         } catch (InsufficientVirtualNetworkCapcityException e) {
+             s_logger.warn("Exception: ", e);
+             throw new ServerApiException(ApiErrorCode.INSUFFICIENT_CAPACITY_ERROR, e.getMessage());
+         }
+     }
+ }
+ 

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/d4039743/api/src/org/apache/cloudstack/api/command/user/loadbalancer/CreateLoadBalancerRuleCmd.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/d4039743/api/src/org/apache/cloudstack/api/command/user/loadbalancer/DeleteApplicationLoadBalancerCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/loadbalancer/DeleteApplicationLoadBalancerCmd.java
index 0000000,bc6cd09..08159fb
mode 000000,100644..100644
--- a/api/src/org/apache/cloudstack/api/command/user/loadbalancer/DeleteApplicationLoadBalancerCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/loadbalancer/DeleteApplicationLoadBalancerCmd.java
@@@ -1,0 -1,116 +1,117 @@@
+ // 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 org.apache.cloudstack.api.command.user.loadbalancer;
+ 
++import org.apache.log4j.Logger;
++
+ import org.apache.cloudstack.api.APICommand;
++import org.apache.cloudstack.api.ApiCommandJobType;
+ import org.apache.cloudstack.api.ApiConstants;
+ import org.apache.cloudstack.api.ApiErrorCode;
+ import org.apache.cloudstack.api.BaseAsyncCmd;
+ import org.apache.cloudstack.api.Parameter;
+ import org.apache.cloudstack.api.ServerApiException;
+ import org.apache.cloudstack.api.response.FirewallRuleResponse;
+ import org.apache.cloudstack.api.response.SuccessResponse;
+ import org.apache.cloudstack.network.lb.ApplicationLoadBalancerRule;
 -import org.apache.log4j.Logger;
+ 
 -import com.cloud.async.AsyncJob;
+ import com.cloud.event.EventTypes;
+ import com.cloud.exception.InvalidParameterValueException;
+ import com.cloud.user.UserContext;
+ 
+ @APICommand(name = "deleteLoadBalancer", description="Deletes a load balancer", responseObject=SuccessResponse.class, since="4.2.0")
+ public class DeleteApplicationLoadBalancerCmd extends BaseAsyncCmd {
+     public static final Logger s_logger = Logger.getLogger(DeleteApplicationLoadBalancerCmd.class.getName());
+     private static final String s_name = "deleteloadbalancerresponse";
+     /////////////////////////////////////////////////////
+     //////////////// API parameters /////////////////////
+     /////////////////////////////////////////////////////
+ 
+     @Parameter(name=ApiConstants.ID, type=CommandType.UUID, entityType = FirewallRuleResponse.class,
+             required=true, description="the ID of the Load Balancer")
+     private Long id;
+ 
+ 
+     /////////////////////////////////////////////////////
+     /////////////////// Accessors ///////////////////////
+     /////////////////////////////////////////////////////
+ 
+     public Long getId() {
+         return id;
+     }
+ 
+     /////////////////////////////////////////////////////
+     /////////////// API Implementation///////////////////
+     /////////////////////////////////////////////////////
+ 
+     @Override
+     public String getCommandName() {
+         return s_name;
+     }
+ 
+     @Override
+     public long getEntityOwnerId() {
+         ApplicationLoadBalancerRule lb = _entityMgr.findById(ApplicationLoadBalancerRule.class, getId());
+         if (lb != null) {
+             return lb.getAccountId();
+         } else {
+             throw new InvalidParameterValueException("Can't find load balancer by id specified");
+         }
+     }
+ 
+     @Override
+     public String getEventType() {
+         return EventTypes.EVENT_LOAD_BALANCER_DELETE;
+     }
+ 
+     @Override
+     public String getEventDescription() {
+         return  "deleting load balancer: " + getId();
+     }
+ 
+     @Override
+     public void execute(){
+         UserContext.current().setEventDetails("Load balancer Id: " + getId());
+         boolean result = _appLbService.deleteApplicationLoadBalancer(getId());
+ 
+         if (result) {
+             SuccessResponse response = new SuccessResponse(getCommandName());
 -            this.setResponseObject(response);
++            setResponseObject(response);
+         } else {
+             throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to delete load balancer");
+         }
+     }
+ 
+     @Override
+     public String getSyncObjType() {
+         return BaseAsyncCmd.networkSyncObject;
+     }
+ 
+     @Override
+     public Long getSyncObjId() {
+         ApplicationLoadBalancerRule lb = _appLbService.getApplicationLoadBalancer(id);
+         if(lb == null){
+             throw new InvalidParameterValueException("Unable to find load balancer by id ");
+         }
+         return lb.getNetworkId();
+     }
+ 
+     @Override
 -    public AsyncJob.Type getInstanceType() {
 -        return AsyncJob.Type.FirewallRule;
++    public ApiCommandJobType getInstanceType() {
++        return ApiCommandJobType.FirewallRule;
+     }
+ }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/d4039743/api/src/org/apache/cloudstack/api/command/user/region/ha/gslb/CreateGlobalLoadBalancerRuleCmd.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/d4039743/api/src/org/apache/cloudstack/api/command/user/snapshot/CreateSnapshotCmd.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/d4039743/api/src/org/apache/cloudstack/api/command/user/snapshot/ListSnapshotsCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/snapshot/ListSnapshotsCmd.java
index 04e627c,d7e6bc8..fa71c05
--- a/api/src/org/apache/cloudstack/api/command/user/snapshot/ListSnapshotsCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/snapshot/ListSnapshotsCmd.java
@@@ -59,7 -58,10 +59,10 @@@ public class ListSnapshotsCmd extends B
      @Parameter(name=ApiConstants.VOLUME_ID, type=CommandType.UUID, entityType = VolumeResponse.class,
              description="the ID of the disk volume")
      private Long volumeId;
 -    
 +
+     @Parameter(name=ApiConstants.ZONE_TYPE, type=CommandType.STRING, description="the network type of the zone that the virtual machine belongs to")
+     private String zoneType;
+ 
      /////////////////////////////////////////////////////
      /////////////////// Accessors ///////////////////////
      /////////////////////////////////////////////////////

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/d4039743/api/src/org/apache/cloudstack/api/command/user/template/ListTemplatesCmd.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/d4039743/api/src/org/apache/cloudstack/api/command/user/vm/AddIpToVmNicCmd.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/d4039743/api/src/org/apache/cloudstack/api/command/user/vm/DeployVMCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/vm/DeployVMCmd.java
index 28a623a,3ed08d2..ffed07e
--- a/api/src/org/apache/cloudstack/api/command/user/vm/DeployVMCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/vm/DeployVMCmd.java
@@@ -25,9 -25,9 +25,10 @@@ import java.util.List
  import java.util.Map;
  
  import org.apache.cloudstack.acl.SecurityChecker.AccessType;
+ import org.apache.cloudstack.affinity.AffinityGroupResponse;
  import org.apache.cloudstack.api.ACL;
  import org.apache.cloudstack.api.APICommand;
 +import org.apache.cloudstack.api.ApiCommandJobType;
  import org.apache.cloudstack.api.ApiConstants;
  import org.apache.cloudstack.api.ApiErrorCode;
  import org.apache.cloudstack.api.BaseAsyncCreateCmd;

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/d4039743/api/src/org/apache/cloudstack/api/command/user/vm/ListVMsCmd.java
----------------------------------------------------------------------
diff --cc api/src/org/apache/cloudstack/api/command/user/vm/ListVMsCmd.java
index c73e570,b2a2ce0..0748209
--- a/api/src/org/apache/cloudstack/api/command/user/vm/ListVMsCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/vm/ListVMsCmd.java
@@@ -20,8 -20,8 +20,9 @@@ import java.util.ArrayList
  import java.util.EnumSet;
  import java.util.List;
  
+ import org.apache.cloudstack.affinity.AffinityGroupResponse;
  import org.apache.cloudstack.api.APICommand;
 +import org.apache.cloudstack.api.ApiCommandJobType;
  import org.apache.cloudstack.api.ApiConstants;
  import org.apache.cloudstack.api.ApiConstants.VMDetails;
  import org.apache.cloudstack.api.BaseListTaggedResourcesCmd;

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/d4039743/api/src/org/apache/cloudstack/api/command/user/volume/ListVolumesCmd.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/d4039743/client/pom.xml
----------------------------------------------------------------------
diff --cc client/pom.xml
index 066f6f0,197ba27..4a54e6a
--- a/client/pom.xml
+++ b/client/pom.xml
@@@ -85,8 -85,13 +85,13 @@@
        <artifactId>cloud-plugin-network-midonet</artifactId>
        <version>${project.version}</version>
      </dependency>
 -  <dependency>
 +    <dependency>
        <groupId>org.apache.cloudstack</groupId>
+       <artifactId>cloud-plugin-network-internallb</artifactId>
+       <version>${project.version}</version>
+     </dependency>
+     <dependency>
+       <groupId>org.apache.cloudstack</groupId>
        <artifactId>cloud-plugin-hypervisor-xen</artifactId>
        <version>${project.version}</version>
      </dependency>

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/d4039743/client/tomcatconf/applicationContext.xml.in
----------------------------------------------------------------------
diff --cc client/tomcatconf/applicationContext.xml.in
index 2c6f0f2,67c8ccf..9e6748a
--- a/client/tomcatconf/applicationContext.xml.in
+++ b/client/tomcatconf/applicationContext.xml.in
@@@ -165,9 -165,11 +165,9 @@@
    <bean id="accountDaoImpl" class="com.cloud.user.dao.AccountDaoImpl" />
    <bean id="accountDetailsDaoImpl" class="com.cloud.user.AccountDetailsDaoImpl" />
    <bean id="accountJoinDaoImpl" class="com.cloud.api.query.dao.AccountJoinDaoImpl" />
+   <bean id="accountGuestVlanMapDaoImpl" class="com.cloud.network.dao.AccountGuestVlanMapDaoImpl" />
    <bean id="accountVlanMapDaoImpl" class="com.cloud.dc.dao.AccountVlanMapDaoImpl" />
-   <bean id="agentUpgradeDaoImpl" class="com.cloud.maint.dao.AgentUpgradeDaoImpl" />
    <bean id="alertDaoImpl" class="com.cloud.alert.dao.AlertDaoImpl" />
 -  <bean id="asyncJobDaoImpl" class="com.cloud.async.dao.AsyncJobDaoImpl" />
 -  <bean id="asyncJobJoinDaoImpl" class="com.cloud.api.query.dao.AsyncJobJoinDaoImpl" />
    <bean id="autoScalePolicyConditionMapDaoImpl" class="com.cloud.network.as.dao.AutoScalePolicyConditionMapDaoImpl" />
    <bean id="autoScalePolicyDaoImpl" class="com.cloud.network.as.dao.AutoScalePolicyDaoImpl" />
    <bean id="autoScaleVmGroupDaoImpl" class="com.cloud.network.as.dao.AutoScaleVmGroupDaoImpl" />
@@@ -605,8 -617,9 +613,9 @@@
      <property name="UserAuthenticators" value="#{userAuthenticators.Adapters}" />
      <property name="UserPasswordEncoders" value="#{userPasswordEncoders.Adapters}" />
      <property name="HostAllocators" value="#{hostAllocators.Adapters}" />
+ 	<property name="AffinityGroupProcessors" value="#{affinityProcessors.Adapters}" />
    </bean>
 -  
 +
    <bean id="storageManagerImpl" class="com.cloud.storage.StorageManagerImpl">
      <property name="StoragePoolAllocators" value="#{storagePoolAllocators.Adapters}" />
    </bean>
@@@ -690,9 -705,9 +699,8 @@@
    <bean id="snapshotSchedulerImpl" class="com.cloud.storage.snapshot.SnapshotSchedulerImpl" />
    <bean id="storageNetworkManagerImpl" class="com.cloud.network.StorageNetworkManagerImpl" />
    <bean id="swiftManagerImpl" class="com.cloud.storage.swift.SwiftManagerImpl" />
 -  <bean id="syncQueueManagerImpl" class="com.cloud.async.SyncQueueManagerImpl" />
    <bean id="taggedResourceManagerImpl" class="com.cloud.tags.TaggedResourceManagerImpl" />
    <bean id="templateManagerImpl" class="com.cloud.template.TemplateManagerImpl" />
-   <bean id="upgradeManagerImpl" class="com.cloud.maint.UpgradeManagerImpl" />
    <bean id="uploadMonitorImpl" class="com.cloud.storage.upload.UploadMonitorImpl" />
    <bean id="usageServiceImpl" class="com.cloud.usage.UsageServiceImpl" />
    <bean id="virtualNetworkApplianceManagerImpl" class="com.cloud.network.router.VirtualNetworkApplianceManagerImpl" />
@@@ -779,9 -794,9 +788,11 @@@
    <bean id="vMSnapshotManagerImpl" class="com.cloud.vm.snapshot.VMSnapshotManagerImpl" />
    <bean id="volumeManagerImpl" class="com.cloud.storage.VolumeManagerImpl" />
    <bean id="ClassicalPrimaryDataStoreProvider" class="org.apache.cloudstack.storage.datastore.provider.CloudStackPrimaryDataStoreProviderImpl" />
+   <bean id="ApplicationLoadBalancerService" class="org.apache.cloudstack.network.lb.ApplicationLoadBalancerManagerImpl" />
+   <bean id="InternalLoadBalancerVMManager" class="org.apache.cloudstack.network.lb.InternalLoadBalancerVMManagerImpl" />
  
 +  <bean id="VirtualMachinePowerStateSyncImpl" class="com.cloud.vm.VirtualMachinePowerStateSyncImpl" />
 +
  
  <!--=======================================================================================================-->
  <!--                                                                                                       -->
@@@ -857,5 -847,18 +868,18 @@@
    <bean id="baremetalDhcpDaoImpl" class="com.cloud.baremetal.database.BaremetalDhcpDaoImpl" />
    <bean id="baremetalPxeDaoImpl" class="com.cloud.baremetal.database.BaremetalPxeDaoImpl" />
  -->
 -
 +  
+   <bean id="AffinityGroupServiceImpl" class="org.apache.cloudstack.affinity.AffinityGroupServiceImpl"/>
+   <bean id="DeploymentPlanningManager" class="com.cloud.deploy.DeploymentPlanningManagerImpl">
+     <property name="Planners" value="#{deploymentPlanners.Adapters}" />
+ 	<property name="AffinityGroupProcessors" value="#{affinityProcessors.Adapters}" />
+   </bean>
+   
+   <bean id="AffinityGroupJoinDaoImpl" class="com.cloud.api.query.dao.AffinityGroupJoinDaoImpl">
+   </bean>
+   <bean id="AffinityGroupDaoImpl" class="org.apache.cloudstack.affinity.dao.AffinityGroupDaoImpl">
+   </bean>
+   <bean id="AffinityGroupVMMapDaoImpl" class="org.apache.cloudstack.affinity.dao.AffinityGroupVMMapDaoImpl">
+   </bean>
+   
  </beans>


[32/50] [abbrv] git commit: updated refs/heads/vmsync to d403974

Posted by ah...@apache.org.
Merge branch 'master' of https://git-wip-us.apache.org/repos/asf/cloudstack


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

Branch: refs/heads/vmsync
Commit: 3c433deda76a16f1067cde743670572a0dc7f960
Parents: edd2fbb c704c90
Author: Pranav Saxena <pr...@citrix.com>
Authored: Fri May 10 16:47:57 2013 +0530
Committer: Pranav Saxena <pr...@citrix.com>
Committed: Fri May 10 16:47:57 2013 +0530

----------------------------------------------------------------------
 .../network/cisco/CiscoVnmcConnectionImpl.java     |   35 +++++++++-----
 .../cloud/network/element/CiscoVnmcElement.java    |   33 ++++++++++++--
 2 files changed, 50 insertions(+), 18 deletions(-)
----------------------------------------------------------------------



[27/50] [abbrv] git commit: updated refs/heads/vmsync to d403974

Posted by ah...@apache.org.
CLOUDSTACK-1603: Management server .log Java Exceptions are displayed with Alerts


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

Branch: refs/heads/vmsync
Commit: 3aed20c9d27cbe97afc32fd47909a2f08c4550c8
Parents: fa99877
Author: Sanjay Tripathi <sa...@citrix.com>
Authored: Wed May 8 14:17:20 2013 +0530
Committer: Pranav Saxena <pr...@citrix.com>
Committed: Fri May 10 10:18:37 2013 +0530

----------------------------------------------------------------------
 .../datastore/provider/DefaultHostListener.java    |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/3aed20c9/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/provider/DefaultHostListener.java
----------------------------------------------------------------------
diff --git a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/provider/DefaultHostListener.java b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/provider/DefaultHostListener.java
index f2cb1c4..2f0b43a 100644
--- a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/provider/DefaultHostListener.java
+++ b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/provider/DefaultHostListener.java
@@ -56,7 +56,7 @@ public class DefaultHostListener implements HypervisorHostListener {
         }
 
         if (!answer.getResult()) {
-            String msg = "Add host failed due to ModifyStoragePoolCommand failed" + answer.getDetails();
+            String msg = "Unable to attach storage pool" + poolId + " to the host" + hostId;
             alertMgr.sendAlert(AlertManager.ALERT_TYPE_HOST, pool.getDataCenterId(), pool.getPodId(), msg, msg);
             throw new CloudRuntimeException("Unable establish connection from storage head to storage pool " + pool.getId() + " due to " + answer.getDetails() + pool.getId());
         }


[22/50] [abbrv] git commit: updated refs/heads/vmsync to d403974

Posted by ah...@apache.org.
CLOUDSTACK-747: Internal LB between VPC tiers support

Squashed commit of the following:

commit def0861d5a12202260cb6672c12d77075a0de26e
Author: Alena Prokharchyk <al...@citrix.com>
Date:   Thu May 9 10:53:09 2013 -0700

    Inernallb: added internalLbVm to the list of network elements for nonoss build

commit 56d94fc074db52ef00ace1703081a342dfb63db0
Merge: d828c15 8f9a42e
Author: Alena Prokharchyk <al...@citrix.com>
Date:   Thu May 9 09:51:36 2013 -0700

    Merge branch 'master' into internallb1

    Conflicts:
    	plugins/network-elements/netscaler/src/com/cloud/network/element/NetscalerElement.java
    	server/src/com/cloud/network/vpc/VpcManagerImpl.java

commit d828c154fd05fbfeb9c142b27e3d26e7dd755c77
Author: Alena Prokharchyk <al...@citrix.com>
Date:   Wed May 8 14:58:22 2013 -0700

    internallb: Fixed nonoss build

commit 1b8a6986a6fd1808ba7285589f9a007b52feb7e5
Merge: 9e74fa9 738d35a
Author: Alena Prokharchyk <al...@citrix.com>
Date:   Wed May 8 13:20:07 2013 -0700

    Merge branch 'master' into internallb1

    Conflicts:
    	api/src/com/cloud/async/AsyncJob.java
    	api/src/com/cloud/network/NetworkModel.java
    	api/src/com/cloud/network/rules/LoadBalancerContainer.java
    	api/src/org/apache/cloudstack/api/BaseCmd.java
    	api/src/org/apache/cloudstack/api/ResponseGenerator.java
    	api/src/org/apache/cloudstack/network/lb/ApplicationLoadBalancerContainer.java
    	client/tomcatconf/commands.properties.in
    	engine/schema/src/com/cloud/network/dao/LoadBalancerDaoImpl.java
    	server/src/com/cloud/api/ApiResponseHelper.java
    	server/src/com/cloud/network/NetworkManagerImpl.java
    	server/src/com/cloud/network/NetworkModelImpl.java
    	server/src/com/cloud/network/NetworkServiceImpl.java
    	server/src/com/cloud/server/ManagementServerImpl.java
    	server/test/com/cloud/network/MockNetworkModelImpl.java
    	server/test/com/cloud/vpc/MockNetworkManagerImpl.java
    	server/test/com/cloud/vpc/MockNetworkModelImpl.java
    	server/test/resources/appLoadBalancer.xml
    	setup/db/db/schema-410to420.sql
    	test/integration/component/test_multiple_ip_ranges.py
    	test/integration/smoke/test_guest_vlan_range.py
    	tools/marvin/marvin/integration/lib/base.py

commit 9e74fa94067997f0ae6d469f3564df602dd274a6
Author: Prasanna Santhanam <ts...@apache.org>
Date:   Thu May 9 00:11:40 2013 +0530

    marvin changes for internallbvm provider

    - changed the simulator context to load the internallb bean
    - fixed deployDataCenter to use the additional provider by default
    - fixed the sandbox script and the setup script for simulator checkin
      tests

    Signed-off-by: Prasanna Santhanam <ts...@apache.org>

commit 0a2d49301b170171ebe8d6646236854f488d06ba
Author: Jessica Wang <je...@apache.org>
Date:   Tue May 7 15:50:41 2013 -0700

    Internal LB - UI - zone wizard - advanced zone - enable internal LB element, enable internal LB provider.

commit 43e1667f90b01e2b4095009b997b3b2665087fb4
Author: Alena Prokharchyk <al...@citrix.com>
Date:   Tue May 7 13:26:53 2013 -0700

    Moved all DAOs and VOs to the cloud-engine-schema project

commit 2fd94c8bbe24da86e6bd004ee8165e08038a3e1d
Author: Radhika PC <ra...@citrix.com>
Date:   Tue May 7 18:26:08 2013 +0530

    CLOUDSTACK-893 api

commit 12b64d6c00940a4b5c4aa059f2c36ae7cc1b79bd
Author: Prasanna Santhanam <ts...@apache.org>
Date:   Tue May 7 17:06:15 2013 +0530

    Fixing the gmaven configuration for marvin/pom.xml

    For the marvin checkin test custom properties had a typo when run for
    the *nix environment.

    Signed-off-by: Prasanna Santhanam <ts...@apache.org>

commit 1e4274dd9f55a6eea7121d50e361babcafe70725
Author: Prasanna Santhanam <ts...@apache.org>
Date:   Tue May 7 15:28:43 2013 +0530

    Renaming TesDedicateVlanRange -> TestDedicateVlanRange

    Signed-off-by: Prasanna Santhanam <ts...@apache.org>

commit 9264ac526f854c980afb669631177c99e4bbbed7
Author: Prasanna Santhanam <ts...@apache.org>
Date:   Tue May 7 15:28:20 2013 +0530

    Adding isolation method to the zone creation of marvin

    Signed-off-by: Prasanna Santhanam <ts...@apache.org>

commit 3a0dc67de0285fffa7739b25286df71f92470ddf
Author: Prasanna Santhanam <ts...@apache.org>
Date:   Tue May 7 15:27:26 2013 +0530

    adding ACL for dedicateGuestVlanRange set of APIs

    Signed-off-by: Prasanna Santhanam <ts...@apache.org>

commit 79f6e11368d4b6227e9055bb58cce8e5b9872cfe
Author: Prasanna Santhanam <ts...@apache.org>
Date:   Tue May 7 15:26:48 2013 +0530

    add debug logs when access checkers fail to find API

    When the access checkers fail for api discovery, we fail silently.
    instead record a debug message.

    Signed-off-by: Prasanna Santhanam <ts...@apache.org>

commit 92cb7d3e0f3ef052104f698e005ab8dd243f9885
Author: Hugo Trippaers <tr...@gmail.com>
Date:   Tue May 7 11:44:23 2013 +0200

    commit e0d8f01ecd92a1a7b74558d02a28be3b2f20a10d enabled all tests. Fix
    AWSAPI build by removing broken tests and excluding failing tests.

commit 4a391464c7359689915c4230dfa07d728acfb752
Author: Hugo Trippaers <ht...@schubergphilis.com>
Date:   Tue May 7 10:57:23 2013 +0200

    commit e0d8f01ecd92a1a7b74558d02a28be3b2f20a10d enabled all tests, but the tests in vmware-base are horribly broken and will not compile with the current CloudStack.

    Removing the tests to fix the nonoss build and they are so broken they should be rewritten from scratch anyway.

commit 2ca03a851360c733ddacbe6a5490b6812dfc6bec
Author: Prasanna Santhanam <ts...@apache.org>
Date:   Tue May 7 13:51:34 2013 +0530

    moving test data to top level dictionary

    Signed-off-by: Prasanna Santhanam <ts...@apache.org>

commit ceaa4e1b0d77ccb811a7e1f56ae212034b3f4a90
Author: Prasanna Santhanam <ts...@apache.org>
Date:   Tue May 7 13:50:56 2013 +0530

    Adding tracelogs to the API discovery service

    Signed-off-by: Prasanna Santhanam <ts...@apache.org>

commit a3f5f01c7e78e045fdc1302ab484282b0d43e014
Author: Prasanna Santhanam <ts...@apache.org>
Date:   Tue May 7 13:50:12 2013 +0530

    dedicateGuestVlanRange is admin only API

    Adding ACL for the dedicateGuestVlanRange API.

    Signed-off-by: Prasanna Santhanam <ts...@apache.org>

commit 1c4c80fe91c7aeec0689fa9a06ae80d2bdf1b0c0
Author: Hugo Trippaers <ht...@schubergphilis.com>
Date:   Tue May 7 09:58:16 2013 +0200

    Recent pom switcharoo caused the client to lose the dependecy on console-proxy, which it needs to include the systemvm

commit 8103f3c386a8f57c520388ea73965a4cb7f15b91
Author: Radhika PC <ra...@citrix.com>
Date:   Tue May 7 11:30:17 2013 +0530

    CLOUDSTACK-893 first cut

commit 67d0411d739417aae4910251e86981e6d1340da0
Author: Dave Cahill <dc...@midokura.com>
Date:   Fri Apr 19 17:31:44 2013 +0900

    Add docs for MidoNet networking plugin [CLOUDSTACK-996]

    Signed-off-by: Dave Cahill <dc...@midokura.com>

commit c745e6d28e63ef1cacdf18a98ce47d162d260978
Author: Alex Huang <al...@gmail.com>
Date:   Mon May 6 16:34:03 2013 -0700

    Fixed up the simulator to run with windows paths in cygwin

commit be91c037021ad17f16b22599acbdd46062a665a8
Author: Alex Huang <al...@gmail.com>
Date:   Mon May 6 10:34:22 2013 -0700

    Moved over the VLAN daos

commit dcc09f8472d4c94cebae5b430b7eb983037a9935
Author: Alex Huang <al...@gmail.com>
Date:   Mon May 6 06:31:47 2013 -0700

    Missing file and updated .gitignore

commit e9953cd1a8b1247ce569d22ffa820f51d072c841
Author: Alex Huang <al...@gmail.com>
Date:   Mon May 6 06:29:59 2013 -0700

    Fixed up unit testing to use only an in class TestConfiguration

commit 67275714035ea2a55c11ee7acf1e915598670845
Author: Alex Huang <al...@gmail.com>
Date:   Thu May 2 15:20:49 2013 -0700

    Fixed an incorrect unit test for affinity group.  Removed some useless pom.xml.

commit d015fb352023a5d2ec07b4d66612836e0a928679
Author: Alex Huang <al...@gmail.com>
Date:   Thu May 2 06:50:38 2013 -0700

    Moved most of the VOs and DAOs from server package into engine-schema as well

commit 77547a58df5f529031516273015bb770717c5b88
Author: Alex Huang <al...@gmail.com>
Date:   Wed May 1 15:15:57 2013 -0700

    Removed files that are no longer used and further separated out the files in the core project

commit 345f3d34828a9b573971104cbb6132a777a58ed4
Author: Alex Huang <al...@gmail.com>
Date:   Wed May 1 05:46:15 2013 -0700

    Moved agent commands to core and out of api

commit e91ca00571ddf078150165a33cd3cbcee5564fe2
Author: Alex Huang <al...@gmail.com>
Date:   Tue Apr 30 19:06:20 2013 -0700

    Removed framework-api which is completely useless.  Changed framework-ipc to reference gson itself.  Move VOs into engine-schema.

commit f64564e49001ee0f52120a10665979887fd0ebd1
Author: Dennis Lawler <dl...@gmail.com>
Date:   Mon Apr 29 15:10:09 2013 -0700

    Removing filterwin2k option

    Signed-off-by: Chiradeep Vittal <ch...@apache.org>

commit 944a7ea5d6e6728903074ec18754ce2041aaf7a3
Author: Wei Zhou <w....@leaseweb.com>
Date:   Mon May 6 20:57:02 2013 +0100

    CLOUDSTACK-2319: fix "unable to add egress rules" in SecurityGroup

    Signed-off-by: Chip Childers <ch...@gmail.com>

commit ff7f8ba3623927b6cef2deb0069e7f839d933fd5
Author: Wei Zhou <w....@leaseweb.com>
Date:   Mon May 6 20:56:06 2013 +0100

    CLOUDSTACK-2322: update network.gateway to fix deployVm error on
    SharedNetwork after ipv6 support

    Signed-off-by: Chip Childers <ch...@gmail.com>

commit a153373c7eade440c707bfaeeb9831f8179ab51a
Author: Alena Prokharchyk <al...@citrix.com>
Date:   Mon May 6 11:45:19 2013 -0700

    CLOUDSTACK-129: added new API - listNetworkIsolationMethods - for displaying isolation methods supported by the cloudStack

commit 46f59cd49effc43ffea610cc5b7cab90f601b011
Author: Prasanna Santhanam <ts...@apache.org>
Date:   Mon May 6 20:39:36 2013 +0530

    Fixed the incorrect assertion in noncontiguous_vlan test

    The assertion fails if the VLAN is found in which case find returns a
    positive number. So here the assertion should infact assert < 0 result.

    Signed-off-by: Prasanna Santhanam <ts...@apache.org>

commit bd1dcc10b381b33ab5503f42075999365197168b
Author: Prasanna Santhanam <ts...@apache.org>
Date:   Mon May 6 19:53:42 2013 +0530

    Affinity Groups requires multiple storage pools

    Fixing the affinity group test which would fail to find the appropriate
    storage pool to satisfy the anti-affinity group of the second VM

    Signed-off-by: Prasanna Santhanam <ts...@apache.org>

commit 7f853cdb8f8074408205f38c5e63c2dce187b40b
Author: Prasanna Santhanam <ts...@apache.org>
Date:   Mon May 6 19:16:15 2013 +0530

    fixing double calls to VM deploy

    This fixes regression introduced in commit 2f40a90c that made duplicate
    calls to deployVirtualMachine.

    Signed-off-by: Prasanna Santhanam <ts...@apache.org>

commit 646e810fcf0f2c0c3fac02a37eb4301fd913b008
Author: Prasanna Santhanam <ts...@apache.org>
Date:   Mon May 6 18:51:53 2013 +0530

    fixing wildcard imports

    Signed-off-by: Prasanna Santhanam <ts...@apache.org>

commit b29b6e8525ed367cb6f481c7eb116abe1fb847a2
Author: Hugo Trippaers <ht...@schubergphilis.com>
Date:   Fri May 3 14:03:53 2013 +0200

    BigSwitch should only respond if it is the actual provider on the network.

    This fixes an NPE during the release call.

commit 6fcc9b009b5609756fd5195847557b56f9642ecd
Author: Hugo Trippaers <ht...@schubergphilis.com>
Date:   Thu May 2 17:38:27 2013 +0200

    Prevent Nicira NVP tags from exceeding the 40 character limit.

commit d8e61a1c0a02cef67377f1fd1f638d77652edecf
Author: Sanjay Tripathi <sa...@citrix.com>
Date:   Thu May 2 13:45:39 2013 +0530

    CLOUDSTACK-2188 : Parsing error with Download Monitor while checking the health of downloaded templates

    Signed-off-by: Sateesh Chodapuneedi <sa...@apache.org>

commit 5b6e1140f90b4625d02b9a0bb035342139c1b6f4
Author: Sebastien Goasguen <ru...@gmail.com>
Date:   Mon May 6 05:35:58 2013 -0400

    CLOUDSTACK-2339: Adding libcloud example

commit 7be62d2374ef5910728627b583ac33498ad7fdce
Author: Sebastien Goasguen <ru...@gmail.com>
Date:   Mon May 6 05:35:19 2013 -0400

    CLOUDSTACK-2338: Adding example of how to sign api requests in python

commit 156fd689026ca23e583fa32e5013183e13086a57
Author: Talluri <Sr...@citrix.com>
Date:   Fri May 3 23:11:56 2013 +0530

    CLOUDSTACK-2323: fix test scripts to conform with library changes

    Signed-off-by: Prasanna Santhanam <ts...@apache.org>

commit 33ff5e91079b262562b17701d5266bcfd2674ffd
Author: sanjeevneelarapu <sa...@citrix.com>
Date:   Tue Apr 30 20:09:46 2013 +0530

    CLOUDSTACK-702: Tests for Multiple IP Ranges

    1.Deleting IP Range from the existing CIDR
    2.Add non-contiguous guest IP range in new CIDR
    3.Add overlapped guest IP range in existing CIDR

    Signed-off-by: sanjeevneelarapu <sa...@citrix.com>
    Signed-off-by: Prasanna Santhanam <ts...@apache.org>

commit 33059d1f66fdc7d925f6b087a97912b8bc4598d5
Author: Pranav Saxena <pr...@citrix.com>
Date:   Mon May 6 14:08:40 2013 +0530

    scaleUp VM response change corresponding UI changes

commit 92e18d81060a9e766e1cfce3f41bbd6ddd6d5ff5
Author: Pranav Saxena <pr...@citrix.com>
Date:   Mon May 6 13:45:32 2013 +0530

    CLOUDSTACK-2337:Resize button available for root/domain admin and normal users

commit d5cd3f7e006d688d052f7fe797180753dae989e7
Author: Likitha Shetty <li...@citrix.com>
Date:   Wed May 1 13:47:26 2013 +0530

    Dedicate guest vlan range to account

commit 12c79c8377d45df2ccec217bbcb9023840a2c064
Author: Pranav Saxena <pr...@citrix.com>
Date:   Sun May 5 12:02:32 2013 +0530

    scale up virtual machine response change in the backend

commit 94bac276228fb2ede08de063e1b789d917c8425f
Author: Rohit Yadav <bh...@apache.org>
Date:   Sun May 5 09:58:04 2013 +0530

    appliance: Upgrade systemvm appliance from rc1 to Debian7 GA

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

commit c598bb0038750c18223115026774c56de1366696
Author: Isaac Chiang <is...@gmail.com>
Date:   Sun May 5 01:57:35 2013 +0530

    CLOUDSTACK-2076:Listview widget infinte scrolling error

commit d0615ea9a1560b7330066544f5ddf4d5c2713f70
Author: Pranav Saxena <pr...@citrix.com>
Date:   Sun May 5 01:15:14 2013 +0530

    CLOUDSTACK-2274:Detail view loading problem when deleting a zone

commit 733b513c3ac10dadf33f187d29651494197678b4
Author: Isaac Chiang <is...@gmail.com>
Date:   Sat May 4 13:41:02 2013 +0530

    CLOUDSTACK-2160:Refresh button functionality for security groups and statistics tab

commit 418d75d7a4dd4f9785846e3ecbe9f0135d751fe3
Author: Marcus Sorensen <ma...@betterservers.com>
Date:   Fri May 3 14:09:52 2013 -0600

    Summary: Release old DHCP entries

    Detail: Refresh dnsmasq with updated entries live, no outage

    BUG-ID: CLOUDSTACK-2299
    Submitted-by: Dennis Lawler <dl...@gmail.com>
    Signed-off-by: Marcus Sorensen <ma...@betterservers.com> 1367611792 -0600

commit b3dce6457739c0f737ed8f2f61ad108bfee13eba
Author: Kelven Yang <ke...@gmail.com>
Date:   Tue May 7 10:57:19 2013 -0700

    fix unitest

commit b17885f0f68affe060a95e3f264b9ac5e3a98a4b
Author: Alena Prokharchyk <al...@citrix.com>
Date:   Tue May 7 09:55:47 2013 -0700

    InternalLb: some fixes to the unittest

commit 1cff609347eed3fb3a5e2e3a76b2f36404ea0b81
Merge: 053e184 a3a5c13
Author: Alena Prokharchyk <al...@citrix.com>
Date:   Fri May 3 11:23:08 2013 -0700

    Merge branch 'master' into internallb1

    Conflicts:
    	server/src/com/cloud/network/NetworkModelImpl.java
    	server/src/com/cloud/network/NetworkServiceImpl.java
    	server/src/com/cloud/server/ManagementServerImpl.java
    	server/test/com/cloud/network/MockNetworkManagerImpl.java
    	server/test/com/cloud/vpc/MockNetworkManagerImpl.java

commit 053e18454d105e9785768123259bacc48383bcea
Author: Alena Prokharchyk <al...@citrix.com>
Date:   Fri May 3 11:07:07 2013 -0700

    InternalLB: marvin integration test for internal lb feature

commit 2e8e2f98f59eecfc37a2645bd353de7f592d8149
Author: Alena Prokharchyk <al...@citrix.com>
Date:   Wed May 1 13:53:20 2013 -0700

    InternalLB: don't allow to upgrade the network from the network offering with internal LB to the offering with public LB, and vice versa

commit c773d204c8e3b4715b3466f732bdff3100f58cfe
Author: Chiradeep Vittal <ch...@apache.org>
Date:   Wed May 1 13:21:52 2013 -0700

    Internal LB: if we detect that we are inside an internal lb vm, call out to the ilb script to perform LB configuration

    Signed-off-by: Chiradeep Vittal <ch...@apache.org>

commit 8c8845bf77f1258e54998f509df6163df82ce24e
Merge: 7e95545 471ca30
Author: Alena Prokharchyk <al...@citrix.com>
Date:   Wed May 1 10:14:06 2013 -0700

    Merge branch 'master' into internallb1

commit 7e9554596f3d0e1d68ada880c2c17c01a526b0f5
Author: Alena Prokharchyk <al...@citrix.com>
Date:   Wed May 1 10:01:16 2013 -0700

    InternalLb: boot args parameters cleanup for the internal lb vm

commit b7cf8700749893abcac1d3a3d20ec32c4cb5d37f
Author: Alena Prokharchyk <al...@citrix.com>
Date:   Tue Apr 30 10:31:28 2013 -0700

    InternalLb: more unittests for internal lb element

commit 63bb98ebe2fa8279138f8b32aa4264b547726224
Author: Chiradeep Vittal <ch...@apache.org>
Date:   Mon Apr 29 18:29:25 2013 -0700

    allow ssh on eth1

    Signed-off-by: Chiradeep Vittal <ch...@apache.org>

commit ca1c313c2901a2ce1e7e6e3ce3a566bbf4c817b4
Author: Alena Prokharchyk <al...@citrix.com>
Date:   Mon Apr 29 17:58:45 2013 -0700

    InternalLb: DB upgrade - update existing physical networks with InternalLbVm provider

commit ed50caa01c12320c4fa5ff7d4e0818840a6c764d
Author: Alena Prokharchyk <al...@citrix.com>
Date:   Mon Apr 29 17:48:36 2013 -0700

    InternalLbVM: handle the scenario when sourceIpAddress is not passed when create internal Lb rule

commit 4c22c911a9ca5d7e05e9eaf0e971cbe56345fa52
Author: Chiradeep Vittal <ch...@apache.org>
Date:   Mon Apr 29 15:56:00 2013 -0700

    backend support for Internal LB

    Signed-off-by: Chiradeep Vittal <ch...@apache.org>

commit 7b24a7640c53e5b5ab4493de309b43714f4646c6
Merge: 440e848 a0dbf89
Author: Alena Prokharchyk <al...@citrix.com>
Date:   Mon Apr 29 15:49:48 2013 -0700

    Merge branch 'master' into internallb1

    Conflicts:
    	server/src/com/cloud/api/ApiResponseHelper.java
    	server/src/com/cloud/api/query/QueryManagerImpl.java
    	server/src/com/cloud/configuration/ConfigurationManagerImpl.java
    	server/src/com/cloud/network/NetworkManagerImpl.java
    	server/src/com/cloud/network/firewall/FirewallManagerImpl.java
    	setup/db/db/schema-410to420.sql

commit 440e8484d66e3e0366b6d61f930fa13a07d0ce5f
Author: Alena Prokharchyk <al...@citrix.com>
Date:   Mon Apr 29 13:27:06 2013 -0700

    InternalLB: unittests for InternalLoadBalancerVMManager

commit 63babe4b7e8baa1027ac66a7d0b505caafc36d5e
Author: Alena Prokharchyk <al...@citrix.com>
Date:   Fri Apr 26 13:44:01 2013 -0700

    InternalLb:

    1) Added unittests for InternalLoadBalancerVMService
    2) Added unittests for InternalLoadBalancerElementService

commit 4f9c47ce54915f9c9eb8042936f3a1b19553399d
Author: Alena Prokharchyk <al...@citrix.com>
Date:   Thu Apr 25 14:46:42 2013 -0700

    InternalLb: create internal lb vm specific service offering

commit 408ee59d1fe64ce5d6a5e57b76e25cc505fda5dc
Author: Alena Prokharchyk <al...@citrix.com>
Date:   Wed Apr 24 17:08:08 2013 -0700

    Internallb: new set of Web services APIs for managing Internal LB VMs

commit 7680e1cc10b4e48be78668b31ba1af44d1528a67
Author: Alena Prokharchyk <al...@citrix.com>
Date:   Wed Apr 24 17:08:08 2013 -0700

    Internallb:

    1) InternalLb and PublicLb can't be enabled on the same network offering
    2) Can have internalLb only on VPC tier

commit d73ca7ef73ce8f16cd355e48a96c0fc35b037fed
Author: Alena Prokharchyk <al...@citrix.com>
Date:   Wed Apr 24 13:02:32 2013 -0700

    InternalLb:
    1) fixed the bug when the guest nic on internal lb vm wasnt set to be default
    2) Don't send the rules to the internal lb vm if its in Stopped state

commit ca2fc30655eace01857181ac50789a6632f51d29
Merge: 8057567 04a2b2d
Author: Alena Prokharchyk <al...@citrix.com>
Date:   Tue Apr 23 16:56:11 2013 -0700

    Merge branch 'master' into internallb1

    Conflicts:
    	server/src/com/cloud/network/vpc/VpcManagerImpl.java
    	server/src/com/cloud/server/ManagementServerImpl.java
    	setup/db/db/schema-410to420.sql

commit 8057567aaab5000b2f6d3aec8ace65631092adc1
Author: Alena Prokharchyk <al...@citrix.com>
Date:   Tue Apr 23 13:15:36 2013 -0700

    Internallb: more unittests for ApplicationLoadBalancerService

commit 35c0273b857073a7018fb1a59a33f43f6f112a9c
Author: Alena Prokharchyk <al...@citrix.com>
Date:   Fri Apr 19 16:17:45 2013 -0700

    InternalLb: unittests for ApplicationLoadBalancerService

commit 69b23f700348a56f97bc2118166799332a47b3a5
Author: Alena Prokharchyk <al...@citrix.com>
Date:   Thu Apr 18 14:01:10 2013 -0700

    InternalLb: create/configure/listInternalLoadBalancerElement - fixes to the API response

commit a3321ce617eab795288ab75357345d45794db93d
Author: Alena Prokharchyk <al...@citrix.com>
Date:   Thu Apr 18 13:31:16 2013 -0700

    Internal LB : renamed the classes responsible for managing internal lb elements. Now the names are InternalLoadBalancerVMManager, InternalLoadBalancerVMService and InternalLoadBalancerVMManagerImpl

commit 2baf7c365c4847ae49cd90ee25d4e3d7d346464d
Author: Alena Prokharchyk <al...@citrix.com>
Date:   Thu Apr 18 10:02:17 2013 -0700

    Internallb: verify requested IP for LB rule (if specified) against guest network cidr

commit 0cfe96bd00a79ccb9ddebed760c6dde257599074
Merge: 501f2ff 11162f5
Author: Alena Prokharchyk <al...@citrix.com>
Date:   Wed Apr 17 15:41:51 2013 -0700

    Merge branch 'master' into internallb1

    Conflicts:
    	api/src/com/cloud/network/IpAddress.java
    	server/src/com/cloud/network/NetworkServiceImpl.java
    	setup/db/db/schema-410to420.sql

commit 501f2ffa0b07e80c17e4d6f7a73721d034c8e46a
Author: Alena Prokharchyk <al...@citrix.com>
Date:   Tue Apr 16 17:03:50 2013 -0700

    InternalLb: validate source ip network as a part of LB rule creation

commit 4d9a7dfd85f010918749dfe3166d75fe4db68d90
Author: Alena Prokharchyk <al...@citrix.com>
Date:   Tue Apr 16 16:03:32 2013 -0700

    InternalLB: in VPC, restrict public LB to one tier only. Internal LB can be supported on multiple tiers

commit 8689bf9eb38a416997d5ae4d326c51b57b57553e
Author: Alena Prokharchyk <al...@citrix.com>
Date:   Tue Apr 16 15:59:56 2013 -0700

    Internal LB: added internal lb vm to the list of supported providers in VPC default offering

commit b7709b89ff94a7c1eeb0e6dff0eca6220a0aed25
Author: Alena Prokharchyk <al...@citrix.com>
Date:   Tue Apr 16 11:04:22 2013 -0700

    Internal Lb: added 2 boolean fields - internal_lb and public_lb - to the network offering. Define if internal or public LB service is supported. In the current release it's either one or another; in the future releases we might support both on the same network

commit 014689e45eeaedd9b695ec20dfb2db631f433e14
Merge: b3b16ba 90e8158
Author: Alena Prokharchyk <al...@citrix.com>
Date:   Tue Apr 16 09:55:45 2013 -0700

    Merge branch 'master' into internallb1

    Conflicts:
    	api/src/com/cloud/network/Network.java
    	plugins/network-elements/f5/src/com/cloud/network/element/F5ExternalLoadBalancerElement.java
    	server/src/com/cloud/network/NetworkManagerImpl.java
    	server/src/com/cloud/network/NetworkServiceImpl.java
    	server/test/com/cloud/network/MockNetworkManagerImpl.java
    	server/test/com/cloud/vpc/MockNetworkManagerImpl.java
    	setup/db/db/schema-410to420.sql

commit b3b16bae48976c027e3439f2e0a84cfb2cb72166
Author: Alena Prokharchyk <al...@citrix.com>
Date:   Mon Apr 15 17:00:31 2013 -0700

    InternalLB: allow to specify more than one provider for the LB service when create network offering as diff providers can support internal and public LB for the same network

commit a4fc1d7d65191da6a49bce9fa0a64ce6e46ac85d
Author: Alena Prokharchyk <al...@citrix.com>
Date:   Mon Apr 15 13:45:25 2013 -0700

    Internal LB:

    1) Added network_offering_details DB table and corresponding VO/DAO objects. Change createNetworkOffering web services api to accept the map of key/value pairs as details.
    2) Allow to have multiple providers for the same service for the network to support the case when LB service can have separate providers for Internal LB and Public LB

commit 4530cebf2bef515f86fa29b3798d51e81089f92f
Author: Alena Prokharchyk <al...@citrix.com>
Date:   Mon Apr 15 10:06:10 2013 -0700

    InternalLbVm: support for start/stop Internal lb vm

commit ae69f0ae5612834b8bc911bd074cfb050c0b164c
Author: Alena Prokharchyk <al...@citrix.com>
Date:   Fri Apr 12 17:25:02 2013 -0700

    InternalLb: fixed prepare() in InternalLbElement - have to prepare nics of User vms only

commit 888a83c22111f3792850e6bb6235d30a93408d1d
Author: Alena Prokharchyk <al...@citrix.com>
Date:   Fri Apr 12 15:58:27 2013 -0700

    InternalLb: Start/deploy internal LB vms for the existing LB rules as a part of network implement

commit 3b41d5bee1ac04d3e9cf837a2be4398b7597d1a0
Merge: bb73531 4b1a9f1
Author: Alena Prokharchyk <al...@citrix.com>
Date:   Fri Apr 12 15:32:40 2013 -0700

    Merge branch 'master' into internallb1

    Conflicts:
    	server/src/com/cloud/network/NetworkModelImpl.java
    	server/src/com/cloud/server/ManagementServerImpl.java

commit bb73531fed72cc81012624fd3bae5ec22d23daa2
Author: Alena Prokharchyk <al...@citrix.com>
Date:   Fri Apr 12 15:13:55 2013 -0700

    Internal Lb: list internal lb vms as a part of listRouters response. Introduced new parameter - role (can be virtual_router or internal_lb_vm)

commit c113ea184b575ccae5d2be411c5bbc345473e35e
Author: Alena Prokharchyk <al...@citrix.com>
Date:   Fri Apr 12 12:00:09 2013 -0700

    Add Internal Lb Provider/Element as a part of adding a physical network

commit 78c9db79dae3bc38699050b05baae32fd02204f6
Author: Alena Prokharchyk <al...@citrix.com>
Date:   Fri Apr 12 10:05:28 2013 -0700

    InternalLbVm: destroy the internal lb vm when the last rule for the ip is being revoked

commit af6201257b28a0d9177330c8c76b0ec979725870
Author: Alena Prokharchyk <al...@citrix.com>
Date:   Thu Apr 11 16:55:37 2013 -0700

    Internal LB: fixed some bugs in internal lb vm startup process

commit 1db240c2b668e6cbbea4e09979c34d84fe54a624
Author: Alena Prokharchyk <al...@citrix.com>
Date:   Thu Apr 11 14:23:55 2013 -0700

    InternalLb: fixed searchCriteria constructor in ApplicationLoadBalancerDaoImpl

commit 3795048fcc68ef23c24d82c9064946dfc082b1b6
Merge: f4c2b53 5f8a278
Author: Alena Prokharchyk <al...@citrix.com>
Date:   Thu Apr 11 14:09:31 2013 -0700

    Merge branch 'master' into internallb1

    Conflicts:
    	api/src/com/cloud/async/AsyncJob.java
    	api/src/org/apache/cloudstack/api/ApiConstants.java
    	api/src/org/apache/cloudstack/api/BaseCmd.java
    	api/src/org/apache/cloudstack/api/ResponseGenerator.java
    	client/tomcatconf/commands.properties.in
    	server/src/com/cloud/api/ApiDBUtils.java
    	server/src/com/cloud/api/ApiResponseHelper.java
    	server/src/com/cloud/server/ManagementServerImpl.java
    	setup/db/db/schema-410to420.sql

commit f4c2b53c218b2d11d510b9acc6baeb0d62042e5c
Author: Alena Prokharchyk <al...@citrix.com>
Date:   Thu Apr 11 13:46:47 2013 -0700

    InternalLB: modified InternalLbElement to start the Internal Lb vm for each ip address (if not already started)

commit 76a4b1cf81610d931d6098ca94fa509c9ba2e274
Author: Alena Prokharchyk <al...@citrix.com>
Date:   Thu Apr 11 11:41:47 2013 -0700

    InternalLB: added logic for acquiring guest ip address for the Internal LB rule

commit 915e39fbaa9a6b6898e2aa13cbf8ef60a7b9d70e
Author: Alena Prokharchyk <al...@citrix.com>
Date:   Thu Apr 11 10:19:18 2013 -0700

    Removed unused methods doing ipAllocation from GuestNetworkGuru and NetworkServiceImpl. The correct method is located in NetworkModelImpl

commit 3f2a62c7f62d23da23f65ff3842049243ef268e3
Merge: 20beb7a a0b5ebc
Author: Alena Prokharchyk <al...@citrix.com>
Date:   Wed Apr 10 17:16:07 2013 -0700

    Merge branch 'master' into internallb1

commit 20beb7a16c1a592cd7500148ea8988fe119d34fb
Author: Alena Prokharchyk <al...@citrix.com>
Date:   Wed Apr 10 15:28:12 2013 -0700

    Internal LB: applyLoadBalancerRules - put not null check for sourceIpAddressId (can be null when Schema is not Public)

commit 87e5f5b9a6b006893ee30662fc06ea430e7b70dc
Author: Alena Prokharchyk <al...@citrix.com>
Date:   Wed Apr 10 15:17:58 2013 -0700

    Internal LB: intermediate checkin - added InternalLBAppliance manager and managerImpl

commit 53b9c0d142bd2b99dd00c17987dcf5dc54e3ef56
Author: Alena Prokharchyk <al...@citrix.com>
Date:   Tue Apr 9 17:55:10 2013 -0700

    Internal LB: added @Since to API docs for Internal LB related commands

commit 867b305ea852dcbe224645dc4e5ffb950d8db8f7
Author: Alena Prokharchyk <al...@citrix.com>
Date:   Tue Apr 9 17:51:19 2013 -0700

    Internal LB: Made InternalLbElement to extend the ip deployer as the LB service implements IPDeployerRequester

commit 7b9af2809410132db451e48b7b829bf019512a92
Author: Alena Prokharchyk <al...@citrix.com>
Date:   Tue Apr 9 15:45:30 2013 -0700

    InternalLb: new set of Web Services APIs to add InternalLB as a network element to the cloudStack (the element is packaged as an independent plugin). New APIs:

    1) configureInternalLoadBalancerElement
    2) createInternalLoadBalancerElement
    3) listInternalLoadBalancerElements

commit 039e303d4aec5618cc3914ee1a581d2f7b926e1c
Author: Alena Prokharchyk <al...@citrix.com>
Date:   Tue Apr 9 14:01:11 2013 -0700

    InternalLB: Modified pluggable service VirtualRouterElementService to accept only VirtualRouter and VpcVirtualRouter as a VirtualRouterProvider type when add/configure elements. Other VirtualRouterProviderTypes are are taken care by elb/internal lb plugins.

commit f0018b451281bf02964dbe71d704c9a931783cae
Author: Alena Prokharchyk <al...@citrix.com>
Date:   Tue Apr 9 12:56:42 2013 -0700

    Internal LB:

    1)Added InternalLoadBalancerManager and corresponding Impl
    2)Add InternalLbVm as a default CS provider. DB upgrade is covered as well

commit e344cf250af6a67a17f082f1c646e6ef5ce9a0a7
Author: Alena Prokharchyk <al...@citrix.com>
Date:   Mon Apr 8 16:57:47 2013 -0700

    InternalLB - removed unused code from LoadBalancerDao

commit 3588f468482e43181802730ed5a059897eb85458
Author: Alena Prokharchyk <al...@citrix.com>
Date:   Mon Apr 8 16:23:03 2013 -0700

    Internal LB - added network-element plugin for internal lb service

commit 76325e61681c7e191308b27514ba69e523cf12bd
Author: Alena Prokharchyk <al...@citrix.com>
Date:   Mon Apr 8 13:58:08 2013 -0700

    Internal Lb:

    1) When network has both kinds of LB rules - Public and Internal - never send them in the same set to the provider
    2) Added extra checks on the provider side to validate if the schema - Public or Internal - is supported.

commit 56c2fe1d376c407a248fba789dd67ff36493a0ed
Author: Alena Prokharchyk <al...@citrix.com>
Date:   Mon Apr 8 12:34:59 2013 -0700

    InternalLB:

    1) Added new capability for the LB service - LbSchemes. Can take 2 values - Internal and Public.
    2) F5 and Netscaler LB providers - changes all LB related methods to accept LoadBalancingRule instead of ? extends FirewallRule.

commit 34bcb2d026e1951f7b115d71830c69e1ad5ed89a
Author: Alena Prokharchyk <al...@citrix.com>
Date:   Mon Apr 8 12:11:11 2013 -0700

    InternalLB: implemented list/delete/create web services API commands that will be used for Internal LB creation

commit 9ab31e11f7ebd431f9ebdf9d8582f5c126b14928
Author: Alena Prokharchyk <al...@citrix.com>
Date:   Fri Apr 5 15:59:55 2013 -0700

    InternalLB: change LoadBalancingRule - reference sourceIpAddress of th load balancer by its value, not DB id

commit 08f855d4e4b3888b3b4a163ce73c0e444b91e6b7
Author: Alena Prokharchyk <al...@citrix.com>
Date:   Thu Apr 4 09:26:21 2013 -0700

    InternalLB:

    1) Added new set of Interfaces - including the new VO - for the internal load balancer
    2) DB change - added source_ip_address/source_ip_address_network_id/scheme (Internal/Public) fields to the load_balancer table


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

Branch: refs/heads/vmsync
Commit: 2660a6b7a7f226ab757d2175222db62571813120
Parents: 8f9a42e
Author: Alena Prokharchyk <al...@citrix.com>
Authored: Thu May 9 11:05:54 2013 -0700
Committer: Alena Prokharchyk <al...@citrix.com>
Committed: Thu May 9 11:54:41 2013 -0700

----------------------------------------------------------------------
 api/src/com/cloud/async/AsyncJob.java              |    2 +
 api/src/com/cloud/event/EventTypes.java            |   24 +-
 api/src/com/cloud/network/IpAddress.java           |    3 +
 api/src/com/cloud/network/Network.java             |   19 +-
 api/src/com/cloud/network/NetworkModel.java        |    7 +
 .../network/VirtualNetworkApplianceService.java    |    2 +
 .../com/cloud/network/VirtualRouterProvider.java   |    3 +-
 .../com/cloud/network/lb/LoadBalancingRule.java    |   83 +-
 .../network/lb/LoadBalancingRulesService.java      |   16 +-
 .../com/cloud/network/router/VirtualRouter.java    |    2 +-
 api/src/com/cloud/network/rules/LoadBalancer.java  |   10 +-
 .../cloud/network/rules/LoadBalancerContainer.java |   33 +
 api/src/com/cloud/offering/NetworkOffering.java    |   11 +
 api/src/com/cloud/offering/ServiceOffering.java    |    1 +
 api/src/com/cloud/vm/VirtualMachine.java           |    3 +-
 .../org/apache/cloudstack/api/ApiConstants.java    |    6 +
 api/src/org/apache/cloudstack/api/BaseCmd.java     |    7 +
 .../apache/cloudstack/api/ResponseGenerator.java   |   44 +-
 .../ConfigureInternalLoadBalancerElementCmd.java   |  114 ++
 .../CreateInternalLoadBalancerElementCmd.java      |  116 ++
 .../admin/internallb/ListInternalLBVMsCmd.java     |  151 +++
 .../ListInternalLoadBalancerElementsCmd.java       |   99 ++
 .../admin/internallb/StartInternalLBVMCmd.java     |  120 ++
 .../admin/internallb/StopInternalLBVMCmd.java      |  123 ++
 .../admin/network/CreateNetworkOfferingCmd.java    |   15 +-
 .../router/CreateVirtualRouterElementCmd.java      |   21 +-
 .../api/command/admin/router/ListRoutersCmd.java   |    7 +-
 .../api/command/admin/router/StartRouterCmd.java   |   10 +-
 .../api/command/admin/router/StopRouterCmd.java    |   11 +-
 .../CreateApplicationLoadBalancerCmd.java          |  218 ++++
 .../loadbalancer/CreateLoadBalancerRuleCmd.java    |    6 +-
 .../DeleteApplicationLoadBalancerCmd.java          |  116 ++
 .../ListApplicationLoadBalancersCmd.java           |  131 ++
 .../ApplicationLoadBalancerInstanceResponse.java   |   63 +
 .../response/ApplicationLoadBalancerResponse.java  |  142 +++
 .../ApplicationLoadBalancerRuleResponse.java       |   51 +
 .../api/response/DomainRouterResponse.java         |   13 +-
 .../InternalLoadBalancerElementResponse.java       |   51 +
 .../api/response/NetworkOfferingResponse.java      |    9 +
 .../response/VirtualRouterProviderResponse.java    |    1 +
 .../InternalLoadBalancerElementService.java        |   56 +
 .../lb/ApplicationLoadBalancerContainer.java       |   28 +
 .../network/lb/ApplicationLoadBalancerRule.java    |   24 +
 .../network/lb/ApplicationLoadBalancerService.java |   42 +
 .../network/lb/InternalLoadBalancerVMService.java  |   34 +
 .../org/apache/cloudstack/query/QueryService.java  |    3 +
 client/pom.xml                                     |    5 +
 client/tomcatconf/applicationContext.xml.in        |    9 +-
 client/tomcatconf/commands.properties.in           |   16 +
 client/tomcatconf/componentContext.xml.in          |    2 +
 client/tomcatconf/nonossComponentContext.xml.in    |    2 +
 client/tomcatconf/simulatorComponentContext.xml.in |    1 +
 .../com/cloud/network/dao/FirewallRulesDao.java    |    1 -
 .../src/com/cloud/network/dao/IPAddressVO.java     |    9 +-
 .../src/com/cloud/network/dao/LoadBalancerDao.java |   10 +-
 .../com/cloud/network/dao/LoadBalancerDaoImpl.java |   74 +-
 .../src/com/cloud/network/dao/LoadBalancerVO.java  |   18 +
 .../cloud/network/dao/NetworkServiceMapDao.java    |    1 +
 .../network/dao/NetworkServiceMapDaoImpl.java      |    9 +
 .../src/com/cloud/network/dao/NetworkVO.java       |    3 -
 .../com/cloud/network/rules/FirewallRuleVO.java    |    2 -
 .../cloud/offerings/NetworkOfferingDetailsVO.java  |   90 ++
 .../src/com/cloud/offerings/NetworkOfferingVO.java |   44 +-
 .../cloud/offerings/dao/NetworkOfferingDao.java    |    4 +
 .../offerings/dao/NetworkOfferingDaoImpl.java      |   24 +
 .../offerings/dao/NetworkOfferingDetailsDao.java   |   31 +
 .../dao/NetworkOfferingDetailsDaoImpl.java         |   79 ++
 .../src/com/cloud/upgrade/dao/Upgrade410to420.java |   95 ++-
 engine/schema/src/com/cloud/vm/dao/NicDao.java     |    2 +-
 engine/schema/src/com/cloud/vm/dao/NicDaoImpl.java |    2 +-
 .../lb/ApplicationLoadBalancerRuleVO.java          |  133 ++
 .../lb/dao/ApplicationLoadBalancerRuleDao.java     |   35 +
 .../lb/dao/ApplicationLoadBalancerRuleDaoImpl.java |  115 ++
 .../debian/config/etc/init.d/cloud-early-config    |   26 +
 .../debian/config/etc/iptables/iptables-ilbvm      |   33 +
 .../systemvm/debian/config/opt/cloud/bin/ilb.sh    |  211 ++++
 .../debian/config/opt/cloud/bin/patchsystemvm.sh   |   23 +
 .../config/opt/cloud/bin/vpc_loadbalancer.sh       |   23 +
 .../element/ElasticLoadBalancerElement.java        |   22 +-
 .../network/lb/ElasticLoadBalancerManager.java     |    4 +-
 .../network/lb/ElasticLoadBalancerManagerImpl.java |   32 +-
 .../element/F5ExternalLoadBalancerElement.java     |   87 ++-
 .../network-elements/internal-loadbalancer/pom.xml |   50 +
 .../element/InternalLoadBalancerElement.java       |  548 +++++++++
 .../network/lb/InternalLoadBalancerVMManager.java  |   90 ++
 .../lb/InternalLoadBalancerVMManagerImpl.java      |  951 +++++++++++++++
 .../ElementChildTestConfiguration.java             |  124 ++
 .../InternalLbElementServiceTest.java              |  190 +++
 .../internallbelement/InternalLbElementTest.java   |  226 ++++
 .../internallbvmmgr/InternalLBVMManagerTest.java   |  388 ++++++
 .../internallbvmmgr/InternalLBVMServiceTest.java   |  291 +++++
 .../internallbvmmgr/LbChildTestConfiguration.java  |  170 +++
 .../test/resources/lb_element.xml                  |   46 +
 .../test/resources/lb_mgr.xml                      |   46 +
 .../test/resources/lb_svc.xml                      |   46 +
 .../cloud/network/element/NetscalerElement.java    |  108 ++-
 plugins/pom.xml                                    |    1 +
 server/src/com/cloud/api/ApiDBUtils.java           |   10 +-
 server/src/com/cloud/api/ApiResponseHelper.java    |  108 ++-
 .../src/com/cloud/api/query/QueryManagerImpl.java  |   45 +-
 .../api/query/dao/DomainRouterJoinDaoImpl.java     |    9 +-
 .../com/cloud/api/query/vo/DomainRouterJoinVO.java |   17 +-
 server/src/com/cloud/configuration/Config.java     |    5 +-
 .../cloud/configuration/ConfigurationManager.java  |   10 +-
 .../configuration/ConfigurationManagerImpl.java    |  123 ++-
 .../network/ExternalLoadBalancerDeviceManager.java |    6 +-
 .../ExternalLoadBalancerDeviceManagerImpl.java     |   33 +-
 .../ExternalLoadBalancerUsageManagerImpl.java      |   34 +-
 server/src/com/cloud/network/NetworkManager.java   |    3 +-
 .../src/com/cloud/network/NetworkManagerImpl.java  |  103 ++-
 server/src/com/cloud/network/NetworkModelImpl.java |   57 +-
 .../src/com/cloud/network/NetworkServiceImpl.java  |   68 +-
 .../network/element/VirtualRouterElement.java      |   56 +-
 .../network/firewall/FirewallManagerImpl.java      |   77 +-
 .../com/cloud/network/guru/GuestNetworkGuru.java   |   43 +-
 .../com/cloud/network/lb/LBHealthCheckManager.java |    4 +-
 .../cloud/network/lb/LBHealthCheckManagerImpl.java |    9 +-
 .../network/lb/LoadBalancingRulesManager.java      |   24 +-
 .../network/lb/LoadBalancingRulesManagerImpl.java  |  402 +++++--
 .../router/VirtualNetworkApplianceManager.java     |    4 +
 .../router/VirtualNetworkApplianceManagerImpl.java |   59 +-
 .../VpcVirtualNetworkApplianceManagerImpl.java     |    2 +-
 .../src/com/cloud/network/vpc/VpcManagerImpl.java  |   14 +-
 .../com/cloud/server/ConfigurationServerImpl.java  |   14 +-
 .../src/com/cloud/server/ManagementServerImpl.java |  580 +++++++--
 .../lb/ApplicationLoadBalancerManagerImpl.java     |  524 ++++++++
 .../com/cloud/network/MockNetworkManagerImpl.java  |   27 +-
 .../com/cloud/network/MockNetworkModelImpl.java    |   17 +
 .../cloud/vpc/MockConfigurationManagerImpl.java    |    2 +-
 .../test/com/cloud/vpc/MockNetworkManagerImpl.java |   56 +-
 .../test/com/cloud/vpc/MockNetworkModelImpl.java   |   17 +
 .../vpc/MockVpcVirtualNetworkApplianceManager.java |   14 +-
 .../cloud/vpc/dao/MockNetworkOfferingDaoImpl.java  |   12 +-
 .../vpc/dao/MockNetworkServiceMapDaoImpl.java      |    6 +
 .../cloudstack/lb/ApplicationLoadBalancerTest.java |  292 +++++
 .../cloudstack/lb/ChildTestConfiguration.java      |  103 ++
 .../networkoffering/CreateNetworkOfferingTest.java |   21 +-
 server/test/resources/appLoadBalancer.xml          |   43 +
 setup/db/db/schema-40to410.sql                     |    4 +-
 setup/db/db/schema-410to420.sql                    |   45 +-
 setup/dev/advanced.cfg                             |    4 +
 .../component/test_multiple_ip_ranges.py           |    1 +
 test/integration/smoke/test_guest_vlan_range.py    |   15 +
 test/integration/smoke/test_internal_lb.py         |  250 ++++
 tools/apidoc/gen_toc.py                            |    1 +
 tools/marvin/marvin/deployDataCenter.py            |   12 +
 .../marvin/marvin/sandbox/advanced/advanced_env.py |    5 +
 tools/marvin/marvin/sandbox/advanced/sandbox.cfg   |  209 ++++
 ui/scripts/zoneWizard.js                           |  104 ++
 149 files changed, 9493 insertions(+), 813 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2660a6b7/api/src/com/cloud/async/AsyncJob.java
----------------------------------------------------------------------
diff --git a/api/src/com/cloud/async/AsyncJob.java b/api/src/com/cloud/async/AsyncJob.java
index d384a7a..ccdc406 100644
--- a/api/src/com/cloud/async/AsyncJob.java
+++ b/api/src/com/cloud/async/AsyncJob.java
@@ -50,7 +50,9 @@ public interface AsyncJob extends Identity, InternalIdentity {
         AutoScaleVmProfile,
         AutoScaleVmGroup,
         GlobalLoadBalancerRule,
+        LoadBalancerRule,
         AffinityGroup,
+        InternalLbVm,
         DedicatedGuestVlanRange
     }
 

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2660a6b7/api/src/com/cloud/event/EventTypes.java
----------------------------------------------------------------------
diff --git a/api/src/com/cloud/event/EventTypes.java b/api/src/com/cloud/event/EventTypes.java
index 26c40ab..45a904e 100755
--- a/api/src/com/cloud/event/EventTypes.java
+++ b/api/src/com/cloud/event/EventTypes.java
@@ -16,6 +16,9 @@
 // under the License.
 package com.cloud.event;
 
+import java.util.HashMap;
+import java.util.Map;
+
 import com.cloud.configuration.Configuration;
 import com.cloud.dc.DataCenter;
 import com.cloud.dc.Pod;
@@ -23,8 +26,18 @@ import com.cloud.dc.StorageNetworkIpRange;
 import com.cloud.dc.Vlan;
 import com.cloud.domain.Domain;
 import com.cloud.host.Host;
-import com.cloud.network.*;
-import com.cloud.network.as.*;
+import com.cloud.network.GuestVlan;
+import com.cloud.network.Network;
+import com.cloud.network.PhysicalNetwork;
+import com.cloud.network.PhysicalNetworkServiceProvider;
+import com.cloud.network.PhysicalNetworkTrafficType;
+import com.cloud.network.PublicIpAddress;
+import com.cloud.network.RemoteAccessVpn;
+import com.cloud.network.as.AutoScaleCounter;
+import com.cloud.network.as.AutoScalePolicy;
+import com.cloud.network.as.AutoScaleVmGroup;
+import com.cloud.network.as.AutoScaleVmProfile;
+import com.cloud.network.as.Condition;
 import com.cloud.network.router.VirtualRouter;
 import com.cloud.network.rules.LoadBalancer;
 import com.cloud.network.rules.StaticNat;
@@ -43,9 +56,6 @@ import com.cloud.user.Account;
 import com.cloud.user.User;
 import com.cloud.vm.VirtualMachine;
 
-import java.util.HashMap;
-import java.util.Map;
-
 public class EventTypes {
 
     //map of Event and corresponding entity for which Event is applicable
@@ -389,11 +399,15 @@ public class EventTypes {
     public static final String EVENT_AFFINITY_GROUP_ASSIGN = "AG.ASSIGN";
     public static final String EVENT_AFFINITY_GROUP_REMOVE = "AG.REMOVE";
     public static final String EVENT_VM_AFFINITY_GROUP_UPDATE = "VM.AG.UPDATE";
+    
+    public static final String EVENT_INTERNAL_LB_VM_START = "INTERNALLBVM.START";
+    public static final String EVENT_INTERNAL_LB_VM_STOP = "INTERNALLBVM.STOP";
 
     // Dedicated guest vlan range
     public static final String EVENT_GUEST_VLAN_RANGE_DEDICATE  = "GUESTVLANRANGE.DEDICATE";
     public static final String EVENT_DEDICATED_GUEST_VLAN_RANGE_RELEASE  = "GUESTVLANRANGE.RELEASE";
 
+
     static {
 
         // TODO: need a way to force author adding event types to declare the entity details as well, with out braking

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2660a6b7/api/src/com/cloud/network/IpAddress.java
----------------------------------------------------------------------
diff --git a/api/src/com/cloud/network/IpAddress.java b/api/src/com/cloud/network/IpAddress.java
index 71c9b4e..c48e8b9 100644
--- a/api/src/com/cloud/network/IpAddress.java
+++ b/api/src/com/cloud/network/IpAddress.java
@@ -81,4 +81,7 @@ public interface IpAddress extends ControlledEntity, Identity, InternalIdentity
     Long getVpcId();
 
     String getVmIp();
+    
+    Long getNetworkId();
+
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2660a6b7/api/src/com/cloud/network/Network.java
----------------------------------------------------------------------
diff --git a/api/src/com/cloud/network/Network.java b/api/src/com/cloud/network/Network.java
index 4472dba..fa062c6 100644
--- a/api/src/com/cloud/network/Network.java
+++ b/api/src/com/cloud/network/Network.java
@@ -16,18 +16,19 @@
 // under the License.
 package com.cloud.network;
 
+import java.net.URI;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.cloudstack.acl.ControlledEntity;
+import org.apache.cloudstack.api.Identity;
+import org.apache.cloudstack.api.InternalIdentity;
+
 import com.cloud.network.Networks.BroadcastDomainType;
 import com.cloud.network.Networks.Mode;
 import com.cloud.network.Networks.TrafficType;
 import com.cloud.utils.fsm.StateMachine2;
 import com.cloud.utils.fsm.StateObject;
-import org.apache.cloudstack.acl.ControlledEntity;
-import org.apache.cloudstack.api.Identity;
-import org.apache.cloudstack.api.InternalIdentity;
-
-import java.net.URI;
-import java.util.ArrayList;
-import java.util.List;
 
 /**
  * owned by an account.
@@ -50,7 +51,7 @@ public interface Network extends ControlledEntity, StateObject<Network.State>, I
                 Capability.MultipleIps, Capability.TrafficStatistics, Capability.SupportedTrafficDirection, Capability.SupportedEgressProtocols);
         public static final Service Lb = new Service("Lb", Capability.SupportedLBAlgorithms, Capability.SupportedLBIsolation,
                 Capability.SupportedProtocols, Capability.TrafficStatistics, Capability.LoadBalancingSupportedIps,
-                Capability.SupportedStickinessMethods, Capability.ElasticLb);
+                Capability.SupportedStickinessMethods, Capability.ElasticLb, Capability.LbSchemes);
         public static final Service UserData = new Service("UserData");
         public static final Service SourceNat = new Service("SourceNat", Capability.SupportedSourceNatTypes, Capability.RedundantRouter);
         public static final Service StaticNat = new Service("StaticNat", Capability.ElasticIp);
@@ -124,6 +125,7 @@ public interface Network extends ControlledEntity, StateObject<Network.State>, I
         public static final Provider None = new Provider("None", false);
         // NiciraNvp is not an "External" provider, otherwise we get in trouble with NetworkServiceImpl.providersConfiguredForExternalNetworking 
         public static final Provider NiciraNvp = new Provider("NiciraNvp", false);
+        public static final Provider InternalLbVm = new Provider("InternalLbVm", false);
         public static final Provider CiscoVnmc = new Provider("CiscoVnmc", true);
 
         private String name;
@@ -177,6 +179,7 @@ public interface Network extends ControlledEntity, StateObject<Network.State>, I
         public static final Capability SupportedTrafficDirection = new Capability("SupportedTrafficDirection");
         public static final Capability SupportedEgressProtocols = new Capability("SupportedEgressProtocols");
         public static final Capability HealthCheckPolicy = new Capability("HealthCheckPolicy");
+        public static final Capability LbSchemes = new Capability("LbSchemes");
 
         private String name;
 

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2660a6b7/api/src/com/cloud/network/NetworkModel.java
----------------------------------------------------------------------
diff --git a/api/src/com/cloud/network/NetworkModel.java b/api/src/com/cloud/network/NetworkModel.java
index 555a09f..f84a8b0 100644
--- a/api/src/com/cloud/network/NetworkModel.java
+++ b/api/src/com/cloud/network/NetworkModel.java
@@ -33,6 +33,7 @@ import com.cloud.network.Networks.TrafficType;
 import com.cloud.network.element.NetworkElement;
 import com.cloud.network.element.UserDataServiceProvider;
 import com.cloud.offering.NetworkOffering;
+import com.cloud.offering.NetworkOffering.Detail;
 import com.cloud.user.Account;
 import com.cloud.vm.Nic;
 import com.cloud.vm.NicProfile;
@@ -264,5 +265,11 @@ public interface NetworkModel {
 
     Nic getPlaceholderNicForRouter(Network network, Long podId);
     
+    IpAddress getPublicIpAddress(String ipAddress, long zoneId);
+
+    List<String> getUsedIpsInNetwork(Network network);
+
+    Map<Detail, String> getNtwkOffDetails(long offId);
+
     Networks.IsolationType[] listNetworkIsolationMethods();
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2660a6b7/api/src/com/cloud/network/VirtualNetworkApplianceService.java
----------------------------------------------------------------------
diff --git a/api/src/com/cloud/network/VirtualNetworkApplianceService.java b/api/src/com/cloud/network/VirtualNetworkApplianceService.java
index 250ecb2..58eead2 100644
--- a/api/src/com/cloud/network/VirtualNetworkApplianceService.java
+++ b/api/src/com/cloud/network/VirtualNetworkApplianceService.java
@@ -63,5 +63,7 @@ public interface VirtualNetworkApplianceService {
     VirtualRouter startRouter(long id) throws ResourceUnavailableException, InsufficientCapacityException, ConcurrentOperationException;
 
     VirtualRouter destroyRouter(long routerId, Account caller, Long callerUserId) throws ResourceUnavailableException, ConcurrentOperationException;
+    
+    VirtualRouter findRouter(long routerId);
 
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2660a6b7/api/src/com/cloud/network/VirtualRouterProvider.java
----------------------------------------------------------------------
diff --git a/api/src/com/cloud/network/VirtualRouterProvider.java b/api/src/com/cloud/network/VirtualRouterProvider.java
index ed6a274..f67686e 100644
--- a/api/src/com/cloud/network/VirtualRouterProvider.java
+++ b/api/src/com/cloud/network/VirtualRouterProvider.java
@@ -23,7 +23,8 @@ public interface VirtualRouterProvider extends InternalIdentity, Identity {
     public enum VirtualRouterProviderType {
         VirtualRouter,
         ElasticLoadBalancerVm,
-        VPCVirtualRouter
+        VPCVirtualRouter,
+        InternalLbVm
     }
 
     public VirtualRouterProviderType getType();

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2660a6b7/api/src/com/cloud/network/lb/LoadBalancingRule.java
----------------------------------------------------------------------
diff --git a/api/src/com/cloud/network/lb/LoadBalancingRule.java b/api/src/com/cloud/network/lb/LoadBalancingRule.java
index 3e11e8c..4b37782 100644
--- a/api/src/com/cloud/network/lb/LoadBalancingRule.java
+++ b/api/src/com/cloud/network/lb/LoadBalancingRule.java
@@ -25,111 +25,83 @@ import com.cloud.network.as.Condition;
 import com.cloud.network.as.Counter;
 import com.cloud.network.rules.FirewallRule;
 import com.cloud.network.rules.LoadBalancer;
+import com.cloud.network.rules.LoadBalancerContainer.Scheme;
 import com.cloud.utils.Pair;
+import com.cloud.utils.net.Ip;
 
-public class LoadBalancingRule implements FirewallRule, LoadBalancer {
+public class LoadBalancingRule {
     private LoadBalancer lb;
+    private Ip sourceIp;
     private List<LbDestination> destinations;
     private List<LbStickinessPolicy> stickinessPolicies;
     private LbAutoScaleVmGroup autoScaleVmGroup;
     private List<LbHealthCheckPolicy> healthCheckPolicies;
 
     public LoadBalancingRule(LoadBalancer lb, List<LbDestination> destinations,
-            List<LbStickinessPolicy> stickinessPolicies, List<LbHealthCheckPolicy> healthCheckPolicies) {
+            List<LbStickinessPolicy> stickinessPolicies, List<LbHealthCheckPolicy> healthCheckPolicies, Ip sourceIp) {
         this.lb = lb;
         this.destinations = destinations;
         this.stickinessPolicies = stickinessPolicies;
         this.healthCheckPolicies = healthCheckPolicies;
+        this.sourceIp = sourceIp;
     }
 
-    @Override
     public long getId() {
         return lb.getId();
     }
 
-    @Override
-    public long getAccountId() {
-        return lb.getAccountId();
-    }
-
-    @Override
-    public long getDomainId() {
-        return lb.getDomainId();
-    }
-
-    @Override
     public String getName() {
         return lb.getName();
     }
 
-    @Override
     public String getDescription() {
         return lb.getDescription();
     }
 
-    @Override
     public int getDefaultPortStart() {
         return lb.getDefaultPortStart();
     }
 
-    @Override
     public int getDefaultPortEnd() {
         return lb.getDefaultPortEnd();
     }
 
-    @Override
     public String getAlgorithm() {
         return lb.getAlgorithm();
     }
 
-    @Override
     public String getUuid() {
         return lb.getUuid();
     }
 
-    @Override
     public String getXid() {
         return lb.getXid();
     }
 
-    @Override
-    public Long getSourceIpAddressId() {
-        return lb.getSourceIpAddressId();
-    }
-
-    @Override
     public Integer getSourcePortStart() {
         return lb.getSourcePortStart();
     }
 
-    @Override
     public Integer getSourcePortEnd() {
         return lb.getSourcePortEnd();
     }
 
-    @Override
     public String getProtocol() {
         return lb.getProtocol();
     }
 
-    @Override
-    public Purpose getPurpose() {
-        return Purpose.LoadBalancing;
+    public FirewallRule.Purpose getPurpose() {
+        return FirewallRule.Purpose.LoadBalancing;
     }
 
-    @Override
-    public State getState() {
+    public FirewallRule.State getState() {
         return lb.getState();
     }
 
-    @Override
     public long getNetworkId() {
         return lb.getNetworkId();
     }
 
-    public LoadBalancer getLb() {
-        return lb;
-    }
 
     public void setDestinations(List<LbDestination> destinations) {
         this.destinations = destinations;
@@ -287,36 +259,6 @@ public class LoadBalancingRule implements FirewallRule, LoadBalancer {
         }
     }
 
-    @Override
-    public Integer getIcmpCode() {
-        return null;
-    }
-
-    @Override
-    public Integer getIcmpType() {
-        return null;
-    }
-
-    @Override
-    public List<String> getSourceCidrList() {
-        return null;
-    }
-
-    @Override
-    public Long getRelated() {
-        return null;
-    }
-
-    @Override
-    public TrafficType getTrafficType() {
-        return null;
-    }
-
-    @Override
-    public FirewallRuleType getType() {
-        return FirewallRuleType.User;
-    }
-
     public LbAutoScaleVmGroup getAutoScaleVmGroup() {
         return autoScaleVmGroup;
     }
@@ -473,4 +415,11 @@ public class LoadBalancingRule implements FirewallRule, LoadBalancer {
         }
     }
 
+    public Ip getSourceIp() {
+        return sourceIp;
+    }
+
+    public Scheme getScheme() {
+        return lb.getScheme();
+    }
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2660a6b7/api/src/com/cloud/network/lb/LoadBalancingRulesService.java
----------------------------------------------------------------------
diff --git a/api/src/com/cloud/network/lb/LoadBalancingRulesService.java b/api/src/com/cloud/network/lb/LoadBalancingRulesService.java
index ed39bed..5fc41e3 100644
--- a/api/src/com/cloud/network/lb/LoadBalancingRulesService.java
+++ b/api/src/com/cloud/network/lb/LoadBalancingRulesService.java
@@ -17,10 +17,10 @@
 package com.cloud.network.lb;
 
 import java.util.List;
+import java.util.Map;
 
 import org.apache.cloudstack.api.command.user.loadbalancer.CreateLBHealthCheckPolicyCmd;
 import org.apache.cloudstack.api.command.user.loadbalancer.CreateLBStickinessPolicyCmd;
-import org.apache.cloudstack.api.command.user.loadbalancer.CreateLoadBalancerRuleCmd;
 import org.apache.cloudstack.api.command.user.loadbalancer.ListLBHealthCheckPoliciesCmd;
 import org.apache.cloudstack.api.command.user.loadbalancer.ListLBStickinessPoliciesCmd;
 import org.apache.cloudstack.api.command.user.loadbalancer.ListLoadBalancerRuleInstancesCmd;
@@ -30,12 +30,13 @@ import org.apache.cloudstack.api.command.user.loadbalancer.UpdateLoadBalancerRul
 import com.cloud.exception.InsufficientAddressCapacityException;
 import com.cloud.exception.NetworkRuleConflictException;
 import com.cloud.exception.ResourceUnavailableException;
-import com.cloud.network.lb.LoadBalancingRule.LbStickinessPolicy;
 import com.cloud.network.rules.HealthCheckPolicy;
 import com.cloud.network.rules.LoadBalancer;
+import com.cloud.network.rules.LoadBalancerContainer.Scheme;
 import com.cloud.network.rules.StickinessPolicy;
 import com.cloud.uservm.UserVm;
 import com.cloud.utils.Pair;
+import com.cloud.utils.net.Ip;
 
 
 public interface LoadBalancingRulesService {
@@ -49,7 +50,9 @@ public interface LoadBalancingRulesService {
      * @return the newly created LoadBalancerVO if successful, null otherwise
      * @throws InsufficientAddressCapacityException
      */
-    LoadBalancer createLoadBalancerRule(CreateLoadBalancerRuleCmd lb, boolean openFirewall) throws NetworkRuleConflictException, InsufficientAddressCapacityException;
+    LoadBalancer createPublicLoadBalancerRule(String xId, String name, String description, 
+            int srcPortStart, int srcPortEnd, int defPortStart, int defPortEnd, Long ipAddrId, String protocol, String algorithm,
+            long networkId, long lbOwnerId, boolean openFirewall) throws NetworkRuleConflictException, InsufficientAddressCapacityException;
 
     LoadBalancer updateLoadBalancerRule(UpdateLoadBalancerRuleCmd cmd);
 
@@ -134,8 +137,9 @@ public interface LoadBalancingRulesService {
 
     List<? extends HealthCheckPolicy> searchForLBHealthCheckPolicies(ListLBHealthCheckPoliciesCmd cmd);
 
-    List<LoadBalancingRule> listByNetworkId(long networkId);
-
     LoadBalancer findById(long LoadBalancer);
-   public void updateLBHealthChecks() throws ResourceUnavailableException;
+    
+    public void updateLBHealthChecks(Scheme scheme) throws ResourceUnavailableException;
+
+    Map<Ip, UserVm> getLbInstances(long lbId);
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2660a6b7/api/src/com/cloud/network/router/VirtualRouter.java
----------------------------------------------------------------------
diff --git a/api/src/com/cloud/network/router/VirtualRouter.java b/api/src/com/cloud/network/router/VirtualRouter.java
index d7239dd..2311f48 100755
--- a/api/src/com/cloud/network/router/VirtualRouter.java
+++ b/api/src/com/cloud/network/router/VirtualRouter.java
@@ -23,7 +23,7 @@ import com.cloud.vm.VirtualMachine;
  */
 public interface VirtualRouter extends VirtualMachine {
 	public enum Role {
-		VIRTUAL_ROUTER, LB
+		VIRTUAL_ROUTER, LB, INTERNAL_LB_VM
 	}
     Role getRole();
     boolean getIsRedundantRouter();

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2660a6b7/api/src/com/cloud/network/rules/LoadBalancer.java
----------------------------------------------------------------------
diff --git a/api/src/com/cloud/network/rules/LoadBalancer.java b/api/src/com/cloud/network/rules/LoadBalancer.java
index ab6085a..e6dadca 100644
--- a/api/src/com/cloud/network/rules/LoadBalancer.java
+++ b/api/src/com/cloud/network/rules/LoadBalancer.java
@@ -19,16 +19,10 @@ package com.cloud.network.rules;
 /**
  * Definition for a LoadBalancer
  */
-public interface LoadBalancer extends FirewallRule {
-
-    String getName();
-
-    String getDescription();
-
+public interface LoadBalancer extends FirewallRule, LoadBalancerContainer {
+    
     int getDefaultPortStart();
 
     int getDefaultPortEnd();
 
-    String getAlgorithm();
-
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2660a6b7/api/src/com/cloud/network/rules/LoadBalancerContainer.java
----------------------------------------------------------------------
diff --git a/api/src/com/cloud/network/rules/LoadBalancerContainer.java b/api/src/com/cloud/network/rules/LoadBalancerContainer.java
new file mode 100644
index 0000000..9d5ea59
--- /dev/null
+++ b/api/src/com/cloud/network/rules/LoadBalancerContainer.java
@@ -0,0 +1,33 @@
+// 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.rules;
+
+public interface LoadBalancerContainer {
+    
+    public enum Scheme {
+        Public, Internal;
+    }
+
+    String getName();
+
+    String getDescription();
+    
+    String getAlgorithm();
+    
+    Scheme getScheme();
+
+}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2660a6b7/api/src/com/cloud/offering/NetworkOffering.java
----------------------------------------------------------------------
diff --git a/api/src/com/cloud/offering/NetworkOffering.java b/api/src/com/cloud/offering/NetworkOffering.java
index 6f0b993..72e2a2b 100644
--- a/api/src/com/cloud/offering/NetworkOffering.java
+++ b/api/src/com/cloud/offering/NetworkOffering.java
@@ -16,6 +16,8 @@
 // under the License.
 package com.cloud.offering;
 
+import java.util.Map;
+
 import org.apache.cloudstack.acl.InfrastructureEntity;
 import org.apache.cloudstack.api.Identity;
 import org.apache.cloudstack.api.InternalIdentity;
@@ -38,6 +40,11 @@ public interface NetworkOffering extends InfrastructureEntity, InternalIdentity,
         Disabled,
         Enabled
     }
+    
+    public enum Detail {
+        InternalLbProvider,
+        PublicLbProvider
+    }
 
     public final static String SystemPublicNetwork = "System-Public-Network";
     public final static String SystemControlNetwork = "System-Control-Network";
@@ -116,5 +123,9 @@ public interface NetworkOffering extends InfrastructureEntity, InternalIdentity,
     boolean isInline();
 
     boolean getIsPersistent();
+    
+    boolean getInternalLb();
+
+    boolean getPublicLb();
 
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2660a6b7/api/src/com/cloud/offering/ServiceOffering.java
----------------------------------------------------------------------
diff --git a/api/src/com/cloud/offering/ServiceOffering.java b/api/src/com/cloud/offering/ServiceOffering.java
index d6c215f..165369c 100755
--- a/api/src/com/cloud/offering/ServiceOffering.java
+++ b/api/src/com/cloud/offering/ServiceOffering.java
@@ -30,6 +30,7 @@ public interface ServiceOffering extends InfrastructureEntity, InternalIdentity,
     public static final String ssvmDefaultOffUniqueName = "Cloud.com-SecondaryStorage";
     public static final String routerDefaultOffUniqueName = "Cloud.Com-SoftwareRouter";
     public static final String elbVmDefaultOffUniqueName = "Cloud.Com-ElasticLBVm";
+    public static final String internalLbVmDefaultOffUniqueName = "Cloud.Com-InternalLBVm";
 
     public enum StorageType {
         local,

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2660a6b7/api/src/com/cloud/vm/VirtualMachine.java
----------------------------------------------------------------------
diff --git a/api/src/com/cloud/vm/VirtualMachine.java b/api/src/com/cloud/vm/VirtualMachine.java
index 8f807d4..ce9add6 100755
--- a/api/src/com/cloud/vm/VirtualMachine.java
+++ b/api/src/com/cloud/vm/VirtualMachine.java
@@ -186,6 +186,7 @@ public interface VirtualMachine extends RunningOn, ControlledEntity, Identity, I
         SecondaryStorageVm,
         ElasticIpVm,
         ElasticLoadBalancerVm,
+        InternalLoadBalancerVm,
 
         /*
          * UserBareMetal is only used for selecting VirtualMachineGuru, there is no
@@ -196,7 +197,7 @@ public interface VirtualMachine extends RunningOn, ControlledEntity, Identity, I
         public static boolean isSystemVM(VirtualMachine.Type vmtype) {
             if (DomainRouter.equals(vmtype)
                     || ConsoleProxy.equals(vmtype)
-                    || SecondaryStorageVm.equals(vmtype)) {
+                    || SecondaryStorageVm.equals(vmtype) || InternalLoadBalancerVm.equals(vmtype)) {
                 return true;
             }
             return false;

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2660a6b7/api/src/org/apache/cloudstack/api/ApiConstants.java
----------------------------------------------------------------------
diff --git a/api/src/org/apache/cloudstack/api/ApiConstants.java b/api/src/org/apache/cloudstack/api/ApiConstants.java
index d57fe05..c76506a 100755
--- a/api/src/org/apache/cloudstack/api/ApiConstants.java
+++ b/api/src/org/apache/cloudstack/api/ApiConstants.java
@@ -480,6 +480,12 @@ public class ApiConstants {
     public static final String HEALTHCHECK_HEALTHY_THRESHOLD = "healthythreshold";
     public static final String HEALTHCHECK_UNHEALTHY_THRESHOLD = "unhealthythreshold";
     public static final String HEALTHCHECK_PINGPATH = "pingpath";
+    public static final String SOURCE_PORT = "sourceport";
+    public static final String INSTANCE_PORT = "instanceport";
+    public static final String SOURCE_IP = "sourceipaddress";
+    public static final String SOURCE_IP_NETWORK_ID = "sourceipaddressnetworkid";
+    public static final String SCHEME = "scheme";
+    public static final String PROVIDER_TYPE = "providertype";
     public static final String AFFINITY_GROUP_IDS = "affinitygroupids";
     public static final String AFFINITY_GROUP_NAMES = "affinitygroupnames";
     public static final String ASA_INSIDE_PORT_PROFILE = "insideportprofile";

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2660a6b7/api/src/org/apache/cloudstack/api/BaseCmd.java
----------------------------------------------------------------------
diff --git a/api/src/org/apache/cloudstack/api/BaseCmd.java b/api/src/org/apache/cloudstack/api/BaseCmd.java
index 48d18d0..8d66a83 100644
--- a/api/src/org/apache/cloudstack/api/BaseCmd.java
+++ b/api/src/org/apache/cloudstack/api/BaseCmd.java
@@ -28,6 +28,9 @@ import java.util.regex.Pattern;
 import javax.inject.Inject;
 
 import org.apache.cloudstack.affinity.AffinityGroupService;
+import org.apache.cloudstack.network.element.InternalLoadBalancerElementService;
+import org.apache.cloudstack.network.lb.ApplicationLoadBalancerService;
+import org.apache.cloudstack.network.lb.InternalLoadBalancerVMService;
 import org.apache.cloudstack.query.QueryService;
 import org.apache.cloudstack.usage.UsageService;
 import org.apache.log4j.Logger;
@@ -139,7 +142,11 @@ public abstract class BaseCmd {
     @Inject public VMSnapshotService _vmSnapshotService;
     @Inject public DataStoreProviderApiService dataStoreProviderApiService;
     @Inject public VpcProvisioningService _vpcProvSvc;
+    @Inject public ApplicationLoadBalancerService _newLbSvc;
+    @Inject public ApplicationLoadBalancerService _appLbService;
     @Inject public AffinityGroupService _affinityGroupService;
+    @Inject public InternalLoadBalancerElementService _internalLbElementSvc;
+    @Inject public InternalLoadBalancerVMService _internalLbSvc;
     @Inject public NetworkModel _ntwkModel;
 
     public abstract void execute() throws ResourceUnavailableException, InsufficientCapacityException, ServerApiException, ConcurrentOperationException, ResourceAllocationException, NetworkRuleConflictException;

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2660a6b7/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 3433003..ab8f995 100644
--- a/api/src/org/apache/cloudstack/api/ResponseGenerator.java
+++ b/api/src/org/apache/cloudstack/api/ResponseGenerator.java
@@ -19,14 +19,15 @@ package org.apache.cloudstack.api;
 import java.text.DecimalFormat;
 import java.util.EnumSet;
 import java.util.List;
+import java.util.Map;
 
-import com.cloud.vm.NicSecondaryIp;
 import org.apache.cloudstack.affinity.AffinityGroup;
 import org.apache.cloudstack.affinity.AffinityGroupResponse;
 import org.apache.cloudstack.api.ApiConstants.HostDetails;
 import org.apache.cloudstack.api.ApiConstants.VMDetails;
 import org.apache.cloudstack.api.command.user.job.QueryAsyncJobResultCmd;
 import org.apache.cloudstack.api.response.AccountResponse;
+import org.apache.cloudstack.api.response.ApplicationLoadBalancerResponse;
 import org.apache.cloudstack.api.response.AsyncJobResponse;
 import org.apache.cloudstack.api.response.AutoScalePolicyResponse;
 import org.apache.cloudstack.api.response.AutoScaleVmGroupResponse;
@@ -44,11 +45,15 @@ import org.apache.cloudstack.api.response.EventResponse;
 import org.apache.cloudstack.api.response.ExtractResponse;
 import org.apache.cloudstack.api.response.FirewallResponse;
 import org.apache.cloudstack.api.response.FirewallRuleResponse;
+import org.apache.cloudstack.api.response.GlobalLoadBalancerResponse;
 import org.apache.cloudstack.api.response.GuestOSResponse;
+import org.apache.cloudstack.api.response.GuestVlanRangeResponse;
+import org.apache.cloudstack.api.response.HostForMigrationResponse;
 import org.apache.cloudstack.api.response.HostResponse;
 import org.apache.cloudstack.api.response.HypervisorCapabilitiesResponse;
 import org.apache.cloudstack.api.response.IPAddressResponse;
 import org.apache.cloudstack.api.response.InstanceGroupResponse;
+import org.apache.cloudstack.api.response.InternalLoadBalancerElementResponse;
 import org.apache.cloudstack.api.response.IpForwardingRuleResponse;
 import org.apache.cloudstack.api.response.IsolationMethodResponse;
 import org.apache.cloudstack.api.response.LBHealthCheckResponse;
@@ -84,6 +89,7 @@ import org.apache.cloudstack.api.response.SnapshotResponse;
 import org.apache.cloudstack.api.response.SnapshotScheduleResponse;
 import org.apache.cloudstack.api.response.StaticRouteResponse;
 import org.apache.cloudstack.api.response.StorageNetworkIpRangeResponse;
+import org.apache.cloudstack.api.response.StoragePoolForMigrationResponse;
 import org.apache.cloudstack.api.response.StoragePoolResponse;
 import org.apache.cloudstack.api.response.SwiftResponse;
 import org.apache.cloudstack.api.response.SystemVmInstanceResponse;
@@ -103,6 +109,7 @@ import org.apache.cloudstack.api.response.VpcOfferingResponse;
 import org.apache.cloudstack.api.response.VpcResponse;
 import org.apache.cloudstack.api.response.VpnUsersResponse;
 import org.apache.cloudstack.api.response.ZoneResponse;
+import org.apache.cloudstack.network.lb.ApplicationLoadBalancerRule;
 import org.apache.cloudstack.region.Region;
 import org.apache.cloudstack.usage.Usage;
 
@@ -119,10 +126,25 @@ import com.cloud.domain.Domain;
 import com.cloud.event.Event;
 import com.cloud.host.Host;
 import com.cloud.hypervisor.HypervisorCapabilities;
-import com.cloud.network.*;
+import com.cloud.network.GuestVlan;
+import com.cloud.network.IpAddress;
+import com.cloud.network.Network;
 import com.cloud.network.Network.Service;
 import com.cloud.network.Networks.IsolationType;
-import com.cloud.network.as.*;
+import com.cloud.network.PhysicalNetwork;
+import com.cloud.network.PhysicalNetworkServiceProvider;
+import com.cloud.network.PhysicalNetworkTrafficType;
+import com.cloud.network.RemoteAccessVpn;
+import com.cloud.network.Site2SiteCustomerGateway;
+import com.cloud.network.Site2SiteVpnConnection;
+import com.cloud.network.Site2SiteVpnGateway;
+import com.cloud.network.VirtualRouterProvider;
+import com.cloud.network.VpnUser;
+import com.cloud.network.as.AutoScalePolicy;
+import com.cloud.network.as.AutoScaleVmGroup;
+import com.cloud.network.as.AutoScaleVmProfile;
+import com.cloud.network.as.Condition;
+import com.cloud.network.as.Counter;
 import com.cloud.network.router.VirtualRouter;
 import com.cloud.network.rules.FirewallRule;
 import com.cloud.network.rules.HealthCheckPolicy;
@@ -145,7 +167,12 @@ import com.cloud.projects.ProjectAccount;
 import com.cloud.projects.ProjectInvitation;
 import com.cloud.region.ha.GlobalLoadBalancerRule;
 import com.cloud.server.ResourceTag;
-import com.cloud.storage.*;
+import com.cloud.storage.GuestOS;
+import com.cloud.storage.S3;
+import com.cloud.storage.Snapshot;
+import com.cloud.storage.StoragePool;
+import com.cloud.storage.Swift;
+import com.cloud.storage.Volume;
 import com.cloud.storage.snapshot.SnapshotPolicy;
 import com.cloud.storage.snapshot.SnapshotSchedule;
 import com.cloud.template.VirtualMachineTemplate;
@@ -153,11 +180,12 @@ import com.cloud.user.Account;
 import com.cloud.user.User;
 import com.cloud.user.UserAccount;
 import com.cloud.uservm.UserVm;
+import com.cloud.utils.net.Ip;
 import com.cloud.vm.InstanceGroup;
 import com.cloud.vm.Nic;
-import com.cloud.vm.snapshot.VMSnapshot;
+import com.cloud.vm.NicSecondaryIp;
 import com.cloud.vm.VirtualMachine;
-import org.apache.cloudstack.api.response.*;
+import com.cloud.vm.snapshot.VMSnapshot;
 
 public interface ResponseGenerator {
     UserResponse createUserResponse(UserAccount user);
@@ -397,9 +425,13 @@ public interface ResponseGenerator {
     NicSecondaryIpResponse createSecondaryIPToNicResponse(NicSecondaryIp result);
     public NicResponse createNicResponse(Nic result);
 
+    ApplicationLoadBalancerResponse createLoadBalancerContainerReponse(ApplicationLoadBalancerRule lb, Map<Ip, UserVm> lbInstances);
+    
     AffinityGroupResponse createAffinityGroupResponse(AffinityGroup group);
 
     Long getAffinityGroupId(String name, long entityOwnerId);
 
+    InternalLoadBalancerElementResponse createInternalLbElementResponse(VirtualRouterProvider result);
+    
     IsolationMethodResponse createIsolationMethodResponse(IsolationType method);
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2660a6b7/api/src/org/apache/cloudstack/api/command/admin/internallb/ConfigureInternalLoadBalancerElementCmd.java
----------------------------------------------------------------------
diff --git a/api/src/org/apache/cloudstack/api/command/admin/internallb/ConfigureInternalLoadBalancerElementCmd.java b/api/src/org/apache/cloudstack/api/command/admin/internallb/ConfigureInternalLoadBalancerElementCmd.java
new file mode 100644
index 0000000..7c3d1e9
--- /dev/null
+++ b/api/src/org/apache/cloudstack/api/command/admin/internallb/ConfigureInternalLoadBalancerElementCmd.java
@@ -0,0 +1,114 @@
+// 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 org.apache.cloudstack.api.command.admin.internallb;
+
+import java.util.List;
+
+import javax.inject.Inject;
+
+import org.apache.cloudstack.api.APICommand;
+import org.apache.cloudstack.api.ApiConstants;
+import org.apache.cloudstack.api.ApiErrorCode;
+import org.apache.cloudstack.api.BaseAsyncCmd;
+import org.apache.cloudstack.api.Parameter;
+import org.apache.cloudstack.api.ServerApiException;
+import org.apache.cloudstack.api.response.InternalLoadBalancerElementResponse;
+import org.apache.cloudstack.network.element.InternalLoadBalancerElementService;
+import org.apache.log4j.Logger;
+
+import com.cloud.event.EventTypes;
+import com.cloud.exception.ConcurrentOperationException;
+import com.cloud.exception.InsufficientCapacityException;
+import com.cloud.exception.ResourceUnavailableException;
+import com.cloud.network.VirtualRouterProvider;
+import com.cloud.user.Account;
+import com.cloud.user.UserContext;
+
+@APICommand(name = "configureInternalLoadBalancerElement", responseObject=InternalLoadBalancerElementResponse.class,
+            description="Configures an Internal Load Balancer element.", since="4.2.0")
+public class ConfigureInternalLoadBalancerElementCmd extends BaseAsyncCmd {
+    public static final Logger s_logger = Logger.getLogger(ConfigureInternalLoadBalancerElementCmd.class.getName());
+    private static final String s_name = "configureinternalloadbalancerelementresponse";
+
+    @Inject
+    private List<InternalLoadBalancerElementService> _service;
+
+    /////////////////////////////////////////////////////
+    //////////////// API parameters /////////////////////
+    /////////////////////////////////////////////////////
+
+    @Parameter(name=ApiConstants.ID, type=CommandType.UUID, entityType = InternalLoadBalancerElementResponse.class,
+            required=true, description="the ID of the internal lb provider")
+    private Long id;
+
+    @Parameter(name=ApiConstants.ENABLED, type=CommandType.BOOLEAN, required=true, description="Enables/Disables the Internal Load Balancer element")
+    private Boolean enabled;
+
+    /////////////////////////////////////////////////////
+    /////////////////// Accessors ///////////////////////
+    /////////////////////////////////////////////////////
+
+
+    public Long getId() {
+        return id;
+    }
+
+    public Boolean getEnabled() {
+        return enabled;
+    }
+
+    /////////////////////////////////////////////////////
+    /////////////// API Implementation///////////////////
+    /////////////////////////////////////////////////////
+
+    @Override
+    public String getCommandName() {
+        return s_name;
+    }
+
+    @Override
+    public long getEntityOwnerId() {
+        return Account.ACCOUNT_ID_SYSTEM;
+    }
+
+    @Override
+    public String getEventType() {
+        return EventTypes.EVENT_NETWORK_ELEMENT_CONFIGURE;
+    }
+
+    @Override
+    public String getEventDescription() {
+        return  "configuring internal load balancer element: " + id;
+    }
+
+    @Override
+    public void execute() throws ConcurrentOperationException, ResourceUnavailableException, InsufficientCapacityException{
+        s_logger.debug("hello alena");
+        UserContext.current().setEventDetails("Internal load balancer element: " + id);
+        s_logger.debug("hello alena");
+        VirtualRouterProvider result = _service.get(0).configureInternalLoadBalancerElement(getId(), getEnabled());
+        s_logger.debug("hello alena");
+        if (result != null){
+            InternalLoadBalancerElementResponse routerResponse = _responseGenerator.createInternalLbElementResponse(result);
+            routerResponse.setResponseName(getCommandName());
+            this.setResponseObject(routerResponse);
+        } else {
+            throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to configure the internal load balancer element");
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2660a6b7/api/src/org/apache/cloudstack/api/command/admin/internallb/CreateInternalLoadBalancerElementCmd.java
----------------------------------------------------------------------
diff --git a/api/src/org/apache/cloudstack/api/command/admin/internallb/CreateInternalLoadBalancerElementCmd.java b/api/src/org/apache/cloudstack/api/command/admin/internallb/CreateInternalLoadBalancerElementCmd.java
new file mode 100644
index 0000000..2902f7a
--- /dev/null
+++ b/api/src/org/apache/cloudstack/api/command/admin/internallb/CreateInternalLoadBalancerElementCmd.java
@@ -0,0 +1,116 @@
+// 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 org.apache.cloudstack.api.command.admin.internallb;
+
+import java.util.List;
+
+import javax.inject.Inject;
+
+import org.apache.cloudstack.api.APICommand;
+import org.apache.cloudstack.api.ApiConstants;
+import org.apache.cloudstack.api.ApiErrorCode;
+import org.apache.cloudstack.api.BaseAsyncCreateCmd;
+import org.apache.cloudstack.api.Parameter;
+import org.apache.cloudstack.api.ServerApiException;
+import org.apache.cloudstack.api.response.InternalLoadBalancerElementResponse;
+import org.apache.cloudstack.api.response.ProviderResponse;
+import org.apache.cloudstack.network.element.InternalLoadBalancerElementService;
+import org.apache.log4j.Logger;
+
+import com.cloud.event.EventTypes;
+import com.cloud.exception.ResourceAllocationException;
+import com.cloud.network.VirtualRouterProvider;
+import com.cloud.user.Account;
+import com.cloud.user.UserContext;
+
+@APICommand(name = "createInternalLoadBalancerElement", responseObject=InternalLoadBalancerElementResponse.class, description="Create an Internal Load Balancer element.",since="4.2.0")
+public class CreateInternalLoadBalancerElementCmd extends BaseAsyncCreateCmd {
+    public static final Logger s_logger = Logger.getLogger(CreateInternalLoadBalancerElementCmd.class.getName());
+    private static final String s_name = "createinternalloadbalancerelementresponse";
+
+    @Inject
+    private List<InternalLoadBalancerElementService> _service;
+
+    /////////////////////////////////////////////////////
+    //////////////// API parameters /////////////////////
+    /////////////////////////////////////////////////////
+
+    @Parameter(name=ApiConstants.NETWORK_SERVICE_PROVIDER_ID, type=CommandType.UUID, entityType = ProviderResponse.class, required=true, description="the network service provider ID of the internal load balancer element")
+    private Long nspId;
+
+    /////////////////////////////////////////////////////
+    /////////////////// Accessors ///////////////////////
+    /////////////////////////////////////////////////////
+
+    public void setNspId(Long nspId) {
+        this.nspId = nspId;
+    }
+
+    public Long getNspId() {
+        return nspId;
+    }
+
+    /////////////////////////////////////////////////////
+    /////////////// API Implementation///////////////////
+    /////////////////////////////////////////////////////
+
+
+
+    @Override
+    public String getCommandName() {
+        return s_name;
+    }
+
+    @Override
+    public long getEntityOwnerId() {
+        return Account.ACCOUNT_ID_SYSTEM;
+    }
+
+    @Override
+    public void execute(){
+        UserContext.current().setEventDetails("Virtual router element Id: "+getEntityId());
+        VirtualRouterProvider result = _service.get(0).getInternalLoadBalancerElement(getEntityId());
+        if (result != null) {
+            InternalLoadBalancerElementResponse response = _responseGenerator.createInternalLbElementResponse(result);
+            response.setResponseName(getCommandName());
+            this.setResponseObject(response);
+        }else {
+            throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to add Virtual Router entity to physical network");
+        }
+    }
+
+    @Override
+    public void create() throws ResourceAllocationException {
+        VirtualRouterProvider result = _service.get(0).addInternalLoadBalancerElement(getNspId());
+        if (result != null) {
+            setEntityId(result.getId());
+            setEntityUuid(result.getUuid());
+        } else {
+            throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to add Internal Load Balancer entity to physical network");
+        }
+    }
+
+    @Override
+    public String getEventType() {
+        return EventTypes.EVENT_SERVICE_PROVIDER_CREATE;
+    }
+
+    @Override
+    public String getEventDescription() {
+        return  "Adding physical network element Internal Load Balancer: " + getEntityId();
+    }
+}


[16/50] [abbrv] CLOUDSTACK-747: Internal LB between VPC tiers support

Posted by ah...@apache.org.
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2660a6b7/server/src/com/cloud/network/lb/LBHealthCheckManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/lb/LBHealthCheckManagerImpl.java b/server/src/com/cloud/network/lb/LBHealthCheckManagerImpl.java
index 9054732..62b738b 100644
--- a/server/src/com/cloud/network/lb/LBHealthCheckManagerImpl.java
+++ b/server/src/com/cloud/network/lb/LBHealthCheckManagerImpl.java
@@ -19,7 +19,6 @@ package com.cloud.network.lb;
 import static java.lang.String.format;
 
 import java.util.Map;
-
 import java.util.concurrent.Executors;
 import java.util.concurrent.ScheduledExecutorService;
 import java.util.concurrent.TimeUnit;
@@ -34,6 +33,7 @@ import org.springframework.stereotype.Component;
 import com.cloud.configuration.Config;
 import com.cloud.configuration.dao.ConfigurationDao;
 import com.cloud.exception.ResourceUnavailableException;
+import com.cloud.network.rules.LoadBalancerContainer.Scheme;
 import com.cloud.utils.NumbersUtil;
 import com.cloud.utils.component.Manager;
 import com.cloud.utils.component.ManagerBase;
@@ -90,7 +90,8 @@ public class LBHealthCheckManagerImpl extends ManagerBase implements LBHealthChe
         @Override
         public void run() {
             try {
-                updateLBHealthCheck();
+                updateLBHealthCheck(Scheme.Public);
+                updateLBHealthCheck(Scheme.Internal);
             } catch (Exception e) {
                 s_logger.error("Exception in LB HealthCheck Update Checker", e);
             }
@@ -98,9 +99,9 @@ public class LBHealthCheckManagerImpl extends ManagerBase implements LBHealthChe
     }
 
     @Override
-    public void updateLBHealthCheck() {
+    public void updateLBHealthCheck(Scheme scheme) {
         try {
-            _lbService.updateLBHealthChecks();
+            _lbService.updateLBHealthChecks(scheme);
         } catch (ResourceUnavailableException e) {
             s_logger.debug("Error while updating the LB HealtCheck ", e);
         }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2660a6b7/server/src/com/cloud/network/lb/LoadBalancingRulesManager.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/lb/LoadBalancingRulesManager.java b/server/src/com/cloud/network/lb/LoadBalancingRulesManager.java
index d98872a..a23d96f 100644
--- a/server/src/com/cloud/network/lb/LoadBalancingRulesManager.java
+++ b/server/src/com/cloud/network/lb/LoadBalancingRulesManager.java
@@ -16,23 +16,24 @@
 // under the License.
 package com.cloud.network.lb;
 
+import java.util.List;
+
 import com.cloud.exception.NetworkRuleConflictException;
 import com.cloud.exception.ResourceUnavailableException;
-import com.cloud.network.Network;
 import com.cloud.network.lb.LoadBalancingRule.LbDestination;
 import com.cloud.network.lb.LoadBalancingRule.LbHealthCheckPolicy;
 import com.cloud.network.lb.LoadBalancingRule.LbStickinessPolicy;
-import com.cloud.network.rules.FirewallRule;
 import com.cloud.network.rules.LbStickinessMethod;
 import com.cloud.network.rules.LoadBalancer;
+import com.cloud.network.rules.LoadBalancerContainer.Scheme;
 import com.cloud.user.Account;
-import org.apache.cloudstack.api.command.user.loadbalancer.CreateLoadBalancerRuleCmd;
-
-import java.util.List;
+import com.cloud.user.UserContext;
 
 public interface LoadBalancingRulesManager extends LoadBalancingRulesService {
 
-    LoadBalancer createLoadBalancer(CreateLoadBalancerRuleCmd lb, boolean openFirewall) throws NetworkRuleConflictException;
+    LoadBalancer createPublicLoadBalancer(String xId, String name, String description, 
+            int srcPort, int destPort, long sourceIpId, String protocol, String algorithm, boolean openFirewall, UserContext caller)
+            throws NetworkRuleConflictException;
 
     boolean removeAllLoadBalanacersForIp(long ipId, Account caller, long callerUserId);
     boolean removeAllLoadBalanacersForNetwork(long networkId, Account caller, long callerUserId);
@@ -47,9 +48,14 @@ public interface LoadBalancingRulesManager extends LoadBalancingRulesService {
      * @return true if removal is successful
      */
     boolean removeVmFromLoadBalancers(long vmId);
-    boolean applyRules(Network network, FirewallRule.Purpose purpose, List<? extends FirewallRule> rules) throws ResourceUnavailableException ;
-    boolean applyLoadBalancersForNetwork(long networkId) throws ResourceUnavailableException;
+    boolean applyLoadBalancersForNetwork(long networkId, Scheme scheme) throws ResourceUnavailableException;
     String getLBCapability(long networkid, String capabilityName);
     boolean configureLbAutoScaleVmGroup(long vmGroupid, String currentState) throws ResourceUnavailableException;
-    boolean revokeLoadBalancersForNetwork(long networkId) throws ResourceUnavailableException;
+    boolean revokeLoadBalancersForNetwork(long networkId, Scheme scheme) throws ResourceUnavailableException;
+
+    boolean validateLbRule(LoadBalancingRule lbRule);
+
+    void removeLBRule(LoadBalancer rule);
+
+    void isLbServiceSupportedInNetwork(long networkId, Scheme scheme);
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2660a6b7/server/src/com/cloud/network/lb/LoadBalancingRulesManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/lb/LoadBalancingRulesManagerImpl.java b/server/src/com/cloud/network/lb/LoadBalancingRulesManagerImpl.java
index 7ad1070..520dd76 100755
--- a/server/src/com/cloud/network/lb/LoadBalancingRulesManagerImpl.java
+++ b/server/src/com/cloud/network/lb/LoadBalancingRulesManagerImpl.java
@@ -16,6 +16,34 @@
 // under the License.
 package com.cloud.network.lb;
 
+import java.security.InvalidParameterException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import javax.ejb.Local;
+import javax.inject.Inject;
+
+import org.apache.cloudstack.api.ApiConstants;
+import org.apache.cloudstack.api.command.user.loadbalancer.CreateLBHealthCheckPolicyCmd;
+import org.apache.cloudstack.api.command.user.loadbalancer.CreateLBStickinessPolicyCmd;
+import org.apache.cloudstack.api.command.user.loadbalancer.ListLBHealthCheckPoliciesCmd;
+import org.apache.cloudstack.api.command.user.loadbalancer.ListLBStickinessPoliciesCmd;
+import org.apache.cloudstack.api.command.user.loadbalancer.ListLoadBalancerRuleInstancesCmd;
+import org.apache.cloudstack.api.command.user.loadbalancer.ListLoadBalancerRulesCmd;
+import org.apache.cloudstack.api.command.user.loadbalancer.UpdateLoadBalancerRuleCmd;
+import org.apache.cloudstack.api.response.ServiceResponse;
+import org.apache.cloudstack.lb.ApplicationLoadBalancerRuleVO;
+import org.apache.cloudstack.lb.dao.ApplicationLoadBalancerRuleDao;
+import org.apache.log4j.Logger;
+import org.springframework.stereotype.Component;
+
 import com.cloud.agent.api.to.LoadBalancerTO;
 import com.cloud.configuration.Config;
 import com.cloud.configuration.ConfigurationManager;
@@ -30,21 +58,70 @@ import com.cloud.event.EventTypes;
 import com.cloud.event.UsageEventUtils;
 import com.cloud.event.dao.EventDao;
 import com.cloud.event.dao.UsageEventDao;
-import com.cloud.exception.*;
-import com.cloud.network.*;
+import com.cloud.exception.InsufficientAddressCapacityException;
+import com.cloud.exception.InvalidParameterValueException;
+import com.cloud.exception.NetworkRuleConflictException;
+import com.cloud.exception.PermissionDeniedException;
+import com.cloud.exception.ResourceUnavailableException;
+import com.cloud.network.ExternalLoadBalancerUsageManager;
+import com.cloud.network.IpAddress;
+import com.cloud.network.LBHealthCheckPolicyVO;
+import com.cloud.network.Network;
 import com.cloud.network.Network.Capability;
 import com.cloud.network.Network.Provider;
 import com.cloud.network.Network.Service;
-import com.cloud.network.as.*;
+import com.cloud.network.NetworkManager;
+import com.cloud.network.NetworkModel;
+import com.cloud.network.addr.PublicIp;
+import com.cloud.network.as.AutoScalePolicy;
+import com.cloud.network.as.AutoScalePolicyConditionMapVO;
+import com.cloud.network.as.AutoScaleVmGroup;
+import com.cloud.network.as.AutoScaleVmGroupPolicyMapVO;
+import com.cloud.network.as.AutoScaleVmGroupVO;
+import com.cloud.network.as.AutoScaleVmProfile;
 import com.cloud.network.as.Condition;
-import com.cloud.network.as.dao.*;
-import com.cloud.network.dao.*;
+import com.cloud.network.as.Counter;
+import com.cloud.network.as.dao.AutoScalePolicyConditionMapDao;
+import com.cloud.network.as.dao.AutoScalePolicyDao;
+import com.cloud.network.as.dao.AutoScaleVmGroupDao;
+import com.cloud.network.as.dao.AutoScaleVmGroupPolicyMapDao;
+import com.cloud.network.as.dao.AutoScaleVmProfileDao;
+import com.cloud.network.as.dao.ConditionDao;
+import com.cloud.network.as.dao.CounterDao;
+import com.cloud.network.dao.FirewallRulesCidrsDao;
+import com.cloud.network.dao.FirewallRulesDao;
+import com.cloud.network.dao.IPAddressDao;
+import com.cloud.network.dao.IPAddressVO;
+import com.cloud.network.dao.LBHealthCheckPolicyDao;
+import com.cloud.network.dao.LBStickinessPolicyDao;
+import com.cloud.network.dao.LBStickinessPolicyVO;
+import com.cloud.network.dao.LoadBalancerDao;
+import com.cloud.network.dao.LoadBalancerVMMapDao;
+import com.cloud.network.dao.LoadBalancerVMMapVO;
+import com.cloud.network.dao.LoadBalancerVO;
+import com.cloud.network.dao.NetworkDao;
+import com.cloud.network.dao.NetworkServiceMapDao;
+import com.cloud.network.dao.NetworkVO;
 import com.cloud.network.element.LoadBalancingServiceProvider;
-import com.cloud.network.lb.LoadBalancingRule.*;
-import com.cloud.network.rules.*;
+import com.cloud.network.lb.LoadBalancingRule.LbAutoScalePolicy;
+import com.cloud.network.lb.LoadBalancingRule.LbAutoScaleVmGroup;
+import com.cloud.network.lb.LoadBalancingRule.LbAutoScaleVmProfile;
+import com.cloud.network.lb.LoadBalancingRule.LbCondition;
+import com.cloud.network.lb.LoadBalancingRule.LbDestination;
+import com.cloud.network.lb.LoadBalancingRule.LbHealthCheckPolicy;
+import com.cloud.network.lb.LoadBalancingRule.LbStickinessPolicy;
+import com.cloud.network.rules.FirewallManager;
+import com.cloud.network.rules.FirewallRule;
 import com.cloud.network.rules.FirewallRule.FirewallRuleType;
 import com.cloud.network.rules.FirewallRule.Purpose;
+import com.cloud.network.rules.FirewallRuleVO;
+import com.cloud.network.rules.HealthCheckPolicy;
+import com.cloud.network.rules.LbStickinessMethod;
 import com.cloud.network.rules.LbStickinessMethod.LbStickinessMethodParam;
+import com.cloud.network.rules.LoadBalancer;
+import com.cloud.network.rules.LoadBalancerContainer.Scheme;
+import com.cloud.network.rules.RulesManager;
+import com.cloud.network.rules.StickinessPolicy;
 import com.cloud.network.vpc.VpcManager;
 import com.cloud.offering.NetworkOffering;
 import com.cloud.projects.Project.ListProjectResourcesCriteria;
@@ -53,15 +130,25 @@ import com.cloud.service.dao.ServiceOfferingDao;
 import com.cloud.storage.dao.VMTemplateDao;
 import com.cloud.tags.ResourceTagVO;
 import com.cloud.tags.dao.ResourceTagDao;
-import com.cloud.user.*;
+import com.cloud.user.Account;
+import com.cloud.user.AccountManager;
+import com.cloud.user.DomainService;
+import com.cloud.user.User;
+import com.cloud.user.UserContext;
 import com.cloud.user.dao.AccountDao;
 import com.cloud.user.dao.UserDao;
 import com.cloud.uservm.UserVm;
 import com.cloud.utils.Pair;
 import com.cloud.utils.Ternary;
 import com.cloud.utils.component.ManagerBase;
-import com.cloud.utils.db.*;
+import com.cloud.utils.db.DB;
+import com.cloud.utils.db.Filter;
+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.utils.net.Ip;
 import com.cloud.utils.net.NetUtils;
 import com.cloud.vm.Nic;
 import com.cloud.vm.UserVmVO;
@@ -70,21 +157,11 @@ import com.cloud.vm.dao.NicDao;
 import com.cloud.vm.dao.UserVmDao;
 import com.google.gson.Gson;
 import com.google.gson.reflect.TypeToken;
-import org.apache.cloudstack.api.ApiConstants;
-import org.apache.cloudstack.api.command.user.loadbalancer.*;
-import org.apache.cloudstack.api.response.ServiceResponse;
-import org.apache.log4j.Logger;
-import org.springframework.stereotype.Component;
-
-import javax.ejb.Local;
-import javax.inject.Inject;
-import java.security.InvalidParameterException;
-import java.util.*;
 
 @Component
 @Local(value = { LoadBalancingRulesManager.class, LoadBalancingRulesService.class })
 public class LoadBalancingRulesManagerImpl<Type> extends ManagerBase implements LoadBalancingRulesManager,
-        LoadBalancingRulesService, NetworkRuleApplier {
+        LoadBalancingRulesService {
     private static final Logger s_logger = Logger.getLogger(LoadBalancingRulesManagerImpl.class);
 
     @Inject
@@ -166,6 +243,7 @@ public class LoadBalancingRulesManagerImpl<Type> extends ManagerBase implements
     UserDao _userDao;
     @Inject
     List<LoadBalancingServiceProvider> _lbProviders;
+    @Inject ApplicationLoadBalancerRuleDao _appLbRuleDao;
 
     // Will return a string. For LB Stickiness this will be a json, for
     // autoscale this will be "," separated values
@@ -261,8 +339,9 @@ public class LoadBalancingRulesManagerImpl<Type> extends ManagerBase implements
          * Regular config like destinations need not be packed for applying
          * autoscale config as of today.
          */
-	List<LbStickinessPolicy> policyList = getStickinessPolicies(lb.getId());
-        LoadBalancingRule rule = new LoadBalancingRule(lb, null, policyList, null);
+        List<LbStickinessPolicy> policyList = getStickinessPolicies(lb.getId());
+        Ip sourceIp = getSourceIp(lb);
+        LoadBalancingRule rule = new LoadBalancingRule(lb, null, policyList, null, sourceIp);
         rule.setAutoScaleVmGroup(lbAutoScaleVmGroup);
 
         if (!isRollBackAllowedForProvider(lb)) {
@@ -273,7 +352,7 @@ public class LoadBalancingRulesManagerImpl<Type> extends ManagerBase implements
 
         List<LoadBalancingRule> rules = Arrays.asList(rule);
 
-        if (!_networkMgr.applyRules(rules, FirewallRule.Purpose.LoadBalancing, this, false)) {
+        if (!applyLbRules(rules, false)) {
             s_logger.debug("LB rules' autoscale config are not completely applied");
             return false;
         }
@@ -281,6 +360,17 @@ public class LoadBalancingRulesManagerImpl<Type> extends ManagerBase implements
         return true;
     }
 
+    private Ip getSourceIp(LoadBalancer lb) {
+        Ip sourceIp = null;
+        if (lb.getScheme() == Scheme.Public) {
+            sourceIp = _networkModel.getPublicIpAddress(lb.getSourceIpAddressId()).getAddress();
+        } else if (lb.getScheme() == Scheme.Internal) {
+            ApplicationLoadBalancerRuleVO appLbRule = _appLbRuleDao.findById(lb.getId());
+            sourceIp = appLbRule.getSourceIp();
+        }
+        return sourceIp;
+    }
+
     @Override
     @DB
     public boolean configureLbAutoScaleVmGroup(long vmGroupid, String currentState) throws ResourceUnavailableException {
@@ -454,9 +544,10 @@ public class LoadBalancingRulesManagerImpl<Type> extends ManagerBase implements
                 cmd.getStickinessMethodName(), cmd.getparamList(), cmd.getDescription());
         List<LbStickinessPolicy> policyList = new ArrayList<LbStickinessPolicy>();
         policyList.add(new LbStickinessPolicy(cmd.getStickinessMethodName(), lbpolicy.getParams()));
+        Ip sourceIp = getSourceIp(loadBalancer);
         LoadBalancingRule lbRule = new LoadBalancingRule(loadBalancer, getExistingDestinations(lbpolicy.getId()),
-                policyList, null);
-        if (!validateRule(lbRule)) {
+                policyList, null, sourceIp);
+        if (!validateLbRule(lbRule)) {
             throw new InvalidParameterValueException("Failed to create Stickiness policy: Validation Failed "
                     + cmd.getLbRuleId());
         }
@@ -539,7 +630,8 @@ public class LoadBalancingRulesManagerImpl<Type> extends ManagerBase implements
         return policy;
     }
 
-    private boolean validateRule(LoadBalancingRule lbRule) {
+    @Override
+    public boolean validateLbRule(LoadBalancingRule lbRule) {
         Network network = _networkDao.findById(lbRule.getNetworkId());
         Purpose purpose = lbRule.getPurpose();
         if (purpose != Purpose.LoadBalancing) {
@@ -748,7 +840,7 @@ public class LoadBalancingRulesManagerImpl<Type> extends ManagerBase implements
     // by CloudStack and update them in lbvmmap table
     @DB
     @Override
-    public void updateLBHealthChecks() throws ResourceUnavailableException {
+    public void updateLBHealthChecks(Scheme scheme) throws ResourceUnavailableException {
         List<LoadBalancerVO> rules = _lbDao.listAll();
         List<NetworkVO> networks = _networkDao.listAll();
         List<LoadBalancerTO> stateRules = null;
@@ -763,7 +855,7 @@ public class LoadBalancingRulesManagerImpl<Type> extends ManagerBase implements
                  * "HealthCheck Manager :: LB Provider in the Network has the Healthcheck policy capability :: "
                  * + provider.get(0).getName());
                  */
-                rules = _lbDao.listByNetworkId(network.getId());
+                rules = _lbDao.listByNetworkIdAndScheme(network.getId(), scheme);
                 if (rules != null && rules.size() > 0) {
                     List<LoadBalancingRule> lbrules = new ArrayList<LoadBalancingRule>();
                     for (LoadBalancerVO lb : rules) {
@@ -772,7 +864,8 @@ public class LoadBalancingRulesManagerImpl<Type> extends ManagerBase implements
                         // adding to lbrules list only if the LB rule
                         // hashealtChecks
                         if (hcPolicyList != null && hcPolicyList.size() > 0) {
-                            LoadBalancingRule loadBalancing = new LoadBalancingRule(lb, dstList, null, hcPolicyList);
+                            Ip sourceIp = getSourceIp(lb);
+                            LoadBalancingRule loadBalancing = new LoadBalancingRule(lb, dstList, null, hcPolicyList, sourceIp);
                             lbrules.add(loadBalancing);
                         }
                     }
@@ -1168,31 +1261,21 @@ public class LoadBalancingRulesManagerImpl<Type> extends ManagerBase implements
 
     @Override
     @ActionEvent(eventType = EventTypes.EVENT_LOAD_BALANCER_CREATE, eventDescription = "creating load balancer")
-    public LoadBalancer createLoadBalancerRule(CreateLoadBalancerRuleCmd lb, boolean openFirewall)
+    public LoadBalancer createPublicLoadBalancerRule(String xId, String name, String description, 
+            int srcPortStart, int srcPortEnd, int defPortStart, int defPortEnd, Long ipAddrId, String protocol, String algorithm, long networkId, long lbOwnerId, boolean openFirewall)
             throws NetworkRuleConflictException, InsufficientAddressCapacityException {
-        Account lbOwner = _accountMgr.getAccount(lb.getEntityOwnerId());
-
-        int defPortStart = lb.getDefaultPortStart();
-        int defPortEnd = lb.getDefaultPortEnd();
-
-        if (!NetUtils.isValidPort(defPortEnd)) {
-            throw new InvalidParameterValueException("privatePort is an invalid value: " + defPortEnd);
-        }
-        if (defPortStart > defPortEnd) {
-            throw new InvalidParameterValueException("private port range is invalid: " + defPortStart + "-"
-                    + defPortEnd);
-        }
-        if ((lb.getAlgorithm() == null) || !NetUtils.isValidAlgorithm(lb.getAlgorithm())) {
-            throw new InvalidParameterValueException("Invalid algorithm: " + lb.getAlgorithm());
+        Account lbOwner = _accountMgr.getAccount(lbOwnerId);
+        
+        if (srcPortStart != srcPortEnd) {
+            throw new InvalidParameterValueException("Port ranges are not supported by the load balancer");
         }
 
-        Long ipAddrId = lb.getSourceIpAddressId();
         IPAddressVO ipVO = null;
         if (ipAddrId != null) {
             ipVO = _ipAddressDao.findById(ipAddrId);
         }
 
-        Network network = _networkModel.getNetwork(lb.getNetworkId());
+        Network network = _networkModel.getNetwork(networkId);
 
         // FIXME: breaking the dependency on ELB manager. This breaks
         // functionality of ELB using virtual router
@@ -1204,8 +1287,7 @@ public class LoadBalancingRulesManagerImpl<Type> extends ManagerBase implements
             IpAddress systemIp = null;
             NetworkOffering off = _configMgr.getNetworkOffering(network.getNetworkOfferingId());
             if (off.getElasticLb() && ipVO == null && network.getVpcId() == null) {
-                systemIp = _networkMgr.assignSystemIp(lb.getNetworkId(), lbOwner, true, false);
-                lb.setSourceIpAddressId(systemIp.getId());
+                systemIp = _networkMgr.assignSystemIp(networkId, lbOwner, true, false);
                 ipVO = _ipAddressDao.findById(systemIp.getId());
             }
 
@@ -1224,11 +1306,11 @@ public class LoadBalancingRulesManagerImpl<Type> extends ManagerBase implements
                             && ipVO.getVpcId().longValue() == network.getVpcId();
                     if (assignToVpcNtwk) {
                         // set networkId just for verification purposes
-                        _networkModel.checkIpForService(ipVO, Service.Lb, lb.getNetworkId());
+                        _networkModel.checkIpForService(ipVO, Service.Lb, networkId);
 
-                        s_logger.debug("The ip is not associated with the VPC network id=" + lb.getNetworkId()
+                        s_logger.debug("The ip is not associated with the VPC network id=" + networkId
                                 + " so assigning");
-                        ipVO = _networkMgr.associateIPToGuestNetwork(ipAddrId, lb.getNetworkId(), false);
+                        ipVO = _networkMgr.associateIPToGuestNetwork(ipAddrId, networkId, false);
                         performedIpAssoc = true;
                     }
                 } else {
@@ -1240,10 +1322,7 @@ public class LoadBalancingRulesManagerImpl<Type> extends ManagerBase implements
                             + network);
                 }
 
-                if (lb.getSourceIpAddressId() == null) {
-                    throw new CloudRuntimeException("No ip address is defined to assign the LB to");
-                }
-                result = createLoadBalancer(lb, openFirewall);
+                result = createPublicLoadBalancer(xId, name, description, srcPortStart, defPortStart, ipVO.getId(), protocol, algorithm, openFirewall, UserContext.current());
             } catch (Exception ex) {
                 s_logger.warn("Failed to create load balancer due to ", ex);
                 if (ex instanceof NetworkRuleConflictException) {
@@ -1258,27 +1337,31 @@ public class LoadBalancingRulesManagerImpl<Type> extends ManagerBase implements
                 // release ip address if ipassoc was perfored
                 if (performedIpAssoc) {
                     ipVO = _ipAddressDao.findById(ipVO.getId());
-                    _vpcMgr.unassignIPFromVpcNetwork(ipVO.getId(), lb.getNetworkId());
+                    _vpcMgr.unassignIPFromVpcNetwork(ipVO.getId(), networkId);
                 }
             }
         }
 
         if (result == null) {
-            throw new CloudRuntimeException("Failed to create load balancer rule: " + lb.getName());
+            throw new CloudRuntimeException("Failed to create load balancer rule: " + name);
         }
 
         return result;
     }
 
-    @Override
     @DB
-    public LoadBalancer createLoadBalancer(CreateLoadBalancerRuleCmd lb, boolean openFirewall)
+    @Override
+    public LoadBalancer createPublicLoadBalancer(String xId, String name, String description, 
+            int srcPort, int destPort, long sourceIpId, String protocol, String algorithm, boolean openFirewall, UserContext caller)
             throws NetworkRuleConflictException {
-        UserContext caller = UserContext.current();
-        int srcPortStart = lb.getSourcePortStart();
-        int defPortStart = lb.getDefaultPortStart();
-        int srcPortEnd = lb.getSourcePortEnd();
-        long sourceIpId = lb.getSourceIpAddressId();
+        
+        if (!NetUtils.isValidPort(destPort)) {
+            throw new InvalidParameterValueException("privatePort is an invalid value: " + destPort);
+        }
+       
+        if ((algorithm == null) || !NetUtils.isValidAlgorithm(algorithm)) {
+            throw new InvalidParameterValueException("Invalid algorithm: " + algorithm);
+        }
 
         IPAddressVO ipAddr = _ipAddressDao.findById(sourceIpId);
         // make sure ip address exists
@@ -1293,6 +1376,9 @@ public class LoadBalancingRulesManagerImpl<Type> extends ManagerBase implements
             ex.addProxyObject(ipAddr, sourceIpId, "sourceIpId");
             throw ex;
         }
+        
+        _accountMgr.checkAccess(caller.getCaller(), null, true, ipAddr);
+
 
         Long networkId = ipAddr.getAssociatedWithNetworkId();
         if (networkId == null) {
@@ -1301,39 +1387,34 @@ public class LoadBalancingRulesManagerImpl<Type> extends ManagerBase implements
             ex.addProxyObject(ipAddr, sourceIpId, "sourceIpId");
             throw ex;
         }
-
-        _firewallMgr.validateFirewallRule(caller.getCaller(), ipAddr, srcPortStart, srcPortEnd, lb.getProtocol(),
-                Purpose.LoadBalancing, FirewallRuleType.User, networkId, null);
-        NetworkVO network = _networkDao.findById(networkId);
-        _accountMgr.checkAccess(caller.getCaller(), null, true, ipAddr);
-
+        
         // verify that lb service is supported by the network
-        if (!_networkModel.areServicesSupportedInNetwork(network.getId(), Service.Lb)) {
-            InvalidParameterValueException ex = new InvalidParameterValueException(
-                    "LB service is not supported in specified network id");
-            ex.addProxyObject(network, networkId, "networkId");
-            throw ex;
-        }
+        isLbServiceSupportedInNetwork(networkId, Scheme.Public);
 
-        Transaction txn = Transaction.currentTxn();
-        txn.start();
+        _firewallMgr.validateFirewallRule(caller.getCaller(), ipAddr, srcPort, srcPort, protocol,
+                Purpose.LoadBalancing, FirewallRuleType.User, networkId, null);
 
-        LoadBalancerVO newRule = new LoadBalancerVO(lb.getXid(), lb.getName(), lb.getDescription(),
-                lb.getSourceIpAddressId(), lb.getSourcePortEnd(), lb.getDefaultPortStart(), lb.getAlgorithm(),
-                network.getId(), ipAddr.getAllocatedToAccountId(), ipAddr.getAllocatedInDomainId());
+        LoadBalancerVO newRule = new LoadBalancerVO(xId, name, description,
+                sourceIpId, srcPort, srcPort, algorithm,
+                networkId, ipAddr.getAllocatedToAccountId(), ipAddr.getAllocatedInDomainId());
 
         // verify rule is supported by Lb provider of the network
+        Ip sourceIp = getSourceIp(newRule);
         LoadBalancingRule loadBalancing = new LoadBalancingRule(newRule, new ArrayList<LbDestination>(),
-                new ArrayList<LbStickinessPolicy>(), new ArrayList<LbHealthCheckPolicy>());
-        if (!validateRule(loadBalancing)) {
+                new ArrayList<LbStickinessPolicy>(), new ArrayList<LbHealthCheckPolicy>(), sourceIp);
+        if (!validateLbRule(loadBalancing)) {
             throw new InvalidParameterValueException("LB service provider cannot support this rule");
         }
 
+        Transaction txn = Transaction.currentTxn();
+        txn.start();
+        
         newRule = _lbDao.persist(newRule);
 
+        //create rule for all CIDRs
         if (openFirewall) {
-            _firewallMgr.createRuleForAllCidrs(sourceIpId, caller.getCaller(), lb.getSourcePortStart(),
-                    lb.getSourcePortEnd(), lb.getProtocol(), null, null, newRule.getId(), networkId);
+            _firewallMgr.createRuleForAllCidrs(sourceIpId, caller.getCaller(), srcPort,
+                    srcPort, protocol, null, null, newRule.getId(), networkId);
         }
 
         boolean success = true;
@@ -1344,7 +1425,7 @@ public class LoadBalancingRulesManagerImpl<Type> extends ManagerBase implements
                 throw new CloudRuntimeException("Unable to update the state to add for " + newRule);
             }
             s_logger.debug("Load balancer " + newRule.getId() + " for Ip address id=" + sourceIpId + ", public port "
-                    + srcPortStart + ", private port " + defPortStart + " is added successfully.");
+                    + srcPort + ", private port " + destPort + " is added successfully.");
             UserContext.current().setEventDetails("Load balancer Id: " + newRule.getId());
             UsageEventUtils.publishUsageEvent(EventTypes.EVENT_LOAD_BALANCER_CREATE, ipAddr.getAllocatedToAccountId(),
                     ipAddr.getDataCenterId(), newRule.getId(), null, LoadBalancingRule.class.getName(),
@@ -1380,14 +1461,17 @@ public class LoadBalancingRulesManagerImpl<Type> extends ManagerBase implements
             lbs = Arrays.asList(lb);
         } else {
             // get all rules in transition state
-            lbs = _lbDao.listInTransitionStateByNetworkId(lb.getNetworkId());
+            lbs = _lbDao.listInTransitionStateByNetworkIdAndScheme(lb.getNetworkId(), lb.getScheme());
         }
         return applyLoadBalancerRules(lbs, true);
     }
 
     @Override
-    public boolean revokeLoadBalancersForNetwork(long networkId) throws ResourceUnavailableException {
-        List<LoadBalancerVO> lbs = _lbDao.listByNetworkId(networkId);
+    public boolean revokeLoadBalancersForNetwork(long networkId, Scheme scheme) throws ResourceUnavailableException {
+        List<LoadBalancerVO> lbs = _lbDao.listByNetworkIdAndScheme(networkId, scheme);
+        if (s_logger.isDebugEnabled()) {
+            s_logger.debug("Revoking " + lbs.size() + " " + scheme + " load balancing rules for network id=" + networkId);
+        }
         if (lbs != null) {
             for(LoadBalancerVO lb : lbs) { // called during restart, not persisting state in db
                 lb.setState(FirewallRule.State.Revoke);
@@ -1400,20 +1484,20 @@ public class LoadBalancingRulesManagerImpl<Type> extends ManagerBase implements
     }
 
     @Override
-    public boolean applyLoadBalancersForNetwork(long networkId) throws ResourceUnavailableException {
-        List<LoadBalancerVO> lbs = _lbDao.listByNetworkId(networkId);
+    public boolean applyLoadBalancersForNetwork(long networkId, Scheme scheme) throws ResourceUnavailableException {
+        List<LoadBalancerVO> lbs = _lbDao.listByNetworkIdAndScheme(networkId, scheme);
         if (lbs != null) {
+            s_logger.debug("Applying load balancer rules of scheme " + scheme + " in network id=" + networkId);
             return applyLoadBalancerRules(lbs, true);
         } else {
-            s_logger.info("Network id=" + networkId + " doesn't have load balancer rules, nothing to apply");
+            s_logger.info("Network id=" + networkId + " doesn't have load balancer rules of scheme " + scheme + ", nothing to apply");
             return true;
         }
     }
 
-    @Override
-    public boolean applyRules(Network network, Purpose purpose, List<? extends FirewallRule> rules)
+    
+    protected boolean applyLbRules(Network network, List<LoadBalancingRule> rules)
             throws ResourceUnavailableException {
-        assert (purpose == Purpose.LoadBalancing) : "LB Manager asked to handle non-LB rules";
         boolean handled = false;
         for (LoadBalancingServiceProvider lbElement : _lbProviders) {
             Provider provider = lbElement.getProvider();
@@ -1422,7 +1506,7 @@ public class LoadBalancingRulesManagerImpl<Type> extends ManagerBase implements
             if (!isLbProvider) {
                 continue;
             }
-            handled = lbElement.applyLBRules(network, (List<LoadBalancingRule>) rules);
+            handled = lbElement.applyLBRules(network, rules);
             if (handled)
                 break;
         }
@@ -1432,7 +1516,8 @@ public class LoadBalancingRulesManagerImpl<Type> extends ManagerBase implements
     private LoadBalancingRule getLoadBalancerRuleToApply(LoadBalancerVO lb) {
 
         List<LbStickinessPolicy> policyList = getStickinessPolicies(lb.getId());
-        LoadBalancingRule loadBalancing = new LoadBalancingRule(lb, null, policyList, null);
+        Ip sourceIp = getSourceIp(lb);
+        LoadBalancingRule loadBalancing = new LoadBalancingRule(lb, null, policyList, null, sourceIp);
 
         if (_autoScaleVmGroupDao.isAutoScaleLoadBalancer(lb.getId())) {
             // Get the associated VmGroup
@@ -1442,7 +1527,7 @@ public class LoadBalancingRulesManagerImpl<Type> extends ManagerBase implements
         } else {
             List<LbDestination> dstList = getExistingDestinations(lb.getId());
             loadBalancing.setDestinations(dstList);
-	    List<LbHealthCheckPolicy> hcPolicyList = getHealthCheckPolicies(lb.getId());
+            List<LbHealthCheckPolicy> hcPolicyList = getHealthCheckPolicies(lb.getId());
             loadBalancing.setHealthCheckPolicies(hcPolicyList);
         }
 
@@ -1458,7 +1543,7 @@ public class LoadBalancingRulesManagerImpl<Type> extends ManagerBase implements
             rules.add(getLoadBalancerRuleToApply(lb));
         }
 
-        if (!_networkMgr.applyRules(rules, FirewallRule.Purpose.LoadBalancing, this, false)) {
+        if (!applyLbRules(rules, false)) {
             s_logger.debug("LB rules are not completely applied");
             return false;
         }
@@ -1515,7 +1600,7 @@ public class LoadBalancingRulesManagerImpl<Type> extends ManagerBase implements
                 }
 
                 txn.commit();
-                if (checkForReleaseElasticIp) {
+                if (checkForReleaseElasticIp && lb.getSourceIpAddressId() != null) {
                     boolean success = true;
                     long count = _firewallDao.countRulesByIpId(lb.getSourceIpAddressId());
                     if (count == 0) {
@@ -1534,8 +1619,10 @@ public class LoadBalancingRulesManagerImpl<Type> extends ManagerBase implements
                 }
                 // if the rule is the last one for the ip address assigned to
                 // VPC, unassign it from the network
-                IpAddress ip = _ipAddressDao.findById(lb.getSourceIpAddressId());
-                _vpcMgr.unassignIPFromVpcNetwork(ip.getId(), lb.getNetworkId());
+                if (lb.getSourceIpAddressId() != null) {
+                    IpAddress ip = _ipAddressDao.findById(lb.getSourceIpAddressId());
+                    _vpcMgr.unassignIPFromVpcNetwork(ip.getId(), lb.getNetworkId());
+                }
             }
         }
 
@@ -1902,32 +1989,115 @@ public class LoadBalancingRulesManagerImpl<Type> extends ManagerBase implements
                 count++;
             }
         }
+        
+        //list only Public load balancers using this command
+        sc.setParameters("scheme", Scheme.Public);
 
         Pair<List<LoadBalancerVO>, Integer> result = _lbDao.searchAndCount(sc, searchFilter);
         return new Pair<List<? extends LoadBalancer>, Integer>(result.first(), result.second());
     }
 
-    @Override
-    public List<LoadBalancingRule> listByNetworkId(long networkId) {
-        List<LoadBalancerVO> lbs = _lbDao.listByNetworkId(networkId);
-        List<LoadBalancingRule> lbRules = new ArrayList<LoadBalancingRule>();
-        for (LoadBalancerVO lb : lbs) {
-            List<LbDestination> dstList = getExistingDestinations(lb.getId());
-            List<LbStickinessPolicy> policyList = this.getStickinessPolicies(lb.getId());
-            List<LbHealthCheckPolicy> hcPolicyList = this.getHealthCheckPolicies(lb.getId());
-            LoadBalancingRule loadBalancing = new LoadBalancingRule(lb, dstList, policyList, hcPolicyList);
-            lbRules.add(loadBalancing);
-        }
-        return lbRules;
-    }
 
     @Override
     public LoadBalancerVO findById(long lbId) {
         return _lbDao.findById(lbId);
     }
 
-    protected void removeLBRule(LoadBalancerVO rule) {
+    @Override
+    public void removeLBRule(LoadBalancer rule) {
         // remove the rule
         _lbDao.remove(rule.getId());
     }
+    
+    
+    public boolean applyLbRules(List<LoadBalancingRule> rules, boolean continueOnError) throws ResourceUnavailableException {
+        if (rules == null || rules.size() == 0) {
+            s_logger.debug("There are no Load Balancing Rules to forward to the network elements");
+            return true;
+        }
+
+        boolean success = true;
+        Network network = _networkModel.getNetwork(rules.get(0).getNetworkId());
+        List<PublicIp> publicIps = new ArrayList<PublicIp>();
+
+        
+        // get the list of public ip's owned by the network
+        List<IPAddressVO> userIps = _ipAddressDao.listByAssociatedNetwork(network.getId(), null);
+        if (userIps != null && !userIps.isEmpty()) {
+            for (IPAddressVO userIp : userIps) {
+                PublicIp publicIp = PublicIp.createFromAddrAndVlan(userIp, _vlanDao.findById(userIp.getVlanId()));
+                publicIps.add(publicIp);
+            }
+        }
+
+        // rules can not programmed unless IP is associated with network
+        // service provider, so run IP assoication for
+        // the network so as to ensure IP is associated before applying
+        // rules (in add state)
+        _networkMgr.applyIpAssociations(network, false, continueOnError, publicIps);
+        
+
+        try {
+            applyLbRules(network, rules);
+        } catch (ResourceUnavailableException e) {
+            if (!continueOnError) {
+                throw e;
+            }
+            s_logger.warn("Problems with applying load balancing rules but pushing on", e);
+            success = false;
+        }
+
+        // if all the rules configured on public IP are revoked then
+        // dis-associate IP with network service provider
+        _networkMgr.applyIpAssociations(network, true, continueOnError, publicIps);
+        
+        return success;
+    }
+    
+    @Override
+    public Map<Ip, UserVm> getLbInstances(long lbId) {
+        Map<Ip, UserVm> dstList = new HashMap<Ip, UserVm>();
+        List<LoadBalancerVMMapVO> lbVmMaps = _lb2VmMapDao.listByLoadBalancerId(lbId);
+        LoadBalancerVO lb = _lbDao.findById(lbId);
+
+        for (LoadBalancerVMMapVO lbVmMap : lbVmMaps) {
+            UserVm vm = _vmDao.findById(lbVmMap.getInstanceId());
+            Nic nic = _nicDao.findByInstanceIdAndNetworkIdIncludingRemoved(lb.getNetworkId(), vm.getId());
+            Ip ip = new Ip(nic.getIp4Address());
+            dstList.put(ip, vm);
+        }
+        return dstList;
+    }
+    
+    @Override
+    public void isLbServiceSupportedInNetwork(long networkId, Scheme scheme) {
+        Network network = _networkDao.findById(networkId);
+        
+        //1) Check if the LB service is supported
+        if (!_networkModel.areServicesSupportedInNetwork(network.getId(), Service.Lb)) {
+            InvalidParameterValueException ex = new InvalidParameterValueException(
+                    "LB service is not supported in specified network id");
+            ex.addProxyObject(network, network.getId(), "networkId");
+            throw ex;
+        }
+        
+        //2) Check if the Scheme is supported\
+        NetworkOffering off = _configMgr.getNetworkOffering(network.getNetworkOfferingId());
+        if (scheme == Scheme.Public) {
+            if (!off.getPublicLb()) {
+                throw new InvalidParameterValueException("Scheme " + scheme + " is not supported by the network offering " + off);
+            }
+        } else {
+            if (!off.getInternalLb()) {
+                throw new InvalidParameterValueException("Scheme " + scheme + " is not supported by the network offering " + off);    
+            }
+        }
+        
+        //3) Check if the provider supports the scheme
+        LoadBalancingServiceProvider lbProvider = _networkMgr.getLoadBalancingProviderForNetwork(network, scheme);
+        if (lbProvider == null) {
+            throw new InvalidParameterValueException("Lb rule with scheme " + scheme.toString() + " is not supported by lb providers in network " + network);
+        }
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2660a6b7/server/src/com/cloud/network/router/VirtualNetworkApplianceManager.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/router/VirtualNetworkApplianceManager.java b/server/src/com/cloud/network/router/VirtualNetworkApplianceManager.java
index f49ab79..fcf650f 100644
--- a/server/src/com/cloud/network/router/VirtualNetworkApplianceManager.java
+++ b/server/src/com/cloud/network/router/VirtualNetworkApplianceManager.java
@@ -28,6 +28,7 @@ import com.cloud.network.PublicIpAddress;
 import com.cloud.network.RemoteAccessVpn;
 import com.cloud.network.VirtualNetworkApplianceService;
 import com.cloud.network.VpnUser;
+import com.cloud.network.lb.LoadBalancingRule;
 import com.cloud.network.rules.FirewallRule;
 import com.cloud.network.rules.StaticNat;
 import com.cloud.user.Account;
@@ -103,4 +104,7 @@ public interface VirtualNetworkApplianceManager extends Manager, VirtualNetworkA
 	
 	boolean applyUserData(Network config, NicProfile nic, VirtualMachineProfile<UserVm> vm, DeployDestination dest, 
 	        List<DomainRouterVO> routers) throws ResourceUnavailableException;
+
+    boolean applyLoadBalancingRules(Network network, List<? extends LoadBalancingRule> rules, List<? extends VirtualRouter> routers) throws ResourceUnavailableException;
+
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2660a6b7/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java b/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java
index 6620e0a..e3dd06b 100755
--- a/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java
+++ b/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java
@@ -173,6 +173,7 @@ import com.cloud.network.router.VirtualRouter.RedundantState;
 import com.cloud.network.router.VirtualRouter.Role;
 import com.cloud.network.rules.FirewallRule;
 import com.cloud.network.rules.FirewallRule.Purpose;
+import com.cloud.network.rules.LoadBalancerContainer.Scheme;
 import com.cloud.network.rules.PortForwardingRule;
 import com.cloud.network.rules.RulesManager;
 import com.cloud.network.rules.StaticNat;
@@ -218,6 +219,7 @@ 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.utils.net.Ip;
 import com.cloud.utils.net.MacAddress;
 import com.cloud.utils.net.NetUtils;
 import com.cloud.vm.DomainRouterVO;
@@ -1526,7 +1528,7 @@ public class VirtualNetworkApplianceManagerImpl extends ManagerBase implements V
                 for (int i = 0; i < count; i++) {
                 List<Pair<NetworkVO, NicProfile>> networks = createRouterNetworks(owner, isRedundant, plan, guestNetwork,
                         new Pair<Boolean, PublicIp>(publicNetwork, sourceNatIp));
-                //don't start the router as we are holding the network lock that needs to be released at the end of router allocation
+                    //don't start the router as we are holding the network lock that needs to be released at the end of router allocation
                     DomainRouterVO router = deployRouter(owner, destination, plan, params, isRedundant, vrProvider, offeringId,
                         null, networks, false, null);
 
@@ -2410,7 +2412,7 @@ public class VirtualNetworkApplianceManagerImpl extends ManagerBase implements V
                 }
             }
    
-            List<LoadBalancerVO> lbs = _loadBalancerDao.listByNetworkId(guestNetworkId);
+            List<LoadBalancerVO> lbs = _loadBalancerDao.listByNetworkIdAndScheme(guestNetworkId, Scheme.Public);
             List<LoadBalancingRule> lbRules = new ArrayList<LoadBalancingRule>();
             if (_networkModel.isProviderSupportServiceInNetwork(guestNetworkId, Service.Lb, provider)) {
                 // Re-apply load balancing rules
@@ -2418,7 +2420,8 @@ public class VirtualNetworkApplianceManagerImpl extends ManagerBase implements V
                     List<LbDestination> dstList = _lbMgr.getExistingDestinations(lb.getId());
                     List<LbStickinessPolicy> policyList = _lbMgr.getStickinessPolicies(lb.getId());
                     List<LbHealthCheckPolicy> hcPolicyList = _lbMgr.getHealthCheckPolicies(lb.getId());
-                    LoadBalancingRule loadBalancing = new LoadBalancingRule(lb, dstList, policyList, hcPolicyList);
+                    Ip sourceIp = _networkModel.getPublicIpAddress(lb.getSourceIpAddressId()).getAddress();
+                    LoadBalancingRule loadBalancing = new LoadBalancingRule(lb, dstList, policyList, hcPolicyList, sourceIp);
                     lbRules.add(loadBalancing);
                 }
             }
@@ -2509,7 +2512,7 @@ public class VirtualNetworkApplianceManagerImpl extends ManagerBase implements V
             Network network = _networkModel.getNetwork(routerNic.getNetworkId());
             if (network.getTrafficType() == TrafficType.Guest) {
                 guestNetworks.add(network);
-            } 
+            }
         }
         
         answer = cmds.getAnswer("getDomRVersion");
@@ -3036,7 +3039,7 @@ public class VirtualNetworkApplianceManagerImpl extends ManagerBase implements V
             String algorithm = rule.getAlgorithm();
             String uuid = rule.getUuid();
 
-            String srcIp = _networkModel.getIp(rule.getSourceIpAddressId()).getAddress().addr();
+            String srcIp = rule.getSourceIp().addr();
             int srcPort = rule.getSourcePortStart();
             List<LbDestination> destinations = rule.getDestinations();
             List<LbStickinessPolicy> stickinessPolicies = rule.getStickinessPolicies();
@@ -3051,7 +3054,7 @@ public class VirtualNetworkApplianceManagerImpl extends ManagerBase implements V
         }
         
         Network guestNetwork = _networkModel.getNetwork(guestNetworkId);
-        Nic nic = _nicDao.findByInstanceIdAndNetworkId(guestNetwork.getId(), router.getId());
+        Nic nic = _nicDao.findByNtwkIdAndInstanceId(guestNetwork.getId(), router.getId());
         NicProfile nicProfile = new NicProfile(nic, guestNetwork, nic.getBroadcastUri(), nic.getIsolationUri(), 
                 _networkModel.getNetworkRate(guestNetwork.getId(), router.getId()), 
                 _networkModel.isSecurityGroupSupportedInNetwork(guestNetwork), 
@@ -3144,7 +3147,7 @@ public class VirtualNetworkApplianceManagerImpl extends ManagerBase implements V
             }
 
             if (createVmData) {
-                NicVO nic = _nicDao.findByInstanceIdAndNetworkId(guestNetworkId, vm.getId());
+                NicVO nic = _nicDao.findByNtwkIdAndInstanceId(guestNetworkId, vm.getId());
                 if (nic != null) {
                     s_logger.debug("Creating user data entry for vm " + vm + " on domR " + router);
                     createVmDataCommand(router, vm, nic, null, cmds);
@@ -3197,7 +3200,7 @@ public class VirtualNetworkApplianceManagerImpl extends ManagerBase implements V
                 createDhcp = false;
             }
             if (createDhcp) {
-                NicVO nic = _nicDao.findByInstanceIdAndNetworkId(guestNetworkId, vm.getId());
+                NicVO nic = _nicDao.findByNtwkIdAndInstanceId(guestNetworkId, vm.getId());
                 if (nic != null) {
                     s_logger.debug("Creating dhcp entry for vm " + vm + " on domR " + router + ".");
                     createDhcpEntryCommand(router, vm, nic, cmds);
@@ -3315,13 +3318,14 @@ public class VirtualNetworkApplianceManagerImpl extends ManagerBase implements V
             public boolean execute(Network network, VirtualRouter router) throws ResourceUnavailableException {
                 if (rules.get(0).getPurpose() == Purpose.LoadBalancing) {
                     // for load balancer we have to resend all lb rules for the network
-                    List<LoadBalancerVO> lbs = _loadBalancerDao.listByNetworkId(network.getId());
+                    List<LoadBalancerVO> lbs = _loadBalancerDao.listByNetworkIdAndScheme(network.getId(), Scheme.Public);
                     List<LoadBalancingRule> lbRules = new ArrayList<LoadBalancingRule>();
                     for (LoadBalancerVO lb : lbs) {
                         List<LbDestination> dstList = _lbMgr.getExistingDestinations(lb.getId());
                         List<LbStickinessPolicy> policyList = _lbMgr.getStickinessPolicies(lb.getId());
-                        List<LbHealthCheckPolicy> hcPolicyList = _lbMgr.getHealthCheckPolicies(lb.getId() );
-                        LoadBalancingRule loadBalancing = new LoadBalancingRule(lb, dstList, policyList, hcPolicyList);
+                        List<LbHealthCheckPolicy> hcPolicyList = _lbMgr.getHealthCheckPolicies(lb.getId());
+                        Ip sourceIp = _networkModel.getPublicIpAddress(lb.getSourceIpAddressId()).getAddress();
+                        LoadBalancingRule loadBalancing = new LoadBalancingRule(lb, dstList, policyList, hcPolicyList, sourceIp);
                         lbRules.add(loadBalancing);
                     }
                     return sendLBRules(router, lbRules, network.getId());
@@ -3338,6 +3342,32 @@ public class VirtualNetworkApplianceManagerImpl extends ManagerBase implements V
             }
         });
     }
+    
+    
+    @Override
+    public boolean applyLoadBalancingRules(Network network, final List<? extends LoadBalancingRule> rules, List<? extends VirtualRouter> routers) throws ResourceUnavailableException {
+        if (rules == null || rules.isEmpty()) {
+            s_logger.debug("No lb rules to be applied for network " + network.getId());
+            return true;
+        }
+        return applyRules(network, routers, "loadbalancing rules", false, null, false, new RuleApplier() {
+            @Override
+            public boolean execute(Network network, VirtualRouter router) throws ResourceUnavailableException {
+                // for load balancer we have to resend all lb rules for the network
+                List<LoadBalancerVO> lbs = _loadBalancerDao.listByNetworkIdAndScheme(network.getId(), Scheme.Public);
+                List<LoadBalancingRule> lbRules = new ArrayList<LoadBalancingRule>();
+                for (LoadBalancerVO lb : lbs) {
+                    List<LbDestination> dstList = _lbMgr.getExistingDestinations(lb.getId());
+                    List<LbStickinessPolicy> policyList = _lbMgr.getStickinessPolicies(lb.getId());
+                    List<LbHealthCheckPolicy> hcPolicyList = _lbMgr.getHealthCheckPolicies(lb.getId());
+                    Ip sourceIp = _networkModel.getPublicIpAddress(lb.getSourceIpAddressId()).getAddress();
+                    LoadBalancingRule loadBalancing = new LoadBalancingRule(lb, dstList, policyList, hcPolicyList, sourceIp);
+                    lbRules.add(loadBalancing);
+                }
+                return sendLBRules(router, lbRules, network.getId());  
+            }
+        });
+    }
 
     protected boolean sendLBRules(VirtualRouter router, List<LoadBalancingRule> rules, long guestNetworkId) throws ResourceUnavailableException {
         Commands cmds = new Commands(OnError.Continue);
@@ -3734,4 +3764,11 @@ public class VirtualNetworkApplianceManagerImpl extends ManagerBase implements V
             }
         }
     }
+
+
+
+    @Override
+    public VirtualRouter findRouter(long routerId) {
+        return _routerDao.findById(routerId);
+    }
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2660a6b7/server/src/com/cloud/network/router/VpcVirtualNetworkApplianceManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/router/VpcVirtualNetworkApplianceManagerImpl.java b/server/src/com/cloud/network/router/VpcVirtualNetworkApplianceManagerImpl.java
index ebf2d42..6111009 100644
--- a/server/src/com/cloud/network/router/VpcVirtualNetworkApplianceManagerImpl.java
+++ b/server/src/com/cloud/network/router/VpcVirtualNetworkApplianceManagerImpl.java
@@ -440,7 +440,7 @@ public class VpcVirtualNetworkApplianceManagerImpl extends VirtualNetworkApplian
             defaultDns2 = guestNic.getDns2();
         }
         
-        Nic nic = _nicDao.findByInstanceIdAndNetworkId(network.getId(), router.getId());
+        Nic nic = _nicDao.findByNtwkIdAndInstanceId(network.getId(), router.getId());
         String networkDomain = network.getNetworkDomain();
         String dhcpRange = getGuestDhcpRange(guestNic, network, _configMgr.getZone(network.getDataCenterId()));
         

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2660a6b7/server/src/com/cloud/network/vpc/VpcManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/vpc/VpcManagerImpl.java b/server/src/com/cloud/network/vpc/VpcManagerImpl.java
index 9be2208..55656d8 100644
--- a/server/src/com/cloud/network/vpc/VpcManagerImpl.java
+++ b/server/src/com/cloud/network/vpc/VpcManagerImpl.java
@@ -184,7 +184,9 @@ public class VpcManagerImpl extends ManagerBase implements VpcManager, VpcProvis
     private final ScheduledExecutorService _executor = Executors.newScheduledThreadPool(1, new NamedThreadFactory("VpcChecker"));
     private List<VpcProvider> vpcElements = null;
     private final List<Service> nonSupportedServices = Arrays.asList(Service.SecurityGroup, Service.Firewall);
-    private final List<Provider> supportedProviders = Arrays.asList(Provider.VPCVirtualRouter, Provider.NiciraNvp, Provider.Netscaler);
+    private final List<Provider> supportedProviders = Arrays.asList(Provider.VPCVirtualRouter, Provider.NiciraNvp, Provider.InternalLbVm, Provider.Netscaler);
+ 
+
     int _cleanupInterval;
     int _maxNetworks;
     SearchBuilder<IPAddressVO> IpAddressSearch;
@@ -206,6 +208,7 @@ public class VpcManagerImpl extends ManagerBase implements VpcManager, VpcProvis
                 if (svc == Service.Lb) {
                     Set<Provider> lbProviders = new HashSet<Provider>();
                     lbProviders.add(Provider.VPCVirtualRouter);
+                    lbProviders.add(Provider.InternalLbVm);
                     svcProviderMap.put(svc, lbProviders);
                 } else {
                     svcProviderMap.put(svc, defaultProviders);
@@ -1057,16 +1060,17 @@ public class VpcManagerImpl extends ManagerBase implements VpcManager, VpcProvis
             }
         }
 
-        //4) Only one network in the VPC can support LB
-        if (_ntwkModel.areServicesSupportedByNetworkOffering(guestNtwkOff.getId(), Service.Lb)) {
+        //4) Only one network in the VPC can support public LB inside the VPC. Internal LB can be supported on multiple VPC tiers
+        if (_ntwkModel.areServicesSupportedByNetworkOffering(guestNtwkOff.getId(), Service.Lb) && guestNtwkOff.getPublicLb()) {
             List<? extends Network> networks = getVpcNetworks(vpc.getId());
             for (Network network : networks) {
                 if (networkId != null && network.getId() == networkId.longValue()) {
                     //skip my own network
                     continue;
                 } else {
-                    if (_ntwkModel.areServicesSupportedInNetwork(network.getId(), Service.Lb)) {
-                        throw new InvalidParameterValueException("LB service is already supported " +
+                    NetworkOffering otherOff = _configMgr.getNetworkOffering(network.getNetworkOfferingId());
+                    if (_ntwkModel.areServicesSupportedInNetwork(network.getId(), Service.Lb) && otherOff.getPublicLb()) {
+                        throw new InvalidParameterValueException("Public LB service is already supported " +
                         		"by network " + network + " in VPC " + vpc);
                     }
                 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2660a6b7/server/src/com/cloud/server/ConfigurationServerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/server/ConfigurationServerImpl.java b/server/src/com/cloud/server/ConfigurationServerImpl.java
index 3d97447..bc52e9a 100755
--- a/server/src/com/cloud/server/ConfigurationServerImpl.java
+++ b/server/src/com/cloud/server/ConfigurationServerImpl.java
@@ -1017,7 +1017,7 @@ public class ConfigurationServerImpl extends ManagerBase implements Configuratio
                 "Offering for Shared Security group enabled networks",
                 TrafficType.Guest,
                 false, true, null, null, true, Availability.Optional,
-                null, Network.GuestType.Shared, true, true, false);
+                null, Network.GuestType.Shared, true, true, false, false, false);
 
         defaultSharedSGNetworkOffering.setState(NetworkOffering.State.Enabled);
         defaultSharedSGNetworkOffering = _networkOfferingDao.persistDefaultNetworkOffering(defaultSharedSGNetworkOffering);
@@ -1034,7 +1034,7 @@ public class ConfigurationServerImpl extends ManagerBase implements Configuratio
                 "Offering for Shared networks",
                 TrafficType.Guest,
                 false, true, null, null, true, Availability.Optional,
-                null, Network.GuestType.Shared, true, true, false);
+                null, Network.GuestType.Shared, true, true, false, false, false);
 
         defaultSharedNetworkOffering.setState(NetworkOffering.State.Enabled);
         defaultSharedNetworkOffering = _networkOfferingDao.persistDefaultNetworkOffering(defaultSharedNetworkOffering);
@@ -1051,7 +1051,7 @@ public class ConfigurationServerImpl extends ManagerBase implements Configuratio
                 "Offering for Isolated networks with Source Nat service enabled",
                 TrafficType.Guest,
                 false, false, null, null, true, Availability.Required,
-                null, Network.GuestType.Isolated, true, false, false);
+                null, Network.GuestType.Isolated, true, false, false, false, true);
 
         defaultIsolatedSourceNatEnabledNetworkOffering.setState(NetworkOffering.State.Enabled);
         defaultIsolatedSourceNatEnabledNetworkOffering = _networkOfferingDao.persistDefaultNetworkOffering(defaultIsolatedSourceNatEnabledNetworkOffering);
@@ -1069,7 +1069,7 @@ public class ConfigurationServerImpl extends ManagerBase implements Configuratio
                 "Offering for Isolated networks with no Source Nat service",
                 TrafficType.Guest,
                 false, true, null, null, true, Availability.Optional,
-                null, Network.GuestType.Isolated, true, true, false);
+                null, Network.GuestType.Isolated, true, true, false, false, false);
 
         defaultIsolatedEnabledNetworkOffering.setState(NetworkOffering.State.Enabled);
         defaultIsolatedEnabledNetworkOffering = _networkOfferingDao.persistDefaultNetworkOffering(defaultIsolatedEnabledNetworkOffering);
@@ -1086,7 +1086,7 @@ public class ConfigurationServerImpl extends ManagerBase implements Configuratio
                 "Offering for Shared networks with Elastic IP and Elastic LB capabilities",
                 TrafficType.Guest,
                 false, true, null, null, true, Availability.Optional,
-                null, Network.GuestType.Shared, true, false, false, false, true, true, true, false, false, true);
+                null, Network.GuestType.Shared, true, false, false, false, true, true, true, false, false, true, true, false);
 
         defaultNetscalerNetworkOffering.setState(NetworkOffering.State.Enabled);
         defaultNetscalerNetworkOffering = _networkOfferingDao.persistDefaultNetworkOffering(defaultNetscalerNetworkOffering);
@@ -1103,7 +1103,7 @@ public class ConfigurationServerImpl extends ManagerBase implements Configuratio
                 "Offering for Isolated Vpc networks with Source Nat service enabled",
                 TrafficType.Guest,
                 false, false, null, null, true, Availability.Optional,
-                null, Network.GuestType.Isolated, false, false, false);
+                null, Network.GuestType.Isolated, false, false, false, false, true);
 
         defaultNetworkOfferingForVpcNetworks.setState(NetworkOffering.State.Enabled);
         defaultNetworkOfferingForVpcNetworks = _networkOfferingDao.persistDefaultNetworkOffering(defaultNetworkOfferingForVpcNetworks);
@@ -1133,7 +1133,7 @@ public class ConfigurationServerImpl extends ManagerBase implements Configuratio
                 "Offering for Isolated Vpc networks with Source Nat service enabled and LB service Disabled",
                 TrafficType.Guest,
                 false, false, null, null, true, Availability.Optional,
-                null, Network.GuestType.Isolated, false, false, false);
+                null, Network.GuestType.Isolated, false, false, false, false, false);
 
         defaultNetworkOfferingForVpcNetworksNoLB.setState(NetworkOffering.State.Enabled);
         defaultNetworkOfferingForVpcNetworksNoLB = _networkOfferingDao.persistDefaultNetworkOffering(defaultNetworkOfferingForVpcNetworksNoLB);


[28/50] [abbrv] git commit: updated refs/heads/vmsync to d403974

Posted by ah...@apache.org.
CLOUDSTACK-2411:UI:fail to enable conserve mode while creating NO with guest type as shared


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

Branch: refs/heads/vmsync
Commit: e40aba3bc099d8ad49b87829803c58b4a5975717
Parents: 3aed20c
Author: Pranav Saxena <pr...@citrix.com>
Authored: Fri May 10 11:05:47 2013 +0530
Committer: Pranav Saxena <pr...@citrix.com>
Committed: Fri May 10 11:05:47 2013 +0530

----------------------------------------------------------------------
 ui/scripts/configuration.js |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/e40aba3b/ui/scripts/configuration.js
----------------------------------------------------------------------
diff --git a/ui/scripts/configuration.js b/ui/scripts/configuration.js
index 4a64eea..9a08c4c 100644
--- a/ui/scripts/configuration.js
+++ b/ui/scripts/configuration.js
@@ -1210,7 +1210,7 @@
 												}
 											}																					
 										});   
-										if(havingVpcVirtualRouterForAtLeastOneService == true || $guestTypeField.val() == 'Shared') {			
+										if(havingVpcVirtualRouterForAtLeastOneService == true ) {			
 										  $conservemode.find("input[type=checkbox]").attr("disabled", "disabled"); 
                       $conservemode.find("input[type=checkbox]").attr('checked', false);