mirror of https://github.com/apache/jclouds.git
Issue 167: removed vi module as it isn't relevant to how we want to cover vsphere support
This commit is contained in:
parent
c2ef282acf
commit
3b752ea955
|
@ -1,2 +0,0 @@
|
|||
|
||||
|
|
@ -1 +0,0 @@
|
|||
runNodesWithTag: pass VirtualMachineRelocateSpec using Template?
|
|
@ -1,149 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!--
|
||||
|
||||
|
||||
Copyright (C) 2010 Cloud Conscious, LLC.
|
||||
<info@cloudconscious.com>
|
||||
|
||||
====================================================================
|
||||
Licensed 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.
|
||||
====================================================================
|
||||
-->
|
||||
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<parent>
|
||||
<groupId>org.jclouds</groupId>
|
||||
<artifactId>jclouds-project</artifactId>
|
||||
<version>1.0-SNAPSHOT</version>
|
||||
<relativePath>../../project/pom.xml</relativePath>
|
||||
</parent>
|
||||
<groupId>org.jclouds.api</groupId>
|
||||
<artifactId>vi</artifactId>
|
||||
<name>jclouds example components for a vijava lib for VI 4 (VMware Infrastructure)</name>
|
||||
<properties>
|
||||
<!-- when instances are hung, open a ticket and add here -->
|
||||
<jclouds.compute.blacklist.nodes>trmkrun-ccc,test.trmk-924</jclouds.compute.blacklist.nodes>
|
||||
<test.vi.endpoint>test:///default</test.vi.endpoint>
|
||||
<test.vi.apiversion>1.0</test.vi.apiversion>
|
||||
<test.vi.identity>FIXME</test.vi.identity>
|
||||
<test.vi.credential>FIXME</test.vi.credential>
|
||||
</properties>
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>commons-io</groupId>
|
||||
<artifactId>commons-io</artifactId>
|
||||
<version>1.4</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.jvnet.hudson</groupId>
|
||||
<artifactId>vijava</artifactId>
|
||||
<version>2120100824</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.jamesmurty.utils</groupId>
|
||||
<artifactId>java-xmlbuilder</artifactId>
|
||||
<version>0.3</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.jclouds</groupId>
|
||||
<artifactId>jclouds-core</artifactId>
|
||||
<version>${project.version}</version>
|
||||
<type>test-jar</type>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.jclouds</groupId>
|
||||
<artifactId>jclouds-compute</artifactId>
|
||||
<version>${project.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.jclouds</groupId>
|
||||
<artifactId>jclouds-compute</artifactId>
|
||||
<version>${project.version}</version>
|
||||
<type>test-jar</type>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>log4j</groupId>
|
||||
<artifactId>log4j</artifactId>
|
||||
<version>1.2.16</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.jclouds.driver</groupId>
|
||||
<artifactId>jclouds-log4j</artifactId>
|
||||
<version>${project.version}</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.jclouds.driver</groupId>
|
||||
<artifactId>jclouds-jsch</artifactId>
|
||||
<version>${project.version}</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.jcraft</groupId>
|
||||
<artifactId>jsch</artifactId>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
<profiles>
|
||||
<profile>
|
||||
<id>live</id>
|
||||
<build>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-surefire-plugin</artifactId>
|
||||
<executions>
|
||||
<execution>
|
||||
<id>integration</id>
|
||||
<phase>integration-test</phase>
|
||||
<goals>
|
||||
<goal>test</goal>
|
||||
</goals>
|
||||
<configuration>
|
||||
<systemProperties>
|
||||
<property>
|
||||
<name>test.vi.endpoint</name>
|
||||
<value>${test.vi.endpoint}</value>
|
||||
</property>
|
||||
<property>
|
||||
<name>test.vi.apiversion</name>
|
||||
<value>${test.vi.apiversion}</value>
|
||||
</property>
|
||||
<property>
|
||||
<name>test.vi.identity</name>
|
||||
<value>${test.vi.identity}</value>
|
||||
</property>
|
||||
<property>
|
||||
<name>test.vi.credential</name>
|
||||
<value>${test.vi.credential}</value>
|
||||
</property>
|
||||
<property>
|
||||
<name>jclouds.compute.blacklist.nodes</name>
|
||||
<value>${jclouds.compute.blacklist.nodes}</value>
|
||||
</property>
|
||||
</systemProperties>
|
||||
</configuration>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
</profile>
|
||||
</profiles>
|
||||
|
||||
</project>
|
|
@ -1,418 +0,0 @@
|
|||
/*================================================================================
|
||||
Copyright (c) 2008 VMware, Inc. All Rights Reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without modification,
|
||||
are permitted provided that the following conditions are met:
|
||||
|
||||
* Redistributions of source code must retain the above copyright notice,
|
||||
this list of conditions and the following disclaimer.
|
||||
|
||||
* Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions and the following disclaimer in the documentation
|
||||
and/or other materials provided with the distribution.
|
||||
|
||||
* Neither the name of VMware, Inc. nor the names of its contributors may be used
|
||||
to endorse or promote products derived from this software without specific prior
|
||||
written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
IN NO EVENT SHALL VMWARE, INC. OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||
WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
POSSIBILITY OF SUCH DAMAGE.
|
||||
================================================================================*/
|
||||
|
||||
package com.vmware.vim25.mo;
|
||||
|
||||
import java.net.MalformedURLException;
|
||||
import java.net.URL;
|
||||
import java.rmi.RemoteException;
|
||||
import java.util.Calendar;
|
||||
|
||||
import com.vmware.vim25.AboutInfo;
|
||||
import com.vmware.vim25.Capability;
|
||||
import com.vmware.vim25.Event;
|
||||
import com.vmware.vim25.HostVMotionCompatibility;
|
||||
import com.vmware.vim25.InvalidState;
|
||||
import com.vmware.vim25.ManagedObjectReference;
|
||||
import com.vmware.vim25.ProductComponentInfo;
|
||||
import com.vmware.vim25.RuntimeFault;
|
||||
import com.vmware.vim25.ServiceContent;
|
||||
import com.vmware.vim25.UserSession;
|
||||
import com.vmware.vim25.VimPortType;
|
||||
import com.vmware.vim25.VirtualMachinePowerState;
|
||||
import com.vmware.vim25.mo.util.MorUtil;
|
||||
import com.vmware.vim25.ws.WSClient;
|
||||
|
||||
/**
|
||||
*
|
||||
* jclouds
|
||||
*
|
||||
* The managed object class corresponding to the one defined in VI SDK API reference.
|
||||
* @author Steve JIN (sjin@vmware.com)
|
||||
*/
|
||||
|
||||
public class ServiceInstance extends ManagedObject
|
||||
{
|
||||
private ServiceContent serviceContent = null;
|
||||
final static ManagedObjectReference SERVICE_INSTANCE_MOR;
|
||||
public final static String VIM25_NAMESPACE = " xmlns=\"urn:vim25\">";
|
||||
public final static String VIM20_NAMESPACE = " xmlns=\"urn:vim2\">";
|
||||
|
||||
static
|
||||
{
|
||||
SERVICE_INSTANCE_MOR = new ManagedObjectReference();
|
||||
SERVICE_INSTANCE_MOR.set_value("ServiceInstance");
|
||||
SERVICE_INSTANCE_MOR.setType("ServiceInstance");
|
||||
}
|
||||
|
||||
// PATCHED CONSTRUCTOR
|
||||
public ServiceInstance(WSClient wsc, String username, String password, String ignoreCert)
|
||||
throws RemoteException, MalformedURLException
|
||||
{
|
||||
|
||||
if(ignoreCert.equals("true")) {
|
||||
this.ignoreCertificate();
|
||||
}
|
||||
|
||||
if(username == null) {
|
||||
throw new NullPointerException("username cannot be null.");
|
||||
}
|
||||
|
||||
setMOR(SERVICE_INSTANCE_MOR);
|
||||
|
||||
// PATCH TO USE OUR wsc
|
||||
VimPortType vimService = new VimPortType(wsc);
|
||||
vimService.getWsc().setVimNameSpace(wsc.getVimNameSpace());
|
||||
|
||||
serviceContent = vimService.retrieveServiceContent(SERVICE_INSTANCE_MOR);
|
||||
vimService.getWsc().setSoapActionOnApiVersion(serviceContent.getAbout().getApiVersion());
|
||||
setServerConnection(new ServerConnection(wsc.getBaseUrl(), vimService, this));
|
||||
|
||||
// escape 5 special chars
|
||||
// http://en.wikipedia.org/wiki/List_of_XML_and_HTML_character_entity_references
|
||||
password = password.replace("&", "&")
|
||||
.replace("<", "<")
|
||||
.replace(">", ">")
|
||||
.replace("\"", """)
|
||||
.replace("'", "'");
|
||||
|
||||
UserSession userSession = getSessionManager().login(username, password, null);
|
||||
getServerConnection().setUserSession(userSession);
|
||||
}
|
||||
|
||||
public ServiceInstance(URL url, String username, String password)
|
||||
throws RemoteException, MalformedURLException
|
||||
{
|
||||
this(url, username, password, false);
|
||||
}
|
||||
|
||||
public ServiceInstance(URL url, String username, String password, boolean ignoreCert)
|
||||
throws RemoteException, MalformedURLException
|
||||
{
|
||||
this(url, username, password, ignoreCert, VIM25_NAMESPACE);
|
||||
}
|
||||
|
||||
public ServiceInstance(URL url, String username, String password, boolean ignoreCert, String namespace)
|
||||
throws RemoteException, MalformedURLException
|
||||
{
|
||||
if(url == null || username==null)
|
||||
{
|
||||
throw new NullPointerException("None of url, username can be null.");
|
||||
}
|
||||
|
||||
setMOR(SERVICE_INSTANCE_MOR);
|
||||
|
||||
VimPortType vimService = new VimPortType(url.toString(), ignoreCert);
|
||||
vimService.getWsc().setVimNameSpace(namespace);
|
||||
|
||||
serviceContent = vimService.retrieveServiceContent(SERVICE_INSTANCE_MOR);
|
||||
vimService.getWsc().setSoapActionOnApiVersion(serviceContent.getAbout().getApiVersion());
|
||||
setServerConnection(new ServerConnection(url, vimService, this));
|
||||
|
||||
// escape 5 special chars
|
||||
// http://en.wikipedia.org/wiki/List_of_XML_and_HTML_character_entity_references
|
||||
password = password.replace("&", "&")
|
||||
.replace("<", "<")
|
||||
.replace(">", ">")
|
||||
.replace("\"", """)
|
||||
.replace("'", "'");
|
||||
|
||||
UserSession userSession = getSessionManager().login(username, password, null);
|
||||
getServerConnection().setUserSession(userSession);
|
||||
}
|
||||
|
||||
public ServiceInstance(URL url, String sessionStr, boolean ignoreCert)
|
||||
throws RemoteException, MalformedURLException
|
||||
{
|
||||
this(url, sessionStr, ignoreCert, VIM25_NAMESPACE);
|
||||
}
|
||||
|
||||
// sessionStr format: "vmware_soap_session=\"B3240D15-34DF-4BB8-B902-A844FDF42E85\""
|
||||
public ServiceInstance(URL url, String sessionStr, boolean ignoreCert, String namespace)
|
||||
throws RemoteException, MalformedURLException
|
||||
{
|
||||
if(url == null || sessionStr ==null)
|
||||
{
|
||||
throw new NullPointerException("None of url, session string can be null.");
|
||||
}
|
||||
|
||||
setMOR(SERVICE_INSTANCE_MOR);
|
||||
|
||||
VimPortType vimService = new VimPortType(url.toString(), ignoreCert);
|
||||
WSClient wsc = vimService.getWsc();
|
||||
wsc.setCookie(sessionStr);
|
||||
wsc.setVimNameSpace(namespace);
|
||||
|
||||
serviceContent = vimService.retrieveServiceContent(SERVICE_INSTANCE_MOR);
|
||||
setServerConnection(new ServerConnection(url, vimService, this));
|
||||
UserSession userSession = (UserSession) getSessionManager().getCurrentProperty("currentSession");
|
||||
getServerConnection().setUserSession(userSession);
|
||||
}
|
||||
|
||||
public ServiceInstance(ServerConnection sc)
|
||||
{
|
||||
super(sc, SERVICE_INSTANCE_MOR);
|
||||
}
|
||||
|
||||
public Calendar getServerClock()
|
||||
{
|
||||
return (Calendar) getCurrentProperty("serverClock");
|
||||
}
|
||||
|
||||
public Capability getCapability()
|
||||
{
|
||||
return (Capability) getCurrentProperty("capability");
|
||||
}
|
||||
|
||||
public ClusterProfileManager getClusterProfileManager()
|
||||
{
|
||||
return (ClusterProfileManager) createMO(getServiceContent().getClusterProfileManager());
|
||||
}
|
||||
|
||||
public Calendar currentTime() throws RuntimeFault, RemoteException
|
||||
{
|
||||
return getVimService().currentTime(getMOR());
|
||||
}
|
||||
|
||||
|
||||
public Folder getRootFolder()
|
||||
{
|
||||
return new Folder(this.getServerConnection(), this.getServiceContent().getRootFolder());
|
||||
}
|
||||
|
||||
public HostVMotionCompatibility[] queryVMotionCompatibility(VirtualMachine vm, HostSystem[] hosts, String[] compatibility) throws RuntimeFault, RemoteException
|
||||
{
|
||||
if(vm==null || hosts==null)
|
||||
{
|
||||
throw new IllegalArgumentException("Neither vm or hosts can be null.");
|
||||
}
|
||||
return getVimService().queryVMotionCompatibility(getMOR(), vm.getMOR(), MorUtil.createMORs(hosts), compatibility);
|
||||
}
|
||||
|
||||
public ProductComponentInfo[] retrieveProductComponents() throws RuntimeFault, RemoteException
|
||||
{
|
||||
return getVimService().retrieveProductComponents(getMOR());
|
||||
}
|
||||
|
||||
private ServiceContent retrieveServiceContent() throws RuntimeFault, RemoteException
|
||||
{
|
||||
return getVimService().retrieveServiceContent(getMOR());
|
||||
}
|
||||
|
||||
public Event[] validateMigration(VirtualMachine[] vms, VirtualMachinePowerState state, String[] testType
|
||||
, ResourcePool pool, HostSystem host) throws InvalidState, RuntimeFault, RemoteException
|
||||
{
|
||||
if(vms==null)
|
||||
{
|
||||
throw new IllegalArgumentException("vms must not be null.");
|
||||
}
|
||||
|
||||
return getVimService().validateMigration(getMOR(), MorUtil.createMORs(vms), state, testType,
|
||||
pool==null? null: pool.getMOR(), host==null? null : host.getMOR());
|
||||
}
|
||||
|
||||
public ServiceContent getServiceContent()
|
||||
{
|
||||
if(serviceContent == null)
|
||||
{
|
||||
try
|
||||
{
|
||||
serviceContent = retrieveServiceContent();
|
||||
} catch(Exception e)
|
||||
{
|
||||
System.out.println("Exceptoin: " + e);
|
||||
}
|
||||
}
|
||||
return serviceContent;
|
||||
}
|
||||
|
||||
public AboutInfo getAboutInfo()
|
||||
{
|
||||
return getServiceContent().getAbout();
|
||||
}
|
||||
|
||||
public AlarmManager getAlarmManager()
|
||||
{
|
||||
return (AlarmManager) createMO(getServiceContent().getAlarmManager());
|
||||
}
|
||||
|
||||
public AuthorizationManager getAuthorizationManager()
|
||||
{
|
||||
return (AuthorizationManager) createMO(getServiceContent().getAuthorizationManager());
|
||||
}
|
||||
|
||||
public CustomFieldsManager getCustomFieldsManager()
|
||||
{
|
||||
return (CustomFieldsManager) createMO(getServiceContent().getCustomFieldsManager());
|
||||
}
|
||||
|
||||
public CustomizationSpecManager getCustomizationSpecManager()
|
||||
{
|
||||
return (CustomizationSpecManager) createMO(getServiceContent().getCustomizationSpecManager());
|
||||
}
|
||||
|
||||
public EventManager getEventManager()
|
||||
{
|
||||
return (EventManager) createMO(getServiceContent().getEventManager());
|
||||
}
|
||||
|
||||
public DiagnosticManager getDiagnosticManager()
|
||||
{
|
||||
return (DiagnosticManager) createMO(getServiceContent().getDiagnosticManager());
|
||||
}
|
||||
|
||||
public DistributedVirtualSwitchManager getDistributedVirtualSwitchManager()
|
||||
{
|
||||
return (DistributedVirtualSwitchManager) createMO(getServiceContent().getDvSwitchManager());
|
||||
}
|
||||
|
||||
public ExtensionManager getExtensionManager()
|
||||
{
|
||||
return (ExtensionManager) createMO(getServiceContent().getExtensionManager());
|
||||
}
|
||||
|
||||
public FileManager getFileManager()
|
||||
{
|
||||
return (FileManager) createMO(getServiceContent().getFileManager());
|
||||
}
|
||||
|
||||
public HostLocalAccountManager getAccountManager()
|
||||
{
|
||||
return (HostLocalAccountManager) createMO(getServiceContent().getAccountManager());
|
||||
}
|
||||
|
||||
public LicenseManager getLicenseManager()
|
||||
{
|
||||
return (LicenseManager) createMO(getServiceContent().getLicenseManager());
|
||||
}
|
||||
|
||||
public LocalizationManager getLocalizationManager()
|
||||
{
|
||||
return (LocalizationManager) createMO(getServiceContent().getLocalizationManager());
|
||||
}
|
||||
|
||||
public PerformanceManager getPerformanceManager()
|
||||
{
|
||||
return (PerformanceManager) createMO(getServiceContent().getPerfManager());
|
||||
}
|
||||
|
||||
public ProfileComplianceManager getProfileComplianceManager()
|
||||
{
|
||||
return (ProfileComplianceManager) createMO(getServiceContent().getComplianceManager());
|
||||
}
|
||||
|
||||
public PropertyCollector getPropertyCollector()
|
||||
{
|
||||
return (PropertyCollector) createMO(getServiceContent().getPropertyCollector());
|
||||
}
|
||||
|
||||
public ScheduledTaskManager getScheduledTaskManager()
|
||||
{
|
||||
return (ScheduledTaskManager) createMO(getServiceContent().getScheduledTaskManager());
|
||||
}
|
||||
|
||||
public SearchIndex getSearchIndex()
|
||||
{
|
||||
return (SearchIndex) createMO(getServiceContent().getSearchIndex());
|
||||
}
|
||||
|
||||
public SessionManager getSessionManager()
|
||||
{
|
||||
return (SessionManager) createMO(getServiceContent().getSessionManager());
|
||||
}
|
||||
|
||||
public HostSnmpSystem getHostSnmpSystem()
|
||||
{
|
||||
return (HostSnmpSystem) createMO(getServiceContent().getSnmpSystem());
|
||||
}
|
||||
|
||||
public HostProfileManager getHostProfileManager()
|
||||
{
|
||||
return (HostProfileManager) createMO(getServiceContent().getHostProfileManager());
|
||||
}
|
||||
|
||||
public IpPoolManager getIpPoolManager()
|
||||
{
|
||||
return (IpPoolManager) createMO(getServiceContent().getIpPoolManager());
|
||||
}
|
||||
|
||||
public VirtualMachineProvisioningChecker getVirtualMachineProvisioningChecker()
|
||||
{
|
||||
return (VirtualMachineProvisioningChecker) createMO(getServiceContent().getVmProvisioningChecker());
|
||||
}
|
||||
|
||||
public VirtualMachineCompatibilityChecker getVirtualMachineCompatibilityChecker()
|
||||
{
|
||||
return (VirtualMachineCompatibilityChecker) createMO(getServiceContent().getVmCompatibilityChecker());
|
||||
}
|
||||
|
||||
public TaskManager getTaskManager()
|
||||
{
|
||||
return (TaskManager) createMO(getServiceContent().getTaskManager());
|
||||
}
|
||||
|
||||
public UserDirectory getUserDirectory()
|
||||
{
|
||||
return (UserDirectory) createMO(getServiceContent().getUserDirectory());
|
||||
}
|
||||
|
||||
public ViewManager getViewManager()
|
||||
{
|
||||
return (ViewManager) createMO(getServiceContent().getViewManager());
|
||||
}
|
||||
|
||||
public VirtualDiskManager getVirtualDiskManager()
|
||||
{
|
||||
return (VirtualDiskManager) createMO(getServiceContent().getVirtualDiskManager());
|
||||
}
|
||||
|
||||
public OptionManager getOptionManager()
|
||||
{
|
||||
return (OptionManager) createMO(getServiceContent().getSetting());
|
||||
}
|
||||
|
||||
public OvfManager getOvfManager()
|
||||
{
|
||||
return (OvfManager) createMO(getServiceContent().getOvfManager());
|
||||
}
|
||||
|
||||
private ManagedObject createMO(ManagedObjectReference mor)
|
||||
{
|
||||
return MorUtil.createExactManagedObject(getServerConnection(), mor);
|
||||
}
|
||||
|
||||
private void ignoreCertificate()
|
||||
{
|
||||
System.setProperty("org.apache.axis.components.net.SecureSocketFactory",
|
||||
"org.apache.axis.components.net.SunFakeTrustSocketFactory");
|
||||
}
|
||||
|
||||
// TODO vim.VirtualizationManager is defined in servicecontent but no documentation there. Filed a bug already
|
||||
|
||||
}
|
|
@ -1,412 +0,0 @@
|
|||
/*================================================================================
|
||||
Copyright (c) 2009 VMware, Inc. All Rights Reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without modification,
|
||||
are permitted provided that the following conditions are met:
|
||||
|
||||
* Redistributions of source code must retain the above copyright notice,
|
||||
this list of conditions and the following disclaimer.
|
||||
|
||||
* Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions and the following disclaimer in the documentation
|
||||
and/or other materials provided with the distribution.
|
||||
|
||||
* Neither the name of VMware, Inc. nor the names of its contributors may be used
|
||||
to endorse or promote products derived from this software without specific prior
|
||||
written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
IN NO EVENT SHALL VMWARE, INC. OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||
WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
POSSIBILITY OF SUCH DAMAGE.
|
||||
================================================================================*/
|
||||
|
||||
package com.vmware.vim25.ws;
|
||||
|
||||
import java.io.BufferedReader;
|
||||
import java.io.ByteArrayInputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.InputStreamReader;
|
||||
import java.io.OutputStream;
|
||||
import java.io.OutputStreamWriter;
|
||||
import java.net.HttpURLConnection;
|
||||
import java.net.MalformedURLException;
|
||||
import java.net.ProtocolException;
|
||||
import java.net.URISyntaxException;
|
||||
import java.net.URL;
|
||||
import java.rmi.RemoteException;
|
||||
import java.security.KeyManagementException;
|
||||
import java.security.NoSuchAlgorithmException;
|
||||
import java.security.cert.CertificateException;
|
||||
import java.security.cert.X509Certificate;
|
||||
import java.util.List;
|
||||
import java.util.Map.Entry;
|
||||
|
||||
import javax.net.ssl.HostnameVerifier;
|
||||
import javax.net.ssl.HttpsURLConnection;
|
||||
import javax.net.ssl.SSLContext;
|
||||
import javax.net.ssl.SSLSession;
|
||||
import javax.net.ssl.TrustManager;
|
||||
import javax.net.ssl.X509TrustManager;
|
||||
|
||||
import org.dom4j.Document;
|
||||
import org.dom4j.Element;
|
||||
import org.dom4j.io.SAXReader;
|
||||
import org.jclouds.util.Strings2;
|
||||
|
||||
import com.vmware.vim25.ManagedObjectReference;
|
||||
|
||||
/**
|
||||
* The Web Service Engine
|
||||
* @author Steve Jin (sjin@vmware.com)
|
||||
*/
|
||||
// MARKED NOT FINAL
|
||||
public class WSClient
|
||||
{
|
||||
private final static String SOAP_HEADER = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><soapenv:Envelope xmlns:soapenc=\"http://schemas.xmlsoap.org/soap/encoding/\" xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"><soapenv:Body>";
|
||||
private final static String SOAP_END = "</soapenv:Body></soapenv:Envelope>";
|
||||
private final static String SOAP_ACTION_HEADER = "SOAPAction";
|
||||
private final static String SOAP_ACTION_V40 = "urn:vim25/4.0";
|
||||
private final static String SOAP_ACTION_V41 = "urn:vim25/4.1";
|
||||
|
||||
private URL baseUrl = null;
|
||||
private String cookie = null;
|
||||
private String vimNameSpace = null;
|
||||
private String soapAction = SOAP_ACTION_V40;
|
||||
private int connectTimeout = 0;
|
||||
private int readTimeout = 0;
|
||||
|
||||
public WSClient(String serverUrl) throws MalformedURLException
|
||||
{
|
||||
this(serverUrl, true);
|
||||
}
|
||||
|
||||
public WSClient(String serverUrl, boolean ignoreCert) throws MalformedURLException
|
||||
{
|
||||
if(serverUrl.endsWith("/"))
|
||||
{
|
||||
serverUrl = serverUrl.substring(0, serverUrl.length()-1);
|
||||
}
|
||||
this.baseUrl = new URL(serverUrl);
|
||||
if(ignoreCert)
|
||||
{
|
||||
try
|
||||
{
|
||||
trustAllHttpsCertificates();
|
||||
HttpsURLConnection.setDefaultHostnameVerifier
|
||||
(
|
||||
new HostnameVerifier()
|
||||
{
|
||||
public boolean verify(String urlHostName, SSLSession session)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
);
|
||||
} catch (Exception e) {}
|
||||
}
|
||||
}
|
||||
|
||||
public Object invoke(ManagedObjectReference mor, String methodName, Argument[] paras, String returnType) throws IOException
|
||||
{
|
||||
Argument[] fullParas = new Argument[paras.length + 1];
|
||||
fullParas[0] = new Argument("_this", "ManagedObjectReference", mor);
|
||||
System.arraycopy(paras, 0, fullParas, 1, paras.length);
|
||||
return invoke(methodName, fullParas, returnType);
|
||||
}
|
||||
|
||||
public Object invoke(String methodName, Argument[] paras, String returnType) throws RemoteException
|
||||
{
|
||||
Element root = invoke(methodName, paras);
|
||||
Element body = (Element) root.elements().get(0);
|
||||
Element resp = (Element) body.elements().get(0);
|
||||
|
||||
if(resp.getName().indexOf("Fault")!=-1)
|
||||
{
|
||||
SoapFaultException sfe = null;
|
||||
try
|
||||
{
|
||||
sfe = XmlGen.parseSoapFault(resp);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
throw new RemoteException("Exception in WSClient.invoke:", e);
|
||||
}
|
||||
if(sfe!=null && sfe.detail!=null)
|
||||
{
|
||||
throw (RemoteException) sfe.detail;
|
||||
}
|
||||
else
|
||||
{
|
||||
throw sfe;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if(returnType!=null)
|
||||
{
|
||||
try
|
||||
{
|
||||
return XmlGen.fromXML(returnType, resp);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
throw new RemoteException("Exception in WSClient.invoke:", e);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public Element invoke(String methodName, Argument[] paras) throws RemoteException
|
||||
{
|
||||
String soapMsg = createSoapMessage(methodName, paras);
|
||||
|
||||
Element root = null;
|
||||
InputStream is = null;
|
||||
try
|
||||
{
|
||||
is = post(soapMsg);
|
||||
SAXReader reader = new SAXReader();
|
||||
Document doc = reader.read(is);
|
||||
root = doc.getRootElement();
|
||||
} catch (Exception e)
|
||||
{
|
||||
throw new RemoteException("VI SDK invoke exception:" + e);
|
||||
}
|
||||
finally
|
||||
{
|
||||
if(is!=null)
|
||||
try { is.close(); } catch(IOException ioe) {}
|
||||
}
|
||||
|
||||
return root;
|
||||
}
|
||||
|
||||
public StringBuffer invokeAsString(String methodName, Argument[] paras) throws RemoteException
|
||||
{
|
||||
String soapMsg = createSoapMessage(methodName, paras);
|
||||
|
||||
try
|
||||
{
|
||||
InputStream is = post(soapMsg);
|
||||
return readStream(is);
|
||||
} catch (Exception e)
|
||||
{
|
||||
throw new RemoteException("VI SDK invoke exception:" + e);
|
||||
}
|
||||
}
|
||||
|
||||
private String createSoapMessage(String methodName, Argument[] paras)
|
||||
{
|
||||
StringBuffer sb = new StringBuffer();
|
||||
sb.append(SOAP_HEADER);
|
||||
|
||||
sb.append("<" + methodName + vimNameSpace);
|
||||
|
||||
for(int i=0; i<paras.length; i++)
|
||||
{
|
||||
String key = paras[i].getName();
|
||||
String type = paras[i].getType();
|
||||
Object obj = paras[i].getValue();
|
||||
sb.append(XmlGen.toXML(key, type, obj)); //, null));
|
||||
}
|
||||
|
||||
sb.append("</" + methodName + ">");
|
||||
sb.append(SOAP_END);
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
public InputStream post(String soapMsg) throws IOException
|
||||
{
|
||||
HttpURLConnection postCon = (HttpURLConnection) baseUrl.openConnection();
|
||||
|
||||
if(connectTimeout > 0)
|
||||
postCon.setConnectTimeout(connectTimeout);
|
||||
if(readTimeout > 0)
|
||||
postCon.setReadTimeout(readTimeout);
|
||||
|
||||
try {
|
||||
postCon.setRequestMethod("POST");
|
||||
} catch (ProtocolException e)
|
||||
{
|
||||
e.printStackTrace();
|
||||
}
|
||||
postCon.setDoOutput(true);
|
||||
postCon.setDoInput(true);
|
||||
postCon.setRequestProperty(SOAP_ACTION_HEADER, soapAction);
|
||||
if(cookie!=null)
|
||||
{
|
||||
postCon.setRequestProperty("Cookie", cookie);
|
||||
}
|
||||
|
||||
OutputStream os = postCon.getOutputStream();
|
||||
OutputStreamWriter out = new OutputStreamWriter(os);
|
||||
// PRINT REQUEST
|
||||
try {
|
||||
System.out.printf("%s %s HTTP/1.1%n", "POST", baseUrl.toURI().toASCIIString());
|
||||
System.out.printf("%s: %s%n", SOAP_ACTION_HEADER, soapAction);
|
||||
if(cookie!=null)
|
||||
System.out.printf("%s: %s%n", "Cookie", cookie);
|
||||
System.out.println(soapMsg);
|
||||
|
||||
} catch (URISyntaxException e1) {
|
||||
}
|
||||
|
||||
// END PRINT REQUEST
|
||||
|
||||
out.write(soapMsg);
|
||||
out.close();
|
||||
|
||||
InputStream is;
|
||||
|
||||
try
|
||||
{
|
||||
is = postCon.getInputStream();
|
||||
}
|
||||
catch(IOException ioe)
|
||||
{
|
||||
is = postCon.getErrorStream();
|
||||
}
|
||||
|
||||
if(cookie==null)
|
||||
{
|
||||
cookie = postCon.getHeaderField("Set-Cookie");
|
||||
}
|
||||
|
||||
// PRINT RESPONSE
|
||||
|
||||
System.out.printf("HTTP/1.1 %d %s", postCon.getResponseCode(), postCon.getResponseMessage());
|
||||
|
||||
for (Entry<String, List<String>> i : postCon.getHeaderFields().entrySet()) {
|
||||
for (String v : i.getValue())
|
||||
System.out.printf("%s: %s%n", i.getKey(), v);
|
||||
}
|
||||
String response = Strings2.toStringAndClose(is);
|
||||
System.out.println(response);
|
||||
is = new ByteArrayInputStream(response.getBytes());
|
||||
|
||||
// END PRINT RESPONSE
|
||||
|
||||
return is;
|
||||
}
|
||||
|
||||
public URL getBaseUrl()
|
||||
{
|
||||
return this.baseUrl;
|
||||
}
|
||||
|
||||
public void setBaseUrl(URL baseUrl)
|
||||
{
|
||||
this.baseUrl = baseUrl;
|
||||
}
|
||||
|
||||
public String getCookie()
|
||||
{
|
||||
return cookie;
|
||||
}
|
||||
|
||||
public void setCookie(String cookie)
|
||||
{
|
||||
this.cookie = cookie;
|
||||
}
|
||||
|
||||
public String getVimNameSpace()
|
||||
{
|
||||
return vimNameSpace;
|
||||
}
|
||||
|
||||
public void setVimNameSpace(String vimNameSpace)
|
||||
{
|
||||
this.vimNameSpace = vimNameSpace;
|
||||
}
|
||||
|
||||
public void setConnectTimeout(int timeoutMilliSec)
|
||||
{
|
||||
this.connectTimeout = timeoutMilliSec;
|
||||
}
|
||||
|
||||
public int getConnectTimeout()
|
||||
{
|
||||
return this.connectTimeout;
|
||||
}
|
||||
|
||||
public void setReadTimeout(int timeoutMilliSec)
|
||||
{
|
||||
this.readTimeout = timeoutMilliSec;
|
||||
}
|
||||
|
||||
public int getReadTimeout()
|
||||
{
|
||||
return this.readTimeout;
|
||||
}
|
||||
|
||||
/*===============================================
|
||||
* API versions *
|
||||
"2.0.0" VI 3.0
|
||||
"2.5.0" VI 3.5 (and u1)
|
||||
"2.5u2" VI 3.5u2 (and u3, u4)
|
||||
"4.0" vSphere 4.0 (and u1)
|
||||
"4.1" vSphere 4.1
|
||||
===============================================*/
|
||||
public void setSoapActionOnApiVersion(String apiVersion)
|
||||
{
|
||||
//4.0 is set by default already, so skip it here
|
||||
if("4.1".equals(apiVersion))
|
||||
{
|
||||
soapAction = SOAP_ACTION_V41;
|
||||
}
|
||||
}
|
||||
|
||||
private StringBuffer readStream(InputStream is) throws IOException
|
||||
{
|
||||
StringBuffer sb = new StringBuffer();
|
||||
BufferedReader in = new BufferedReader(new InputStreamReader(is));
|
||||
String lineStr;
|
||||
while ((lineStr = in.readLine()) != null)
|
||||
{
|
||||
sb.append(lineStr);
|
||||
}
|
||||
in.close();
|
||||
return sb;
|
||||
}
|
||||
|
||||
private static void trustAllHttpsCertificates()
|
||||
throws NoSuchAlgorithmException, KeyManagementException
|
||||
{
|
||||
TrustManager[] trustAllCerts = new TrustManager[1];
|
||||
trustAllCerts[0] = new TrustAllManager();
|
||||
SSLContext sc = SSLContext.getInstance("SSL");
|
||||
sc.init(null, trustAllCerts, null);
|
||||
HttpsURLConnection.setDefaultSSLSocketFactory(
|
||||
sc.getSocketFactory());
|
||||
}
|
||||
|
||||
private static class TrustAllManager implements X509TrustManager
|
||||
{
|
||||
public X509Certificate[] getAcceptedIssuers()
|
||||
{
|
||||
return null;
|
||||
}
|
||||
public void checkServerTrusted(X509Certificate[] certs,
|
||||
String authType)
|
||||
throws CertificateException
|
||||
{
|
||||
}
|
||||
public void checkClientTrusted(X509Certificate[] certs,
|
||||
String authType)
|
||||
throws CertificateException
|
||||
{
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,56 +0,0 @@
|
|||
/**
|
||||
*
|
||||
* Copyright (C) 2010 Cloud Conscious, LLC. <info@cloudconscious.com>
|
||||
*
|
||||
* ====================================================================
|
||||
* Licensed 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 org.jclouds.vi;
|
||||
|
||||
import com.google.common.base.Objects;
|
||||
|
||||
/**
|
||||
* This would be replaced with the real java object related to the underlying image
|
||||
*
|
||||
* @author Adrian Cole
|
||||
*/
|
||||
public class Image {
|
||||
|
||||
public String id;
|
||||
public String name;
|
||||
|
||||
public Image(String id, String name) {
|
||||
this.id = id;
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return Objects.hashCode(id, name);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object that) {
|
||||
if (that == null)
|
||||
return false;
|
||||
return Objects.equal(this.toString(), that.toString());
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return Objects.toStringHelper(this).add("id", id).add("name", name).toString();
|
||||
}
|
||||
|
||||
}
|
|
@ -1,101 +0,0 @@
|
|||
/**
|
||||
*
|
||||
* Copyright (C) 2010 Cloud Conscious, LLC. <info@cloudconscious.com>
|
||||
*
|
||||
* ====================================================================
|
||||
* Licensed 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 org.jclouds.vi.compute;
|
||||
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.concurrent.ExecutorService;
|
||||
|
||||
import javax.inject.Inject;
|
||||
import javax.inject.Named;
|
||||
import javax.inject.Provider;
|
||||
import javax.inject.Singleton;
|
||||
|
||||
import org.jclouds.Constants;
|
||||
import org.jclouds.collect.Memoized;
|
||||
import org.jclouds.compute.ComputeServiceContext;
|
||||
import org.jclouds.compute.domain.Hardware;
|
||||
import org.jclouds.compute.domain.Image;
|
||||
import org.jclouds.compute.domain.NodeMetadata;
|
||||
import org.jclouds.compute.domain.TemplateBuilder;
|
||||
import org.jclouds.compute.internal.BaseComputeService;
|
||||
import org.jclouds.compute.options.TemplateOptions;
|
||||
import org.jclouds.compute.reference.ComputeServiceConstants.Timeouts;
|
||||
import org.jclouds.compute.strategy.DestroyNodeStrategy;
|
||||
import org.jclouds.compute.strategy.GetNodeMetadataStrategy;
|
||||
import org.jclouds.compute.strategy.InitializeRunScriptOnNodeOrPlaceInBadMap;
|
||||
import org.jclouds.compute.strategy.ListNodesStrategy;
|
||||
import org.jclouds.compute.strategy.RebootNodeStrategy;
|
||||
import org.jclouds.compute.strategy.ResumeNodeStrategy;
|
||||
import org.jclouds.compute.strategy.CreateNodesInGroupThenAddToSet;
|
||||
import org.jclouds.compute.strategy.SuspendNodeStrategy;
|
||||
import org.jclouds.domain.Credentials;
|
||||
import org.jclouds.domain.Location;
|
||||
|
||||
import com.google.common.base.Predicate;
|
||||
import com.google.common.base.Supplier;
|
||||
import com.google.common.base.Throwables;
|
||||
import com.vmware.vim25.mo.ServiceInstance;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author andrea.turli
|
||||
*
|
||||
*/
|
||||
@Singleton
|
||||
public class ViComputeService extends BaseComputeService {
|
||||
|
||||
private final ServiceInstance client;
|
||||
|
||||
@Inject
|
||||
protected ViComputeService(ComputeServiceContext context, Map<String, Credentials> credentialStore,
|
||||
@Memoized Supplier<Set<? extends Image>> images,
|
||||
@Memoized Supplier<Set<? extends Hardware>> hardwareProfiles,
|
||||
@Memoized Supplier<Set<? extends Location>> locations, ListNodesStrategy listNodesStrategy,
|
||||
GetNodeMetadataStrategy getNodeMetadataStrategy, CreateNodesInGroupThenAddToSet runNodesAndAddToSetStrategy,
|
||||
RebootNodeStrategy rebootNodeStrategy, DestroyNodeStrategy destroyNodeStrategy,
|
||||
ResumeNodeStrategy resumeNodeStrategy, SuspendNodeStrategy suspendNodeStrategy,
|
||||
Provider<TemplateBuilder> templateBuilderProvider, Provider<TemplateOptions> templateOptionsProvider,
|
||||
@Named("NODE_RUNNING") Predicate<NodeMetadata> nodeRunning,
|
||||
@Named("NODE_TERMINATED") Predicate<NodeMetadata> nodeTerminated,
|
||||
@Named("NODE_SUSPENDED") Predicate<NodeMetadata> nodeSuspended,
|
||||
InitializeRunScriptOnNodeOrPlaceInBadMap.Factory initScriptRunnerFactory, Timeouts timeouts,
|
||||
@Named(Constants.PROPERTY_USER_THREADS) ExecutorService executor, ServiceInstance client) {
|
||||
super(context, credentialStore, images, hardwareProfiles, locations, listNodesStrategy, getNodeMetadataStrategy,
|
||||
runNodesAndAddToSetStrategy, rebootNodeStrategy, destroyNodeStrategy, resumeNodeStrategy,
|
||||
suspendNodeStrategy, templateBuilderProvider, templateOptionsProvider, nodeRunning, nodeTerminated,
|
||||
nodeSuspended, initScriptRunnerFactory, timeouts, executor);
|
||||
|
||||
this.client = client;
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void destroyNode(String id) {
|
||||
super.destroyNode(id);
|
||||
}
|
||||
|
||||
protected <T> T propogate(Exception e) {
|
||||
Throwables.propagate(e);
|
||||
assert false;
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
|
@ -1,46 +0,0 @@
|
|||
/**
|
||||
*
|
||||
* Copyright (C) 2010 Cloud Conscious, LLC. <info@cloudconscious.com>
|
||||
*
|
||||
* ====================================================================
|
||||
* Licensed 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 org.jclouds.vi.compute;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Properties;
|
||||
|
||||
import org.jclouds.compute.StandaloneComputeServiceContextBuilder;
|
||||
import org.jclouds.vi.compute.config.ViComputeServiceContextModule;
|
||||
|
||||
import com.google.inject.Module;
|
||||
import com.vmware.vim25.mo.ServiceInstance;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Adrian Cole
|
||||
*/
|
||||
public class ViComputeServiceContextBuilder extends StandaloneComputeServiceContextBuilder<ServiceInstance> {
|
||||
|
||||
public ViComputeServiceContextBuilder(Properties props) {
|
||||
super(ServiceInstance.class, props);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void addContextModule(List<Module> modules) {
|
||||
modules.add(new ViComputeServiceContextModule());
|
||||
}
|
||||
|
||||
}
|
|
@ -1,43 +0,0 @@
|
|||
/**
|
||||
*
|
||||
* Copyright (C) 2010 Cloud Conscious, LLC. <info@cloudconscious.com>
|
||||
*
|
||||
* ====================================================================
|
||||
* Licensed 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 org.jclouds.vi.compute;
|
||||
|
||||
import org.jclouds.PropertiesBuilder;
|
||||
import org.jclouds.compute.ComputeService;
|
||||
import org.jclouds.rest.RestContextSpec;
|
||||
|
||||
import com.google.common.collect.ImmutableSet;
|
||||
import com.google.inject.Module;
|
||||
|
||||
/**
|
||||
* @author Adrian Cole
|
||||
*/
|
||||
public class ViComputeServiceContextSpec extends RestContextSpec<ComputeService, ComputeService> {
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
public ViComputeServiceContextSpec(String endpoint, String identity, String credential, Iterable<Module> modules) {
|
||||
super("vi", endpoint, "1", "", identity, credential, ComputeService.class, ComputeService.class,
|
||||
PropertiesBuilder.class, (Class) ViComputeServiceContextBuilder.class, modules);
|
||||
}
|
||||
|
||||
public ViComputeServiceContextSpec(String endpoint, String identity, String credential) {
|
||||
this(endpoint, identity, credential, ImmutableSet.<Module> of());
|
||||
}
|
||||
}
|
|
@ -1,52 +0,0 @@
|
|||
/**
|
||||
*
|
||||
* Copyright (C) 2010 Cloud Conscious, LLC. <info@cloudconscious.com>
|
||||
*
|
||||
* ====================================================================
|
||||
* Licensed 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 org.jclouds.vi.compute;
|
||||
|
||||
import static org.jclouds.vi.reference.ViConstants.PROPERTY_VI_XML_NAMESPACE;
|
||||
import static org.jclouds.vi.reference.ViConstants.PROPERTY_VI_IGNORE_CERTIFICATE;
|
||||
|
||||
import java.util.Properties;
|
||||
|
||||
import org.jclouds.PropertiesBuilder;
|
||||
|
||||
import com.vmware.vim25.mo.ServiceInstance;
|
||||
|
||||
/**
|
||||
* Builds properties used in vi Clients
|
||||
*
|
||||
* @author Andrea Turli
|
||||
*/
|
||||
public class ViPropertiesBuilder extends PropertiesBuilder {
|
||||
@Override
|
||||
protected Properties defaultProperties() {
|
||||
Properties properties = super.defaultProperties();
|
||||
properties.setProperty(PROPERTY_VI_XML_NAMESPACE, ServiceInstance.VIM25_NAMESPACE);
|
||||
properties.setProperty(PROPERTY_VI_IGNORE_CERTIFICATE, "true");
|
||||
return properties;
|
||||
}
|
||||
|
||||
public ViPropertiesBuilder(Properties properties) {
|
||||
super(properties);
|
||||
}
|
||||
|
||||
public ViPropertiesBuilder() {
|
||||
super();
|
||||
}
|
||||
}
|
|
@ -1,239 +0,0 @@
|
|||
/**
|
||||
*
|
||||
* Copyright (C) 2010 Cloud Conscious, LLC. <info@cloudconscious.com>
|
||||
*
|
||||
* ====================================================================
|
||||
* Licensed 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 org.jclouds.vi.compute.config;
|
||||
|
||||
import static com.google.common.base.Predicates.notNull;
|
||||
import static com.google.common.collect.Iterables.filter;
|
||||
import static com.google.common.collect.Iterables.transform;
|
||||
import static org.jclouds.vi.reference.ViConstants.PROPERTY_VI_XML_NAMESPACE;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.FileInputStream;
|
||||
import java.io.FileNotFoundException;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.net.MalformedURLException;
|
||||
import java.net.URI;
|
||||
import java.net.URISyntaxException;
|
||||
import java.rmi.RemoteException;
|
||||
|
||||
import javax.inject.Inject;
|
||||
import javax.inject.Named;
|
||||
import javax.inject.Singleton;
|
||||
import javax.ws.rs.core.HttpHeaders;
|
||||
|
||||
import org.apache.commons.io.FileUtils;
|
||||
import org.apache.commons.io.filefilter.WildcardFileFilter;
|
||||
import org.jclouds.Constants;
|
||||
import org.jclouds.compute.ComputeServiceAdapter;
|
||||
import org.jclouds.compute.config.ComputeServiceAdapterContextModule;
|
||||
import org.jclouds.compute.domain.Hardware;
|
||||
import org.jclouds.compute.domain.NodeMetadata;
|
||||
import org.jclouds.compute.domain.TemplateBuilder;
|
||||
import org.jclouds.domain.Location;
|
||||
import org.jclouds.http.HttpRequest;
|
||||
import org.jclouds.http.HttpResponse;
|
||||
import org.jclouds.http.functions.ParseSax;
|
||||
import org.jclouds.io.Payloads;
|
||||
import org.jclouds.location.Provider;
|
||||
import org.jclouds.location.suppliers.OnlyLocationOrFirstZone;
|
||||
import org.jclouds.rest.HttpClient;
|
||||
import org.jclouds.vi.Image;
|
||||
import org.jclouds.vi.compute.functions.DatacenterToLocation;
|
||||
import org.jclouds.vi.compute.functions.ViImageToImage;
|
||||
import org.jclouds.vi.compute.functions.VirtualMachineToHardware;
|
||||
import org.jclouds.vi.compute.functions.VirtualMachineToNodeMetadata;
|
||||
import org.jclouds.vi.compute.strategy.ViComputeServiceAdapter;
|
||||
import org.xml.sax.Attributes;
|
||||
import org.xml.sax.SAXException;
|
||||
|
||||
import com.google.common.base.Function;
|
||||
import com.google.common.base.Supplier;
|
||||
import com.google.common.base.Throwables;
|
||||
import com.google.common.collect.ImmutableMultimap;
|
||||
import com.google.common.collect.Iterables;
|
||||
import com.google.common.collect.ImmutableMultimap.Builder;
|
||||
import com.google.inject.Injector;
|
||||
import com.google.inject.Provides;
|
||||
import com.google.inject.TypeLiteral;
|
||||
import com.vmware.vim25.mo.Datacenter;
|
||||
import com.vmware.vim25.mo.ServiceInstance;
|
||||
import com.vmware.vim25.mo.VirtualMachine;
|
||||
import com.vmware.vim25.ws.WSClient;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Adrian Cole
|
||||
*/
|
||||
public class ViComputeServiceContextModule
|
||||
extends
|
||||
ComputeServiceAdapterContextModule<ServiceInstance, ServiceInstance, VirtualMachine, VirtualMachine, Image, Datacenter> {
|
||||
|
||||
public ViComputeServiceContextModule() {
|
||||
super(ServiceInstance.class, ServiceInstance.class);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void configure() {
|
||||
super.configure();
|
||||
bind(new TypeLiteral<ComputeServiceAdapter<VirtualMachine, VirtualMachine, Image, Datacenter>>() {
|
||||
}).to(ViComputeServiceAdapter.class);
|
||||
bind(new TypeLiteral<Supplier<Location>>() {
|
||||
}).to(OnlyLocationOrFirstZone.class);
|
||||
bind(new TypeLiteral<Function<VirtualMachine, NodeMetadata>>() {
|
||||
}).to(VirtualMachineToNodeMetadata.class);
|
||||
bind(new TypeLiteral<Function<Image, org.jclouds.compute.domain.Image>>() {
|
||||
}).to(ViImageToImage.class);
|
||||
bind(new TypeLiteral<Function<VirtualMachine, Hardware>>() {
|
||||
}).to(VirtualMachineToHardware.class);
|
||||
bind(new TypeLiteral<Function<Datacenter, Location>>() {
|
||||
}).to(DatacenterToLocation.class);
|
||||
}
|
||||
|
||||
@Provides
|
||||
@Singleton
|
||||
protected ServiceInstance createConnection(JcloudsWSClient client,
|
||||
@Named(Constants.PROPERTY_IDENTITY) String identity,
|
||||
@Named(Constants.PROPERTY_CREDENTIAL) String credential,
|
||||
@Named(Constants.PROPERTY_TRUST_ALL_CERTS) boolean ignoreCertificate) throws RemoteException,
|
||||
MalformedURLException {
|
||||
// uncomment this to use jclouds http commands
|
||||
// return new ServiceInstance(client, identity, credential, ignoreCertificate);
|
||||
return new ServiceInstance(new WSClient(client.getBaseUrl().toString(), ignoreCertificate), identity, credential,
|
||||
ignoreCertificate + "");
|
||||
}
|
||||
|
||||
@Singleton
|
||||
public static class JcloudsWSClient extends WSClient {
|
||||
|
||||
private final HttpClient client;
|
||||
|
||||
@Inject
|
||||
public JcloudsWSClient(HttpClient client, @Provider URI baseUrl,
|
||||
@Named(PROPERTY_VI_XML_NAMESPACE) String vimNameSpace,
|
||||
@Named(Constants.PROPERTY_TRUST_ALL_CERTS) boolean ignoreCert) throws MalformedURLException {
|
||||
super(baseUrl.toASCIIString(), ignoreCert);
|
||||
this.setVimNameSpace(vimNameSpace);
|
||||
this.client = client;
|
||||
}
|
||||
|
||||
@Override
|
||||
public InputStream post(String soapMsg) throws IOException {
|
||||
|
||||
Builder<String, String> headers = ImmutableMultimap.<String, String> builder();
|
||||
headers.put("SOAPAction", "urn:vim25/4.0");
|
||||
if (getCookie() != null)
|
||||
headers.put(HttpHeaders.COOKIE, getCookie());
|
||||
|
||||
HttpRequest request;
|
||||
try {
|
||||
request = HttpRequest.builder().endpoint(getBaseUrl().toURI()).method("POST").headers(headers.build())
|
||||
.payload(Payloads.newStringPayload(soapMsg)).build();
|
||||
} catch (URISyntaxException e) {
|
||||
Throwables.propagate(e);
|
||||
return null;// unreachable as the above line will throw the exception.
|
||||
}
|
||||
HttpResponse response = client.invoke(request);
|
||||
|
||||
if (getCookie() != null && response.getFirstHeaderOrNull(HttpHeaders.SET_COOKIE) != null) {
|
||||
setCookie(response.getFirstHeaderOrNull(HttpHeaders.SET_COOKIE));
|
||||
}
|
||||
|
||||
return response.getPayload().getInput();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
protected TemplateBuilder provideTemplate(Injector injector, TemplateBuilder template) {
|
||||
// String domainDir = injector.getInstance(Key.get(String.class,
|
||||
// Names.named(PROPERTY_LIBVIRT_DOMAIN_DIR)));
|
||||
// String domainDir = "";
|
||||
// String hardwareId = searchForHardwareIdInDomainDir(domainDir);
|
||||
// String image = searchForImageIdInDomainDir(domainDir);
|
||||
return template.hardwareId("vm-1221").imageId("winNetEnterprise64Guest");
|
||||
}
|
||||
|
||||
private String searchForImageIdInDomainDir(String domainDir) {
|
||||
// TODO
|
||||
return "1";
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
private String searchForHardwareIdInDomainDir(String domainDir, final ParseSax.Factory factory,
|
||||
final javax.inject.Provider<UUIDHandler> provider) {
|
||||
|
||||
// TODO: remove commons-io dependency
|
||||
return Iterables.<String> getLast(filter(transform(FileUtils.listFiles(new File(domainDir),
|
||||
new WildcardFileFilter("*.xml"), null), new Function<File, String>() {
|
||||
|
||||
@Override
|
||||
public String apply(File input) {
|
||||
try {
|
||||
return factory.create(provider.get()).parse(new FileInputStream(input));
|
||||
} catch (FileNotFoundException e) {
|
||||
// log error.
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
}), notNull()));
|
||||
}
|
||||
|
||||
public static class UUIDHandler extends ParseSax.HandlerWithResult<String> {
|
||||
private StringBuilder currentText = new StringBuilder();
|
||||
|
||||
private boolean inDomain;
|
||||
private String uuid;
|
||||
|
||||
public String getResult() {
|
||||
return uuid;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void startElement(String uri, String localName, String qName, Attributes attrs) throws SAXException {
|
||||
if (qName.equals("domain")) {
|
||||
inDomain = true;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void endElement(String uri, String localName, String qName) {
|
||||
if (qName.equalsIgnoreCase("uuid") && inDomain) {
|
||||
this.uuid = currentText.toString();
|
||||
} else if (qName.equalsIgnoreCase("domain")) {
|
||||
inDomain = false;
|
||||
}
|
||||
currentText = new StringBuilder();
|
||||
}
|
||||
|
||||
public void characters(char ch[], int start, int length) {
|
||||
currentText.append(ch, start, length);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Map<String, URI> regions = newLinkedHashMap(); for (String region :
|
||||
* Splitter.on(',').split(regionString)) { regions.put( region,
|
||||
* URI.create(injector.getInstance(Key.get(String.class, Names.named(Constants.PROPERTY_ENDPOINT
|
||||
* + "." + region))))); } return regions;
|
||||
*/
|
||||
|
||||
}
|
|
@ -1,55 +0,0 @@
|
|||
/**
|
||||
*
|
||||
* Copyright (C) 2010 Cloud Conscious, LLC. <info@cloudconscious.com>
|
||||
*
|
||||
* ====================================================================
|
||||
* Licensed 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 org.jclouds.vi.compute.functions;
|
||||
|
||||
import static com.google.common.base.Preconditions.checkNotNull;
|
||||
|
||||
import javax.inject.Inject;
|
||||
import javax.inject.Provider;
|
||||
import javax.inject.Singleton;
|
||||
|
||||
import org.jclouds.domain.Location;
|
||||
import org.jclouds.domain.LocationBuilder;
|
||||
import org.jclouds.domain.LocationScope;
|
||||
|
||||
import com.google.common.base.Function;
|
||||
import com.google.common.base.Supplier;
|
||||
import com.vmware.vim25.mo.Datacenter;
|
||||
|
||||
/**
|
||||
* @author Adrian Cole
|
||||
*/
|
||||
@Singleton
|
||||
public class DatacenterToLocation implements Function<Datacenter, Location> {
|
||||
private final Provider<Supplier<Location>> provider;
|
||||
|
||||
// allow us to lazy discover the provider of a resource
|
||||
@Inject
|
||||
public DatacenterToLocation(Provider<Supplier<Location>> provider) {
|
||||
this.provider = checkNotNull(provider, "provider");
|
||||
}
|
||||
|
||||
@Override
|
||||
public Location apply(Datacenter from) {
|
||||
return new LocationBuilder().scope(LocationScope.ZONE).id(from.getName()).description(from.getName()).parent(
|
||||
provider.get().get()).build();
|
||||
}
|
||||
|
||||
}
|
|
@ -1,63 +0,0 @@
|
|||
/**
|
||||
*
|
||||
* Copyright (C) 2010 Cloud Conscious, LLC. <info@cloudconscious.com>
|
||||
*
|
||||
* ====================================================================
|
||||
* Licensed 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 org.jclouds.vi.compute.functions;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import javax.inject.Named;
|
||||
import javax.inject.Singleton;
|
||||
|
||||
import org.jclouds.compute.domain.Image;
|
||||
import org.jclouds.compute.domain.ImageBuilder;
|
||||
import org.jclouds.compute.domain.OperatingSystemBuilder;
|
||||
import org.jclouds.compute.domain.OsFamily;
|
||||
import org.jclouds.compute.reference.ComputeServiceConstants;
|
||||
import org.jclouds.logging.Logger;
|
||||
|
||||
import com.google.common.base.Function;
|
||||
|
||||
/**
|
||||
* @author Adrian Cole
|
||||
*/
|
||||
@Singleton
|
||||
public class ViImageToImage implements Function<org.jclouds.vi.Image, Image> {
|
||||
@Resource
|
||||
@Named(ComputeServiceConstants.COMPUTE_LOGGER)
|
||||
protected Logger logger = Logger.NULL;
|
||||
|
||||
@Override
|
||||
public Image apply(org.jclouds.vi.Image from) {
|
||||
|
||||
ImageBuilder builder = new ImageBuilder();
|
||||
builder.ids(from.id + "");
|
||||
builder.name(from.name);
|
||||
builder.description(from.name);
|
||||
|
||||
OsFamily family = null;
|
||||
try {
|
||||
// TODO
|
||||
family = OsFamily.fromValue(from.name);
|
||||
builder.operatingSystem(new OperatingSystemBuilder().name(from.name).family(family).description(from.name).build());
|
||||
} catch (IllegalArgumentException e) {
|
||||
logger.debug("<< didn't match os(%s)", from);
|
||||
}
|
||||
return builder.build();
|
||||
}
|
||||
|
||||
}
|
|
@ -1,85 +0,0 @@
|
|||
/**
|
||||
*
|
||||
* Copyright (C) 2010 Cloud Conscious, LLC. <info@cloudconscious.com>
|
||||
*
|
||||
* ====================================================================
|
||||
* Licensed 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 org.jclouds.vi.compute.functions;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import javax.inject.Singleton;
|
||||
|
||||
import org.jclouds.compute.domain.Hardware;
|
||||
import org.jclouds.compute.domain.HardwareBuilder;
|
||||
import org.jclouds.compute.domain.Processor;
|
||||
import org.jclouds.compute.domain.Volume;
|
||||
import org.jclouds.compute.domain.internal.VolumeImpl;
|
||||
|
||||
import com.google.common.base.Function;
|
||||
import com.google.common.base.Throwables;
|
||||
import com.google.common.collect.Lists;
|
||||
import com.vmware.vim25.VirtualDevice;
|
||||
import com.vmware.vim25.VirtualDeviceBackingInfo;
|
||||
import com.vmware.vim25.VirtualDisk;
|
||||
import com.vmware.vim25.VirtualDiskFlatVer2BackingInfo;
|
||||
import com.vmware.vim25.mo.VirtualMachine;
|
||||
|
||||
/**
|
||||
* @author Adrian Cole
|
||||
*/
|
||||
@Singleton
|
||||
public class VirtualMachineToHardware implements Function<VirtualMachine, Hardware> {
|
||||
|
||||
@Override
|
||||
public Hardware apply(VirtualMachine from) {
|
||||
HardwareBuilder builder = new HardwareBuilder();
|
||||
|
||||
builder.id(from.getMOR().get_value() + "");
|
||||
builder.providerId(from.getMOR().get_value() + "");
|
||||
builder.name(from.getName());
|
||||
List<Processor> processors = Lists.newArrayList();
|
||||
for (int i = 0; i < from.getConfig().getHardware().getNumCPU(); i++) {
|
||||
processors.add(new Processor(i + 1, 1));
|
||||
}
|
||||
builder.processors(processors);
|
||||
|
||||
builder.ram((int) from.getConfig().getHardware().getMemoryMB());
|
||||
List<Volume> volumes = Lists.newArrayList();
|
||||
// look for volumes
|
||||
VirtualDevice[] devices = from.getConfig().getHardware().getDevice();
|
||||
for (VirtualDevice virtualDevice : devices) {
|
||||
if(virtualDevice.getDeviceInfo().getLabel().contains("Hard disk")) {
|
||||
if(virtualDevice instanceof VirtualDisk) {
|
||||
VirtualDisk disk = (VirtualDisk) virtualDevice;
|
||||
VirtualDeviceBackingInfo backingInfo = disk.getBacking();
|
||||
if(backingInfo instanceof VirtualDiskFlatVer2BackingInfo) {
|
||||
VirtualDiskFlatVer2BackingInfo diskFlatVer2BackingInfo = (VirtualDiskFlatVer2BackingInfo) backingInfo;
|
||||
volumes.add(new VolumeImpl(diskFlatVer2BackingInfo.getUuid(), Volume.Type.LOCAL, new Float(disk.getCapacityInKB() + ""), diskFlatVer2BackingInfo.getFileName(), true, false));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
builder.volumes((List<Volume>) volumes);
|
||||
return builder.build();
|
||||
}
|
||||
|
||||
protected <T> T propagate(Exception e) {
|
||||
Throwables.propagate(e);
|
||||
assert false;
|
||||
return null;
|
||||
}
|
||||
}
|
|
@ -1,138 +0,0 @@
|
|||
/**
|
||||
*
|
||||
* Copyright (C) 2010 Cloud Conscious, LLC. <info@cloudconscious.com>
|
||||
*
|
||||
* ====================================================================
|
||||
* Licensed 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 org.jclouds.vi.compute.functions;
|
||||
|
||||
import static com.google.common.base.Preconditions.checkNotNull;
|
||||
import static org.jclouds.compute.util.ComputeServiceUtils.parseGroupFromName;
|
||||
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
|
||||
import javax.inject.Inject;
|
||||
import javax.inject.Singleton;
|
||||
|
||||
import org.jclouds.collect.FindResourceInSet;
|
||||
import org.jclouds.collect.Memoized;
|
||||
import org.jclouds.compute.domain.Hardware;
|
||||
import org.jclouds.compute.domain.Image;
|
||||
import org.jclouds.compute.domain.NodeMetadata;
|
||||
import org.jclouds.compute.domain.NodeMetadataBuilder;
|
||||
import org.jclouds.compute.domain.NodeState;
|
||||
import org.jclouds.compute.domain.OperatingSystemBuilder;
|
||||
import org.jclouds.domain.Credentials;
|
||||
import org.jclouds.domain.Location;
|
||||
|
||||
import com.google.common.base.Function;
|
||||
import com.google.common.base.Supplier;
|
||||
import com.google.common.collect.ImmutableMap;
|
||||
import com.vmware.vim25.VirtualMachinePowerState;
|
||||
import com.vmware.vim25.mo.VirtualMachine;
|
||||
|
||||
/**
|
||||
* @author Adrian Cole
|
||||
*/
|
||||
@Singleton
|
||||
public class VirtualMachineToNodeMetadata implements Function<VirtualMachine, NodeMetadata> {
|
||||
|
||||
public static final Map<VirtualMachinePowerState, NodeState> domainStateToNodeState =
|
||||
ImmutableMap.<VirtualMachinePowerState, NodeState> builder()
|
||||
.put(VirtualMachinePowerState.poweredOn, NodeState.RUNNING)//
|
||||
//.put(VirtualMachinePowerState.suspended, NodeState.PENDING)//
|
||||
.put(VirtualMachinePowerState.suspended, NodeState.SUSPENDED)//
|
||||
.put(VirtualMachinePowerState.poweredOff, NodeState.TERMINATED)//
|
||||
.build();
|
||||
|
||||
private final Function<VirtualMachine, Hardware> findHardwareForVirtualMachine;
|
||||
private final FindLocationForVirtualMachine findLocationForVirtualMachine;
|
||||
private final FindImageForVirtualMachine findImageForVirtualMachine;
|
||||
private final Map<String, Credentials> credentialStore;
|
||||
|
||||
@Inject
|
||||
VirtualMachineToNodeMetadata(Map<String, Credentials> credentialStore, Function<VirtualMachine, Hardware> findHardwareForVirtualMachine,
|
||||
FindLocationForVirtualMachine findLocationForVirtualMachine, FindImageForVirtualMachine findImageForVirtualMachine) {
|
||||
this.credentialStore = checkNotNull(credentialStore, "credentialStore");
|
||||
this.findHardwareForVirtualMachine = checkNotNull(findHardwareForVirtualMachine, "findHardwareForVirtualMachine");
|
||||
this.findLocationForVirtualMachine = checkNotNull(findLocationForVirtualMachine, "findLocationForVirtualMachine");
|
||||
this.findImageForVirtualMachine = checkNotNull(findImageForVirtualMachine, "findImageForVirtualMachine");
|
||||
}
|
||||
|
||||
@Override
|
||||
public NodeMetadata apply(VirtualMachine from) {
|
||||
|
||||
// convert the result object to a jclouds NodeMetadata
|
||||
NodeMetadataBuilder builder = new NodeMetadataBuilder();
|
||||
try {
|
||||
builder.id(from.getConfig().getInstanceUuid());
|
||||
builder.providerId(from.getConfig().getLocationId() + "");
|
||||
builder.name(from.getName());
|
||||
builder.location(findLocationForVirtualMachine.apply(from));
|
||||
builder.group(parseGroupFromName(from.getName()));
|
||||
|
||||
builder.operatingSystem(new OperatingSystemBuilder()
|
||||
.name(from.getConfig().getGuestFullName())
|
||||
.description(from.getConfig().getGuestFullName())
|
||||
.is64Bit(from.getConfig().getGuestId().contains("64"))
|
||||
.build());
|
||||
builder.hardware(findHardwareForVirtualMachine.apply(from));
|
||||
|
||||
builder.state(domainStateToNodeState.get(from.getRuntime().getPowerState()));
|
||||
// builder.publicAddresses(ImmutableSet.<String> of(from.publicAddress));
|
||||
// builder.privateAddresses(ImmutableSet.<String> of(from.privateAddress));
|
||||
builder.credentials(credentialStore.get("node#" + from.getName()));
|
||||
|
||||
} catch (Exception e) {
|
||||
// TODO Auto-generated catch block
|
||||
e.printStackTrace();
|
||||
}
|
||||
return builder.build();
|
||||
}
|
||||
|
||||
@Singleton
|
||||
public static class FindImageForVirtualMachine extends FindResourceInSet<VirtualMachine, Image> {
|
||||
|
||||
@Inject
|
||||
public FindImageForVirtualMachine(@Memoized Supplier<Set<? extends Image>> hardware) {
|
||||
super(hardware);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean matches(VirtualMachine from, Image input) {
|
||||
// TODO
|
||||
// return input.getProviderId().equals(from.imageId + "");
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
@Singleton
|
||||
public static class FindLocationForVirtualMachine extends FindResourceInSet<VirtualMachine, Location> {
|
||||
|
||||
@Inject
|
||||
public FindLocationForVirtualMachine(@Memoized Supplier<Set<? extends Location>> hardware) {
|
||||
super(hardware);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean matches(VirtualMachine from, Location input) {
|
||||
// TODO
|
||||
// return input.getId().equals(from.datacenter + "");
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,443 +0,0 @@
|
|||
/**
|
||||
*
|
||||
* Copyright (C) 2010 Cloud Conscious, LLC. <info@cloudconscious.com>
|
||||
*
|
||||
* ====================================================================
|
||||
* Licensed 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 org.jclouds.vi.compute.strategy;
|
||||
|
||||
import static com.google.common.base.Preconditions.checkNotNull;
|
||||
|
||||
import java.rmi.RemoteException;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import javax.inject.Inject;
|
||||
import javax.inject.Singleton;
|
||||
|
||||
import org.jclouds.compute.ComputeService;
|
||||
import org.jclouds.compute.ComputeServiceAdapter;
|
||||
import org.jclouds.compute.domain.Template;
|
||||
import org.jclouds.domain.Credentials;
|
||||
import org.jclouds.vi.Image;
|
||||
|
||||
import com.google.common.base.Throwables;
|
||||
import com.google.common.collect.Lists;
|
||||
import com.vmware.vim25.CustomizationAdapterMapping;
|
||||
import com.vmware.vim25.CustomizationDhcpIpGenerator;
|
||||
import com.vmware.vim25.CustomizationFixedName;
|
||||
import com.vmware.vim25.CustomizationGlobalIPSettings;
|
||||
import com.vmware.vim25.CustomizationGuiUnattended;
|
||||
import com.vmware.vim25.CustomizationIPSettings;
|
||||
import com.vmware.vim25.CustomizationIdentification;
|
||||
import com.vmware.vim25.CustomizationIdentitySettings;
|
||||
import com.vmware.vim25.CustomizationLicenseDataMode;
|
||||
import com.vmware.vim25.CustomizationLicenseFilePrintData;
|
||||
import com.vmware.vim25.CustomizationPassword;
|
||||
import com.vmware.vim25.CustomizationSpec;
|
||||
import com.vmware.vim25.CustomizationSysprep;
|
||||
import com.vmware.vim25.CustomizationUserData;
|
||||
import com.vmware.vim25.CustomizationWinOptions;
|
||||
import com.vmware.vim25.InvalidProperty;
|
||||
import com.vmware.vim25.RuntimeFault;
|
||||
import com.vmware.vim25.VirtualMachineCloneSpec;
|
||||
import com.vmware.vim25.VirtualMachineRelocateSpec;
|
||||
import com.vmware.vim25.mo.Datacenter;
|
||||
import com.vmware.vim25.mo.Datastore;
|
||||
import com.vmware.vim25.mo.Folder;
|
||||
import com.vmware.vim25.mo.HostDatastoreBrowser;
|
||||
import com.vmware.vim25.mo.HostSystem;
|
||||
import com.vmware.vim25.mo.InventoryNavigator;
|
||||
import com.vmware.vim25.mo.ManagedEntity;
|
||||
import com.vmware.vim25.mo.ResourcePool;
|
||||
import com.vmware.vim25.mo.ServiceInstance;
|
||||
import com.vmware.vim25.mo.Task;
|
||||
import com.vmware.vim25.mo.VirtualMachine;
|
||||
|
||||
/**
|
||||
* defines the connection between the {@link VI} implementation and the jclouds
|
||||
* {@link ComputeService}
|
||||
*
|
||||
*/
|
||||
@Singleton
|
||||
public class ViComputeServiceAdapter implements ComputeServiceAdapter<VirtualMachine, VirtualMachine, Image, Datacenter> {
|
||||
|
||||
private final ServiceInstance client;
|
||||
private String resourcePoolName = "";
|
||||
private String vmwareHostName = "";
|
||||
private String datastoreName = "";
|
||||
private String vmClonedName = "MyWinClone";
|
||||
|
||||
@Inject
|
||||
public ViComputeServiceAdapter(ServiceInstance client) {
|
||||
this.client = checkNotNull(client, "client");
|
||||
}
|
||||
|
||||
@Override
|
||||
public VirtualMachine createNodeWithGroupEncodedIntoNameThenStoreCredentials(String tag,
|
||||
String name, Template template,
|
||||
Map<String, Credentials> credentialStore) {
|
||||
try {
|
||||
Folder rootFolder = client.getRootFolder();
|
||||
|
||||
VirtualMachine from = (VirtualMachine) new InventoryNavigator(
|
||||
rootFolder).searchManagedEntity("VirtualMachine", tag);
|
||||
|
||||
if (from == null) {
|
||||
client.getServerConnection().logout();
|
||||
return null;
|
||||
}
|
||||
|
||||
VirtualMachineCloneSpec cloneSpec = new VirtualMachineCloneSpec();
|
||||
VirtualMachineRelocateSpec virtualMachineRelocateSpec = new VirtualMachineRelocateSpec();
|
||||
if (!vmwareHostName.equals("") && !datastoreName.equals("") && !resourcePoolName.equals("")) {
|
||||
|
||||
ResourcePool rp = (ResourcePool) new InventoryNavigator(rootFolder)
|
||||
.searchManagedEntity("ResourcePool", resourcePoolName);
|
||||
|
||||
if(rp == null)
|
||||
throw new Exception("The resourcePool specified '" + resourcePoolName + "' doesn't exist");
|
||||
virtualMachineRelocateSpec.setPool(rp.getMOR());
|
||||
|
||||
|
||||
Datastore ds = (Datastore) new InventoryNavigator(rootFolder)
|
||||
.searchManagedEntity("Datastore", datastoreName);
|
||||
|
||||
HostSystem host = null;
|
||||
host = (HostSystem) new InventoryNavigator(rootFolder)
|
||||
.searchManagedEntity("HostSystem", vmwareHostName);
|
||||
|
||||
HostDatastoreBrowser hdb = host.getDatastoreBrowser();
|
||||
|
||||
if(ds == null)
|
||||
throw new Exception("Cannot relocate this cloned machine to the specified datastore '" + datastoreName + "'");
|
||||
Datastore dsFound = null;
|
||||
Datastore[] dsArray = hdb.getDatastores();
|
||||
for (Datastore d : dsArray) {
|
||||
if(d.getName().equalsIgnoreCase(ds.getName()))
|
||||
dsFound = d;
|
||||
}
|
||||
if(dsFound == null)
|
||||
throw new Exception("Cannot relocate this cloned machine to the specified datastore '" + datastoreName + "'");
|
||||
virtualMachineRelocateSpec.setDatastore(dsFound.getMOR());
|
||||
}
|
||||
|
||||
CustomizationSpec custSpec = new CustomizationSpec();
|
||||
|
||||
CustomizationAdapterMapping cam = new CustomizationAdapterMapping();
|
||||
CustomizationIPSettings cip = new CustomizationIPSettings();
|
||||
cip.setIp(new CustomizationDhcpIpGenerator());
|
||||
cam.setAdapter(cip);
|
||||
|
||||
|
||||
// IP customization
|
||||
// CustomizationAdapterMapping[] custAdapMapList = new CustomizationAdapterMapping[1];
|
||||
// CustomizationAdapterMapping custAdapMap = new CustomizationAdapterMapping();
|
||||
// CustomizationIPSettings custIPSettings = new CustomizationIPSettings();
|
||||
// CustomizationFixedIp custFixedIp = new CustomizationFixedIp();
|
||||
// custFixedIp.setIpAddress(ipAddress);
|
||||
// custIPSettings.setIp(custFixedIp);
|
||||
// custAdapMap.setAdapter(custIPSettings);
|
||||
// custAdapMapList[0] = custAdapMap;
|
||||
// custSpec.setNicSettingMap(custAdapMapList);
|
||||
|
||||
CustomizationGlobalIPSettings custGlobalIPSetting = new CustomizationGlobalIPSettings();
|
||||
|
||||
|
||||
CustomizationIdentitySettings custIdentitySet = new CustomizationIdentitySettings();
|
||||
|
||||
// sysprep customization
|
||||
CustomizationSysprep custSysprep = new CustomizationSysprep();
|
||||
|
||||
CustomizationGuiUnattended guiUnattended = new CustomizationGuiUnattended();
|
||||
guiUnattended.setAutoLogon(false);
|
||||
guiUnattended.setAutoLogonCount(0);
|
||||
guiUnattended.setTimeZone(190);
|
||||
|
||||
|
||||
// user data
|
||||
CustomizationPassword custPasswd = new CustomizationPassword();
|
||||
custPasswd.setPlainText(true);
|
||||
custPasswd.setValue("password");
|
||||
|
||||
CustomizationIdentification custIdentification = new CustomizationIdentification();
|
||||
custIdentification.setDomainAdmin("Administrator");
|
||||
custIdentification.setDomainAdminPassword(custPasswd);
|
||||
custIdentification.setJoinWorkgroup("WORKGROUP");
|
||||
|
||||
CustomizationUserData custUserData = new CustomizationUserData();
|
||||
CustomizationFixedName custFixedName = new CustomizationFixedName();
|
||||
custFixedName.setName("mycomputer");
|
||||
custUserData.setComputerName(custFixedName);
|
||||
custUserData.setFullName("sjain");
|
||||
custUserData.setOrgName("vmware");
|
||||
custUserData.setProductId("PDRXT-M9X8G-898BR-4K427-J2FFY");
|
||||
|
||||
///////
|
||||
CustomizationWinOptions customizationWinOptions = new CustomizationWinOptions();
|
||||
customizationWinOptions.setChangeSID(true);
|
||||
customizationWinOptions.setDeleteAccounts(false);
|
||||
|
||||
CustomizationLicenseFilePrintData custLPD = new CustomizationLicenseFilePrintData();
|
||||
custLPD.setAutoMode(CustomizationLicenseDataMode.perServer);
|
||||
|
||||
custSysprep.setLicenseFilePrintData(custLPD);
|
||||
|
||||
custSysprep.setUserData(custUserData);
|
||||
custSysprep.setGuiUnattended(guiUnattended);
|
||||
custSysprep.setIdentification(custIdentification);
|
||||
|
||||
custSpec.setIdentity(custSysprep);
|
||||
custSpec.setNicSettingMap(new CustomizationAdapterMapping[] {cam});
|
||||
custSpec.setGlobalIPSettings(custGlobalIPSetting);
|
||||
custSpec.setOptions(customizationWinOptions);
|
||||
|
||||
|
||||
|
||||
cloneSpec.setCustomization(custSpec);
|
||||
|
||||
//location properties
|
||||
cloneSpec.setLocation(virtualMachineRelocateSpec);
|
||||
cloneSpec.setPowerOn(false);
|
||||
cloneSpec.setTemplate(false);
|
||||
|
||||
Task task = from.cloneVM_Task((Folder) from.getParent(), vmClonedName,
|
||||
cloneSpec);
|
||||
|
||||
String result = task.waitForTask();
|
||||
return (VirtualMachine) new InventoryNavigator(
|
||||
rootFolder).searchManagedEntity("VirtualMachine", vmClonedName);
|
||||
} catch (RemoteException e) {
|
||||
return propogate(e);
|
||||
} catch (Exception e) {
|
||||
return propogate(e);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public Iterable<VirtualMachine> listHardwareProfiles() {
|
||||
// TODO
|
||||
List<VirtualMachine> hardwareProfiles = Lists.newArrayList();
|
||||
try {
|
||||
|
||||
ManagedEntity[] entities = new InventoryNavigator(
|
||||
client.getRootFolder()).searchManagedEntities("VirtualMachine");
|
||||
for (ManagedEntity entity : entities) {
|
||||
hardwareProfiles.add((VirtualMachine) entity);
|
||||
}
|
||||
return hardwareProfiles;
|
||||
} catch (Exception e) {
|
||||
return propogate(e);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public Iterable<Image> listImages() {
|
||||
List<Image> images = Lists.newArrayList();
|
||||
try {
|
||||
|
||||
ManagedEntity[] entities = new InventoryNavigator(
|
||||
client.getRootFolder()).searchManagedEntities("VirtualMachine");
|
||||
for (ManagedEntity entity : entities) {
|
||||
VirtualMachine vm = (VirtualMachine) entity;
|
||||
images.add(new Image(vm.getConfig().getGuestId(), vm.getConfig().getGuestFullName()));
|
||||
}
|
||||
return images;
|
||||
} catch (Exception e) {
|
||||
return propogate(e);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public Iterable<VirtualMachine> listNodes() {
|
||||
try {
|
||||
ManagedEntity[] vmEntities = new InventoryNavigator(client.getRootFolder()).searchManagedEntities("VirtualMachine");
|
||||
List<VirtualMachine> vms = Lists.newArrayList();
|
||||
for (ManagedEntity entity : vmEntities) {
|
||||
VirtualMachine vm = (VirtualMachine) entity;
|
||||
vms.add(vm);
|
||||
}
|
||||
return vms;
|
||||
} catch (InvalidProperty e) {
|
||||
return propogate(e);
|
||||
} catch (RuntimeFault e) {
|
||||
return propogate(e);
|
||||
} catch (RemoteException e) {
|
||||
return propogate(e);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public Iterable<Datacenter> listLocations() {
|
||||
ManagedEntity[] datacenterEntities;
|
||||
try {
|
||||
datacenterEntities = new InventoryNavigator(client.getRootFolder()).searchManagedEntities("Datacenter");
|
||||
List<Datacenter> datacenters = Lists.newArrayList();
|
||||
for (int i = 0; i< datacenterEntities.length; i++) {
|
||||
datacenters.add((Datacenter) datacenterEntities[i]);
|
||||
}
|
||||
return datacenters;
|
||||
} catch (InvalidProperty e) {
|
||||
return propogate(e);
|
||||
} catch (RuntimeFault e) {
|
||||
return propogate(e);
|
||||
} catch (RemoteException e) {
|
||||
return propogate(e);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public VirtualMachine getNode(String vmName) {
|
||||
|
||||
Folder rootFolder = client.getRootFolder();
|
||||
|
||||
try {
|
||||
return (VirtualMachine) new InventoryNavigator(
|
||||
rootFolder).searchManagedEntity("VirtualMachine", vmName);
|
||||
} catch (InvalidProperty e) {
|
||||
return propogate(e);
|
||||
} catch (RuntimeFault e) {
|
||||
return propogate(e);
|
||||
} catch (RemoteException e) {
|
||||
return propogate(e);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void destroyNode(String id) {
|
||||
/*
|
||||
try {
|
||||
client.domainLookupByUUIDString(id).destroy();
|
||||
|
||||
XMLBuilder builder = XMLBuilder.parse(new InputSource(new StringReader(
|
||||
client.domainLookupByUUIDString(id).getXMLDesc(0)
|
||||
)));
|
||||
String diskFileName = builder.xpathFind("//devices/disk[@device='disk']/source").getElement().getAttribute("file");
|
||||
StorageVol storageVol = client.storageVolLookupByPath(diskFileName);
|
||||
storageVol.delete(0);
|
||||
client.domainLookupByUUIDString(id).undefine();
|
||||
|
||||
} catch (LibvirtException e) {
|
||||
propogate(e);
|
||||
} catch (Exception e) {
|
||||
propogate(e);
|
||||
}
|
||||
*/
|
||||
}
|
||||
|
||||
@Override
|
||||
public void rebootNode(String id) {
|
||||
/*
|
||||
try {
|
||||
client.domainLookupByUUIDString(id).reboot(0);
|
||||
} catch (LibvirtException e) {
|
||||
propogate(e);
|
||||
}
|
||||
*/
|
||||
}
|
||||
|
||||
@Override
|
||||
public void resumeNode(String id) {
|
||||
/*
|
||||
try {
|
||||
client.domainLookupByUUIDString(id).resume();
|
||||
} catch (LibvirtException e) {
|
||||
propogate(e);
|
||||
}
|
||||
*/
|
||||
}
|
||||
|
||||
@Override
|
||||
public void suspendNode(String id) {
|
||||
/*
|
||||
try {
|
||||
client.domainLookupByUUIDString(id).suspend();
|
||||
} catch (LibvirtException e) {
|
||||
propogate(e);
|
||||
}
|
||||
*/
|
||||
}
|
||||
|
||||
protected <T> T propogate(Exception e) {
|
||||
Throwables.propagate(e);
|
||||
assert false;
|
||||
return null;
|
||||
}
|
||||
|
||||
/*
|
||||
private static StorageVol cloneVolume(StoragePool storagePool, StorageVol from) throws LibvirtException,
|
||||
XPathExpressionException, ParserConfigurationException, SAXException, IOException, TransformerException {
|
||||
return storagePool.storageVolCreateXMLFrom(generateClonedVolumeXML(from.getXMLDesc(0)), from, 0);
|
||||
}
|
||||
|
||||
private static String generateClonedVolumeXML(String fromXML) throws ParserConfigurationException, SAXException,
|
||||
IOException, XPathExpressionException, TransformerException {
|
||||
|
||||
Properties outputProperties = generateOutputXMLProperties();
|
||||
XMLBuilder builder = XMLBuilder.parse(new InputSource(new StringReader(fromXML)));
|
||||
String nodeNamingConvention = "%s-%s";
|
||||
String tag = "-clone";
|
||||
String suffix = String.format(nodeNamingConvention, tag, Integer.toHexString(new SecureRandom().nextInt(4095)));
|
||||
builder.xpathFind("//volume/name").t(suffix);
|
||||
builder.xpathFind("//volume/key").t(suffix);
|
||||
builder.xpathFind("//volume/target/path").t(suffix);
|
||||
|
||||
return builder.asString(outputProperties);
|
||||
}
|
||||
|
||||
private static String generateClonedDomainXML(String fromXML, StorageVol clonedVol) throws ParserConfigurationException, SAXException,
|
||||
IOException, XPathExpressionException, TransformerException, LibvirtException {
|
||||
|
||||
Properties outputProperties = generateOutputXMLProperties();
|
||||
|
||||
XMLBuilder builder = XMLBuilder.parse(new InputSource(new StringReader(fromXML)));
|
||||
|
||||
String nodeNamingConvention = "%s-%s";
|
||||
String tag = "-clone";
|
||||
String suffix = String.format(nodeNamingConvention, tag, Integer.toHexString(new SecureRandom().nextInt(4095)));
|
||||
builder.xpathFind("//domain/name").t(suffix);
|
||||
// change uuid domain
|
||||
Element oldChild = builder.xpathFind("//domain/uuid").getElement();
|
||||
Node newNode = oldChild.cloneNode(true);
|
||||
newNode.getFirstChild().setNodeValue(UUID.randomUUID().toString());
|
||||
builder.getDocument().getDocumentElement().replaceChild(newNode, oldChild);
|
||||
|
||||
//String fromVolPath = builder.xpathFind("//domain/devices/disk/source").getElement().getAttribute("file");
|
||||
builder.xpathFind("//domain/devices/disk/source").a("file", clonedVol.getPath());
|
||||
// generate valid MAC address
|
||||
String fromMACaddress = builder.xpathFind("//domain/devices/interface/mac").getElement().getAttribute("address");
|
||||
String lastMACoctet = Integer.toHexString(new SecureRandom().nextInt(255));
|
||||
builder.xpathFind("//domain/devices/interface/mac").a("address",
|
||||
fromMACaddress.substring(0, fromMACaddress.lastIndexOf(":")+1) + lastMACoctet
|
||||
);
|
||||
return builder.asString(outputProperties);
|
||||
}
|
||||
|
||||
private static Properties generateOutputXMLProperties() {
|
||||
Properties outputProperties = new Properties();
|
||||
// Explicitly identify the output as an XML document
|
||||
outputProperties.put(javax.xml.transform.OutputKeys.METHOD, "xml");
|
||||
// Pretty-print the XML output (doesn't work in all cases)
|
||||
outputProperties.put(javax.xml.transform.OutputKeys.INDENT, "yes");
|
||||
// Get 2-space indenting when using the Apache transformer
|
||||
outputProperties.put("{http://xml.apache.org/xslt}indent-amount", "2");
|
||||
return outputProperties;
|
||||
}
|
||||
*/
|
||||
}
|
|
@ -1,33 +0,0 @@
|
|||
/**
|
||||
*
|
||||
* Copyright (C) 2010 Cloud Conscious, LLC. <info@cloudconscious.com>
|
||||
*
|
||||
* ====================================================================
|
||||
* Licensed 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 org.jclouds.vi.reference;
|
||||
|
||||
/**
|
||||
* Configuration properties and constants used in VI connections.
|
||||
*
|
||||
* @author Adrian Cole
|
||||
*/
|
||||
public interface ViConstants {
|
||||
|
||||
public static final String PROPERTY_VI_XML_NAMESPACE = "jclouds.vi.xml.ns";
|
||||
|
||||
public static final String PROPERTY_VI_IGNORE_CERTIFICATE = "jclouds.ignore-certificate";
|
||||
|
||||
}
|
|
@ -1,52 +0,0 @@
|
|||
package org.jclouds.vi.compute;
|
||||
|
||||
import static org.testng.Assert.assertEquals;
|
||||
|
||||
import java.util.Properties;
|
||||
|
||||
import org.jclouds.compute.ComputeServiceContext;
|
||||
import org.jclouds.compute.ComputeServiceContextFactory;
|
||||
import org.jclouds.rest.RestContext;
|
||||
import org.testng.annotations.Test;
|
||||
|
||||
import com.vmware.vim25.mo.ServiceInstance;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author andrea.turli
|
||||
*
|
||||
*/
|
||||
@Test(groups = "unit")
|
||||
public class ViComputeServiceContextBuilderTest {
|
||||
|
||||
@Test
|
||||
public void testCanBuildWithContextSpec() {
|
||||
ComputeServiceContext context = new ComputeServiceContextFactory().createContext(new ViComputeServiceContextSpec(
|
||||
"https://localhost/sdk", "Administrator", "password"));
|
||||
context.getComputeService().listNodes();
|
||||
|
||||
context.close();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCanBuildWithRestProperties() {
|
||||
Properties restProperties = new Properties();
|
||||
restProperties.setProperty("vi.contextbuilder", ViComputeServiceContextBuilder.class.getName());
|
||||
restProperties.setProperty("vi.propertiesbuilder", ViPropertiesBuilder.class.getName());
|
||||
restProperties.setProperty("vi.endpoint", "https://localhost/sdk");
|
||||
|
||||
ComputeServiceContext context = new ComputeServiceContextFactory(restProperties).createContext("vi",
|
||||
"identity", "credential");
|
||||
context.close();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testProviderSpecificContextIsCorrectType() {
|
||||
ComputeServiceContext context = new ViComputeServiceContextBuilder(new Properties()).buildComputeServiceContext();
|
||||
RestContext<ServiceInstance, ServiceInstance> providerContext = context.getProviderSpecificContext();
|
||||
|
||||
assertEquals(providerContext.getApi().getClass(), ServiceInstance.class);
|
||||
|
||||
context.close();
|
||||
}
|
||||
}
|
|
@ -1,57 +0,0 @@
|
|||
package org.jclouds.vi.compute;
|
||||
|
||||
import static org.jclouds.compute.util.ComputeServiceUtils.getCores;
|
||||
import static org.testng.Assert.assertEquals;
|
||||
|
||||
import java.util.Properties;
|
||||
|
||||
import org.jclouds.compute.BaseComputeServiceLiveTest;
|
||||
import org.jclouds.compute.ComputeServiceContextFactory;
|
||||
import org.jclouds.compute.domain.OsFamily;
|
||||
import org.jclouds.compute.domain.Template;
|
||||
import org.jclouds.rest.RestContext;
|
||||
import org.jclouds.ssh.jsch.config.JschSshClientModule;
|
||||
import org.testng.annotations.Test;
|
||||
|
||||
import com.vmware.vim25.mo.ServiceInstance;
|
||||
|
||||
/**
|
||||
* @author Adrian Cole
|
||||
*/
|
||||
@Test(groups = "live", enabled = true, sequential = true)
|
||||
public class ViComputeServiceLiveTest extends BaseComputeServiceLiveTest {
|
||||
|
||||
public ViComputeServiceLiveTest() {
|
||||
provider = "vi";
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Properties getRestProperties() {
|
||||
Properties restProperties = new Properties();
|
||||
restProperties.setProperty("vi.contextbuilder", ViComputeServiceContextBuilder.class.getName());
|
||||
restProperties.setProperty("vi.propertiesbuilder", ViPropertiesBuilder.class.getName());
|
||||
restProperties.setProperty("vi.endpoint", "https://localhost/sdk");
|
||||
return restProperties;
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testTemplateBuilder() {
|
||||
Template defaultTemplate = client.templateBuilder().build();
|
||||
assertEquals(defaultTemplate.getImage().getOperatingSystem().is64Bit(), true);
|
||||
assertEquals(defaultTemplate.getImage().getOperatingSystem().getVersion(), "5.3");
|
||||
assertEquals(defaultTemplate.getImage().getOperatingSystem().getFamily(), OsFamily.CENTOS);
|
||||
assertEquals(defaultTemplate.getLocation().getId(), "1");
|
||||
assertEquals(getCores(defaultTemplate.getHardware()), 0.5d);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected JschSshClientModule getSshModule() {
|
||||
return new JschSshClientModule();
|
||||
}
|
||||
|
||||
public void testAssignability() throws Exception {
|
||||
@SuppressWarnings("unused")
|
||||
RestContext<ServiceInstance, ServiceInstance> viContext = new ComputeServiceContextFactory().createContext(
|
||||
provider, identity, credential).getProviderSpecificContext();
|
||||
}
|
||||
}
|
|
@ -1,116 +0,0 @@
|
|||
/**
|
||||
*
|
||||
* Copyright (C) 2010 Cloud Conscious, LLC. <info@cloudconscious.com>
|
||||
*
|
||||
* ====================================================================
|
||||
* Licensed 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 org.jclouds.vi.compute;
|
||||
|
||||
import static com.google.common.base.Preconditions.checkNotNull;
|
||||
|
||||
import java.util.Set;
|
||||
|
||||
import org.jclouds.compute.ComputeServiceContext;
|
||||
import org.jclouds.compute.ComputeServiceContextFactory;
|
||||
import org.jclouds.compute.domain.Hardware;
|
||||
import org.jclouds.compute.domain.Image;
|
||||
import org.jclouds.domain.Location;
|
||||
import org.jclouds.logging.log4j.config.Log4JLoggingModule;
|
||||
import org.testng.annotations.BeforeClass;
|
||||
import org.testng.annotations.Test;
|
||||
|
||||
import com.google.common.collect.ImmutableSet;
|
||||
import com.google.inject.Module;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Adrian Cole
|
||||
*/
|
||||
@Test(groups = "live", testName = "vsphere.ViExperimentLiveTest")
|
||||
public class ViExperimentLiveTest {
|
||||
|
||||
protected String provider = "vsphere";
|
||||
protected String identity;
|
||||
protected String credential;
|
||||
protected String endpoint;
|
||||
protected String apiversion;
|
||||
|
||||
@BeforeClass
|
||||
protected void setupCredentials() {
|
||||
identity = checkNotNull(System.getProperty("test." + provider + ".identity"), "test." + provider + ".identity");
|
||||
credential = System.getProperty("test." + provider + ".credential");
|
||||
endpoint = System.getProperty("test." + provider + ".endpoint");
|
||||
apiversion = System.getProperty("test." + provider + ".apiversion");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testAndExperiment() {
|
||||
ComputeServiceContext context = null;
|
||||
|
||||
try {
|
||||
context = new ComputeServiceContextFactory().createContext(new ViComputeServiceContextSpec(endpoint, identity,
|
||||
credential), ImmutableSet.<Module>of(new Log4JLoggingModule()), new ViPropertiesBuilder().build());
|
||||
|
||||
Set<? extends Location> locations = context.getComputeService().listAssignableLocations();
|
||||
for (Location location : locations) {
|
||||
System.out.println("location id: " + location.getId() + " - desc: " + location.getDescription());
|
||||
}
|
||||
|
||||
Set<? extends Image> images = context.getComputeService().listImages();
|
||||
for (Image image : images) {
|
||||
System.out.println("id: " + image.getId() + " - name:" + image.getName());
|
||||
|
||||
|
||||
// Set<? extends ComputeMetadata> nodes = context.getComputeService().listNodes();
|
||||
//
|
||||
Set<? extends Hardware> hardwares = context.getComputeService().listHardwareProfiles();
|
||||
for (Hardware hardware : hardwares) {
|
||||
System.out.println("hardware id: " + hardware.getId() + " - name: " + hardware.getName());
|
||||
}
|
||||
//
|
||||
|
||||
}
|
||||
//
|
||||
// NodeMetadata node = context.getComputeService().getNodeMetadata("MyWinServer");
|
||||
// System.out.println(node);
|
||||
|
||||
/*
|
||||
* We will probably make a default template out of properties at some point You can control
|
||||
* the default template via overriding a method in standalonecomputeservicexontextmodule
|
||||
*/
|
||||
/*
|
||||
* Template defaultTemplate = context.getComputeService().templateBuilder()
|
||||
* .hardwareId("vm-1221").imageId("winNetEnterprise64Guest") //.locationId("") .build();
|
||||
*
|
||||
* Set<? extends NodeMetadata> nodeMetadataSet =
|
||||
* context.getComputeService().runNodesWithTag("MyWinServer", 1); for (NodeMetadata
|
||||
* nodeMetadata : nodeMetadataSet) {
|
||||
*
|
||||
* // context.getComputeService().suspendNode(nodeMetadata.getId()); //
|
||||
* context.getComputeService().resumeNode(nodeMetadata.getId());
|
||||
*
|
||||
* //context.getComputeService().destroyNode(nodeMetadata.getId()); }
|
||||
*/
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
|
||||
} finally {
|
||||
if (context != null)
|
||||
context.close();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
|
@ -1,136 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!--
|
||||
|
||||
|
||||
Copyright (C) 2009 Cloud Conscious, LLC.
|
||||
<info@cloudconscious.com>
|
||||
|
||||
====================================================================
|
||||
Licensed 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.
|
||||
====================================================================
|
||||
-->
|
||||
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
|
||||
|
||||
<!--
|
||||
For more configuration infromation and examples see the Apache
|
||||
Log4j website: http://logging.apache.org/log4j/
|
||||
-->
|
||||
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/"
|
||||
debug="false">
|
||||
|
||||
<!-- A time/date based rolling appender -->
|
||||
<appender name="WIREFILE" class="org.apache.log4j.DailyRollingFileAppender">
|
||||
<param name="File" value="target/test-data/jclouds-wire.log" />
|
||||
<param name="Append" value="true" />
|
||||
|
||||
<!-- Rollover at midnight each day -->
|
||||
<param name="DatePattern" value="'.'yyyy-MM-dd" />
|
||||
|
||||
<param name="Threshold" value="TRACE" />
|
||||
|
||||
<layout class="org.apache.log4j.PatternLayout">
|
||||
<!-- The default pattern: Date Priority [Category] Message\n -->
|
||||
<param name="ConversionPattern" value="%d %-5p [%c] (%t) %m%n" />
|
||||
|
||||
<!--
|
||||
The full pattern: Date MS Priority [Category]
|
||||
(Thread:NDC) Message\n <param name="ConversionPattern"
|
||||
value="%d %-5r %-5p [%c] (%t:%x) %m%n"/>
|
||||
-->
|
||||
</layout>
|
||||
</appender>
|
||||
|
||||
<!-- A time/date based rolling appender -->
|
||||
<appender name="FILE" class="org.apache.log4j.DailyRollingFileAppender">
|
||||
<param name="File" value="target/test-data/jclouds.log" />
|
||||
<param name="Append" value="true" />
|
||||
|
||||
<!-- Rollover at midnight each day -->
|
||||
<param name="DatePattern" value="'.'yyyy-MM-dd" />
|
||||
|
||||
<param name="Threshold" value="TRACE" />
|
||||
|
||||
<layout class="org.apache.log4j.PatternLayout">
|
||||
<!-- The default pattern: Date Priority [Category] Message\n -->
|
||||
<param name="ConversionPattern" value="%d %-5p [%c] (%t) %m%n" />
|
||||
|
||||
<!--
|
||||
The full pattern: Date MS Priority [Category]
|
||||
(Thread:NDC) Message\n <param name="ConversionPattern"
|
||||
value="%d %-5r %-5p [%c] (%t:%x) %m%n"/>
|
||||
-->
|
||||
</layout>
|
||||
</appender>
|
||||
<!-- A time/date based rolling appender -->
|
||||
<appender name="COMPUTEFILE" class="org.apache.log4j.DailyRollingFileAppender">
|
||||
<param name="File" value="target/test-data/jclouds-compute.log" />
|
||||
<param name="Append" value="true" />
|
||||
|
||||
<!-- Rollover at midnight each day -->
|
||||
<param name="DatePattern" value="'.'yyyy-MM-dd" />
|
||||
|
||||
<param name="Threshold" value="TRACE" />
|
||||
|
||||
<layout class="org.apache.log4j.PatternLayout">
|
||||
<!-- The default pattern: Date Priority [Category] Message\n -->
|
||||
<param name="ConversionPattern" value="%d %-5p [%c] (%t) %m%n" />
|
||||
|
||||
<!--
|
||||
The full pattern: Date MS Priority [Category]
|
||||
(Thread:NDC) Message\n <param name="ConversionPattern"
|
||||
value="%d %-5r %-5p [%c] (%t:%x) %m%n"/>
|
||||
-->
|
||||
</layout>
|
||||
</appender>
|
||||
|
||||
<appender name="ASYNCCOMPUTE" class="org.apache.log4j.AsyncAppender">
|
||||
<appender-ref ref="COMPUTEFILE" />
|
||||
</appender>
|
||||
<appender name="ASYNC" class="org.apache.log4j.AsyncAppender">
|
||||
<appender-ref ref="FILE" />
|
||||
</appender>
|
||||
|
||||
<appender name="ASYNCWIRE" class="org.apache.log4j.AsyncAppender">
|
||||
<appender-ref ref="WIREFILE" />
|
||||
</appender>
|
||||
|
||||
<!-- ================ -->
|
||||
<!-- Limit categories -->
|
||||
<!-- ================ -->
|
||||
|
||||
<category name="org.jclouds">
|
||||
<priority value="DEBUG" />
|
||||
<appender-ref ref="ASYNC" />
|
||||
</category>
|
||||
|
||||
<category name="jclouds.headers">
|
||||
<priority value="DEBUG" />
|
||||
<appender-ref ref="ASYNCWIRE" />
|
||||
</category>
|
||||
<category name="jclouds.wire">
|
||||
<priority value="DEBUG" />
|
||||
<appender-ref ref="ASYNCWIRE" />
|
||||
</category>
|
||||
|
||||
<category name="jclouds.compute">
|
||||
<priority value="TRACE" />
|
||||
<appender-ref ref="ASYNCCOMPUTE" />
|
||||
</category>
|
||||
<!-- ======================= -->
|
||||
<!-- Setup the Root category -->
|
||||
<!-- ======================= -->
|
||||
|
||||
<root>
|
||||
<priority value="DEBUG" />
|
||||
</root>
|
||||
|
||||
</log4j:configuration>
|
Loading…
Reference in New Issue