Skip to content

Commit 1056afb

Browse files
author
Kelven Yang
committed
bug 13225: setup firewall rules for all ESX/ESXi hosts under a cluster as worker VM may be created at any host available, also add connect retry when work with vCenter and ESX/ESXi hosts
1 parent 03653b9 commit 1056afb

2 files changed

Lines changed: 48 additions & 11 deletions

File tree

core/src/com/cloud/storage/resource/VmwareSecondaryStorageResourceHandler.java

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44

55
package com.cloud.storage.resource;
66

7+
import java.util.List;
8+
79
import org.apache.log4j.Logger;
810

911
import com.cloud.agent.api.Answer;
@@ -26,6 +28,7 @@
2628
import com.cloud.hypervisor.vmware.util.VmwareContext;
2729
import com.cloud.hypervisor.vmware.util.VmwareHelper;
2830
import com.cloud.serializer.GsonHelper;
31+
import com.cloud.utils.Pair;
2932
import com.google.gson.Gson;
3033
import com.vmware.vim25.ManagedObjectReference;
3134

@@ -210,9 +213,19 @@ public VmwareHypervisorHost getHyperHost(VmwareContext context, Command cmd) {
210213
HostMO hostMo = new HostMO(context, morHyperHost);
211214

212215
try {
213-
VmwareHypervisorHostNetworkSummary netSummary = hostMo.getHyperHostNetworkSummary(
214-
hostMo.getHostType() == VmwareHostType.ESXi ? cmd.getContextParam("manageportgroup") : cmd.getContextParam("serviceconsole"));
215-
_resource.ensureOutgoingRuleForAddress(netSummary.getHostIp());
216+
217+
ManagedObjectReference mor = hostMo.getHyperHostCluster();
218+
ClusterMO clusterMo = new ClusterMO(hostMo.getContext(), mor);
219+
List<Pair<ManagedObjectReference, String>> hostsInCluster = clusterMo.getClusterHosts();
220+
for(Pair<ManagedObjectReference, String> hostPair : hostsInCluster) {
221+
HostMO hostIteratorMo = new HostMO(hostMo.getContext(), hostPair.first());
222+
223+
VmwareHypervisorHostNetworkSummary netSummary = hostIteratorMo.getHyperHostNetworkSummary(
224+
hostIteratorMo.getHostType() == VmwareHostType.ESXi ? cmd.getContextParam("manageportgroup") : cmd.getContextParam("serviceconsole"));
225+
_resource.ensureOutgoingRuleForAddress(netSummary.getHostIp());
226+
227+
s_logger.info("Setup firewall rule for host: " + netSummary.getHostIp());
228+
}
216229
} catch(Throwable e) {
217230
s_logger.warn("Unable to retrive host network information due to exception " + e.toString() + ", host: " + hostTokens[0] + "-" + hostTokens[1]);
218231
}

vmware-base/src/com/cloud/hypervisor/vmware/util/VmwareContext.java

Lines changed: 32 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import java.io.InputStream;
1515
import java.io.InputStreamReader;
1616
import java.io.OutputStream;
17+
import java.net.ConnectException;
1718
import java.net.HttpURLConnection;
1819
import java.net.URL;
1920
import java.net.URLEncoder;
@@ -47,12 +48,16 @@
4748

4849
public class VmwareContext {
4950
private static final Logger s_logger = Logger.getLogger(VmwareContext.class);
50-
51+
52+
private static int MAX_CONNECT_RETRY = 5;
53+
private static int CONNECT_RETRY_INTERVAL = 1000;
54+
5155
private ExtendedAppUtil _appUtil;
5256
private String _serverAddress;
5357

5458
private Map<String, Object> _stockMap = new HashMap<String, Object>();
55-
private int _CHUNKSIZE = 1*1024*1024; // 1M
59+
private int _CHUNKSIZE = 1*1024*1024; // 1M
60+
5661

5762
static {
5863
try {
@@ -328,7 +333,7 @@ public void uploadVmdkFile(String httpMethod, String urlString, String localFile
328333
conn.setRequestProperty("Connection", "Keep-Alive");
329334
conn.setRequestProperty("Content-Type", "application/x-vnd.vmware-streamVmdk");
330335
conn.setRequestProperty("Content-Length", Long.toString(new File(localFileName).length()));
331-
conn.connect();
336+
connectWithRetry(conn);
332337

333338
BufferedOutputStream bos = null;
334339
BufferedInputStream is = null;
@@ -367,8 +372,8 @@ public long downloadVmdkFile(String urlString, String localFileName,
367372
conn.setRequestProperty(org.apache.axis.transport.http.HTTPConstants.HEADER_COOKIE, cookieString);
368373
conn.setDoInput(true);
369374
conn.setDoOutput(true);
370-
conn.setAllowUserInteraction(true);
371-
conn.connect();
375+
conn.setAllowUserInteraction(true);
376+
connectWithRetry(conn);
372377

373378
long bytesWritten = 0;
374379
InputStream in = null;
@@ -387,8 +392,6 @@ public long downloadVmdkFile(String urlString, String localFileName,
387392
if(progressUpdater != null)
388393
progressUpdater.action(new Long(totalBytesDownloaded));
389394
}
390-
} catch(Throwable e) {
391-
s_logger.error("Unexpected exception ", e);
392395
} finally {
393396
if(in != null)
394397
in.close();
@@ -533,7 +536,7 @@ public boolean verify(String urlHostName, SSLSession session) {
533536
conn.setAllowUserInteraction(true);
534537
conn.setRequestProperty(org.apache.axis.transport.http.HTTPConstants.HEADER_COOKIE, cookieString);
535538
conn.setRequestMethod(httpMethod);
536-
conn.connect();
539+
connectWithRetry(conn);
537540
return conn;
538541
}
539542

@@ -556,6 +559,27 @@ private String getServiceCookie() throws Exception {
556559
org.apache.axis.MessageContext msgContext = callObj.getMessageContext();
557560
String cookieString = (String)msgContext.getProperty(org.apache.axis.transport.http.HTTPConstants.HEADER_COOKIE);
558561
return cookieString;
562+
}
563+
564+
private static void connectWithRetry(HttpURLConnection conn) throws Exception {
565+
boolean connected = false;
566+
for(int i = 0; i < MAX_CONNECT_RETRY && !connected; i++) {
567+
try {
568+
conn.connect();
569+
connected = true;
570+
s_logger.info("Connected, conn: " + conn.toString() + ", retry: " + i);
571+
} catch (Exception e) {
572+
s_logger.warn("Unable to connect, conn: " + conn.toString() + ", message: " + e.toString() + ", retry: " + i);
573+
574+
try {
575+
Thread.sleep(CONNECT_RETRY_INTERVAL);
576+
} catch(InterruptedException ex) {
577+
}
578+
}
579+
}
580+
581+
if(!connected)
582+
throw new Exception("Unable to connect to " + conn.toString());
559583
}
560584

561585
public void close() {

0 commit comments

Comments
 (0)