Skip to content

Commit 4a6e2cd

Browse files
author
Suresh Kumar Anaparti
committed
CLOUDSTACK-8820: Showing error when try to add advance zone using VMWare ESXi 6.0 host
Summary: In vCenter 6.0, response headers need to be fetched after service login for server cookie unlike previous versions of vCenter.
1 parent 2d90f18 commit 4a6e2cd

File tree

1 file changed

+52
-32
lines changed

1 file changed

+52
-32
lines changed

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

Lines changed: 52 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -152,13 +152,26 @@ public void connect(String url, String userName, String password) throws Excepti
152152
@SuppressWarnings("unchecked")
153153
Map<String, List<String>> headers = (Map<String, List<String>>)((BindingProvider)vimPort).getResponseContext().get(MessageContext.HTTP_RESPONSE_HEADERS);
154154
List<String> cookies = headers.get("Set-cookie");
155+
156+
vimPort.login(serviceContent.getSessionManager(), userName, password, null);
157+
158+
if (cookies == null) {
159+
@SuppressWarnings("unchecked")
160+
Map<String, List<String>> responseHeaders = (Map<String, List<String>>)((BindingProvider)vimPort).getResponseContext().get(MessageContext.HTTP_RESPONSE_HEADERS);
161+
cookies = responseHeaders.get("Set-cookie");
162+
if (cookies == null) {
163+
String msg = "Login successful, but failed to get server cookies from url :[" + url + "]";
164+
s_logger.error(msg);
165+
throw new Exception(msg);
166+
}
167+
}
168+
155169
String cookieValue = cookies.get(0);
156170
StringTokenizer tokenizer = new StringTokenizer(cookieValue, ";");
157171
cookieValue = tokenizer.nextToken();
158172
String pathData = "$" + tokenizer.nextToken();
159173
serviceCookie = "$Version=\"1\"; " + cookieValue + "; " + pathData;
160174

161-
vimPort.login(serviceContent.getSessionManager(), userName, password, null);
162175
isConnected = true;
163176
}
164177

@@ -577,41 +590,48 @@ public ManagedObjectReference getDecendentMoRef(ManagedObjectReference root, Str
577590
return null;
578591
}
579592

580-
// Create PropertySpecs
581-
PropertySpec pSpec = new PropertySpec();
582-
pSpec.setType(type);
583-
pSpec.setAll(false);
584-
pSpec.getPathSet().add("name");
585-
586-
ObjectSpec oSpec = new ObjectSpec();
587-
oSpec.setObj(root);
588-
oSpec.setSkip(false);
589-
oSpec.getSelectSet().addAll(constructCompleteTraversalSpec());
590-
591-
PropertyFilterSpec spec = new PropertyFilterSpec();
592-
spec.getPropSet().add(pSpec);
593-
spec.getObjectSet().add(oSpec);
594-
List<PropertyFilterSpec> specArr = new ArrayList<PropertyFilterSpec>();
595-
specArr.add(spec);
596-
597-
List<ObjectContent> ocary = vimPort.retrieveProperties(getPropCol(), specArr);
598-
599-
if (ocary == null || ocary.size() == 0) {
600-
return null;
601-
}
593+
try {
594+
// Create PropertySpecs
595+
PropertySpec pSpec = new PropertySpec();
596+
pSpec.setType(type);
597+
pSpec.setAll(false);
598+
pSpec.getPathSet().add("name");
599+
600+
ObjectSpec oSpec = new ObjectSpec();
601+
oSpec.setObj(root);
602+
oSpec.setSkip(false);
603+
oSpec.getSelectSet().addAll(constructCompleteTraversalSpec());
604+
605+
PropertyFilterSpec spec = new PropertyFilterSpec();
606+
spec.getPropSet().add(pSpec);
607+
spec.getObjectSet().add(oSpec);
608+
List<PropertyFilterSpec> specArr = new ArrayList<PropertyFilterSpec>();
609+
specArr.add(spec);
610+
611+
ManagedObjectReference propCollector = getPropCol();
612+
List<ObjectContent> ocary = vimPort.retrieveProperties(propCollector, specArr);
613+
614+
if (ocary == null || ocary.size() == 0) {
615+
return null;
616+
}
602617

603-
// filter through retrieved objects to get the first match.
604-
for (ObjectContent oc : ocary) {
605-
ManagedObjectReference mor = oc.getObj();
606-
List<DynamicProperty> propary = oc.getPropSet();
607-
if (type == null || type.equals(mor.getType())) {
608-
if (propary.size() > 0) {
609-
String propval = (String)propary.get(0).getVal();
610-
if (propval != null && name.equalsIgnoreCase(propval))
611-
return mor;
618+
// filter through retrieved objects to get the first match.
619+
for (ObjectContent oc : ocary) {
620+
ManagedObjectReference mor = oc.getObj();
621+
List<DynamicProperty> propary = oc.getPropSet();
622+
if (type == null || type.equals(mor.getType())) {
623+
if (propary.size() > 0) {
624+
String propval = (String)propary.get(0).getVal();
625+
if (propval != null && name.equalsIgnoreCase(propval))
626+
return mor;
627+
}
612628
}
613629
}
630+
} catch (Exception e) {
631+
s_logger.debug("Failed to get mor for name: " + name + " and type: " + type, e);
632+
throw e;
614633
}
634+
615635
return null;
616636
}
617637

0 commit comments

Comments
 (0)