use of com.vmware.vim25.WaitOptions in project photon-model by vmware.
the class WaitForValues method wait.
/**
* Handle Updates for a single object. waits till expected values of
* properties to check are reached Destroys the ObjectFilter when done.
* The matching properties will be added to the list of properties to fetch.
*
* @param moRef MOR of the Object to wait for
* @param fetchProps Properties list to filter
* @param propsToMatch Properties list to check for expected values these be properties
* of a property in the filter properties list
* @param propsMatchValues values for properties to end the wait
* @param maxWaitSeconds how long to wait for the condition to be met, use null to wait forever
* @return the requested properties or null if expected values not reached within timeout
* @throws RuntimeFaultFaultMsg
* @throws InvalidPropertyFaultMsg
* @throws InvalidCollectorVersionFaultMsg
*/
public Object[] wait(ManagedObjectReference moRef, String[] fetchProps, String[] propsToMatch, Object[][] propsMatchValues, Integer maxWaitSeconds) throws InvalidPropertyFaultMsg, RuntimeFaultFaultMsg, InvalidCollectorVersionFaultMsg {
VimPortType vimPort;
ManagedObjectReference filterSpecRef = null;
ServiceContent serviceContent;
try {
vimPort = this.connection.getVimPort();
serviceContent = this.connection.getServiceContent();
} catch (Throwable cause) {
throw new BaseHelper.HelperException(cause);
}
// version string is initially null
String version = "";
Object[] endVals = new Object[propsToMatch.length];
String stateVal = null;
PropertyFilterSpec spec = propertyFilterSpec(moRef, fetchProps, propsToMatch);
filterSpecRef = vimPort.createFilter(serviceContent.getPropertyCollector(), spec, true);
boolean reached = false;
UpdateSet updateset;
List<PropertyFilterUpdate> filtupary;
List<ObjectUpdate> objupary;
List<PropertyChange> propchgary;
// override maxWaitSeconds to give the timeout a chance to be hit earlier
WaitOptions waitOptions = new WaitOptions();
waitOptions.setMaxWaitSeconds(DEFAULT_MAX_WAIT_SECONDS);
long timeout = -1;
if (maxWaitSeconds != null) {
timeout = System.currentTimeMillis() + TimeUnit.SECONDS.toMillis(maxWaitSeconds);
}
while (!reached && shouldContinue(timeout)) {
updateset = vimPort.waitForUpdatesEx(serviceContent.getPropertyCollector(), version, waitOptions);
if (updateset == null || updateset.getFilterSet() == null) {
continue;
}
version = updateset.getVersion();
// Make this code more general purpose when PropCol changes later.
filtupary = updateset.getFilterSet();
for (PropertyFilterUpdate filtup : filtupary) {
objupary = filtup.getObjectSet();
for (ObjectUpdate objup : objupary) {
propchgary = objup.getChangeSet();
for (PropertyChange propchg : propchgary) {
updateValues(propsToMatch, endVals, propchg);
}
}
}
// Also exit the WaitForUpdates loop if this is the case.
for (int chgi = 0; chgi < endVals.length && !reached; chgi++) {
for (int vali = 0; vali < propsMatchValues[chgi].length && !reached; vali++) {
Object expectedValue = propsMatchValues[chgi][vali];
Object endVal = endVals[chgi];
if (endVal == null) {
// Do Nothing
} else if (endVal.toString().contains("val: null")) {
// Due to some issue in JAX-WS De-serialization getting the information from
// the nodes
Element stateElement = (Element) endVal;
if (stateElement.getFirstChild() != null) {
stateVal = stateElement.getFirstChild().getTextContent();
reached = expectedValue.toString().equalsIgnoreCase(stateVal) || reached;
}
} else {
expectedValue = propsMatchValues[chgi][vali];
reached = expectedValue.equals(endVal) || reached;
stateVal = "filtervals";
}
}
}
}
if (!reached) {
// got here but condition not reached; timeout
return null;
}
Object[] retVal = null;
// Destroy the filter when we are done.
try {
vimPort.destroyPropertyFilter(filterSpecRef);
} catch (RuntimeFaultFaultMsg e) {
e.printStackTrace();
}
if (stateVal != null) {
if (stateVal.equalsIgnoreCase("ready")) {
retVal = new Object[] { HttpNfcLeaseState.READY };
}
if (stateVal.equalsIgnoreCase("error")) {
retVal = new Object[] { HttpNfcLeaseState.ERROR };
}
if (stateVal.equals("filtervals")) {
retVal = fetchFinalValues(moRef, fetchProps);
}
} else {
retVal = new Object[] { HttpNfcLeaseState.ERROR };
}
return retVal;
}
use of com.vmware.vim25.WaitOptions in project cloudstack by apache.
the class VmwareClient method waitForValues.
/**
* Handle Updates for a single object. waits till expected values of
* properties to check are reached Destroys the ObjectFilter when done.
*
* @param objmor
* MOR of the Object to wait for
* @param filterProps
* Properties list to filter
* @param endWaitProps
* Properties list to check for expected values these be
* properties of a property in the filter properties list
* @param expectedVals
* values for properties to end the wait
* @return true indicating expected values were met, and false otherwise
* @throws RuntimeFaultFaultMsg
* @throws InvalidPropertyFaultMsg
* @throws InvalidCollectorVersionFaultMsg
*/
private synchronized Object[] waitForValues(ManagedObjectReference objmor, String[] filterProps, String[] endWaitProps, Object[][] expectedVals) throws InvalidPropertyFaultMsg, RuntimeFaultFaultMsg, InvalidCollectorVersionFaultMsg {
// version string is initially null
String version = "";
Object[] endVals = new Object[endWaitProps.length];
Object[] filterVals = new Object[filterProps.length];
String stateVal = null;
PropertyFilterSpec spec = new PropertyFilterSpec();
ObjectSpec oSpec = new ObjectSpec();
oSpec.setObj(objmor);
oSpec.setSkip(Boolean.FALSE);
spec.getObjectSet().add(oSpec);
PropertySpec pSpec = new PropertySpec();
pSpec.getPathSet().addAll(Arrays.asList(filterProps));
pSpec.setType(objmor.getType());
spec.getPropSet().add(pSpec);
ManagedObjectReference propertyCollector = getPropCol();
ManagedObjectReference filterSpecRef = vimPort.createFilter(propertyCollector, spec, true);
boolean reached = false;
UpdateSet updateset = null;
List<PropertyFilterUpdate> filtupary = null;
List<ObjectUpdate> objupary = null;
List<PropertyChange> propchgary = null;
while (!reached) {
updateset = vimPort.waitForUpdatesEx(propertyCollector, version, new WaitOptions());
if (updateset == null || updateset.getFilterSet() == null) {
continue;
}
version = updateset.getVersion();
// Make this code more general purpose when PropCol changes later.
filtupary = updateset.getFilterSet();
for (PropertyFilterUpdate filtup : filtupary) {
objupary = filtup.getObjectSet();
for (ObjectUpdate objup : objupary) {
if (objup.getKind() == ObjectUpdateKind.MODIFY || objup.getKind() == ObjectUpdateKind.ENTER || objup.getKind() == ObjectUpdateKind.LEAVE) {
propchgary = objup.getChangeSet();
for (PropertyChange propchg : propchgary) {
updateValues(endWaitProps, endVals, propchg);
updateValues(filterProps, filterVals, propchg);
}
}
}
}
Object expctdval = null;
// Also exit the WaitForUpdates loop if this is the case.
for (int chgi = 0; chgi < endVals.length && !reached; chgi++) {
for (int vali = 0; vali < expectedVals[chgi].length && !reached; vali++) {
expctdval = expectedVals[chgi][vali];
if (endVals[chgi] == null) {
// Do nothing
} else if (endVals[chgi].toString().contains("val: null")) {
// Handle JAX-WS De-serialization issue, by parsing nodes
Element stateElement = (Element) endVals[chgi];
if (stateElement != null && stateElement.getFirstChild() != null) {
stateVal = stateElement.getFirstChild().getTextContent();
reached = expctdval.toString().equalsIgnoreCase(stateVal) || reached;
}
} else {
reached = expctdval.equals(endVals[chgi]) || reached;
stateVal = "filtervals";
}
}
}
}
// Destroy the filter when we are done.
vimPort.destroyPropertyFilter(filterSpecRef);
Object[] retVal = filterVals;
if (stateVal != null && stateVal.equalsIgnoreCase("success")) {
retVal = new Object[] { TaskInfoState.SUCCESS, null };
}
return retVal;
}
Aggregations