diff --git a/apis/cloudservers/src/main/java/org/jclouds/cloudservers/compute/functions/ServerToNodeMetadata.java b/apis/cloudservers/src/main/java/org/jclouds/cloudservers/compute/functions/ServerToNodeMetadata.java index 856e952df6..dc8ee59659 100644 --- a/apis/cloudservers/src/main/java/org/jclouds/cloudservers/compute/functions/ServerToNodeMetadata.java +++ b/apis/cloudservers/src/main/java/org/jclouds/cloudservers/compute/functions/ServerToNodeMetadata.java @@ -123,7 +123,7 @@ public class ServerToNodeMetadata implements Function { try { return Iterables.find(hardwares.get(), new FindHardwareForServer(from)); } catch (NoSuchElementException e) { - logger.warn("could not find a matching hardware for server %s", from); + logger.debug("could not find a matching hardware for server %s", from); } return null; } @@ -132,7 +132,7 @@ public class ServerToNodeMetadata implements Function { try { return Iterables.find(images.get(), new FindImageForServer(from)).getOperatingSystem(); } catch (NoSuchElementException e) { - logger.warn("could not find a matching image for server %s in location %s", from, location.get()); + logger.debug("could not find a matching image for server %s in location %s", from, location.get()); } return null; } diff --git a/apis/deltacloud/src/main/java/org/jclouds/deltacloud/compute/functions/InstanceToNodeMetadata.java b/apis/deltacloud/src/main/java/org/jclouds/deltacloud/compute/functions/InstanceToNodeMetadata.java index b50c3c9079..d3075d2dd7 100644 --- a/apis/deltacloud/src/main/java/org/jclouds/deltacloud/compute/functions/InstanceToNodeMetadata.java +++ b/apis/deltacloud/src/main/java/org/jclouds/deltacloud/compute/functions/InstanceToNodeMetadata.java @@ -98,7 +98,7 @@ public class InstanceToNodeMetadata implements Function try { return Iterables.find(hardwares.get(), new FindHardwareForInstance(from)); } catch (NoSuchElementException e) { - logger.warn("could not find a matching hardware for instance %s", from); + logger.debug("could not find a matching hardware for instance %s", from); } return null; } @@ -107,7 +107,7 @@ public class InstanceToNodeMetadata implements Function try { return Iterables.find(images.get(), new FindImageForInstance(from)).getOperatingSystem(); } catch (NoSuchElementException e) { - logger.warn("could not find a matching image for instance %s", from); + logger.debug("could not find a matching image for instance %s", from); } return null; } @@ -129,7 +129,7 @@ public class InstanceToNodeMetadata implements Function try { return Iterables.find(locations.get(), new FindLocationForInstance(from)); } catch (NoSuchElementException e) { - logger.warn("could not find a matching realm for instance %s", from); + logger.debug("could not find a matching realm for instance %s", from); } return null; } diff --git a/apis/nova/src/main/java/org/jclouds/openstack/nova/compute/functions/ServerToNodeMetadata.java b/apis/nova/src/main/java/org/jclouds/openstack/nova/compute/functions/ServerToNodeMetadata.java index ab609777f1..f89c2b5ea6 100644 --- a/apis/nova/src/main/java/org/jclouds/openstack/nova/compute/functions/ServerToNodeMetadata.java +++ b/apis/nova/src/main/java/org/jclouds/openstack/nova/compute/functions/ServerToNodeMetadata.java @@ -126,7 +126,7 @@ public class ServerToNodeMetadata implements Function { try { return Iterables.find(hardwares.get(), new FindHardwareForServer(from)); } catch (NoSuchElementException e) { - logger.warn("could not find a matching hardware for server %s", from); + logger.debug("could not find a matching hardware for server %s", from); } return null; } @@ -135,7 +135,7 @@ public class ServerToNodeMetadata implements Function { try { return Iterables.find(images.get(), new FindImageForServer(from)); } catch (NoSuchElementException e) { - logger.warn("could not find a matching image for server %s in location %s", from, location.get()); + logger.debug("could not find a matching image for server %s in location %s", from, location.get()); } return null; } diff --git a/compute/src/main/java/org/jclouds/ssh/SshClient.java b/compute/src/main/java/org/jclouds/ssh/SshClient.java index 26f04757cd..33c1c7331e 100644 --- a/compute/src/main/java/org/jclouds/ssh/SshClient.java +++ b/compute/src/main/java/org/jclouds/ssh/SshClient.java @@ -39,7 +39,7 @@ public interface SshClient { */ @Deprecated SshClient create(IPSocket socket, Credentials credentials); - + SshClient create(IPSocket socket, LoginCredentials credentials); } @@ -51,19 +51,23 @@ public interface SshClient { void put(String path, Payload contents); Payload get(String path); - + /** * Execute a process and block until it is complete * - * @param command command line to invoke + * @param command + * command line to invoke * @return output of the command */ ExecResponse exec(String command); /** - * Execute a process and allow the user to interact with it + * Execute a process and allow the user to interact with it. Note that this will allow the + * session to exist indefinitely, and its connection is not closed when {@link #disconnect()} is + * called. * - * @param command command line to invoke + * @param command + * command line to invoke * @return reference to the running process * @since 1.5.0 */ diff --git a/drivers/jsch/src/main/java/org/jclouds/ssh/jsch/JschSshClient.java b/drivers/jsch/src/main/java/org/jclouds/ssh/jsch/JschSshClient.java index f3df5612f0..e9ff64628b 100644 --- a/drivers/jsch/src/main/java/org/jclouds/ssh/jsch/JschSshClient.java +++ b/drivers/jsch/src/main/java/org/jclouds/ssh/jsch/JschSshClient.java @@ -34,7 +34,6 @@ import java.io.Closeable; import java.io.IOException; import java.io.InputStream; import java.net.ConnectException; -import java.util.Arrays; import javax.annotation.PreDestroy; import javax.annotation.Resource; @@ -44,6 +43,7 @@ import org.apache.commons.io.input.ProxyInputStream; import org.apache.commons.io.output.ByteArrayOutputStream; import org.jclouds.compute.domain.ExecChannel; import org.jclouds.compute.domain.ExecResponse; +import org.jclouds.domain.LoginCredentials; import org.jclouds.http.handlers.BackoffLimitedRetryHandler; import org.jclouds.io.Payload; import org.jclouds.io.Payloads; @@ -52,7 +52,6 @@ import org.jclouds.net.IPSocket; import org.jclouds.rest.AuthorizationException; import org.jclouds.ssh.SshClient; import org.jclouds.ssh.SshException; -import org.jclouds.util.CredentialUtils; import org.jclouds.util.Strings2; import com.google.common.annotations.VisibleForTesting; @@ -61,10 +60,10 @@ import com.google.common.base.Predicates; import com.google.common.base.Splitter; import com.google.common.base.Supplier; import com.google.common.io.Closeables; +import com.google.common.net.HostAndPort; import com.google.inject.Inject; import com.jcraft.jsch.ChannelExec; import com.jcraft.jsch.ChannelSftp; -import com.jcraft.jsch.JSch; import com.jcraft.jsch.JSchException; import com.jcraft.jsch.Session; @@ -91,11 +90,7 @@ public class JschSshClient implements SshClient { sftp.disconnect(); } } - - private final String host; - private final int port; - private final String username; - private final String password; + private final String toString; @Inject(optional = true) @@ -121,31 +116,31 @@ public class JschSshClient implements SshClient { @Named("jclouds.ssh") protected Logger logger = Logger.NULL; - private Session session; - private final byte[] privateKey; - final byte[] emptyPassPhrase = new byte[0]; - private final int timeout; private final BackoffLimitedRetryHandler backoffLimitedRetryHandler; - public JschSshClient(BackoffLimitedRetryHandler backoffLimitedRetryHandler, IPSocket socket, int timeout, - String username, String password, byte[] privateKey) { + final SessionConnection sessionConnection; + final String user; + final String host; + + public JschSshClient(BackoffLimitedRetryHandler backoffLimitedRetryHandler, IPSocket socket, + LoginCredentials loginCredentials, int timeout) { + this.user = checkNotNull(loginCredentials, "loginCredentials").getUser(); this.host = checkNotNull(socket, "socket").getAddress(); checkArgument(socket.getPort() > 0, "ssh port must be greater then zero" + socket.getPort()); - checkArgument(password != null || privateKey != null, "you must specify a password or a key"); - this.port = socket.getPort(); - this.username = checkNotNull(username, "username"); + checkArgument(loginCredentials.getPassword() != null || loginCredentials.getPrivateKey() != null, + "you must specify a password or a key"); this.backoffLimitedRetryHandler = checkNotNull(backoffLimitedRetryHandler, "backoffLimitedRetryHandler"); - this.timeout = timeout; - this.password = password; - this.privateKey = privateKey; - if (privateKey == null) { - this.toString = String.format("%s:pw[%s]@%s:%d", username, hex(md5(password.getBytes())), host, port); + if (loginCredentials.getPrivateKey() == null) { + this.toString = String.format("%s:pw[%s]@%s:%d", loginCredentials.getUser(), hex(md5(loginCredentials + .getPassword().getBytes())), host, socket.getPort()); } else { - String fingerPrint = fingerprintPrivateKey(new String(privateKey)); - String sha1 = sha1PrivateKey(new String(privateKey)); - this.toString = String.format("%s:rsa[fingerprint(%s),sha1(%s)]@%s:%d", username, fingerPrint, sha1, host, - port); + String fingerPrint = fingerprintPrivateKey(loginCredentials.getPrivateKey()); + String sha1 = sha1PrivateKey(loginCredentials.getPrivateKey()); + this.toString = String.format("%s:rsa[fingerprint(%s),sha1(%s)]@%s:%d", loginCredentials.getUser(), + fingerPrint, sha1, host, socket.getPort()); } + sessionConnection = SessionConnection.builder().hostAndPort(HostAndPort.fromParts(host, socket.getPort())).loginCredentials( + loginCredentials).connectTimeout(timeout).sessionTimeout(timeout).build(); } @Override @@ -154,7 +149,8 @@ public class JschSshClient implements SshClient { } private void checkConnected() { - checkState(session != null && session.isConnected(), String.format("(%s) Session not connected!", toString())); + checkState(sessionConnection.getSession() != null && sessionConnection.getSession().isConnected(), String.format( + "(%s) Session not connected!", toString())); } public static interface Connection { @@ -163,45 +159,6 @@ public class JschSshClient implements SshClient { T create() throws Exception; } - Connection sessionConnection = new Connection() { - - @Override - public void clear() { - if (session != null && session.isConnected()) { - session.disconnect(); - session = null; - } - } - - @Override - public Session create() throws Exception { - JSch jsch = new JSch(); - session = jsch.getSession(username, host, port); - if (timeout != 0) - session.setTimeout(timeout); - if (password != null) { - session.setPassword(password); - } else { - // jsch wipes out your private key - if (CredentialUtils.isPrivateKeyEncrypted(privateKey)) { - throw new IllegalArgumentException( - "JschSshClientModule does not support private keys that require a passphrase"); - } - jsch.addIdentity(username, Arrays.copyOf(privateKey, privateKey.length), null, emptyPassPhrase); - } - java.util.Properties config = new java.util.Properties(); - config.put("StrictHostKeyChecking", "no"); - session.setConfig(config); - session.connect(timeout); - return session; - } - - @Override - public String toString() { - return String.format("Session(timeout=%d)", timeout); - } - }; - protected > T acquire(C connection) { connection.clear(); String errorMessage = String.format("(%s) error acquiring %s", toString(), connection); @@ -245,7 +202,7 @@ public class JschSshClient implements SshClient { public ChannelSftp create() throws JSchException { checkConnected(); String channel = "sftp"; - sftp = (ChannelSftp) session.openChannel(channel); + sftp = (ChannelSftp) sessionConnection.getSession().openChannel(channel); sftp.connect(); return sftp; } @@ -394,7 +351,7 @@ public class JschSshClient implements SshClient { public ChannelExec create() throws Exception { checkConnected(); String channel = "exec"; - executor = (ChannelExec) session.openChannel(channel); + executor = (ChannelExec) sessionConnection.getSession().openChannel(channel); executor.setPty(true); executor.setCommand(command); ByteArrayOutputStream error = new ByteArrayOutputStream(); @@ -468,13 +425,13 @@ public class JschSshClient implements SshClient { @Override public String getUsername() { - return this.username; + return this.user; } - class ExecChannelConnection implements Connection { private final String command; private ChannelExec executor = null; + private Session sessionConnection; ExecChannelConnection(String command) { this.command = checkNotNull(command, "command"); @@ -484,14 +441,16 @@ public class JschSshClient implements SshClient { public void clear() { if (executor != null) executor.disconnect(); + if (sessionConnection != null) + sessionConnection.disconnect(); } @Override public ExecChannel create() throws Exception { - checkConnected(); + this.sessionConnection = acquire(SessionConnection.builder().fromSessionConnection( + JschSshClient.this.sessionConnection).sessionTimeout(0).build()); String channel = "exec"; - executor = (ChannelExec) session.openChannel(channel); - executor.setPty(true); + executor = (ChannelExec) sessionConnection.openChannel(channel); executor.setCommand(command); ByteArrayOutputStream error = new ByteArrayOutputStream(); executor.setErrStream(error); @@ -521,7 +480,6 @@ public class JschSshClient implements SshClient { } }; - @Override public ExecChannel execChannel(String command) { return acquire(new ExecChannelConnection(command)); diff --git a/drivers/jsch/src/main/java/org/jclouds/ssh/jsch/SessionConnection.java b/drivers/jsch/src/main/java/org/jclouds/ssh/jsch/SessionConnection.java new file mode 100644 index 0000000000..bbbc5a101d --- /dev/null +++ b/drivers/jsch/src/main/java/org/jclouds/ssh/jsch/SessionConnection.java @@ -0,0 +1,201 @@ +/** + * 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.ssh.jsch; + +import static com.google.common.base.Objects.equal; + +import java.util.Arrays; + +import org.jclouds.domain.LoginCredentials; +import org.jclouds.ssh.jsch.JschSshClient.Connection; +import org.jclouds.util.CredentialUtils; + +import com.google.common.base.Objects; +import com.google.common.net.HostAndPort; +import com.jcraft.jsch.JSch; +import com.jcraft.jsch.Session; + +public class SessionConnection implements Connection { + public static Builder builder() { + return new Builder(); + } + + public static class Builder { + + protected HostAndPort hostAndPort; + protected LoginCredentials loginCredentials; + protected int connectTimeout; + protected int sessionTimeout; + + /** + * @see SessionConnection#getHostAndPort() + */ + public Builder hostAndPort(HostAndPort hostAndPort) { + this.hostAndPort = hostAndPort; + return this; + } + + /** + * @see SessionConnection#getLoginCredentials() + */ + public Builder loginCredentials(LoginCredentials loginCredentials) { + this.loginCredentials = loginCredentials; + return this; + } + + /** + * @see SessionConnection#getConnectTimeout() + */ + public Builder connectTimeout(int connectTimeout) { + this.connectTimeout = connectTimeout; + return this; + } + + /** + * @see SessionConnection#getConnectTimeout() + */ + public Builder sessionTimeout(int sessionTimeout) { + this.sessionTimeout = sessionTimeout; + return this; + } + + public SessionConnection build() { + return new SessionConnection(hostAndPort, loginCredentials, connectTimeout, sessionTimeout); + } + + protected Builder fromSessionConnection(SessionConnection in) { + return hostAndPort(in.getHostAndPort()).connectTimeout(in.getConnectTimeout()).loginCredentials( + in.getLoginCredentials()); + } + } + + private SessionConnection(HostAndPort hostAndPort, LoginCredentials loginCredentials, int connectTimeout, + int sessionTimeout) { + this.hostAndPort = hostAndPort; + this.loginCredentials = loginCredentials; + this.connectTimeout = connectTimeout; + this.sessionTimeout = sessionTimeout; + } + + private static final byte[] emptyPassPhrase = new byte[0]; + + private final HostAndPort hostAndPort; + private final LoginCredentials loginCredentials; + private final int connectTimeout; + private final int sessionTimeout; + + private transient Session session; + + @Override + public void clear() { + if (session != null && session.isConnected()) { + session.disconnect(); + session = null; + } + } + + @Override + public Session create() throws Exception { + JSch jsch = new JSch(); + session = jsch + .getSession(loginCredentials.getUser(), hostAndPort.getHostText(), hostAndPort.getPortOrDefault(22)); + if (sessionTimeout != 0) + session.setTimeout(sessionTimeout); + if (loginCredentials.getPrivateKey() == null) { + session.setPassword(loginCredentials.getPassword()); + } else { + byte[] privateKey = loginCredentials.getPrivateKey().getBytes(); + if (CredentialUtils.isPrivateKeyEncrypted(privateKey)) { + throw new IllegalArgumentException( + "JschSshClientModule does not support private keys that require a passphrase"); + } + jsch.addIdentity(loginCredentials.getUser(), Arrays.copyOf(privateKey, privateKey.length), null, + emptyPassPhrase); + } + java.util.Properties config = new java.util.Properties(); + config.put("StrictHostKeyChecking", "no"); + session.setConfig(config); + session.connect(connectTimeout); + return session; + } + + /** + * @return host and port, where port if not present defaults to {@code 22} + */ + public HostAndPort getHostAndPort() { + return hostAndPort; + } + + /** + * + * @return login used in this session + */ + public LoginCredentials getLoginCredentials() { + return loginCredentials; + } + + /** + * + * @return how long to wait for the initial connection to be made + */ + public int getConnectTimeout() { + return connectTimeout; + } + + /** + * + * @return how long to keep the session open, or {@code 0} for indefinitely + */ + public int getSessionTimeout() { + return sessionTimeout; + } + + /** + * + * @return the current session or {@code null} if not connected + */ + public Session getSession() { + return session; + } + + @Override + public boolean equals(Object o) { + if (this == o) + return true; + if (o == null || getClass() != o.getClass()) + return false; + SessionConnection that = SessionConnection.class.cast(o); + return equal(this.hostAndPort, that.hostAndPort) && equal(this.loginCredentials, that.loginCredentials) + && equal(this.session, that.session); + } + + @Override + public int hashCode() { + return Objects.hashCode(hostAndPort, loginCredentials, session); + } + + @Override + public String toString() { + return Objects.toStringHelper("").add("hostAndPort", hostAndPort).add("loginUser", loginCredentials.getUser()) + .add("session", session != null ? session.hashCode() : null).add("connectTimeout", connectTimeout).add( + "sessionTimeout", sessionTimeout).toString(); + } + + +} \ No newline at end of file diff --git a/drivers/jsch/src/main/java/org/jclouds/ssh/jsch/config/JschSshClientModule.java b/drivers/jsch/src/main/java/org/jclouds/ssh/jsch/config/JschSshClientModule.java index a6e67cbc0e..93f2bde215 100644 --- a/drivers/jsch/src/main/java/org/jclouds/ssh/jsch/config/JschSshClientModule.java +++ b/drivers/jsch/src/main/java/org/jclouds/ssh/jsch/config/JschSshClientModule.java @@ -65,9 +65,7 @@ public class JschSshClientModule extends AbstractModule { @Override public SshClient create(IPSocket socket, LoginCredentials credentials) { - SshClient client = new JschSshClient(backoffLimitedRetryHandler, socket, timeout, credentials.getUser(), - (credentials.getPrivateKey() == null) ? credentials.getPassword() : null, - credentials.getPrivateKey() != null ? credentials.getPrivateKey().getBytes() : null); + SshClient client = new JschSshClient(backoffLimitedRetryHandler, socket, credentials, timeout); injector.injectMembers(client);// add logger return client; } diff --git a/drivers/jsch/src/test/java/org/jclouds/ssh/jsch/JschSshClientLiveTest.java b/drivers/jsch/src/test/java/org/jclouds/ssh/jsch/JschSshClientLiveTest.java index 7feea7b17a..71175793b3 100644 --- a/drivers/jsch/src/test/java/org/jclouds/ssh/jsch/JschSshClientLiveTest.java +++ b/drivers/jsch/src/test/java/org/jclouds/ssh/jsch/JschSshClientLiveTest.java @@ -170,8 +170,10 @@ public class JschSshClientLiveTest { : sshHost); } - public void testExecChannelTakesStdinAndEchosBack() throws IOException { - ExecChannel response = setupClient().execChannel("cat < { + public static Builder builder() { + return new Builder(); + } + + public static class Builder { + + protected HostAndPort hostAndPort; + protected LoginCredentials loginCredentials; + protected int connectTimeout; + protected int sessionTimeout; + + /** + * @see SSHClientConnection#getHostAndPort() + */ + public Builder hostAndPort(HostAndPort hostAndPort) { + this.hostAndPort = hostAndPort; + return this; + } + + /** + * @see SSHClientConnection#getLoginCredentials() + */ + public Builder loginCredentials(LoginCredentials loginCredentials) { + this.loginCredentials = loginCredentials; + return this; + } + + /** + * @see SSHClientConnection#getConnectTimeout() + */ + public Builder connectTimeout(int connectTimeout) { + this.connectTimeout = connectTimeout; + return this; + } + + /** + * @see SSHClientConnection#getConnectTimeout() + */ + public Builder sessionTimeout(int sessionTimeout) { + this.sessionTimeout = sessionTimeout; + return this; + } + + public SSHClientConnection build() { + return new SSHClientConnection(hostAndPort, loginCredentials, connectTimeout, sessionTimeout); + } + + protected Builder fromSSHClientConnection(SSHClientConnection in) { + return hostAndPort(in.getHostAndPort()).connectTimeout(in.getConnectTimeout()).loginCredentials( + in.getLoginCredentials()); + } + } + + private SSHClientConnection(HostAndPort hostAndPort, LoginCredentials loginCredentials, int connectTimeout, + int sessionTimeout) { + this.hostAndPort = hostAndPort; + this.loginCredentials = loginCredentials; + this.connectTimeout = connectTimeout; + this.sessionTimeout = sessionTimeout; + } + + @Resource + @Named("jclouds.ssh") + protected Logger logger = Logger.NULL; + + private final HostAndPort hostAndPort; + private final LoginCredentials loginCredentials; + private final int connectTimeout; + private final int sessionTimeout; + + @VisibleForTesting + transient SSHClient ssh; + + @Override + public void clear() { + if (ssh != null && ssh.isConnected()) { + try { + ssh.disconnect(); + } catch (IOException e) { + logger.debug("<< exception disconnecting from %s: %s", e, e.getMessage()); + } + ssh = null; + } + } + + @Override + public SSHClient create() throws Exception { + ssh = new net.schmizz.sshj.SSHClient(); + ssh.addHostKeyVerifier(new PromiscuousVerifier()); + if (connectTimeout != 0) { + ssh.setConnectTimeout(connectTimeout); + } + if (sessionTimeout != 0) { + ssh.setTimeout(sessionTimeout); + } + ssh.connect(hostAndPort.getHostText(), hostAndPort.getPortOrDefault(22)); + if (loginCredentials.getPassword() != null) { + ssh.authPassword(loginCredentials.getUser(), loginCredentials.getPassword()); + } else { + OpenSSHKeyFile key = new OpenSSHKeyFile(); + key.init(loginCredentials.getPrivateKey(), null); + ssh.authPublickey(loginCredentials.getUser(), key); + } + return ssh; + } + + /** + * @return host and port, where port if not present defaults to {@code 22} + */ + public HostAndPort getHostAndPort() { + return hostAndPort; + } + + /** + * + * @return login used in this ssh + */ + public LoginCredentials getLoginCredentials() { + return loginCredentials; + } + + /** + * + * @return how long to wait for the initial connection to be made + */ + public int getConnectTimeout() { + return connectTimeout; + } + + /** + * + * @return how long to keep the ssh open, or {@code 0} for indefinitely + */ + public int getSessionTimeout() { + return sessionTimeout; + } + + /** + * + * @return the current ssh or {@code null} if not connected + */ + public SSHClient getSSHClient() { + return ssh; + } + + @Override + public boolean equals(Object o) { + if (this == o) + return true; + if (o == null || getClass() != o.getClass()) + return false; + SSHClientConnection that = SSHClientConnection.class.cast(o); + return equal(this.hostAndPort, that.hostAndPort) && equal(this.loginCredentials, that.loginCredentials) + && equal(this.ssh, that.ssh); + } + + @Override + public int hashCode() { + return Objects.hashCode(hostAndPort, loginCredentials, ssh); + } + + @Override + public String toString() { + return Objects.toStringHelper("").add("hostAndPort", hostAndPort).add("loginUser", loginCredentials.getUser()) + .add("ssh", ssh != null ? ssh.hashCode() : null).add("connectTimeout", connectTimeout).add( + "sessionTimeout", sessionTimeout).toString(); + } + +} \ No newline at end of file diff --git a/drivers/sshj/src/main/java/org/jclouds/sshj/SshjSshClient.java b/drivers/sshj/src/main/java/org/jclouds/sshj/SshjSshClient.java index dd70dfdd8a..2f20633651 100644 --- a/drivers/sshj/src/main/java/org/jclouds/sshj/SshjSshClient.java +++ b/drivers/sshj/src/main/java/org/jclouds/sshj/SshjSshClient.java @@ -52,14 +52,13 @@ import net.schmizz.sshj.connection.channel.direct.Session.Command; import net.schmizz.sshj.sftp.SFTPClient; import net.schmizz.sshj.sftp.SFTPException; import net.schmizz.sshj.transport.TransportException; -import net.schmizz.sshj.transport.verification.PromiscuousVerifier; import net.schmizz.sshj.userauth.UserAuthException; -import net.schmizz.sshj.userauth.keyprovider.OpenSSHKeyFile; import net.schmizz.sshj.xfer.InMemorySourceFile; import org.apache.commons.io.input.ProxyInputStream; import org.jclouds.compute.domain.ExecChannel; import org.jclouds.compute.domain.ExecResponse; +import org.jclouds.domain.LoginCredentials; import org.jclouds.http.handlers.BackoffLimitedRetryHandler; import org.jclouds.io.Payload; import org.jclouds.io.Payloads; @@ -77,6 +76,7 @@ import com.google.common.base.Splitter; import com.google.common.base.Supplier; import com.google.common.base.Throwables; import com.google.common.io.Closeables; +import com.google.common.net.HostAndPort; import com.google.inject.Inject; /** @@ -104,10 +104,6 @@ public class SshjSshClient implements SshClient { } } - private final String host; - private final int port; - private final String username; - private final String password; private final String toString; @Inject(optional = true) @@ -129,41 +125,42 @@ public class SshjSshClient implements SshClient { @Named("jclouds.ssh.retry-predicate") // NOTE cannot retry io exceptions, as SSHException is a part of the chain private Predicate retryPredicate = or(instanceOf(ConnectionException.class), - instanceOf(ConnectException.class), instanceOf(SocketTimeoutException.class), - instanceOf(TransportException.class), - // safe to retry sftp exceptions as they are idempotent - instanceOf(SFTPException.class)); + instanceOf(ConnectException.class), instanceOf(SocketTimeoutException.class), + instanceOf(TransportException.class), + // safe to retry sftp exceptions as they are idempotent + instanceOf(SFTPException.class)); @Resource @Named("jclouds.ssh") protected Logger logger = Logger.NULL; @VisibleForTesting - SSHClient ssh; - private final byte[] privateKey; - final byte[] emptyPassPhrase = new byte[0]; - private final int timeoutMillis; + SSHClientConnection sshClientConnection; + + final String user; + final String host; + private final BackoffLimitedRetryHandler backoffLimitedRetryHandler; - public SshjSshClient(BackoffLimitedRetryHandler backoffLimitedRetryHandler, IPSocket socket, int timeout, - String username, String password, byte[] privateKey) { + public SshjSshClient(BackoffLimitedRetryHandler backoffLimitedRetryHandler, IPSocket socket, + LoginCredentials loginCredentials, int timeout) { + this.user = checkNotNull(loginCredentials, "loginCredentials").getUser(); this.host = checkNotNull(socket, "socket").getAddress(); checkArgument(socket.getPort() > 0, "ssh port must be greater then zero" + socket.getPort()); - checkArgument(password != null || privateKey != null, "you must specify a password or a key"); - this.port = socket.getPort(); - this.username = checkNotNull(username, "username"); + checkArgument(loginCredentials.getPassword() != null || loginCredentials.getPrivateKey() != null, + "you must specify a password or a key"); this.backoffLimitedRetryHandler = checkNotNull(backoffLimitedRetryHandler, "backoffLimitedRetryHandler"); - this.timeoutMillis = timeout; - this.password = password; - this.privateKey = privateKey; - if (privateKey == null) { - this.toString = String.format("%s:pw[%s]@%s:%d", username, hex(md5(password.getBytes())), host, port); + if (loginCredentials.getPrivateKey() == null) { + this.toString = String.format("%s:pw[%s]@%s:%d", loginCredentials.getUser(), hex(md5(loginCredentials + .getPassword().getBytes())), host, socket.getPort()); } else { - String fingerPrint = fingerprintPrivateKey(new String(privateKey)); - String sha1 = sha1PrivateKey(new String(privateKey)); - this.toString = String.format("%s:rsa[fingerprint(%s),sha1(%s)]@%s:%d", username, fingerPrint, sha1, host, - port); + String fingerPrint = fingerprintPrivateKey(loginCredentials.getPrivateKey()); + String sha1 = sha1PrivateKey(loginCredentials.getPrivateKey()); + this.toString = String.format("%s:rsa[fingerprint(%s),sha1(%s)]@%s:%d", loginCredentials.getUser(), + fingerPrint, sha1, host, socket.getPort()); } + sshClientConnection = SSHClientConnection.builder().hostAndPort(HostAndPort.fromParts(host, socket.getPort())) + .loginCredentials(loginCredentials).connectTimeout(timeout).sessionTimeout(timeout).build(); } @Override @@ -172,7 +169,8 @@ public class SshjSshClient implements SshClient { } private void checkConnected() { - checkState(ssh != null && ssh.isConnected(), String.format("(%s) ssh not connected!", toString())); + checkState(sshClientConnection.ssh != null && sshClientConnection.ssh.isConnected(), String + .format("(%s) ssh not connected!", toString())); } public static interface Connection { @@ -181,45 +179,6 @@ public class SshjSshClient implements SshClient { T create() throws Exception; } - Connection sshConnection = new Connection() { - - @Override - public void clear() { - if (ssh != null && ssh.isConnected()) { - try { - ssh.disconnect(); - } catch (IOException e) { - logger.warn(e, "<< exception disconnecting from %s: %s", e, e.getMessage()); - } - ssh = null; - } - } - - @Override - public net.schmizz.sshj.SSHClient create() throws Exception { - net.schmizz.sshj.SSHClient ssh = new net.schmizz.sshj.SSHClient(); - ssh.addHostKeyVerifier(new PromiscuousVerifier()); - if (timeoutMillis != 0) { - ssh.setTimeout(timeoutMillis); - ssh.setConnectTimeout(timeoutMillis); - } - ssh.connect(host, port); - if (password != null) { - ssh.authPassword(username, password); - } else { - OpenSSHKeyFile key = new OpenSSHKeyFile(); - key.init(new String(privateKey), null); - ssh.authPublickey(username, key); - } - return ssh; - } - - @Override - public String toString() { - return String.format("SSHClient(timeout=%d)", timeoutMillis); - } - }; - private void backoffForAttempt(int retryAttempt, String message) { backoffLimitedRetryHandler.imposeBackoffExponentialDelay(200L, 2, retryAttempt, sshRetries, message); } @@ -240,16 +199,17 @@ public class SshjSshClient implements SshClient { logger.warn(from, "<< (%s) error closing connection", toString()); } if (i + 1 == sshRetries) { - throw propagate(from, errorMessage+" (out of retries - max "+sshRetries+")"); - } else if (shouldRetry(from) || - (Throwables2.getFirstThrowableOfType(from, IllegalStateException.class) != null)) { - logger.info("<< " + errorMessage + " (attempt " + (i + 1) + " of " + sshRetries + "): " + from.getMessage()); + throw propagate(from, errorMessage + " (out of retries - max " + sshRetries + ")"); + } else if (shouldRetry(from) + || (Throwables2.getFirstThrowableOfType(from, IllegalStateException.class) != null)) { + logger.info("<< " + errorMessage + " (attempt " + (i + 1) + " of " + sshRetries + "): " + + from.getMessage()); backoffForAttempt(i + 1, errorMessage + ": " + from.getMessage()); - if (connection != sshConnection) + if (connection != sshClientConnection) connect(); continue; } else { - throw propagate(from, errorMessage+" (not retryable)"); + throw propagate(from, errorMessage + " (not retryable)"); } } } @@ -259,7 +219,7 @@ public class SshjSshClient implements SshClient { public void connect() { try { - ssh = acquire(sshConnection); + acquire(sshClientConnection); } catch (Exception e) { Throwables.propagate(e); } @@ -282,7 +242,7 @@ public class SshjSshClient implements SshClient { @Override public SFTPClient create() throws IOException { checkConnected(); - sftp = ssh.newSFTPClient(); + sftp = sshClientConnection.ssh.newSFTPClient(); return sftp; } @@ -310,7 +270,7 @@ public class SshjSshClient implements SshClient { public Payload create() throws Exception { sftp = acquire(sftpConnection); return Payloads.newInputStreamPayload(new CloseFtpChannelOnCloseInputStream(sftp.getSFTPEngine().open(path) - .getInputStream(), sftp)); + .getInputStream(), sftp)); } @Override @@ -385,7 +345,7 @@ public class SshjSshClient implements SshClient { @VisibleForTesting boolean shouldRetry(Exception from) { Predicate predicate = retryAuth ? Predicates. or(retryPredicate, - instanceOf(AuthorizationException.class), instanceOf(UserAuthException.class)) : retryPredicate; + instanceOf(AuthorizationException.class), instanceOf(UserAuthException.class)) : retryPredicate; if (any(getCausalChain(from), predicate)) return true; if (!retryableMessages.equals("")) @@ -404,7 +364,7 @@ public class SshjSshClient implements SshClient { @Override public boolean apply(Throwable arg0) { return (arg0.toString().indexOf(input) != -1) - || (arg0.getMessage() != null && arg0.getMessage().indexOf(input) != -1); + || (arg0.getMessage() != null && arg0.getMessage().indexOf(input) != -1); } }); @@ -420,7 +380,7 @@ public class SshjSshClient implements SshClient { if (e instanceof UserAuthException) throw new AuthorizationException("(" + toString() + ") " + message, e); throw e instanceof SshException ? SshException.class.cast(e) : new SshException( - "(" + toString() + ") " + message, e); + "(" + toString() + ") " + message, e); } @Override @@ -431,7 +391,7 @@ public class SshjSshClient implements SshClient { @PreDestroy public void disconnect() { try { - sshConnection.clear(); + sshClientConnection.clear(); } catch (Exception e) { Throwables.propagate(e); } @@ -452,8 +412,8 @@ public class SshjSshClient implements SshClient { @Override public Session create() throws Exception { checkConnected(); - session = ssh.startSession(); - session.allocatePTY("vt100", 80, 24, 0, 0, Collections.emptyMap()); + session = sshClientConnection.ssh.startSession(); + session.allocatePTY("vt100", 80, 24, 0, 0, Collections. emptyMap()); return session; } @@ -485,7 +445,7 @@ public class SshjSshClient implements SshClient { session = acquire(execConnection()); Command output = session.exec(checkNotNull(command, "command")); String outputString = IOUtils.readFully(output.getInputStream()).toString(); - output.join(timeoutMillis, TimeUnit.SECONDS); + output.join(sshClientConnection.getSessionTimeout(), TimeUnit.MILLISECONDS); int errorStatus = output.getExitStatus(); String errorString = IOUtils.readFully(output.getErrorStream()).toString(); return new ExecResponse(outputString, errorString, errorStatus); @@ -504,6 +464,37 @@ public class SshjSshClient implements SshClient { return acquire(new ExecConnection(command)); } + protected Connection noPTYConnection() { + + return new Connection() { + + private Session session = null; + private SSHClient sshClientConnection; + + @Override + public void clear() throws TransportException, ConnectionException { + if (session != null) + session.close(); + if (sshClientConnection != null) + Closeables.closeQuietly(sshClientConnection); + } + + @Override + public Session create() throws Exception { + this.sshClientConnection = acquire(SSHClientConnection.builder().fromSSHClientConnection( + SshjSshClient.this.sshClientConnection).sessionTimeout(0).build()); + session = sshClientConnection.startSession(); + return session; + } + + @Override + public String toString() { + return "Session()"; + } + }; + + } + class ExecChannelConnection implements Connection { private final String command; private SessionChannel session; @@ -521,7 +512,7 @@ public class SshjSshClient implements SshClient { @Override public ExecChannel create() throws Exception { - session = SessionChannel.class.cast(acquire(execConnection())); + session = SessionChannel.class.cast(acquire(noPTYConnection())); output = session.exec(command); return new ExecChannel(output.getOutputStream(), output.getInputStream(), output.getErrorStream(), new Supplier() { @@ -552,7 +543,7 @@ public class SshjSshClient implements SshClient { public ExecChannel execChannel(String command) { return acquire(new ExecChannelConnection(command)); } - + @Override public String getHostAddress() { return this.host; @@ -560,7 +551,7 @@ public class SshjSshClient implements SshClient { @Override public String getUsername() { - return this.username; + return this.user; } } diff --git a/drivers/sshj/src/main/java/org/jclouds/sshj/config/SshjSshClientModule.java b/drivers/sshj/src/main/java/org/jclouds/sshj/config/SshjSshClientModule.java index e276712289..7b2621e1ba 100644 --- a/drivers/sshj/src/main/java/org/jclouds/sshj/config/SshjSshClientModule.java +++ b/drivers/sshj/src/main/java/org/jclouds/sshj/config/SshjSshClientModule.java @@ -65,9 +65,7 @@ public class SshjSshClientModule extends AbstractModule { @Override public SshClient create(IPSocket socket, LoginCredentials credentials) { - SshClient client = new SshjSshClient(backoffLimitedRetryHandler, socket, timeout, credentials.getUser(), - (credentials.getPrivateKey() == null) ? credentials.getPassword() : null, - credentials.getPrivateKey() != null ? credentials.getPrivateKey().getBytes() : null); + SshClient client = new SshjSshClient(backoffLimitedRetryHandler, socket, credentials, timeout); injector.injectMembers(client);// add logger return client; } diff --git a/drivers/sshj/src/test/java/org/jclouds/sshj/SshjSshClientLiveTest.java b/drivers/sshj/src/test/java/org/jclouds/sshj/SshjSshClientLiveTest.java index 8fd3f52d60..2888fe7846 100644 --- a/drivers/sshj/src/test/java/org/jclouds/sshj/SshjSshClientLiveTest.java +++ b/drivers/sshj/src/test/java/org/jclouds/sshj/SshjSshClientLiveTest.java @@ -169,9 +169,11 @@ public class SshjSshClientLiveTest { assertEquals(response.getOutput().trim(), "localhost".equals(sshHost) ? InetAddress.getLocalHost().getHostName() : sshHost); } - - public void testExecChannelTakesStdinAndEchosBack() throws IOException { - ExecChannel response = setupClient().execChannel("cat < mockConnection = createMock(SshjSshClient.Connection.class); + SSHClientConnection mockConnection = createMock(SSHClientConnection.class); net.schmizz.sshj.SSHClient mockClient = createMock(net.schmizz.sshj.SSHClient.class); - + mockConnection.clear(); expectLastCall(); mockConnection.create(); expectLastCall().andThrow(new ConnectionException("test1")); mockConnection.clear(); expectLastCall(); @@ -199,14 +198,14 @@ public class SshjSshClientTest { replay(mockConnection); replay(mockClient); - ssh.sshConnection = mockConnection; + ssh.sshClientConnection = mockConnection; BufferLogger logcheck = new BufferLogger(ssh.getClass().getCanonicalName()); ssh.logger = logcheck; logcheck.setLevel(Level.INFO); ssh.connect(); - Assert.assertEquals(ssh.ssh, mockClient); + Assert.assertEquals(ssh.sshClientConnection, mockConnection); verify(mockConnection); verify(mockClient); Record r = logcheck.assertLogContains("attempt 1 of 5"); diff --git a/labs/glesys/src/main/java/org/jclouds/glesys/compute/functions/ServerDetailsToNodeMetadata.java b/labs/glesys/src/main/java/org/jclouds/glesys/compute/functions/ServerDetailsToNodeMetadata.java index a52e052e9d..76edfb4057 100644 --- a/labs/glesys/src/main/java/org/jclouds/glesys/compute/functions/ServerDetailsToNodeMetadata.java +++ b/labs/glesys/src/main/java/org/jclouds/glesys/compute/functions/ServerDetailsToNodeMetadata.java @@ -127,7 +127,7 @@ public class ServerDetailsToNodeMetadata implements Function { public static class Builder extends CatalogType.Builder { public AdminCatalog build() { - return new AdminCatalog(href, type, links, description, tasksInProgress, id, name, owner, catalogItems, isPublished); + return new AdminCatalog(href, type, links, description, tasks, id, name, owner, catalogItems, isPublished); } /** @@ -132,14 +128,14 @@ public class AdminCatalog extends CatalogType { } /** - * @see EntityType#getTasksInProgress() + * @see EntityType#getTasks() */ @Override - public Builder tasksInProgress(TasksInProgress tasksInProgress) { - this.tasksInProgress = tasksInProgress; + public Builder tasks(Set tasks) { + super.tasks(tasks); return this; } - + /** * @see ReferenceType#getHref() */ @@ -157,25 +153,24 @@ public class AdminCatalog extends CatalogType { this.type = type; return this; } - + /** - * @see EntityType#getLinks() + * @see ResourceType#getLinks() */ @Override public Builder links(Set links) { - this.links = Sets.newLinkedHashSet(checkNotNull(links, "links")); - return this; + return Builder.class.cast(super.links(links)); } /** - * @see EntityType#getLinks() + * @see ResourceType#getLinks() */ @Override public Builder link(Link link) { - this.links.add(checkNotNull(link, "link")); - return this; + return Builder.class.cast(super.link(link)); } + @Override public Builder fromCatalogType(CatalogType in) { return Builder.class.cast(super.fromCatalogType(in)); @@ -190,8 +185,8 @@ public class AdminCatalog extends CatalogType { // For JAXB } - public AdminCatalog(URI href, String type, Set links, String description, TasksInProgress tasksInProgress, String id, + public AdminCatalog(URI href, String type, Set links, String description, Set tasks, String id, String name, Owner owner, CatalogItems catalogItems, Boolean published) { - super(href, type, links, description, tasksInProgress, id, name, owner, catalogItems, published); + super(href, type, links, description, tasks, id, name, owner, catalogItems, published); } } diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/AdminOrg.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/AdminOrg.java index a940c0cfca..d515889d09 100644 --- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/AdminOrg.java +++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/AdminOrg.java @@ -21,6 +21,9 @@ package org.jclouds.vcloud.director.v1_5.domain; import static com.google.common.base.Objects.equal; +import java.net.URI; +import java.util.Set; + import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; @@ -145,7 +148,8 @@ public class AdminOrg extends Org { } public AdminOrg build() { - return new AdminOrg(settings, users, groups, catalogs, vdcs, networks); + return new AdminOrg(href, type, links, description, tasks, id, + name, fullName, isEnabled, settings, users, groups, catalogs, vdcs, networks); } public T fromAdminOrg(AdminOrg in) { @@ -175,8 +179,11 @@ public class AdminOrg extends Org { // For JAXB } - protected AdminOrg(OrgSettings settings, UsersList users, GroupsList groups, + protected AdminOrg(URI href, String type, Set links, String description, + Set tasks, String id, String name, String fullName, + Boolean enabled, OrgSettings settings, UsersList users, GroupsList groups, CatalogsList catalogs, Vdcs vdcs, Networks networks) { + super(href, type, links, description, tasks, id, name, fullName, enabled); this.settings = settings; this.users = users; this.groups = groups; diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/AvailableNetworks.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/AvailableNetworks.java index 8e794289f4..bce11717ae 100644 --- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/AvailableNetworks.java +++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/AvailableNetworks.java @@ -25,6 +25,7 @@ import static com.google.common.base.Preconditions.checkNotNull; import java.util.Collection; import java.util.Collections; import java.util.Set; + import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlType; diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/Catalog.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/Catalog.java index 7454d952d1..535dfe490f 100644 --- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/Catalog.java +++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/Catalog.java @@ -57,7 +57,7 @@ public class Catalog extends CatalogType { @Override public Catalog build() { - return new Catalog(href, type, links, description, tasksInProgress, id, name, owner, catalogItems, isPublished); + return new Catalog(href, type, links, description, tasks, id, name, owner, catalogItems, isPublished); } /** @@ -120,11 +120,11 @@ public class Catalog extends CatalogType { } /** - * @see EntityType#getTasksInProgress() + * @see EntityType#getTasks() */ @Override - public Builder tasksInProgress(TasksInProgress tasksInProgress) { - this.tasksInProgress = tasksInProgress; + public Builder tasks(Set tasks) { + super.tasks(tasks); return this; } @@ -174,9 +174,9 @@ public class Catalog extends CatalogType { } } - public Catalog(URI href, String type, Set links, String description, TasksInProgress tasksInProgress, String id, + public Catalog(URI href, String type, Set links, String description, Set tasks, String id, String name, Owner owner, CatalogItems catalogItems, Boolean published) { - super(href, type, links, description, tasksInProgress, id, name, owner, catalogItems, published); + super(href, type, links, description, tasks, id, name, owner, catalogItems, published); } @SuppressWarnings("unused") diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/CatalogItem.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/CatalogItem.java index 7ec0a2ef28..4abcfe131b 100644 --- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/CatalogItem.java +++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/CatalogItem.java @@ -23,6 +23,7 @@ import static com.google.common.base.Preconditions.checkNotNull; import java.net.URI; import java.util.Collections; import java.util.Set; + import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; @@ -45,7 +46,6 @@ public class CatalogItem extends EntityType { public static final String MEDIA_TYPE = VCloudDirectorMediaType.CATALOG_ITEM; - @SuppressWarnings("unchecked") public static Builder builder() { return new Builder(); } @@ -86,7 +86,7 @@ public class CatalogItem extends EntityType { @Override public CatalogItem build() { - return new CatalogItem(href, type, links, description, tasksInProgress, id, name, entity, properties); + return new CatalogItem(href, type, links, description, tasks, id, name, entity, properties); } /** @@ -115,13 +115,13 @@ public class CatalogItem extends EntityType { this.id = id; return this; } - + /** - * @see EntityType#getTasksInProgress() + * @see EntityType#getTasks() */ @Override - public Builder tasksInProgress(TasksInProgress tasksInProgress) { - this.tasksInProgress = tasksInProgress; + public Builder tasks(Set tasks) { + super.tasks(tasks); return this; } @@ -144,21 +144,19 @@ public class CatalogItem extends EntityType { } /** - * @see EntityType#getLinks() + * @see ResourceType#getLinks() */ @Override public Builder links(Set links) { - this.links = Sets.newLinkedHashSet(checkNotNull(links, "links")); - return this; + return Builder.class.cast(super.links(links)); } /** - * @see EntityType#getLinks() + * @see ResourceType#getLinks() */ @Override public Builder link(Link link) { - this.links.add(checkNotNull(link, "link")); - return this; + return Builder.class.cast(super.link(link)); } @Override @@ -171,8 +169,8 @@ public class CatalogItem extends EntityType { } } - private CatalogItem(URI href, String type, Set links, String description, TasksInProgress tasksInProgress, String id, String name, Reference entity, Set properties) { - super(href, type, links, description, tasksInProgress, id, name); + private CatalogItem(URI href, String type, Set links, String description, Set tasks, String id, String name, Reference entity, Set properties) { + super(href, type, links, description, tasks, id, name); this.entity = entity; this.properties = ImmutableSet.copyOf(properties); } diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/CatalogReference.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/CatalogReference.java index 91179152d6..f847700fba 100644 --- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/CatalogReference.java +++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/CatalogReference.java @@ -1,6 +1,7 @@ package org.jclouds.vcloud.director.v1_5.domain; import java.net.URI; + import javax.xml.bind.annotation.XmlRootElement; @XmlRootElement(name = "CatalogReference") diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/CatalogType.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/CatalogType.java index f56095d5f6..b5ccbb6c89 100644 --- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/CatalogType.java +++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/CatalogType.java @@ -90,7 +90,7 @@ public class CatalogType> extends EntityType { @Override public CatalogType build() { - return new CatalogType(href, type, links, description, tasksInProgress, id, name, owner, catalogItems, isPublished); + return new CatalogType(href, type, links, description, tasks, id, name, owner, catalogItems, isPublished); } /** @@ -121,11 +121,11 @@ public class CatalogType> extends EntityType { } /** - * @see EntityType#getTasksInProgress() + * @see EntityType#getTasks() */ @Override - public Builder tasksInProgress(TasksInProgress tasksInProgress) { - super.tasksInProgress(tasksInProgress); + public Builder tasks(Set tasks) { + super.tasks(tasks); return this; } @@ -176,9 +176,9 @@ public class CatalogType> extends EntityType { } } - public CatalogType(URI href, String type, Set links, String description, TasksInProgress tasksInProgress, String id, + public CatalogType(URI href, String type, Set links, String description, Set tasks, String id, String name, Owner owner, CatalogItems catalogItems, Boolean published) { - super(href, type, links, description, tasksInProgress, id, name); + super(href, type, links, description, tasks, id, name); this.owner = owner; this.catalogItems = catalogItems; this.isPublished = published; diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/CatalogsList.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/CatalogsList.java index f15573de67..ee0b2af588 100644 --- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/CatalogsList.java +++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/CatalogsList.java @@ -21,9 +21,9 @@ package org.jclouds.vcloud.director.v1_5.domain; import static com.google.common.base.Objects.equal; import static com.google.common.base.Preconditions.checkNotNull; -import java.util.Collection; import java.util.Collections; import java.util.Set; + import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; @@ -67,6 +67,14 @@ public class CatalogsList { this.catalogReferences = checkNotNull(catalogReferences, "catalogReferences"); return this; } + + /** + * @see CatalogsList#getCatalogItems() + */ + public Builder catalog(Reference catalog) { + this.catalogReferences.add(checkNotNull(catalog, "catalog")); + return this; + } public CatalogsList build() { return new CatalogsList(catalogReferences); @@ -81,7 +89,7 @@ public class CatalogsList { // for JAXB } - private CatalogsList(Set tasks) { + private CatalogsList(Set catalogReferences) { this.catalogReferences = ImmutableSet.copyOf(checkNotNull(catalogReferences, "catalogReferences")); } diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/CloneVAppParams.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/CloneVAppParams.java index 7ec768d529..065f7dcf4f 100644 --- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/CloneVAppParams.java +++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/CloneVAppParams.java @@ -21,8 +21,6 @@ package org.jclouds.vcloud.director.v1_5.domain; import javax.xml.bind.annotation.XmlType; -import com.google.common.base.Objects; - /** * Represents parameters for copying a vApp and optionally deleting the source. diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/ComposeVAppParams.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/ComposeVAppParams.java index 2d6b3ad154..b7a0e5d1da 100644 --- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/ComposeVAppParams.java +++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/ComposeVAppParams.java @@ -24,6 +24,7 @@ import static com.google.common.base.Preconditions.checkNotNull; import java.util.Collections; import java.util.Set; + import javax.xml.bind.annotation.XmlAttribute; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlSeeAlso; diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/CustomOrgLdapSettings.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/CustomOrgLdapSettings.java index 3196ddf932..aa3b75d18e 100644 --- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/CustomOrgLdapSettings.java +++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/CustomOrgLdapSettings.java @@ -21,6 +21,9 @@ package org.jclouds.vcloud.director.v1_5.domain; import static com.google.common.base.Objects.equal; +import java.util.Arrays; +import java.util.List; + import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; @@ -86,6 +89,36 @@ import com.google.common.base.Objects.ToStringHelper; "groupAttributes" }) public class CustomOrgLdapSettings { + public static final class AuthenticationMechanism { + public static final String SIMPLE = "simple"; + public static final String KERBEROS = "kerberos"; + public static final String MD5DIGEST = "md5digest"; + public static final String NTLM = "ntlm"; + + /** + * All acceptable {@link CustomOrgLdapSettings#getAuthenticationMechanism()} values. + *

+ * This list must be updated whenever a new authentication mechanism is added. + */ + public static final List ALL = Arrays.asList( + SIMPLE, KERBEROS, MD5DIGEST, NTLM + ); + } + + public static final class ConnectorType { + public static final String ACTIVE_DIRECTORY = "ACTIVE_DIRECTORY"; + public static final String OPEN_LDAP = "OPEN_LDAP"; + + /** + * All acceptable {@link OrgLdapSettings#getLdapMode()} values. + *

+ * This list must be updated whenever a new mode is added. + */ + public static final List ALL = Arrays.asList( + ACTIVE_DIRECTORY, OPEN_LDAP + ); + } + public static Builder builder() { return new ConcreteBuilder(); } diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/CustomizationSection.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/CustomizationSection.java index 9081103582..72580d253f 100644 --- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/CustomizationSection.java +++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/CustomizationSection.java @@ -25,6 +25,7 @@ import static com.google.common.base.Preconditions.checkNotNull; import java.net.URI; import java.util.Collections; import java.util.Set; + import javax.xml.bind.annotation.XmlAttribute; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/Entity.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/Entity.java index 801375b9c0..b0486a53a2 100644 --- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/Entity.java +++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/Entity.java @@ -46,7 +46,7 @@ public class Entity extends EntityType { @Override public Entity build() { - return new Entity(href, type, links, description, tasksInProgress, id, name); + return new Entity(href, type, links, description, tasks, id, name); } /** @@ -77,11 +77,11 @@ public class Entity extends EntityType { } /** - * @see EntityType#getTasksInProgress() + * @see EntityType#getTasks() */ @Override - public Builder tasksInProgress(TasksInProgress tasksInProgress) { - this.tasksInProgress = tasksInProgress; + public Builder tasks(Set tasks) { + super.tasks(tasks); return this; } @@ -131,8 +131,8 @@ public class Entity extends EntityType { } } - private Entity(URI href, String type, Set links, String description, TasksInProgress tasksInProgress, String id, String name) { - super(href, type, links, description, tasksInProgress, id, name); + private Entity(URI href, String type, Set links, String description, Set tasks, String id, String name) { + super(href, type, links, description, tasks, id, name); } private Entity() { diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/EntityType.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/EntityType.java index b9a0bc1fc9..5c23f0beda 100644 --- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/EntityType.java +++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/EntityType.java @@ -22,13 +22,18 @@ import static com.google.common.base.Objects.equal; import static com.google.common.base.Preconditions.checkNotNull; import java.net.URI; +import java.util.Collections; import java.util.Set; import javax.xml.bind.annotation.XmlAttribute; import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlElementWrapper; + +import org.jclouds.javax.annotation.Nullable; import com.google.common.base.Objects; import com.google.common.base.Objects.ToStringHelper; +import com.google.common.collect.ImmutableSet; import com.google.common.collect.Sets; /** @@ -48,7 +53,7 @@ public abstract class EntityType> extends ResourceType> extends ResourceType.NewBuilder { protected String description; - protected TasksInProgress tasksInProgress; + protected Set tasks; protected String name; protected String id; @@ -77,16 +82,16 @@ public abstract class EntityType> extends ResourceType tasks) { + this.tasks = tasks; return self(); } public T fromEntityType(EntityType in) { return fromResourceType(in) - .description(in.getDescription()).tasksInProgress(in.getTasksInProgress()) + .description(in.getDescription()).tasks(in.getTasks()) .id(in.getId()).name(in.getName()); } } @@ -94,7 +99,7 @@ public abstract class EntityType> extends ResourceType> extends ResourceType.Builder { protected String description; - protected TasksInProgress tasksInProgress; + protected Set tasks; protected String name; protected String id; @@ -121,12 +126,23 @@ public abstract class EntityType> extends ResourceType tasks(Set tasks) { + if (checkNotNull(tasks, "tasks").size() > 0) + this.tasks = Sets.newLinkedHashSet(tasks); + return this; + } /** - * @see EntityType#getTasksInProgress() + * @see EntityType#getTasks() */ - public Builder tasksInProgress(TasksInProgress tasksInProgress) { - this.tasksInProgress = tasksInProgress; + public Builder task(Task task) { + if (tasks == null) + tasks = Sets.newLinkedHashSet(); + this.tasks.add(checkNotNull(task, "task")); return this; } @@ -151,19 +167,19 @@ public abstract class EntityType> extends ResourceType links(Set links) { - this.links = Sets.newLinkedHashSet(checkNotNull(links, "links")); - return this; + return Builder.class.cast(super.links(links)); } /** * @see ResourceType#getLinks() */ + @SuppressWarnings("unchecked") @Override public Builder link(Link link) { - this.links.add(checkNotNull(link, "link")); - return this; + return Builder.class.cast(super.link(link)); } /** @@ -177,24 +193,26 @@ public abstract class EntityType> extends ResourceType fromEntityType(EntityType in) { return fromResourceType(in) - .description(in.getDescription()).tasksInProgress(in.getTasksInProgress()) + .description(in.getDescription()).tasks(in.getTasks()) .id(in.getId()).name(in.getName()); } } @XmlElement(name = "Description") private String description; - @XmlElement(name = "Tasks") - private TasksInProgress tasksInProgress; + @XmlElementWrapper(name = "Tasks") + @XmlElement(name = "Task") + private Set tasks; @XmlAttribute private String id; @XmlAttribute(required = true) private String name; - public EntityType(URI href, String type, Set links, String description, TasksInProgress tasksInProgress, String id, String name) { + public EntityType(URI href, String type, @Nullable Set links, String description, @Nullable Set tasks, String id, String name) { super(href, type, links); this.description = description; - this.tasksInProgress = tasksInProgress; + // nullable so that jaxb wont persist empty collections + this.tasks = tasks != null && tasks.size() == 0 ? null : tasks; this.id = id; this.name = name; } @@ -213,8 +231,8 @@ public abstract class EntityType> extends ResourceType getTasks() { + return tasks == null ? ImmutableSet.of() : Collections.unmodifiableSet(tasks); } /** @@ -243,7 +261,7 @@ public abstract class EntityType> extends ResourceType that = EntityType.class.cast(o); return super.equals(that) && equal(this.id, that.id) && equal(this.description, that.description) && - equal(this.tasksInProgress, that.tasksInProgress) && equal(this.name, that.name); + equal(this.tasks, that.tasks) && equal(this.name, that.name); } @Override @@ -258,11 +276,11 @@ public abstract class EntityType> extends ResourceType { } public File build() { - return new File(href, type, links, description, tasksInProgress, id, name, size, bytesTransferred, checksum); + return new File(href, type, links, description, tasks, id, name, size, bytesTransferred, checksum); } @@ -127,11 +126,11 @@ public class File extends EntityType { } /** - * @see EntityType#getTasksInProgress() + * @see EntityType#getTasks() */ @Override - public Builder tasksInProgress(TasksInProgress tasksInProgress) { - super.tasksInProgress (tasksInProgress); + public Builder tasks(Set tasks) { + super.tasks (tasks); return this; } @@ -158,7 +157,7 @@ public class File extends EntityType { */ @Override public Builder links(Set links) { - this.links = Sets.newLinkedHashSet(checkNotNull(links, "links")); + super.links(links); return this; } @@ -167,7 +166,7 @@ public class File extends EntityType { */ @Override public Builder link(Link link) { - this.links.add(checkNotNull(link, "link")); + super.link(link); return this; } @@ -185,9 +184,9 @@ public class File extends EntityType { } } - public File(URI href, String type, Set links, String description, TasksInProgress tasksInProgress, String id, + public File(URI href, String type, Set links, String description, Set tasks, String id, String name, Long size, Long bytesTransferred, String checksum) { - super(href, type, links, description, tasksInProgress, id, name); + super(href, type, links, description, tasks, id, name); this.size = size; this.bytesTransferred = bytesTransferred; this.checksum = checksum; diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/FirewallRule.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/FirewallRule.java index 2956bc6117..9ce90b4f82 100644 --- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/FirewallRule.java +++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/FirewallRule.java @@ -21,8 +21,6 @@ package org.jclouds.vcloud.director.v1_5.domain; import static com.google.common.base.Objects.equal; -import javax.xml.bind.annotation.XmlAccessType; -import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlType; diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/FirewallRuleProtocols.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/FirewallRuleProtocols.java index be2486a61d..dfbb179335 100644 --- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/FirewallRuleProtocols.java +++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/FirewallRuleProtocols.java @@ -22,7 +22,6 @@ package org.jclouds.vcloud.director.v1_5.domain; import static com.google.common.base.Objects.equal; import javax.xml.bind.annotation.XmlElement; -import javax.xml.bind.annotation.XmlSeeAlso; import javax.xml.bind.annotation.XmlType; import com.google.common.base.Objects; diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/Group.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/Group.java index 5c7887e04d..f23153310d 100644 --- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/Group.java +++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/Group.java @@ -106,7 +106,7 @@ public class Group extends EntityType { } public Group build() { - return new Group(href, type, links, description, tasksInProgress, id, name, + return new Group(href, type, links, description, tasks, id, name, nameInSource, usersList, role); } @@ -138,11 +138,11 @@ public class Group extends EntityType { } /** - * @see EntityType#getTasksInProgress() + * @see EntityType#getTasks() */ @Override - public Builder tasksInProgress(TasksInProgress tasksInProgress) { - super.tasksInProgress(tasksInProgress); + public Builder tasks(Set tasks) { + super.tasks(tasks); return this; } @@ -200,9 +200,9 @@ public class Group extends EntityType { } public Group(URI href, String type, Set links, String description, - TasksInProgress tasksInProgress, String id, String name, String nameInSource, + Set tasks, String id, String name, String nameInSource, UsersList usersList, Reference role) { - super(href, type, links, description, tasksInProgress, id, name); + super(href, type, links, description, tasks, id, name); this.nameInSource = nameInSource; this.usersList = usersList; this.role = role; diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/GroupsList.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/GroupsList.java index f74d9c6d77..7d2bb4ee40 100644 --- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/GroupsList.java +++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/GroupsList.java @@ -62,7 +62,7 @@ import com.google.common.collect.ImmutableList; @XmlAccessorType(XmlAccessType.FIELD) @XmlRootElement(name = "GroupsList") @XmlType(propOrder = { - "groupReference" + "groups" }) public class GroupsList { public static Builder builder() { diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/GuestCustomizationSection.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/GuestCustomizationSection.java index d1977f932b..879110f744 100644 --- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/GuestCustomizationSection.java +++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/GuestCustomizationSection.java @@ -25,6 +25,7 @@ import static com.google.common.base.Preconditions.checkNotNull; import java.net.URI; import java.util.Collections; import java.util.Set; + import javax.xml.bind.annotation.XmlAttribute; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/IpAddresses.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/IpAddresses.java index 61343c8494..6d7a39923f 100644 --- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/IpAddresses.java +++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/IpAddresses.java @@ -23,6 +23,7 @@ import static com.google.common.base.Preconditions.checkNotNull; import java.util.Collections; import java.util.Set; + import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/IpsecVpnLocalPeer.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/IpsecVpnLocalPeer.java index 27ca6519d2..e102ecbb18 100644 --- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/IpsecVpnLocalPeer.java +++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/IpsecVpnLocalPeer.java @@ -20,7 +20,6 @@ package org.jclouds.vcloud.director.v1_5.domain; import javax.xml.bind.annotation.XmlRootElement; -import javax.xml.bind.annotation.XmlType; /** diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/Link.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/Link.java index e7d95c666d..83948fdd48 100644 --- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/Link.java +++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/Link.java @@ -25,6 +25,7 @@ import java.net.URI; import java.util.Arrays; import java.util.List; import java.util.Map; + import javax.xml.bind.annotation.XmlAttribute; import javax.xml.bind.annotation.XmlRootElement; diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/Media.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/Media.java index 1c42578cb0..209361b246 100644 --- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/Media.java +++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/Media.java @@ -24,6 +24,7 @@ import java.net.URI; import java.util.Arrays; import java.util.List; import java.util.Set; + import javax.xml.bind.annotation.XmlAttribute; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; @@ -89,7 +90,7 @@ public class Media extends ResourceEntityType { @Override public Media build() { - return new Media(href, type, links, description, tasksInProgress, id, name, files, status, owner, imageType, size); + return new Media(href, type, links, description, tasks, id, name, files, status, owner, imageType, size); } /** @@ -138,11 +139,11 @@ public class Media extends ResourceEntityType { } /** - * @see EntityType#getTasksInProgress() + * @see EntityType#getTasks() */ @Override - public Builder tasksInProgress(TasksInProgress tasksInProgress) { - super.tasksInProgress(tasksInProgress); + public Builder tasks(Set tasks) { + super.tasks(tasks); return this; } @@ -193,9 +194,9 @@ public class Media extends ResourceEntityType { } - public Media(URI href, String type, Set links, String description, TasksInProgress tasksInProgress, String id, + public Media(URI href, String type, Set links, String description, Set tasks, String id, String name, FilesList files, Integer status, Owner owner, String imageType, long size) { - super(href, type, links, description, tasksInProgress, id, name, files, status); + super(href, type, links, description, tasks, id, name, files, status); this.owner = owner; this.imageType = imageType; this.size = size; diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/Metadata.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/Metadata.java index 781f4b684b..1e8b8fc180 100644 --- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/Metadata.java +++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/Metadata.java @@ -24,6 +24,7 @@ import static com.google.common.base.Preconditions.checkNotNull; import java.net.URI; import java.util.Collections; import java.util.Set; + import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/MetadataEntry.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/MetadataEntry.java index c9d08b7fe8..f0c73ca532 100644 --- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/MetadataEntry.java +++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/MetadataEntry.java @@ -23,6 +23,7 @@ import static com.google.common.base.Preconditions.checkNotNull; import java.net.URI; import java.util.Set; + import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/MetadataValue.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/MetadataValue.java index 7f9cd87b79..c5131ae1f5 100644 --- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/MetadataValue.java +++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/MetadataValue.java @@ -23,6 +23,7 @@ import static com.google.common.base.Preconditions.checkNotNull; import java.net.URI; import java.util.Set; + import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/NatService.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/NatService.java index 5b0c756a80..ee1d401b0d 100644 --- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/NatService.java +++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/NatService.java @@ -22,9 +22,7 @@ package org.jclouds.vcloud.director.v1_5.domain; import static com.google.common.base.Objects.equal; import static com.google.common.base.Preconditions.checkNotNull; -import java.util.Collection; import java.util.Collections; -import java.util.List; import java.util.Set; import javax.xml.bind.annotation.XmlElement; diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/NetworkConfigSection.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/NetworkConfigSection.java index 6b90af824d..2a680852bc 100644 --- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/NetworkConfigSection.java +++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/NetworkConfigSection.java @@ -25,6 +25,7 @@ import static com.google.common.base.Preconditions.checkNotNull; import java.net.URI; import java.util.Collections; import java.util.Set; + import javax.xml.bind.annotation.XmlAttribute; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/NetworkConnectionSection.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/NetworkConnectionSection.java index a852ceed2f..73e8c5ebc7 100644 --- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/NetworkConnectionSection.java +++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/NetworkConnectionSection.java @@ -25,6 +25,7 @@ import static com.google.common.base.Preconditions.checkNotNull; import java.net.URI; import java.util.Collections; import java.util.Set; + import javax.xml.bind.annotation.XmlAttribute; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/NetworkType.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/NetworkType.java index bd9a213c9c..8cb5cbcbf3 100644 --- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/NetworkType.java +++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/NetworkType.java @@ -19,16 +19,15 @@ package org.jclouds.vcloud.director.v1_5.domain; import static com.google.common.base.Objects.equal; -import static com.google.common.base.Preconditions.checkNotNull; import java.net.URI; import java.util.Set; + import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; import com.google.common.base.Objects; import com.google.common.base.Objects.ToStringHelper; -import com.google.common.collect.Sets; @XmlRootElement(name = "NetworkType") public class NetworkType> extends EntityType { @@ -56,7 +55,7 @@ public class NetworkType> extends EntityType { @Override public NetworkType build() { - return new NetworkType(href, type, links, description, tasksInProgress, id, name, networkConfiguration); + return new NetworkType(href, type, links, description, tasks, id, name, networkConfiguration); } /** @@ -85,13 +84,13 @@ public class NetworkType> extends EntityType { this.id = id; return this; } - + /** - * @see EntityType#getTasksInProgress() + * @see EntityType#getTasks() */ @Override - public Builder tasksInProgress(TasksInProgress tasksInProgress) { - this.tasksInProgress = tasksInProgress; + public Builder tasks(Set tasks) { + super.tasks(tasks); return this; } @@ -118,7 +117,7 @@ public class NetworkType> extends EntityType { */ @Override public Builder links(Set links) { - this.links = Sets.newLinkedHashSet(checkNotNull(links, "links")); + super.links(links); return this; } @@ -127,7 +126,7 @@ public class NetworkType> extends EntityType { */ @Override public Builder link(Link link) { - this.links.add(checkNotNull(link, "link")); + super.link(link); return this; } @@ -145,9 +144,9 @@ public class NetworkType> extends EntityType { } } - public NetworkType(URI href, String type, Set links, String description, TasksInProgress tasksInProgress, + public NetworkType(URI href, String type, Set links, String description, Set tasks, String id, String name, NetworkConfiguration networkConfiguration) { - super(href, type, links, description, tasksInProgress, id, name); + super(href, type, links, description, tasks, id, name); this.networkConfiguration = networkConfiguration; } diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/Networks.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/Networks.java index 01323bf708..684abd080f 100644 --- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/Networks.java +++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/Networks.java @@ -33,6 +33,7 @@ import javax.xml.bind.annotation.XmlType; import com.google.common.base.Objects; import com.google.common.base.Objects.ToStringHelper; import com.google.common.collect.ImmutableList; +import com.google.common.collect.Lists; /** @@ -62,7 +63,7 @@ import com.google.common.collect.ImmutableList; */ @XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "Networks", propOrder = { - "network" + "networks" }) public class Networks { public static Builder builder() { @@ -75,7 +76,7 @@ public class Networks { public static class Builder { - private List networks; + private List networks = Lists.newArrayList(); /** * @see Networks#getNetwork() diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/Org.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/Org.java index 69b9c48852..368d8024f1 100644 --- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/Org.java +++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/Org.java @@ -59,8 +59,8 @@ public class Org extends EntityType { public static abstract class NewBuilder> extends EntityType.NewBuilder { - private String fullName; - private Boolean isEnabled; + protected String fullName; + protected Boolean isEnabled; /** * @see Org#getFullName() @@ -80,7 +80,7 @@ public class Org extends EntityType { @Override public Org build() { - return new Org(href, type, links, description, tasksInProgress, id, name, fullName, isEnabled); + return new Org(href, type, links, description, tasks, id, name, fullName, isEnabled); } public T fromOrg(Org in) { @@ -143,7 +143,7 @@ public class Org extends EntityType { @Override public Org build() { - return new Org(href, type, links, description, tasksInProgress, id, name, fullName, isEnabled); + return new Org(href, type, links, description, tasks, id, name, fullName, isEnabled); } /** @@ -174,11 +174,11 @@ public class Org extends EntityType { } /** - * @see EntityType#getTasksInProgress() + * @see EntityType#getTasks() */ @Override - public Builder tasksInProgress(TasksInProgress tasksInProgress) { - this.tasksInProgress = tasksInProgress; + public Builder tasks(Set tasks) { + super.tasks(tasks); return this; } @@ -232,7 +232,9 @@ public class Org extends EntityType { // for JAXB } - public Org(URI href, String type, Set links, String description, TasksInProgress tasksInProgress, String id, String name, String fullName, Boolean enabled) { + public Org(URI href, String type, Set links, String description, + Set tasksInProgress, String id, String name, + String fullName, Boolean enabled) { super(href, type, links, description, tasksInProgress, id, name); this.fullName = fullName; isEnabled = enabled; diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/OrgEmailSettings.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/OrgEmailSettings.java index 64e528a3eb..39c20987ed 100644 --- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/OrgEmailSettings.java +++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/OrgEmailSettings.java @@ -76,7 +76,7 @@ import com.google.common.collect.ImmutableList; "fromEmailAddress", "defaultSubjectPrefix", "isAlertEmailToAllAdmins", - "alertEmailTo", + "alertEmailsTo", "smtpServerSettings" }) public class OrgEmailSettings extends ResourceType { @@ -142,7 +142,7 @@ public class OrgEmailSettings extends ResourceType { * @see OrgEmailSettings#getAlertEmailTo() */ public Builder alertEmailsTo(List alertEmailsTo) { - this.alertEmailTo = ImmutableList.copyOf(alertEmailsTo); + this.alertEmailTo = alertEmailsTo == null ? null : ImmutableList.copyOf(alertEmailsTo); return this; } @@ -163,7 +163,8 @@ public class OrgEmailSettings extends ResourceType { } public OrgEmailSettings build() { - return new OrgEmailSettings(isDefaultSmtpServer, isDefaultOrgEmail, fromEmailAddress, defaultSubjectPrefix, + return new OrgEmailSettings(href, type, links, isDefaultSmtpServer, + isDefaultOrgEmail, fromEmailAddress, defaultSubjectPrefix, isAlertEmailToAllAdmins, alertEmailTo, smtpServerSettings); } @@ -225,9 +226,11 @@ public class OrgEmailSettings extends ResourceType { // For JAXB } - private OrgEmailSettings(boolean isDefaultSmtpServer, boolean isDefaultOrgEmail, + private OrgEmailSettings(URI href, String type, Set links, + boolean isDefaultSmtpServer, boolean isDefaultOrgEmail, String fromEmailAddress, String defaultSubjectPrefix, boolean isAlertEmailToAllAdmins, List alertEmailTo, SmtpServerSettings smtpServerSettings) { + super(href, type, links); this.isDefaultSmtpServer = isDefaultSmtpServer; this.isDefaultOrgEmail = isDefaultOrgEmail; this.fromEmailAddress = fromEmailAddress; @@ -323,9 +326,6 @@ public class OrgEmailSettings extends ResourceType { * */ public List getAlertEmailsTo() { - if (alertEmailsTo == null) { - alertEmailsTo = new ArrayList(); - } return this.alertEmailsTo; } diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/OrgGeneralSettings.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/OrgGeneralSettings.java index 67eec98430..9557a8bcd6 100644 --- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/OrgGeneralSettings.java +++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/OrgGeneralSettings.java @@ -63,7 +63,7 @@ import com.google.common.base.Objects.ToStringHelper; * */ @XmlAccessorType(XmlAccessType.FIELD) -@XmlRootElement(name = "OrgGeneralSettings") +@XmlRootElement(name = "GeneralOrgSettings") @XmlType(propOrder = { "canPublishCatalogs", "deployedVMQuota", diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/OrgLdapSettings.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/OrgLdapSettings.java index 667ec88a20..e239eba6df 100644 --- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/OrgLdapSettings.java +++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/OrgLdapSettings.java @@ -22,11 +22,14 @@ package org.jclouds.vcloud.director.v1_5.domain; import static com.google.common.base.Objects.equal; import java.net.URI; +import java.util.Arrays; +import java.util.List; import java.util.Set; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.XmlType; import com.google.common.base.Objects; @@ -60,12 +63,28 @@ import com.google.common.base.Objects.ToStringHelper; * */ @XmlAccessorType(XmlAccessType.FIELD) -@XmlType(name = "OrgLdapSettings", propOrder = { - "orgLdapMode", +@XmlRootElement(name = "OrgLdapSettings") +@XmlType(propOrder = { + "ldapMode", "customUsersOu", "customOrgLdapSettings" }) public class OrgLdapSettings extends ResourceType { + public static final class LdapMode { + public static final String NONE = "NONE"; + public static final String SYSTEM = "SYSTEM"; + public static final String CUSTOM = "CUSTOM"; + + /** + * All acceptable {@link OrgLdapSettings#getLdapMode()} values. + *

+ * This list must be updated whenever a new mode is added. + */ + public static final List ALL = Arrays.asList( + NONE, SYSTEM, CUSTOM + ); + } + public static Builder builder() { return new Builder(); } @@ -76,15 +95,15 @@ public class OrgLdapSettings extends ResourceType { public static class Builder extends ResourceType.Builder { - private String orgLdapMode; + private String ldapMode; private String customUsersOu; private CustomOrgLdapSettings customOrgLdapSettings; /** - * @see OrgLdapSettings#getOrgLdapMode() + * @see OrgLdapSettings#getLdapMode() */ - public Builder orgLdapMode(String orgLdapMode) { - this.orgLdapMode = orgLdapMode; + public Builder ldapMode(String ldapMode) { + this.ldapMode = ldapMode; return this; } @@ -106,7 +125,7 @@ public class OrgLdapSettings extends ResourceType { public OrgLdapSettings build() { OrgLdapSettings orgLdapSettings = new OrgLdapSettings(href, type, links, - orgLdapMode, customUsersOu, customOrgLdapSettings); + ldapMode, customUsersOu, customOrgLdapSettings); return orgLdapSettings; } @@ -154,7 +173,7 @@ public class OrgLdapSettings extends ResourceType { } public Builder fromOrgLdapSettings(OrgLdapSettings in) { return fromResourceType(in) - .orgLdapMode(in.getOrgLdapMode()) + .ldapMode(in.getLdapMode()) .customUsersOu(in.getCustomUsersOu()) .customOrgLdapSettings(in.getCustomOrgLdapSettings()); } @@ -166,9 +185,9 @@ public class OrgLdapSettings extends ResourceType { } public OrgLdapSettings(URI href, String type, Set links, - String orgLdapMode, String customUsersOu, CustomOrgLdapSettings customOrgLdapSettings) { + String ldapMode, String customUsersOu, CustomOrgLdapSettings customOrgLdapSettings) { super(href, type, links); - this.orgLdapMode = orgLdapMode; + this.ldapMode = ldapMode; this.customUsersOu = customUsersOu; this.customOrgLdapSettings = customOrgLdapSettings; } @@ -176,7 +195,7 @@ public class OrgLdapSettings extends ResourceType { @XmlElement(name = "OrgLdapMode") - protected String orgLdapMode; + protected String ldapMode; @XmlElement(name = "CustomUsersOu") protected String customUsersOu; @XmlElement(name = "CustomOrgLdapSettings") @@ -190,8 +209,8 @@ public class OrgLdapSettings extends ResourceType { * {@link String } * */ - public String getOrgLdapMode() { - return orgLdapMode; + public String getLdapMode() { + return ldapMode; } /** @@ -226,7 +245,7 @@ public class OrgLdapSettings extends ResourceType { return false; OrgLdapSettings that = OrgLdapSettings.class.cast(o); return super.equals(that) && - equal(orgLdapMode, that.orgLdapMode) && + equal(ldapMode, that.ldapMode) && equal(customUsersOu, that.customUsersOu) && equal(customOrgLdapSettings, that.customOrgLdapSettings); } @@ -234,7 +253,7 @@ public class OrgLdapSettings extends ResourceType { @Override public int hashCode() { return Objects.hashCode(super.hashCode(), - orgLdapMode, + ldapMode, customUsersOu, customOrgLdapSettings); } @@ -242,7 +261,7 @@ public class OrgLdapSettings extends ResourceType { @Override public ToStringHelper string() { return super.string() - .add("orgLdapMode", orgLdapMode) + .add("orgLdapMode", ldapMode) .add("customUsersOu", customUsersOu) .add("customOrgLdapSettings", customOrgLdapSettings); } diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/OrgLeaseSettings.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/OrgLeaseSettings.java index 26e9ace80e..b6722e8d5d 100644 --- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/OrgLeaseSettings.java +++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/OrgLeaseSettings.java @@ -27,6 +27,7 @@ import java.util.Set; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.XmlType; import com.google.common.base.Objects; @@ -60,7 +61,8 @@ import com.google.common.base.Objects.ToStringHelper; * */ @XmlAccessorType(XmlAccessType.FIELD) -@XmlType(name = "OrgLeaseSettings", propOrder = { +@XmlRootElement(name = "VAppLeaseSettings") +@XmlType(propOrder = { "deleteOnStorageLeaseExpiration", "deploymentLeaseSeconds", "storageLeaseSeconds" diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/OrgList.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/OrgList.java index 80f4cd1fa0..0788641c73 100644 --- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/OrgList.java +++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/OrgList.java @@ -23,6 +23,7 @@ import static com.google.common.base.Preconditions.checkNotNull; import java.util.Collections; import java.util.Set; + import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/OrgNetwork.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/OrgNetwork.java index c2d841ffbe..b65c593b6c 100644 --- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/OrgNetwork.java +++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/OrgNetwork.java @@ -19,16 +19,15 @@ package org.jclouds.vcloud.director.v1_5.domain; import static com.google.common.base.Objects.equal; -import static com.google.common.base.Preconditions.checkNotNull; import java.net.URI; import java.util.Set; + import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; import com.google.common.base.Objects; import com.google.common.base.Objects.ToStringHelper; -import com.google.common.collect.Sets; @XmlRootElement(name = "OrgNetwork") public class OrgNetwork extends NetworkType { @@ -66,7 +65,7 @@ public class OrgNetwork extends NetworkType { @Override public OrgNetwork build() { - return new OrgNetwork(href, type, links, description, tasksInProgress, id, name, networkConfiguration, + return new OrgNetwork(href, type, links, description, tasks, id, name, networkConfiguration, networkPool, allowedExternalIpAddresses); } @@ -104,13 +103,13 @@ public class OrgNetwork extends NetworkType { this.id = id; return this; } - + /** - * @see EntityType#getTasksInProgress() + * @see EntityType#getTasks() */ @Override - public Builder tasksInProgress(TasksInProgress tasksInProgress) { - this.tasksInProgress = tasksInProgress; + public Builder tasks(Set tasks) { + super.tasks(tasks); return this; } @@ -137,7 +136,7 @@ public class OrgNetwork extends NetworkType { */ @Override public Builder links(Set links) { - this.links = Sets.newLinkedHashSet(checkNotNull(links, "links")); + super.links(links); return this; } @@ -146,7 +145,7 @@ public class OrgNetwork extends NetworkType { */ @Override public Builder link(Link link) { - this.links.add(checkNotNull(link, "link")); + super.link(link); return this; } @@ -166,9 +165,9 @@ public class OrgNetwork extends NetworkType { // For JAXB } - private OrgNetwork(URI href, String type, Set links, String description, TasksInProgress tasksInProgress, + private OrgNetwork(URI href, String type, Set links, String description, Set tasks, String id, String name, NetworkConfiguration networkConfiguration, ReferenceType networkPool, IpAddresses allowedExternalIpAddresses) { - super(href, type, links, description, tasksInProgress, id, name, networkConfiguration); + super(href, type, links, description, tasks, id, name, networkConfiguration); this.networkPool = networkPool; this.allowedExternalIpAddresses = allowedExternalIpAddresses; } diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/OrgPasswordPolicySettings.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/OrgPasswordPolicySettings.java index d766f513ae..3974e1ca04 100644 --- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/OrgPasswordPolicySettings.java +++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/OrgPasswordPolicySettings.java @@ -193,7 +193,7 @@ public class OrgPasswordPolicySettings extends ResourceType { public static Builder builder() { @@ -87,18 +87,18 @@ public class OrgSettings extends ResourceType { public static class Builder extends ResourceType.Builder { - private OrgGeneralSettings orgGeneralSettings; + private OrgGeneralSettings generalSettings; private OrgLeaseSettings vAppLeaseSettings; private OrgVAppTemplateLeaseSettings vAppTemplateLeaseSettings; - private OrgLdapSettings orgLdapSettings; - private OrgEmailSettings orgEmailSettings; - private OrgPasswordPolicySettings orgPasswordPolicySettings; + private OrgLdapSettings ldapSettings; + private OrgEmailSettings emailSettings; + private OrgPasswordPolicySettings passwordPolicy; /** - * @see OrgSettings#getOrgGeneralSettings() + * @see OrgSettings#getGeneralSettings() */ - public Builder orgGeneralSettings(OrgGeneralSettings orgGeneralSettings) { - this.orgGeneralSettings = orgGeneralSettings; + public Builder generalSettings(OrgGeneralSettings generalSettings) { + this.generalSettings = generalSettings; return this; } @@ -119,32 +119,32 @@ public class OrgSettings extends ResourceType { } /** - * @see OrgSettings#getOrgLdapSettings() + * @see OrgSettings#getLdapSettings() */ - public Builder orgLdapSettings(OrgLdapSettings orgLdapSettings) { - this.orgLdapSettings = orgLdapSettings; + public Builder ldapSettings(OrgLdapSettings ldapSettings) { + this.ldapSettings = ldapSettings; return this; } /** - * @see OrgSettings#getOrgEmailSettings() + * @see OrgSettings#getEmailSettings() */ - public Builder orgEmailSettings(OrgEmailSettings orgEmailSettings) { - this.orgEmailSettings = orgEmailSettings; + public Builder emailSettings(OrgEmailSettings emailSettings) { + this.emailSettings = emailSettings; return this; } /** - * @see OrgSettings#getOrgPasswordPolicySettings() + * @see OrgSettings#getPasswordPolicy() */ - public Builder orgPasswordPolicySettings(OrgPasswordPolicySettings orgPasswordPolicySettings) { - this.orgPasswordPolicySettings = orgPasswordPolicySettings; + public Builder passwordPolicy(OrgPasswordPolicySettings passwordPolicy) { + this.passwordPolicy = passwordPolicy; return this; } public OrgSettings build() { - return new OrgSettings(href, type, links, orgGeneralSettings, vAppLeaseSettings, - vAppTemplateLeaseSettings, orgLdapSettings, orgEmailSettings, orgPasswordPolicySettings); + return new OrgSettings(href, type, links, generalSettings, vAppLeaseSettings, + vAppTemplateLeaseSettings, ldapSettings, emailSettings, passwordPolicy); } @@ -191,12 +191,12 @@ public class OrgSettings extends ResourceType { } public Builder fromOrgSettings(OrgSettings in) { return fromResourceType(in) - .orgGeneralSettings(in.getOrgGeneralSettings()) + .generalSettings(in.getGeneralSettings()) .vAppLeaseSettings(in.getVAppLeaseSettings()) .vAppTemplateLeaseSettings(in.getVAppTemplateLeaseSettings()) - .orgLdapSettings(in.getOrgLdapSettings()) - .orgEmailSettings(in.getOrgEmailSettings()) - .orgPasswordPolicySettings(in.getOrgPasswordPolicySettings()); + .ldapSettings(in.getLdapSettings()) + .emailSettings(in.getEmailSettings()) + .passwordPolicy(in.getPasswordPolicy()); } } @@ -205,32 +205,33 @@ public class OrgSettings extends ResourceType { // For JAXB } - public OrgSettings(URI href, String type, Set links, - OrgGeneralSettings orgGeneralSettings, + public OrgSettings(URI href, String type, Set links, + OrgGeneralSettings generalSettings, OrgLeaseSettings vAppLeaseSettings, OrgVAppTemplateLeaseSettings vAppTemplateLeaseSettings, - OrgLdapSettings orgLdapSettings, OrgEmailSettings orgEmailSettings, - OrgPasswordPolicySettings orgPasswordPolicySettings) { + OrgLdapSettings ldapSettings, OrgEmailSettings emailSettings, + OrgPasswordPolicySettings passwordPolicy) { super(href, type, links); - this.orgGeneralSettings = orgGeneralSettings; + this.generalSettings = generalSettings; this.vAppLeaseSettings = vAppLeaseSettings; this.vAppTemplateLeaseSettings = vAppTemplateLeaseSettings; - this.orgLdapSettings = orgLdapSettings; - this.orgPasswordPolicySettings = orgPasswordPolicySettings; + this.ldapSettings = ldapSettings; + this.emailSettings = emailSettings; + this.passwordPolicy = passwordPolicy; } @XmlElement(name = "OrgGeneralSettings") - protected OrgGeneralSettings orgGeneralSettings; + protected OrgGeneralSettings generalSettings; @XmlElement(name = "VAppLeaseSettings") protected OrgLeaseSettings vAppLeaseSettings; @XmlElement(name = "VAppTemplateLeaseSettings") protected OrgVAppTemplateLeaseSettings vAppTemplateLeaseSettings; @XmlElement(name = "OrgLdapSettings") - protected OrgLdapSettings orgLdapSettings; + protected OrgLdapSettings ldapSettings; @XmlElement(name = "OrgEmailSettings") - protected OrgEmailSettings orgEmailSettings; + protected OrgEmailSettings emailSettings; @XmlElement(name = "OrgPasswordPolicySettings") - protected OrgPasswordPolicySettings orgPasswordPolicySettings; + protected OrgPasswordPolicySettings passwordPolicy; /** * Gets the value of the orgGeneralSettings property. @@ -240,8 +241,8 @@ public class OrgSettings extends ResourceType { * {@link OrgGeneralSettings } * */ - public OrgGeneralSettings getOrgGeneralSettings() { - return orgGeneralSettings; + public OrgGeneralSettings getGeneralSettings() { + return generalSettings; } /** @@ -276,8 +277,8 @@ public class OrgSettings extends ResourceType { * {@link OrgLdapSettings } * */ - public OrgLdapSettings getOrgLdapSettings() { - return orgLdapSettings; + public OrgLdapSettings getLdapSettings() { + return ldapSettings; } /** @@ -288,8 +289,8 @@ public class OrgSettings extends ResourceType { * {@link OrgEmailSettings } * */ - public OrgEmailSettings getOrgEmailSettings() { - return orgEmailSettings; + public OrgEmailSettings getEmailSettings() { + return emailSettings; } /** @@ -300,8 +301,8 @@ public class OrgSettings extends ResourceType { * {@link OrgPasswordPolicySettings } * */ - public OrgPasswordPolicySettings getOrgPasswordPolicySettings() { - return orgPasswordPolicySettings; + public OrgPasswordPolicySettings getPasswordPolicy() { + return passwordPolicy; } @Override @@ -312,34 +313,34 @@ public class OrgSettings extends ResourceType { return false; OrgSettings that = OrgSettings.class.cast(o); return super.equals(that) && - equal(orgGeneralSettings, that.orgGeneralSettings) && + equal(generalSettings, that.generalSettings) && equal(vAppLeaseSettings, that.vAppLeaseSettings) && equal(vAppTemplateLeaseSettings, that.vAppTemplateLeaseSettings) && - equal(orgLdapSettings, that.orgLdapSettings) && - equal(orgEmailSettings, that.orgEmailSettings) && - equal(orgPasswordPolicySettings, that.orgPasswordPolicySettings); + equal(ldapSettings, that.ldapSettings) && + equal(emailSettings, that.emailSettings) && + equal(passwordPolicy, that.passwordPolicy); } @Override public int hashCode() { return Objects.hashCode(super.hashCode(), - orgGeneralSettings, + generalSettings, vAppLeaseSettings, vAppTemplateLeaseSettings, - orgLdapSettings, - orgEmailSettings, - orgPasswordPolicySettings); + ldapSettings, + emailSettings, + passwordPolicy); } @Override public ToStringHelper string() { return super.string() - .add("orgGeneralSettings", orgGeneralSettings) + .add("generalSettings", generalSettings) .add("vAppLeaseSettings", vAppLeaseSettings) .add("vAppTemplateLeaseSettings", vAppTemplateLeaseSettings) - .add("orgLdapSettings", orgLdapSettings) - .add("orgEmailSettings", orgEmailSettings) - .add("orgPasswordPolicySettings", orgPasswordPolicySettings); + .add("ldapSettings", ldapSettings) + .add("emailSettings", emailSettings) + .add("passwordPolicy", passwordPolicy); } } diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/Owner.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/Owner.java index 2b8741af9c..119c6afa8d 100644 --- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/Owner.java +++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/Owner.java @@ -19,17 +19,18 @@ package org.jclouds.vcloud.director.v1_5.domain; -import com.google.common.base.Objects; -import com.google.common.collect.Sets; +import static com.google.common.base.Objects.equal; +import static com.google.common.base.Preconditions.checkNotNull; + +import java.net.URI; +import java.util.Set; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.XmlType; -import java.net.URI; -import java.util.Set; -import static com.google.common.base.Objects.equal; -import static com.google.common.base.Preconditions.checkNotNull; +import com.google.common.base.Objects; +import com.google.common.collect.Sets; /** diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/ProductSectionList.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/ProductSectionList.java index f0d731c4e7..dcef78d19f 100644 --- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/ProductSectionList.java +++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/ProductSectionList.java @@ -25,6 +25,7 @@ import static com.google.common.base.Preconditions.checkNotNull; import java.net.URI; import java.util.Collections; import java.util.Set; + import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlType; diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/Reference.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/Reference.java index c40d5911a6..18d62e2567 100644 --- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/Reference.java +++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/Reference.java @@ -111,4 +111,11 @@ public class Reference extends ReferenceType { Reference that = Reference.class.cast(o); return super.equals(that); } -} \ No newline at end of file + + public ReferenceType toAdminReference(String endpoint) { + return toBuilder() + .type(null) + .href(URI.create(getHref().toASCIIString().replace(endpoint, endpoint+"/admin"))) + .build(); + } +} diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/ReferenceType.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/ReferenceType.java index 314890c5fe..8ae9ce74e6 100644 --- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/ReferenceType.java +++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/ReferenceType.java @@ -22,6 +22,7 @@ import static com.google.common.base.Objects.equal; import java.net.URI; import java.util.Map; + import javax.xml.bind.annotation.XmlAttribute; import javax.xml.bind.annotation.XmlSeeAlso; @@ -43,7 +44,7 @@ import com.google.common.base.Objects.ToStringHelper; CatalogReference.class, Reference.class }) -public class ReferenceType> implements URISupplier { +public class ReferenceType> { public static > Builder builder() { return new Builder(); @@ -176,14 +177,6 @@ public class ReferenceType> implements URISupplier { return type; } - /** - * @see URISupplier#getURI() - */ - @Override - public URI getURI() { - return getHref(); - } - @Override public boolean equals(Object o) { if (this == o) diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/ResourceEntities.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/ResourceEntities.java index 1ad03ccf2a..400b536844 100644 --- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/ResourceEntities.java +++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/ResourceEntities.java @@ -24,6 +24,7 @@ import static com.google.common.base.Preconditions.checkNotNull; import java.util.Collections; import java.util.Set; + import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlType; diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/ResourceEntityType.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/ResourceEntityType.java index 484272498f..8cbb354b72 100644 --- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/ResourceEntityType.java +++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/ResourceEntityType.java @@ -20,16 +20,15 @@ package org.jclouds.vcloud.director.v1_5.domain; import static com.google.common.base.Objects.equal; -import static com.google.common.base.Preconditions.checkNotNull; import java.net.URI; import java.util.Set; + import javax.xml.bind.annotation.XmlAttribute; import javax.xml.bind.annotation.XmlElement; import com.google.common.base.Objects; import com.google.common.base.Objects.ToStringHelper; -import com.google.common.collect.Sets; /** * Base type that represents a resource entity such as a vApp template or virtual media. @@ -71,13 +70,13 @@ public abstract class ResourceEntityType> extend this.id = id; return this; } - + /** - * @see EntityType#getTasksInProgress() + * @see EntityType#getTasks() */ @Override - public Builder tasksInProgress(TasksInProgress tasksInProgress) { - this.tasksInProgress = tasksInProgress; + public Builder tasks(Set tasks) { + super.tasks(tasks); return this; } @@ -100,20 +99,18 @@ public abstract class ResourceEntityType> extend } /** - * @see EntityType#getLinks() + * @see ResourceEntityType#getLinks() */ - @Override public Builder links(Set links) { - this.links = Sets.newLinkedHashSet(checkNotNull(links, "links")); + super.links(links); return this; } /** - * @see EntityType#getLinks() + * @see ResourceEntityType#getLinks() */ - @Override public Builder link(Link link) { - this.links.add(checkNotNull(link, "link")); + super.link(link); return this; } @@ -133,8 +130,8 @@ public abstract class ResourceEntityType> extend @XmlAttribute protected Integer status; - public ResourceEntityType(URI href, String type, Set links, String description, TasksInProgress tasksInProgress, String id, String name, FilesList files, Integer status) { - super(href, type, links, description, tasksInProgress, id, name); + public ResourceEntityType(URI href, String type, Set links, String description, Set tasks, String id, String name, FilesList files, Integer status) { + super(href, type, links, description, tasks, id, name); this.files = files; this.status = status; } diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/ResourceType.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/ResourceType.java index 69100b0e2a..24843d43be 100644 --- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/ResourceType.java +++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/ResourceType.java @@ -28,7 +28,7 @@ import java.util.Set; import javax.xml.bind.annotation.XmlAttribute; import javax.xml.bind.annotation.XmlElement; -import org.jclouds.vcloud.director.v1_5.domain.EntityType.NewBuilder; +import org.jclouds.javax.annotation.Nullable; import com.google.common.base.Objects; import com.google.common.base.Objects.ToStringHelper; @@ -46,7 +46,7 @@ import com.google.common.collect.Sets; * * @author Adrian Cole */ -public abstract class ResourceType> implements URISupplier { +public abstract class ResourceType> { public NewBuilder toNewBuilder() { throw new UnsupportedOperationException("New builder not yet implemented for this class"); @@ -57,7 +57,7 @@ public abstract class ResourceType> implements URISupp protected URI href; protected String type; - protected Set links = Sets.newLinkedHashSet(); + protected Set links; /** * @see ResourceType#getHref() @@ -87,6 +87,8 @@ public abstract class ResourceType> implements URISupp * @see ResourceType#getLinks() */ public T link(Link link) { + if (links == null) + links = Sets.newLinkedHashSet(); this.links.add(checkNotNull(link, "link")); return self(); } @@ -104,7 +106,7 @@ public abstract class ResourceType> implements URISupp protected URI href; protected String type; - protected Set links = Sets.newLinkedHashSet(); + protected Set links; /** * @see ResourceType#getHref() @@ -134,6 +136,8 @@ public abstract class ResourceType> implements URISupp * @see ResourceType#getLinks() */ public Builder link(Link link) { + if (links == null) + links = Sets.newLinkedHashSet(); this.links.add(checkNotNull(link, "link")); return this; } @@ -150,12 +154,13 @@ public abstract class ResourceType> implements URISupp @XmlAttribute private String type; @XmlElement(name = "Link") - private Set links = Sets.newLinkedHashSet(); + private Set links; - protected ResourceType(URI href, String type, Set links) { + protected ResourceType(URI href, String type, @Nullable Set links) { this.href = href; this.type = type; - this.links = ImmutableSet.copyOf(links); + // nullable so that jaxb wont persist empty collections + this.links = links != null && links.size() == 0 ? null : links; } protected ResourceType() { @@ -179,14 +184,6 @@ public abstract class ResourceType> implements URISupp return href; } - /** - * @see URISupplier#getURI() - */ - @Override - public URI getURI() { - return getHref(); - } - /** * Contains the type of the the entity. *

@@ -203,7 +200,7 @@ public abstract class ResourceType> implements URISupp * Set of optional links to an entity or operation associated with this object. */ public Set getLinks() { - return Collections.unmodifiableSet(links); + return links == null ? ImmutableSet.of() : Collections.unmodifiableSet(links); } @Override diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/Session.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/Session.java index db9ef9cbfc..568c834f5b 100644 --- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/Session.java +++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/Session.java @@ -24,6 +24,7 @@ import static com.google.common.base.Preconditions.checkNotNull; import java.net.URI; import java.util.Collections; import java.util.Set; + import javax.xml.bind.annotation.XmlAttribute; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/SmtpServerSettings.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/SmtpServerSettings.java index 9c79022acf..4ab6dd17f1 100644 --- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/SmtpServerSettings.java +++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/SmtpServerSettings.java @@ -61,7 +61,7 @@ import com.google.common.base.Objects.ToStringHelper; */ @XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "SmtpServerSettings", propOrder = { - "isUseAuthentication", + "useAuthentication", "host", "username", "password" @@ -200,8 +200,7 @@ public class SmtpServerSettings { if (o == null || getClass() != o.getClass()) return false; SmtpServerSettings that = SmtpServerSettings.class.cast(o); - return super.equals(that) && - equal(useAuthentication, that.useAuthentication) && + return equal(useAuthentication, that.useAuthentication) && equal(host, that.host) && equal(username, that.username) && equal(password, that.password); @@ -209,8 +208,7 @@ public class SmtpServerSettings { @Override public int hashCode() { - return Objects.hashCode(super.hashCode(), - useAuthentication, + return Objects.hashCode(useAuthentication, host, username, password); diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/SourcedCompositionItemParam.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/SourcedCompositionItemParam.java index c8755a4668..684016fe95 100644 --- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/SourcedCompositionItemParam.java +++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/SourcedCompositionItemParam.java @@ -24,6 +24,7 @@ import static com.google.common.base.Preconditions.checkNotNull; import java.util.Collections; import java.util.Set; + import javax.xml.bind.annotation.XmlAttribute; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlType; diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/SupportedHardwareVersions.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/SupportedHardwareVersions.java index 2fa11635c0..3deef03a54 100644 --- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/SupportedHardwareVersions.java +++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/SupportedHardwareVersions.java @@ -24,6 +24,7 @@ import static com.google.common.base.Preconditions.checkNotNull; import java.util.Collections; import java.util.Set; + import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlType; diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/Task.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/Task.java index e571e84c46..b6f1ca88b4 100644 --- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/Task.java +++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/Task.java @@ -19,13 +19,13 @@ package org.jclouds.vcloud.director.v1_5.domain; import static com.google.common.base.Objects.equal; -import static com.google.common.base.Preconditions.checkNotNull; import java.net.URI; import java.util.Arrays; import java.util.Date; import java.util.List; import java.util.Set; + import javax.xml.bind.annotation.XmlAttribute; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; @@ -34,7 +34,6 @@ import org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType; import com.google.common.base.Objects; import com.google.common.base.Objects.ToStringHelper; -import com.google.common.collect.Sets; /** * Represents an asynchronous or long-running task in the vCloud environment. @@ -43,6 +42,8 @@ import com.google.common.collect.Sets; * <xs:complexType name="TaskType"> * * + * TODO: this object and the hierarchy is wrong. it is literally a Task with a Task container. please review class diagram + * * @author grkvlt@apache.org */ @XmlRootElement(name = "Task") @@ -187,7 +188,7 @@ public class Task extends EntityType { @Override public Task build() { - return new Task(href, type, links, description, tasksInProgress, id, name, + return new Task(href, type, links, description, tasks, id, name, error, org, progress, owner, user, params, status, operation, operationName, startTime, endTime, expiryTime); } @@ -217,13 +218,13 @@ public class Task extends EntityType { this.id = id; return this; } - + /** - * @see EntityType#getTasksInProgress() + * @see EntityType#getTasks() */ @Override - public Builder tasksInProgress(TasksInProgress tasksInProgress) { - this.tasksInProgress = tasksInProgress; + public Builder tasks(Set tasks) { + super.tasks(tasks); return this; } @@ -246,23 +247,22 @@ public class Task extends EntityType { } /** - * @see EntityType#getLinks() + * @see ResourceType#getLinks() */ @Override public Builder links(Set links) { - this.links = Sets.newLinkedHashSet(checkNotNull(links, "links")); - return this; + return Builder.class.cast(super.links(links)); } /** - * @see EntityType#getLinks() + * @see ResourceType#getLinks() */ @Override public Builder link(Link link) { - this.links.add(checkNotNull(link, "link")); - return this; + return Builder.class.cast(super.link(link)); } + @Override public Builder fromEntityType(EntityType in) { return Builder.class.cast(super.fromEntityType(in)); @@ -275,11 +275,11 @@ public class Task extends EntityType { } } - public Task(URI href, String type, Set links, String description, TasksInProgress tasksInProgress, + public Task(URI href, String type, Set links, String description, Set tasks, String id, String name, Error error, Reference org, Integer progress, Reference owner, Reference user, Object params, String status, String operation, String operationName, Date startTime, Date endTime, Date expiryTime) { - super(href, type, links, description, tasksInProgress, id, name); + super(href, type, links, description, tasks, id, name); this.error = error; this.org = org; this.progress = progress; @@ -383,6 +383,7 @@ public class Task extends EntityType { *

  • aborted - The task was aborted by an administrative action. * */ + // TODO: enum!!! public String getStatus() { return status; } diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/TasksInProgress.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/TasksInProgress.java deleted file mode 100644 index cefefc0ec9..0000000000 --- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/TasksInProgress.java +++ /dev/null @@ -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 CONDITIOXMLNS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.jclouds.vcloud.director.v1_5.domain; - -import static com.google.common.base.Objects.equal; -import static com.google.common.base.Preconditions.checkNotNull; - -import java.util.Collection; -import java.util.Collections; -import java.util.Set; -import javax.xml.bind.annotation.XmlElement; -import javax.xml.bind.annotation.XmlRootElement; - -import com.google.common.base.Objects; -import com.google.common.collect.ImmutableSet; -import com.google.common.collect.Sets; - -/** - * @author grkvlt@apache.org - */ -@XmlRootElement(name = "TasksInProgress") -public class TasksInProgress { - - public static Builder builder() { - return new Builder(); - } - - public Builder toBuilder() { - return new Builder(); - } - - public static class Builder { - - protected Set tasks = Sets.newLinkedHashSet(); - - /** - * @see TasksInProgress#getTasks() - */ - public Builder tasks(Set tasks) { - this.tasks = ImmutableSet.copyOf(checkNotNull(tasks, "tasks")); - return this; - } - - /** - * @see TasksInProgress#getTasks() - */ - public Builder task(Task task) { - this.tasks.add(checkNotNull(task, "task")); - return this; - } - - public TasksInProgress build() { - return new TasksInProgress(tasks); - } - - public Builder fromTasksInProgress(TasksInProgress in) { - return tasks(in.getTasks()); - } - } - - private TasksInProgress() { - // for JAXB - } - - private TasksInProgress(Collection tasks) { - this.tasks = ImmutableSet.copyOf(tasks); - } - - @XmlElement(name = "Task") - private Set tasks = Sets.newLinkedHashSet(); - - public Set getTasks() { - return Collections.unmodifiableSet(tasks); - } - - @Override - public boolean equals(Object o) { - if (this == o) - return true; - if (o == null || getClass() != o.getClass()) - return false; - TasksInProgress that = TasksInProgress.class.cast(o); - return equal(this.tasks, that.tasks); - } - - @Override - public int hashCode() { - return Objects.hashCode(tasks); - } - - @Override - public String toString() { - return Objects.toStringHelper("").add("tasks", tasks).toString(); - } -} - diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/TasksList.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/TasksList.java index 3fc6620a06..510edb27d4 100644 --- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/TasksList.java +++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/TasksList.java @@ -22,12 +22,16 @@ import static com.google.common.base.Objects.equal; import static com.google.common.base.Preconditions.checkNotNull; import java.net.URI; +import java.util.Collection; import java.util.Collections; +import java.util.Iterator; import java.util.Set; + +import javax.xml.bind.annotation.XmlAttribute; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; -import org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType; +import org.jclouds.javax.annotation.Nullable; import com.google.common.base.Objects; import com.google.common.base.Objects.ToStringHelper; @@ -35,33 +39,36 @@ import com.google.common.collect.ImmutableSet; import com.google.common.collect.Sets; /** - * A list of tasks. - * + * Task List + * + * * @author Adrian Cole */ @XmlRootElement(name = "TasksList") -public class TasksList extends EntityType { - - public static final String MEDIA_TYPE = VCloudDirectorMediaType.TASKS_LIST; - +public class TasksList extends ResourceType implements Set { public static Builder builder() { return new Builder(); } - @Override - public Builder toBuilder() { - return new Builder(); - } + public static class Builder extends ResourceType.Builder { + protected String name; - public static class Builder extends EntityType.Builder { + private Set tasks; - protected Set tasks = Sets.newLinkedHashSet(); + /** + * @see TasksList#getName() + */ + public Builder name(String name) { + this.name = name; + return this; + } /** * @see TasksList#getTasks() */ public Builder tasks(Set tasks) { - this.tasks = Sets.newLinkedHashSet(checkNotNull(tasks, "tasks")); + if (checkNotNull(tasks, "tasks").size() > 0) + this.tasks = Sets.newLinkedHashSet(tasks); return this; } @@ -69,111 +76,86 @@ public class TasksList extends EntityType { * @see TasksList#getTasks() */ public Builder task(Task task) { + if (tasks == null) + tasks = Sets.newLinkedHashSet(); this.tasks.add(checkNotNull(task, "task")); return this; } - + @Override public TasksList build() { - return new TasksList(href, type, links, description, tasksInProgress, id, name, tasks); + return new TasksList(href, type, links, name, tasks); } /** - * @see EntityType#getName() - */ - @Override - public Builder name(String name) { - this.name = name; - return this; - } - - /** - * @see EntityType#getDescription() - */ - @Override - public Builder description(String description) { - this.description = description; - return this; - } - - /** - * @see EntityType#getId() - */ - @Override - public Builder id(String id) { - this.id = id; - return this; - } - - /** - * @see EntityType#getTasksInProgress() - */ - @Override - public Builder tasksInProgress(TasksInProgress tasksInProgress) { - this.tasksInProgress = tasksInProgress; - return this; - } - - /** - * @see ReferenceType#getHref() + * @see ResourceType#getHref() */ @Override public Builder href(URI href) { - this.href = href; + super.href(href); return this; } /** - * @see ReferenceType#getType() + * @see ResourceType#getType() */ @Override public Builder type(String type) { - this.type = type; + super.type(type); return this; } /** - * @see EntityType#getLinks() + * @see ResourceType#getLinks() */ @Override public Builder links(Set links) { - this.links = Sets.newLinkedHashSet(checkNotNull(links, "links")); - return this; + return Builder.class.cast(super.links(links)); } /** - * @see EntityType#getLinks() + * @see ResourceType#getLinks() */ @Override public Builder link(Link link) { - this.links.add(checkNotNull(link, "link")); + super.link(link); return this; } - @Override - public Builder fromEntityType(EntityType in) { - return Builder.class.cast(super.fromEntityType(in)); + public Builder fromTasksList(TasksList in) { + return fromResourceType(in).tasks(in); } - public Builder fromTasksList(TasksList in) { - return fromEntityType(in).tasks(in.getTasks()); + /** + * {@inheritDoc} + */ + @Override + public Builder fromResourceType(ResourceType in) { + return Builder.class.cast(super.fromResourceType(in)); } } + @XmlAttribute(required = true) + private String name; + @XmlElement(name = "Task") + private Set tasks; + + public TasksList(URI href, String type, @Nullable Set links, String name, @Nullable Set tasks) { + super(href, type, links); + this.tasks = tasks; + this.name = name; + } + protected TasksList() { - // for JAXB + // For JAXB } - public TasksList(URI href, String type, Set links, String description, TasksInProgress tasksInProgress, String id, String name, Set tasks) { - super(href, type, links, description, tasksInProgress, id, name); - this.tasks = ImmutableSet.copyOf(tasks); - } - @XmlElement(name = "Task") - private Set tasks = Sets.newLinkedHashSet(); - - public Set getTasks() { - return Collections.unmodifiableSet(tasks); + /** + * Contains the name of the the entity. + */ + public String getName() { + return name; } @Override @@ -183,16 +165,91 @@ public class TasksList extends EntityType { if (o == null || getClass() != o.getClass()) return false; TasksList that = TasksList.class.cast(o); - return super.equals(that) && equal(this.tasks, that.tasks); + return super.equals(that) && equal(this.delegate(), that.delegate()) && equal(this.name, that.name); } @Override public int hashCode() { - return super.hashCode() + Objects.hashCode(tasks); + return super.hashCode() + Objects.hashCode(delegate(), name); + } + + private Set delegate() { + return tasks == null ? ImmutableSet.of() : Collections.unmodifiableSet(tasks); } @Override public ToStringHelper string() { - return super.string().add("tasks", tasks); + return super.string().add("name", name).add("tasks", delegate()); } -} + + @Override + public Builder toBuilder() { + return new Builder().fromTasksList(this); + } + + @Override + public Iterator iterator() { + return delegate().iterator(); + } + + @Override + public int size() { + return delegate().size(); + } + + @Override + public boolean removeAll(Collection collection) { + return delegate().removeAll(collection); + } + + @Override + public boolean isEmpty() { + return delegate().isEmpty(); + } + + @Override + public boolean contains(Object object) { + return delegate().contains(object); + } + + @Override + public boolean add(Task element) { + return delegate().add(element); + } + + @Override + public boolean remove(Object object) { + return delegate().remove(object); + } + + @Override + public boolean containsAll(Collection collection) { + return delegate().containsAll(collection); + } + + @Override + public boolean addAll(Collection collection) { + return delegate().addAll(collection); + } + + @Override + public boolean retainAll(Collection collection) { + return delegate().retainAll(collection); + } + + @Override + public void clear() { + delegate().clear(); + } + + @Override + public Object[] toArray() { + return delegate().toArray(); + } + + @Override + public T[] toArray(T[] array) { + return delegate().toArray(array); + } + +} \ No newline at end of file diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/URISupplier.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/URISupplier.java deleted file mode 100644 index 3f5066b81d..0000000000 --- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/URISupplier.java +++ /dev/null @@ -1,47 +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.vcloud.director.v1_5.domain; - -import java.net.URI; - -/** - * @author grkvlt@apache.org - */ -public interface URISupplier { - - /** - * This returns the {@link URI} for a particular {@link ReferenceType} or {@link ResourceType} object. - * - * @see ResourceType#getHref() - * @see ReferenceType#getHref() - */ - public URI getURI(); - - public static class SingleURI { - public static URISupplier fromURI(final URI uri) { - return new URISupplier(){ - @Override - public URI getURI() { - return uri; - } - }; - } - } - -} diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/User.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/User.java index ecfd64f0d1..f16e165bd1 100644 --- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/User.java +++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/User.java @@ -23,6 +23,7 @@ import static com.google.common.base.Preconditions.checkNotNull; import java.net.URI; import java.util.Set; + import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.XmlType; @@ -269,7 +270,7 @@ public class User public User build() { - return new User(href, type, links, description, tasksInProgress, id, + return new User(href, type, links, description, tasks, id, name, fullName, emailAddress, telephone, isEnabled, isLocked, im, nameInSource, isAlertEnabled, alertEmailPrefix, alertEmail, isExternal, isDefaultCached, isGroupRole, storedVmQuota, deployedVmQuota, @@ -285,13 +286,13 @@ public class User this.id = id; return this; } - + /** - * @see EntityType#getTasksInProgress() + * @see EntityType#getTasks() */ @Override - public Builder tasksInProgress(TasksInProgress tasksInProgress) { - this.tasksInProgress = tasksInProgress; + public Builder tasks(Set tasks) { + super.tasks(tasks); return this; } @@ -397,12 +398,12 @@ public class User @XmlElement(name = "GroupReferences") protected Object /* GroupsList */ groupReferences; - public User(URI href, String type, Set links, String description, TasksInProgress tasksInProgress, String id, + public User(URI href, String type, Set links, String description, Set tasks, String id, String name, String fullName, String emailAddress, String telephone, Boolean enabled, Boolean locked, String im, String nameInSource, Boolean alertEnabled, String alertEmailPrefix, String alertEmail, Boolean external, Boolean defaultCached, Boolean groupRole, Integer storedVmQuota, Integer deployedVmQuota, Reference role, String password, Object groupReferences) { - super(href, type, links, description, tasksInProgress, id, name); + super(href, type, links, description, tasks, id, name); this.fullName = fullName; this.emailAddress = emailAddress; this.telephone = telephone; diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/UsersList.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/UsersList.java index 1e949d30fe..57fc4de64a 100644 --- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/UsersList.java +++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/UsersList.java @@ -33,6 +33,7 @@ import javax.xml.bind.annotation.XmlType; import com.google.common.base.Objects; import com.google.common.collect.ImmutableList; +import com.google.common.collect.Lists; /** @@ -62,7 +63,7 @@ import com.google.common.collect.ImmutableList; @XmlAccessorType(XmlAccessType.FIELD) @XmlRootElement(name = "UsersList") @XmlType(propOrder = { - "userReference" + "users" }) public class UsersList { public static Builder builder() { @@ -74,7 +75,7 @@ public class UsersList { } public static class Builder { - private List users; + private List users = Lists.newArrayList(); /** * @see UsersList#getUsers() diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/VAppNetworkConfiguration.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/VAppNetworkConfiguration.java index 14842b705b..b8c6517025 100644 --- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/VAppNetworkConfiguration.java +++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/VAppNetworkConfiguration.java @@ -24,6 +24,7 @@ import static com.google.common.base.Preconditions.checkNotNull; import java.net.URI; import java.util.Set; + import javax.xml.bind.annotation.XmlAttribute; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlType; diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/VAppTemplate.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/VAppTemplate.java index bb7c60e489..8519c9d9ad 100644 --- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/VAppTemplate.java +++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/VAppTemplate.java @@ -25,6 +25,7 @@ import static com.google.common.base.Preconditions.checkNotNull; import java.net.URI; import java.util.Collections; import java.util.Set; + import javax.xml.bind.annotation.XmlAttribute; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlElementRef; @@ -144,7 +145,7 @@ public class VAppTemplate extends ResourceEntityType { @Override public VAppTemplate build() { - return new VAppTemplate(href, type, links, description, tasksInProgress, id, name, files, status, owner, children, sections, vAppScopedLocalId, ovfDescriptorUploaded, goldMaster); + return new VAppTemplate(href, type, links, description, tasks, id, name, files, status, owner, children, sections, vAppScopedLocalId, ovfDescriptorUploaded, goldMaster); } @Override @@ -209,11 +210,11 @@ public class VAppTemplate extends ResourceEntityType { } /** - * @see EntityType#getTasksInProgress() + * @see EntityType#getTasks() */ @Override - public Builder tasksInProgress(TasksInProgress tasksInProgress) { - super.tasksInProgress(tasksInProgress); + public Builder tasks(Set tasks) { + super.tasks(tasks); return this; } @@ -267,10 +268,10 @@ public class VAppTemplate extends ResourceEntityType { @XmlAttribute protected Boolean goldMaster; - private VAppTemplate(URI href, String type, Set links, String description, TasksInProgress tasksInProgress, + private VAppTemplate(URI href, String type, Set links, String description, Set tasks, String id, String name, FilesList files, Integer status, Owner owner, Set children, Set> sections, String vAppScopedLocalId, Boolean ovfDescriptorUploaded, Boolean goldMaster) { - super(href, type, links, description, tasksInProgress, id, name, files, status); + super(href, type, links, description, tasks, id, name, files, status); this.owner = owner; this.children = VAppTemplateChildren.builder().vms(children).build(); this.sections = ImmutableSet.copyOf(sections); diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/VAppTemplateChildren.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/VAppTemplateChildren.java index 2d87f7b934..c81c8b51c1 100644 --- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/VAppTemplateChildren.java +++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/VAppTemplateChildren.java @@ -24,6 +24,7 @@ import static com.google.common.base.Preconditions.checkNotNull; import java.util.Collections; import java.util.Set; + import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.XmlType; diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/Vdc.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/Vdc.java index e10b8702ae..6c3e431980 100644 --- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/Vdc.java +++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/Vdc.java @@ -20,10 +20,10 @@ package org.jclouds.vcloud.director.v1_5.domain; import static com.google.common.base.Objects.equal; -import static com.google.common.base.Preconditions.checkNotNull; import java.net.URI; import java.util.Set; + import javax.xml.bind.annotation.XmlAttribute; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; @@ -31,7 +31,6 @@ import javax.xml.bind.annotation.XmlSeeAlso; import javax.xml.bind.annotation.XmlType; import com.google.common.base.Objects; -import com.google.common.collect.Sets; /** @@ -198,7 +197,7 @@ public class Vdc public Vdc build() { return new Vdc( - href, type, links, description, tasksInProgress, id, name, allocationModel, storageCapacity, + href, type, links, description, tasks, id, name, allocationModel, storageCapacity, computeCapacity, resourceEntities, availableNetworks, capabilities, nicQuota, networkQuota, vmQuota, isEnabled, status); } @@ -227,13 +226,13 @@ public class Vdc this.id = id; return this; } - + /** - * @see EntityType#getTasksInProgress() + * @see EntityType#getTasks() */ @Override - public Builder tasksInProgress(TasksInProgress tasksInProgress) { - this.tasksInProgress = tasksInProgress; + public Builder tasks(Set tasks) { + super.tasks(tasks); return this; } @@ -254,13 +253,13 @@ public class Vdc this.type = type; return this; } - + /** * @see EntityType#getLinks() */ @Override public Builder links(Set links) { - this.links = Sets.newLinkedHashSet(checkNotNull(links, "links")); + super.links(links); return this; } @@ -269,11 +268,10 @@ public class Vdc */ @Override public Builder link(Link link) { - this.links.add(checkNotNull(link, "link")); + super.link(link); return this; } - @Override public Builder fromEntityType(EntityType in) { return Builder.class.cast(super.fromEntityType(in)); @@ -295,8 +293,8 @@ public class Vdc } } - public Vdc(URI href, String type, Set links, String description, TasksInProgress tasksInProgress, String id, String name, String allocationModel, CapacityWithUsage storageCapacity, ComputeCapacity computeCapacity, ResourceEntities resourceEntities, AvailableNetworks availableNetworks, Capabilities capabilities, int nicQuota, int networkQuota, Integer vmQuota, Boolean enabled, Integer status) { - super(href, type, links, description, tasksInProgress, id, name); + public Vdc(URI href, String type, Set links, String description, Set tasks, String id, String name, String allocationModel, CapacityWithUsage storageCapacity, ComputeCapacity computeCapacity, ResourceEntities resourceEntities, AvailableNetworks availableNetworks, Capabilities capabilities, int nicQuota, int networkQuota, Integer vmQuota, Boolean enabled, Integer status) { + super(href, type, links, description, tasks, id, name); this.allocationModel = allocationModel; this.storageCapacity = storageCapacity; this.computeCapacity = computeCapacity; diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/Vdcs.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/Vdcs.java index 84aed81a7e..7fa5de9f79 100644 --- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/Vdcs.java +++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/Vdcs.java @@ -24,6 +24,7 @@ import static com.google.common.base.Preconditions.checkNotNull; import java.util.ArrayList; import java.util.List; + import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; @@ -33,6 +34,7 @@ import javax.xml.bind.annotation.XmlType; import com.google.common.base.Objects; import com.google.common.base.Objects.ToStringHelper; import com.google.common.collect.ImmutableList; +import com.google.common.collect.Lists; /** @@ -75,7 +77,7 @@ public class Vdcs { public static class Builder { - private List vdcs; + private List vdcs = Lists.newArrayList(); /** * @see Vdcs#getVdc() diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/cim/ResourceAllocationSettingData.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/cim/ResourceAllocationSettingData.java index 3406562e5f..35471969b6 100644 --- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/cim/ResourceAllocationSettingData.java +++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/cim/ResourceAllocationSettingData.java @@ -25,7 +25,10 @@ import java.util.List; import java.util.Map; import com.google.common.base.Function; -import com.google.common.collect.*; +import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableSet; +import com.google.common.collect.Lists; +import com.google.common.collect.Maps; /** * diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/cim/package-info.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/cim/package-info.java index 6b10c899d6..565b77fad1 100644 --- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/cim/package-info.java +++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/cim/package-info.java @@ -22,4 +22,5 @@ package org.jclouds.vcloud.director.v1_5.domain.cim; import static org.jclouds.vcloud.director.v1_5.VCloudDirectorConstants.VCLOUD_CIM_NS; import javax.xml.bind.annotation.XmlNsForm; -import javax.xml.bind.annotation.XmlSchema; \ No newline at end of file +import javax.xml.bind.annotation.XmlSchema; + diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/ovf/DeploymentOptionSection.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/ovf/DeploymentOptionSection.java index 38c52a2738..134a868aa1 100644 --- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/ovf/DeploymentOptionSection.java +++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/ovf/DeploymentOptionSection.java @@ -22,6 +22,7 @@ import static com.google.common.base.Preconditions.checkNotNull; import java.util.Collections; import java.util.Set; + import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/ovf/Disk.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/ovf/Disk.java index 674efe6607..e869d5e9f8 100644 --- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/ovf/Disk.java +++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/ovf/Disk.java @@ -19,8 +19,8 @@ package org.jclouds.vcloud.director.v1_5.domain.ovf; import java.net.URI; + import javax.xml.bind.annotation.XmlRootElement; -import javax.xml.bind.annotation.XmlType; /** * @author Adrian Cole diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/ovf/NetworkSection.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/ovf/NetworkSection.java index 9394a34615..0b6751cd1d 100644 --- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/ovf/NetworkSection.java +++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/ovf/NetworkSection.java @@ -21,6 +21,7 @@ package org.jclouds.vcloud.director.v1_5.domain.ovf; import static com.google.common.base.Preconditions.checkNotNull; import java.util.Set; + import javax.xml.bind.annotation.XmlRootElement; import org.jclouds.javax.annotation.Nullable; diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/ovf/ProductSection.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/ovf/ProductSection.java index 76e9ceb6df..bce96e6e7b 100644 --- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/ovf/ProductSection.java +++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/ovf/ProductSection.java @@ -22,6 +22,7 @@ import static com.google.common.base.Preconditions.checkNotNull; import static org.jclouds.vcloud.director.v1_5.VCloudDirectorConstants.VCLOUD_OVF_NS; import java.util.Set; + import javax.xml.bind.annotation.XmlRootElement; import org.jclouds.javax.annotation.Nullable; diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/ovf/VirtualHardwareSection.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/ovf/VirtualHardwareSection.java index ca20e9b228..e958becfef 100644 --- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/ovf/VirtualHardwareSection.java +++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/ovf/VirtualHardwareSection.java @@ -22,6 +22,7 @@ import static com.google.common.base.Preconditions.checkNotNull; import static org.jclouds.vcloud.director.v1_5.VCloudDirectorConstants.VCLOUD_OVF_NS; import java.util.Set; + import javax.xml.bind.annotation.XmlRootElement; import org.jclouds.javax.annotation.Nullable; diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/ovf/internal/package-info.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/ovf/internal/package-info.java index 738d0d66ec..376ebb7d43 100644 --- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/ovf/internal/package-info.java +++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/ovf/internal/package-info.java @@ -29,4 +29,5 @@ import static org.jclouds.vcloud.director.v1_5.VCloudDirectorConstants.VCLOUD_OV import javax.xml.bind.annotation.XmlNs; import javax.xml.bind.annotation.XmlNsForm; -import javax.xml.bind.annotation.XmlSchema; \ No newline at end of file +import javax.xml.bind.annotation.XmlSchema; + diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/ovf/package-info.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/ovf/package-info.java index c7c9064055..2f51ebaf66 100644 --- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/ovf/package-info.java +++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/ovf/package-info.java @@ -29,4 +29,5 @@ import static org.jclouds.vcloud.director.v1_5.VCloudDirectorConstants.VCLOUD_OV import javax.xml.bind.annotation.XmlNs; import javax.xml.bind.annotation.XmlNsForm; -import javax.xml.bind.annotation.XmlSchema; \ No newline at end of file +import javax.xml.bind.annotation.XmlSchema; + diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/query/CatalogReferences.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/query/CatalogReferences.java index c5b0d54467..a16659448c 100644 --- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/query/CatalogReferences.java +++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/query/CatalogReferences.java @@ -23,6 +23,7 @@ import static com.google.common.base.Preconditions.checkNotNull; import java.net.URI; import java.util.Set; + import javax.xml.bind.annotation.XmlRootElement; import org.jclouds.vcloud.director.v1_5.domain.CatalogReference; diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/query/ContainerType.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/query/ContainerType.java index 55d555be0c..eea703e85b 100644 --- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/query/ContainerType.java +++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/query/ContainerType.java @@ -24,6 +24,7 @@ import static com.google.common.base.Preconditions.checkNotNull; import java.net.URI; import java.util.Set; + import javax.xml.bind.annotation.XmlAttribute; import org.jclouds.vcloud.director.v1_5.domain.Link; diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/query/QueryResultCatalogRecord.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/query/QueryResultCatalogRecord.java index a83c2d68c8..f2d81e92d8 100644 --- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/query/QueryResultCatalogRecord.java +++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/query/QueryResultCatalogRecord.java @@ -25,6 +25,7 @@ import static com.google.common.base.Preconditions.checkNotNull; import java.net.URI; import java.util.Date; import java.util.Set; + import javax.xml.bind.annotation.XmlAttribute; import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.XmlSchemaType; diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/query/QueryResultNetworkRecord.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/query/QueryResultNetworkRecord.java index 42cf8218ab..7389f4c62e 100644 --- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/query/QueryResultNetworkRecord.java +++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/query/QueryResultNetworkRecord.java @@ -24,6 +24,7 @@ import static com.google.common.base.Preconditions.checkNotNull; import java.net.URI; import java.util.Set; + import javax.xml.bind.annotation.XmlAttribute; import org.jclouds.vcloud.director.v1_5.domain.Link; diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/query/QueryResultRecordType.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/query/QueryResultRecordType.java index d14c092416..7e9f275486 100644 --- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/query/QueryResultRecordType.java +++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/query/QueryResultRecordType.java @@ -23,6 +23,7 @@ import static com.google.common.base.Preconditions.checkNotNull; import java.net.URI; import java.util.Set; + import javax.xml.bind.annotation.XmlAttribute; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlSchemaType; diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/query/QueryResultRecords.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/query/QueryResultRecords.java index 978d5c193b..139cdcf423 100644 --- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/query/QueryResultRecords.java +++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/query/QueryResultRecords.java @@ -24,6 +24,7 @@ import static com.google.common.base.Preconditions.checkNotNull; import java.net.URI; import java.util.Set; + import javax.xml.bind.annotation.XmlElementRef; import javax.xml.bind.annotation.XmlRootElement; diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/query/QueryResultReferences.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/query/QueryResultReferences.java index 0b46128f2c..f0c6612bbc 100644 --- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/query/QueryResultReferences.java +++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/query/QueryResultReferences.java @@ -24,11 +24,10 @@ import static com.google.common.base.Preconditions.checkNotNull; import java.net.URI; import java.util.Set; + import javax.xml.bind.annotation.XmlElementRef; -import javax.xml.bind.annotation.XmlElementRefs; import org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType; -import org.jclouds.vcloud.director.v1_5.domain.CatalogReference; import org.jclouds.vcloud.director.v1_5.domain.Link; import org.jclouds.vcloud.director.v1_5.domain.ReferenceType; diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/query/package-info.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/query/package-info.java index 9c789c8414..82e216e32c 100644 --- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/query/package-info.java +++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/query/package-info.java @@ -25,8 +25,8 @@ package org.jclouds.vcloud.director.v1_5.domain.query; import static org.jclouds.vcloud.director.v1_5.VCloudDirectorConstants.VCLOUD_1_5_NS; import static org.jclouds.vcloud.director.v1_5.VCloudDirectorConstants.VCLOUD_CIM_NS; -import static org.jclouds.vcloud.director.v1_5.VCloudDirectorConstants.VCLOUD_OVF_NS; import javax.xml.bind.annotation.XmlNs; import javax.xml.bind.annotation.XmlNsForm; -import javax.xml.bind.annotation.XmlSchema; \ No newline at end of file +import javax.xml.bind.annotation.XmlSchema; + diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/vapp/package-info.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/vapp/package-info.java index bebe0ba04b..c8acc0be09 100644 --- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/vapp/package-info.java +++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/vapp/package-info.java @@ -30,4 +30,5 @@ import static org.jclouds.vcloud.director.v1_5.VCloudDirectorConstants.VCLOUD_OV import javax.xml.bind.annotation.XmlNs; import javax.xml.bind.annotation.XmlNsForm; -import javax.xml.bind.annotation.XmlSchema; \ No newline at end of file +import javax.xml.bind.annotation.XmlSchema; + diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/AdminCatalogAsyncClient.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/AdminCatalogAsyncClient.java index f8d55b35dc..4c36297682 100644 --- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/AdminCatalogAsyncClient.java +++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/AdminCatalogAsyncClient.java @@ -49,6 +49,18 @@ import com.google.common.util.concurrent.ListenableFuture; */ @RequestFilters(AddVCloudAuthorizationToRequest.class) public interface AdminCatalogAsyncClient extends CatalogAsyncClient { + + /** + * @see AdminClient#createCatalog(URI, AdminCatalog) + */ + @POST + @Path("/catalogs") + @Consumes(VCloudDirectorMediaType.ADMIN_CATALOG) + @Produces(VCloudDirectorMediaType.ADMIN_CATALOG) + @JAXBResponseParser + @ExceptionParser(ThrowVCloudErrorOn4xx.class) + ListenableFuture createCatalog(@EndpointParam URI orgRef, + @BinderParam(BindToXMLPayload.class) AdminCatalog catalog); /** * @see AdminClient#getCatalog(URI) diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/AdminCatalogClient.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/AdminCatalogClient.java index b7ee427eb3..81ada0ced3 100644 --- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/AdminCatalogClient.java +++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/AdminCatalogClient.java @@ -34,6 +34,19 @@ import org.jclouds.vcloud.director.v1_5.domain.PublishCatalogParams; */ @Timeout(duration = 180, timeUnit = TimeUnit.SECONDS) public interface AdminCatalogClient extends CatalogClient { + + + /** + * Creates a catalog in an organization. The catalog will always be created in unpublished state. + * + *
    +    * POST /admin/org/{id}/catalogs
    +    * 
    + * + * @param orgRef the reference for the org + * @return contains a , which will point to the running asynchronous creation operation. + */ + AdminCatalog createCatalog(URI orgRef, AdminCatalog catalog); /** * Retrieves a catalog. diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/AdminOrgAsyncClient.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/AdminOrgAsyncClient.java index c88edee6e4..fea0a6d155 100644 --- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/AdminOrgAsyncClient.java +++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/AdminOrgAsyncClient.java @@ -18,46 +18,203 @@ */ package org.jclouds.vcloud.director.v1_5.features; +import java.net.URI; + +import javax.ws.rs.Consumes; +import javax.ws.rs.GET; +import javax.ws.rs.PUT; +import javax.ws.rs.Path; +import javax.ws.rs.Produces; + +import org.jclouds.rest.annotations.BinderParam; +import org.jclouds.rest.annotations.EndpointParam; +import org.jclouds.rest.annotations.ExceptionParser; +import org.jclouds.rest.annotations.JAXBResponseParser; import org.jclouds.rest.annotations.RequestFilters; +import org.jclouds.rest.binders.BindToXMLPayload; +import org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType; +import org.jclouds.vcloud.director.v1_5.domain.AdminOrg; +import org.jclouds.vcloud.director.v1_5.domain.OrgEmailSettings; +import org.jclouds.vcloud.director.v1_5.domain.OrgGeneralSettings; +import org.jclouds.vcloud.director.v1_5.domain.OrgLdapSettings; +import org.jclouds.vcloud.director.v1_5.domain.OrgLeaseSettings; +import org.jclouds.vcloud.director.v1_5.domain.OrgPasswordPolicySettings; +import org.jclouds.vcloud.director.v1_5.domain.OrgSettings; +import org.jclouds.vcloud.director.v1_5.domain.OrgVAppTemplateLeaseSettings; import org.jclouds.vcloud.director.v1_5.filters.AddVCloudAuthorizationToRequest; +import org.jclouds.vcloud.director.v1_5.functions.ThrowVCloudErrorOn4xx; + +import com.google.common.util.concurrent.ListenableFuture; /** * @see GroupClient * @author danikov */ @RequestFilters(AddVCloudAuthorizationToRequest.class) -public interface AdminOrgAsyncClient { +public interface AdminOrgAsyncClient extends OrgAsyncClient { -// GET /admin/org/{id} + /** + * @see AdminOrgClient#getOrg(URI) + */ + @GET + @Consumes + @JAXBResponseParser + @ExceptionParser(ThrowVCloudErrorOn4xx.class) + ListenableFuture getOrg( + @EndpointParam URI orgRef); + + /** + * @see AdminOrgClient#getSettings(URI) + */ + @GET + @Path("/settings") + @Consumes + @JAXBResponseParser + @ExceptionParser(ThrowVCloudErrorOn4xx.class) + ListenableFuture getSettings( + @EndpointParam URI orgRef); + + /** + * @see AdminOrgClient#updateSettings(URI, OrgSettings) + */ + @PUT + @Path("/settings") + @Consumes(VCloudDirectorMediaType.ORG_SETTINGS) + @Produces(VCloudDirectorMediaType.ORG_SETTINGS) + @JAXBResponseParser + @ExceptionParser(ThrowVCloudErrorOn4xx.class) + ListenableFuture updateSettings( + @EndpointParam URI orgRef, + @BinderParam(BindToXMLPayload.class) OrgSettings settings); + + /** + * @see AdminOrgClient#getEmailSettings(URI) + */ + @GET + @Path("/settings/email") + @Consumes + @JAXBResponseParser + @ExceptionParser(ThrowVCloudErrorOn4xx.class) + ListenableFuture getEmailSettings( + @EndpointParam URI orgRef); + + /** + * @see AdminOrgClient#updateEmailSettings(URI, OrgEmailSettings) + */ + @PUT + @Path("/settings/email") + @Consumes(VCloudDirectorMediaType.ORG_EMAIL_SETTINGS) + @Produces(VCloudDirectorMediaType.ORG_EMAIL_SETTINGS) + @JAXBResponseParser + @ExceptionParser(ThrowVCloudErrorOn4xx.class) + ListenableFuture updateEmailSettings( + @EndpointParam URI orgRef, + @BinderParam(BindToXMLPayload.class) OrgEmailSettings settings); + + /** + * @see AdminOrgClient#getGeneralSettings(URI) + */ + @GET + @Path("/settings/general") + @Consumes + @JAXBResponseParser + @ExceptionParser(ThrowVCloudErrorOn4xx.class) + ListenableFuture getGeneralSettings( + @EndpointParam URI orgRef); + + /** + * @see AdminOrgClient#updateGeneralSettings(URI, OrgGeneralSettings) + */ + @PUT + @Path("/settings/general") + @Consumes(VCloudDirectorMediaType.ORG_GENERAL_SETTINGS) + @Produces(VCloudDirectorMediaType.ORG_GENERAL_SETTINGS) + @JAXBResponseParser + @ExceptionParser(ThrowVCloudErrorOn4xx.class) + ListenableFuture updateGeneralSettings( + @EndpointParam URI orgRef, + @BinderParam(BindToXMLPayload.class) OrgGeneralSettings settings); -// POST /admin/org/{id}/catalogs + /** + * @see AdminOrgClient#getPasswordPolicy(URI) + */ + @GET + @Path("/settings/ldap") + @Consumes + @JAXBResponseParser + @ExceptionParser(ThrowVCloudErrorOn4xx.class) + ListenableFuture getLdapSettings(@EndpointParam URI orgRef); -// POST /admin/org/{id}/groups - -// GET /admin/org/{id}/settings - -// PUT /admin/org/{id}/settings - -// GET /admin/org/{id}/settings/email - -// PUT /admin/org/{id}/settings/email - -// GET /admin/org/{id}/settings/general - -// PUT /admin/org/{id}/settings/general - -// GET /admin/org/{id}/settings/ldap - -// GET /admin/org/{id}/settings/passwordPolicy - -// PUT /admin/org/{id}/settings/passwordPolicy - -// GET /admin/org/{id}/settings/vAppLeaseSettings - -// PUT /admin/org/{id}/settings/vAppLeaseSettings - -// GET /admin/org/{id}/settings/vAppTemplateLeaseSettings - -// PUT /admin/org/{id}/settings/vAppTemplateLeaseSettings + /** + * @see AdminOrgClient#getPasswordPolicy(URI) + */ + @GET + @Path("/settings/passwordPolicy") + @Consumes + @JAXBResponseParser + @ExceptionParser(ThrowVCloudErrorOn4xx.class) + ListenableFuture getPasswordPolicy( + @EndpointParam URI orgRef); + + /** + * @see AdminOrgClient#updatePasswordPolicy(URI, OrgPasswordPolicySettings) + */ + @PUT + @Path("/settings/passwordPolicy") + @Consumes(VCloudDirectorMediaType.ORG_PASSWORD_POLICY_SETTINGS) + @Produces(VCloudDirectorMediaType.ORG_PASSWORD_POLICY_SETTINGS) + @JAXBResponseParser + @ExceptionParser(ThrowVCloudErrorOn4xx.class) + ListenableFuture updatePasswordPolicy( + @EndpointParam URI orgRef, + @BinderParam(BindToXMLPayload.class) OrgPasswordPolicySettings settings); + /** + * @see AdminOrgClient#getVAppLeaseSettings(URI) + */ + @GET + @Path("/settings/vAppLeaseSettings") + @Consumes + @JAXBResponseParser + @ExceptionParser(ThrowVCloudErrorOn4xx.class) + ListenableFuture getVAppLeaseSettings( + @EndpointParam URI orgRef); + + /** + * @see AdminOrgClient#updateVAppLeaseSettings(URI, OrgVAppLeaseSettings) + */ + @PUT + @Path("/settings/vAppLeaseSettings") + @Consumes(VCloudDirectorMediaType.ORG_LEASE_SETTINGS) + @Produces(VCloudDirectorMediaType.ORG_LEASE_SETTINGS) + @JAXBResponseParser + @ExceptionParser(ThrowVCloudErrorOn4xx.class) + ListenableFuture updateVAppLeaseSettings( + @EndpointParam URI orgRef, + @BinderParam(BindToXMLPayload.class) OrgLeaseSettings settings); + + /** + * @see AdminOrgClient#getVAppTemplateLeaseSettings(URI) + */ + @GET + @Path("/settings/vAppTemplateLeaseSettings") + @Consumes + @JAXBResponseParser + @ExceptionParser(ThrowVCloudErrorOn4xx.class) + ListenableFuture getVAppTemplateLeaseSettings( + @EndpointParam URI orgRef); + + /** + * @see AdminOrgClient#updateVAppTemplateLeaseSettings(URI, OrgVAppTemplateLeaseSettings) + */ + @PUT + @Path("/settings/vAppTemplateLeaseSettings") + @Consumes(VCloudDirectorMediaType.ORG_VAPP_TEMPLATE_LEASE_SETTINGS) + @Produces(VCloudDirectorMediaType.ORG_VAPP_TEMPLATE_LEASE_SETTINGS) + @JAXBResponseParser + @ExceptionParser(ThrowVCloudErrorOn4xx.class) + ListenableFuture updateVAppTemplateLeaseSettings( + @EndpointParam URI orgRef, + @BinderParam(BindToXMLPayload.class) OrgVAppTemplateLeaseSettings settings); + } diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/AdminOrgClient.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/AdminOrgClient.java index b584713fbf..471572b512 100644 --- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/AdminOrgClient.java +++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/AdminOrgClient.java @@ -18,9 +18,19 @@ */ package org.jclouds.vcloud.director.v1_5.features; +import java.net.URI; import java.util.concurrent.TimeUnit; import org.jclouds.concurrent.Timeout; +import org.jclouds.vcloud.director.v1_5.domain.AdminOrg; +import org.jclouds.vcloud.director.v1_5.domain.Group; +import org.jclouds.vcloud.director.v1_5.domain.OrgEmailSettings; +import org.jclouds.vcloud.director.v1_5.domain.OrgGeneralSettings; +import org.jclouds.vcloud.director.v1_5.domain.OrgLdapSettings; +import org.jclouds.vcloud.director.v1_5.domain.OrgLeaseSettings; +import org.jclouds.vcloud.director.v1_5.domain.OrgPasswordPolicySettings; +import org.jclouds.vcloud.director.v1_5.domain.OrgSettings; +import org.jclouds.vcloud.director.v1_5.domain.OrgVAppTemplateLeaseSettings; /** * Provides synchronous access to {@link Group} objects. @@ -29,38 +39,181 @@ import org.jclouds.concurrent.Timeout; * @author danikov */ @Timeout(duration = 180, timeUnit = TimeUnit.SECONDS) -public interface AdminOrgClient { +public interface AdminOrgClient extends OrgClient { -// GET /admin/org/{id} + /** + * Retrieves an admin view of an organization. + * The organization might be enabled or disabled. + * If enabled, the organization allows login and all other operations. + * + *
    +    * GET /admin/org/{id}
    +    * 
    + * + * @param orgRef the reference for the admin org + * @return the admin org + */ + AdminOrg getOrg(URI orgRef); -// POST /admin/org/{id}/catalogs + /** + * Gets organizational settings for this organization. + * + *
    +    * GET /admin/org/{id}/settings
    +    * 
    + * + * @param orgRef the reference for the admin org + * @return the settings + */ + OrgSettings getSettings(URI orgRef); -// POST /admin/org/{id}/groups + /** + * Updates organizational settings for this organization. + * + *
    +    * PUT /admin/org/{id}/settings
    +    * 
    + * @param orgRef the reference for the admin org + * @param newSettings the requested updated settings + * @return the resultant settings + */ + OrgSettings updateSettings(URI orgRef, OrgSettings newSettings); -// GET /admin/org/{id}/settings + /** + * Retrieves email settings for an organization. + * + *
    +    * GET /admin/org/{id}/settings/email
    +    * 
    + * + * @param orgRef the reference for the admin org + * @return the email settings + */ + OrgEmailSettings getEmailSettings(URI orgRef); -// PUT /admin/org/{id}/settings + /** + * Updates email policy settings for organization. + * + *
    +    * PUT /admin/org/{id}/settings/email
    +    * 
    + * @param orgRef the reference for the admin org + * @param newSettings the requested updated settings + * @return the resultant settings + */ + OrgEmailSettings updateEmailSettings(URI orgRef, + OrgEmailSettings newSettings); -// GET /admin/org/{id}/settings/email + /** + * Gets general organization settings. + * + *
    +    * GET /admin/org/{id}/settings/general
    +    * 
    + * + * @param orgRef the reference for the admin org + * @return the lease settings + */ + OrgGeneralSettings getGeneralSettings(URI orgRef); -// PUT /admin/org/{id}/settings/email + /** + * Updates general organization settings. + * + *
    +    * PUT /admin/org/{id}/settings/general
    +    * 
    + * @param orgRef the reference for the admin org + * @param newSettings the requested updated settings + * @return the resultant settings + */ + OrgGeneralSettings updateGeneralSettings(URI orgRef, + OrgGeneralSettings newSettings); -// GET /admin/org/{id}/settings/general + /** + * Retrieves LDAP settings for an organization. + * + *
    +    * GET /admin/org/{id}/settings/ldap
    +    * 
    + * + * @param orgRef the reference for the admin org + * @return the ldap settings + */ + OrgLdapSettings getLdapSettings(URI orgRef); -// PUT /admin/org/{id}/settings/general + /** + * Retrieves password policy settings for an organization. + * + *
    +    * GET /admin/org/{id}/settings/passwordPolicy
    +    * 
    + * + * @param orgRef the reference for the admin org + * @return the lease settings + */ + OrgPasswordPolicySettings getPasswordPolicy(URI orgRef); -// GET /admin/org/{id}/settings/ldap + /** + * Updates password policy settings for organization. + * + *
    +    * PUT /admin/org/{id}/settings/passwordPolicy
    +    * 
    + * @param orgRef the reference for the admin org + * @param newSettings the requested updated settings + * @return the resultant settings + */ + OrgPasswordPolicySettings updatePasswordPolicy(URI orgRef, + OrgPasswordPolicySettings newSettings); -// GET /admin/org/{id}/settings/passwordPolicy + /** + * Gets organization resource cleanup settings on the level of vApp. + * + *
    +    * GET /admin/org/{id}/settings/vAppLeaseSettings
    +    * 
    + * + * @param orgRef the reference for the admin org + * @return the lease settings + */ + OrgLeaseSettings getVAppLeaseSettings(URI orgRef); -// PUT /admin/org/{id}/settings/passwordPolicy + /** + * Updates organization resource cleanup settings on the level of vApp. + * + *
    +    * PUT /admin/org/{id}/settings/vAppLeaseSettings
    +    * 
    + * @param orgRef the reference for the admin org + * @param newSettings the requested updated settings + * @return the resultant settings + */ + OrgLeaseSettings updateVAppLeaseSettings(URI orgRef, + OrgLeaseSettings newSettings); -// GET /admin/org/{id}/settings/vAppLeaseSettings + /** + * Retrieves expiration and storage policy for vApp templates in an organization. + * + *
    +    * GET /admin/org/{id}/settings/vAppTemplateLeaseSettings
    +    * 
    + * + * @param orgRef the reference for the admin org + * @return the lease settings + */ + OrgVAppTemplateLeaseSettings getVAppTemplateLeaseSettings(URI orgRef); -// PUT /admin/org/{id}/settings/vAppLeaseSettings - -// GET /admin/org/{id}/settings/vAppTemplateLeaseSettings - -// PUT /admin/org/{id}/settings/vAppTemplateLeaseSettings + /** + * Updates vApp template policy settings for organization. + * + *
    +    * PUT /admin/org/{id}/settings/vAppTemplateLeaseSettings
    +    * 
    + * @param orgRef the reference for the admin org + * @param newSettings the requested updated settings + * @return the resultant settings + */ + OrgVAppTemplateLeaseSettings updateVAppTemplateLeaseSettings(URI orgRef, + OrgVAppTemplateLeaseSettings newSettings); } diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/GroupAsyncClient.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/GroupAsyncClient.java index 76e13dda4b..e2d772fba3 100644 --- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/GroupAsyncClient.java +++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/GroupAsyncClient.java @@ -23,10 +23,6 @@ import java.net.URI; import javax.ws.rs.Consumes; import javax.ws.rs.DELETE; import javax.ws.rs.GET; - -import org.jclouds.rest.annotations.EndpointParam; -import org.jclouds.rest.annotations.ExceptionParser; -import org.jclouds.rest.annotations.JAXBResponseParser; import javax.ws.rs.PUT; import javax.ws.rs.Produces; @@ -35,7 +31,6 @@ import org.jclouds.rest.annotations.EndpointParam; import org.jclouds.rest.annotations.ExceptionParser; import org.jclouds.rest.annotations.JAXBResponseParser; import org.jclouds.rest.annotations.RequestFilters; -import org.jclouds.vcloud.director.v1_5.domain.Group; import org.jclouds.rest.binders.BindToXMLPayload; import org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType; import org.jclouds.vcloud.director.v1_5.domain.Group; @@ -68,7 +63,7 @@ public interface GroupAsyncClient { @Produces(VCloudDirectorMediaType.GROUP) @JAXBResponseParser @ExceptionParser(ThrowVCloudErrorOn4xx.class) - ListenableFuture updateCatalog(@EndpointParam URI groupRef, + ListenableFuture updateGroup(@EndpointParam URI groupRef, @BinderParam(BindToXMLPayload.class) Group group); /** diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/MediaAsyncClient.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/MediaAsyncClient.java index 9f19cc5375..3d6b9ef570 100644 --- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/MediaAsyncClient.java +++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/MediaAsyncClient.java @@ -23,6 +23,7 @@ import java.net.URI; import javax.ws.rs.Consumes; 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.Produces; @@ -35,6 +36,7 @@ import org.jclouds.rest.annotations.JAXBResponseParser; import org.jclouds.rest.annotations.RequestFilters; import org.jclouds.rest.binders.BindToXMLPayload; import org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType; +import org.jclouds.vcloud.director.v1_5.domain.CloneMediaParams; import org.jclouds.vcloud.director.v1_5.domain.Media; import org.jclouds.vcloud.director.v1_5.domain.Metadata; import org.jclouds.vcloud.director.v1_5.domain.Owner; @@ -60,6 +62,29 @@ public interface MediaAsyncClient { @ExceptionParser(ThrowVCloudErrorOn4xx.class) ListenableFuture getMedia(@EndpointParam URI uri); + /** + * @see MediaClient#createMedia(URI, Media) + */ + @POST + @Consumes(VCloudDirectorMediaType.MEDIA) + @Produces(VCloudDirectorMediaType.MEDIA) + @JAXBResponseParser + @ExceptionParser(ThrowVCloudErrorOn4xx.class) + ListenableFuture createMedia(@EndpointParam URI link, + @BinderParam(BindToXMLPayload.class) Media media); + + + /** + * @see MediaClient#cloneMedia(URI, CloneMediaParams) + */ + @POST + @Consumes(VCloudDirectorMediaType.MEDIA) + @Produces(VCloudDirectorMediaType.CLONE_MEDIA_PARAMS) + @JAXBResponseParser + @ExceptionParser(ThrowVCloudErrorOn4xx.class) + ListenableFuture cloneMedia(@EndpointParam URI cloneLink, + @BinderParam(BindToXMLPayload.class) CloneMediaParams params); + /** * @see MediaClient#updateMedia(URI, Media)) */ diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/MediaClient.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/MediaClient.java index c779ac046f..b5445757f3 100644 --- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/MediaClient.java +++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/MediaClient.java @@ -23,6 +23,7 @@ import java.util.concurrent.TimeUnit; import org.jclouds.concurrent.Timeout; import org.jclouds.rest.annotations.Delegate; +import org.jclouds.vcloud.director.v1_5.domain.CloneMediaParams; import org.jclouds.vcloud.director.v1_5.domain.Media; import org.jclouds.vcloud.director.v1_5.domain.Metadata; import org.jclouds.vcloud.director.v1_5.domain.Owner; @@ -46,6 +47,22 @@ public interface MediaClient { */ Media getMedia(URI mediaUri); + /** + * Creates a media (and present upload link for the floppy/iso file). + * + * @return The response will return a link to transfer site to be able to continue with uploading the media. + */ + Media createMedia(URI uploadLink, Media media); + + /** + * Clones a media into new one. + * The status of the returned media is UNRESOLVED(0) until the task for cloning finish. + * + * @return a Media resource which will contain a task. + * The user should monitor the contained task status in order to check when it is completed. + */ + Media cloneMedia(URI cloneLink, CloneMediaParams params); + /** * Updates the name/description of a media. * diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/MetadataAsyncClient.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/MetadataAsyncClient.java index fe2dfb46c3..b6f9bc3284 100644 --- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/MetadataAsyncClient.java +++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/MetadataAsyncClient.java @@ -39,7 +39,6 @@ import org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType; import org.jclouds.vcloud.director.v1_5.domain.Metadata; import org.jclouds.vcloud.director.v1_5.domain.MetadataValue; import org.jclouds.vcloud.director.v1_5.domain.Task; -import org.jclouds.vcloud.director.v1_5.domain.URISupplier; import org.jclouds.vcloud.director.v1_5.filters.AddVCloudAuthorizationToRequest; import org.jclouds.vcloud.director.v1_5.functions.ThrowVCloudErrorOn4xx; diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/OrgAsyncClient.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/OrgAsyncClient.java index fa1e7cda69..98dc3bb731 100644 --- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/OrgAsyncClient.java +++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/OrgAsyncClient.java @@ -60,7 +60,7 @@ public interface OrgAsyncClient { @Consumes @JAXBResponseParser @ExceptionParser(ThrowVCloudErrorOn4xx.class) - ListenableFuture getOrg(@EndpointParam URI orgUri); + ListenableFuture getOrg(@EndpointParam URI orgUri); /** * @return asynchronous access to {@link Metadata.Readable} features diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/TaskAsyncClient.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/TaskAsyncClient.java index 99a92fb54f..1c5dc927ce 100644 --- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/TaskAsyncClient.java +++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/TaskAsyncClient.java @@ -31,7 +31,6 @@ import org.jclouds.rest.annotations.JAXBResponseParser; import org.jclouds.rest.annotations.RequestFilters; import org.jclouds.vcloud.director.v1_5.domain.Task; import org.jclouds.vcloud.director.v1_5.domain.TasksList; -import org.jclouds.vcloud.director.v1_5.domain.URISupplier; import org.jclouds.vcloud.director.v1_5.filters.AddVCloudAuthorizationToRequest; import org.jclouds.vcloud.director.v1_5.functions.OrgReferenceToTaskListEndpoint; import org.jclouds.vcloud.director.v1_5.functions.ThrowVCloudErrorOn4xx; diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/UploadAsyncClient.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/UploadAsyncClient.java index 3921252314..fecd69710e 100644 --- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/UploadAsyncClient.java +++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/UploadAsyncClient.java @@ -18,38 +18,27 @@ */ package org.jclouds.vcloud.director.v1_5.features; -import java.io.File; import java.net.URI; import javax.ws.rs.PUT; -import org.jclouds.rest.annotations.ExceptionParser; +import org.jclouds.io.Payload; +import org.jclouds.rest.annotations.EndpointParam; import org.jclouds.rest.annotations.RequestFilters; import org.jclouds.vcloud.director.v1_5.filters.AddVCloudAuthorizationToRequest; -import org.jclouds.vcloud.director.v1_5.functions.ThrowVCloudErrorOn4xx; import com.google.common.util.concurrent.ListenableFuture; /** - + * * @see UploadClient * @author danikov */ @RequestFilters(AddVCloudAuthorizationToRequest.class) -public interface UploadAsyncClient { // TODO: implement these operations correctly - +public interface UploadAsyncClient { /** - * @see UploadClient#uploadFile(URI, File) + * @see UploadClient#put */ @PUT - @ExceptionParser(ThrowVCloudErrorOn4xx.class) - ListenableFuture uploadFile(URI uri, File file); - - /** - * @see UploadClient#uploadBigFile(URI, File) - */ - @PUT - @ExceptionParser(ThrowVCloudErrorOn4xx.class) - ListenableFuture uploadBigFile(URI target, File file); - + ListenableFuture upload(@EndpointParam URI location, Payload payload); } diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/UploadClient.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/UploadClient.java index 147c7a415f..4311cda021 100644 --- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/UploadClient.java +++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/UploadClient.java @@ -18,31 +18,25 @@ */ package org.jclouds.vcloud.director.v1_5.features; -import java.io.File; import java.net.URI; import java.util.concurrent.TimeUnit; import org.jclouds.concurrent.Timeout; +import org.jclouds.io.Payload; /** * Provides synchronous access to Upload. *

    * * @see UploadAsyncClient - * @see * @author danikov */ @Timeout(duration = 180, timeUnit = TimeUnit.SECONDS) public interface UploadClient { /** - * Uploads a file. + * @return eTag */ - void uploadFile(URI uri, File file); - - /** - * Uploads a file using ranged PUTs. - */ - void uploadBigFile(URI uri, File file); + void upload(URI location, Payload payload); } diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/VAppTemplateAsyncClient.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/VAppTemplateAsyncClient.java index 7f3db4edf8..ea65252a74 100644 --- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/VAppTemplateAsyncClient.java +++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/VAppTemplateAsyncClient.java @@ -18,7 +18,20 @@ */ package org.jclouds.vcloud.director.v1_5.features; -import static org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType.*; +import static org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType.CUSTOMIZATION_SECTION; +import static org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType.ENVELOPE; +import static org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType.GUEST_CUSTOMIZATION_SECTION; +import static org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType.LEASE_SETTINGS_SECTION; +import static org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType.METADATA; +import static org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType.METADATA_ENTRY; +import static org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType.NETWORK_CONFIG_SECTION; +import static org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType.NETWORK_CONNECTION_SECTION; +import static org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType.NETWORK_SECTION; +import static org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType.OWNER; +import static org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType.PRODUCT_SECTION_LIST; +import static org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType.RELOCATE_TEMPLATE; +import static org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType.TASK; +import static org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType.VAPP_TEMPLATE; import java.net.URI; @@ -39,7 +52,18 @@ import org.jclouds.rest.annotations.ExceptionParser; import org.jclouds.rest.annotations.JAXBResponseParser; import org.jclouds.rest.annotations.RequestFilters; import org.jclouds.rest.binders.BindToXMLPayload; -import org.jclouds.vcloud.director.v1_5.domain.*; +import org.jclouds.vcloud.director.v1_5.domain.CustomizationSection; +import org.jclouds.vcloud.director.v1_5.domain.GuestCustomizationSection; +import org.jclouds.vcloud.director.v1_5.domain.LeaseSettingsSection; +import org.jclouds.vcloud.director.v1_5.domain.Metadata; +import org.jclouds.vcloud.director.v1_5.domain.MetadataValue; +import org.jclouds.vcloud.director.v1_5.domain.NetworkConfigSection; +import org.jclouds.vcloud.director.v1_5.domain.NetworkConnectionSection; +import org.jclouds.vcloud.director.v1_5.domain.Owner; +import org.jclouds.vcloud.director.v1_5.domain.ProductSectionList; +import org.jclouds.vcloud.director.v1_5.domain.RelocateParams; +import org.jclouds.vcloud.director.v1_5.domain.Task; +import org.jclouds.vcloud.director.v1_5.domain.VAppTemplate; import org.jclouds.vcloud.director.v1_5.filters.AddVCloudAuthorizationToRequest; import org.jclouds.vcloud.director.v1_5.functions.ThrowVCloudErrorOn4xx; diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/VAppTemplateClient.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/VAppTemplateClient.java index 1419dac4c4..181e8363d4 100644 --- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/VAppTemplateClient.java +++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/VAppTemplateClient.java @@ -24,7 +24,18 @@ import java.util.concurrent.TimeUnit; import org.jclouds.concurrent.Timeout; import org.jclouds.ovf.Envelope; import org.jclouds.ovf.NetworkSection; -import org.jclouds.vcloud.director.v1_5.domain.*; +import org.jclouds.vcloud.director.v1_5.domain.CustomizationSection; +import org.jclouds.vcloud.director.v1_5.domain.GuestCustomizationSection; +import org.jclouds.vcloud.director.v1_5.domain.LeaseSettingsSection; +import org.jclouds.vcloud.director.v1_5.domain.Metadata; +import org.jclouds.vcloud.director.v1_5.domain.MetadataValue; +import org.jclouds.vcloud.director.v1_5.domain.NetworkConfigSection; +import org.jclouds.vcloud.director.v1_5.domain.NetworkConnectionSection; +import org.jclouds.vcloud.director.v1_5.domain.Owner; +import org.jclouds.vcloud.director.v1_5.domain.ProductSectionList; +import org.jclouds.vcloud.director.v1_5.domain.RelocateParams; +import org.jclouds.vcloud.director.v1_5.domain.Task; +import org.jclouds.vcloud.director.v1_5.domain.VAppTemplate; /** * Provides synchronous access to {@link org.jclouds.vcloud.director.v1_5.domain.VAppTemplate} objects. diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/VdcAsyncClient.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/VdcAsyncClient.java index 345baae334..0f6e26b118 100644 --- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/VdcAsyncClient.java +++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/VdcAsyncClient.java @@ -34,7 +34,18 @@ import org.jclouds.rest.annotations.JAXBResponseParser; import org.jclouds.rest.annotations.RequestFilters; import org.jclouds.rest.binders.BindToXMLPayload; import org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType; -import org.jclouds.vcloud.director.v1_5.domain.*; +import org.jclouds.vcloud.director.v1_5.domain.CaptureVAppParams; +import org.jclouds.vcloud.director.v1_5.domain.CloneMediaParams; +import org.jclouds.vcloud.director.v1_5.domain.CloneVAppParams; +import org.jclouds.vcloud.director.v1_5.domain.CloneVAppTemplateParams; +import org.jclouds.vcloud.director.v1_5.domain.ComposeVAppParams; +import org.jclouds.vcloud.director.v1_5.domain.InstantiateVAppParamsType; +import org.jclouds.vcloud.director.v1_5.domain.Media; +import org.jclouds.vcloud.director.v1_5.domain.Metadata; +import org.jclouds.vcloud.director.v1_5.domain.UploadVAppTemplateParams; +import org.jclouds.vcloud.director.v1_5.domain.VApp; +import org.jclouds.vcloud.director.v1_5.domain.VAppTemplate; +import org.jclouds.vcloud.director.v1_5.domain.Vdc; import org.jclouds.vcloud.director.v1_5.filters.AddVCloudAuthorizationToRequest; import org.jclouds.vcloud.director.v1_5.functions.ThrowVCloudErrorOn4xx; diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/VdcClient.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/VdcClient.java index c0bab55cd6..19fed49178 100644 --- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/VdcClient.java +++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/VdcClient.java @@ -23,7 +23,18 @@ import java.util.concurrent.TimeUnit; import org.jclouds.concurrent.Timeout; import org.jclouds.rest.annotations.Delegate; -import org.jclouds.vcloud.director.v1_5.domain.*; +import org.jclouds.vcloud.director.v1_5.domain.CaptureVAppParams; +import org.jclouds.vcloud.director.v1_5.domain.CloneMediaParams; +import org.jclouds.vcloud.director.v1_5.domain.CloneVAppParams; +import org.jclouds.vcloud.director.v1_5.domain.CloneVAppTemplateParams; +import org.jclouds.vcloud.director.v1_5.domain.ComposeVAppParams; +import org.jclouds.vcloud.director.v1_5.domain.InstantiateVAppParamsType; +import org.jclouds.vcloud.director.v1_5.domain.Media; +import org.jclouds.vcloud.director.v1_5.domain.Metadata; +import org.jclouds.vcloud.director.v1_5.domain.UploadVAppTemplateParams; +import org.jclouds.vcloud.director.v1_5.domain.VApp; +import org.jclouds.vcloud.director.v1_5.domain.VAppTemplate; +import org.jclouds.vcloud.director.v1_5.domain.Vdc; /** * Provides synchronous access to a vDC. diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/functions/OrgReferenceToTaskListEndpoint.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/functions/OrgReferenceToTaskListEndpoint.java index a46f945082..5a40b35ae9 100644 --- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/functions/OrgReferenceToTaskListEndpoint.java +++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/functions/OrgReferenceToTaskListEndpoint.java @@ -26,7 +26,6 @@ import javax.inject.Singleton; import org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType; import org.jclouds.vcloud.director.v1_5.domain.Link; import org.jclouds.vcloud.director.v1_5.domain.Org; -import org.jclouds.vcloud.director.v1_5.domain.URISupplier; import org.jclouds.vcloud.director.v1_5.features.OrgClient; import com.google.common.base.Function; diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/predicates/LinkPredicates.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/predicates/LinkPredicates.java new file mode 100644 index 0000000000..96ac2dd1ae --- /dev/null +++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/predicates/LinkPredicates.java @@ -0,0 +1,71 @@ +/* + * 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.vcloud.director.v1_5.predicates; + +import static com.google.common.base.Preconditions.checkNotNull; + +import org.jclouds.vcloud.director.v1_5.domain.Link; + +import com.google.common.base.Predicate; + +/** + * Predicates handy when working with Links + * + * @author Adrian Cole + */ + +public class LinkPredicates { + + /** + * matches links of the given relation + * + * @param rel + * ex. {@code context.getApi().getCurrentSession().getOrg().getLinks()} + * @return predicate that will match links of the given rel + */ + public static Predicate relEquals(final String rel) { + checkNotNull(rel, "rel must be defined"); + + return new Predicate() { + @Override + public boolean apply(Link link) { + return rel.equals(link.getRel()); + } + + @Override + public String toString() { + return "relEquals(" + rel + ")"; + } + }; + } + + /** + * @see ReferenceTypePredicates#nameEquals + */ + public static Predicate nameEquals(String name) { + return ReferenceTypePredicates.nameEquals(name); + } + + /** + * @see ReferenceTypePredicates#typeEquals + */ + public static Predicate typeEquals(String type) { + return ReferenceTypePredicates.typeEquals(type); + } +} diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/predicates/ReferenceTypePredicates.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/predicates/ReferenceTypePredicates.java index f616df5f93..83ea92d133 100644 --- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/predicates/ReferenceTypePredicates.java +++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/predicates/ReferenceTypePredicates.java @@ -20,6 +20,7 @@ package org.jclouds.vcloud.director.v1_5.predicates; import static com.google.common.base.Preconditions.checkNotNull; +import org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType; import org.jclouds.vcloud.director.v1_5.domain.ReferenceType; import com.google.common.base.Predicate; diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/predicates/TaskSuccess.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/predicates/TaskSuccess.java index 1cd2a9d804..ee0aa98810 100644 --- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/predicates/TaskSuccess.java +++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/predicates/TaskSuccess.java @@ -18,8 +18,6 @@ */ package org.jclouds.vcloud.director.v1_5.predicates; -import java.net.URI; - import javax.annotation.Resource; import javax.inject.Inject; import javax.inject.Singleton; @@ -27,7 +25,6 @@ import javax.inject.Singleton; import org.jclouds.logging.Logger; import org.jclouds.vcloud.director.v1_5.VCloudDirectorException; import org.jclouds.vcloud.director.v1_5.domain.Task; -import org.jclouds.vcloud.director.v1_5.domain.URISupplier; import org.jclouds.vcloud.director.v1_5.features.TaskClient; import com.google.common.base.Predicate; @@ -56,7 +53,7 @@ public class TaskSuccess implements Predicate { logger.trace("looking for status on task %s", task); // TODO shouldn't we see if it's already done before getting it from API server? - task = taskClient.getTask(task.getURI()); + task = taskClient.getTask(task.getHref()); // perhaps task isn't available, yet if (task == null) return false; diff --git a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/VCloudDirectorClientExperimentLiveTest.java b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/VCloudDirectorClientExperimentLiveTest.java index d1806ececc..07bba81c1d 100644 --- a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/VCloudDirectorClientExperimentLiveTest.java +++ b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/VCloudDirectorClientExperimentLiveTest.java @@ -22,6 +22,7 @@ import static org.testng.Assert.assertEquals; import org.jclouds.vcloud.director.v1_5.domain.Session; import org.jclouds.vcloud.director.v1_5.internal.BaseVCloudDirectorClientLiveTest; +import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; /** @@ -42,6 +43,7 @@ public class VCloudDirectorClientExperimentLiveTest extends BaseVCloudDirectorCl * @see BaseVCloudDirectorClientLiveTest#setupRequiredClients() */ @Override + @BeforeClass(inheritGroups = true) public void setupRequiredClients() { } } diff --git a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/VCloudDirectorLiveTestConstants.java b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/VCloudDirectorLiveTestConstants.java index aa83961055..01b80a9013 100644 --- a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/VCloudDirectorLiveTestConstants.java +++ b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/VCloudDirectorLiveTestConstants.java @@ -72,5 +72,7 @@ public class VCloudDirectorLiveTestConstants { public static final String CORRECT_VALUE_OBJECT_FMT = "ERR-122: The %s field of the %s must be '%s': '%s'"; public static final String OBJ_FIELD_CLONE = "ERR-123: %s %s must be a clone of \"%s\" (%s)"; + + public static final String OBJ_FIELD_EMPTY_TO_DELETE = "ERR-124: %s must have no %s to be deleted (%s)"; } diff --git a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/domain/Checks.java b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/domain/Checks.java index 89d0f76fcf..d6f966d534 100644 --- a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/domain/Checks.java +++ b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/domain/Checks.java @@ -38,6 +38,9 @@ import java.util.Set; import java.util.UUID; import org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType; +import org.jclouds.vcloud.director.v1_5.domain.CustomOrgLdapSettings.AuthenticationMechanism; +import org.jclouds.vcloud.director.v1_5.domain.CustomOrgLdapSettings.ConnectorType; +import org.jclouds.vcloud.director.v1_5.domain.OrgLdapSettings.LdapMode; import com.google.common.base.Splitter; import com.google.common.collect.Iterables; @@ -66,9 +69,9 @@ public class Checks { // Check optional fields // NOTE description cannot be checked - TasksInProgress tasksInProgress = entity.getTasksInProgress(); - if (tasksInProgress != null && tasksInProgress.getTasks() != null && !tasksInProgress.getTasks().isEmpty()) { - for (Task task : tasksInProgress.getTasks()) checkTask(task); + Set tasks = entity.getTasks(); + if (tasks != null && tasks != null && !tasks.isEmpty()) { + for (Task task : tasks) checkTask(task); } // Check parent type @@ -229,6 +232,46 @@ public class Checks { checkEntityType(org); } + public static void checkAdminOrg(AdminOrg org) { + // required + assertNotNull(org.getSettings(), String.format(NOT_NULL_OBJECT_FMT, "settings", "AdminOrg")); + + // optional + if (org.getGroups() != null) { + checkGroupsList(org.getGroups()); + } + if (org.getCatalogs() != null) { + checkCatalogsList(org.getCatalogs()); + } + if (org.getVdcs() != null) { + checkVdcs(org.getVdcs()); + } + if (org.getNetworks() != null) { + checkNetworks(org.getNetworks()); + } + + // Check parent type + checkOrg(org); + } + + public static void checkCatalogsList(CatalogsList catalogList) { + for (Reference catalogItem : catalogList.getCatalogItems()) { + checkReferenceType(catalogItem); + } + } + + public static void checkVdcs(Vdcs vdcs) { + for (Reference vdc : vdcs.getVdcs()) { + checkReferenceType(vdc); + } + } + + public static void checkNetworks(Networks networks) { + for (Reference network : networks.getNetwork()) { + checkReferenceType(network); + } + } + public static void checkAdminCatalog(AdminCatalog catalog) { // Check parent type checkCatalogType(catalog); @@ -524,4 +567,185 @@ public class Checks { } } } + + public static void checkOrgSettings(OrgSettings settings) { + // Check optional fields + if (settings.getGeneralSettings() != null) { + checkGeneralSettings(settings.getGeneralSettings()); + } + if (settings.getVAppLeaseSettings() != null) { + checkVAppLeaseSettings(settings.getVAppLeaseSettings()); + } + if (settings.getVAppTemplateLeaseSettings() != null) { + checkVAppTemplateLeaseSettings(settings.getVAppTemplateLeaseSettings()); + } + if (settings.getLdapSettings() != null) { + checkLdapSettings(settings.getLdapSettings()); + } + if (settings.getEmailSettings() != null) { + checkEmailSettings(settings.getEmailSettings()); + } + if (settings.getPasswordPolicy() != null) { + checkPasswordPolicySettings(settings.getPasswordPolicy()); + } + + // parent type + checkResourceType(settings); + } + + public static void checkEmailSettings(OrgEmailSettings settings) { + // required + assertNotNull(settings.isDefaultSmtpServer(), String.format(OBJ_FIELD_REQ, "OrgEmailSettings", "isDefaultSmtpServer")); + assertNotNull(settings.isDefaultOrgEmail(), String.format(OBJ_FIELD_REQ, "OrgEmailSettings", "isDefaultOrgEmail")); + assertNotNull(settings.getFromEmailAddress(), String.format(OBJ_FIELD_REQ, "OrgEmailSettings", "fromEmailAddress")); + checkEmailAddress(settings.getFromEmailAddress()); + assertNotNull(settings.getDefaultSubjectPrefix(), String.format(OBJ_FIELD_REQ, "OrgEmailSettings", "defaultSubjectPrefix")); + assertNotNull(settings.isAlertEmailToAllAdmins(), String.format(OBJ_FIELD_REQ, "OrgEmailSettings", "isAlertEmailToAllAdmins")); + + // optional + // NOTE alertEmailsTo cannot be checked + + // parent type + checkResourceType(settings); + } + + public static void checkEmailAddress(String email) { + // TODO: validate email addresses + } + + public static void checkGeneralSettings(OrgGeneralSettings settings) { + // Check optional fields + // NOTE canPublishCatalogs cannot be checked + // NOTE useServerBootSequence cannot be checked + if (settings.getDeployedVMQuota() != null) { + assertTrue(settings.getDeployedVMQuota() >= 0, String.format( + OBJ_FIELD_GTE_0, "deployedVMQuota", "port", settings.getDeployedVMQuota())); + } + if (settings.getStoredVmQuota() != null) { + assertTrue(settings.getStoredVmQuota() >= 0, String.format( + OBJ_FIELD_GTE_0, "storedVmQuota", "port", settings.getStoredVmQuota())); + } + if (settings.getDelayAfterPowerOnSeconds() != null) { + assertTrue(settings.getDelayAfterPowerOnSeconds() >= 0, String.format( + OBJ_FIELD_GTE_0, "delayAfterPowerOnSeconds", "port", settings.getDelayAfterPowerOnSeconds())); + } + + // parent type + checkResourceType(settings); + } + + public static void checkLdapSettings(OrgLdapSettings settings) { + // Check optional fields + // NOTE customUsersOu cannot be checked + if (settings.getLdapMode() != null) { + assertTrue(LdapMode.ALL.contains(settings.getLdapMode()), String.format(REQUIRED_VALUE_OBJECT_FMT, + "LdapMode", "OrdLdapSettings", settings.getLdapMode(), Iterables.toString(OrgLdapSettings.LdapMode.ALL))); + } + if (settings.getCustomOrgLdapSettings() != null) { + checkCustomOrgLdapSettings(settings.getCustomOrgLdapSettings()); + } + + // parent type + checkResourceType(settings); + } + + public static void checkCustomOrgLdapSettings(CustomOrgLdapSettings settings) { + // required + assertNotNull(settings.getHostName(), String.format(OBJ_FIELD_REQ, "CustomOrgLdapSettings", "hostName")); + assertNotNull(settings.getPort(), String.format(OBJ_FIELD_REQ, "CustomOrgLdapSettings", "port")); + assertTrue(settings.getPort() >= 0, String.format( + OBJ_FIELD_GTE_0, "CustomOrgLdapSettings", "port", settings.getPort())); + assertNotNull(settings.getAuthenticationMechanism(), String.format(OBJ_FIELD_REQ, "CustomOrgLdapSettings", "authenticationMechanism")); + assertTrue(AuthenticationMechanism.ALL.contains(settings.getAuthenticationMechanism()), String.format(REQUIRED_VALUE_OBJECT_FMT, + "AuthenticationMechanism", "CustomOrdLdapSettings", settings.getAuthenticationMechanism(), + Iterables.toString(CustomOrgLdapSettings.AuthenticationMechanism.ALL))); + assertNotNull(settings.isGroupSearchBaseEnabled(), String.format(OBJ_FIELD_REQ, "CustomOrgLdapSettings", "isGroupSearchBaseEnabled")); + assertNotNull(settings.getConnectorType(), String.format(OBJ_FIELD_REQ, "CustomOrgLdapSettings", "connectorType")); + assertTrue(ConnectorType.ALL.contains(settings.getConnectorType()), String.format(REQUIRED_VALUE_OBJECT_FMT, + "ConnectorType", "CustomOrdLdapSettings", settings.getConnectorType(), + Iterables.toString(CustomOrgLdapSettings.ConnectorType.ALL))); + assertNotNull(settings.getUserAttributes(), String.format(OBJ_FIELD_REQ, "CustomOrgLdapSettings", "userAttributes")); + checkUserAttributes("CustomOrdLdapSettings", settings.getUserAttributes()); + assertNotNull(settings.getGroupAttributes(), String.format(OBJ_FIELD_REQ, "CustomOrgLdapSettings", "groupAttributes")); + checkGroupAttributes("CustomOrdLdapSettings", settings.getGroupAttributes()); + + // optional + // NOTE isSsl cannot be checked + // NOTE isSSlAcceptAll cannot be checked + // NOTE realm cannot be checked + // NOTE searchBase cannot be checked + // NOTE userName cannot be checked + // NOTE password cannot be checked + // NOTE groupSearchBase cannot be checked + } + + public static void checkUserAttributes(String client, OrgLdapUserAttributes attributes) { + // required + assertNotNull(attributes.getObjectClass(), String.format(OBJ_FIELD_REQ, client, "objectClass")); + assertNotNull(attributes.getObjectIdentifier(), String.format(OBJ_FIELD_REQ, client, "objectIdentifier")); + assertNotNull(attributes.getUserName(), String.format(OBJ_FIELD_REQ, client, "userName")); + assertNotNull(attributes.getEmail(), String.format(OBJ_FIELD_REQ, client, "email")); + assertNotNull(attributes.getFullName(), String.format(OBJ_FIELD_REQ, client, "fullName")); + assertNotNull(attributes.getGivenName(), String.format(OBJ_FIELD_REQ, client, "givenName")); + assertNotNull(attributes.getSurname(), String.format(OBJ_FIELD_REQ, client, "surname")); + assertNotNull(attributes.getTelephone(), String.format(OBJ_FIELD_REQ, client, "telephone")); + assertNotNull(attributes.getGroupMembershipIdentifier(), String.format(OBJ_FIELD_REQ, client, "groupMembershipIdentifier")); + + // optional + // NOTE groupBackLinkIdentifier cannot be checked + } + + public static void checkGroupAttributes(String client, OrgLdapGroupAttributes attributes) { + // required + assertNotNull(attributes.getObjectClass(), String.format(OBJ_FIELD_REQ, client, "objectClass")); + assertNotNull(attributes.getObjectIdentifier(), String.format(OBJ_FIELD_REQ, client, "objectIdentifier")); + assertNotNull(attributes.getGroupName(), String.format(OBJ_FIELD_REQ, client, "groupName")); + assertNotNull(attributes.getMembership(), String.format(OBJ_FIELD_REQ, client, "membership")); + assertNotNull(attributes.getMembershipIdentifier(), String.format(OBJ_FIELD_REQ, client, "membershipIdentifier")); + + // optional + // NOTE backLinkIdentifier cannot be checked + } + + public static void checkPasswordPolicySettings(OrgPasswordPolicySettings settings) { + // required + assertNotNull(settings.isAccountLockoutEnabled(), String.format(OBJ_FIELD_REQ, "OrgPasswordPolicySettings", "isAccountLockoutEnabled")); + assertNotNull(settings.getInvalidLoginsBeforeLockout(), String.format(OBJ_FIELD_REQ, "OrgPasswordPolicySettings", "invalidLoginsBeforeLockout")); + assertTrue(settings.getInvalidLoginsBeforeLockout() >= 0, String.format( + OBJ_FIELD_GTE_0, "OrgPasswordPolicySettings", "storageLeaseSeconds", settings.getInvalidLoginsBeforeLockout())); + assertNotNull(settings.getAccountLockoutIntervalMinutes(), String.format(OBJ_FIELD_REQ, "OrgPasswordPolicySettings", "accountLockoutIntervalMinutes")); + assertTrue(settings.getAccountLockoutIntervalMinutes() >= 0, String.format( + OBJ_FIELD_GTE_0, "OrgPasswordPolicySettings", "accountLockoutIntervalMinutes", settings.getAccountLockoutIntervalMinutes())); + + // parent type + checkResourceType(settings); + } + + public static void checkVAppLeaseSettings(OrgLeaseSettings settings) { + // Check optional fields + // NOTE deleteOnStorageLeaseExpiration cannot be checked + if (settings.getStorageLeaseSeconds() != null) { + assertTrue(settings.getStorageLeaseSeconds() >= 0, String.format( + OBJ_FIELD_GTE_0, "OrgLeaseSettings", "storageLeaseSeconds", settings.getStorageLeaseSeconds())); + } + if (settings.getDeploymentLeaseSeconds() != null) { + assertTrue(settings.getDeploymentLeaseSeconds() >= 0, String.format( + OBJ_FIELD_GTE_0, "OrgLeaseSettings", "deploymentLeaseSeconds", settings.getDeploymentLeaseSeconds())); + } + + // parent type + checkResourceType(settings); + } + + public static void checkVAppTemplateLeaseSettings(OrgVAppTemplateLeaseSettings settings) { + // Check optional fields + // NOTE deleteOnStorageLeaseExpiration cannot be checked + if (settings.getStorageLeaseSeconds() != null) { + assertTrue(settings.getStorageLeaseSeconds() >= 0, String.format( + OBJ_FIELD_GTE_0, "OrgVAppTemplateLeaseSettings", "storageLeaseSeconds", settings.getStorageLeaseSeconds())); + } + + // parent type + checkResourceType(settings); + } } diff --git a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/AdminCatalogClientExpectTest.java b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/AdminCatalogClientExpectTest.java index 44e33207a1..7cd70f7151 100644 --- a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/AdminCatalogClientExpectTest.java +++ b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/AdminCatalogClientExpectTest.java @@ -30,9 +30,12 @@ import org.jclouds.vcloud.director.v1_5.domain.Link; import org.jclouds.vcloud.director.v1_5.domain.Owner; import org.jclouds.vcloud.director.v1_5.domain.PublishCatalogParams; import org.jclouds.vcloud.director.v1_5.domain.Reference; +import org.jclouds.vcloud.director.v1_5.domain.Task; import org.jclouds.vcloud.director.v1_5.internal.BaseVCloudDirectorRestClientExpectTest; import org.testng.annotations.Test; +import com.google.common.collect.ImmutableSet; + /** * Test the {@link CatalogClient} by observing its side effects. * @@ -41,11 +44,35 @@ import org.testng.annotations.Test; @Test(groups = { "unit", "user" }, singleThreaded = true, testName = "CatalogClientExpectTest") public class AdminCatalogClientExpectTest extends BaseVCloudDirectorRestClientExpectTest { + private Reference orgRef = Reference.builder() + .type("application/vnd.vmware.vcloud.catalog+xml") + .name("QunyingTestCatalog") + .href(URI.create(endpoint + "/admin/catalog/7212e451-76e1-4631-b2de-ba1dfd8080e4")) + .build(); + private Reference catalogRef = Reference.builder() .type("application/vnd.vmware.vcloud.catalog+xml") .name("QunyingTestCatalog") .href(URI.create(endpoint + "/admin/catalog/7212e451-76e1-4631-b2de-ba1dfd8080e4")) .build(); + + @Test + public void testCreateCatalog() { + VCloudDirectorClient client = requestsSendResponses(loginRequest, sessionResponse, + new VcloudHttpRequestPrimer() + .apiCommand("POST", "/admin/org/???/catalogs") + .xmlFilePayload("/catalog/admin/createCatalogSource.xml", VCloudDirectorMediaType.ADMIN_CATALOG) + .acceptMedia(VCloudDirectorMediaType.ADMIN_CATALOG) + .httpRequestBuilder().build(), + new VcloudHttpResponsePrimer() + .xmlFilePayload("/catalog/admin/createCatalog.xml", VCloudDirectorMediaType.ADMIN_CATALOG) + .httpResponseBuilder().build()); + + AdminCatalog source = createCatalogSource(); + AdminCatalog expected = createCatalog(); + + assertEquals(client.getAdminCatalogClient().createCatalog(catalogRef.getHref(), source), expected); + } @Test public void testGetCatalog() { @@ -60,7 +87,7 @@ public class AdminCatalogClientExpectTest extends BaseVCloudDirectorRestClientEx AdminCatalog expected = catalog(); - assertEquals(client.getAdminCatalogClient().getCatalog(catalogRef.getURI()), expected); + assertEquals(client.getAdminCatalogClient().getCatalog(catalogRef.getHref()), expected); } @Test @@ -77,7 +104,7 @@ public class AdminCatalogClientExpectTest extends BaseVCloudDirectorRestClientEx AdminCatalog expected = modifyCatalog(); - assertEquals(client.getAdminCatalogClient().updateCatalog(catalogRef.getURI(), expected), expected); + assertEquals(client.getAdminCatalogClient().updateCatalog(catalogRef.getHref(), expected), expected); } @Test @@ -93,7 +120,7 @@ public class AdminCatalogClientExpectTest extends BaseVCloudDirectorRestClientEx Owner expected = owner(); - assertEquals(client.getAdminCatalogClient().getOwner(catalogRef.getURI()), expected); + assertEquals(client.getAdminCatalogClient().getOwner(catalogRef.getHref()), expected); } @Test @@ -116,7 +143,7 @@ public class AdminCatalogClientExpectTest extends BaseVCloudDirectorRestClientEx .build()) .build(); - client.getAdminCatalogClient().setOwner(catalogRef.getURI(), newOwner); + client.getAdminCatalogClient().setOwner(catalogRef.getHref(), newOwner); } @Test @@ -134,7 +161,7 @@ public class AdminCatalogClientExpectTest extends BaseVCloudDirectorRestClientEx .isPublished(true) .build(); - client.getAdminCatalogClient().publishCatalog(catalogRef.getURI(), params); + client.getAdminCatalogClient().publishCatalog(catalogRef.getHref(), params); } @Test @@ -147,7 +174,94 @@ public class AdminCatalogClientExpectTest extends BaseVCloudDirectorRestClientEx new VcloudHttpResponsePrimer() .httpResponseBuilder().statusCode(204).build()); - client.getAdminCatalogClient().deleteCatalog(catalogRef.getURI()); + client.getAdminCatalogClient().deleteCatalog(catalogRef.getHref()); + } + + public static final AdminCatalog createCatalogSource() { + return AdminCatalog.builder() + .name("Test Catalog") + .description("created by testCreateCatalog()") + .build(); + } + + public static final AdminCatalog createCatalog() { + return AdminCatalog.builder() + .name("Test Catalog") + .id("urn:vcloud:catalog:c56d9159-7838-446f-bb35-9ee12dfbbef3") + .type("application/vnd.vmware.admin.catalog+xml") + .description("created by testCreateCatalog()") + .href(URI.create("https://vcloudbeta.bluelock.com/api/admin/catalog/c56d9159-7838-446f-bb35-9ee12dfbbef3")) + .link(Link.builder() + .rel("up") + .type("application/vnd.vmware.admin.organization+xml") + .href(URI.create("https://vcloudbeta.bluelock.com/api/admin/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0")) + .build()) + .link(Link.builder() + .rel("alternate") + .type("application/vnd.vmware.vcloud.catalog+xml") + .href(URI.create("https://vcloudbeta.bluelock.com/api/catalog/c56d9159-7838-446f-bb35-9ee12dfbbef3")) + .build()) + .link(Link.builder() + .rel("down") + .type("application/vnd.vmware.vcloud.owner+xml") + .href(URI.create("https://vcloudbeta.bluelock.com/api/admin/catalog/c56d9159-7838-446f-bb35-9ee12dfbbef3/owner")) + .build()) + .link(Link.builder() + .rel("add") + .type("application/vnd.vmware.vcloud.catalogItem+xml") + .href(URI.create("https://vcloudbeta.bluelock.com/api/catalog/c56d9159-7838-446f-bb35-9ee12dfbbef3/catalogItems")) + .build()) + .link(Link.builder() + .rel("edit") + .type("application/vnd.vmware.admin.catalog+xml") + .href(URI.create("https://vcloudbeta.bluelock.com/api/admin/catalog/c56d9159-7838-446f-bb35-9ee12dfbbef3")) + .build()) + .link(Link.builder() + .rel("remove") + .href(URI.create("https://vcloudbeta.bluelock.com/api/admin/catalog/c56d9159-7838-446f-bb35-9ee12dfbbef3")) + .build()) + .link(Link.builder() + .rel("down") + .type("application/vnd.vmware.vcloud.metadata+xml") + .href(URI.create("https://vcloudbeta.bluelock.com/api/catalog/c56d9159-7838-446f-bb35-9ee12dfbbef3/metadata")) + .build()) + .description("created by testCreateCatalog()") + .tasks(ImmutableSet.builder() + .add(Task.builder() + .status("running") + .startTime(dateService.iso8601DateParse("2012-03-11T18:43:02.429-04:00")) + .operationName("catalogCreateCatalog") + .operation("Creating Catalog Test Catalog(c56d9159-7838-446f-bb35-9ee12dfbbef3)") + .expiryTime(dateService.iso8601DateParse("2012-06-09T18:43:02.429-04:00")) + .name("task") + .id("urn:vcloud:task:20f556f9-9125-4090-9092-0da9f72bedf4") + .type("application/vnd.vmware.vcloud.task+xml") + .href(URI.create("https://vcloudbeta.bluelock.com/api/task/20f556f9-9125-4090-9092-0da9f72bedf4")) + .link(Link.builder() + .rel("task:cancel") + .href(URI.create("https://vcloudbeta.bluelock.com/api/task/20f556f9-9125-4090-9092-0da9f72bedf4/action/cancel")) + .build()) + .owner(Reference.builder() + .type("application/vnd.vmware.vcloud.catalog+xml") + .name("Test Catalog") + .href(URI.create("https://vcloudbeta.bluelock.com/api/catalog/c56d9159-7838-446f-bb35-9ee12dfbbef3")) + .build()) + .user(Reference.builder() + .type("application/vnd.vmware.admin.user+xml") + .name("dan@cloudsoftcorp.com") + .href(URI.create("https://vcloudbeta.bluelock.com/api/admin/user/ae75edd2-12de-414c-8e85-e6ea10442c08")) + .build()) + .org(Reference.builder() + .type("application/vnd.vmware.vcloud.org+xml") + .name("JClouds") + .href(URI.create("https://vcloudbeta.bluelock.com/api/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0")) + .build()) + .build()) + .build()) + .catalogItems(CatalogItems.builder() + .build()) + .isPublished(false) + .build(); } public static final AdminCatalog catalog() { diff --git a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/AdminCatalogClientLiveTest.java b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/AdminCatalogClientLiveTest.java index 0f82fc5819..7923087ac0 100644 --- a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/AdminCatalogClientLiveTest.java +++ b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/AdminCatalogClientLiveTest.java @@ -19,7 +19,11 @@ package org.jclouds.vcloud.director.v1_5.features; import static com.google.common.base.Objects.equal; -import static org.jclouds.vcloud.director.v1_5.VCloudDirectorLiveTestConstants.*; +import static org.jclouds.vcloud.director.v1_5.VCloudDirectorLiveTestConstants.OBJ_DEL; +import static org.jclouds.vcloud.director.v1_5.VCloudDirectorLiveTestConstants.OBJ_FIELD_EMPTY_TO_DELETE; +import static org.jclouds.vcloud.director.v1_5.VCloudDirectorLiveTestConstants.OBJ_FIELD_EQ; +import static org.jclouds.vcloud.director.v1_5.VCloudDirectorLiveTestConstants.OBJ_FIELD_UPDATABLE; +import static org.jclouds.vcloud.director.v1_5.VCloudDirectorLiveTestConstants.REF_REQ_LIVE; import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertNotNull; import static org.testng.Assert.assertNull; @@ -40,6 +44,8 @@ import org.jclouds.vcloud.director.v1_5.internal.BaseVCloudDirectorClientLiveTes import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; +import com.google.common.collect.Iterables; + /** * Tests live behavior of {@link AdminCatalogClient}. * @@ -59,22 +65,34 @@ public class AdminCatalogClientLiveTest extends BaseVCloudDirectorClientLiveTest /* * Shared state between dependant tests. */ - private ReferenceType catalogRef; + private ReferenceType orgRef; private AdminCatalog catalog; private Owner owner; + @Override @BeforeClass(inheritGroups = true) public void setupRequiredClients() { catalogClient = context.getApi().getAdminCatalogClient(); - catalogRef = Reference.builder() - .href(URI.create("https://vcloudbeta.bluelock.com/api/admin/catalog/7212e451-76e1-4631-b2de-ba1dfd8080e4")) + orgRef = Iterables.getFirst(context.getApi().getOrgClient().getOrgList().getOrgs(), null).toAdminReference(endpoint); + } + + @Test(testName = "POST /admin/org/{id}/catalogs") + public void testCreateCatalog() { + AdminCatalog newCatalog = AdminCatalog.builder() + .name("Test Catalog") + .description("created by testCreateCatalog()") .build(); + catalog = catalogClient.createCatalog(orgRef.getHref(), newCatalog); + + Checks.checkAdminCatalog(catalog); + + // FIXME: documentation suggests we should wait for a task here } - @Test(testName = "GET /admin/catalog/{id}") + @Test(testName = "GET /admin/catalog/{id}", + dependsOnMethods = { "testCreateCatalog" }) public void testGetCatalog() { - assertNotNull(catalogRef, String.format(REF_REQ_LIVE, "Catalog")); - catalog = catalogClient.getCatalog(catalogRef.getURI()); + catalog = catalogClient.getCatalog(catalog.getHref()); Checks.checkAdminCatalog(catalog); } @@ -82,7 +100,7 @@ public class AdminCatalogClientLiveTest extends BaseVCloudDirectorClientLiveTest @Test(testName = "GET /admin/catalog/{id}/owner", dependsOnMethods = { "testGetCatalog" }) public void testGetCatalogOwner() { - owner = catalogClient.getOwner(catalog.getURI()); + owner = catalogClient.getOwner(catalog.getHref()); Checks.checkOwner(owner); } @@ -100,13 +118,13 @@ public class AdminCatalogClientLiveTest extends BaseVCloudDirectorClientLiveTest .build(); try { - catalogClient.setOwner(catalog.getURI(), newOwner); - owner = catalogClient.getOwner(catalog.getURI()); + catalogClient.setOwner(catalog.getHref(), newOwner); + owner = catalogClient.getOwner(catalog.getHref()); Checks.checkOwner(owner); assertTrue(equal(owner, newOwner), String.format(OBJ_FIELD_UPDATABLE, CATALOG, "owner")); } finally { - catalogClient.setOwner(catalog.getURI(), oldOwner); - owner = catalogClient.getOwner(catalog.getURI()); + catalogClient.setOwner(catalog.getHref(), oldOwner); + owner = catalogClient.getOwner(catalog.getHref()); } } @@ -127,7 +145,7 @@ public class AdminCatalogClientLiveTest extends BaseVCloudDirectorClientLiveTest // .catalogItems(newCatalogItems) .build(); - catalog = catalogClient.updateCatalog(catalog.getURI(), catalog); + catalog = catalogClient.updateCatalog(catalog.getHref(), catalog); assertTrue(equal(catalog.getName(), newName), String.format(OBJ_FIELD_UPDATABLE, CATALOG, "name")); assertTrue(equal(catalog.getDescription(), newDescription), @@ -144,12 +162,12 @@ public class AdminCatalogClientLiveTest extends BaseVCloudDirectorClientLiveTest // .catalogItems(oldCatalogItems) .build(); - catalog = catalogClient.updateCatalog(catalog.getURI(), catalog); + catalog = catalogClient.updateCatalog(catalog.getHref(), catalog); } } @Test(testName = "POST /admin/catalog/{id}/action/publish", - dependsOnMethods = { "testUpdateCatalog" }, enabled = false ) + dependsOnMethods = { "testUpdateCatalog" }, enabled = false ) // FIXME: fails with a 403 public void testPublishCatalog() { assertTrue(!catalog.isPublished(), String.format(OBJ_FIELD_EQ, CATALOG, "isPublished", false, catalog.isPublished())); @@ -158,8 +176,8 @@ public class AdminCatalogClientLiveTest extends BaseVCloudDirectorClientLiveTest .isPublished(true) .build(); - catalogClient.publishCatalog(catalogRef.getURI(), params); - catalog = catalogClient.getCatalog(catalogRef.getURI()); + catalogClient.publishCatalog(catalog.getHref(), params); + catalog = catalogClient.getCatalog(catalog.getHref()); assertTrue(catalog.isPublished(), String.format(OBJ_FIELD_EQ, CATALOG, "isPublished", true, catalog.isPublished())); @@ -167,18 +185,22 @@ public class AdminCatalogClientLiveTest extends BaseVCloudDirectorClientLiveTest } @Test(testName = "DELETE /admin/catalog/{id}", - dependsOnMethods = { "testPublishCatalog" }, enabled = false ) + dependsOnMethods = { "testUpdateCatalog" } ) public void testDeleteCatalog() { - catalogClient.deleteCatalog(catalogRef.getURI()); +// assertEquals(catalog.getCatalogItems().getCatalogItems().size(), 0, +// String.format(OBJ_FIELD_EMPTY_TO_DELETE, "Catalog", "CatalogItems", +// catalog.getCatalogItems().getCatalogItems().toString())); + catalogClient.deleteCatalog(catalog.getHref()); Error expected = Error.builder() - .message("???") + .message("No access to entity \"(com.vmware.vcloud.entity.catalog:"+ + catalog.getId().substring("urn:vcloud:catalog:".length())+")\".") .majorErrorCode(403) .minorErrorCode("ACCESS_TO_RESOURCE_IS_FORBIDDEN") .build(); try { - catalog = catalogClient.getCatalog(catalogRef.getURI()); + catalog = catalogClient.getCatalog(catalog.getHref()); fail("Should give HTTP 403 error"); } catch (VCloudDirectorException vde) { assertEquals(vde.getError(), expected); diff --git a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/AdminOrgClientExpectTest.java b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/AdminOrgClientExpectTest.java index e6f295ea15..f2cd65ddf8 100644 --- a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/AdminOrgClientExpectTest.java +++ b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/AdminOrgClientExpectTest.java @@ -18,9 +18,28 @@ */ package org.jclouds.vcloud.director.v1_5.features; +import static org.testng.Assert.assertEquals; + import java.net.URI; +import org.jclouds.vcloud.director.v1_5.VCloudDirectorClient; +import org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType; +import org.jclouds.vcloud.director.v1_5.domain.AdminOrg; +import org.jclouds.vcloud.director.v1_5.domain.CatalogsList; +import org.jclouds.vcloud.director.v1_5.domain.GroupsList; +import org.jclouds.vcloud.director.v1_5.domain.Link; +import org.jclouds.vcloud.director.v1_5.domain.Networks; +import org.jclouds.vcloud.director.v1_5.domain.OrgEmailSettings; +import org.jclouds.vcloud.director.v1_5.domain.OrgGeneralSettings; +import org.jclouds.vcloud.director.v1_5.domain.OrgLdapSettings; +import org.jclouds.vcloud.director.v1_5.domain.OrgLeaseSettings; +import org.jclouds.vcloud.director.v1_5.domain.OrgPasswordPolicySettings; +import org.jclouds.vcloud.director.v1_5.domain.OrgSettings; +import org.jclouds.vcloud.director.v1_5.domain.OrgVAppTemplateLeaseSettings; import org.jclouds.vcloud.director.v1_5.domain.Reference; +import org.jclouds.vcloud.director.v1_5.domain.SmtpServerSettings; +import org.jclouds.vcloud.director.v1_5.domain.UsersList; +import org.jclouds.vcloud.director.v1_5.domain.Vdcs; import org.jclouds.vcloud.director.v1_5.internal.BaseVCloudDirectorRestClientExpectTest; import org.testng.annotations.Test; @@ -33,40 +52,571 @@ import org.testng.annotations.Test; public class AdminOrgClientExpectTest extends BaseVCloudDirectorRestClientExpectTest { private Reference orgRef = Reference.builder() - .type("application/vnd.vmware.admin.???+xml") - .name("???") - .href(URI.create(endpoint + "/admin/org/???")) + .href(URI.create(endpoint + "/admin/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0")) .build(); -// GET /admin/org/{id} + @Test + public void testGetOrg() { + VCloudDirectorClient client = requestsSendResponses(loginRequest, sessionResponse, + new VcloudHttpRequestPrimer() + .apiCommand("GET", "/admin/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0") + .acceptAnyMedia() + .httpRequestBuilder().build(), + new VcloudHttpResponsePrimer() + .xmlFilePayload("/org/admin/org.xml", + VCloudDirectorMediaType.ADMIN_ORG) + .httpResponseBuilder().build()); + + AdminOrg expected = adminOrg(); + + assertEquals(client.getAdminOrgClient().getOrg(orgRef.getHref()), expected); + } -// POST /admin/org/{id}/catalogs + public static final AdminOrg adminOrg() { + return AdminOrg.builder() + .name("JClouds") + .id("urn:vcloud:org:6f312e42-cd2b-488d-a2bb-97519cd57ed0") + .type("application/vnd.vmware.admin.organization+xml") + .href(URI.create("https://vcloudbeta.bluelock.com/api/admin/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0")) + .link(Link.builder() + .rel("down") + .type("application/vnd.vmware.vcloud.tasksList+xml") + .href(URI.create("https://vcloudbeta.bluelock.com/api/tasksList/6f312e42-cd2b-488d-a2bb-97519cd57ed0")) + .build()) + .link(Link.builder() + .rel("down") + .type("application/vnd.vmware.vcloud.metadata+xml") + .href(URI.create("https://vcloudbeta.bluelock.com/api/admin/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0/metadata")) + .build()) + .link(Link.builder() + .rel("add") + .type("application/vnd.vmware.admin.catalog+xml") + .href(URI.create("https://vcloudbeta.bluelock.com/api/admin/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0/catalogs")) + .build()) + .link(Link.builder() + .rel("add") + .type("application/vnd.vmware.admin.user+xml") + .href(URI.create("https://vcloudbeta.bluelock.com/api/admin/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0/users")) + .build()) + .link(Link.builder() + .rel("add") + .type("application/vnd.vmware.admin.group+xml") + .href(URI.create("https://vcloudbeta.bluelock.com/api/admin/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0/groups")) + .build()) + .link(Link.builder() + .rel("add") + .type("application/vnd.vmware.admin.orgNetwork+xml") + .href(URI.create("https://vcloudbeta.bluelock.com/api/admin/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0/networks")) + .build()) + .link(Link.builder() + .rel("edit") + .type("application/vnd.vmware.admin.organization+xml") + .href(URI.create("https://vcloudbeta.bluelock.com/api/admin/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0")) + .build()) + .link(Link.builder() + .rel("remove") + .href(URI.create("https://vcloudbeta.bluelock.com/api/admin/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0")) + .build()) + .link(Link.builder() + .rel("alternate") + .type("application/vnd.vmware.vcloud.org+xml") + .href(URI.create("https://vcloudbeta.bluelock.com/api/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0")) + .build()) + .description("") + .fullName("JClouds") + .isEnabled(true) + .settings(settings()) + .users(UsersList.builder() + .user(Reference.builder() + .type("application/vnd.vmware.admin.user+xml") + .name("adam.lowe@cloudsoftcorp.com") + .href(URI.create("https://vcloudbeta.bluelock.com/api/admin/user/672ebb67-d8ff-4201-9c1b-c1be869e526c")) + .build()) + .user(Reference.builder() + .type("application/vnd.vmware.admin.user+xml") + .name("adrian@jclouds.org") + .href(URI.create("https://vcloudbeta.bluelock.com/api/admin/user/8c360b93-ed25-4c9a-8e24-d48cd9966d93")) + .build()) + .user(Reference.builder() + .type("application/vnd.vmware.admin.user+xml") + .name("qunying.huang@enstratus.com") + .href(URI.create("https://vcloudbeta.bluelock.com/api/admin/user/967d317c-4273-4a95-b8a4-bf63b78e9c69")) + .build()) + .user(Reference.builder() + .type("application/vnd.vmware.admin.user+xml") + .name("dan@cloudsoftcorp.com") + .href(URI.create("https://vcloudbeta.bluelock.com/api/admin/user/ae75edd2-12de-414c-8e85-e6ea10442c08")) + .build()) + .user(Reference.builder() + .type("application/vnd.vmware.admin.user+xml") + .name("adk@cloudsoftcorp.com") + .href(URI.create("https://vcloudbeta.bluelock.com/api/admin/user/e9eb1b29-0404-4c5e-8ef7-e584acc51da9")) + .build()) + .build()) + .groups(GroupsList.builder() + .build()) + .catalogs(CatalogsList.builder() + .catalog(Reference.builder() + .type("application/vnd.vmware.admin.catalog+xml") + .name("QunyingTestCatalog") + .href(URI.create("https://vcloudbeta.bluelock.com/api/admin/catalog/7212e451-76e1-4631-b2de-ba1dfd8080e4")) + .build()) + .catalog(Reference.builder() + .type("application/vnd.vmware.admin.catalog+xml") + .name("Public") + .href(URI.create("https://vcloudbeta.bluelock.com/api/admin/catalog/9e08c2f6-077a-42ce-bece-d5332e2ebb5c")) + .build()) + .catalog(Reference.builder() + .type("application/vnd.vmware.admin.catalog+xml") + .name("dantest") + .href(URI.create("https://vcloudbeta.bluelock.com/api/admin/catalog/b542aff4-9f97-4f51-a126-4330fbf62f02")) + .build()) + .catalog(Reference.builder() + .type("application/vnd.vmware.admin.catalog+xml") + .name("test") + .href(URI.create("https://vcloudbeta.bluelock.com/api/admin/catalog/b7289d54-4ca4-497f-9a93-2d4afc97e3da")) + .build()) + .build()) + .vdcs(Vdcs.builder() + .vdc(Reference.builder() + .type("application/vnd.vmware.vcloud.vdc+xml") + .name("Cluster01-JClouds") + .href(URI.create("https://vcloudbeta.bluelock.com/api/vdc/d16d333b-e3c0-4176-845d-a5ee6392df07")) + .build()) + .build()) + .networks(Networks.builder() + .network(Reference.builder() + .type("application/vnd.vmware.admin.network+xml") + .name("ilsolation01-Jclouds") + .href(URI.create("https://vcloudbeta.bluelock.com/api/admin/network/f3ba8256-6f48-4512-aad6-600e85b4dc38")) + .build()) + .network(Reference.builder() + .type("application/vnd.vmware.admin.network+xml") + .name("internet01-Jclouds") + .href(URI.create("https://vcloudbeta.bluelock.com/api/admin/network/55a677cf-ab3f-48ae-b880-fab90421980c")) + .build()) + .build()) + .build(); + } + + @Test(enabled = false) + public void testGetSettings() { + VCloudDirectorClient client = requestsSendResponses(loginRequest, sessionResponse, + new VcloudHttpRequestPrimer() + .apiCommand("GET", "/admin/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0/settings/") + .acceptAnyMedia() + .httpRequestBuilder().build(), + new VcloudHttpResponsePrimer() + .xmlFilePayload("/org/admin/settings.xml", + VCloudDirectorMediaType.ORG_SETTINGS) + .httpResponseBuilder().build()); + + OrgSettings expected = settings(); + + assertEquals(client.getAdminOrgClient().getSettings(orgRef.getHref()), expected); + } + + public static final OrgSettings settings() { + return OrgSettings.builder() + .type("application/vnd.vmware.admin.orgSettings+xml") + .href(URI.create("https://vcloudbeta.bluelock.com/api/admin/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0/settings")) + .link(Link.builder() + .rel("down") + .type("application/vnd.vmware.admin.vAppTemplateLeaseSettings+xml") + .href(URI.create("https://vcloudbeta.bluelock.com/api/admin/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0/settings/vAppTemplateLeaseSettings")) + .build()) + .link(Link.builder() + .rel("down") + .type("application/vnd.vmware.admin.organizationEmailSettings+xml") + .href(URI.create("https://vcloudbeta.bluelock.com/api/admin/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0/settings/email")) + .build()) + .link(Link.builder() + .rel("down") + .type("application/vnd.vmware.admin.vAppLeaseSettings+xml") + .href(URI.create("https://vcloudbeta.bluelock.com/api/admin/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0/settings/vAppLeaseSettings")) + .build()) + .link(Link.builder() + .rel("down") + .type("application/vnd.vmware.admin.organizationPasswordPolicySettings+xml") + .href(URI.create("https://vcloudbeta.bluelock.com/api/admin/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0/settings/passwordPolicy")) + .build()) + .link(Link.builder() + .rel("down") + .type("application/vnd.vmware.admin.organizationGeneralSettings+xml") + .href(URI.create("https://vcloudbeta.bluelock.com/api/admin/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0/settings/general")) + .build()) + .link(Link.builder() + .rel("down") + .type("application/vnd.vmware.admin.organizationLdapSettings+xml") + .href(URI.create("https://vcloudbeta.bluelock.com/api/admin/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0/settings/ldap")) + .build()) + .link(Link.builder() + .rel("edit") + .type("application/vnd.vmware.admin.orgSettings+xml") + .href(URI.create("https://vcloudbeta.bluelock.com/api/admin/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0/settings")) + .build()) + .generalSettings(generalSettings()) + .vAppLeaseSettings(vAppLeaseSettings()) + .vAppTemplateLeaseSettings(vAppTemplateLeaseSettings()) + .ldapSettings(ldapSettings()) + .emailSettings(emailSettings()) + .passwordPolicy(passwordPolicy()) + .build(); + } + + @Test(enabled = false) + public void testUpdateSettings() { + VCloudDirectorClient client = requestsSendResponses(loginRequest, sessionResponse, + new VcloudHttpRequestPrimer() + .apiCommand("PUT", "/admin/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0/settings/") + .xmlFilePayload("/org/admin/updateSettingsSource.xml", + VCloudDirectorMediaType.ORG_SETTINGS) + .acceptMedia(VCloudDirectorMediaType.ORG_SETTINGS) + .httpRequestBuilder().build(), + new VcloudHttpResponsePrimer() + .xmlFilePayload("/org/admin/updateSettings.xml", + VCloudDirectorMediaType.ORG_SETTINGS) + .httpResponseBuilder().build()); + + OrgSettings expected = updateSettings(); + + assertEquals(client.getAdminOrgClient().updateSettings(orgRef.getHref(), expected), expected); + } + + @Test + public static final OrgSettings updateSettings() { + return settings().toBuilder() + .build(); + } -// POST /admin/org/{id}/groups + @Test + public void testGetEmailSettings() { + VCloudDirectorClient client = requestsSendResponses(loginRequest, sessionResponse, + new VcloudHttpRequestPrimer() + .apiCommand("GET", "/admin/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0/settings/email") + .acceptAnyMedia() + .httpRequestBuilder().build(), + new VcloudHttpResponsePrimer() + .xmlFilePayload("/org/admin/emailSettings.xml", + VCloudDirectorMediaType.ORG_GENERAL_SETTINGS) + .httpResponseBuilder().build()); + + OrgEmailSettings expected = emailSettings(); + + assertEquals(client.getAdminOrgClient().getEmailSettings(orgRef.getHref()), expected); + } + + public static final OrgEmailSettings emailSettings() { + return OrgEmailSettings.builder() + .type("application/vnd.vmware.admin.organizationEmailSettings+xml") + .href(URI.create("https://vcloudbeta.bluelock.com/api/admin/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0/settings/email")) + .link(Link.builder() + .rel("edit") + .type("application/vnd.vmware.admin.organizationEmailSettings+xml") + .href(URI.create("https://vcloudbeta.bluelock.com/api/admin/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0/settings/email")) + .build()) + .isDefaultSmtpServer(true) + .isDefaultOrgEmail(true) + .fromEmailAddress("") + .defaultSubjectPrefix("") + .isAlertEmailToAllAdmins(true) + .smtpServerSettings(SmtpServerSettings.builder() + .useAuthentication(false) + .host("") + .username("") + .password("") + .build()) + .build(); + } + + @Test + public void testUpdateEmailSettings() { + VCloudDirectorClient client = requestsSendResponses(loginRequest, sessionResponse, + new VcloudHttpRequestPrimer() + .apiCommand("PUT", "/admin/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0/settings/email") + .xmlFilePayload("/org/admin/updateEmailSettingsSource.xml", + VCloudDirectorMediaType.ORG_EMAIL_SETTINGS) + .acceptMedia(VCloudDirectorMediaType.ORG_EMAIL_SETTINGS) + .httpRequestBuilder().build(), + new VcloudHttpResponsePrimer() + .xmlFilePayload("/org/admin/updateEmailSettings.xml", + VCloudDirectorMediaType.ORG_EMAIL_SETTINGS) + .httpResponseBuilder().build()); + + OrgEmailSettings expected = updateEmailSettings(); + + assertEquals(client.getAdminOrgClient().updateEmailSettings(orgRef.getHref(), expected), expected); + } + + @Test + public static final OrgEmailSettings updateEmailSettings() { + return emailSettings().toBuilder() + .isDefaultSmtpServer(false) + .isDefaultOrgEmail(false) + .fromEmailAddress("test@test.com") + .defaultSubjectPrefix("new") + .isAlertEmailToAllAdmins(false) + .smtpServerSettings(emailSettings().getSmtpServerSettings().toBuilder() + .useAuthentication(true) + .host("new") + .username("new") + .build()) + .build(); + } + + @Test(enabled = false) + public void testGetGeneralSettings() { + VCloudDirectorClient client = requestsSendResponses(loginRequest, sessionResponse, + new VcloudHttpRequestPrimer() + .apiCommand("GET", "/admin/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0/settings/general") + .acceptAnyMedia() + .httpRequestBuilder().build(), + new VcloudHttpResponsePrimer() + .xmlFilePayload("/org/admin/generalSettings.xml", + VCloudDirectorMediaType.ORG_GENERAL_SETTINGS) + .httpResponseBuilder().build()); + + OrgGeneralSettings expected = generalSettings(); + + assertEquals(client.getAdminOrgClient().getGeneralSettings(orgRef.getHref()), expected); + } + + public static final OrgGeneralSettings generalSettings() { + return OrgGeneralSettings.builder() + .type("application/vnd.vmware.admin.organizationGeneralSettings+xml") + .href(URI.create("https://vcloudbeta.bluelock.com/api/admin/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0/settings/general")) + .link(Link.builder() + .rel("edit") + .type("application/vnd.vmware.admin.organizationGeneralSettings+xml") + .href(URI.create("https://vcloudbeta.bluelock.com/api/admin/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0/settings/general")) + .build()) + .canPublishCatalogs(false) + .deployedVMQuota(0) + .storedVmQuota(0) + .useServerBootSequence(false) + .delayAfterPowerOnSeconds(0) + .build(); + } + + @Test(enabled = false) + public void testUpdateGeneralSettings() { + VCloudDirectorClient client = requestsSendResponses(loginRequest, sessionResponse, + new VcloudHttpRequestPrimer() + .apiCommand("PUT", "/admin/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0/settings/general") + .xmlFilePayload("/org/admin/updateGeneralSettingsSource.xml", + VCloudDirectorMediaType.ORG_GENERAL_SETTINGS) + .acceptMedia(VCloudDirectorMediaType.ORG_GENERAL_SETTINGS) + .httpRequestBuilder().build(), + new VcloudHttpResponsePrimer() + .xmlFilePayload("/org/admin/updateGeneralSettings.xml", + VCloudDirectorMediaType.ORG_GENERAL_SETTINGS) + .httpResponseBuilder().build()); + + OrgGeneralSettings expected = updateGeneralSettings(); + + assertEquals(client.getAdminOrgClient().updateGeneralSettings(orgRef.getHref(), expected), expected); + } + + public static final OrgGeneralSettings updateGeneralSettings() { + return generalSettings().toBuilder() + + .build(); + } -// GET /admin/org/{id}/settings + @Test + public void testGetLdapSettings() { + VCloudDirectorClient client = requestsSendResponses(loginRequest, sessionResponse, + new VcloudHttpRequestPrimer() + .apiCommand("GET", "/admin/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0/settings/ldap") + .acceptAnyMedia() + .httpRequestBuilder().build(), + new VcloudHttpResponsePrimer() + .xmlFilePayload("/org/admin/ldapSettings.xml", + VCloudDirectorMediaType.ORG_LDAP_SETTINGS) + .httpResponseBuilder().build()); + + OrgLdapSettings expected = ldapSettings(); + + assertEquals(client.getAdminOrgClient().getLdapSettings(orgRef.getHref()), expected); + } + + public static final OrgLdapSettings ldapSettings() { + return OrgLdapSettings.builder() + .type("application/vnd.vmware.admin.organizationLdapSettings+xml") + .href(URI.create("https://vcloudbeta.bluelock.com/api/admin/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0/settings/ldap")) + .ldapMode("NONE") + .build(); + } -// PUT /admin/org/{id}/settings + @Test + public void testGetPasswordPolicy() { + VCloudDirectorClient client = requestsSendResponses(loginRequest, sessionResponse, + new VcloudHttpRequestPrimer() + .apiCommand("GET", "/admin/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0/settings/passwordPolicy") + .acceptAnyMedia() + .httpRequestBuilder().build(), + new VcloudHttpResponsePrimer() + .xmlFilePayload("/org/admin/passwordPolicy.xml", + VCloudDirectorMediaType.ORG_PASSWORD_POLICY_SETTINGS) + .httpResponseBuilder().build()); + + OrgPasswordPolicySettings expected = passwordPolicy(); + + assertEquals(client.getAdminOrgClient().getPasswordPolicy(orgRef.getHref()), expected); + } + + public static final OrgPasswordPolicySettings passwordPolicy() { + return OrgPasswordPolicySettings.builder() + .type("application/vnd.vmware.admin.organizationPasswordPolicySettings+xml") + .link(Link.builder() + .rel("edit") + .type("application/vnd.vmware.admin.organizationPasswordPolicySettings+xml") + .href(URI.create("https://vcloudbeta.bluelock.com/api/admin/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0/settings/passwordPolicy")) + .build()) + .href(URI.create("https://vcloudbeta.bluelock.com/api/admin/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0/settings/passwordPolicy")) + .accountLockoutEnabled(false) + .invalidLoginsBeforeLockout(5) + .accountLockoutIntervalMinutes(10) + .build(); + } + + @Test + public void testUpdatePasswordPolicy() { + VCloudDirectorClient client = requestsSendResponses(loginRequest, sessionResponse, + new VcloudHttpRequestPrimer() + .apiCommand("PUT", "/admin/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0/settings/passwordPolicy") + .xmlFilePayload("/org/admin/updatePasswordPolicySource.xml", + VCloudDirectorMediaType.ORG_PASSWORD_POLICY_SETTINGS) + .acceptMedia(VCloudDirectorMediaType.ORG_PASSWORD_POLICY_SETTINGS) + .httpRequestBuilder().build(), + new VcloudHttpResponsePrimer() + .xmlFilePayload("/org/admin/updatePasswordPolicy.xml", + VCloudDirectorMediaType.ORG_PASSWORD_POLICY_SETTINGS) + .httpResponseBuilder().build()); + + OrgPasswordPolicySettings expected = updateOrgPasswordPolicy(); + + assertEquals(client.getAdminOrgClient().updatePasswordPolicy(orgRef.getHref(), expected), expected); + } + + public static final OrgPasswordPolicySettings updateOrgPasswordPolicy() { + return passwordPolicy().toBuilder() + .accountLockoutEnabled(true) + .invalidLoginsBeforeLockout(6) + .accountLockoutIntervalMinutes(11) + .build(); + } -// GET /admin/org/{id}/settings/email + @Test(enabled = false) + public void testGetVAppLeaseSettings() { + VCloudDirectorClient client = requestsSendResponses(loginRequest, sessionResponse, + new VcloudHttpRequestPrimer() + .apiCommand("GET", "/admin/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0/settings/vAppLeaseSettings") + .acceptAnyMedia() + .httpRequestBuilder().build(), + new VcloudHttpResponsePrimer() + .xmlFilePayload("/org/admin/vAppLeaseSettings.xml", + VCloudDirectorMediaType.ORG_LEASE_SETTINGS) + .httpResponseBuilder().build()); + + OrgLeaseSettings expected = vAppLeaseSettings(); + + assertEquals(client.getAdminOrgClient().getVAppLeaseSettings(orgRef.getHref()), expected); + } + + public static final OrgLeaseSettings vAppLeaseSettings() { + return OrgLeaseSettings.builder() + .type("application/vnd.vmware.admin.vAppLeaseSettings+xml") + .href(URI.create("https://vcloudbeta.bluelock.com/api/admin/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0/settings/vAppLeaseSettings")) + .link(Link.builder() + .rel("edit") + .type("application/vnd.vmware.admin.vAppLeaseSettings+xml") + .href(URI.create("https://vcloudbeta.bluelock.com/api/admin/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0/settings/vAppLeaseSettings")) + .build()) + .deleteOnStorageLeaseExpiration(false) + .deploymentLeaseSeconds(0) + .storageLeaseSeconds(0) + .build(); + } + + @Test(enabled = false) + public void testUpdateOrgVAppLeaseSettings() { + VCloudDirectorClient client = requestsSendResponses(loginRequest, sessionResponse, + new VcloudHttpRequestPrimer() + .apiCommand("PUT", "/admin/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0/settings/vAppLeaseSettings") + .xmlFilePayload("/org/admin/updateVAppLeaseSettingsSource.xml", + VCloudDirectorMediaType.ORG_LEASE_SETTINGS) + .acceptMedia(VCloudDirectorMediaType.ORG_LEASE_SETTINGS) + .httpRequestBuilder().build(), + new VcloudHttpResponsePrimer() + .xmlFilePayload("/org/admin/updateVAppLeaseSettings.xml", + VCloudDirectorMediaType.ORG_LEASE_SETTINGS) + .httpResponseBuilder().build()); + + OrgLeaseSettings expected = updateVAppLeaseSettings(); + + assertEquals(client.getAdminOrgClient().updateVAppLeaseSettings(orgRef.getHref(), expected), expected); + } + + public static final OrgLeaseSettings updateVAppLeaseSettings() { + return vAppLeaseSettings().toBuilder() + + .build(); + } -// PUT /admin/org/{id}/settings/email - -// GET /admin/org/{id}/settings/general - -// PUT /admin/org/{id}/settings/general - -// GET /admin/org/{id}/settings/ldap - -// GET /admin/org/{id}/settings/passwordPolicy - -// PUT /admin/org/{id}/settings/passwordPolicy - -// GET /admin/org/{id}/settings/vAppLeaseSettings - -// PUT /admin/org/{id}/settings/vAppLeaseSettings - -// GET /admin/org/{id}/settings/vAppTemplateLeaseSettings - -// PUT /admin/org/{id}/settings/vAppTemplateLeaseSettings + @Test(enabled = false) + public void testGetVAppTemplateLeaseSettings() { + VCloudDirectorClient client = requestsSendResponses(loginRequest, sessionResponse, + new VcloudHttpRequestPrimer() + .apiCommand("GET", "/admin/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0/settings/vAppTemplateLeaseSettings") + .acceptAnyMedia() + .httpRequestBuilder().build(), + new VcloudHttpResponsePrimer() + .xmlFilePayload("/org/admin/vAppTemplateLeaseSettings.xml", + VCloudDirectorMediaType.ORG_VAPP_TEMPLATE_LEASE_SETTINGS) + .httpResponseBuilder().build()); + + OrgVAppTemplateLeaseSettings expected = vAppTemplateLeaseSettings(); + + assertEquals(client.getAdminOrgClient().getVAppTemplateLeaseSettings(orgRef.getHref()), expected); + } + + public static final OrgVAppTemplateLeaseSettings vAppTemplateLeaseSettings() { + return OrgVAppTemplateLeaseSettings.builder() + .type("application/vnd.vmware.admin.vAppTemplateLeaseSettings+xml") + .href(URI.create("https://vcloudbeta.bluelock.com/api/admin/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0/settings/vAppTemplateLeaseSettings")) + .link(Link.builder() + .rel("edit") + .type("application/vnd.vmware.admin.vAppTemplateLeaseSettings+xml") + .href(URI.create("https://vcloudbeta.bluelock.com/api/admin/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0/settings/vAppTemplateLeaseSettings")) + .build()) + .deleteOnStorageLeaseExpiration(false) + .storageLeaseSeconds(0) + .build(); + } + + @Test(enabled = false) + public void testUpdateOrgVAppTemplateLeaseSettings() { + VCloudDirectorClient client = requestsSendResponses(loginRequest, sessionResponse, + new VcloudHttpRequestPrimer() + .apiCommand("PUT", "/admin/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0/settings/vAppTemplateLeaseSettings") + .xmlFilePayload("/org/admin/updateVAppLeaseSettingsSource.xml", + VCloudDirectorMediaType.ORG_VAPP_TEMPLATE_LEASE_SETTINGS) + .acceptMedia(VCloudDirectorMediaType.ORG_VAPP_TEMPLATE_LEASE_SETTINGS) + .httpRequestBuilder().build(), + new VcloudHttpResponsePrimer() + .xmlFilePayload("/org/admin/updateVAppLeaseSettings.xml", + VCloudDirectorMediaType.ORG_VAPP_TEMPLATE_LEASE_SETTINGS) + .httpResponseBuilder().build()); + + OrgVAppTemplateLeaseSettings expected = updateVAppTemplateLeaseSettings(); + + assertEquals(client.getAdminOrgClient().updateVAppTemplateLeaseSettings(orgRef.getHref(), expected), expected); + } + + public static final OrgVAppTemplateLeaseSettings updateVAppTemplateLeaseSettings() { + return vAppTemplateLeaseSettings().toBuilder() + + .build(); + } } diff --git a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/AdminOrgClientLiveTest.java b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/AdminOrgClientLiveTest.java index dbd5c6a28c..5ce9522ec4 100644 --- a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/AdminOrgClientLiveTest.java +++ b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/AdminOrgClientLiveTest.java @@ -18,32 +18,29 @@ */ package org.jclouds.vcloud.director.v1_5.features; -import static org.jclouds.vcloud.director.v1_5.VCloudDirectorLiveTestConstants.REF_REQ_LIVE; -import static org.testng.Assert.assertNotNull; - -import static org.jclouds.vcloud.director.v1_5.VCloudDirectorLiveTestConstants.OBJ_DEL; -import static org.testng.Assert.assertEquals; -import static org.testng.Assert.assertNull; -import static org.testng.Assert.fail; import static com.google.common.base.Objects.equal; import static org.jclouds.vcloud.director.v1_5.VCloudDirectorLiveTestConstants.OBJ_FIELD_UPDATABLE; +import static org.jclouds.vcloud.director.v1_5.VCloudDirectorLiveTestConstants.REF_REQ_LIVE; +import static org.testng.Assert.assertNotNull; import static org.testng.Assert.assertTrue; - -import java.net.URI; - -import org.jclouds.vcloud.director.v1_5.domain.Checks; -import org.jclouds.vcloud.director.v1_5.VCloudDirectorException; import org.jclouds.vcloud.director.v1_5.domain.AdminOrg; -import org.jclouds.vcloud.director.v1_5.domain.Error; -import org.jclouds.vcloud.director.v1_5.domain.Group; -import org.jclouds.vcloud.director.v1_5.domain.Owner; -import org.jclouds.vcloud.director.v1_5.domain.Reference; +import org.jclouds.vcloud.director.v1_5.domain.Checks; +import org.jclouds.vcloud.director.v1_5.domain.OrgEmailSettings; +import org.jclouds.vcloud.director.v1_5.domain.OrgGeneralSettings; +import org.jclouds.vcloud.director.v1_5.domain.OrgLdapSettings; +import org.jclouds.vcloud.director.v1_5.domain.OrgLeaseSettings; +import org.jclouds.vcloud.director.v1_5.domain.OrgPasswordPolicySettings; +import org.jclouds.vcloud.director.v1_5.domain.OrgSettings; +import org.jclouds.vcloud.director.v1_5.domain.OrgVAppTemplateLeaseSettings; import org.jclouds.vcloud.director.v1_5.domain.ReferenceType; +import org.jclouds.vcloud.director.v1_5.domain.SmtpServerSettings; import org.jclouds.vcloud.director.v1_5.internal.BaseVCloudDirectorClientLiveTest; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; +import com.google.common.collect.Iterables; + /** * Tests live behavior of {@link AdminGroupClient}. * @@ -52,7 +49,7 @@ import org.testng.annotations.Test; @Test(groups = { "live", "admin", "org" }, singleThreaded = true, testName = "AdminOrgClientLiveTest") public class AdminOrgClientLiveTest extends BaseVCloudDirectorClientLiveTest { - public static final String GROUP = "admin org"; + public static final String ORG = "admin org"; /* * Convenience references to API clients. @@ -64,45 +61,381 @@ public class AdminOrgClientLiveTest extends BaseVCloudDirectorClientLiveTest { * Shared state between dependant tests. */ private ReferenceType orgRef; - private AdminOrg org; + private OrgSettings settings, newSettings; + private OrgEmailSettings emailSettings, newEmailSettings; + private OrgGeneralSettings generalSettings, newGeneralSettings; + private OrgLdapSettings ldapSettings, newLdapSettings; + private OrgPasswordPolicySettings passwordPolicy, newPasswordPolicy; + private OrgLeaseSettings vAppLeaseSettings, newVAppLeaseSettings; + private OrgVAppTemplateLeaseSettings vAppTemplateLeaseSettings, newVAppTemplateLeaseSettings; + @Override @BeforeClass(inheritGroups = true) public void setupRequiredClients() { orgClient = context.getApi().getAdminOrgClient(); - orgRef = Reference.builder() - .href(URI.create("https://vcloudbeta.bluelock.com/api/admin/org/???")) - .build(); + orgRef = Iterables.getFirst(orgClient.getOrgList().getOrgs(), null).toAdminReference(endpoint); + assertNotNull(orgRef, String.format(REF_REQ_LIVE, "admin org")); } -// GET /admin/org/{id} + @Test(testName = "GET /admin/org/{id}") + public void testGetAdminOrg() { + AdminOrg adminOrg = orgClient.getOrg(orgRef.getHref()); + + Checks.checkAdminOrg(adminOrg); + } -// POST /admin/org/{id}/catalogs + @Test(testName = "GET /admin/org/{id}/settings/emailSettings") + public void testGetEmailSettings() { + emailSettings = orgClient.getEmailSettings(orgRef.getHref()); + + Checks.checkEmailSettings(emailSettings); + } + + @Test(testName = "PUT /admin/org/{id}/settings/emailSettings", + dependsOnMethods = { "testGetEmailSettings" }) + public void testUpdateEmailSettings() { + boolean isDefaultSmtpServer = emailSettings.isDefaultSmtpServer(); + boolean isDefaultOrgEmail = emailSettings.isDefaultOrgEmail(); + String oldFromEmailAddress = emailSettings.getFromEmailAddress(); + String newFromEmailAddress = "test@test.com"; + String oldDefaultSubjectPrefix = emailSettings.getDefaultSubjectPrefix(); + String newDefaultSubjectPrefix = "new"+oldDefaultSubjectPrefix; + boolean isAlertEmailToAllAdmins = emailSettings.isAlertEmailToAllAdmins(); + SmtpServerSettings oldSmtpServerSettings = emailSettings.getSmtpServerSettings(); + SmtpServerSettings newSmtpServerSettings = oldSmtpServerSettings.toBuilder() + .useAuthentication(!oldSmtpServerSettings.useAuthentication()) + .host("new"+oldSmtpServerSettings.getHost()) + .username("new"+oldSmtpServerSettings.getUsername()) + .password("new"+oldSmtpServerSettings.getPassword()) + .build(); + + try { + newEmailSettings = emailSettings.toBuilder() + .isDefaultSmtpServer(!isDefaultSmtpServer) + .isDefaultOrgEmail(!isDefaultOrgEmail) + .fromEmailAddress(newFromEmailAddress) + .defaultSubjectPrefix(newDefaultSubjectPrefix) + .isAlertEmailToAllAdmins(!isAlertEmailToAllAdmins) + .smtpServerSettings(newSmtpServerSettings) + .build(); + + emailSettings = orgClient.updateEmailSettings( + orgRef.getHref(), newEmailSettings); + + assertTrue(equal(emailSettings.isDefaultSmtpServer(), !isDefaultSmtpServer), + String.format(OBJ_FIELD_UPDATABLE, + "emailSettings", "isDefaultSmtpServer")); + assertTrue(equal(emailSettings.isDefaultOrgEmail(), !isDefaultOrgEmail), + String.format(OBJ_FIELD_UPDATABLE, + "emailSettings", "isDefaultOrgEmail")); + assertTrue(equal(emailSettings.getFromEmailAddress(), newFromEmailAddress), + String.format(OBJ_FIELD_UPDATABLE, + "emailSettings", "fromEmailAddress")); + assertTrue(equal(emailSettings.getDefaultSubjectPrefix(), newDefaultSubjectPrefix), + String.format(OBJ_FIELD_UPDATABLE, + "emailSettings", "defaultSubjectPrefix")); + assertTrue(equal(emailSettings.isAlertEmailToAllAdmins(), !isAlertEmailToAllAdmins), + String.format(OBJ_FIELD_UPDATABLE, + "emailSettings", "isAlertEmailToAllAdmins")); + assertTrue(equal(emailSettings.getSmtpServerSettings(), newSmtpServerSettings), + String.format(OBJ_FIELD_UPDATABLE, + "emailSettings", "smtpServerSettings")); + + //TODO negative tests? + + Checks.checkEmailSettings(emailSettings); + } finally { + emailSettings = emailSettings.toBuilder() + .isDefaultSmtpServer(isDefaultSmtpServer) + .isDefaultOrgEmail(isDefaultOrgEmail) + .fromEmailAddress(oldFromEmailAddress) + .defaultSubjectPrefix(oldDefaultSubjectPrefix) + .isAlertEmailToAllAdmins(isAlertEmailToAllAdmins) + .smtpServerSettings(oldSmtpServerSettings) + .build(); + + emailSettings = orgClient.updateEmailSettings( + orgRef.getHref(), emailSettings); + } + } -// POST /admin/org/{id}/groups + @Test(testName = "GET /admin/org/{id}/settings/generalSettings") + public void testGetGeneralSettings() { + generalSettings = orgClient.getGeneralSettings(orgRef.getHref()); + + Checks.checkGeneralSettings(generalSettings); + } + + @Test(testName = "PUT /admin/org/{id}/settings/generalSettings", + dependsOnMethods = { "testGetGeneralSettings" }, enabled = false ) + public void testUpdateGeneralSettings() { +// boolean canPublishCatalogs = generalSettings.canPublishCatalogs(); // FIXME: did not update + Integer deployedVMQuota = generalSettings.getDeployedVMQuota(); + Integer storedVmQuota = generalSettings.getStoredVmQuota(); + boolean useServerBootSequence = generalSettings.useServerBootSequence(); + Integer delayAfterPowerOnSeconds = generalSettings.getDelayAfterPowerOnSeconds(); + + try { + newGeneralSettings = generalSettings.toBuilder() +// .canPublishCatalogs(!canPublishCatalogs) + .deployedVMQuota(deployedVMQuota+1) + .storedVmQuota(storedVmQuota+1) + .useServerBootSequence(!useServerBootSequence) + .delayAfterPowerOnSeconds(delayAfterPowerOnSeconds+1) + .build(); + + generalSettings = orgClient.updateGeneralSettings( + orgRef.getHref(), newGeneralSettings); + +// assertTrue(equal(generalSettings.canPublishCatalogs(), !canPublishCatalogs), +// String.format(OBJ_FIELD_UPDATABLE, +// "generalSettings", "canPublishCatalogs")); + assertTrue(equal(generalSettings.getDeployedVMQuota(), deployedVMQuota+1), + String.format(OBJ_FIELD_UPDATABLE, + "generalSettings", "deployedVMQuota")); + assertTrue(equal(generalSettings.getStoredVmQuota(), storedVmQuota+1), + String.format(OBJ_FIELD_UPDATABLE, + "generalSettings", "storedVmQuota")); + assertTrue(equal(generalSettings.useServerBootSequence(), !useServerBootSequence), + String.format(OBJ_FIELD_UPDATABLE, + "generalSettings", "useServerBootSequence")); + assertTrue(equal(generalSettings.getDelayAfterPowerOnSeconds(), delayAfterPowerOnSeconds+1), + String.format(OBJ_FIELD_UPDATABLE, + "generalSettings", "delayAfterPowerOnSeconds")); + + //TODO negative tests? + + Checks.checkGeneralSettings(generalSettings); + } finally { + generalSettings = generalSettings.toBuilder() +// .canPublishCatalogs(canPublishCatalogs) + .deployedVMQuota(deployedVMQuota) + .storedVmQuota(storedVmQuota) + .useServerBootSequence(useServerBootSequence) + .delayAfterPowerOnSeconds(delayAfterPowerOnSeconds) + .build(); + + generalSettings = orgClient.updateGeneralSettings( + orgRef.getHref(), generalSettings); + } + } -// GET /admin/org/{id}/settings + @Test(testName = "GET /admin/org/{id}/settings/ldap") + public void testGetLdapSettings() { + ldapSettings = orgClient.getLdapSettings(orgRef.getHref()); + + Checks.checkLdapSettings(ldapSettings); + } -// PUT /admin/org/{id}/settings + @Test(testName = "GET /admin/org/{id}/settings/passwordPolicy") + public void testGetPasswordPolicy() { + passwordPolicy = orgClient.getPasswordPolicy(orgRef.getHref()); + + Checks.checkPasswordPolicySettings(passwordPolicy); + } + + @Test(testName = "PUT /admin/org/{id}/settings/passwordPolicy", + dependsOnMethods = { "testGetPasswordPolicy" }) + public void testUpdatePasswordPolicy() { + boolean accountLockoutEnabled = passwordPolicy.isAccountLockoutEnabled(); + Integer invalidLoginsBeforeLockout = passwordPolicy.getInvalidLoginsBeforeLockout(); + Integer accountLockoutIntervalMinutes = passwordPolicy.getAccountLockoutIntervalMinutes(); + + try { + newPasswordPolicy = passwordPolicy.toBuilder() + .accountLockoutEnabled(!accountLockoutEnabled) + .invalidLoginsBeforeLockout(invalidLoginsBeforeLockout+1) + .accountLockoutIntervalMinutes(accountLockoutIntervalMinutes+1) + .build(); + + passwordPolicy = orgClient.updatePasswordPolicy( + orgRef.getHref(), newPasswordPolicy); + + assertTrue(equal(passwordPolicy.isAccountLockoutEnabled(), !accountLockoutEnabled), + String.format(OBJ_FIELD_UPDATABLE, + "PasswordPolicySettings", "deleteOnStorageLeaseExpiration")); + assertTrue(equal(passwordPolicy.getInvalidLoginsBeforeLockout(), invalidLoginsBeforeLockout+1), + String.format(OBJ_FIELD_UPDATABLE, + "PasswordPolicySettings", "storageLeaseSeconds")); + assertTrue(equal(passwordPolicy.getAccountLockoutIntervalMinutes(), accountLockoutIntervalMinutes+1), + String.format(OBJ_FIELD_UPDATABLE, + "PasswordPolicySettings", "deploymentLeaseSeconds")); + + //TODO negative tests? + + Checks.checkPasswordPolicySettings(passwordPolicy); + } finally { + passwordPolicy = passwordPolicy.toBuilder() + .accountLockoutEnabled(accountLockoutEnabled) + .invalidLoginsBeforeLockout(invalidLoginsBeforeLockout) + .accountLockoutIntervalMinutes(accountLockoutIntervalMinutes) + .build(); + + passwordPolicy = orgClient.updatePasswordPolicy( + orgRef.getHref(), passwordPolicy); + } + } + + @Test(testName = "GET /admin/org/{id}/settings/vAppLeaseSettings") + public void testGetVAppLeaseSettings() { + vAppLeaseSettings = orgClient.getVAppLeaseSettings(orgRef.getHref()); + + Checks.checkVAppLeaseSettings(vAppLeaseSettings); + } + + @Test(testName = "PUT /admin/org/{id}/settings/vAppLeaseSettings", + dependsOnMethods = { "testGetVAppLeaseSettings" }, enabled = false) // FIXME: fails with 403 forbidden + public void testUpdateVAppLeaseSettings() { + boolean deleteOnStorageLeaseExpiration = vAppLeaseSettings.deleteOnStorageLeaseExpiration(); + Integer storageLeaseSeconds = vAppLeaseSettings.getStorageLeaseSeconds(); + Integer deploymentLeaseSeconds = vAppLeaseSettings.getDeploymentLeaseSeconds(); + + try { + newVAppLeaseSettings = vAppLeaseSettings.toBuilder() + .deleteOnStorageLeaseExpiration(!deleteOnStorageLeaseExpiration) + .storageLeaseSeconds(storageLeaseSeconds+1) + .deploymentLeaseSeconds(deploymentLeaseSeconds+1) + .build(); + + vAppLeaseSettings = orgClient.updateVAppLeaseSettings( + orgRef.getHref(), newVAppLeaseSettings); + + assertTrue(equal(vAppLeaseSettings.deleteOnStorageLeaseExpiration(), !deleteOnStorageLeaseExpiration), + String.format(OBJ_FIELD_UPDATABLE, + "vAppLeaseSettings", "deleteOnStorageLeaseExpiration")); + assertTrue(equal(vAppLeaseSettings.getStorageLeaseSeconds(), storageLeaseSeconds+1), + String.format(OBJ_FIELD_UPDATABLE, + "vAppLeaseSettings", "storageLeaseSeconds")); + assertTrue(equal(vAppLeaseSettings.getDeploymentLeaseSeconds(), deploymentLeaseSeconds+1), + String.format(OBJ_FIELD_UPDATABLE, + "vAppLeaseSettings", "deploymentLeaseSeconds")); + + //TODO negative tests? + + Checks.checkVAppLeaseSettings(vAppLeaseSettings); + } finally { + vAppLeaseSettings = vAppLeaseSettings.toBuilder() + .deleteOnStorageLeaseExpiration(deleteOnStorageLeaseExpiration) + .storageLeaseSeconds(storageLeaseSeconds) + .deploymentLeaseSeconds(deploymentLeaseSeconds) + .build(); + + vAppLeaseSettings = orgClient.updateVAppLeaseSettings( + orgRef.getHref(), vAppLeaseSettings); + } + } -// GET /admin/org/{id}/settings/email - -// PUT /admin/org/{id}/settings/email - -// GET /admin/org/{id}/settings/general - -// PUT /admin/org/{id}/settings/general - -// GET /admin/org/{id}/settings/ldap - -// GET /admin/org/{id}/settings/passwordPolicy - -// PUT /admin/org/{id}/settings/passwordPolicy - -// GET /admin/org/{id}/settings/vAppLeaseSettings - -// PUT /admin/org/{id}/settings/vAppLeaseSettings - -// GET /admin/org/{id}/settings/vAppTemplateLeaseSettings - -// PUT /admin/org/{id}/settings/vAppTemplateLeaseSettings + @Test(testName = "GET /admin/org/{id}/settings/vAppTemplateLeaseSettings") + public void testGetVAppTemplateLeaseSettings() { + vAppTemplateLeaseSettings = orgClient.getVAppTemplateLeaseSettings(orgRef.getHref()); + + Checks.checkVAppTemplateLeaseSettings(vAppTemplateLeaseSettings); + } + + @Test(testName = "PUT /admin/org/{id}/settings/vAppTemplateLeaseSettings", + dependsOnMethods = { "testGetVAppTemplateLeaseSettings" }, enabled = false) // FIXME: fails with 403 forbidden + public void testUpdateVAppTemplateLeaseSettings() { + boolean deleteOnStorageLeaseExpiration = vAppTemplateLeaseSettings.deleteOnStorageLeaseExpiration(); + Integer storageLeaseSeconds = vAppTemplateLeaseSettings.getStorageLeaseSeconds(); + + try { + newVAppTemplateLeaseSettings = vAppTemplateLeaseSettings.toBuilder() + .deleteOnStorageLeaseExpiration(!deleteOnStorageLeaseExpiration) + .storageLeaseSeconds(storageLeaseSeconds+1) + .build(); + + vAppTemplateLeaseSettings = orgClient.updateVAppTemplateLeaseSettings( + orgRef.getHref(), newVAppTemplateLeaseSettings); + + assertTrue(equal(vAppTemplateLeaseSettings.deleteOnStorageLeaseExpiration(), !deleteOnStorageLeaseExpiration), + String.format(OBJ_FIELD_UPDATABLE, + "vAppTemplateLeaseSettings", "deleteOnStorageLeaseExpiration")); + assertTrue(equal(vAppTemplateLeaseSettings.getStorageLeaseSeconds(), storageLeaseSeconds+1), + String.format(OBJ_FIELD_UPDATABLE, + "vAppTemplateLeaseSettings", "storageLeaseSeconds")); + + //TODO negative tests? + + Checks.checkVAppTemplateLeaseSettings(vAppTemplateLeaseSettings); + } finally { + vAppTemplateLeaseSettings = vAppTemplateLeaseSettings.toBuilder() + .deleteOnStorageLeaseExpiration(deleteOnStorageLeaseExpiration) + .storageLeaseSeconds(storageLeaseSeconds) + .build(); + + vAppTemplateLeaseSettings = orgClient.updateVAppTemplateLeaseSettings( + orgRef.getHref(), vAppTemplateLeaseSettings); + } + } + + @Test(testName = "GET /admin/org/{id}/settings/settings", + dependsOnMethods = { "testGetGeneralSettings", + "testGetVAppLeaseSettings", + "testGetVAppTemplateLeaseSettings", + "testGetLdapSettings", + "testGetEmailSettings", + "testGetPasswordPolicy"}) + public void testGetSettings() { + settings = orgClient.getSettings(orgRef.getHref()); + + Checks.checkOrgSettings(settings); + } + + @Test(testName = "PUT /admin/org/{id}/settings/settings", + dependsOnMethods = { "testUpdateGeneralSettings", + "testUpdateVAppLeaseSettings", + "testUpdateVAppTemplateLeaseSettings", + "testUpdateEmailSettings", + "testUpdatePasswordPolicy"}, + enabled = false ) + public void testUpdateSettings() { + try { + newSettings = settings.toBuilder() + .generalSettings(newGeneralSettings) + .vAppLeaseSettings(newVAppLeaseSettings) + .vAppTemplateLeaseSettings(newVAppTemplateLeaseSettings) + .ldapSettings(newLdapSettings) + .emailSettings(newEmailSettings) + .passwordPolicy(newPasswordPolicy) + .build(); + + settings = orgClient.updateSettings( + orgRef.getHref(), newSettings); + + assertTrue(equal(settings.getGeneralSettings(), newGeneralSettings), + String.format(OBJ_FIELD_UPDATABLE, + "orgSettings", "generalSettings")); + assertTrue(equal(settings.getVAppLeaseSettings(), newVAppLeaseSettings), + String.format(OBJ_FIELD_UPDATABLE, + "orgSettings", "vAppLeaseSettings")); + assertTrue(equal(settings.getVAppTemplateLeaseSettings(), newVAppTemplateLeaseSettings), + String.format(OBJ_FIELD_UPDATABLE, + "orgSettings", "vAppTemplateLeaseSettings")); + assertTrue(equal(settings.getLdapSettings(), newLdapSettings), + String.format(OBJ_FIELD_UPDATABLE, + "orgSettings", "ldapSettings")); + assertTrue(equal(settings.getEmailSettings(), newEmailSettings), + String.format(OBJ_FIELD_UPDATABLE, + "orgSettings", "emailSettings")); + assertTrue(equal(settings.getPasswordPolicy(), newPasswordPolicy), + String.format(OBJ_FIELD_UPDATABLE, + "orgSettings", "passwordPolicy")); + + //TODO negative tests? + + Checks.checkOrgSettings(settings); + } finally { + settings = settings.toBuilder() + .generalSettings(generalSettings) + .vAppLeaseSettings(vAppLeaseSettings) + .vAppTemplateLeaseSettings(vAppTemplateLeaseSettings) + .ldapSettings(ldapSettings) + .emailSettings(emailSettings) + .passwordPolicy(passwordPolicy) + .build(); + + settings = orgClient.updateSettings( + orgRef.getHref(), settings); + } + } } diff --git a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/CatalogClientLiveTest.java b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/CatalogClientLiveTest.java index 6f618003f9..e0ffd434de 100644 --- a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/CatalogClientLiveTest.java +++ b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/CatalogClientLiveTest.java @@ -79,6 +79,7 @@ public class CatalogClientLiveTest extends BaseVCloudDirectorClientLiveTest { private CatalogItem newCatalogItem; private Metadata catalogMetadata; + @Override @BeforeClass(inheritGroups = true) public void setupRequiredClients() { catalogClient = context.getApi().getCatalogClient(); diff --git a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/GroupClientExpectTest.java b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/GroupClientExpectTest.java index c5e5e95464..b61708eace 100644 --- a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/GroupClientExpectTest.java +++ b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/GroupClientExpectTest.java @@ -56,7 +56,7 @@ public class GroupClientExpectTest extends BaseVCloudDirectorRestClientExpectTes Group expected = group(); - assertEquals(client.getGroupClient().getGroup(groupRef.getURI()), expected); + assertEquals(client.getGroupClient().getGroup(groupRef.getHref()), expected); } public static final Group group() { @@ -79,7 +79,7 @@ public class GroupClientExpectTest extends BaseVCloudDirectorRestClientExpectTes Group expected = updateGroup(); - assertEquals(client.getGroupClient().updateGroup(groupRef.getURI(), expected), expected); + assertEquals(client.getGroupClient().updateGroup(groupRef.getHref(), expected), expected); } public static Group updateGroup() { @@ -96,6 +96,6 @@ public class GroupClientExpectTest extends BaseVCloudDirectorRestClientExpectTes new VcloudHttpResponsePrimer() .httpResponseBuilder().statusCode(204).build()); - client.getAdminCatalogClient().deleteCatalog(groupRef.getURI()); + client.getAdminCatalogClient().deleteCatalog(groupRef.getHref()); } } diff --git a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/GroupClientLiveTest.java b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/GroupClientLiveTest.java index 6a618fc4d9..24b16db9a2 100644 --- a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/GroupClientLiveTest.java +++ b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/GroupClientLiveTest.java @@ -18,25 +18,22 @@ */ package org.jclouds.vcloud.director.v1_5.features; -import static org.jclouds.vcloud.director.v1_5.VCloudDirectorLiveTestConstants.REF_REQ_LIVE; -import static org.testng.Assert.assertNotNull; - -import static org.jclouds.vcloud.director.v1_5.VCloudDirectorLiveTestConstants.OBJ_DEL; -import static org.testng.Assert.assertEquals; -import static org.testng.Assert.assertNull; -import static org.testng.Assert.fail; import static com.google.common.base.Objects.equal; +import static org.jclouds.vcloud.director.v1_5.VCloudDirectorLiveTestConstants.OBJ_DEL; import static org.jclouds.vcloud.director.v1_5.VCloudDirectorLiveTestConstants.OBJ_FIELD_UPDATABLE; +import static org.jclouds.vcloud.director.v1_5.VCloudDirectorLiveTestConstants.REF_REQ_LIVE; +import static org.testng.Assert.assertEquals; +import static org.testng.Assert.assertNotNull; +import static org.testng.Assert.assertNull; import static org.testng.Assert.assertTrue; - +import static org.testng.Assert.fail; import java.net.URI; -import org.jclouds.vcloud.director.v1_5.domain.Checks; import org.jclouds.vcloud.director.v1_5.VCloudDirectorException; +import org.jclouds.vcloud.director.v1_5.domain.Checks; import org.jclouds.vcloud.director.v1_5.domain.Error; import org.jclouds.vcloud.director.v1_5.domain.Group; -import org.jclouds.vcloud.director.v1_5.domain.Owner; import org.jclouds.vcloud.director.v1_5.domain.Reference; import org.jclouds.vcloud.director.v1_5.domain.ReferenceType; import org.jclouds.vcloud.director.v1_5.internal.BaseVCloudDirectorClientLiveTest; @@ -65,6 +62,7 @@ public class GroupClientLiveTest extends BaseVCloudDirectorClientLiveTest { private ReferenceType groupRef; private Group group; + @Override @BeforeClass(inheritGroups = true) public void setupRequiredClients() { groupClient = context.getApi().getGroupClient(); @@ -76,7 +74,7 @@ public class GroupClientLiveTest extends BaseVCloudDirectorClientLiveTest { @Test(testName = "GET /admin/group/{id}", enabled = false) public void testGetGroup() { assertNotNull(groupRef, String.format(REF_REQ_LIVE, "Group")); - group = groupClient.getGroup(groupRef.getURI()); + group = groupClient.getGroup(groupRef.getHref()); Checks.checkGroup(group); } @@ -95,7 +93,7 @@ public class GroupClientLiveTest extends BaseVCloudDirectorClientLiveTest { .description(newDescription) .build(); - group = groupClient.updateGroup(group.getURI(), group); + group = groupClient.updateGroup(group.getHref(), group); assertTrue(equal(group.getName(), newName), String.format(OBJ_FIELD_UPDATABLE, GROUP, "name")); assertTrue(equal(group.getDescription(), newDescription), @@ -110,13 +108,13 @@ public class GroupClientLiveTest extends BaseVCloudDirectorClientLiveTest { .description(oldDescription) .build(); - group = groupClient.updateGroup(group.getURI(), group); + group = groupClient.updateGroup(group.getHref(), group); } } @Test(testName = "DELETE /admin/group/{id}", enabled = false ) public void testDeleteCatalog() { - groupClient.deleteGroup(groupRef.getURI()); + groupClient.deleteGroup(groupRef.getHref()); Error expected = Error.builder() .message("???") @@ -125,7 +123,7 @@ public class GroupClientLiveTest extends BaseVCloudDirectorClientLiveTest { .build(); try { - group = groupClient.getGroup(groupRef.getURI()); + group = groupClient.getGroup(groupRef.getHref()); fail("Should give HTTP 403 error"); } catch (VCloudDirectorException vde) { assertEquals(vde.getError(), expected); diff --git a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/MediaClientExpectTest.java b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/MediaClientExpectTest.java index 00d2f18ee4..301dbd7050 100644 --- a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/MediaClientExpectTest.java +++ b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/MediaClientExpectTest.java @@ -26,11 +26,23 @@ import java.net.URI; import org.jclouds.vcloud.director.v1_5.VCloudDirectorClient; import org.jclouds.vcloud.director.v1_5.VCloudDirectorException; import org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType; -import org.jclouds.vcloud.director.v1_5.domain.*; +import org.jclouds.vcloud.director.v1_5.domain.CloneMediaParams; import org.jclouds.vcloud.director.v1_5.domain.Error; +import org.jclouds.vcloud.director.v1_5.domain.File; +import org.jclouds.vcloud.director.v1_5.domain.FilesList; +import org.jclouds.vcloud.director.v1_5.domain.Link; +import org.jclouds.vcloud.director.v1_5.domain.Media; +import org.jclouds.vcloud.director.v1_5.domain.Metadata; +import org.jclouds.vcloud.director.v1_5.domain.MetadataEntry; +import org.jclouds.vcloud.director.v1_5.domain.MetadataValue; +import org.jclouds.vcloud.director.v1_5.domain.Owner; +import org.jclouds.vcloud.director.v1_5.domain.Reference; +import org.jclouds.vcloud.director.v1_5.domain.Task; import org.jclouds.vcloud.director.v1_5.internal.BaseVCloudDirectorRestClientExpectTest; import org.testng.annotations.Test; +import com.google.common.collect.ImmutableSet; + /** * Allows us to test a client via its side effects. * @@ -41,7 +53,7 @@ public class MediaClientExpectTest extends BaseVCloudDirectorRestClientExpectTes @Test public void testCreateMedia() { - URI vdcUri = URI.create(endpoint + "/vdc/e9cd3387-ac57-4d27-a481-9bee75e0690f"); + URI uploadLink = URI.create(endpoint + "/vdc/e9cd3387-ac57-4d27-a481-9bee75e0690f/media"); VCloudDirectorClient client = requestsSendResponses(loginRequest, sessionResponse, new VcloudHttpRequestPrimer() @@ -62,12 +74,12 @@ public class MediaClientExpectTest extends BaseVCloudDirectorRestClientExpectTes .build(); Media expected = createMedia(); - assertEquals(client.getVdcClient().createMedia(vdcUri, source), expected); + assertEquals(client.getMediaClient().createMedia(uploadLink, source), expected); } @Test public void testCloneMedia() { - URI vdcUri = URI.create(endpoint + "/vdc/e9cd3387-ac57-4d27-a481-9bee75e0690f"); + URI cloneUri = URI.create(endpoint + "/vdc/e9cd3387-ac57-4d27-a481-9bee75e0690f/action/cloneMedia"); VCloudDirectorClient client = requestsSendResponses(loginRequest, sessionResponse, new VcloudHttpRequestPrimer() @@ -92,7 +104,7 @@ public class MediaClientExpectTest extends BaseVCloudDirectorRestClientExpectTes .build(); Media expected = cloneMedia(); - assertEquals(client.getVdcClient().cloneMedia(vdcUri, params), expected); + assertEquals(client.getMediaClient().cloneMedia(cloneUri, params), expected); } @Test @@ -351,7 +363,7 @@ public class MediaClientExpectTest extends BaseVCloudDirectorRestClientExpectTes assertEquals(client.getMediaClient().getOwner(mediaUri), expected); } - private static Media createMedia() { + static Media createMedia() { return Media.builder() .size(0) .imageType("iso") @@ -385,7 +397,7 @@ public class MediaClientExpectTest extends BaseVCloudDirectorRestClientExpectTes .build(); } - private static Media cloneMedia() { + static Media cloneMedia() { return Media.builder() .size(175163392) .imageType("iso") @@ -404,8 +416,8 @@ public class MediaClientExpectTest extends BaseVCloudDirectorRestClientExpectTes .href(URI.create("https://mycloud.greenhousedata.com/api/media/a6b023f2-7f90-4e89-a24d-56e0eba83a5a")) .build()) .description("copied by testCloneMedia()") - .tasksInProgress(TasksInProgress.builder() - .task(Task.builder() + .tasks(ImmutableSet.builder() + .add(Task.builder() .status("running") .startTime(dateService.iso8601DateParse("2012-03-02T04:58:48.754-07:00")) .operationName("vdcCopyMedia") diff --git a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/MediaClientLiveTest.java b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/MediaClientLiveTest.java index 732917d92f..44beae7b6f 100644 --- a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/MediaClientLiveTest.java +++ b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/MediaClientLiveTest.java @@ -19,6 +19,10 @@ package org.jclouds.vcloud.director.v1_5.features; import static com.google.common.base.Objects.equal; +import static com.google.common.base.Predicates.and; +import static com.google.common.collect.Iterables.find; +import static com.google.common.collect.Iterables.getFirst; +import static com.google.common.collect.Iterables.isEmpty; import static org.jclouds.vcloud.director.v1_5.VCloudDirectorLiveTestConstants.GETTER_RETURNS_SAME_OBJ; import static org.jclouds.vcloud.director.v1_5.VCloudDirectorLiveTestConstants.OBJ_DEL; import static org.jclouds.vcloud.director.v1_5.VCloudDirectorLiveTestConstants.OBJ_FIELD_ATTRB_DEL; @@ -31,6 +35,8 @@ import static org.jclouds.vcloud.director.v1_5.VCloudDirectorLiveTestConstants.O import static org.jclouds.vcloud.director.v1_5.VCloudDirectorLiveTestConstants.OBJ_REQ_LIVE; import static org.jclouds.vcloud.director.v1_5.VCloudDirectorLiveTestConstants.REF_REQ_LIVE; import static org.jclouds.vcloud.director.v1_5.VCloudDirectorLiveTestConstants.TASK_COMPLETE_TIMELY; +import static org.jclouds.vcloud.director.v1_5.predicates.LinkPredicates.relEquals; +import static org.jclouds.vcloud.director.v1_5.predicates.LinkPredicates.typeEquals; import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertFalse; import static org.testng.Assert.assertNotNull; @@ -41,6 +47,7 @@ import static org.testng.Assert.fail; import java.net.URISyntaxException; import java.util.Set; +import org.jclouds.io.Payloads; import org.jclouds.vcloud.director.v1_5.VCloudDirectorException; import org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType; import org.jclouds.vcloud.director.v1_5.domain.Checks; @@ -55,6 +62,7 @@ import org.jclouds.vcloud.director.v1_5.domain.MetadataValue; import org.jclouds.vcloud.director.v1_5.domain.Owner; import org.jclouds.vcloud.director.v1_5.domain.Reference; import org.jclouds.vcloud.director.v1_5.domain.Task; +import org.jclouds.vcloud.director.v1_5.domain.Vdc; import org.jclouds.vcloud.director.v1_5.internal.BaseVCloudDirectorClientLiveTest; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; @@ -79,8 +87,8 @@ public class MediaClientLiveTest extends BaseVCloudDirectorClientLiveTest { protected VdcClient vdcClient; protected MediaClient mediaClient; - @BeforeClass(inheritGroups = true) @Override + @BeforeClass(inheritGroups = true) public void setupRequiredClients() { vdcClient = context.getApi().getVdcClient(); mediaClient = context.getApi().getMediaClient(); @@ -95,28 +103,31 @@ public class MediaClientLiveTest extends BaseVCloudDirectorClientLiveTest { private MetadataValue metadataValue; private String metadataEntryValue = "value"; - @Test(testName = "POST /vdc/{id}/media", enabled = false) + @Test(testName = "POST /vdc/{id}/media") public void testCreateMedia() throws URISyntaxException { assertNotNull(vdcURI, String.format(REF_REQ_LIVE, VDC)); - assertNotNull(vdcClient.getVdc(vdcURI), String.format(OBJ_REQ_LIVE, VDC)); + Vdc vdc = vdcClient.getVdc(vdcURI); + assertNotNull(vdc, String.format(OBJ_REQ_LIVE, VDC)); + Link addMedia = find(vdc.getLinks(), and(relEquals("add"), typeEquals(VCloudDirectorMediaType.MEDIA))); - java.io.File sourceFile = new java.io.File(getClass().getResource("/media/test.iso").toURI()); + // TODO: generate an iso + byte[] iso = new byte[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 }; Media sourceMedia = Media.builder() .type(VCloudDirectorMediaType.MEDIA) .name("Test media 1") - .size(sourceFile.length()) + .size(iso.length) .imageType(Media.ImageType.ISO) .description("Test media generated by testCreateMedia()") .build(); - media = vdcClient.createMedia(vdcURI, sourceMedia); + media = mediaClient.createMedia(addMedia.getHref(), sourceMedia); Checks.checkMediaFor(MEDIA, media); assertNotNull(media.getFiles(), String.format(OBJ_FIELD_REQ, MEDIA, "files")); assertTrue(media.getFiles().getFiles().size() == 1, String.format(OBJ_FIELD_EQ, MEDIA, "files.size()", "1", media.getFiles().getFiles().size())); - File uploadFile = Iterables.getFirst(media.getFiles().getFiles(), null); + File uploadFile = getFirst(media.getFiles().getFiles(), null); assertNotNull(uploadFile, String.format(OBJ_FIELD_REQ, MEDIA, "files.first")); assertTrue(equal(uploadFile.getSize(), sourceMedia.getSize()), String.format(OBJ_FIELD_EQ, MEDIA, "uploadFile.size()", sourceMedia.getSize(), uploadFile.getSize())); @@ -125,14 +136,24 @@ public class MediaClientLiveTest extends BaseVCloudDirectorClientLiveTest { assertNotNull(links, String.format(OBJ_FIELD_REQ, MEDIA, "uploadFile.links")); assertTrue(links.size() == 1, String.format(OBJ_FIELD_EQ, MEDIA, "uploadfile.links.size()", "1", links.size())); - Link uploadLink = Iterables.getFirst(links, null); + Link uploadLink = getFirst(links, null); assertTrue(equal(uploadLink.getRel(), Link.Rel.UPLOAD_DEFAULT), String.format(OBJ_FIELD_REQ, MEDIA, "uploadFile.links.first")); + + context.getApi().getUploadClient().upload(uploadLink.getHref(), Payloads.newByteArrayPayload(iso)); - fail(); //TODO upload file and assert it succeeds - context.getApi().getUploadClient().uploadFile(uploadLink.getHref(), sourceFile); + media = mediaClient.getMedia(media.getHref()); + + Task task = Iterables.getOnlyElement(media.getTasks()); + + assertEquals(task.getStatus(), "running"); + + File file = Iterables.getOnlyElement(media.getFiles().getFiles()); + assertEquals(file.getSize(), new Long(iso.length)); + assertEquals(file.getBytesTransferred(), new Long(iso.length)); + } - @Test(testName = "GET /media/{id}", dependsOnMethods = { "testCreateMedia" }, enabled = false) + @Test(testName = "GET /media/{id}", dependsOnMethods = { "testCreateMedia" }) public void testGetMedia() { media = mediaClient.getMedia(media.getHref()); assertNotNull(media, String.format(OBJ_REQ_LIVE, MEDIA)); @@ -145,7 +166,7 @@ public class MediaClientLiveTest extends BaseVCloudDirectorClientLiveTest { } @Test(testName = "GET /media/{id}/owner", - dependsOnMethods = { "testGetMedia" }, enabled = false) + dependsOnMethods = { "testGetMedia" }) public void testGetMediaOwner() { Owner directOwner = mediaClient.getOwner(media.getHref()); assertEquals(owner, directOwner, String.format(GETTER_RETURNS_SAME_OBJ, @@ -160,7 +181,7 @@ public class MediaClientLiveTest extends BaseVCloudDirectorClientLiveTest { } @Test(testName = "POST /vdc/{id}/action/cloneMedia", - dependsOnMethods = { "testGetMediaOwner" }, enabled = false) + dependsOnMethods = { "testGetMediaOwner" }) public void testCloneMedia() { oldMedia = media; media = vdcClient.cloneMedia(vdcURI, CloneMediaParams.builder() @@ -171,8 +192,8 @@ public class MediaClientLiveTest extends BaseVCloudDirectorClientLiveTest { Checks.checkMediaFor(VDC, media); - if (media.getTasksInProgress() != null) { - Task copyTask = Iterables.getFirst(media.getTasksInProgress().getTasks(), null); + if (media.getTasks() != null) { + Task copyTask = getFirst(media.getTasks(), null); if (copyTask != null) { Checks.checkTask(copyTask); assertTrue(retryTaskSuccess.apply(copyTask), String.format(TASK_COMPLETE_TIMELY, "copyTask")); @@ -195,8 +216,8 @@ public class MediaClientLiveTest extends BaseVCloudDirectorClientLiveTest { Checks.checkMediaFor(VDC, media); - if (media.getTasksInProgress() != null) { - Task copyTask = Iterables.getFirst(media.getTasksInProgress().getTasks(), null); + if (media.getTasks() != null) { + Task copyTask = getFirst(media.getTasks(), null); if (copyTask != null) { Checks.checkTask(copyTask); assertTrue(retryTaskSuccess.apply(copyTask), String.format(TASK_COMPLETE_TIMELY, "copyTask")); @@ -210,7 +231,7 @@ public class MediaClientLiveTest extends BaseVCloudDirectorClientLiveTest { } @Test(testName = "PUT /media/{id}", - dependsOnMethods = { "testCloneMedia" }, enabled = false) + dependsOnMethods = { "testCloneMedia" }) public void testSetMedia() { String oldName = media.getName(); String newName = "new "+oldName; @@ -240,18 +261,18 @@ public class MediaClientLiveTest extends BaseVCloudDirectorClientLiveTest { } @Test(testName = "GET /media/{id}/metadata", - dependsOnMethods = { "testGetMedia" }, enabled = false) + dependsOnMethods = { "testGetMedia" }) public void testGetMetadata() { metadata = mediaClient.getMetadataClient().getMetadata(media.getHref()); // required for testing - assertFalse(Iterables.isEmpty(metadata.getMetadataEntries()), + assertFalse(isEmpty(metadata.getMetadataEntries()), String.format(OBJ_FIELD_REQ_LIVE, MEDIA, "metadata.entries")); Checks.checkMetadataFor(MEDIA, metadata); } @Test(testName = "POST /media/{id}/metadata", - dependsOnMethods = { "testGetMetadata" }, enabled = false) + dependsOnMethods = { "testGetMetadata" }) public void testMergeMetadata() { // test new Set inputEntries = ImmutableSet.of(MetadataEntry.builder().entry("testKey", "testValue").build()); @@ -304,14 +325,14 @@ public class MediaClientLiveTest extends BaseVCloudDirectorClientLiveTest { } @Test(testName = "GET /media/{id}/metadata/{key}", - dependsOnMethods = { "testMergeMetadata" }, enabled = false) + dependsOnMethods = { "testMergeMetadata" }) public void testGetMetadataValue() { metadataValue = mediaClient.getMetadataClient().getMetadataValue(media.getHref(), "key"); Checks.checkMetadataValueFor(MEDIA, metadataValue); } @Test(testName = "PUT /media/{id}/metadata/{key}", - dependsOnMethods = { "testGetMetadataValue" }, enabled = false) + dependsOnMethods = { "testGetMetadataValue" }) public void testSetMetadataValue() { metadataEntryValue = "newValue"; MetadataValue newValue = MetadataValue.builder().value(metadataEntryValue).build(); @@ -325,7 +346,7 @@ public class MediaClientLiveTest extends BaseVCloudDirectorClientLiveTest { } @Test(testName = "DELETE /media/{id}/metadata/{key}", - dependsOnMethods = { "testSetMetadataValue" }, enabled = false ) + dependsOnMethods = { "testSetMetadataValue" } ) public void testDeleteMetadata() { Task deleteMetadataEntry = mediaClient.getMetadataClient().deleteMetadataEntry(media.getHref(), "testKey"); Checks.checkTask(deleteMetadataEntry); @@ -362,7 +383,7 @@ public class MediaClientLiveTest extends BaseVCloudDirectorClientLiveTest { } @Test(testName = "DELETE /media/{id}", - dependsOnMethods = { "testDeleteMetadata" }, enabled = false ) + dependsOnMethods = { "testDeleteMetadata" } ) public void testDeleteMedia() { Task deleteMedia = mediaClient.deleteMedia(media.getHref()); Checks.checkTask(deleteMedia); diff --git a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/NetworkClientExpectTest.java b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/NetworkClientExpectTest.java index a402151636..eb6c86fa72 100644 --- a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/NetworkClientExpectTest.java +++ b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/NetworkClientExpectTest.java @@ -27,7 +27,16 @@ import org.jclouds.vcloud.director.v1_5.VCloudDirectorClient; import org.jclouds.vcloud.director.v1_5.VCloudDirectorException; import org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType; import org.jclouds.vcloud.director.v1_5.domain.Error; -import org.jclouds.vcloud.director.v1_5.domain.*; +import org.jclouds.vcloud.director.v1_5.domain.IpAddresses; +import org.jclouds.vcloud.director.v1_5.domain.IpRange; +import org.jclouds.vcloud.director.v1_5.domain.IpRanges; +import org.jclouds.vcloud.director.v1_5.domain.IpScope; +import org.jclouds.vcloud.director.v1_5.domain.Link; +import org.jclouds.vcloud.director.v1_5.domain.Metadata; +import org.jclouds.vcloud.director.v1_5.domain.MetadataEntry; +import org.jclouds.vcloud.director.v1_5.domain.NetworkConfiguration; +import org.jclouds.vcloud.director.v1_5.domain.OrgNetwork; +import org.jclouds.vcloud.director.v1_5.domain.SyslogServerSettings; import org.jclouds.vcloud.director.v1_5.internal.BaseVCloudDirectorRestClientExpectTest; import org.testng.annotations.Test; diff --git a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/NetworkClientLiveTest.java b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/NetworkClientLiveTest.java index 460e9c43a6..6b36eefc91 100644 --- a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/NetworkClientLiveTest.java +++ b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/NetworkClientLiveTest.java @@ -57,8 +57,8 @@ public class NetworkClientLiveTest extends BaseVCloudDirectorClientLiveTest { */ protected NetworkClient networkClient; - @BeforeClass(inheritGroups = true) @Override + @BeforeClass(inheritGroups = true) public void setupRequiredClients() { networkClient = context.getApi().getNetworkClient(); } diff --git a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/OrgClientLiveTest.java b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/OrgClientLiveTest.java index 9b87ad8ed6..49c0ca68cc 100644 --- a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/OrgClientLiveTest.java +++ b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/OrgClientLiveTest.java @@ -57,8 +57,8 @@ public class OrgClientLiveTest extends BaseVCloudDirectorClientLiveTest { private OrgClient orgClient; - @BeforeClass(inheritGroups = true) @Override + @BeforeClass(inheritGroups = true) public void setupRequiredClients() { orgClient = context.getApi().getOrgClient(); } @@ -92,7 +92,7 @@ public class OrgClientLiveTest extends BaseVCloudDirectorClientLiveTest { Reference orgRef = Iterables.getFirst(orgList.getOrgs(), null); assertNotNull(orgRef); - orgURI = orgRef.getURI(); + orgURI = orgRef.getHref(); // Call the method being tested org = orgClient.getOrg(orgURI); diff --git a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/QueryClientLiveTest.java b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/QueryClientLiveTest.java index a1ded707e8..acfa0fc5bc 100644 --- a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/QueryClientLiveTest.java +++ b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/QueryClientLiveTest.java @@ -42,8 +42,8 @@ public class QueryClientLiveTest extends BaseVCloudDirectorClientLiveTest { private CatalogClient catalogClient; private QueryClient queryClient; - @BeforeClass(inheritGroups = true) @Override + @BeforeClass(inheritGroups = true) public void setupRequiredClients() { catalogClient = context.getApi().getCatalogClient(); queryClient = context.getApi().getQueryClient(); diff --git a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/TaskClientExpectTest.java b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/TaskClientExpectTest.java index 77ac6d25e6..327d588f39 100644 --- a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/TaskClientExpectTest.java +++ b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/TaskClientExpectTest.java @@ -81,11 +81,11 @@ public class TaskClientExpectTest extends BaseVCloudDirectorRestClientExpectTest .name("Tasks Lists") .type("application/vnd.vmware.vcloud.tasksList+xml") .href(URI.create("https://vcloudbeta.bluelock.com/api/tasksList/6f312e42-cd2b-488d-a2bb-97519cd57ed0")) - .task(taskOne()) .task(taskTwo()) + .task(taskOne()) .build(); - assertEquals(client.getTaskClient().getTaskList(URI.create("https://vcloudbeta.bluelock.com/api/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0")), expected); + assertEquals(client.getTaskClient().getTaskList(URI.create("https://vcloudbeta.bluelock.com/api/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0")).toString(), expected.toString()); } @Test @@ -198,6 +198,7 @@ public class TaskClientExpectTest extends BaseVCloudDirectorRestClientExpectTest URI taskUri = URI.create(endpoint + "/task/5fcd2af3-d0ec-45ce-9451-8c585a2c766b"); + //TODO: incorrect relationship, as task should not have a nested task container!! Task expected = taskOne(); assertEquals(client.getTaskClient().getTask(taskUri), expected); diff --git a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/TaskClientLiveTest.java b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/TaskClientLiveTest.java index f57b01c187..fc64909b8a 100644 --- a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/TaskClientLiveTest.java +++ b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/TaskClientLiveTest.java @@ -50,8 +50,8 @@ public class TaskClientLiveTest extends BaseVCloudDirectorClientLiveTest { private OrgClient orgClient; private TaskClient taskClient; - @BeforeClass(inheritGroups = true) @Override + @BeforeClass(inheritGroups = true) public void setupRequiredClients() { orgClient = context.getApi().getOrgClient(); taskClient = context.getApi().getTaskClient(); @@ -80,9 +80,9 @@ public class TaskClientLiveTest extends BaseVCloudDirectorClientLiveTest { // NOTE The environment MUST have ... // Check required elements and attributes - assertFalse(Iterables.isEmpty(taskList.getTasks()), String.format(NOT_EMPTY_OBJECT_FMT, "Task", "TaskList")); + assertFalse(Iterables.isEmpty(taskList), String.format(NOT_EMPTY_OBJECT_FMT, "Task", "TaskList")); - for (Task task : taskList.getTasks()) { + for (Task task : taskList) { checkTask(task); } } @@ -91,8 +91,8 @@ public class TaskClientLiveTest extends BaseVCloudDirectorClientLiveTest { public void testGetTask() { //TODO: upload media or something so you can get a fresh cancellable task? - Task taskRef = Iterables.getFirst(taskList.getTasks(), null); - taskURI = taskRef.getURI(); + Task taskRef = Iterables.getFirst(taskList, null); + taskURI = taskRef.getHref(); // Call the method being tested task = taskClient.getTask(taskURI); diff --git a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/UploadClientLiveTest.java b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/UploadClientLiveTest.java index 6b4d25cd64..5ac87998b4 100644 --- a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/UploadClientLiveTest.java +++ b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/UploadClientLiveTest.java @@ -37,8 +37,8 @@ public class UploadClientLiveTest extends BaseVCloudDirectorClientLiveTest { */ protected UploadClient uploadClient; - @BeforeClass(inheritGroups = true) @Override + @BeforeClass(inheritGroups = true) public void setupRequiredClients() { uploadClient = context.getApi().getUploadClient(); } diff --git a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/VAppTemplateClientExpectTest.java b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/VAppTemplateClientExpectTest.java index 8c34a00ed2..0de912bf4d 100644 --- a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/VAppTemplateClientExpectTest.java +++ b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/VAppTemplateClientExpectTest.java @@ -18,7 +18,16 @@ */ package org.jclouds.vcloud.director.v1_5.features; -import static org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType.*; +import static org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType.CUSTOMIZATION_SECTION; +import static org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType.ERROR; +import static org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType.GUEST_CUSTOMIZATION_SECTION; +import static org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType.LEASE_SETTINGS_SECTION; +import static org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType.METADATA; +import static org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType.METADATA_ENTRY; +import static org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType.NETWORK_CONFIG_SECTION; +import static org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType.RELOCATE_TEMPLATE; +import static org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType.TASK; +import static org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType.VAPP_TEMPLATE; import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertNotNull; @@ -29,7 +38,31 @@ import java.util.Locale; import java.util.TimeZone; import org.jclouds.vcloud.director.v1_5.VCloudDirectorException; -import org.jclouds.vcloud.director.v1_5.domain.*; +import org.jclouds.vcloud.director.v1_5.domain.CustomizationSection; +import org.jclouds.vcloud.director.v1_5.domain.FirewallRule; +import org.jclouds.vcloud.director.v1_5.domain.FirewallRuleProtocols; +import org.jclouds.vcloud.director.v1_5.domain.FirewallService; +import org.jclouds.vcloud.director.v1_5.domain.GuestCustomizationSection; +import org.jclouds.vcloud.director.v1_5.domain.IpRange; +import org.jclouds.vcloud.director.v1_5.domain.IpRanges; +import org.jclouds.vcloud.director.v1_5.domain.IpScope; +import org.jclouds.vcloud.director.v1_5.domain.LeaseSettingsSection; +import org.jclouds.vcloud.director.v1_5.domain.Link; +import org.jclouds.vcloud.director.v1_5.domain.Metadata; +import org.jclouds.vcloud.director.v1_5.domain.MetadataEntry; +import org.jclouds.vcloud.director.v1_5.domain.MetadataValue; +import org.jclouds.vcloud.director.v1_5.domain.NatOneToOneVmRule; +import org.jclouds.vcloud.director.v1_5.domain.NatRule; +import org.jclouds.vcloud.director.v1_5.domain.NatService; +import org.jclouds.vcloud.director.v1_5.domain.NetworkConfigSection; +import org.jclouds.vcloud.director.v1_5.domain.NetworkConfiguration; +import org.jclouds.vcloud.director.v1_5.domain.NetworkFeatures; +import org.jclouds.vcloud.director.v1_5.domain.Owner; +import org.jclouds.vcloud.director.v1_5.domain.Reference; +import org.jclouds.vcloud.director.v1_5.domain.RelocateParams; +import org.jclouds.vcloud.director.v1_5.domain.Task; +import org.jclouds.vcloud.director.v1_5.domain.VAppNetworkConfiguration; +import org.jclouds.vcloud.director.v1_5.domain.VAppTemplate; import org.jclouds.vcloud.director.v1_5.internal.BaseVCloudDirectorRestClientExpectTest; import org.testng.annotations.Test; diff --git a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/VdcClientExpectTest.java b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/VdcClientExpectTest.java index 5dee93c46e..7421e8f9cd 100644 --- a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/VdcClientExpectTest.java +++ b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/VdcClientExpectTest.java @@ -26,8 +26,28 @@ import java.net.URI; import org.jclouds.vcloud.director.v1_5.VCloudDirectorClient; import org.jclouds.vcloud.director.v1_5.VCloudDirectorException; import org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType; -import org.jclouds.vcloud.director.v1_5.domain.*; +import org.jclouds.vcloud.director.v1_5.domain.AvailableNetworks; +import org.jclouds.vcloud.director.v1_5.domain.Capabilities; +import org.jclouds.vcloud.director.v1_5.domain.CapacityWithUsage; +import org.jclouds.vcloud.director.v1_5.domain.CaptureVAppParams; +import org.jclouds.vcloud.director.v1_5.domain.CloneMediaParams; +import org.jclouds.vcloud.director.v1_5.domain.CloneVAppParams; +import org.jclouds.vcloud.director.v1_5.domain.CloneVAppTemplateParams; +import org.jclouds.vcloud.director.v1_5.domain.ComposeVAppParams; +import org.jclouds.vcloud.director.v1_5.domain.ComputeCapacity; import org.jclouds.vcloud.director.v1_5.domain.Error; +import org.jclouds.vcloud.director.v1_5.domain.InstantiateVAppTemplateParams; +import org.jclouds.vcloud.director.v1_5.domain.Link; +import org.jclouds.vcloud.director.v1_5.domain.Media; +import org.jclouds.vcloud.director.v1_5.domain.Metadata; +import org.jclouds.vcloud.director.v1_5.domain.MetadataValue; +import org.jclouds.vcloud.director.v1_5.domain.Reference; +import org.jclouds.vcloud.director.v1_5.domain.ResourceEntities; +import org.jclouds.vcloud.director.v1_5.domain.SupportedHardwareVersions; +import org.jclouds.vcloud.director.v1_5.domain.UploadVAppTemplateParams; +import org.jclouds.vcloud.director.v1_5.domain.VApp; +import org.jclouds.vcloud.director.v1_5.domain.VAppTemplate; +import org.jclouds.vcloud.director.v1_5.domain.Vdc; import org.jclouds.vcloud.director.v1_5.internal.BaseVCloudDirectorRestClientExpectTest; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; @@ -274,28 +294,62 @@ public class VdcClientExpectTest extends BaseVCloudDirectorRestClientExpectTest assertEquals(client.getVdcClient().uploadVAppTemplate(vdcURI, params), expected); } - @Test(enabled = false) + @Test public void testCreateMedia() { + URI vdcUri = URI.create(endpoint + "/vdc/e9cd3387-ac57-4d27-a481-9bee75e0690f"); + VCloudDirectorClient client = requestsSendResponses(loginRequest, sessionResponse, new VcloudHttpRequestPrimer() - .apiCommand("POST", "/vdc/e9cd3387-ac57-4d27-a481-9bee75e0690f/action/media") - .xmlFilePayload("/vdc/params/createMedia.xml", VCloudDirectorMediaType.MEDIA) - .acceptAnyMedia() + .apiCommand("POST", "/vdc/e9cd3387-ac57-4d27-a481-9bee75e0690f/media") + .acceptMedia(VCloudDirectorMediaType.MEDIA) + .xmlFilePayload("/media/createMediaSource.xml", VCloudDirectorMediaType.MEDIA) .httpRequestBuilder().build(), new VcloudHttpResponsePrimer() - .xmlFilePayload("/vdc/createMedia.xml", VCloudDirectorMediaType.MEDIA) - .httpResponseBuilder().build()); + .xmlFilePayload("/media/createMedia.xml", VCloudDirectorMediaType.MEDIA) + .httpResponseBuilder().statusCode(201).build()); - Media expected = createMedia(); - - // TODO: configure params - Media createMedia = Media.builder() - + Media source = Media.builder() + .size(0) + .imageType("iso") + .name("Test media 1") + .type("application/vnd.vmware.vcloud.media+xml") + .description("Test media generated by testCreateMedia()") .build(); + Media expected = MediaClientExpectTest.createMedia(); - assertEquals(client.getVdcClient().createMedia(vdcURI, createMedia), expected); + assertEquals(client.getVdcClient().createMedia(vdcUri, source), expected); } + + @Test + public void testCloneMedia() { + URI vdcUri = URI.create(endpoint + "/vdc/e9cd3387-ac57-4d27-a481-9bee75e0690f"); + VCloudDirectorClient client = requestsSendResponses(loginRequest, sessionResponse, + new VcloudHttpRequestPrimer() + .apiCommand("POST", "/vdc/e9cd3387-ac57-4d27-a481-9bee75e0690f/action/cloneMedia") + .acceptMedia(VCloudDirectorMediaType.MEDIA) + .xmlFilePayload("/media/cloneMediaParams.xml", VCloudDirectorMediaType.CLONE_MEDIA_PARAMS) + .httpRequestBuilder().build(), + new VcloudHttpResponsePrimer() + .xmlFilePayload("/media/cloneMedia.xml", VCloudDirectorMediaType.MEDIA) + .httpResponseBuilder().statusCode(201).build()); + + CloneMediaParams params = CloneMediaParams.builder() + .name("moved test media") + .description("moved by testCloneMedia()") + .source(Reference.builder() + .type("application/vnd.vmware.vcloud.media+xml") + .name("copied test media") + .id("urn:vcloud:media:da8361af-cccd-4103-a71c-493513c49094") + .href(URI.create("https://mycloud.greenhousedata.com/api/media/da8361af-cccd-4103-a71c-493513c49094")) + .build()) + .isSourceDelete(false) + .build(); + Media expected = MediaClientExpectTest.cloneMedia(); + + assertEquals(client.getVdcClient().cloneMedia(vdcUri, params), expected); + } + @Test(enabled = false) public void testGetMetadata() { URI vdcUri = URI.create(endpoint + "/vdc/e9cd3387-ac57-4d27-a481-9bee75e0690f"); @@ -492,11 +546,6 @@ public class VdcClientExpectTest extends BaseVCloudDirectorRestClientExpectTest return null; } - private Media createMedia() { - // TODO Auto-generated method stub - return null; - } - private Metadata metadata() { // TODO Auto-generated method stub return null; diff --git a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/VdcClientLiveTest.java b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/VdcClientLiveTest.java index 7f512a674b..7ceaf2bffe 100644 --- a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/VdcClientLiveTest.java +++ b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/VdcClientLiveTest.java @@ -61,8 +61,8 @@ public class VdcClientLiveTest extends BaseVCloudDirectorClientLiveTest { */ protected VdcClient vdcClient; - @BeforeClass(inheritGroups = true) @Override + @BeforeClass(inheritGroups = true) public void setupRequiredClients() { vdcClient = context.getApi().getVdcClient(); } diff --git a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/internal/BaseVCloudDirectorRestClientExpectTest.java b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/internal/BaseVCloudDirectorRestClientExpectTest.java index b0c8ec88ca..d6ff469840 100644 --- a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/internal/BaseVCloudDirectorRestClientExpectTest.java +++ b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/internal/BaseVCloudDirectorRestClientExpectTest.java @@ -28,7 +28,6 @@ import org.jclouds.Constants; import org.jclouds.date.DateService; import org.jclouds.http.HttpRequest; import org.jclouds.http.HttpResponse; -import org.jclouds.io.payloads.StringPayload; import org.jclouds.rest.BaseRestClientExpectTest; import org.jclouds.vcloud.director.v1_5.VCloudDirectorClient; import org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType; diff --git a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/login/SessionClientLiveTest.java b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/login/SessionClientLiveTest.java index a4005d79cf..dd71d1b8d0 100644 --- a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/login/SessionClientLiveTest.java +++ b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/login/SessionClientLiveTest.java @@ -31,9 +31,11 @@ import org.jclouds.compute.BaseVersionedServiceLiveTest; import org.jclouds.logging.log4j.config.Log4JLoggingModule; import org.jclouds.rest.RestContext; import org.jclouds.rest.RestContextSpec; +import org.jclouds.vcloud.director.testng.FormatApiResultsListener; import org.jclouds.vcloud.director.v1_5.domain.SessionWithToken; import org.testng.annotations.AfterGroups; import org.testng.annotations.BeforeGroups; +import org.testng.annotations.Listeners; import org.testng.annotations.Test; import com.google.common.collect.ImmutableSet; @@ -45,7 +47,8 @@ import com.google.inject.Module; * * @author Adrian Cole */ -@Test(groups = { "live", "apitests" }, testName = "SessionClientLiveTest") +@Listeners(FormatApiResultsListener.class) +@Test(groups = { "live", "user" }, testName = "SessionClientLiveTest") public class SessionClientLiveTest extends BaseVersionedServiceLiveTest { public SessionClientLiveTest() { provider = "vcloud-director"; diff --git a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/predicates/LinkPredicatesTest.java b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/predicates/LinkPredicatesTest.java new file mode 100644 index 0000000000..0b9dec1b77 --- /dev/null +++ b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/predicates/LinkPredicatesTest.java @@ -0,0 +1,59 @@ +/** + * 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.vcloud.director.v1_5.predicates; + +import static org.jclouds.vcloud.director.v1_5.predicates.LinkPredicates.relEquals; +import static org.jclouds.vcloud.director.v1_5.predicates.LinkPredicates.typeEquals; + +import java.net.URI; + +import org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType; +import org.jclouds.vcloud.director.v1_5.domain.Link; +import org.testng.annotations.Test; + +/** + * + * @author Adrian Cole + */ +@Test(groups = "unit", testName = "LinkPredicatesTest") +public class LinkPredicatesTest { + Link ref = Link.builder().type("application/vnd.vmware.vcloud.media+xml").rel("add").href( + URI.create("https://mycloud.greenhousedata.com/api/vdc/e9cd3387-ac57-4d27-a481-9bee75e0690f/media")) + .build(); + + @Test + public void testRelEqualsWhenEqual() { + assert relEquals("add").apply(ref); + } + + @Test + public void testRelEqualsWhenNotEqual() { + assert !relEquals("foo").apply(ref); + } + + @Test + public void testTypeEqualsWhenEqual() { + assert typeEquals(VCloudDirectorMediaType.MEDIA).apply(ref); + } + + @Test + public void testTypeEqualsWhenNotEqual() { + assert !typeEquals("foo").apply(ref); + } +} diff --git a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/predicates/ReferenceTypePredicatesTest.java b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/predicates/ReferenceTypePredicatesTest.java index ac611153d6..44dc169daf 100644 --- a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/predicates/ReferenceTypePredicatesTest.java +++ b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/predicates/ReferenceTypePredicatesTest.java @@ -22,7 +22,6 @@ import java.net.URI; import org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType; import org.jclouds.vcloud.director.v1_5.domain.Reference; -import org.jclouds.vcloud.director.v1_5.predicates.ReferenceTypePredicates; import org.testng.annotations.Test; /** diff --git a/labs/vcloud-director/src/test/resources/catalog/admin/createCatalog.xml b/labs/vcloud-director/src/test/resources/catalog/admin/createCatalog.xml new file mode 100644 index 0000000000..8c3c6d80f0 --- /dev/null +++ b/labs/vcloud-director/src/test/resources/catalog/admin/createCatalog.xml @@ -0,0 +1,21 @@ + + + + + + + + + + created by testCreateCatalog() + + + + + + + + + + false + \ No newline at end of file diff --git a/labs/vcloud-director/src/test/resources/catalog/admin/createCatalogSource.xml b/labs/vcloud-director/src/test/resources/catalog/admin/createCatalogSource.xml new file mode 100644 index 0000000000..cf9639a55d --- /dev/null +++ b/labs/vcloud-director/src/test/resources/catalog/admin/createCatalogSource.xml @@ -0,0 +1,4 @@ + + + created by testCreateCatalog() + \ No newline at end of file diff --git a/labs/vcloud-director/src/test/resources/org/admin/emailSettings.xml b/labs/vcloud-director/src/test/resources/org/admin/emailSettings.xml new file mode 100644 index 0000000000..26c61f6eeb --- /dev/null +++ b/labs/vcloud-director/src/test/resources/org/admin/emailSettings.xml @@ -0,0 +1,14 @@ + + + + true + true + + + true + + false + + + + \ No newline at end of file diff --git a/labs/vcloud-director/src/test/resources/org/admin/ldapSettings.xml b/labs/vcloud-director/src/test/resources/org/admin/ldapSettings.xml new file mode 100644 index 0000000000..4e13f0d9ae --- /dev/null +++ b/labs/vcloud-director/src/test/resources/org/admin/ldapSettings.xml @@ -0,0 +1,4 @@ + + + NONE + \ No newline at end of file diff --git a/labs/vcloud-director/src/test/resources/org/admin/org.xml b/labs/vcloud-director/src/test/resources/org/admin/org.xml new file mode 100644 index 0000000000..5e0ee14a4f --- /dev/null +++ b/labs/vcloud-director/src/test/resources/org/admin/org.xml @@ -0,0 +1,86 @@ + + + + + + + + + + + + + JClouds + true + + + + + + + + + + + false + 0 + 0 + false + 0 + + + + false + 0 + 0 + + + + false + 0 + + + NONE + + + + true + true + + + true + + false + + + + + + + false + 5 + 10 + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/labs/vcloud-director/src/test/resources/org/admin/passwordPolicy.xml b/labs/vcloud-director/src/test/resources/org/admin/passwordPolicy.xml new file mode 100644 index 0000000000..e48f20fbfd --- /dev/null +++ b/labs/vcloud-director/src/test/resources/org/admin/passwordPolicy.xml @@ -0,0 +1,7 @@ + + + + false + 5 + 10 + \ No newline at end of file diff --git a/labs/vcloud-director/src/test/resources/org/admin/updateEmailSettings.xml b/labs/vcloud-director/src/test/resources/org/admin/updateEmailSettings.xml new file mode 100644 index 0000000000..c48af09fef --- /dev/null +++ b/labs/vcloud-director/src/test/resources/org/admin/updateEmailSettings.xml @@ -0,0 +1,14 @@ + + + + false + false + test@test.com + new + false + + true + new + new + + \ No newline at end of file diff --git a/labs/vcloud-director/src/test/resources/org/admin/updateEmailSettingsSource.xml b/labs/vcloud-director/src/test/resources/org/admin/updateEmailSettingsSource.xml new file mode 100644 index 0000000000..70b36070e4 --- /dev/null +++ b/labs/vcloud-director/src/test/resources/org/admin/updateEmailSettingsSource.xml @@ -0,0 +1,14 @@ + + + + false + false + test@test.com + new + false + + true + new + new + + \ No newline at end of file diff --git a/labs/vcloud-director/src/test/resources/org/admin/updatePasswordPolicy.xml b/labs/vcloud-director/src/test/resources/org/admin/updatePasswordPolicy.xml new file mode 100644 index 0000000000..da245c8361 --- /dev/null +++ b/labs/vcloud-director/src/test/resources/org/admin/updatePasswordPolicy.xml @@ -0,0 +1,7 @@ + + + + true + 6 + 11 + \ No newline at end of file diff --git a/labs/vcloud-director/src/test/resources/org/admin/updatePasswordPolicySource.xml b/labs/vcloud-director/src/test/resources/org/admin/updatePasswordPolicySource.xml new file mode 100644 index 0000000000..706ac57a85 --- /dev/null +++ b/labs/vcloud-director/src/test/resources/org/admin/updatePasswordPolicySource.xml @@ -0,0 +1,7 @@ + + + + true + 6 + 11 + \ No newline at end of file diff --git a/labs/vcloud-director/src/test/resources/org/admin/updateVAppLeaseSettings.xml b/labs/vcloud-director/src/test/resources/org/admin/updateVAppLeaseSettings.xml new file mode 100644 index 0000000000..e69de29bb2 diff --git a/labs/vcloud-director/src/test/resources/org/admin/updateVAppLeaseSettingsSource.xml b/labs/vcloud-director/src/test/resources/org/admin/updateVAppLeaseSettingsSource.xml new file mode 100644 index 0000000000..e69de29bb2 diff --git a/labs/vcloud-director/src/test/resources/org/admin/vAppLeaseSettings.xml b/labs/vcloud-director/src/test/resources/org/admin/vAppLeaseSettings.xml new file mode 100644 index 0000000000..e69de29bb2 diff --git a/providers/gogrid/src/main/java/org/jclouds/gogrid/compute/functions/ServerToNodeMetadata.java b/providers/gogrid/src/main/java/org/jclouds/gogrid/compute/functions/ServerToNodeMetadata.java index 90bfcda830..9cc815e6b1 100644 --- a/providers/gogrid/src/main/java/org/jclouds/gogrid/compute/functions/ServerToNodeMetadata.java +++ b/providers/gogrid/src/main/java/org/jclouds/gogrid/compute/functions/ServerToNodeMetadata.java @@ -124,7 +124,7 @@ public class ServerToNodeMetadata implements Function { try { image = Iterables.find(images.get(), new FindImageForServer(from)); } catch (NoSuchElementException e) { - logger.warn("could not find a matching image for server %s", from); + logger.debug("could not find a matching image for server %s", from); } return image; } @@ -134,8 +134,8 @@ public class ServerToNodeMetadata implements Function { try { hardware = Iterables.find(hardwares.get(), new FindHardwareForServer(from)); } catch (NoSuchElementException e) { - logger.warn("could not find a matching hardware for server %s", from); + logger.debug("could not find a matching hardware for server %s", from); } return hardware; } -} \ No newline at end of file +} diff --git a/providers/gogrid/src/test/java/org/jclouds/gogrid/GoGridLiveTestDisabled.java b/providers/gogrid/src/test/java/org/jclouds/gogrid/GoGridLiveTestDisabled.java index 8648076e32..962891d560 100644 --- a/providers/gogrid/src/test/java/org/jclouds/gogrid/GoGridLiveTestDisabled.java +++ b/providers/gogrid/src/test/java/org/jclouds/gogrid/GoGridLiveTestDisabled.java @@ -354,8 +354,7 @@ public class GoGridLiveTestDisabled extends BaseVersionedServiceLiveTest { socketOpen.apply(socket); - SshClient sshClient = new SshjSshClient(new BackoffLimitedRetryHandler(), socket, 60000, - instanceCredentials.identity, instanceCredentials.credential, null); + SshClient sshClient = context.utils().injector().getInstance(SshClient.Factory.class).create(socket, instanceCredentials); sshClient.connect(); String output = sshClient.exec("df").getOutput(); assertTrue(output.contains("Filesystem"), diff --git a/providers/rimuhosting/src/main/java/org/jclouds/rimuhosting/miro/compute/functions/ServerToNodeMetadata.java b/providers/rimuhosting/src/main/java/org/jclouds/rimuhosting/miro/compute/functions/ServerToNodeMetadata.java index 9d07e215b1..ff6d27b1fd 100644 --- a/providers/rimuhosting/src/main/java/org/jclouds/rimuhosting/miro/compute/functions/ServerToNodeMetadata.java +++ b/providers/rimuhosting/src/main/java/org/jclouds/rimuhosting/miro/compute/functions/ServerToNodeMetadata.java @@ -129,8 +129,8 @@ public class ServerToNodeMetadata implements Function { try { return Iterables.find(images.get(), new FindImageForServer(location, from)).getOperatingSystem(); } catch (NoSuchElementException e) { - logger.warn("could not find a matching image for server %s in location %s", from, location); + logger.debug("could not find a matching image for server %s in location %s", from, location); } return null; } -} \ No newline at end of file +} diff --git a/providers/slicehost/src/main/java/org/jclouds/slicehost/compute/functions/SliceToNodeMetadata.java b/providers/slicehost/src/main/java/org/jclouds/slicehost/compute/functions/SliceToNodeMetadata.java index b7e32a9ae4..f0f8c7837c 100644 --- a/providers/slicehost/src/main/java/org/jclouds/slicehost/compute/functions/SliceToNodeMetadata.java +++ b/providers/slicehost/src/main/java/org/jclouds/slicehost/compute/functions/SliceToNodeMetadata.java @@ -129,7 +129,7 @@ public class SliceToNodeMetadata implements Function { try { return Iterables.find(hardwares.get(), new FindHardwareForSlice(from)); } catch (NoSuchElementException e) { - logger.warn("could not find a matching hardware for slice %s", from); + logger.debug("could not find a matching hardware for slice %s", from); } return null; } @@ -138,7 +138,7 @@ public class SliceToNodeMetadata implements Function { try { return Iterables.find(images.get(), new FindImageForSlice(from)).getOperatingSystem(); } catch (NoSuchElementException e) { - logger.warn("could not find a matching image for slice %s in location %s", from, location); + logger.debug("could not find a matching image for slice %s in location %s", from, location); } return null; }