From d00a374ca5b9129e86796ee2b9345734ee2dcbe0 Mon Sep 17 00:00:00 2001 From: Marcin Grzejszczak Date: Fri, 8 Sep 2023 16:55:47 +0200 Subject: [PATCH] Initial commit --- .circleci/config.yml | 54 - .editorconfig | 14 - .flattened-pom.xml | 134 + .gitattributes | 1 - .github/CONTRIBUTING.md | 45 - .github/ISSUE_TEMPLATE.md | 20 - .github/ISSUE_TEMPLATE/bug_report.md | 17 - .github/ISSUE_TEMPLATE/feature_request.md | 20 - .github/workflows/deploy-docs.yml | 53 + .github/workflows/maven.yaml | 42 - .gitignore | 39 +- .java-version | 1 - .mvn/maven.config | 1 - .mvn/wrapper/MavenWrapperDownloader.java | 117 + .mvn/wrapper/maven-wrapper.jar | Bin 49502 -> 50710 bytes .mvn/wrapper/maven-wrapper.properties | 3 +- .sdkmanrc | 3 - .settings.xml | 68 - .springformat | 0 Guardfile | 11 - LICENSE.txt | 202 -- README.adoc | 592 +--- ...antora-playbook.yml => antora-playbook.yml | 33 +- docs/.flattened-pom.xml | 107 + docs/.github/workflows/deploy-docs.yml | 32 - docs/antora.yml | 12 - docs/modules/ROOT/nav.adoc | 45 - docs/modules/ROOT/pages/README.adoc | 86 - docs/modules/ROOT/pages/_configprops.adoc | 31 - docs/modules/ROOT/pages/_observability.adoc | 9 - docs/modules/ROOT/pages/index.adoc | 0 docs/modules/ROOT/pages/intro.adoc | 6 - docs/modules/ROOT/pages/quickstart.adoc | 194 -- docs/modules/ROOT/pages/sagan-index.adoc | 49 - .../ROOT/pages/spring-cloud-config.adoc | 12 - .../pages/spring-cloud-config/client.adoc | 350 --- .../spring-cloud-config/quick-start.adoc | 6 - .../pages/spring-cloud-config/server.adoc | 55 - .../server/-aot-and-native-image-support.adoc | 6 - .../server/actuator-and-security.adoc | 6 - .../creating-a-key-store-for-testing.adoc | 30 - .../server/embedding-the.adoc | 39 - .../server/encryption-and-decryption.adoc | 79 - .../server/environment-repository.adoc | 41 - .../accessing-backends-through-a-proxy.adoc | 52 - .../aws-parameter-store-backend.adoc | 94 - .../aws-parameter-store.adoc | 14 - .../aws-s3-backend.adoc | 40 - .../aws-secrets-manager-backend.adoc | 41 - .../aws-secrets-manager.adoc | 80 - .../composite-repositories.adoc | 72 - .../credhub-backend.adoc | 105 - .../file-system-backend.adoc | 25 - .../environment-repository/git-backend.adoc | 455 --- .../environment-repository/jdbc-backend.adoc | 17 - ...rriding-properties-using-placeholders.adoc | 20 - .../overriding-properties-using-profiles.adoc | 25 - .../property-overrides.adoc | 31 - .../environment-repository/redis-backend.adoc | 47 - ...g-configuration-with-all-applications.adoc | 49 - ...sing-bootstrap-to-override-properties.adoc | 16 - .../environment-repository/vault-backend.adoc | 160 -- ...ersion-control-backend-filesystem-use.adoc | 11 - .../server/health-indicator.adoc | 27 - .../server/key-management.adoc | 32 - .../server/push-notifications-and-bus.adoc | 22 - .../spring-cloud-config/server/security.adoc | 9 - .../server/serving-alternative-formats.adoc | 16 - .../server/serving-binary-files.adoc | 90 - .../server/serving-encrypted-properties.adoc | 8 - .../server/serving-plain-text.adoc | 26 - .../using-multiple-keys-and-key-rotation.adoc | 26 - docs/pom.xml | 100 - docs/src/main/asciidoc/ghpages.sh | 330 --- mvnw | 199 +- mvnw.cmd | 55 +- pom.xml | 301 +- sample.groovy | 10 - .../.flattened-pom.xml | 190 ++ spring-cloud-config-client-tls-tests/pom.xml | 123 - .../config/client/tls/AbstractTlsSetup.java | 91 - .../cloud/config/client/tls/AppRunner.java | 124 - .../tls/ConfigClientConfigDataTlsTests.java | 35 - .../client/tls/ConfigClientTlsTests.java | 194 -- .../cloud/config/client/tls/KeyAndCert.java | 93 - .../cloud/config/client/tls/KeyTool.java | 113 - .../client/tls/TlsConfigClientRunner.java | 66 - .../client/tls/TlsConfigServerRunner.java | 52 - .../test/config/application.properties | 1 - spring-cloud-config-client/.flattened-pom.xml | 185 ++ spring-cloud-config-client/pom.xml | 100 - .../client/ConfigClientAutoConfiguration.java | 121 - .../client/ConfigClientFailFastException.java | 25 - .../client/ConfigClientHealthProperties.java | 45 - .../config/client/ConfigClientProperties.java | 499 ---- .../ConfigClientRequestTemplateFactory.java | 175 -- .../client/ConfigClientRetryBootstrapper.java | 59 - .../client/ConfigClientStateHolder.java | 46 - .../config/client/ConfigClientWatch.java | 84 - .../client/ConfigServerBootstrapper.java | 114 - .../client/ConfigServerConfigDataLoader.java | 345 --- ...onfigServerConfigDataLocationResolver.java | 276 -- ...igDataMissingEnvironmentPostProcessor.java | 83 - .../ConfigServerConfigDataResource.java | 181 -- .../client/ConfigServerHealthIndicator.java | 97 - .../client/ConfigServerInstanceMonitor.java | 139 - .../client/ConfigServerInstanceProvider.java | 97 - .../ConfigServiceBootstrapConfiguration.java | 80 - .../ConfigServicePropertySourceLocator.java | 358 --- ...ntConfigServiceBootstrapConfiguration.java | 64 - .../cloud/config/client/RetryProperties.java | 85 - .../config/client/RetryTemplateFactory.java | 57 - ...plicationNameExceptionFailureAnalyzer.java | 43 - .../InvalidApplicationNameException.java | 46 - .../cloud/config/environment/Environment.java | 167 -- .../environment/EnvironmentMediaType.java | 40 - .../config/environment/PropertySource.java | 72 - .../environment/PropertyValueDescriptor.java | 60 - .../main/resources/META-INF/spring.factories | 24 - .../resources/META-INF/spring/aot.factories | 2 - ...ot.autoconfigure.AutoConfiguration.imports | 1 - ...figServiceBootstrapConfigurationTests.java | 127 - .../ConfigClientAutoConfigurationTests.java | 103 - .../ConfigClientConfigDataLoaderTest.java | 96 - .../client/ConfigClientPropertiesTests.java | 186 -- .../config/client/ConfigClientWatchTests.java | 38 - ...nfigServerBootstrapConfigurationTests.java | 45 - ...nfigDataCustomizationIntegrationTests.java | 180 -- .../ConfigServerConfigDataLoaderTests.java | 672 ----- ...ServerConfigDataLocationResolverTests.java | 242 -- ...aMissingEnvironmentPostProcessorTests.java | 106 - ...verConfigDataNoImportIntegrationTests.java | 90 - .../ConfigServerConfigDataResourceTests.java | 332 --- .../ConfigServerHealthIndicatorTests.java | 100 - ...nfigServiceBootstrapConfigurationTest.java | 89 - ...nfigServicePropertySourceLocatorTests.java | 604 ---- ...ntConfigDataConfigurationNoRetryTests.java | 183 -- ...eryClientConfigDataConfigurationTests.java | 296 -- ...tstrapConfigurationNoSpringRetryTests.java | 60 - ...figServiceBootstrapConfigurationTests.java | 200 -- .../config/environment/EnvironmentTests.java | 42 - .../src/test/resources/applicationname.yaml | 3 - spring-cloud-config-dependencies/pom.xml | 136 - .../.flattened-pom.xml | 120 + spring-cloud-config-monitor/pom.xml | 55 - ...BasePropertyPathNotificationExtractor.java | 66 - ...cketPropertyPathNotificationExtractor.java | 69 - ...sitePropertyPathNotificationExtractor.java | 79 - .../EnvironmentMonitorAutoConfiguration.java | 127 - .../monitor/FileMonitorConfiguration.java | 323 --- ...iteaPropertyPathNotificationExtractor.java | 53 - ...iteePropertyPathNotificationExtractor.java | 39 - ...thubPropertyPathNotificationExtractor.java | 35 - ...tlabPropertyPathNotificationExtractor.java | 35 - ...GogsPropertyPathNotificationExtractor.java | 39 - .../config/monitor/PropertyPathEndpoint.java | 126 - .../monitor/PropertyPathNotification.java | 76 - .../PropertyPathNotificationExtractor.java | 35 - ...ot.autoconfigure.AutoConfiguration.imports | 1 - ...ropertyPathNotificationExtractorTests.java | 175 -- ...ropertyPathNotificationExtractorTests.java | 77 - ...ironmentMonitorAutoConfigurationTests.java | 86 - .../monitor/FileMonitorConfigurationTest.java | 182 -- ...ropertyPathNotificationExtractorTests.java | 64 - ...ropertyPathNotificationExtractorTests.java | 63 - ...ropertyPathNotificationExtractorTests.java | 64 - ...ropertyPathNotificationExtractorTests.java | 66 - ...ropertyPathNotificationExtractorTests.java | 64 - .../monitor/PropertyPathEndpointTests.java | 104 - .../src/test/resources/gitea.json | 81 - .../src/test/resources/gitee.json | 54 - .../src/test/resources/gitlab.json | 65 - .../pathsamples/bitbucket-invalid.json | 38 - .../test/resources/pathsamples/bitbucket.json | 206 -- .../pathsamples/bitbucketserver-invalid.json | 30 - .../pathsamples/bitbucketserver-prmerged.json | 108 - .../pathsamples/bitbucketserver.json | 43 - .../src/test/resources/pathsamples/gitea.json | 81 - .../src/test/resources/pathsamples/gitee.json | 56 - .../test/resources/pathsamples/github.json | 157 - .../test/resources/pathsamples/gitlab.json | 71 - .../src/test/resources/pathsamples/gogs.json | 157 - spring-cloud-config-sample/.flattened-pom.xml | 125 + spring-cloud-config-sample/pom.xml | 104 - .../src/main/java/sample/Application.java | 43 - .../src/main/resources/application.yml | 9 - .../src/main/resources/bootstrap.yml | 6 - .../resources/bootstrapservercomposite.yml | 12 - .../sample/ApplicationBootstrapTests.java | 112 - .../java/sample/ApplicationFailFastTests.java | 64 - .../test/java/sample/ApplicationTests.java | 95 - ...igDataCustomMediaTypeIntegrationTests.java | 97 - .../sample/ConfigDataIntegrationTests.java | 85 - .../ConfigDataOrderingIntegrationTests.java | 86 - ...nfigDataOrderingVaultIntegrationTests.java | 101 - .../ConfigDataRetryIntegrationTests.java | 117 - .../sample/ServerNativeApplicationTests.java | 82 - .../src/test/resources/bad.yml | 4 - .../resources/config-repo/application.yml | 3 - .../test/resources/config-repo/bar.properties | 1 - .../resources/config-repo/git/COMMIT_EDITMSG | 1 - .../test/resources/config-repo/git/FETCH_HEAD | 2 - .../src/test/resources/config-repo/git/HEAD | 1 - .../src/test/resources/config-repo/git/config | 5 - .../test/resources/config-repo/git/gitk.cache | 3 - .../src/test/resources/config-repo/git/index | Bin 225 -> 0 bytes .../test/resources/config-repo/git/logs/HEAD | 2 - .../config-repo/git/logs/refs/heads/master | 1 - .../config-repo/git/logs/refs/heads/raw | 2 - .../7a/68a4bbc80b44c287787e2306ff9fd7de35cc54 | Bin 43 -> 0 bytes .../a1/9381f44efc80a21996b47adf012ef105ced909 | Bin 97 -> 0 bytes .../ae/3cdf5b88ff281b7f087143289c72a5057a0278 | Bin 23 -> 0 bytes .../b5/1bc19694589d21c06bab8a4f14660b3303d7b0 | Bin 159 -> 0 bytes ...edd2290fa647beaa1255881228dc90c1d53fce.idx | Bin 1268 -> 0 bytes ...dd2290fa647beaa1255881228dc90c1d53fce.pack | Bin 571 -> 0 bytes .../config-repo/git/refs/heads/master | 1 - .../resources/config-repo/git/refs/heads/raw | 1 - .../resources/config-repo/git/refs/tags/foo | 1 - .../resources/config/profilesample-dev.yml | 1 - .../test/resources/config/profilesample.yml | 1 - .../src/test/resources/logback-test.xml | 20 - .../src/test/resources/orderingtest.yml | 1 - .../src/test/resources/server.yml | 16 - .../resources/vaultordering/client-dev.yml | 3 - .../test/resources/vaultordering/server.yml | 13 - .../vault-test-repo/client-app-dev.yml | 1 - .../vault-test-repo/client-app.yml | 1 - .../vaultordering/vault_test_policy.txt | 16 - spring-cloud-config-server/.flattened-pom.xml | 302 ++ spring-cloud-config-server/pom.xml | 264 -- .../server/ConfigServerApplication.java | 40 - .../config/server/EnableConfigServer.java | 37 - ...figServerBootstrapApplicationListener.java | 91 - .../ConfigServerBootstrapConfiguration.java | 77 - ...erBootstrapOverridesAutoConfiguration.java | 80 - ...teEnvironmentBeanFactoryPostProcessor.java | 84 - .../server/composite/CompositeUtils.java | 109 - ...ConditionalOnMissingSearchPathLocator.java | 36 - .../ConditionalOnSearchPathLocator.java | 36 - .../composite/OnSearchPathLocatorPresent.java | 66 - .../server/config/CompositeConfiguration.java | 67 - .../config/ConfigServerAutoConfiguration.java | 37 - .../config/ConfigServerConfiguration.java | 37 - .../ConfigServerEncryptionConfiguration.java | 47 - .../config/ConfigServerHealthIndicator.java | 166 -- .../config/ConfigServerMvcConfiguration.java | 132 - .../server/config/ConfigServerProperties.java | 256 -- .../server/config/CredhubConfiguration.java | 45 - ...efaultTextEncryptionAutoConfiguration.java | 71 - .../config/EncryptionAutoConfiguration.java | 66 - .../EnvironmentRepositoryConfiguration.java | 572 ---- .../GoogleCloudSourceConfiguration.java | 42 - .../ResourceEncryptorConfiguration.java | 66 - .../ResourceRepositoryConfiguration.java | 41 - .../RsaEncryptionAutoConfiguration.java | 66 - .../server/config/VaultConfiguration.java | 114 - .../VaultEncryptionAutoConfiguration.java | 43 - .../diagnostics/GitUriFailureAnalyzer.java | 48 - .../AbstractCipherResourceEncryptor.java | 82 - .../CipherEnvironmentEncryptor.java | 96 - .../CipherResourceJsonEncryptor.java | 57 - .../CipherResourcePropertiesEncryptor.java | 74 - .../CipherResourceYamlEncryptor.java | 57 - .../encryption/EncryptionController.java | 287 -- .../encryption/EnvironmentEncryptor.java | 32 - .../encryption/EnvironmentPrefixHelper.java | 134 - .../KeyStoreTextEncryptorLocator.java | 103 - .../encryption/LocatorTextEncryptor.java | 53 - .../encryption/PassthruSecretLocator.java | 30 - .../server/encryption/ResourceEncryptor.java | 36 - .../server/encryption/SecretLocator.java | 27 - .../SingleTextEncryptorLocator.java | 42 - .../encryption/TextEncryptorLocator.java | 32 - .../vault/VaultEnvironmentEncryptor.java | 124 - .../AbstractScmEnvironmentRepository.java | 79 - .../AbstractVaultEnvironmentRepository.java | 171 -- .../AwsClientBuilderConfigurer.java | 40 - ...wsParameterStoreEnvironmentProperties.java | 177 -- ...wsParameterStoreEnvironmentRepository.java | 176 -- ...eterStoreEnvironmentRepositoryFactory.java | 49 - .../AwsS3EnvironmentProperties.java | 78 - .../AwsS3EnvironmentRepository.java | 296 -- .../AwsS3EnvironmentRepositoryFactory.java | 47 - ...wsSecretsManagerEnvironmentProperties.java | 141 - ...wsSecretsManagerEnvironmentRepository.java | 172 -- ...tsManagerEnvironmentRepositoryFactory.java | 48 - .../CompositeEnvironmentRepository.java | 106 - .../environment/ConfigTokenProvider.java | 26 - .../ConfigurableHttpConnectionFactory.java | 28 - .../environment/ConsulEnvironmentWatch.java | 154 - .../CredhubEnvironmentProperties.java | 40 - .../CredhubEnvironmentRepository.java | 114 - .../CredhubEnvironmentRepositoryFactory.java | 41 - .../DocumentedConfigObservation.java | 90 - .../environment/EnvironmentCleaner.java | 56 - .../EnvironmentConfigTokenProvider.java | 40 - .../environment/EnvironmentController.java | 517 ---- ...ronmentEncryptorEnvironmentRepository.java | 102 - .../environment/EnvironmentException.java | 33 - .../EnvironmentNotFoundException.java | 33 - .../environment/EnvironmentRepository.java | 33 - .../EnvironmentRepositoryFactory.java | 30 - ...onmentRepositoryPropertySourceLocator.java | 62 - .../server/environment/EnvironmentWatch.java | 38 - ...FailedToConstructEnvironmentException.java | 34 - ...gleSecretManagerEnvironmentProperties.java | 95 - ...gleSecretManagerEnvironmentRepository.java | 126 - ...etManagerEnvironmentRepositoryFactory.java | 42 - ...ientConfigurableHttpConnectionFactory.java | 201 -- .../HttpClientVaultRestTemplateFactory.java | 38 - .../HttpRequestConfigTokenProvider.java | 52 - .../InvalidEnvironmentRequestException.java | 33 - .../JGitEnvironmentProperties.java | 276 -- .../JGitEnvironmentRepository.java | 780 ----- .../JdbcEnvironmentProperties.java | 110 - .../JdbcEnvironmentRepository.java | 194 -- .../JdbcEnvironmentRepositoryFactory.java | 47 - .../MultipleJGitEnvironmentProperties.java | 93 - .../MultipleJGitEnvironmentRepository.java | 350 --- ...tipleJGitEnvironmentRepositoryFactory.java | 91 - .../NativeEnvironmentProperties.java | 103 - .../NativeEnvironmentRepository.java | 410 --- .../NativeEnvironmentRepositoryFactory.java | 53 - .../environment/NoSuchLabelException.java | 34 - .../NoSuchRepositoryException.java | 34 - ...servationEnvironmentRepositoryContext.java | 61 - ...onmentRepositoryObservationConvention.java | 70 - ...servationEnvironmentRepositoryWrapper.java | 86 - .../PassthruEnvironmentRepository.java | 119 - .../RedisEnvironmentProperties.java | 40 - .../RedisEnvironmentRepository.java | 76 - .../RedisEnvironmentRepositoryFactory.java | 38 - .../environment/RepositoryException.java | 34 - ...rchPathCompositeEnvironmentRepository.java | 75 - .../server/environment/SearchPathLocator.java | 106 - .../SerializableMapPropertySource.java | 40 - .../SvnEnvironmentRepositoryFactory.java | 53 - .../SvnKitEnvironmentProperties.java | 35 - .../SvnKitEnvironmentRepository.java | 203 -- .../VaultEnvironmentProperties.java | 939 ------ .../VaultEnvironmentRepository.java | 142 - .../VaultEnvironmentRepositoryFactory.java | 82 - .../environment/VaultKvAccessStrategy.java | 111 - .../VaultKvAccessStrategyFactory.java | 109 - .../VaultKvAccessStrategySupport.java | 88 - .../secretmanager/GoogleConfigProvider.java | 23 - .../GoogleSecretComparatorByVersion.java | 40 - .../GoogleSecretManagerAccessStrategy.java | 34 - ...gleSecretManagerAccessStrategyFactory.java | 62 - .../GoogleSecretManagerV1AccessStrategy.java | 213 -- .../HttpHeaderGoogleConfigProvider.java | 61 - ...ringVaultClientAuthenticationProvider.java | 58 - .../vault/SpringVaultClientConfiguration.java | 200 -- .../SpringVaultEnvironmentRepository.java | 71 - ...ringVaultEnvironmentRepositoryFactory.java | 73 - .../AppRoleClientAuthenticationProvider.java | 101 - .../AwsEc2ClientAuthenticationProvider.java | 55 - .../AwsIamClientAuthenticationProvider.java | 101 - .../AzureMsiClientAuthenticationProvider.java | 63 - ...rtificateClientAuthenticationProvider.java | 39 - ...CubbyholeClientAuthenticationProvider.java | 51 - .../GcpGceClientAuthenticationProvider.java | 53 - .../GcpIamClientAuthenticationProvider.java | 93 - ...ubernetesClientAuthenticationProvider.java | 53 - .../PcfClientAuthenticationProvider.java | 77 - .../TokenClientAuthenticationProvider.java | 42 - .../proxy/ProxyHostCredentialsProvider.java | 41 - .../server/proxy/ProxyHostProperties.java | 116 - .../server/proxy/SchemeBasedRoutePlanner.java | 55 - .../resource/GenericResourceRepository.java | 121 - .../resource/NoSuchResourceException.java | 29 - .../server/resource/ResourceController.java | 220 -- .../resource/ResourceControllerAdvice.java | 49 - .../server/resource/ResourceRepository.java | 29 - .../ssh/FileBasedSshSessionFactory.java | 60 - .../FileBasedSshTransportConfigCallback.java | 64 - .../server/ssh/HostKeyAlgoSupported.java | 46 - .../ssh/HostKeyAlgoSupportedValidator.java | 88 - .../server/ssh/HostKeyAndAlgoBothExist.java | 45 - .../ssh/HostKeyAndAlgoBothExistValidator.java | 98 - .../cloud/config/server/ssh/KeyPairUtils.java | 73 - .../server/ssh/KnownHostsFileIsValid.java | 46 - .../server/ssh/KnownHostsFileValidator.java | 60 - .../config/server/ssh/PrivateKeyIsValid.java | 46 - .../server/ssh/PrivateKeyValidator.java | 96 - ...ertiesBasedSshTransportConfigCallback.java | 63 - .../ssh/PropertyBasedSshSessionFactory.java | 253 -- .../server/ssh/SshPropertyValidator.java | 74 - .../server/ssh/SshUriPropertyProcessor.java | 80 - .../server/support/AbstractScmAccessor.java | 272 -- .../AbstractScmAccessorProperties.java | 144 - .../AwsCodeCommitCredentialProvider.java | 407 --- .../server/support/CredentialException.java | 30 - .../support/EnvironmentPropertySource.java | 63 - .../EnvironmentRepositoryProperties.java | 26 - .../GitCredentialsProviderFactory.java | 143 - ...tSkipSslValidationCredentialsProvider.java | 136 - .../support/GoogleCloudSourceSupport.java | 136 - .../server/support/HttpClient4Support.java | 133 - .../server/support/HttpClientSupport.java | 91 - .../HttpEnvironmentRepositoryProperties.java | 34 - .../PassphraseCredentialsProvider.java | 96 - .../config/server/support/PathUtils.java | 277 -- .../TransportConfigCallbackFactory.java | 74 - .../main/resources/META-INF/spring.factories | 13 - ...ot.autoconfigure.AutoConfiguration.imports | 6 - .../src/main/resources/configserver.yml | 23 - .../cloud/config/server/AdhocTestSuite.java | 91 - .../config/server/AwsS3IntegrationTests.java | 155 - ...BootstrapConfigServerIntegrationTests.java | 82 - .../server/CompositeClasspathTests.java | 141 - .../server/CompositeIntegrationTests.java | 186 -- ...ackwardsCompatibilityIntegrationTests.java | 112 - .../ConfigClientOffIntegrationTests.java | 105 - .../ConfigClientOnIntegrationTests.java | 119 - .../server/ConfigServerApplicationTests.java | 41 - ...CompositeConfigServerIntegrationTests.java | 52 - .../CredhubConfigServerIntegrationTests.java | 50 - .../config/server/CredhubIntegrationTest.java | 59 - .../NativeConfigServerIntegrationTests.java | 87 - .../server/ObservationIntegrationTests.java | 155 - ...freshableConfigServerIntegrationTests.java | 142 - ...ubversionConfigServerIntegrationTests.java | 92 - ...ransportConfigurationIntegrationTests.java | 481 ---- .../VanillaConfigServerIntegrationTests.java | 100 - .../server/composite/CompositUtilsTests.java | 65 - .../ConfigServerHealthIndicatorTests.java | 92 - ...omCompositeEnvironmentRepositoryTests.java | 218 -- .../CustomEnvironmentRepositoryTests.java | 85 - ...vironmentRepositoryConfigurationTests.java | 121 - ...ttpClientVaultRestTemplateFactoryTest.java | 140 - ...AwsCodeCommitCredentialsProviderTests.java | 168 -- .../GitCredentialsProviderFactoryTests.java | 160 -- .../CipherEnvironmentEncryptorTests.java | 122 - .../CipherResourceJsonEncryptorTests.java | 64 - ...ipherResourcePropertiesEncryptorTests.java | 65 - .../CipherResourceYamlEncryptorTests.java | 64 - ...tionControllerMultiTextEncryptorTests.java | 74 - .../encryption/EncryptionControllerTests.java | 161 -- .../EncryptionIntegrationTests.java | 132 - .../EnvironmentPrefixHelperTests.java | 91 - .../KeyStoreTextEncryptorLocatorTests.java | 78 - .../vault/VaultEnvironmentEncryptorTests.java | 196 -- ...terStoreEnvironmentRepositoryUnitTest.java | 191 -- ...ameterStoreEnvironmentRepositoryTests.java | 744 ----- .../AwsS3EnvironmentRepositoryTests.java | 322 --- ...retsManagerEnvironmentRepositoryTests.java | 2553 ----------------- .../CompositeEnvironmentRepositoryTests.java | 291 -- ...HttpConnectionFactoryIntegrationTests.java | 259 -- .../CredhubEnvironmentRepositoryTests.java | 220 -- ...EnvironmentControllerIntegrationTests.java | 228 -- .../EnvironmentControllerTests.java | 693 ----- ...ntEncryptorEnvironmentRepositoryTests.java | 78 - ...cretManagerEnvironmentRepositoryTests.java | 134 - ...ConfigurableHttpConnectionFactoryTest.java | 292 -- .../HttpRequestConfigTokenProviderTests.java | 63 - .../environment/JGitConfigServerTestData.java | 127 - ...EnvironmentRepositoryConcurrencyTests.java | 277 -- ...EnvironmentRepositoryIntegrationTests.java | 663 ----- .../JGitEnvironmentRepositorySslTests.java | 112 - .../JGitEnvironmentRepositoryTests.java | 1446 ---------- ...vironmentRepositoryConfigurationTests.java | 104 - .../JdbcEnvironmentRepositoryTests.java | 229 -- ...ApplicationPlaceholderRepositoryTests.java | 149 - ...onmentLabelPlaceholderRepositoryTests.java | 88 - ...mentProfilePlaceholderRepositoryTests.java | 173 -- ...JGitEnvironmentRepositoryFactoryTests.java | 67 - ...EnvironmentRepositoryIntegrationTests.java | 217 -- ...ultipleJGitEnvironmentRepositoryTests.java | 347 --- ...ativeEnvironmentRepositoryFactoryTest.java | 56 - .../NativeEnvironmentRepositoryTests.java | 334 --- ...tionEnvironmentRepositoryWrapperTests.java | 81 - .../PassthruEnvironmentRepositoryTests.java | 56 - ...EnvironmentRepositoryIntegrationTests.java | 69 - ...EnvironmentRepositoryIntegrationTests.java | 157 - .../SVNKitEnvironmentRepositoryTests.java | 156 - ...EnvironmentRepositoryIntegrationTests.java | 109 - .../VaultEnvironmentRepositoryTests.java | 454 --- .../VaultKvAccessStrategyFactoryTest.java | 50 - .../VaultKvAccessStrategyTest.java | 86 - .../SpringVaultClientConfigurationTests.java | 357 --- ...aultEnvironmentRepositoryFactoryTests.java | 80 - ...SpringVaultEnvironmentRepositoryTests.java | 231 -- ...RoleClientAuthenticationProviderTests.java | 150 - .../ProxyHostCredentialsProviderTest.java | 59 - .../server/proxy/ProxyHostPropertiesTest.java | 102 - .../proxy/SchemeBasedRoutePlannerTest.java | 106 - .../GenericResourceRepositoryTests.java | 192 -- .../ResourceControllerIntegrationTests.java | 215 -- .../resource/ResourceControllerTests.java | 357 --- .../ssh/FileBasedSshSessionFactoryTest.java | 96 - .../PropertyBasedSshSessionFactoryTest.java | 418 --- .../server/ssh/SshPropertyValidatorTest.java | 217 -- .../ssh/SshUriPropertyProcessorTest.java | 183 -- .../EnvironmentPropertySourceTest.java | 37 - ...pSslValidationCredentialsProviderTest.java | 256 -- .../GoogleCloudSourceSupportTests.java | 156 - .../support/HttpClient4SupportTest.java | 120 - .../server/test/ConfigServerTestUtils.java | 172 -- .../test/TestConfigServerApplication.java | 32 - .../another-config-repo/bar.properties | 1 - .../another-config-repo/git/COMMIT_EDITMSG | 1 - .../another-config-repo/git/FETCH_HEAD | 2 - .../resources/another-config-repo/git/HEAD | 1 - .../resources/another-config-repo/git/config | 5 - .../another-config-repo/git/gitk.cache | 3 - .../resources/another-config-repo/git/index | Bin 261 -> 0 bytes .../another-config-repo/git/logs/HEAD | 4 - .../git/logs/refs/heads/master | 3 - .../git/logs/refs/heads/raw | 1 - .../16/134a43183d280dc9bb3efce05c90c65d5c100a | Bin 33 -> 0 bytes .../16/33e23980f4b4dffab6e1d87b622afd9131515e | Bin 89 -> 0 bytes .../27/d0b5b449f2e8326844a735220383bf16de28b5 | 1 - .../37/09aa0e4ed6d9c76fdf3a9980f2a7f84defd630 | Bin 161 -> 0 bytes .../5f/72eaeb42ac3a2554e3cbc54291178a7c29be39 | Bin 88 -> 0 bytes .../ae/3cdf5b88ff281b7f087143289c72a5057a0278 | Bin 23 -> 0 bytes .../c4/bd92016dc14b9fe376d9c3f7af1c9d22d44ee4 | 2 - .../fa/7ee004088958d3c5e394d447fa2cb10b10f826 | Bin 59 -> 0 bytes ...edd2290fa647beaa1255881228dc90c1d53fce.idx | Bin 1268 -> 0 bytes ...dd2290fa647beaa1255881228dc90c1d53fce.pack | Bin 571 -> 0 bytes .../another-config-repo/git/refs/heads/master | 1 - .../another-config-repo/git/refs/heads/raw | 1 - .../another-config-repo/git/refs/tags/foo | 1 - .../another-config-repo/sub/application.yml | 2 - .../src/test/resources/bad.yml | 4 - .../resources/branch-with-slash-repo/bar.yml | 1 - .../branch-with-slash-repo/git/COMMIT_EDITMSG | 1 - .../resources/branch-with-slash-repo/git/HEAD | 1 - .../branch-with-slash-repo/git/config | 5 - .../branch-with-slash-repo/git/description | 1 - .../branch-with-slash-repo/git/index | Bin 137 -> 0 bytes .../branch-with-slash-repo/git/logs/HEAD | 3 - .../git/logs/refs/heads/feature/foo | 1 - .../git/logs/refs/heads/master | 3 - .../08/eb9e67a7225c302e3906a63cb9544e619fc804 | Bin 153 -> 0 bytes .../0d/706a8f14e7ec2b9abf99c603f3f5467d2d38ff | Bin 51 -> 0 bytes .../54/8298f39d0c5a84a1ada7a2b03ef54aad1fffa2 | Bin 36 -> 0 bytes .../5c/19df95639519f2286fc6d39182f271ee8c0b6b | Bin 39 -> 0 bytes .../6e/067728a52e959f60788121b4046e5b27793e61 | Bin 39 -> 0 bytes .../7a/9804f8901709bdcf794c553805d5bc5188f821 | 2 - .../91/5bd24aaf815120f2755ef4fc66404f5d37b383 | Bin 152 -> 0 bytes .../ae/c5d43644133593483b7c243f851606aa2c0128 | Bin 52 -> 0 bytes .../fa/c65b3a4678430e2b86e3b28510b37c5a7942a7 | Bin 52 -> 0 bytes .../git/refs/heads/feature/foo | 1 - .../git/refs/heads/master | 1 - .../branch-with-slash-repo/git/refs/tags/foo | 1 - .../test/resources/compositeconfigserver.yml | 9 - .../resources/config-repo/application.yml | 3 - .../test/resources/config-repo/bar.properties | 1 - .../resources/config-repo/git/COMMIT_EDITMSG | 1 - .../test/resources/config-repo/git/FETCH_HEAD | 2 - .../src/test/resources/config-repo/git/HEAD | 1 - .../src/test/resources/config-repo/git/config | 5 - .../test/resources/config-repo/git/gitk.cache | 3 - .../src/test/resources/config-repo/git/index | Bin 225 -> 0 bytes .../test/resources/config-repo/git/logs/HEAD | 9 - .../config-repo/git/logs/refs/heads/composite | 2 - .../config-repo/git/logs/refs/heads/master | 1 - .../config-repo/git/logs/refs/heads/raw | 2 - .../29/21d46f948329996d3eb4a3d11aaaff6ccda84f | Bin 160 -> 0 bytes .../7a/68a4bbc80b44c287787e2306ff9fd7de35cc54 | Bin 43 -> 0 bytes .../8f/263e4c6e65fd3fb975fddba84231fe95416b66 | Bin 99 -> 0 bytes .../a1/9381f44efc80a21996b47adf012ef105ced909 | Bin 97 -> 0 bytes .../ae/3cdf5b88ff281b7f087143289c72a5057a0278 | Bin 23 -> 0 bytes .../b5/45f7dec7feab3006c2e73969ee704a9a4def78 | Bin 31 -> 0 bytes .../e4/88193e654487b7f43e38f0865860529cb2ec79 | Bin 163 -> 0 bytes ...edd2290fa647beaa1255881228dc90c1d53fce.idx | Bin 1268 -> 0 bytes ...dd2290fa647beaa1255881228dc90c1d53fce.pack | Bin 571 -> 0 bytes .../config-repo/git/refs/heads/composite | 1 - .../config-repo/git/refs/heads/master | 1 - .../resources/config-repo/git/refs/heads/raw | 1 - .../resources/config-repo/git/refs/tags/foo | 1 - .../test/resources/config-repo/invalid.yaml | 3 - .../test/resources/config/configserver.yaml | 1 - .../resources/configserver-subversion.yml | 10 - .../src/test/resources/configserver-test.yml | 8 - .../src/test/resources/configserver.yaml | 1 - .../src/test/resources/data-jdbc.sql | 16 - .../src/test/resources/enable-bootstrap.yml | 14 - .../resources/encrypt-repo/application.yml | 8 - .../resources/encrypt-repo/bar.properties | 1 - .../encrypt-repo/enable-bootstrap.yml | 6 - .../resources/encrypt-repo/git/COMMIT_EDITMSG | 1 - .../resources/encrypt-repo/git/FETCH_HEAD | 2 - .../src/test/resources/encrypt-repo/git/HEAD | 1 - .../test/resources/encrypt-repo/git/config | 5 - .../resources/encrypt-repo/git/gitk.cache | 3 - .../src/test/resources/encrypt-repo/git/index | Bin 313 -> 0 bytes .../test/resources/encrypt-repo/git/logs/HEAD | 11 - .../git/logs/refs/heads/composite | 1 - .../encrypt-repo/git/logs/refs/heads/main | 2 - .../encrypt-repo/git/logs/refs/heads/raw | 1 - .../13/b76fa2acbef52a002372071d08d7967fee9146 | Bin 419 -> 0 bytes .../1d/3ce3ac9e4a7557e95e990c264470237ddb9488 | Bin 418 -> 0 bytes .../23/b743fe05412cf11975f0817ac8e12a13992dbe | Bin 140 -> 0 bytes .../3c/e2c946ed7061ec24f69061795b557c065d6688 | Bin 430 -> 0 bytes .../5e/5ca6033619a9aa0524a408b1c6dc7e3c9f5b07 | Bin 97 -> 0 bytes .../63/e43ddbda928b903e56f601409552bbfb7fdd99 | Bin 72 -> 0 bytes .../ad/5e0cb7036ed11ddd4b7be6ed86ad3565c8a3fc | 4 - .../ae/3cdf5b88ff281b7f087143289c72a5057a0278 | Bin 23 -> 0 bytes .../ba/97b023d1d0faa44cc337479d6a8ac1ebcdb00d | Bin 140 -> 0 bytes .../bd/414a6cc8653d7e282df0a257babc6283b83596 | Bin 160 -> 0 bytes .../e7/7c14ccb5f9e49c11b6d4172b76b0d3cf4cef56 | Bin 98 -> 0 bytes .../fb/1a59a90f034288d14dc4b607f9f76697aa972d | Bin 880 -> 0 bytes .../fd/07d827993aaf6ed7ef1b979767ee9277d1d409 | Bin 830 -> 0 bytes ...edd2290fa647beaa1255881228dc90c1d53fce.idx | Bin 1268 -> 0 bytes ...dd2290fa647beaa1255881228dc90c1d53fce.pack | Bin 571 -> 0 bytes .../encrypt-repo/git/refs/heads/composite | 1 - .../encrypt-repo/git/refs/heads/main | 1 - .../resources/encrypt-repo/git/refs/heads/raw | 1 - .../resources/encrypt-repo/git/refs/tags/foo | 1 - .../src/test/resources/foo-cloud.properties | 1 - .../test/resources/foo-development.properties | 1 - .../src/test/resources/foo-local.txt | 1 - .../src/test/resources/foo.properties | 1 - .../src/test/resources/import.yml | 5 - .../src/test/resources/keystore-bootstrap.yml | 13 - .../application.yml | 3 - .../git/COMMIT_EDITMSG | 1 - .../master-labeltest-config-repo/git/HEAD | 1 - .../master-labeltest-config-repo/git/config | 4 - .../git/description | 1 - .../git/hooks/applypatch-msg.sample | 15 - .../git/hooks/commit-msg.sample | 24 - .../git/hooks/post-update.sample | 8 - .../git/hooks/pre-applypatch.sample | 14 - .../git/hooks/pre-commit.sample | 49 - .../git/hooks/pre-push.sample | 54 - .../git/hooks/pre-rebase.sample | 169 -- .../git/hooks/prepare-commit-msg.sample | 36 - .../git/hooks/update.sample | 128 - .../master-labeltest-config-repo/git/index | Bin 214 -> 0 bytes .../git/info/exclude | 6 - .../git/logs/HEAD | 2 - .../git/logs/refs/heads/master | 2 - .../1a/138ced808f5fb3206283b292253d8ba7a99b31 | Bin 103 -> 0 bytes .../20/d30201572381d9dcaf164e1c7670557ece7257 | Bin 38 -> 0 bytes .../4e/1f25bbdca5765e279b436b5b02d05b1654515c | Bin 158 -> 0 bytes .../53/14629d4229558db9cc91fec7631833e03434b3 | Bin 65 -> 0 bytes .../96/403e4eca8ed1dc5672d4bd1f125c490a2a48f7 | Bin 43 -> 0 bytes .../c9/60eaa883ffafea56e5940baf1fc7d1b5d35b56 | 2 - .../git/refs/heads/master | 1 - .../test1-svc.properties | 2 - .../org.mockito.plugins.MockMaker | 1 - .../resources/nested-repo/application.yml | 2 - .../nested-repo/bar/application.properties | 1 - .../nested-repo/foo/application.properties | 1 - .../resources/nested-repo/git/COMMIT_EDITMSG | 1 - .../src/test/resources/nested-repo/git/HEAD | 1 - .../src/test/resources/nested-repo/git/config | 5 - .../resources/nested-repo/git/description | 1 - .../git/hooks/applypatch-msg.sample | 15 - .../nested-repo/git/hooks/commit-msg.sample | 24 - .../nested-repo/git/hooks/post-update.sample | 8 - .../git/hooks/pre-applypatch.sample | 14 - .../nested-repo/git/hooks/pre-commit.sample | 49 - .../nested-repo/git/hooks/pre-push.sample | 53 - .../nested-repo/git/hooks/pre-rebase.sample | 169 -- .../git/hooks/prepare-commit-msg.sample | 36 - .../nested-repo/git/hooks/update.sample | 128 - .../src/test/resources/nested-repo/git/index | Bin 393 -> 0 bytes .../resources/nested-repo/git/info/exclude | 6 - .../test/resources/nested-repo/git/logs/HEAD | 2 - .../nested-repo/git/logs/refs/heads/master | 2 - .../01/2b8908f80e4d19436ffaabcd08bf32f43644ec | 2 - .../04/fc9760cf5a7e9a9b3f83c02db2caf82f6489e2 | Bin 22 -> 0 bytes .../06/6ddc1017e77dc9da7e555d063eb8425653a289 | Bin 67 -> 0 bytes .../0f/663b91a15a49bed0579dba6a38009d2546c313 | Bin 67 -> 0 bytes .../16/134a43183d280dc9bb3efce05c90c65d5c100a | Bin 33 -> 0 bytes .../3d/ffcc3cddcc29e350c8ff1c11c53bf577057c56 | Bin 66 -> 0 bytes .../7d/aacd5db8d36bc6df962d1d01cb98d8713fe5c4 | Bin 23 -> 0 bytes .../87/91c22849104e1c8795747ccb678879a7c16771 | Bin 32 -> 0 bytes .../9a/9d30fda1553c5047d2f2f510accf6238b7c131 | Bin 117 -> 0 bytes .../9d/6f44a27376f0dbe4722099e138904788ef561a | 1 - .../a4/8e335bccdf3130a3b70a62e126ff580f370ac9 | Bin 117 -> 0 bytes .../ae/3cdf5b88ff281b7f087143289c72a5057a0278 | Bin 23 -> 0 bytes .../c3/bb75b147f1435d96e10bbd83046e4d140c41e3 | Bin 67 -> 0 bytes .../fa/6aef940fd8b36ee6b0f1e3b1324c31fef6eaa0 | Bin 21 -> 0 bytes .../nested-repo/git/refs/heads/master | 1 - .../ordering-repo/git/COMMIT_EDITMSG | 1 - .../src/test/resources/ordering-repo/git/HEAD | 1 - .../test/resources/ordering-repo/git/config | 7 - .../resources/ordering-repo/git/description | 1 - .../test/resources/ordering-repo/git/index | Bin 309 -> 0 bytes .../resources/ordering-repo/git/info/exclude | 6 - .../resources/ordering-repo/git/logs/HEAD | 1 - .../ordering-repo/git/logs/refs/heads/master | 1 - .../02/09d6d392d65f4ad734b9cb938889ddd40683f4 | Bin 49 -> 0 bytes .../1c/cddaee9468c2f249e75dc81e50877935955866 | Bin 90 -> 0 bytes .../7a/68a4bbc80b44c287787e2306ff9fd7de35cc54 | Bin 43 -> 0 bytes .../82/65220d6be7d73011cbc98382b499e5d7169fe7 | 2 - .../ad/bec8abd5dd965a0d9a62fc5bd457ce0dec5727 | Bin 37 -> 0 bytes .../fc/4aeb82a374f50cae0654d8db79dda083eff3d7 | Bin 65 -> 0 bytes .../ordering-repo/git/refs/heads/master | 1 - .../ordering-repo/project/application.yml | 3 - .../project/sub/application-test.yml | 2 - .../resources/resource-controller/foo.txt | 1 - .../resources/resource-encryptor/test.json | 11 - .../resource-encryptor/test.properties | 6 - .../resources/resource-encryptor/test.yml | 25 - .../src/test/resources/schema-jdbc.sql | 15 - .../src/test/resources/server.jks | Bin 5382 -> 0 bytes .../src/test/resources/ssh/key | 27 - .../test/resources/ssh/key-with-passphrase | 54 - .../src/test/resources/ssh/known_hosts | 1 - .../ssh/ssh-nested-settings-list.yml | 42 - .../resources/ssh/ssh-nested-settings.yml | 41 - .../ssh/ssh-private-key-block-list.yml | 47 - .../resources/ssh/ssh-private-key-block.yml | 46 - .../ssh/ssh-private-key-newline-list.yml | 11 - .../resources/ssh/ssh-private-key-newline.yml | 10 - .../src/test/resources/ssl-test.jks | Bin 2247 -> 0 bytes .../resources/svn-config-repo/.svn/entries | 1 - .../resources/svn-config-repo/.svn/format | 1 - ...617dee5e5e8d382f6bbc07531d5f968c4.svn-base | 3 - ...2c491aab236e1025ad5b9ace129ea5667.svn-base | 1 - .../test/resources/svn-config-repo/.svn/wc.db | Bin 34816 -> 0 bytes .../svn-config-repo/.svn/wc.db-journal | 0 .../test/resources/svn-config-repo/README.txt | 5 - .../test/resources/svn-config-repo/conf/authz | 32 - .../svn-config-repo/conf/hooks-env.tmpl | 19 - .../resources/svn-config-repo/conf/passwd | 8 - .../svn-config-repo/conf/svnserve.conf | 76 - .../test/resources/svn-config-repo/db/current | 1 - .../test/resources/svn-config-repo/db/format | 2 - .../test/resources/svn-config-repo/db/fs-type | 1 - .../resources/svn-config-repo/db/fsfs.conf | 125 - .../svn-config-repo/db/min-unpacked-rev | 1 - .../resources/svn-config-repo/db/rep-cache.db | Bin 3072 -> 0 bytes .../resources/svn-config-repo/db/revprops/0/0 | 5 - .../resources/svn-config-repo/db/revprops/0/1 | 13 - .../resources/svn-config-repo/db/revprops/0/2 | 13 - .../resources/svn-config-repo/db/revprops/0/3 | 13 - .../resources/svn-config-repo/db/revs/0/0 | 11 - .../resources/svn-config-repo/db/revs/0/1 | Bin 761 -> 0 bytes .../resources/svn-config-repo/db/revs/0/2 | 104 - .../resources/svn-config-repo/db/revs/0/3 | Bin 636 -> 0 bytes .../db/transactions/2-4.txn/node.0.0 | 9 - .../resources/svn-config-repo/db/txn-current | 1 - .../svn-config-repo/db/txn-current-lock | 0 .../test/resources/svn-config-repo/db/uuid | 1 - .../resources/svn-config-repo/db/write-lock | 0 .../src/test/resources/svn-config-repo/format | 1 - .../svn-config-repo/hooks/post-commit.tmpl | 52 - .../svn-config-repo/hooks/post-lock.tmpl | 44 - .../hooks/post-revprop-change.tmpl | 56 - .../svn-config-repo/hooks/post-unlock.tmpl | 42 - .../svn-config-repo/hooks/pre-commit.tmpl | 81 - .../svn-config-repo/hooks/pre-lock.tmpl | 73 - .../hooks/pre-revprop-change.tmpl | 66 - .../svn-config-repo/hooks/pre-unlock.tmpl | 65 - .../svn-config-repo/hooks/start-commit.tmpl | 71 - .../svn-config-repo/locks/db-logs.lock | 3 - .../resources/svn-config-repo/locks/db.lock | 3 - .../test/resources/svn-config-repo/svn.ico | Bin 180464 -> 0 bytes .../symmetric-key-bootstrap.properties | 1 - .../resources/test/bad-syntax/application.yml | 2 - .../src/test/resources/test/bar.yml | 12 - .../src/test/resources/test/baz.properties | 5 - .../test/dev/app/application.properties | 1 - .../dev/applicationxyz/application.properties | 1 - .../src/test/resources/test/dev/foo | 1 - .../test/resources/test/dev/foo.properties | 1 - .../test/dev/ignore/application.properties | 1 - .../test/resources/test/dev/placeholder.txt | 1 - .../src/test/resources/test/dev/spam/foo.txt | 1 - .../src/test/resources/test/dev/template.json | 3 - .../resources/test/foo-development.properties | 1 - .../src/test/resources/test/foo.properties | 1 - .../src/test/resources/test/import.yml | 5 - .../src/test/resources/test/import/foo.yml | 1 - .../src/test/resources/test/local/foo.txt | 1 - .../test/mysql/application.properties | 1 - .../test/reactive/application.properties | 3 - .../test1-config-repo/application.yml | 3 - .../test1-config-repo/git/COMMIT_EDITMSG | 1 - .../test/resources/test1-config-repo/git/HEAD | 1 - .../resources/test1-config-repo/git/config | 4 - .../test1-config-repo/git/description | 1 - .../git/hooks/applypatch-msg.sample | 15 - .../git/hooks/commit-msg.sample | 24 - .../git/hooks/post-update.sample | 8 - .../git/hooks/pre-applypatch.sample | 14 - .../git/hooks/pre-commit.sample | 49 - .../git/hooks/pre-push.sample | 54 - .../git/hooks/pre-rebase.sample | 169 -- .../git/hooks/prepare-commit-msg.sample | 36 - .../test1-config-repo/git/hooks/update.sample | 128 - .../resources/test1-config-repo/git/index | Bin 214 -> 0 bytes .../test1-config-repo/git/info/exclude | 6 - .../resources/test1-config-repo/git/info/refs | 1 - .../resources/test1-config-repo/git/logs/HEAD | 2 - .../git/logs/refs/heads/master | 2 - .../1a/138ced808f5fb3206283b292253d8ba7a99b31 | Bin 103 -> 0 bytes .../20/d30201572381d9dcaf164e1c7670557ece7257 | Bin 38 -> 0 bytes .../4e/1f25bbdca5765e279b436b5b02d05b1654515c | Bin 158 -> 0 bytes .../53/14629d4229558db9cc91fec7631833e03434b3 | Bin 65 -> 0 bytes .../96/403e4eca8ed1dc5672d4bd1f125c490a2a48f7 | Bin 43 -> 0 bytes .../c9/60eaa883ffafea56e5940baf1fc7d1b5d35b56 | 2 - .../test1-config-repo/git/refs/heads/master | 1 - .../test1-config-repo/test1-svc.properties | 2 - .../test2-config-repo/application.properties | 1 - .../test2-config-repo/bar.properties | 1 - .../test2-config-repo/git/COMMIT_EDITMSG | 1 - .../test2-config-repo/git/FETCH_HEAD | 2 - .../test/resources/test2-config-repo/git/HEAD | 1 - .../resources/test2-config-repo/git/ORIG_HEAD | 1 - .../resources/test2-config-repo/git/config | 5 - .../test2-config-repo/git/gitk.cache | 3 - .../resources/test2-config-repo/git/index | Bin 317 -> 0 bytes .../resources/test2-config-repo/git/logs/HEAD | 9 - .../git/logs/refs/heads/master | 6 - .../test2-config-repo/git/logs/refs/heads/raw | 1 - .../16/33e23980f4b4dffab6e1d87b622afd9131515e | Bin 89 -> 0 bytes .../27/d0b5b449f2e8326844a735220383bf16de28b5 | 1 - .../29/f2b1020f4b87e1de6aab368ff496cc4e99a959 | 1 - .../6b/b5d09918a49cdbea01ac50b8d56a334440d70e | Bin 95 -> 0 bytes .../ae/3cdf5b88ff281b7f087143289c72a5057a0278 | Bin 23 -> 0 bytes .../c4/bd92016dc14b9fe376d9c3f7af1c9d22d44ee4 | 2 - .../d8/67783f667d411e96384d5ae7d58314009fad5f | Bin 21 -> 0 bytes .../df/6fc33edab5de1a6faaaa141de2ff0d99fb99e2 | Bin 162 -> 0 bytes .../df/d1f2f006c9ea71be688e3eeaf383ff640fd21a | 2 - .../df/e21d586fc45ba72db173421c5139e26e50a7af | 2 - .../f2/0f9f10d30cd99e8133aaf9ff587c6cff0a42e4 | Bin 95 -> 0 bytes .../fa/6aef940fd8b36ee6b0f1e3b1324c31fef6eaa0 | Bin 21 -> 0 bytes ...edd2290fa647beaa1255881228dc90c1d53fce.idx | Bin 1268 -> 0 bytes ...dd2290fa647beaa1255881228dc90c1d53fce.pack | Bin 571 -> 0 bytes .../test2-config-repo/git/refs/heads/master | 1 - .../test2-config-repo/git/refs/heads/raw | 1 - .../test2-config-repo/git/refs/tags/foo | 1 - .../.flattened-pom.xml | 118 + spring-cloud-starter-config/pom.xml | 37 - src/checkstyle/checkstyle-suppressions.xml | 17 - supplemental-ui/partials/nav-search.hbs | 11 + supplemental-ui/partials/search.hbs | 27 + 835 files changed, 1764 insertions(+), 58548 deletions(-) delete mode 100644 .circleci/config.yml delete mode 100644 .editorconfig create mode 100644 .flattened-pom.xml delete mode 100644 .gitattributes delete mode 100644 .github/CONTRIBUTING.md delete mode 100644 .github/ISSUE_TEMPLATE.md delete mode 100644 .github/ISSUE_TEMPLATE/bug_report.md delete mode 100644 .github/ISSUE_TEMPLATE/feature_request.md create mode 100644 .github/workflows/deploy-docs.yml delete mode 100644 .github/workflows/maven.yaml delete mode 100644 .java-version delete mode 100644 .mvn/maven.config create mode 100644 .mvn/wrapper/MavenWrapperDownloader.java delete mode 100644 .sdkmanrc delete mode 100644 .settings.xml delete mode 100644 .springformat delete mode 100644 Guardfile delete mode 100644 LICENSE.txt rename docs/antora-playbook.yml => antora-playbook.yml (61%) create mode 100644 docs/.flattened-pom.xml delete mode 100644 docs/.github/workflows/deploy-docs.yml delete mode 100644 docs/antora.yml delete mode 100644 docs/modules/ROOT/nav.adoc delete mode 100644 docs/modules/ROOT/pages/README.adoc delete mode 100644 docs/modules/ROOT/pages/_configprops.adoc delete mode 100644 docs/modules/ROOT/pages/_observability.adoc delete mode 100644 docs/modules/ROOT/pages/index.adoc delete mode 100644 docs/modules/ROOT/pages/intro.adoc delete mode 100644 docs/modules/ROOT/pages/quickstart.adoc delete mode 100644 docs/modules/ROOT/pages/sagan-index.adoc delete mode 100644 docs/modules/ROOT/pages/spring-cloud-config.adoc delete mode 100644 docs/modules/ROOT/pages/spring-cloud-config/client.adoc delete mode 100644 docs/modules/ROOT/pages/spring-cloud-config/quick-start.adoc delete mode 100644 docs/modules/ROOT/pages/spring-cloud-config/server.adoc delete mode 100644 docs/modules/ROOT/pages/spring-cloud-config/server/-aot-and-native-image-support.adoc delete mode 100644 docs/modules/ROOT/pages/spring-cloud-config/server/actuator-and-security.adoc delete mode 100644 docs/modules/ROOT/pages/spring-cloud-config/server/creating-a-key-store-for-testing.adoc delete mode 100644 docs/modules/ROOT/pages/spring-cloud-config/server/embedding-the.adoc delete mode 100644 docs/modules/ROOT/pages/spring-cloud-config/server/encryption-and-decryption.adoc delete mode 100644 docs/modules/ROOT/pages/spring-cloud-config/server/environment-repository.adoc delete mode 100644 docs/modules/ROOT/pages/spring-cloud-config/server/environment-repository/accessing-backends-through-a-proxy.adoc delete mode 100644 docs/modules/ROOT/pages/spring-cloud-config/server/environment-repository/aws-parameter-store-backend.adoc delete mode 100644 docs/modules/ROOT/pages/spring-cloud-config/server/environment-repository/aws-parameter-store.adoc delete mode 100644 docs/modules/ROOT/pages/spring-cloud-config/server/environment-repository/aws-s3-backend.adoc delete mode 100644 docs/modules/ROOT/pages/spring-cloud-config/server/environment-repository/aws-secrets-manager-backend.adoc delete mode 100644 docs/modules/ROOT/pages/spring-cloud-config/server/environment-repository/aws-secrets-manager.adoc delete mode 100644 docs/modules/ROOT/pages/spring-cloud-config/server/environment-repository/composite-repositories.adoc delete mode 100644 docs/modules/ROOT/pages/spring-cloud-config/server/environment-repository/credhub-backend.adoc delete mode 100644 docs/modules/ROOT/pages/spring-cloud-config/server/environment-repository/file-system-backend.adoc delete mode 100644 docs/modules/ROOT/pages/spring-cloud-config/server/environment-repository/git-backend.adoc delete mode 100644 docs/modules/ROOT/pages/spring-cloud-config/server/environment-repository/jdbc-backend.adoc delete mode 100644 docs/modules/ROOT/pages/spring-cloud-config/server/environment-repository/overriding-properties-using-placeholders.adoc delete mode 100644 docs/modules/ROOT/pages/spring-cloud-config/server/environment-repository/overriding-properties-using-profiles.adoc delete mode 100644 docs/modules/ROOT/pages/spring-cloud-config/server/environment-repository/property-overrides.adoc delete mode 100644 docs/modules/ROOT/pages/spring-cloud-config/server/environment-repository/redis-backend.adoc delete mode 100644 docs/modules/ROOT/pages/spring-cloud-config/server/environment-repository/sharing-configuration-with-all-applications.adoc delete mode 100644 docs/modules/ROOT/pages/spring-cloud-config/server/environment-repository/using-bootstrap-to-override-properties.adoc delete mode 100644 docs/modules/ROOT/pages/spring-cloud-config/server/environment-repository/vault-backend.adoc delete mode 100644 docs/modules/ROOT/pages/spring-cloud-config/server/environment-repository/version-control-backend-filesystem-use.adoc delete mode 100644 docs/modules/ROOT/pages/spring-cloud-config/server/health-indicator.adoc delete mode 100644 docs/modules/ROOT/pages/spring-cloud-config/server/key-management.adoc delete mode 100644 docs/modules/ROOT/pages/spring-cloud-config/server/push-notifications-and-bus.adoc delete mode 100644 docs/modules/ROOT/pages/spring-cloud-config/server/security.adoc delete mode 100644 docs/modules/ROOT/pages/spring-cloud-config/server/serving-alternative-formats.adoc delete mode 100644 docs/modules/ROOT/pages/spring-cloud-config/server/serving-binary-files.adoc delete mode 100644 docs/modules/ROOT/pages/spring-cloud-config/server/serving-encrypted-properties.adoc delete mode 100644 docs/modules/ROOT/pages/spring-cloud-config/server/serving-plain-text.adoc delete mode 100644 docs/modules/ROOT/pages/spring-cloud-config/server/using-multiple-keys-and-key-rotation.adoc delete mode 100644 docs/pom.xml delete mode 100755 docs/src/main/asciidoc/ghpages.sh delete mode 100644 sample.groovy create mode 100644 spring-cloud-config-client-tls-tests/.flattened-pom.xml delete mode 100644 spring-cloud-config-client-tls-tests/pom.xml delete mode 100644 spring-cloud-config-client-tls-tests/src/test/java/org/springframework/cloud/config/client/tls/AbstractTlsSetup.java delete mode 100644 spring-cloud-config-client-tls-tests/src/test/java/org/springframework/cloud/config/client/tls/AppRunner.java delete mode 100644 spring-cloud-config-client-tls-tests/src/test/java/org/springframework/cloud/config/client/tls/ConfigClientConfigDataTlsTests.java delete mode 100644 spring-cloud-config-client-tls-tests/src/test/java/org/springframework/cloud/config/client/tls/ConfigClientTlsTests.java delete mode 100644 spring-cloud-config-client-tls-tests/src/test/java/org/springframework/cloud/config/client/tls/KeyAndCert.java delete mode 100644 spring-cloud-config-client-tls-tests/src/test/java/org/springframework/cloud/config/client/tls/KeyTool.java delete mode 100644 spring-cloud-config-client-tls-tests/src/test/java/org/springframework/cloud/config/client/tls/TlsConfigClientRunner.java delete mode 100644 spring-cloud-config-client-tls-tests/src/test/java/org/springframework/cloud/config/client/tls/TlsConfigServerRunner.java delete mode 100644 spring-cloud-config-client-tls-tests/src/test/resources/test/config/application.properties create mode 100644 spring-cloud-config-client/.flattened-pom.xml delete mode 100644 spring-cloud-config-client/pom.xml delete mode 100644 spring-cloud-config-client/src/main/java/org/springframework/cloud/config/client/ConfigClientAutoConfiguration.java delete mode 100644 spring-cloud-config-client/src/main/java/org/springframework/cloud/config/client/ConfigClientFailFastException.java delete mode 100644 spring-cloud-config-client/src/main/java/org/springframework/cloud/config/client/ConfigClientHealthProperties.java delete mode 100644 spring-cloud-config-client/src/main/java/org/springframework/cloud/config/client/ConfigClientProperties.java delete mode 100644 spring-cloud-config-client/src/main/java/org/springframework/cloud/config/client/ConfigClientRequestTemplateFactory.java delete mode 100644 spring-cloud-config-client/src/main/java/org/springframework/cloud/config/client/ConfigClientRetryBootstrapper.java delete mode 100644 spring-cloud-config-client/src/main/java/org/springframework/cloud/config/client/ConfigClientStateHolder.java delete mode 100644 spring-cloud-config-client/src/main/java/org/springframework/cloud/config/client/ConfigClientWatch.java delete mode 100644 spring-cloud-config-client/src/main/java/org/springframework/cloud/config/client/ConfigServerBootstrapper.java delete mode 100644 spring-cloud-config-client/src/main/java/org/springframework/cloud/config/client/ConfigServerConfigDataLoader.java delete mode 100644 spring-cloud-config-client/src/main/java/org/springframework/cloud/config/client/ConfigServerConfigDataLocationResolver.java delete mode 100644 spring-cloud-config-client/src/main/java/org/springframework/cloud/config/client/ConfigServerConfigDataMissingEnvironmentPostProcessor.java delete mode 100644 spring-cloud-config-client/src/main/java/org/springframework/cloud/config/client/ConfigServerConfigDataResource.java delete mode 100644 spring-cloud-config-client/src/main/java/org/springframework/cloud/config/client/ConfigServerHealthIndicator.java delete mode 100644 spring-cloud-config-client/src/main/java/org/springframework/cloud/config/client/ConfigServerInstanceMonitor.java delete mode 100644 spring-cloud-config-client/src/main/java/org/springframework/cloud/config/client/ConfigServerInstanceProvider.java delete mode 100644 spring-cloud-config-client/src/main/java/org/springframework/cloud/config/client/ConfigServiceBootstrapConfiguration.java delete mode 100644 spring-cloud-config-client/src/main/java/org/springframework/cloud/config/client/ConfigServicePropertySourceLocator.java delete mode 100644 spring-cloud-config-client/src/main/java/org/springframework/cloud/config/client/DiscoveryClientConfigServiceBootstrapConfiguration.java delete mode 100644 spring-cloud-config-client/src/main/java/org/springframework/cloud/config/client/RetryProperties.java delete mode 100644 spring-cloud-config-client/src/main/java/org/springframework/cloud/config/client/RetryTemplateFactory.java delete mode 100644 spring-cloud-config-client/src/main/java/org/springframework/cloud/config/client/diagnostics/analyzer/InvalidApplicationNameExceptionFailureAnalyzer.java delete mode 100644 spring-cloud-config-client/src/main/java/org/springframework/cloud/config/client/validation/InvalidApplicationNameException.java delete mode 100644 spring-cloud-config-client/src/main/java/org/springframework/cloud/config/environment/Environment.java delete mode 100644 spring-cloud-config-client/src/main/java/org/springframework/cloud/config/environment/EnvironmentMediaType.java delete mode 100644 spring-cloud-config-client/src/main/java/org/springframework/cloud/config/environment/PropertySource.java delete mode 100644 spring-cloud-config-client/src/main/java/org/springframework/cloud/config/environment/PropertyValueDescriptor.java delete mode 100644 spring-cloud-config-client/src/main/resources/META-INF/spring.factories delete mode 100644 spring-cloud-config-client/src/main/resources/META-INF/spring/aot.factories delete mode 100644 spring-cloud-config-client/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports delete mode 100644 spring-cloud-config-client/src/test/java/org/springframework/cloud/config/client/BaseDiscoveryClientConfigServiceBootstrapConfigurationTests.java delete mode 100644 spring-cloud-config-client/src/test/java/org/springframework/cloud/config/client/ConfigClientAutoConfigurationTests.java delete mode 100644 spring-cloud-config-client/src/test/java/org/springframework/cloud/config/client/ConfigClientConfigDataLoaderTest.java delete mode 100644 spring-cloud-config-client/src/test/java/org/springframework/cloud/config/client/ConfigClientPropertiesTests.java delete mode 100644 spring-cloud-config-client/src/test/java/org/springframework/cloud/config/client/ConfigClientWatchTests.java delete mode 100644 spring-cloud-config-client/src/test/java/org/springframework/cloud/config/client/ConfigServerBootstrapConfigurationTests.java delete mode 100644 spring-cloud-config-client/src/test/java/org/springframework/cloud/config/client/ConfigServerConfigDataCustomizationIntegrationTests.java delete mode 100644 spring-cloud-config-client/src/test/java/org/springframework/cloud/config/client/ConfigServerConfigDataLoaderTests.java delete mode 100644 spring-cloud-config-client/src/test/java/org/springframework/cloud/config/client/ConfigServerConfigDataLocationResolverTests.java delete mode 100644 spring-cloud-config-client/src/test/java/org/springframework/cloud/config/client/ConfigServerConfigDataMissingEnvironmentPostProcessorTests.java delete mode 100644 spring-cloud-config-client/src/test/java/org/springframework/cloud/config/client/ConfigServerConfigDataNoImportIntegrationTests.java delete mode 100644 spring-cloud-config-client/src/test/java/org/springframework/cloud/config/client/ConfigServerConfigDataResourceTests.java delete mode 100644 spring-cloud-config-client/src/test/java/org/springframework/cloud/config/client/ConfigServerHealthIndicatorTests.java delete mode 100644 spring-cloud-config-client/src/test/java/org/springframework/cloud/config/client/ConfigServiceBootstrapConfigurationTest.java delete mode 100644 spring-cloud-config-client/src/test/java/org/springframework/cloud/config/client/ConfigServicePropertySourceLocatorTests.java delete mode 100644 spring-cloud-config-client/src/test/java/org/springframework/cloud/config/client/DiscoveryClientConfigDataConfigurationNoRetryTests.java delete mode 100644 spring-cloud-config-client/src/test/java/org/springframework/cloud/config/client/DiscoveryClientConfigDataConfigurationTests.java delete mode 100644 spring-cloud-config-client/src/test/java/org/springframework/cloud/config/client/DiscoveryClientConfigServiceBootstrapConfigurationNoSpringRetryTests.java delete mode 100644 spring-cloud-config-client/src/test/java/org/springframework/cloud/config/client/DiscoveryClientConfigServiceBootstrapConfigurationTests.java delete mode 100644 spring-cloud-config-client/src/test/java/org/springframework/cloud/config/environment/EnvironmentTests.java delete mode 100644 spring-cloud-config-client/src/test/resources/applicationname.yaml delete mode 100644 spring-cloud-config-dependencies/pom.xml create mode 100644 spring-cloud-config-monitor/.flattened-pom.xml delete mode 100644 spring-cloud-config-monitor/pom.xml delete mode 100755 spring-cloud-config-monitor/src/main/java/org/springframework/cloud/config/monitor/BasePropertyPathNotificationExtractor.java delete mode 100644 spring-cloud-config-monitor/src/main/java/org/springframework/cloud/config/monitor/BitbucketPropertyPathNotificationExtractor.java delete mode 100644 spring-cloud-config-monitor/src/main/java/org/springframework/cloud/config/monitor/CompositePropertyPathNotificationExtractor.java delete mode 100644 spring-cloud-config-monitor/src/main/java/org/springframework/cloud/config/monitor/EnvironmentMonitorAutoConfiguration.java delete mode 100644 spring-cloud-config-monitor/src/main/java/org/springframework/cloud/config/monitor/FileMonitorConfiguration.java delete mode 100755 spring-cloud-config-monitor/src/main/java/org/springframework/cloud/config/monitor/GiteaPropertyPathNotificationExtractor.java delete mode 100644 spring-cloud-config-monitor/src/main/java/org/springframework/cloud/config/monitor/GiteePropertyPathNotificationExtractor.java delete mode 100644 spring-cloud-config-monitor/src/main/java/org/springframework/cloud/config/monitor/GithubPropertyPathNotificationExtractor.java delete mode 100644 spring-cloud-config-monitor/src/main/java/org/springframework/cloud/config/monitor/GitlabPropertyPathNotificationExtractor.java delete mode 100755 spring-cloud-config-monitor/src/main/java/org/springframework/cloud/config/monitor/GogsPropertyPathNotificationExtractor.java delete mode 100644 spring-cloud-config-monitor/src/main/java/org/springframework/cloud/config/monitor/PropertyPathEndpoint.java delete mode 100644 spring-cloud-config-monitor/src/main/java/org/springframework/cloud/config/monitor/PropertyPathNotification.java delete mode 100644 spring-cloud-config-monitor/src/main/java/org/springframework/cloud/config/monitor/PropertyPathNotificationExtractor.java delete mode 100644 spring-cloud-config-monitor/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports delete mode 100644 spring-cloud-config-monitor/src/test/java/org/springframework/cloud/config/monitor/BitbucketPropertyPathNotificationExtractorTests.java delete mode 100644 spring-cloud-config-monitor/src/test/java/org/springframework/cloud/config/monitor/CompositePropertyPathNotificationExtractorTests.java delete mode 100644 spring-cloud-config-monitor/src/test/java/org/springframework/cloud/config/monitor/EnvironmentMonitorAutoConfigurationTests.java delete mode 100644 spring-cloud-config-monitor/src/test/java/org/springframework/cloud/config/monitor/FileMonitorConfigurationTest.java delete mode 100755 spring-cloud-config-monitor/src/test/java/org/springframework/cloud/config/monitor/GiteaPropertyPathNotificationExtractorTests.java delete mode 100644 spring-cloud-config-monitor/src/test/java/org/springframework/cloud/config/monitor/GiteePropertyPathNotificationExtractorTests.java delete mode 100644 spring-cloud-config-monitor/src/test/java/org/springframework/cloud/config/monitor/GithubPropertyPathNotificationExtractorTests.java delete mode 100644 spring-cloud-config-monitor/src/test/java/org/springframework/cloud/config/monitor/GitlabPropertyPathNotificationExtractorTests.java delete mode 100755 spring-cloud-config-monitor/src/test/java/org/springframework/cloud/config/monitor/GogsPropertyPathNotificationExtractorTests.java delete mode 100644 spring-cloud-config-monitor/src/test/java/org/springframework/cloud/config/monitor/PropertyPathEndpointTests.java delete mode 100755 spring-cloud-config-monitor/src/test/resources/gitea.json delete mode 100644 spring-cloud-config-monitor/src/test/resources/gitee.json delete mode 100644 spring-cloud-config-monitor/src/test/resources/gitlab.json delete mode 100644 spring-cloud-config-monitor/src/test/resources/pathsamples/bitbucket-invalid.json delete mode 100644 spring-cloud-config-monitor/src/test/resources/pathsamples/bitbucket.json delete mode 100644 spring-cloud-config-monitor/src/test/resources/pathsamples/bitbucketserver-invalid.json delete mode 100644 spring-cloud-config-monitor/src/test/resources/pathsamples/bitbucketserver-prmerged.json delete mode 100644 spring-cloud-config-monitor/src/test/resources/pathsamples/bitbucketserver.json delete mode 100755 spring-cloud-config-monitor/src/test/resources/pathsamples/gitea.json delete mode 100644 spring-cloud-config-monitor/src/test/resources/pathsamples/gitee.json delete mode 100644 spring-cloud-config-monitor/src/test/resources/pathsamples/github.json delete mode 100644 spring-cloud-config-monitor/src/test/resources/pathsamples/gitlab.json delete mode 100755 spring-cloud-config-monitor/src/test/resources/pathsamples/gogs.json create mode 100644 spring-cloud-config-sample/.flattened-pom.xml delete mode 100644 spring-cloud-config-sample/pom.xml delete mode 100644 spring-cloud-config-sample/src/main/java/sample/Application.java delete mode 100644 spring-cloud-config-sample/src/main/resources/application.yml delete mode 100644 spring-cloud-config-sample/src/main/resources/bootstrap.yml delete mode 100644 spring-cloud-config-sample/src/main/resources/bootstrapservercomposite.yml delete mode 100644 spring-cloud-config-sample/src/test/java/sample/ApplicationBootstrapTests.java delete mode 100644 spring-cloud-config-sample/src/test/java/sample/ApplicationFailFastTests.java delete mode 100644 spring-cloud-config-sample/src/test/java/sample/ApplicationTests.java delete mode 100644 spring-cloud-config-sample/src/test/java/sample/ConfigDataCustomMediaTypeIntegrationTests.java delete mode 100644 spring-cloud-config-sample/src/test/java/sample/ConfigDataIntegrationTests.java delete mode 100644 spring-cloud-config-sample/src/test/java/sample/ConfigDataOrderingIntegrationTests.java delete mode 100644 spring-cloud-config-sample/src/test/java/sample/ConfigDataOrderingVaultIntegrationTests.java delete mode 100644 spring-cloud-config-sample/src/test/java/sample/ConfigDataRetryIntegrationTests.java delete mode 100644 spring-cloud-config-sample/src/test/java/sample/ServerNativeApplicationTests.java delete mode 100644 spring-cloud-config-sample/src/test/resources/bad.yml delete mode 100644 spring-cloud-config-sample/src/test/resources/config-repo/application.yml delete mode 100644 spring-cloud-config-sample/src/test/resources/config-repo/bar.properties delete mode 100644 spring-cloud-config-sample/src/test/resources/config-repo/git/COMMIT_EDITMSG delete mode 100644 spring-cloud-config-sample/src/test/resources/config-repo/git/FETCH_HEAD delete mode 100644 spring-cloud-config-sample/src/test/resources/config-repo/git/HEAD delete mode 100644 spring-cloud-config-sample/src/test/resources/config-repo/git/config delete mode 100644 spring-cloud-config-sample/src/test/resources/config-repo/git/gitk.cache delete mode 100644 spring-cloud-config-sample/src/test/resources/config-repo/git/index delete mode 100644 spring-cloud-config-sample/src/test/resources/config-repo/git/logs/HEAD delete mode 100644 spring-cloud-config-sample/src/test/resources/config-repo/git/logs/refs/heads/master delete mode 100644 spring-cloud-config-sample/src/test/resources/config-repo/git/logs/refs/heads/raw delete mode 100644 spring-cloud-config-sample/src/test/resources/config-repo/git/objects/7a/68a4bbc80b44c287787e2306ff9fd7de35cc54 delete mode 100644 spring-cloud-config-sample/src/test/resources/config-repo/git/objects/a1/9381f44efc80a21996b47adf012ef105ced909 delete mode 100644 spring-cloud-config-sample/src/test/resources/config-repo/git/objects/ae/3cdf5b88ff281b7f087143289c72a5057a0278 delete mode 100644 spring-cloud-config-sample/src/test/resources/config-repo/git/objects/b5/1bc19694589d21c06bab8a4f14660b3303d7b0 delete mode 100644 spring-cloud-config-sample/src/test/resources/config-repo/git/objects/pack/pack-d4edd2290fa647beaa1255881228dc90c1d53fce.idx delete mode 100644 spring-cloud-config-sample/src/test/resources/config-repo/git/objects/pack/pack-d4edd2290fa647beaa1255881228dc90c1d53fce.pack delete mode 100644 spring-cloud-config-sample/src/test/resources/config-repo/git/refs/heads/master delete mode 100644 spring-cloud-config-sample/src/test/resources/config-repo/git/refs/heads/raw delete mode 100644 spring-cloud-config-sample/src/test/resources/config-repo/git/refs/tags/foo delete mode 100644 spring-cloud-config-sample/src/test/resources/config/profilesample-dev.yml delete mode 100644 spring-cloud-config-sample/src/test/resources/config/profilesample.yml delete mode 100644 spring-cloud-config-sample/src/test/resources/logback-test.xml delete mode 100644 spring-cloud-config-sample/src/test/resources/orderingtest.yml delete mode 100644 spring-cloud-config-sample/src/test/resources/server.yml delete mode 100644 spring-cloud-config-sample/src/test/resources/vaultordering/client-dev.yml delete mode 100644 spring-cloud-config-sample/src/test/resources/vaultordering/server.yml delete mode 100644 spring-cloud-config-sample/src/test/resources/vaultordering/vault-test-repo/client-app-dev.yml delete mode 100644 spring-cloud-config-sample/src/test/resources/vaultordering/vault-test-repo/client-app.yml delete mode 100644 spring-cloud-config-sample/src/test/resources/vaultordering/vault_test_policy.txt create mode 100644 spring-cloud-config-server/.flattened-pom.xml delete mode 100644 spring-cloud-config-server/pom.xml delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/ConfigServerApplication.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/EnableConfigServer.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/bootstrap/ConfigServerBootstrapApplicationListener.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/bootstrap/ConfigServerBootstrapConfiguration.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/bootstrap/ConfigServerBootstrapOverridesAutoConfiguration.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/composite/CompositeEnvironmentBeanFactoryPostProcessor.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/composite/CompositeUtils.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/composite/ConditionalOnMissingSearchPathLocator.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/composite/ConditionalOnSearchPathLocator.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/composite/OnSearchPathLocatorPresent.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/config/CompositeConfiguration.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/config/ConfigServerAutoConfiguration.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/config/ConfigServerConfiguration.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/config/ConfigServerEncryptionConfiguration.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/config/ConfigServerHealthIndicator.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/config/ConfigServerMvcConfiguration.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/config/ConfigServerProperties.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/config/CredhubConfiguration.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/config/DefaultTextEncryptionAutoConfiguration.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/config/EncryptionAutoConfiguration.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/config/EnvironmentRepositoryConfiguration.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/config/GoogleCloudSourceConfiguration.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/config/ResourceEncryptorConfiguration.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/config/ResourceRepositoryConfiguration.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/config/RsaEncryptionAutoConfiguration.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/config/VaultConfiguration.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/config/VaultEncryptionAutoConfiguration.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/diagnostics/GitUriFailureAnalyzer.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/encryption/AbstractCipherResourceEncryptor.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/encryption/CipherEnvironmentEncryptor.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/encryption/CipherResourceJsonEncryptor.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/encryption/CipherResourcePropertiesEncryptor.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/encryption/CipherResourceYamlEncryptor.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/encryption/EncryptionController.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/encryption/EnvironmentEncryptor.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/encryption/EnvironmentPrefixHelper.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/encryption/KeyStoreTextEncryptorLocator.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/encryption/LocatorTextEncryptor.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/encryption/PassthruSecretLocator.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/encryption/ResourceEncryptor.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/encryption/SecretLocator.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/encryption/SingleTextEncryptorLocator.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/encryption/TextEncryptorLocator.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/encryption/vault/VaultEnvironmentEncryptor.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/environment/AbstractScmEnvironmentRepository.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/environment/AbstractVaultEnvironmentRepository.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/environment/AwsClientBuilderConfigurer.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/environment/AwsParameterStoreEnvironmentProperties.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/environment/AwsParameterStoreEnvironmentRepository.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/environment/AwsParameterStoreEnvironmentRepositoryFactory.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/environment/AwsS3EnvironmentProperties.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/environment/AwsS3EnvironmentRepository.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/environment/AwsS3EnvironmentRepositoryFactory.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/environment/AwsSecretsManagerEnvironmentProperties.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/environment/AwsSecretsManagerEnvironmentRepository.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/environment/AwsSecretsManagerEnvironmentRepositoryFactory.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/environment/CompositeEnvironmentRepository.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/environment/ConfigTokenProvider.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/environment/ConfigurableHttpConnectionFactory.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/environment/ConsulEnvironmentWatch.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/environment/CredhubEnvironmentProperties.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/environment/CredhubEnvironmentRepository.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/environment/CredhubEnvironmentRepositoryFactory.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/environment/DocumentedConfigObservation.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/environment/EnvironmentCleaner.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/environment/EnvironmentConfigTokenProvider.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/environment/EnvironmentController.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/environment/EnvironmentEncryptorEnvironmentRepository.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/environment/EnvironmentException.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/environment/EnvironmentNotFoundException.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/environment/EnvironmentRepository.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/environment/EnvironmentRepositoryFactory.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/environment/EnvironmentRepositoryPropertySourceLocator.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/environment/EnvironmentWatch.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/environment/FailedToConstructEnvironmentException.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/environment/GoogleSecretManagerEnvironmentProperties.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/environment/GoogleSecretManagerEnvironmentRepository.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/environment/GoogleSecretManagerEnvironmentRepositoryFactory.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/environment/HttpClientConfigurableHttpConnectionFactory.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/environment/HttpClientVaultRestTemplateFactory.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/environment/HttpRequestConfigTokenProvider.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/environment/InvalidEnvironmentRequestException.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/environment/JGitEnvironmentProperties.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/environment/JGitEnvironmentRepository.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/environment/JdbcEnvironmentProperties.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/environment/JdbcEnvironmentRepository.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/environment/JdbcEnvironmentRepositoryFactory.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/environment/MultipleJGitEnvironmentProperties.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/environment/MultipleJGitEnvironmentRepository.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/environment/MultipleJGitEnvironmentRepositoryFactory.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/environment/NativeEnvironmentProperties.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/environment/NativeEnvironmentRepository.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/environment/NativeEnvironmentRepositoryFactory.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/environment/NoSuchLabelException.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/environment/NoSuchRepositoryException.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/environment/ObservationEnvironmentRepositoryContext.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/environment/ObservationEnvironmentRepositoryObservationConvention.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/environment/ObservationEnvironmentRepositoryWrapper.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/environment/PassthruEnvironmentRepository.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/environment/RedisEnvironmentProperties.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/environment/RedisEnvironmentRepository.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/environment/RedisEnvironmentRepositoryFactory.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/environment/RepositoryException.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/environment/SearchPathCompositeEnvironmentRepository.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/environment/SearchPathLocator.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/environment/SerializableMapPropertySource.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/environment/SvnEnvironmentRepositoryFactory.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/environment/SvnKitEnvironmentProperties.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/environment/SvnKitEnvironmentRepository.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/environment/VaultEnvironmentProperties.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/environment/VaultEnvironmentRepository.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/environment/VaultEnvironmentRepositoryFactory.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/environment/VaultKvAccessStrategy.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/environment/VaultKvAccessStrategyFactory.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/environment/VaultKvAccessStrategySupport.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/environment/secretmanager/GoogleConfigProvider.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/environment/secretmanager/GoogleSecretComparatorByVersion.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/environment/secretmanager/GoogleSecretManagerAccessStrategy.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/environment/secretmanager/GoogleSecretManagerAccessStrategyFactory.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/environment/secretmanager/GoogleSecretManagerV1AccessStrategy.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/environment/secretmanager/HttpHeaderGoogleConfigProvider.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/environment/vault/SpringVaultClientAuthenticationProvider.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/environment/vault/SpringVaultClientConfiguration.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/environment/vault/SpringVaultEnvironmentRepository.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/environment/vault/SpringVaultEnvironmentRepositoryFactory.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/environment/vault/authentication/AppRoleClientAuthenticationProvider.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/environment/vault/authentication/AwsEc2ClientAuthenticationProvider.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/environment/vault/authentication/AwsIamClientAuthenticationProvider.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/environment/vault/authentication/AzureMsiClientAuthenticationProvider.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/environment/vault/authentication/CertificateClientAuthenticationProvider.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/environment/vault/authentication/CubbyholeClientAuthenticationProvider.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/environment/vault/authentication/GcpGceClientAuthenticationProvider.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/environment/vault/authentication/GcpIamClientAuthenticationProvider.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/environment/vault/authentication/KubernetesClientAuthenticationProvider.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/environment/vault/authentication/PcfClientAuthenticationProvider.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/environment/vault/authentication/TokenClientAuthenticationProvider.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/proxy/ProxyHostCredentialsProvider.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/proxy/ProxyHostProperties.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/proxy/SchemeBasedRoutePlanner.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/resource/GenericResourceRepository.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/resource/NoSuchResourceException.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/resource/ResourceController.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/resource/ResourceControllerAdvice.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/resource/ResourceRepository.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/ssh/FileBasedSshSessionFactory.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/ssh/FileBasedSshTransportConfigCallback.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/ssh/HostKeyAlgoSupported.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/ssh/HostKeyAlgoSupportedValidator.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/ssh/HostKeyAndAlgoBothExist.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/ssh/HostKeyAndAlgoBothExistValidator.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/ssh/KeyPairUtils.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/ssh/KnownHostsFileIsValid.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/ssh/KnownHostsFileValidator.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/ssh/PrivateKeyIsValid.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/ssh/PrivateKeyValidator.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/ssh/PropertiesBasedSshTransportConfigCallback.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/ssh/PropertyBasedSshSessionFactory.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/ssh/SshPropertyValidator.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/ssh/SshUriPropertyProcessor.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/support/AbstractScmAccessor.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/support/AbstractScmAccessorProperties.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/support/AwsCodeCommitCredentialProvider.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/support/CredentialException.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/support/EnvironmentPropertySource.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/support/EnvironmentRepositoryProperties.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/support/GitCredentialsProviderFactory.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/support/GitSkipSslValidationCredentialsProvider.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/support/GoogleCloudSourceSupport.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/support/HttpClient4Support.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/support/HttpClientSupport.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/support/HttpEnvironmentRepositoryProperties.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/support/PassphraseCredentialsProvider.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/support/PathUtils.java delete mode 100644 spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/support/TransportConfigCallbackFactory.java delete mode 100644 spring-cloud-config-server/src/main/resources/META-INF/spring.factories delete mode 100644 spring-cloud-config-server/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports delete mode 100644 spring-cloud-config-server/src/main/resources/configserver.yml delete mode 100644 spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/AdhocTestSuite.java delete mode 100644 spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/AwsS3IntegrationTests.java delete mode 100644 spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/BootstrapConfigServerIntegrationTests.java delete mode 100644 spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/CompositeClasspathTests.java delete mode 100644 spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/CompositeIntegrationTests.java delete mode 100644 spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/ConfigClientBackwardsCompatibilityIntegrationTests.java delete mode 100644 spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/ConfigClientOffIntegrationTests.java delete mode 100644 spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/ConfigClientOnIntegrationTests.java delete mode 100644 spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/ConfigServerApplicationTests.java delete mode 100644 spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/CredhubCompositeConfigServerIntegrationTests.java delete mode 100644 spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/CredhubConfigServerIntegrationTests.java delete mode 100644 spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/CredhubIntegrationTest.java delete mode 100644 spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/NativeConfigServerIntegrationTests.java delete mode 100644 spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/ObservationIntegrationTests.java delete mode 100644 spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/RefreshableConfigServerIntegrationTests.java delete mode 100644 spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/SubversionConfigServerIntegrationTests.java delete mode 100644 spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/TransportConfigurationIntegrationTests.java delete mode 100644 spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/VanillaConfigServerIntegrationTests.java delete mode 100644 spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/composite/CompositUtilsTests.java delete mode 100644 spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/config/ConfigServerHealthIndicatorTests.java delete mode 100644 spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/config/CustomCompositeEnvironmentRepositoryTests.java delete mode 100644 spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/config/CustomEnvironmentRepositoryTests.java delete mode 100644 spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/config/EnvironmentRepositoryConfigurationTests.java delete mode 100644 spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/config/HttpClientVaultRestTemplateFactoryTest.java delete mode 100644 spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/credentials/AwsCodeCommitCredentialsProviderTests.java delete mode 100644 spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/credentials/GitCredentialsProviderFactoryTests.java delete mode 100644 spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/encryption/CipherEnvironmentEncryptorTests.java delete mode 100644 spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/encryption/CipherResourceJsonEncryptorTests.java delete mode 100644 spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/encryption/CipherResourcePropertiesEncryptorTests.java delete mode 100644 spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/encryption/CipherResourceYamlEncryptorTests.java delete mode 100644 spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/encryption/EncryptionControllerMultiTextEncryptorTests.java delete mode 100644 spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/encryption/EncryptionControllerTests.java delete mode 100644 spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/encryption/EncryptionIntegrationTests.java delete mode 100644 spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/encryption/EnvironmentPrefixHelperTests.java delete mode 100644 spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/encryption/KeyStoreTextEncryptorLocatorTests.java delete mode 100644 spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/encryption/vault/VaultEnvironmentEncryptorTests.java delete mode 100644 spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/environment/AWSParameterStoreEnvironmentRepositoryUnitTest.java delete mode 100644 spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/environment/AwsParameterStoreEnvironmentRepositoryTests.java delete mode 100644 spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/environment/AwsS3EnvironmentRepositoryTests.java delete mode 100644 spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/environment/AwsSecretsManagerEnvironmentRepositoryTests.java delete mode 100644 spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/environment/CompositeEnvironmentRepositoryTests.java delete mode 100644 spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/environment/ConfigurableHttpConnectionFactoryIntegrationTests.java delete mode 100644 spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/environment/CredhubEnvironmentRepositoryTests.java delete mode 100644 spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/environment/EnvironmentControllerIntegrationTests.java delete mode 100644 spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/environment/EnvironmentControllerTests.java delete mode 100644 spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/environment/EnvironmentEncryptorEnvironmentRepositoryTests.java delete mode 100644 spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/environment/GoogleSecretManagerEnvironmentRepositoryTests.java delete mode 100644 spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/environment/HttpClientConfigurableHttpConnectionFactoryTest.java delete mode 100644 spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/environment/HttpRequestConfigTokenProviderTests.java delete mode 100644 spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/environment/JGitConfigServerTestData.java delete mode 100644 spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/environment/JGitEnvironmentRepositoryConcurrencyTests.java delete mode 100644 spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/environment/JGitEnvironmentRepositoryIntegrationTests.java delete mode 100644 spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/environment/JGitEnvironmentRepositorySslTests.java delete mode 100644 spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/environment/JGitEnvironmentRepositoryTests.java delete mode 100644 spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/environment/JdbcEnvironmentRepositoryConfigurationTests.java delete mode 100644 spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/environment/JdbcEnvironmentRepositoryTests.java delete mode 100644 spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/environment/MultipleJGitEnvironmentApplicationPlaceholderRepositoryTests.java delete mode 100644 spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/environment/MultipleJGitEnvironmentLabelPlaceholderRepositoryTests.java delete mode 100644 spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/environment/MultipleJGitEnvironmentProfilePlaceholderRepositoryTests.java delete mode 100644 spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/environment/MultipleJGitEnvironmentRepositoryFactoryTests.java delete mode 100644 spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/environment/MultipleJGitEnvironmentRepositoryIntegrationTests.java delete mode 100644 spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/environment/MultipleJGitEnvironmentRepositoryTests.java delete mode 100644 spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/environment/NativeEnvironmentRepositoryFactoryTest.java delete mode 100644 spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/environment/NativeEnvironmentRepositoryTests.java delete mode 100644 spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/environment/ObservationEnvironmentRepositoryWrapperTests.java delete mode 100644 spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/environment/PassthruEnvironmentRepositoryTests.java delete mode 100644 spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/environment/RedisEnvironmentRepositoryIntegrationTests.java delete mode 100644 spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/environment/SVNKitEnvironmentRepositoryIntegrationTests.java delete mode 100644 spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/environment/SVNKitEnvironmentRepositoryTests.java delete mode 100644 spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/environment/VaultEnvironmentRepositoryIntegrationTests.java delete mode 100644 spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/environment/VaultEnvironmentRepositoryTests.java delete mode 100644 spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/environment/VaultKvAccessStrategyFactoryTest.java delete mode 100644 spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/environment/VaultKvAccessStrategyTest.java delete mode 100644 spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/environment/vault/SpringVaultClientConfigurationTests.java delete mode 100644 spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/environment/vault/SpringVaultEnvironmentRepositoryFactoryTests.java delete mode 100644 spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/environment/vault/SpringVaultEnvironmentRepositoryTests.java delete mode 100644 spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/environment/vault/authentication/AppRoleClientAuthenticationProviderTests.java delete mode 100644 spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/proxy/ProxyHostCredentialsProviderTest.java delete mode 100644 spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/proxy/ProxyHostPropertiesTest.java delete mode 100644 spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/proxy/SchemeBasedRoutePlannerTest.java delete mode 100644 spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/resource/GenericResourceRepositoryTests.java delete mode 100644 spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/resource/ResourceControllerIntegrationTests.java delete mode 100644 spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/resource/ResourceControllerTests.java delete mode 100644 spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/ssh/FileBasedSshSessionFactoryTest.java delete mode 100644 spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/ssh/PropertyBasedSshSessionFactoryTest.java delete mode 100644 spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/ssh/SshPropertyValidatorTest.java delete mode 100644 spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/ssh/SshUriPropertyProcessorTest.java delete mode 100644 spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/support/EnvironmentPropertySourceTest.java delete mode 100644 spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/support/GitSkipSslValidationCredentialsProviderTest.java delete mode 100644 spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/support/GoogleCloudSourceSupportTests.java delete mode 100644 spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/support/HttpClient4SupportTest.java delete mode 100644 spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/test/ConfigServerTestUtils.java delete mode 100644 spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/test/TestConfigServerApplication.java delete mode 100644 spring-cloud-config-server/src/test/resources/another-config-repo/bar.properties delete mode 100644 spring-cloud-config-server/src/test/resources/another-config-repo/git/COMMIT_EDITMSG delete mode 100644 spring-cloud-config-server/src/test/resources/another-config-repo/git/FETCH_HEAD delete mode 100644 spring-cloud-config-server/src/test/resources/another-config-repo/git/HEAD delete mode 100644 spring-cloud-config-server/src/test/resources/another-config-repo/git/config delete mode 100644 spring-cloud-config-server/src/test/resources/another-config-repo/git/gitk.cache delete mode 100644 spring-cloud-config-server/src/test/resources/another-config-repo/git/index delete mode 100644 spring-cloud-config-server/src/test/resources/another-config-repo/git/logs/HEAD delete mode 100644 spring-cloud-config-server/src/test/resources/another-config-repo/git/logs/refs/heads/master delete mode 100644 spring-cloud-config-server/src/test/resources/another-config-repo/git/logs/refs/heads/raw delete mode 100644 spring-cloud-config-server/src/test/resources/another-config-repo/git/objects/16/134a43183d280dc9bb3efce05c90c65d5c100a delete mode 100644 spring-cloud-config-server/src/test/resources/another-config-repo/git/objects/16/33e23980f4b4dffab6e1d87b622afd9131515e delete mode 100644 spring-cloud-config-server/src/test/resources/another-config-repo/git/objects/27/d0b5b449f2e8326844a735220383bf16de28b5 delete mode 100644 spring-cloud-config-server/src/test/resources/another-config-repo/git/objects/37/09aa0e4ed6d9c76fdf3a9980f2a7f84defd630 delete mode 100644 spring-cloud-config-server/src/test/resources/another-config-repo/git/objects/5f/72eaeb42ac3a2554e3cbc54291178a7c29be39 delete mode 100644 spring-cloud-config-server/src/test/resources/another-config-repo/git/objects/ae/3cdf5b88ff281b7f087143289c72a5057a0278 delete mode 100644 spring-cloud-config-server/src/test/resources/another-config-repo/git/objects/c4/bd92016dc14b9fe376d9c3f7af1c9d22d44ee4 delete mode 100644 spring-cloud-config-server/src/test/resources/another-config-repo/git/objects/fa/7ee004088958d3c5e394d447fa2cb10b10f826 delete mode 100644 spring-cloud-config-server/src/test/resources/another-config-repo/git/objects/pack/pack-d4edd2290fa647beaa1255881228dc90c1d53fce.idx delete mode 100644 spring-cloud-config-server/src/test/resources/another-config-repo/git/objects/pack/pack-d4edd2290fa647beaa1255881228dc90c1d53fce.pack delete mode 100644 spring-cloud-config-server/src/test/resources/another-config-repo/git/refs/heads/master delete mode 100644 spring-cloud-config-server/src/test/resources/another-config-repo/git/refs/heads/raw delete mode 100644 spring-cloud-config-server/src/test/resources/another-config-repo/git/refs/tags/foo delete mode 100644 spring-cloud-config-server/src/test/resources/another-config-repo/sub/application.yml delete mode 100644 spring-cloud-config-server/src/test/resources/bad.yml delete mode 100644 spring-cloud-config-server/src/test/resources/branch-with-slash-repo/bar.yml delete mode 100644 spring-cloud-config-server/src/test/resources/branch-with-slash-repo/git/COMMIT_EDITMSG delete mode 100644 spring-cloud-config-server/src/test/resources/branch-with-slash-repo/git/HEAD delete mode 100644 spring-cloud-config-server/src/test/resources/branch-with-slash-repo/git/config delete mode 100644 spring-cloud-config-server/src/test/resources/branch-with-slash-repo/git/description delete mode 100644 spring-cloud-config-server/src/test/resources/branch-with-slash-repo/git/index delete mode 100644 spring-cloud-config-server/src/test/resources/branch-with-slash-repo/git/logs/HEAD delete mode 100644 spring-cloud-config-server/src/test/resources/branch-with-slash-repo/git/logs/refs/heads/feature/foo delete mode 100644 spring-cloud-config-server/src/test/resources/branch-with-slash-repo/git/logs/refs/heads/master delete mode 100644 spring-cloud-config-server/src/test/resources/branch-with-slash-repo/git/objects/08/eb9e67a7225c302e3906a63cb9544e619fc804 delete mode 100644 spring-cloud-config-server/src/test/resources/branch-with-slash-repo/git/objects/0d/706a8f14e7ec2b9abf99c603f3f5467d2d38ff delete mode 100644 spring-cloud-config-server/src/test/resources/branch-with-slash-repo/git/objects/54/8298f39d0c5a84a1ada7a2b03ef54aad1fffa2 delete mode 100644 spring-cloud-config-server/src/test/resources/branch-with-slash-repo/git/objects/5c/19df95639519f2286fc6d39182f271ee8c0b6b delete mode 100644 spring-cloud-config-server/src/test/resources/branch-with-slash-repo/git/objects/6e/067728a52e959f60788121b4046e5b27793e61 delete mode 100644 spring-cloud-config-server/src/test/resources/branch-with-slash-repo/git/objects/7a/9804f8901709bdcf794c553805d5bc5188f821 delete mode 100644 spring-cloud-config-server/src/test/resources/branch-with-slash-repo/git/objects/91/5bd24aaf815120f2755ef4fc66404f5d37b383 delete mode 100644 spring-cloud-config-server/src/test/resources/branch-with-slash-repo/git/objects/ae/c5d43644133593483b7c243f851606aa2c0128 delete mode 100644 spring-cloud-config-server/src/test/resources/branch-with-slash-repo/git/objects/fa/c65b3a4678430e2b86e3b28510b37c5a7942a7 delete mode 100644 spring-cloud-config-server/src/test/resources/branch-with-slash-repo/git/refs/heads/feature/foo delete mode 100644 spring-cloud-config-server/src/test/resources/branch-with-slash-repo/git/refs/heads/master delete mode 100644 spring-cloud-config-server/src/test/resources/branch-with-slash-repo/git/refs/tags/foo delete mode 100644 spring-cloud-config-server/src/test/resources/compositeconfigserver.yml delete mode 100644 spring-cloud-config-server/src/test/resources/config-repo/application.yml delete mode 100644 spring-cloud-config-server/src/test/resources/config-repo/bar.properties delete mode 100644 spring-cloud-config-server/src/test/resources/config-repo/git/COMMIT_EDITMSG delete mode 100644 spring-cloud-config-server/src/test/resources/config-repo/git/FETCH_HEAD delete mode 100644 spring-cloud-config-server/src/test/resources/config-repo/git/HEAD delete mode 100644 spring-cloud-config-server/src/test/resources/config-repo/git/config delete mode 100644 spring-cloud-config-server/src/test/resources/config-repo/git/gitk.cache delete mode 100644 spring-cloud-config-server/src/test/resources/config-repo/git/index delete mode 100644 spring-cloud-config-server/src/test/resources/config-repo/git/logs/HEAD delete mode 100644 spring-cloud-config-server/src/test/resources/config-repo/git/logs/refs/heads/composite delete mode 100644 spring-cloud-config-server/src/test/resources/config-repo/git/logs/refs/heads/master delete mode 100644 spring-cloud-config-server/src/test/resources/config-repo/git/logs/refs/heads/raw delete mode 100644 spring-cloud-config-server/src/test/resources/config-repo/git/objects/29/21d46f948329996d3eb4a3d11aaaff6ccda84f delete mode 100644 spring-cloud-config-server/src/test/resources/config-repo/git/objects/7a/68a4bbc80b44c287787e2306ff9fd7de35cc54 delete mode 100644 spring-cloud-config-server/src/test/resources/config-repo/git/objects/8f/263e4c6e65fd3fb975fddba84231fe95416b66 delete mode 100644 spring-cloud-config-server/src/test/resources/config-repo/git/objects/a1/9381f44efc80a21996b47adf012ef105ced909 delete mode 100644 spring-cloud-config-server/src/test/resources/config-repo/git/objects/ae/3cdf5b88ff281b7f087143289c72a5057a0278 delete mode 100644 spring-cloud-config-server/src/test/resources/config-repo/git/objects/b5/45f7dec7feab3006c2e73969ee704a9a4def78 delete mode 100644 spring-cloud-config-server/src/test/resources/config-repo/git/objects/e4/88193e654487b7f43e38f0865860529cb2ec79 delete mode 100644 spring-cloud-config-server/src/test/resources/config-repo/git/objects/pack/pack-d4edd2290fa647beaa1255881228dc90c1d53fce.idx delete mode 100644 spring-cloud-config-server/src/test/resources/config-repo/git/objects/pack/pack-d4edd2290fa647beaa1255881228dc90c1d53fce.pack delete mode 100644 spring-cloud-config-server/src/test/resources/config-repo/git/refs/heads/composite delete mode 100644 spring-cloud-config-server/src/test/resources/config-repo/git/refs/heads/master delete mode 100644 spring-cloud-config-server/src/test/resources/config-repo/git/refs/heads/raw delete mode 100644 spring-cloud-config-server/src/test/resources/config-repo/git/refs/tags/foo delete mode 100644 spring-cloud-config-server/src/test/resources/config-repo/invalid.yaml delete mode 100644 spring-cloud-config-server/src/test/resources/config/configserver.yaml delete mode 100644 spring-cloud-config-server/src/test/resources/configserver-subversion.yml delete mode 100644 spring-cloud-config-server/src/test/resources/configserver-test.yml delete mode 100644 spring-cloud-config-server/src/test/resources/configserver.yaml delete mode 100644 spring-cloud-config-server/src/test/resources/data-jdbc.sql delete mode 100644 spring-cloud-config-server/src/test/resources/enable-bootstrap.yml delete mode 100644 spring-cloud-config-server/src/test/resources/encrypt-repo/application.yml delete mode 100644 spring-cloud-config-server/src/test/resources/encrypt-repo/bar.properties delete mode 100644 spring-cloud-config-server/src/test/resources/encrypt-repo/enable-bootstrap.yml delete mode 100644 spring-cloud-config-server/src/test/resources/encrypt-repo/git/COMMIT_EDITMSG delete mode 100644 spring-cloud-config-server/src/test/resources/encrypt-repo/git/FETCH_HEAD delete mode 100644 spring-cloud-config-server/src/test/resources/encrypt-repo/git/HEAD delete mode 100644 spring-cloud-config-server/src/test/resources/encrypt-repo/git/config delete mode 100644 spring-cloud-config-server/src/test/resources/encrypt-repo/git/gitk.cache delete mode 100644 spring-cloud-config-server/src/test/resources/encrypt-repo/git/index delete mode 100644 spring-cloud-config-server/src/test/resources/encrypt-repo/git/logs/HEAD delete mode 100644 spring-cloud-config-server/src/test/resources/encrypt-repo/git/logs/refs/heads/composite delete mode 100644 spring-cloud-config-server/src/test/resources/encrypt-repo/git/logs/refs/heads/main delete mode 100644 spring-cloud-config-server/src/test/resources/encrypt-repo/git/logs/refs/heads/raw delete mode 100644 spring-cloud-config-server/src/test/resources/encrypt-repo/git/objects/13/b76fa2acbef52a002372071d08d7967fee9146 delete mode 100644 spring-cloud-config-server/src/test/resources/encrypt-repo/git/objects/1d/3ce3ac9e4a7557e95e990c264470237ddb9488 delete mode 100644 spring-cloud-config-server/src/test/resources/encrypt-repo/git/objects/23/b743fe05412cf11975f0817ac8e12a13992dbe delete mode 100644 spring-cloud-config-server/src/test/resources/encrypt-repo/git/objects/3c/e2c946ed7061ec24f69061795b557c065d6688 delete mode 100644 spring-cloud-config-server/src/test/resources/encrypt-repo/git/objects/5e/5ca6033619a9aa0524a408b1c6dc7e3c9f5b07 delete mode 100644 spring-cloud-config-server/src/test/resources/encrypt-repo/git/objects/63/e43ddbda928b903e56f601409552bbfb7fdd99 delete mode 100644 spring-cloud-config-server/src/test/resources/encrypt-repo/git/objects/ad/5e0cb7036ed11ddd4b7be6ed86ad3565c8a3fc delete mode 100644 spring-cloud-config-server/src/test/resources/encrypt-repo/git/objects/ae/3cdf5b88ff281b7f087143289c72a5057a0278 delete mode 100644 spring-cloud-config-server/src/test/resources/encrypt-repo/git/objects/ba/97b023d1d0faa44cc337479d6a8ac1ebcdb00d delete mode 100644 spring-cloud-config-server/src/test/resources/encrypt-repo/git/objects/bd/414a6cc8653d7e282df0a257babc6283b83596 delete mode 100644 spring-cloud-config-server/src/test/resources/encrypt-repo/git/objects/e7/7c14ccb5f9e49c11b6d4172b76b0d3cf4cef56 delete mode 100644 spring-cloud-config-server/src/test/resources/encrypt-repo/git/objects/fb/1a59a90f034288d14dc4b607f9f76697aa972d delete mode 100644 spring-cloud-config-server/src/test/resources/encrypt-repo/git/objects/fd/07d827993aaf6ed7ef1b979767ee9277d1d409 delete mode 100644 spring-cloud-config-server/src/test/resources/encrypt-repo/git/objects/pack/pack-d4edd2290fa647beaa1255881228dc90c1d53fce.idx delete mode 100644 spring-cloud-config-server/src/test/resources/encrypt-repo/git/objects/pack/pack-d4edd2290fa647beaa1255881228dc90c1d53fce.pack delete mode 100644 spring-cloud-config-server/src/test/resources/encrypt-repo/git/refs/heads/composite delete mode 100644 spring-cloud-config-server/src/test/resources/encrypt-repo/git/refs/heads/main delete mode 100644 spring-cloud-config-server/src/test/resources/encrypt-repo/git/refs/heads/raw delete mode 100644 spring-cloud-config-server/src/test/resources/encrypt-repo/git/refs/tags/foo delete mode 100644 spring-cloud-config-server/src/test/resources/foo-cloud.properties delete mode 100644 spring-cloud-config-server/src/test/resources/foo-development.properties delete mode 100644 spring-cloud-config-server/src/test/resources/foo-local.txt delete mode 100644 spring-cloud-config-server/src/test/resources/foo.properties delete mode 100644 spring-cloud-config-server/src/test/resources/import.yml delete mode 100644 spring-cloud-config-server/src/test/resources/keystore-bootstrap.yml delete mode 100644 spring-cloud-config-server/src/test/resources/master-labeltest-config-repo/application.yml delete mode 100644 spring-cloud-config-server/src/test/resources/master-labeltest-config-repo/git/COMMIT_EDITMSG delete mode 100644 spring-cloud-config-server/src/test/resources/master-labeltest-config-repo/git/HEAD delete mode 100644 spring-cloud-config-server/src/test/resources/master-labeltest-config-repo/git/config delete mode 100644 spring-cloud-config-server/src/test/resources/master-labeltest-config-repo/git/description delete mode 100755 spring-cloud-config-server/src/test/resources/master-labeltest-config-repo/git/hooks/applypatch-msg.sample delete mode 100755 spring-cloud-config-server/src/test/resources/master-labeltest-config-repo/git/hooks/commit-msg.sample delete mode 100755 spring-cloud-config-server/src/test/resources/master-labeltest-config-repo/git/hooks/post-update.sample delete mode 100755 spring-cloud-config-server/src/test/resources/master-labeltest-config-repo/git/hooks/pre-applypatch.sample delete mode 100755 spring-cloud-config-server/src/test/resources/master-labeltest-config-repo/git/hooks/pre-commit.sample delete mode 100755 spring-cloud-config-server/src/test/resources/master-labeltest-config-repo/git/hooks/pre-push.sample delete mode 100755 spring-cloud-config-server/src/test/resources/master-labeltest-config-repo/git/hooks/pre-rebase.sample delete mode 100755 spring-cloud-config-server/src/test/resources/master-labeltest-config-repo/git/hooks/prepare-commit-msg.sample delete mode 100755 spring-cloud-config-server/src/test/resources/master-labeltest-config-repo/git/hooks/update.sample delete mode 100644 spring-cloud-config-server/src/test/resources/master-labeltest-config-repo/git/index delete mode 100644 spring-cloud-config-server/src/test/resources/master-labeltest-config-repo/git/info/exclude delete mode 100644 spring-cloud-config-server/src/test/resources/master-labeltest-config-repo/git/logs/HEAD delete mode 100644 spring-cloud-config-server/src/test/resources/master-labeltest-config-repo/git/logs/refs/heads/master delete mode 100644 spring-cloud-config-server/src/test/resources/master-labeltest-config-repo/git/objects/1a/138ced808f5fb3206283b292253d8ba7a99b31 delete mode 100644 spring-cloud-config-server/src/test/resources/master-labeltest-config-repo/git/objects/20/d30201572381d9dcaf164e1c7670557ece7257 delete mode 100644 spring-cloud-config-server/src/test/resources/master-labeltest-config-repo/git/objects/4e/1f25bbdca5765e279b436b5b02d05b1654515c delete mode 100644 spring-cloud-config-server/src/test/resources/master-labeltest-config-repo/git/objects/53/14629d4229558db9cc91fec7631833e03434b3 delete mode 100644 spring-cloud-config-server/src/test/resources/master-labeltest-config-repo/git/objects/96/403e4eca8ed1dc5672d4bd1f125c490a2a48f7 delete mode 100644 spring-cloud-config-server/src/test/resources/master-labeltest-config-repo/git/objects/c9/60eaa883ffafea56e5940baf1fc7d1b5d35b56 delete mode 100644 spring-cloud-config-server/src/test/resources/master-labeltest-config-repo/git/refs/heads/master delete mode 100644 spring-cloud-config-server/src/test/resources/master-labeltest-config-repo/test1-svc.properties delete mode 100644 spring-cloud-config-server/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker delete mode 100644 spring-cloud-config-server/src/test/resources/nested-repo/application.yml delete mode 100644 spring-cloud-config-server/src/test/resources/nested-repo/bar/application.properties delete mode 100644 spring-cloud-config-server/src/test/resources/nested-repo/foo/application.properties delete mode 100644 spring-cloud-config-server/src/test/resources/nested-repo/git/COMMIT_EDITMSG delete mode 100644 spring-cloud-config-server/src/test/resources/nested-repo/git/HEAD delete mode 100644 spring-cloud-config-server/src/test/resources/nested-repo/git/config delete mode 100644 spring-cloud-config-server/src/test/resources/nested-repo/git/description delete mode 100755 spring-cloud-config-server/src/test/resources/nested-repo/git/hooks/applypatch-msg.sample delete mode 100755 spring-cloud-config-server/src/test/resources/nested-repo/git/hooks/commit-msg.sample delete mode 100755 spring-cloud-config-server/src/test/resources/nested-repo/git/hooks/post-update.sample delete mode 100755 spring-cloud-config-server/src/test/resources/nested-repo/git/hooks/pre-applypatch.sample delete mode 100755 spring-cloud-config-server/src/test/resources/nested-repo/git/hooks/pre-commit.sample delete mode 100755 spring-cloud-config-server/src/test/resources/nested-repo/git/hooks/pre-push.sample delete mode 100755 spring-cloud-config-server/src/test/resources/nested-repo/git/hooks/pre-rebase.sample delete mode 100755 spring-cloud-config-server/src/test/resources/nested-repo/git/hooks/prepare-commit-msg.sample delete mode 100755 spring-cloud-config-server/src/test/resources/nested-repo/git/hooks/update.sample delete mode 100644 spring-cloud-config-server/src/test/resources/nested-repo/git/index delete mode 100644 spring-cloud-config-server/src/test/resources/nested-repo/git/info/exclude delete mode 100644 spring-cloud-config-server/src/test/resources/nested-repo/git/logs/HEAD delete mode 100644 spring-cloud-config-server/src/test/resources/nested-repo/git/logs/refs/heads/master delete mode 100644 spring-cloud-config-server/src/test/resources/nested-repo/git/objects/01/2b8908f80e4d19436ffaabcd08bf32f43644ec delete mode 100644 spring-cloud-config-server/src/test/resources/nested-repo/git/objects/04/fc9760cf5a7e9a9b3f83c02db2caf82f6489e2 delete mode 100644 spring-cloud-config-server/src/test/resources/nested-repo/git/objects/06/6ddc1017e77dc9da7e555d063eb8425653a289 delete mode 100644 spring-cloud-config-server/src/test/resources/nested-repo/git/objects/0f/663b91a15a49bed0579dba6a38009d2546c313 delete mode 100644 spring-cloud-config-server/src/test/resources/nested-repo/git/objects/16/134a43183d280dc9bb3efce05c90c65d5c100a delete mode 100644 spring-cloud-config-server/src/test/resources/nested-repo/git/objects/3d/ffcc3cddcc29e350c8ff1c11c53bf577057c56 delete mode 100644 spring-cloud-config-server/src/test/resources/nested-repo/git/objects/7d/aacd5db8d36bc6df962d1d01cb98d8713fe5c4 delete mode 100644 spring-cloud-config-server/src/test/resources/nested-repo/git/objects/87/91c22849104e1c8795747ccb678879a7c16771 delete mode 100644 spring-cloud-config-server/src/test/resources/nested-repo/git/objects/9a/9d30fda1553c5047d2f2f510accf6238b7c131 delete mode 100644 spring-cloud-config-server/src/test/resources/nested-repo/git/objects/9d/6f44a27376f0dbe4722099e138904788ef561a delete mode 100644 spring-cloud-config-server/src/test/resources/nested-repo/git/objects/a4/8e335bccdf3130a3b70a62e126ff580f370ac9 delete mode 100644 spring-cloud-config-server/src/test/resources/nested-repo/git/objects/ae/3cdf5b88ff281b7f087143289c72a5057a0278 delete mode 100644 spring-cloud-config-server/src/test/resources/nested-repo/git/objects/c3/bb75b147f1435d96e10bbd83046e4d140c41e3 delete mode 100644 spring-cloud-config-server/src/test/resources/nested-repo/git/objects/fa/6aef940fd8b36ee6b0f1e3b1324c31fef6eaa0 delete mode 100644 spring-cloud-config-server/src/test/resources/nested-repo/git/refs/heads/master delete mode 100644 spring-cloud-config-server/src/test/resources/ordering-repo/git/COMMIT_EDITMSG delete mode 100644 spring-cloud-config-server/src/test/resources/ordering-repo/git/HEAD delete mode 100644 spring-cloud-config-server/src/test/resources/ordering-repo/git/config delete mode 100644 spring-cloud-config-server/src/test/resources/ordering-repo/git/description delete mode 100644 spring-cloud-config-server/src/test/resources/ordering-repo/git/index delete mode 100644 spring-cloud-config-server/src/test/resources/ordering-repo/git/info/exclude delete mode 100644 spring-cloud-config-server/src/test/resources/ordering-repo/git/logs/HEAD delete mode 100644 spring-cloud-config-server/src/test/resources/ordering-repo/git/logs/refs/heads/master delete mode 100644 spring-cloud-config-server/src/test/resources/ordering-repo/git/objects/02/09d6d392d65f4ad734b9cb938889ddd40683f4 delete mode 100644 spring-cloud-config-server/src/test/resources/ordering-repo/git/objects/1c/cddaee9468c2f249e75dc81e50877935955866 delete mode 100644 spring-cloud-config-server/src/test/resources/ordering-repo/git/objects/7a/68a4bbc80b44c287787e2306ff9fd7de35cc54 delete mode 100644 spring-cloud-config-server/src/test/resources/ordering-repo/git/objects/82/65220d6be7d73011cbc98382b499e5d7169fe7 delete mode 100644 spring-cloud-config-server/src/test/resources/ordering-repo/git/objects/ad/bec8abd5dd965a0d9a62fc5bd457ce0dec5727 delete mode 100644 spring-cloud-config-server/src/test/resources/ordering-repo/git/objects/fc/4aeb82a374f50cae0654d8db79dda083eff3d7 delete mode 100644 spring-cloud-config-server/src/test/resources/ordering-repo/git/refs/heads/master delete mode 100644 spring-cloud-config-server/src/test/resources/ordering-repo/project/application.yml delete mode 100644 spring-cloud-config-server/src/test/resources/ordering-repo/project/sub/application-test.yml delete mode 100644 spring-cloud-config-server/src/test/resources/resource-controller/foo.txt delete mode 100644 spring-cloud-config-server/src/test/resources/resource-encryptor/test.json delete mode 100644 spring-cloud-config-server/src/test/resources/resource-encryptor/test.properties delete mode 100644 spring-cloud-config-server/src/test/resources/resource-encryptor/test.yml delete mode 100644 spring-cloud-config-server/src/test/resources/schema-jdbc.sql delete mode 100644 spring-cloud-config-server/src/test/resources/server.jks delete mode 100644 spring-cloud-config-server/src/test/resources/ssh/key delete mode 100644 spring-cloud-config-server/src/test/resources/ssh/key-with-passphrase delete mode 100644 spring-cloud-config-server/src/test/resources/ssh/known_hosts delete mode 100644 spring-cloud-config-server/src/test/resources/ssh/ssh-nested-settings-list.yml delete mode 100644 spring-cloud-config-server/src/test/resources/ssh/ssh-nested-settings.yml delete mode 100644 spring-cloud-config-server/src/test/resources/ssh/ssh-private-key-block-list.yml delete mode 100644 spring-cloud-config-server/src/test/resources/ssh/ssh-private-key-block.yml delete mode 100644 spring-cloud-config-server/src/test/resources/ssh/ssh-private-key-newline-list.yml delete mode 100644 spring-cloud-config-server/src/test/resources/ssh/ssh-private-key-newline.yml delete mode 100644 spring-cloud-config-server/src/test/resources/ssl-test.jks delete mode 100644 spring-cloud-config-server/src/test/resources/svn-config-repo/.svn/entries delete mode 100644 spring-cloud-config-server/src/test/resources/svn-config-repo/.svn/format delete mode 100644 spring-cloud-config-server/src/test/resources/svn-config-repo/.svn/pristine/4b/4ba5f6a617dee5e5e8d382f6bbc07531d5f968c4.svn-base delete mode 100644 spring-cloud-config-server/src/test/resources/svn-config-repo/.svn/pristine/cb/cbddbad2c491aab236e1025ad5b9ace129ea5667.svn-base delete mode 100644 spring-cloud-config-server/src/test/resources/svn-config-repo/.svn/wc.db delete mode 100644 spring-cloud-config-server/src/test/resources/svn-config-repo/.svn/wc.db-journal delete mode 100644 spring-cloud-config-server/src/test/resources/svn-config-repo/README.txt delete mode 100644 spring-cloud-config-server/src/test/resources/svn-config-repo/conf/authz delete mode 100644 spring-cloud-config-server/src/test/resources/svn-config-repo/conf/hooks-env.tmpl delete mode 100644 spring-cloud-config-server/src/test/resources/svn-config-repo/conf/passwd delete mode 100644 spring-cloud-config-server/src/test/resources/svn-config-repo/conf/svnserve.conf delete mode 100644 spring-cloud-config-server/src/test/resources/svn-config-repo/db/current delete mode 100644 spring-cloud-config-server/src/test/resources/svn-config-repo/db/format delete mode 100644 spring-cloud-config-server/src/test/resources/svn-config-repo/db/fs-type delete mode 100644 spring-cloud-config-server/src/test/resources/svn-config-repo/db/fsfs.conf delete mode 100644 spring-cloud-config-server/src/test/resources/svn-config-repo/db/min-unpacked-rev delete mode 100644 spring-cloud-config-server/src/test/resources/svn-config-repo/db/rep-cache.db delete mode 100644 spring-cloud-config-server/src/test/resources/svn-config-repo/db/revprops/0/0 delete mode 100644 spring-cloud-config-server/src/test/resources/svn-config-repo/db/revprops/0/1 delete mode 100644 spring-cloud-config-server/src/test/resources/svn-config-repo/db/revprops/0/2 delete mode 100644 spring-cloud-config-server/src/test/resources/svn-config-repo/db/revprops/0/3 delete mode 100644 spring-cloud-config-server/src/test/resources/svn-config-repo/db/revs/0/0 delete mode 100644 spring-cloud-config-server/src/test/resources/svn-config-repo/db/revs/0/1 delete mode 100644 spring-cloud-config-server/src/test/resources/svn-config-repo/db/revs/0/2 delete mode 100644 spring-cloud-config-server/src/test/resources/svn-config-repo/db/revs/0/3 delete mode 100644 spring-cloud-config-server/src/test/resources/svn-config-repo/db/transactions/2-4.txn/node.0.0 delete mode 100644 spring-cloud-config-server/src/test/resources/svn-config-repo/db/txn-current delete mode 100644 spring-cloud-config-server/src/test/resources/svn-config-repo/db/txn-current-lock delete mode 100644 spring-cloud-config-server/src/test/resources/svn-config-repo/db/uuid delete mode 100644 spring-cloud-config-server/src/test/resources/svn-config-repo/db/write-lock delete mode 100644 spring-cloud-config-server/src/test/resources/svn-config-repo/format delete mode 100644 spring-cloud-config-server/src/test/resources/svn-config-repo/hooks/post-commit.tmpl delete mode 100644 spring-cloud-config-server/src/test/resources/svn-config-repo/hooks/post-lock.tmpl delete mode 100644 spring-cloud-config-server/src/test/resources/svn-config-repo/hooks/post-revprop-change.tmpl delete mode 100644 spring-cloud-config-server/src/test/resources/svn-config-repo/hooks/post-unlock.tmpl delete mode 100644 spring-cloud-config-server/src/test/resources/svn-config-repo/hooks/pre-commit.tmpl delete mode 100644 spring-cloud-config-server/src/test/resources/svn-config-repo/hooks/pre-lock.tmpl delete mode 100644 spring-cloud-config-server/src/test/resources/svn-config-repo/hooks/pre-revprop-change.tmpl delete mode 100644 spring-cloud-config-server/src/test/resources/svn-config-repo/hooks/pre-unlock.tmpl delete mode 100644 spring-cloud-config-server/src/test/resources/svn-config-repo/hooks/start-commit.tmpl delete mode 100644 spring-cloud-config-server/src/test/resources/svn-config-repo/locks/db-logs.lock delete mode 100644 spring-cloud-config-server/src/test/resources/svn-config-repo/locks/db.lock delete mode 100644 spring-cloud-config-server/src/test/resources/svn-config-repo/svn.ico delete mode 100644 spring-cloud-config-server/src/test/resources/symmetric-key-bootstrap.properties delete mode 100644 spring-cloud-config-server/src/test/resources/test/bad-syntax/application.yml delete mode 100644 spring-cloud-config-server/src/test/resources/test/bar.yml delete mode 100644 spring-cloud-config-server/src/test/resources/test/baz.properties delete mode 100644 spring-cloud-config-server/src/test/resources/test/dev/app/application.properties delete mode 100644 spring-cloud-config-server/src/test/resources/test/dev/applicationxyz/application.properties delete mode 100644 spring-cloud-config-server/src/test/resources/test/dev/foo delete mode 100644 spring-cloud-config-server/src/test/resources/test/dev/foo.properties delete mode 100644 spring-cloud-config-server/src/test/resources/test/dev/ignore/application.properties delete mode 100644 spring-cloud-config-server/src/test/resources/test/dev/placeholder.txt delete mode 100644 spring-cloud-config-server/src/test/resources/test/dev/spam/foo.txt delete mode 100644 spring-cloud-config-server/src/test/resources/test/dev/template.json delete mode 100644 spring-cloud-config-server/src/test/resources/test/foo-development.properties delete mode 100644 spring-cloud-config-server/src/test/resources/test/foo.properties delete mode 100644 spring-cloud-config-server/src/test/resources/test/import.yml delete mode 100644 spring-cloud-config-server/src/test/resources/test/import/foo.yml delete mode 100644 spring-cloud-config-server/src/test/resources/test/local/foo.txt delete mode 100644 spring-cloud-config-server/src/test/resources/test/mysql/application.properties delete mode 100644 spring-cloud-config-server/src/test/resources/test/reactive/application.properties delete mode 100644 spring-cloud-config-server/src/test/resources/test1-config-repo/application.yml delete mode 100644 spring-cloud-config-server/src/test/resources/test1-config-repo/git/COMMIT_EDITMSG delete mode 100644 spring-cloud-config-server/src/test/resources/test1-config-repo/git/HEAD delete mode 100644 spring-cloud-config-server/src/test/resources/test1-config-repo/git/config delete mode 100644 spring-cloud-config-server/src/test/resources/test1-config-repo/git/description delete mode 100755 spring-cloud-config-server/src/test/resources/test1-config-repo/git/hooks/applypatch-msg.sample delete mode 100755 spring-cloud-config-server/src/test/resources/test1-config-repo/git/hooks/commit-msg.sample delete mode 100755 spring-cloud-config-server/src/test/resources/test1-config-repo/git/hooks/post-update.sample delete mode 100755 spring-cloud-config-server/src/test/resources/test1-config-repo/git/hooks/pre-applypatch.sample delete mode 100755 spring-cloud-config-server/src/test/resources/test1-config-repo/git/hooks/pre-commit.sample delete mode 100755 spring-cloud-config-server/src/test/resources/test1-config-repo/git/hooks/pre-push.sample delete mode 100755 spring-cloud-config-server/src/test/resources/test1-config-repo/git/hooks/pre-rebase.sample delete mode 100755 spring-cloud-config-server/src/test/resources/test1-config-repo/git/hooks/prepare-commit-msg.sample delete mode 100755 spring-cloud-config-server/src/test/resources/test1-config-repo/git/hooks/update.sample delete mode 100644 spring-cloud-config-server/src/test/resources/test1-config-repo/git/index delete mode 100644 spring-cloud-config-server/src/test/resources/test1-config-repo/git/info/exclude delete mode 100644 spring-cloud-config-server/src/test/resources/test1-config-repo/git/info/refs delete mode 100644 spring-cloud-config-server/src/test/resources/test1-config-repo/git/logs/HEAD delete mode 100644 spring-cloud-config-server/src/test/resources/test1-config-repo/git/logs/refs/heads/master delete mode 100644 spring-cloud-config-server/src/test/resources/test1-config-repo/git/objects/1a/138ced808f5fb3206283b292253d8ba7a99b31 delete mode 100644 spring-cloud-config-server/src/test/resources/test1-config-repo/git/objects/20/d30201572381d9dcaf164e1c7670557ece7257 delete mode 100644 spring-cloud-config-server/src/test/resources/test1-config-repo/git/objects/4e/1f25bbdca5765e279b436b5b02d05b1654515c delete mode 100644 spring-cloud-config-server/src/test/resources/test1-config-repo/git/objects/53/14629d4229558db9cc91fec7631833e03434b3 delete mode 100644 spring-cloud-config-server/src/test/resources/test1-config-repo/git/objects/96/403e4eca8ed1dc5672d4bd1f125c490a2a48f7 delete mode 100644 spring-cloud-config-server/src/test/resources/test1-config-repo/git/objects/c9/60eaa883ffafea56e5940baf1fc7d1b5d35b56 delete mode 100644 spring-cloud-config-server/src/test/resources/test1-config-repo/git/refs/heads/master delete mode 100644 spring-cloud-config-server/src/test/resources/test1-config-repo/test1-svc.properties delete mode 100644 spring-cloud-config-server/src/test/resources/test2-config-repo/application.properties delete mode 100644 spring-cloud-config-server/src/test/resources/test2-config-repo/bar.properties delete mode 100644 spring-cloud-config-server/src/test/resources/test2-config-repo/git/COMMIT_EDITMSG delete mode 100644 spring-cloud-config-server/src/test/resources/test2-config-repo/git/FETCH_HEAD delete mode 100644 spring-cloud-config-server/src/test/resources/test2-config-repo/git/HEAD delete mode 100644 spring-cloud-config-server/src/test/resources/test2-config-repo/git/ORIG_HEAD delete mode 100644 spring-cloud-config-server/src/test/resources/test2-config-repo/git/config delete mode 100644 spring-cloud-config-server/src/test/resources/test2-config-repo/git/gitk.cache delete mode 100644 spring-cloud-config-server/src/test/resources/test2-config-repo/git/index delete mode 100644 spring-cloud-config-server/src/test/resources/test2-config-repo/git/logs/HEAD delete mode 100644 spring-cloud-config-server/src/test/resources/test2-config-repo/git/logs/refs/heads/master delete mode 100644 spring-cloud-config-server/src/test/resources/test2-config-repo/git/logs/refs/heads/raw delete mode 100644 spring-cloud-config-server/src/test/resources/test2-config-repo/git/objects/16/33e23980f4b4dffab6e1d87b622afd9131515e delete mode 100644 spring-cloud-config-server/src/test/resources/test2-config-repo/git/objects/27/d0b5b449f2e8326844a735220383bf16de28b5 delete mode 100644 spring-cloud-config-server/src/test/resources/test2-config-repo/git/objects/29/f2b1020f4b87e1de6aab368ff496cc4e99a959 delete mode 100644 spring-cloud-config-server/src/test/resources/test2-config-repo/git/objects/6b/b5d09918a49cdbea01ac50b8d56a334440d70e delete mode 100644 spring-cloud-config-server/src/test/resources/test2-config-repo/git/objects/ae/3cdf5b88ff281b7f087143289c72a5057a0278 delete mode 100644 spring-cloud-config-server/src/test/resources/test2-config-repo/git/objects/c4/bd92016dc14b9fe376d9c3f7af1c9d22d44ee4 delete mode 100644 spring-cloud-config-server/src/test/resources/test2-config-repo/git/objects/d8/67783f667d411e96384d5ae7d58314009fad5f delete mode 100644 spring-cloud-config-server/src/test/resources/test2-config-repo/git/objects/df/6fc33edab5de1a6faaaa141de2ff0d99fb99e2 delete mode 100644 spring-cloud-config-server/src/test/resources/test2-config-repo/git/objects/df/d1f2f006c9ea71be688e3eeaf383ff640fd21a delete mode 100644 spring-cloud-config-server/src/test/resources/test2-config-repo/git/objects/df/e21d586fc45ba72db173421c5139e26e50a7af delete mode 100644 spring-cloud-config-server/src/test/resources/test2-config-repo/git/objects/f2/0f9f10d30cd99e8133aaf9ff587c6cff0a42e4 delete mode 100644 spring-cloud-config-server/src/test/resources/test2-config-repo/git/objects/fa/6aef940fd8b36ee6b0f1e3b1324c31fef6eaa0 delete mode 100644 spring-cloud-config-server/src/test/resources/test2-config-repo/git/objects/pack/pack-d4edd2290fa647beaa1255881228dc90c1d53fce.idx delete mode 100644 spring-cloud-config-server/src/test/resources/test2-config-repo/git/objects/pack/pack-d4edd2290fa647beaa1255881228dc90c1d53fce.pack delete mode 100644 spring-cloud-config-server/src/test/resources/test2-config-repo/git/refs/heads/master delete mode 100644 spring-cloud-config-server/src/test/resources/test2-config-repo/git/refs/heads/raw delete mode 100644 spring-cloud-config-server/src/test/resources/test2-config-repo/git/refs/tags/foo create mode 100644 spring-cloud-starter-config/.flattened-pom.xml delete mode 100644 spring-cloud-starter-config/pom.xml delete mode 100644 src/checkstyle/checkstyle-suppressions.xml create mode 100644 supplemental-ui/partials/nav-search.hbs create mode 100644 supplemental-ui/partials/search.hbs diff --git a/.circleci/config.yml b/.circleci/config.yml deleted file mode 100644 index 57e55b20..00000000 --- a/.circleci/config.yml +++ /dev/null @@ -1,54 +0,0 @@ -version: 2 -jobs: - build: - machine: - image: "ubuntu-2004:202111-02" -# docker: -# - image: springcloud/pipeline-base -# user: appuser - environment: - _JAVA_OPTIONS: "-Xms1024m -Xmx2048m" - CACHEVER: 1 - TERM: dumb - branches: - ignore: - - gh-pages # list of branches to ignore - steps: - - run: - name: Install OpenJDK 17 - command: | - wget -qO - https://adoptium.jfrog.io/adoptium/api/gpg/key/public | sudo apt-key add - - sudo add-apt-repository --yes https://adoptium.jfrog.io/adoptium/deb/ - sudo apt-get update && sudo apt-get install temurin-17-jdk - sudo update-alternatives --set java /usr/lib/jvm/temurin-17-jdk-amd64/bin/java - sudo update-alternatives --set javac /usr/lib/jvm/temurin-17-jdk-amd64/bin/javac - java -version - - checkout - - type: shell - name: "Write CACHEVER to file" - command: echo "$CACHEVER" > ~/CACHEVER.txt - - restore_cache: - key: sc-config-{{ .Branch }}-{{ checksum "~/CACHEVER.txt" }} - - run: - name: "Download dependencies" - command: ./mvnw -s .settings.xml -U --fail-never dependency:go-offline || true - - save_cache: - key: sc-config-{{ .Branch }}-{{ checksum "~/CACHEVER.txt" }} - paths: - - ~/.m2 - - run: - name: "Running build" - command: ./mvnw -s .settings.xml clean org.jacoco:jacoco-maven-plugin:prepare-agent install -U -P sonar -nsu --batch-mode -Dmaven.test.redirectTestOutputToFile=true -Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=warn - - run: - name: "Aggregate test results" - when: always - command: | - mkdir -p ~/junit/ - find . -type f -regex ".*/target/.*-reports/.*" -exec cp {} ~/junit/ \; - bash <(curl -s https://codecov.io/bash) - - store_artifacts: - path: ~/junit/ - destination: artifacts - - store_test_results: - path: ~/junit/ - destination: testartifacts diff --git a/.editorconfig b/.editorconfig deleted file mode 100644 index e65ee453..00000000 --- a/.editorconfig +++ /dev/null @@ -1,14 +0,0 @@ -# EditorConfig is awesome: https://EditorConfig.org - -# top-most EditorConfig file -root = true - -[*] -indent_style = tab -indent_size = 4 -end_of_line = lf -insert_final_newline = true - -[*.yml] -indent_style = space -indent_size = 2 diff --git a/.flattened-pom.xml b/.flattened-pom.xml new file mode 100644 index 00000000..97eb71b5 --- /dev/null +++ b/.flattened-pom.xml @@ -0,0 +1,134 @@ + + + 4.0.0 + + org.springframework.cloud + spring-cloud-build + 4.0.0-SNAPSHOT + + + org.springframework.cloud + spring-cloud-config + 4.0.0-SNAPSHOT + pom + Spring Cloud Config + Spring Cloud Config + https://projects.spring.io/spring-cloud/ + + Pivotal Software, Inc. + https://www.spring.io + + + + Apache License, Version 2.0 + https://www.apache.org/licenses/LICENSE-2.0 + Copyright 2014-2021 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 + + https://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. + + + + + dsyer + Dave Syer + dsyer at pivotal.io + Pivotal Software, Inc. + https://www.spring.io + + lead + + + + sgibb + Spencer Gibb + sgibb at pivotal.io + Pivotal Software, Inc. + https://www.spring.io + + lead + + + + mgrzejszczak + Marcin Grzejszczak + mgrzejszczak at pivotal.io + Pivotal Software, Inc. + https://www.spring.io + + developer + + + + rbaxter + Ryan Baxter + rbaxter at pivotal.io + Pivotal Software, Inc. + https://www.spring.io + + developer + + + + omaciaszeksharma + Olga Maciaszek-Sharma + omaciaszeksharma at pivotal.io + Pivotal Software, Inc. + https://www.spring.io + + developer + + + + + scm:git:git://github.com/spring-cloud/spring-cloud-config.git + scm:git:ssh://git@github.com/spring-cloud/spring-cloud-config.git + https://github.com/spring-cloud/spring-cloud-config + + + + spring + + + + false + + + true + + spring-snapshots + Spring Snapshots + https://repo.spring.io/snapshot + + + + false + + spring-milestones + Spring Milestones + https://repo.spring.io/milestone + + + + false + + spring-releases + Spring Releases + https://repo.spring.io/release + + + + + diff --git a/.gitattributes b/.gitattributes deleted file mode 100644 index 53a3cbfa..00000000 --- a/.gitattributes +++ /dev/null @@ -1 +0,0 @@ -**/src/test/resources/*-repo/** eol=lf diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md deleted file mode 100644 index eb9a16ae..00000000 --- a/.github/CONTRIBUTING.md +++ /dev/null @@ -1,45 +0,0 @@ - -# Contributing - -Spring Cloud is released under the non-restrictive Apache 2.0 license, -and follows a very standard Github development process, using Github -tracker for issues and merging pull requests into master. If you want -to contribute even something trivial please do not hesitate, but -follow the guidelines below. - -## Sign the Contributor License Agreement -Before we accept a non-trivial patch or pull request we will need you to sign the -[Contributor License Agreement](https://cla.pivotal.io/sign/spring). -Signing the contributor's agreement does not grant anyone commit rights to the main -repository, but it does mean that we can accept your contributions, and you will get an -author credit if we do. Active contributors might be asked to join the core team, and -given the ability to merge pull requests. - -## Code of Conduct -This project adheres to the Contributor Covenant [code of -conduct](https://github.com/spring-cloud/spring-cloud-build/blob/master/docs/src/main/asciidoc/code-of-conduct.adoc). By participating, you are expected to uphold this code. Please report -unacceptable behavior to spring-code-of-conduct@pivotal.io. - -## Code Conventions and Housekeeping -None of these is essential for a pull request, but they will all help. They can also be -added after the original pull request but before a merge. - -* Use the Spring Framework code format conventions. If you use Eclipse - you can import formatter settings using the - `eclipse-code-formatter.xml` file from the - [Spring Cloud Build](https://raw.githubusercontent.com/spring-cloud/spring-cloud-build/master/spring-cloud-dependencies-parent/eclipse-code-formatter.xml) project. If using IntelliJ, you can use the - [Eclipse Code Formatter Plugin](https://plugins.jetbrains.com/plugin/6546) to import the same file. -* Make sure all new `.java` files to have a simple Javadoc class comment with at least an - `@author` tag identifying you, and preferably at least a paragraph on what the class is - for. -* Add the ASF license header comment to all new `.java` files (copy from existing files - in the project) -* Add yourself as an `@author` to the .java files that you modify substantially (more - than cosmetic changes). -* Add some Javadocs and, if you change the namespace, some XSD doc elements. -* A few unit tests would help a lot as well -- someone has to do it. -* If no-one else is using your branch, please rebase it against the current master (or - other target branch in the main project). -* When writing a commit message please follow [these conventions](https://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html), - if you are fixing an existing issue please add `Fixes gh-XXXX` at the end of the commit - message (where XXXX is the issue number). diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md deleted file mode 100644 index 0bc5ef4f..00000000 --- a/.github/ISSUE_TEMPLATE.md +++ /dev/null @@ -1,20 +0,0 @@ - diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md deleted file mode 100644 index 63bb5b66..00000000 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ /dev/null @@ -1,17 +0,0 @@ ---- -name: Bug report -about: Create a report to help us improve -title: '' -labels: waiting-for-triage -assignees: '' - ---- - -**Describe the bug** -Please provide details of the problem, including the version of Spring Cloud that you -are using. - -**Sample** -If possible, please provide a test case or sample application that reproduces -the problem. This makes it much easier for us to diagnose the problem and to verify that -we have fixed it. diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md deleted file mode 100644 index fe8ab455..00000000 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -name: Feature request -about: Suggest an idea for this project -title: '' -labels: waiting-for-triage -assignees: '' - ---- - -**Is your feature request related to a problem? Please describe.** -A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] - -**Describe the solution you'd like** -A clear and concise description of what you want to happen. - -**Describe alternatives you've considered** -A clear and concise description of any alternative solutions or features you've considered. - -**Additional context** -Add any other context or screenshots about the feature request here. diff --git a/.github/workflows/deploy-docs.yml b/.github/workflows/deploy-docs.yml new file mode 100644 index 00000000..5efcc43a --- /dev/null +++ b/.github/workflows/deploy-docs.yml @@ -0,0 +1,53 @@ +name: Deploy Docs +run-name: ${{ format('{0} ({1})', github.workflow, github.event.inputs.build-refname || 'all') }} +on: + workflow_dispatch: + inputs: + build-refname: + description: Enter git refname to build (e.g., 5.7.x). + required: false + push: + branches: docs-build +env: + GRADLE_ENTERPRISE_SECRET_ACCESS_KEY: ${{ secrets.GRADLE_ENTERPRISE_SECRET_ACCESS_KEY }} +permissions: + contents: write +jobs: + build: + if: github.repository_owner == 'spring-cloud' + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v3 + with: + fetch-depth: 5 + - name: Set up JDK 17 + uses: actions/setup-java@v3 + with: + java-version: '17' + distribution: 'temurin' + - name: Set up refname build + if: github.event.inputs.build-refname + run: | + git fetch --depth 1 https://github.com/$GITHUB_REPOSITORY ${{ github.event.inputs.build-refname }} + export BUILD_REFNAME=${{ github.event.inputs.build-refname }} + echo "BUILD_REFNAME=$BUILD_REFNAME" >> $GITHUB_ENV + export BUILD_VERSION=$(git cat-file --textconv FETCH_HEAD:pom.xml | python3 -c "import xml.etree.ElementTree as xml; from sys import stdin; print(xml.parse(stdin).getroot().find('{http://maven.apache.org/POM/4.0.0}version').text)") + echo BUILD_VERSION=$BUILD_VERSION >> $GITHUB_ENV + - name: Run Antora + run: | + ./mvnw --no-transfer-progress -B antora + - name: Publish Docs + uses: rwinch/spring-doc-actions/rsync-antora-reference@httpdocs-path + with: + docs-username: ${{ secrets.DOCS_USERNAME }} + docs-host: ${{ secrets.DOCS_HOST }} + docs-ssh-key: ${{ secrets.DOCS_SSH_KEY }} + docs-ssh-host-key: ${{ secrets.DOCS_SSH_HOST_KEY }} + site-path: target/antora/site + - name: Bust Cloudflare Cache + uses: spring-io/spring-doc-actions/bust-cloudflare-antora-cache@v0.0.11 + with: + context-root: spring-cloud-config + cloudflare-zone-id: ${{ secrets.CLOUDFLARE_ZONE_ID }} + cloudflare-cache-token: ${{ secrets.CLOUDFLARE_CACHE_TOKEN }} diff --git a/.github/workflows/maven.yaml b/.github/workflows/maven.yaml deleted file mode 100644 index 748dfdcc..00000000 --- a/.github/workflows/maven.yaml +++ /dev/null @@ -1,42 +0,0 @@ -# This workflow will build a Java project with Maven -# For more information see: https://help.github.com/actions/language-and-framework-guides/building-and-testing-java-with-maven - -name: Build - -on: - push: - branches: [ main, 3.1.x ] - pull_request: - branches: [ main, 3.1.x ] - -jobs: - build: - - runs-on: ubuntu-latest - - steps: - - uses: actions/checkout@v2 - - name: Set up JDK - uses: actions/setup-java@v2 - with: - distribution: 'temurin' - java-version: '17' - - name: Cache local Maven repository - uses: actions/cache@v2 - with: - path: ~/.m2/repository - key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }} - restore-keys: | - ${{ runner.os }}-maven- - - name: Build with Maven - run: ./mvnw -s .settings.xml clean org.jacoco:jacoco-maven-plugin:prepare-agent install -U -P sonar -nsu --batch-mode -Dmaven.test.redirectTestOutputToFile=true -Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=warn - - name: Publish Test Report - uses: mikepenz/action-junit-report@v2 - if: always() # always run even if the previous step fails - with: - report_paths: '**/surefire-reports/TEST-*.xml' - - name: Archive code coverage results - uses: actions/upload-artifact@v2 - with: - name: surefire-reports - path: '**/surefire-reports/*' diff --git a/.gitignore b/.gitignore index 6aa7b00a..6be8a4a1 100644 --- a/.gitignore +++ b/.gitignore @@ -1,23 +1,22 @@ -/application.yml -/application.properties -asciidoctor.css -*~ -.#* -*# -target -bin -_site/ -.classpath +target/ +.settings/ .project -.settings -.sts4-cache/ -.attach_pid* +.classpath +*.orig .springBeans -.DS_Store -*.sw* -*.iml -.idea .factorypath -.vscode/ -.flattened-pom.xml -IntelliJ_Spring_Boot_Java_Conventions.xml +.sts4-cache +.ant-targets-build.xml +src/ant/.ant-targets-upload-dist.xml +*.sonar4clipse* +.DS_Store +*.iml +*.ipr +*.iws +/.idea/ +*.graphml +node +node_modules +build +package.json +package-lock.json diff --git a/.java-version b/.java-version deleted file mode 100644 index 98d9bcb7..00000000 --- a/.java-version +++ /dev/null @@ -1 +0,0 @@ -17 diff --git a/.mvn/maven.config b/.mvn/maven.config deleted file mode 100644 index 3b8cf46e..00000000 --- a/.mvn/maven.config +++ /dev/null @@ -1 +0,0 @@ --DaltSnapshotDeploymentRepository=repo.spring.io::default::https://repo.spring.io/libs-snapshot-local -P spring diff --git a/.mvn/wrapper/MavenWrapperDownloader.java b/.mvn/wrapper/MavenWrapperDownloader.java new file mode 100644 index 00000000..b901097f --- /dev/null +++ b/.mvn/wrapper/MavenWrapperDownloader.java @@ -0,0 +1,117 @@ +/* + * Copyright 2007-present 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. + */ +import java.net.*; +import java.io.*; +import java.nio.channels.*; +import java.util.Properties; + +public class MavenWrapperDownloader { + + private static final String WRAPPER_VERSION = "0.5.6"; + /** + * Default URL to download the maven-wrapper.jar from, if no 'downloadUrl' is provided. + */ + private static final String DEFAULT_DOWNLOAD_URL = "https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/" + + WRAPPER_VERSION + "/maven-wrapper-" + WRAPPER_VERSION + ".jar"; + + /** + * Path to the maven-wrapper.properties file, which might contain a downloadUrl property to + * use instead of the default one. + */ + private static final String MAVEN_WRAPPER_PROPERTIES_PATH = + ".mvn/wrapper/maven-wrapper.properties"; + + /** + * Path where the maven-wrapper.jar will be saved to. + */ + private static final String MAVEN_WRAPPER_JAR_PATH = + ".mvn/wrapper/maven-wrapper.jar"; + + /** + * Name of the property which should be used to override the default download url for the wrapper. + */ + private static final String PROPERTY_NAME_WRAPPER_URL = "wrapperUrl"; + + public static void main(String args[]) { + System.out.println("- Downloader started"); + File baseDirectory = new File(args[0]); + System.out.println("- Using base directory: " + baseDirectory.getAbsolutePath()); + + // If the maven-wrapper.properties exists, read it and check if it contains a custom + // wrapperUrl parameter. + File mavenWrapperPropertyFile = new File(baseDirectory, MAVEN_WRAPPER_PROPERTIES_PATH); + String url = DEFAULT_DOWNLOAD_URL; + if(mavenWrapperPropertyFile.exists()) { + FileInputStream mavenWrapperPropertyFileInputStream = null; + try { + mavenWrapperPropertyFileInputStream = new FileInputStream(mavenWrapperPropertyFile); + Properties mavenWrapperProperties = new Properties(); + mavenWrapperProperties.load(mavenWrapperPropertyFileInputStream); + url = mavenWrapperProperties.getProperty(PROPERTY_NAME_WRAPPER_URL, url); + } catch (IOException e) { + System.out.println("- ERROR loading '" + MAVEN_WRAPPER_PROPERTIES_PATH + "'"); + } finally { + try { + if(mavenWrapperPropertyFileInputStream != null) { + mavenWrapperPropertyFileInputStream.close(); + } + } catch (IOException e) { + // Ignore ... + } + } + } + System.out.println("- Downloading from: " + url); + + File outputFile = new File(baseDirectory.getAbsolutePath(), MAVEN_WRAPPER_JAR_PATH); + if(!outputFile.getParentFile().exists()) { + if(!outputFile.getParentFile().mkdirs()) { + System.out.println( + "- ERROR creating output directory '" + outputFile.getParentFile().getAbsolutePath() + "'"); + } + } + System.out.println("- Downloading to: " + outputFile.getAbsolutePath()); + try { + downloadFileFromURL(url, outputFile); + System.out.println("Done"); + System.exit(0); + } catch (Throwable e) { + System.out.println("- Error downloading"); + e.printStackTrace(); + System.exit(1); + } + } + + private static void downloadFileFromURL(String urlString, File destination) throws Exception { + if (System.getenv("MVNW_USERNAME") != null && System.getenv("MVNW_PASSWORD") != null) { + String username = System.getenv("MVNW_USERNAME"); + char[] password = System.getenv("MVNW_PASSWORD").toCharArray(); + Authenticator.setDefault(new Authenticator() { + @Override + protected PasswordAuthentication getPasswordAuthentication() { + return new PasswordAuthentication(username, password); + } + }); + } + URL website = new URL(urlString); + ReadableByteChannel rbc; + rbc = Channels.newChannel(website.openStream()); + FileOutputStream fos = new FileOutputStream(destination); + fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE); + fos.close(); + rbc.close(); + } + +} diff --git a/.mvn/wrapper/maven-wrapper.jar b/.mvn/wrapper/maven-wrapper.jar index 5fd4d5023f1463b5ba3970e33c460c1eb26d748d..2cc7d4a55c0cd0092912bf49ae38b3a9e3fd0054 100644 GIT binary patch literal 50710 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 EfAhh=DF6Tf literal 49502 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%0A$pwhjXzyA0ZzErH{1@M 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 OJOEd-=rxTO#Qy`$*1Hh^ diff --git a/.mvn/wrapper/maven-wrapper.properties b/.mvn/wrapper/maven-wrapper.properties index c3150437..642d572c 100644 --- a/.mvn/wrapper/maven-wrapper.properties +++ b/.mvn/wrapper/maven-wrapper.properties @@ -1 +1,2 @@ -distributionUrl=https://repo1.maven.org/maven2/org/apache/maven/apache-maven/3.5.0/apache-maven-3.5.0-bin.zip +distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.6.3/apache-maven-3.6.3-bin.zip +wrapperUrl=https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar diff --git a/.sdkmanrc b/.sdkmanrc deleted file mode 100644 index 415f9083..00000000 --- a/.sdkmanrc +++ /dev/null @@ -1,3 +0,0 @@ -# Enable auto-env through the sdkman_auto_env config -# Add key=value pairs of SDKs to use below -java=17.0.1-tem diff --git a/.settings.xml b/.settings.xml deleted file mode 100644 index 9ddadef0..00000000 --- a/.settings.xml +++ /dev/null @@ -1,68 +0,0 @@ - - - - - repo.spring.io - ${env.CI_DEPLOY_USERNAME} - ${env.CI_DEPLOY_PASSWORD} - - - - - - spring - - true - - - - spring-snapshots - Spring Snapshots - https://repo.spring.io/snapshot - - true - - - - spring-milestones - Spring Milestones - https://repo.spring.io/libs-milestone-local - - false - - - - spring-releases - Spring Releases - https://repo.spring.io/release - - false - - - - - - spring-snapshots - Spring Snapshots - https://repo.spring.io/snapshot - - true - - - - spring-milestones - Spring Milestones - https://repo.spring.io/libs-milestone-local - - false - - - - - - diff --git a/.springformat b/.springformat deleted file mode 100644 index e69de29b..00000000 diff --git a/Guardfile b/Guardfile deleted file mode 100644 index 0306030a..00000000 --- a/Guardfile +++ /dev/null @@ -1,11 +0,0 @@ -require 'asciidoctor' -require 'erb' - -options = {:mkdirs => true, :safe => :unsafe, :attributes => ['linkcss', 'allow-uri-read'] } - -guard 'shell' do - watch(/^docs\/[A-Za-z][^#]*\.adoc$/) {|m| - Asciidoctor.load_file('docs/src/main/asciidoc/README.adoc', :to_file => './README.adoc', safe: :safe, parse: false, attributes: 'allow-uri-read') - Asciidoctor.render_file('docs/src/main/asciidoc/spring-cloud-config.adoc', options.merge(:to_dir => './docs/target/generated-docs')) - } -end diff --git a/LICENSE.txt b/LICENSE.txt deleted file mode 100644 index 62589edd..00000000 --- a/LICENSE.txt +++ /dev/null @@ -1,202 +0,0 @@ - - Apache License - Version 2.0, January 2004 - https://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - 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 - - https://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. diff --git a/README.adoc b/README.adoc index 2991a3d1..99906b0a 100644 --- a/README.adoc +++ b/README.adoc @@ -1,591 +1,23 @@ -//// -DO NOT EDIT THIS FILE. IT WAS GENERATED. -Manual changes to this file will be lost when it is generated again. -Edit the files in the src/main/asciidoc/ directory instead. -//// += Spring Cloud Config Docs Build +You're currently viewing the Antora playbook branch. +The playbook branch hosts the docs build that is used to build and publish the production docs site. -image::https://circleci.com/gh/spring-cloud/spring-cloud-config/tree/master.svg?style=svg["CircleCI", link="https://circleci.com/gh/spring-cloud/spring-cloud-config/tree/master"] -image::https://codecov.io/gh/spring-cloud/spring-cloud-config/branch/master/graph/badge.svg["Codecov", link="https://codecov.io/gh/spring-cloud/spring-cloud-config/branch/master"] -image::https://api.codacy.com/project/badge/Grade/f064024a072c477e97dca6ed5a70fccd?branch=master["Codacy code quality", link="https://www.codacy.com/app/Spring-Cloud/spring-cloud-config?branch=master&utm_source=github.com&utm_medium=referral&utm_content=spring-cloud/spring-cloud-config&utm_campaign=Badge_Grade"] +The Spring Cloud Config reference docs are built using https://antora.org[Antora]. +This README covers how to build the docs in a software branch as well as how to build the production docs site locally. +== Building the Site -Spring Cloud Config provides server-side and client-side support for externalized configuration in a distributed system. With the Config Server, you have a central place to manage external properties for applications across all environments. -The concepts on both client and server map identically to the Spring `Environment` and `PropertySource` abstractions, so they fit very well with Spring applications but can be used with any application running in any language. -As an application moves through the deployment pipeline from dev to test and into production, you can manage the configuration between those environments and be certain that applications have everything they need to run when they migrate. -The default implementation of the server storage backend uses git, so it easily supports labelled versions of configuration environments as well as being accessible to a wide range of tooling for managing the content. -It is easy to add alternative implementations and plug them in with Spring configuration. - -== Features - -=== Spring Cloud Config Server - -Spring Cloud Config Server offers the following benefits: - -* HTTP resource-based API for external configuration (name-value pairs or equivalent YAML content) -* Encrypt and decrypt property values (symmetric or asymmetric) -* Embeddable easily in a Spring Boot application using `@EnableConfigServer` - -=== Spring Cloud Config Client - -Specifically for Spring applications, Spring Cloud Config Client lets you: - -* Bind to the Config Server and initialize Spring `Environment` with remote property sources. -* Encrypt and decrypt property values (symmetric or asymmetric). -* `@RefreshScope` for Spring `@Beans` that want to be re-initialized when configuration changes. -* Use management endpoints: -** `/env` for updating `Environment` and rebinding `@ConfigurationProperties` and log levels. -** `/refresh` for refreshing the `@RefreshScope` beans. -** `/restart` for restarting the Spring context (disabled by default). -** `/pause` and `/resume` for calling the `Lifecycle` methods (`stop()` and `start()` on the `ApplicationContext`). -* Bootstrap application context: a parent context for the main application that can be trained to do anything (by default, it binds to the Config Server and decrypts property values). - -== Quick Start - -This quick start walks through using both the server and the client of Spring Cloud Config Server. - -First, start the server, as follows: +You can build the entire site by invoking the following on the docs-build branch and then viewing the site at `target/site/index.html` +[source,bash] ---- -$ cd spring-cloud-config-server -$ ../mvnw spring-boot:run +./mvnw antora ---- -The server is a Spring Boot application, so you can run it from your IDE if you prefer to do so (the main class is `ConfigServerApplication`). - -Next try out a client, as follows: +== Building a Specific Branch +[source,bash] ---- -$ curl localhost:8888/foo/development -{ - "name": "foo", - "profiles": [ - "development" - ] - .... - "propertySources": [ - { - "name": "https://github.com/spring-cloud-samples/config-repo/foo-development.properties", - "source": { - "bar": "spam", - "foo": "from foo development" - } - }, - { - "name": "https://github.com/spring-cloud-samples/config-repo/foo.properties", - "source": { - "foo": "from foo props", - "democonfigclient.message": "hello spring io" - } - }, - .... +./mvnw antora ---- - -The default strategy for locating property sources is to clone a git repository (at `spring.cloud.config.server.git.uri`) and use it to initialize a mini `SpringApplication`. -The mini-application's `Environment` is used to enumerate property sources and publish them at a JSON endpoint. - -The HTTP service has resources in the following form: - ----- -/{application}/{profile}[/{label}] -/{application}-{profile}.yml -/{label}/{application}-{profile}.yml -/{application}-{profile}.properties -/{label}/{application}-{profile}.properties ----- - -For example: - ----- -curl localhost:8888/foo/development -curl localhost:8888/foo/development/master -curl localhost:8888/foo/development,db/master -curl localhost:8888/foo-development.yml -curl localhost:8888/foo-db.properties -curl localhost:8888/master/foo-db.properties ----- - -where `application` is injected as the `spring.config.name` in the `SpringApplication` (what is normally `application` in a regular Spring Boot app), `profile` is an active profile (or comma-separated list of properties), and `label` is an optional git label (defaults to `master`.) - -Spring Cloud Config Server pulls configuration for remote clients from various sources. The following example gets configuration from a git repository (which must be provided), as shown in the following example: - -[source,yaml] ----- -spring: - cloud: - config: - server: - git: - uri: https://github.com/spring-cloud-samples/config-repo ----- - -Other sources are any JDBC compatible database, Subversion, Hashicorp Vault, Credhub and local filesystems. - -=== Client Side Usage - -To use these features in an application, you can build it as a Spring Boot application that depends on spring-cloud-config-client (for an example, see the test cases for the config-client or the sample application). -The most convenient way to add the dependency is with a Spring Boot starter `org.springframework.cloud:spring-cloud-starter-config`. -There is also a parent pom and BOM (`spring-cloud-starter-parent`) for Maven users and a Spring IO version management properties file for Gradle and Spring CLI users. The following example shows a typical Maven configuration: - -[source,xml,indent=0] -.pom.xml ----- - - org.springframework.boot - spring-boot-starter-parent - {spring-boot-docs-version} - - - - - - - org.springframework.cloud - spring-cloud-dependencies - {spring-cloud-version} - pom - import - - - - - - - org.springframework.cloud - spring-cloud-starter-config - - - org.springframework.boot - spring-boot-starter-test - test - - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - - ----- - -Now you can create a standard Spring Boot application, such as the following HTTP server: - ----- -@SpringBootApplication -@RestController -public class Application { - - @RequestMapping("/") - public String home() { - return "Hello World!"; - } - - public static void main(String[] args) { - SpringApplication.run(Application.class, args); - } - -} ----- - -When this HTTP server runs, it picks up the external configuration from the default local config server (if it is running) on port 8888. -To modify the startup behavior, you can change the location of the config server by using `application.properties` as shown in the following example: - ----- -spring.config.import=optional:configserver:http://myconfigserver.com ----- - -By default, if no application name is set, `application` will be used. To modify the name, the following property can be added to the `application.properties` file: - ----- -spring.application.name: myapp ----- - -NOTE: When setting the property `${spring.application.name}` do not prefix your app name with the reserved word `application-` to prevent issues resolving the correct property source. - -The Config Server properties show up in the `/env` endpoint as a high-priority property source, as shown in the following example. - ----- -$ curl localhost:8080/env -{ - "activeProfiles": [], - { - "name": "servletContextInitParams", - "properties": {} - }, - { - "name": "configserver:https://github.com/spring-cloud-samples/config-repo/foo.properties", - "properties": { - "foo": { - "value": "bar", - "origin": "Config Server https://github.com/spring-cloud-samples/config-repo/foo.properties:2:12" - } - } - }, - ... -} ----- - -A property source called `configserver:/` contains the `foo` property with a value of `bar`. - -NOTE: The URL in the property source name is the git repository, not the config server URL. - -WARNING: If you use Spring Cloud Config Client, you need to set the `spring.config.import` property in order to bind to Config Server. You can read more about it https://docs.spring.io/spring-cloud-config/docs/current/reference/html/#config-data-import[in the Spring Cloud Config Reference Guide]. - -=== Sample Application - -You can find a sample application https://github.com/spring-cloud/spring-cloud-config/tree/master/spring-cloud-config-sample[here]. -It is a Spring Boot application, so you can run it by using the usual mechanisms (for instance, `mvn spring-boot:run`). -When it runs, it looks for the config server on `http://localhost:8888` (a configurable default), so you can run the server as well to see it all working together. - -The sample has a test case where the config server is also started in the same JVM (with a different port), and the test asserts that an -environment property from the git configuration repo is present. -To change the location of the config server, you can set `spring.cloud.config.uri` in `bootstrap.yml` (or in system properties and other places). - -The test case has a `main()` method that runs the server in the same way (watch the logs for its port), so you can run the whole system in one process and play with it (for example, you can run the `main()` method in your IDE). -The `main()` method uses `target/config` for the working directory of the git repository, so you can make local changes there and see them reflected in the running app. The following example shows a session of tinkering with the test case: - ----- -$ curl localhost:8080/env/sample -mytest -$ vi target/config/mytest.properties -.. change value of "sample", optionally commit -$ curl -X POST localhost:8080/refresh -["sample"] -$ curl localhost:8080/env/sample -sampleValue ----- - -The refresh endpoint reports that the "sample" property changed. - -== Building - -:jdkversion: 17 - -=== Basic Compile and Test - -To build the source you will need to install JDK {jdkversion}. - -Spring Cloud uses Maven for most build-related activities, and you -should be able to get off the ground quite quickly by cloning the -project you are interested in and typing - ----- -$ ./mvnw install ----- - -NOTE: You can also install Maven (>=3.3.3) yourself and run the `mvn` command -in place of `./mvnw` in the examples below. If you do that you also -might need to add `-P spring` if your local Maven settings do not -contain repository declarations for spring pre-release artifacts. - -NOTE: Be aware that you might need to increase the amount of memory -available to Maven by setting a `MAVEN_OPTS` environment variable with -a value like `-Xmx512m -XX:MaxPermSize=128m`. We try to cover this in -the `.mvn` configuration, so if you find you have to do it to make a -build succeed, please raise a ticket to get the settings added to -source control. - -The projects that require middleware (i.e. Redis) for testing generally -require that a local instance of [Docker](https://www.docker.com/get-started) is installed and running. - - -=== Documentation - -The spring-cloud-build module has a "docs" profile, and if you switch -that on it will try to build asciidoc sources from -`src/main/asciidoc`. As part of that process it will look for a -`README.adoc` and process it by loading all the includes, but not -parsing or rendering it, just copying it to `${main.basedir}` -(defaults to `${basedir}`, i.e. the root of the project). If there are -any changes in the README it will then show up after a Maven build as -a modified file in the correct place. Just commit it and push the change. - -=== Working with the code -If you don't have an IDE preference we would recommend that you use -https://www.springsource.com/developer/sts[Spring Tools Suite] or -https://eclipse.org[Eclipse] when working with the code. We use the -https://eclipse.org/m2e/[m2eclipse] eclipse plugin for maven support. Other IDEs and tools -should also work without issue as long as they use Maven 3.3.3 or better. - -==== Activate the Spring Maven profile -Spring Cloud projects require the 'spring' Maven profile to be activated to resolve -the spring milestone and snapshot repositories. Use your preferred IDE to set this -profile to be active, or you may experience build errors. - -==== Importing into eclipse with m2eclipse -We recommend the https://eclipse.org/m2e/[m2eclipse] eclipse plugin when working with -eclipse. If you don't already have m2eclipse installed it is available from the "eclipse -marketplace". - -NOTE: Older versions of m2e do not support Maven 3.3, so once the -projects are imported into Eclipse you will also need to tell -m2eclipse to use the right profile for the projects. If you -see many different errors related to the POMs in the projects, check -that you have an up to date installation. If you can't upgrade m2e, -add the "spring" profile to your `settings.xml`. Alternatively you can -copy the repository settings from the "spring" profile of the parent -pom into your `settings.xml`. - -==== Importing into eclipse without m2eclipse -If you prefer not to use m2eclipse you can generate eclipse project metadata using the -following command: - -[indent=0] ----- - $ ./mvnw eclipse:eclipse ----- - -The generated eclipse projects can be imported by selecting `import existing projects` -from the `file` menu. - - -=== JCE - -If you get an exception due to "Illegal key size" and you are using Sun’s JDK, you need to install the Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files. -See the following links for more information: - -https://www.oracle.com/technetwork/java/javase/downloads/jce-6-download-429243.html[Java 6 JCE] - -https://www.oracle.com/technetwork/java/javase/downloads/jce-7-download-432124.html[Java 7 JCE] - -https://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.html[Java 8 JCE] - -Extract the JCE files into the `JDK/jre/lib/security` folder for whichever version of JRE/JDK x64/x86 you use. - -== Contributing - -:spring-cloud-build-branch: master - -Spring Cloud is released under the non-restrictive Apache 2.0 license, -and follows a very standard Github development process, using Github -tracker for issues and merging pull requests into master. If you want -to contribute even something trivial please do not hesitate, but -follow the guidelines below. - -=== Sign the Contributor License Agreement -Before we accept a non-trivial patch or pull request we will need you to sign the -https://cla.pivotal.io/sign/spring[Contributor License Agreement]. -Signing the contributor's agreement does not grant anyone commit rights to the main -repository, but it does mean that we can accept your contributions, and you will get an -author credit if we do. Active contributors might be asked to join the core team, and -given the ability to merge pull requests. - -=== Code of Conduct -This project adheres to the Contributor Covenant https://github.com/spring-cloud/spring-cloud-build/blob/master/docs/src/main/asciidoc/code-of-conduct.adoc[code of -conduct]. By participating, you are expected to uphold this code. Please report -unacceptable behavior to spring-code-of-conduct@pivotal.io. - -=== Code Conventions and Housekeeping -None of these is essential for a pull request, but they will all help. They can also be -added after the original pull request but before a merge. - -* Use the Spring Framework code format conventions. If you use Eclipse - you can import formatter settings using the - `eclipse-code-formatter.xml` file from the - https://raw.githubusercontent.com/spring-cloud/spring-cloud-build/master/spring-cloud-dependencies-parent/eclipse-code-formatter.xml[Spring - Cloud Build] project. If using IntelliJ, you can use the - https://plugins.jetbrains.com/plugin/6546[Eclipse Code Formatter - Plugin] to import the same file. -* Make sure all new `.java` files to have a simple Javadoc class comment with at least an - `@author` tag identifying you, and preferably at least a paragraph on what the class is - for. -* Add the ASF license header comment to all new `.java` files (copy from existing files - in the project) -* Add yourself as an `@author` to the .java files that you modify substantially (more - than cosmetic changes). -* Add some Javadocs and, if you change the namespace, some XSD doc elements. -* A few unit tests would help a lot as well -- someone has to do it. -* If no-one else is using your branch, please rebase it against the current master (or - other target branch in the main project). -* When writing a commit message please follow https://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html[these conventions], - if you are fixing an existing issue please add `Fixes gh-XXXX` at the end of the commit - message (where XXXX is the issue number). - -=== Checkstyle - -Spring Cloud Build comes with a set of checkstyle rules. You can find them in the `spring-cloud-build-tools` module. The most notable files under the module are: - -.spring-cloud-build-tools/ ----- -└── src -    ├── checkstyle -    │   └── checkstyle-suppressions.xml <3> -    └── main -    └── resources -    ├── checkstyle-header.txt <2> -    └── checkstyle.xml <1> ----- -<1> Default Checkstyle rules -<2> File header setup -<3> Default suppression rules - -==== Checkstyle configuration - -Checkstyle rules are *disabled by default*. To add checkstyle to your project just define the following properties and plugins. - -.pom.xml ----- - -true <1> - true - <2> - true - <3> - - - - - <4> - io.spring.javaformat - spring-javaformat-maven-plugin - - <5> - org.apache.maven.plugins - maven-checkstyle-plugin - - - - - - <5> - org.apache.maven.plugins - maven-checkstyle-plugin - - - - ----- -<1> Fails the build upon Checkstyle errors -<2> Fails the build upon Checkstyle violations -<3> Checkstyle analyzes also the test sources -<4> Add the Spring Java Format plugin that will reformat your code to pass most of the Checkstyle formatting rules -<5> Add checkstyle plugin to your build and reporting phases - -If you need to suppress some rules (e.g. line length needs to be longer), then it's enough for you to define a file under `${project.root}/src/checkstyle/checkstyle-suppressions.xml` with your suppressions. Example: - -.projectRoot/src/checkstyle/checkstyle-suppresions.xml ----- - - - - - - ----- - -It's advisable to copy the `${spring-cloud-build.rootFolder}/.editorconfig` and `${spring-cloud-build.rootFolder}/.springformat` to your project. That way, some default formatting rules will be applied. You can do so by running this script: - -```bash -$ curl https://raw.githubusercontent.com/spring-cloud/spring-cloud-build/master/.editorconfig -o .editorconfig -$ touch .springformat -``` - -=== IDE setup - -==== Intellij IDEA - -In order to setup Intellij you should import our coding conventions, inspection profiles and set up the checkstyle plugin. -The following files can be found in the https://github.com/spring-cloud/spring-cloud-build/tree/master/spring-cloud-build-tools[Spring Cloud Build] project. - -.spring-cloud-build-tools/ ----- -└── src -    ├── checkstyle -    │   └── checkstyle-suppressions.xml <3> -    └── main -    └── resources -    ├── checkstyle-header.txt <2> -    ├── checkstyle.xml <1> -    └── intellij -       ├── Intellij_Project_Defaults.xml <4> -       └── Intellij_Spring_Boot_Java_Conventions.xml <5> ----- -<1> Default Checkstyle rules -<2> File header setup -<3> Default suppression rules -<4> Project defaults for Intellij that apply most of Checkstyle rules -<5> Project style conventions for Intellij that apply most of Checkstyle rules - -.Code style - -image::https://raw.githubusercontent.com/spring-cloud/spring-cloud-build/{spring-cloud-build-branch}/docs/src/main/asciidoc/images/intellij-code-style.png[Code style] - -Go to `File` -> `Settings` -> `Editor` -> `Code style`. There click on the icon next to the `Scheme` section. There, click on the `Import Scheme` value and pick the `Intellij IDEA code style XML` option. Import the `spring-cloud-build-tools/src/main/resources/intellij/Intellij_Spring_Boot_Java_Conventions.xml` file. - -.Inspection profiles - -image::https://raw.githubusercontent.com/spring-cloud/spring-cloud-build/{spring-cloud-build-branch}/docs/src/main/asciidoc/images/intellij-inspections.png[Code style] - -Go to `File` -> `Settings` -> `Editor` -> `Inspections`. There click on the icon next to the `Profile` section. There, click on the `Import Profile` and import the `spring-cloud-build-tools/src/main/resources/intellij/Intellij_Project_Defaults.xml` file. - -.Checkstyle - -To have Intellij work with Checkstyle, you have to install the `Checkstyle` plugin. It's advisable to also install the `Assertions2Assertj` to automatically convert the JUnit assertions - -image::https://raw.githubusercontent.com/spring-cloud/spring-cloud-build/{spring-cloud-build-branch}/docs/src/main/asciidoc/images/intellij-checkstyle.png[Checkstyle] - -Go to `File` -> `Settings` -> `Other settings` -> `Checkstyle`. There click on the `+` icon in the `Configuration file` section. There, you'll have to define where the checkstyle rules should be picked from. In the image above, we've picked the rules from the cloned Spring Cloud Build repository. However, you can point to the Spring Cloud Build's GitHub repository (e.g. for the `checkstyle.xml` : `https://raw.githubusercontent.com/spring-cloud/spring-cloud-build/master/spring-cloud-build-tools/src/main/resources/checkstyle.xml`). We need to provide the following variables: - -- `checkstyle.header.file` - please point it to the Spring Cloud Build's, `spring-cloud-build-tools/src/main/resources/checkstyle-header.txt` file either in your cloned repo or via the `https://raw.githubusercontent.com/spring-cloud/spring-cloud-build/master/spring-cloud-build-tools/src/main/resources/checkstyle-header.txt` URL. -- `checkstyle.suppressions.file` - default suppressions. Please point it to the Spring Cloud Build's, `spring-cloud-build-tools/src/checkstyle/checkstyle-suppressions.xml` file either in your cloned repo or via the `https://raw.githubusercontent.com/spring-cloud/spring-cloud-build/master/spring-cloud-build-tools/src/checkstyle/checkstyle-suppressions.xml` URL. -- `checkstyle.additional.suppressions.file` - this variable corresponds to suppressions in your local project. E.g. you're working on `spring-cloud-contract`. Then point to the `project-root/src/checkstyle/checkstyle-suppressions.xml` folder. Example for `spring-cloud-contract` would be: `/home/username/spring-cloud-contract/src/checkstyle/checkstyle-suppressions.xml`. - -IMPORTANT: Remember to set the `Scan Scope` to `All sources` since we apply checkstyle rules for production and test sources. - -=== Duplicate Finder - -Spring Cloud Build brings along the `basepom:duplicate-finder-maven-plugin`, that enables flagging duplicate and conflicting classes and resources on the java classpath. - -==== Duplicate Finder configuration - -Duplicate finder is *enabled by default* and will run in the `verify` phase of your Maven build, but it will only take effect in your project if you add the `duplicate-finder-maven-plugin` to the `build` section of the projecst's `pom.xml`. - -.pom.xml -[source,xml] ----- - - - - org.basepom.maven - duplicate-finder-maven-plugin - - - ----- - -For other properties, we have set defaults as listed in the https://github.com/basepom/duplicate-finder-maven-plugin/wiki[plugin documentation]. - -You can easily override them but setting the value of the selected property prefixed with `duplicate-finder-maven-plugin`. For example, set `duplicate-finder-maven-plugin.skip` to `true` in order to skip duplicates check in your build. - -If you need to add `ignoredClassPatterns` or `ignoredResourcePatterns` to your setup, make sure to add them in the plugin configuration section of your project: - -[source,xml] ----- - - - - org.basepom.maven - duplicate-finder-maven-plugin - - - org.joda.time.base.BaseDateTime - .*module-info - - - changelog.txt - - - - - - - ----- - diff --git a/docs/antora-playbook.yml b/antora-playbook.yml similarity index 61% rename from docs/antora-playbook.yml rename to antora-playbook.yml index 9a70e676..96e1bb4b 100644 --- a/docs/antora-playbook.yml +++ b/antora-playbook.yml @@ -6,38 +6,39 @@ antora: - '@antora/collector-extension' - '@antora/atlas-extension' - require: '@springio/antora-extensions/root-component-extension' - root_component_name: 'PROJECT_WITHOUT_SPRING' - # FIXME: Run antora once using this extension to migrate to the Asciidoc Tabs syntax - # and then remove this extension - - require: '@springio/antora-extensions/tabs-migration-extension' - unwrap_example_block: always - save_result: true + root_component_name: 'cloud-config' site: - title: PROJECT_FULL_NAME - url: https://docs.spring.io/PROJECT_NAME/reference/ + title: Spring Cloud Config + url: https://docs.spring.io/spring-cloud-config/reference + robots: allow +git: + ensure_git_suffix: false content: sources: - - url: ./.. - branches: HEAD + - url: https://github.com/spring-cloud/spring-cloud-config + # Refname matching: + # https://docs.antora.org/antora/latest/playbook/content-refname-matching/ + branches: [ main ] + tags: [ '({4..9}).+({1..9}).+({0..9})?(-{RC,M}+({0..9}))', '!4.1.0-M1' ] start_path: docs - worktrees: true asciidoc: attributes: page-stackoverflow-url: https://stackoverflow.com/tags/spring-cloud page-pagination: '' hide-uri-scheme: '@' tabs-sync-option: '@' - chomp: 'all' extensions: - '@asciidoctor/tabs' - '@springio/asciidoctor-extensions' - sourcemap: true urls: + latest_version_segment_strategy: redirect:to latest_version_segment: '' + redirect_facility: httpd +ui: + bundle: + url: https://github.com/spring-io/antora-ui-spring/releases/download/v0.3.5/ui-bundle.zip + snapshot: true runtime: log: failure_level: warn format: pretty -ui: - bundle: - url: https://github.com/spring-io/antora-ui-spring/releases/download/v0.3.5/ui-bundle.zip diff --git a/docs/.flattened-pom.xml b/docs/.flattened-pom.xml new file mode 100644 index 00000000..4d10fcec --- /dev/null +++ b/docs/.flattened-pom.xml @@ -0,0 +1,107 @@ + + + 4.0.0 + + org.springframework.cloud + spring-cloud-config + 4.0.3-SNAPSHOT + .. + + org.springframework.cloud + spring-cloud-config-docs + 4.0.3-SNAPSHOT + Spring Cloud Config Docs + Spring Cloud Docs + https://projects.spring.io/spring-cloud/spring-cloud-config-docs/ + + Pivotal Software, Inc. + https://www.spring.io + + + + Apache License, Version 2.0 + https://www.apache.org/licenses/LICENSE-2.0 + Copyright 2014-2021 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 + + https://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. + + + + + dsyer + Dave Syer + dsyer at pivotal.io + Pivotal Software, Inc. + https://www.spring.io + + lead + + + + sgibb + Spencer Gibb + sgibb at pivotal.io + Pivotal Software, Inc. + https://www.spring.io + + lead + + + + mgrzejszczak + Marcin Grzejszczak + mgrzejszczak at pivotal.io + Pivotal Software, Inc. + https://www.spring.io + + developer + + + + rbaxter + Ryan Baxter + rbaxter at pivotal.io + Pivotal Software, Inc. + https://www.spring.io + + developer + + + + omaciaszeksharma + Olga Maciaszek-Sharma + omaciaszeksharma at pivotal.io + Pivotal Software, Inc. + https://www.spring.io + + developer + + + + + scm:git:git://github.com/spring-cloud/spring-cloud-config.git/spring-cloud-config-docs + scm:git:ssh://git@github.com/spring-cloud/spring-cloud-config.git/spring-cloud-config-docs + https://github.com/spring-cloud/spring-cloud-config/spring-cloud-config-docs + + + + org.springframework.cloud + spring-cloud-starter-config + 4.0.3-SNAPSHOT + compile + + + diff --git a/docs/.github/workflows/deploy-docs.yml b/docs/.github/workflows/deploy-docs.yml deleted file mode 100644 index be4b92df..00000000 --- a/docs/.github/workflows/deploy-docs.yml +++ /dev/null @@ -1,32 +0,0 @@ -name: Deploy Docs -on: - push: - branches-ignore: [ gh-pages ] - tags: '**' - repository_dispatch: - types: request-build-reference # legacy - #schedule: - #- cron: '0 10 * * *' # Once per day at 10am UTC - workflow_dispatch: -permissions: - actions: write -jobs: - build: - runs-on: ubuntu-latest - # if: github.repository_owner == 'spring-cloud' - steps: - - name: Checkout - uses: actions/checkout@v3 - with: - ref: docs-build - fetch-depth: 1 - - name: Dispatch (partial build) - if: github.ref_type == 'branch' - env: - GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: gh workflow run deploy-docs.yml -r $(git rev-parse --abbrev-ref HEAD) -f build-refname=${{ github.ref_name }} - - name: Dispatch (full build) - if: github.ref_type == 'tag' - env: - GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: gh workflow run deploy-docs.yml -r $(git rev-parse --abbrev-ref HEAD) diff --git a/docs/antora.yml b/docs/antora.yml deleted file mode 100644 index 15b346da..00000000 --- a/docs/antora.yml +++ /dev/null @@ -1,12 +0,0 @@ -name: PROJECT_WITHOUT_SPRING -version: true -title: PROJECT_NAME -nav: - - modules/ROOT/nav.adoc -ext: - collector: - run: - command: ./mvnw --no-transfer-progress -B process-resources -Pdocs -pl docs -Dantora-maven-plugin.phase=none -Dgenerate-docs.phase=none -Dgenerate-readme.phase=none -Dgenerate-cloud-resources.phase=none -Dmaven-dependency-plugin-for-docs.phase=none -Dmaven-dependency-plugin-for-docs-classes.phase=none -DskipTests - local: true - scan: - dir: ./target/classes/antora-resources/ diff --git a/docs/modules/ROOT/nav.adoc b/docs/modules/ROOT/nav.adoc deleted file mode 100644 index d420d40a..00000000 --- a/docs/modules/ROOT/nav.adoc +++ /dev/null @@ -1,45 +0,0 @@ -* xref:index.adoc[] -* xref:spring-cloud-config.adoc[] -** xref:spring-cloud-config/quick-start.adoc[] -** xref:spring-cloud-config/server.adoc[] -*** xref:spring-cloud-config/server/environment-repository.adoc[] -**** xref:spring-cloud-config/server/environment-repository/git-backend.adoc[] -**** xref:spring-cloud-config/server/environment-repository/version-control-backend-filesystem-use.adoc[] -**** xref:spring-cloud-config/server/environment-repository/file-system-backend.adoc[] -**** xref:spring-cloud-config/server/environment-repository/vault-backend.adoc[] -**** xref:spring-cloud-config/server/environment-repository/accessing-backends-through-a-proxy.adoc[] -**** xref:spring-cloud-config/server/environment-repository/sharing-configuration-with-all-applications.adoc[] -**** xref:spring-cloud-config/server/environment-repository/aws-secrets-manager.adoc[] -**** xref:spring-cloud-config/server/environment-repository/aws-parameter-store.adoc[] -**** xref:spring-cloud-config/server/environment-repository/jdbc-backend.adoc[] -**** xref:spring-cloud-config/server/environment-repository/redis-backend.adoc[] -**** xref:spring-cloud-config/server/environment-repository/aws-s3-backend.adoc[] -**** xref:spring-cloud-config/server/environment-repository/aws-parameter-store-backend.adoc[] -**** xref:spring-cloud-config/server/environment-repository/aws-secrets-manager-backend.adoc[] -**** xref:spring-cloud-config/server/environment-repository/credhub-backend.adoc[] -**** xref:spring-cloud-config/server/environment-repository/composite-repositories.adoc[] -**** xref:spring-cloud-config/server/environment-repository/property-overrides.adoc[] -**** xref:spring-cloud-config/server/environment-repository/using-bootstrap-to-override-properties.adoc[] -**** xref:spring-cloud-config/server/environment-repository/overriding-properties-using-placeholders.adoc[] -**** xref:spring-cloud-config/server/environment-repository/overriding-properties-using-profiles.adoc[] -*** xref:spring-cloud-config/server/health-indicator.adoc[] -*** xref:spring-cloud-config/server/security.adoc[] -*** xref:spring-cloud-config/server/actuator-and-security.adoc[] -*** xref:spring-cloud-config/server/encryption-and-decryption.adoc[] -*** xref:spring-cloud-config/server/key-management.adoc[] -*** xref:spring-cloud-config/server/creating-a-key-store-for-testing.adoc[] -*** xref:spring-cloud-config/server/using-multiple-keys-and-key-rotation.adoc[] -*** xref:spring-cloud-config/server/serving-encrypted-properties.adoc[] -*** xref:spring-cloud-config/server/serving-alternative-formats.adoc[] -*** xref:spring-cloud-config/server/serving-plain-text.adoc[] -*** xref:spring-cloud-config/server/serving-binary-files.adoc[] -*** xref:spring-cloud-config/server/embedding-the.adoc[] -*** xref:spring-cloud-config/server/push-notifications-and-bus.adoc[] -*** xref:spring-cloud-config/server/-aot-and-native-image-support.adoc[] -** xref:spring-cloud-config/client.adoc[] -* xref:intro.adoc[] -* xref:quickstart.adoc[] -* xref:_observability.adoc[] -* xref:README.adoc[] -* xref:_configprops.adoc[] -* xref:sagan-index.adoc[] diff --git a/docs/modules/ROOT/pages/README.adoc b/docs/modules/ROOT/pages/README.adoc deleted file mode 100644 index 85ae153b..00000000 --- a/docs/modules/ROOT/pages/README.adoc +++ /dev/null @@ -1,86 +0,0 @@ -image::https://circleci.com/gh/spring-cloud/spring-cloud-config/tree/master.svg?style=svg["CircleCI", link="https://circleci.com/gh/spring-cloud/spring-cloud-config/tree/master"] -image::https://codecov.io/gh/spring-cloud/spring-cloud-config/branch/master/graph/badge.svg["Codecov", link="https://codecov.io/gh/spring-cloud/spring-cloud-config/branch/master"] -image::https://api.codacy.com/project/badge/Grade/f064024a072c477e97dca6ed5a70fccd?branch=master["Codacy code quality", link="https://www.codacy.com/app/Spring-Cloud/spring-cloud-config?branch=master&utm_source=github.com&utm_medium=referral&utm_content=spring-cloud/spring-cloud-config&utm_campaign=Badge_Grade"] - - -[[features]] -= Features - -[[spring-cloud-config-server]] -== Spring Cloud Config Server - -Spring Cloud Config Server offers the following benefits: - -* HTTP resource-based API for external configuration (name-value pairs or equivalent YAML content) -* Encrypt and decrypt property values (symmetric or asymmetric) -* Embeddable easily in a Spring Boot application using `@EnableConfigServer` - -[[spring-cloud-config-client]] -== Spring Cloud Config Client - -Specifically for Spring applications, Spring Cloud Config Client lets you: - -* Bind to the Config Server and initialize Spring `Environment` with remote property sources. -* Encrypt and decrypt property values (symmetric or asymmetric). -* `@RefreshScope` for Spring `@Beans` that want to be re-initialized when configuration changes. -* Use management endpoints: -** `/env` for updating `Environment` and rebinding `@ConfigurationProperties` and log levels. -** `/refresh` for refreshing the `@RefreshScope` beans. -** `/restart` for restarting the Spring context (disabled by default). -** `/pause` and `/resume` for calling the `Lifecycle` methods (`stop()` and `start()` on the `ApplicationContext`). -* Bootstrap application context: a parent context for the main application that can be trained to do anything (by default, it binds to the Config Server and decrypts property values). - -[[quick-start]] -= Quick Start - - -[[sample-application]] -== Sample Application - -You can find a sample application https://github.com/spring-cloud/spring-cloud-config/tree/master/spring-cloud-config-sample[here]. -It is a Spring Boot application, so you can run it by using the usual mechanisms (for instance, `mvn spring-boot:run`). -When it runs, it looks for the config server on `http://localhost:8888` (a configurable default), so you can run the server as well to see it all working together. - -The sample has a test case where the config server is also started in the same JVM (with a different port), and the test asserts that an -environment property from the git configuration repo is present. -To change the location of the config server, you can set `spring.cloud.config.uri` in `bootstrap.yml` (or in system properties and other places). - -The test case has a `main()` method that runs the server in the same way (watch the logs for its port), so you can run the whole system in one process and play with it (for example, you can run the `main()` method in your IDE). -The `main()` method uses `target/config` for the working directory of the git repository, so you can make local changes there and see them reflected in the running app. The following example shows a session of tinkering with the test case: - ----- -$ curl localhost:8080/env/sample -mytest -$ vi target/config/mytest.properties -.. change value of "sample", optionally commit -$ curl -X POST localhost:8080/refresh -["sample"] -$ curl localhost:8080/env/sample -sampleValue ----- - -The refresh endpoint reports that the "sample" property changed. - -[[building]] -= Building - -include::https://raw.githubusercontent.com/spring-cloud/spring-cloud-build/master/docs/src/main/asciidoc/building.adoc[] - -[[jce]] -== JCE - -If you get an exception due to "Illegal key size" and you are using Sun’s JDK, you need to install the Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files. -See the following links for more information: - -https://www.oracle.com/technetwork/java/javase/downloads/jce-6-download-429243.html[Java 6 JCE] - -https://www.oracle.com/technetwork/java/javase/downloads/jce-7-download-432124.html[Java 7 JCE] - -https://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.html[Java 8 JCE] - -Extract the JCE files into the `JDK/jre/lib/security` folder for whichever version of JRE/JDK x64/x86 you use. - -[[contributing]] -= Contributing - -include::https://raw.githubusercontent.com/spring-cloud/spring-cloud-build/master/docs/src/main/asciidoc/contributing.adoc[] diff --git a/docs/modules/ROOT/pages/_configprops.adoc b/docs/modules/ROOT/pages/_configprops.adoc deleted file mode 100644 index 7079d9f5..00000000 --- a/docs/modules/ROOT/pages/_configprops.adoc +++ /dev/null @@ -1,31 +0,0 @@ -|=== -|Name | Default | Description - -|spring.cloud.config.allow-override | `+++true+++` | Flag to indicate that {@link #isOverrideSystemProperties() systemPropertiesOverride} can be used. Set to false to prevent users from changing the default accidentally. Default true. -|spring.cloud.config.discovery.enabled | `+++false+++` | Flag to indicate that config server discovery is enabled (config server URL will be looked up via discovery). -|spring.cloud.config.discovery.service-id | `+++configserver+++` | Service id to locate config server. -|spring.cloud.config.enabled | `+++true+++` | Flag to say that remote configuration is enabled. Default true; -|spring.cloud.config.fail-fast | `+++false+++` | Flag to indicate that failure to connect to the server is fatal (default false). -|spring.cloud.config.headers | | Additional headers used to create the client request. -|spring.cloud.config.initialize-on-context-refresh | `+++false+++` | Flag to initialize bootstrap configuration on context refresh event. Default false. -|spring.cloud.config.label | | The label name to use to pull remote configuration properties. The default is set on the server (generally "main" for a git based server). -|spring.cloud.config.media-type | | The Accept header media type to send to config server. -|spring.cloud.config.multiple-uri-strategy | | The strategy to use when call to server fails and there are multiple URLs configured on the uri property (default {@link MultipleUriStrategy#ALWAYS}). -|spring.cloud.config.name | | Name of application used to fetch remote properties. -|spring.cloud.config.override-none | `+++false+++` | Flag to indicate that when {@link #setAllowOverride(boolean) allowOverride} is true, external properties should take lowest priority and should not override any existing property sources (including local config files). Default false. -|spring.cloud.config.override-system-properties | `+++true+++` | Flag to indicate that the external properties should override system properties. Default true. -|spring.cloud.config.password | | The password to use (HTTP Basic) when contacting the remote server. -|spring.cloud.config.profile | `+++default+++` | The default profile to use when fetching remote configuration (comma-separated). Default is "default". -|spring.cloud.config.request-connect-timeout | `+++0+++` | timeout on waiting to connect to the Config Server. -|spring.cloud.config.request-read-timeout | `+++0+++` | timeout on waiting to read data from the Config Server. -|spring.cloud.config.retry.initial-interval | `+++1000+++` | Initial retry interval in milliseconds. -|spring.cloud.config.retry.max-attempts | `+++6+++` | Maximum number of attempts. -|spring.cloud.config.retry.max-interval | `+++2000+++` | Maximum interval for backoff. -|spring.cloud.config.retry.multiplier | `+++1.1+++` | Multiplier for next interval. -|spring.cloud.config.send-state | `+++true+++` | Flag to indicate whether to send state. Default true. -|spring.cloud.config.tls | | TLS properties. -|spring.cloud.config.token | | Security Token passed thru to underlying environment repository. -|spring.cloud.config.uri | `+++[http://localhost:8888]+++` | The URI of the remote server (default http://localhost:8888). -|spring.cloud.config.username | | The username to use (HTTP Basic) when contacting the remote server. - -|=== diff --git a/docs/modules/ROOT/pages/_observability.adoc b/docs/modules/ROOT/pages/_observability.adoc deleted file mode 100644 index 5eac1efb..00000000 --- a/docs/modules/ROOT/pages/_observability.adoc +++ /dev/null @@ -1,9 +0,0 @@ -:root-target: ../../../target/ - -[[observability]] -= Observability metadata -:page-section-summary-toc: 1 - -include::{root-target}_metrics.adoc[] - -include::{root-target}_spans.adoc[] diff --git a/docs/modules/ROOT/pages/index.adoc b/docs/modules/ROOT/pages/index.adoc deleted file mode 100644 index e69de29b..00000000 diff --git a/docs/modules/ROOT/pages/intro.adoc b/docs/modules/ROOT/pages/intro.adoc deleted file mode 100644 index 7509846a..00000000 --- a/docs/modules/ROOT/pages/intro.adoc +++ /dev/null @@ -1,6 +0,0 @@ - -Spring Cloud Config provides server-side and client-side support for externalized configuration in a distributed system. With the Config Server, you have a central place to manage external properties for applications across all environments. -The concepts on both client and server map identically to the Spring `Environment` and `PropertySource` abstractions, so they fit very well with Spring applications but can be used with any application running in any language. -As an application moves through the deployment pipeline from dev to test and into production, you can manage the configuration between those environments and be certain that applications have everything they need to run when they migrate. -The default implementation of the server storage backend uses git, so it easily supports labelled versions of configuration environments as well as being accessible to a wide range of tooling for managing the content. -It is easy to add alternative implementations and plug them in with Spring configuration. diff --git a/docs/modules/ROOT/pages/quickstart.adoc b/docs/modules/ROOT/pages/quickstart.adoc deleted file mode 100644 index 7b91ced3..00000000 --- a/docs/modules/ROOT/pages/quickstart.adoc +++ /dev/null @@ -1,194 +0,0 @@ -This quick start walks through using both the server and the client of Spring Cloud Config Server. - -First, start the server, as follows: - ----- -$ cd spring-cloud-config-server -$ ../mvnw spring-boot:run ----- - -The server is a Spring Boot application, so you can run it from your IDE if you prefer to do so (the main class is `ConfigServerApplication`). - -Next try out a client, as follows: - ----- -$ curl localhost:8888/foo/development -{ - "name": "foo", - "profiles": [ - "development" - ] - .... - "propertySources": [ - { - "name": "https://github.com/spring-cloud-samples/config-repo/foo-development.properties", - "source": { - "bar": "spam", - "foo": "from foo development" - } - }, - { - "name": "https://github.com/spring-cloud-samples/config-repo/foo.properties", - "source": { - "foo": "from foo props", - "democonfigclient.message": "hello spring io" - } - }, - .... ----- - -The default strategy for locating property sources is to clone a git repository (at `spring.cloud.config.server.git.uri`) and use it to initialize a mini `SpringApplication`. -The mini-application's `Environment` is used to enumerate property sources and publish them at a JSON endpoint. - -The HTTP service has resources in the following form: - ----- -/{application}/{profile}[/{label}] -/{application}-{profile}.yml -/{label}/{application}-{profile}.yml -/{application}-{profile}.properties -/{label}/{application}-{profile}.properties ----- - -For example: - ----- -curl localhost:8888/foo/development -curl localhost:8888/foo/development/master -curl localhost:8888/foo/development,db/master -curl localhost:8888/foo-development.yml -curl localhost:8888/foo-db.properties -curl localhost:8888/master/foo-db.properties ----- - -where `application` is injected as the `spring.config.name` in the `SpringApplication` (what is normally `application` in a regular Spring Boot app), `profile` is an active profile (or comma-separated list of properties), and `label` is an optional git label (defaults to `master`.) - -Spring Cloud Config Server pulls configuration for remote clients from various sources. The following example gets configuration from a git repository (which must be provided), as shown in the following example: - -[source,yaml] ----- -spring: - cloud: - config: - server: - git: - uri: https://github.com/spring-cloud-samples/config-repo ----- - -Other sources are any JDBC compatible database, Subversion, Hashicorp Vault, Credhub and local filesystems. - -[[client-side-usage]] -= Client Side Usage - -To use these features in an application, you can build it as a Spring Boot application that depends on spring-cloud-config-client (for an example, see the test cases for the config-client or the sample application). -The most convenient way to add the dependency is with a Spring Boot starter `org.springframework.cloud:spring-cloud-starter-config`. -There is also a parent pom and BOM (`spring-cloud-starter-parent`) for Maven users and a Spring IO version management properties file for Gradle and Spring CLI users. The following example shows a typical Maven configuration: - -[source,xml,indent=0] -.pom.xml ----- - - org.springframework.boot - spring-boot-starter-parent - {spring-boot-docs-version} - - - - - - - org.springframework.cloud - spring-cloud-dependencies - {spring-cloud-version} - pom - import - - - - - - - org.springframework.cloud - spring-cloud-starter-config - - - org.springframework.boot - spring-boot-starter-test - test - - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - - ----- - -Now you can create a standard Spring Boot application, such as the following HTTP server: - ----- -@SpringBootApplication -@RestController -public class Application { - - @RequestMapping("/") - public String home() { - return "Hello World!"; - } - - public static void main(String[] args) { - SpringApplication.run(Application.class, args); - } - -} ----- - -When this HTTP server runs, it picks up the external configuration from the default local config server (if it is running) on port 8888. -To modify the startup behavior, you can change the location of the config server by using `application.properties` as shown in the following example: - ----- -spring.config.import=optional:configserver:http://myconfigserver.com ----- - -By default, if no application name is set, `application` will be used. To modify the name, the following property can be added to the `application.properties` file: - ----- -spring.application.name: myapp ----- - -NOTE: When setting the property `${spring.application.name}` do not prefix your app name with the reserved word `application-` to prevent issues resolving the correct property source. - -The Config Server properties show up in the `/env` endpoint as a high-priority property source, as shown in the following example. - ----- -$ curl localhost:8080/env -{ - "activeProfiles": [], - { - "name": "servletContextInitParams", - "properties": {} - }, - { - "name": "configserver:https://github.com/spring-cloud-samples/config-repo/foo.properties", - "properties": { - "foo": { - "value": "bar", - "origin": "Config Server https://github.com/spring-cloud-samples/config-repo/foo.properties:2:12" - } - } - }, - ... -} ----- - -A property source called `configserver:/` contains the `foo` property with a value of `bar`. - -NOTE: The URL in the property source name is the git repository, not the config server URL. - -WARNING: If you use Spring Cloud Config Client, you need to set the `spring.config.import` property in order to bind to Config Server. You can read more about it https://docs.spring.io/spring-cloud-config/docs/current/reference/html/#config-data-import[in the Spring Cloud Config Reference Guide]. diff --git a/docs/modules/ROOT/pages/sagan-index.adoc b/docs/modules/ROOT/pages/sagan-index.adoc deleted file mode 100644 index 4544ee5b..00000000 --- a/docs/modules/ROOT/pages/sagan-index.adoc +++ /dev/null @@ -1,49 +0,0 @@ -Spring Cloud Config provides server and client-side support for externalized configuration in a distributed system. With the Config Server you have a central place to manage external properties for applications across all environments. The concepts on both client and server map identically to the Spring `Environment` and `PropertySource` abstractions, so they fit very well with Spring applications, but can be used with any application running in any language. As an application moves through the deployment pipeline from dev to test and into production you can manage the configuration between those environments and be certain that applications have everything they need to run when they migrate. The default implementation of the server storage backend uses git so it easily supports labelled versions of configuration environments, as well as being accessible to a wide range of tooling for managing the content. It is easy to add alternative implementations and plug them in with Spring configuration. - -## Features - -Spring Cloud Config Server features: - -* HTTP, resource-based API for external configuration (name-value pairs, or equivalent YAML content) -* Encrypt and decrypt property values (symmetric or asymmetric) -* Embeddable easily in a Spring Boot application using `@EnableConfigServer` - -Config Client features (for Spring applications): - -* Bind to the Config Server and initialize Spring `Environment` with remote property sources -* Encrypt and decrypt property values (symmetric or asymmetric) - -## Getting Started - -As long as Spring Boot Actuator and Spring Config Client are on the -classpath any Spring Boot application will try to contact a config -server on `http://localhost:8888`, the default value of -`spring.cloud.config.uri`. If you would like to change this default, -you can set `spring.cloud.config.uri` in `bootstrap.[yml | properties]` -or via system properties or environment variables. - -```java -@Configuration -@EnableAutoConfiguration -@RestController -public class Application { - - @Value("${config.name}") - String name = "World"; - - @RequestMapping("/") - public String home() { - return "Hello " + name; - } - - public static void main(String[] args) { - SpringApplication.run(Application.class, args); - } - -} -``` - -The value of `config.name` in the sample (or any other values you bind to in the normal Spring Boot way) can come from local configuration or from the remote Config Server. The Config Server will take precedence by default. To see this look at the `/env` endpoint in the application and see the `configServer` property sources. - -To run your own server use the `spring-cloud-config-server` dependency and `@EnableConfigServer`. If you set `spring.config.name=configserver` the app will run on port 8888 and serve data from a sample repository. You need a `spring.cloud.config.server.git.uri` to locate the configuration data for your own needs (by default it is the location of a git repository, and can be a local `file:..` URL). - diff --git a/docs/modules/ROOT/pages/spring-cloud-config.adoc b/docs/modules/ROOT/pages/spring-cloud-config.adoc deleted file mode 100644 index 5b42f581..00000000 --- a/docs/modules/ROOT/pages/spring-cloud-config.adoc +++ /dev/null @@ -1,12 +0,0 @@ -[[spring-cloud-config]] -= Spring Cloud Config -:page-section-summary-toc: 1 -:github: https://github.com/spring-cloud/spring-cloud-config -:githubmaster: {github}/tree/master -:docslink: {githubmaster}/docs/src/main/asciidoc -:nofooter: -:special-string: _ - -*{spring-cloud-version}* - - diff --git a/docs/modules/ROOT/pages/spring-cloud-config/client.adoc b/docs/modules/ROOT/pages/spring-cloud-config/client.adoc deleted file mode 100644 index 9970eb6c..00000000 --- a/docs/modules/ROOT/pages/spring-cloud-config/client.adoc +++ /dev/null @@ -1,350 +0,0 @@ -[[spring-cloud-config-client]] -= Spring Cloud Config Client - -A Spring Boot application can take immediate advantage of the Spring Config Server (or other external property sources provided by the application developer). -It also picks up some additional useful features related to `Environment` change events. - -[[config-data-import]] -== Spring Boot Config Data Import - -Spring Boot 2.4 introduced a new way to import configuration data via the `spring.config.import` property. This is now the default way to bind to Config Server. - -To optionally connect to config server set the following in application.properties: - -.application.properties -[source,properties] ----- -spring.config.import=optional:configserver: ----- - -This will connect to the Config Server at the default location of "http://localhost:8888". Removing the `optional:` prefix will cause the Config Client to fail if it is unable to connect to Config Server. To change the location of Config Server either set `spring.cloud.config.uri` or add the url to the `spring.config.import` statement such as, `spring.config.import=optional:configserver:http://myhost:8888`. The location in the import property has precedence over the uri property. - -Spring Boot Config Data resolves configuration in a two step process. First it loads all configuration using the `default` -profile. This allows Spring Boot to gather all configuration which may activate any additional profiles. -After it has gathered all activated profiles it will load any additional configuration for the active profiles. -Due to this you may see multiple requests being made to the Spring Cloud Config Server to fetch configuration. This -is normal and is a side effect of how Spring Boot loads configuration when using `spring.config.import`. In previous -versions of Spring Cloud Config there was only a single request made but this meant you could not activate profiles -from configuration coming from the Config Server. The additional request with just the 'default` profile now makes -this possible. - -NOTE: A `bootstrap` file (properties or yaml) is *not* needed for the Spring Boot Config Data method of import via `spring.config.import`. - -[[config-first-bootstrap]] -== Config First Bootstrap - -To use the legacy bootstrap way of connecting to Config Server, bootstrap must be enabled via a property or the `spring-cloud-starter-bootstrap` starter. The property is `spring.cloud.bootstrap.enabled=true`. It must be set as a System Property or environment variable. -Once bootstrap has been enabled any application with Spring Cloud Config Client on the classpath will connect to Config Server as follows: -When a config client starts, it binds to the Config Server (through the `spring.cloud.config.uri` bootstrap configuration property) and initializes Spring `Environment` with remote property sources. - -The net result of this behavior is that all client applications that want to consume the Config Server need a `bootstrap.yml` (or an environment variable) with the server address set in `spring.cloud.config.uri` (it defaults to "http://localhost:8888"). - -[[discovery-first-bootstrap]] -=== Discovery First Lookup - -WARNING: Unless you are using xref:spring-cloud-config/client.adoc#config-first-bootstrap[config first bootstrap], you will need to have a `spring.config.import` property in your configuration properties with an `optional:` prefix. -For example, `spring.config.import=optional:configserver:`. - -If you use a `DiscoveryClient` implementation, such as Spring Cloud Netflix and Eureka Service Discovery or Spring Cloud Consul, you can have the Config Server register with the Discovery Service. - -If you prefer to use `DiscoveryClient` to locate the Config Server, you can do so by setting `spring.cloud.config.discovery.enabled=true` (the default is `false`). -For example, with Spring Cloud Netflix, you need to define the Eureka server address (for example, in `eureka.client.serviceUrl.defaultZone`). -The price for using this option is an extra network round trip on startup, to locate the service registration. -The benefit is that, as long as the Discovery Service is a fixed point, the Config Server can change its coordinates. -The default service ID is `configserver`, but you can change that on the client by setting `spring.cloud.config.discovery.serviceId` (and on the server, in the usual way for a service, such as by setting `spring.application.name`). - -The discovery client implementations all support some kind of metadata map (for example, we have `eureka.instance.metadataMap` for Eureka). -Some additional properties of the Config Server may need to be configured in its service registration metadata so that clients can connect correctly. -If the Config Server is secured with HTTP Basic, you can configure the credentials as `user` and `password`. -Also, if the Config Server has a context path, you can set `configPath`. -For example, the following YAML file is for a Config Server that is a Eureka client: - -[source,yaml] ----- -eureka: - instance: - ... - metadataMap: - user: osufhalskjrtl - password: lviuhlszvaorhvlo5847 - configPath: /config ----- - -[[discovery-first-bootstrap-using-eureka-and-webclient]] -=== Discovery First Bootstrap Using Eureka And WebClient - -If you use the Eureka `DiscoveryClient` from Spring Cloud Netflix and also want to use `WebClient` instead of Jersey or `RestTemplate`, -you need to include `WebClient` on your classpath as well as set `eureka.client.webclient.enabled=true`. - - -[[config-client-fail-fast]] -== Config Client Fail Fast - -In some cases, you may want to fail startup of a service if it cannot connect to the Config Server. -If this is the desired behavior, set the bootstrap configuration property `spring.cloud.config.fail-fast=true` to make the client halt with an Exception. - -NOTE: To get similar functionality using `spring.config.import`, simply omit the `optional:` prefix. - -[[config-client-retry]] -== Config Client Retry - -If you expect that the config server may occasionally be unavailable when your application starts, you can make it keep trying after a failure. -First, you need to set `spring.cloud.config.fail-fast=true`. -Then you need to add `spring-retry` and `spring-boot-starter-aop` to your classpath. -The default behavior is to retry six times with an initial backoff interval of 1000ms and an exponential multiplier of 1.1 for subsequent backoffs. -You can configure these properties (and others) by setting the `spring.cloud.config.retry.*` configuration properties. - -TIP: To take full control of the retry behavior and are using legacy bootstrap, add a `@Bean` of type `RetryOperationsInterceptor` with an ID of `configServerRetryInterceptor`. -Spring Retry has a `RetryInterceptorBuilder` that supports creating one. - -[[config-client-retry-with-spring-config-import]] -== Config Client Retry with spring.config.import - -Retry works with the Spring Boot `spring.config.import` statement and the normal properties work. However, if the import statement is in a profile, such as `application-prod.properties`, then you need a different way to configure retry. Configuration needs to be placed as url parameters on the import statement. - -.application-prod.properties -[source,properties] ----- -spring.config.import=configserver:http://configserver.example.com?fail-fast=true&max-attempts=10&max-interval=1500&multiplier=1.2&initial-interval=1100" ----- - -This sets `spring.cloud.config.fail-fast=true` (notice the missing prefix above) and all the available `spring.cloud.config.retry.*` configuration properties. - -[[locating-remote-configuration-resources]] -== Locating Remote Configuration Resources - -The Config Service serves property sources from `/{application}/{profile}/{label}`, where the default bindings in the client app are as follows: - -* "application" = `${spring.application.name}` -* "profile" = `${spring.profiles.active}` (actually `Environment.getActiveProfiles()`) -* "label" = "master" - -NOTE: When setting the property `${spring.application.name}` do not prefix your app name with the reserved word `application-` to prevent issues resolving the correct property source. - -You can override all of them by setting `spring.cloud.config.\*` (where `*` is `name`, `profile` or `label`). -The `label` is useful for rolling back to previous versions of configuration. -With the default Config Server implementation, it can be a git label, branch name, or commit ID. -Label can also be provided as a comma-separated list. -In that case, the items in the list are tried one by one until one succeeds. -This behavior can be useful when working on a feature branch. -For instance, you might want to align the config label with your branch but make it optional (in that case, use `spring.cloud.config.label=myfeature,develop`). - -[[specifying-multiple-urls-for-the-config-server]] -== Specifying Multiple URLs for the Config Server - -To ensure high availability when you have multiple instances of Config Server deployed and expect one or more instances to be unavailable or unable to honor requests from time to time (such as if the Git server is down), you can either specify multiple URLs (as a comma-separated list under the `spring.cloud.config.uri` property) or have all your instances register in a Service Registry like Eureka (if using Discovery-First Bootstrap mode). - -The URLs listed under `spring.cloud.config.uri` are tried in the order listed. By default, the Config Client will try to fetch properties from each URL until an attempt is successful to ensure high availability. - -However, if you want to ensure high availability only when the Config Server is not running (that is, when the application has exited) or when a connection timeout has occurred, set `spring.cloud.config.multiple-uri-strategy` to `connection-timeout-only`. (The default value of `spring.cloud.config.multiple-uri-strategy` is `always`.) For example, if the Config Server returns a 500 (Internal Server Error) response or the Config Client receives a 401 from the Config Server (due to bad credentials or other causes), the Config Client does not try to fetch properties from other URLs. A 400 error (except possibly 404) indicates a user issue rather than an availability problem. Note that if the Config Server is set to use a Git server and the call to Git server fails, a 404 error may occur. - -Several locations can be specified under a single `spring.config.import` key instead of `spring.cloud.config.uri`. Locations will be processed in the order that they are defined, with later imports taking precedence. However, if `spring.cloud.config.fail-fast` is `true`, the Config Client will fail if the first Config Server call is unsuccessful for any reason. If `fail-fast` is `false`, it will try all URLs until one call is successful, regardless of the reason for failure. (The `spring.cloud.config.multiple-uri-strategy` does not apply when specifying URLs under `spring.config.import`.) - -If you use HTTP basic security on your Config Server, it is currently possible to support per-Config Server auth credentials only if you embed the credentials in each URL you specify under the `spring.cloud.config.uri` property. If you use any other kind of security mechanism, you cannot (currently) support per-Config Server authentication and authorization. - -[[configuring-timeouts]] -== Configuring Timeouts - -If you want to configure timeout thresholds: - -* Read timeouts can be configured by using the property `spring.cloud.config.request-read-timeout`. -* Connection timeouts can be configured by using the property `spring.cloud.config.request-connect-timeout`. - -[[security]] -== Security - -If you use HTTP Basic security on the server, clients need to know the password (and username if it is not the default). -You can specify the username and password through the config server URI or via separate username and password properties, as shown in the following example: - -[source,yaml] ----- -spring: - cloud: - config: - uri: https://user:secret@myconfig.mycompany.com ----- - -The following example shows an alternate way to pass the same information: - -[source,yaml] ----- -spring: - cloud: - config: - uri: https://myconfig.mycompany.com - username: user - password: secret ----- - -The `spring.cloud.config.password` and `spring.cloud.config.username` values override anything that is provided in the URI. - -If you deploy your apps on Cloud Foundry, the best way to provide the password is through service credentials (such as in the URI, since it does not need to be in a config file). -The following example works locally and for a user-provided service on Cloud Foundry named `configserver`: - -[source,yaml] ----- -spring: - cloud: - config: - uri: ${vcap.services.configserver.credentials.uri:http://user:password@localhost:8888} - ----- - -If config server requires client side TLS certificate, you can configure client side TLS certificate and trust store via properties, as shown in following example: - -[source,yaml] ----- -spring: - cloud: - config: - uri: https://myconfig.myconfig.com - tls: - enabled: true - key-store: - key-store-type: PKCS12 - key-store-password: - key-password: - trust-store: - trust-store-type: PKCS12 - trust-store-password: ----- - -The `spring.cloud.config.tls.enabled` needs to be true to enable config client side TLS. When `spring.cloud.config.tls.trust-store` is omitted, a JVM default trust store is used. The default value for `spring.cloud.config.tls.key-store-type` and `spring.cloud.config.tls.trust-store-type` is PKCS12. When password properties are omitted, empty password is assumed. - -If you use another form of security, you might need to xref:spring-cloud-config/client.adoc#custom-rest-template[provide a `RestTemplate`] to the `ConfigServicePropertySourceLocator` (for example, by grabbing it in the bootstrap context and injecting it). - -[[health-indicator]] -=== Health Indicator - -The Config Client supplies a Spring Boot Health Indicator that attempts to load configuration from the Config Server. -The health indicator can be disabled by setting `health.config.enabled=false`. -The response is also cached for performance reasons. -The default cache time to live is 5 minutes. -To change that value, set the `health.config.time-to-live` property (in milliseconds). - -[[custom-rest-template]] -=== Providing A Custom RestTemplate - -In some cases, you might need to customize the requests made to the config server from the client. -Typically, doing so involves passing special `Authorization` headers to authenticate requests to the server. - -[[providing-a-custom-resttemplate-using-config-data]] -==== Providing A Custom RestTemplate Using Config Data - -To provide a custom `RestTemplate` when using Config Data: - -1. Create a class which implements `BootstrapRegistryInitializer` -+ -.CustomBootstrapRegistryInitializer.java -[source,java] ----- -public class CustomBootstrapRegistryInitializer implements BootstrapRegistryInitializer { - - @Override - public void initialize(BootstrapRegistry registry) { - registry.register(RestTemplate.class, context -> { - RestTemplate restTemplate = new RestTemplate(); - // Customize RestTemplate here - return restTemplate; - }); - } - -} ----- - -2. In `resources/META-INF`, create a file called -`spring.factories` and specify your custom configuration, as shown in the following example: -+ -.spring.factories -[source,properties] ----- -org.springframework.boot.BootstrapRegistryInitializer=com.my.config.client.CustomBootstrapRegistryInitializer ----- - -[[providing-a-custom-resttemplate-using-bootstrap]] -==== Providing A Custom RestTemplate Using Bootstrap - -To provide a custom `RestTemplate` when using Bootstrap: - -1. Create a new configuration bean with an implementation of `PropertySourceLocator`, as shown in the following example: -+ -.CustomConfigServiceBootstrapConfiguration.java -[source,java] ----- -@Configuration -public class CustomConfigServiceBootstrapConfiguration { - @Bean - public ConfigServicePropertySourceLocator configServicePropertySourceLocator() { - ConfigClientProperties clientProperties = configClientProperties(); - ConfigServicePropertySourceLocator configServicePropertySourceLocator = new ConfigServicePropertySourceLocator(clientProperties); - configServicePropertySourceLocator.setRestTemplate(customRestTemplate(clientProperties)); - return configServicePropertySourceLocator; - } -} ----- -+ -NOTE: For a simplified approach to adding `Authorization` headers, the `spring.cloud.config.headers.*` property can be used instead. - -2. In `resources/META-INF`, create a file called -`spring.factories` and specify your custom configuration, as shown in the following example: -+ -.spring.factories -[source,properties] ----- -org.springframework.cloud.bootstrap.BootstrapConfiguration = com.my.config.client.CustomConfigServiceBootstrapConfiguration ----- - -[[vault]] -=== Vault - -When using Vault as a backend to your config server, the client needs to supply a token for the server to retrieve values from Vault. -This token can be provided within the client by setting `spring.cloud.config.token` -in `bootstrap.yml`, as shown in the following example: - -[source,yaml] ----- -spring: - cloud: - config: - token: YourVaultToken ----- - -[[nested-keys-in-vault]] -== Nested Keys In Vault - -Vault supports the ability to nest keys in a value stored in Vault, as shown in the following example: - -`echo -n '{"appA": {"secret": "appAsecret"}, "bar": "baz"}' | vault write secret/myapp -` - -This command writes a JSON object to your Vault. -To access these values in Spring, you would use the traditional dot(`.`) annotation, as shown in the following example - -[source,java] ----- -@Value("${appA.secret}") -String name = "World"; ----- - -The preceding code would sets the value of the `name` variable to `appAsecret`. - -[[-aot-and-native-image-support]] -== AOT and Native Image Support - -Since `4.0.0`, Spring Cloud Config Client supports Spring AOT transformations and GraalVM native images. - -WARNING: AOT and native image support is not available for xref:spring-cloud-config/client.adoc#config-first-bootstrap[config first bootstrap] (with `spring.config.use-legacy-processing=true`). - -WARNING: Refresh scope is not supported with native images. If you are going to run your config client application as a native image, make sure to set `spring.cloud.refresh.enabled` property to `false`. - -WARNING: While building a project that contains Spring Cloud Config Client, you must make sure that the configuration data source that it connects to (such as, Spring Cloud Config Server, Consul, Zookeeper, Vault, and others) is available. For example, if you retrieve configuration data from Spring Cloud Config Server, make sure you have its instance running and available at the port indicated in the Config Client setup. This is necessary because the application context is being optimized at build time and requires the target environment to be resolved. - -WARNING: Since in AOT and native mode, configuration is being processed and the context is being optimised at build time, any properties that would influence bean creation (such as the ones used within bootstrap context) should be set to the same values at build time and runtime to avoid unexpected behaviour. - -WARNING: Since Config Client connects to a running data source (such as Config Server) while starting up from native image, the quick startup time will be slowed down by the time required for this network communication to take place. - -ifndef::releaseTrain[] -[[appendix]] -= Appendices - -include:../:_observability.adoc[] -endif::[] diff --git a/docs/modules/ROOT/pages/spring-cloud-config/quick-start.adoc b/docs/modules/ROOT/pages/spring-cloud-config/quick-start.adoc deleted file mode 100644 index 59e05139..00000000 --- a/docs/modules/ROOT/pages/spring-cloud-config/quick-start.adoc +++ /dev/null @@ -1,6 +0,0 @@ -[[quick-start]] -= Quick Start -:page-section-summary-toc: 1 - -include:../:quickstart.adoc[] - diff --git a/docs/modules/ROOT/pages/spring-cloud-config/server.adoc b/docs/modules/ROOT/pages/spring-cloud-config/server.adoc deleted file mode 100644 index c551ef84..00000000 --- a/docs/modules/ROOT/pages/spring-cloud-config/server.adoc +++ /dev/null @@ -1,55 +0,0 @@ -[[spring-cloud-config-server]] -= Spring Cloud Config Server - -Spring Cloud Config Server provides an HTTP resource-based API for external configuration (name-value pairs or equivalent YAML content). -The server is embeddable in a Spring Boot application, by using the `@EnableConfigServer` annotation. -Consequently, the following application is a config server: - -.ConfigServer.java -[source,java] ----- -@SpringBootApplication -@EnableConfigServer -public class ConfigServer { - public static void main(String[] args) { - SpringApplication.run(ConfigServer.class, args); - } -} ----- - -Like all Spring Boot applications, it runs on port 8080 by default, but you can switch it to the more conventional port 8888 in various ways. -The easiest, which also sets a default configuration repository, is by launching it with `spring.config.name=configserver` (there is a `configserver.yml` in the Config Server jar). -Another is to use your own `application.properties`, as shown in the following example: - -.application.properties -[source,properties] ----- -server.port: 8888 -spring.cloud.config.server.git.uri: file://${user.home}/config-repo ----- - -where `${user.home}/config-repo` is a git repository containing YAML and properties files. - -NOTE: On Windows, you need an extra "/" in the file URL if it is absolute with a drive prefix (for example,`file:///${user.home}/config-repo`). - -[TIP] -==== -The following listing shows a recipe for creating the git repository in the preceding example: - ----- -$ cd $HOME -$ mkdir config-repo -$ cd config-repo -$ git init . -$ echo info.foo: bar > application.properties -$ git add -A . -$ git commit -m "Add application.properties" ----- -==== - -WARNING: Using the local filesystem for your git repository is intended for testing only. -You should use a server to host your configuration repositories in production. - -WARNING: The initial clone of your configuration repository can be quick and efficient if you keep only text files in it. -If you store binary files, especially large ones, you may experience delays on the first request for configuration or encounter out of memory errors in the server. - diff --git a/docs/modules/ROOT/pages/spring-cloud-config/server/-aot-and-native-image-support.adoc b/docs/modules/ROOT/pages/spring-cloud-config/server/-aot-and-native-image-support.adoc deleted file mode 100644 index ce7f15de..00000000 --- a/docs/modules/ROOT/pages/spring-cloud-config/server/-aot-and-native-image-support.adoc +++ /dev/null @@ -1,6 +0,0 @@ -[[-aot-and-native-image-support]] -= AOT and Native Image Support -:page-section-summary-toc: 1 - -Since `4.0.0`, Spring Cloud Config Server supports Spring AOT transformations. However, for the time being, GraalVM native images are not supported. Implementing native image support is blocked by https://github.com/oracle/graal/issues/5134[graal#5134] and will likely require the completion of the work on https://github.com/graalvm/taming-build-time-initialization[https://github.com/graalvm/taming-build-time-initialization] to be fixed. - diff --git a/docs/modules/ROOT/pages/spring-cloud-config/server/actuator-and-security.adoc b/docs/modules/ROOT/pages/spring-cloud-config/server/actuator-and-security.adoc deleted file mode 100644 index 80e8d8b7..00000000 --- a/docs/modules/ROOT/pages/spring-cloud-config/server/actuator-and-security.adoc +++ /dev/null @@ -1,6 +0,0 @@ -[[actuator-and-security]] -= Actuator and Security -:page-section-summary-toc: 1 - -IMPORTANT: Some platforms configure health checks or something similar and point to `/actuator/health` or other actuator endpoints. If actuator is not a dependency of config server, requests to `/actuator/**` would match the config server API `/{application}/{label}` possibly leaking secure information. Remember to add the `spring-boot-starter-actuator` dependency in this case and configure the users such that the user that makes calls to `/actuator/**` does not have access to the config server API at `/{application}/{label}`. - diff --git a/docs/modules/ROOT/pages/spring-cloud-config/server/creating-a-key-store-for-testing.adoc b/docs/modules/ROOT/pages/spring-cloud-config/server/creating-a-key-store-for-testing.adoc deleted file mode 100644 index 975f6ab3..00000000 --- a/docs/modules/ROOT/pages/spring-cloud-config/server/creating-a-key-store-for-testing.adoc +++ /dev/null @@ -1,30 +0,0 @@ -[[creating-a-key-store-for-testing]] -= Creating a Key Store for Testing - -To create a keystore for testing, you can use a command resembling the following: - ----- -$ keytool -genkeypair -alias mytestkey -keyalg RSA \ - -dname "CN=Web Server,OU=Unit,O=Organization,L=City,S=State,C=US" \ - -keypass changeme -keystore server.jks -storepass letmein ----- - -NOTE: When using JDK 11 or above you may get the following warning when using the command above. In this case -you probably want to make sure the `keypass` and `storepass` values match. ----- -Warning: Different store and key passwords not supported for PKCS12 KeyStores. Ignoring user-specified -keypass value. ----- - -Put the `server.jks` file in the classpath (for instance) and then, in -your `bootstrap.yml`, for the Config Server, create the following settings: - -[source,yaml] ----- -encrypt: - keyStore: - location: classpath:/server.jks - password: letmein - alias: mytestkey - secret: changeme ----- - diff --git a/docs/modules/ROOT/pages/spring-cloud-config/server/embedding-the.adoc b/docs/modules/ROOT/pages/spring-cloud-config/server/embedding-the.adoc deleted file mode 100644 index 7a495e47..00000000 --- a/docs/modules/ROOT/pages/spring-cloud-config/server/embedding-the.adoc +++ /dev/null @@ -1,39 +0,0 @@ -[[embedding-the-config-server]] -= Embedding the Config Server - -The Config Server runs best as a standalone application. -However, if need be, you can embed it in another application. -To do so, use the `@EnableConfigServer` annotation. -An optional property named `spring.cloud.config.server.bootstrap` can be useful in this case. -It is a flag to indicate whether the server should configure itself from its own remote repository. -By default, the flag is off, because it can delay startup. -However, when embedded in another application, it makes sense to initialize the same way as any other application. -When setting `spring.cloud.config.server.bootstrap` to `true` you must also use a xref:spring-cloud-config/server/environment-repository/composite-repositories.adoc[composite environment repository configuration]. -For example - -[source,yaml] ----- -spring: - application: - name: configserver - profiles: - active: composite - cloud: - config: - server: - composite: - - type: native - search-locations: ${HOME}/Desktop/config - bootstrap: true ----- - -NOTE: If you use the bootstrap flag, the config server needs to have its name and repository URI configured in `bootstrap.yml`. - -To change the location of the server endpoints, you can (optionally) set `spring.cloud.config.server.prefix` (for example, `/config`), to serve the resources under a prefix. -The prefix should start but not end with a `/`. -It is applied to the `@RequestMappings` in the Config Server (that is, underneath the Spring Boot `server.servletPath` and `server.contextPath` prefixes). - -If you want to read the configuration for an application directly from the backend repository (instead of from the config server), you -basically want an embedded config server with no endpoints. -You can switch off the endpoints entirely by not using the `@EnableConfigServer` annotation (set `spring.cloud.config.server.bootstrap=true`). - diff --git a/docs/modules/ROOT/pages/spring-cloud-config/server/encryption-and-decryption.adoc b/docs/modules/ROOT/pages/spring-cloud-config/server/encryption-and-decryption.adoc deleted file mode 100644 index 105bf73a..00000000 --- a/docs/modules/ROOT/pages/spring-cloud-config/server/encryption-and-decryption.adoc +++ /dev/null @@ -1,79 +0,0 @@ -[[encryption-and-decryption]] -= Encryption and Decryption - -IMPORTANT: To use the encryption and decryption features you need the full-strength JCE installed in your JVM (it is not included by default). -You can download the "`Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files`" from Oracle and follow the installation instructions (essentially, you need to replace the two policy files in the JRE lib/security directory with the ones that you downloaded). - -If the remote property sources contain encrypted content (values starting with `{cipher}`), they are decrypted before sending to clients over HTTP. -The main advantage of this setup is that the property values need not be in plain text when they are "`at rest`" (for example, in a git repository). -If a value cannot be decrypted, it is removed from the property source and an additional property is added with the same key but prefixed with `invalid` and a value that means "`not applicable`" (usually ``). -This is largely to prevent cipher text being used as a password and accidentally leaking. - -If you set up a remote config repository for config client applications, it might contain an `application.yml` similar to the following: - -.application.yml -[source,yaml] ----- -spring: - datasource: - username: dbuser - password: '{cipher}FKSAJDFGYOS8F7GLHAKERGFHLSAJ' ----- - -Encrypted values in `application.properties` file must not be wrapped in quotes. Otherwise, the value is not decrypted. The following example shows values that would work: - -.application.properties ----- -spring.datasource.username: dbuser -spring.datasource.password: {cipher}FKSAJDFGYOS8F7GLHAKERGFHLSAJ ----- - -You can safely push this plain text to a shared git repository, and the secret password remains protected. - -The server also exposes `/encrypt` and `/decrypt` endpoints (on the assumption that these are secured and only accessed by authorized agents). -If you edit a remote config file, you can use the Config Server to encrypt values by POSTing to the `/encrypt` endpoint, as shown in the following example: - ----- -$ curl localhost:8888/encrypt -s -d mysecret -682bc583f4641835fa2db009355293665d2647dade3375c0ee201de2a49f7bda ----- - -TIP: If you are testing with curl, then use `--data-urlencode` (instead of `-d`) and prefix the value to encrypt with `=` (curl requires this) or set an explicit `Content-Type: text/plain` to make sure curl encodes the data correctly when there are special characters ('+' is particularly tricky). - -TIP: Be sure not to include any of the curl command statistics in the encrypted value, this is why the examples use the `-s` option to silence them. Outputting the value to a file can help avoid this problem. - -The inverse operation is also available through `/decrypt` (provided the server is -configured with a symmetric key or a full key pair), as shown in the following example: - ----- -$ curl localhost:8888/decrypt -s -d 682bc583f4641835fa2db009355293665d2647dade3375c0ee201de2a49f7bda -mysecret ----- - -Take the encrypted value and add the `{cipher}` prefix before you put it in the YAML or properties file and before you commit and push it to a remote (potentially insecure) store. - -The `/encrypt` and `/decrypt` endpoints also both accept paths in the form of `/*/{application}/{profiles}`, which can be used to control cryptography on a per-application (name) and per-profile basis when clients call into the main environment resource. - -NOTE: To control the cryptography in this granular way, you must also provide a `@Bean` of type `TextEncryptorLocator` that creates a different encryptor per name and profiles. -The one that is provided by default does not do so (all encryptions use the same key). - -The `spring` command line client (with Spring Cloud CLI extensions -installed) can also be used to encrypt and decrypt, as shown in the following example: - ----- -$ spring encrypt mysecret --key foo -682bc583f4641835fa2db009355293665d2647dade3375c0ee201de2a49f7bda -$ spring decrypt --key foo 682bc583f4641835fa2db009355293665d2647dade3375c0ee201de2a49f7bda -mysecret ----- - -To use a key in a file (such as an RSA public key for encryption), prepend -the key value with "@" and provide the file path, as shown in the following example: - ----- -$ spring encrypt mysecret --key @${HOME}/.ssh/id_rsa.pub -AQAjPgt3eFZQXwt8tsHAVv/QHiY5sI2dRcR+... ----- - -NOTE: The `--key` argument is mandatory (despite having a `--` prefix). - diff --git a/docs/modules/ROOT/pages/spring-cloud-config/server/environment-repository.adoc b/docs/modules/ROOT/pages/spring-cloud-config/server/environment-repository.adoc deleted file mode 100644 index 85196da3..00000000 --- a/docs/modules/ROOT/pages/spring-cloud-config/server/environment-repository.adoc +++ /dev/null @@ -1,41 +0,0 @@ -[[environment-repository]] -= Environment Repository - -Where should you store the configuration data for the Config Server? -The strategy that governs this behaviour is the `EnvironmentRepository`, serving `Environment` objects. -This `Environment` is a shallow copy of the domain from the Spring `Environment` (including `propertySources` as the main feature). -The `Environment` resources are parametrized by three variables: - - -* `{application}`, which maps to `spring.application.name` on the client side. -* `{profile}`, which maps to `spring.profiles.active` on the client (comma-separated list). -* `{label}`, which is a server side feature labelling a "versioned" set of config files. - -Repository implementations generally behave like a Spring Boot application, loading configuration files from a `spring.config.name` equal to the `{application}` parameter, and `spring.profiles.active` equal to the `{profiles}` parameter. -Precedence rules for profiles are also the same as in a regular Spring Boot application: Active profiles take precedence over defaults, and, if there are multiple profiles, the last one wins (similar to adding entries to a `Map`). - -The following sample client application has this bootstrap configuration: - -[source,yaml] ----- -spring: - application: - name: foo - profiles: - active: dev,mysql ----- - -(As usual with a Spring Boot application, these properties could also be set by environment variables or command line arguments). - -If the repository is file-based, the server creates an -`Environment` from `application.yml` (shared between all clients) and -`foo.yml` (with `foo.yml` taking precedence). -If the YAML files have documents inside them that point to Spring profiles, those are applied with higher precedence (in order of the profiles listed). -If there are profile-specific YAML (or properties) files, these are also applied with higher precedence than the defaults. -Higher precedence translates to a `PropertySource` listed earlier in the `Environment`. -(These same rules apply in a standalone Spring Boot application.) - -You can set `spring.cloud.config.server.accept-empty` to `false` so that Server would return a HTTP 404 status, if the application is not found. By default, this flag is set to `true`. - -NOTE: You cannot place `spring.main.*` properties in a remote `EnvironmentRepository`. These properties are used as part of the application initialization. - diff --git a/docs/modules/ROOT/pages/spring-cloud-config/server/environment-repository/accessing-backends-through-a-proxy.adoc b/docs/modules/ROOT/pages/spring-cloud-config/server/environment-repository/accessing-backends-through-a-proxy.adoc deleted file mode 100644 index 9a7b986d..00000000 --- a/docs/modules/ROOT/pages/spring-cloud-config/server/environment-repository/accessing-backends-through-a-proxy.adoc +++ /dev/null @@ -1,52 +0,0 @@ -[[accessing-backends-through-a-proxy]] -= Accessing Backends Through a Proxy - -The configuration server can access a Git or Vault backend through an HTTP or HTTPS proxy. -This behavior is controlled for either Git or Vault by settings under `proxy.http` and `proxy.https`. -These settings are per repository, so if you are using a xref:spring-cloud-config/server/environment-repository/composite-repositories.adoc[composite environment repository] you must configure proxy settings for each backend in the composite individually. -If using a network which requires separate proxy servers for HTTP and HTTPS URLs, you can configure both the HTTP and the HTTPS proxy settings for a single backend: in this case `http` access will use `http` proxy and `https` access the `https` one. -Also, you may specify one sole proxy that will be used for both protocols using the proxy definition protocol between application and proxy. - -The following table describes the proxy configuration properties for both HTTP and HTTPS proxies. All of these properties must be prefixed by `proxy.http` or `proxy.https`. - -.Proxy Configuration Properties -|=== -|Property Name |Remarks - -|*host* -|The host of the proxy. - -|*port* -|The port with which to access the proxy. - -|*nonProxyHosts* -|Any hosts which the configuration server should access outside the proxy. If values are provided for both `proxy.http.nonProxyHosts` and `proxy.https.nonProxyHosts`, the `proxy.http` value will be used. - -|*username* -|The username with which to authenticate to the proxy. If values are provided for both `proxy.http.username` and `proxy.https.username`, the `proxy.http` value will be used. - -|*password* -|The password with which to authenticate to the proxy. If values are provided for both `proxy.http.password` and `proxy.https.password`, the `proxy.http` value will be used. -|=== - -The following configuration uses an HTTPS proxy to access a Git repository. - -[source,yaml] ----- -spring: - profiles: - active: git - cloud: - config: - server: - git: - uri: https://github.com/spring-cloud-samples/config-repo - proxy: - https: - host: my-proxy.host.io - password: myproxypassword - port: '3128' - username: myproxyusername - nonProxyHosts: example.com ----- - diff --git a/docs/modules/ROOT/pages/spring-cloud-config/server/environment-repository/aws-parameter-store-backend.adoc b/docs/modules/ROOT/pages/spring-cloud-config/server/environment-repository/aws-parameter-store-backend.adoc deleted file mode 100644 index 0a287746..00000000 --- a/docs/modules/ROOT/pages/spring-cloud-config/server/environment-repository/aws-parameter-store-backend.adoc +++ /dev/null @@ -1,94 +0,0 @@ -[[aws-parameter-store-backend]] -= AWS Parameter Store Backend - -Spring Cloud Config Server supports AWS Parameter Store as a backend for configuration properties. You can enable this feature by adding a dependency to the link:https://docs.aws.amazon.com/sdk-for-java/v2/developer-guide/examples-ssm.html[AWS Java SDK for SSM]. - -[source,xml,indent=0] -.pom.xml ----- - - software.amazon.awssdk - ssm - ----- - -The following configuration uses the AWS SSM client to access parameters. - -[source,yaml] ----- -spring: - profiles: - active: awsparamstore - cloud: - config: - server: - awsparamstore: - region: eu-west-2 - endpoint: https://ssm.eu-west-2.amazonaws.com - origin: aws:parameter: - prefix: /config/service - profile-separator: _ - recursive: true - decrypt-values: true - max-results: 5 ----- - -The following table describes the AWS Parameter Store configuration properties. - -.AWS Parameter Store Configuration Properties -|=== -|Property Name |Required |Default Value |Remarks - -|*region* -|no -| -|The region to be used by the AWS Parameter Store client. If it's not explicitly set, the SDK tries to determine the region to use by using the link:https://docs.aws.amazon.com/sdk-for-java/v2/developer-guide/region-selection.html#default-region-provider-chain[Default Region Provider Chain]. - -|*endpoint* -|no -| -|The URL of the entry point for the AWS SSM client. This can be used to specify an alternate endpoint for the API requests. - -|*origin* -|no -|`aws:ssm:parameter:` -|The prefix that is added to the property source's name to show their provenance. - -|*prefix* -|no -|`/config` -|Prefix indicating L1 level in the parameter hierarchy for every property loaded from the AWS Parameter Store. - -|*profile-separator* -|no -|`-` -|String that separates an appended profile from the context name. - -|*recursive* -|no -|`true` -|Flag to indicate the retrieval of all AWS parameters within a hierarchy. - -|*decrypt-values* -|no -|`true` -|Flag to indicate the retrieval of all AWS parameters with their value decrypted. - -|*max-results* -|no -|`10` -|The maximum number of items to return for an AWS Parameter Store API call. - -|=== - -AWS Parameter Store API credentials are determined using the link:https://docs.aws.amazon.com/sdk-for-java/v2/developer-guide/credentials.html#credentials-default[Default Credential Provider Chain]. -Versioned parameters are already supported with the default behaviour of returning the latest version. - -[NOTE] -==== -- When no application is specified `application` is the default, and when no profile is specified `default` is used. -- Valid values for `awsparamstore.prefix` must start with a forward slash followed by one or more valid path segments or be empty. -- Valid values for `awsparamstore.profile-separator` can only contain dots, dashes and underscores. -- Valid values for `awsparamstore.max-results` must be within the *[1, 10]* range. -==== - diff --git a/docs/modules/ROOT/pages/spring-cloud-config/server/environment-repository/aws-parameter-store.adoc b/docs/modules/ROOT/pages/spring-cloud-config/server/environment-repository/aws-parameter-store.adoc deleted file mode 100644 index 6383539f..00000000 --- a/docs/modules/ROOT/pages/spring-cloud-config/server/environment-repository/aws-parameter-store.adoc +++ /dev/null @@ -1,14 +0,0 @@ -[[aws-parameter-store]] -= AWS Parameter Store -:page-section-summary-toc: 1 - -When using AWS Parameter Store as a backend, you can share configuration with all applications by placing properties within the `/application` hierarchy. - -For example, if you add parameters with the following names, all applications using the config server will have the properties `foo.bar` and `fred.baz` available to them: - -[source] ----- -/config/application/foo.bar -/config/application-default/fred.baz ----- - diff --git a/docs/modules/ROOT/pages/spring-cloud-config/server/environment-repository/aws-s3-backend.adoc b/docs/modules/ROOT/pages/spring-cloud-config/server/environment-repository/aws-s3-backend.adoc deleted file mode 100644 index 498b0132..00000000 --- a/docs/modules/ROOT/pages/spring-cloud-config/server/environment-repository/aws-s3-backend.adoc +++ /dev/null @@ -1,40 +0,0 @@ -[[aws-s3-backend]] -= AWS S3 Backend - -Spring Cloud Config Server supports AWS S3 as a backend for configuration properties. -You can enable this feature by adding a dependency to the link:https://docs.aws.amazon.com/sdk-for-java/v2/developer-guide/examples-s3.html[AWS Java SDK For Amazon S3]. - -[source,xml,indent=0] -.pom.xml ----- - - - software.amazon.awssdk - s3 - - ----- - -The following configuration uses the AWS S3 client to access configuration files. We can use `spring.cloud.config.server.awss3.*` properties to select the bucket where your configuration is stored. - -[source,yaml] ----- -spring: - profiles: - active: awss3 - cloud: - config: - server: - awss3: - region: us-east-1 - bucket: bucket1 ----- - -It is also possible to specify an AWS URL to link:https://aws.amazon.com/blogs/developer/using-new-regions-and-endpoints/[override the standard endpoint] of your S3 service with `spring.cloud.config.server.awss3.endpoint`. This allows support for beta regions of S3, and other S3 compatible storage APIs. - -Credentials are found using the link:https://docs.aws.amazon.com/sdk-for-java/v2/developer-guide/credentials.html[Default Credential Provider Chain]. Versioned and encrypted buckets are supported without further configuration. - -Configuration files are stored in your bucket as `{application}-{profile}.properties`, `{application}-{profile}.yml` or `{application}-{profile}.json`. An optional label can be provided to specify a directory path to the file. - -NOTE: When no profile is specified `default` will be used. - diff --git a/docs/modules/ROOT/pages/spring-cloud-config/server/environment-repository/aws-secrets-manager-backend.adoc b/docs/modules/ROOT/pages/spring-cloud-config/server/environment-repository/aws-secrets-manager-backend.adoc deleted file mode 100644 index a0ea21e6..00000000 --- a/docs/modules/ROOT/pages/spring-cloud-config/server/environment-repository/aws-secrets-manager-backend.adoc +++ /dev/null @@ -1,41 +0,0 @@ -[[aws-secrets-manager-backend]] -= AWS Secrets Manager Backend - -Spring Cloud Config Server supports link:https://aws.amazon.com/secrets-manager/[AWS Secrets Manager] as a backend for configuration properties. -You can enable this feature by adding a dependency to link:https://docs.aws.amazon.com/sdk-for-java/v2/developer-guide/examples-secretsmanager.html[AWS Java SDK for Secrets Manager]. - -[source,xml,indent=0] -.pom.xml ----- - - software.amazon.awssdk - secretsmanager - ----- - -The following configuration uses the AWS Secrets Manager client to access secrets. - -[source,yaml] ----- -spring: - profiles: - active: awssecretsmanager - cloud: - config: - server: - aws-secretsmanager: - region: us-east-1 - endpoint: https://us-east-1.console.aws.amazon.com/ - origin: aws:secrets: - prefix: /secret/foo - profileSeparator: _ - ----- - -AWS Secrets Manager API credentials are determined using link:https://docs.aws.amazon.com/sdk-for-java/v2/developer-guide/credentials.html#credentials-default[Default Credential Provider Chain]. - -[NOTE] -==== -- When no application is specified `application` is the default, and when no profile is specified `default` is used. -==== - diff --git a/docs/modules/ROOT/pages/spring-cloud-config/server/environment-repository/aws-secrets-manager.adoc b/docs/modules/ROOT/pages/spring-cloud-config/server/environment-repository/aws-secrets-manager.adoc deleted file mode 100644 index f9e518a2..00000000 --- a/docs/modules/ROOT/pages/spring-cloud-config/server/environment-repository/aws-secrets-manager.adoc +++ /dev/null @@ -1,80 +0,0 @@ -[[aws-secrets-manager]] -= AWS Secrets Manager - -When using AWS Secrets Manager as a backend, you can share configuration with all applications by placing configuration in `/application/` or by placing it in the `default` profile for the application. -For example, if you add secrets with the following keys, all application using the config server will have the properties `shared.foo` and `shared.bar` available to them: - -[source] ----- -secret name = /secret/application-default/ ----- -[source,json] ----- -secret value = -{ - shared.foo: foo, - shared.bar: bar -} ----- -or -[source] ----- -secret name = /secret/application/ ----- -[source,json] ----- -secret value = -{ - shared.foo: foo, - shared.bar: bar -} ----- - -[[labelled-versions]] -== Labelled Versions - -AWS Secrets Manager repository allows to keep labelled versions of the configuration environments the same way Git backend does. - -The repository implementation maps the `{label}` parameter of the HTTP resource to https://docs.aws.amazon.com/secretsmanager/latest/userguide/getting-started.html#term_version[AWS Secrets Manager secret's staging label^]. To create a labelled secret, create a secret or update its content and define a staging label for it (sometimes it's called version stage in the AWS documentation). For example: - -[source,sh] ----- -$ aws secretsmanager create-secret \ - --name /secret/test/ \ - --secret-string '{"version":"1"}' -{ - "ARN": "arn:aws:secretsmanager:us-east-1:123456789012:secret:/secret/test/-a1b2c3", - "Name": "/secret/test/", - "VersionId": "cd291674-de2f-41de-8f3b-37dbf4880d69" -} - -$ aws secretsmanager update-secret-version-stage \ - --secret-id /secret/test/ \ - --version-stage 1.0.0 \ - --move-to-version-id cd291674-de2f-41de-8f3b-37dbf4880d69 - -{ - "ARN": "arn:aws:secretsmanager:us-east-1:123456789012:secret:/secret/test/-a1b2c3", - "Name": "/secret/test/", -} ----- - -Use `spring.cloud.config.server.aws-secretsmanager.default-label` property to set the default label. If the property is not defined, the backend uses AWSCURRENT as a staging label. - -[source,yaml] ----- -spring: - profiles: - active: aws-secretsmanager - cloud: - config: - server: - aws-secretsmanager: - region: us-east-1 - default-label: 1.0.0 ----- - -Note that if the default label is not set and a request does not define a label, the repository will use secrets as if labelled version support is disabled. Also, the default label will be used only if the labelled support is enabled. Otherwise, defining this property is pointless. - -Note that if the staging label contains a slash (`/`), then the label in the HTTP URL should instead be specified with the special string `({special-string})` (to avoid ambiguity with other URL paths) the same way <<_git_backend,Git backend's section>> describes it. - diff --git a/docs/modules/ROOT/pages/spring-cloud-config/server/environment-repository/composite-repositories.adoc b/docs/modules/ROOT/pages/spring-cloud-config/server/environment-repository/composite-repositories.adoc deleted file mode 100644 index 7d59597d..00000000 --- a/docs/modules/ROOT/pages/spring-cloud-config/server/environment-repository/composite-repositories.adoc +++ /dev/null @@ -1,72 +0,0 @@ -[[composite-environment-repositories]] -= Composite Environment Repositories - -In some scenarios, you may wish to pull configuration data from multiple environment repositories. -To do so, you can enable the `composite` profile in your configuration server's application properties or YAML file. -If, for example, you want to pull configuration data from a Subversion repository as well as two Git repositories, you can set the following properties for your configuration server: - -[source,yaml] ----- -spring: - profiles: - active: composite - cloud: - config: - server: - composite: - - - type: svn - uri: file:///path/to/svn/repo - - - type: git - uri: file:///path/to/rex/git/repo - - - type: git - uri: file:///path/to/walter/git/repo ----- - -Using this configuration, precedence is determined by the order in which repositories are listed under the `composite` key. -In the above example, the Subversion repository is listed first, so a value found in the Subversion repository will override values found for the same property in one of the Git repositories. -A value found in the `rex` Git repository will be used before a value found for the same property in the `walter` Git repository. - -If you want to pull configuration data only from repositories that are each of distinct types, you can enable the corresponding profiles, rather than the `composite` profile, in your configuration server's application properties or YAML file. -If, for example, you want to pull configuration data from a single Git repository and a single HashiCorp Vault server, you can set the following properties for your configuration server: - -[source,yaml] ----- -spring: - profiles: - active: git, vault - cloud: - config: - server: - git: - uri: file:///path/to/git/repo - order: 2 - vault: - host: 127.0.0.1 - port: 8200 - order: 1 ----- - -Using this configuration, precedence can be determined by an `order` property. -You can use the `order` property to specify the priority order for all your repositories. -The lower the numerical value of the `order` property, the higher priority it has. -The priority order of a repository helps resolve any potential conflicts between repositories that contain values for the same properties. - -NOTE: If your composite environment includes a Vault server as in the previous example, you must include a Vault token in every request made to the configuration server. See xref:spring-cloud-config/server/environment-repository/vault-backend.adoc[Vault Backend]. - -NOTE: Any type of failure when retrieving values from an environment repository results in a failure for the entire composite environment. -If you would like the composite to continue even when a repository fails you can set `spring.cloud.config.server.failOnCompositeError` to `false`. - -NOTE: When using a composite environment, it is important that all repositories contain the same labels. -If you have an environment similar to those in the preceding examples and you request configuration data with the `master` label but the Subversion repository does not contain a branch called `master`, the entire request fails. - -[[custom-composite-environment-repositories]] -== Custom Composite Environment Repositories - -In addition to using one of the environment repositories from Spring Cloud, you can also provide your own `EnvironmentRepository` bean to be included as part of a composite environment. -To do so, your bean must implement the `EnvironmentRepository` interface. -If you want to control the priority of your custom `EnvironmentRepository` within the composite environment, you should also implement the `Ordered` interface and override the `getOrdered` method. -If you do not implement the `Ordered` interface, your `EnvironmentRepository` is given the lowest priority. - diff --git a/docs/modules/ROOT/pages/spring-cloud-config/server/environment-repository/credhub-backend.adoc b/docs/modules/ROOT/pages/spring-cloud-config/server/environment-repository/credhub-backend.adoc deleted file mode 100644 index 5365fa74..00000000 --- a/docs/modules/ROOT/pages/spring-cloud-config/server/environment-repository/credhub-backend.adoc +++ /dev/null @@ -1,105 +0,0 @@ -[[credhub-backend]] -= CredHub Backend - -Spring Cloud Config Server supports link:https://docs.cloudfoundry.org/credhub[CredHub] as a backend for configuration properties. -You can enable this feature by adding a dependency to link:https://spring.io/projects/spring-credhub[Spring CredHub]. - -[source,xml,indent=0] -.pom.xml ----- - - - org.springframework.credhub - spring-credhub-starter - - ----- - -The following configuration uses mutual TLS to access a CredHub: - -[source,yaml] ----- -spring: - profiles: - active: credhub - cloud: - config: - server: - credhub: - url: https://credhub:8844 ----- - -The properties should be stored as JSON, such as: -[source,sh] ----- -credhub set --name "/demo-app/default/master/toggles" --type=json -value: {"toggle.button": "blue", "toggle.link": "red"} ----- -[source,sh] ----- -credhub set --name "/demo-app/default/master/abs" --type=json -value: {"marketing.enabled": true, "external.enabled": false} ----- - -All client applications with the name `spring.cloud.config.name=demo-app` will have the following properties available to them: - ----- -{ - toggle.button: "blue", - toggle.link: "red", - marketing.enabled: true, - external.enabled: false -} ----- - -NOTE: When no profile is specified `default` will be used and when no label is specified `master` will be used as a default value. -NOTE: Values added to `application` will be shared by all the applications. - -[[oauth-2-0]] -== OAuth 2.0 -You can authenticate with link:https://oauth.net/2/[OAuth 2.0] using link:https://docs.cloudfoundry.org/concepts/architecture/uaa.html[UAA] as a provider. - -[source,xml,indent=0] -.pom.xml ----- - - - org.springframework.security - spring-security-config - - - org.springframework.security - spring-security-oauth2-client - - ----- - -The following configuration uses OAuth 2.0 and UAA to access a CredHub: -[source,yaml] ----- -spring: - profiles: - active: credhub - cloud: - config: - server: - credhub: - url: https://credhub:8844 - oauth2: - registration-id: credhub-client - security: - oauth2: - client: - registration: - credhub-client: - provider: uaa - client-id: credhub_config_server - client-secret: asecret - authorization-grant-type: client_credentials - provider: - uaa: - token-uri: https://uaa:8443/oauth/token ----- - -NOTE: The used UAA client-id should have `credhub.read` as scope. - diff --git a/docs/modules/ROOT/pages/spring-cloud-config/server/environment-repository/file-system-backend.adoc b/docs/modules/ROOT/pages/spring-cloud-config/server/environment-repository/file-system-backend.adoc deleted file mode 100644 index 5b2d7674..00000000 --- a/docs/modules/ROOT/pages/spring-cloud-config/server/environment-repository/file-system-backend.adoc +++ /dev/null @@ -1,25 +0,0 @@ -[[file-system-backend]] -= File System Backend -:page-section-summary-toc: 1 - -There is also a "`native`" profile in the Config Server that does not use Git but loads the config files from the local classpath or file system (any static URL you want to point to with `spring.cloud.config.server.native.searchLocations`). -To use the native profile, launch the Config Server with `spring.profiles.active=native`. - -NOTE: Remember to use the `file:` prefix for file resources (the default without a prefix is usually the classpath). -As with any Spring Boot configuration, you can embed `${}`-style environment placeholders, but remember that absolute paths in Windows require an extra `/` (for example, `file:///${user.home}/config-repo`). - -WARNING: The default value of the `searchLocations` is identical to a local Spring Boot application (that is, `[classpath:/, classpath:/config, -file:./, file:./config]`). -This does not expose the `application.properties` from the server to all clients, because any property sources present in the server are removed before being sent to the client. - -TIP: A filesystem backend is great for getting started quickly and for testing. -To use it in production, you need to be sure that the file system is reliable and shared across all instances of the Config Server. - -The search locations can contain placeholders for `{application}`, `{profile}`, and `{label}`. -In this way, you can segregate the directories in the path and choose a strategy that makes sense for you (such as subdirectory per application or subdirectory per profile). - -If you do not use placeholders in the search locations, this repository also appends the `{label}` parameter of the HTTP resource to a suffix on the search path, so properties files are loaded from each search location *and* a subdirectory with the same name as the label (the labelled properties take precedence in the Spring Environment). -Thus, the default behaviour with no placeholders is the same as adding a search location ending with `/{label}/`. -For example, `file:/tmp/config` is the same as `file:/tmp/config,file:/tmp/config/{label}`. -This behavior can be disabled by setting `spring.cloud.config.server.native.addLabelLocations=false`. - diff --git a/docs/modules/ROOT/pages/spring-cloud-config/server/environment-repository/git-backend.adoc b/docs/modules/ROOT/pages/spring-cloud-config/server/environment-repository/git-backend.adoc deleted file mode 100644 index 42bba9bf..00000000 --- a/docs/modules/ROOT/pages/spring-cloud-config/server/environment-repository/git-backend.adoc +++ /dev/null @@ -1,455 +0,0 @@ -[[git-backend]] -= Git Backend - -The default implementation of `EnvironmentRepository` uses a Git backend, which is very convenient for managing upgrades and physical environments and for auditing changes. -To change the location of the repository, you can set the `spring.cloud.config.server.git.uri` configuration property in the Config Server (for example in `application.yml`). -If you set it with a `file:` prefix, it should work from a local repository so that you can get started quickly and easily without a server. However, in that case, the server operates directly on the local repository without cloning it (it does not matter if it is not bare because the Config Server never makes changes to the "remote" repository). -To scale the Config Server up and make it highly available, you need to have all instances of the server pointing to the same repository, so only a shared file system would work. -Even in that case, it is better to use the `ssh:` protocol for a shared filesystem repository, so that the server can clone it and use a local working copy as a cache. - -This repository implementation maps the `{label}` parameter of the HTTP resource to a git label (commit id, branch name, or tag). -If the git branch or tag name contains a slash (`/`), then the label in the HTTP URL should instead be specified with the special string `({special-string})` (to avoid ambiguity with other URL paths). -For example, if the label is `foo/bar`, replacing the slash would result in the following label: `foo({special-string})bar`. -The inclusion of the special string `({special-string})` can also be applied to the `{application}` parameter. -If you use a command-line client such as curl, be careful with the brackets in the URL -- you should escape them from the shell with single quotes (''). - -[[skipping-ssl-certificate-validation]] -== Skipping SSL Certificate Validation - -The configuration server's validation of the Git server's SSL certificate can be disabled by setting the `git.skipSslValidation` property to `true` (default is `false`). - -[source,yaml] ----- -spring: - cloud: - config: - server: - git: - uri: https://example.com/my/repo - skipSslValidation: true ----- - -[[setting-http-connection-timeout]] -== Setting HTTP Connection Timeout - -You can configure the time, in seconds, that the configuration server will wait to acquire an HTTP connection. Use the `git.timeout` property (default is `5`). - -[source,yaml] ----- -spring: - cloud: - config: - server: - git: - uri: https://example.com/my/repo - timeout: 4 ----- - -[[placeholders-in-git-uri]] -== Placeholders in Git URI - -Spring Cloud Config Server supports a git repository URL with placeholders for the `{application}` and `{profile}` (and `{label}` if you need it, but remember that the label is applied as a git label anyway). -So you can support a "`one repository per application`" policy by using a structure similar to the following: - -[source,yaml] ----- -spring: - cloud: - config: - server: - git: - uri: https://github.com/myorg/{application} ----- - -You can also support a "`one repository per profile`" policy by using a similar pattern but with -`{profile}`. - -Additionally, using the special string "({special-string})" within your `{application}` parameters can enable support for multiple -organizations, as shown in the following example: - -[source,yaml] ----- -spring: - cloud: - config: - server: - git: - uri: https://github.com/{application} ----- - -where `{application}` is provided at request time in the following format: `organization({special-string})application`. - -[[pattern-matching-and-multiple-repositories]] -== Pattern Matching and Multiple Repositories - -Spring Cloud Config also includes support for more complex requirements with pattern -matching on the application and profile name. -The pattern format is a comma-separated list of `{application}/{profile}` names with wildcards (note that a pattern beginning with a wildcard may need to be quoted), as shown in the following example: - -[source,yaml] ----- -spring: - cloud: - config: - server: - git: - uri: https://github.com/spring-cloud-samples/config-repo - repos: - simple: https://github.com/simple/config-repo - special: - pattern: special*/dev*,*special*/dev* - uri: https://github.com/special/config-repo - local: - pattern: local* - uri: file:/home/configsvc/config-repo ----- - -If `{application}/{profile}` does not match any of the patterns, it uses the default URI defined under `spring.cloud.config.server.git.uri`. -In the above example, for the "`simple`" repository, the pattern is `simple/\*` (it only matches one application named `simple` in all profiles). The "`local`" repository matches all application names beginning with `local` in all profiles (the `/*` suffix is added automatically to any pattern that does not have a profile matcher). - -NOTE: The "`one-liner`" short cut used in the "`simple`" example can be used only if the only property to be set is the URI. -If you need to set anything else (credentials, pattern, and so on) you need to use the full form. - -The `pattern` property in the repo is actually an array, so you can use a YAML array (or `[0]`, `[1]`, etc. suffixes in properties files) to bind to multiple patterns. -You may need to do so if you are going to run apps with multiple profiles, as shown in the following example: - -[source,yaml] ----- -spring: - cloud: - config: - server: - git: - uri: https://github.com/spring-cloud-samples/config-repo - repos: - development: - pattern: - - '*/development' - - '*/staging' - uri: https://github.com/development/config-repo - staging: - pattern: - - '*/qa' - - '*/production' - uri: https://github.com/staging/config-repo ----- - -NOTE: Spring Cloud guesses that a pattern containing a profile that does not end in `\*` implies that you actually want to match a list of profiles starting with this pattern (so `*/staging` is a shortcut for `["\*/staging", "*/staging,*"]`, and so on). -This is common where, for instance, you need to run applications in the "`development`" profile locally but also the "`cloud`" profile remotely. - -Every repository can also optionally store config files in sub-directories, and patterns to search for those directories can be specified as `search-paths`. -The following example shows a config file at the top level: - -[source,yaml] ----- -spring: - cloud: - config: - server: - git: - uri: https://github.com/spring-cloud-samples/config-repo - search-paths: - - foo - - bar* ----- - -In the preceding example, the server searches for config files in the top level and in the `foo/` sub-directory and also any sub-directory whose name begins with `bar`. - -By default, the server clones remote repositories when configuration -is first requested. -The server can be configured to clone the repositories at startup, as shown in the following top-level example: - -[source,yaml] ----- -spring: - cloud: - config: - server: - git: - uri: https://git/common/config-repo.git - repos: - team-a: - pattern: team-a-* - cloneOnStart: true - uri: https://git/team-a/config-repo.git - team-b: - pattern: team-b-* - cloneOnStart: false - uri: https://git/team-b/config-repo.git - team-c: - pattern: team-c-* - uri: https://git/team-a/config-repo.git - ----- - -In the preceding example, the server clones team-a's config-repo on startup, before it -accepts any requests. -All other repositories are not cloned until configuration from the repository is requested. - -NOTE: Setting a repository to be cloned when the Config Server starts up can help to identify a misconfigured configuration source (such as an invalid repository URI) quickly, while the Config Server is starting up. -With `cloneOnStart` not enabled for a configuration source, the Config Server may start successfully with a misconfigured or invalid configuration source and not detect an error until an application requests configuration from that configuration source. - -[[authentication]] -== Authentication - -To use HTTP basic authentication on the remote repository, add the `username` and `password` properties separately (not in the URL), as shown in the following example: - -[source,yaml] ----- -spring: - cloud: - config: - server: - git: - uri: https://github.com/spring-cloud-samples/config-repo - username: trolley - password: strongpassword ----- - -If you do not use HTTPS and user credentials, SSH should also work out of the box when you store keys in the default directories (`~/.ssh`) and the URI points to an SSH location, such as `git@github.com:configuration/cloud-configuration`. -It is important that an entry for the Git server be present in the `~/.ssh/known_hosts` file and that it is in `ssh-rsa` format. -Other formats (such as `ecdsa-sha2-nistp256`) are not supported. -To avoid surprises, you should ensure that only one entry is present in the `known_hosts` file for the Git server and that it matches the URL you provided to the config server. -If you use a hostname in the URL, you want to have exactly that (not the IP) in the `known_hosts` file. -The repository is accessed by using JGit, so any documentation you find on that should be applicable. -HTTPS proxy settings can be set in `~/.git/config` or (in the same way as for any other JVM process) with -system properties (`-Dhttps.proxyHost` and `-Dhttps.proxyPort`). - -TIP: If you do not know where your `~/.git` directory is, use `git config --global` to manipulate the settings (for example, `git config --global http.sslVerify false`). - -JGit requires RSA keys in PEM format. Below is an example ssh-keygen (from openssh) command that will generate a key in the corect format: - -```bash -ssh-keygen -m PEM -t rsa -b 4096 -f ~/config_server_deploy_key.rsa -``` - -Warning: When working with SSH keys, the expected ssh private-key must begin with ```-----BEGIN RSA PRIVATE KEY-----```. If the key starts with ```-----BEGIN OPENSSH PRIVATE KEY-----``` then the RSA key will not load when spring-cloud-config server is started. The error looks like: -``` -- Error in object 'spring.cloud.config.server.git': codes [PrivateKeyIsValid.spring.cloud.config.server.git,PrivateKeyIsValid]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [spring.cloud.config.server.git.,]; arguments []; default message []]; default message [Property 'spring.cloud.config.server.git.privateKey' is not a valid private key] -``` - -To correct the above error the RSA key must be converted to PEM format. An example using openssh is provided above for generating a new key in the appropriate format. - -[[authentication-with-aws-codecommit]] -== Authentication with AWS CodeCommit - -Spring Cloud Config Server also supports https://docs.aws.amazon.com/codecommit/latest/userguide/welcome.html[AWS CodeCommit] authentication. -AWS CodeCommit uses an authentication helper when using Git from the command line. -This helper is not used with the JGit library, so a JGit CredentialProvider for AWS CodeCommit is created if the Git URI matches the AWS CodeCommit pattern. -AWS CodeCommit URIs follow this pattern: - -```bash -https://git-codecommit.${AWS_REGION}.amazonaws.com/v1/repos/${repo} -``` - -If you provide a username and password with an AWS CodeCommit URI, they must be the https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSGettingStartedGuide/AWSCredentials.html[AWS accessKeyId and secretAccessKey] that provide access to the repository. -If you do not specify a username and password, the accessKeyId and secretAccessKey are retrieved by using the https://docs.aws.amazon.com/sdk-for-java/v2/developer-guide/credentials.html[Default Credential Provider Chain]. - -If your Git URI matches the CodeCommit URI pattern (shown earlier), you must provide valid AWS credentials in the username and password or in one of the locations supported by the default credential provider chain. -AWS EC2 instances may use https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-roles-for-amazon-ec2.html[IAM Roles for EC2 Instances]. - -NOTE: The `software.amazon.awssdk:auth` jar is an optional dependency. -If the `software.amazon.awssdk:auth` jar is not on your classpath, the AWS Code Commit credential provider is not created, regardless of the git server URI. - -[[authentication-with-google-cloud-source]] -== Authentication with Google Cloud Source - -Spring Cloud Config Server also supports authenticating against https://cloud.google.com/source-repositories/[Google Cloud Source] repositories. - -If your Git URI uses the `http` or `https` protocol and the domain name is `source.developers.google.com`, the Google Cloud Source credentials provider will be used. A Google Cloud Source repository URI has the format `https://source.developers.google.com/p/${GCP_PROJECT}/r/${REPO}`. To obtain the URI for your repository, click on "Clone" in the Google Cloud Source UI, and select "Manually generated credentials". Do not generate any credentials, simply copy the displayed URI. - -The Google Cloud Source credentials provider will use Google Cloud Platform application default credentials. See https://cloud.google.com/sdk/gcloud/reference/auth/application-default/login[Google Cloud SDK documentation] on how to create application default credentials for a system. This approach will work for user accounts in dev environments and for service accounts in production environments. - -NOTE: `com.google.auth:google-auth-library-oauth2-http` is an optional dependency. -If the `google-auth-library-oauth2-http` jar is not on your classpath, the Google Cloud Source credential provider is not created, regardless of the git server URI. - -[[git-ssh-configuration-using-properties]] -== Git SSH configuration using properties - -By default, the JGit library used by Spring Cloud Config Server uses SSH configuration files such as `~/.ssh/known_hosts` and `/etc/ssh/ssh_config` when connecting to Git repositories by using an SSH URI. -In cloud environments such as Cloud Foundry, the local filesystem may be ephemeral or not easily accessible. -For those cases, SSH configuration can be set by using Java properties. -In order to activate property-based SSH configuration, the `spring.cloud.config.server.git.ignoreLocalSshSettings` property must be set to `true`, as shown in the following example: - -[source,yaml] ----- - spring: - cloud: - config: - server: - git: - uri: git@gitserver.com:team/repo1.git - ignoreLocalSshSettings: true - hostKey: someHostKey - hostKeyAlgorithm: ssh-rsa - privateKey: | - -----BEGIN RSA PRIVATE KEY----- - MIIEpgIBAAKCAQEAx4UbaDzY5xjW6hc9jwN0mX33XpTDVW9WqHp5AKaRbtAC3DqX - IXFMPgw3K45jxRb93f8tv9vL3rD9CUG1Gv4FM+o7ds7FRES5RTjv2RT/JVNJCoqF - ol8+ngLqRZCyBtQN7zYByWMRirPGoDUqdPYrj2yq+ObBBNhg5N+hOwKjjpzdj2Ud - 1l7R+wxIqmJo1IYyy16xS8WsjyQuyC0lL456qkd5BDZ0Ag8j2X9H9D5220Ln7s9i - oezTipXipS7p7Jekf3Ywx6abJwOmB0rX79dV4qiNcGgzATnG1PkXxqt76VhcGa0W - DDVHEEYGbSQ6hIGSh0I7BQun0aLRZojfE3gqHQIDAQABAoIBAQCZmGrk8BK6tXCd - fY6yTiKxFzwb38IQP0ojIUWNrq0+9Xt+NsypviLHkXfXXCKKU4zUHeIGVRq5MN9b - BO56/RrcQHHOoJdUWuOV2qMqJvPUtC0CpGkD+valhfD75MxoXU7s3FK7yjxy3rsG - EmfA6tHV8/4a5umo5TqSd2YTm5B19AhRqiuUVI1wTB41DjULUGiMYrnYrhzQlVvj - 5MjnKTlYu3V8PoYDfv1GmxPPh6vlpafXEeEYN8VB97e5x3DGHjZ5UrurAmTLTdO8 - +AahyoKsIY612TkkQthJlt7FJAwnCGMgY6podzzvzICLFmmTXYiZ/28I4BX/mOSe - pZVnfRixAoGBAO6Uiwt40/PKs53mCEWngslSCsh9oGAaLTf/XdvMns5VmuyyAyKG - ti8Ol5wqBMi4GIUzjbgUvSUt+IowIrG3f5tN85wpjQ1UGVcpTnl5Qo9xaS1PFScQ - xrtWZ9eNj2TsIAMp/svJsyGG3OibxfnuAIpSXNQiJPwRlW3irzpGgVx/AoGBANYW - dnhshUcEHMJi3aXwR12OTDnaLoanVGLwLnkqLSYUZA7ZegpKq90UAuBdcEfgdpyi - PhKpeaeIiAaNnFo8m9aoTKr+7I6/uMTlwrVnfrsVTZv3orxjwQV20YIBCVRKD1uX - VhE0ozPZxwwKSPAFocpyWpGHGreGF1AIYBE9UBtjAoGBAI8bfPgJpyFyMiGBjO6z - FwlJc/xlFqDusrcHL7abW5qq0L4v3R+FrJw3ZYufzLTVcKfdj6GelwJJO+8wBm+R - gTKYJItEhT48duLIfTDyIpHGVm9+I1MGhh5zKuCqIhxIYr9jHloBB7kRm0rPvYY4 - VAykcNgyDvtAVODP+4m6JvhjAoGBALbtTqErKN47V0+JJpapLnF0KxGrqeGIjIRV - cYA6V4WYGr7NeIfesecfOC356PyhgPfpcVyEztwlvwTKb3RzIT1TZN8fH4YBr6Ee - KTbTjefRFhVUjQqnucAvfGi29f+9oE3Ei9f7wA+H35ocF6JvTYUsHNMIO/3gZ38N - CPjyCMa9AoGBAMhsITNe3QcbsXAbdUR00dDsIFVROzyFJ2m40i4KCRM35bC/BIBs - q0TY3we+ERB40U8Z2BvU61QuwaunJ2+uGadHo58VSVdggqAo0BSkH58innKKt96J - 69pcVH/4rmLbXdcmNYGm6iu+MlPQk4BUZknHSmVHIFdJ0EPupVaQ8RHT - -----END RSA PRIVATE KEY----- - ----- - -The following table describes the SSH configuration properties. - -.SSH Configuration Properties -|=== -|Property Name |Remarks - -|*ignoreLocalSshSettings* -|If `true`, use property-based instead of file-based SSH config. Must be set at as `spring.cloud.config.server.git.ignoreLocalSshSettings`, *not* inside a repository definition. - -|*privateKey* -|Valid SSH private key. Must be set if `ignoreLocalSshSettings` is true and Git URI is SSH format. - -|*hostKey* -|Valid SSH host key. Must be set if `hostKeyAlgorithm` is also set. - -|*hostKeyAlgorithm* -|One of `ssh-dss, ssh-rsa, ssh-ed25519, ecdsa-sha2-nistp256, ecdsa-sha2-nistp384, or ecdsa-sha2-nistp521`. Must be set if `hostKey` is also set. - -|*strictHostKeyChecking* -|`true` or `false`. If false, ignore errors with host key. - -|*knownHostsFile* -|Location of custom `.known_hosts` file. - -|*preferredAuthentications* -|Override server authentication method order. This should allow for evading login prompts if server has keyboard-interactive authentication before the `publickey` method. -|=== - -[[placeholders-in-git-search-paths]] -== Placeholders in Git Search Paths - -Spring Cloud Config Server also supports a search path with placeholders for the `{application}` and `{profile}` (and `{label}` if -you need it), as shown in the following example: - -[source,yaml] ----- -spring: - cloud: - config: - server: - git: - uri: https://github.com/spring-cloud-samples/config-repo - search-paths: '{application}' ----- - -The preceding listing causes a search of the repository for files in the same name as the directory (as well as the top level). -Wildcards are also valid in a search path with placeholders (any matching directory is included in the search). - -[[force-pull-in-git-repositories]] -== Force pull in Git Repositories - -As mentioned earlier, Spring Cloud Config Server makes a clone of the remote git repository in case the local copy gets dirty (for example, -folder content changes by an OS process) such that Spring Cloud Config Server cannot update the local copy from remote repository. - -To solve this issue, there is a `force-pull` property that makes Spring Cloud Config Server force pull from the remote repository if the local copy is dirty, as shown in the following example: - -[source,yaml] ----- -spring: - cloud: - config: - server: - git: - uri: https://github.com/spring-cloud-samples/config-repo - force-pull: true - ----- - -If you have a multiple-repositories configuration, you can configure the `force-pull` property per repository, as shown in the following example: - -[source,yaml] ----- -spring: - cloud: - config: - server: - git: - uri: https://git/common/config-repo.git - force-pull: true - repos: - team-a: - pattern: team-a-* - uri: https://git/team-a/config-repo.git - force-pull: true - team-b: - pattern: team-b-* - uri: https://git/team-b/config-repo.git - force-pull: true - team-c: - pattern: team-c-* - uri: https://git/team-a/config-repo.git ----- - -NOTE: The default value for `force-pull` property is `false`. - -[[deleting-untracked-branches-in-git-repositories]] -== Deleting untracked branches in Git Repositories - -As Spring Cloud Config Server has a clone of the remote git repository -after check-outing branch to local repo (e.g fetching properties by label) it will keep this branch -forever or till the next server restart (which creates new local repo). -So there could be a case when remote branch is deleted but local copy of it is still available for fetching. -And if Spring Cloud Config Server client service starts with `--spring.cloud.config.label=deletedRemoteBranch,master` -it will fetch properties from `deletedRemoteBranch` local branch, but not from `master`. - -In order to keep local repository branches clean and up to remote - `deleteUntrackedBranches` property could be set. -It will make Spring Cloud Config Server *force* delete untracked branches from local repository. -Example: - -[source,yaml] ----- -spring: - cloud: - config: - server: - git: - uri: https://github.com/spring-cloud-samples/config-repo - deleteUntrackedBranches: true - ----- - -NOTE: The default value for `deleteUntrackedBranches` property is `false`. - -[[git-refresh-rate]] -== Git Refresh Rate - -You can control how often the config server will fetch updated configuration data -from your Git backend by using `spring.cloud.config.server.git.refreshRate`. The -value of this property is specified in seconds. By default the value is 0, meaning -the config server will fetch updated configuration from the Git repo every time it -is requested. - -[[default-label]] -== Default Label - -The default label used for Git is `main`. If you do not set `spring.cloud.config.server.git.defaultLabel` and a branch named `main` -does not exist, the config server will by default also try to checkout a branch named `master`. If -you would like to disable to the fallback branch behavior you can set -`spring.cloud.config.server.git.tryMasterBranch` to `false`. - diff --git a/docs/modules/ROOT/pages/spring-cloud-config/server/environment-repository/jdbc-backend.adoc b/docs/modules/ROOT/pages/spring-cloud-config/server/environment-repository/jdbc-backend.adoc deleted file mode 100644 index f6963ed4..00000000 --- a/docs/modules/ROOT/pages/spring-cloud-config/server/environment-repository/jdbc-backend.adoc +++ /dev/null @@ -1,17 +0,0 @@ -[[jdbc-backend]] -= JDBC Backend -:page-section-summary-toc: 1 - -Spring Cloud Config Server supports JDBC (relational database) as a backend for configuration properties. -You can enable this feature by adding `spring-boot-starter-data-jdbc` to the classpath and using the `jdbc` profile or by adding a bean of type `JdbcEnvironmentRepository`. -If you include the right dependencies on the classpath (see the user guide for more details on that), Spring Boot configures a data source. -// TODO Which user guide? When we know that, we should add a link to it. - -You can disable autoconfiguration for `JdbcEnvironmentRepository` by setting the `spring.cloud.config.server.jdbc.enabled` property to `false`. - -The database needs to have a table called `PROPERTIES` with columns called `APPLICATION`, `PROFILE`, and `LABEL` (with the usual `Environment` meaning), plus `KEY` and `VALUE` for the key and value pairs in `Properties` style. -All fields are of type String in Java, so you can make them `VARCHAR` of whatever length you need. -Property values behave in the same way as they would if they came from Spring Boot properties files named `{application}-{profile}.properties`, including all the encryption and decryption, which will be applied as post-processing steps (that is, not in the repository implementation directly). - -NOTE: The default label used for JDBC is `master`. You can change that by setting `spring.cloud.config.server.jdbc.defaultLabel`. - diff --git a/docs/modules/ROOT/pages/spring-cloud-config/server/environment-repository/overriding-properties-using-placeholders.adoc b/docs/modules/ROOT/pages/spring-cloud-config/server/environment-repository/overriding-properties-using-placeholders.adoc deleted file mode 100644 index 9fc7f2d9..00000000 --- a/docs/modules/ROOT/pages/spring-cloud-config/server/environment-repository/overriding-properties-using-placeholders.adoc +++ /dev/null @@ -1,20 +0,0 @@ -[[overriding-properties-using-placeholders]] -= Overriding Properties Using Placeholders -:page-section-summary-toc: 1 - -A cleaner way to override properties without enabling config first bootstrap is to use property placeholders in the configuration coming from the config server. - -For example if the configuration coming from the config server contains the following property - -[source,properties] ----- -hello=${app.hello:Hello From Config Server!} ----- - -You can override the value of `hello` coming from the config server by setting `app.hello` in your local application configuration - -[source,properties] ----- -app.hello=Hello From Application! ----- - diff --git a/docs/modules/ROOT/pages/spring-cloud-config/server/environment-repository/overriding-properties-using-profiles.adoc b/docs/modules/ROOT/pages/spring-cloud-config/server/environment-repository/overriding-properties-using-profiles.adoc deleted file mode 100644 index 292d993e..00000000 --- a/docs/modules/ROOT/pages/spring-cloud-config/server/environment-repository/overriding-properties-using-profiles.adoc +++ /dev/null @@ -1,25 +0,0 @@ -[[overriding-properties-using-profiles]] -= Overriding Properties Using Profiles -:page-section-summary-toc: 1 - -The final way to override properties coming from the config server is to specify them in profile specific configuration file within the client -application. - -For example, if you have the following configuration from the config server - -[source,properties] ----- -hello="Hello From Config Server!" ----- - -You can override the value of `hello` in the client application by setting `hello` in a profile specific configuration file and -then enabling that profile. - -.application-overrides.properties -[source,properties] ----- -hello="Hello From Application!" ----- - -In the above example you would have to enable the `overrides` profile. - diff --git a/docs/modules/ROOT/pages/spring-cloud-config/server/environment-repository/property-overrides.adoc b/docs/modules/ROOT/pages/spring-cloud-config/server/environment-repository/property-overrides.adoc deleted file mode 100644 index f7d65f1e..00000000 --- a/docs/modules/ROOT/pages/spring-cloud-config/server/environment-repository/property-overrides.adoc +++ /dev/null @@ -1,31 +0,0 @@ -[[property-overrides]] -= Property Overrides - -The Config Server has an "`overrides`" feature that lets the operator provide configuration properties to all applications. -The overridden properties cannot be accidentally changed by the application with the normal Spring Boot hooks. -To declare overrides, add a map of name-value pairs to `spring.cloud.config.server.overrides`, as shown in the following example: - -[source,yaml] ----- -spring: - cloud: - config: - server: - overrides: - foo: bar ----- - -The preceding examples causes all applications that are config clients to read `foo=bar`, independent of their own configuration. - -NOTE: A configuration system cannot force an application to use configuration data in any particular way. -Consequently, overrides are not enforceable. -However, they do provide useful default behavior for Spring Cloud Config clients. - -TIP: Normally, Spring environment placeholders with `${}` can be escaped (and resolved on the client) by using backslash (`\`) to escape the `$` or the `{`. -For example, `\${app.foo:bar}` resolves to `bar`, unless the app provides its own `app.foo`. - -NOTE: In YAML, you do not need to escape the backslash itself. -However, in properties files, you do need to escape the backslash, when you configure the overrides on the server. - -You can change the priority of all overrides in the client to be more like default values, letting applications supply their own values in environment variables or System properties, by setting the `spring.cloud.config.overrideNone=true` flag (the default is false) in the remote repository. - diff --git a/docs/modules/ROOT/pages/spring-cloud-config/server/environment-repository/redis-backend.adoc b/docs/modules/ROOT/pages/spring-cloud-config/server/environment-repository/redis-backend.adoc deleted file mode 100644 index 7bcc8d41..00000000 --- a/docs/modules/ROOT/pages/spring-cloud-config/server/environment-repository/redis-backend.adoc +++ /dev/null @@ -1,47 +0,0 @@ -[[redis-backend]] -= Redis Backend - -Spring Cloud Config Server supports Redis as a backend for configuration properties. -You can enable this feature by adding a dependency to link:https://spring.io/projects/spring-data-redis[Spring Data Redis]. - -[source,xml,indent=0] -.pom.xml ----- - - - org.springframework.boot - spring-boot-starter-data-redis - - ----- - -The following configuration uses Spring Data `RedisTemplate` to access a Redis. We can use `spring.redis.*` properties to override default connection settings. - -[source,yaml] ----- -spring: - profiles: - active: redis - redis: - host: redis - port: 16379 ----- - -The properties should be stored as fields in a hash. The name of hash should be the same as `spring.application.name` property or conjunction of `spring.application.name` and `spring.profiles.active[n]`. -[source,sh] ----- -HMSET sample-app server.port "8100" sample.topic.name "test" test.property1 "property1" ----- - -After running the command visible above a hash should contain the following keys with values: ----- -HGETALL sample-app -{ - "server.port": "8100", - "sample.topic.name": "test", - "test.property1": "property1" -} ----- - -NOTE: When no profile is specified `default` will be used. - diff --git a/docs/modules/ROOT/pages/spring-cloud-config/server/environment-repository/sharing-configuration-with-all-applications.adoc b/docs/modules/ROOT/pages/spring-cloud-config/server/environment-repository/sharing-configuration-with-all-applications.adoc deleted file mode 100644 index 4c60dadd..00000000 --- a/docs/modules/ROOT/pages/spring-cloud-config/server/environment-repository/sharing-configuration-with-all-applications.adoc +++ /dev/null @@ -1,49 +0,0 @@ -[[sharing-configuration-with-all-applications]] -= Sharing Configuration With All Applications - -Sharing configuration between all applications varies according to which approach you take, as described in the following topics: - -* xref:spring-cloud-config/server/environment-repository/sharing-configuration-with-all-applications.adoc#spring-cloud-config-server-file-based-repositories[File Based Repositories] -* xref:spring-cloud-config/server/environment-repository/sharing-configuration-with-all-applications.adoc#spring-cloud-config-server-vault-server[Vault Server] - -[[spring-cloud-config-server-file-based-repositories]] -== File Based Repositories - -With file-based (git, svn, and native) repositories, resources with file names in `application*` (`application.properties`, `application.yml`, `application-*.properties`, and so on) are shared between all client applications. -You can use resources with these file names to configure global defaults and have them be overridden by application-specific files as necessary. - -The xref:spring-cloud-config/server/environment-repository/property-overrides.adoc[property overrides] feature can also be used for setting global defaults, with placeholders applications -allowed to override them locally. - -TIP: With the "`native`" profile (a local file system backend) , you should use an explicit search location that is not part of the server's own configuration. -Otherwise, the `application*` resources in the default search locations get removed because they are part of the server. - -[[spring-cloud-config-server-vault-server]] -== Vault Server - -When using Vault as a backend, you can share configuration with all applications by placing configuration in `secret/application`. -For example, if you run the following Vault command, all applications using the config server will have the properties `foo` and `baz` available to them: - -[source,sh] ----- -$ vault write secret/application foo=bar baz=bam ----- - -[[credhub-server]] -== CredHub Server - -When using CredHub as a backend, you can share configuration with all applications by placing configuration in `/application/` or by placing it in the `default` profile for the application. -For example, if you run the following CredHub command, all applications using the config server will have the properties `shared.color1` and `shared.color2` available to them: - -[source,sh] ----- -credhub set --name "/application/profile/master/shared" --type=json -value: {"shared.color1": "blue", "shared.color": "red"} ----- - -[source,sh] ----- -credhub set --name "/my-app/default/master/more-shared" --type=json -value: {"shared.word1": "hello", "shared.word2": "world"} ----- - diff --git a/docs/modules/ROOT/pages/spring-cloud-config/server/environment-repository/using-bootstrap-to-override-properties.adoc b/docs/modules/ROOT/pages/spring-cloud-config/server/environment-repository/using-bootstrap-to-override-properties.adoc deleted file mode 100644 index 02be41d4..00000000 --- a/docs/modules/ROOT/pages/spring-cloud-config/server/environment-repository/using-bootstrap-to-override-properties.adoc +++ /dev/null @@ -1,16 +0,0 @@ -[[using-bootstrap-to-override-properties]] -= Using Bootstrap To Override Properties -:page-section-summary-toc: 1 - -If you enable xref:spring-cloud-config/client.adoc#config-first-bootstrap[config first bootstrap], you can allow client applications to override configuration from the config server by placing two properties within -the applications configuration coming from the config server. - -[source,properties] ----- -spring.cloud.config.allowOverride=true -spring.cloud.config.overrideNone=true ----- - -With Bootstrap enabled and these two properties set to true you will be able to override configuration from the config server -within the clients application configuration. - diff --git a/docs/modules/ROOT/pages/spring-cloud-config/server/environment-repository/vault-backend.adoc b/docs/modules/ROOT/pages/spring-cloud-config/server/environment-repository/vault-backend.adoc deleted file mode 100644 index 992eea38..00000000 --- a/docs/modules/ROOT/pages/spring-cloud-config/server/environment-repository/vault-backend.adoc +++ /dev/null @@ -1,160 +0,0 @@ -[[vault-backend]] -= Vault Backend - -Spring Cloud Config Server also supports https://www.vaultproject.io[Vault] as a backend. - -**** -Vault is a tool for securely accessing secrets. -A secret is anything that to which you want to tightly control access, such as API keys, passwords, certificates, and other sensitive information. Vault provides a unified interface to any secret while providing tight access control and recording a detailed audit log. -**** - -For more information on Vault, see the https://learn.hashicorp.com/vault/?track=getting-started#getting-started[Vault quick start guide]. - -To enable the config server to use a Vault backend, you can run your config server with the `vault` profile. -For example, in your config server's `application.properties`, you can add `spring.profiles.active=vault`. - -**** -By default, Spring Cloud Config Server uses Token based Authentication to fetch config from Vault. -Vault also supports additional authentication methods like AppRole, LDAP, JWT, CloudFoundry, Kubernetes Auth. -In order to use any authentication method other than TOKEN or the X-Config-Token header, we need to have Spring Vault Core on the classpath so that Config Server can delegate authentication to that library. Please add the below dependencies to your Config Server App. - -`Maven (pom.xml)` ----- - - - org.springframework.vault - spring-vault-core - - ----- - -`Gradle (build.gradle)` ----- -dependencies { - implementation "org.springframework.vault:spring-vault-core" -} ----- -**** - -By default, the config server assumes that your Vault server runs at `http://127.0.0.1:8200`. -It also assumes that the name of backend is `secret` and the key is `application`. -All of these defaults can be configured in your config server's `application.properties`. -The following table describes configurable Vault properties: - -|=== -|Name |Default Value - -|host -|127.0.0.1 - -|port -|8200 - -|scheme -|http - -|backend -|secret - -|defaultKey -|application - -|profileSeparator -|, - -|kvVersion -|1 - -|skipSslValidation -|false - -|timeout -|5 - -|namespace -|null - -|=== - -IMPORTANT: All of the properties in the preceding table must be prefixed with `spring.cloud.config.server.vault` or placed in the correct Vault section of a composite configuration. - -All configurable properties can be found in `org.springframework.cloud.config.server.environment.VaultEnvironmentProperties`. - -IMPORTANT: Vault 0.10.0 introduced a versioned key-value backend (k/v backend version 2) that exposes a different API than earlier versions, it now requires a `data/` between the mount path and the actual context path and wraps secrets in a `data` object. Setting `spring.cloud.config.server.vault.kv-version=2` will take this into account. - -Optionally, there is support for the Vault Enterprise `X-Vault-Namespace` header. To have it sent to Vault set the `namespace` property. - -With your config server running, you can make HTTP requests to the server to retrieve -values from the Vault backend. -To do so, you need a token for your Vault server. - -First, place some data in you Vault, as shown in the following example: - -[source,sh] ----- -$ vault kv put secret/application foo=bar baz=bam -$ vault kv put secret/myapp foo=myappsbar ----- - -Second, make an HTTP request to your config server to retrieve the values, as shown in the following example: - -`$ curl -X "GET" "http://localhost:8888/myapp/default" -H "X-Config-Token: yourtoken"` - -You should see a response similar to the following: - -[source,json] ----- -{ - "name":"myapp", - "profiles":[ - "default" - ], - "label":null, - "version":null, - "state":null, - "propertySources":[ - { - "name":"vault:myapp", - "source":{ - "foo":"myappsbar" - } - }, - { - "name":"vault:application", - "source":{ - "baz":"bam", - "foo":"bar" - } - } - ] -} ----- - -The default way for a client to provide the necessary authentication to let Config Server talk to Vault is to set the X-Config-Token header. -However, you can instead omit the header and configure the authentication in the server, by setting the same configuration properties as Spring Cloud Vault. -The property to set is `spring.cloud.config.server.vault.authentication`. -It should be set to one of the supported authentication methods. -You may also need to set other properties specific to the authentication method you use, by using the same property names as documented for `spring.cloud.vault` but instead using the `spring.cloud.config.server.vault` prefix. -See the https://cloud.spring.io/spring-cloud-vault/reference/html/#vault.config.authentication[Spring Cloud Vault Reference Guide] for more detail. - -IMPORTANT: If you omit the X-Config-Token header and use a server property to set the authentication, the Config Server application needs an additional dependency on Spring Vault to enable the additional authentication options. -See the https://docs.spring.io/spring-vault/docs/current/reference/html/#dependencies[Spring Vault Reference Guide] for how to add that dependency. - -[[multiple-properties-sources]] -== Multiple Properties Sources - -When using Vault, you can provide your applications with multiple properties sources. -For example, assume you have written data to the following paths in Vault: - -[source,sh] ----- -secret/myApp,dev -secret/myApp -secret/application,dev -secret/application ----- - -Properties written to `secret/application` are available to <<_vault_server,all applications using the Config Server>>. -An application with the name, `myApp`, would have any properties written to `secret/myApp` and `secret/application` available to it. -When `myApp` has the `dev` profile enabled, properties written to all of the above paths would be available to it, with properties in the first path in the list taking priority over the others. - diff --git a/docs/modules/ROOT/pages/spring-cloud-config/server/environment-repository/version-control-backend-filesystem-use.adoc b/docs/modules/ROOT/pages/spring-cloud-config/server/environment-repository/version-control-backend-filesystem-use.adoc deleted file mode 100644 index 49eda5ab..00000000 --- a/docs/modules/ROOT/pages/spring-cloud-config/server/environment-repository/version-control-backend-filesystem-use.adoc +++ /dev/null @@ -1,11 +0,0 @@ -[[version-control-backend-filesystem-use]] -= Version Control Backend Filesystem Use -:page-section-summary-toc: 1 - -WARNING: With VCS-based backends (git, svn), files are checked out or cloned to the local filesystem. -By default, they are put in the system temporary directory with a prefix of `config-repo-`. -On linux, for example, it could be `/tmp/config-repo-`. -Some operating systems https://serverfault.com/questions/377348/when-does-tmp-get-cleared/377349#377349[routinely clean out] temporary directories. -This can lead to unexpected behavior, such as missing properties. -To avoid this problem, change the directory that Config Server uses by setting `spring.cloud.config.server.git.basedir` or `spring.cloud.config.server.svn.basedir` to a directory that does not reside in the system temp structure. - diff --git a/docs/modules/ROOT/pages/spring-cloud-config/server/health-indicator.adoc b/docs/modules/ROOT/pages/spring-cloud-config/server/health-indicator.adoc deleted file mode 100644 index 11d61449..00000000 --- a/docs/modules/ROOT/pages/spring-cloud-config/server/health-indicator.adoc +++ /dev/null @@ -1,27 +0,0 @@ -[[health-indicator]] -= Health Indicator - -Config Server comes with a Health Indicator that checks whether the configured `EnvironmentRepository` is working. -By default, it asks the `EnvironmentRepository` for an application named `app`, the `default` profile, and the default label provided by the `EnvironmentRepository` implementation. - -You can configure the Health Indicator to check more applications along with custom profiles and custom labels, as shown in the following example: - -[source,yaml] ----- -spring: - cloud: - config: - server: - health: - repositories: - myservice: - label: mylabel - myservice-dev: - name: myservice - profiles: development ----- - -You can disable the Health Indicator by setting `management.health.config.enabled=false`. - -Also, you can provide a custom `down` status of your own by setting property `spring.cloud.config.server.health.down-health-status` (valued to `"DOWN'` by default). - diff --git a/docs/modules/ROOT/pages/spring-cloud-config/server/key-management.adoc b/docs/modules/ROOT/pages/spring-cloud-config/server/key-management.adoc deleted file mode 100644 index 7ebb800c..00000000 --- a/docs/modules/ROOT/pages/spring-cloud-config/server/key-management.adoc +++ /dev/null @@ -1,32 +0,0 @@ -[[key-management]] -= Key Management - -The Config Server can use a symmetric (shared) key or an asymmetric one (RSA key pair). -The asymmetric choice is superior in terms of security, but it is often more convenient to use a symmetric key since it is a single property value to configure in the `application.properties`. - -To configure a symmetric key, you need to set `encrypt.key` to a secret String (or use the `ENCRYPT_KEY` environment variable to keep it out of plain-text configuration files). - -NOTE: If you include `spring-cloud-starter-bootstrap` on the classpath or set `spring.cloud.bootstrap.enabled=true` as a system property, you will need to set `encrypt.key` in `bootstrap.properties`. - -NOTE: You cannot configure an asymmetric key using `encrypt.key`. - -To configure an asymmetric key use a keystore (e.g. as -created by the `keytool` utility that comes with the JDK). The -keystore properties are `encrypt.keyStore.\*` with `*` equal to - -[options="header"] -|=== -^|Property ^|Description -|`encrypt.keyStore.location`|Contains a `Resource` location -|`encrypt.keyStore.password`|Holds the password that unlocks the keystore -|`encrypt.keyStore.alias`|Identifies which key in the store to use -|`encrypt.keyStore.type`|The type of KeyStore to create. Defaults to `jks`. -|=== - -The encryption is done with the public key, and a private key is -needed for decryption. -Thus, in principle, you can configure only the public key in the server if you want to only encrypt (and are prepared to decrypt the values yourself locally with the private key). -In practice, you might not want to do decrypt locally, because it spreads the key management process around all the clients, instead of -concentrating it in the server. -On the other hand, it can be a useful option if your config server is relatively insecure and only a handful of clients need the encrypted properties. - diff --git a/docs/modules/ROOT/pages/spring-cloud-config/server/push-notifications-and-bus.adoc b/docs/modules/ROOT/pages/spring-cloud-config/server/push-notifications-and-bus.adoc deleted file mode 100644 index a3ea89c1..00000000 --- a/docs/modules/ROOT/pages/spring-cloud-config/server/push-notifications-and-bus.adoc +++ /dev/null @@ -1,22 +0,0 @@ -[[push-notifications-and-spring-cloud-bus]] -= Push Notifications and Spring Cloud Bus -:page-section-summary-toc: 1 - -Many source code repository providers (such as Github, Gitlab, Gitea, Gitee, Gogs, or Bitbucket) notify you of changes in a repository through a webhook. -You can configure the webhook through the provider's user interface as a URL and a set of events in which you are interested. -For instance, https://developer.github.com/v3/activity/events/types/#pushevent[Github] uses a POST to the webhook with a JSON body containing a list of commits and a header (`X-Github-Event`) set to `push`. -If you add a dependency on the `spring-cloud-config-monitor` library and activate the Spring Cloud Bus in your Config Server, then a `/monitor` endpoint is enabled. - -When the webhook is activated, the Config Server sends a `RefreshRemoteApplicationEvent` targeted at the applications it thinks might have changed. -The change detection can be strategized. -However, by default, it looks for changes in files that match the application name (for example, `foo.properties` is targeted at the `foo` application, while `application.properties` is targeted at all applications). -The strategy to use when you want to override the behavior is `PropertyPathNotificationExtractor`, which accepts the request headers and body as parameters and returns a list of file paths that changed. - -The default configuration works out of the box with Github, Gitlab, Gitea, Gitee, Gogs or Bitbucket. -In addition to the JSON notifications from Github, Gitlab, Gitee, or Bitbucket, you can trigger a change notification by POSTing to `/monitor` with form-encoded body parameters in the pattern of `path={application}`. -Doing so broadcasts to applications matching the `{application}` pattern (which can contain wildcards). - -NOTE: The `RefreshRemoteApplicationEvent` is transmitted only if the `spring-cloud-bus` is activated in both the Config Server and in the client application. - -NOTE: The default configuration also detects filesystem changes in local git repositories. In that case, the webhook is not used. However, as soon as you edit a config file, a refresh is broadcast. - diff --git a/docs/modules/ROOT/pages/spring-cloud-config/server/security.adoc b/docs/modules/ROOT/pages/spring-cloud-config/server/security.adoc deleted file mode 100644 index 47b10c4f..00000000 --- a/docs/modules/ROOT/pages/spring-cloud-config/server/security.adoc +++ /dev/null @@ -1,9 +0,0 @@ -[[security]] -= Security -:page-section-summary-toc: 1 - -You can secure your Config Server in any way that makes sense to you (from physical network security to OAuth2 bearer tokens), because Spring Security and Spring Boot offer support for many security arrangements. - -To use the default Spring Boot-configured HTTP Basic security, include Spring Security on the classpath (for example, through `spring-boot-starter-security`). -The default is a username of `user` and a randomly generated password. A random password is not useful in practice, so we recommend you configure the password (by setting `spring.security.user.password`) and encrypt it (see below for instructions on how to do that). - diff --git a/docs/modules/ROOT/pages/spring-cloud-config/server/serving-alternative-formats.adoc b/docs/modules/ROOT/pages/spring-cloud-config/server/serving-alternative-formats.adoc deleted file mode 100644 index 27e4afdc..00000000 --- a/docs/modules/ROOT/pages/spring-cloud-config/server/serving-alternative-formats.adoc +++ /dev/null @@ -1,16 +0,0 @@ -[[serving-alternative-formats]] -= Serving Alternative Formats -:page-section-summary-toc: 1 - -The default JSON format from the environment endpoints is perfect for consumption by Spring applications, because it maps directly onto the `Environment` abstraction. -If you prefer, you can consume the same data as YAML or Java properties by adding a suffix (".yml", ".yaml" or ".properties") to the resource path. -This can be useful for consumption by applications that do not care about the structure of the JSON endpoints or the extra metadata they provide (for example, an application that is not using Spring might benefit from the simplicity of this approach). - -The YAML and properties representations have an additional flag (provided as a boolean query parameter called `resolvePlaceholders`) to signal that placeholders in the source documents (in the standard Spring `${...}` form) should be resolved in the output before rendering, where possible. -This is a useful feature for consumers that do not know about the Spring placeholder conventions. - -NOTE: There are limitations in using the YAML or properties formats, mainly in relation to the loss of metadata. -For example, the JSON is structured as an ordered list of property sources, with names that correlate with the source. -The YAML and properties forms are coalesced into a single map, even if the origin of the values has multiple sources, and the names of the original source files are lost. -Also, the YAML representation is not necessarily a faithful representation of the YAML source in a backing repository either. It is constructed from a list of flat property sources, and assumptions have to be made about the form of the keys. - diff --git a/docs/modules/ROOT/pages/spring-cloud-config/server/serving-binary-files.adoc b/docs/modules/ROOT/pages/spring-cloud-config/server/serving-binary-files.adoc deleted file mode 100644 index 23c4ce76..00000000 --- a/docs/modules/ROOT/pages/spring-cloud-config/server/serving-binary-files.adoc +++ /dev/null @@ -1,90 +0,0 @@ -[[serving-binary-files]] -= Serving Binary Files - -In order to serve binary files from the config server you will need to send an `Accept` header of `application/octet-stream`. - -[[spring-cloud-config-serving-plain-text-git-svn-native-backends]] -== Git, SVN, and Native Backends - -Consider the following example for a GIT or SVN repository or a native backend: - -==== -[source] ----- -application.yml -nginx.conf ----- -==== - -The `nginx.conf` might resemble the following listing: - -==== -[source] ----- -server { - listen 80; - server_name ${nginx.server.name}; -} ----- -==== - -`application.yml` might resemble the following listing: - -==== -[source,yaml] ----- -nginx: - server: - name: example.com ---- -spring: - profiles: development -nginx: - server: - name: develop.com ----- -==== - -The `/sample/default/master/nginx.conf` resource might be as follows: - -==== -[source] ----- -server { - listen 80; - server_name example.com; -} ----- -==== - -`/sample/development/master/nginx.conf` might be as follows: - -==== -[source] ----- -server { - listen 80; - server_name develop.com; -} ----- -==== - -[[spring-cloud-config-serving-plain-text-aws-s3]] -== AWS S3 - -To enable serving plain text for AWS s3, the Config Server application needs to include a dependency on `io.awspring.cloud:spring-cloud-aws-context`. -For details on how to set up that dependency, see the -https://docs.awspring.io/spring-cloud-aws/docs/2.4.3/reference/html/index.html#spring-cloud-aws-maven-dependency-management[Spring Cloud AWS Reference Guide]. -In addition, when using Spring Cloud AWS with Spring Boot it is useful to include the https://docs.awspring.io/spring-cloud-aws/docs/2.4.3/reference/html/index.html#spring-boot-auto-configuration[auto-configuration dependency]. -Then you need to configure Spring Cloud AWS, as described in the -https://docs.awspring.io/spring-cloud-aws/docs/2.4.3/reference/html/index.html#configuring-credentials[Spring Cloud AWS Reference Guide]. - -[[decrypting-plain-text]] -== Decrypting Plain Text - -By default, encrypted values in plain text files are not decrypted. In order to enable decryption for plain text files, set `spring.cloud.config.server.encrypt.enabled=true` and `spring.cloud.config.server.encrypt.plainTextEncrypt=true` in `bootstrap.[yml|properties]` - -NOTE: Decrypting plain text files is only supported for YAML, JSON, and properties file extensions. - -If this feature is enabled, and an unsupported file extention is requested, any encrypted values in the file will not be decrypted. - diff --git a/docs/modules/ROOT/pages/spring-cloud-config/server/serving-encrypted-properties.adoc b/docs/modules/ROOT/pages/spring-cloud-config/server/serving-encrypted-properties.adoc deleted file mode 100644 index 754ebfe2..00000000 --- a/docs/modules/ROOT/pages/spring-cloud-config/server/serving-encrypted-properties.adoc +++ /dev/null @@ -1,8 +0,0 @@ -[[serving-encrypted-properties]] -= Serving Encrypted Properties -:page-section-summary-toc: 1 - -Sometimes you want the clients to decrypt the configuration locally, instead of doing it in the server. -In that case, if you provide the `encrypt.*` configuration to locate a key, you can still have `/encrypt` and `/decrypt` endpoints, but you need to explicitly switch off the decryption of outgoing properties by placing `spring.cloud.config.server.encrypt.enabled=false` in `bootstrap.[yml|properties]`. -If you do not care about the endpoints, it should work if you do not configure either the key or the enabled flag. - diff --git a/docs/modules/ROOT/pages/spring-cloud-config/server/serving-plain-text.adoc b/docs/modules/ROOT/pages/spring-cloud-config/server/serving-plain-text.adoc deleted file mode 100644 index 49c4c619..00000000 --- a/docs/modules/ROOT/pages/spring-cloud-config/server/serving-plain-text.adoc +++ /dev/null @@ -1,26 +0,0 @@ -[[serving-plain-text]] -= Serving Plain Text -:page-section-summary-toc: 1 - -Instead of using the `Environment` abstraction (or one of the alternative representations of it in YAML or properties format), your applications might need generic plain-text configuration files that are tailored to their environment. -The Config Server provides these through an additional endpoint at `/{application}/{profile}/{label}/{path}`, where `application`, `profile`, and `label` have the same meaning as the regular environment endpoint, but `path` is a path to a file name (such as `log.xml`). -The source files for this endpoint are located in the same way as for the environment endpoints. -The same search path is used for properties and YAML files. -However, instead of aggregating all matching resources, only the first one to match is returned. - -After a resource is located, placeholders in the normal format (`${...}`) are resolved by using the effective `Environment` for the supplied application name, profile, and label. -In this way, the resource endpoint is tightly integrated with the environment endpoints. - -NOTE: As with the source files for environment configuration, the `profile` is used to resolve the file name. -So, if you want a profile-specific file, `/\*/development/*/logback.xml` can be resolved by a file called `logback-development.xml` (in preference to `logback.xml`). - -NOTE: If you do not want to supply the `label` and let the server use the default label, you can supply a `useDefaultLabel` request parameter. -Consequently, the preceding example for the `default` profile could be `/sample/default/nginx.conf?useDefaultLabel`. - -At present, Spring Cloud Config can serve plaintext for git, SVN, native backends, and AWS S3. -The support for git, SVN, and native backends is identical. AWS S3 works a bit differently. -The following sections show how each one works: - -* xref:spring-cloud-config/server/serving-binary-files.adoc#spring-cloud-config-serving-plain-text-git-svn-native-backends[Git, SVN, and Native Backends] -* xref:spring-cloud-config/server/serving-binary-files.adoc#spring-cloud-config-serving-plain-text-aws-s3[AWS S3] - diff --git a/docs/modules/ROOT/pages/spring-cloud-config/server/using-multiple-keys-and-key-rotation.adoc b/docs/modules/ROOT/pages/spring-cloud-config/server/using-multiple-keys-and-key-rotation.adoc deleted file mode 100644 index d69835fd..00000000 --- a/docs/modules/ROOT/pages/spring-cloud-config/server/using-multiple-keys-and-key-rotation.adoc +++ /dev/null @@ -1,26 +0,0 @@ -[[using-multiple-keys-and-key-rotation]] -= Using Multiple Keys and Key Rotation -:page-section-summary-toc: 1 - -In addition to the `{cipher}` prefix in encrypted property values, the Config Server looks for zero or more `{name:value}` prefixes before the start of the (Base64 encoded) cipher text. -The keys are passed to a `TextEncryptorLocator`, which can do whatever logic it needs to locate a `TextEncryptor` for the cipher. -If you have configured a keystore (`encrypt.keystore.location`), the default locator looks for keys with aliases supplied by the `key` prefix, with a cipher text like resembling the following: - -[source,yaml] ----- -foo: - bar: `{cipher}{key:testkey}...` ----- - -The locator looks for a key named "testkey". -A secret can also be supplied by using a `{secret:...}` value in the prefix. -However, if it is not supplied, the default is to use the keystore password (which is what you get when you build a keystore and do not specify a secret). -If you do supply a secret, you should also encrypt the secret using a custom `SecretLocator`. - -When the keys are being used only to encrypt a few bytes of configuration data (that is, they are not being used elsewhere), key rotation is hardly ever necessary on cryptographic grounds. -However, you might occasionally need to change the keys (for example, in the event of a security breach). -In that case, all the clients would need to change their source config files (for example, in git) and use a new `{key:...}` prefix in all the ciphers. -Note that the clients need to first check that the key alias is available in the Config Server keystore. - -TIP: If you want to let the Config Server handle all encryption as well as decryption, the `{name:value}` prefixes can also be added as plain text posted to the `/encrypt` endpoint. - diff --git a/docs/pom.xml b/docs/pom.xml deleted file mode 100644 index 078921c1..00000000 --- a/docs/pom.xml +++ /dev/null @@ -1,100 +0,0 @@ - - - 4.0.0 - org.springframework.cloud - spring-cloud-config-docs - - org.springframework.cloud - spring-cloud-config - 4.1.0-SNAPSHOT - .. - - - jar - Spring Cloud Config Docs - Spring Cloud Docs - - spring-cloud-config - ${basedir}/.. - deploy - - none - spring.cloud.config.* - - - 1.0.0 - ${maven.multiModuleProjectDirectory}/spring-cloud-config-server/ - .* - ${maven.multiModuleProjectDirectory}/target/ - - - - ${project.groupId} - spring-cloud-starter-config - - - - src/main/asciidoc - - - - docs - - - - pl.project13.maven - git-commit-id-plugin - - - maven-dependency-plugin - - - maven-resources-plugin - - - org.codehaus.mojo - exec-maven-plugin - - - generate-docs - prepare-package - - java - - - io.micrometer.docs.DocsGeneratorCommand - true - - ${micrometer-docs-generator.inputPath} - ${micrometer-docs-generator.inclusionPattern} - ${micrometer-docs-generator.outputPath} - - - - - - - io.micrometer - micrometer-docs-generator - ${micrometer-docs-generator.version} - jar - - - - - org.asciidoctor - asciidoctor-maven-plugin - - - maven-antrun-plugin - - - maven-deploy-plugin - - - - - - diff --git a/docs/src/main/asciidoc/ghpages.sh b/docs/src/main/asciidoc/ghpages.sh deleted file mode 100755 index d18aa88d..00000000 --- a/docs/src/main/asciidoc/ghpages.sh +++ /dev/null @@ -1,330 +0,0 @@ -#!/bin/bash -x - -set -e - -# Set default props like MAVEN_PATH, ROOT_FOLDER etc. -function set_default_props() { - # The script should be run from the root folder - ROOT_FOLDER=`pwd` - echo "Current folder is ${ROOT_FOLDER}" - - if [[ ! -e "${ROOT_FOLDER}/.git" ]]; then - echo "You're not in the root folder of the project!" - exit 1 - fi - - # Prop that will let commit the changes - COMMIT_CHANGES="no" - MAVEN_PATH=${MAVEN_PATH:-} - echo "Path to Maven is [${MAVEN_PATH}]" - REPO_NAME=${PWD##*/} - echo "Repo name is [${REPO_NAME}]" - SPRING_CLOUD_STATIC_REPO=${SPRING_CLOUD_STATIC_REPO:-git@github.com:spring-cloud/spring-cloud-static.git} - echo "Spring Cloud Static repo is [${SPRING_CLOUD_STATIC_REPO}" -} - -# Check if gh-pages exists and docs have been built -function check_if_anything_to_sync() { - git remote set-url --push origin `git config remote.origin.url | sed -e 's/^git:/https:/'` - - if ! (git remote set-branches --add origin gh-pages && git fetch -q); then - echo "No gh-pages, so not syncing" - exit 0 - fi - - if ! [ -d docs/target/generated-docs ] && ! [ "${BUILD}" == "yes" ]; then - echo "No gh-pages sources in docs/target/generated-docs, so not syncing" - exit 0 - fi -} - -function retrieve_current_branch() { - # Code getting the name of the current branch. For master we want to publish as we did until now - # https://stackoverflow.com/questions/1593051/how-to-programmatically-determine-the-current-checked-out-git-branch - # If there is a branch already passed will reuse it - otherwise will try to find it - CURRENT_BRANCH=${BRANCH} - if [[ -z "${CURRENT_BRANCH}" ]] ; then - CURRENT_BRANCH=$(git symbolic-ref -q HEAD) - CURRENT_BRANCH=${CURRENT_BRANCH##refs/heads/} - CURRENT_BRANCH=${CURRENT_BRANCH:-HEAD} - fi - echo "Current branch is [${CURRENT_BRANCH}]" - git checkout ${CURRENT_BRANCH} || echo "Failed to check the branch... continuing with the script" -} - -# Switches to the provided value of the release version. We always prefix it with `v` -function switch_to_tag() { - git checkout v${VERSION} -} - -# Build the docs if switch is on -function build_docs_if_applicable() { - if [[ "${BUILD}" == "yes" ]] ; then - ./mvnw clean install -P docs -pl docs -DskipTests - fi -} - -# Get the name of the `docs.main` property -# Get allowed branches - assumes that a `docs` module is available under `docs` profile -function retrieve_doc_properties() { - MAIN_ADOC_VALUE=$("${MAVEN_PATH}"mvn -q \ - -Dexec.executable="echo" \ - -Dexec.args='${docs.main}' \ - --non-recursive \ - org.codehaus.mojo:exec-maven-plugin:1.3.1:exec) - echo "Extracted 'main.adoc' from Maven build [${MAIN_ADOC_VALUE}]" - - - ALLOW_PROPERTY=${ALLOW_PROPERTY:-"docs.allowed.branches"} - ALLOWED_BRANCHES_VALUE=$("${MAVEN_PATH}"mvn -q \ - -Dexec.executable="echo" \ - -Dexec.args="\${${ALLOW_PROPERTY}}" \ - org.codehaus.mojo:exec-maven-plugin:1.3.1:exec \ - -P docs \ - -pl docs) - echo "Extracted '${ALLOW_PROPERTY}' from Maven build [${ALLOWED_BRANCHES_VALUE}]" -} - -# Stash any outstanding changes -function stash_changes() { - git diff-index --quiet HEAD && dirty=$? || (echo "Failed to check if the current repo is dirty. Assuming that it is." && dirty="1") - if [ "$dirty" != "0" ]; then git stash; fi -} - -# Switch to gh-pages branch to sync it with current branch -function add_docs_from_target() { - local DESTINATION_REPO_FOLDER - if [[ -z "${DESTINATION}" && -z "${CLONE}" ]] ; then - DESTINATION_REPO_FOLDER=${ROOT_FOLDER} - elif [[ "${CLONE}" == "yes" ]]; then - mkdir -p ${ROOT_FOLDER}/target - local clonedStatic=${ROOT_FOLDER}/target/spring-cloud-static - if [[ ! -e "${clonedStatic}/.git" ]]; then - echo "Cloning Spring Cloud Static to target" - git clone ${SPRING_CLOUD_STATIC_REPO} ${clonedStatic} && git checkout gh-pages - else - echo "Spring Cloud Static already cloned - will pull changes" - cd ${clonedStatic} && git checkout gh-pages && git pull origin gh-pages - fi - DESTINATION_REPO_FOLDER=${clonedStatic}/${REPO_NAME} - mkdir -p ${DESTINATION_REPO_FOLDER} - else - if [[ ! -e "${DESTINATION}/.git" ]]; then - echo "[${DESTINATION}] is not a git repository" - exit 1 - fi - DESTINATION_REPO_FOLDER=${DESTINATION}/${REPO_NAME} - mkdir -p ${DESTINATION_REPO_FOLDER} - echo "Destination was provided [${DESTINATION}]" - fi - cd ${DESTINATION_REPO_FOLDER} - git checkout gh-pages - git pull origin gh-pages - - # Add git branches - ################################################################### - if [[ -z "${VERSION}" ]] ; then - copy_docs_for_current_version - else - copy_docs_for_provided_version - fi - commit_changes_if_applicable -} - - -# Copies the docs by using the retrieved properties from Maven build -function copy_docs_for_current_version() { - if [[ "${CURRENT_BRANCH}" == "master" ]] ; then - echo -e "Current branch is master - will copy the current docs only to the root folder" - for f in docs/target/generated-docs/*; do - file=${f#docs/target/generated-docs/*} - if ! git ls-files -i -o --exclude-standard --directory | grep -q ^$file$; then - # Not ignored... - cp -rf $f ${ROOT_FOLDER}/ - git add -A ${ROOT_FOLDER}/$file - fi - done - COMMIT_CHANGES="yes" - else - echo -e "Current branch is [${CURRENT_BRANCH}]" - # https://stackoverflow.com/questions/29300806/a-bash-script-to-check-if-a-string-is-present-in-a-comma-separated-list-of-strin - if [[ ",${ALLOWED_BRANCHES_VALUE}," = *",${CURRENT_BRANCH},"* ]] ; then - mkdir -p ${ROOT_FOLDER}/${CURRENT_BRANCH} - echo -e "Branch [${CURRENT_BRANCH}] is allowed! Will copy the current docs to the [${CURRENT_BRANCH}] folder" - for f in docs/target/generated-docs/*; do - file=${f#docs/target/generated-docs/*} - if ! git ls-files -i -o --exclude-standard --directory | grep -q ^$file$; then - # Not ignored... - # We want users to access 1.0.0.RELEASE/ instead of 1.0.0.RELEASE/spring-cloud.sleuth.html - if [[ "${file}" == "${MAIN_ADOC_VALUE}.html" ]] ; then - # We don't want to copy the spring-cloud-sleuth.html - # we want it to be converted to index.html - cp -rf $f ${ROOT_FOLDER}/${CURRENT_BRANCH}/index.html - git add -A ${ROOT_FOLDER}/${CURRENT_BRANCH}/index.html - else - cp -rf $f ${ROOT_FOLDER}/${CURRENT_BRANCH} - git add -A ${ROOT_FOLDER}/${CURRENT_BRANCH}/$file - fi - fi - done - COMMIT_CHANGES="yes" - else - echo -e "Branch [${CURRENT_BRANCH}] is not on the allow list! Check out the Maven [${ALLOW_PROPERTY}] property in - [docs] module available under [docs] profile. Won't commit any changes to gh-pages for this branch." - fi - fi -} - -# Copies the docs by using the explicitly provided version -function copy_docs_for_provided_version() { - local FOLDER=${DESTINATION_REPO_FOLDER}/${VERSION} - mkdir -p ${FOLDER} - echo -e "Current tag is [v${VERSION}] Will copy the current docs to the [${FOLDER}] folder" - for f in ${ROOT_FOLDER}/docs/target/generated-docs/*; do - file=${f#${ROOT_FOLDER}/docs/target/generated-docs/*} - copy_docs_for_branch ${file} ${FOLDER} - done - COMMIT_CHANGES="yes" - CURRENT_BRANCH="v${VERSION}" -} - -# Copies the docs from target to the provided destination -# Params: -# $1 - file from target -# $2 - destination to which copy the files -function copy_docs_for_branch() { - local file=$1 - local destination=$2 - if ! git ls-files -i -o --exclude-standard --directory | grep -q ^${file}$; then - # Not ignored... - # We want users to access 1.0.0.RELEASE/ instead of 1.0.0.RELEASE/spring-cloud.sleuth.html - if [[ ("${file}" == "${MAIN_ADOC_VALUE}.html") || ("${file}" == "${REPO_NAME}.html") ]] ; then - # We don't want to copy the spring-cloud-sleuth.html - # we want it to be converted to index.html - cp -rf $f ${destination}/index.html - git add -A ${destination}/index.html - else - cp -rf $f ${destination} - git add -A ${destination}/$file - fi - fi -} - -function commit_changes_if_applicable() { - if [[ "${COMMIT_CHANGES}" == "yes" ]] ; then - COMMIT_SUCCESSFUL="no" - git commit -a -m "Sync docs from ${CURRENT_BRANCH} to gh-pages" && COMMIT_SUCCESSFUL="yes" || echo "Failed to commit changes" - - # Uncomment the following push if you want to auto push to - # the gh-pages branch whenever you commit to master locally. - # This is a little extreme. Use with care! - ################################################################### - if [[ "${COMMIT_SUCCESSFUL}" == "yes" ]] ; then - git push origin gh-pages - fi - fi -} - -# Switch back to the previous branch and exit block -function checkout_previous_branch() { - # If -version was provided we need to come back to root project - cd ${ROOT_FOLDER} - git checkout ${CURRENT_BRANCH} || echo "Failed to check the branch... continuing with the script" - if [ "$dirty" != "0" ]; then git stash pop; fi - exit 0 -} - -# Assert if properties have been properly passed -function assert_properties() { -echo "VERSION [${VERSION}], DESTINATION [${DESTINATION}], CLONE [${CLONE}]" -if [[ "${VERSION}" != "" && (-z "${DESTINATION}" && -z "${CLONE}") ]] ; then echo "Version was set but destination / clone was not!"; exit 1;fi -if [[ ("${DESTINATION}" != "" && "${CLONE}" != "") && -z "${VERSION}" ]] ; then echo "Destination / clone was set but version was not!"; exit 1;fi -if [[ "${DESTINATION}" != "" && "${CLONE}" == "yes" ]] ; then echo "Destination and clone was set. Pick one!"; exit 1;fi -} - -# Prints the usage -function print_usage() { -cat </` -- if the destination switch is passed (-d) then the script will check if the provided dir is a git repo and then will - switch to gh-pages of that repo and copy the generated docs to `docs//` - -USAGE: - -You can use the following options: - --v|--version - the script will apply the whole procedure for a particular library version --d|--destination - the root of destination folder where the docs should be copied. You have to use the full path. - E.g. point to spring-cloud-static folder. Can't be used with (-c) --b|--build - will run the standard build process after checking out the branch --c|--clone - will automatically clone the spring-cloud-static repo instead of providing the destination. - Obviously can't be used with (-d) - -EOF -} - - -# ========================================== -# ____ ____ _____ _____ _____ _______ -# / ____|/ ____| __ \|_ _| __ \__ __| -# | (___ | | | |__) | | | | |__) | | | -# \___ \| | | _ / | | | ___/ | | -# ____) | |____| | \ \ _| |_| | | | -# |_____/ \_____|_| \_\_____|_| |_| -# -# ========================================== - -while [[ $# > 0 ]] -do -key="$1" -case ${key} in - -v|--version) - VERSION="$2" - shift # past argument - ;; - -d|--destination) - DESTINATION="$2" - shift # past argument - ;; - -b|--build) - BUILD="yes" - ;; - -c|--clone) - CLONE="yes" - ;; - -h|--help) - print_usage - exit 0 - ;; - *) - echo "Invalid option: [$1]" - print_usage - exit 1 - ;; -esac -shift # past argument or value -done - -assert_properties -set_default_props -check_if_anything_to_sync -if [[ -z "${VERSION}" ]] ; then - retrieve_current_branch -else - switch_to_tag -fi -build_docs_if_applicable -retrieve_doc_properties -stash_changes -add_docs_from_target -checkout_previous_branch diff --git a/mvnw b/mvnw index 675cb6b0..41c0f0c2 100755 --- a/mvnw +++ b/mvnw @@ -8,7 +8,7 @@ # "License"); you may not use this file except in compliance # with the License. You may obtain a copy of the License at # -# https://www.apache.org/licenses/LICENSE-2.0 +# 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 @@ -19,7 +19,7 @@ # ---------------------------------------------------------------------------- # ---------------------------------------------------------------------------- -# Maven2 Start Up Batch script +# Maven Start Up Batch script # # Required ENV vars: # ------------------ @@ -54,38 +54,16 @@ case "`uname`" in CYGWIN*) cygwin=true ;; MINGW*) mingw=true;; Darwin*) darwin=true - # - # Look for the Apple JDKs first to preserve the existing behaviour, and then look - # for the new JDKs provided by Oracle. - # - if [ -z "$JAVA_HOME" ] && [ -L /System/Library/Frameworks/JavaVM.framework/Versions/CurrentJDK ] ; then - # - # Apple JDKs - # - export JAVA_HOME=/System/Library/Frameworks/JavaVM.framework/Versions/CurrentJDK/Home - fi - - if [ -z "$JAVA_HOME" ] && [ -L /System/Library/Java/JavaVirtualMachines/CurrentJDK ] ; then - # - # Apple JDKs - # - export JAVA_HOME=/System/Library/Java/JavaVirtualMachines/CurrentJDK/Contents/Home - fi - - if [ -z "$JAVA_HOME" ] && [ -L "/Library/Java/JavaVirtualMachines/CurrentJDK" ] ; then - # - # Oracle JDKs - # - export JAVA_HOME=/Library/Java/JavaVirtualMachines/CurrentJDK/Contents/Home - fi - - if [ -z "$JAVA_HOME" ] && [ -x "/usr/libexec/java_home" ]; then - # - # Apple JDKs - # - export JAVA_HOME=`/usr/libexec/java_home` - fi - ;; + # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home + # See https://developer.apple.com/library/mac/qa/qa1170/_index.html + if [ -z "$JAVA_HOME" ]; then + if [ -x "/usr/libexec/java_home" ]; then + export JAVA_HOME="`/usr/libexec/java_home`" + else + export JAVA_HOME="/Library/Java/Home" + fi + fi + ;; esac if [ -z "$JAVA_HOME" ] ; then @@ -130,13 +108,12 @@ if $cygwin ; then CLASSPATH=`cygpath --path --unix "$CLASSPATH"` fi -# For Migwn, ensure paths are in UNIX format before anything is touched +# For Mingw, ensure paths are in UNIX format before anything is touched if $mingw ; then [ -n "$M2_HOME" ] && M2_HOME="`(cd "$M2_HOME"; pwd)`" [ -n "$JAVA_HOME" ] && JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`" - # TODO classpath? fi if [ -z "$JAVA_HOME" ]; then @@ -184,27 +161,28 @@ fi CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher -# For Cygwin, switch paths to Windows format before running java -if $cygwin; then - [ -n "$M2_HOME" ] && - M2_HOME=`cygpath --path --windows "$M2_HOME"` - [ -n "$JAVA_HOME" ] && - JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"` - [ -n "$CLASSPATH" ] && - CLASSPATH=`cygpath --path --windows "$CLASSPATH"` -fi - # traverses directory structure from process work directory to filesystem root # first directory with .mvn subdirectory is considered project base directory find_maven_basedir() { - local basedir=$(pwd) - local wdir=$(pwd) + + if [ -z "$1" ] + then + echo "Path not specified to find_maven_basedir" + return 1 + fi + + basedir="$1" + wdir="$1" while [ "$wdir" != '/' ] ; do if [ -d "$wdir"/.mvn ] ; then basedir=$wdir break fi - wdir=$(cd "$wdir/.."; pwd) + # workaround for JBEAP-8937 (on Solaris 10/Sparc) + if [ -d "${wdir}" ]; then + wdir=`cd "$wdir/.."; pwd` + fi + # end of workaround done echo "${basedir}" } @@ -216,9 +194,108 @@ concat_lines() { fi } -export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-$(find_maven_basedir)} +BASE_DIR=`find_maven_basedir "$(pwd)"` +if [ -z "$BASE_DIR" ]; then + exit 1; +fi + +########################################################################################## +# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central +# This allows using the maven wrapper in projects that prohibit checking in binary data. +########################################################################################## +if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found .mvn/wrapper/maven-wrapper.jar" + fi +else + if [ "$MVNW_VERBOSE" = true ]; then + echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..." + fi + if [ -n "$MVNW_REPOURL" ]; then + jarUrl="$MVNW_REPOURL/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" + else + jarUrl="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" + fi + while IFS="=" read key value; do + case "$key" in (wrapperUrl) jarUrl="$value"; break ;; + esac + done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties" + if [ "$MVNW_VERBOSE" = true ]; then + echo "Downloading from: $jarUrl" + fi + wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" + if $cygwin; then + wrapperJarPath=`cygpath --path --windows "$wrapperJarPath"` + fi + + if command -v wget > /dev/null; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found wget ... using wget" + fi + if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then + wget "$jarUrl" -O "$wrapperJarPath" + else + wget --http-user=$MVNW_USERNAME --http-password=$MVNW_PASSWORD "$jarUrl" -O "$wrapperJarPath" + fi + elif command -v curl > /dev/null; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found curl ... using curl" + fi + if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then + curl -o "$wrapperJarPath" "$jarUrl" -f + else + curl --user $MVNW_USERNAME:$MVNW_PASSWORD -o "$wrapperJarPath" "$jarUrl" -f + fi + + else + if [ "$MVNW_VERBOSE" = true ]; then + echo "Falling back to using Java to download" + fi + javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java" + # For Cygwin, switch paths to Windows format before running javac + if $cygwin; then + javaClass=`cygpath --path --windows "$javaClass"` + fi + if [ -e "$javaClass" ]; then + if [ ! -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then + if [ "$MVNW_VERBOSE" = true ]; then + echo " - Compiling MavenWrapperDownloader.java ..." + fi + # Compiling the Java class + ("$JAVA_HOME/bin/javac" "$javaClass") + fi + if [ -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then + # Running the downloader + if [ "$MVNW_VERBOSE" = true ]; then + echo " - Running MavenWrapperDownloader.java ..." + fi + ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR") + fi + fi + fi +fi +########################################################################################## +# End of extension +########################################################################################## + +export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"} +if [ "$MVNW_VERBOSE" = true ]; then + echo $MAVEN_PROJECTBASEDIR +fi MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" +# For Cygwin, switch paths to Windows format before running java +if $cygwin; then + [ -n "$M2_HOME" ] && + M2_HOME=`cygpath --path --windows "$M2_HOME"` + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --windows "$CLASSPATH"` + [ -n "$MAVEN_PROJECTBASEDIR" ] && + MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"` +fi + # Provide a "standardized" way to retrieve the CLI args that will # work with both Windows and non-Windows executions. MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $@" @@ -226,28 +303,8 @@ export MAVEN_CMD_LINE_ARGS WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain -echo "Running version check" -VERSION=$( sed '\!//' -e 's!.*$!!' ) -echo "The found version is [${VERSION}]" - -if echo $VERSION | egrep -q 'M|RC'; then - echo Activating \"milestone\" profile for version=\"$VERSION\" - echo $MAVEN_ARGS | grep -q milestone || MAVEN_ARGS="$MAVEN_ARGS -Pmilestone" -else - echo Deactivating \"milestone\" profile for version=\"$VERSION\" - echo $MAVEN_ARGS | grep -q milestone && MAVEN_ARGS=$(echo $MAVEN_ARGS | sed -e 's/-Pmilestone//') -fi - -if echo $VERSION | egrep -q 'RELEASE'; then - echo Activating \"central\" profile for version=\"$VERSION\" - echo $MAVEN_ARGS | grep -q milestone || MAVEN_ARGS="$MAVEN_ARGS -Pcentral" -else - echo Deactivating \"central\" profile for version=\"$VERSION\" - echo $MAVEN_ARGS | grep -q central && MAVEN_ARGS=$(echo $MAVEN_ARGS | sed -e 's/-Pcentral//') -fi - exec "$JAVACMD" \ $MAVEN_OPTS \ -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ - ${WRAPPER_LAUNCHER} ${MAVEN_ARGS} "$@" \ No newline at end of file + ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" diff --git a/mvnw.cmd b/mvnw.cmd index 7ecd01d8..86115719 100644 --- a/mvnw.cmd +++ b/mvnw.cmd @@ -7,7 +7,7 @@ @REM "License"); you may not use this file except in compliance @REM with the License. You may obtain a copy of the License at @REM -@REM https://www.apache.org/licenses/LICENSE-2.0 +@REM http://www.apache.org/licenses/LICENSE-2.0 @REM @REM Unless required by applicable law or agreed to in writing, @REM software distributed under the License is distributed on an @@ -18,7 +18,7 @@ @REM ---------------------------------------------------------------------------- @REM ---------------------------------------------------------------------------- -@REM Maven2 Start Up Batch script +@REM Maven Start Up Batch script @REM @REM Required ENV vars: @REM JAVA_HOME - location of a JDK home dir @@ -26,7 +26,7 @@ @REM Optional ENV vars @REM M2_HOME - location of maven2's installed home dir @REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands -@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a key stroke before ending +@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a keystroke before ending @REM MAVEN_OPTS - parameters passed to the Java VM when running Maven @REM e.g. to debug Maven itself, use @REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 @@ -35,7 +35,9 @@ @REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on' @echo off -@REM enable echoing my setting MAVEN_BATCH_ECHO to 'on' +@REM set title of command window +title %0 +@REM enable echoing by setting MAVEN_BATCH_ECHO to 'on' @if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO% @REM set %HOME% to equivalent of $HOME @@ -80,8 +82,6 @@ goto error :init -set MAVEN_CMD_LINE_ARGS=%* - @REM Find the project base dir, i.e. the directory that contains the folder ".mvn". @REM Fallback to current working directory if not found. @@ -117,11 +117,48 @@ for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do s :endReadAdditionalConfig SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" - -set WRAPPER_JAR="".\.mvn\wrapper\maven-wrapper.jar"" +set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar" set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain -%MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CMD_LINE_ARGS% +set DOWNLOAD_URL="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" + +FOR /F "tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO ( + IF "%%A"=="wrapperUrl" SET DOWNLOAD_URL=%%B +) + +@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central +@REM This allows using the maven wrapper in projects that prohibit checking in binary data. +if exist %WRAPPER_JAR% ( + if "%MVNW_VERBOSE%" == "true" ( + echo Found %WRAPPER_JAR% + ) +) else ( + if not "%MVNW_REPOURL%" == "" ( + SET DOWNLOAD_URL="%MVNW_REPOURL%/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" + ) + if "%MVNW_VERBOSE%" == "true" ( + echo Couldn't find %WRAPPER_JAR%, downloading it ... + echo Downloading from: %DOWNLOAD_URL% + ) + + powershell -Command "&{"^ + "$webclient = new-object System.Net.WebClient;"^ + "if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^ + "$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^ + "}"^ + "[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%DOWNLOAD_URL%', '%WRAPPER_JAR%')"^ + "}" + if "%MVNW_VERBOSE%" == "true" ( + echo Finished downloading %WRAPPER_JAR% + ) +) +@REM End of extension + +@REM Provide a "standardized" way to retrieve the CLI args that will +@REM work with both Windows and non-Windows executions. +set MAVEN_CMD_LINE_ARGS=%* + +%MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %* if ERRORLEVEL 1 goto error goto end diff --git a/pom.xml b/pom.xml index 41706394..387c74ae 100644 --- a/pom.xml +++ b/pom.xml @@ -1,269 +1,70 @@ - - + + + 4.0.0 + org.springframework.cloud - spring-cloud-config - 4.1.0-SNAPSHOT - pom - Spring Cloud Config - Spring Cloud Config - https://projects.spring.io/spring-cloud/ - - org.springframework.cloud - spring-cloud-build - 4.1.0-SNAPSHOT - - + spring-cloud-config-docs-build + 0.0.1-SNAPSHOT + + Spring Cloud Config Docs Build + Builds Spring Cloud Config Docs. + https://spring.io/projects/spring-cloud-config - https://github.com/spring-cloud/spring-cloud-config - scm:git:git://github.com/spring-cloud/spring-cloud-config.git + scm:git:https://github.com/spring-cloud/spring-cloud-config.git - scm:git:ssh://git@github.com/spring-cloud/spring-cloud-config.git + scm:git:git@github.com:spring-cloud/spring-cloud-config.git - HEAD + https://github.com/spring-cloud/spring-cloud-config + + https://github.com/spring-cloud/spring-cloud-config/issues + + - config - 4.1.0-SNAPSHOT - 2.17.195 - v1-rev20201112-1.30.10 - 1.17.3 - 2.31.0 - 3.0.0 - true - true - - true - + 0.0.3 - - spring-cloud-config-dependencies - spring-cloud-config-client - spring-cloud-config-server - spring-cloud-config-monitor - spring-cloud-config-sample - spring-cloud-starter-config - spring-cloud-config-client-tls-tests - docs - - - - - org.springframework.cloud - spring-cloud-config-dependencies - ${project.version} - pom - import - - - org.springframework.cloud - spring-cloud-commons-dependencies - ${spring-cloud-commons.version} - pom - import - - - org.springframework.cloud - spring-cloud-test-support - test - ${spring-cloud-commons.version} - - - software.amazon.awssdk - bom - ${aws-java-sdk.version} - pom - import - - - com.google.apis - google-api-services-iam - ${google-api-services-iam.version} - - - com.google.auth - google-auth-library-oauth2-http - 0.22.0 - - - com.google.cloud - google-cloud-secretmanager - 1.0.1 - - - com.google.apis - google-api-services-cloudresourcemanager - v1-rev20200210-1.30.9 - - - org.testcontainers - testcontainers-bom - ${testcontainers.version} - pom - import - - - com.github.tomakehurst - wiremock-jre8-standalone - ${wiremock.version} - - - io.awspring.cloud - spring-cloud-aws-dependencies - ${spring-cloud-aws.version} - pom - import - - - - - - spring - - - spring-snapshots - Spring Snapshots - https://repo.spring.io/snapshot - - true - - - false - - - - spring-milestones - Spring Milestones - https://repo.spring.io/milestone - - false - - - - spring-releases - Spring Releases - https://repo.spring.io/release - - false - - - - - - spring-snapshots - Spring Snapshots - https://repo.spring.io/snapshot - - true - - - false - - - - spring-milestones - Spring Milestones - https://repo.spring.io/milestone - - false - - - - spring-releases - Spring Releases - https://repo.spring.io/release - - false - - - - - - sonar - - - - org.jacoco - jacoco-maven-plugin - - - pre-unit-test - - prepare-agent - - - surefireArgLine - ${project.build.directory}/jacoco.exec - - - - - post-unit-test - test - - report - - - - ${project.build.directory}/jacoco.exec - - - - - - - org.apache.maven.plugins - maven-surefire-plugin - - - ${surefireArgLine} - - - - - - - withoutDockerTests - - - - maven-surefire-plugin - - DockerRequired - - - - - - + - org.codehaus.mojo - flatten-maven-plugin - - - org.apache.maven.plugins - maven-checkstyle-plugin - - - io.spring.javaformat - spring-javaformat-maven-plugin + io.spring.maven.antora + antora-maven-plugin + ${io.spring.maven.antora-version} + true + + + + + + + + 9d489079e5ec46dbb238909fee5c9c29 + WB1FQYI187 + springcloudconfig + + - - - - org.apache.maven.plugins - maven-checkstyle-plugin - - - + + + spring-snapshot + https://repo.spring.io/snapshot + + true + + + false + + + + spring-milestone + https://repo.spring.io/milestone + + diff --git a/sample.groovy b/sample.groovy deleted file mode 100644 index f798b269..00000000 --- a/sample.groovy +++ /dev/null @@ -1,10 +0,0 @@ -package demo - -@Grab('spring-cloud-starter') -@RestController -class Application { - @RequestMapping("/") - String home() { - "Hello World" - } -} diff --git a/spring-cloud-config-client-tls-tests/.flattened-pom.xml b/spring-cloud-config-client-tls-tests/.flattened-pom.xml new file mode 100644 index 00000000..1b5389fc --- /dev/null +++ b/spring-cloud-config-client-tls-tests/.flattened-pom.xml @@ -0,0 +1,190 @@ + + + 4.0.0 + + org.springframework.cloud + spring-cloud-config + 4.0.0-SNAPSHOT + .. + + org.springframework.cloud + spring-cloud-config-client-tls-tests + 4.0.0-SNAPSHOT + Spring Cloud Config Client TLS Tests + Spring Cloud Config Client TLS Tests + https://spring.io + + Pivotal Software, Inc. + https://www.spring.io + + + + Apache License, Version 2.0 + https://www.apache.org/licenses/LICENSE-2.0 + Copyright 2014-2021 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 + + https://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. + + + + + dsyer + Dave Syer + dsyer at pivotal.io + Pivotal Software, Inc. + https://www.spring.io + + lead + + + + sgibb + Spencer Gibb + sgibb at pivotal.io + Pivotal Software, Inc. + https://www.spring.io + + lead + + + + mgrzejszczak + Marcin Grzejszczak + mgrzejszczak at pivotal.io + Pivotal Software, Inc. + https://www.spring.io + + developer + + + + rbaxter + Ryan Baxter + rbaxter at pivotal.io + Pivotal Software, Inc. + https://www.spring.io + + developer + + + + omaciaszeksharma + Olga Maciaszek-Sharma + omaciaszeksharma at pivotal.io + Pivotal Software, Inc. + https://www.spring.io + + developer + + + + + scm:git:git://github.com/spring-cloud/spring-cloud-config.git/spring-cloud-config-client-tls-tests + scm:git:ssh://git@github.com/spring-cloud/spring-cloud-config.git/spring-cloud-config-client-tls-tests + https://github.com/spring-cloud/spring-cloud-config/spring-cloud-config-client-tls-tests + + + + org.springframework.cloud + spring-cloud-config-server + 4.0.0-SNAPSHOT + compile + + + org.springframework.cloud + spring-cloud-config-client + 4.0.0-SNAPSHOT + compile + + + org.springframework.boot + spring-boot + 3.0.0-SNAPSHOT + compile + + + org.springframework.boot + spring-boot-autoconfigure + 3.0.0-SNAPSHOT + compile + + + org.springframework.boot + spring-boot-starter-logging + 3.0.0-SNAPSHOT + compile + true + + + org.springframework.cloud + spring-cloud-commons + 4.0.0-SNAPSHOT + compile + + + org.springframework.cloud + spring-cloud-context + 4.0.0-SNAPSHOT + compile + + + org.springframework + spring-web + 6.0.0-SNAPSHOT + compile + + + com.fasterxml.jackson.core + jackson-annotations + 2.14.0-rc2 + compile + + + org.springframework.retry + spring-retry + 2.0.0-RC2 + compile + true + + + org.springframework.boot + spring-boot-starter-actuator + 3.0.0-SNAPSHOT + compile + true + + + org.springframework.boot + spring-boot-starter-aop + 3.0.0-SNAPSHOT + compile + true + + + com.fasterxml.jackson.core + jackson-databind + 2.14.0-rc2 + compile + + + org.springframework.boot + spring-boot-autoconfigure-processor + 3.0.0-SNAPSHOT + compile + true + + + diff --git a/spring-cloud-config-client-tls-tests/pom.xml b/spring-cloud-config-client-tls-tests/pom.xml deleted file mode 100644 index e0586f37..00000000 --- a/spring-cloud-config-client-tls-tests/pom.xml +++ /dev/null @@ -1,123 +0,0 @@ - - - 4.0.0 - spring-cloud-config-client-tls-tests - jar - Spring Cloud Config Client TLS Tests - - - org.springframework.cloud - spring-cloud-config - 4.1.0-SNAPSHOT - .. - - - https://spring.io - Spring Cloud Config Client TLS Tests - - - - org.springframework.cloud - spring-cloud-config-server - ${project.version} - - - org.springframework.cloud - spring-cloud-config-client - ${project.version} - - - - org.springframework.boot - spring-boot - - - org.springframework.boot - spring-boot-autoconfigure - - - org.springframework.boot - spring-boot-starter-logging - true - - - org.springframework.cloud - spring-cloud-commons - - - org.springframework.cloud - spring-cloud-context - - - org.springframework - spring-web - - - com.fasterxml.jackson.core - jackson-annotations - - - org.springframework.retry - spring-retry - true - - - org.springframework.boot - spring-boot-starter-actuator - true - - - org.springframework.boot - spring-boot-starter-aop - true - - - com.fasterxml.jackson.core - jackson-databind - - - org.springframework.boot - spring-boot-autoconfigure-processor - true - - - org.springframework.boot - spring-boot-starter-test - test - - - org.springframework.cloud - spring-cloud-test-support - test - - - org.junit.platform - junit-platform-launcher - test - - - org.bouncycastle - bcpkix-jdk15on - test - - - org.bouncycastle - bcpkix-jdk15on - 1.67 - test - - - - - - - maven-deploy-plugin - - true - - - - - - diff --git a/spring-cloud-config-client-tls-tests/src/test/java/org/springframework/cloud/config/client/tls/AbstractTlsSetup.java b/spring-cloud-config-client-tls-tests/src/test/java/org/springframework/cloud/config/client/tls/AbstractTlsSetup.java deleted file mode 100644 index e116ca7f..00000000 --- a/spring-cloud-config-client-tls-tests/src/test/java/org/springframework/cloud/config/client/tls/AbstractTlsSetup.java +++ /dev/null @@ -1,91 +0,0 @@ -/* - * Copyright 2013-2020 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 - * - * https://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.springframework.cloud.config.client.tls; - -import java.io.File; -import java.io.FileOutputStream; -import java.io.OutputStream; -import java.security.KeyStore; - -import org.junit.jupiter.api.BeforeAll; - -public abstract class AbstractTlsSetup { - - protected static final String KEY_STORE_PASSWORD = "test-key-store-password"; - - protected static final String KEY_PASSWORD = "test-key-password"; - - protected static final String WRONG_PASSWORD = "test-wrong-password"; - - protected static File caCert; - - protected static File wrongCaCert; - - protected static File serverCert; - - protected static File clientCert; - - protected static File wrongClientCert; - - @BeforeAll - public static void createCertificates() throws Exception { - KeyTool tool = new KeyTool(); - - KeyAndCert ca = tool.createCA("MyCA"); - KeyAndCert server = ca.sign("server"); - KeyAndCert client = ca.sign("client"); - - caCert = saveCert(ca); - serverCert = saveKeyAndCert(server); - clientCert = saveKeyAndCert(client); - - KeyAndCert wrongCa = tool.createCA("WrongCA"); - KeyAndCert wrongClient = wrongCa.sign("client"); - - wrongCaCert = saveCert(wrongCa); - wrongClientCert = saveKeyAndCert(wrongClient); - - System.setProperty("javax.net.ssl.trustStore", caCert.getAbsolutePath()); - System.setProperty("javax.net.ssl.trustStorePassword", KEY_STORE_PASSWORD); - } - - private static File saveKeyAndCert(KeyAndCert keyCert) throws Exception { - return saveKeyStore(keyCert.subject(), () -> keyCert.storeKeyAndCert(KEY_PASSWORD)); - } - - private static File saveCert(KeyAndCert keyCert) throws Exception { - return saveKeyStore(keyCert.subject(), () -> keyCert.storeCert()); - } - - private static File saveKeyStore(String prefix, KeyStoreSupplier func) throws Exception { - File result = File.createTempFile(prefix, ".p12"); - result.deleteOnExit(); - - try (OutputStream output = new FileOutputStream(result)) { - KeyStore store = func.createKeyStore(); - store.store(output, KEY_STORE_PASSWORD.toCharArray()); - } - return result; - } - - interface KeyStoreSupplier { - - KeyStore createKeyStore() throws Exception; - - } - -} diff --git a/spring-cloud-config-client-tls-tests/src/test/java/org/springframework/cloud/config/client/tls/AppRunner.java b/spring-cloud-config-client-tls-tests/src/test/java/org/springframework/cloud/config/client/tls/AppRunner.java deleted file mode 100644 index fcf595cd..00000000 --- a/spring-cloud-config-client-tls-tests/src/test/java/org/springframework/cloud/config/client/tls/AppRunner.java +++ /dev/null @@ -1,124 +0,0 @@ -/* - * Copyright 2013-2020 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 - * - * https://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.springframework.cloud.config.client.tls; - -import java.util.ArrayList; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; - -import org.springframework.boot.builder.SpringApplicationBuilder; -import org.springframework.context.ApplicationContext; -import org.springframework.context.ConfigurableApplicationContext; -import org.springframework.test.util.TestSocketUtils; - -public class AppRunner implements AutoCloseable { - - private Class appClass; - - private Map props; - - private ConfigurableApplicationContext app; - - public AppRunner(Class appClass) { - this.appClass = appClass; - props = new LinkedHashMap<>(); - } - - public void property(String key, String value) { - props.put(key, value); - } - - public void start() { - if (app == null) { - SpringApplicationBuilder builder = new SpringApplicationBuilder(appClass); - builder.properties("spring.jmx.enabled=false"); - builder.properties(String.format("server.port=%d", availabeTcpPort())); - builder.properties(props()); - - app = builder.build().run(); - } - } - - private int availabeTcpPort() { - return TestSocketUtils.findAvailableTcpPort(); - } - - private String[] props() { - List result = new ArrayList<>(); - - for (String key : props.keySet()) { - String value = props.get(key); - result.add(String.format("%s=%s", key, value)); - } - - return result.toArray(new String[0]); - } - - public void stop() { - if (app != null) { - app.stop(); - app = null; - } - } - - public ConfigurableApplicationContext app() { - return app; - } - - public String getProperty(String key) { - return app.getEnvironment().getProperty(key); - } - - public T getBean(Class type) { - return app.getBean(type); - } - - public ApplicationContext parent() { - return app.getParent(); - } - - public Map getParentBeans(Class type) { - return parent().getBeansOfType(type); - } - - public int port() { - if (app == null) { - throw new RuntimeException("App is not running."); - } - return app.getEnvironment().getProperty("server.port", Integer.class, -1); - } - - public String root() { - if (app == null) { - throw new RuntimeException("App is not running."); - } - - String protocol = tlsEnabled() ? "https" : "http"; - return String.format("%s://localhost:%d/", protocol, port()); - } - - private boolean tlsEnabled() { - return app.getEnvironment().getProperty("server.ssl.enabled", Boolean.class, false); - } - - @Override - public void close() { - stop(); - } - -} diff --git a/spring-cloud-config-client-tls-tests/src/test/java/org/springframework/cloud/config/client/tls/ConfigClientConfigDataTlsTests.java b/spring-cloud-config-client-tls-tests/src/test/java/org/springframework/cloud/config/client/tls/ConfigClientConfigDataTlsTests.java deleted file mode 100644 index a23c4445..00000000 --- a/spring-cloud-config-client-tls-tests/src/test/java/org/springframework/cloud/config/client/tls/ConfigClientConfigDataTlsTests.java +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright 2013-2020 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 - * - * https://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.springframework.cloud.config.client.tls; - -public class ConfigClientConfigDataTlsTests extends ConfigClientTlsTests { - - @Override - protected TlsConfigClientRunner createConfigClient(boolean optional) { - String importValue = "configserver:"; - if (optional) { - importValue = "optional:" + importValue; - } - return new TlsConfigClientRunner(TestApp.class, server, "spring.config.import", importValue); - } - - @Override - protected TlsConfigClientRunner createConfigClient() { - return new TlsConfigClientRunner(TestApp.class, server, "spring.config.import", "optional:configserver:"); - } - -} diff --git a/spring-cloud-config-client-tls-tests/src/test/java/org/springframework/cloud/config/client/tls/ConfigClientTlsTests.java b/spring-cloud-config-client-tls-tests/src/test/java/org/springframework/cloud/config/client/tls/ConfigClientTlsTests.java deleted file mode 100644 index 3dde00b6..00000000 --- a/spring-cloud-config-client-tls-tests/src/test/java/org/springframework/cloud/config/client/tls/ConfigClientTlsTests.java +++ /dev/null @@ -1,194 +0,0 @@ -/* - * Copyright 2013-2020 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 - * - * https://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.springframework.cloud.config.client.tls; - -import java.io.File; - -import org.apache.commons.logging.LogFactory; -import org.apache.hc.core5.http.io.SocketConfig; -import org.junit.jupiter.api.AfterAll; -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.Test; - -import org.springframework.boot.SpringBootConfiguration; -import org.springframework.boot.autoconfigure.EnableAutoConfiguration; -import org.springframework.cloud.config.client.ConfigClientProperties; -import org.springframework.cloud.config.client.ConfigClientRequestTemplateFactory; -import org.springframework.cloud.config.server.EnableConfigServer; - -import static org.assertj.core.api.Assertions.assertThat; - -public class ConfigClientTlsTests extends AbstractTlsSetup { - - protected static TlsConfigServerRunner server; - - @BeforeAll - public static void setupAll() throws Exception { - startConfigServer(); - } - - @AfterAll - public static void tearDownAll() { - stopConfigServer(); - } - - private static void startConfigServer() { - server = new TlsConfigServerRunner(TestConfigServer.class); - server.enableTls(); - server.setKeyStore(serverCert, KEY_STORE_PASSWORD, "server", KEY_PASSWORD); - server.setTrustStore(caCert, KEY_STORE_PASSWORD); - server.property("logging.level.org.springframework.cloud.config.server", "TRACE"); - - server.start(); - } - - private static void stopConfigServer() { - server.stop(); - } - - @Test - public void clientCertCanWork() { - try (TlsConfigClientRunner client = createConfigClient()) { - enableTlsClient(client); - client.property("logging.level.org.springframework.boot.context.config", "TRACE"); - client.property("logging.level.org.springframework.cloud.config.client", "DEBUG"); - client.start(); - assertThat(client.getProperty("dumb.key")).isEqualTo("dumb-value"); - } - } - - @Test - @SuppressWarnings({ "unchecked" }) - public void tlsSetsRequestReadTimeout() { - try (TlsConfigClientRunner client = createConfigClient()) { - enableTlsClient(client); - client.property("logging.level.org.springframework.boot.context.config", "TRACE"); - client.property("logging.level.org.springframework.cloud.config.client", "DEBUG"); - int timeoutMillis = (60 * 1000 * 3) + 5001; - client.property("spring.cloud.config.request-read-timeout", String.valueOf(timeoutMillis)); - client.start(); - ConfigClientProperties configClientProperties = client.app().getBean(ConfigClientProperties.class); - TestFactory factory = new TestFactory(configClientProperties); - SocketConfig.Builder socketBuilder = factory.getSocketBuilderForTls(); - assertThat(socketBuilder.build().getSoTimeout().toMilliseconds()).isEqualTo(timeoutMillis); - } - } - - @Test - public void tlsClientCanBeDisabled() { - try (TlsConfigClientRunner client = createConfigClient()) { - enableTlsClient(client); - client.property("spring.cloud.config.tls.enabled", "false"); - client.start(); - assertThat(client.getProperty("dumb.key")).isNull(); - } - } - - @Test - public void noCertCannotWork() { - try (TlsConfigClientRunner client = createConfigClient()) { - client.disableTls(); - client.start(); - assertThat(client.getProperty("dumb.key")).isNull(); - } - } - - @Test - public void wrongCertCannotWork() { - try (TlsConfigClientRunner client = createConfigClient()) { - enableTlsClient(client); - client.setKeyStore(wrongClientCert); - client.start(); - assertThat(client.getProperty("dumb.key")).isNull(); - } - } - - @Test - public void wrongPasswordCauseFailure() { - Assertions.assertThrows(IllegalStateException.class, () -> { - TlsConfigClientRunner client = createConfigClient(false); - enableTlsClient(client); - client.setKeyStore(clientCert, WRONG_PASSWORD, WRONG_PASSWORD); - client.start(); - }); - } - - @Test - public void nonExistKeyStoreCauseFailure() { - Assertions.assertThrows(IllegalStateException.class, () -> { - TlsConfigClientRunner client = createConfigClient(false); - enableTlsClient(client); - client.setKeyStore(new File("nonExistFile")); - client.start(); - }); - } - - @Test - public void wrongTrustStoreCannotWork() { - try (TlsConfigClientRunner client = createConfigClient()) { - enableTlsClient(client); - client.setTrustStore(wrongCaCert); - client.start(); - assertThat(client.getProperty("dumb.key")).isNull(); - } - } - - protected TlsConfigClientRunner createConfigClient(boolean optional) { - TlsConfigClientRunner runner = createConfigClient(); - if (!optional) { - runner.property("spring.cloud.config.fail-fast", "true"); - } - return runner; - } - - protected TlsConfigClientRunner createConfigClient() { - return new TlsConfigClientRunner(TestApp.class, server); - } - - private void enableTlsClient(TlsConfigClientRunner runner) { - runner.enableTls(); - runner.setKeyStore(clientCert, KEY_STORE_PASSWORD, KEY_PASSWORD); - runner.setTrustStore(caCert, KEY_STORE_PASSWORD); - } - - @SpringBootConfiguration - @EnableAutoConfiguration - public static class TestApp { - - } - - @SpringBootConfiguration - @EnableAutoConfiguration - @EnableConfigServer - public static class TestConfigServer { - - } - - static class TestFactory extends ConfigClientRequestTemplateFactory { - - TestFactory(ConfigClientProperties properties) { - super(LogFactory.getLog(TestFactory.class), properties); - } - - public SocketConfig.Builder getSocketBuilderForTls() { - return createSocketBuilderForTls(getProperties()); - } - - } - -} diff --git a/spring-cloud-config-client-tls-tests/src/test/java/org/springframework/cloud/config/client/tls/KeyAndCert.java b/spring-cloud-config-client-tls-tests/src/test/java/org/springframework/cloud/config/client/tls/KeyAndCert.java deleted file mode 100644 index bf01c900..00000000 --- a/spring-cloud-config-client-tls-tests/src/test/java/org/springframework/cloud/config/client/tls/KeyAndCert.java +++ /dev/null @@ -1,93 +0,0 @@ -/* - * Copyright 2013-2020 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 - * - * https://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.springframework.cloud.config.client.tls; - -import java.security.KeyPair; -import java.security.KeyStore; -import java.security.PrivateKey; -import java.security.PublicKey; -import java.security.cert.Certificate; -import java.security.cert.X509Certificate; - -public class KeyAndCert { - - private KeyPair keyPair; - - private X509Certificate certificate; - - public KeyAndCert(KeyPair keyPair, X509Certificate certificate) { - this.keyPair = keyPair; - this.certificate = certificate; - } - - public KeyPair keyPair() { - return keyPair; - } - - public PublicKey publicKey() { - return keyPair.getPublic(); - } - - public PrivateKey privateKey() { - return keyPair.getPrivate(); - } - - public X509Certificate certificate() { - return certificate; - } - - public String subject() { - String dn = certificate.getSubjectDN().getName(); - int index = dn.indexOf('='); - return dn.substring(index + 1); - } - - public KeyAndCert sign(String subject) throws Exception { - KeyTool tool = new KeyTool(); - return tool.signCertificate(subject, this); - } - - public KeyAndCert sign(KeyPair keyPair, String subject) throws Exception { - KeyTool tool = new KeyTool(); - return tool.signCertificate(keyPair, subject, this); - } - - public KeyStore storeKeyAndCert(String keyPassword) throws Exception { - KeyStore result = KeyStore.getInstance("PKCS12"); - result.load(null); - - result.setKeyEntry(subject(), keyPair.getPrivate(), keyPassword.toCharArray(), certChain()); - return result; - } - - private Certificate[] certChain() { - return new Certificate[] { certificate() }; - } - - public KeyStore storeCert() throws Exception { - return storeCert("PKCS12"); - } - - public KeyStore storeCert(String storeType) throws Exception { - KeyStore result = KeyStore.getInstance(storeType); - result.load(null); - - result.setCertificateEntry(subject(), certificate()); - return result; - } - -} diff --git a/spring-cloud-config-client-tls-tests/src/test/java/org/springframework/cloud/config/client/tls/KeyTool.java b/spring-cloud-config-client-tls-tests/src/test/java/org/springframework/cloud/config/client/tls/KeyTool.java deleted file mode 100644 index 5d21785b..00000000 --- a/spring-cloud-config-client-tls-tests/src/test/java/org/springframework/cloud/config/client/tls/KeyTool.java +++ /dev/null @@ -1,113 +0,0 @@ -/* - * Copyright 2013-2020 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 - * - * https://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.springframework.cloud.config.client.tls; - -import java.math.BigInteger; -import java.security.KeyPair; -import java.security.KeyPairGenerator; -import java.security.PrivateKey; -import java.security.PublicKey; -import java.security.SecureRandom; -import java.security.cert.X509Certificate; -import java.util.Date; - -import org.bouncycastle.asn1.DERSequence; -import org.bouncycastle.asn1.x500.X500Name; -import org.bouncycastle.asn1.x509.BasicConstraints; -import org.bouncycastle.asn1.x509.Extension; -import org.bouncycastle.asn1.x509.GeneralName; -import org.bouncycastle.asn1.x509.GeneralNames; -import org.bouncycastle.asn1.x509.KeyUsage; -import org.bouncycastle.cert.X509CertificateHolder; -import org.bouncycastle.cert.jcajce.JcaX509CertificateConverter; -import org.bouncycastle.cert.jcajce.JcaX509v3CertificateBuilder; -import org.bouncycastle.operator.ContentSigner; -import org.bouncycastle.operator.jcajce.JcaContentSignerBuilder; - -public class KeyTool { - - private static final long ONE_DAY = 1000L * 60L * 60L * 24L; - - private static final long TEN_YEARS = ONE_DAY * 365L * 10L; - - public KeyAndCert createCA(String ca) throws Exception { - KeyPair keyPair = createKeyPair(); - X509Certificate certificate = createCert(keyPair, ca); - return new KeyAndCert(keyPair, certificate); - } - - public KeyAndCert signCertificate(String subject, KeyAndCert signer) throws Exception { - return signCertificate(createKeyPair(), subject, signer); - } - - public KeyAndCert signCertificate(KeyPair keyPair, String subject, KeyAndCert signer) throws Exception { - X509Certificate certificate = createCert(keyPair.getPublic(), signer.privateKey(), signer.subject(), subject); - KeyAndCert result = new KeyAndCert(keyPair, certificate); - - return result; - } - - public KeyPair createKeyPair() throws Exception { - return createKeyPair(1024); - } - - public KeyPair createKeyPair(int keySize) throws Exception { - KeyPairGenerator gen = KeyPairGenerator.getInstance("RSA"); - gen.initialize(keySize, new SecureRandom()); - return gen.generateKeyPair(); - } - - public X509Certificate createCert(KeyPair keyPair, String ca) throws Exception { - JcaX509v3CertificateBuilder builder = certBuilder(keyPair.getPublic(), ca, ca); - builder.addExtension(Extension.keyUsage, true, new KeyUsage(KeyUsage.keyCertSign)); - builder.addExtension(Extension.basicConstraints, false, new BasicConstraints(true)); - - return signCert(builder, keyPair.getPrivate()); - } - - public X509Certificate createCert(PublicKey publicKey, PrivateKey privateKey, String issuer, String subject) - throws Exception { - JcaX509v3CertificateBuilder builder = certBuilder(publicKey, issuer, subject); - builder.addExtension(Extension.keyUsage, true, new KeyUsage(KeyUsage.digitalSignature)); - builder.addExtension(Extension.basicConstraints, false, new BasicConstraints(false)); - - GeneralName[] names = new GeneralName[] { new GeneralName(GeneralName.dNSName, "localhost") }; - builder.addExtension(Extension.subjectAlternativeName, false, GeneralNames.getInstance(new DERSequence(names))); - - return signCert(builder, privateKey); - } - - private JcaX509v3CertificateBuilder certBuilder(PublicKey publicKey, String issuer, String subject) { - X500Name issuerName = new X500Name(String.format("dc=%s", issuer)); - X500Name subjectName = new X500Name(String.format("dc=%s", subject)); - - long now = System.currentTimeMillis(); - BigInteger serialNum = BigInteger.valueOf(now); - Date notBefore = new Date(now - ONE_DAY); - Date notAfter = new Date(now + TEN_YEARS); - - return new JcaX509v3CertificateBuilder(issuerName, serialNum, notBefore, notAfter, subjectName, publicKey); - } - - private X509Certificate signCert(JcaX509v3CertificateBuilder builder, PrivateKey privateKey) throws Exception { - ContentSigner signer = new JcaContentSignerBuilder("SHA256WithRSA").build(privateKey); - X509CertificateHolder holder = builder.build(signer); - - return new JcaX509CertificateConverter().getCertificate(holder); - } - -} diff --git a/spring-cloud-config-client-tls-tests/src/test/java/org/springframework/cloud/config/client/tls/TlsConfigClientRunner.java b/spring-cloud-config-client-tls-tests/src/test/java/org/springframework/cloud/config/client/tls/TlsConfigClientRunner.java deleted file mode 100644 index 6fcf223c..00000000 --- a/spring-cloud-config-client-tls-tests/src/test/java/org/springframework/cloud/config/client/tls/TlsConfigClientRunner.java +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Copyright 2013-2020 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 - * - * https://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.springframework.cloud.config.client.tls; - -import java.io.File; - -public class TlsConfigClientRunner extends AppRunner { - - public TlsConfigClientRunner(Class appClass, AppRunner server) { - this(appClass, server, "spring.config.use-legacy-processing", "true"); - } - - public TlsConfigClientRunner(Class appClass, AppRunner server, String importKey, String importValue) { - super(appClass); - - property("spring.cloud.config.uri", server.root()); - property("spring.cloud.config.enabled", "true"); - property(importKey, importValue); - } - - public void enableTls() { - property("spring.cloud.config.tls.enabled", "true"); - } - - public void disableTls() { - property("spring.cloud.config.tls.enabled", "false"); - } - - public void setKeyStore(File keyStore, String keyStorePassword, String keyPassword) { - property("spring.cloud.config.tls.key-store", pathOf(keyStore)); - property("spring.cloud.config.tls.key-store-password", keyStorePassword); - property("spring.cloud.config.tls.key-password", keyPassword); - } - - public void setKeyStore(File keyStore) { - property("spring.cloud.config.tls.key-store", pathOf(keyStore)); - } - - public void setTrustStore(File trustStore, String password) { - property("spring.cloud.config.tls.trust-store", pathOf(trustStore)); - property("spring.cloud.config.tls.trust-store-password", password); - } - - public void setTrustStore(File trustStore) { - property("spring.cloud.config.tls.trust-store", pathOf(trustStore)); - } - - private String pathOf(File file) { - return String.format("file:%s", file.getAbsolutePath()); - } - -} diff --git a/spring-cloud-config-client-tls-tests/src/test/java/org/springframework/cloud/config/client/tls/TlsConfigServerRunner.java b/spring-cloud-config-client-tls-tests/src/test/java/org/springframework/cloud/config/client/tls/TlsConfigServerRunner.java deleted file mode 100644 index 1513c9e2..00000000 --- a/spring-cloud-config-client-tls-tests/src/test/java/org/springframework/cloud/config/client/tls/TlsConfigServerRunner.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright 2013-2020 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 - * - * https://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.springframework.cloud.config.client.tls; - -import java.io.File; - -public class TlsConfigServerRunner extends AppRunner { - - public TlsConfigServerRunner(Class appClass) { - super(appClass); - property("spring.profiles.active", "native"); - property("spring.cloud.config.server.native.search-locations", "classpath:/test/config"); - } - - public void enableTls() { - property("server.ssl.enabled", "true"); - property("server.ssl.client-auth", "need"); - } - - public void setKeyStore(File keyStore, String keyStorePassword, String key, String keyPassword) { - property("server.ssl.key-store", pathOf(keyStore)); - property("server.ssl.key-store-type", "PKCS12"); - property("server.ssl.key-store-password", keyStorePassword); - property("server.ssl.key-alias", key); - property("server.ssl.key-password", keyPassword); - } - - public void setTrustStore(File trustStore, String password) { - property("server.ssl.trust-store", pathOf(trustStore)); - property("server.ssl.trust-store-type", "PKCS12"); - property("server.ssl.trust-store-password", password); - } - - private String pathOf(File file) { - return String.format("file:%s", file.getAbsolutePath()); - } - -} diff --git a/spring-cloud-config-client-tls-tests/src/test/resources/test/config/application.properties b/spring-cloud-config-client-tls-tests/src/test/resources/test/config/application.properties deleted file mode 100644 index 2f4082ae..00000000 --- a/spring-cloud-config-client-tls-tests/src/test/resources/test/config/application.properties +++ /dev/null @@ -1 +0,0 @@ -dumb.key=dumb-value diff --git a/spring-cloud-config-client/.flattened-pom.xml b/spring-cloud-config-client/.flattened-pom.xml new file mode 100644 index 00000000..653e57f0 --- /dev/null +++ b/spring-cloud-config-client/.flattened-pom.xml @@ -0,0 +1,185 @@ + + + 4.0.0 + + org.springframework.cloud + spring-cloud-config + 4.0.0-SNAPSHOT + .. + + org.springframework.cloud + spring-cloud-config-client + 4.0.0-SNAPSHOT + Spring Cloud Config Client + This project is a Spring configuration client. + https://spring.io + + Pivotal Software, Inc. + https://www.spring.io + + + + Apache License, Version 2.0 + https://www.apache.org/licenses/LICENSE-2.0 + Copyright 2014-2021 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 + + https://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. + + + + + dsyer + Dave Syer + dsyer at pivotal.io + Pivotal Software, Inc. + https://www.spring.io + + lead + + + + sgibb + Spencer Gibb + sgibb at pivotal.io + Pivotal Software, Inc. + https://www.spring.io + + lead + + + + mgrzejszczak + Marcin Grzejszczak + mgrzejszczak at pivotal.io + Pivotal Software, Inc. + https://www.spring.io + + developer + + + + rbaxter + Ryan Baxter + rbaxter at pivotal.io + Pivotal Software, Inc. + https://www.spring.io + + developer + + + + omaciaszeksharma + Olga Maciaszek-Sharma + omaciaszeksharma at pivotal.io + Pivotal Software, Inc. + https://www.spring.io + + developer + + + + + scm:git:git://github.com/spring-cloud/spring-cloud-config.git/spring-cloud-config-client + scm:git:ssh://git@github.com/spring-cloud/spring-cloud-config.git/spring-cloud-config-client + https://github.com/spring-cloud/spring-cloud-config/spring-cloud-config-client + + + + org.springframework.boot + spring-boot-configuration-processor + 3.0.0-SNAPSHOT + compile + true + + + org.springframework.boot + spring-boot-autoconfigure + 3.0.0-SNAPSHOT + compile + + + org.springframework.boot + spring-boot-starter-logging + 3.0.0-SNAPSHOT + compile + true + + + org.springframework.cloud + spring-cloud-commons + 4.0.0-SNAPSHOT + compile + + + org.springframework.cloud + spring-cloud-context + 4.0.0-SNAPSHOT + compile + + + org.springframework + spring-web + 6.0.0-SNAPSHOT + compile + + + com.fasterxml.jackson.core + jackson-annotations + 2.14.0-rc2 + compile + + + org.springframework.retry + spring-retry + 2.0.0-RC2 + compile + true + + + org.springframework.boot + spring-boot-starter-actuator + 3.0.0-SNAPSHOT + compile + true + + + org.springframework.boot + spring-boot-starter-aop + 3.0.0-SNAPSHOT + compile + true + + + com.fasterxml.jackson.core + jackson-databind + 2.14.0-rc2 + compile + + + org.apache.httpcomponents.client5 + httpclient5 + 5.1.3 + compile + + + org.springframework.boot + spring-boot-autoconfigure-processor + 3.0.0-SNAPSHOT + compile + true + + + diff --git a/spring-cloud-config-client/pom.xml b/spring-cloud-config-client/pom.xml deleted file mode 100644 index adb3befc..00000000 --- a/spring-cloud-config-client/pom.xml +++ /dev/null @@ -1,100 +0,0 @@ - - - 4.0.0 - spring-cloud-config-client - jar - Spring Cloud Config Client - - - org.springframework.cloud - spring-cloud-config - 4.1.0-SNAPSHOT - .. - - - https://spring.io - - - - - - - org.springframework.boot - spring-boot-configuration-processor - true - - - org.springframework.boot - spring-boot-autoconfigure - - - org.springframework.boot - spring-boot-starter-logging - true - - - org.springframework.cloud - spring-cloud-commons - - - org.springframework.cloud - spring-cloud-context - - - org.springframework - spring-web - - - com.fasterxml.jackson.core - jackson-annotations - - - org.springframework.retry - spring-retry - true - - - org.springframework.boot - spring-boot-starter-actuator - true - - - org.springframework.boot - spring-boot-starter-aop - true - - - com.fasterxml.jackson.core - jackson-databind - - - org.apache.httpcomponents.client5 - httpclient5 - - - org.springframework.boot - spring-boot-autoconfigure-processor - true - - - org.springframework.boot - spring-boot-starter-test - test - - - org.junit.platform - junit-platform-launcher - test - - - org.springframework.cloud - spring-cloud-test-support - test - - - - diff --git a/spring-cloud-config-client/src/main/java/org/springframework/cloud/config/client/ConfigClientAutoConfiguration.java b/spring-cloud-config-client/src/main/java/org/springframework/cloud/config/client/ConfigClientAutoConfiguration.java deleted file mode 100644 index 1b0688dc..00000000 --- a/spring-cloud-config-client/src/main/java/org/springframework/cloud/config/client/ConfigClientAutoConfiguration.java +++ /dev/null @@ -1,121 +0,0 @@ -/* - * Copyright 2013-2022 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 - * - * https://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.springframework.cloud.config.client; - -import org.springframework.aot.hint.MemberCategory; -import org.springframework.aot.hint.RuntimeHints; -import org.springframework.aot.hint.RuntimeHintsRegistrar; -import org.springframework.aot.hint.TypeReference; -import org.springframework.beans.factory.BeanFactoryUtils; -import org.springframework.boot.actuate.autoconfigure.health.ConditionalOnEnabledHealthIndicator; -import org.springframework.boot.actuate.health.HealthIndicator; -import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; -import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; -import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.boot.context.config.ConfigDataLocation; -import org.springframework.cloud.config.environment.PropertySource; -import org.springframework.cloud.context.refresh.ContextRefresher; -import org.springframework.context.ApplicationContext; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.core.env.ConfigurableEnvironment; -import org.springframework.core.env.Environment; -import org.springframework.util.ClassUtils; - -/** - * Expose a ConfigClientProperties just so that there is a way to inspect the properties - * bound to it. It won't be available in time for autowiring into the bootstrap context, - * but the values in this properties object will be the same as the ones used to bind to - * the config server, if there is one. - * - * @author Dave Syer - * @author Marcos Barbero - * - */ -@Configuration(proxyBeanMethods = false) -public class ConfigClientAutoConfiguration { - - @Bean - @ConditionalOnMissingBean - public ConfigClientProperties configClientProperties(Environment environment, ApplicationContext context) { - if (context.getParent() != null && BeanFactoryUtils.beanNamesForTypeIncludingAncestors(context.getParent(), - ConfigClientProperties.class).length > 0) { - return BeanFactoryUtils.beanOfTypeIncludingAncestors(context.getParent(), ConfigClientProperties.class); - } - ConfigClientProperties client = new ConfigClientProperties(environment); - return client; - } - - @Configuration(proxyBeanMethods = false) - @ConditionalOnClass(HealthIndicator.class) - @ConditionalOnEnabledHealthIndicator("config") - protected static class ConfigServerHealthIndicatorConfiguration { - - @Bean - public ConfigClientHealthProperties configClientHealthProperties() { - return new ConfigClientHealthProperties(); - } - - @Bean - public ConfigServerHealthIndicator clientConfigServerHealthIndicator(ConfigClientHealthProperties properties, - ConfigurableEnvironment environment) { - return new ConfigServerHealthIndicator(environment, properties); - } - - } - - @Configuration(proxyBeanMethods = false) - @ConditionalOnClass(ContextRefresher.class) - @ConditionalOnBean(ContextRefresher.class) - @ConditionalOnProperty("spring.cloud.config.watch.enabled") - protected static class ConfigClientWatchConfiguration { - - @Bean - public ConfigClientWatch configClientWatch(ContextRefresher contextRefresher) { - return new ConfigClientWatch(contextRefresher); - } - - } - -} - -class ConfigClientHints implements RuntimeHintsRegistrar { - - @Override - public void registerHints(RuntimeHints hints, ClassLoader classLoader) { - if (!ClassUtils.isPresent("org.springframework.cloud.config.client.ConfigServerConfigDataLoader", - classLoader)) { - return; - } - hints.reflection() - .registerType(TypeReference.of(ConfigClientAutoConfiguration.class), - hint -> hint.withMembers(MemberCategory.INVOKE_DECLARED_CONSTRUCTORS)) - .registerType(TypeReference.of(ConfigDataLocation.class), - hint -> hint.withMembers(MemberCategory.INVOKE_DECLARED_METHODS)) - .registerType(TypeReference.of("org.springframework.boot.context.config.ConfigDataProperties"), - hint -> hint.withMembers(MemberCategory.INVOKE_DECLARED_CONSTRUCTORS, - MemberCategory.DECLARED_FIELDS, MemberCategory.INTROSPECT_DECLARED_METHODS)) - .registerType(TypeReference.of(org.springframework.cloud.config.environment.Environment.class), - hint -> hint.withMembers(MemberCategory.INVOKE_DECLARED_CONSTRUCTORS, - MemberCategory.INTROSPECT_DECLARED_METHODS, MemberCategory.DECLARED_FIELDS)) - .registerType(TypeReference.of(PropertySource.class), - hint -> hint.withMembers(MemberCategory.INVOKE_DECLARED_CONSTRUCTORS, - MemberCategory.INTROSPECT_DECLARED_METHODS, MemberCategory.DECLARED_FIELDS)); - } - -} diff --git a/spring-cloud-config-client/src/main/java/org/springframework/cloud/config/client/ConfigClientFailFastException.java b/spring-cloud-config-client/src/main/java/org/springframework/cloud/config/client/ConfigClientFailFastException.java deleted file mode 100644 index 33b861a9..00000000 --- a/spring-cloud-config-client/src/main/java/org/springframework/cloud/config/client/ConfigClientFailFastException.java +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Copyright 2013-2021 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 - * - * https://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.springframework.cloud.config.client; - -public class ConfigClientFailFastException extends IllegalStateException { - - public ConfigClientFailFastException(String message, Exception error) { - super(message, error); - } - -} diff --git a/spring-cloud-config-client/src/main/java/org/springframework/cloud/config/client/ConfigClientHealthProperties.java b/spring-cloud-config-client/src/main/java/org/springframework/cloud/config/client/ConfigClientHealthProperties.java deleted file mode 100644 index 720e22a3..00000000 --- a/spring-cloud-config-client/src/main/java/org/springframework/cloud/config/client/ConfigClientHealthProperties.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright 2013-2019 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 - * - * https://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.springframework.cloud.config.client; - -import java.time.Duration; -import java.time.temporal.ChronoUnit; - -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.boot.convert.DurationUnit; - -/** - * @author Spencer Gibb - */ -@ConfigurationProperties("health.config") -public class ConfigClientHealthProperties { - - /** - * Time to live for cached result. Default 5 min. - */ - @DurationUnit(ChronoUnit.MINUTES) - private Duration timeToLive = Duration.ofMinutes(5); - - public Duration getTimeToLive() { - return this.timeToLive; - } - - public void setTimeToLive(Duration timeToLive) { - this.timeToLive = timeToLive; - } - -} diff --git a/spring-cloud-config-client/src/main/java/org/springframework/cloud/config/client/ConfigClientProperties.java b/spring-cloud-config-client/src/main/java/org/springframework/cloud/config/client/ConfigClientProperties.java deleted file mode 100644 index 7257af94..00000000 --- a/spring-cloud-config-client/src/main/java/org/springframework/cloud/config/client/ConfigClientProperties.java +++ /dev/null @@ -1,499 +0,0 @@ -/* - * Copyright 2013-2019 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 - * - * https://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.springframework.cloud.config.client; - -import java.io.UnsupportedEncodingException; -import java.net.MalformedURLException; -import java.net.URL; -import java.net.URLDecoder; -import java.nio.charset.StandardCharsets; -import java.util.Arrays; -import java.util.HashMap; -import java.util.Map; - -import org.springframework.beans.BeanUtils; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.cloud.config.environment.EnvironmentMediaType; -import org.springframework.cloud.configuration.TlsProperties; -import org.springframework.core.env.Environment; -import org.springframework.util.ObjectUtils; -import org.springframework.util.StringUtils; -import org.springframework.web.util.UriComponentsBuilder; - -/** - * @author Dave Syer - * - */ -@ConfigurationProperties(ConfigClientProperties.PREFIX) -public class ConfigClientProperties { - - /** - * Prefix for Spring Cloud Config properties. - */ - public static final String PREFIX = "spring.cloud.config"; - - /** - * Default application name. - */ - public static final String DEFAULT_APPLICATION = "application"; - - /** - * Placeholder string that allows ${spring.cloud.config.name} to override - * ${spring.application.name:application}. - */ - public static final String NAME_PLACEHOLDER = "${" + ConfigClientProperties.PREFIX - + ".name:${spring.application.name:" + DEFAULT_APPLICATION + "}}"; - - /** - * Name of config discovery enabled property. - */ - public static final String CONFIG_DISCOVERY_ENABLED = PREFIX + ".discovery.enabled"; - - /** - * Token header name. - */ - public static final String TOKEN_HEADER = "X-Config-Token"; - - /** - * State header name. - */ - public static final String STATE_HEADER = "X-Config-State"; - - /** - * Authorization header name. - */ - public static final String AUTHORIZATION = "authorization"; - - /** - * Default profile value. - */ - public static final String DEFAULT_PROFILE = "default"; - - /** - * Flag to say that remote configuration is enabled. Default true; - */ - private boolean enabled = true; - - /** - * The default profile to use when fetching remote configuration (comma-separated). - * Default is "default". - */ - private String profile = DEFAULT_PROFILE; - - /** - * Name of application used to fetch remote properties. - */ - @Value("${spring.application.name:" + DEFAULT_APPLICATION + "}") - private String name; - - /** - * The label name to use to pull remote configuration properties. The default is set - * on the server (generally "main" for a git based server). - */ - private String label; - - /** - * The username to use (HTTP Basic) when contacting the remote server. - */ - private String username; - - /** - * The password to use (HTTP Basic) when contacting the remote server. - */ - private String password; - - /** - * The URI of the remote server (default http://localhost:8888). - */ - private String[] uri = { "http://localhost:8888" }; - - /** - * The strategy to use when call to server fails and there are multiple URLs - * configured on the uri property (default {@link MultipleUriStrategy#ALWAYS}). - */ - private MultipleUriStrategy multipleUriStrategy = MultipleUriStrategy.ALWAYS; - - /** - * The Accept header media type to send to config server. - */ - private String mediaType = EnvironmentMediaType.V2_JSON; - - /** - * Discovery properties. - */ - private Discovery discovery = new Discovery(); - - /** - * TLS properties. - */ - private TlsProperties tls = new TlsProperties(); - - /** - * Flag to indicate that failure to connect to the server is fatal (default false). - */ - private boolean failFast = false; - - /** - * Security Token passed thru to underlying environment repository. - */ - private String token; - - /** - * timeout on waiting to read data from the Config Server. - */ - private int requestReadTimeout = (60 * 1000 * 3) + 5000; - - /** - * timeout on waiting to connect to the Config Server. - */ - private int requestConnectTimeout = 1000 * 10; - - /** - * Flag to indicate whether to send state. Default true. - */ - private boolean sendState = true; - - /** - * Additional headers used to create the client request. - */ - private Map headers = new HashMap<>(); - - ConfigClientProperties() { - } - - public ConfigClientProperties(Environment environment) { - String[] profiles = environment.getActiveProfiles(); - if (profiles.length == 0) { - profiles = environment.getDefaultProfiles(); - } - this.setProfile(StringUtils.arrayToCommaDelimitedString(profiles)); - } - - public boolean isEnabled() { - return this.enabled; - } - - public void setEnabled(boolean enabled) { - this.enabled = enabled; - } - - public String[] getUri() { - return this.uri; - } - - public void setUri(String[] url) { - this.uri = url; - } - - public MultipleUriStrategy getMultipleUriStrategy() { - return multipleUriStrategy; - } - - public void setMultipleUriStrategy(MultipleUriStrategy multipleUriStrategy) { - this.multipleUriStrategy = multipleUriStrategy; - } - - public String getName() { - return this.name; - } - - public void setName(String name) { - this.name = name; - } - - public String getProfile() { - return this.profile; - } - - public void setProfile(String env) { - this.profile = env; - } - - public String getLabel() { - return this.label; - } - - public void setLabel(String label) { - this.label = label; - } - - public String getUsername() { - return this.username; - } - - public void setUsername(String username) { - this.username = username; - } - - public String getPassword() { - return this.password; - } - - public void setPassword(String password) { - this.password = password; - } - - public Credentials getCredentials(int index) { - return extractCredentials(index); - } - - public String getMediaType() { - return this.mediaType; - } - - public void setMediaType(String mediaType) { - this.mediaType = mediaType; - } - - public Discovery getDiscovery() { - return this.discovery; - } - - public void setDiscovery(Discovery discovery) { - this.discovery = discovery; - } - - public TlsProperties getTls() { - return tls; - } - - public void setTls(TlsProperties tls) { - this.tls = tls; - } - - public boolean isFailFast() { - return this.failFast; - } - - public void setFailFast(boolean failFast) { - this.failFast = failFast; - } - - public String getToken() { - return this.token; - } - - public void setToken(String token) { - this.token = token; - } - - public int getRequestReadTimeout() { - return this.requestReadTimeout; - } - - public void setRequestReadTimeout(int requestReadTimeout) { - this.requestReadTimeout = requestReadTimeout; - } - - public int getRequestConnectTimeout() { - return this.requestConnectTimeout; - } - - public void setRequestConnectTimeout(int requestConnectTimeout) { - this.requestConnectTimeout = requestConnectTimeout; - } - - public boolean isSendState() { - return this.sendState; - } - - public void setSendState(boolean sendState) { - this.sendState = sendState; - } - - public Map getHeaders() { - return this.headers; - } - - public void setHeaders(Map headers) { - this.headers = headers; - } - - private Credentials extractCredentials(int index) { - Credentials result = new Credentials(); - int noOfUrl = this.uri.length; - if (index < 0 || index >= noOfUrl) { - throw new IllegalStateException("Trying to access an invalid array index"); - } - String uri = this.uri[index]; - result.uri = uri; - Credentials explicitCredentials = getUsernamePassword(); - result.username = explicitCredentials.username; - result.password = explicitCredentials.password; - try { - URL url = new URL(uri); - String userInfo = url.getUserInfo(); - // no credentials in url, return explicit credentials - if (ObjectUtils.isEmpty(userInfo) || ":".equals(userInfo)) { - return result; - } - String bare = UriComponentsBuilder.fromHttpUrl(uri).userInfo(null).build().toUriString(); - result.uri = bare; - - // if userInfo does not contain a :, then append a : to it - if (!userInfo.contains(":")) { - userInfo = userInfo + ":"; - } - - int sepIndex = userInfo.indexOf(":"); - // set username and password from uri - result.username = userInfo.substring(0, sepIndex); - result.password = userInfo.substring(sepIndex + 1); - - // override password if explicitly set - if (explicitCredentials.password != null) { - // Explicit username / password takes precedence - result.password = explicitCredentials.password; - } - // override username if explicitly set - if (!"user".equals(explicitCredentials.username)) { - // But the username can be overridden - result.username = explicitCredentials.username; - } - - result.password = URLDecoder.decode(result.password, StandardCharsets.UTF_8.toString()); - result.username = URLDecoder.decode(result.username, StandardCharsets.UTF_8.toString()); - return result; - } - catch (MalformedURLException | UnsupportedEncodingException e) { - throw new IllegalStateException("Invalid URL: " + uri, e); - } - } - - private Credentials getUsernamePassword() { - Credentials credentials = new Credentials(); - - if (StringUtils.hasText(this.password)) { - credentials.password = this.password.trim(); - } - - if (StringUtils.hasText(this.username)) { - credentials.username = this.username.trim(); - } - else { - credentials.username = "user"; - } - return credentials; - } - - public ConfigClientProperties override(org.springframework.core.env.Environment environment) { - ConfigClientProperties override = new ConfigClientProperties(); - BeanUtils.copyProperties(this, override); - override.setName(environment.resolvePlaceholders(NAME_PLACEHOLDER)); - if (environment.containsProperty(ConfigClientProperties.PREFIX + ".profile")) { - override.setProfile(environment.getProperty(ConfigClientProperties.PREFIX + ".profile")); - } - if (environment.containsProperty(ConfigClientProperties.PREFIX + ".label")) { - override.setLabel(environment.getProperty(ConfigClientProperties.PREFIX + ".label")); - } - return override; - } - - @Override - public String toString() { - return "ConfigClientProperties [enabled=" + this.enabled + ", profile=" + this.profile + ", name=" + this.name - + ", label=" + this.label + ", username=" + this.username + ", password=" + this.password + ", uri=" - + Arrays.toString(this.uri) + ", mediaType=" + this.mediaType + ", discovery=" + this.discovery - + ", failFast=" + this.failFast + ", token=" + this.token + ", requestConnectTimeout=" - + this.requestConnectTimeout + ", requestReadTimeout=" + this.requestReadTimeout + ", sendState=" - + this.sendState + ", headers=" + this.headers + "]"; - } - - /** - * Credentials properties. - */ - public static class Credentials { - - private String username; - - private String password; - - private String uri; - - public String getUsername() { - return this.username; - } - - public String getPassword() { - return this.password; - } - - public String getUri() { - return this.uri; - } - - } - - /** - * Discovery properties. - */ - public static class Discovery { - - /** - * Default config server service id name. - */ - public static final String DEFAULT_CONFIG_SERVER = "configserver"; - - /** - * Flag to indicate that config server discovery is enabled (config server URL - * will be looked up via discovery). - */ - private boolean enabled; - - /** - * Service id to locate config server. - */ - private String serviceId = DEFAULT_CONFIG_SERVER; - - public boolean isEnabled() { - return this.enabled; - } - - public void setEnabled(boolean enabled) { - this.enabled = enabled; - } - - public String getServiceId() { - return this.serviceId; - } - - public void setServiceId(String serviceId) { - this.serviceId = serviceId; - } - - } - - /** - * Enumerates possible strategies to use when multiple URLs are provided and an error - * occurs. - */ - public enum MultipleUriStrategy { - - /** - * Try the next URL in the list on any error. - */ - ALWAYS, - - /** - * Try the next URL in the list only if no response was received. - */ - CONNECTION_TIMEOUT_ONLY - - } - -} diff --git a/spring-cloud-config-client/src/main/java/org/springframework/cloud/config/client/ConfigClientRequestTemplateFactory.java b/spring-cloud-config-client/src/main/java/org/springframework/cloud/config/client/ConfigClientRequestTemplateFactory.java deleted file mode 100644 index 44f7c8ef..00000000 --- a/spring-cloud-config-client/src/main/java/org/springframework/cloud/config/client/ConfigClientRequestTemplateFactory.java +++ /dev/null @@ -1,175 +0,0 @@ -/* - * Copyright 2013-2021 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 - * - * https://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.springframework.cloud.config.client; - -import java.io.IOException; -import java.security.GeneralSecurityException; -import java.util.Arrays; -import java.util.HashMap; -import java.util.Map; -import java.util.concurrent.TimeUnit; - -import javax.net.ssl.SSLContext; - -import org.apache.commons.logging.Log; -import org.apache.hc.client5.http.classic.HttpClient; -import org.apache.hc.client5.http.impl.classic.HttpClients; -import org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManager; -import org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManagerBuilder; -import org.apache.hc.client5.http.ssl.SSLConnectionSocketFactoryBuilder; -import org.apache.hc.core5.http.io.SocketConfig; -import org.apache.hc.core5.util.Timeout; - -import org.springframework.cloud.configuration.SSLContextFactory; -import org.springframework.http.HttpHeaders; -import org.springframework.http.HttpRequest; -import org.springframework.http.client.ClientHttpRequestExecution; -import org.springframework.http.client.ClientHttpRequestFactory; -import org.springframework.http.client.ClientHttpRequestInterceptor; -import org.springframework.http.client.ClientHttpResponse; -import org.springframework.http.client.HttpComponentsClientHttpRequestFactory; -import org.springframework.http.client.SimpleClientHttpRequestFactory; -import org.springframework.util.Base64Utils; -import org.springframework.web.client.RestTemplate; - -import static org.springframework.cloud.config.client.ConfigClientProperties.AUTHORIZATION; - -public class ConfigClientRequestTemplateFactory { - - private final Log log; - - private final ConfigClientProperties properties; - - public ConfigClientRequestTemplateFactory(Log log, ConfigClientProperties properties) { - this.log = log; - this.properties = properties; - } - - public Log getLog() { - return this.log; - } - - public ConfigClientProperties getProperties() { - return this.properties; - } - - public RestTemplate create() { - if (properties.getRequestReadTimeout() < 0) { - throw new IllegalStateException("Invalid Value for Read Timeout set."); - } - if (properties.getRequestConnectTimeout() < 0) { - throw new IllegalStateException("Invalid Value for Connect Timeout set."); - } - - ClientHttpRequestFactory requestFactory = createHttpRequestFactory(properties); - RestTemplate template = new RestTemplate(requestFactory); - Map headers = new HashMap<>(properties.getHeaders()); - headers.remove(AUTHORIZATION); // To avoid redundant addition of header - if (!headers.isEmpty()) { - template.setInterceptors(Arrays.asList(new GenericRequestHeaderInterceptor(headers))); - } - - return template; - } - - protected ClientHttpRequestFactory createHttpRequestFactory(ConfigClientProperties client) { - if (client.getTls().isEnabled()) { - try { - PoolingHttpClientConnectionManager connectionManager = createConnectionManagerForTls(client); - HttpClient httpClient = HttpClients.custom().setConnectionManager(connectionManager).build(); - HttpComponentsClientHttpRequestFactory result = new HttpComponentsClientHttpRequestFactory(httpClient); - - result.setConnectTimeout(client.getRequestConnectTimeout()); - return result; - - } - catch (GeneralSecurityException | IOException ex) { - log.error(ex); - throw new IllegalStateException("Failed to create config client with TLS.", ex); - } - } - - SimpleClientHttpRequestFactory result = new SimpleClientHttpRequestFactory(); - result.setReadTimeout(client.getRequestReadTimeout()); - result.setConnectTimeout(client.getRequestConnectTimeout()); - return result; - } - - protected PoolingHttpClientConnectionManager createConnectionManagerForTls(ConfigClientProperties client) - throws GeneralSecurityException, IOException { - SSLContextFactory factory = new SSLContextFactory(client.getTls()); - SSLContext sslContext = factory.createSSLContext(); - SSLConnectionSocketFactoryBuilder sslConnectionSocketFactoryBuilder = SSLConnectionSocketFactoryBuilder - .create(); - sslConnectionSocketFactoryBuilder.setSslContext(sslContext); - SocketConfig.Builder socketBuilder = createSocketBuilderForTls(client); - PoolingHttpClientConnectionManager connectionManager = PoolingHttpClientConnectionManagerBuilder.create() - .setDefaultSocketConfig(socketBuilder.build()) - .setSSLSocketFactory(sslConnectionSocketFactoryBuilder.build()).build(); - return connectionManager; - } - - protected SocketConfig.Builder createSocketBuilderForTls(ConfigClientProperties client) { - SocketConfig.Builder socketBuilder = SocketConfig.custom() - .setSoTimeout(Timeout.of(client.getRequestReadTimeout(), TimeUnit.MILLISECONDS)); - return socketBuilder; - } - - public void addAuthorizationToken(HttpHeaders httpHeaders, String username, String password) { - String authorization = properties.getHeaders().get(AUTHORIZATION); - - if (password != null && authorization != null) { - throw new IllegalStateException("You must set either 'password' or 'authorization'"); - } - - if (password != null) { - byte[] token = Base64Utils.encode((username + ":" + password).getBytes()); - httpHeaders.add("Authorization", "Basic " + new String(token)); - } - else if (authorization != null) { - httpHeaders.add("Authorization", authorization); - } - - } - - /** - * Adds the provided headers to the request. - */ - public static class GenericRequestHeaderInterceptor implements ClientHttpRequestInterceptor { - - private final Map headers; - - public GenericRequestHeaderInterceptor(Map headers) { - this.headers = headers; - } - - @Override - public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) - throws IOException { - for (Map.Entry header : this.headers.entrySet()) { - request.getHeaders().add(header.getKey(), header.getValue()); - } - return execution.execute(request, body); - } - - protected Map getHeaders() { - return this.headers; - } - - } - -} diff --git a/spring-cloud-config-client/src/main/java/org/springframework/cloud/config/client/ConfigClientRetryBootstrapper.java b/spring-cloud-config-client/src/main/java/org/springframework/cloud/config/client/ConfigClientRetryBootstrapper.java deleted file mode 100644 index 8823a57c..00000000 --- a/spring-cloud-config-client/src/main/java/org/springframework/cloud/config/client/ConfigClientRetryBootstrapper.java +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Copyright 2013-2020 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 - * - * https://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.springframework.cloud.config.client; - -import org.springframework.boot.BootstrapRegistry; -import org.springframework.boot.BootstrapRegistryInitializer; -import org.springframework.cloud.config.client.ConfigServerBootstrapper.LoaderInterceptor; -import org.springframework.retry.support.RetryTemplate; -import org.springframework.util.ClassUtils; - -/** - * Bootstrapper. - * - * @author Marcin Grzejszczak - * @since 3.0.0 - */ -public class ConfigClientRetryBootstrapper implements BootstrapRegistryInitializer { - - static final boolean RETRY_IS_PRESENT = ClassUtils.isPresent("org.springframework.retry.annotation.Retryable", - null); - - @Override - public void initialize(BootstrapRegistry registry) { - if (!RETRY_IS_PRESENT) { - return; - } - - registry.registerIfAbsent(LoaderInterceptor.class, context -> loadContext -> { - ConfigServerConfigDataResource resource = loadContext.getResource(); - if (resource.getProperties().isFailFast()) { - RetryProperties properties = resource.getRetryProperties(); - RetryTemplate retryTemplate = RetryTemplateFactory.create(properties, resource.getLog()); - return retryTemplate.execute(retryContext -> { - if (resource.getLog().isDebugEnabled()) { - resource.getLog().debug("Retry: count=" + retryContext.getRetryCount()); - } - return loadContext.getInvocation().apply(loadContext.getLoaderContext(), resource); - }); - } - return loadContext.getInvocation().apply(loadContext.getLoaderContext(), resource); - }); - - } - -} diff --git a/spring-cloud-config-client/src/main/java/org/springframework/cloud/config/client/ConfigClientStateHolder.java b/spring-cloud-config-client/src/main/java/org/springframework/cloud/config/client/ConfigClientStateHolder.java deleted file mode 100644 index b7373987..00000000 --- a/spring-cloud-config-client/src/main/java/org/springframework/cloud/config/client/ConfigClientStateHolder.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright 2018-2019 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 - * - * https://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.springframework.cloud.config.client; - -/** - * @author Spencer Gibb - */ -public final class ConfigClientStateHolder { - - private ConfigClientStateHolder() { - throw new IllegalStateException("Can't instantiate a utility class"); - } - - private static ThreadLocal state = new ThreadLocal<>(); - - public static void resetState() { - state.remove(); - } - - public static String getState() { - return state.get(); - } - - public static void setState(String newState) { - if (newState == null) { - resetState(); - return; - } - state.set(newState); - } - -} diff --git a/spring-cloud-config-client/src/main/java/org/springframework/cloud/config/client/ConfigClientWatch.java b/spring-cloud-config-client/src/main/java/org/springframework/cloud/config/client/ConfigClientWatch.java deleted file mode 100644 index 035acbdc..00000000 --- a/spring-cloud-config-client/src/main/java/org/springframework/cloud/config/client/ConfigClientWatch.java +++ /dev/null @@ -1,84 +0,0 @@ -/* - * Copyright 2013-2019 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 - * - * https://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.springframework.cloud.config.client; - -import java.io.Closeable; -import java.util.concurrent.atomic.AtomicBoolean; - -import jakarta.annotation.PostConstruct; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; - -import org.springframework.cloud.context.refresh.ContextRefresher; -import org.springframework.context.EnvironmentAware; -import org.springframework.core.env.Environment; -import org.springframework.scheduling.annotation.Scheduled; - -import static org.springframework.util.StringUtils.hasText; - -/** - * @author Spencer Gibb - */ -public class ConfigClientWatch implements Closeable, EnvironmentAware { - - private static Log log = LogFactory.getLog(ConfigServicePropertySourceLocator.class); - - private final AtomicBoolean running = new AtomicBoolean(false); - - private final ContextRefresher refresher; - - private Environment environment; - - public ConfigClientWatch(ContextRefresher refresher) { - this.refresher = refresher; - } - - @Override - public void setEnvironment(Environment environment) { - this.environment = environment; - } - - @PostConstruct - public void start() { - this.running.compareAndSet(false, true); - } - - @Scheduled(initialDelayString = "${spring.cloud.config.watch.initialDelay:180000}", - fixedDelayString = "${spring.cloud.config.watch.delay:500}") - public void watchConfigServer() { - if (this.running.get()) { - String newState = this.environment.getProperty("config.client.state"); - String oldState = ConfigClientStateHolder.getState(); - - // only refresh if state has changed - if (stateChanged(oldState, newState)) { - ConfigClientStateHolder.setState(newState); - this.refresher.refresh(); - } - } - } - - /* for testing */ boolean stateChanged(String oldState, String newState) { - return (!hasText(oldState) && hasText(newState)) || (hasText(oldState) && !oldState.equals(newState)); - } - - @Override - public void close() { - this.running.compareAndSet(true, false); - } - -} diff --git a/spring-cloud-config-client/src/main/java/org/springframework/cloud/config/client/ConfigServerBootstrapper.java b/spring-cloud-config-client/src/main/java/org/springframework/cloud/config/client/ConfigServerBootstrapper.java deleted file mode 100644 index 3303d34d..00000000 --- a/spring-cloud-config-client/src/main/java/org/springframework/cloud/config/client/ConfigServerBootstrapper.java +++ /dev/null @@ -1,114 +0,0 @@ -/* - * Copyright 2013-2020 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 - * - * https://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.springframework.cloud.config.client; - -import java.util.function.BiFunction; -import java.util.function.Function; - -import org.springframework.boot.BootstrapContext; -import org.springframework.boot.BootstrapRegistry; -import org.springframework.boot.BootstrapRegistry.InstanceSupplier; -import org.springframework.boot.BootstrapRegistryInitializer; -import org.springframework.boot.context.config.ConfigData; -import org.springframework.boot.context.config.ConfigDataLoaderContext; -import org.springframework.boot.context.properties.bind.Binder; -import org.springframework.util.Assert; -import org.springframework.web.client.RestTemplate; - -public class ConfigServerBootstrapper implements BootstrapRegistryInitializer { - - private Function restTemplateFactory; - - private LoaderInterceptor loaderInterceptor; - - static ConfigServerBootstrapper create() { - return new ConfigServerBootstrapper(); - } - - // TODO: document there will be a ConfigClientProperties in BootstrapContext - public ConfigServerBootstrapper withRestTemplateFactory( - Function restTemplateFactory) { - this.restTemplateFactory = restTemplateFactory; - return this; - } - - public ConfigServerBootstrapper withLoaderInterceptor(LoaderInterceptor loaderInterceptor) { - this.loaderInterceptor = loaderInterceptor; - return this; - } - - @Override - public void initialize(BootstrapRegistry registry) { - if (restTemplateFactory != null) { - registry.register(RestTemplate.class, restTemplateFactory::apply); - } - if (loaderInterceptor != null) { - registry.register(LoaderInterceptor.class, InstanceSupplier.of(loaderInterceptor)); - } - } - - public interface LoaderInterceptor extends Function { - - } - - @FunctionalInterface - public interface LoaderInvocation - extends BiFunction { - - } - - public static class LoadContext { - - private final ConfigDataLoaderContext loaderContext; - - private final ConfigServerConfigDataResource resource; - - private final Binder binder; - - private final LoaderInvocation invocation; - - LoadContext(ConfigDataLoaderContext loaderContext, ConfigServerConfigDataResource resource, Binder binder, - LoaderInvocation invocation) { - Assert.notNull(loaderContext, "loaderContext may not be null"); - Assert.notNull(resource, "resource may not be null"); - Assert.notNull(binder, "binder may not be null"); - Assert.notNull(invocation, "invocation may not be null"); - this.loaderContext = loaderContext; - this.resource = resource; - this.binder = binder; - this.invocation = invocation; - } - - public ConfigDataLoaderContext getLoaderContext() { - return this.loaderContext; - } - - public ConfigServerConfigDataResource getResource() { - return this.resource; - } - - public Binder getBinder() { - return this.binder; - } - - public LoaderInvocation getInvocation() { - return this.invocation; - } - - } - -} diff --git a/spring-cloud-config-client/src/main/java/org/springframework/cloud/config/client/ConfigServerConfigDataLoader.java b/spring-cloud-config-client/src/main/java/org/springframework/cloud/config/client/ConfigServerConfigDataLoader.java deleted file mode 100644 index ced0f6ef..00000000 --- a/spring-cloud-config-client/src/main/java/org/springframework/cloud/config/client/ConfigServerConfigDataLoader.java +++ /dev/null @@ -1,345 +0,0 @@ -/* - * Copyright 2013-2022 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 - * - * https://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.springframework.cloud.config.client; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.EnumSet; -import java.util.HashMap; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; - -import org.apache.commons.logging.Log; - -import org.springframework.boot.context.config.ConfigData; -import org.springframework.boot.context.config.ConfigData.Option; -import org.springframework.boot.context.config.ConfigDataLoader; -import org.springframework.boot.context.config.ConfigDataLoaderContext; -import org.springframework.boot.context.properties.bind.Binder; -import org.springframework.boot.env.OriginTrackedMapPropertySource; -import org.springframework.boot.logging.DeferredLogFactory; -import org.springframework.boot.origin.Origin; -import org.springframework.boot.origin.OriginTrackedValue; -import org.springframework.cloud.config.client.ConfigClientProperties.MultipleUriStrategy; -import org.springframework.cloud.config.client.ConfigServerBootstrapper.LoadContext; -import org.springframework.cloud.config.client.ConfigServerBootstrapper.LoaderInterceptor; -import org.springframework.cloud.config.environment.Environment; -import org.springframework.core.Ordered; -import org.springframework.core.env.MapPropertySource; -import org.springframework.core.env.PropertySource; -import org.springframework.http.HttpEntity; -import org.springframework.http.HttpHeaders; -import org.springframework.http.HttpMethod; -import org.springframework.http.HttpStatus; -import org.springframework.http.MediaType; -import org.springframework.http.ResponseEntity; -import org.springframework.util.StringUtils; -import org.springframework.web.client.HttpClientErrorException; -import org.springframework.web.client.HttpServerErrorException; -import org.springframework.web.client.ResourceAccessException; -import org.springframework.web.client.RestTemplate; - -import static org.springframework.cloud.config.client.ConfigClientProperties.STATE_HEADER; -import static org.springframework.cloud.config.client.ConfigClientProperties.TOKEN_HEADER; - -public class ConfigServerConfigDataLoader implements ConfigDataLoader, Ordered { - - /** - * PropertySource name for the config client. - */ - public static final String CONFIG_CLIENT_PROPERTYSOURCE_NAME = "configClient"; - - private static final EnumSet