blob: 3244de135736efec4a9dfeeeefad3bdf8e3a8235 [file] [log] [blame]
/**
*
* Copyright (C) 2011 Cloud Conscious, LLC. <info@cloudconscious.com>
*
* ====================================================================
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* ====================================================================
*/
package org.jclouds.vcloud.terremark.config;
import static com.google.common.base.Preconditions.checkNotNull;
import java.net.URI;
import java.util.Map;
import java.util.NoSuchElementException;
import javax.inject.Singleton;
import org.jclouds.http.RequiresHttp;
import org.jclouds.rest.ConfiguresRestClient;
import org.jclouds.rest.ResourceNotFoundException;
import org.jclouds.terremark.ecloud.features.DataCenterOperationsAsyncClient;
import org.jclouds.terremark.ecloud.features.DataCenterOperationsClient;
import org.jclouds.terremark.ecloud.features.TagOperationsAsyncClient;
import org.jclouds.terremark.ecloud.features.TagOperationsClient;
import org.jclouds.vcloud.VCloudExpressAsyncClient;
import org.jclouds.vcloud.VCloudExpressClient;
import org.jclouds.vcloud.domain.ReferenceType;
import org.jclouds.vcloud.terremark.TerremarkECloudAsyncClient;
import org.jclouds.vcloud.terremark.TerremarkECloudClient;
import org.jclouds.vcloud.terremark.TerremarkVCloudAsyncClient;
import org.jclouds.vcloud.terremark.TerremarkVCloudClient;
import org.jclouds.vcloud.terremark.domain.TerremarkNetwork;
import org.jclouds.vcloud.terremark.domain.TerremarkOrgNetwork;
import com.google.common.base.Predicate;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Iterables;
import com.google.inject.Injector;
import com.google.inject.Provides;
/**
* Configures the VCloud authentication service connection, including logging and http transport.
*
* @author Adrian Cole
*/
@RequiresHttp
@ConfiguresRestClient
public class TerremarkECloudRestClientModule extends
TerremarkRestClientModule<TerremarkECloudClient, TerremarkECloudAsyncClient> {
public static final Map<Class<?>, Class<?>> DELEGATE_MAP = ImmutableMap.<Class<?>, Class<?>> builder()//
.put(DataCenterOperationsClient.class, DataCenterOperationsAsyncClient.class)//
.put(TagOperationsClient.class, TagOperationsAsyncClient.class)//
.build();
public TerremarkECloudRestClientModule() {
super(TerremarkECloudClient.class, TerremarkECloudAsyncClient.class, DELEGATE_MAP);
}
@Provides
@Singleton
protected VCloudExpressAsyncClient provideVCloudAsyncClient(TerremarkECloudAsyncClient in) {
return in;
}
@Provides
@Singleton
protected VCloudExpressClient provideVCloudClient(TerremarkECloudClient in) {
return in;
}
@Provides
@Singleton
protected TerremarkVCloudAsyncClient provideTerremarkAsyncClient(TerremarkECloudAsyncClient in) {
return in;
}
@Provides
@Singleton
protected TerremarkVCloudClient provideTerremarkClient(TerremarkECloudClient in) {
return in;
}
@Override
protected URI findDefaultNetworkForVDC(org.jclouds.vcloud.domain.VDC vDC, Map<String, ReferenceType> networks,
final Injector injector) {
// TODO FIXME XXX: In Terremark Enterprise environment with multiple VDC's this does not
// work well.
// Each VDC will have differnt network subnets. So we cannot assume the default VDC's
// networks will
// work with non-default VDC's. So make PROPERTY_VCLOUD_DEFAULT_NETWORK optional. If
// this property
// is not set, they are expected to add NetworkConfig to the options when launching a
// server.
logger.warn("default network for vdc %s not set", vDC.getName());
try {
return Iterables.find(networks.values(), new Predicate<ReferenceType>() {
@Override
public boolean apply(ReferenceType input) {
TerremarkOrgNetwork network = injector.getInstance(TerremarkECloudClient.class).getNetwork(
input.getHref());
TerremarkNetwork terremarkNetwork = injector.getInstance(TerremarkECloudClient.class)
.getTerremarkNetwork(
checkNotNull(checkNotNull(network, "network at: " + input).getNetworkExtension(),
"network extension for: " + input).getHref());
return checkNotNull(terremarkNetwork, "terremark network extension at: " + network.getNetworkExtension())
.getNetworkType() == TerremarkNetwork.Type.DMZ;
}
}).getHref();
} catch (NoSuchElementException e) {
throw new ResourceNotFoundException("no dmz networks in vdc " + vDC.getName() + ": " + networks);
}
}
}