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)
*/