You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudstack.apache.org by ja...@apache.org on 2015/05/28 13:59:18 UTC

[1/9] git commit: updated refs/heads/master to b616522

Repository: cloudstack
Updated Branches:
  refs/heads/master b155129ae -> b61652208


CLOUDSTACK-8324: Skip ip allocation for external dhcp


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

Branch: refs/heads/master
Commit: 70934e8c1aa12b05eb253ed96788da94a6e1f271
Parents: 5991254
Author: Jayapal <ja...@apache.org>
Authored: Tue May 19 17:12:33 2015 +0530
Committer: Jayapal <ja...@apache.org>
Committed: Thu May 28 15:42:07 2015 +0530

----------------------------------------------------------------------
 api/src/com/cloud/network/NetworkModel.java     |  2 +
 .../src/com/cloud/network/IpAddressManager.java |  5 ++
 .../com/cloud/network/IpAddressManagerImpl.java | 74 ++++++++++++++++++++
 .../cloud/network/guru/DirectNetworkGuru.java   | 19 ++---
 .../com/cloud/network/MockNetworkModelImpl.java |  5 ++
 .../com/cloud/vpc/MockNetworkModelImpl.java     |  5 ++
 6 files changed, 102 insertions(+), 8 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/70934e8c/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 9ce024d..70132d2 100644
--- a/api/src/com/cloud/network/NetworkModel.java
+++ b/api/src/com/cloud/network/NetworkModel.java
@@ -88,6 +88,8 @@ public interface NetworkModel {
 
     Map<Capability, String> getNetworkServiceCapabilities(long networkId, Service service);
 
+    boolean isSharedNetworkWithoutServices(long networkId);
+
     boolean areServicesSupportedByNetworkOffering(long networkOfferingId, Service... services);
 
     Network getNetworkWithSGWithFreeIPs(Long zoneId);

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/70934e8c/engine/components-api/src/com/cloud/network/IpAddressManager.java
----------------------------------------------------------------------
diff --git a/engine/components-api/src/com/cloud/network/IpAddressManager.java b/engine/components-api/src/com/cloud/network/IpAddressManager.java
index d8999ed..1df23ba 100644
--- a/engine/components-api/src/com/cloud/network/IpAddressManager.java
+++ b/engine/components-api/src/com/cloud/network/IpAddressManager.java
@@ -18,6 +18,7 @@ package com.cloud.network;
 
 import java.util.List;
 
+import com.cloud.utils.db.DB;
 import org.apache.cloudstack.framework.config.ConfigKey;
 
 import com.cloud.dc.DataCenter;
@@ -166,6 +167,10 @@ public interface IpAddressManager {
     PublicIp assignPublicIpAddressFromVlans(long dcId, Long podId, Account owner, VlanType type, List<Long> vlanDbIds, Long networkId, String requestedIp,
         boolean isSystem) throws InsufficientAddressCapacityException;
 
+    @DB
+    void allocateNicValues(NicProfile nic, DataCenter dc, VirtualMachineProfile vm, Network network, String requestedIpv4,
+                           String requestedIpv6) throws InsufficientVirtualNetworkCapacityException, InsufficientAddressCapacityException;
+
     int getRuleCountForIp(Long addressId, FirewallRule.Purpose purpose, FirewallRule.State state);
 
     public String allocateGuestIP(Network network, String requestedIp) throws InsufficientAddressCapacityException;

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/70934e8c/server/src/com/cloud/network/IpAddressManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/IpAddressManagerImpl.java b/server/src/com/cloud/network/IpAddressManagerImpl.java
index 96736ef..7ca06a2 100644
--- a/server/src/com/cloud/network/IpAddressManagerImpl.java
+++ b/server/src/com/cloud/network/IpAddressManagerImpl.java
@@ -1910,6 +1910,80 @@ public class IpAddressManagerImpl extends ManagerBase implements IpAddressManage
         });
     }
 
