// 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.vmware.mo; import org.apache.log4j.Logger; import com.vmware.vim25.CustomFieldDef; import com.vmware.vim25.CustomFieldStringValue; import com.vmware.vim25.ManagedObjectReference; import com.cloud.hypervisor.vmware.util.VmwareContext; public class BaseMO { private static final Logger s_logger = Logger.getLogger(BaseMO.class); protected VmwareContext _context; protected ManagedObjectReference _mor; private String _name; public BaseMO(VmwareContext context, ManagedObjectReference mor) { assert (context != null); _context = context; _mor = mor; } public BaseMO(VmwareContext context, String morType, String morValue) { assert (context != null); assert (morType != null); assert (morValue != null); _context = context; _mor = new ManagedObjectReference(); _mor.setType(morType); _mor.setValue(morValue); } public VmwareContext getContext() { return _context; } public ManagedObjectReference getMor() { assert (_mor != null); return _mor; } public ManagedObjectReference getParentMor() throws Exception { return (ManagedObjectReference)_context.getVimClient().getDynamicProperty(_mor, "parent"); } public String getName() throws Exception { if (_name == null) _name = (String)_context.getVimClient().getDynamicProperty(_mor, "name"); return _name; } public void unregisterVm() throws Exception { _context.getService().unregisterVM(_mor); } public boolean destroy() throws Exception { ManagedObjectReference morTask = _context.getService().destroyTask(_mor); boolean result = _context.getVimClient().waitForTask(morTask); if (result) { _context.waitForTaskProgressDone(morTask); return true; } else { s_logger.error("VMware destroy_Task failed due to " + TaskMO.getTaskFailureInfo(_context, morTask)); } return false; } public void reload() throws Exception { _context.getService().reload(_mor); } public boolean rename(String newName) throws Exception { ManagedObjectReference morTask = _context.getService().renameTask(_mor, newName); boolean result = _context.getVimClient().waitForTask(morTask); if (result) { _context.waitForTaskProgressDone(morTask); return true; } else { s_logger.error("VMware rename_Task failed due to " + TaskMO.getTaskFailureInfo(_context, morTask)); } return false; } public void setCustomFieldValue(String fieldName, String value) throws Exception { CustomFieldsManagerMO cfmMo = new CustomFieldsManagerMO(_context, _context.getServiceContent().getCustomFieldsManager()); int key = getCustomFieldKey(fieldName); if (key == 0) { try { CustomFieldDef field = cfmMo.addCustomerFieldDef(fieldName, getMor().getType(), null, null); key = field.getKey(); } catch (Exception e) { // assuming the exception is caused by concurrent operation from other places // so we retieve the key again key = getCustomFieldKey(fieldName); } } if (key == 0) throw new Exception("Unable to setup custom field facility"); cfmMo.setField(getMor(), key, value); } public String getCustomFieldValue(String fieldName) throws Exception { int key = getCustomFieldKey(fieldName); if (key == 0) return null; CustomFieldStringValue cfValue = (CustomFieldStringValue)_context.getVimClient().getDynamicProperty(getMor(), String.format("value[%d]", key)); if (cfValue != null) return cfValue.getValue(); return null; } public int getCustomFieldKey(String fieldName) throws Exception { return getCustomFieldKey(getMor().getType(), fieldName); } public int getCustomFieldKey(String morType, String fieldName) throws Exception { assert (morType != null); CustomFieldsManagerMO cfmMo = new CustomFieldsManagerMO(_context, _context.getServiceContent().getCustomFieldsManager()); return cfmMo.getCustomFieldKey(morType, fieldName); } }