1
16
17 package org.springframework.cloud.aws.autoconfigure.context;
18
19 import com.amazonaws.auth.AWSCredentialsProvider;
20 import com.amazonaws.services.cloudformation.AmazonCloudFormation;
21 import com.amazonaws.services.cloudformation.AmazonCloudFormationClient;
22 import com.amazonaws.services.ec2.AmazonEC2;
23
24 import org.springframework.beans.factory.annotation.Autowired;
25 import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
26 import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
27 import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
28 import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
29 import org.springframework.boot.context.properties.EnableConfigurationProperties;
30 import org.springframework.cloud.aws.autoconfigure.context.properties.AwsStackProperties;
31 import org.springframework.cloud.aws.context.annotation.ConditionalOnMissingAmazonClient;
32 import org.springframework.cloud.aws.context.config.annotation.ContextDefaultConfigurationRegistrar;
33 import org.springframework.cloud.aws.core.config.AmazonWebserviceClientFactoryBean;
34 import org.springframework.cloud.aws.core.env.stack.StackResourceRegistry;
35 import org.springframework.cloud.aws.core.env.stack.config.AutoDetectingStackNameProvider;
36 import org.springframework.cloud.aws.core.env.stack.config.StackNameProvider;
37 import org.springframework.cloud.aws.core.env.stack.config.StackResourceRegistryFactoryBean;
38 import org.springframework.cloud.aws.core.env.stack.config.StaticStackNameProvider;
39 import org.springframework.cloud.aws.core.region.RegionProvider;
40 import org.springframework.context.annotation.Bean;
41 import org.springframework.context.annotation.Configuration;
42 import org.springframework.context.annotation.Import;
43
44
48 @Configuration(proxyBeanMethods = false)
49 @Import({ ContextCredentialsAutoConfiguration.class,
50 ContextDefaultConfigurationRegistrar.class })
51 @ConditionalOnClass(name = "com.amazonaws.services.cloudformation.AmazonCloudFormation")
52 @EnableConfigurationProperties(AwsStackProperties.class)
53 public class ContextStackAutoConfiguration {
54
55 @Autowired
56 private AwsStackProperties properties;
57
58 @Autowired(required = false)
59 private AmazonEC2 amazonEC2;
60
61 @Autowired(required = false)
62 private RegionProvider regionProvider;
63
64 @Autowired(required = false)
65 private AWSCredentialsProvider credentialsProvider;
66
67 @Bean
68 @ConditionalOnMissingBean
69 @ConditionalOnProperty("cloud.aws.stack.name")
70 public StackNameProvider staticStackNameProvider() {
71 return new StaticStackNameProvider(properties.getName());
72 }
73
74 @Bean
75 @ConditionalOnMissingBean
76 @ConditionalOnProperty(name = "cloud.aws.stack.auto", havingValue = "true",
77 matchIfMissing = true)
78 public StackNameProvider autoDetectingStackNameProvider(
79 AmazonCloudFormation amazonCloudFormation) {
80 return new AutoDetectingStackNameProvider(amazonCloudFormation, this.amazonEC2);
81 }
82
83 @Bean
84 @ConditionalOnMissingBean(StackResourceRegistry.class)
85 @ConditionalOnBean(StackNameProvider.class)
86 public StackResourceRegistryFactoryBean stackResourceRegistryFactoryBean(
87 AmazonCloudFormation amazonCloudFormation,
88 StackNameProvider stackNameProvider) {
89 return new StackResourceRegistryFactoryBean(amazonCloudFormation,
90 stackNameProvider);
91 }
92
93 @Bean
94 @ConditionalOnMissingAmazonClient(AmazonCloudFormation.class)
95 public AmazonWebserviceClientFactoryBean<AmazonCloudFormationClient> amazonCloudFormation() {
96 return new AmazonWebserviceClientFactoryBean<>(AmazonCloudFormationClient.class,
97 this.credentialsProvider, this.regionProvider);
98 }
99
100 }
101