+
+
+
+    @Override
+    @DB
+    public void allocateNicValues(final NicProfile nic, final DataCenter dc, final VirtualMachineProfile vm, final Network network, final String requestedIpv4,
+                                  final String requestedIpv6) throws InsufficientVirtualNetworkCapacityException, InsufficientAddressCapacityException {
+        Transaction.execute(new TransactionCallbackWithExceptionNoReturn<InsufficientAddressCapacityException>() {
+            @Override
+            public void doInTransactionWithoutResult(TransactionStatus status) throws InsufficientAddressCapacityException {
+                //This method allocates direct ip for the Shared network in Advance zones
+                boolean ipv4 = false;
+
+                if (network.getGateway() != null) {
+                    if (nic.getIp4Address() == null) {
+                        ipv4 = true;
+                        // PublicIp ip = null;
+
+                        //Get ip address from the placeholder and don't allocate a new one
+                        if (requestedIpv4 != null && vm.getType() == VirtualMachine.Type.DomainRouter) {
+                            s_logger.debug("There won't be nic assignment for VR id " + vm.getId() +"  in this network " + network);
+
+                        }
+
+                        // nic ip address isn ot set here. Because the DHCP is external to cloudstack
+                        nic.setGateway(network.getGateway());
+                        nic.setNetmask(network.getCidr());
+
+                        List<VlanVO> vlan = _vlanDao.listVlansByNetworkId(network.getId());
+
+                        //TODO: get vlan tag for the ntwork
+                        if (vlan != null && ! vlan.isEmpty()) {
+                            nic.setIsolationUri(IsolationType.Vlan.toUri(vlan.get(0).getVlanTag()));
+                        }
+
+                        nic.setBroadcastType(BroadcastDomainType.Vlan);
+                        nic.setBroadcastType(network.getBroadcastDomainType());
+
+                        nic.setBroadcastUri(network.getBroadcastUri());
+                        nic.setFormat(AddressFormat.Ip4);
+
+                        nic.setMacAddress(_networkModel.getNextAvailableMacAddressInNetwork(network.getId()));
+                    }
+                    nic.setDns1(dc.getDns1());
+                    nic.setDns2(dc.getDns2());
+                }
+
+                // TODO: the IPv6 logic is not changed.
+                //FIXME - get ipv6 address from the placeholder if it's stored there
+                if (network.getIp6Gateway() != null) {
+                    if (nic.getIp6Address() == null) {
+                        UserIpv6Address ip = _ipv6Mgr.assignDirectIp6Address(dc.getId(), vm.getOwner(), network.getId(), requestedIpv6);
+                        Vlan vlan = _vlanDao.findById(ip.getVlanId());
+                        nic.setIp6Address(ip.getAddress().toString());
+                        nic.setIp6Gateway(vlan.getIp6Gateway());
+                        nic.setIp6Cidr(vlan.getIp6Cidr());
+                        if (ipv4) {
+                            nic.setFormat(AddressFormat.DualStack);
+                        } else {
+                            nic.setIsolationUri(IsolationType.Vlan.toUri(vlan.getVlanTag()));
+                            nic.setBroadcastType(BroadcastDomainType.Vlan);
+                            nic.setBroadcastUri(BroadcastDomainType.Vlan.toUri(vlan.getVlanTag()));
+                            nic.setFormat(AddressFormat.Ip6);
+                            nic.setReservationId(String.valueOf(vlan.getVlanTag()));
+                            nic.setMacAddress(ip.getMacAddress());
+                        }
+                    }
+                    nic.setIp6Dns1(dc.getIp6Dns1());
+                    nic.setIp6Dns2(dc.getIp6Dns2());
+                }
+            }
+        });
+    }
+
     @Override
     public int getRuleCountForIp(Long addressId, FirewallRule.Purpose purpose, FirewallRule.State state) {
         List<FirewallRuleVO> rules = _firewallDao.listByIpAndPurposeWithState(addressId, purpose, state);

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/70934e8c/server/src/com/cloud/network/guru/DirectNetworkGuru.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/guru/DirectNetworkGuru.java b/server/src/com/cloud/network/guru/DirectNetworkGuru.java
index f380553..dcd3c72 100644
--- a/server/src/com/cloud/network/guru/DirectNetworkGuru.java
+++ b/server/src/com/cloud/network/guru/DirectNetworkGuru.java
@@ -246,14 +246,17 @@ public class DirectNetworkGuru extends AdapterBase implements NetworkGuru {
                 @Override
                 public void doInTransactionWithoutResult(TransactionStatus status) throws InsufficientVirtualNetworkCapacityException,
                     InsufficientAddressCapacityException {
-                    _ipAddrMgr.allocateDirectIp(nic, dc, vm, network, requestedIp4Addr, requestedIp6Addr);
-                    //save the placeholder nic if the vm is the Virtual router
-                    if (vm.getType() == VirtualMachine.Type.DomainRouter) {
-                        Nic placeholderNic = _networkModel.getPlaceholderNicForRouter(network, null);
-                        if (placeholderNic == null) {
-                            s_logger.debug("Saving placeholder nic with ip4 address " + nic.getIp4Address() + " and ipv6 address " + nic.getIp6Address() +
-                                " for the network " + network);
-                            _networkMgr.savePlaceholderNic(network, nic.getIp4Address(), nic.getIp6Address(), VirtualMachine.Type.DomainRouter);
+                    if (_networkModel.isSharedNetworkWithoutServices(network.getId())) {
+                        _ipAddrMgr.allocateDirectIp(nic, dc, vm, network, requestedIp4Addr, requestedIp6Addr);
+                    } else {
+                        //save the placeholder nic if the vm is the Virtual router
+                        if (vm.getType() == VirtualMachine.Type.DomainRouter) {
+                            Nic placeholderNic = _networkModel.getPlaceholderNicForRouter(network, null);
+                            if (placeholderNic == null) {
+                                s_logger.debug("Saving placeholder nic with ip4 address " + nic.getIp4Address() + " and ipv6 address " + nic.getIp6Address() +
+                                        " for the network " + network);
+                                _networkMgr.savePlaceholderNic(network, nic.getIp4Address(), nic.getIp6Address(), VirtualMachine.Type.DomainRouter);
+                            }
                         }
                     }
                 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/70934e8c/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 57ad92e..7b5e7cf 100644
--- a/server/test/com/cloud/network/MockNetworkModelImpl.java
+++ b/server/test/com/cloud/network/MockNetworkModelImpl.java
@@ -218,6 +218,11 @@ public class MockNetworkModelImpl extends ManagerBase implements NetworkModel {
         return null;
     }
 
+    @Override
+    public boolean isSharedNetworkWithoutServices(long networkId) {
+        return false;
+    }
+
     /* (non-Javadoc)
      * @see com.cloud.network.NetworkModel#areServicesSupportedByNetworkOffering(long, com.cloud.network.Network.Service[])
      */

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/70934e8c/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 49f5065..0c9955e 100644
--- a/server/test/com/cloud/vpc/MockNetworkModelImpl.java
+++ b/server/test/com/cloud/vpc/MockNetworkModelImpl.java
@@ -230,6 +230,11 @@ public class MockNetworkModelImpl extends ManagerBase implements NetworkModel {
         return null;
     }
 
+    @Override
+    public boolean isSharedNetworkWithoutServices(long networkId) {
+        return false;
+    }
+
     /* (non-Javadoc)
      * @see com.cloud.network.NetworkModel#areServicesSupportedByNetworkOffering(long, com.cloud.network.Network.Service[])
      */


[4/9] git commit: updated refs/heads/master to b616522

Posted by ja...@apache.org.
CLOUDSTACK-8324: Resource base changes for vm ip fetch


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

Branch: refs/heads/master
Commit: 7984ae5283017e223259dd87958f6f5ef60bf617
Parents: 733ac2b
Author: Jayapal <ja...@apache.org>
Authored: Wed May 20 15:49:26 2015 +0530
Committer: Jayapal <ja...@apache.org>
Committed: Thu May 28 15:42:08 2015 +0530

----------------------------------------------------------------------
 .../CitrixGetVmIpAddressCommandWrapper.java     | 81 ++++++++++++++++++++
 .../cloud/network/guru/DirectNetworkGuru.java   |  5 +-
 2 files changed, 84 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/7984ae52/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/citrix/CitrixGetVmIpAddressCommandWrapper.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/citrix/CitrixGetVmIpAddressCommandWrapper.java b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/citrix/CitrixGetVmIpAddressCommandWrapper.java
new file mode 100644
index 0000000..889ded3
--- /dev/null
+++ b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/citrix/CitrixGetVmIpAddressCommandWrapper.java
@@ -0,0 +1,81 @@
+//
+// 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.xenserver.resource.wrapper;
+
+import java.util.Map;
+
+import com.cloud.agent.api.GetVmIpAddressCommand;
+import com.cloud.utils.net.NetUtils;
+import com.xensource.xenapi.Connection;
+import com.xensource.xenapi.VM;
+import com.xensource.xenapi.VMGuestMetrics;
+import com.xensource.xenapi.Types;
+import org.apache.log4j.Logger;
+
+import com.cloud.agent.api.Answer;
+import com.cloud.hypervisor.xenserver.resource.CitrixResourceBase;
+import com.cloud.resource.CommandWrapper;
+import org.apache.xmlrpc.XmlRpcException;
+
+public final class CitrixGetVmIpAddressCommandWrapper extends CommandWrapper<GetVmIpAddressCommand, Answer, CitrixResourceBase> {
+
+    private static final Logger s_logger = Logger.getLogger(CitrixGetVmIpAddressCommandWrapper.class);
+
+    @Override
+    public Answer execute(final GetVmIpAddressCommand command, final CitrixResourceBase citrixResourceBase) {
+        final Connection conn = citrixResourceBase.getConnection();
+
+        String vmName = command.getVmName();
+        String networkCidr = command.getVmNetworkCidr();
+        boolean result = false;
+        String errorMsg = null;
+        String vmIp = null;
+
+        try {
+            VM vm = citrixResourceBase.getVM(conn, vmName);
+            VMGuestMetrics mtr = vm.getGuestMetrics(conn);
+            VMGuestMetrics.Record rec = mtr.getRecord(conn);
+            Map<String, String> vmIpsMap = rec.networks;
+
+            for (String ipAddr: vmIpsMap.values()) {
+                if (NetUtils.isIpWithtInCidrRange(ipAddr, networkCidr)) {
+                    vmIp = ipAddr;
+                    break;
+                }
+            }
+
+            if (vmIp != null) {
+                s_logger.debug("VM " +vmName + " ip address got retrieved "+vmIp);
+                result = true;
+                return new Answer(command, result, vmIp);
+            }
+
+        }catch (Types.XenAPIException e) {
+            s_logger.debug("Got exception in GetVmIpAddressCommand "+ e.getMessage());
+            errorMsg = "Failed to retrived vm ip addr, exception: "+e.getMessage();
+        }catch (XmlRpcException e) {
+            s_logger.debug("Got exception in GetVmIpAddressCommand "+ e.getMessage());
+            errorMsg = "Failed to retrived vm ip addr, exception: "+e.getMessage();
+        }
+
+        return new Answer(command, result, errorMsg);
+
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/7984ae52/server/src/com/cloud/network/guru/DirectNetworkGuru.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/guru/DirectNetworkGuru.java b/server/src/com/cloud/network/guru/DirectNetworkGuru.java
index dcd3c72..18f7641 100644
--- a/server/src/com/cloud/network/guru/DirectNetworkGuru.java
+++ b/server/src/com/cloud/network/guru/DirectNetworkGuru.java
@@ -245,10 +245,11 @@ public class DirectNetworkGuru extends AdapterBase implements NetworkGuru {
             Transaction.execute(new TransactionCallbackWithExceptionNoReturn<InsufficientCapacityException>() {
                 @Override
                 public void doInTransactionWithoutResult(TransactionStatus status) throws InsufficientVirtualNetworkCapacityException,
-                    InsufficientAddressCapacityException {
+                        InsufficientAddressCapacityException {
                     if (_networkModel.isSharedNetworkWithoutServices(network.getId())) {
-                        _ipAddrMgr.allocateDirectIp(nic, dc, vm, network, requestedIp4Addr, requestedIp6Addr);
+                        _ipAddrMgr.allocateNicValues(nic, dc, vm, network, requestedIp4Addr, requestedIp6Addr);
                     } else {
+                        _ipAddrMgr.allocateDirectIp(nic, dc, vm, network, requestedIp4Addr, requestedIp6Addr);
                         //save the placeholder nic if the vm is the Virtual router
                         if (vm.getType() == VirtualMachine.Type.DomainRouter) {
                             Nic placeholderNic = _networkModel.getPlaceholderNicForRouter(network, null);


[8/9] git commit: updated refs/heads/master to b616522

Posted by ja...@apache.org.
CLOUDSTACK-8324: Updated import and added ResourceWrapper annotation


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

Branch: refs/heads/master
Commit: 6e96fc6f3830ed2861342d399c1200770baa1837
Parents: 3a8d1f7
Author: Jayapal <ja...@apache.org>
Authored: Wed May 27 12:22:29 2015 +0530
Committer: Jayapal <ja...@apache.org>
Committed: Thu May 28 15:56:37 2015 +0530

----------------------------------------------------------------------
 .../wrapper/citrix/CitrixGetVmIpAddressCommandWrapper.java     | 6 +++---
 server/src/com/cloud/vm/UserVmManagerImpl.java                 | 3 +--
 2 files changed, 4 insertions(+), 5 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/6e96fc6f/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/citrix/CitrixGetVmIpAddressCommandWrapper.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/citrix/CitrixGetVmIpAddressCommandWrapper.java b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/citrix/CitrixGetVmIpAddressCommandWrapper.java
index 889ded3..bbfec2c 100644
--- a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/citrix/CitrixGetVmIpAddressCommandWrapper.java
+++ b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/citrix/CitrixGetVmIpAddressCommandWrapper.java
@@ -17,11 +17,10 @@
 // under the License.
 //
 
-package com.cloud.hypervisor.xenserver.resource.wrapper;
-
+package com.cloud.hypervisor.xenserver.resource.wrapper.citrix;
 import java.util.Map;
-
 import com.cloud.agent.api.GetVmIpAddressCommand;
+import com.cloud.resource.ResourceWrapper;
 import com.cloud.utils.net.NetUtils;
 import com.xensource.xenapi.Connection;
 import com.xensource.xenapi.VM;
@@ -34,6 +33,7 @@ import com.cloud.hypervisor.xenserver.resource.CitrixResourceBase;
 import com.cloud.resource.CommandWrapper;
 import org.apache.xmlrpc.XmlRpcException;
 
+@ResourceWrapper(handles =  GetVmIpAddressCommand.class)
 public final class CitrixGetVmIpAddressCommandWrapper extends CommandWrapper<GetVmIpAddressCommand, Answer, CitrixResourceBase> {
 
     private static final Logger s_logger = Logger.getLogger(CitrixGetVmIpAddressCommandWrapper.class);

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/6e96fc6f/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 3364655..894749c 100644
--- a/server/src/com/cloud/vm/UserVmManagerImpl.java
+++ b/server/src/com/cloud/vm/UserVmManagerImpl.java
@@ -37,6 +37,7 @@ import javax.ejb.Local;
 import javax.inject.Inject;
 import javax.naming.ConfigurationException;
 
+import com.cloud.event.ActionEvent;
 import org.apache.cloudstack.storage.datastore.db.TemplateDataStoreDao;
 import org.apache.cloudstack.storage.datastore.db.TemplateDataStoreVO;
 import org.apache.commons.codec.binary.Base64;
@@ -134,10 +135,8 @@ import com.cloud.deploy.dao.PlannerHostReservationDao;
 import com.cloud.domain.DomainVO;
 import com.cloud.domain.Domain;
 import com.cloud.domain.dao.DomainDao;
-import com.cloud.event.ActionEvent;
 import com.cloud.event.EventTypes;
 import com.cloud.event.ActionEventUtils;
-import com.cloud.event.ActionEventUtils;
 import com.cloud.event.UsageEventUtils;
 import com.cloud.event.UsageEventVO;
 import com.cloud.event.dao.UsageEventDao;


[9/9] git commit: updated refs/heads/master to b616522

Posted by ja...@apache.org.
 CLOUDSTACK-8324: Corrected the file paths for xenserver command files
This closes #315


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

Branch: refs/heads/master
Commit: b616522088b9589fb50cf3858b806d99aae87213
Parents: 6e96fc6
Author: Jayapal <ja...@apache.org>
Authored: Thu May 28 17:01:07 2015 +0530
Committer: Jayapal <ja...@apache.org>
Committed: Thu May 28 17:02:09 2015 +0530

----------------------------------------------------------------------
 .../CitrixGetVmIpAddressCommandWrapper.java     | 81 -------------------
 .../CitrixGetVmIpAddressCommandWrapper.java     | 82 ++++++++++++++++++++
 2 files changed, 82 insertions(+), 81 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/b6165220/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/citrix/CitrixGetVmIpAddressCommandWrapper.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/citrix/CitrixGetVmIpAddressCommandWrapper.java b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/citrix/CitrixGetVmIpAddressCommandWrapper.java
deleted file mode 100644
index bbfec2c..0000000
--- a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/citrix/CitrixGetVmIpAddressCommandWrapper.java
+++ /dev/null
@@ -1,81 +0,0 @@
-//
-// 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.xenserver.resource.wrapper.citrix;
-import java.util.Map;
-import com.cloud.agent.api.GetVmIpAddressCommand;
-import com.cloud.resource.ResourceWrapper;
-import com.cloud.utils.net.NetUtils;
-import com.xensource.xenapi.Connection;
-import com.xensource.xenapi.VM;
-import com.xensource.xenapi.VMGuestMetrics;
-import com.xensource.xenapi.Types;
-import org.apache.log4j.Logger;
-
-import com.cloud.agent.api.Answer;
-import com.cloud.hypervisor.xenserver.resource.CitrixResourceBase;
-import com.cloud.resource.CommandWrapper;
-import org.apache.xmlrpc.XmlRpcException;
-
-@ResourceWrapper(handles =  GetVmIpAddressCommand.class)
-public final class CitrixGetVmIpAddressCommandWrapper extends CommandWrapper<GetVmIpAddressCommand, Answer, CitrixResourceBase> {
-
-    private static final Logger s_logger = Logger.getLogger(CitrixGetVmIpAddressCommandWrapper.class);
-
-    @Override
-    public Answer execute(final GetVmIpAddressCommand command, final CitrixResourceBase citrixResourceBase) {
-        final Connection conn = citrixResourceBase.getConnection();
-
-        String vmName = command.getVmName();
-        String networkCidr = command.getVmNetworkCidr();
-        boolean result = false;
-        String errorMsg = null;
-        String vmIp = null;
-
-        try {
-            VM vm = citrixResourceBase.getVM(conn, vmName);
-            VMGuestMetrics mtr = vm.getGuestMetrics(conn);
-            VMGuestMetrics.Record rec = mtr.getRecord(conn);
-            Map<String, String> vmIpsMap = rec.networks;
-
-            for (String ipAddr: vmIpsMap.values()) {
-                if (NetUtils.isIpWithtInCidrRange(ipAddr, networkCidr)) {
-                    vmIp = ipAddr;
-                    break;
-                }
-            }
-
-            if (vmIp != null) {
-                s_logger.debug("VM " +vmName + " ip address got retrieved "+vmIp);
-                result = true;
-                return new Answer(command, result, vmIp);
-            }
-
-        }catch (Types.XenAPIException e) {
-            s_logger.debug("Got exception in GetVmIpAddressCommand "+ e.getMessage());
-            errorMsg = "Failed to retrived vm ip addr, exception: "+e.getMessage();
-        }catch (XmlRpcException e) {
-            s_logger.debug("Got exception in GetVmIpAddressCommand "+ e.getMessage());
-            errorMsg = "Failed to retrived vm ip addr, exception: "+e.getMessage();
-        }
-
-        return new Answer(command, result, errorMsg);
-
-    }
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/b6165220/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/xenbase/CitrixGetVmIpAddressCommandWrapper.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/xenbase/CitrixGetVmIpAddressCommandWrapper.java b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/xenbase/CitrixGetVmIpAddressCommandWrapper.java
new file mode 100644
index 0000000..dd1ee28
--- /dev/null
+++ b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/wrapper/xenbase/CitrixGetVmIpAddressCommandWrapper.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.xenserver.resource.wrapper.xenbase;
+
+import java.util.Map;
+import com.cloud.agent.api.GetVmIpAddressCommand;
+import com.cloud.resource.ResourceWrapper;
+import com.cloud.utils.net.NetUtils;
+import com.xensource.xenapi.Connection;
+import com.xensource.xenapi.VM;
+import com.xensource.xenapi.VMGuestMetrics;
+import com.xensource.xenapi.Types;
+import org.apache.log4j.Logger;
+
+import com.cloud.agent.api.Answer;
+import com.cloud.hypervisor.xenserver.resource.CitrixResourceBase;
+import com.cloud.resource.CommandWrapper;
+import org.apache.xmlrpc.XmlRpcException;
+
+@ResourceWrapper(handles =  GetVmIpAddressCommand.class)
+public final class CitrixGetVmIpAddressCommandWrapper extends CommandWrapper<GetVmIpAddressCommand, Answer, CitrixResourceBase> {
+
+    private static final Logger s_logger = Logger.getLogger(CitrixGetVmIpAddressCommandWrapper.class);
+
+    @Override
+    public Answer execute(final GetVmIpAddressCommand command, final CitrixResourceBase citrixResourceBase) {
+        final Connection conn = citrixResourceBase.getConnection();
+
+        String vmName = command.getVmName();
+        String networkCidr = command.getVmNetworkCidr();
+        boolean result = false;
+        String errorMsg = null;
+        String vmIp = null;
+
+        try {
+            VM vm = citrixResourceBase.getVM(conn, vmName);
+            VMGuestMetrics mtr = vm.getGuestMetrics(conn);
+            VMGuestMetrics.Record rec = mtr.getRecord(conn);
+            Map<String, String> vmIpsMap = rec.networks;
+
+            for (String ipAddr: vmIpsMap.values()) {
+                if (NetUtils.isIpWithtInCidrRange(ipAddr, networkCidr)) {
+                    vmIp = ipAddr;
+                    break;
+                }
+            }
+
+            if (vmIp != null) {
+                s_logger.debug("VM " +vmName + " ip address got retrieved "+vmIp);
+                result = true;
+                return new Answer(command, result, vmIp);
+            }
+
+        }catch (Types.XenAPIException e) {
+            s_logger.debug("Got exception in GetVmIpAddressCommand "+ e.getMessage());
+            errorMsg = "Failed to retrived vm ip addr, exception: "+e.getMessage();
+        }catch (XmlRpcException e) {
+            s_logger.debug("Got exception in GetVmIpAddressCommand "+ e.getMessage());
+            errorMsg = "Failed to retrived vm ip addr, exception: "+e.getMessage();
+        }
+
+        return new Answer(command, result, errorMsg);
+
+    }
+}
\ No newline at end of file


[2/9] git commit: updated refs/heads/master to b616522

Posted by ja...@apache.org.
CLOUDSTACK-8324: shared network without any service


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

Branch: refs/heads/master
Commit: 599125499be066555f08cd06d2891da6b89ff2e4
Parents: b155129
Author: Jayapal <ja...@apache.org>
Authored: Wed May 13 17:43:04 2015 +0530
Committer: Jayapal <ja...@apache.org>
Committed: Thu May 28 15:42:07 2015 +0530

----------------------------------------------------------------------
 .../src/com/cloud/network/NetworkModelImpl.java  | 19 +++++++++++++++++++
 1 file changed, 19 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/59912549/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 178796b..b867b64 100644
--- a/server/src/com/cloud/network/NetworkModelImpl.java
+++ b/server/src/com/cloud/network/NetworkModelImpl.java
@@ -895,6 +895,25 @@ public class NetworkModelImpl extends ManagerBase implements NetworkModel {
     }
 
     @Override
+    public  boolean isSharedNetworkWithoutServices (long networkId) {
+
+        Network network = _networksDao.findById(networkId);
+
+        if (network != null && network.getGuestType() != GuestType.Shared) {
+            return false;
+        }
+
+        List<Service> services = listNetworkOfferingServices(network.getNetworkOfferingId());
+
+        if (services == null || services.isEmpty()) {
+            return true;
+        }
+
+        return false;
+    }
+
+
+    @Override
     public boolean areServicesSupportedByNetworkOffering(long networkOfferingId, Service... services) {
         return (_ntwkOfferingSrvcDao.areServicesSupportedByNetworkOffering(networkOfferingId, services));
     }


[7/9] git commit: updated refs/heads/master to b616522

Posted by ja...@apache.org.
CLOUDSTACK-8324: Added unit test cases for GetVmIpAddressCommand


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

Branch: refs/heads/master
Commit: 3a8d1f7c55b92ec24a43e8a4852c515f1a3eec1b
Parents: 69ea932
Author: Jayapal <ja...@apache.org>
Authored: Tue May 26 18:03:23 2015 +0530
Committer: Jayapal <ja...@apache.org>
Committed: Thu May 28 15:56:37 2015 +0530

----------------------------------------------------------------------
 .../xenbase/CitrixRequestWrapperTest.java       | 35 ++++++++++++++++++++
 1 file changed, 35 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/3a8d1f7c/plugins/hypervisors/xenserver/test/com/cloud/hypervisor/xenserver/resource/wrapper/xenbase/CitrixRequestWrapperTest.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xenserver/test/com/cloud/hypervisor/xenserver/resource/wrapper/xenbase/CitrixRequestWrapperTest.java b/plugins/hypervisors/xenserver/test/com/cloud/hypervisor/xenserver/resource/wrapper/xenbase/CitrixRequestWrapperTest.java
index 1071485..86c158b 100644
--- a/plugins/hypervisors/xenserver/test/com/cloud/hypervisor/xenserver/resource/wrapper/xenbase/CitrixRequestWrapperTest.java
+++ b/plugins/hypervisors/xenserver/test/com/cloud/hypervisor/xenserver/resource/wrapper/xenbase/CitrixRequestWrapperTest.java
@@ -29,10 +29,14 @@ import static org.mockito.Mockito.when;
 
 import java.net.URI;
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.Hashtable;
 import java.util.List;
 import java.util.Map;
 
+import com.cloud.agent.api.GetVmIpAddressCommand;
+import com.xensource.xenapi.VM;
+import com.xensource.xenapi.VMGuestMetrics;
 import org.apache.cloudstack.storage.command.AttachAnswer;
 import org.apache.cloudstack.storage.command.AttachCommand;
 import org.apache.cloudstack.storage.datastore.db.StoragePoolVO;
@@ -1830,6 +1834,37 @@ public class CitrixRequestWrapperTest {
         final Answer answer = wrapper.execute(command, citrixResourceBase);
         assertTrue(answer.getResult());
     }
+
+    @Test
+    public void testGetVmIpAddressCommand() throws XenAPIException, XmlRpcException {
+
+        final Connection conn = Mockito.mock(Connection.class);
+        final VM vm = Mockito.mock(VM.class);
+        final VMGuestMetrics mtr = Mockito.mock(VMGuestMetrics.class);
+        VMGuestMetrics.Record rec = Mockito.mock(VMGuestMetrics.Record.class);
+
+        Map<String, String> vmIpsMap = new HashMap<>();
+        vmIpsMap.put("Test", "10.1.1.121");
+        rec.networks = vmIpsMap;
+
+        final GetVmIpAddressCommand getVmIpAddrCmd = new GetVmIpAddressCommand("Test", "10.1.1.0/24", false);
+
+        final CitrixRequestWrapper wrapper = CitrixRequestWrapper.getInstance();
+        assertNotNull(wrapper);
+
+
+        when(citrixResourceBase.getConnection()).thenReturn(conn);
+        when(citrixResourceBase.getVM(conn, getVmIpAddrCmd.getVmName())).thenReturn(vm);
+        when(vm.getGuestMetrics(conn)).thenReturn(mtr);
+        when(mtr.getRecord(conn)).thenReturn(rec);
+
+        final Answer answer = wrapper.execute(getVmIpAddrCmd, citrixResourceBase);
+
+        verify(citrixResourceBase, times(1)).getConnection();
+
+        assertTrue(answer.getResult());
+    }
+
 }
 
 class NotAValidCommand extends Command {


[6/9] git commit: updated refs/heads/master to b616522

Posted by ja...@apache.org.
CLOUDSTACK-8324: Added config drive support for xenserver


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

Branch: refs/heads/master
Commit: e40798618393bd937722badc5f35c7317edee456
Parents: 7984ae5
Author: Jayapal <ja...@apache.org>
Authored: Tue May 26 10:05:39 2015 +0530
Committer: Jayapal <ja...@apache.org>
Committed: Thu May 28 15:51:50 2015 +0530

----------------------------------------------------------------------
 .../cloud/agent/api/to/VirtualMachineTO.java    |  39 +++
 api/src/com/cloud/network/NetworkModel.java     |   4 +
 api/src/com/cloud/vm/UserVmService.java         |   5 +
 api/src/com/cloud/vm/VirtualMachineProfile.java |  15 +
 .../com/cloud/vm/VirtualMachineProfileImpl.java |  50 +++
 .../xenserver/resource/CitrixResourceBase.java  | 320 +++++++++++++++++++
 .../src/com/cloud/network/NetworkModelImpl.java |  55 ++++
 server/src/com/cloud/vm/UserVmManagerImpl.java  |  27 +-
 8 files changed, 514 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/e4079861/api/src/com/cloud/agent/api/to/VirtualMachineTO.java
----------------------------------------------------------------------
diff --git a/api/src/com/cloud/agent/api/to/VirtualMachineTO.java b/api/src/com/cloud/agent/api/to/VirtualMachineTO.java
index 3e508ee..c367ec9 100644
--- a/api/src/com/cloud/agent/api/to/VirtualMachineTO.java
+++ b/api/src/com/cloud/agent/api/to/VirtualMachineTO.java
@@ -16,6 +16,7 @@
 // under the License.
 package com.cloud.agent.api.to;
 
+import java.util.List;
 import java.util.Map;
 
 import com.cloud.template.VirtualMachineTemplate.BootloaderType;
@@ -62,6 +63,12 @@ public class VirtualMachineTO {
     NicTO[] nics;
     GPUDeviceTO gpuDevice;
     Integer vcpuMaxLimit;
+    List<String[]> vmData = null;
+
+    String configDriveLabel = null;
+    String configDriveIsoRootFolder = null;
+    String configDriveIsoFile = null;
+
 
     public VirtualMachineTO(long id, String instanceName, VirtualMachine.Type type, int cpus, Integer speed, long minRam, long maxRam, BootloaderType bootloader,
             String os, boolean enableHA, boolean limitCpuUse, String vncPassword) {
@@ -292,4 +299,36 @@ public class VirtualMachineTO {
         this.vcpuMaxLimit = vcpuMaxLimit;
     }
 
+    public List<String[]> getVmData() {
+        return vmData;
+    }
+
+    public void setVmData(List<String[]> vmData) {
+        this.vmData = vmData;
+    }
+
+    public String getConfigDriveLabel() {
+        return configDriveLabel;
+    }
+
+    public void setConfigDriveLabel(String configDriveLabel) {
+        this.configDriveLabel = configDriveLabel;
+    }
+
+    public String getConfigDriveIsoRootFolder() {
+        return configDriveIsoRootFolder;
+    }
+
+    public void setConfigDriveIsoRootFolder(String configDriveIsoRootFolder) {
+        this.configDriveIsoRootFolder = configDriveIsoRootFolder;
+    }
+
+    public String getConfigDriveIsoFile() {
+        return configDriveIsoFile;
+    }
+
+    public void setConfigDriveIsoFile(String configDriveIsoFile) {
+        this.configDriveIsoFile = configDriveIsoFile;
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/e4079861/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 70132d2..780f97d 100644
--- a/api/src/com/cloud/network/NetworkModel.java
+++ b/api/src/com/cloud/network/NetworkModel.java
@@ -277,4 +277,8 @@ public interface NetworkModel {
     boolean isNetworkReadyForGc(long networkId);
 
     boolean getNetworkEgressDefaultPolicy(Long networkId);
+
+    List<String[]> generateVmData(String userData, String serviceOffering, String zoneName,
+                                  String vmName, long vmId, String publicKey, String password, Boolean isWindows);
+
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/e4079861/api/src/com/cloud/vm/UserVmService.java
----------------------------------------------------------------------
diff --git a/api/src/com/cloud/vm/UserVmService.java b/api/src/com/cloud/vm/UserVmService.java
index c0c0335..2935815 100644
--- a/api/src/com/cloud/vm/UserVmService.java
+++ b/api/src/com/cloud/vm/UserVmService.java
@@ -55,8 +55,13 @@ import com.cloud.template.VirtualMachineTemplate;
 import com.cloud.user.Account;
 import com.cloud.uservm.UserVm;
 import com.cloud.utils.exception.ExecutionException;
+import org.apache.cloudstack.framework.config.ConfigKey;
 
 public interface UserVmService {
+
+    static final ConfigKey<String> VmConfigDriveLabel = new ConfigKey<String>("Hidden", String.class, "vm.configdrive.label", "config",
+            "The default lable name for the config drive", false);
+
     /**
      * Destroys one virtual machine
      *

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/e4079861/api/src/com/cloud/vm/VirtualMachineProfile.java
----------------------------------------------------------------------
diff --git a/api/src/com/cloud/vm/VirtualMachineProfile.java b/api/src/com/cloud/vm/VirtualMachineProfile.java
index d0fea49..c092d84 100644
--- a/api/src/com/cloud/vm/VirtualMachineProfile.java
+++ b/api/src/com/cloud/vm/VirtualMachineProfile.java
@@ -34,9 +34,24 @@ import com.cloud.user.Account;
  */
 public interface VirtualMachineProfile {
 
+    List<String[]> getVmData();
+
+    void setVmData(List<String[]> vmData);
+
+    void setConfigDriveLabel(String configDriveLabel);
+
+    String getConfigDriveIsoRootFolder();
+
+    void setConfigDriveIsoRootFolder(String configDriveIsoRootFolder);
+
+    String getConfigDriveIsoFile();
+
+    void setConfigDriveIsoFile(String isoFile);
+
     public static class Param {
 
         public static final Param VmPassword = new Param("VmPassword");
+        public static final Param VmSshPubKey = new Param("VmSshPubKey");
         public static final Param ControlNic = new Param("ControlNic");
         public static final Param ReProgramGuestNetworks = new Param("RestartNetwork");
         public static final Param PxeSeverType = new Param("PxeSeverType");

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/e4079861/engine/components-api/src/com/cloud/vm/VirtualMachineProfileImpl.java
----------------------------------------------------------------------
diff --git a/engine/components-api/src/com/cloud/vm/VirtualMachineProfileImpl.java b/engine/components-api/src/com/cloud/vm/VirtualMachineProfileImpl.java
index 4284a21..7a0a07c 100644
--- a/engine/components-api/src/com/cloud/vm/VirtualMachineProfileImpl.java
+++ b/engine/components-api/src/com/cloud/vm/VirtualMachineProfileImpl.java
@@ -51,6 +51,13 @@ public class VirtualMachineProfileImpl implements VirtualMachineProfile {
 
     VirtualMachine.Type _type;
 
+    List<String[]> vmData = null;
+
+    String configDriveLabel = null;
+    String configDriveIsoBaseLocation = "/tmp/"; //TODO: Make this location configurable.
+    String configDriveIsoRootFolder = null;
+    String configDriveIsoFile = null;
+
     public VirtualMachineProfileImpl(VirtualMachine vm, VirtualMachineTemplate template, ServiceOffering offering, Account owner, Map<Param, Object> params) {
         _vm = vm;
         _template = template;
@@ -255,4 +262,47 @@ public class VirtualMachineProfileImpl implements VirtualMachineProfile {
     public Float getMemoryOvercommitRatio() {
         return memoryOvercommitRatio;
     }
+
+    @Override
+    public List<String[]> getVmData() {
+        return vmData;
+    }
+
+    @Override
+    public void setVmData(List<String[]> vmData) {
+        this.vmData = vmData;
+    }
+
+    public String getConfigDriveLabel() {
+        return configDriveLabel;
+    }
+
+    @Override
+    public void setConfigDriveLabel(String configDriveLabel) {
+        this.configDriveLabel = configDriveLabel;
+    }
+
+    @Override
+    public String getConfigDriveIsoRootFolder() {
+        return configDriveIsoRootFolder;
+    }
+
+    @Override
+    public void setConfigDriveIsoRootFolder(String configDriveIsoRootFolder) {
+        this.configDriveIsoRootFolder = configDriveIsoRootFolder;
+    }
+
+    public String getConfigDriveIsoBaseLocation() {
+        return configDriveIsoBaseLocation;
+    }
+
+    @Override
+    public String getConfigDriveIsoFile() {
+        return configDriveIsoFile;
+    }
+
+    @Override
+    public void setConfigDriveIsoFile(String isoFile) {
+        this.configDriveIsoFile = isoFile;
+    }
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/e4079861/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/CitrixResourceBase.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/CitrixResourceBase.java b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/CitrixResourceBase.java
index ef0631e..5366927 100644
--- a/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/CitrixResourceBase.java
+++ b/plugins/hypervisors/xenserver/src/com/cloud/hypervisor/xenserver/resource/CitrixResourceBase.java
@@ -17,7 +17,9 @@
 package com.cloud.hypervisor.xenserver.resource;
 
 import java.io.BufferedReader;
+import java.io.BufferedWriter;
 import java.io.File;
+import java.io.FileWriter;
 import java.io.IOException;
 import java.io.InputStreamReader;
 import java.net.MalformedURLException;
@@ -48,6 +50,7 @@ import javax.xml.parsers.ParserConfigurationException;
 
 import org.apache.cloudstack.storage.to.TemplateObjectTO;
 import org.apache.cloudstack.storage.to.VolumeObjectTO;
+import org.apache.commons.io.FileUtils;
 import org.apache.log4j.Logger;
 import org.apache.xmlrpc.XmlRpcException;
 import org.w3c.dom.Document;
@@ -251,6 +254,10 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
 
     protected VirtualRoutingResource _vrResource;
 
+    protected  String _configDriveIsopath = "/opt/xensource/packages/configdrive_iso/";
+    protected  String _configDriveSRName = "ConfigDriveISOs";
+    protected  String _attachIsoDeviceNum = "3";
+
     protected int _wait;
     // Hypervisor specific params with generic value, may need to be overridden
     // for specific versions
@@ -4940,4 +4947,317 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
             }
         }
     }
+
+    public boolean createAndAttachConfigDriveIsoForVM(Connection conn, VM vm, List<String[]> vmDataList, String configDriveLabel) throws XenAPIException, XmlRpcException {
+
+        String vmName = vm.getNameLabel(conn);
+
+        // create SR
+        SR sr =  createLocalIsoSR(conn, _configDriveSRName+_host.getIp());
+        if (sr == null) {
+            s_logger.debug("Failed to create local SR for the config drive");
+            return false;
+        }
+
+        s_logger.debug("Creating vm data files in config drive for vm "+vmName);
+        // 1. create vm data files
+        if (!createVmdataFiles(vmName, vmDataList, configDriveLabel)) {
+            s_logger.debug("Failed to create vm data files in config drive for vm "+vmName);
+            return false;
+        }
+
+        // 2. copy config drive iso to host
+        if (!copyConfigDriveIsoToHost(conn, sr, vmName)) {
+            return false;
+        }
+
+        // 3. attachIsoToVM
+        if (!attachConfigDriveIsoToVm(conn, vm)) {
+            return false;
+        }
+
+        return true;
+    }
+
+    public boolean createVmdataFiles(String vmName, List<String[]> vmDataList, String configDriveLabel) {
+
+        // add vm iso to the isolibrary
+        String isoPath = "/tmp/"+vmName+"/configDrive/";
+        String configDriveName = "cloudstack/";
+
+        //create folder for the VM
+        //Remove the folder before creating it.
+
+        try {
+            deleteLocalFolder("/tmp/"+isoPath);
+        } catch (IOException e) {
+            s_logger.debug("Failed to delete the exiting config drive for vm "+vmName+ " "+ e.getMessage());
+        } catch (Exception e) {
+            s_logger.debug("Failed to delete the exiting config drive for vm "+vmName+ " "+ e.getMessage());
+        }
+
+
+        if (vmDataList != null) {
+            for (String[] item : vmDataList) {
+                String dataType = item[0];
+                String fileName = item[1];
+                String content = item[2];
+
+                // create file with content in folder
+
+                if (dataType != null && !dataType.isEmpty()) {
+                    //create folder
+                    String  folder = isoPath+configDriveName+dataType;
+                    if (folder != null && !folder.isEmpty()) {
+                        File dir = new File(folder);
+                        boolean result = true;
+
+                        try {
+                            if (!dir.exists()) {
+                                dir.mkdirs();
+                            }
+                        }catch (SecurityException ex) {
+                            s_logger.debug("Failed to create dir "+ ex.getMessage());
+                            return false;
+                        }
+
+                        if (result && content != null && !content.isEmpty()) {
+                            try {
+                                File file = new File(folder+"/"+fileName+".txt");
+                                FileWriter fw = new FileWriter(file.getAbsoluteFile());
+                                BufferedWriter bw = new BufferedWriter(fw);
+                                bw.write(content);
+                                bw.close();
+                                s_logger.debug("created file: "+ file + " in folder:"+folder);
+                            } catch (IOException ex) {
+                                s_logger.debug("Failed to create file "+ ex.getMessage());
+                                return false;
+                            }
+                        }
+                    }
+                }
+            }
+            s_logger.debug("Created the vm data in "+ isoPath);
+        }
+
+        String s = null;
+        try {
+
+            String cmd =  "mkisofs -iso-level 3 -V "+ configDriveLabel +" -o "+ isoPath+vmName +".iso " + isoPath;
+            Process p = Runtime.getRuntime().exec(cmd);
+
+            BufferedReader stdInput = new BufferedReader(new
+                    InputStreamReader(p.getInputStream()));
+
+            BufferedReader stdError = new BufferedReader(new
+                    InputStreamReader(p.getErrorStream()));
+
+            // read the output from the command
+            while ((s = stdInput.readLine()) != null) {
+                s_logger.debug(s);
+            }
+
+            // read any errors from the attempted command
+            while ((s = stdError.readLine()) != null) {
+                s_logger.debug(s);
+            }
+            s_logger.debug(" Created config drive ISO using the command " + cmd +" in the host "+ _host.getIp());
+        } catch (IOException e) {
+            s_logger.debug(e.getMessage());
+            return false;
+        }
+
+        return true;
+    }
+
+    public boolean copyConfigDriveIsoToHost(Connection conn, SR sr, String vmName) {
+
+        String vmIso = "/tmp/"+vmName+"/configDrive/"+vmName+".iso";
+        //scp file into the host
+        com.trilead.ssh2.Connection sshConnection = new com.trilead.ssh2.Connection(_host.getIp(), 22);
+
+        try {
+            sshConnection.connect(null, 60000, 60000);
+            if (!sshConnection.authenticateWithPassword(_username, _password.peek())) {
+                throw new CloudRuntimeException("Unable to authenticate");
+            }
+
+            s_logger.debug("scp config drive iso file "+vmIso +" to host " + _host.getIp() +" path "+_configDriveIsopath);
+            SCPClient scp = new SCPClient(sshConnection);
+            String p = "0755";
+
+            scp.put(vmIso, _configDriveIsopath, p);
+            sr.scan(conn);
+            s_logger.debug("copied config drive iso to host " + _host);
+        } catch (IOException e) {
+            s_logger.debug("failed to copy configdrive iso " + vmIso + " to host " + _host, e);
+            return false;
+        } catch (XmlRpcException e) {
+            s_logger.debug("Failed to scan config drive iso SR "+ _configDriveSRName+_host.getIp() + " in host "+ _host, e);
+            return false;
+        } finally {
+            sshConnection.close();
+            //clean up the config drive files
+
+            String configDir = "/tmp/"+vmName;
+            try {
+                deleteLocalFolder(configDir);
+                s_logger.debug("Successfully cleaned up config drive directory " + configDir
+                        + " after copying it to host ");
+            } catch (Exception e) {
+                s_logger.debug("Failed to delete config drive folder :" + configDir + " for VM " + vmName + " "
+                        + e.getMessage());
+            }
+        }
+
+        return true;
+    }
+
+    public boolean attachConfigDriveIsoToVm(Connection conn, VM vm) throws XenAPIException, XmlRpcException {
+
+        String vmName = vm.getNameLabel(conn);
+        String isoURL = _configDriveIsopath + vmName+".iso";
+        VDI srVdi;
+
+        //1. find the vdi of the iso
+        //2. find the vbd for the vdi
+        //3. attach iso to vm
+
+        try {
+            Set<VDI> vdis = VDI.getByNameLabel(conn, vmName+".iso");
+            if (vdis.isEmpty()) {
+                throw new CloudRuntimeException("Could not find ISO with URL: " + isoURL);
+            }
+            srVdi =  vdis.iterator().next();
+
+        } catch (XenAPIException e) {
+            s_logger.debug("Unable to get config drive iso: " + isoURL + " due to " + e.toString());
+            return false;
+        } catch (Exception e) {
+            s_logger.debug("Unable to get config drive iso: " + isoURL + " due to " + e.toString());
+            return false;
+        }
+
+        VBD isoVBD = null;
+
+        // Find the VM's CD-ROM VBD
+        Set<VBD> vbds = vm.getVBDs(conn);
+        for (VBD vbd : vbds) {
+            Types.VbdType type = vbd.getType(conn);
+
+            VBD.Record vbdr = vbd.getRecord(conn);
+
+            // if the device exists then attach it
+            if (!vbdr.userdevice.equals(_attachIsoDeviceNum) && type == Types.VbdType.CD) {
+                isoVBD = vbd;
+                break;
+            }
+        }
+
+        if (isoVBD == null) {
+            //create vbd
+            VBD.Record cfgDriveVbdr = new VBD.Record();
+            cfgDriveVbdr.VM = vm;
+            cfgDriveVbdr.empty = true;
+            cfgDriveVbdr.bootable = false;
+            cfgDriveVbdr.userdevice = "autodetect";
+            cfgDriveVbdr.mode = Types.VbdMode.RO;
+            cfgDriveVbdr.type = Types.VbdType.CD;
+            VBD cfgDriveVBD = VBD.create(conn, cfgDriveVbdr);
+            isoVBD = cfgDriveVBD;
+
+            s_logger.debug("Created CD-ROM VBD for VM: " + vm);
+        }
+
+        if (isoVBD != null) {
+            // If an ISO is already inserted, eject it
+            if (isoVBD.getEmpty(conn) == false) {
+                isoVBD.eject(conn);
+            }
+
+            try {
+                // Insert the new ISO
+                isoVBD.insert(conn, srVdi);
+                s_logger.debug("Attached config drive iso to vm " + vmName);
+            }catch (XmlRpcException ex) {
+                s_logger.debug("Failed to attach config drive iso to vm " + vmName);
+                return false;
+            }
+        }
+
+        return true;
+    }
+
+    public SR createLocalIsoSR(Connection conn, String srName) throws XenAPIException, XmlRpcException {
+
+        // if config drive sr already exists then return
+        SR sr = getSRByNameLabelandHost(conn, _configDriveSRName+_host.getIp());
+
+        if (sr != null) {
+            s_logger.debug("Config drive SR already exist, returing it");
+            return sr;
+        }
+
+        try{
+            Map<String, String> deviceConfig = new HashMap<String, String>();
+
+            com.trilead.ssh2.Connection sshConnection = new com.trilead.ssh2.Connection(_host.getIp(), 22);
+            try {
+                sshConnection.connect(null, 60000, 60000);
+                if (!sshConnection.authenticateWithPassword(_username, _password.peek())) {
+                    throw new CloudRuntimeException("Unable to authenticate");
+                }
+
+                String cmd = "mkdir -p " + _configDriveIsopath;
+                if (!SSHCmdHelper.sshExecuteCmd(sshConnection, cmd)) {
+                    throw new CloudRuntimeException("Cannot create directory configdrive_iso on XenServer hosts");
+                }
+            } catch (IOException e) {
+                throw new CloudRuntimeException("Unable to create iso folder", e);
+            } finally {
+                sshConnection.close();
+            }
+            s_logger.debug("Created the config drive SR " + srName +" folder path "+ _configDriveIsopath);
+
+            deviceConfig.put("location",  _configDriveIsopath);
+            deviceConfig.put("legacy_mode", "true");
+            Host host = Host.getByUuid(conn, _host.getUuid());
+            String type = SRType.ISO.toString();
+            sr = SR.create(conn, host, deviceConfig, new Long(0),  _configDriveIsopath, "iso", type, "iso", false, new HashMap<String, String>());
+
+            sr.setNameLabel(conn, srName);
+            sr.setNameDescription(conn, deviceConfig.get("location"));
+
+            sr.scan(conn);
+            s_logger.debug("Config drive ISO SR at the path " + _configDriveIsopath  +" got created in host " + _host);
+            return sr;
+        } catch (XenAPIException e) {
+            String msg = "createLocalIsoSR failed! mountpoint " + e.toString();
+            s_logger.warn(msg, e);
+            throw new CloudRuntimeException(msg, e);
+        } catch (Exception e) {
+            String msg = "createLocalIsoSR failed! mountpoint:  due to " + e.getMessage();
+            s_logger.warn(msg, e);
+            throw new CloudRuntimeException(msg, e);
+        }
+
+    }
+
+
+    public void deleteLocalFolder(String directory) throws Exception {
+        if (directory == null || directory.isEmpty()) {
+            String msg = "Invalid directory path (null/empty) detected. Cannot delete specified directory.";
+            s_logger.debug(msg);
+            throw new Exception(msg);
+        }
+
+        try {
+            FileUtils.deleteDirectory(new File(directory));
+        } catch (IOException e) {
+            // IOException here means failure to delete. Not swallowing it here to
+            // let the caller handle with appropriate contextual log message.
+            throw e;
+        }
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/e4079861/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 b867b64..a49da68 100644
--- a/server/src/com/cloud/network/NetworkModelImpl.java
+++ b/server/src/com/cloud/network/NetworkModelImpl.java
@@ -19,6 +19,8 @@ package com.cloud.network;
 
 import java.math.BigInteger;
 import java.security.InvalidParameterException;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.HashSet;
@@ -32,6 +34,8 @@ import javax.ejb.Local;
 import javax.inject.Inject;
 import javax.naming.ConfigurationException;
 
+import com.cloud.utils.StringUtils;
+import org.apache.commons.codec.binary.Base64;
 import org.apache.log4j.Logger;
 
 import org.apache.cloudstack.acl.ControlledEntity.ACLType;
@@ -2281,4 +2285,55 @@ public class NetworkModelImpl extends ManagerBase implements NetworkModel {
             throw ex;
         }
     }
+
+    @Override
+    public List<String[]> generateVmData(String userData, String serviceOffering, String zoneName,
+                                         String vmName, long vmId, String publicKey, String password, Boolean isWindows) {
+        final List<String[]> vmData = new ArrayList<String[]>();
+
+        if (userData != null) {
+            vmData.add(new String[]{"userdata", "user-data", new String(Base64.decodeBase64(userData.getBytes()))});
+        }
+        vmData.add(new String[]{"metadata", "service-offering", StringUtils.unicodeEscape(serviceOffering)});
+        vmData.add(new String[]{"metadata", "availability-zone", StringUtils.unicodeEscape(zoneName)});
+        vmData.add(new String[]{"metadata", "local-hostname", StringUtils.unicodeEscape(vmName)});
+        vmData.add(new String[]{"metadata", "instance-id", vmName});
+        vmData.add(new String[]{"metadata", "vm-id", String.valueOf(vmId)});
+        vmData.add(new String[]{"metadata", "public-keys", publicKey});
+
+        String cloudIdentifier = _configDao.getValue("cloud.identifier");
+        if (cloudIdentifier == null) {
+            cloudIdentifier = "";
+        } else {
+            cloudIdentifier = "CloudStack-{" + cloudIdentifier + "}";
+        }
+        vmData.add(new String[]{"metadata", "cloud-identifier", cloudIdentifier});
+
+        if (password != null && !password.isEmpty() && !password.equals("saved_password")) {
+
+            // Here we are calculating MD5 checksum to reduce the over head of calculating MD5 checksum
+            // in windows VM in password reset script.
+
+            if (isWindows) {
+                MessageDigest md5 = null;
+                try {
+                    md5 = MessageDigest.getInstance("MD5");
+                } catch (NoSuchAlgorithmException e) {
+                    s_logger.error("Unexpected exception " + e.getMessage(), e);
+                    throw new CloudRuntimeException("Unable to get MD5 MessageDigest", e);
+                }
+                md5.reset();
+                md5.update(password.getBytes());
+                byte[] digest = md5.digest();
+                BigInteger bigInt = new BigInteger(1, digest);
+                String hashtext = bigInt.toString(16);
+
+                vmData.add(new String[]{"password", "vm-password-md5checksum", hashtext});
+            }
+
+            vmData.add(new String[]{"password", "vm-password", password});
+        }
+
+        return vmData;
+    }
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/e4079861/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 1661390..3364655 100644
--- a/server/src/com/cloud/vm/UserVmManagerImpl.java
+++ b/server/src/com/cloud/vm/UserVmManagerImpl.java
@@ -3501,6 +3501,31 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir
         UserVmVO vm = _vmDao.findById(profile.getId());
         Map<String, String> details = _vmDetailsDao.listDetailsKeyPairs(vm.getId());
         vm.setDetails(details);
+
+
+        // add userdata info into vm profile
+        Nic defaultNic = _networkModel.getDefaultNic(vm.getId());
+        if(defaultNic != null) {
+            Network network = _networkModel.getNetwork(defaultNic.getNetworkId());
+            if (_networkModel.isSharedNetworkWithoutServices(network.getId())) {
+                final String serviceOffering = _serviceOfferingDao.findByIdIncludingRemoved(vm.getId(), vm.getServiceOfferingId()).getDisplayText();
+                final String zoneName = _dcDao.findById(vm.getDataCenterId()).getName();
+                boolean isWindows = _guestOSCategoryDao.findById(_guestOSDao.findById(vm.getGuestOSId()).getCategoryId()).getName().equalsIgnoreCase("Windows");
+
+                List<String[]> vmData = _networkModel.generateVmData(vm.getUserData(), serviceOffering, zoneName, vm.getInstanceName(), vm.getId(),
+                        (String) profile.getParameter(VirtualMachineProfile.Param.VmSshPubKey), (String) profile.getParameter(VirtualMachineProfile.Param.VmPassword), isWindows);
+                String vmName = vm.getInstanceName();
+                String configDriveIsoRootFolder = "/tmp";
+                String isoFile = configDriveIsoRootFolder + "/" + vmName + "/configDrive/" + vmName + ".iso";
+                profile.setVmData(vmData);
+                profile.setConfigDriveLabel(VmConfigDriveLabel.value());
+                profile.setConfigDriveIsoRootFolder(configDriveIsoRootFolder);
+                profile.setConfigDriveIsoFile(isoFile);
+            }
+        }
+
+
+
         _templateMgr.prepareIsoForVmProfile(profile);
         return true;
     }
@@ -5268,7 +5293,7 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir
 
     @Override
     public ConfigKey<?>[] getConfigKeys() {
-        return new ConfigKey<?>[] {EnableDynamicallyScaleVm, VmIpFetchWaitInterval, VmIpFetchTrialMax, VmIpFetchThreadPoolMax};
+        return new ConfigKey<?>[] {EnableDynamicallyScaleVm, VmIpFetchWaitInterval, VmIpFetchTrialMax, VmIpFetchThreadPoolMax, VmConfigDriveLabel};
     }
 
     @Override


[5/9] git commit: updated refs/heads/master to b616522

Posted by ja...@apache.org.
CLOUDSTACK-8324: Config drive changes for xenserver


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

Branch: refs/heads/master
Commit: 69ea932897124e7ea146b8dbb597be4d1f09806e
Parents: e407986
Author: Jayapal <ja...@apache.org>
Authored: Tue May 26 14:42:41 2015 +0530
Committer: Jayapal <ja...@apache.org>
Committed: Thu May 28 15:51:50 2015 +0530

----------------------------------------------------------------------
 api/src/com/cloud/vm/VirtualMachineProfile.java                | 2 ++
 .../src/com/cloud/vm/VirtualMachineProfileImpl.java            | 3 ++-
 server/src/com/cloud/hypervisor/HypervisorGuruBase.java        | 6 +++++-
 server/test/com/cloud/network/MockNetworkModelImpl.java        | 5 +++++
 server/test/com/cloud/vpc/MockNetworkModelImpl.java            | 5 +++++
 5 files changed, 19 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/69ea9328/api/src/com/cloud/vm/VirtualMachineProfile.java
----------------------------------------------------------------------
diff --git a/api/src/com/cloud/vm/VirtualMachineProfile.java b/api/src/com/cloud/vm/VirtualMachineProfile.java
index c092d84..ed02dcb 100644
--- a/api/src/com/cloud/vm/VirtualMachineProfile.java
+++ b/api/src/com/cloud/vm/VirtualMachineProfile.java
@@ -38,6 +38,8 @@ public interface VirtualMachineProfile {
 
     void setVmData(List<String[]> vmData);
 
+    String getConfigDriveLabel();
+
     void setConfigDriveLabel(String configDriveLabel);
 
     String getConfigDriveIsoRootFolder();

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/69ea9328/engine/components-api/src/com/cloud/vm/VirtualMachineProfileImpl.java
----------------------------------------------------------------------
diff --git a/engine/components-api/src/com/cloud/vm/VirtualMachineProfileImpl.java b/engine/components-api/src/com/cloud/vm/VirtualMachineProfileImpl.java
index 7a0a07c..0afca73 100644
--- a/engine/components-api/src/com/cloud/vm/VirtualMachineProfileImpl.java
+++ b/engine/components-api/src/com/cloud/vm/VirtualMachineProfileImpl.java
@@ -54,7 +54,7 @@ public class VirtualMachineProfileImpl implements VirtualMachineProfile {
     List<String[]> vmData = null;
 
     String configDriveLabel = null;
-    String configDriveIsoBaseLocation = "/tmp/"; //TODO: Make this location configurable.
+    String configDriveIsoBaseLocation = "/tmp/";
     String configDriveIsoRootFolder = null;
     String configDriveIsoFile = null;
 
@@ -273,6 +273,7 @@ public class VirtualMachineProfileImpl implements VirtualMachineProfile {
         this.vmData = vmData;
     }
 
+    @Override
     public String getConfigDriveLabel() {
         return configDriveLabel;
     }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/69ea9328/server/src/com/cloud/hypervisor/HypervisorGuruBase.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/hypervisor/HypervisorGuruBase.java b/server/src/com/cloud/hypervisor/HypervisorGuruBase.java
index 0188778..72c24da 100644
--- a/server/src/com/cloud/hypervisor/HypervisorGuruBase.java
+++ b/server/src/com/cloud/hypervisor/HypervisorGuruBase.java
@@ -173,7 +173,11 @@ public abstract class HypervisorGuruBase extends AdapterBase implements Hypervis
         to.setEnableDynamicallyScaleVm(isDynamicallyScalable);
         to.setUuid(vmInstance.getUuid());
 
-        //
+        to.setVmData(vmProfile.getVmData());
+        to.setConfigDriveLabel(vmProfile.getConfigDriveLabel());
+        to.setConfigDriveIsoRootFolder(vmProfile.getConfigDriveIsoRootFolder());
+        to.setConfigDriveIsoFile(vmProfile.getConfigDriveIsoFile());
+
         return to;
     }
 

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/69ea9328/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 7b5e7cf..5c89a16 100644
--- a/server/test/com/cloud/network/MockNetworkModelImpl.java
+++ b/server/test/com/cloud/network/MockNetworkModelImpl.java
@@ -893,4 +893,9 @@ public class MockNetworkModelImpl extends ManagerBase implements NetworkModel {
         return false;  //To change body of implemented methods use File | Settings | File Templates.
     }
 
+    @Override
+    public List<String[]> generateVmData(String userData, String serviceOffering, String zoneName, String vmName, long vmId, String publicKey, String password, Boolean isWindows) {
+        return null;
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/69ea9328/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 0c9955e..8ed3b7c 100644
--- a/server/test/com/cloud/vpc/MockNetworkModelImpl.java
+++ b/server/test/com/cloud/vpc/MockNetworkModelImpl.java
@@ -908,4 +908,9 @@ public class MockNetworkModelImpl extends ManagerBase implements NetworkModel {
         return false;  //To change body of implemented methods use File | Settings | File Templates.
     }
 
+    @Override
+    public List<String[]> generateVmData(String userData, String serviceOffering, String zoneName, String vmName, long vmId, String publicKey, String password, Boolean isWindows) {
+        return null;
+    }
+
 }


[3/9] git commit: updated refs/heads/master to b616522

Posted by ja...@apache.org.
CLOUDSTACK-8324: Added vm ip fetch logic


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

Branch: refs/heads/master
Commit: 733ac2b728f4eda39b282fc03ef222cf23d546e1
Parents: 70934e8
Author: Jayapal <ja...@apache.org>
Authored: Wed May 20 10:24:44 2015 +0530
Committer: Jayapal <ja...@apache.org>
Committed: Thu May 28 15:42:08 2015 +0530

----------------------------------------------------------------------
 api/src/com/cloud/event/EventTypes.java         |   1 +
 .../cloud/agent/api/GetVmIpAddressCommand.java  |  50 +++++
 .../cloud/agent/api/routing/VmDataCommand.java  |   5 +
 .../src/com/cloud/network/dao/NetworkDao.java   |   2 +
 .../com/cloud/network/dao/NetworkDaoImpl.java   |   8 +
 server/src/com/cloud/vm/UserVmManagerImpl.java  | 225 ++++++++++++++++++-
 .../com/cloud/vpc/dao/MockNetworkDaoImpl.java   |   5 +
 7 files changed, 295 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/733ac2b7/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 78236fa..870c7e7 100644
--- a/api/src/com/cloud/event/EventTypes.java
+++ b/api/src/com/cloud/event/EventTypes.java
@@ -523,6 +523,7 @@ public class EventTypes {
     public static final String EVENT_NIC_SECONDARY_IP_ASSIGN = "NIC.SECONDARY.IP.ASSIGN";
     public static final String EVENT_NIC_SECONDARY_IP_UNASSIGN = "NIC.SECONDARY.IP.UNASSIGN";
     public static final String EVENT_NIC_SECONDARY_IP_CONFIGURE = "NIC.SECONDARY.IP.CONFIGURE";
+    public static final String EVENT_NETWORK_EXTERNAL_DHCP_VM_IPFETCH = "EXTERNAL.DHCP.VM.IP.FETCH";
 
     //Usage related events
     public static final String EVENT_USAGE_REMOVE_USAGE_RECORDS = "USAGE.REMOVE.USAGE.RECORDS";

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/733ac2b7/core/src/com/cloud/agent/api/GetVmIpAddressCommand.java
----------------------------------------------------------------------
diff --git a/core/src/com/cloud/agent/api/GetVmIpAddressCommand.java b/core/src/com/cloud/agent/api/GetVmIpAddressCommand.java
new file mode 100644
index 0000000..a9c7413
--- /dev/null
+++ b/core/src/com/cloud/agent/api/GetVmIpAddressCommand.java
@@ -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.
+//
+
+package com.cloud.agent.api;
+
+public class GetVmIpAddressCommand extends Command {
+
+    String vmName;
+    String vmNetworkCidr;
+    boolean windows = false;
+
+    public GetVmIpAddressCommand(String vmName, String vmNetworkCidr, boolean windows) {
+        this.vmName = vmName;
+        this.windows = windows;
+        this.vmNetworkCidr = vmNetworkCidr;
+    }
+
+    @Override
+    public boolean executeInSequence() {
+        return false;
+    }
+
+    public String getVmName(){
+        return vmName;
+    }
+
+    public boolean isWindows(){
+        return windows;
+    }
+
+    public String getVmNetworkCidr() {
+        return vmNetworkCidr;
+    }
+}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/733ac2b7/core/src/com/cloud/agent/api/routing/VmDataCommand.java
----------------------------------------------------------------------
diff --git a/core/src/com/cloud/agent/api/routing/VmDataCommand.java b/core/src/com/cloud/agent/api/routing/VmDataCommand.java
index 733866c..c74c7cf 100644
--- a/core/src/com/cloud/agent/api/routing/VmDataCommand.java
+++ b/core/src/com/cloud/agent/api/routing/VmDataCommand.java
@@ -56,6 +56,11 @@ public class VmDataCommand extends NetworkElementCommand {
         this.executeInSequence = executeInSequence;
     }
 
+    public VmDataCommand(String vmName) {
+        this.vmName = vmName;
+        this.vmData = new ArrayList<String[]>();
+    }
+
     public String getVmIpAddress() {
         return vmIpAddress;
     }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/733ac2b7/engine/schema/src/com/cloud/network/dao/NetworkDao.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/network/dao/NetworkDao.java b/engine/schema/src/com/cloud/network/dao/NetworkDao.java
index 037f776..49c8015 100644
--- a/engine/schema/src/com/cloud/network/dao/NetworkDao.java
+++ b/engine/schema/src/com/cloud/network/dao/NetworkDao.java
@@ -31,6 +31,8 @@ public interface NetworkDao extends GenericDao<NetworkVO, Long>, StateDao<State,
 
     List<NetworkVO> listByOwner(long ownerId);
 
+    List<NetworkVO> listByGuestType(GuestType type);
+
     List<NetworkVO> listBy(long accountId, long offeringId, long dataCenterId);
 
     List<NetworkVO> listBy(long accountId, long dataCenterId, String cidr, boolean skipVpc);

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/733ac2b7/engine/schema/src/com/cloud/network/dao/NetworkDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/network/dao/NetworkDaoImpl.java b/engine/schema/src/com/cloud/network/dao/NetworkDaoImpl.java
index 433eded..3c79985 100644
--- a/engine/schema/src/com/cloud/network/dao/NetworkDaoImpl.java
+++ b/engine/schema/src/com/cloud/network/dao/NetworkDaoImpl.java
@@ -270,6 +270,14 @@ public class NetworkDaoImpl extends GenericDaoBase<NetworkVO, Long> implements N
         return listBy(sc, null);
     }
 
+    @Override
+    public List<NetworkVO> listByGuestType(Network.GuestType type) {
+        SearchCriteria<NetworkVO> sc = AllFieldsSearch.create();
+        sc.setParameters("guestType", type);
+        return listBy(sc, null);
+    }
+
+
     public List<NetworkVO> findBy(final TrafficType trafficType, final Mode mode, final BroadcastDomainType broadcastType, final long networkOfferingId, final long dataCenterId) {
         final SearchCriteria<NetworkVO> sc = AllFieldsSearch.create();
         sc.setParameters("trafficType", trafficType);

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/733ac2b7/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 a413d11..1661390 100644
--- a/server/src/com/cloud/vm/UserVmManagerImpl.java
+++ b/server/src/com/cloud/vm/UserVmManagerImpl.java
@@ -27,8 +27,10 @@ import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Set;
 import java.util.UUID;
+import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.Executors;
 import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.ExecutorService;
 import java.util.concurrent.TimeUnit;
 
 import javax.ejb.Local;
@@ -97,6 +99,7 @@ import com.cloud.agent.api.GetVmDiskStatsCommand;
 import com.cloud.agent.api.GetVmStatsAnswer;
 import com.cloud.agent.api.GetVmStatsCommand;
 import com.cloud.agent.api.PvlanSetupCommand;
+import com.cloud.agent.api.GetVmIpAddressCommand;
 import com.cloud.agent.api.StartAnswer;
 import com.cloud.agent.api.VmDiskStatsEntry;
 import com.cloud.agent.api.VmStatsEntry;
@@ -129,9 +132,12 @@ import com.cloud.deploy.DeploymentPlanningManager;
 import com.cloud.deploy.PlannerHostReservationVO;
 import com.cloud.deploy.dao.PlannerHostReservationDao;
 import com.cloud.domain.DomainVO;
+import com.cloud.domain.Domain;
 import com.cloud.domain.dao.DomainDao;
 import com.cloud.event.ActionEvent;
 import com.cloud.event.EventTypes;
+import com.cloud.event.ActionEventUtils;
+import com.cloud.event.ActionEventUtils;
 import com.cloud.event.UsageEventUtils;
 import com.cloud.event.UsageEventVO;
 import com.cloud.event.dao.UsageEventDao;
@@ -475,11 +481,14 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir
     protected int _expungeDelay;
     protected boolean _dailyOrHourly = false;
     private int capacityReleaseInterval;
+    ExecutorService _vmIpFetchThreadExecutor;
+
 
     protected String _instance;
     protected String _zone;
     protected boolean _instanceNameFlag;
     protected int _scaleRetry;
+    protected  Map<Long, VmAndCountDetails> vmIdCountMap = new ConcurrentHashMap<>();
 
     @Inject
     ConfigurationDao _configDao;
@@ -496,6 +505,16 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir
     @Inject
     ManagementService _mgr;
 
+    static final ConfigKey<Integer> VmIpFetchWaitInterval = new ConfigKey<Integer>("Advanced", Integer.class, "externaldhcp.vmip.retrieval.interval", "180",
+            "Wait Interval (in seconds) for shared network vm dhcp ip addr fetch for next iteration ", true);
+
+    static final ConfigKey<Integer> VmIpFetchTrialMax = new ConfigKey<Integer>("Advanced", Integer.class, "externaldhcp.vmip.max.retry", "10",
+            "The max number of retrieval times for shared entwork vm dhcp ip fetch, in case of failures", true);
+
+    static final ConfigKey<Integer> VmIpFetchThreadPoolMax = new ConfigKey<Integer>("Advanced", Integer.class, "externaldhcp.vmipFetch.threadPool.max", "10",
+            "number of threads for fetching vms ip address", true);
+
+
     @Override
     public UserVmVO getVirtualMachine(long vmId) {
         return _vmDao.findById(vmId);
@@ -524,6 +543,122 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir
         _resourceLimitMgr.decrementResourceCount(accountId, ResourceType.memory, displayVm, memory);
     }
 
+    public class VmAndCountDetails {
+        long vmId;
+        int  retrievalCount = VmIpFetchTrialMax.value();
+
+
+        public VmAndCountDetails() {
+        }
+
+        public VmAndCountDetails (long vmId, int retrievalCount) {
+            this.vmId = vmId;
+            this.retrievalCount = retrievalCount;
+        }
+
+        public VmAndCountDetails (long vmId) {
+            this.vmId = vmId;
+        }
+
+        public int getRetrievalCount() {
+            return retrievalCount;
+        }
+
+        public void setRetrievalCount(int retrievalCount) {
+            this.retrievalCount = retrievalCount;
+        }
+
+        public long getVmId() {
+            return vmId;
+        }
+
+        public void setVmId(long vmId) {
+            this.vmId = vmId;
+        }
+
+        public void decrementCount() {
+            this.retrievalCount--;
+
+        }
+    }
+
+    protected class VmIpAddrFetchThread extends ManagedContextRunnable {
+
+
+        long nicId;
+        long vmId;
+        String vmName;
+        boolean isWindows;
+        Long hostId;
+        String networkCidr;
+
+        public VmIpAddrFetchThread() {
+        }
+
+        public VmIpAddrFetchThread(long vmId, long nicId, String instanceName, boolean windows, Long hostId, String networkCidr) {
+            this.vmId = vmId;
+            this.nicId = nicId;
+            this.vmName = instanceName;
+            this.isWindows = windows;
+            this.hostId = hostId;
+            this.networkCidr = networkCidr;
+        }
+
+        @Override
+        protected void runInContext() {
+            GetVmIpAddressCommand cmd = new GetVmIpAddressCommand(vmName, networkCidr, isWindows);
+            boolean decrementCount = true;
+
+            try {
+                s_logger.debug("Trying for vm "+ vmId +" nic Id "+nicId +" ip retrieval ...");
+                Answer answer = _agentMgr.send(hostId, cmd);
+                NicVO nic = _nicDao.findById(nicId);
+                if (answer.getResult()) {
+                    String vmIp = answer.getDetails();
+
+                    if (NetUtils.isValidIp(vmIp)) {
+                        // set this vm ip addr in vm nic.
+                        if (nic != null) {
+                            nic.setIp4Address(vmIp);
+                            _nicDao.update(nicId, nic);
+                            s_logger.debug("Vm "+ vmId +" IP "+vmIp +" got retrieved successfully");
+                            vmIdCountMap.remove(nicId);
+                            decrementCount = false;
+                            ActionEventUtils.onActionEvent(User.UID_SYSTEM, Account.ACCOUNT_ID_SYSTEM,
+                                    Domain.ROOT_DOMAIN, EventTypes.EVENT_NETWORK_EXTERNAL_DHCP_VM_IPFETCH,
+                                    "VM " + vmId + " nic id " + nicId + " ip address " + vmIp + " got fetched successfully");
+                        }
+                    }
+                } else {
+                    //previously vm has ip and nic table has ip address. After vm restart or stop/start
+                    //if vm doesnot get the ip then set the ip in nic table to null
+                    if (nic.getIp4Address() != null) {
+                        nic.setIp4Address(null);
+                        _nicDao.update(nicId, nic);
+                    }
+                    if (answer.getDetails() != null) {
+                        s_logger.debug("Failed to get vm ip for Vm "+ vmId + answer.getDetails());
+                    }
+                }
+            } catch (OperationTimedoutException e) {
+                s_logger.warn("Timed Out", e);
+            } catch (AgentUnavailableException e) {
+                s_logger.warn("Agent Unavailable ", e);
+            } finally {
+                if (decrementCount) {
+                    VmAndCountDetails vmAndCount = vmIdCountMap.get(nicId);
+                    vmAndCount.decrementCount();
+                    s_logger.debug("Ip is not retrieved for VM " + vmId +" nic "+nicId + " ... decremented count to "+vmAndCount.getRetrievalCount());
+                    vmIdCountMap.put(nicId, vmAndCount);
+                }
+            }
+        }
+    }
+
+
+
+
+
     @Override
     @ActionEvent(eventType = EventTypes.EVENT_VM_RESETPASSWORD, eventDescription = "resetting Vm password", async = true)
     public UserVm resetVMPassword(ResetVMPasswordCmd cmd, String password) throws ResourceUnavailableException, InsufficientCapacityException {
@@ -1716,9 +1851,37 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir
     @Override
     public boolean start() {
         _executor.scheduleWithFixedDelay(new ExpungeTask(), _expungeInterval, _expungeInterval, TimeUnit.SECONDS);
+        _executor.scheduleWithFixedDelay(new VmIpFetchTask(), VmIpFetchWaitInterval.value(), VmIpFetchWaitInterval.value(), TimeUnit.SECONDS);
+        loadVmDetailsInMapForExternalDhcpIp();
         return true;
     }
 
+    private void loadVmDetailsInMapForExternalDhcpIp() {
+
+        List<NetworkVO> networks = _networkDao.listByGuestType(Network.GuestType.Shared);
+
+        for (NetworkVO network: networks) {
+            if(_networkModel.isSharedNetworkWithoutServices(network.getId())) {
+                List<NicVO> nics = _nicDao.listByNetworkId(network.getId());
+
+                for (NicVO nic : nics) {
+
+                    if (nic.getIp4Address() == null) {
+                        long nicId = nic.getId();
+                        long vmId = nic.getInstanceId();
+                        VMInstanceVO vmInstance = _vmInstanceDao.findById(vmId);
+
+                        // only load running vms. For stopped vms get loaded on starting
+                        if (vmInstance.getState() == State.Running) {
+                            VmAndCountDetails vmAndCount = new VmAndCountDetails(vmId, VmIpFetchTrialMax.value());
+                            vmIdCountMap.put(nicId, vmAndCount);
+                        }
+                    }
+                }
+            }
+        }
+    }
+
     @Override
     public boolean stop() {
         _executor.shutdown();
@@ -1872,6 +2035,66 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir
         }
     }
 
+
+
+    protected class VmIpFetchTask extends ManagedContextRunnable {
+
+        public VmIpFetchTask() {
+            GlobalLock scanLock = GlobalLock.getInternLock("vmIpFetch");
+        }
+
+        @Override
+        protected void runInContext() {
+            GlobalLock scanLock = GlobalLock.getInternLock("vmIpFetch");
+
+            try {
+                if (scanLock.lock(ACQUIRE_GLOBAL_LOCK_TIMEOUT_FOR_COOPERATION)) {
+                    try {
+
+                        for (Entry<Long, VmAndCountDetails> entry:   vmIdCountMap.entrySet()) {
+                            long nicId = entry.getKey();
+                            VmAndCountDetails vmIdAndCount = entry.getValue();
+                            long vmId = vmIdAndCount.getVmId();
+
+                            if (vmIdAndCount.getRetrievalCount() <= 0) {
+                                vmIdCountMap.remove(nicId);
+                                s_logger.debug("Vm " + vmId +" nic "+nicId + " count is zero .. removing vm nic from map ");
+
+                                ActionEventUtils.onActionEvent(User.UID_SYSTEM, Account.ACCOUNT_ID_SYSTEM,
+                                        Domain.ROOT_DOMAIN, EventTypes.EVENT_NETWORK_EXTERNAL_DHCP_VM_IPFETCH,
+                                        "VM " + vmId + " nic id "+ nicId + " ip addr fetch failed ");
+
+                                continue;
+                            }
+
+
+                            UserVm userVm = _vmDao.findById(vmId);
+                            VMInstanceVO vmInstance = _vmInstanceDao.findById(vmId);
+                            NicVO nicVo = _nicDao.findById(nicId);
+                            NetworkVO network = _networkDao.findById(nicVo.getNetworkId());
+
+                            VirtualMachineProfile vmProfile = new VirtualMachineProfileImpl(userVm);
+                            VirtualMachine vm = vmProfile.getVirtualMachine();
+                            boolean isWindows = _guestOSCategoryDao.findById(_guestOSDao.findById(vm.getGuestOSId()).getCategoryId()).getName().equalsIgnoreCase("Windows");
+
+                            _vmIpFetchThreadExecutor.execute(new VmIpAddrFetchThread(vmId, nicId, vmInstance.getInstanceName(),
+                                    isWindows, vm.getHostId(), network.getCidr()));
+
+                        }
+                    } catch (Exception e) {
+                        s_logger.error("Caught the Exception in VmIpFetchTask", e);
+                    } finally {
+                        scanLock.unlock();
+                    }
+                }
+            } finally {
+                scanLock.releaseRef();
+            }
+
+        }
+    }
+
+
     protected class ExpungeTask extends ManagedContextRunnable {
         public ExpungeTask() {
         }
@@ -5045,7 +5268,7 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir
 
     @Override
     public ConfigKey<?>[] getConfigKeys() {
-        return new ConfigKey<?>[] {EnableDynamicallyScaleVm};
+        return new ConfigKey<?>[] {EnableDynamicallyScaleVm, VmIpFetchWaitInterval, VmIpFetchTrialMax, VmIpFetchThreadPoolMax};
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/733ac2b7/server/test/com/cloud/vpc/dao/MockNetworkDaoImpl.java
----------------------------------------------------------------------
diff --git a/server/test/com/cloud/vpc/dao/MockNetworkDaoImpl.java b/server/test/com/cloud/vpc/dao/MockNetworkDaoImpl.java
index cf4fc35..89f15d5 100644
--- a/server/test/com/cloud/vpc/dao/MockNetworkDaoImpl.java
+++ b/server/test/com/cloud/vpc/dao/MockNetworkDaoImpl.java
@@ -45,6 +45,11 @@ public class MockNetworkDaoImpl extends GenericDaoBase<NetworkVO, Long> implemen
         return null;
     }
 
+    @Override
+    public List<NetworkVO> listByGuestType(GuestType type) {
+        return null;
+    }
+
     /* (non-Javadoc)
      * @see com.cloud.network.dao.NetworkDao#listBy(long, long, long)
      */