Merge branch 'master' into ui-restyle

This commit is contained in:
Brian Federle 2013-09-27 17:05:42 -07:00
commit 7289604d8a
15 changed files with 326 additions and 103 deletions

View File

@ -21,6 +21,7 @@
/etc/init.d/cloudstack-agent
/usr/bin/cloudstack-setup-agent
/usr/bin/cloudstack-ssh
/usr/bin/cloudstack-agent-upgrade
/var/log/cloudstack/agent
/usr/share/cloudstack-agent/lib/*
/usr/share/cloudstack-agent/plugins

2
debian/rules vendored
View File

@ -71,7 +71,7 @@ install:
install -D packaging/debian/init/cloud-agent $(DESTDIR)/$(SYSCONFDIR)/init.d/$(PACKAGE)-agent
install -D agent/target/transformed/cloud-setup-agent $(DESTDIR)/usr/bin/cloudstack-setup-agent
install -D agent/target/transformed/cloud-ssh $(DESTDIR)/usr/bin/cloudstack-ssh
install -D agent/target/transformed/cloudstack-agent-upgrade $(DESTDIR)/usr/bin/cloudstack-setup-agent
install -D agent/target/transformed/cloudstack-agent-upgrade $(DESTDIR)/usr/bin/cloudstack-agent-upgrade
install -D agent/target/transformed/libvirtqemuhook $(DESTDIR)/usr/share/$(PACKAGE)-agent/lib/
install -D agent/target/transformed/* $(DESTDIR)/$(SYSCONFDIR)/$(PACKAGE)/agent

View File

@ -41,6 +41,9 @@ public class DataMotionServiceImpl implements DataMotionService {
@Override
public void copyAsync(DataObject srcData, DataObject destData, AsyncCompletionCallback<CopyCommandResult> callback) {
if (srcData.getDataStore() == null || destData.getDataStore() == null) {
throw new CloudRuntimeException("can't find data store");
}
if (srcData.getDataStore().getDriver().canCopy(srcData, destData)) {
srcData.getDataStore().getDriver().copyAsync(srcData, destData, callback);

View File

@ -575,12 +575,16 @@ public class VmwareManagerImpl extends ManagerBase implements VmwareManager, Vmw
s_logger.info("Worker VM's owner management server has changed runid, recycle it");
return true;
}
// disable time-out check until we have found out a VMware API that can check if
// there are pending tasks on the subject VM
/*
if(System.currentTimeMillis() - startTick > _hungWorkerTimeout) {
if(s_logger.isInfoEnabled())
s_logger.info("Worker VM expired, seconds elapsed: " + (System.currentTimeMillis() - startTick) / 1000);
return true;
}
*/
return false;
}

View File

