mirror of https://github.com/apache/jclouds.git
JCLOUDS-25. Removing sandbox-*.
This commit is contained in:
parent
1e4baa9618
commit
3923283fcd
|
@ -1,92 +0,0 @@
|
|||
====
|
||||
Licensed to jclouds, Inc. (jclouds) under one or more
|
||||
contributor license agreements. See the NOTICE file
|
||||
distributed with this work for additional information
|
||||
regarding copyright ownership. jclouds licenses this file
|
||||
to you under the Apache License, Version 2.0 (the
|
||||
"License"); you may not use this file except in compliance
|
||||
with the License. You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing,
|
||||
software distributed under the License is distributed on an
|
||||
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
KIND, either express or implied. See the License for the
|
||||
specific language governing permissions and limitations
|
||||
under the License.
|
||||
====
|
||||
|
||||
The libvirt library is used to interface with different virtualization technologies (http://libvirt.org/)
|
||||
|
||||
libvirt supports:
|
||||
The Xen hypervisor on Linux and Solaris hosts.
|
||||
The QEMU emulator
|
||||
The KVM Linux hypervisor
|
||||
The LXC Linux container system
|
||||
The OpenVZ Linux container system
|
||||
The User Mode Linux paravirtualized kernel
|
||||
The VirtualBox hypervisor
|
||||
The VMware ESX and GSX hypervisors
|
||||
Storage on IDE/SCSI/USB disks, FibreChannel, LVM, iSCSI, NFS and filesystems
|
||||
|
||||
Getting Started Guide for jclouds-libvirt
|
||||
|
||||
install libvirt on your os
|
||||
* if os/x, see http://github.com/justinclift/libvirt
|
||||
* if you are using Linux, let's suppose you want to use KVM:
|
||||
- install libvirt and KVM (http://www.linux-kvm.org/page/Main_Page).
|
||||
|
||||
Remember to run
|
||||
egrep '(vmx|svm)' /proc/cpuinfo
|
||||
If nothing is printed, it means that your cpu does not support hardware virtualization.
|
||||
|
||||
Verify Installation
|
||||
$ virsh -c qemu:///system list
|
||||
Id Name State
|
||||
----------------------------------
|
||||
|
||||
(for Ubuntu users: look also at this good turorial https://help.ubuntu.com/community/KVM)
|
||||
|
||||
Create your first guest
|
||||
- download, for example, an ubuntu 10.04 LTS ISO
|
||||
- create a libvirt domain by using:
|
||||
virt-manager: a GUI tool at http://virt-manager.et.redhat.com/
|
||||
virt-install, a python script developed by Red Hat (sudo apt-get install python-virtinst)
|
||||
ubuntu-vm-builder, developed by Canonical. (sudo apt-get install ubuntu-vm-builder)
|
||||
NB: use Javascript tool that generates the parameters for ubuntu-vm-builder: http://people.ubuntu.com/~kirkland/ubuntu-vm-builder.html
|
||||
|
||||
Now that you have a libvirt domain, your workstation is ready to use jclouds-libvirt.
|
||||
You can now download jclouds-libvirt and give a try by running
|
||||
|
||||
ComputeServiceContext context = null;
|
||||
try {
|
||||
context = new ComputeServiceContextFactory()
|
||||
.createContext(new StandaloneComputeServiceContextSpec<Domain, Domain, Image, Datacenter>("libvirt",
|
||||
endpoint, apiversion, identity, credential, new LibvirtComputeServiceContextModule(), ImmutableSet
|
||||
.<Module> of()));
|
||||
|
||||
Template defaultTemplate = context.getComputeService().templateBuilder()
|
||||
.hardwareId("c7ff2039-a9f1-a659-7f91-e0f82f59d52e").imageId("1").build();
|
||||
|
||||
|
||||
context.getComputeService().runNodesWithTag(domainName, 1, defaultTemplate);
|
||||
|
||||
} catch (RunNodesException e) {
|
||||
e.printStackTrace();
|
||||
} finally {
|
||||
if (context != null)
|
||||
context.close();
|
||||
}
|
||||
|
||||
where identity=your_name, endpoint=qemu:///system
|
||||
and domainName equals to the name chosen during the creation of libvirt domain
|
||||
|
||||
NB: apiversion, credential can be null
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
@ -1 +0,0 @@
|
|||
runNodesWithTag: when ask for more than 1 node, cloning step fails cause of concurrent access to the originale virtual disk to be cloned.
|
|
@ -1,147 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!--
|
||||
|
||||
Licensed to jclouds, Inc. (jclouds) under one or more
|
||||
contributor license agreements. See the NOTICE file
|
||||
distributed with this work for additional information
|
||||
regarding copyright ownership. jclouds licenses this file
|
||||
to you under the Apache License, Version 2.0 (the
|
||||
"License"); you may not use this file except in compliance
|
||||
with the License. You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing,
|
||||
software distributed under the License is distributed on an
|
||||
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
KIND, either express or implied. See the License for the
|
||||
specific language governing permissions and limitations
|
||||
under the License.
|
||||
|
||||
-->
|
||||
<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.6.0-SNAPSHOT</version>
|
||||
<relativePath>../../project/pom.xml</relativePath>
|
||||
</parent>
|
||||
<groupId>org.jclouds.api</groupId>
|
||||
<artifactId>libvirt</artifactId>
|
||||
<name>jclouds example components for a libvirt provider</name>
|
||||
<packaging>bundle</packaging>
|
||||
|
||||
<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.libvirt.endpoint>test:///default</test.libvirt.endpoint>
|
||||
<test.libvirt.api-version>1.0</test.libvirt.api-version>
|
||||
<test.libvirt.build-version></test.libvirt.build-version>
|
||||
<test.libvirt.identity>FIXME</test.libvirt.identity>
|
||||
<test.libvirt.credential>FIXME</test.libvirt.credential>
|
||||
<test.libvirt.image-id></test.libvirt.image-id>
|
||||
|
||||
<jclouds.osgi.export>org.jclouds.libvirt*;version="${project.version}"</jclouds.osgi.export>
|
||||
<jclouds.osgi.import>org.jclouds*;version="${project.version}",*</jclouds.osgi.import>
|
||||
</properties>
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>org.libvirt</groupId>
|
||||
<artifactId>libvirt</artifactId>
|
||||
<version>0.4.6</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>commons-io</groupId>
|
||||
<artifactId>commons-io</artifactId>
|
||||
<version>2.4</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>com.sun.jna</groupId>
|
||||
<artifactId>jna</artifactId>
|
||||
<version>3.0.9</version>
|
||||
<scope>provided</scope>
|
||||
</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>
|
||||
<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>
|
||||
<systemPropertyVariables>
|
||||
<test.libvirt.endpoint>${test.libvirt.endpoint}</test.libvirt.endpoint>
|
||||
<test.libvirt.api-version>${test.libvirt.api-version}</test.libvirt.api-version>
|
||||
<test.libvirt.build-version>${test.libvirt.build-version}</test.libvirt.build-version>
|
||||
<test.libvirt.identity>${test.libvirt.identity}</test.libvirt.identity>
|
||||
<test.libvirt.credential>${test.libvirt.credential}</test.libvirt.credential>
|
||||
<test.libvirt.image-id>${test.libvirt.image-id}</test.libvirt.image-id>
|
||||
</systemPropertyVariables>
|
||||
</configuration>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
</profile>
|
||||
</profiles>
|
||||
|
||||
</project>
|
|
@ -1,55 +0,0 @@
|
|||
/**
|
||||
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||
* contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. jclouds licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
package org.jclouds.libvirt;
|
||||
|
||||
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 int id;
|
||||
public String name;
|
||||
|
||||
public Image(int 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,32 +0,0 @@
|
|||
/**
|
||||
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||
* contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. jclouds licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
package org.jclouds.libvirt;
|
||||
|
||||
/**
|
||||
* Configuration properties and constants used in libvirt local connections.
|
||||
*
|
||||
* @author Adrian Cole
|
||||
*/
|
||||
public interface LibvirtConstants {
|
||||
public static final String PROPERTY_LIBVIRT_DOMAIN_DIR = "jclouds.libvirt.domain.dir";
|
||||
}
|
||||
|
||||
|
||||
//public static final String PROPERTY_AUTH_TAG = "jclouds.aws.auth.tag";
|
||||
//public static final String PROPERTY_HEADER_TAG = "jclouds.aws.header.tag";
|
|
@ -1,121 +0,0 @@
|
|||
/**
|
||||
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||
* contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. jclouds licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
package org.jclouds.libvirt.compute;
|
||||
|
||||
import java.io.StringReader;
|
||||
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.ImageExtension;
|
||||
import org.jclouds.compute.callables.RunScriptOnNode;
|
||||
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.internal.PersistNodeCredentials;
|
||||
import org.jclouds.compute.options.TemplateOptions;
|
||||
import org.jclouds.compute.reference.ComputeServiceConstants.Timeouts;
|
||||
import org.jclouds.compute.strategy.CreateNodesInGroupThenAddToSet;
|
||||
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.SuspendNodeStrategy;
|
||||
import org.jclouds.domain.Credentials;
|
||||
import org.jclouds.domain.Location;
|
||||
import org.jclouds.scriptbuilder.functions.InitAdminAccess;
|
||||
import org.libvirt.Connect;
|
||||
import org.libvirt.StorageVol;
|
||||
import org.xml.sax.InputSource;
|
||||
|
||||
import com.google.common.base.Optional;
|
||||
import com.google.common.base.Predicate;
|
||||
import com.google.common.base.Supplier;
|
||||
import com.google.common.base.Throwables;
|
||||
import com.jamesmurty.utils.XMLBuilder;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author andrea turli
|
||||
*
|
||||
*/
|
||||
@Singleton
|
||||
public class LibvirtComputeService extends BaseComputeService {
|
||||
|
||||
private final Connect client;
|
||||
|
||||
@Inject
|
||||
protected LibvirtComputeService(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, InitAdminAccess initAdminAccess,
|
||||
RunScriptOnNode.Factory runScriptOnNodeFactory, PersistNodeCredentials persistNodeCredentials,
|
||||
Timeouts timeouts, @Named(Constants.PROPERTY_USER_THREADS) ExecutorService executor, Connect client,
|
||||
Optional<ImageExtension> imageExtension) {
|
||||
super(context, credentialStore, images, hardwareProfiles, locations, listNodesStrategy, getNodeMetadataStrategy,
|
||||
runNodesAndAddToSetStrategy, rebootNodeStrategy, destroyNodeStrategy, resumeNodeStrategy,
|
||||
suspendNodeStrategy, templateBuilderProvider, templateOptionsProvider, nodeRunning, nodeTerminated,
|
||||
nodeSuspended, initScriptRunnerFactory, initAdminAccess, runScriptOnNodeFactory, persistNodeCredentials,
|
||||
timeouts, executor, imageExtension);
|
||||
this.client = client;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void cleanUpIncidentalResourcesOfDeadNodes(Set<? extends NodeMetadata> deadNodes) {
|
||||
// TODO Was previously commented out in overridden destroyNode; refactored to here but left commented out
|
||||
// for (NodeMetadata deadNode : deadNodes) {
|
||||
// eliminateDomain(deadNode.getId());
|
||||
// }
|
||||
}
|
||||
|
||||
private void eliminateDomain(String id) {
|
||||
try {
|
||||
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 (Exception e) {
|
||||
Throwables.propagate(e);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,49 +0,0 @@
|
|||
/**
|
||||
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||
* contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. jclouds licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
package org.jclouds.libvirt.compute;
|
||||
|
||||
import static org.jclouds.libvirt.LibvirtConstants.PROPERTY_LIBVIRT_DOMAIN_DIR;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Properties;
|
||||
|
||||
import org.jclouds.compute.StandaloneComputeServiceContextBuilder;
|
||||
import org.jclouds.libvirt.compute.domain.LibvirtComputeServiceContextModule;
|
||||
import org.libvirt.Connect;
|
||||
|
||||
import com.google.inject.Module;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Adrian Cole
|
||||
*/
|
||||
public class LibvirtComputeServiceContextBuilder extends StandaloneComputeServiceContextBuilder<Connect> {
|
||||
|
||||
public LibvirtComputeServiceContextBuilder(Properties props) {
|
||||
super(Connect.class, props);
|
||||
|
||||
if (!properties.containsKey(PROPERTY_LIBVIRT_DOMAIN_DIR))
|
||||
properties.setProperty(PROPERTY_LIBVIRT_DOMAIN_DIR, "/etc/libvirt/qemu");
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void addContextModule(List<Module> modules) {
|
||||
modules.add(new LibvirtComputeServiceContextModule());
|
||||
}
|
||||
}
|
|
@ -1,42 +0,0 @@
|
|||
/**
|
||||
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||
* contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. jclouds licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
package org.jclouds.libvirt.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 LibvirtComputeServiceContextSpec extends RestContextSpec<ComputeService, ComputeService> {
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
public LibvirtComputeServiceContextSpec(String endpoint, String identity, String credential, Iterable<Module> modules) {
|
||||
super("libvirt", endpoint, "1", "", identity, credential, ComputeService.class, ComputeService.class,
|
||||
PropertiesBuilder.class, (Class) LibvirtComputeServiceContextBuilder.class, modules);
|
||||
}
|
||||
|
||||
public LibvirtComputeServiceContextSpec(String endpoint, String identity, String credential) {
|
||||
this(endpoint, identity, credential, ImmutableSet.<Module> of());
|
||||
}
|
||||
}
|
|
@ -1,72 +0,0 @@
|
|||
/**
|
||||
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||
* contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. jclouds licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
package org.jclouds.libvirt.compute;
|
||||
|
||||
import static org.jclouds.Constants.PROPERTY_API_VERSION;
|
||||
import static org.jclouds.Constants.PROPERTY_ENDPOINT;
|
||||
import static org.jclouds.libvirt.LibvirtConstants.PROPERTY_LIBVIRT_DOMAIN_DIR;
|
||||
import static org.jclouds.compute.reference.ComputeServiceConstants.PROPERTY_TIMEOUT_NODE_SUSPENDED;
|
||||
|
||||
import java.util.Properties;
|
||||
|
||||
import org.jclouds.PropertiesBuilder;
|
||||
|
||||
/**
|
||||
* Builds properties used in Libvirt Clients
|
||||
*
|
||||
* @author Andrea Turli
|
||||
*/
|
||||
public class LibvirtPropertiesBuilder extends PropertiesBuilder {
|
||||
@Override
|
||||
protected Properties defaultProperties() {
|
||||
Properties properties = super.defaultProperties();
|
||||
properties.setProperty(PROPERTY_LIBVIRT_DOMAIN_DIR, "/etc/libvirt/qemu");
|
||||
|
||||
/*
|
||||
properties.setProperty(PROPERTY_AUTH_TAG, "AWS");
|
||||
properties.setProperty(PROPERTY_HEADER_TAG, "amz");
|
||||
properties.setProperty(PROPERTY_ENDPOINT, "https://ec2.us-east-1.amazonaws.com");
|
||||
properties.setProperty(PROPERTY_API_VERSION, EC2AsyncClient.VERSION);
|
||||
properties.setProperty(PROPERTY_ELB_ENDPOINT, "https://elasticloadbalancing.us-east-1.amazonaws.com");
|
||||
// amazon, alestic, canonical, and rightscale
|
||||
properties.setProperty(PROPERTY_EC2_AMI_OWNERS, "137112412989,063491364108,099720109477,411009282317");
|
||||
// amis that work with the cluster instances
|
||||
properties.setProperty(PROPERTY_EC2_CC_AMIs, "us-east-1/ami-7ea24a17");
|
||||
*/
|
||||
|
||||
// sometimes, like in ec2, stop takes a very long time, perhaps
|
||||
// due to volume management. one example spent 2 minutes moving
|
||||
// from stopping->stopped state on an ec2 micro
|
||||
properties.setProperty(PROPERTY_TIMEOUT_NODE_SUSPENDED, 120 * 1000 + "");
|
||||
// auth fail sometimes happens in EC2, as the rc.local script that injects the
|
||||
// authorized key executes after ssh has started
|
||||
properties.setProperty("jclouds.ssh.max_retries", "7");
|
||||
properties.setProperty("jclouds.ssh.retryable_messages",
|
||||
"Auth fail,invalid data,End of IO Stream Read,Connection reset,socket is not established");
|
||||
return properties;
|
||||
}
|
||||
|
||||
public LibvirtPropertiesBuilder(Properties properties) {
|
||||
super(properties);
|
||||
}
|
||||
|
||||
public LibvirtPropertiesBuilder() {
|
||||
super();
|
||||
}
|
||||
}
|
|
@ -1,180 +0,0 @@
|
|||
/**
|
||||
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||
* contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. jclouds licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
package org.jclouds.libvirt.compute.domain;
|
||||
|
||||
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.libvirt.LibvirtConstants.PROPERTY_LIBVIRT_DOMAIN_DIR;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.FileInputStream;
|
||||
import java.io.FileNotFoundException;
|
||||
import java.net.URI;
|
||||
|
||||
import javax.inject.Named;
|
||||
import javax.inject.Singleton;
|
||||
|
||||
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.functions.IdentityFunction;
|
||||
import org.jclouds.http.functions.ParseSax;
|
||||
import org.jclouds.libvirt.Image;
|
||||
import org.jclouds.libvirt.compute.functions.DomainToHardware;
|
||||
import org.jclouds.libvirt.compute.functions.DomainToNodeMetadata;
|
||||
import org.jclouds.libvirt.compute.functions.LibvirtImageToImage;
|
||||
import org.jclouds.libvirt.compute.strategy.LibvirtComputeServiceAdapter;
|
||||
import org.jclouds.location.Provider;
|
||||
import org.jclouds.location.suppliers.OnlyLocationOrFirstZone;
|
||||
import org.libvirt.Connect;
|
||||
import org.libvirt.Domain;
|
||||
import org.libvirt.LibvirtException;
|
||||
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.collect.Iterables;
|
||||
import com.google.inject.Injector;
|
||||
import com.google.inject.Key;
|
||||
import com.google.inject.Provides;
|
||||
import com.google.inject.TypeLiteral;
|
||||
import com.google.inject.name.Names;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Adrian Cole
|
||||
*/
|
||||
public class LibvirtComputeServiceContextModule extends
|
||||
ComputeServiceAdapterContextModule<Connect, Connect, Domain, Domain, Image, Location> {
|
||||
|
||||
public LibvirtComputeServiceContextModule() {
|
||||
super(Connect.class, Connect.class);
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
@Override
|
||||
protected void configure() {
|
||||
super.configure();
|
||||
bind(new TypeLiteral<ComputeServiceAdapter<Domain, Domain, Image, Location>>() {
|
||||
}).to(LibvirtComputeServiceAdapter.class);
|
||||
bind(new TypeLiteral<Supplier<Location>>() {
|
||||
}).to(OnlyLocationOrFirstZone.class);
|
||||
bind(new TypeLiteral<Function<Domain, NodeMetadata>>() {
|
||||
}).to(DomainToNodeMetadata.class);
|
||||
bind(new TypeLiteral<Function<Image, org.jclouds.compute.domain.Image>>() {
|
||||
}).to(LibvirtImageToImage.class);
|
||||
bind(new TypeLiteral<Function<Domain, Hardware>>() {
|
||||
}).to(DomainToHardware.class);
|
||||
bind(new TypeLiteral<Function<Location, Location>>() {
|
||||
}).to((Class) IdentityFunction.class);
|
||||
|
||||
// bind(ComputeService.class).to(LibvirtComputeService.class);
|
||||
}
|
||||
|
||||
@Provides
|
||||
@Singleton
|
||||
protected Connect createConnection(@Provider URI endpoint, @Named(Constants.PROPERTY_IDENTITY) String identity,
|
||||
@Named(Constants.PROPERTY_CREDENTIAL) String credential) throws LibvirtException {
|
||||
// ConnectAuth connectAuth = null;
|
||||
return new Connect(endpoint.toASCIIString());
|
||||
}
|
||||
|
||||
@Override
|
||||
protected TemplateBuilder provideTemplate(Injector injector, TemplateBuilder template) {
|
||||
String domainDir = injector.getInstance(Key.get(String.class, Names.named(PROPERTY_LIBVIRT_DOMAIN_DIR)));
|
||||
String hardwareId = searchForHardwareIdInDomainDir(domainDir, injector.getInstance(ParseSax.Factory.class),
|
||||
injector.getProvider(UUIDHandler.class));
|
||||
String image = searchForImageIdInDomainDir(domainDir);
|
||||
return template.hardwareId(hardwareId).imageId(image);
|
||||
}
|
||||
|
||||
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,98 +0,0 @@
|
|||
/**
|
||||
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||
* contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. jclouds licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
package org.jclouds.libvirt.compute.functions;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.StringReader;
|
||||
import java.util.List;
|
||||
|
||||
import javax.inject.Singleton;
|
||||
import javax.xml.parsers.ParserConfigurationException;
|
||||
import javax.xml.xpath.XPathConstants;
|
||||
import javax.xml.xpath.XPathExpression;
|
||||
import javax.xml.xpath.XPathExpressionException;
|
||||
import javax.xml.xpath.XPathFactory;
|
||||
|
||||
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 org.libvirt.Domain;
|
||||
import org.libvirt.LibvirtException;
|
||||
import org.libvirt.StorageVol;
|
||||
import org.w3c.dom.Document;
|
||||
import org.w3c.dom.NodeList;
|
||||
import org.xml.sax.InputSource;
|
||||
import org.xml.sax.SAXException;
|
||||
|
||||
import com.google.common.base.Function;
|
||||
import com.google.common.base.Throwables;
|
||||
import com.google.common.collect.Lists;
|
||||
|
||||
import com.jamesmurty.utils.XMLBuilder;
|
||||
|
||||
/**
|
||||
* @author Adrian Cole
|
||||
*/
|
||||
@Singleton
|
||||
public class DomainToHardware implements Function<Domain, Hardware> {
|
||||
|
||||
@Override
|
||||
public Hardware apply(Domain from) {
|
||||
HardwareBuilder builder = new HardwareBuilder();
|
||||
|
||||
try {
|
||||
builder.id(from.getUUIDString());
|
||||
builder.providerId(from.getID() + "");
|
||||
builder.name(from.getName());
|
||||
List<Processor> processors = Lists.newArrayList();
|
||||
for (int i = 0; i < from.getInfo().nrVirtCpu; i++) {
|
||||
processors.add(new Processor(i + 1, 1));
|
||||
}
|
||||
builder.processors(processors);
|
||||
|
||||
builder.ram((int) from.getInfo().maxMem);
|
||||
List<Volume> volumes = Lists.newArrayList();
|
||||
XMLBuilder xmlBuilder = XMLBuilder.parse(new InputSource(new StringReader(from.getXMLDesc(0))));
|
||||
Document doc = xmlBuilder.getDocument();
|
||||
XPathExpression expr = XPathFactory.newInstance().newXPath().compile("//devices/disk[@device='disk']/source/@file");
|
||||
NodeList nodes = (NodeList) expr.evaluate(doc, XPathConstants.NODESET);
|
||||
String diskFileName = nodes.item(0).getNodeValue();
|
||||
for (int i = 0; i < nodes.getLength(); i++) {
|
||||
StorageVol storageVol = from.getConnect().storageVolLookupByPath(diskFileName);
|
||||
String id = storageVol.getKey();
|
||||
float size = Long.valueOf(storageVol.getInfo().capacity).floatValue();
|
||||
volumes.add(new VolumeImpl(id, Volume.Type.LOCAL, size, null, true, false));
|
||||
}
|
||||
builder.volumes((List<Volume>) volumes);
|
||||
} catch (LibvirtException e) {
|
||||
Throwables.propagate(e);
|
||||
} catch (XPathExpressionException e) {
|
||||
Throwables.propagate(e);
|
||||
} catch (ParserConfigurationException e) {
|
||||
Throwables.propagate(e);
|
||||
} catch (SAXException e) {
|
||||
Throwables.propagate(e);
|
||||
} catch (IOException e) {
|
||||
Throwables.propagate(e);
|
||||
}
|
||||
return builder.build();
|
||||
}
|
||||
}
|
|
@ -1,138 +0,0 @@
|
|||
/**
|
||||
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||
* contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. jclouds licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
package org.jclouds.libvirt.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 org.libvirt.Domain;
|
||||
import org.libvirt.DomainInfo;
|
||||
import org.libvirt.LibvirtException;
|
||||
|
||||
import com.google.common.base.Function;
|
||||
import com.google.common.base.Supplier;
|
||||
import com.google.common.collect.ImmutableMap;
|
||||
|
||||
/**
|
||||
* @author Adrian Cole
|
||||
*/
|
||||
@Singleton
|
||||
public class DomainToNodeMetadata implements Function<Domain, NodeMetadata> {
|
||||
|
||||
public static final Map<DomainInfo.DomainState, NodeState> domainStateToNodeState = ImmutableMap
|
||||
.<DomainInfo.DomainState, NodeState> builder().put(DomainInfo.DomainState.VIR_DOMAIN_RUNNING,
|
||||
NodeState.RUNNING)//
|
||||
.put(DomainInfo.DomainState.VIR_DOMAIN_BLOCKED, NodeState.PENDING)//
|
||||
.put(DomainInfo.DomainState.VIR_DOMAIN_PAUSED, NodeState.SUSPENDED)//
|
||||
.put(DomainInfo.DomainState.VIR_DOMAIN_SHUTDOWN, NodeState.SUSPENDED)//
|
||||
.put(DomainInfo.DomainState.VIR_DOMAIN_SHUTOFF, NodeState.SUSPENDED)//
|
||||
.put(DomainInfo.DomainState.VIR_DOMAIN_CRASHED, NodeState.ERROR)//
|
||||
|
||||
.put(DomainInfo.DomainState.VIR_DOMAIN_NOSTATE, NodeState.UNRECOGNIZED)//
|
||||
.build();
|
||||
|
||||
private final Function<Domain, Hardware> findHardwareForDomain;
|
||||
private final FindLocationForDomain findLocationForDomain;
|
||||
private final FindImageForDomain findImageForDomain;
|
||||
private final Map<String, Credentials> credentialStore;
|
||||
|
||||
@Inject
|
||||
DomainToNodeMetadata(Map<String, Credentials> credentialStore, Function<Domain, Hardware> findHardwareForDomain,
|
||||
FindLocationForDomain findLocationForDomain, FindImageForDomain findImageForDomain) {
|
||||
this.credentialStore = checkNotNull(credentialStore, "credentialStore");
|
||||
this.findHardwareForDomain = checkNotNull(findHardwareForDomain, "findHardwareForDomain");
|
||||
this.findLocationForDomain = checkNotNull(findLocationForDomain, "findLocationForDomain");
|
||||
this.findImageForDomain = checkNotNull(findImageForDomain, "findImageForDomain");
|
||||
}
|
||||
|
||||
@Override
|
||||
public NodeMetadata apply(Domain from) {
|
||||
|
||||
// convert the result object to a jclouds NodeMetadata
|
||||
NodeMetadataBuilder builder = new NodeMetadataBuilder();
|
||||
try {
|
||||
builder.id(from.getUUIDString());
|
||||
builder.providerId(from.getID() + "");
|
||||
builder.name(from.getName());
|
||||
builder.location(findLocationForDomain.apply(from));
|
||||
builder.group(parseGroupFromName(from.getName()));
|
||||
|
||||
builder.operatingSystem(new OperatingSystemBuilder().description(from.getOSType()).build());
|
||||
builder.hardware(findHardwareForDomain.apply(from));
|
||||
|
||||
builder.state(domainStateToNodeState.get(from.getInfo().state));
|
||||
// builder.publicAddresses(ImmutableSet.<String> of(from.publicAddress));
|
||||
// builder.privateAddresses(ImmutableSet.<String> of(from.privateAddress));
|
||||
builder.credentials(credentialStore.get("node#" + from.getUUIDString()));
|
||||
|
||||
} catch (LibvirtException e) {
|
||||
// TODO Auto-generated catch block
|
||||
e.printStackTrace();
|
||||
}
|
||||
return builder.build();
|
||||
}
|
||||
|
||||
@Singleton
|
||||
public static class FindImageForDomain extends FindResourceInSet<Domain, Image> {
|
||||
|
||||
@Inject
|
||||
public FindImageForDomain(@Memoized Supplier<Set<? extends Image>> hardware) {
|
||||
super(hardware);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean matches(Domain from, Image input) {
|
||||
// TODO
|
||||
// return input.getProviderId().equals(from.imageId + "");
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
@Singleton
|
||||
public static class FindLocationForDomain extends FindResourceInSet<Domain, Location> {
|
||||
|
||||
@Inject
|
||||
public FindLocationForDomain(@Memoized Supplier<Set<? extends Location>> hardware) {
|
||||
super(hardware);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean matches(Domain from, Location input) {
|
||||
// TODO
|
||||
// return input.getId().equals(from.datacenter + "");
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,61 +0,0 @@
|
|||
/**
|
||||
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||
* contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. jclouds licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
package org.jclouds.libvirt.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 LibvirtImageToImage implements Function<org.jclouds.libvirt.Image, Image> {
|
||||
@Resource
|
||||
@Named(ComputeServiceConstants.COMPUTE_LOGGER)
|
||||
protected Logger logger = Logger.NULL;
|
||||
|
||||
@Override
|
||||
public Image apply(org.jclouds.libvirt.Image from) {
|
||||
|
||||
ImageBuilder builder = new ImageBuilder();
|
||||
builder.ids(from.id + "");
|
||||
builder.name(from.name);
|
||||
builder.description(from.name);
|
||||
|
||||
OsFamily family = null;
|
||||
try {
|
||||
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,282 +0,0 @@
|
|||
/**
|
||||
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||
* contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. jclouds licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
package org.jclouds.libvirt.compute.strategy;
|
||||
|
||||
import static com.google.common.base.Preconditions.checkNotNull;
|
||||
import static org.jclouds.libvirt.LibvirtConstants.PROPERTY_LIBVIRT_DOMAIN_DIR;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.StringReader;
|
||||
import java.security.SecureRandom;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Properties;
|
||||
import java.util.UUID;
|
||||
|
||||
import javax.inject.Inject;
|
||||
import javax.inject.Singleton;
|
||||
import javax.xml.parsers.ParserConfigurationException;
|
||||
import javax.xml.transform.TransformerException;
|
||||
import javax.xml.xpath.XPathConstants;
|
||||
import javax.xml.xpath.XPathExpression;
|
||||
import javax.xml.xpath.XPathExpressionException;
|
||||
import javax.xml.xpath.XPathFactory;
|
||||
|
||||
import org.jclouds.compute.ComputeService;
|
||||
import org.jclouds.compute.ComputeServiceAdapter;
|
||||
import org.jclouds.compute.domain.Template;
|
||||
import org.jclouds.domain.Credentials;
|
||||
import org.jclouds.domain.Location;
|
||||
import org.jclouds.libvirt.Image;
|
||||
import org.libvirt.Connect;
|
||||
import org.libvirt.Domain;
|
||||
import org.libvirt.LibvirtException;
|
||||
import org.libvirt.StoragePool;
|
||||
import org.libvirt.StorageVol;
|
||||
import org.libvirt.jna.Libvirt;
|
||||
import org.w3c.dom.Document;
|
||||
import org.w3c.dom.Element;
|
||||
import org.w3c.dom.Node;
|
||||
import org.w3c.dom.NodeList;
|
||||
import org.xml.sax.InputSource;
|
||||
import org.xml.sax.SAXException;
|
||||
|
||||
import com.google.common.base.Throwables;
|
||||
import com.google.common.collect.ImmutableSet;
|
||||
import com.google.common.collect.Lists;
|
||||
import com.google.inject.name.Named;
|
||||
import com.jamesmurty.utils.XMLBuilder;
|
||||
|
||||
/**
|
||||
* defines the connection between the {@link Libvirt} implementation and the jclouds
|
||||
* {@link ComputeService}
|
||||
*
|
||||
*/
|
||||
@Singleton
|
||||
public class LibvirtComputeServiceAdapter implements ComputeServiceAdapter<Domain, Domain, Image, Location> {
|
||||
|
||||
private final Connect client;
|
||||
|
||||
@Inject
|
||||
public LibvirtComputeServiceAdapter(Connect client, @Named(PROPERTY_LIBVIRT_DOMAIN_DIR) String domainDir) {
|
||||
this.client = checkNotNull(client, "client");
|
||||
System.out.println(domainDir);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Domain createNodeWithGroupEncodedIntoNameThenStoreCredentials(String tag, String name, Template template,
|
||||
Map<String, Credentials> credentialStore) {
|
||||
try {
|
||||
String domainName = tag;
|
||||
Domain domain = client.domainLookupByName(domainName);
|
||||
XMLBuilder builder = XMLBuilder.parse(new InputSource(new StringReader(domain.getXMLDesc(0))));
|
||||
Document doc = builder.getDocument();
|
||||
String xpathString = "//devices/disk[@device='disk']/source/@file";
|
||||
XPathExpression expr = XPathFactory.newInstance().newXPath().compile(xpathString);
|
||||
NodeList nodes = (NodeList) expr.evaluate(doc, XPathConstants.NODESET);
|
||||
String diskFileName = nodes.item(0).getNodeValue();
|
||||
StorageVol storageVol = client.storageVolLookupByPath(diskFileName);
|
||||
|
||||
// cloning volume
|
||||
String poolName = storageVol.storagePoolLookupByVolume().getName();
|
||||
StoragePool storagePool = client.storagePoolLookupByName(poolName);
|
||||
StorageVol clonedVol = null;
|
||||
boolean cloned = false;
|
||||
int retry = 0;
|
||||
while (!cloned && retry < 10) {
|
||||
try {
|
||||
clonedVol = cloneVolume(storagePool, storageVol);
|
||||
cloned = true;
|
||||
} catch (LibvirtException e) {
|
||||
retry++;
|
||||
Thread.sleep(1000);
|
||||
}
|
||||
}
|
||||
// define Domain
|
||||
String xmlFinal = generateClonedDomainXML(domain.getXMLDesc(0), clonedVol);
|
||||
Domain newDomain = client.domainDefineXML(xmlFinal);
|
||||
newDomain.create();
|
||||
// store the credentials so that later functions can use them
|
||||
credentialStore.put(domain.getUUIDString() + "", new Credentials("identity", "credential"));
|
||||
return newDomain;
|
||||
} catch (LibvirtException e) {
|
||||
throw Throwables.propagate(e);
|
||||
} catch (Exception e) {
|
||||
throw Throwables.propagate(e);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public Iterable<Domain> listHardwareProfiles() {
|
||||
return listNodes();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Iterable<Image> listImages() {
|
||||
int i = 1;
|
||||
try {
|
||||
String[] domains = client.listDefinedDomains();
|
||||
List<Image> images = Lists.newArrayList();
|
||||
for (String domainName : domains) {
|
||||
images.add(new Image(i++, domainName));
|
||||
}
|
||||
return images;
|
||||
} catch (Exception e) {
|
||||
throw Throwables.propagate(e);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public Iterable<Domain> listNodes() {
|
||||
try {
|
||||
List<Domain> domains = Lists.newArrayList();
|
||||
for (String domain : client.listDefinedDomains()) {
|
||||
domains.add(client.domainLookupByName(domain));
|
||||
}
|
||||
return domains;
|
||||
} catch (LibvirtException e) {
|
||||
throw Throwables.propagate(e);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public Iterable<Location> listLocations() {
|
||||
return ImmutableSet.of();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Domain getNode(String id) {
|
||||
Domain d = null;
|
||||
try {
|
||||
d = client.domainLookupByUUIDString(id);
|
||||
} catch (LibvirtException e) {
|
||||
if (e.getMessage().indexOf("Domain not found: no domain with matching uuid") != -1)
|
||||
return null;
|
||||
Throwables.propagate(e);
|
||||
}
|
||||
return d;
|
||||
}
|
||||
|
||||
@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) {
|
||||
Throwables.propagate(e);
|
||||
} catch (Exception e) {
|
||||
Throwables.propagate(e);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void rebootNode(String id) {
|
||||
try {
|
||||
client.domainLookupByUUIDString(id).reboot(0);
|
||||
} catch (LibvirtException e) {
|
||||
Throwables.propagate(e);
|
||||
}
|
||||
}
|
||||
|
||||
private static StorageVol cloneVolume(StoragePool storagePool, StorageVol from) throws LibvirtException,
|
||||
XPathExpressionException, ParserConfigurationException, SAXException, IOException, TransformerException {
|
||||
return storagePool.storageVolCreateXMLFrom(generateClonedVolumeXML(from.getXMLDesc(0)), from, 0);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void resumeNode(String id) {
|
||||
try {
|
||||
client.domainLookupByUUIDString(id).resume();
|
||||
} catch (LibvirtException e) {
|
||||
Throwables.propagate(e);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void suspendNode(String id) {
|
||||
try {
|
||||
client.domainLookupByUUIDString(id).suspend();
|
||||
} catch (LibvirtException e) {
|
||||
Throwables.propagate(e);
|
||||
}
|
||||
}
|
||||
|
||||
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,76 +0,0 @@
|
|||
/**
|
||||
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||
* contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. jclouds licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
package org.jclouds.libvirt.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.libvirt.Connect;
|
||||
import org.testng.annotations.Test;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Adrian Cole
|
||||
*
|
||||
*/
|
||||
@Test(groups = "unit")
|
||||
public class LibvirtComputeServiceContextBuilderTest {
|
||||
|
||||
@Test
|
||||
public void testCanBuildWithComputeService() {
|
||||
ComputeServiceContext context = new ComputeServiceContextFactory()
|
||||
.createContext(new LibvirtComputeServiceContextSpec("test:///default", "identity", "credential"));
|
||||
// System.err.println(context.getComputeService().
|
||||
context.close();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCanBuildWithRestProperties() {
|
||||
Properties restProperties = new Properties();
|
||||
restProperties.setProperty("libvirt.contextbuilder", LibvirtComputeServiceContextBuilder.class.getName());
|
||||
restProperties.setProperty("libvirt.propertiesbuilder", LibvirtPropertiesBuilder.class.getName());
|
||||
restProperties.setProperty("libvirt.endpoint", "test:///default");
|
||||
|
||||
ComputeServiceContext context = new ComputeServiceContextFactory(restProperties).createContext("libvirt",
|
||||
"identity", "credential");
|
||||
|
||||
context.close();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testProviderSpecificContextIsCorrectType() {
|
||||
Properties restProperties = new Properties();
|
||||
restProperties.setProperty("libvirt.contextbuilder", LibvirtComputeServiceContextBuilder.class.getName());
|
||||
restProperties.setProperty("libvirt.propertiesbuilder", LibvirtPropertiesBuilder.class.getName());
|
||||
restProperties.setProperty("libvirt.endpoint", "test:///default");
|
||||
|
||||
ComputeServiceContext context = new ComputeServiceContextFactory(restProperties).createContext("libvirt",
|
||||
"identity", "credential");
|
||||
|
||||
RestContext<Connect, Connect> providerContext = context.getProviderSpecificContext();
|
||||
|
||||
assertEquals(providerContext.getApi().getClass(), Connect.class);
|
||||
|
||||
context.close();
|
||||
}
|
||||
}
|
|
@ -1,73 +0,0 @@
|
|||
/**
|
||||
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||
* contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. jclouds licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
package org.jclouds.libvirt.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.libvirt.Connect;
|
||||
import org.testng.annotations.Test;
|
||||
|
||||
/**
|
||||
* @author Adrian Cole
|
||||
*/
|
||||
@Test(groups = "live", enabled = true, sequential = true)
|
||||
public class LibvirtComputeServiceLiveTest extends BaseComputeServiceLiveTest {
|
||||
public LibvirtComputeServiceLiveTest() {
|
||||
provider = "libvirt";
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Properties setupRestProperties() {
|
||||
Properties restProperties = new Properties();
|
||||
restProperties.setProperty("libvirt.contextbuilder", LibvirtComputeServiceContextBuilder.class.getName());
|
||||
restProperties.setProperty("libvirt.propertiesbuilder", LibvirtPropertiesBuilder.class.getName());
|
||||
restProperties.setProperty("libvirt.endpoint", "test:///default");
|
||||
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<Connect, Connect> goGridContext = new ComputeServiceContextFactory().createContext(provider,
|
||||
identity, credential).getProviderSpecificContext();
|
||||
}
|
||||
}
|
|
@ -1,95 +0,0 @@
|
|||
/**
|
||||
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||
* contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. jclouds licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
package org.jclouds.libvirt.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.NodeMetadata;
|
||||
import org.jclouds.compute.domain.Template;
|
||||
import org.jclouds.libvirt.compute.LibvirtComputeServiceContextSpec;
|
||||
import org.testng.annotations.BeforeClass;
|
||||
import org.testng.annotations.Test;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Adrian Cole
|
||||
*/
|
||||
@Test(groups = "live")
|
||||
public class LibvirtExperimentLiveTest {
|
||||
protected String provider = "libvirt";
|
||||
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 + ".api-version");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testAndExperiment() {
|
||||
ComputeServiceContext context = null;
|
||||
try {
|
||||
context = new ComputeServiceContextFactory().createContext(new LibvirtComputeServiceContextSpec(
|
||||
"qemu:///system", "identity", "credential"));
|
||||
|
||||
|
||||
/*
|
||||
* /* System.out.println("images " + context.getComputeService().listImages());
|
||||
* System.out.println("nodes " + context.getComputeService().listNodes());
|
||||
* System.out.println("hardware profiles " +
|
||||
* context.getComputeService().listHardwareProfiles());
|
||||
*/
|
||||
|
||||
|
||||
/* Template defaultTemplate = context.getComputeService().templateBuilder()
|
||||
.hardwareId("d106ae67-5a1b-8f91-b311-83c93bcb0a1f").imageId("1") //.locationId("")
|
||||
.build();*/
|
||||
|
||||
|
||||
/*
|
||||
* 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
|
||||
*/
|
||||
|
||||
Set<? extends NodeMetadata> nodeMetadataSet = context.getComputeService().createNodesInGroup("tty", 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,117 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!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>
|
|
@ -1,25 +0,0 @@
|
|||
====
|
||||
Licensed to jclouds, Inc. (jclouds) under one or more
|
||||
contributor license agreements. See the NOTICE file
|
||||
distributed with this work for additional information
|
||||
regarding copyright ownership. jclouds licenses this file
|
||||
to you under the Apache License, Version 2.0 (the
|
||||
"License"); you may not use this file except in compliance
|
||||
with the License. You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing,
|
||||
software distributed under the License is distributed on an
|
||||
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
KIND, either express or implied. See the License for the
|
||||
specific language governing permissions and limitations
|
||||
under the License.
|
||||
====
|
||||
|
||||
#
|
||||
# The jclouds provider for the Nirvanix Storage Delivery Network (http://www.nirvanix.com/products-services/storage-delivery-network/index.aspx).
|
||||
#
|
||||
# TODO: Implementation status.
|
||||
# TODO: Supported features.
|
||||
# TODO: Usage example.
|
|
@ -1,126 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!--
|
||||
|
||||
Licensed to jclouds, Inc. (jclouds) under one or more
|
||||
contributor license agreements. See the NOTICE file
|
||||
distributed with this work for additional information
|
||||
regarding copyright ownership. jclouds licenses this file
|
||||
to you under the Apache License, Version 2.0 (the
|
||||
"License"); you may not use this file except in compliance
|
||||
with the License. You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing,
|
||||
software distributed under the License is distributed on an
|
||||
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
KIND, either express or implied. See the License for the
|
||||
specific language governing permissions and limitations
|
||||
under the License.
|
||||
|
||||
-->
|
||||
<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.6.0-SNAPSHOT</version>
|
||||
<relativePath>../../project/pom.xml</relativePath>
|
||||
</parent>
|
||||
<groupId>org.jclouds.provider</groupId>
|
||||
<artifactId>nirvanix</artifactId>
|
||||
<name>jclouds nirvanix storage delivery network core</name>
|
||||
<description>jclouds Core components to access nirvanix nirvanix</description>
|
||||
<packaging>bundle</packaging>
|
||||
|
||||
<!-- bootstrapping: need to fetch the project POM -->
|
||||
<repositories>
|
||||
<repository>
|
||||
<id>jclouds-sona-snapshots-nexus</id>
|
||||
<url>https://oss.sonatype.org/content/repositories/snapshots</url>
|
||||
<snapshots>
|
||||
<enabled>true</enabled>
|
||||
</snapshots>
|
||||
</repository>
|
||||
</repositories>
|
||||
|
||||
<properties>
|
||||
<test.nirvanix.endpoint>http://services.nirvanix.com</test.nirvanix.endpoint>
|
||||
<test.nirvanix.api-version>2.5.6</test.nirvanix.api-version>
|
||||
<test.nirvanix.build-version></test.nirvanix.build-version>
|
||||
<test.nirvanix.identity>FIXME</test.nirvanix.identity>
|
||||
<test.nirvanix.credential> FIXME </test.nirvanix.credential>
|
||||
|
||||
<jclouds.osgi.export>org.jclouds.nirvanix.sdn*;version="${project.version}"</jclouds.osgi.export>
|
||||
<jclouds.osgi.import>org.jclouds*;version="${project.version}",*</jclouds.osgi.import>
|
||||
</properties>
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>org.jclouds</groupId>
|
||||
<artifactId>jclouds-core</artifactId>
|
||||
<version>${project.version}</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-blobstore</artifactId>
|
||||
<version>${project.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.jclouds</groupId>
|
||||
<artifactId>jclouds-blobstore</artifactId>
|
||||
<version>${project.version}</version>
|
||||
<type>test-jar</type>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>log4j</groupId>
|
||||
<artifactId>log4j</artifactId>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.jclouds.driver</groupId>
|
||||
<artifactId>jclouds-log4j</artifactId>
|
||||
<version>${project.version}</version>
|
||||
<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>
|
||||
<systemPropertyVariables>
|
||||
<test.nirvanix.endpoint>${test.nirvanix.endpoint}</test.nirvanix.endpoint>
|
||||
<test.nirvanix.api-version>${test.nirvanix.api-version}</test.nirvanix.api-version>
|
||||
<test.nirvanix.build-version>${test.nirvanix.build-version}</test.nirvanix.build-version>
|
||||
<test.nirvanix.identity>${test.nirvanix.identity}</test.nirvanix.identity>
|
||||
<test.nirvanix.credential>${test.nirvanix.credential}</test.nirvanix.credential>
|
||||
</systemPropertyVariables>
|
||||
</configuration>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
</profile>
|
||||
</profiles>
|
||||
|
||||
</project>
|
|
@ -1,112 +0,0 @@
|
|||
/**
|
||||
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||
* contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. jclouds licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
package org.jclouds.nirvanix.sdn;
|
||||
|
||||
import java.net.URI;
|
||||
import java.util.Map;
|
||||
|
||||
import javax.ws.rs.GET;
|
||||
import javax.ws.rs.POST;
|
||||
import javax.ws.rs.Path;
|
||||
import javax.ws.rs.PathParam;
|
||||
import javax.ws.rs.QueryParam;
|
||||
|
||||
import org.jclouds.blobstore.binders.BindBlobToMultipartForm;
|
||||
import org.jclouds.blobstore.domain.Blob;
|
||||
import org.jclouds.nirvanix.sdn.binders.BindMetadataToQueryParams;
|
||||
import org.jclouds.nirvanix.sdn.domain.UploadInfo;
|
||||
import org.jclouds.nirvanix.sdn.filters.AddSessionTokenToRequest;
|
||||
import org.jclouds.nirvanix.sdn.filters.InsertUserContextIntoPath;
|
||||
import org.jclouds.nirvanix.sdn.functions.ParseMetadataFromJsonResponse;
|
||||
import org.jclouds.nirvanix.sdn.functions.ParseUploadInfoFromJsonResponse;
|
||||
import org.jclouds.nirvanix.sdn.reference.SDNQueryParams;
|
||||
import org.jclouds.rest.annotations.BinderParam;
|
||||
import org.jclouds.rest.annotations.EndpointParam;
|
||||
import org.jclouds.rest.annotations.OverrideRequestFilters;
|
||||
import org.jclouds.rest.annotations.QueryParams;
|
||||
import org.jclouds.rest.annotations.RequestFilters;
|
||||
import org.jclouds.rest.annotations.ResponseParser;
|
||||
import org.jclouds.rest.annotations.SkipEncoding;
|
||||
|
||||
import com.google.common.util.concurrent.ListenableFuture;
|
||||
import com.google.inject.Provides;
|
||||
|
||||
/**
|
||||
* Provides asynchronous access to Nirvanix SDN resources via their REST API.
|
||||
* <p/>
|
||||
*
|
||||
* @see SDNClient
|
||||
* @see <a href="http://developer.nirvanix.com/sitefiles/1000/API.html" />
|
||||
* @author Adrian Cole
|
||||
*/
|
||||
@RequestFilters(AddSessionTokenToRequest.class)
|
||||
@SkipEncoding( { '/', ':' })
|
||||
@QueryParams(keys = SDNQueryParams.OUTPUT, values = "json")
|
||||
public interface SDNAsyncClient {
|
||||
@Provides
|
||||
public Blob newBlob();
|
||||
|
||||
/**
|
||||
* @see SDNClient#getStorageNode
|
||||
*/
|
||||
@GET
|
||||
@Path("/ws/IMFS/GetStorageNode.ashx")
|
||||
@ResponseParser(ParseUploadInfoFromJsonResponse.class)
|
||||
ListenableFuture<UploadInfo> getStorageNode(
|
||||
@QueryParam(SDNQueryParams.DESTFOLDERPATH) String folderPath,
|
||||
@QueryParam(SDNQueryParams.SIZEBYTES) long size);
|
||||
|
||||
/**
|
||||
* @see SDNClient#upload
|
||||
*/
|
||||
@POST
|
||||
@Path("/Upload.ashx")
|
||||
ListenableFuture<Void> upload(@EndpointParam URI endpoint,
|
||||
@QueryParam(SDNQueryParams.UPLOADTOKEN) String uploadToken,
|
||||
@QueryParam(SDNQueryParams.DESTFOLDERPATH) String folderPath,
|
||||
@BinderParam(BindBlobToMultipartForm.class) Blob blob);
|
||||
|
||||
/**
|
||||
* @see SDNClient#setMetadata
|
||||
*/
|
||||
@GET
|
||||
@Path("/ws/Metadata/SetMetadata.ashx")
|
||||
@QueryParams(keys = SDNQueryParams.PATH, values = "{path}")
|
||||
ListenableFuture<Void> setMetadata(@PathParam("path") String path,
|
||||
@BinderParam(BindMetadataToQueryParams.class) Map<String, String> metadata);
|
||||
|
||||
/**
|
||||
* @see SDNClient#getMetadata
|
||||
*/
|
||||
@GET
|
||||
@Path("/ws/Metadata/GetMetadata.ashx")
|
||||
@ResponseParser(ParseMetadataFromJsonResponse.class)
|
||||
@QueryParams(keys = SDNQueryParams.PATH, values = "{path}")
|
||||
ListenableFuture<Map<String, String>> getMetadata(@PathParam("path") String path);
|
||||
|
||||
/**
|
||||
* @see SDNClient#getFile
|
||||
*/
|
||||
@GET
|
||||
@Path("/{path}")
|
||||
@OverrideRequestFilters
|
||||
@RequestFilters(InsertUserContextIntoPath.class)
|
||||
ListenableFuture<String> getFile(@PathParam("path") String path);
|
||||
|
||||
}
|
|
@ -1,53 +0,0 @@
|
|||
/**
|
||||
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||
* contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. jclouds licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
package org.jclouds.nirvanix.sdn;
|
||||
|
||||
import javax.ws.rs.GET;
|
||||
import javax.ws.rs.Path;
|
||||
import javax.ws.rs.QueryParam;
|
||||
|
||||
import org.jclouds.nirvanix.sdn.functions.ParseSessionTokenFromJsonResponse;
|
||||
import org.jclouds.nirvanix.sdn.reference.SDNQueryParams;
|
||||
import org.jclouds.rest.annotations.QueryParams;
|
||||
import org.jclouds.rest.annotations.ResponseParser;
|
||||
|
||||
import com.google.common.util.concurrent.ListenableFuture;
|
||||
|
||||
/**
|
||||
* Provides asynchronous access to Nirvanix SDN resources via their REST API.
|
||||
* <p/>
|
||||
*
|
||||
* @see <a href="http://developer.nirvanix.com/sitefiles/1000/API.html" />
|
||||
* @author Adrian Cole
|
||||
*/
|
||||
@QueryParams(keys = SDNQueryParams.OUTPUT, values = "json")
|
||||
public interface SDNAuthAsyncClient {
|
||||
|
||||
public interface AuthenticationResponse {
|
||||
@SessionToken
|
||||
String getSessionToken();
|
||||
}
|
||||
|
||||
@GET
|
||||
@ResponseParser(ParseSessionTokenFromJsonResponse.class)
|
||||
@Path("/ws/Authentication/Login.ashx")
|
||||
ListenableFuture<String> authenticate(@QueryParam(SDNQueryParams.APPKEY) String appKey,
|
||||
@QueryParam(SDNQueryParams.USERNAME) String user,
|
||||
@QueryParam(SDNQueryParams.PASSWORD) String password);
|
||||
}
|
|
@ -1,67 +0,0 @@
|
|||
/**
|
||||
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||
* contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. jclouds licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
package org.jclouds.nirvanix.sdn;
|
||||
|
||||
import java.net.URI;
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
import org.jclouds.blobstore.domain.Blob;
|
||||
import org.jclouds.concurrent.Timeout;
|
||||
import org.jclouds.nirvanix.sdn.domain.UploadInfo;
|
||||
|
||||
import com.google.inject.Provides;
|
||||
|
||||
/**
|
||||
* Provides access to Nirvanix SDN resources via their REST API.
|
||||
* <p/>
|
||||
*
|
||||
* @see <a href="http://developer.nirvanix.com/sitefiles/1000/API.html" />
|
||||
* @see SDNAsyncClient
|
||||
* @author Adrian Cole
|
||||
*/
|
||||
@Timeout(duration = 30, timeUnit = TimeUnit.SECONDS)
|
||||
public interface SDNClient {
|
||||
@Provides
|
||||
public Blob newBlob();
|
||||
|
||||
/**
|
||||
* The GetStorageNode method is used to determine which storage node a file should be uploaded
|
||||
* to. It returns the host to upload to and an Upload Token that will be used to authenticate.
|
||||
*/
|
||||
UploadInfo getStorageNode(String folderPath, long size);
|
||||
|
||||
void upload(URI endpoint, String uploadToken, String folderPath, Blob blob);
|
||||
|
||||
/**
|
||||
* The SetMetadata method is used to set specified metadata for a file or folder.
|
||||
*/
|
||||
void setMetadata(String path, Map<String, String> metadata);
|
||||
|
||||
/**
|
||||
* The GetMetadata method is used to retrieve all metadata from a file or folder.
|
||||
*/
|
||||
Map<String, String> getMetadata(String path);
|
||||
|
||||
/**
|
||||
* Get the contents of a file
|
||||
*/
|
||||
String getFile(String path);
|
||||
|
||||
}
|
|
@ -1,46 +0,0 @@
|
|||
/**
|
||||
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||
* contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. jclouds licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
package org.jclouds.nirvanix.sdn;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Properties;
|
||||
|
||||
import org.jclouds.nirvanix.sdn.config.SDNAuthRestClientModule;
|
||||
import org.jclouds.nirvanix.sdn.config.SDNRestClientModule;
|
||||
import org.jclouds.rest.RestContextBuilder;
|
||||
|
||||
import com.google.inject.Module;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Adrian Cole
|
||||
*/
|
||||
public class SDNContextBuilder extends RestContextBuilder<SDNClient, SDNAsyncClient> {
|
||||
|
||||
public SDNContextBuilder(Properties props) {
|
||||
super(SDNClient.class, SDNAsyncClient.class, props);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void addClientModule(List<Module> modules) {
|
||||
modules.add(new SDNAuthRestClientModule());
|
||||
modules.add(new SDNRestClientModule());
|
||||
}
|
||||
|
||||
}
|
|
@ -1,45 +0,0 @@
|
|||
/**
|
||||
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||
* contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. jclouds licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
package org.jclouds.nirvanix.sdn;
|
||||
|
||||
import java.util.Properties;
|
||||
|
||||
import org.jclouds.Constants;
|
||||
import org.jclouds.PropertiesBuilder;
|
||||
|
||||
/**
|
||||
* Builds properties used in SDN Clients
|
||||
*
|
||||
* @author Adrian Cole
|
||||
*/
|
||||
public class SDNPropertiesBuilder extends PropertiesBuilder {
|
||||
|
||||
@Override
|
||||
protected Properties defaultProperties() {
|
||||
Properties properties = super.defaultProperties();
|
||||
properties.setProperty(Constants.PROPERTY_API_VERSION, "2.5.6");
|
||||
properties.setProperty(Constants.PROPERTY_ENDPOINT, "http://services.nirvanix.com");
|
||||
return properties;
|
||||
}
|
||||
|
||||
public SDNPropertiesBuilder(Properties properties) {
|
||||
super(properties);
|
||||
}
|
||||
|
||||
}
|
|
@ -1,39 +0,0 @@
|
|||
/**
|
||||
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||
* contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. jclouds licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
package org.jclouds.nirvanix.sdn;
|
||||
|
||||
import java.lang.annotation.ElementType;
|
||||
import java.lang.annotation.Retention;
|
||||
import java.lang.annotation.RetentionPolicy;
|
||||
import java.lang.annotation.Target;
|
||||
|
||||
import javax.inject.Qualifier;
|
||||
|
||||
/**
|
||||
* Related to a SDN resource.
|
||||
*
|
||||
* @author Adrian Cole
|
||||
*
|
||||
*/
|
||||
@Retention(value = RetentionPolicy.RUNTIME)
|
||||
@Target(value = { ElementType.FIELD, ElementType.PARAMETER, ElementType.METHOD })
|
||||
@Qualifier
|
||||
public @interface SessionToken {
|
||||
|
||||
}
|
|
@ -1,58 +0,0 @@
|
|||
/**
|
||||
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||
* contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. jclouds licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
package org.jclouds.nirvanix.sdn.binders;
|
||||
|
||||
import static com.google.common.base.Preconditions.checkArgument;
|
||||
import static com.google.common.base.Preconditions.checkNotNull;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Map.Entry;
|
||||
|
||||
import javax.inject.Inject;
|
||||
import javax.inject.Provider;
|
||||
import javax.inject.Singleton;
|
||||
import javax.ws.rs.core.UriBuilder;
|
||||
|
||||
import org.jclouds.http.HttpRequest;
|
||||
import org.jclouds.http.utils.ModifyRequest;
|
||||
import org.jclouds.rest.Binder;
|
||||
|
||||
import com.google.common.collect.Lists;
|
||||
|
||||
@Singleton
|
||||
public class BindMetadataToQueryParams implements Binder {
|
||||
private final Provider<UriBuilder> builder;
|
||||
|
||||
@Inject
|
||||
BindMetadataToQueryParams(Provider<UriBuilder> builder) {
|
||||
this.builder = builder;
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
public <R extends HttpRequest> R bindToRequest(R request, Object input) {
|
||||
checkArgument(checkNotNull(input, "input") instanceof Map, "this binder is only valid for Maps!");
|
||||
Map<String, String> userMetadata = (Map<String, String>) input;
|
||||
List<String> metadata = Lists.newArrayList();
|
||||
for (Entry<String, String> entry : userMetadata.entrySet()) {
|
||||
metadata.add(String.format("%s:%s", entry.getKey().toLowerCase(), entry.getValue()));
|
||||
}
|
||||
return ModifyRequest.addQueryParam(request, "metadata", metadata, builder.get());
|
||||
}
|
||||
}
|
|
@ -1,97 +0,0 @@
|
|||
/**
|
||||
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||
* contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. jclouds licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
package org.jclouds.nirvanix.sdn.config;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.concurrent.ExecutionException;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
import java.util.concurrent.TimeoutException;
|
||||
|
||||
import javax.inject.Named;
|
||||
import javax.inject.Singleton;
|
||||
|
||||
import org.jclouds.Constants;
|
||||
import org.jclouds.http.RequiresHttp;
|
||||
import org.jclouds.nirvanix.sdn.SDNAuthAsyncClient;
|
||||
import org.jclouds.nirvanix.sdn.SessionToken;
|
||||
import org.jclouds.nirvanix.sdn.reference.SDNConstants;
|
||||
import org.jclouds.rest.AsyncClientFactory;
|
||||
|
||||
import com.google.common.base.Splitter;
|
||||
import com.google.common.collect.Lists;
|
||||
import com.google.inject.AbstractModule;
|
||||
import com.google.inject.Provides;
|
||||
|
||||
/**
|
||||
* Configures the SDN authentication service connection, including logging and http transport.
|
||||
*
|
||||
* @author Adrian Cole
|
||||
*/
|
||||
@RequiresHttp
|
||||
public class SDNAuthRestClientModule extends AbstractModule {
|
||||
|
||||
@Override
|
||||
protected void configure() {
|
||||
}
|
||||
|
||||
@Provides
|
||||
@Singleton
|
||||
@Named(SDNConstants.PROPERTY_SDN_APPKEY)
|
||||
public String credentials1(@Named(Constants.PROPERTY_IDENTITY) String identity) {
|
||||
List<String> parts = Lists.newArrayList(Splitter.on('/').split(identity));
|
||||
if (parts.size() != 3) {
|
||||
throw new IllegalArgumentException("identity syntax is appkey/appname/username");
|
||||
}
|
||||
return parts.get(0);
|
||||
}
|
||||
|
||||
@Provides
|
||||
@Singleton
|
||||
@Named(SDNConstants.PROPERTY_SDN_APPNAME)
|
||||
public String credentials2(@Named(Constants.PROPERTY_IDENTITY) String identity) {
|
||||
List<String> parts = Lists.newArrayList(Splitter.on('/').split(identity));
|
||||
if (parts.size() != 3) {
|
||||
throw new IllegalArgumentException("identity syntax is appkey/appname/username");
|
||||
}
|
||||
return parts.get(1);
|
||||
}
|
||||
|
||||
@Provides
|
||||
@Singleton
|
||||
@Named(SDNConstants.PROPERTY_SDN_USERNAME)
|
||||
public String credentials3(@Named(Constants.PROPERTY_IDENTITY) String identity) {
|
||||
List<String> parts = Lists.newArrayList(Splitter.on('/').split(identity));
|
||||
if (parts.size() != 3) {
|
||||
throw new IllegalArgumentException("identity syntax is appkey/appname/username");
|
||||
}
|
||||
return parts.get(2);
|
||||
}
|
||||
|
||||
@Provides
|
||||
@SessionToken
|
||||
protected String provideSessionToken(AsyncClientFactory factory,
|
||||
@Named(SDNConstants.PROPERTY_SDN_APPKEY) String appKey,
|
||||
@Named(SDNConstants.PROPERTY_SDN_USERNAME) String username,
|
||||
@Named(Constants.PROPERTY_CREDENTIAL) String password) throws InterruptedException,
|
||||
ExecutionException, TimeoutException {
|
||||
return factory.create(SDNAuthAsyncClient.class).authenticate(appKey, username, password).get(
|
||||
20, TimeUnit.SECONDS);
|
||||
}
|
||||
|
||||
}
|
|
@ -1,50 +0,0 @@
|
|||
/**
|
||||
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||
* contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. jclouds licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
package org.jclouds.nirvanix.sdn.config;
|
||||
|
||||
import org.jclouds.blobstore.config.BlobStoreObjectModule;
|
||||
import org.jclouds.http.RequiresHttp;
|
||||
import org.jclouds.nirvanix.sdn.SDNAsyncClient;
|
||||
import org.jclouds.nirvanix.sdn.SDNClient;
|
||||
import org.jclouds.rest.config.RestClientModule;
|
||||
|
||||
/**
|
||||
* Configures the SDN authentication service connection, including logging and http transport.
|
||||
*
|
||||
* @author Adrian Cole
|
||||
*/
|
||||
@RequiresHttp
|
||||
public class SDNRestClientModule extends RestClientModule<SDNClient, SDNAsyncClient> {
|
||||
|
||||
public SDNRestClientModule() {
|
||||
super(SDNClient.class, SDNAsyncClient.class);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void configure() {
|
||||
install(new BlobStoreObjectModule());
|
||||
super.configure();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void bindRetryHandlers() {
|
||||
// TODO retry on 401 by AuthenticateRequest.update()
|
||||
}
|
||||
|
||||
}
|
|
@ -1,40 +0,0 @@
|
|||
/**
|
||||
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||
* contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. jclouds licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
package org.jclouds.nirvanix.sdn.domain;
|
||||
|
||||
import java.net.URI;
|
||||
|
||||
public class UploadInfo {
|
||||
private final String token;
|
||||
private final URI host;
|
||||
|
||||
public UploadInfo(String token, URI host) {
|
||||
this.token = token;
|
||||
this.host = host;
|
||||
}
|
||||
|
||||
public String getToken() {
|
||||
return token;
|
||||
}
|
||||
|
||||
public URI getHost() {
|
||||
return host;
|
||||
}
|
||||
|
||||
}
|
|
@ -1,95 +0,0 @@
|
|||
/**
|
||||
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||
* contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. jclouds licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
package org.jclouds.nirvanix.sdn.filters;
|
||||
|
||||
import java.util.concurrent.atomic.AtomicLong;
|
||||
import java.util.concurrent.atomic.AtomicReference;
|
||||
|
||||
import javax.inject.Inject;
|
||||
import javax.inject.Provider;
|
||||
import javax.inject.Singleton;
|
||||
import javax.ws.rs.core.UriBuilder;
|
||||
|
||||
import com.google.commons.util.concurrent.Atomitcs;
|
||||
|
||||
import org.jclouds.http.HttpException;
|
||||
import org.jclouds.http.HttpRequest;
|
||||
import org.jclouds.http.HttpRequestFilter;
|
||||
import org.jclouds.http.utils.ModifyRequest;
|
||||
import org.jclouds.nirvanix.sdn.SessionToken;
|
||||
import org.jclouds.nirvanix.sdn.reference.SDNQueryParams;
|
||||
|
||||
/**
|
||||
* Adds the Session Token to the request. This will update the Session Token before 20 minutes is
|
||||
* up.
|
||||
*
|
||||
* @author Adrian Cole
|
||||
*
|
||||
*/
|
||||
@Singleton
|
||||
public class AddSessionTokenToRequest implements HttpRequestFilter {
|
||||
|
||||
private final Provider<String> authTokenProvider;
|
||||
private final Provider<UriBuilder> builder;
|
||||
|
||||
public final long BILLION = 1000000000;
|
||||
public final long MINUTES = 60 * BILLION;
|
||||
|
||||
private final AtomicReference<String> authToken;
|
||||
private final AtomicLong trigger = new AtomicLong(0);
|
||||
|
||||
/**
|
||||
* Start the time update service. Nirvanix clocks need to be 20 minutes of the session token.
|
||||
* This is not performed per-request, as creation of the token is a slow, synchronized command.
|
||||
*/
|
||||
synchronized void updateIfTimeOut() {
|
||||
|
||||
if (trigger.get() - System.nanoTime() <= 0) {
|
||||
createNewToken();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// this is a hotspot when submitted concurrently, so be lazy.
|
||||
// session tokens expire in 20 minutes of no use, but let's be a little paranoid and go 19
|
||||
public String createNewToken() {
|
||||
authToken.set(authTokenProvider.get());
|
||||
trigger.set(System.nanoTime() + System.nanoTime() + 19 * MINUTES);
|
||||
return authToken.get();
|
||||
|
||||
}
|
||||
|
||||
public String getSessionToken() {
|
||||
updateIfTimeOut();
|
||||
return authToken.get();
|
||||
}
|
||||
|
||||
@Inject
|
||||
public AddSessionTokenToRequest(@SessionToken Provider<String> authTokenProvider, Provider<UriBuilder> builder) {
|
||||
this.builder = builder;
|
||||
this.authTokenProvider = authTokenProvider;
|
||||
authToken = Atomics.newReference();
|
||||
}
|
||||
|
||||
@Override
|
||||
public HttpRequest filter(HttpRequest request) throws HttpException {
|
||||
return ModifyRequest.addQueryParam(request, SDNQueryParams.SESSIONTOKEN, getSessionToken(), builder.get());
|
||||
}
|
||||
|
||||
}
|
|
@ -1,71 +0,0 @@
|
|||
/**
|
||||
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||
* contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. jclouds licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
package org.jclouds.nirvanix.sdn.filters;
|
||||
|
||||
import java.net.URI;
|
||||
|
||||
import javax.inject.Inject;
|
||||
import javax.inject.Named;
|
||||
import javax.inject.Provider;
|
||||
import javax.inject.Singleton;
|
||||
import javax.ws.rs.core.UriBuilder;
|
||||
|
||||
import org.jclouds.http.HttpException;
|
||||
import org.jclouds.http.HttpRequest;
|
||||
import org.jclouds.http.HttpRequestFilter;
|
||||
import org.jclouds.nirvanix.sdn.reference.SDNConstants;
|
||||
|
||||
/**
|
||||
* Adds the Session Token to the request. This will update the Session Token before 20 minutes is
|
||||
* up.
|
||||
*
|
||||
* @author Adrian Cole
|
||||
*
|
||||
*/
|
||||
@Singleton
|
||||
public class InsertUserContextIntoPath implements HttpRequestFilter {
|
||||
|
||||
private final AddSessionTokenToRequest sessionManager;
|
||||
private final String pathPrefix;
|
||||
private final Provider<UriBuilder> builder;
|
||||
|
||||
@Inject
|
||||
public InsertUserContextIntoPath(AddSessionTokenToRequest sessionManager,
|
||||
@Named(SDNConstants.PROPERTY_SDN_APPNAME) String appname,
|
||||
@Named(SDNConstants.PROPERTY_SDN_USERNAME) String username, Provider<UriBuilder> builder) {
|
||||
this.builder = builder;
|
||||
this.sessionManager = sessionManager;
|
||||
this.pathPrefix = String.format("/%s/%s/", appname, username);
|
||||
}
|
||||
|
||||
@Override
|
||||
public HttpRequest filter(HttpRequest request) throws HttpException {
|
||||
String sessionToken = sessionManager.getSessionToken();
|
||||
int prefixIndex = request.getEndpoint().getPath().indexOf(pathPrefix);
|
||||
String path;
|
||||
if (prefixIndex == -1) { // addToken
|
||||
path = "/" + sessionToken + pathPrefix + request.getEndpoint().getPath().substring(1);
|
||||
} else { // replace token
|
||||
path = "/" + sessionToken + request.getEndpoint().getPath().substring(prefixIndex);
|
||||
}
|
||||
URI newEndpoint = builder.get().uri(request.getEndpoint()).replacePath(path).build();
|
||||
return request.toBuilder().endpoint(newEndpoint).build();
|
||||
}
|
||||
|
||||
}
|
|
@ -1,67 +0,0 @@
|
|||
/**
|
||||
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||
* contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. jclouds licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
package org.jclouds.nirvanix.sdn.functions;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import javax.inject.Inject;
|
||||
import javax.inject.Singleton;
|
||||
|
||||
import org.jclouds.http.HttpResponse;
|
||||
import org.jclouds.http.functions.ParseJson;
|
||||
|
||||
import com.google.common.base.Function;
|
||||
import com.google.common.collect.Maps;
|
||||
|
||||
/**
|
||||
* This parses a Map of Metadata from a Nirvanix response
|
||||
*
|
||||
* @author Adrian Cole
|
||||
*/
|
||||
@Singleton
|
||||
public class ParseMetadataFromJsonResponse implements
|
||||
Function<HttpResponse, Map<String, String>> {
|
||||
|
||||
private final ParseJson<Response> json;
|
||||
|
||||
@Inject
|
||||
ParseMetadataFromJsonResponse(ParseJson<Response> json) {
|
||||
this.json = json;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Map<String, String> apply(HttpResponse arg0) {
|
||||
Response response = json.apply(arg0);
|
||||
if (response.ResponseCode == null || response.ResponseCode != 0)
|
||||
throw new RuntimeException("bad response code: "
|
||||
+ response.ResponseCode);
|
||||
Map<String, String> metadata = Maps.newHashMap();
|
||||
for (Map<String, String> keyValue : response.Metadata) {
|
||||
metadata.put(keyValue.get("Type"), keyValue.get("Value"));
|
||||
}
|
||||
return metadata;
|
||||
}
|
||||
|
||||
private static class Response {
|
||||
Integer ResponseCode;
|
||||
List<Map<String, String>> Metadata;
|
||||
}
|
||||
|
||||
}
|
|
@ -1,58 +0,0 @@
|
|||
/**
|
||||
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||
* contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. jclouds licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
package org.jclouds.nirvanix.sdn.functions;
|
||||
|
||||
import javax.inject.Inject;
|
||||
import javax.inject.Singleton;
|
||||
|
||||
import org.jclouds.http.HttpResponse;
|
||||
import org.jclouds.http.functions.ParseJson;
|
||||
|
||||
import com.google.common.base.Function;
|
||||
|
||||
/**
|
||||
* This parses the Nirvanix SessionToken from a gson string.
|
||||
*
|
||||
* @author Adrian Cole
|
||||
*/
|
||||
@Singleton
|
||||
public class ParseSessionTokenFromJsonResponse implements
|
||||
Function<HttpResponse, String> {
|
||||
|
||||
private final ParseJson<Response> json;
|
||||
|
||||
@Inject
|
||||
ParseSessionTokenFromJsonResponse(ParseJson<Response> json) {
|
||||
this.json = json;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String apply(HttpResponse arg0) {
|
||||
Response response = json.apply(arg0);
|
||||
if (response.ResponseCode == null || response.ResponseCode != 0)
|
||||
throw new RuntimeException("bad response code: "
|
||||
+ response.ResponseCode);
|
||||
return response.SessionToken;
|
||||
}
|
||||
|
||||
private static class Response {
|
||||
Integer ResponseCode;
|
||||
String SessionToken;
|
||||
}
|
||||
}
|
|
@ -1,65 +0,0 @@
|
|||
/**
|
||||
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||
* contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. jclouds licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
package org.jclouds.nirvanix.sdn.functions;
|
||||
|
||||
import java.net.URI;
|
||||
import java.util.Map;
|
||||
|
||||
import javax.inject.Inject;
|
||||
import javax.inject.Singleton;
|
||||
|
||||
import org.jclouds.http.HttpResponse;
|
||||
import org.jclouds.http.functions.ParseJson;
|
||||
import org.jclouds.nirvanix.sdn.domain.UploadInfo;
|
||||
|
||||
import com.google.common.base.Function;
|
||||
|
||||
/**
|
||||
* This parses the Nirvanix Upload host and token from a gson string.
|
||||
*
|
||||
* @see UploadInfo
|
||||
* @author Adrian Cole
|
||||
*/
|
||||
@Singleton
|
||||
public class ParseUploadInfoFromJsonResponse implements
|
||||
Function<HttpResponse, UploadInfo> {
|
||||
|
||||
private final ParseJson<Response> json;
|
||||
|
||||
@Inject
|
||||
ParseUploadInfoFromJsonResponse(ParseJson<Response> json) {
|
||||
this.json = json;
|
||||
}
|
||||
|
||||
@Override
|
||||
public UploadInfo apply(HttpResponse arg0) {
|
||||
Response response = json.apply(arg0);
|
||||
if (response.ResponseCode == null || response.ResponseCode != 0)
|
||||
throw new RuntimeException("bad response code: "
|
||||
+ response.ResponseCode);
|
||||
return new UploadInfo(response.GetStorageNode.get("UploadToken"), URI
|
||||
.create("https://" + response.GetStorageNode.get("UploadHost")));
|
||||
}
|
||||
|
||||
private static class Response {
|
||||
Integer ResponseCode;
|
||||
Map<String, String> GetStorageNode;
|
||||
}
|
||||
|
||||
}
|
|
@ -1,30 +0,0 @@
|
|||
/**
|
||||
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||
* contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. jclouds licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
package org.jclouds.nirvanix.sdn.reference;
|
||||
|
||||
/**
|
||||
* Configuration properties and constants used in SDN connections.
|
||||
*
|
||||
* @author Adrian Cole
|
||||
*/
|
||||
public interface SDNConstants {
|
||||
public static final String PROPERTY_SDN_USERNAME = "jclouds.nirvanix.sdn.username";
|
||||
public static final String PROPERTY_SDN_APPKEY = "jclouds.nirvanix.sdn.appkey";
|
||||
public static final String PROPERTY_SDN_APPNAME = "jclouds.nirvanix.sdn.appname";
|
||||
}
|
|
@ -1,38 +0,0 @@
|
|||
/**
|
||||
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||
* contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. jclouds licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
package org.jclouds.nirvanix.sdn.reference;
|
||||
|
||||
/**
|
||||
* Query parameters common to SDN apis.
|
||||
*
|
||||
* @see <a href="http://developer.nirvanix.com/sitefiles/1000/API.html" />
|
||||
* @author Adrian Cole
|
||||
*
|
||||
*/
|
||||
public interface SDNQueryParams {
|
||||
public static final String USERNAME = "username";
|
||||
public static final String PASSWORD = "password";
|
||||
public static final String APPKEY = "appKey";
|
||||
public static final String OUTPUT = "output";
|
||||
public static final String SESSIONTOKEN = "sessionToken";
|
||||
public static final String DESTFOLDERPATH = "destFolderPath";
|
||||
public static final String PATH = "path";
|
||||
public static final String SIZEBYTES = "sizeBytes";
|
||||
public static final String UPLOADTOKEN = "uploadToken";
|
||||
}
|
|
@ -1,188 +0,0 @@
|
|||
/**
|
||||
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||
* contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. jclouds licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
package org.jclouds.nirvanix.sdn;
|
||||
|
||||
import static org.testng.Assert.assertEquals;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.lang.reflect.Method;
|
||||
import java.net.URI;
|
||||
import java.util.Map;
|
||||
import java.util.Properties;
|
||||
|
||||
import org.jclouds.blobstore.binders.BindBlobToMultipartFormTest;
|
||||
import org.jclouds.blobstore.domain.Blob;
|
||||
import org.jclouds.http.HttpRequest;
|
||||
import org.jclouds.http.RequiresHttp;
|
||||
import org.jclouds.http.functions.ReleasePayloadAndReturn;
|
||||
import org.jclouds.http.functions.ReturnStringIf2xx;
|
||||
import org.jclouds.nirvanix.sdn.config.SDNRestClientModule;
|
||||
import org.jclouds.nirvanix.sdn.filters.AddSessionTokenToRequest;
|
||||
import org.jclouds.nirvanix.sdn.filters.InsertUserContextIntoPath;
|
||||
import org.jclouds.nirvanix.sdn.functions.ParseMetadataFromJsonResponse;
|
||||
import org.jclouds.nirvanix.sdn.functions.ParseUploadInfoFromJsonResponse;
|
||||
import org.jclouds.nirvanix.sdn.reference.SDNConstants;
|
||||
import org.jclouds.rest.ConfiguresRestClient;
|
||||
import org.jclouds.rest.RestClientTest;
|
||||
import org.jclouds.rest.RestContextFactory;
|
||||
import org.jclouds.rest.RestContextSpec;
|
||||
import org.jclouds.rest.internal.RestAnnotationProcessor;
|
||||
import org.testng.annotations.Test;
|
||||
|
||||
import com.google.common.collect.ImmutableMap;
|
||||
import com.google.inject.Module;
|
||||
import com.google.inject.TypeLiteral;
|
||||
import com.google.inject.name.Names;
|
||||
|
||||
/**
|
||||
* Tests behavior of {@code JaxrsAnnotationProcessor}
|
||||
*
|
||||
* @author Adrian Cole
|
||||
*/
|
||||
@Test(groups = "unit", testName = "sdn.SDNClient")
|
||||
public class SDNAsyncClientTest extends RestClientTest<SDNAsyncClient> {
|
||||
|
||||
public void testGetStorageNode() throws SecurityException, NoSuchMethodException, IOException {
|
||||
Method method = SDNAsyncClient.class.getMethod("getStorageNode", String.class, long.class);
|
||||
GeneratedHttpRequest request = processor.createRequest(method, "adriansmovies", 734859264);
|
||||
|
||||
assertRequestLineEquals(
|
||||
request,
|
||||
"GET http://services.nirvanix.com/ws/IMFS/GetStorageNode.ashx?output=json&destFolderPath=adriansmovies&sizeBytes=734859264 HTTP/1.1");
|
||||
assertNonPayloadHeadersEqual(request, "");
|
||||
assertPayloadEquals(request, null, null, false);
|
||||
|
||||
assertResponseParserClassEquals(method, request, ParseUploadInfoFromJsonResponse.class);
|
||||
assertSaxResponseParserClassEquals(method, null);
|
||||
assertExceptionParserClassEquals(method, null);
|
||||
|
||||
checkFilters(request);
|
||||
|
||||
}
|
||||
|
||||
public void testUpload() throws SecurityException, NoSuchMethodException, IOException {
|
||||
Method method = SDNAsyncClient.class.getMethod("upload", URI.class, String.class, String.class, Blob.class);
|
||||
Blob blob = BindBlobToMultipartFormTest.TEST_BLOB;
|
||||
GeneratedHttpRequest request = processor.createRequest(method, URI.create("http://uploader"), "token", "adriansmovies",
|
||||
blob);
|
||||
|
||||
assertRequestLineEquals(request,
|
||||
"POST http://uploader/Upload.ashx?output=json&destFolderPath=adriansmovies&uploadToken=token HTTP/1.1");
|
||||
assertNonPayloadHeadersEqual(request, "");
|
||||
StringBuilder expects = new StringBuilder();
|
||||
expects.append("----JCLOUDS--\r\n");
|
||||
expects.append("Content-Disposition: form-data; name=\"hello\"\r\n");
|
||||
expects.append("Content-Type: text/plain\r\n\r\n");
|
||||
expects.append("hello\r\n");
|
||||
expects.append("----JCLOUDS----\r\n");
|
||||
|
||||
assertPayloadEquals(request, expects.toString(), "multipart/form-data; boundary=--JCLOUDS--", false);
|
||||
|
||||
assertResponseParserClassEquals(method, request, ReleasePayloadAndReturn.class);
|
||||
assertSaxResponseParserClassEquals(method, null);
|
||||
assertExceptionParserClassEquals(method, null);
|
||||
|
||||
checkFilters(request);
|
||||
}
|
||||
|
||||
public void testSetMetadata() throws SecurityException, NoSuchMethodException, IOException {
|
||||
Method method = SDNAsyncClient.class.getMethod("setMetadata", String.class, Map.class);
|
||||
GeneratedHttpRequest request = processor.createRequest(method, "adriansmovies/sushi.avi", ImmutableMap.of("Chef",
|
||||
"Kawasaki"));
|
||||
|
||||
assertRequestLineEquals(
|
||||
request,
|
||||
"GET http://services.nirvanix.com/ws/Metadata/SetMetadata.ashx?output=json&path=adriansmovies/sushi.avi&metadata=chef:Kawasaki HTTP/1.1");
|
||||
assertNonPayloadHeadersEqual(request, "");
|
||||
assertPayloadEquals(request, null, null, false);
|
||||
|
||||
assertResponseParserClassEquals(method, request, ReleasePayloadAndReturn.class);
|
||||
assertSaxResponseParserClassEquals(method, null);
|
||||
assertExceptionParserClassEquals(method, null);
|
||||
|
||||
checkFilters(request);
|
||||
}
|
||||
|
||||
public void testGetMetadata() throws SecurityException, NoSuchMethodException, IOException {
|
||||
Method method = SDNAsyncClient.class.getMethod("getMetadata", String.class);
|
||||
GeneratedHttpRequest request = processor.createRequest(method, "adriansmovies/sushi.avi");
|
||||
|
||||
assertRequestLineEquals(request,
|
||||
"GET http://services.nirvanix.com/ws/Metadata/GetMetadata.ashx?output=json&path=adriansmovies/sushi.avi HTTP/1.1");
|
||||
assertNonPayloadHeadersEqual(request, "");
|
||||
assertPayloadEquals(request, null, null, false);
|
||||
|
||||
assertResponseParserClassEquals(method, request, ParseMetadataFromJsonResponse.class);
|
||||
assertSaxResponseParserClassEquals(method, null);
|
||||
assertExceptionParserClassEquals(method, null);
|
||||
|
||||
checkFilters(request);
|
||||
}
|
||||
|
||||
public void testGetFile() throws SecurityException, NoSuchMethodException, IOException {
|
||||
Method method = SDNAsyncClient.class.getMethod("getFile", String.class);
|
||||
GeneratedHttpRequest request = processor.createRequest(method, "adriansmovies/sushi.avi");
|
||||
|
||||
assertRequestLineEquals(request, "GET http://services.nirvanix.com/adriansmovies/sushi.avi?output=json HTTP/1.1");
|
||||
assertNonPayloadHeadersEqual(request, "");
|
||||
assertPayloadEquals(request, null, null, false);
|
||||
|
||||
assertResponseParserClassEquals(method, request, ReturnStringIf2xx.class);
|
||||
assertSaxResponseParserClassEquals(method, null);
|
||||
assertExceptionParserClassEquals(method, null);
|
||||
|
||||
assertEquals(request.getFilters().size(), 1);
|
||||
assertEquals(request.getFilters().get(0).getClass(), InsertUserContextIntoPath.class);
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void checkFilters(HttpRequest request) {
|
||||
assertEquals(request.getFilters().size(), 1);
|
||||
assertEquals(request.getFilters().get(0).getClass(), AddSessionTokenToRequest.class);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected TypeLiteral<RestAnnotationProcessor<SDNAsyncClient>> createTypeLiteral() {
|
||||
return new TypeLiteral<RestAnnotationProcessor<SDNAsyncClient>>() {
|
||||
};
|
||||
}
|
||||
|
||||
protected Module createModule() {
|
||||
return new TestSDNRestClientModule();
|
||||
}
|
||||
|
||||
@RequiresHttp
|
||||
@ConfiguresRestClient
|
||||
static class TestSDNRestClientModule extends SDNRestClientModule {
|
||||
@Override
|
||||
public void configure() {
|
||||
bind(String.class).annotatedWith(SessionToken.class).toInstance("sessiontoken");
|
||||
bind(String.class).annotatedWith(Names.named(SDNConstants.PROPERTY_SDN_APPKEY)).toInstance("appKey");
|
||||
bind(String.class).annotatedWith(Names.named(SDNConstants.PROPERTY_SDN_APPNAME)).toInstance("appname");
|
||||
bind(String.class).annotatedWith(Names.named(SDNConstants.PROPERTY_SDN_USERNAME)).toInstance("username");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public RestContextSpec<SDNClient, SDNAsyncClient> createContextSpec() {
|
||||
return new RestContextFactory().createContextSpec("sdn", "user", "password", new Properties());
|
||||
}
|
||||
}
|
|
@ -1,75 +0,0 @@
|
|||
/**
|
||||
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||
* contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. jclouds licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
package org.jclouds.nirvanix.sdn;
|
||||
|
||||
import static org.jclouds.rest.RestContextFactory.contextSpec;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.lang.reflect.Method;
|
||||
|
||||
import org.jclouds.http.HttpRequest;
|
||||
import org.jclouds.nirvanix.sdn.SDNAuthenticationLiveTest.SDNAuthClient;
|
||||
import org.jclouds.nirvanix.sdn.functions.ParseSessionTokenFromJsonResponse;
|
||||
import org.jclouds.rest.RestClientTest;
|
||||
import org.jclouds.rest.RestContextSpec;
|
||||
import org.jclouds.rest.functions.MapHttp4xxCodesToExceptions;
|
||||
import org.jclouds.rest.internal.RestAnnotationProcessor;
|
||||
import org.testng.annotations.Test;
|
||||
|
||||
import com.google.inject.TypeLiteral;
|
||||
|
||||
/**
|
||||
* Tests behavior of {@code JaxrsAnnotationProcessor}
|
||||
*
|
||||
* @author Adrian Cole
|
||||
*/
|
||||
@Test(groups = "unit", testName = "sdn.SDNAuthentication")
|
||||
public class SDNAuthAsyncClientTest extends RestClientTest<SDNAuthAsyncClient> {
|
||||
|
||||
public void testAuthenticate() throws SecurityException, NoSuchMethodException, IOException {
|
||||
Method method = SDNAuthAsyncClient.class.getMethod("authenticate", String.class, String.class, String.class);
|
||||
GeneratedHttpRequest httpRequest = processor.createRequest(method, "apple", "foo", "bar");
|
||||
assertRequestLineEquals(httpRequest,
|
||||
"GET http://localhost:8080/ws/Authentication/Login.ashx?output=json&appKey=apple&password=bar&username=foo HTTP/1.1");
|
||||
assertNonPayloadHeadersEqual(httpRequest, "");
|
||||
assertPayloadEquals(httpRequest, null, null, false);
|
||||
|
||||
assertResponseParserClassEquals(method, httpRequest, ParseSessionTokenFromJsonResponse.class);
|
||||
assertSaxResponseParserClassEquals(method, null);
|
||||
assertExceptionParserClassEquals(method, MapHttp4xxCodesToExceptions.class);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void checkFilters(HttpRequest request) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
protected TypeLiteral<RestAnnotationProcessor<SDNAuthAsyncClient>> createTypeLiteral() {
|
||||
return new TypeLiteral<RestAnnotationProcessor<SDNAuthAsyncClient>>() {
|
||||
};
|
||||
}
|
||||
|
||||
@Override
|
||||
public RestContextSpec<SDNAuthClient, SDNAuthAsyncClient> createContextSpec() {
|
||||
return contextSpec("test", "http://localhost:8080", "1", "", "identity", "credential", SDNAuthClient.class,
|
||||
SDNAuthAsyncClient.class);
|
||||
}
|
||||
|
||||
}
|
|
@ -1,84 +0,0 @@
|
|||
/**
|
||||
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||
* contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. jclouds licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
package org.jclouds.nirvanix.sdn;
|
||||
|
||||
import static com.google.common.base.Preconditions.checkNotNull;
|
||||
import static org.jclouds.rest.RestContextFactory.contextSpec;
|
||||
import static org.jclouds.rest.RestContextFactory.createContextBuilder;
|
||||
import static org.testng.Assert.assertNotNull;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
import org.jclouds.concurrent.MoreExecutors;
|
||||
import org.jclouds.concurrent.Timeout;
|
||||
import org.jclouds.concurrent.config.ExecutorServiceModule;
|
||||
import org.jclouds.logging.log4j.config.Log4JLoggingModule;
|
||||
import org.jclouds.rest.RestContext;
|
||||
import org.jclouds.rest.RestContextSpec;
|
||||
import org.testng.annotations.BeforeClass;
|
||||
import org.testng.annotations.Test;
|
||||
|
||||
import com.google.common.base.Splitter;
|
||||
import com.google.common.collect.ImmutableSet;
|
||||
import com.google.common.collect.Lists;
|
||||
import com.google.inject.Module;
|
||||
|
||||
/**
|
||||
* Tests behavior of {@code SDNAuthentication}
|
||||
*
|
||||
* @author Adrian Cole
|
||||
*/
|
||||
@Test(groups = "live", testName = "sdn.SDNAuthenticationLiveTest")
|
||||
public class SDNAuthenticationLiveTest {
|
||||
|
||||
private RestContext<SDNAuthClient, SDNAuthAsyncClient> context;
|
||||
|
||||
@Timeout(duration = 10, timeUnit = TimeUnit.SECONDS)
|
||||
public interface SDNAuthClient {
|
||||
|
||||
String authenticate(String appKey, String user, String password);
|
||||
}
|
||||
|
||||
private String credential;
|
||||
private String identity;
|
||||
|
||||
@Test
|
||||
public void testAuthentication() throws Exception {
|
||||
ArrayList<String> list = Lists.newArrayList(Splitter.on('/').split(credential));
|
||||
String response = context.getApi().authenticate(list.get(0), list.get(1), identity);
|
||||
assertNotNull(response);
|
||||
}
|
||||
|
||||
@BeforeClass
|
||||
void setupFactory() {
|
||||
|
||||
String endpoint = "http://services.nirvanix.com";
|
||||
identity = checkNotNull(System.getProperty("jclouds.test.identity"), "jclouds.test.identity");
|
||||
credential = checkNotNull(System.getProperty("jclouds.test.credential"), "jclouds.test.credential");
|
||||
|
||||
RestContextSpec<SDNAuthClient, SDNAuthAsyncClient> contextSpec = contextSpec("test", endpoint, "1", "", identity,
|
||||
credential, SDNAuthClient.class, SDNAuthAsyncClient.class);
|
||||
|
||||
context = createContextBuilder(
|
||||
contextSpec,
|
||||
ImmutableSet.<Module> of(new Log4JLoggingModule(), new ExecutorServiceModule(MoreExecutors
|
||||
.sameThreadExecutor(), MoreExecutors.sameThreadExecutor()))).buildContext();
|
||||
}
|
||||
}
|
|
@ -1,101 +0,0 @@
|
|||
/**
|
||||
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||
* contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. jclouds licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
package org.jclouds.nirvanix.sdn;
|
||||
|
||||
import static com.google.common.base.Preconditions.checkNotNull;
|
||||
import static org.testng.Assert.assertEquals;
|
||||
import static org.testng.Assert.assertNotNull;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.net.URI;
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.ExecutionException;
|
||||
import java.util.concurrent.TimeoutException;
|
||||
|
||||
import org.jclouds.blobstore.domain.Blob;
|
||||
import org.jclouds.blobstore.integration.internal.BaseBlobStoreIntegrationTest;
|
||||
import org.jclouds.encryption.internal.Base64;
|
||||
import org.jclouds.io.Payloads;
|
||||
import org.jclouds.logging.log4j.config.Log4JLoggingModule;
|
||||
import org.jclouds.nirvanix.sdn.domain.UploadInfo;
|
||||
import org.jclouds.rest.RestContext;
|
||||
import org.jclouds.rest.RestContextFactory;
|
||||
import org.testng.annotations.BeforeGroups;
|
||||
import org.testng.annotations.Test;
|
||||
|
||||
import com.google.common.collect.ImmutableMap;
|
||||
import com.google.common.collect.ImmutableSet;
|
||||
import com.google.inject.Module;
|
||||
|
||||
/**
|
||||
* Tests behavior of {@code SDNClient}
|
||||
*
|
||||
* @author Adrian Cole
|
||||
*/
|
||||
@Test(groups = "live", sequential = true, testName = "sdn.SDNClientLiveTest")
|
||||
public class SDNClientLiveTest {
|
||||
|
||||
protected SDNClient connection;
|
||||
private String containerPrefix = BaseBlobStoreIntegrationTest.CONTAINER_PREFIX;
|
||||
|
||||
URI container1;
|
||||
URI container2;
|
||||
private RestContext<SDNClient, SDNAsyncClient> context;
|
||||
|
||||
@BeforeGroups(groups = { "live" })
|
||||
public void setupClient() {
|
||||
|
||||
String identity = checkNotNull(System.getProperty("jclouds.test.identity"), "jclouds.test.identity");
|
||||
String credential = checkNotNull(System.getProperty("jclouds.test.credential"), "jclouds.test.credential");
|
||||
|
||||
this.context = new RestContextFactory().createContext("sdn", identity, credential, ImmutableSet
|
||||
.<Module> of(new Log4JLoggingModule()));
|
||||
this.connection = context.getApi();
|
||||
}
|
||||
|
||||
public void testUploadToken() throws InterruptedException, ExecutionException, TimeoutException, IOException {
|
||||
String containerName = containerPrefix + ".testObjectOperations";
|
||||
long size = 1024;
|
||||
|
||||
UploadInfo uploadInfo = connection.getStorageNode(containerName, size);
|
||||
assertNotNull(uploadInfo.getHost());
|
||||
assertNotNull(uploadInfo.getToken());
|
||||
|
||||
Blob blob = connection.newBlob();
|
||||
blob.getMetadata().setName("test.txt");
|
||||
blob.setPayload("value");
|
||||
Payloads.calculateMD5(blob);
|
||||
|
||||
byte[] md5 = blob.getMetadata().getContentMetadata().getContentMD5();
|
||||
connection.upload(uploadInfo.getHost(), uploadInfo.getToken(), containerName, blob);
|
||||
|
||||
Map<String, String> metadata = connection.getMetadata(containerName + "/test.txt");
|
||||
assertEquals(metadata.get("MD5"), Base64.encodeBytes(md5));
|
||||
|
||||
String content = connection.getFile(containerName + "/test.txt");
|
||||
assertEquals(content, "value");
|
||||
|
||||
metadata = ImmutableMap.of("chef", "sushi", "foo", "bar");
|
||||
connection.setMetadata(containerName + "/test.txt", metadata);
|
||||
|
||||
metadata = connection.getMetadata(containerName + "/test.txt");
|
||||
assertEquals(metadata.get("MD5"), Base64.encodeBytes(md5));
|
||||
|
||||
}
|
||||
}
|
|
@ -1,79 +0,0 @@
|
|||
/**
|
||||
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||
* contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. jclouds licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
package org.jclouds.nirvanix.sdn.binders;
|
||||
|
||||
import static org.easymock.classextension.EasyMock.createMock;
|
||||
import static org.testng.Assert.assertEquals;
|
||||
|
||||
import java.io.File;
|
||||
import java.net.URI;
|
||||
|
||||
import javax.inject.Provider;
|
||||
import javax.ws.rs.HttpMethod;
|
||||
import javax.ws.rs.core.UriBuilder;
|
||||
|
||||
import org.jclouds.http.HttpRequest;
|
||||
import org.jclouds.rest.internal.GeneratedHttpRequest;
|
||||
import org.testng.annotations.Test;
|
||||
|
||||
import com.google.common.collect.ImmutableMap;
|
||||
import com.sun.jersey.api.uri.UriBuilderImpl;
|
||||
|
||||
/**
|
||||
* Tests behavior of {@code BindMetadataToQueryParams}
|
||||
*
|
||||
* @author Adrian Cole
|
||||
*/
|
||||
@Test(groups = "unit", testName = "sdn.BindMetadataToQueryParamsTest")
|
||||
public class BindMetadataToQueryParamsTest {
|
||||
|
||||
@Test(expectedExceptions = IllegalArgumentException.class)
|
||||
public void testMustBeMap() {
|
||||
BindMetadataToQueryParams binder = new BindMetadataToQueryParams(null);
|
||||
HttpRequest request = new HttpRequest(HttpMethod.POST, URI.create("http://localhost"), new char[] { '/', ':' });
|
||||
binder.bindToRequest(request, new File("foo"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCorrect() throws SecurityException, NoSuchMethodException {
|
||||
|
||||
HttpRequest request = new HttpRequest("GET", URI.create("http://momma/"), new char[] { '/', ':' });
|
||||
|
||||
BindMetadataToQueryParams binder = new BindMetadataToQueryParams(new Provider<UriBuilder>() {
|
||||
|
||||
@Override
|
||||
public UriBuilder get() {
|
||||
return new UriBuilderImpl();
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
request = binder.bindToRequest(request, ImmutableMap.of("imageName", "foo", "serverId", "2"));
|
||||
|
||||
assertEquals(request.getRequestLine(), "GET http://momma/?metadata=imagename:foo&metadata=serverid:2 HTTP/1.1");
|
||||
|
||||
}
|
||||
|
||||
@Test(expectedExceptions = { NullPointerException.class, IllegalStateException.class })
|
||||
public void testNullIsBad() {
|
||||
BindMetadataToQueryParams binder = new BindMetadataToQueryParams(null);
|
||||
GeneratedHttpRequest<?> request = createMock(GeneratedHttpRequest.class);
|
||||
binder.bindToRequest(request, null);
|
||||
}
|
||||
}
|
|
@ -1,132 +0,0 @@
|
|||
/**
|
||||
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||
* contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. jclouds licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
package org.jclouds.nirvanix.sdn.filters;
|
||||
|
||||
import static org.testng.Assert.assertEquals;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.lang.reflect.Method;
|
||||
import java.net.URI;
|
||||
import java.util.Properties;
|
||||
|
||||
import javax.ws.rs.POST;
|
||||
|
||||
import org.jclouds.http.HttpRequest;
|
||||
import org.jclouds.http.RequiresHttp;
|
||||
import org.jclouds.nirvanix.sdn.SDNAsyncClient;
|
||||
import org.jclouds.nirvanix.sdn.SDNClient;
|
||||
import org.jclouds.nirvanix.sdn.SessionToken;
|
||||
import org.jclouds.nirvanix.sdn.config.SDNRestClientModule;
|
||||
import org.jclouds.nirvanix.sdn.reference.SDNConstants;
|
||||
import org.jclouds.rest.ConfiguresRestClient;
|
||||
import org.jclouds.rest.RestClientTest;
|
||||
import org.jclouds.rest.RestContextFactory;
|
||||
import org.jclouds.rest.RestContextSpec;
|
||||
import org.jclouds.rest.annotations.EndpointParam;
|
||||
import org.jclouds.rest.internal.RestAnnotationProcessor;
|
||||
import org.testng.annotations.BeforeClass;
|
||||
import org.testng.annotations.DataProvider;
|
||||
import org.testng.annotations.Test;
|
||||
|
||||
import com.google.inject.Key;
|
||||
import com.google.inject.Module;
|
||||
import com.google.inject.TypeLiteral;
|
||||
import com.google.inject.name.Names;
|
||||
|
||||
@Test(groups = "unit", testName = "AddSessionTokenToRequestTest")
|
||||
public class AddSessionTokenToRequestTest extends RestClientTest<SDNAsyncClient> {
|
||||
|
||||
private static interface TestService {
|
||||
@POST
|
||||
public void foo(@EndpointParam URI endpoint);
|
||||
}
|
||||
|
||||
@DataProvider
|
||||
public Object[][] dataProvider() throws SecurityException, NoSuchMethodException {
|
||||
|
||||
RestAnnotationProcessor<TestService> factory = injector.getInstance(Key
|
||||
.get(new TypeLiteral<RestAnnotationProcessor<TestService>>() {
|
||||
}));
|
||||
|
||||
Method method = TestService.class.getMethod("foo", URI.class);
|
||||
return new Object[][] { { factory.createRequest(method, new Object[] { URI.create("https://host:443") }) },
|
||||
{ factory.createRequest(method, new Object[] { URI.create("https://host/path") }) },
|
||||
{ factory.createRequest(method, new Object[] { URI.create("https://host/?query") })
|
||||
|
||||
} };
|
||||
}
|
||||
|
||||
@Test(dataProvider = "dataProvider")
|
||||
public void testRequests(HttpRequest request) {
|
||||
String token = filter.getSessionToken();
|
||||
String query = request.getEndpoint().getQuery();
|
||||
request = filter.filter(request);
|
||||
assertEquals(request.getEndpoint().getQuery(), query == null ? "sessionToken=" + token : query + "&sessionToken="
|
||||
+ token);
|
||||
}
|
||||
|
||||
@Test
|
||||
void testUpdatesOnlyOncePerSecond() throws NoSuchMethodException, InterruptedException {
|
||||
String token = filter.getSessionToken();
|
||||
for (int i = 0; i < 10; i++)
|
||||
filter.updateIfTimeOut();
|
||||
assert token.equals(filter.getSessionToken());
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void checkFilters(HttpRequest request) {
|
||||
}
|
||||
|
||||
private AddSessionTokenToRequest filter;
|
||||
|
||||
@BeforeClass
|
||||
@Override
|
||||
protected void setupFactory() throws IOException {
|
||||
super.setupFactory();
|
||||
filter = injector.getInstance(AddSessionTokenToRequest.class);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected TypeLiteral<RestAnnotationProcessor<SDNAsyncClient>> createTypeLiteral() {
|
||||
return new TypeLiteral<RestAnnotationProcessor<SDNAsyncClient>>() {
|
||||
};
|
||||
}
|
||||
|
||||
protected Module createModule() {
|
||||
return new TestSDNRestClientModule();
|
||||
}
|
||||
|
||||
@RequiresHttp
|
||||
@ConfiguresRestClient
|
||||
static class TestSDNRestClientModule extends SDNRestClientModule {
|
||||
@Override
|
||||
public void configure() {
|
||||
bind(String.class).annotatedWith(SessionToken.class).toInstance("sessiontoken");
|
||||
bind(String.class).annotatedWith(Names.named(SDNConstants.PROPERTY_SDN_APPKEY)).toInstance("appKey");
|
||||
bind(String.class).annotatedWith(Names.named(SDNConstants.PROPERTY_SDN_APPNAME)).toInstance("appname");
|
||||
bind(String.class).annotatedWith(Names.named(SDNConstants.PROPERTY_SDN_USERNAME)).toInstance("username");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public RestContextSpec<SDNClient, SDNAsyncClient> createContextSpec() {
|
||||
return new RestContextFactory().createContextSpec("sdn", "user", "password", new Properties());
|
||||
}
|
||||
}
|
|
@ -1,130 +0,0 @@
|
|||
/**
|
||||
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||
* contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. jclouds licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
package org.jclouds.nirvanix.sdn.filters;
|
||||
|
||||
import static org.testng.Assert.assertEquals;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.lang.reflect.Method;
|
||||
import java.net.URI;
|
||||
import java.util.Properties;
|
||||
|
||||
import javax.ws.rs.POST;
|
||||
|
||||
import org.jclouds.http.HttpRequest;
|
||||
import org.jclouds.http.RequiresHttp;
|
||||
import org.jclouds.nirvanix.sdn.SDNAsyncClient;
|
||||
import org.jclouds.nirvanix.sdn.SDNClient;
|
||||
import org.jclouds.nirvanix.sdn.SessionToken;
|
||||
import org.jclouds.nirvanix.sdn.config.SDNRestClientModule;
|
||||
import org.jclouds.nirvanix.sdn.reference.SDNConstants;
|
||||
import org.jclouds.rest.ConfiguresRestClient;
|
||||
import org.jclouds.rest.RestClientTest;
|
||||
import org.jclouds.rest.RestContextFactory;
|
||||
import org.jclouds.rest.RestContextSpec;
|
||||
import org.jclouds.rest.annotations.EndpointParam;
|
||||
import org.jclouds.rest.internal.RestAnnotationProcessor;
|
||||
import org.testng.annotations.BeforeClass;
|
||||
import org.testng.annotations.Test;
|
||||
|
||||
import com.google.common.base.Throwables;
|
||||
import com.google.inject.Module;
|
||||
import com.google.inject.TypeLiteral;
|
||||
import com.google.inject.name.Names;
|
||||
|
||||
@Test(groups = "unit", singleThreaded = true, testName = "sdn.InsertUserContextIntoPathTest")
|
||||
// sequential as easymock isn't threadsafe
|
||||
public class InsertUserContextIntoPathTest extends RestClientTest<TestService> {
|
||||
|
||||
private Method method;
|
||||
|
||||
public void testRequestInvalid() {
|
||||
GeneratedHttpRequest request = processor.createRequest(method, URI.create("https://host/path"));
|
||||
request = filter.filter(request);
|
||||
request = filter.filter(request);
|
||||
assertEquals(request.getEndpoint().getPath(), "/sessiontoken/appname/username/path");
|
||||
assertEquals(request.getEndpoint().getHost(), "host");
|
||||
}
|
||||
|
||||
public void testRequestNoSession() {
|
||||
GeneratedHttpRequest request = processor.createRequest(method, URI.create("https://host/path"));
|
||||
request = filter.filter(request);
|
||||
assertEquals(request.getEndpoint().getPath(), "/sessiontoken/appname/username/path");
|
||||
assertEquals(request.getEndpoint().getHost(), "host");
|
||||
}
|
||||
|
||||
public void testRequestAlreadyHasSession() {
|
||||
GeneratedHttpRequest request = processor.createRequest(method, URI.create("https://host/sessiontoken/appname/username/path"));
|
||||
request = filter.filter(request);
|
||||
assertEquals(request.getEndpoint().getPath(), "/sessiontoken/appname/username/path");
|
||||
assertEquals(request.getEndpoint().getHost(), "host");
|
||||
}
|
||||
|
||||
private InsertUserContextIntoPath filter;
|
||||
|
||||
@BeforeClass
|
||||
@Override
|
||||
protected void setupFactory() throws IOException {
|
||||
super.setupFactory();
|
||||
filter = injector.getInstance(InsertUserContextIntoPath.class);
|
||||
try {
|
||||
method = TestService.class.getMethod("foo", URI.class);
|
||||
} catch (Exception e) {
|
||||
Throwables.propagate(e);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected TypeLiteral<RestAnnotationProcessor<TestService>> createTypeLiteral() {
|
||||
return new TypeLiteral<RestAnnotationProcessor<TestService>>() {
|
||||
};
|
||||
}
|
||||
|
||||
protected Module createModule() {
|
||||
return new TestSDNRestClientModule();
|
||||
}
|
||||
|
||||
@RequiresHttp
|
||||
@ConfiguresRestClient
|
||||
static class TestSDNRestClientModule extends SDNRestClientModule {
|
||||
@Override
|
||||
public void configure() {
|
||||
bind(String.class).annotatedWith(SessionToken.class).toInstance("sessiontoken");
|
||||
bind(String.class).annotatedWith(Names.named(SDNConstants.PROPERTY_SDN_APPKEY)).toInstance("appKey");
|
||||
bind(String.class).annotatedWith(Names.named(SDNConstants.PROPERTY_SDN_APPNAME)).toInstance("appname");
|
||||
bind(String.class).annotatedWith(Names.named(SDNConstants.PROPERTY_SDN_USERNAME)).toInstance("username");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public RestContextSpec<SDNClient, SDNAsyncClient> createContextSpec() {
|
||||
return new RestContextFactory().createContextSpec("sdn", "user", "password", new Properties());
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void checkFilters(HttpRequest request) {
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
interface TestService {
|
||||
@POST
|
||||
public void foo(@EndpointParam URI endpoint);
|
||||
}
|
|
@ -1,53 +0,0 @@
|
|||
/**
|
||||
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||
* contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. jclouds licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
package org.jclouds.nirvanix.sdn.functions;
|
||||
|
||||
import static org.testng.Assert.assertEquals;
|
||||
|
||||
import java.io.InputStream;
|
||||
import java.net.UnknownHostException;
|
||||
import java.util.Map;
|
||||
|
||||
import org.jclouds.http.HttpResponse;
|
||||
import org.jclouds.io.Payloads;
|
||||
import org.jclouds.json.config.GsonModule;
|
||||
import org.testng.annotations.Test;
|
||||
|
||||
import com.google.common.collect.ImmutableMap;
|
||||
import com.google.inject.Guice;
|
||||
import com.google.inject.Injector;
|
||||
|
||||
/**
|
||||
* Tests behavior of {@code ParseMetadataFromJsonResponse}
|
||||
*
|
||||
* @author Adrian Cole
|
||||
*/
|
||||
@Test(groups = "unit", testName = "sdn.ParseMetadataFromJsonResponseTest")
|
||||
public class ParseMetadataFromJsonResponseTest {
|
||||
|
||||
Injector i = Guice.createInjector(new GsonModule());
|
||||
|
||||
public void testApplyInputStreamDetails() throws UnknownHostException {
|
||||
InputStream is = getClass().getResourceAsStream("/metadata.json");
|
||||
|
||||
ParseMetadataFromJsonResponse parser = i.getInstance(ParseMetadataFromJsonResponse.class);
|
||||
Map<String, String> response = parser.apply(new HttpResponse(200, "ok", Payloads.newInputStreamPayload(is)));
|
||||
assertEquals(response, ImmutableMap.of("MD5", "IGPBYI1uC6+AJJxC4r5YBA==", "test", "1"));
|
||||
}
|
||||
}
|
|
@ -1,52 +0,0 @@
|
|||
/**
|
||||
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||
* contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. jclouds licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
package org.jclouds.nirvanix.sdn.functions;
|
||||
|
||||
import static org.testng.Assert.assertEquals;
|
||||
|
||||
import java.io.InputStream;
|
||||
import java.net.UnknownHostException;
|
||||
|
||||
import org.jclouds.http.HttpResponse;
|
||||
import org.jclouds.io.Payloads;
|
||||
import org.jclouds.json.config.GsonModule;
|
||||
import org.testng.annotations.Test;
|
||||
|
||||
import com.google.inject.Guice;
|
||||
import com.google.inject.Injector;
|
||||
|
||||
/**
|
||||
* Tests behavior of {@code ParseSessionTokenFromJsonResponse}
|
||||
*
|
||||
* @author Adrian Cole
|
||||
*/
|
||||
@Test(groups = "unit", testName = "sdn.ParseSessionTokenFromJsonResponseTest")
|
||||
public class ParseSessionTokenFromJsonResponseTest {
|
||||
|
||||
Injector i = Guice.createInjector(new GsonModule());
|
||||
|
||||
public void testApplyInputStreamDetails() throws UnknownHostException {
|
||||
InputStream is = getClass().getResourceAsStream("/login.json");
|
||||
|
||||
ParseSessionTokenFromJsonResponse parser = i.getInstance(ParseSessionTokenFromJsonResponse.class);
|
||||
String response = parser.apply(new HttpResponse(200, "ok", Payloads.newInputStreamPayload(is)));
|
||||
assertEquals(response, "e4b08449-4501-4b7a-af6a-d4e1e1bd7919");
|
||||
}
|
||||
|
||||
}
|
|
@ -1,55 +0,0 @@
|
|||
/**
|
||||
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||
* contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. jclouds licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
package org.jclouds.nirvanix.sdn.functions;
|
||||
|
||||
import static org.testng.Assert.assertEquals;
|
||||
|
||||
import java.io.InputStream;
|
||||
import java.net.URI;
|
||||
import java.net.UnknownHostException;
|
||||
|
||||
import org.jclouds.http.HttpResponse;
|
||||
import org.jclouds.io.Payloads;
|
||||
import org.jclouds.json.config.GsonModule;
|
||||
import org.jclouds.nirvanix.sdn.domain.UploadInfo;
|
||||
import org.testng.annotations.Test;
|
||||
|
||||
import com.google.inject.Guice;
|
||||
import com.google.inject.Injector;
|
||||
|
||||
/**
|
||||
* Tests behavior of {@code ParseUploadInfoFromJsonResponse}
|
||||
*
|
||||
* @author Adrian Cole
|
||||
*/
|
||||
@Test(groups = "unit", testName = "sdn.ParseUploadInfoFromJsonResponse")
|
||||
public class ParseUploadInfoFromJsonResponseTest {
|
||||
|
||||
Injector i = Guice.createInjector(new GsonModule());
|
||||
|
||||
public void testApplyInputStreamDetails() throws UnknownHostException {
|
||||
InputStream is = getClass().getResourceAsStream("/authtoken.json");
|
||||
|
||||
ParseUploadInfoFromJsonResponse parser = i.getInstance(ParseUploadInfoFromJsonResponse.class);
|
||||
UploadInfo response = parser.apply(new HttpResponse(200, "ok", Payloads.newInputStreamPayload(is)));
|
||||
assertEquals(response.getHost(), URI.create("https://node1.nirvanix.com"));
|
||||
assertEquals(response.getToken(), "siR-ALYd~BEcJ8GR2tE~oX3SEHO8~2WXKT5xjFk~YLS5OvJyHI21TN34rQ");
|
||||
}
|
||||
|
||||
}
|
|
@ -1 +0,0 @@
|
|||
{"ResponseCode":0,"GetStorageNode":{"UploadHost":"node1.nirvanix.com","UploadToken":"siR-ALYd~BEcJ8GR2tE~oX3SEHO8~2WXKT5xjFk~YLS5OvJyHI21TN34rQ"}}
|
|
@ -1,90 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!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>
|
||||
|
||||
<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>
|
||||
|
||||
<!-- ======================= -->
|
||||
<!-- Setup the Root category -->
|
||||
<!-- ======================= -->
|
||||
|
||||
<root>
|
||||
<priority value="WARN" />
|
||||
</root>
|
||||
|
||||
</log4j:configuration>
|
|
@ -1 +0,0 @@
|
|||
{"ResponseCode":0,"SessionToken":"e4b08449-4501-4b7a-af6a-d4e1e1bd7919"}
|
|
@ -1 +0,0 @@
|
|||
{"ResponseCode":0,"Metadata":[{"Type":"MD5","Value":"IGPBYI1uC6+AJJxC4r5YBA=="},{"Type":"test","Value":"1"}]}
|
|
@ -1,25 +0,0 @@
|
|||
====
|
||||
Licensed to jclouds, Inc. (jclouds) under one or more
|
||||
contributor license agreements. See the NOTICE file
|
||||
distributed with this work for additional information
|
||||
regarding copyright ownership. jclouds licenses this file
|
||||
to you under the Apache License, Version 2.0 (the
|
||||
"License"); you may not use this file except in compliance
|
||||
with the License. You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing,
|
||||
software distributed under the License is distributed on an
|
||||
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
KIND, either express or implied. See the License for the
|
||||
specific language governing permissions and limitations
|
||||
under the License.
|
||||
====
|
||||
|
||||
#
|
||||
# The jclouds provider for Mezeo Cloud Storage (http://www.mezeo.com/the-platform).
|
||||
#
|
||||
# TODO: Implementation status.
|
||||
# TODO: Supported features.
|
||||
# TODO: Usage example.
|
|
@ -1,126 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!--
|
||||
|
||||
Licensed to jclouds, Inc. (jclouds) under one or more
|
||||
contributor license agreements. See the NOTICE file
|
||||
distributed with this work for additional information
|
||||
regarding copyright ownership. jclouds licenses this file
|
||||
to you under the Apache License, Version 2.0 (the
|
||||
"License"); you may not use this file except in compliance
|
||||
with the License. You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing,
|
||||
software distributed under the License is distributed on an
|
||||
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
KIND, either express or implied. See the License for the
|
||||
specific language governing permissions and limitations
|
||||
under the License.
|
||||
|
||||
-->
|
||||
<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.6.0-SNAPSHOT</version>
|
||||
<relativePath>../../project/pom.xml</relativePath>
|
||||
</parent>
|
||||
<groupId>org.jclouds.api</groupId>
|
||||
<artifactId>pcs</artifactId>
|
||||
<name>jclouds mezeo cloud storage platform core</name>
|
||||
<description>jclouds Core components to access mezeo pcs2</description>
|
||||
<packaging>bundle</packaging>
|
||||
|
||||
<!-- bootstrapping: need to fetch the project POM -->
|
||||
<repositories>
|
||||
<repository>
|
||||
<id>jclouds-sona-snapshots-nexus</id>
|
||||
<url>https://oss.sonatype.org/content/repositories/snapshots</url>
|
||||
<snapshots>
|
||||
<enabled>true</enabled>
|
||||
</snapshots>
|
||||
</repository>
|
||||
</repositories>
|
||||
|
||||
<properties>
|
||||
<test.pcs.endpoint>FIXME</test.pcs.endpoint>
|
||||
<test.pcs.api-version>2</test.pcs.api-version>
|
||||
<test.pcs.build-version></test.pcs.build-version>
|
||||
<test.pcs.identity>FIXME</test.pcs.identity>
|
||||
<test.pcs.credential>FIXME</test.pcs.credential>
|
||||
|
||||
<jclouds.osgi.export>org.jclouds.mezeo.pcs*;version="${project.version}"</jclouds.osgi.export>
|
||||
<jclouds.osgi.import>org.jclouds*;version="${project.version}",*</jclouds.osgi.import>
|
||||
</properties>
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>org.jclouds</groupId>
|
||||
<artifactId>jclouds-core</artifactId>
|
||||
<version>${project.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.jclouds</groupId>
|
||||
<artifactId>jclouds-blobstore</artifactId>
|
||||
<version>${project.version}</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-blobstore</artifactId>
|
||||
<version>${project.version}</version>
|
||||
<type>test-jar</type>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>log4j</groupId>
|
||||
<artifactId>log4j</artifactId>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.jclouds.driver</groupId>
|
||||
<artifactId>jclouds-log4j</artifactId>
|
||||
<version>${project.version}</version>
|
||||
<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>
|
||||
<systemPropertyVariables>
|
||||
<test.pcs.endpoint>${test.pcs.endpoint}</test.pcs.endpoint>
|
||||
<test.pcs.api-version>${test.pcs.api-version}</test.pcs.api-version>
|
||||
<test.pcs.build-version>${test.pcs.build-version}</test.pcs.build-version>
|
||||
<test.pcs.identity>${test.pcs.identity}</test.pcs.identity>
|
||||
<test.pcs.credential>${test.pcs.credential}</test.pcs.credential>
|
||||
</systemPropertyVariables>
|
||||
</configuration>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
</profile>
|
||||
</profiles>
|
||||
|
||||
</project>
|
|
@ -1,179 +0,0 @@
|
|||
/**
|
||||
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||
* contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. jclouds licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
package org.jclouds.mezeo.pcs;
|
||||
|
||||
import java.io.InputStream;
|
||||
import java.net.URI;
|
||||
import java.util.Map;
|
||||
|
||||
import javax.ws.rs.DELETE;
|
||||
import javax.ws.rs.GET;
|
||||
import javax.ws.rs.POST;
|
||||
import javax.ws.rs.PUT;
|
||||
import javax.ws.rs.Path;
|
||||
import javax.ws.rs.PathParam;
|
||||
import javax.ws.rs.Produces;
|
||||
|
||||
import org.jclouds.blobstore.functions.ReturnNullOnKeyNotFound;
|
||||
import org.jclouds.http.filters.BasicAuthentication;
|
||||
import org.jclouds.mezeo.pcs.binders.BindContainerNameToXmlPayload;
|
||||
import org.jclouds.mezeo.pcs.binders.BindFileInfoToXmlPayload;
|
||||
import org.jclouds.mezeo.pcs.binders.BindPCSFileToMultipartForm;
|
||||
import org.jclouds.mezeo.pcs.domain.ContainerList;
|
||||
import org.jclouds.mezeo.pcs.domain.FileInfoWithMetadata;
|
||||
import org.jclouds.mezeo.pcs.domain.PCSFile;
|
||||
import org.jclouds.mezeo.pcs.endpoints.RootContainer;
|
||||
import org.jclouds.mezeo.pcs.functions.AddMetadataItemIntoMap;
|
||||
import org.jclouds.mezeo.pcs.options.PutBlockOptions;
|
||||
import org.jclouds.mezeo.pcs.xml.ContainerHandler;
|
||||
import org.jclouds.mezeo.pcs.xml.FileHandler;
|
||||
import org.jclouds.rest.annotations.BinderParam;
|
||||
import org.jclouds.rest.annotations.Endpoint;
|
||||
import org.jclouds.rest.annotations.EndpointParam;
|
||||
import org.jclouds.rest.annotations.ExceptionParser;
|
||||
import org.jclouds.rest.annotations.Headers;
|
||||
import org.jclouds.rest.annotations.RequestFilters;
|
||||
import org.jclouds.rest.annotations.ResponseParser;
|
||||
import org.jclouds.rest.annotations.SkipEncoding;
|
||||
import org.jclouds.rest.annotations.XMLResponseParser;
|
||||
import org.jclouds.rest.binders.BindToStringPayload;
|
||||
import org.jclouds.rest.functions.ReturnVoidOnNotFoundOr404;
|
||||
|
||||
import com.google.common.util.concurrent.ListenableFuture;
|
||||
|
||||
/**
|
||||
* Provides asynchronous access to Mezeo PCS via their REST API.
|
||||
* <p/>
|
||||
*
|
||||
* @see PCSClient
|
||||
* @see <a href=
|
||||
* "http://developer.mezeo.com/mezeo-developer-center/documentation/howto-using-curl-to-access-api"
|
||||
* />
|
||||
* @author Adrian Cole
|
||||
*/
|
||||
@SkipEncoding('/')
|
||||
@RequestFilters(BasicAuthentication.class)
|
||||
public interface PCSAsyncClient {
|
||||
PCSFile newFile();
|
||||
|
||||
/**
|
||||
* @see PCSAsyncClient#list()
|
||||
*/
|
||||
@GET
|
||||
@XMLResponseParser(ContainerHandler.class)
|
||||
@Headers(keys = "X-Cloud-Depth", values = "2")
|
||||
@Endpoint(RootContainer.class)
|
||||
ListenableFuture<? extends ContainerList> list();
|
||||
|
||||
/**
|
||||
* @see PCSAsyncClient#list(URI)
|
||||
*/
|
||||
@GET
|
||||
@XMLResponseParser(ContainerHandler.class)
|
||||
@Headers(keys = "X-Cloud-Depth", values = "2")
|
||||
ListenableFuture<? extends ContainerList> list(@EndpointParam URI container);
|
||||
|
||||
/**
|
||||
* @see PCSAsyncClient#createContainer
|
||||
*/
|
||||
@POST
|
||||
@Path("/contents")
|
||||
@Endpoint(RootContainer.class)
|
||||
@Produces("application/vnd.csp.container-info+xml")
|
||||
ListenableFuture<URI> createContainer(@BinderParam(BindContainerNameToXmlPayload.class) String container);
|
||||
|
||||
/**
|
||||
* @see PCSAsyncClient#createContainer
|
||||
*/
|
||||
@POST
|
||||
@Path("/contents")
|
||||
ListenableFuture<URI> createContainer(@EndpointParam URI parent,
|
||||
@BinderParam(BindContainerNameToXmlPayload.class) String container);
|
||||
|
||||
/**
|
||||
* @see PCSAsyncClient#deleteContainer
|
||||
*/
|
||||
@DELETE
|
||||
@ExceptionParser(ReturnVoidOnNotFoundOr404.class)
|
||||
ListenableFuture<Void> deleteContainer(@EndpointParam URI container);
|
||||
|
||||
/**
|
||||
* @see PCSAsyncClient#uploadFile
|
||||
*/
|
||||
@POST
|
||||
@Path("/contents")
|
||||
ListenableFuture<URI> uploadFile(@EndpointParam URI container,
|
||||
@BinderParam(BindPCSFileToMultipartForm.class) PCSFile object);
|
||||
|
||||
/**
|
||||
* @see PCSAsyncClient#createFile
|
||||
*/
|
||||
@POST
|
||||
@Path("/contents")
|
||||
ListenableFuture<URI> createFile(@EndpointParam URI container,
|
||||
@BinderParam(BindFileInfoToXmlPayload.class) PCSFile object);
|
||||
|
||||
/**
|
||||
* @see PCSAsyncClient#uploadBlock
|
||||
*/
|
||||
@PUT
|
||||
@Path("/content")
|
||||
ListenableFuture<Void> uploadBlock(@EndpointParam URI file, PCSFile object, PutBlockOptions... options);
|
||||
|
||||
/**
|
||||
* @see PCSAsyncClient#deleteFile
|
||||
*/
|
||||
@DELETE
|
||||
@ExceptionParser(ReturnVoidOnNotFoundOr404.class)
|
||||
ListenableFuture<Void> deleteFile(@EndpointParam URI file);
|
||||
|
||||
/**
|
||||
* @see PCSAsyncClient#downloadFile
|
||||
*/
|
||||
@GET
|
||||
@ExceptionParser(ReturnNullOnKeyNotFound.class)
|
||||
@Path("/content")
|
||||
ListenableFuture<InputStream> downloadFile(@EndpointParam URI file);
|
||||
|
||||
/**
|
||||
* @see PCSAsyncClient#getFileInfo
|
||||
*/
|
||||
@GET
|
||||
@ExceptionParser(ReturnNullOnKeyNotFound.class)
|
||||
@XMLResponseParser(FileHandler.class)
|
||||
@Headers(keys = "X-Cloud-Depth", values = "2")
|
||||
ListenableFuture<FileInfoWithMetadata> getFileInfo(@EndpointParam URI file);
|
||||
|
||||
/**
|
||||
* @see PCSAsyncClient#putMetadataItem
|
||||
*/
|
||||
@PUT
|
||||
@Path("/metadata/{key}")
|
||||
ListenableFuture<Void> putMetadataItem(@EndpointParam URI resource, @PathParam("key") String key,
|
||||
@BinderParam(BindToStringPayload.class) String value);
|
||||
|
||||
/**
|
||||
* @see PCSAsyncClient#addMetadataItemToMap
|
||||
*/
|
||||
@GET
|
||||
@ResponseParser(AddMetadataItemIntoMap.class)
|
||||
@Path("/metadata/{key}")
|
||||
ListenableFuture<Void> addMetadataItemToMap(@EndpointParam URI resource, @PathParam("key") String key,
|
||||
Map<String, String> map);
|
||||
}
|
|
@ -1,70 +0,0 @@
|
|||
/**
|
||||
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||
* contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. jclouds licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
package org.jclouds.mezeo.pcs;
|
||||
|
||||
import java.io.InputStream;
|
||||
import java.net.URI;
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
import org.jclouds.concurrent.Timeout;
|
||||
import org.jclouds.mezeo.pcs.domain.ContainerList;
|
||||
import org.jclouds.mezeo.pcs.domain.FileInfoWithMetadata;
|
||||
import org.jclouds.mezeo.pcs.domain.PCSFile;
|
||||
import org.jclouds.mezeo.pcs.options.PutBlockOptions;
|
||||
|
||||
/**
|
||||
* Provides access to Mezeo PCS via their REST API.
|
||||
* <p/>
|
||||
*
|
||||
* @see <a href=
|
||||
* "http://developer.mezeo.com/mezeo-developer-center/documentation/howto-using-curl-to-access-api"
|
||||
* />
|
||||
* @author Adrian Cole
|
||||
*/
|
||||
@Timeout(duration = 30, timeUnit = TimeUnit.SECONDS)
|
||||
public interface PCSClient {
|
||||
PCSFile newFile();
|
||||
|
||||
ContainerList list();
|
||||
|
||||
ContainerList list(URI container);
|
||||
|
||||
URI createContainer(String container);
|
||||
|
||||
URI createContainer(URI parent, String container);
|
||||
|
||||
void deleteContainer(URI container);
|
||||
|
||||
URI uploadFile(URI container, PCSFile object);
|
||||
|
||||
URI createFile(URI container, PCSFile object);
|
||||
|
||||
void uploadBlock(URI file, PCSFile object, PutBlockOptions... options);
|
||||
|
||||
void deleteFile(URI file);
|
||||
|
||||
InputStream downloadFile(URI file);
|
||||
|
||||
FileInfoWithMetadata getFileInfo(URI file);
|
||||
|
||||
void putMetadataItem(URI resource, String key, String value);
|
||||
|
||||
void addMetadataItemToMap(URI resource, String key, Map<String, String> map);
|
||||
}
|
|
@ -1,76 +0,0 @@
|
|||
/**
|
||||
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||
* contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. jclouds licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
package org.jclouds.mezeo.pcs;
|
||||
|
||||
import java.net.URI;
|
||||
|
||||
import javax.ws.rs.GET;
|
||||
import javax.ws.rs.Path;
|
||||
|
||||
import org.jclouds.http.filters.BasicAuthentication;
|
||||
import org.jclouds.mezeo.pcs.endpoints.Contacts;
|
||||
import org.jclouds.mezeo.pcs.endpoints.Metacontainers;
|
||||
import org.jclouds.mezeo.pcs.endpoints.Projects;
|
||||
import org.jclouds.mezeo.pcs.endpoints.Recyclebin;
|
||||
import org.jclouds.mezeo.pcs.endpoints.RootContainer;
|
||||
import org.jclouds.mezeo.pcs.endpoints.Shares;
|
||||
import org.jclouds.mezeo.pcs.endpoints.Tags;
|
||||
import org.jclouds.mezeo.pcs.xml.CloudXlinkHandler;
|
||||
import org.jclouds.rest.annotations.RequestFilters;
|
||||
import org.jclouds.rest.annotations.XMLResponseParser;
|
||||
|
||||
import com.google.common.util.concurrent.ListenableFuture;
|
||||
|
||||
/**
|
||||
* Provides URIs to PCS services via their REST API.
|
||||
* <p/>
|
||||
*
|
||||
* @author Adrian Cole
|
||||
*/
|
||||
@RequestFilters(BasicAuthentication.class)
|
||||
public interface PCSCloudAsyncClient {
|
||||
|
||||
public interface Response {
|
||||
@RootContainer
|
||||
URI getRootContainerUrl();
|
||||
|
||||
@Contacts
|
||||
URI getContactsUrl();
|
||||
|
||||
@Shares
|
||||
URI getSharesUrl();
|
||||
|
||||
@Projects
|
||||
URI getProjectsUrl();
|
||||
|
||||
@Metacontainers
|
||||
URI getMetacontainersUrl();
|
||||
|
||||
@Recyclebin
|
||||
URI getRecyclebinUrl();
|
||||
|
||||
@Tags
|
||||
URI getTagsUrl();
|
||||
}
|
||||
|
||||
@GET
|
||||
@XMLResponseParser(CloudXlinkHandler.class)
|
||||
@Path("/v{jclouds.api-version}")
|
||||
ListenableFuture<Response> authenticate();
|
||||
}
|
|
@ -1,42 +0,0 @@
|
|||
/**
|
||||
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||
* contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. jclouds licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
package org.jclouds.mezeo.pcs;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Properties;
|
||||
|
||||
import org.jclouds.mezeo.pcs.config.PCSRestClientModule;
|
||||
import org.jclouds.rest.RestContextBuilder;
|
||||
|
||||
import com.google.inject.Module;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Adrian Cole
|
||||
*/
|
||||
public class PCSContextBuilder extends RestContextBuilder<PCSClient, PCSAsyncClient> {
|
||||
|
||||
public PCSContextBuilder(Properties props) {
|
||||
super(PCSClient.class, PCSAsyncClient.class, props);
|
||||
}
|
||||
|
||||
protected void addClientModule(List<Module> modules) {
|
||||
modules.add(new PCSRestClientModule());
|
||||
}
|
||||
}
|
|
@ -1,44 +0,0 @@
|
|||
/**
|
||||
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||
* contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. jclouds licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
package org.jclouds.mezeo.pcs;
|
||||
|
||||
import static org.jclouds.Constants.PROPERTY_API_VERSION;
|
||||
|
||||
import java.util.Properties;
|
||||
|
||||
import org.jclouds.PropertiesBuilder;
|
||||
|
||||
/**
|
||||
* Builds properties used in PCS Connections
|
||||
*
|
||||
* @author Adrian Cole
|
||||
*/
|
||||
public class PCSPropertiesBuilder extends PropertiesBuilder {
|
||||
@Override
|
||||
protected Properties defaultProperties() {
|
||||
Properties properties = super.defaultProperties();
|
||||
properties.setProperty(PROPERTY_API_VERSION, "2");
|
||||
return properties;
|
||||
}
|
||||
|
||||
public PCSPropertiesBuilder(Properties properties) {
|
||||
super(properties);
|
||||
}
|
||||
|
||||
}
|
|
@ -1,39 +0,0 @@
|
|||
/**
|
||||
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||
* contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. jclouds licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
package org.jclouds.mezeo.pcs.binders;
|
||||
|
||||
import javax.inject.Singleton;
|
||||
|
||||
import org.jclouds.http.HttpRequest;
|
||||
import org.jclouds.rest.Binder;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Adrian Cole
|
||||
*
|
||||
*/
|
||||
@Singleton
|
||||
public class BindContainerNameToXmlPayload implements Binder {
|
||||
@Override
|
||||
public <R extends HttpRequest> R bindToRequest(R request, Object input) {
|
||||
String container = String.format("<container><name>%s</name></container>", input);
|
||||
request.setPayload(container);
|
||||
return request;
|
||||
}
|
||||
}
|
|
@ -1,50 +0,0 @@
|
|||
/**
|
||||
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||
* contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. jclouds licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
package org.jclouds.mezeo.pcs.binders;
|
||||
|
||||
import java.io.File;
|
||||
|
||||
import javax.inject.Singleton;
|
||||
import javax.ws.rs.core.HttpHeaders;
|
||||
|
||||
import org.jclouds.http.HttpRequest;
|
||||
import org.jclouds.http.utils.ModifyRequest;
|
||||
import org.jclouds.mezeo.pcs.domain.PCSFile;
|
||||
import org.jclouds.rest.Binder;
|
||||
|
||||
import com.google.common.collect.ImmutableMultimap;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Adrian Cole
|
||||
*
|
||||
*/
|
||||
@Singleton
|
||||
public class BindFileInfoToXmlPayload implements Binder {
|
||||
|
||||
@Override
|
||||
public <R extends HttpRequest> R bindToRequest(R request, Object input) {
|
||||
PCSFile blob = (PCSFile) input;
|
||||
String file = String.format("<file><name>%s</name><mime_type>%s</mime_type><public>false</public></file>",
|
||||
new File(blob.getMetadata().getName()).getName(), blob.getMetadata().getMimeType());
|
||||
request.setPayload(file);
|
||||
return ModifyRequest.replaceHeaders(request, ImmutableMultimap.<String, String> of(HttpHeaders.CONTENT_LENGTH,
|
||||
file.getBytes().length + "", HttpHeaders.CONTENT_TYPE, "application/vnd.csp.file-info+xml"));
|
||||
}
|
||||
}
|
|
@ -1,52 +0,0 @@
|
|||
/**
|
||||
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||
* contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. jclouds licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
package org.jclouds.mezeo.pcs.binders;
|
||||
|
||||
import static com.google.common.base.Preconditions.checkArgument;
|
||||
import static com.google.common.base.Preconditions.checkNotNull;
|
||||
|
||||
import javax.inject.Inject;
|
||||
import javax.inject.Singleton;
|
||||
|
||||
import org.jclouds.blobstore.binders.BindBlobToMultipartForm;
|
||||
import org.jclouds.http.HttpRequest;
|
||||
import org.jclouds.mezeo.pcs.blobstore.functions.PCSFileToBlob;
|
||||
import org.jclouds.mezeo.pcs.domain.PCSFile;
|
||||
import org.jclouds.rest.Binder;
|
||||
|
||||
@Singleton
|
||||
public class BindPCSFileToMultipartForm implements Binder {
|
||||
private final BindBlobToMultipartForm blobBinder;
|
||||
private final PCSFileToBlob file2Blob;
|
||||
|
||||
@Inject
|
||||
public BindPCSFileToMultipartForm(PCSFileToBlob file2Blob, BindBlobToMultipartForm blobBinder) {
|
||||
this.blobBinder = blobBinder;
|
||||
this.file2Blob = file2Blob;
|
||||
}
|
||||
|
||||
@Override
|
||||
public <R extends HttpRequest> R bindToRequest(R request, Object input) {
|
||||
PCSFile file = (PCSFile) input;
|
||||
checkNotNull(file.getPayload().getContentMetadata().getContentLength(), "contentLength");
|
||||
checkArgument(file.getPayload().getContentMetadata().getContentLength() <= 2l * 1024 * 1024 * 1024,
|
||||
"maximum size for POST request is 2GB");
|
||||
return blobBinder.bindToRequest(request, file2Blob.apply(file));
|
||||
}
|
||||
}
|
|
@ -1,46 +0,0 @@
|
|||
/**
|
||||
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||
* contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. jclouds licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
package org.jclouds.mezeo.pcs.blobstore.functions;
|
||||
|
||||
import javax.inject.Singleton;
|
||||
|
||||
import org.jclouds.blobstore.domain.BlobMetadata;
|
||||
import org.jclouds.mezeo.pcs.domain.MutableFileInfo;
|
||||
import org.jclouds.mezeo.pcs.domain.internal.MutableFileInfoImpl;
|
||||
|
||||
import com.google.common.base.Function;
|
||||
|
||||
/**
|
||||
* @author Adrian Cole
|
||||
*/
|
||||
@Singleton
|
||||
public class BlobToFileInfo implements Function<BlobMetadata, MutableFileInfo> {
|
||||
@Override
|
||||
public MutableFileInfo apply(BlobMetadata base) {
|
||||
MutableFileInfo to = new MutableFileInfoImpl();
|
||||
to.setUrl(base.getUri());
|
||||
to.setMimeType(base.getContentMetadata().getContentType());
|
||||
to.setName(base.getName());
|
||||
to.setModified(base.getLastModified());
|
||||
if (base.getContentMetadata().getContentLength() != null)
|
||||
to.setBytes(base.getContentMetadata().getContentLength());
|
||||
return to;
|
||||
}
|
||||
|
||||
}
|
|
@ -1,49 +0,0 @@
|
|||
/**
|
||||
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||
* contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. jclouds licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
package org.jclouds.mezeo.pcs.blobstore.functions;
|
||||
|
||||
import javax.inject.Inject;
|
||||
import javax.inject.Singleton;
|
||||
|
||||
import org.jclouds.blobstore.domain.Blob;
|
||||
import org.jclouds.mezeo.pcs.domain.PCSFile;
|
||||
|
||||
import com.google.common.base.Function;
|
||||
|
||||
/**
|
||||
* @author Adrian Cole
|
||||
*/
|
||||
@Singleton
|
||||
public class BlobToPCSFile implements Function<Blob, PCSFile> {
|
||||
private final BlobToFileInfo blob2ObjectMd;
|
||||
private final PCSFile.Factory objectProvider;
|
||||
|
||||
@Inject
|
||||
BlobToPCSFile(BlobToFileInfo blob2ObjectMd, PCSFile.Factory objectProvider) {
|
||||
this.blob2ObjectMd = blob2ObjectMd;
|
||||
this.objectProvider = objectProvider;
|
||||
}
|
||||
|
||||
public PCSFile apply(Blob from) {
|
||||
PCSFile object = objectProvider.create(blob2ObjectMd.apply(from.getMetadata()));
|
||||
object.setPayload(from.getPayload());
|
||||
object.setAllHeaders(from.getAllHeaders());
|
||||
return object;
|
||||
}
|
||||
}
|
|
@ -1,57 +0,0 @@
|
|||
/**
|
||||
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||
* contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. jclouds licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
package org.jclouds.mezeo.pcs.blobstore.functions;
|
||||
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
import javax.inject.Singleton;
|
||||
|
||||
import org.jclouds.blobstore.domain.MutableBlobMetadata;
|
||||
import org.jclouds.blobstore.domain.StorageType;
|
||||
import org.jclouds.blobstore.domain.internal.MutableBlobMetadataImpl;
|
||||
import org.jclouds.mezeo.pcs.domain.FileInfo;
|
||||
import org.jclouds.util.Strings2;
|
||||
|
||||
import com.google.common.base.Function;
|
||||
|
||||
/**
|
||||
* @author Adrian Cole
|
||||
*/
|
||||
@Singleton
|
||||
public class FileInfoToBlobMetadata implements Function<FileInfo, MutableBlobMetadata> {
|
||||
public static final Pattern OBJECTS_PATTERN = Pattern.compile(".*objects/");
|
||||
|
||||
@Override
|
||||
public MutableBlobMetadata apply(FileInfo from) {
|
||||
MutableBlobMetadata to = new MutableBlobMetadataImpl();
|
||||
if (from.getUrl() != null) {
|
||||
to.setId(Strings2.replaceAll(from.getUrl().getPath(), OBJECTS_PATTERN, ""));
|
||||
}
|
||||
to.setUri(from.getUrl());
|
||||
to.setName(from.getName());
|
||||
if (from.getMimeType() != null)
|
||||
to.getContentMetadata().setContentType(from.getMimeType());
|
||||
if (from.getModified() != null)
|
||||
to.setLastModified(from.getModified());
|
||||
if (from.getBytes() != null)
|
||||
to.getContentMetadata().setContentLength(from.getBytes());
|
||||
to.setType(StorageType.BLOB);
|
||||
return to;
|
||||
}
|
||||
}
|
|
@ -1,50 +0,0 @@
|
|||
/**
|
||||
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||
* contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. jclouds licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
package org.jclouds.mezeo.pcs.blobstore.functions;
|
||||
|
||||
import javax.inject.Inject;
|
||||
import javax.inject.Singleton;
|
||||
|
||||
import org.jclouds.blobstore.domain.Blob;
|
||||
import org.jclouds.blobstore.domain.Blob.Factory;
|
||||
import org.jclouds.mezeo.pcs.domain.PCSFile;
|
||||
|
||||
import com.google.common.base.Function;
|
||||
|
||||
/**
|
||||
* @author Adrian Cole
|
||||
*/
|
||||
@Singleton
|
||||
public class PCSFileToBlob implements Function<PCSFile, Blob> {
|
||||
private final Blob.Factory blobFactory;
|
||||
private final FileInfoToBlobMetadata info2BlobMd;
|
||||
|
||||
@Inject
|
||||
PCSFileToBlob(Factory blobFactory, FileInfoToBlobMetadata info2BlobMd) {
|
||||
this.blobFactory = blobFactory;
|
||||
this.info2BlobMd = info2BlobMd;
|
||||
}
|
||||
|
||||
public Blob apply(PCSFile from) {
|
||||
Blob blob = blobFactory.create(info2BlobMd.apply(from.getMetadata()));
|
||||
blob.setPayload(from.getPayload());
|
||||
blob.setAllHeaders(from.getAllHeaders());
|
||||
return blob;
|
||||
}
|
||||
}
|
|
@ -1,64 +0,0 @@
|
|||
/**
|
||||
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||
* contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. jclouds licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
package org.jclouds.mezeo.pcs.config;
|
||||
|
||||
import javax.inject.Inject;
|
||||
import javax.inject.Provider;
|
||||
|
||||
import org.jclouds.blobstore.config.BlobStoreObjectModule;
|
||||
import org.jclouds.mezeo.pcs.domain.MutableFileInfo;
|
||||
import org.jclouds.mezeo.pcs.domain.PCSFile;
|
||||
import org.jclouds.mezeo.pcs.domain.internal.PCSFileImpl;
|
||||
|
||||
import com.google.inject.AbstractModule;
|
||||
import com.google.inject.Provides;
|
||||
import com.google.inject.Scopes;
|
||||
|
||||
/**
|
||||
* Configures the domain object mappings needed for all PCS implementations
|
||||
*
|
||||
* @author Adrian Cole
|
||||
*/
|
||||
public class PCSObjectModule extends AbstractModule {
|
||||
|
||||
/**
|
||||
* explicit factories are created here as it has been shown that Assisted Inject is extremely
|
||||
* inefficient. http://code.google.com/p/google-guice/issues/detail?id=435
|
||||
*/
|
||||
@Override
|
||||
protected void configure() {
|
||||
// for adapters
|
||||
install(new BlobStoreObjectModule());
|
||||
bind(PCSFile.Factory.class).to(PCSFileFactory.class).in(Scopes.SINGLETON);
|
||||
}
|
||||
|
||||
private static class PCSFileFactory implements PCSFile.Factory {
|
||||
@Inject
|
||||
Provider<MutableFileInfo> metadataProvider;
|
||||
|
||||
public PCSFile create(MutableFileInfo metadata) {
|
||||
return new PCSFileImpl(metadata != null ? metadata : metadataProvider.get());
|
||||
}
|
||||
}
|
||||
|
||||
@Provides
|
||||
PCSFile providePCSFile(PCSFile.Factory factory) {
|
||||
return factory.create(null);
|
||||
}
|
||||
}
|
|
@ -1,139 +0,0 @@
|
|||
/**
|
||||
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||
* contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. jclouds licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
package org.jclouds.mezeo.pcs.config;
|
||||
|
||||
import java.net.URI;
|
||||
import java.util.concurrent.ExecutionException;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
import java.util.concurrent.TimeoutException;
|
||||
|
||||
import javax.inject.Named;
|
||||
import javax.inject.Singleton;
|
||||
|
||||
import org.jclouds.Constants;
|
||||
import org.jclouds.http.HttpRetryHandler;
|
||||
import org.jclouds.http.RequiresHttp;
|
||||
import org.jclouds.http.annotation.ClientError;
|
||||
import org.jclouds.mezeo.pcs.PCSAsyncClient;
|
||||
import org.jclouds.mezeo.pcs.PCSClient;
|
||||
import org.jclouds.mezeo.pcs.PCSCloudAsyncClient;
|
||||
import org.jclouds.mezeo.pcs.PCSCloudAsyncClient.Response;
|
||||
import org.jclouds.mezeo.pcs.endpoints.Contacts;
|
||||
import org.jclouds.mezeo.pcs.endpoints.Metacontainers;
|
||||
import org.jclouds.mezeo.pcs.endpoints.Projects;
|
||||
import org.jclouds.mezeo.pcs.endpoints.Recyclebin;
|
||||
import org.jclouds.mezeo.pcs.endpoints.RootContainer;
|
||||
import org.jclouds.mezeo.pcs.endpoints.Shares;
|
||||
import org.jclouds.mezeo.pcs.endpoints.Tags;
|
||||
import org.jclouds.mezeo.pcs.endpoints.WebDAV;
|
||||
import org.jclouds.mezeo.pcs.handlers.PCSClientErrorRetryHandler;
|
||||
import org.jclouds.rest.AsyncClientFactory;
|
||||
import org.jclouds.rest.ConfiguresRestClient;
|
||||
import org.jclouds.rest.config.RestClientModule;
|
||||
|
||||
import com.google.inject.Provides;
|
||||
|
||||
/**
|
||||
* Configures the PCSCloudModule authentication service connection.
|
||||
*
|
||||
* @author Adrian Cole
|
||||
*/
|
||||
@RequiresHttp
|
||||
@ConfiguresRestClient
|
||||
public class PCSRestClientModule extends RestClientModule<PCSClient, PCSAsyncClient> {
|
||||
|
||||
@Override
|
||||
protected void configure() {
|
||||
install(new PCSObjectModule());
|
||||
super.configure();
|
||||
}
|
||||
|
||||
public PCSRestClientModule() {
|
||||
super(PCSClient.class, PCSAsyncClient.class);
|
||||
}
|
||||
|
||||
@Provides
|
||||
@Singleton
|
||||
protected Response provideCloudResponse(AsyncClientFactory factory) throws InterruptedException, ExecutionException,
|
||||
TimeoutException {
|
||||
return factory.create(PCSCloudAsyncClient.class).authenticate().get(10, TimeUnit.SECONDS);
|
||||
}
|
||||
|
||||
@Provides
|
||||
@Singleton
|
||||
@WebDAV
|
||||
protected URI provideWebDAVURI(@Named(Constants.PROPERTY_ENDPOINT) String endpoint) {
|
||||
return URI.create(endpoint + "/dav");
|
||||
}
|
||||
|
||||
@Provides
|
||||
@Singleton
|
||||
@Contacts
|
||||
protected URI provideContactsUrl(Response response) {
|
||||
return response.getContactsUrl();
|
||||
}
|
||||
|
||||
@Provides
|
||||
@Singleton
|
||||
@Metacontainers
|
||||
protected URI provideMetacontainersUrl(Response response) {
|
||||
return response.getMetacontainersUrl();
|
||||
}
|
||||
|
||||
@Provides
|
||||
@Singleton
|
||||
@Projects
|
||||
protected URI provideProjectsUrl(Response response) {
|
||||
return response.getProjectsUrl();
|
||||
}
|
||||
|
||||
@Provides
|
||||
@Singleton
|
||||
@Recyclebin
|
||||
protected URI provideRecyclebinUrl(Response response) {
|
||||
return response.getRecyclebinUrl();
|
||||
}
|
||||
|
||||
@Provides
|
||||
@Singleton
|
||||
@RootContainer
|
||||
protected URI provideRootContainerUrl(Response response) {
|
||||
return response.getRootContainerUrl();
|
||||
}
|
||||
|
||||
@Provides
|
||||
@Singleton
|
||||
@Shares
|
||||
protected URI provideSharesUrl(Response response) {
|
||||
return response.getSharesUrl();
|
||||
}
|
||||
|
||||
@Provides
|
||||
@Singleton
|
||||
@Tags
|
||||
protected URI provideTagsUrl(Response response) {
|
||||
return response.getTagsUrl();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void bindRetryHandlers() {
|
||||
bind(HttpRetryHandler.class).annotatedWith(ClientError.class).to(PCSClientErrorRetryHandler.class);
|
||||
}
|
||||
|
||||
}
|
|
@ -1,37 +0,0 @@
|
|||
/**
|
||||
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||
* contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. jclouds licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
package org.jclouds.mezeo.pcs.domain;
|
||||
|
||||
import java.net.URI;
|
||||
|
||||
import org.jclouds.mezeo.pcs.domain.internal.ContainerInfoImpl;
|
||||
|
||||
import com.google.inject.ImplementedBy;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Adrian Cole
|
||||
*
|
||||
*/
|
||||
@ImplementedBy(ContainerInfoImpl.class)
|
||||
public interface ContainerInfo extends ResourceInfo {
|
||||
|
||||
URI getContents();
|
||||
|
||||
}
|
|
@ -1,37 +0,0 @@
|
|||
/**
|
||||
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||
* contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. jclouds licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
package org.jclouds.mezeo.pcs.domain;
|
||||
|
||||
import java.net.URI;
|
||||
import java.util.Map;
|
||||
import java.util.SortedSet;
|
||||
|
||||
import org.jclouds.mezeo.pcs.domain.internal.ContainerListImpl;
|
||||
|
||||
import com.google.inject.ImplementedBy;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Adrian Cole
|
||||
*
|
||||
*/
|
||||
@ImplementedBy(ContainerListImpl.class)
|
||||
public interface ContainerList extends ResourceInfo, SortedSet<ResourceInfo> {
|
||||
Map<String, URI> getMetadataItems();
|
||||
}
|
|
@ -1,44 +0,0 @@
|
|||
/**
|
||||
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||
* contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. jclouds licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
package org.jclouds.mezeo.pcs.domain;
|
||||
|
||||
import java.net.URI;
|
||||
|
||||
import org.jclouds.mezeo.pcs.domain.internal.FileInfoImpl;
|
||||
|
||||
import com.google.inject.ImplementedBy;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Adrian Cole
|
||||
*
|
||||
*/
|
||||
@ImplementedBy(FileInfoImpl.class)
|
||||
public interface FileInfo extends ResourceInfo {
|
||||
|
||||
Boolean isPublic();
|
||||
|
||||
String getMimeType();
|
||||
|
||||
URI getContent();
|
||||
|
||||
URI getPermissions();
|
||||
|
||||
URI getThumbnail();
|
||||
}
|
|
@ -1,36 +0,0 @@
|
|||
/**
|
||||
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||
* contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. jclouds licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
package org.jclouds.mezeo.pcs.domain;
|
||||
|
||||
import java.net.URI;
|
||||
import java.util.Map;
|
||||
|
||||
import org.jclouds.mezeo.pcs.domain.internal.FileInfoWithMetadataImpl;
|
||||
|
||||
import com.google.inject.ImplementedBy;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Adrian Cole
|
||||
*
|
||||
*/
|
||||
@ImplementedBy(FileInfoWithMetadataImpl.class)
|
||||
public interface FileInfoWithMetadata extends FileInfo {
|
||||
Map<String, URI> getMetadataItems();
|
||||
}
|
|
@ -1,44 +0,0 @@
|
|||
/**
|
||||
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||
* contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. jclouds licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
package org.jclouds.mezeo.pcs.domain;
|
||||
|
||||
import java.net.URI;
|
||||
|
||||
import org.jclouds.mezeo.pcs.domain.internal.MutableFileInfoImpl;
|
||||
|
||||
import com.google.inject.ImplementedBy;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Adrian Cole
|
||||
*
|
||||
*/
|
||||
@ImplementedBy(MutableFileInfoImpl.class)
|
||||
public interface MutableFileInfo extends FileInfo, MutableResourceInfo {
|
||||
|
||||
void setPublic(Boolean isPublic);
|
||||
|
||||
void setMimeType(String value);
|
||||
|
||||
void setContent(URI value);
|
||||
|
||||
void setPermissions(URI value);
|
||||
|
||||
void setThumbnail(URI value);
|
||||
}
|
|
@ -1,64 +0,0 @@
|
|||
/**
|
||||
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||
* contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. jclouds licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
package org.jclouds.mezeo.pcs.domain;
|
||||
|
||||
import java.net.URI;
|
||||
import java.util.Date;
|
||||
|
||||
import org.jclouds.blobstore.domain.StorageType;
|
||||
import org.jclouds.mezeo.pcs.domain.internal.MutableResourceInfoImpl;
|
||||
|
||||
import com.google.inject.ImplementedBy;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Adrian Cole
|
||||
*
|
||||
*/
|
||||
@ImplementedBy(MutableResourceInfoImpl.class)
|
||||
public interface MutableResourceInfo extends ResourceInfo {
|
||||
void setType(StorageType value);
|
||||
|
||||
void setUrl(URI value);
|
||||
|
||||
void setName(String value);
|
||||
|
||||
void setCreated(Date value);
|
||||
|
||||
void setInProject(Boolean value);
|
||||
|
||||
void setModified(Date value);
|
||||
|
||||
void setOwner(String value);
|
||||
|
||||
void setVersion(Integer value);
|
||||
|
||||
void setShared(Boolean value);
|
||||
|
||||
void setAccessed(Date value);
|
||||
|
||||
void setBytes(Long value);
|
||||
|
||||
void setMetadata(URI value);
|
||||
|
||||
void setParent(URI value);
|
||||
|
||||
void setTags(URI value);
|
||||
|
||||
}
|
|
@ -1,44 +0,0 @@
|
|||
/**
|
||||
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||
* contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. jclouds licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
package org.jclouds.mezeo.pcs.domain;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
|
||||
import org.jclouds.io.PayloadEnclosing;
|
||||
|
||||
import com.google.common.collect.Multimap;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Adrian Cole
|
||||
*/
|
||||
public interface PCSFile extends PayloadEnclosing, Comparable<PCSFile> {
|
||||
public interface Factory {
|
||||
PCSFile create(@Nullable MutableFileInfo metadata);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return System and User metadata relevant to this object.
|
||||
*/
|
||||
MutableFileInfo getMetadata();
|
||||
|
||||
Multimap<String, String> getAllHeaders();
|
||||
|
||||
void setAllHeaders(Multimap<String, String> allHeaders);
|
||||
}
|
|
@ -1,64 +0,0 @@
|
|||
/**
|
||||
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||
* contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. jclouds licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
package org.jclouds.mezeo.pcs.domain;
|
||||
|
||||
import java.net.URI;
|
||||
import java.util.Date;
|
||||
|
||||
import org.jclouds.blobstore.domain.StorageType;
|
||||
import org.jclouds.mezeo.pcs.domain.internal.ResourceInfoImpl;
|
||||
|
||||
import com.google.inject.ImplementedBy;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Adrian Cole
|
||||
*
|
||||
*/
|
||||
@ImplementedBy(ResourceInfoImpl.class)
|
||||
public interface ResourceInfo extends Comparable<ResourceInfo> {
|
||||
StorageType getType();
|
||||
|
||||
URI getUrl();
|
||||
|
||||
String getName();
|
||||
|
||||
Date getCreated();
|
||||
|
||||
Boolean isInProject();
|
||||
|
||||
Date getModified();
|
||||
|
||||
String getOwner();
|
||||
|
||||
Integer getVersion();
|
||||
|
||||
Boolean isShared();
|
||||
|
||||
Date getAccessed();
|
||||
|
||||
Long getBytes();
|
||||
|
||||
URI getMetadata();
|
||||
|
||||
URI getParent();
|
||||
|
||||
URI getTags();
|
||||
|
||||
}
|
|
@ -1,72 +0,0 @@
|
|||
/**
|
||||
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||
* contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. jclouds licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
package org.jclouds.mezeo.pcs.domain.internal;
|
||||
|
||||
import java.net.URI;
|
||||
import java.util.Date;
|
||||
|
||||
import org.jclouds.blobstore.domain.StorageType;
|
||||
import org.jclouds.mezeo.pcs.domain.ContainerInfo;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Adrian Cole
|
||||
*
|
||||
*/
|
||||
public class ContainerInfoImpl extends ResourceInfoImpl implements ContainerInfo {
|
||||
private final URI contents;
|
||||
|
||||
public ContainerInfoImpl(URI url, String name, Date created, boolean inProject, Date modified,
|
||||
String owner, int version, boolean shared, Date accessed, long bytes, URI contents,
|
||||
URI tags, URI metadata, URI parent) {
|
||||
super(StorageType.FOLDER, url, name, created, inProject, modified, owner, version, shared,
|
||||
accessed, bytes, tags, metadata, parent);
|
||||
this.contents = contents;
|
||||
}
|
||||
|
||||
public URI getContents() {
|
||||
return contents;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
final int prime = 31;
|
||||
int result = super.hashCode();
|
||||
result = prime * result + ((contents == null) ? 0 : contents.hashCode());
|
||||
return result;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object obj) {
|
||||
if (this == obj)
|
||||
return true;
|
||||
if (!super.equals(obj))
|
||||
return false;
|
||||
if (getClass() != obj.getClass())
|
||||
return false;
|
||||
ContainerInfoImpl other = (ContainerInfoImpl) obj;
|
||||
if (contents == null) {
|
||||
if (other.contents != null)
|
||||
return false;
|
||||
} else if (!contents.equals(other.contents))
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
|
@ -1,115 +0,0 @@
|
|||
/**
|
||||
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||
* contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. jclouds licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
package org.jclouds.mezeo.pcs.domain.internal;
|
||||
|
||||
import java.net.URI;
|
||||
import java.util.Date;
|
||||
import java.util.Map;
|
||||
import java.util.SortedSet;
|
||||
import java.util.TreeSet;
|
||||
|
||||
import org.jclouds.blobstore.domain.StorageType;
|
||||
import org.jclouds.mezeo.pcs.domain.ContainerList;
|
||||
import org.jclouds.mezeo.pcs.domain.ResourceInfo;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Adrian Cole
|
||||
*
|
||||
*/
|
||||
public class ContainerListImpl extends TreeSet<ResourceInfo> implements ContainerList {
|
||||
|
||||
private final ResourceInfo info;
|
||||
private final Map<String, URI> metadataItems;
|
||||
|
||||
public ContainerListImpl(URI url, String name, Date created, boolean inProject, Date modified,
|
||||
String owner, int version, boolean shared, Date accessed, long bytes,
|
||||
SortedSet<? extends ResourceInfo> contents, URI tags, URI metadata,
|
||||
Map<String, URI> metadataItems, URI parent) {
|
||||
this.info = new ResourceInfoImpl(StorageType.FOLDER, url, name, created, inProject,
|
||||
modified, owner, version, shared, accessed, bytes, tags, metadata, parent);
|
||||
addAll(contents);
|
||||
this.metadataItems = metadataItems;
|
||||
}
|
||||
|
||||
public Map<String, URI> getMetadataItems() {
|
||||
return metadataItems;
|
||||
}
|
||||
|
||||
public Date getAccessed() {
|
||||
return info.getAccessed();
|
||||
}
|
||||
|
||||
public Long getBytes() {
|
||||
return info.getBytes();
|
||||
}
|
||||
|
||||
public Date getCreated() {
|
||||
return info.getCreated();
|
||||
}
|
||||
|
||||
public URI getMetadata() {
|
||||
return info.getMetadata();
|
||||
}
|
||||
|
||||
public Date getModified() {
|
||||
return info.getModified();
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return info.getName();
|
||||
}
|
||||
|
||||
public String getOwner() {
|
||||
return info.getOwner();
|
||||
}
|
||||
|
||||
public URI getParent() {
|
||||
return info.getParent();
|
||||
}
|
||||
|
||||
public URI getTags() {
|
||||
return info.getTags();
|
||||
}
|
||||
|
||||
public StorageType getType() {
|
||||
return info.getType();
|
||||
}
|
||||
|
||||
public URI getUrl() {
|
||||
return info.getUrl();
|
||||
}
|
||||
|
||||
public Integer getVersion() {
|
||||
return info.getVersion();
|
||||
}
|
||||
|
||||
public Boolean isInProject() {
|
||||
return info.isInProject();
|
||||
}
|
||||
|
||||
public Boolean isShared() {
|
||||
return info.isShared();
|
||||
}
|
||||
|
||||
public int compareTo(ResourceInfo o) {
|
||||
return info.compareTo(o);
|
||||
}
|
||||
|
||||
}
|
|
@ -1,120 +0,0 @@
|
|||
/**
|
||||
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||
* contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. jclouds licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
package org.jclouds.mezeo.pcs.domain.internal;
|
||||
|
||||
import java.net.URI;
|
||||
import java.util.Date;
|
||||
|
||||
import org.jclouds.blobstore.domain.StorageType;
|
||||
import org.jclouds.mezeo.pcs.domain.FileInfo;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Adrian Cole
|
||||
*
|
||||
*/
|
||||
public class FileInfoImpl extends ResourceInfoImpl implements FileInfo {
|
||||
|
||||
private final Boolean isPublic;
|
||||
private final String mimeType;
|
||||
private final URI content;
|
||||
private final URI permissions;
|
||||
private final URI thumbnail;
|
||||
|
||||
public FileInfoImpl(URI url, String name, Date created, boolean inProject,
|
||||
Date modified,
|
||||
String owner, int version, boolean shared, Date accessed,
|
||||
boolean isPublic, String mimeType, long bytes, URI content, URI parent,
|
||||
URI permissions, URI tags, URI metadata, URI thumbnail) {
|
||||
super(StorageType.BLOB, url, name, created, inProject, modified, owner, version, shared,
|
||||
accessed, bytes, tags, metadata, parent);
|
||||
this.isPublic = isPublic;
|
||||
this.mimeType = mimeType;
|
||||
this.content=content;
|
||||
this.permissions = permissions;
|
||||
this.thumbnail = thumbnail;
|
||||
}
|
||||
|
||||
public Boolean isPublic() {
|
||||
return isPublic;
|
||||
}
|
||||
|
||||
public String getMimeType() {
|
||||
return mimeType;
|
||||
}
|
||||
|
||||
public URI getContent() {
|
||||
return content;
|
||||
}
|
||||
|
||||
public URI getPermissions() {
|
||||
return permissions;
|
||||
}
|
||||
|
||||
public URI getThumbnail() {
|
||||
return thumbnail;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
final int prime = 31;
|
||||
int result = super.hashCode();
|
||||
result = prime * result + ((content == null) ? 0 : content.hashCode());
|
||||
result = prime * result + (isPublic ? 1231 : 1237);
|
||||
result = prime * result + ((mimeType == null) ? 0 : mimeType.hashCode());
|
||||
result = prime * result + ((permissions == null) ? 0 : permissions.hashCode());
|
||||
result = prime * result + ((thumbnail == null) ? 0 : thumbnail.hashCode());
|
||||
return result;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object obj) {
|
||||
if (this == obj)
|
||||
return true;
|
||||
if (!super.equals(obj))
|
||||
return false;
|
||||
if (getClass() != obj.getClass())
|
||||
return false;
|
||||
FileInfoImpl other = (FileInfoImpl) obj;
|
||||
if (content == null) {
|
||||
if (other.content != null)
|
||||
return false;
|
||||
} else if (!content.equals(other.content))
|
||||
return false;
|
||||
if (isPublic != other.isPublic)
|
||||
return false;
|
||||
if (mimeType == null) {
|
||||
if (other.mimeType != null)
|
||||
return false;
|
||||
} else if (!mimeType.equals(other.mimeType))
|
||||
return false;
|
||||
if (permissions == null) {
|
||||
if (other.permissions != null)
|
||||
return false;
|
||||
} else if (!permissions.equals(other.permissions))
|
||||
return false;
|
||||
if (thumbnail == null) {
|
||||
if (other.thumbnail != null)
|
||||
return false;
|
||||
} else if (!thumbnail.equals(other.thumbnail))
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
|
@ -1,72 +0,0 @@
|
|||
/**
|
||||
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||
* contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. jclouds licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
package org.jclouds.mezeo.pcs.domain.internal;
|
||||
|
||||
import java.net.URI;
|
||||
import java.util.Date;
|
||||
import java.util.Map;
|
||||
|
||||
import org.jclouds.mezeo.pcs.domain.FileInfoWithMetadata;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Adrian Cole
|
||||
*
|
||||
*/
|
||||
public class FileInfoWithMetadataImpl extends FileInfoImpl implements FileInfoWithMetadata {
|
||||
private final Map<String, URI> metadataItems;
|
||||
|
||||
public FileInfoWithMetadataImpl(URI url, String name, Date created, boolean inProject,
|
||||
Date modified, String owner, int version, boolean shared, Date accessed,
|
||||
boolean isPublic, String mimeType, long bytes, URI content, URI parent,
|
||||
URI permissions, URI tags, URI metadata, Map<String, URI> metadataItems, URI thumbnail) {
|
||||
super(url, name, created, inProject, modified, owner, version, shared, accessed, isPublic,
|
||||
mimeType, bytes, content, parent, permissions, tags, metadata, thumbnail);
|
||||
this.metadataItems = metadataItems;
|
||||
}
|
||||
|
||||
public Map<String, URI> getMetadataItems() {
|
||||
return metadataItems;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
final int prime = 31;
|
||||
int result = super.hashCode();
|
||||
result = prime * result + ((metadataItems == null) ? 0 : metadataItems.hashCode());
|
||||
return result;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object obj) {
|
||||
if (this == obj)
|
||||
return true;
|
||||
if (!super.equals(obj))
|
||||
return false;
|
||||
if (getClass() != obj.getClass())
|
||||
return false;
|
||||
FileInfoWithMetadataImpl other = (FileInfoWithMetadataImpl) obj;
|
||||
if (metadataItems == null) {
|
||||
if (other.metadataItems != null)
|
||||
return false;
|
||||
} else if (!metadataItems.equals(other.metadataItems))
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
}
|
|
@ -1,135 +0,0 @@
|
|||
/**
|
||||
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||
* contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. jclouds licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
package org.jclouds.mezeo.pcs.domain.internal;
|
||||
|
||||
import java.net.URI;
|
||||
|
||||
import javax.ws.rs.core.MediaType;
|
||||
|
||||
import org.jclouds.blobstore.domain.StorageType;
|
||||
import org.jclouds.mezeo.pcs.domain.MutableFileInfo;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Adrian Cole
|
||||
*
|
||||
*/
|
||||
public class MutableFileInfoImpl extends MutableResourceInfoImpl implements
|
||||
MutableFileInfo {
|
||||
|
||||
private Boolean isPublic;
|
||||
private String mimeType;
|
||||
private URI content;
|
||||
private URI permissions;
|
||||
private URI thumbnail;
|
||||
|
||||
public MutableFileInfoImpl() {
|
||||
setType(StorageType.BLOB);
|
||||
setMimeType(MediaType.APPLICATION_OCTET_STREAM);
|
||||
}
|
||||
|
||||
public String getMimeType() {
|
||||
return mimeType;
|
||||
}
|
||||
|
||||
public URI getContent() {
|
||||
return content;
|
||||
}
|
||||
|
||||
public URI getPermissions() {
|
||||
return permissions;
|
||||
}
|
||||
|
||||
public URI getThumbnail() {
|
||||
return thumbnail;
|
||||
}
|
||||
|
||||
public void setPublic(Boolean isPublic) {
|
||||
this.isPublic = isPublic;
|
||||
}
|
||||
|
||||
public Boolean isPublic() {
|
||||
return isPublic;
|
||||
}
|
||||
|
||||
public void setMimeType(String mimeType) {
|
||||
this.mimeType = mimeType;
|
||||
}
|
||||
|
||||
public void setContent(URI content) {
|
||||
this.content = content;
|
||||
}
|
||||
|
||||
public void setPermissions(URI permissions) {
|
||||
this.permissions = permissions;
|
||||
}
|
||||
|
||||
public void setThumbnail(URI thumbnail) {
|
||||
this.thumbnail = thumbnail;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
final int prime = 31;
|
||||
int result = super.hashCode();
|
||||
result = prime * result + ((content == null) ? 0 : content.hashCode());
|
||||
result = prime * result + ((isPublic == null) ? 0 : isPublic.hashCode());
|
||||
result = prime * result + ((mimeType == null) ? 0 : mimeType.hashCode());
|
||||
result = prime * result + ((permissions == null) ? 0 : permissions.hashCode());
|
||||
result = prime * result + ((thumbnail == null) ? 0 : thumbnail.hashCode());
|
||||
return result;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object obj) {
|
||||
if (this == obj)
|
||||
return true;
|
||||
if (!super.equals(obj))
|
||||
return false;
|
||||
if (getClass() != obj.getClass())
|
||||
return false;
|
||||
MutableFileInfoImpl other = (MutableFileInfoImpl) obj;
|
||||
if (content == null) {
|
||||
if (other.content != null)
|
||||
return false;
|
||||
} else if (!content.equals(other.content))
|
||||
return false;
|
||||
if (isPublic == null) {
|
||||
if (other.isPublic != null)
|
||||
return false;
|
||||
} else if (!isPublic.equals(other.isPublic))
|
||||
return false;
|
||||
if (mimeType == null) {
|
||||
if (other.mimeType != null)
|
||||
return false;
|
||||
} else if (!mimeType.equals(other.mimeType))
|
||||
return false;
|
||||
if (permissions == null) {
|
||||
if (other.permissions != null)
|
||||
return false;
|
||||
} else if (!permissions.equals(other.permissions))
|
||||
return false;
|
||||
if (thumbnail == null) {
|
||||
if (other.thumbnail != null)
|
||||
return false;
|
||||
} else if (!thumbnail.equals(other.thumbnail))
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
}
|
|
@ -1,271 +0,0 @@
|
|||
/**
|
||||
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||
* contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. jclouds licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
package org.jclouds.mezeo.pcs.domain.internal;
|
||||
|
||||
import java.net.URI;
|
||||
import java.util.Date;
|
||||
|
||||
import org.jclouds.blobstore.domain.StorageType;
|
||||
import org.jclouds.mezeo.pcs.domain.MutableResourceInfo;
|
||||
import org.jclouds.mezeo.pcs.domain.ResourceInfo;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Adrian Cole
|
||||
*
|
||||
*/
|
||||
public class MutableResourceInfoImpl implements MutableResourceInfo {
|
||||
|
||||
private StorageType type;
|
||||
private URI url;
|
||||
private String name;
|
||||
private Date created;
|
||||
private Boolean inProject;
|
||||
private Date modified;
|
||||
private String owner;
|
||||
private Integer version;
|
||||
private Boolean shared;
|
||||
private Date accessed;
|
||||
private Long bytes;
|
||||
private URI tags;
|
||||
private URI metadata;
|
||||
private URI parent;
|
||||
|
||||
public int compareTo(ResourceInfo o) {
|
||||
if (getName() == null)
|
||||
return -1;
|
||||
return (this == o) ? 0 : getName().compareTo(o.getName());
|
||||
}
|
||||
|
||||
public StorageType getType() {
|
||||
return type;
|
||||
}
|
||||
|
||||
public void setType(StorageType type) {
|
||||
this.type = type;
|
||||
}
|
||||
|
||||
public URI getUrl() {
|
||||
return url;
|
||||
}
|
||||
|
||||
public void setUrl(URI url) {
|
||||
this.url = url;
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
public void setName(String name) {
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
public Date getCreated() {
|
||||
return created;
|
||||
}
|
||||
|
||||
public void setCreated(Date created) {
|
||||
this.created = created;
|
||||
}
|
||||
|
||||
public Boolean isInProject() {
|
||||
return inProject;
|
||||
}
|
||||
|
||||
public void setInProject(Boolean inProject) {
|
||||
this.inProject = inProject;
|
||||
}
|
||||
|
||||
public Date getModified() {
|
||||
return modified;
|
||||
}
|
||||
|
||||
public void setModified(Date modified) {
|
||||
this.modified = modified;
|
||||
}
|
||||
|
||||
public String getOwner() {
|
||||
return owner;
|
||||
}
|
||||
|
||||
public void setOwner(String owner) {
|
||||
this.owner = owner;
|
||||
}
|
||||
|
||||
public Integer getVersion() {
|
||||
return version;
|
||||
}
|
||||
|
||||
public void setVersion(Integer version) {
|
||||
this.version = version;
|
||||
}
|
||||
|
||||
public Boolean isShared() {
|
||||
return shared;
|
||||
}
|
||||
|
||||
public void setShared(Boolean shared) {
|
||||
this.shared = shared;
|
||||
}
|
||||
|
||||
public Date getAccessed() {
|
||||
return accessed;
|
||||
}
|
||||
|
||||
public void setAccessed(Date accessed) {
|
||||
this.accessed = accessed;
|
||||
}
|
||||
|
||||
public Long getBytes() {
|
||||
return bytes;
|
||||
}
|
||||
|
||||
public void setBytes(Long bytes) {
|
||||
this.bytes = bytes;
|
||||
}
|
||||
|
||||
public URI getTags() {
|
||||
return tags;
|
||||
}
|
||||
|
||||
public void setTags(URI tags) {
|
||||
this.tags = tags;
|
||||
}
|
||||
|
||||
public URI getMetadata() {
|
||||
return metadata;
|
||||
}
|
||||
|
||||
public void setMetadata(URI metadata) {
|
||||
this.metadata = metadata;
|
||||
}
|
||||
|
||||
public URI getParent() {
|
||||
return parent;
|
||||
}
|
||||
|
||||
public void setParent(URI parent) {
|
||||
this.parent = parent;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
final int prime = 31;
|
||||
int result = 1;
|
||||
result = prime * result + ((accessed == null) ? 0 : accessed.hashCode());
|
||||
result = prime * result + ((bytes == null) ? 0 : bytes.hashCode());
|
||||
result = prime * result + ((created == null) ? 0 : created.hashCode());
|
||||
result = prime * result + ((inProject == null) ? 0 : inProject.hashCode());
|
||||
result = prime * result + ((metadata == null) ? 0 : metadata.hashCode());
|
||||
result = prime * result + ((modified == null) ? 0 : modified.hashCode());
|
||||
result = prime * result + ((name == null) ? 0 : name.hashCode());
|
||||
result = prime * result + ((owner == null) ? 0 : owner.hashCode());
|
||||
result = prime * result + ((parent == null) ? 0 : parent.hashCode());
|
||||
result = prime * result + ((shared == null) ? 0 : shared.hashCode());
|
||||
result = prime * result + ((tags == null) ? 0 : tags.hashCode());
|
||||
result = prime * result + ((type == null) ? 0 : type.hashCode());
|
||||
result = prime * result + ((url == null) ? 0 : url.hashCode());
|
||||
result = prime * result + ((version == null) ? 0 : version.hashCode());
|
||||
return result;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object obj) {
|
||||
if (this == obj)
|
||||
return true;
|
||||
if (obj == null)
|
||||
return false;
|
||||
if (getClass() != obj.getClass())
|
||||
return false;
|
||||
MutableResourceInfoImpl other = (MutableResourceInfoImpl) obj;
|
||||
if (accessed == null) {
|
||||
if (other.accessed != null)
|
||||
return false;
|
||||
} else if (!accessed.equals(other.accessed))
|
||||
return false;
|
||||
if (bytes == null) {
|
||||
if (other.bytes != null)
|
||||
return false;
|
||||
} else if (!bytes.equals(other.bytes))
|
||||
return false;
|
||||
if (created == null) {
|
||||
if (other.created != null)
|
||||
return false;
|
||||
} else if (!created.equals(other.created))
|
||||
return false;
|
||||
if (inProject == null) {
|
||||
if (other.inProject != null)
|
||||
return false;
|
||||
} else if (!inProject.equals(other.inProject))
|
||||
return false;
|
||||
if (metadata == null) {
|
||||
if (other.metadata != null)
|
||||
return false;
|
||||
} else if (!metadata.equals(other.metadata))
|
||||
return false;
|
||||
if (modified == null) {
|
||||
if (other.modified != null)
|
||||
return false;
|
||||
} else if (!modified.equals(other.modified))
|
||||
return false;
|
||||
if (name == null) {
|
||||
if (other.name != null)
|
||||
return false;
|
||||
} else if (!name.equals(other.name))
|
||||
return false;
|
||||
if (owner == null) {
|
||||
if (other.owner != null)
|
||||
return false;
|
||||
} else if (!owner.equals(other.owner))
|
||||
return false;
|
||||
if (parent == null) {
|
||||
if (other.parent != null)
|
||||
return false;
|
||||
} else if (!parent.equals(other.parent))
|
||||
return false;
|
||||
if (shared == null) {
|
||||
if (other.shared != null)
|
||||
return false;
|
||||
} else if (!shared.equals(other.shared))
|
||||
return false;
|
||||
if (tags == null) {
|
||||
if (other.tags != null)
|
||||
return false;
|
||||
} else if (!tags.equals(other.tags))
|
||||
return false;
|
||||
if (type == null) {
|
||||
if (other.type != null)
|
||||
return false;
|
||||
} else if (!type.equals(other.type))
|
||||
return false;
|
||||
if (url == null) {
|
||||
if (other.url != null)
|
||||
return false;
|
||||
} else if (!url.equals(other.url))
|
||||
return false;
|
||||
if (version == null) {
|
||||
if (other.version != null)
|
||||
return false;
|
||||
} else if (!version.equals(other.version))
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
|
@ -1,78 +0,0 @@
|
|||
/**
|
||||
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||
* contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. jclouds licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
package org.jclouds.mezeo.pcs.domain.internal;
|
||||
|
||||
import static com.google.common.base.Preconditions.checkNotNull;
|
||||
|
||||
import javax.inject.Inject;
|
||||
|
||||
import org.jclouds.http.internal.PayloadEnclosingImpl;
|
||||
import org.jclouds.mezeo.pcs.domain.MutableFileInfo;
|
||||
import org.jclouds.mezeo.pcs.domain.PCSFile;
|
||||
|
||||
import com.google.common.collect.LinkedHashMultimap;
|
||||
import com.google.common.collect.Multimap;
|
||||
|
||||
/**
|
||||
* Default Implementation of {@link PCSFile}.
|
||||
*
|
||||
* @author Adrian Cole
|
||||
*/
|
||||
public class PCSFileImpl extends PayloadEnclosingImpl implements PCSFile, Comparable<PCSFile> {
|
||||
|
||||
private final MutableFileInfo metadata;
|
||||
private Multimap<String, String> allHeaders = LinkedHashMultimap.create();
|
||||
|
||||
@Inject
|
||||
public PCSFileImpl(MutableFileInfo metadata) {
|
||||
super();// no MD5 support
|
||||
this.metadata = metadata;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
public MutableFileInfo getMetadata() {
|
||||
return metadata;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
public Multimap<String, String> getAllHeaders() {
|
||||
return allHeaders;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
public void setAllHeaders(Multimap<String, String> allHeaders) {
|
||||
this.allHeaders = checkNotNull(allHeaders, "allHeaders");
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
public int compareTo(PCSFile o) {
|
||||
if (getMetadata().getName() == null)
|
||||
return -1;
|
||||
return (this == o) ? 0 : getMetadata().getName().compareTo(o.getMetadata().getName());
|
||||
}
|
||||
|
||||
}
|
|
@ -1,224 +0,0 @@
|
|||
/**
|
||||
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||
* contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. jclouds licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
package org.jclouds.mezeo.pcs.domain.internal;
|
||||
|
||||
import java.net.URI;
|
||||
import java.util.Date;
|
||||
|
||||
import org.jclouds.blobstore.domain.StorageType;
|
||||
import org.jclouds.mezeo.pcs.domain.ResourceInfo;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Adrian Cole
|
||||
*
|
||||
*/
|
||||
public class ResourceInfoImpl implements ResourceInfo {
|
||||
|
||||
private final StorageType type;
|
||||
private final URI url;
|
||||
private final String name;
|
||||
private final Date created;
|
||||
private final boolean inProject;
|
||||
private final Date modified;
|
||||
private final String owner;
|
||||
private final int version;
|
||||
private final boolean shared;
|
||||
private final Date accessed;
|
||||
private final long bytes;
|
||||
private final URI tags;
|
||||
private final URI metadata;
|
||||
private final URI parent;
|
||||
|
||||
protected ResourceInfoImpl(StorageType type, URI url, String name, Date created,
|
||||
boolean inProject, Date modified, String owner, int version, boolean shared,
|
||||
Date accessed, long bytes, URI tags, URI metadata, URI parent) {
|
||||
super();
|
||||
this.type = type;
|
||||
this.url = url;
|
||||
this.name = name;
|
||||
this.created = created;
|
||||
this.inProject = inProject;
|
||||
this.modified = modified;
|
||||
this.owner = owner;
|
||||
this.version = version;
|
||||
this.shared = shared;
|
||||
this.accessed = accessed;
|
||||
this.bytes = bytes;
|
||||
this.tags = tags;
|
||||
this.metadata = metadata;
|
||||
this.parent = parent;
|
||||
}
|
||||
|
||||
public int compareTo(ResourceInfo o) {
|
||||
if (getName() == null)
|
||||
return -1;
|
||||
if (o.getName() == null)
|
||||
return 1;
|
||||
return (this == o) ? 0 : getName().compareTo(o.getName());
|
||||
}
|
||||
|
||||
public StorageType getType() {
|
||||
return type;
|
||||
}
|
||||
|
||||
public URI getUrl() {
|
||||
return url;
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
public Date getCreated() {
|
||||
return created;
|
||||
}
|
||||
|
||||
public Boolean isInProject() {
|
||||
return inProject;
|
||||
}
|
||||
|
||||
public Date getModified() {
|
||||
return modified;
|
||||
}
|
||||
|
||||
public String getOwner() {
|
||||
return owner;
|
||||
}
|
||||
|
||||
public Integer getVersion() {
|
||||
return version;
|
||||
}
|
||||
|
||||
public Boolean isShared() {
|
||||
return shared;
|
||||
}
|
||||
|
||||
public Date getAccessed() {
|
||||
return accessed;
|
||||
}
|
||||
|
||||
public Long getBytes() {
|
||||
return bytes;
|
||||
}
|
||||
|
||||
public URI getTags() {
|
||||
return tags;
|
||||
}
|
||||
|
||||
public URI getMetadata() {
|
||||
return metadata;
|
||||
}
|
||||
|
||||
public URI getParent() {
|
||||
return parent;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
final int prime = 31;
|
||||
int result = 1;
|
||||
result = prime * result + ((accessed == null) ? 0 : accessed.hashCode());
|
||||
result = prime * result + (int) (bytes ^ (bytes >>> 32));
|
||||
result = prime * result + ((created == null) ? 0 : created.hashCode());
|
||||
result = prime * result + (inProject ? 1231 : 1237);
|
||||
result = prime * result + ((metadata == null) ? 0 : metadata.hashCode());
|
||||
result = prime * result + ((modified == null) ? 0 : modified.hashCode());
|
||||
result = prime * result + ((name == null) ? 0 : name.hashCode());
|
||||
result = prime * result + ((owner == null) ? 0 : owner.hashCode());
|
||||
result = prime * result + ((parent == null) ? 0 : parent.hashCode());
|
||||
result = prime * result + (shared ? 1231 : 1237);
|
||||
result = prime * result + ((tags == null) ? 0 : tags.hashCode());
|
||||
result = prime * result + ((type == null) ? 0 : type.hashCode());
|
||||
result = prime * result + ((url == null) ? 0 : url.hashCode());
|
||||
result = prime * result + version;
|
||||
return result;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object obj) {
|
||||
if (this == obj)
|
||||
return true;
|
||||
if (obj == null)
|
||||
return false;
|
||||
if (getClass() != obj.getClass())
|
||||
return false;
|
||||
ResourceInfoImpl other = (ResourceInfoImpl) obj;
|
||||
if (accessed == null) {
|
||||
if (other.accessed != null)
|
||||
return false;
|
||||
} else if (!accessed.equals(other.accessed))
|
||||
return false;
|
||||
if (bytes != other.bytes)
|
||||
return false;
|
||||
if (created == null) {
|
||||
if (other.created != null)
|
||||
return false;
|
||||
} else if (!created.equals(other.created))
|
||||
return false;
|
||||
if (inProject != other.inProject)
|
||||
return false;
|
||||
if (metadata == null) {
|
||||
if (other.metadata != null)
|
||||
return false;
|
||||
} else if (!metadata.equals(other.metadata))
|
||||
return false;
|
||||
if (modified == null) {
|
||||
if (other.modified != null)
|
||||
return false;
|
||||
} else if (!modified.equals(other.modified))
|
||||
return false;
|
||||
if (name == null) {
|
||||
if (other.name != null)
|
||||
return false;
|
||||
} else if (!name.equals(other.name))
|
||||
return false;
|
||||
if (owner == null) {
|
||||
if (other.owner != null)
|
||||
return false;
|
||||
} else if (!owner.equals(other.owner))
|
||||
return false;
|
||||
if (parent == null) {
|
||||
if (other.parent != null)
|
||||
return false;
|
||||
} else if (!parent.equals(other.parent))
|
||||
return false;
|
||||
if (shared != other.shared)
|
||||
return false;
|
||||
if (tags == null) {
|
||||
if (other.tags != null)
|
||||
return false;
|
||||
} else if (!tags.equals(other.tags))
|
||||
return false;
|
||||
if (type == null) {
|
||||
if (other.type != null)
|
||||
return false;
|
||||
} else if (!type.equals(other.type))
|
||||
return false;
|
||||
if (url == null) {
|
||||
if (other.url != null)
|
||||
return false;
|
||||
} else if (!url.equals(other.url))
|
||||
return false;
|
||||
if (version != other.version)
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
|
@ -1,39 +0,0 @@
|
|||
/**
|
||||
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||
* contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. jclouds licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
package org.jclouds.mezeo.pcs.endpoints;
|
||||
|
||||
import java.lang.annotation.ElementType;
|
||||
import java.lang.annotation.Retention;
|
||||
import java.lang.annotation.RetentionPolicy;
|
||||
import java.lang.annotation.Target;
|
||||
|
||||
import javax.inject.Qualifier;
|
||||
|
||||
/**
|
||||
* Related to a resource of type Contacts, which represents the user's contact list.
|
||||
*
|
||||
* @author Adrian Cole
|
||||
*
|
||||
*/
|
||||
@Retention(value = RetentionPolicy.RUNTIME)
|
||||
@Target(value = { ElementType.FIELD, ElementType.PARAMETER, ElementType.METHOD })
|
||||
@Qualifier
|
||||
public @interface Contacts {
|
||||
|
||||
}
|
|
@ -1,40 +0,0 @@
|
|||
/**
|
||||
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||
* contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. jclouds licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
package org.jclouds.mezeo.pcs.endpoints;
|
||||
|
||||
import java.lang.annotation.ElementType;
|
||||
import java.lang.annotation.Retention;
|
||||
import java.lang.annotation.RetentionPolicy;
|
||||
import java.lang.annotation.Target;
|
||||
|
||||
import javax.inject.Qualifier;
|
||||
|
||||
/**
|
||||
* Related to a resource of type MetaContainers, which lists the metacontainers available to the
|
||||
* user.
|
||||
*
|
||||
* @author Adrian Cole
|
||||
*
|
||||
*/
|
||||
@Retention(value = RetentionPolicy.RUNTIME)
|
||||
@Target(value = { ElementType.FIELD, ElementType.PARAMETER, ElementType.METHOD })
|
||||
@Qualifier
|
||||
public @interface Metacontainers {
|
||||
|
||||
}
|
|
@ -1,39 +0,0 @@
|
|||
/**
|
||||
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||
* contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. jclouds licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
package org.jclouds.mezeo.pcs.endpoints;
|
||||
|
||||
import java.lang.annotation.ElementType;
|
||||
import java.lang.annotation.Retention;
|
||||
import java.lang.annotation.RetentionPolicy;
|
||||
import java.lang.annotation.Target;
|
||||
|
||||
import javax.inject.Qualifier;
|
||||
|
||||
/**
|
||||
* Related to a resource of type Projects, which lists the projects available to the user.
|
||||
*
|
||||
* @author Adrian Cole
|
||||
*
|
||||
*/
|
||||
@Retention(value = RetentionPolicy.RUNTIME)
|
||||
@Target(value = { ElementType.FIELD, ElementType.PARAMETER, ElementType.METHOD })
|
||||
@Qualifier
|
||||
public @interface Projects {
|
||||
|
||||
}
|
|
@ -1,39 +0,0 @@
|
|||
/**
|
||||
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||
* contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. jclouds licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
package org.jclouds.mezeo.pcs.endpoints;
|
||||
|
||||
import java.lang.annotation.ElementType;
|
||||
import java.lang.annotation.Retention;
|
||||
import java.lang.annotation.RetentionPolicy;
|
||||
import java.lang.annotation.Target;
|
||||
|
||||
import javax.inject.Qualifier;
|
||||
|
||||
/**
|
||||
* Related to a resource of type RecycleBin, which contains the user's deleted files.
|
||||
*
|
||||
* @author Adrian Cole
|
||||
*
|
||||
*/
|
||||
@Retention(value = RetentionPolicy.RUNTIME)
|
||||
@Target(value = { ElementType.FIELD, ElementType.PARAMETER, ElementType.METHOD })
|
||||
@Qualifier
|
||||
public @interface Recyclebin {
|
||||
|
||||
}
|
|
@ -1,39 +0,0 @@
|
|||
/**
|
||||
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||
* contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. jclouds licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
package org.jclouds.mezeo.pcs.endpoints;
|
||||
|
||||
import java.lang.annotation.ElementType;
|
||||
import java.lang.annotation.Retention;
|
||||
import java.lang.annotation.RetentionPolicy;
|
||||
import java.lang.annotation.Target;
|
||||
|
||||
import javax.inject.Qualifier;
|
||||
|
||||
/**
|
||||
* Related to a resource of type Container, which is the user's root Container
|
||||
*
|
||||
* @author Adrian Cole
|
||||
*
|
||||
*/
|
||||
@Retention(value = RetentionPolicy.RUNTIME)
|
||||
@Target(value = { ElementType.FIELD, ElementType.PARAMETER, ElementType.METHOD })
|
||||
@Qualifier
|
||||
public @interface RootContainer {
|
||||
|
||||
}
|
|
@ -1,39 +0,0 @@
|
|||
/**
|
||||
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||
* contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. jclouds licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
package org.jclouds.mezeo.pcs.endpoints;
|
||||
|
||||
import java.lang.annotation.ElementType;
|
||||
import java.lang.annotation.Retention;
|
||||
import java.lang.annotation.RetentionPolicy;
|
||||
import java.lang.annotation.Target;
|
||||
|
||||
import javax.inject.Qualifier;
|
||||
|
||||
/**
|
||||
* Related to a resource of type Shares, which lists the items shared to and by the user.
|
||||
*
|
||||
* @author Adrian Cole
|
||||
*
|
||||
*/
|
||||
@Retention(value = RetentionPolicy.RUNTIME)
|
||||
@Target(value = { ElementType.FIELD, ElementType.PARAMETER, ElementType.METHOD })
|
||||
@Qualifier
|
||||
public @interface Shares {
|
||||
|
||||
}
|
|
@ -1,39 +0,0 @@
|
|||
/**
|
||||
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||
* contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. jclouds licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
package org.jclouds.mezeo.pcs.endpoints;
|
||||
|
||||
import java.lang.annotation.ElementType;
|
||||
import java.lang.annotation.Retention;
|
||||
import java.lang.annotation.RetentionPolicy;
|
||||
import java.lang.annotation.Target;
|
||||
|
||||
import javax.inject.Qualifier;
|
||||
|
||||
/**
|
||||
* Related to a resource of type Tags, which lists all the tags applied to the user's files.
|
||||
*
|
||||
* @author Adrian Cole
|
||||
*
|
||||
*/
|
||||
@Retention(value = RetentionPolicy.RUNTIME)
|
||||
@Target(value = { ElementType.FIELD, ElementType.PARAMETER, ElementType.METHOD })
|
||||
@Qualifier
|
||||
public @interface Tags {
|
||||
|
||||
}
|
|
@ -1,39 +0,0 @@
|
|||
/**
|
||||
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||
* contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. jclouds licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
package org.jclouds.mezeo.pcs.endpoints;
|
||||
|
||||
import java.lang.annotation.ElementType;
|
||||
import java.lang.annotation.Retention;
|
||||
import java.lang.annotation.RetentionPolicy;
|
||||
import java.lang.annotation.Target;
|
||||
|
||||
import javax.inject.Qualifier;
|
||||
|
||||
/**
|
||||
* Related to a resource of type WebDAV
|
||||
*
|
||||
* @author Adrian Cole
|
||||
*
|
||||
*/
|
||||
@Retention(value = RetentionPolicy.RUNTIME)
|
||||
@Target(value = { ElementType.FIELD, ElementType.PARAMETER, ElementType.METHOD })
|
||||
@Qualifier
|
||||
public @interface WebDAV {
|
||||
|
||||
}
|
|
@ -1,74 +0,0 @@
|
|||
/**
|
||||
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||
* contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. jclouds licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
package org.jclouds.mezeo.pcs.functions;
|
||||
|
||||
import static com.google.common.base.Preconditions.checkArgument;
|
||||
import static com.google.common.base.Preconditions.checkState;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
import javax.inject.Inject;
|
||||
|
||||
import org.jclouds.http.HttpRequest;
|
||||
import org.jclouds.http.HttpResponse;
|
||||
import org.jclouds.http.functions.ReturnStringIf2xx;
|
||||
import org.jclouds.rest.InvocationContext;
|
||||
import org.jclouds.rest.internal.GeneratedHttpRequest;
|
||||
|
||||
import com.google.common.base.Function;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Adrian Cole
|
||||
*/
|
||||
public class AddMetadataItemIntoMap implements Function<HttpResponse, Void>, InvocationContext<AddMetadataItemIntoMap> {
|
||||
ReturnStringIf2xx returnIf200;
|
||||
private GeneratedHttpRequest<?> request;
|
||||
|
||||
@Inject
|
||||
private AddMetadataItemIntoMap(ReturnStringIf2xx returnIf200) {
|
||||
this.returnIf200 = returnIf200;
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
public Void apply(HttpResponse from) {
|
||||
checkState(request.getArgs() != null, "args should be initialized at this point");
|
||||
Map<String, String> map = null;
|
||||
String key = null;
|
||||
for (Object arg : request.getArgs()) {
|
||||
if (arg instanceof Map)
|
||||
map = (Map<String, String>) arg;
|
||||
else if (arg instanceof String)
|
||||
key = arg.toString();
|
||||
}
|
||||
checkState(map != null, "No Map found in args, improper method declarations");
|
||||
checkState(key != null, "No String found in args, improper method declarations");
|
||||
|
||||
map.put(key, returnIf200.apply(from).trim());
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public AddMetadataItemIntoMap setContext(HttpRequest request) {
|
||||
checkArgument(request instanceof GeneratedHttpRequest<?>, "note this handler requires a GeneratedHttpRequest");
|
||||
this.request = (GeneratedHttpRequest<?>) request;
|
||||
return this;
|
||||
}
|
||||
|
||||
}
|
|
@ -1,43 +0,0 @@
|
|||
/**
|
||||
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||
* contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. jclouds licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
package org.jclouds.mezeo.pcs.functions;
|
||||
|
||||
import javax.inject.Singleton;
|
||||
|
||||
import org.jclouds.blobstore.ContainerNotFoundException;
|
||||
|
||||
import com.google.common.base.Function;
|
||||
import com.google.common.base.Throwables;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Adrian Cole
|
||||
*/
|
||||
@Singleton
|
||||
public class ReturnFalseIfContainerNotFound implements Function<Exception, Boolean> {
|
||||
|
||||
@Override
|
||||
public Boolean apply(Exception from) {
|
||||
if (from instanceof ContainerNotFoundException) {
|
||||
return false;
|
||||
}
|
||||
throw Throwables.propagate(from);
|
||||
}
|
||||
|
||||
}
|
|
@ -1,45 +0,0 @@
|
|||
/**
|
||||
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||
* contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. jclouds licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
package org.jclouds.mezeo.pcs.functions;
|
||||
|
||||
import javax.inject.Singleton;
|
||||
|
||||
import org.jclouds.http.HttpResponseException;
|
||||
|
||||
import com.google.common.base.Function;
|
||||
import com.google.common.base.Throwables;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Adrian Cole
|
||||
*/
|
||||
@Singleton
|
||||
public class ReturnTrueIfContainerAlreadyExists implements Function<Exception, Boolean> {
|
||||
@Override
|
||||
public Boolean apply(Exception from) {
|
||||
if (from instanceof HttpResponseException) {
|
||||
HttpResponseException responseException = (HttpResponseException) from;
|
||||
if ("The directory already exists.".equals(responseException.getContent())) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
throw Throwables.propagate(from);
|
||||
}
|
||||
|
||||
}
|
|
@ -1,54 +0,0 @@
|
|||
/**
|
||||
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||
* contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. jclouds licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
package org.jclouds.mezeo.pcs.handlers;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import javax.inject.Inject;
|
||||
|
||||
import org.jclouds.http.HttpCommand;
|
||||
import org.jclouds.http.HttpResponse;
|
||||
import org.jclouds.http.HttpRetryHandler;
|
||||
import org.jclouds.http.handlers.BackoffLimitedRetryHandler;
|
||||
import org.jclouds.logging.Logger;
|
||||
|
||||
/**
|
||||
* Handles Retryable responses with error codes in the 4xx range
|
||||
*
|
||||
* @author Adrian Cole
|
||||
*/
|
||||
public class PCSClientErrorRetryHandler implements HttpRetryHandler {
|
||||
|
||||
private final BackoffLimitedRetryHandler backoffHandler;
|
||||
|
||||
@Inject
|
||||
public PCSClientErrorRetryHandler(BackoffLimitedRetryHandler backoffHandler) {
|
||||
this.backoffHandler = backoffHandler;
|
||||
}
|
||||
|
||||
@Resource
|
||||
protected Logger logger = Logger.NULL;
|
||||
|
||||
public boolean shouldRetryRequest(HttpCommand command, HttpResponse response) {
|
||||
if (response.getStatusCode() == 400) {
|
||||
return backoffHandler.shouldRetryRequest(command, response);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
|
@ -1,85 +0,0 @@
|
|||
/**
|
||||
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||
* contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. jclouds licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
package org.jclouds.mezeo.pcs.options;
|
||||
|
||||
import static com.google.common.base.Preconditions.checkArgument;
|
||||
|
||||
import org.jclouds.http.options.BaseHttpRequestOptions;
|
||||
|
||||
import com.google.common.collect.Multimap;
|
||||
|
||||
/**
|
||||
* Contains options supported in the REST API for the PUT file operation. <h2>
|
||||
* Usage</h2> The recommended way to instantiate a PutFileOptions object is to statically import
|
||||
* PutFileOptions.Builder.* and invoke a static creation method followed by an instance mutator (if
|
||||
* needed):
|
||||
* <p/>
|
||||
* <code>
|
||||
* import static org.jclouds.mezeo.pcs2.options.PutFileOptions.Builder.*
|
||||
* import org.jclouds.mezeo.pcs2.PCSClient;
|
||||
* <p/>
|
||||
* PCSClient connection = // get connection
|
||||
* Future<Void> added = connection.appendFile("container",range(0,3));
|
||||
* <code>
|
||||
*
|
||||
* @author Adrian Cole
|
||||
*/
|
||||
public class PutBlockOptions extends BaseHttpRequestOptions {
|
||||
public static final PutBlockOptions NONE = new PutBlockOptions();
|
||||
private String range;
|
||||
|
||||
@Override
|
||||
public Multimap<String, String> buildRequestHeaders() {
|
||||
Multimap<String, String> headers = super.buildRequestHeaders();
|
||||
String range = getRange();
|
||||
if (range != null)
|
||||
headers.put("Content-Range", this.getRange());
|
||||
return headers;
|
||||
}
|
||||
|
||||
/**
|
||||
* For use in the header Content-Range
|
||||
* <p />
|
||||
*
|
||||
* @see PutBlockOptions#range(long, long)
|
||||
*/
|
||||
public String getRange() {
|
||||
return range;
|
||||
}
|
||||
|
||||
/**
|
||||
* download the specified range of the object.
|
||||
*/
|
||||
public PutBlockOptions range(long start, long end) {
|
||||
checkArgument(start >= 0, "start must be >= 0");
|
||||
checkArgument(end >= 0, "end must be >= 0");
|
||||
range = String.format("bytes %d-%d/*", start, end);
|
||||
return this;
|
||||
}
|
||||
|
||||
public static class Builder {
|
||||
/**
|
||||
* @see PutBlockOptions#range(long, long)
|
||||
*/
|
||||
public static PutBlockOptions range(long start, long end) {
|
||||
PutBlockOptions options = new PutBlockOptions();
|
||||
return options.range(start, end);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,120 +0,0 @@
|
|||
/**
|
||||
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||
* contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. jclouds licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
package org.jclouds.mezeo.pcs.xml;
|
||||
|
||||
import java.net.URI;
|
||||
import java.util.Map;
|
||||
|
||||
import org.jclouds.http.functions.ParseSax;
|
||||
import org.jclouds.mezeo.pcs.PCSCloudAsyncClient;
|
||||
import org.xml.sax.Attributes;
|
||||
import org.xml.sax.SAXException;
|
||||
|
||||
import com.google.common.collect.Maps;
|
||||
|
||||
/**
|
||||
* Parses the discovery response from xlink refs.
|
||||
*
|
||||
* @author Adrian Cole
|
||||
*/
|
||||
public class CloudXlinkHandler extends ParseSax.HandlerWithResult<PCSCloudAsyncClient.Response> {
|
||||
|
||||
private Map<String, URI> map = Maps.newHashMap();
|
||||
|
||||
public static class PCSCloudResponseImpl implements PCSCloudAsyncClient.Response {
|
||||
private final Map<String, URI> map;
|
||||
|
||||
public PCSCloudResponseImpl(Map<String, URI> map) {
|
||||
this.map = map;
|
||||
}
|
||||
|
||||
public URI getContactsUrl() {
|
||||
return map.get("contacts");
|
||||
}
|
||||
|
||||
public URI getMetacontainersUrl() {
|
||||
return map.get("metacontainers");
|
||||
}
|
||||
|
||||
public URI getProjectsUrl() {
|
||||
return map.get("projects");
|
||||
}
|
||||
|
||||
public URI getRecyclebinUrl() {
|
||||
return map.get("recyclebin");
|
||||
}
|
||||
|
||||
public URI getRootContainerUrl() {
|
||||
return map.get("rootContainer");
|
||||
}
|
||||
|
||||
public URI getSharesUrl() {
|
||||
return map.get("shares");
|
||||
}
|
||||
|
||||
public URI getTagsUrl() {
|
||||
return map.get("tags");
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
final int prime = 31;
|
||||
int result = 1;
|
||||
result = prime * result + ((map == null) ? 0 : map.hashCode());
|
||||
return result;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object obj) {
|
||||
if (this == obj)
|
||||
return true;
|
||||
if (obj == null)
|
||||
return false;
|
||||
if (getClass() != obj.getClass())
|
||||
return false;
|
||||
PCSCloudResponseImpl other = (PCSCloudResponseImpl) obj;
|
||||
if (map == null) {
|
||||
if (other.map != null)
|
||||
return false;
|
||||
} else if (!map.equals(other.map))
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "PCSDiscoveryResponseImpl [map=" + map + "]";
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public PCSCloudAsyncClient.Response getResult() {
|
||||
return new PCSCloudResponseImpl(map);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void startElement(String uri, String localName, String qName, Attributes attributes)
|
||||
throws SAXException {
|
||||
int index = attributes.getIndex("xlink:href");
|
||||
if (index != -1) {
|
||||
map.put(qName, URI.create(attributes.getValue(index)));
|
||||
}
|
||||
}
|
||||
|
||||
}
|
|
@ -1,277 +0,0 @@
|
|||
/**
|
||||
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||
* contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. jclouds licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
package org.jclouds.mezeo.pcs.xml;
|
||||
|
||||
import java.net.URI;
|
||||
import java.util.Date;
|
||||
import java.util.Map;
|
||||
import java.util.SortedSet;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import javax.inject.Inject;
|
||||
|
||||
import org.jclouds.date.DateService;
|
||||
import org.jclouds.http.functions.ParseSax;
|
||||
import org.jclouds.logging.Logger;
|
||||
import org.jclouds.mezeo.pcs.domain.ContainerList;
|
||||
import org.jclouds.mezeo.pcs.domain.ResourceInfo;
|
||||
import org.jclouds.mezeo.pcs.domain.internal.ContainerInfoImpl;
|
||||
import org.jclouds.mezeo.pcs.domain.internal.ContainerListImpl;
|
||||
import org.jclouds.mezeo.pcs.domain.internal.FileInfoImpl;
|
||||
import org.jclouds.util.Strings2;
|
||||
import org.xml.sax.Attributes;
|
||||
import org.xml.sax.SAXException;
|
||||
|
||||
import com.google.common.collect.Maps;
|
||||
import com.google.common.collect.Sets;
|
||||
|
||||
/**
|
||||
* @author Adrian Cole
|
||||
*/
|
||||
public class ContainerHandler extends ParseSax.HandlerWithResult<ContainerList> {
|
||||
|
||||
@Resource
|
||||
protected Logger logger = Logger.NULL;
|
||||
|
||||
private SortedSet<ResourceInfo> containerMetadata = Sets.newTreeSet();
|
||||
protected Map<String, URI> metadataItems = Maps.newHashMap();
|
||||
|
||||
private URI rootUrl;
|
||||
private String rootName;
|
||||
private Date rootCreated;
|
||||
private boolean rootInproject;
|
||||
private Date rootModified;
|
||||
private String rootOwner;
|
||||
private int rootVersion;
|
||||
private boolean rootShared;
|
||||
private Date rootAccessed;
|
||||
private long rootBytes;
|
||||
private URI rootParent;
|
||||
private URI rootTags;
|
||||
private URI rootMetadata;
|
||||
|
||||
private URI currentUrl;
|
||||
private String currentName;
|
||||
private Date currentCreated;
|
||||
private boolean currentInproject;
|
||||
private Date currentModified;
|
||||
private String currentOwner;
|
||||
private int currentVersion;
|
||||
private boolean currentShared;
|
||||
private Date currentAccessed;
|
||||
private long currentBytes;
|
||||
private URI currentParent;
|
||||
private URI currentTags;
|
||||
private URI currentMetadata;
|
||||
private URI currentContents;
|
||||
|
||||
private boolean currentPublic;
|
||||
private String currentMimeType;
|
||||
private URI currentContent;
|
||||
private URI currentPermissions;
|
||||
|
||||
private URI currentThumbnail;
|
||||
|
||||
private StringBuilder currentText = new StringBuilder();
|
||||
|
||||
private final DateService dateParser;
|
||||
|
||||
boolean inContainer = false;
|
||||
boolean inContents = false;
|
||||
|
||||
private ContainerListImpl rootContainer;
|
||||
|
||||
@Inject
|
||||
public ContainerHandler(DateService dateParser) {
|
||||
this.dateParser = dateParser;
|
||||
}
|
||||
|
||||
public ContainerList getResult() {
|
||||
return rootContainer;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void startElement(String uri, String localName, String qName, Attributes attributes)
|
||||
throws SAXException {
|
||||
if (qName.equals("contents") && attributes.getIndex("count") != -1) {
|
||||
int index = attributes.getIndex("xlink:href");
|
||||
if (index != -1) {
|
||||
rootUrl = URI.create(attributes.getValue(index).replace("/contents", ""));
|
||||
}
|
||||
inContents = true;
|
||||
return;
|
||||
} else if (qName.equals("container")) {
|
||||
if (inContents)
|
||||
inContainer = true;
|
||||
int index = attributes.getIndex("xlink:href");
|
||||
if (index != -1) {
|
||||
currentUrl = URI.create(attributes.getValue(index));
|
||||
}
|
||||
} else if (qName.equals("parent")) {
|
||||
int index = attributes.getIndex("xlink:href");
|
||||
if (index != -1) {
|
||||
currentParent = URI.create(attributes.getValue(index));
|
||||
if (!inContents)
|
||||
rootParent = currentParent;
|
||||
}
|
||||
} else if (qName.equals("file")) {
|
||||
int index = attributes.getIndex("xlink:href");
|
||||
if (index != -1) {
|
||||
currentUrl = URI.create(attributes.getValue(index));
|
||||
}
|
||||
} else if (qName.equals("content")) {
|
||||
int index = attributes.getIndex("xlink:href");
|
||||
if (index != -1) {
|
||||
currentContent = URI.create(attributes.getValue(index));
|
||||
}
|
||||
} else if (qName.equals("contents")) {
|
||||
int index = attributes.getIndex("xlink:href");
|
||||
if (index != -1) {
|
||||
currentContents = URI.create(attributes.getValue(index));
|
||||
}
|
||||
} else if (qName.equals("permissions")) {
|
||||
int index = attributes.getIndex("xlink:href");
|
||||
if (index != -1) {
|
||||
currentPermissions = URI.create(attributes.getValue(index));
|
||||
}
|
||||
} else if (qName.equals("tags")) {
|
||||
int index = attributes.getIndex("xlink:href");
|
||||
if (index != -1) {
|
||||
currentTags = URI.create(attributes.getValue(index));
|
||||
if (!inContents)
|
||||
rootTags = currentTags;
|
||||
}
|
||||
} else if (qName.equals("thumbnail")) {
|
||||
int index = attributes.getIndex("xlink:href");
|
||||
if (index != -1) {
|
||||
currentThumbnail = URI.create(attributes.getValue(index));
|
||||
}
|
||||
} else if (qName.equals("metadata")) {
|
||||
int index = attributes.getIndex("xlink:href");
|
||||
if (index != -1) {
|
||||
currentMetadata = URI.create(attributes.getValue(index));
|
||||
if (!inContents)
|
||||
rootMetadata = currentMetadata;
|
||||
}
|
||||
} else if (qName.equals("metadata-item")) {
|
||||
int index = attributes.getIndex("xlink:href");
|
||||
if (index != -1) {
|
||||
String key = Strings2.replaceAll(attributes.getValue(index), METADATA_PATTERN, "");
|
||||
metadataItems.put(key.toLowerCase(), URI.create(attributes.getValue(index)));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public final Pattern METADATA_PATTERN = Pattern.compile(".*/metadata/");
|
||||
|
||||
@Override
|
||||
public void endElement(String uri, String name, String qName) {
|
||||
if (qName.equals("contents")) {
|
||||
if (!inContainer)
|
||||
inContents = false;
|
||||
currentText = new StringBuilder();
|
||||
return;
|
||||
}
|
||||
if (qName.equals("container") && !inContents) {
|
||||
rootContainer = new ContainerListImpl(rootUrl, rootName, rootCreated, rootInproject,
|
||||
rootModified, rootOwner, rootVersion, rootShared, rootAccessed, rootBytes,
|
||||
containerMetadata, rootTags, rootMetadata, metadataItems, rootParent);
|
||||
} else if (qName.equals("container") || qName.equals("file")) {
|
||||
if (qName.equals("container")) {
|
||||
inContainer = false;
|
||||
containerMetadata.add(new ContainerInfoImpl(currentUrl, currentName, currentCreated,
|
||||
currentInproject, currentModified, currentOwner, currentVersion,
|
||||
currentShared, currentAccessed, currentBytes, currentContents, currentTags,
|
||||
currentMetadata, currentParent));
|
||||
} else {
|
||||
containerMetadata.add(new FileInfoImpl(currentUrl, currentName, currentCreated,
|
||||
currentInproject, currentModified, currentOwner, currentVersion,
|
||||
currentShared, currentAccessed, currentPublic, currentMimeType, currentBytes,
|
||||
currentContent, currentParent, currentPermissions, currentTags,
|
||||
currentMetadata, currentThumbnail));
|
||||
}
|
||||
currentUrl = null;
|
||||
currentName = null;
|
||||
currentCreated = null;
|
||||
currentInproject = false;
|
||||
currentModified = null;
|
||||
currentOwner = null;
|
||||
currentVersion = 0;
|
||||
currentShared = false;
|
||||
currentAccessed = null;
|
||||
currentBytes = 0;
|
||||
currentPublic = false;
|
||||
currentMimeType = null;
|
||||
currentParent = null;
|
||||
currentContents = null;
|
||||
currentContent = null;
|
||||
currentPermissions = null;
|
||||
currentTags = null;
|
||||
currentMetadata = null;
|
||||
currentThumbnail = null;
|
||||
|
||||
} else if (qName.equals("name")) {
|
||||
currentName = currentText.toString().trim();
|
||||
if (!inContents)
|
||||
rootName = currentName;
|
||||
} else if (qName.equals("created")) {
|
||||
currentCreated = dateParser.fromSeconds(Long.parseLong(currentText.toString().trim()));
|
||||
if (!inContents)
|
||||
rootCreated = currentCreated;
|
||||
} else if (qName.equals("inproject")) {
|
||||
currentInproject = Boolean.parseBoolean(currentText.toString().trim());
|
||||
if (!inContents)
|
||||
rootInproject = currentInproject;
|
||||
} else if (qName.equals("modified")) {
|
||||
currentModified = dateParser.fromSeconds(Long.parseLong(currentText.toString().trim()));
|
||||
if (!inContents)
|
||||
rootModified = currentModified;
|
||||
} else if (qName.equals("owner")) {
|
||||
currentOwner = currentText.toString().trim();
|
||||
if (!inContents)
|
||||
rootOwner = currentOwner;
|
||||
} else if (qName.equals("version")) {
|
||||
currentVersion = Integer.parseInt(currentText.toString().trim());
|
||||
if (!inContents)
|
||||
rootVersion = currentVersion;
|
||||
} else if (qName.equals("shared")) {
|
||||
currentShared = Boolean.parseBoolean(currentText.toString().trim());
|
||||
if (!inContents)
|
||||
rootShared = currentShared;
|
||||
} else if (qName.equals("accessed")) {
|
||||
currentAccessed = dateParser.fromSeconds(Long.parseLong(currentText.toString().trim()));
|
||||
if (!inContents)
|
||||
rootAccessed = currentAccessed;
|
||||
} else if (qName.equals("bytes")) {
|
||||
currentBytes = Long.parseLong(currentText.toString().trim());
|
||||
if (!inContents)
|
||||
rootBytes = currentBytes;
|
||||
} else if (qName.equals("public")) {
|
||||
currentPublic = Boolean.parseBoolean(currentText.toString().trim());
|
||||
} else if (qName.equals("mime_type")) {
|
||||
currentMimeType = currentText.toString().trim();
|
||||
}
|
||||
currentText = new StringBuilder();
|
||||
}
|
||||
|
||||
public void characters(char ch[], int start, int length) {
|
||||
currentText.append(ch, start, length);
|
||||
}
|
||||
}
|
|
@ -1,182 +0,0 @@
|
|||
/**
|
||||
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||
* contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. jclouds licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
package org.jclouds.mezeo.pcs.xml;
|
||||
|
||||
import java.net.URI;
|
||||
import java.util.Date;
|
||||
import java.util.Map;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
import javax.inject.Inject;
|
||||
|
||||
import org.jclouds.date.DateService;
|
||||
import org.jclouds.http.functions.ParseSax;
|
||||
import org.jclouds.mezeo.pcs.domain.FileInfoWithMetadata;
|
||||
import org.jclouds.mezeo.pcs.domain.internal.FileInfoWithMetadataImpl;
|
||||
import org.jclouds.util.Strings2;
|
||||
import org.xml.sax.Attributes;
|
||||
import org.xml.sax.SAXException;
|
||||
|
||||
import com.google.common.collect.Maps;
|
||||
|
||||
/**
|
||||
* @author Adrian Cole
|
||||
*/
|
||||
public class FileHandler extends ParseSax.HandlerWithResult<FileInfoWithMetadata> {
|
||||
private static final Pattern CONTENT_PATTERN = Pattern.compile("/content");
|
||||
private static final Pattern METADATA_PATTERN = Pattern.compile(".*/metadata/");
|
||||
|
||||
protected Map<String, URI> metadataItems = Maps.newHashMap();
|
||||
|
||||
protected URI currentUrl;
|
||||
private String currentName;
|
||||
private Date currentCreated;
|
||||
private boolean currentInproject;
|
||||
private Date currentModified;
|
||||
private String currentOwner;
|
||||
private int currentVersion;
|
||||
private boolean currentShared;
|
||||
private Date currentAccessed;
|
||||
private long currentBytes;
|
||||
private String currentMimeType;
|
||||
private boolean currentPublic;
|
||||
|
||||
protected StringBuilder currentText = new StringBuilder();
|
||||
|
||||
private final DateService dateParser;
|
||||
|
||||
private FileInfoWithMetadata fileMetadataList;
|
||||
|
||||
private URI currentPermissions;
|
||||
|
||||
private URI currentTags;
|
||||
|
||||
private URI currentThumbnail;
|
||||
|
||||
private URI currentMetadata;
|
||||
|
||||
private URI currentContent;
|
||||
|
||||
private URI currentParent;
|
||||
|
||||
@Inject
|
||||
public FileHandler(DateService dateParser) {
|
||||
this.dateParser = dateParser;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void startElement(String uri, String localName, String qName, Attributes attributes)
|
||||
throws SAXException {
|
||||
if (qName.equals("content")) {
|
||||
int index = attributes.getIndex("xlink:href");
|
||||
if (index != -1) {
|
||||
currentContent = URI.create(attributes.getValue(index));
|
||||
currentUrl = URI.create(Strings2.replaceAll(attributes.getValue(index), CONTENT_PATTERN,
|
||||
""));
|
||||
}
|
||||
} else if (qName.equals("permissions")) {
|
||||
int index = attributes.getIndex("xlink:href");
|
||||
if (index != -1) {
|
||||
currentPermissions = URI.create(attributes.getValue(index));
|
||||
}
|
||||
} else if (qName.equals("tags")) {
|
||||
int index = attributes.getIndex("xlink:href");
|
||||
if (index != -1) {
|
||||
currentTags = URI.create(attributes.getValue(index));
|
||||
|
||||
}
|
||||
} else if (qName.equals("parent")) {
|
||||
int index = attributes.getIndex("xlink:href");
|
||||
if (index != -1) {
|
||||
currentParent = URI.create(attributes.getValue(index));
|
||||
}
|
||||
} else if (qName.equals("thumbnail")) {
|
||||
int index = attributes.getIndex("xlink:href");
|
||||
if (index != -1) {
|
||||
currentThumbnail = URI.create(attributes.getValue(index));
|
||||
}
|
||||
} else if (qName.equals("metadata")) {
|
||||
int index = attributes.getIndex("xlink:href");
|
||||
if (index != -1) {
|
||||
currentMetadata = URI.create(attributes.getValue(index));
|
||||
}
|
||||
} else if (qName.equals("metadata-item")) {
|
||||
int index = attributes.getIndex("xlink:href");
|
||||
if (index != -1) {
|
||||
String key = Strings2.replaceAll(attributes.getValue(index), METADATA_PATTERN, "");
|
||||
metadataItems.put(key.toLowerCase(), URI.create(attributes.getValue(index)));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void endElement(String uri, String name, String qName) {
|
||||
if (qName.equals("name")) {
|
||||
currentName = currentText.toString().trim();
|
||||
} else if (qName.equals("created")) {
|
||||
currentCreated = dateParser.fromSeconds(Long.parseLong(currentText.toString().trim()));
|
||||
} else if (qName.equals("inproject")) {
|
||||
currentInproject = Boolean.parseBoolean(currentText.toString().trim());
|
||||
} else if (qName.equals("modified")) {
|
||||
currentModified = dateParser.fromSeconds(Long.parseLong(currentText.toString().trim()));
|
||||
} else if (qName.equals("owner")) {
|
||||
currentOwner = currentText.toString().trim();
|
||||
} else if (qName.equals("version")) {
|
||||
currentVersion = Integer.parseInt(currentText.toString().trim());
|
||||
} else if (qName.equals("shared")) {
|
||||
currentShared = Boolean.parseBoolean(currentText.toString().trim());
|
||||
} else if (qName.equals("accessed")) {
|
||||
currentAccessed = dateParser.fromSeconds(Long.parseLong(currentText.toString().trim()));
|
||||
} else if (qName.equals("bytes")) {
|
||||
currentBytes = Long.parseLong(currentText.toString().trim());
|
||||
} else if (qName.equals("mime_type")) {
|
||||
currentMimeType = currentText.toString().trim();
|
||||
} else if (qName.equals("public")) {
|
||||
currentPublic = Boolean.parseBoolean(currentText.toString().trim());
|
||||
} else if (qName.equals("file")) {
|
||||
fileMetadataList = new FileInfoWithMetadataImpl(currentUrl, currentName, currentCreated,
|
||||
currentInproject, currentModified, currentOwner, currentVersion, currentShared,
|
||||
currentAccessed, currentPublic, currentMimeType, currentBytes, currentContent,
|
||||
currentParent, currentPermissions, currentTags, currentMetadata, metadataItems,
|
||||
currentThumbnail);
|
||||
currentUrl = null;
|
||||
currentName = null;
|
||||
currentCreated = null;
|
||||
currentInproject = false;
|
||||
currentModified = null;
|
||||
currentOwner = null;
|
||||
currentVersion = 0;
|
||||
currentShared = false;
|
||||
currentAccessed = null;
|
||||
currentBytes = 0;
|
||||
currentMimeType = null;
|
||||
currentPublic = false;
|
||||
}
|
||||
currentText = new StringBuilder();
|
||||
}
|
||||
|
||||
public void characters(char ch[], int start, int length) {
|
||||
currentText.append(ch, start, length);
|
||||
}
|
||||
|
||||
@Override
|
||||
public FileInfoWithMetadata getResult() {
|
||||
return fileMetadataList;
|
||||
}
|
||||
}
|
|
@ -1,298 +0,0 @@
|
|||
/**
|
||||
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||
* contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. jclouds licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
package org.jclouds.mezeo.pcs;
|
||||
|
||||
import static org.testng.Assert.assertEquals;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.lang.reflect.Array;
|
||||
import java.lang.reflect.Method;
|
||||
import java.net.URI;
|
||||
import java.util.Map;
|
||||
import java.util.Properties;
|
||||
|
||||
import org.jclouds.blobstore.binders.BindBlobToMultipartFormTest;
|
||||
import org.jclouds.blobstore.functions.ReturnNullOnKeyNotFound;
|
||||
import org.jclouds.http.HttpRequest;
|
||||
import org.jclouds.http.RequiresHttp;
|
||||
import org.jclouds.http.filters.BasicAuthentication;
|
||||
import org.jclouds.http.functions.ParseSax;
|
||||
import org.jclouds.http.functions.ParseURIFromListOrLocationHeaderIf20x;
|
||||
import org.jclouds.http.functions.ReleasePayloadAndReturn;
|
||||
import org.jclouds.http.functions.ReturnInputStream;
|
||||
import org.jclouds.mezeo.pcs.PCSAsyncClient;
|
||||
import org.jclouds.mezeo.pcs.PCSClient;
|
||||
import org.jclouds.mezeo.pcs.PCSCloudAsyncClient.Response;
|
||||
import org.jclouds.mezeo.pcs.blobstore.functions.BlobToPCSFile;
|
||||
import org.jclouds.mezeo.pcs.config.PCSRestClientModule;
|
||||
import org.jclouds.mezeo.pcs.domain.PCSFile;
|
||||
import org.jclouds.mezeo.pcs.functions.AddMetadataItemIntoMap;
|
||||
import org.jclouds.mezeo.pcs.options.PutBlockOptions;
|
||||
import org.jclouds.mezeo.pcs.xml.ContainerHandler;
|
||||
import org.jclouds.mezeo.pcs.xml.FileHandler;
|
||||
import org.jclouds.rest.AsyncClientFactory;
|
||||
import org.jclouds.rest.ConfiguresRestClient;
|
||||
import org.jclouds.rest.RestClientTest;
|
||||
import org.jclouds.rest.RestContextFactory;
|
||||
import org.jclouds.rest.RestContextSpec;
|
||||
import org.jclouds.rest.functions.ReturnVoidOnNotFoundOr404;
|
||||
import org.jclouds.rest.internal.RestAnnotationProcessor;
|
||||
import org.testng.annotations.BeforeClass;
|
||||
import org.testng.annotations.Test;
|
||||
|
||||
import com.google.common.collect.ImmutableMap;
|
||||
import com.google.inject.Module;
|
||||
import com.google.inject.TypeLiteral;
|
||||
|
||||
/**
|
||||
* Tests behavior of {@code PCSClient}
|
||||
*
|
||||
* @author Adrian Cole
|
||||
*/
|
||||
@Test(groups = "unit", testName = "pcs2.PCSClientTest")
|
||||
public class PCSAsyncClientTest extends RestClientTest<PCSAsyncClient> {
|
||||
|
||||
public void testList() throws SecurityException, NoSuchMethodException, IOException {
|
||||
Method method = PCSAsyncClient.class.getMethod("list");
|
||||
GeneratedHttpRequest request = processor.createRequest(method);
|
||||
|
||||
assertRequestLineEquals(request, "GET http://root HTTP/1.1");
|
||||
assertNonPayloadHeadersEqual(request, "X-Cloud-Depth: 2\n");
|
||||
assertPayloadEquals(request, null, null, false);
|
||||
|
||||
assertResponseParserClassEquals(method, request, ParseSax.class);
|
||||
assertSaxResponseParserClassEquals(method, ContainerHandler.class);
|
||||
assertExceptionParserClassEquals(method, null);
|
||||
|
||||
checkFilters(request);
|
||||
}
|
||||
|
||||
public void testCreateContainer() throws SecurityException, NoSuchMethodException, IOException {
|
||||
Method method = PCSAsyncClient.class.getMethod("createContainer", String.class);
|
||||
GeneratedHttpRequest request = processor.createRequest(method, "container");
|
||||
|
||||
assertRequestLineEquals(request, "POST http://root/contents HTTP/1.1");
|
||||
assertNonPayloadHeadersEqual(request, "");
|
||||
assertPayloadEquals(request, "<container><name>container</name></container>",
|
||||
"application/vnd.csp.container-info+xml", false);
|
||||
|
||||
assertResponseParserClassEquals(method, request, ParseURIFromListOrLocationHeaderIf20x.class);
|
||||
assertSaxResponseParserClassEquals(method, null);
|
||||
assertExceptionParserClassEquals(method, null);
|
||||
|
||||
checkFilters(request);
|
||||
|
||||
}
|
||||
|
||||
public void testDeleteContainer() throws SecurityException, NoSuchMethodException, IOException {
|
||||
Method method = PCSAsyncClient.class.getMethod("deleteContainer", URI.class);
|
||||
GeneratedHttpRequest request = processor.createRequest(method, URI.create("http://localhost/container/1234"));
|
||||
|
||||
assertRequestLineEquals(request, "DELETE http://localhost/container/1234 HTTP/1.1");
|
||||
assertNonPayloadHeadersEqual(request, "");
|
||||
assertPayloadEquals(request, null, null, false);
|
||||
|
||||
assertResponseParserClassEquals(method, request, ReleasePayloadAndReturn.class);
|
||||
assertSaxResponseParserClassEquals(method, null);
|
||||
assertExceptionParserClassEquals(method, ReturnVoidOnNotFoundOr404.class);
|
||||
|
||||
checkFilters(request);
|
||||
}
|
||||
|
||||
public void testListURI() throws SecurityException, NoSuchMethodException, IOException {
|
||||
Method method = PCSAsyncClient.class.getMethod("list", URI.class);
|
||||
GeneratedHttpRequest request = processor.createRequest(method, URI.create("http://localhost/mycontainer"));
|
||||
|
||||
assertRequestLineEquals(request, "GET http://localhost/mycontainer HTTP/1.1");
|
||||
assertNonPayloadHeadersEqual(request, "X-Cloud-Depth: 2\n");
|
||||
assertPayloadEquals(request, null, null, false);
|
||||
|
||||
assertResponseParserClassEquals(method, request, ParseSax.class);
|
||||
assertSaxResponseParserClassEquals(method, ContainerHandler.class);
|
||||
assertExceptionParserClassEquals(method, null);
|
||||
|
||||
checkFilters(request);
|
||||
}
|
||||
|
||||
public void testGetFileInfo() throws SecurityException, NoSuchMethodException, IOException {
|
||||
Method method = PCSAsyncClient.class.getMethod("getFileInfo", URI.class);
|
||||
GeneratedHttpRequest request = processor.createRequest(method, URI.create("http://localhost/myfile"));
|
||||
|
||||
assertRequestLineEquals(request, "GET http://localhost/myfile HTTP/1.1");
|
||||
assertNonPayloadHeadersEqual(request, "X-Cloud-Depth: 2\n");
|
||||
assertPayloadEquals(request, null, null, false);
|
||||
|
||||
assertResponseParserClassEquals(method, request, ParseSax.class);
|
||||
assertSaxResponseParserClassEquals(method, FileHandler.class);
|
||||
assertExceptionParserClassEquals(method, ReturnNullOnKeyNotFound.class);
|
||||
|
||||
checkFilters(request);
|
||||
}
|
||||
|
||||
public void testUploadFile() throws SecurityException, NoSuchMethodException, IOException {
|
||||
Method method = PCSAsyncClient.class.getMethod("uploadFile", URI.class, PCSFile.class);
|
||||
GeneratedHttpRequest request = processor.createRequest(method, URI.create("http://localhost/mycontainer"), blobToPCSFile
|
||||
.apply(BindBlobToMultipartFormTest.TEST_BLOB));
|
||||
|
||||
assertRequestLineEquals(request, "POST http://localhost/mycontainer/contents HTTP/1.1");
|
||||
assertNonPayloadHeadersEqual(request, "");
|
||||
assertPayloadEquals(request, BindBlobToMultipartFormTest.EXPECTS, "multipart/form-data; boundary=--JCLOUDS--",
|
||||
false);
|
||||
|
||||
assertResponseParserClassEquals(method, request, ParseURIFromListOrLocationHeaderIf20x.class);
|
||||
assertSaxResponseParserClassEquals(method, null);
|
||||
assertExceptionParserClassEquals(method, null);
|
||||
|
||||
checkFilters(request);
|
||||
|
||||
}
|
||||
|
||||
public void testUploadBlock() throws SecurityException, NoSuchMethodException, IOException {
|
||||
Method method = PCSAsyncClient.class.getMethod("uploadBlock", URI.class, PCSFile.class, Array.newInstance(
|
||||
PutBlockOptions.class, 0).getClass());
|
||||
GeneratedHttpRequest request = processor.createRequest(method, URI.create("http://localhost/mycontainer"), blobToPCSFile
|
||||
.apply(BindBlobToMultipartFormTest.TEST_BLOB));
|
||||
|
||||
assertRequestLineEquals(request, "PUT http://localhost/mycontainer/content HTTP/1.1");
|
||||
assertNonPayloadHeadersEqual(request, "");
|
||||
assertPayloadEquals(request, "hello", "text/plain", false);
|
||||
|
||||
assertResponseParserClassEquals(method, request, ReleasePayloadAndReturn.class);
|
||||
assertSaxResponseParserClassEquals(method, null);
|
||||
assertExceptionParserClassEquals(method, null);
|
||||
|
||||
checkFilters(request);
|
||||
}
|
||||
|
||||
public void testDownloadFile() throws SecurityException, NoSuchMethodException, IOException {
|
||||
Method method = PCSAsyncClient.class.getMethod("downloadFile", URI.class);
|
||||
GeneratedHttpRequest request = processor.createRequest(method, URI.create("http://localhost/container"));
|
||||
|
||||
assertRequestLineEquals(request, "GET http://localhost/container/content HTTP/1.1");
|
||||
assertNonPayloadHeadersEqual(request, "");
|
||||
assertPayloadEquals(request, null, null, false);
|
||||
|
||||
assertResponseParserClassEquals(method, request, ReturnInputStream.class);
|
||||
assertSaxResponseParserClassEquals(method, null);
|
||||
assertExceptionParserClassEquals(method, ReturnNullOnKeyNotFound.class);
|
||||
|
||||
checkFilters(request);
|
||||
|
||||
}
|
||||
|
||||
public void testDeleteFile() throws SecurityException, NoSuchMethodException, IOException {
|
||||
Method method = PCSAsyncClient.class.getMethod("deleteFile", URI.class);
|
||||
GeneratedHttpRequest request = processor.createRequest(method,
|
||||
new Object[] { URI.create("http://localhost/contents/file") });
|
||||
|
||||
assertRequestLineEquals(request, "DELETE http://localhost/contents/file HTTP/1.1");
|
||||
assertNonPayloadHeadersEqual(request, "");
|
||||
assertPayloadEquals(request, null, null, false);
|
||||
|
||||
assertResponseParserClassEquals(method, request, ReleasePayloadAndReturn.class);
|
||||
assertSaxResponseParserClassEquals(method, null);
|
||||
assertExceptionParserClassEquals(method, ReturnVoidOnNotFoundOr404.class);
|
||||
|
||||
checkFilters(request);
|
||||
}
|
||||
|
||||
public void testPutMetadata() throws SecurityException, NoSuchMethodException, IOException {
|
||||
Method method = PCSAsyncClient.class.getMethod("putMetadataItem", URI.class, String.class, String.class);
|
||||
GeneratedHttpRequest request = processor.createRequest(method, URI.create("http://localhost/contents/file"), "pow", "bar");
|
||||
|
||||
assertRequestLineEquals(request, "PUT http://localhost/contents/file/metadata/pow HTTP/1.1");
|
||||
assertNonPayloadHeadersEqual(request, "");
|
||||
assertPayloadEquals(request, "bar", "application/unknown", false);
|
||||
|
||||
assertResponseParserClassEquals(method, request, ReleasePayloadAndReturn.class);
|
||||
assertSaxResponseParserClassEquals(method, null);
|
||||
assertExceptionParserClassEquals(method, null);
|
||||
|
||||
checkFilters(request);
|
||||
|
||||
}
|
||||
|
||||
public void testAddEntryToMap() throws SecurityException, NoSuchMethodException, IOException {
|
||||
Method method = PCSAsyncClient.class.getMethod("addMetadataItemToMap", URI.class, String.class, Map.class);
|
||||
GeneratedHttpRequest request = processor.createRequest(method, URI.create("http://localhost/pow"), "newkey", ImmutableMap
|
||||
.of("key", "value"));
|
||||
|
||||
assertRequestLineEquals(request, "GET http://localhost/pow/metadata/newkey HTTP/1.1");
|
||||
assertNonPayloadHeadersEqual(request, "");
|
||||
assertPayloadEquals(request, null, null, false);
|
||||
|
||||
assertResponseParserClassEquals(method, request, AddMetadataItemIntoMap.class);
|
||||
assertSaxResponseParserClassEquals(method, null);
|
||||
assertExceptionParserClassEquals(method, null);
|
||||
|
||||
checkFilters(request);
|
||||
}
|
||||
|
||||
private BlobToPCSFile blobToPCSFile;
|
||||
|
||||
@Override
|
||||
protected void checkFilters(HttpRequest request) {
|
||||
assertEquals(request.getFilters().size(), 1);
|
||||
assertEquals(request.getFilters().get(0).getClass(), BasicAuthentication.class);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected TypeLiteral<RestAnnotationProcessor<PCSAsyncClient>> createTypeLiteral() {
|
||||
return new TypeLiteral<RestAnnotationProcessor<PCSAsyncClient>>() {
|
||||
};
|
||||
}
|
||||
|
||||
@BeforeClass
|
||||
@Override
|
||||
protected void setupFactory() throws IOException {
|
||||
super.setupFactory();
|
||||
blobToPCSFile = injector.getInstance(BlobToPCSFile.class);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Module createModule() {
|
||||
return new TestPCSRestClientModule();
|
||||
}
|
||||
|
||||
@RequiresHttp
|
||||
@ConfiguresRestClient
|
||||
private static final class TestPCSRestClientModule extends PCSRestClientModule {
|
||||
@Override
|
||||
protected void configure() {
|
||||
super.configure();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Response provideCloudResponse(AsyncClientFactory factory) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected URI provideRootContainerUrl(Response response) {
|
||||
return URI.create("http://root");
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public RestContextSpec<PCSClient, PCSAsyncClient> createContextSpec() {
|
||||
Properties properties = new Properties();
|
||||
properties.setProperty("pcs.endpoint", "http://goo");
|
||||
return new RestContextFactory().createContextSpec("pcs", "identity", "credential", properties);
|
||||
}
|
||||
}
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue