/*
* Copyright 2014-2017 the original author or authors.
*
* 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 io.pivotal.strepsirrhini.chaoslemur.infrastructure;
import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.regions.Region;
import com.amazonaws.regions.Regions;
import com.amazonaws.services.ec2.AmazonEC2;
import com.amazonaws.services.ec2.AmazonEC2Client;
import org.jclouds.Constants;
import org.jclouds.ContextBuilder;
import org.jclouds.logging.slf4j.config.SLF4JLoggingModule;
import org.jclouds.openstack.nova.v2_0.NovaApi;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.net.MalformedURLException;
import java.util.Collections;
import java.util.Properties;
@Configuration
class InfrastructureConfiguration {
@Autowired
DirectorUtils directorUtils;
@Bean
@ConditionalOnProperty("aws.accessKeyId")
AmazonEC2Client amazonEC2(@Value("${aws.accessKeyId}") String accessKeyId,
@Value("${aws.secretAccessKey}") String secretAccessKey,
@Value("${aws.region:us-east-1}") String regionName) {
AmazonEC2Client amazonEC2Client = new AmazonEC2Client(new BasicAWSCredentials(accessKeyId, secretAccessKey));
Region region = Region.getRegion(Regions.fromName(regionName));
amazonEC2Client.setEndpoint(region.getServiceEndpoint("ec2"));
return amazonEC2Client;
}
@Bean
@ConditionalOnBean(AmazonEC2.class)
AwsInfrastructure awsInfrastructure(DirectorUtils directorUtils, AmazonEC2 amazonEC2) {
return new AwsInfrastructure(directorUtils, amazonEC2);
}
@Bean
@ConditionalOnProperty("vsphere.host")
StandardInventoryNavigatorFactory inventoryNavigatorFactory(@Value("${vsphere.host}") String host,
@Value("${vsphere.username}") String username,
@Value("${vsphere.password}") String password) throws MalformedURLException {
return new StandardInventoryNavigatorFactory(host, username, password);
}
@Bean
@ConditionalOnProperty("openstack.endpoint")
NovaApi novaApi(@Value("${openstack.endpoint}") String endpoint,
@Value("${openstack.tenant}") String tenant,
@Value("${openstack.username}") String username,
@Value("${openstack.password}") String password) {
String identity = String.format("%s:%s", tenant, username);
// see https://issues.apache.org/jira/browse/JCLOUDS-816
Properties overrides = new Properties();
overrides.put(Constants.PROPERTY_TRUST_ALL_CERTS, "true");
overrides.put(Constants.PROPERTY_RELAX_HOSTNAME, "true");
return ContextBuilder.newBuilder("openstack-nova")
.endpoint(endpoint)
.credentials(identity, password)
.modules(Collections.singleton(new SLF4JLoggingModule()))
.overrides(overrides)
.buildApi(NovaApi.class);
}
@Bean
@ConditionalOnBean(NovaApi.class)
OpenStackInfrastructure openStackInfrastructure(DirectorUtils directorUtils, NovaApi novaApi) {
return new OpenStackInfrastructure(directorUtils, novaApi);
}
@Bean
@ConditionalOnProperty("simple.infrastructure")
SimpleInfrastructure simpleInfrastructure() {
return new SimpleInfrastructure();
}
@Bean
@ConditionalOnBean(InventoryNavigatorFactory.class)
VSphereInfrastructure vSphereInfrastructure(DirectorUtils directorUtils, InventoryNavigatorFactory inventoryNavigatorFactory) {
return new VSphereInfrastructure(directorUtils, inventoryNavigatorFactory);
}
}