@ -80,8 +80,15 @@ public class VmwareContextFactory {
public static VmwareContext getContext(String vCenterAddress, String vCenterUserName, String vCenterPassword) throws Exception {
VmwareContext context = s_pool.getContext(vCenterAddress, vCenterUserName);
if(context == null)
if(context == null) {
context = create(vCenterAddress, vCenterUserName, vCenterPassword);
} else {
if(!context.validate()) {
s_logger.info("Validation of the context faild. dispose and create a new one");
context.close();
context = create(vCenterAddress, vCenterUserName, vCenterPassword);
}
}
if(context != null) {
context.registerStockObject(VmwareManager.CONTEXT_STOCK_NAME, s_vmwareMgr);

View File

@ -1618,12 +1618,13 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa
throw new Exception(msg);
}
/*
if(!isVMWareToolsInstalled(vmMo)){
String errMsg = "vmware tools is not installed or not running, cannot add nic to vm " + vmName;
s_logger.debug(errMsg);
return new PlugNicAnswer(cmd, false, "Unable to execute PlugNicCommand due to " + errMsg);
}
*/
// TODO need a way to specify the control of NIC device type
VirtualEthernetCardType nicDeviceType = VirtualEthernetCardType.E1000;
@ -1698,12 +1699,13 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa
throw new Exception(msg);
}
/*
if(!isVMWareToolsInstalled(vmMo)){
String errMsg = "vmware tools not installed or not running, cannot remove nic from vm " + vmName;
s_logger.debug(errMsg);
return new UnPlugNicAnswer(cmd, false, "Unable to execute unPlugNicCommand due to " + errMsg);
}
*/
VirtualDevice nic = findVirtualNicDevice(vmMo, cmd.getNic().getMac());
if ( nic == null ) {
return new UnPlugNicAnswer(cmd, true, "success");

View File

@ -16,11 +16,15 @@
// under the License.
package com.cloud.storage.resource;
import org.apache.log4j.Logger;
import com.cloud.hypervisor.vmware.util.VmwareClient;
import com.cloud.hypervisor.vmware.util.VmwareContext;
import com.cloud.hypervisor.vmware.util.VmwareContextPool;
public class VmwareSecondaryStorageContextFactory {
private static final Logger s_logger = Logger.getLogger(VmwareSecondaryStorageContextFactory.class);
private static volatile int s_seq = 1;
private static VmwareContextPool s_pool;
@ -51,6 +55,12 @@ public class VmwareSecondaryStorageContextFactory {
VmwareContext context = s_pool.getContext(vCenterAddress, vCenterUserName);
if(context == null) {
context = create(vCenterAddress, vCenterUserName, vCenterPassword);
} else {
if(!context.validate()) {
s_logger.info("Validation of the context faild. dispose and create a new one");
context.close();
context = create(vCenterAddress, vCenterUserName, vCenterPassword);
}
}
if(context != null) {

View File

@ -553,6 +553,8 @@ public class FirewallManagerImpl extends ManagerBase implements FirewallService,
throws ResourceUnavailableException {
boolean handled = false;
switch (purpose){
/* StaticNatRule would be applied by Firewall provider, since the incompatible of two object */
case StaticNat:
case Firewall:
for (FirewallServiceProvider fwElement: _firewallElements) {
Network.Provider provider = fwElement.getProvider();
@ -577,18 +579,6 @@ public class FirewallManagerImpl extends ManagerBase implements FirewallService,
break;
}
break;
case StaticNat:
for (StaticNatServiceProvider element: _staticNatElements) {
Network.Provider provider = element.getProvider();
boolean isSnatProvider = _networkModel.isProviderSupportServiceInNetwork(network.getId(), Service.StaticNat, provider);
if (!isSnatProvider) {
continue;
}
handled = element.applyStaticNats(network, (List<? extends StaticNat>) rules);
if (handled)
break;
}
break;
/* case NetworkACL:
for (NetworkACLServiceProvider element: _networkAclElements) {
Network.Provider provider = element.getProvider();

1
ui/plugins/netapp Symbolic link
View File

@ -0,0 +1 @@
/Users/csuich/CloudStack/workspace/ui-plugin/

View File

@ -111,6 +111,9 @@
data: data,
success: function(data) {
args.response.success();
},
error:function(data) {
args.response.error(parseXMLHttpResponse(data));
}
});
}
@ -452,6 +455,9 @@
success: function(data) {
args.response.success();
},
error:function(data) {
args.response.error(parseXMLHttpResponse(data));
}
});
}

View File

@ -83,12 +83,12 @@
.addClass('data-table')
.appendTo($table.parent())
.append(
$table.remove()
$table.detach()
);
$table = $mainContainer;
var $theadContainer = $('<div>').addClass('fixed-header').prependTo($table);
var $theadTable = $('<table>').appendTo($theadContainer).attr('nowrap', 'nowrap');
var $thead = $table.find('thead').remove().appendTo($theadTable);
var $thead = $table.find('thead').detach().appendTo($theadTable);
return $thead;
};
@ -238,9 +238,9 @@
$table.find('tbody').closest('table').addClass('body');
}
$table.find('th').bind('mousemove mouseout', hoverResizableEvent);
$table.find('th').bind('mousedown mousemove mouseup mouseout', resizeDragEvent);
$table.find('th').bind('click', function(event) {
$table.find('th:not(:has(input))').bind('mousemove mouseout', hoverResizableEvent);
$table.find('th:not(:has(input))').bind('mousedown mousemove mouseup mouseout', resizeDragEvent);
$table.find('th:not(:has(input))').bind('click', function(event) {
if ($(this).hasClass('resizable')) {
return false;
}

View File

@ -27,16 +27,29 @@
var messages = args.action ? args.action.messages : {};
var preAction = args.action ? args.action.preAction : {};
var action = args.action ? args.action.action : {};
var multiSelect = args.action.isMultiSelectAction;
var needsRefresh = args.action.needsRefresh;
var section;
var data = {
id: $instanceRow.data('list-view-item-id'),
jsonObj: $instanceRow.data('jsonObj')
};
var data;
var messageArgs;
if (multiSelect) {
data = {
id: $.map($instanceRow, function(elem) { return $(elem).data('list-view-item-id'); }),
jsonObj: $.map($instanceRow, function(elem) { return $(elem).data('jsonObj'); })
};
messageArgs = {
name: $.map($instanceRow, function(elem) { return $(elem).find('td.name span').html() })
};
} else {
data = {
id: $instanceRow.data('list-view-item-id'),
jsonObj: $instanceRow.data('jsonObj')
};
messageArgs = {
name: $instanceRow.find('td.name span').html()
};
}
var $listView = $instanceRow.closest('.list-view');
var messageArgs = {
name: $instanceRow.find('td.name span').html()
};
if (args.data) $.extend(true, data, args.data);
if (listViewArgs) section = listViewArgs.section;
@ -53,7 +66,7 @@
preActionContext[
listViewArgs.activeSection
] = [$instanceRow.data('jsonObj')];
] = (multiSelect ? data.jsonObj : [data.jsonObj]);
if (!preAction({
context: preActionContext
@ -71,7 +84,12 @@
var context = $.extend(true, {}, listViewArgs.context);
context[
listViewArgs.activeSection
] = [$instanceRow.data('jsonObj')];
] = (multiSelect ? $.map($instanceRow, function(elem) { return $(elem).data('jsonObj'); }) : [$instanceRow.data('jsonObj')]);
// Make sure the master checkbox is unselected
if (multiSelect) {
$('div.list-view').find('input.multiSelectMasterCheckbox').attr('checked', false);
}
var externalLinkAction = action.externalLink;
if (externalLinkAction) {
@ -165,27 +183,58 @@
// Make copy of previous row, in case data is needed
$prevRow = $instanceRow.clone();
$prevRow.data($instanceRow.data());
// Set loading appearance
if (args.data && !isHeader) {
$instanceRow = replaceItem(
$instanceRow,
$.extend($instanceRow.data('json-obj'), args.data),
$instanceRow.data('list-view-action-filter')
);
if (multiSelect) {
$.each($prevRow, function(index, elem) {
$(elem).data($($instanceRow[index]).data());
});
} else {
$prevRow.data($instanceRow.data());
}
$instanceRow.find('td:last').children().remove();
$instanceRow.find('td:last').append($('<div>').addClass('loading'));
$instanceRow.addClass('loading');
// Set loading appearance
if (args.data && (!isHeader || multiSelect)) {
if (multiSelect) {
$instanceRow = $.map($instanceRow, function(elem, index) {
return replaceItem(
$(elem),
$.extend($(elem).data('json-obj'), args.data[index]),
$(elem).data('list-view-action-filter')
)[0];
});
} else {
$instanceRow = replaceItem(
$instanceRow,
$.extend($instanceRow.data('json-obj'), args.data),
$instanceRow.data('list-view-action-filter')
);
}
}
if (options.$item) $instanceRow.data('list-view-new-item', true);
if (multiSelect) {
$.each($instanceRow, function(index, elem) {
$(elem).find('td:last').children().remove();
$(elem).find('td:last').append($('<div>').addClass('loading'));
$(elem).addClass('loading');
// Disable any clicking/actions for row
$instanceRow.bind('click', function() {
return false;
});
if (options.$item) $(elem).data('list-view-new-item', true);
// Disable any clicking/actions for row
$(elem).bind('click', function() {
return false;
});
});
} else {
$instanceRow.find('td:last').children().remove();
$instanceRow.find('td:last').append($('<div>').addClass('loading'));
$instanceRow.addClass('loading');
if (options.$item) $instanceRow.data('list-view-new-item', true);
// Disable any clicking/actions for row
$instanceRow.bind('click', function() {
return false;
});
}
if(args.notification) notification = args.notification;
@ -206,19 +255,41 @@
if (!args) args = {};
var actionFilter = args.actionFilter ?
args.actionFilter : $instanceRow.data('list-view-action-filter');
args.actionFilter : (multiSelect ?
$.map($instanceRow, function(elem) { $(elem).data('list-view-action-filter') }) :
$instanceRow.data('list-view-action-filter'));
if (!isHeader) {
if ($instanceRow.is(':visible')) {
if (!isHeader || multiSelect) {
var visible = (multiSelect ? $($instanceRow[0]).is(':visible') : $instanceRow.is(':visible'));
if (visible) {
if (args.data) {
$newRow = replaceItem($instanceRow,
args.data, //$.extend($instanceRow.data('json-obj'), args.data), /* $.extend($instanceRow.data('json-obj'), args.data) causes CLOUDSTACK-4687 */
actionFilter);
if (multiSelect) {
$newRow = [];
$.each($instanceRow, function(index, elem) {
$newRow.push(
replaceItem($(elem),
args.data, //$.extend($(elem).data('json-obj'), args.data[index]),
actionFilter)
);
});
} else {
$newRow = replaceItem($instanceRow,
args.data, //$.extend($instanceRow.data('json-obj'), args.data), /* $.extend($instanceRow.data('json-obj'), args.data) causes CLOUDSTACK-4687 */
actionFilter);
}
} else {
// Nothing new, so just put in existing data
$newRow = replaceItem($instanceRow,
$instanceRow.data('json-obj'),
actionFilter);
if (multiSelect) {
$instanceRow = $.map($instanceRow, function(elem) {
replaceItem($(elem),
$(elem).data('json-obj'),
actionFilter)[0]
});
} else {
$newRow = replaceItem($instanceRow,
$instanceRow.data('json-obj'),
actionFilter);
}
}
if (needsRefresh) {
@ -262,13 +333,25 @@
} else {
// For standard actions
if(!args.notification) {
replaceItem(
$instanceRow,
$.extend($instanceRow.data('json-obj'), errorArgs.data),
errorArgs.actionFilter ?
errorArgs.actionFilter :
$instanceRow.data('list-view-action-filter')
);
if (multiSelect) {
$.each($instanceRow, function(index, elem) {
replaceItem(
$(elem),
$.extend($(elem).data('json-obj'), errorArgs.data),
errorArgs.actionFilter ?
errorArgs.actionFilter :
$(elem).data('list-view-action-filter')
);
});
} else {
replaceItem(
$instanceRow,
$.extend($instanceRow.data('json-obj'), errorArgs.data),
errorArgs.actionFilter ?
errorArgs.actionFilter :
$instanceRow.data('list-view-action-filter')
);
}
}
}
}
@ -314,7 +397,7 @@
context[
listViewArgs.activeSection
] = [$instanceRow.data('jsonObj')];
] = (multiSelect ? $.map($instanceRow, function(elem) { return $(elem).data('jsonObj'); }) : [$instanceRow.data('jsonObj')]);
messageArgs.context = context;
@ -323,10 +406,10 @@
cloudStack.dialog.confirm({
message: messages.confirm(messageArgs),
action: function() {
performAction({
id: $instanceRow.data('list-view-item-id')
}, {
context: context
performAction(data, {
context: context,
isMultiSelectAction: multiSelect,
isHeader: args.action.isHeader
});
}
});
@ -675,6 +758,7 @@
var $thead = $('<thead>').prependTo($table).append($('<tr>'));
var reorder = options.reorder;
var detailView = options.detailView;
var multiSelect = options.multiSelect;
var viewArgs = $table.closest('.list-view').data('view-args');
var uiCustom = viewArgs.uiCustom;
var hiddenFields = [];
@ -682,6 +766,20 @@
if (preFilter != null)
hiddenFields = preFilter();
if (multiSelect) {
var $th = $('<th>').appendTo($thead.find('tr'));
var content = $('<input>')
.attr('type', 'checkbox')
.addClass('multiSelectMasterCheckbox')
.appendTo($th);
content.click(function() {
var checked = $(this).is(':checked');
$('.multiSelectCheckbox').attr('checked', checked);
toggleMultiSelectActions(checked);
});
}
$.each(fields, function(key) {
if ($.inArray(key, hiddenFields) != -1)
return true;
@ -717,7 +815,7 @@
}
);
if (actions && renderActionCol(actions) && actionsArray.length != headerActionsArray.length) {
if (actions && !options.noActionCol && renderActionCol(actions) && actionsArray.length != headerActionsArray.length) {
$thead.find('tr').append(
$('<th></th>')
.html(_l('label.actions'))
@ -918,6 +1016,7 @@
var rows = [];
var reorder = options.reorder;
var detailView = options.detailView;
var multiSelect = options.multiSelect;
var $listView = $tbody.closest('.list-view');
var listViewArgs = $listView.data('view-args');
var uiCustom = listViewArgs.uiCustom;
@ -953,6 +1052,27 @@
if (preFilter != null)
hiddenFields = preFilter();
if (multiSelect) {
var $td = $('<td>')
.appendTo($tr);
var content = $('<input>')
.attr('type', 'checkbox')
.addClass('multiSelectCheckbox')
.click(function() {
var checked = $(this).is(':checked');
var numRows = $(this).parents('tbody').find('input.multiSelectCheckbox').size();
var numRowsChecked = $(this).parents('tbody').find('input.multiSelectCheckbox:checked').size();
var enabled = checked || (numRowsChecked > 0);
toggleMultiSelectActions(enabled);
$('input.multiSelectMasterCheckbox').attr('checked', (numRows === numRowsChecked));
});
$td.append(
$('<span></span>').html(content)
);
}
// Add field data
$.each(fields, function(key) {
if ($.inArray(key, hiddenFields) != -1)
@ -995,8 +1115,11 @@
$td.attr('title', _s(content));
});
$tr.find('td:first').addClass('first');
var $first = $tr.find('td:first');
if (multiSelect)
$first = $first.next();
$first.addClass('first');
// Add reorder actions
if (reorder) {
@ -1103,7 +1226,7 @@
}
);
if (actions && renderActionCol(actions) && actionsArray.length != headerActionsArray.length) {
if (actions && !options.noActionCol && renderActionCol(actions) && actionsArray.length != headerActionsArray.length) {
var allowedActions = $.map(actions, function(value, key) {
return key;
});
@ -1308,6 +1431,7 @@
if (!options) options = {};
var context = options.context;
var reorder = options.reorder;
var multiSelect = options.multiSelect;
var $tbody = $table.find('tbody');
if (!loadArgs) loadArgs = {
@ -1338,7 +1462,9 @@
actionFilter: args.actionFilter,
context: context,
reorder: reorder,
detailView: options.detailView
detailView: options.detailView,
'multiSelect': options.multiSelect,
noActionCol: options.noActionCol
});
$table.dataTable(null, {
noSelect: uiCustom
@ -1494,6 +1620,7 @@
var page = 1;
var actions = listViewData.actions;
var reorder = listViewData.reorder;
var multiSelect = listViewData.multiSelect;
var tableHeight = $table.height();
var endTable = false;
var setEndTable = function() {
@ -1557,14 +1684,18 @@
})
)) return true;
$toolbar
.append(
$('<div>')
.addClass('button action main-action reduced-hide').addClass(actionName)
.data('list-view-action-id', actionName)
.append($('<span>').addClass('icon'))
.append($('<span>').html(_l(action.label)))
);
var $action = $('<div>')
.addClass('button action main-action reduced-hide').addClass(actionName)
.data('list-view-action-id', actionName)
.append($('<span>').addClass('icon'))
.append($('<span>').html(_l(action.label)));
if (action.isMultiSelectAction) {
$action.addClass('multiSelectAction');
$action.hide();
}
$toolbar.append($action)
return true;
});
@ -1577,7 +1708,9 @@
$table,
listViewData.actions, {
reorder: reorder,
detailView: listViewData.detailView
detailView: listViewData.detailView,
'multiSelect': multiSelect,
noActionCol: listViewData.noActionCol
});
createFilters($toolbar, listViewData.filters);
createSearchBar($toolbar, listViewData);
@ -1602,7 +1735,9 @@
context: args.context,
reorder: reorder,
detailView: listViewData.detailView,
setEndTable: setEndTable
setEndTable: setEndTable,
'multiSelect': multiSelect,
noActionCol: listViewData.noActionCol
}
);
@ -1654,7 +1789,9 @@
context: $listView.data('view-args').context,
reorder: listViewData.reorder,
detailView: listViewData.detailView,
setEndTable: setEndTable
setEndTable: setEndTable,
'multiSelect': multiSelect,
noActionCol: listViewData.noActionCol
}
);
};
@ -1703,7 +1840,9 @@
context: $listView.data('view-args').context,
reorder: listViewData.reorder,
detailView: listViewData.detailView,
setEndTable: setEndTable
setEndTable: setEndTable,
'multiSelect': multiSelect,
noActionCol: listViewData.noActionCol
}
);
};
@ -1793,7 +1932,9 @@
}, actions, {
reorder: listViewData.reorder,
detailView: listViewData.detailView,
setEndTable: setEndTable
setEndTable: setEndTable,
'multiSelect': multiSelect,
noActionCol: listViewData.noActionCol
});
$table.height() == tableHeight ? endTable = true : tableHeight = $table.height();
}
@ -1824,8 +1965,7 @@
var id = $target.closest('tr').data('list-view-item-id');
var jsonObj = $target.closest('tr').data('jsonObj');
var detailViewArgs;
var detailViewPresent = ($target.closest('div.data-table tr td').size() &&
$target.closest('div.data-table tr td').index() == 0 &&
var detailViewPresent = ($target.closest('div.data-table tr td.first').size() &&
listViewData.detailView && !$target.closest('div.edit').size());
var uiCustom = args.uiCustom == true ? true : false;
@ -1896,10 +2036,14 @@
}
if ($target.closest('.action.add').size() ||
$target.closest('.action.main-action').size()) {
$target.closest('.action.main-action:not(.multiSelectAction)').size()) {
$tr = $target.closest('div.list-view').find('tr:first'); // Dummy row
} else {
$tr = $target.closest('tr');
if (listViewData.actions[actionID].isMultiSelectAction) {
$tr = $('div.list-view').find('input.multiSelectCheckbox:checked').parents('tr');
} else {
$tr = $target.closest('tr');
}
}
var uiCallback = uiActions[actionID];
@ -1960,7 +2104,9 @@
prepend: true,
actionFilter: actionFilter,
reorder: reorder,
detailView: targetArgs.detailView
detailView: targetArgs.detailView,
'multiSelect': targetArgs.multiSelect,
noActionCol: targetArgs.noActionCol
}
)[0];
listView.find('table').dataTable('refresh');
@ -1980,6 +2126,7 @@
listViewArgs.activeSection
].listView : listViewArgs;
var reorder = targetArgs.reorder;
var multiSelect = targetArgs.multiSelect;
var $table = $row.closest('table');
var defaultActionFilter = $row.data('list-view-action-filter');
@ -1991,7 +2138,9 @@
targetArgs.actions, {
actionFilter: actionFilter ? actionFilter : defaultActionFilter,
reorder: reorder,
detailView: targetArgs.detailView
detailView: targetArgs.detailView,
'multiSelect': multiSelect,
noActionCol: targetArgs.noActionCol
}
)[0];
@ -2004,6 +2153,13 @@
return $newRow;
};
var toggleMultiSelectActions = function(enabled) {
var $listView = $('div.list-view');
$listView.find('div.action.add')[enabled ? 'hide' : 'show']();
$listView.find('div.main-action:not(.multiSelectAction)')[enabled ? 'hide' : 'show']();
$listView.find('div.main-action.multiSelectAction')[enabled ? 'show' : 'hide']();
}
$.fn.listView = function(args, options) {
if (!options) options = {};
if (args == 'prependItem') {

View File

@ -20,6 +20,8 @@ package com.cloud.hypervisor.vmware.mo;
import java.util.ArrayList;
import java.util.List;
import org.apache.log4j.Logger;
import com.cloud.hypervisor.vmware.util.VmwareContext;
import com.cloud.utils.Pair;
import com.vmware.vim25.CustomFieldStringValue;
@ -37,6 +39,7 @@ import com.vmware.vim25.VirtualEthernetCardDistributedVirtualPortBackingInfo;
import java.util.Arrays;
public class DatacenterMO extends BaseMO {
private static final Logger s_logger = Logger.getLogger(DatacenterMO.class);
public DatacenterMO(VmwareContext context, ManagedObjectReference morDc) {
super(context, morDc);
@ -50,7 +53,9 @@ public class DatacenterMO extends BaseMO {
super(context, null);
_mor = _context.getVimClient().getDecendentMoRef(_context.getRootFolder(), "Datacenter", dcName);
assert(_mor != null);
if(_mor == null) {
s_logger.error("Unable to locate DC " + dcName);
}
}
@Override
@ -61,7 +66,6 @@ public class DatacenterMO extends BaseMO {
public void registerTemplate(ManagedObjectReference morHost, String datastoreName,
String templateName, String templateFileName) throws Exception {
ManagedObjectReference morFolder = (ManagedObjectReference)_context.getVimClient().getDynamicProperty(
_mor, "vmFolder");
assert(morFolder != null);

View File

@ -107,7 +107,6 @@ public class VmwareClient {
}
private ManagedObjectReference SVC_INST_REF = new ManagedObjectReference();
private ManagedObjectReference propCollectorRef;
private static VimService vimService;
private VimPortType vimPort;
private String serviceCookie;
@ -151,8 +150,6 @@ public class VmwareClient {
vimPort.login(serviceContent.getSessionManager(), userName, password, null);
isConnected = true;
propCollectorRef = serviceContent.getPropertyCollector();
}
/**
@ -197,7 +194,7 @@ public class VmwareClient {
* @return Service property collector
*/
public ManagedObjectReference getPropCol() {
return propCollectorRef;
return getServiceContent().getPropertyCollector();
}
/**
@ -207,6 +204,43 @@ public class VmwareClient {
return getServiceContent().getRootFolder();
}
public boolean validate() {
//
// There is no official API to validate an open vCenter API session. This is hacking way to tell if
// an open vCenter API session is still valid for making calls.
//
// It will give false result if there really does not exist data-center in the inventory, however, I consider
// this really is not possible in production deployment
//
// Create PropertySpecs
PropertySpec pSpec = new PropertySpec();
pSpec.setType("Datacenter");
pSpec.setAll(false);
pSpec.getPathSet().add("name");
ObjectSpec oSpec = new ObjectSpec();
oSpec.setObj(getRootFolder());
oSpec.setSkip(false);
oSpec.getSelectSet().addAll(constructCompleteTraversalSpec());
PropertyFilterSpec spec = new PropertyFilterSpec();
spec.getPropSet().add(pSpec);
spec.getObjectSet().add(oSpec);
List<PropertyFilterSpec> specArr = new ArrayList<PropertyFilterSpec>();
specArr.add(spec);
try {
List<ObjectContent> ocary = vimPort.retrieveProperties(getPropCol(), specArr);
if(ocary != null && ocary.size() > 0)
return true;
} catch(Exception e) {
return false;
}
return false;
}
/**
* Get the property value of a managed object.
*
@ -266,7 +300,7 @@ public class VmwareClient {
List<PropertyFilterSpec> specArr = new ArrayList<PropertyFilterSpec>();
specArr.add(spec);
return vimPort.retrieveProperties(propCollectorRef, specArr);
return vimPort.retrieveProperties(getPropCol(), specArr);
}
/**
@ -334,7 +368,8 @@ public class VmwareClient {
pSpec.setType(objmor.getType());
spec.getPropSet().add(pSpec);
ManagedObjectReference filterSpecRef = vimPort.createFilter(propCollectorRef, spec, true);
ManagedObjectReference propertyCollector = this.getPropCol();
ManagedObjectReference filterSpecRef = vimPort.createFilter(propertyCollector, spec, true);
boolean reached = false;
@ -343,7 +378,7 @@ public class VmwareClient {
List<ObjectUpdate> objupary = null;
List<PropertyChange> propchgary = null;
while (!reached) {
updateset = vimPort.waitForUpdates(propCollectorRef, version);
updateset = vimPort.waitForUpdates(propertyCollector, version);
if (updateset == null || updateset.getFilterSet() == null) {
continue;
}
@ -546,7 +581,7 @@ public class VmwareClient {
List<PropertyFilterSpec> specArr = new ArrayList<PropertyFilterSpec>();
specArr.add(spec);
List<ObjectContent> ocary = vimPort.retrieveProperties(propCollectorRef, specArr);
List<ObjectContent> ocary = vimPort.retrieveProperties(getPropCol(), specArr);
if (ocary == null || ocary.size() == 0) {
return null;

View File

@ -102,6 +102,10 @@ public class VmwareContext {
if(s_logger.isInfoEnabled())
s_logger.info("New VmwareContext object, current outstanding count: " + getOutstandingContextCount());
}
public boolean validate() {
return _vimClient.validate();
}
public void registerStockObject(String name, Object obj) {
synchronized(_stockMap) {