From 694c9ac617bec9532bd9c5af8b2d3c909483c3db Mon Sep 17 00:00:00 2001 From: Chris Berry Date: Wed, 8 May 2019 14:35:53 -0500 Subject: [PATCH 01/11] fix(amazon): use source credentials when retrieving scaling policies to copy (#3641) --- .../aws/deploy/handlers/BasicAmazonDeployHandler.groovy | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/clouddriver-aws/src/main/groovy/com/netflix/spinnaker/clouddriver/aws/deploy/handlers/BasicAmazonDeployHandler.groovy b/clouddriver-aws/src/main/groovy/com/netflix/spinnaker/clouddriver/aws/deploy/handlers/BasicAmazonDeployHandler.groovy index cf6de8e8e31..5391e3ade7d 100644 --- a/clouddriver-aws/src/main/groovy/com/netflix/spinnaker/clouddriver/aws/deploy/handlers/BasicAmazonDeployHandler.groovy +++ b/clouddriver-aws/src/main/groovy/com/netflix/spinnaker/clouddriver/aws/deploy/handlers/BasicAmazonDeployHandler.groovy @@ -306,10 +306,10 @@ class BasicAmazonDeployHandler implements DeployHandler Date: Wed, 8 May 2019 16:09:28 -0400 Subject: [PATCH 02/11] fix(docker): Added missing insecureRegistry property (#3616) Co-Authored-By: Jammy Louie --- .../registry/config/DockerRegistryConfigurationProperties.groovy | 1 + .../security/DockerRegistryCredentialsInitializer.groovy | 1 + 2 files changed, 2 insertions(+) diff --git a/clouddriver-docker/src/main/groovy/com/netflix/spinnaker/clouddriver/docker/registry/config/DockerRegistryConfigurationProperties.groovy b/clouddriver-docker/src/main/groovy/com/netflix/spinnaker/clouddriver/docker/registry/config/DockerRegistryConfigurationProperties.groovy index a3fb748b5ec..c144ea04962 100644 --- a/clouddriver-docker/src/main/groovy/com/netflix/spinnaker/clouddriver/docker/registry/config/DockerRegistryConfigurationProperties.groovy +++ b/clouddriver-docker/src/main/groovy/com/netflix/spinnaker/clouddriver/docker/registry/config/DockerRegistryConfigurationProperties.groovy @@ -51,6 +51,7 @@ class DockerRegistryConfigurationProperties { boolean trackDigests // Sort tags by creation date. boolean sortTagsByDate + boolean insecureRegistry // List of all repositories to index. Can be of the form /, // or for repositories like 'ubuntu'. List repositories diff --git a/clouddriver-docker/src/main/groovy/com/netflix/spinnaker/clouddriver/docker/registry/security/DockerRegistryCredentialsInitializer.groovy b/clouddriver-docker/src/main/groovy/com/netflix/spinnaker/clouddriver/docker/registry/security/DockerRegistryCredentialsInitializer.groovy index 615331c9ab5..cd0cd355270 100644 --- a/clouddriver-docker/src/main/groovy/com/netflix/spinnaker/clouddriver/docker/registry/security/DockerRegistryCredentialsInitializer.groovy +++ b/clouddriver-docker/src/main/groovy/com/netflix/spinnaker/clouddriver/docker/registry/security/DockerRegistryCredentialsInitializer.groovy @@ -90,6 +90,7 @@ class DockerRegistryCredentialsInitializer implements CredentialsInitializerSync .paginateSize(managedAccount.paginateSize) .trackDigests(managedAccount.trackDigests) .sortTagsByDate(managedAccount.sortTagsByDate) + .insecureRegistry(managedAccount.insecureRegistry) .repositories(managedAccount.repositories) .skip(managedAccount.skip) .dockerOkClientProvider(dockerOkClientProvider) From c9aff8ca039b80ed8bb450b02c290a2a2a06da93 Mon Sep 17 00:00:00 2001 From: Chris Thielen Date: Wed, 8 May 2019 14:16:03 -0700 Subject: [PATCH 03/11] fix(titus): If a run job spits out a yaml file, we were parsing it as properties. Now we parse it as yaml. (#3645) --- .../caching/providers/TitusJobProvider.groovy | 9 +- .../providers/TitusJobProviderSpec.groovy | 153 ++++++++++++++++++ 2 files changed, 160 insertions(+), 2 deletions(-) create mode 100644 clouddriver-titus/src/test/groovy/com/netflix/spinnaker/clouddriver/titus/caching/providers/TitusJobProviderSpec.groovy diff --git a/clouddriver-titus/src/main/groovy/com/netflix/spinnaker/clouddriver/titus/caching/providers/TitusJobProvider.groovy b/clouddriver-titus/src/main/groovy/com/netflix/spinnaker/clouddriver/titus/caching/providers/TitusJobProvider.groovy index ac4116a59ea..a0d97776dcf 100644 --- a/clouddriver-titus/src/main/groovy/com/netflix/spinnaker/clouddriver/titus/caching/providers/TitusJobProvider.groovy +++ b/clouddriver-titus/src/main/groovy/com/netflix/spinnaker/clouddriver/titus/caching/providers/TitusJobProvider.groovy @@ -30,6 +30,8 @@ import okhttp3.Request import org.slf4j.LoggerFactory import org.springframework.beans.factory.annotation.Autowired import org.springframework.stereotype.Component +import org.yaml.snakeyaml.Yaml +import org.yaml.snakeyaml.constructor.SafeConstructor import javax.net.ssl.HostnameVerifier import javax.net.ssl.SSLSession @@ -86,14 +88,14 @@ class TitusJobProvider implements JobProvider { try { amazonS3DataProvider.getAdhocData("titus", "${s3.accountName}:${s3.region}:${s3.bucket}", "${s3.key}/${fileName}", outputStream) } catch (Exception e) { - log.warn("File [${fileName}] does not exist for job [${job.task.last().id}].") + log.warn("File [${fileName}] does not exist for job [${job.tasks.last().id}].") return null } fileContents = new ByteArrayInputStream(outputStream.toByteArray()) } else { Map files = titusClient.logsDownload(job.tasks.last().id) if (!files.containsKey(fileName)) { - log.warn("File [${fileName}] does not exist for job [${job.task.last().id}].") + log.warn("File [${fileName}] does not exist for job [${job.tasks.last().id}].") return null } fileContents = client.newCall(new Request.Builder().url(files.get(fileName) as String).build()).execute().body().byteStream() @@ -103,6 +105,9 @@ class TitusJobProvider implements JobProvider { Map results = [:] if (fileName.endsWith('.json')) { results = objectMapper.readValue(fileContents, Map) + } else if (fileName.endsWith('.yml')) { + def yaml = new Yaml(new SafeConstructor()) + results = yaml.load(fileContents) } else { Properties propertiesFile = new Properties() propertiesFile.load(fileContents) diff --git a/clouddriver-titus/src/test/groovy/com/netflix/spinnaker/clouddriver/titus/caching/providers/TitusJobProviderSpec.groovy b/clouddriver-titus/src/test/groovy/com/netflix/spinnaker/clouddriver/titus/caching/providers/TitusJobProviderSpec.groovy new file mode 100644 index 00000000000..d9612363bae --- /dev/null +++ b/clouddriver-titus/src/test/groovy/com/netflix/spinnaker/clouddriver/titus/caching/providers/TitusJobProviderSpec.groovy @@ -0,0 +1,153 @@ +/* + * Copyright 2015 Netflix, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.netflix.spinnaker.clouddriver.titus.deploy.converters + +import com.fasterxml.jackson.databind.ObjectMapper +import com.netflix.spinnaker.clouddriver.aws.provider.view.AmazonS3DataProvider +import com.netflix.spinnaker.clouddriver.security.AccountCredentialsProvider +import com.netflix.spinnaker.clouddriver.titus.TitusClientProvider +import com.netflix.spinnaker.clouddriver.titus.caching.providers.TitusJobProvider +import com.netflix.spinnaker.clouddriver.titus.client.TitusClient +import com.netflix.spinnaker.clouddriver.titus.client.model.Job +import com.netflix.spinnaker.clouddriver.titus.client.model.Task +import com.netflix.spinnaker.clouddriver.titus.credentials.NetflixTitusCredentials +import spock.lang.Specification +import spock.lang.Subject + +class TitusJobProviderSpec extends Specification { + TitusClient titusClient = Stub() + TitusClientProvider titusClientProvider = Stub() + AccountCredentialsProvider accountCredentialsProvider = Stub() + AmazonS3DataProvider amazonS3DataProvider = Stub() + NetflixTitusCredentials mockCredentials = Stub() + + String account = 'ACCT' + String location = 'us-best-1' + String id = '12345-12345' + + Task task = new Task( + id: 123, + startedAt: new Date(), + logLocation: [ + s3: [accountName: account, region: location, bucket: 'coolbucket', key: 'coolkey'] + ] + ) + + Job job = new Job(tasks: [task]) + + @Subject + TitusJobProvider titusJobProvider = new TitusJobProvider(titusClientProvider) + + def setup() { + titusJobProvider.objectMapper = new ObjectMapper() + titusJobProvider.accountCredentialsProvider = accountCredentialsProvider + titusJobProvider.amazonS3DataProvider = amazonS3DataProvider + accountCredentialsProvider.getCredentials(_) >> mockCredentials + titusClientProvider.getTitusClient(_, _) >> titusClient + titusClient.getJobAndAllRunningAndCompletedTasks(_) >> job + } + + void 'getFileContents should parse json if the file ends in .json'() { + given: + String fileName = 'data.json' + + String fileContents = ''' + { + "foo": "FOO", + "bar": { + "baz": "BAR.BAZ", + "list": [ "one", "two" ] + } + }''' + + when: + amazonS3DataProvider.getAdhocData(_, _, _, _) >> { args -> + OutputStream outStream = args[3] + outStream << fileContents + outStream.close() + } + + Map contents = titusJobProvider.getFileContents(account, location, id, fileName) + + then: + contents == [ + foo: 'FOO', + bar: [ + baz : 'BAR.BAZ', + list: ['one', 'two'] + ] + ] + } + + void 'getFileContents should parse yaml, if the file ends in .yml'() { + given: + String fileName = 'data.yml' + + String fileContents = ''' + foo: FOO + bar: + baz: BAR.BAZ + list: + - one + - two + ''' + + when: + amazonS3DataProvider.getAdhocData(_, _, _, _) >> { args -> + OutputStream outStream = args[3] + outStream << fileContents + outStream.close() + } + + Map contents = titusJobProvider.getFileContents(account, location, id, fileName) + + then: + contents == [ + foo: 'FOO', + bar: [ + baz : 'BAR.BAZ', + list: ['one', 'two'] + ] + ] + } + + void 'getFileContents should parse properties files for all other extensions'() { + given: + String fileContents = ''' + foo: FOO + bar.baz: BAR.BAZ + ''' + + when: + amazonS3DataProvider.getAdhocData(_, _, _, _) >> { args -> + OutputStream outStream = args[3] + outStream << fileContents + outStream.close() + } + + Map contents = titusJobProvider.getFileContents(account, location, id, fileName) + + then: + contents == [foo: 'FOO', 'bar.baz': 'BAR.BAZ'] + + where: + fileName | _ + 'data' | _ + 'data.properties' | _ + 'data.asdfadf' | _ + } +} From 14c994db0e788cfaae8bcf4fbeb132fb9cd4bb9c Mon Sep 17 00:00:00 2001 From: Neil Ye Date: Thu, 9 May 2019 19:26:36 +0800 Subject: [PATCH 04/11] fix(provider/azure): add logic to remove associated security group from subnet while deleting firewall (#3647) --- .../azure/client/AzureNetworkClient.groovy | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/clouddriver-azure/src/main/groovy/com/netflix/spinnaker/clouddriver/azure/client/AzureNetworkClient.groovy b/clouddriver-azure/src/main/groovy/com/netflix/spinnaker/clouddriver/azure/client/AzureNetworkClient.groovy index 0d16b1ebfe4..f43ab2d5b8c 100644 --- a/clouddriver-azure/src/main/groovy/com/netflix/spinnaker/clouddriver/azure/client/AzureNetworkClient.groovy +++ b/clouddriver-azure/src/main/groovy/com/netflix/spinnaker/clouddriver/azure/client/AzureNetworkClient.groovy @@ -472,6 +472,18 @@ class AzureNetworkClient extends AzureBaseClient { * @return a ServiceResponse object */ ServiceResponse deleteSecurityGroup(String resourceGroupName, String securityGroupName) { + def associatedSubnets = azure.networkSecurityGroups().getByResourceGroup(resourceGroupName, securityGroupName).listAssociatedSubnets() + + associatedSubnets?.each{ associatedSubnet -> + def subnetName = associatedSubnet.inner().name() + associatedSubnet + .parent() + .update() + .updateSubnet(subnetName) + .withoutNetworkSecurityGroup() + .parent() + .apply() + } deleteAzureResource( azure.networkSecurityGroups().&deleteByResourceGroup, From 1153f969118a474ef6a30583c3fc4e6ed9548539 Mon Sep 17 00:00:00 2001 From: Eric Zimanyi Date: Thu, 9 May 2019 14:00:11 -0400 Subject: [PATCH 05/11] feat(kubernetes): Add metrics support to live manifest mode (#3649) * test(kubernetes): Add tests to pod metrics caching * refactor(kubernetes): Improve typing of pod metrics The pod metrics code converts the metrics to Maps before using them, which makes it more difficult to use these metrics. Simplify this code by using the KubernetesPodMetric class that already exists. In order to preserve the serialized version stored in the cache, rename some fields to match what we're currently using to serialize. Then serialize/deserialize to/from that object when we write/read from the cache. * feat(kubernetes): Add metrics support to live manifest mode The live manifest supplier does not currently support returning metrics, so users with it enabled can't see metrics on the clusters tab. Add support for this. --- .../agent/KubernetesCacheDataConverter.java | 6 ++- .../agent/KubernetesMetricCachingAgent.java | 2 +- .../view/model/KubernetesV2Manifest.java | 4 +- .../KubernetesV2AbstractManifestProvider.java | 4 +- .../KubernetesV2LiveManifestProvider.java | 16 +++++-- .../KubernetesV2ManifestProvider.java | 4 +- .../v2/description/KubernetesPodMetric.java | 2 + .../v2/op/job/KubectlJobExecutor.java | 6 ++- .../v2/security/KubernetesV2Credentials.java | 6 +-- .../KubernetesCacheDataConvertSpec.groovy | 45 +++++++++++++++++++ 10 files changed, 78 insertions(+), 17 deletions(-) diff --git a/clouddriver-kubernetes/src/main/groovy/com/netflix/spinnaker/clouddriver/kubernetes/v2/caching/agent/KubernetesCacheDataConverter.java b/clouddriver-kubernetes/src/main/groovy/com/netflix/spinnaker/clouddriver/kubernetes/v2/caching/agent/KubernetesCacheDataConverter.java index f22ade1bf07..dcb03202d03 100644 --- a/clouddriver-kubernetes/src/main/groovy/com/netflix/spinnaker/clouddriver/kubernetes/v2/caching/agent/KubernetesCacheDataConverter.java +++ b/clouddriver-kubernetes/src/main/groovy/com/netflix/spinnaker/clouddriver/kubernetes/v2/caching/agent/KubernetesCacheDataConverter.java @@ -241,8 +241,10 @@ public static CacheData convertAsResource(String account, return defaultCacheData(key, infrastructureTtlSeconds, attributes, cacheRelationships); } - public static List getMetrics(CacheData cacheData) { - return mapper.convertValue(cacheData.getAttributes().get("metrics"), new TypeReference>() { }); + public static List getMetrics(CacheData cacheData) { + return mapper.convertValue( + cacheData.getAttributes().get("metrics"), + new TypeReference>() {}); } public static KubernetesManifest getManifest(CacheData cacheData) { diff --git a/clouddriver-kubernetes/src/main/groovy/com/netflix/spinnaker/clouddriver/kubernetes/v2/caching/agent/KubernetesMetricCachingAgent.java b/clouddriver-kubernetes/src/main/groovy/com/netflix/spinnaker/clouddriver/kubernetes/v2/caching/agent/KubernetesMetricCachingAgent.java index 9f815d6d37b..acbfc29b397 100644 --- a/clouddriver-kubernetes/src/main/groovy/com/netflix/spinnaker/clouddriver/kubernetes/v2/caching/agent/KubernetesMetricCachingAgent.java +++ b/clouddriver-kubernetes/src/main/groovy/com/netflix/spinnaker/clouddriver/kubernetes/v2/caching/agent/KubernetesMetricCachingAgent.java @@ -73,7 +73,7 @@ public CacheResult loadData(ProviderCache providerCache) { List cacheData = namespaces.parallelStream() .map(n -> { try { - return credentials.topPod(n) + return credentials.topPod(n, null) .stream() .map(m -> KubernetesCacheDataConverter.convertPodMetric(accountName, n, m)); } catch (KubectlJobExecutor.KubectlException e) { diff --git a/clouddriver-kubernetes/src/main/groovy/com/netflix/spinnaker/clouddriver/kubernetes/v2/caching/view/model/KubernetesV2Manifest.java b/clouddriver-kubernetes/src/main/groovy/com/netflix/spinnaker/clouddriver/kubernetes/v2/caching/view/model/KubernetesV2Manifest.java index 2decee179b5..c16048d7c66 100644 --- a/clouddriver-kubernetes/src/main/groovy/com/netflix/spinnaker/clouddriver/kubernetes/v2/caching/view/model/KubernetesV2Manifest.java +++ b/clouddriver-kubernetes/src/main/groovy/com/netflix/spinnaker/clouddriver/kubernetes/v2/caching/view/model/KubernetesV2Manifest.java @@ -17,6 +17,7 @@ package com.netflix.spinnaker.clouddriver.kubernetes.v2.caching.view.model; +import com.netflix.spinnaker.clouddriver.kubernetes.v2.description.KubernetesPodMetric; import com.netflix.spinnaker.clouddriver.kubernetes.v2.description.manifest.KubernetesManifest; import com.netflix.spinnaker.clouddriver.model.Manifest; import com.netflix.spinnaker.kork.artifacts.model.Artifact; @@ -29,7 +30,6 @@ import java.util.ArrayList; import java.util.HashSet; import java.util.List; -import java.util.Map; import java.util.Set; @Data @@ -46,5 +46,5 @@ public class KubernetesV2Manifest implements Manifest { private Set artifacts = new HashSet<>(); private List events = new ArrayList<>(); private List warnings = new ArrayList<>(); - private List metrics = new ArrayList<>(); + private List metrics = new ArrayList<>(); } diff --git a/clouddriver-kubernetes/src/main/groovy/com/netflix/spinnaker/clouddriver/kubernetes/v2/caching/view/provider/KubernetesV2AbstractManifestProvider.java b/clouddriver-kubernetes/src/main/groovy/com/netflix/spinnaker/clouddriver/kubernetes/v2/caching/view/provider/KubernetesV2AbstractManifestProvider.java index f15e6e735e4..c5810570186 100644 --- a/clouddriver-kubernetes/src/main/groovy/com/netflix/spinnaker/clouddriver/kubernetes/v2/caching/view/provider/KubernetesV2AbstractManifestProvider.java +++ b/clouddriver-kubernetes/src/main/groovy/com/netflix/spinnaker/clouddriver/kubernetes/v2/caching/view/provider/KubernetesV2AbstractManifestProvider.java @@ -18,6 +18,7 @@ import com.netflix.spinnaker.clouddriver.kubernetes.security.KubernetesNamedAccountCredentials; import com.netflix.spinnaker.clouddriver.kubernetes.v2.caching.view.model.KubernetesV2Manifest; +import com.netflix.spinnaker.clouddriver.kubernetes.v2.description.KubernetesPodMetric; import com.netflix.spinnaker.clouddriver.kubernetes.v2.description.KubernetesResourceProperties; import com.netflix.spinnaker.clouddriver.kubernetes.v2.description.KubernetesResourcePropertyRegistry; import com.netflix.spinnaker.clouddriver.kubernetes.v2.description.manifest.KubernetesKind; @@ -34,7 +35,6 @@ import java.util.Comparator; import java.util.List; -import java.util.Map; import java.util.Optional; import java.util.function.Function; import java.util.stream.Collectors; @@ -67,7 +67,7 @@ protected boolean makesLiveCalls(String account) { return getCredentials(account).map(KubernetesV2Credentials::isLiveManifestCalls).orElseThrow(() -> new IllegalArgumentException("Account " + account + " is not a Kubernetess v2 account")); } - protected KubernetesV2Manifest buildManifest(String account, KubernetesManifest manifest, List events, List metrics) { + protected KubernetesV2Manifest buildManifest(String account, KubernetesManifest manifest, List events, List metrics) { String namespace = manifest.getNamespace(); KubernetesKind kind = manifest.getKind(); diff --git a/clouddriver-kubernetes/src/main/groovy/com/netflix/spinnaker/clouddriver/kubernetes/v2/caching/view/provider/KubernetesV2LiveManifestProvider.java b/clouddriver-kubernetes/src/main/groovy/com/netflix/spinnaker/clouddriver/kubernetes/v2/caching/view/provider/KubernetesV2LiveManifestProvider.java index ff4c8e2af69..e5b938e8fbd 100644 --- a/clouddriver-kubernetes/src/main/groovy/com/netflix/spinnaker/clouddriver/kubernetes/v2/caching/view/provider/KubernetesV2LiveManifestProvider.java +++ b/clouddriver-kubernetes/src/main/groovy/com/netflix/spinnaker/clouddriver/kubernetes/v2/caching/view/provider/KubernetesV2LiveManifestProvider.java @@ -17,6 +17,7 @@ package com.netflix.spinnaker.clouddriver.kubernetes.v2.caching.view.provider; import com.netflix.spinnaker.clouddriver.kubernetes.v2.caching.view.model.KubernetesV2Manifest; +import com.netflix.spinnaker.clouddriver.kubernetes.v2.description.KubernetesPodMetric; import com.netflix.spinnaker.clouddriver.kubernetes.v2.description.KubernetesResourcePropertyRegistry; import com.netflix.spinnaker.clouddriver.kubernetes.v2.description.manifest.KubernetesKind; import com.netflix.spinnaker.clouddriver.kubernetes.v2.description.manifest.KubernetesManifest; @@ -28,9 +29,10 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import java.util.Collection; import java.util.Collections; import java.util.List; -import java.util.Map; +import java.util.stream.Collectors; @Component @Slf4j @@ -76,9 +78,15 @@ public KubernetesV2Manifest getManifest(String account, String location, String List events = credentials.eventsFor(kind, namespace, parsedName.getRight()); - // TODO kubectl top pod -n - // low-priority, pipeline-only mode doesn't need to see resource usage. - List metrics = Collections.emptyList(); + List metrics = Collections.emptyList(); + if (kind == KubernetesKind.POD && credentials.isMetrics()) { + metrics = credentials + .topPod(namespace, parsedName.getRight()) + .stream() + .map(KubernetesPodMetric::getContainerMetrics) + .flatMap(Collection::stream) + .collect(Collectors.toList()); + } return buildManifest(account, manifest, events, metrics); } diff --git a/clouddriver-kubernetes/src/main/groovy/com/netflix/spinnaker/clouddriver/kubernetes/v2/caching/view/provider/KubernetesV2ManifestProvider.java b/clouddriver-kubernetes/src/main/groovy/com/netflix/spinnaker/clouddriver/kubernetes/v2/caching/view/provider/KubernetesV2ManifestProvider.java index adb691ce2b1..6b5bba0e6d2 100644 --- a/clouddriver-kubernetes/src/main/groovy/com/netflix/spinnaker/clouddriver/kubernetes/v2/caching/view/provider/KubernetesV2ManifestProvider.java +++ b/clouddriver-kubernetes/src/main/groovy/com/netflix/spinnaker/clouddriver/kubernetes/v2/caching/view/provider/KubernetesV2ManifestProvider.java @@ -21,6 +21,7 @@ import com.netflix.spinnaker.clouddriver.kubernetes.v2.caching.Keys; import com.netflix.spinnaker.clouddriver.kubernetes.v2.caching.agent.KubernetesCacheDataConverter; import com.netflix.spinnaker.clouddriver.kubernetes.v2.caching.view.model.KubernetesV2Manifest; +import com.netflix.spinnaker.clouddriver.kubernetes.v2.description.KubernetesPodMetric; import com.netflix.spinnaker.clouddriver.kubernetes.v2.description.KubernetesResourceProperties; import com.netflix.spinnaker.clouddriver.kubernetes.v2.description.KubernetesResourcePropertyRegistry; import com.netflix.spinnaker.clouddriver.kubernetes.v2.description.manifest.KubernetesKind; @@ -37,7 +38,6 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; -import java.util.Map; import java.util.Objects; import java.util.Optional; import java.util.stream.Collectors; @@ -129,7 +129,7 @@ private KubernetesV2Manifest fromCacheData(CacheData data, String account) { .collect(Collectors.toList()); String metricKey = Keys.metric(kind, account, namespace, manifest.getName()); - List metrics = cacheUtils.getSingleEntry(Keys.Kind.KUBERNETES_METRIC.toString(), metricKey) + List metrics = cacheUtils.getSingleEntry(Keys.Kind.KUBERNETES_METRIC.toString(), metricKey) .map(KubernetesCacheDataConverter::getMetrics) .orElse(Collections.emptyList()); diff --git a/clouddriver-kubernetes/src/main/groovy/com/netflix/spinnaker/clouddriver/kubernetes/v2/description/KubernetesPodMetric.java b/clouddriver-kubernetes/src/main/groovy/com/netflix/spinnaker/clouddriver/kubernetes/v2/description/KubernetesPodMetric.java index 62414f6539c..481f195e3be 100644 --- a/clouddriver-kubernetes/src/main/groovy/com/netflix/spinnaker/clouddriver/kubernetes/v2/description/KubernetesPodMetric.java +++ b/clouddriver-kubernetes/src/main/groovy/com/netflix/spinnaker/clouddriver/kubernetes/v2/description/KubernetesPodMetric.java @@ -16,6 +16,7 @@ package com.netflix.spinnaker.clouddriver.kubernetes.v2.description; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; @@ -37,6 +38,7 @@ public class KubernetesPodMetric { @Builder @NoArgsConstructor @AllArgsConstructor + @JsonIgnoreProperties(ignoreUnknown = true) public static class ContainerMetric { String containerName; Map metrics; diff --git a/clouddriver-kubernetes/src/main/groovy/com/netflix/spinnaker/clouddriver/kubernetes/v2/op/job/KubectlJobExecutor.java b/clouddriver-kubernetes/src/main/groovy/com/netflix/spinnaker/clouddriver/kubernetes/v2/op/job/KubectlJobExecutor.java index b6a5b300806..b769053c1a4 100644 --- a/clouddriver-kubernetes/src/main/groovy/com/netflix/spinnaker/clouddriver/kubernetes/v2/op/job/KubectlJobExecutor.java +++ b/clouddriver-kubernetes/src/main/groovy/com/netflix/spinnaker/clouddriver/kubernetes/v2/op/job/KubectlJobExecutor.java @@ -489,10 +489,14 @@ private String getOAuthToken(KubernetesV2Credentials credentials) { return status.getOutput(); } - public Collection topPod(KubernetesV2Credentials credentials, String namespace) { + public Collection topPod(KubernetesV2Credentials credentials, + String namespace, String pod) { List command = kubectlNamespacedAuthPrefix(credentials, namespace); command.add("top"); command.add("po"); + if (pod != null) { + command.add(pod); + } command.add("--containers"); diff --git a/clouddriver-kubernetes/src/main/groovy/com/netflix/spinnaker/clouddriver/kubernetes/v2/security/KubernetesV2Credentials.java b/clouddriver-kubernetes/src/main/groovy/com/netflix/spinnaker/clouddriver/kubernetes/v2/security/KubernetesV2Credentials.java index 42bca1f903f..042d020ff15 100644 --- a/clouddriver-kubernetes/src/main/groovy/com/netflix/spinnaker/clouddriver/kubernetes/v2/security/KubernetesV2Credentials.java +++ b/clouddriver-kubernetes/src/main/groovy/com/netflix/spinnaker/clouddriver/kubernetes/v2/security/KubernetesV2Credentials.java @@ -287,7 +287,7 @@ private void determineOmitKinds() { if (metrics) { try { log.info("Checking if pod metrics are readable..."); - topPod(checkNamespace); + topPod(checkNamespace, null); } catch (Exception e) { log.warn("Could not read pod metrics in account '{}' for reason: {}", accountName, e.getMessage()); log.debug("Reading logs failed with exception: ", e); @@ -352,8 +352,8 @@ public List delete(KubernetesKind kind, String namespace, String name, K return runAndRecordMetrics("delete", kind, namespace, () -> jobExecutor.delete(this, kind, namespace, name, labelSelectors, options)); } - public Collection topPod(String namespace) { - return runAndRecordMetrics("top", KubernetesKind.POD, namespace, () -> jobExecutor.topPod(this, namespace)); + public Collection topPod(String namespace, String pod) { + return runAndRecordMetrics("top", KubernetesKind.POD, namespace, () -> jobExecutor.topPod(this, namespace, pod)); } public void deploy(KubernetesManifest manifest) { diff --git a/clouddriver-kubernetes/src/test/groovy/com/netflix/spinnaker/clouddriver/kubernetes/v2/caching/agent/KubernetesCacheDataConvertSpec.groovy b/clouddriver-kubernetes/src/test/groovy/com/netflix/spinnaker/clouddriver/kubernetes/v2/caching/agent/KubernetesCacheDataConvertSpec.groovy index ec9ef44f457..151f0ecff7e 100644 --- a/clouddriver-kubernetes/src/test/groovy/com/netflix/spinnaker/clouddriver/kubernetes/v2/caching/agent/KubernetesCacheDataConvertSpec.groovy +++ b/clouddriver-kubernetes/src/test/groovy/com/netflix/spinnaker/clouddriver/kubernetes/v2/caching/agent/KubernetesCacheDataConvertSpec.groovy @@ -21,6 +21,7 @@ import com.fasterxml.jackson.databind.ObjectMapper import com.netflix.spinnaker.cats.cache.DefaultCacheData import com.netflix.spinnaker.clouddriver.kubernetes.KubernetesCloudProvider import com.netflix.spinnaker.clouddriver.kubernetes.v2.caching.Keys +import com.netflix.spinnaker.clouddriver.kubernetes.v2.description.KubernetesPodMetric import com.netflix.spinnaker.clouddriver.kubernetes.v2.description.manifest.KubernetesApiVersion import com.netflix.spinnaker.clouddriver.kubernetes.v2.description.manifest.KubernetesKind import com.netflix.spinnaker.clouddriver.kubernetes.v2.description.manifest.KubernetesManifest @@ -143,6 +144,50 @@ metadata: KubernetesKind.SERVICE | KubernetesApiVersion.V1 | ["cluster": [Keys.cluster("account", "app", "name")], "application": [Keys.application("blarg"), Keys.application("asdfasdf")]] } + @Unroll + def "correctly builds cache data entry for pod metrics"() { + setup: + def account = "my-account" + def namespace = "my-namespace" + def podName = "pod-name" + def podMetric = KubernetesPodMetric.builder() + .podName(podName) + .containerMetrics(containerMetrics) + .build() + + when: + def cacheData = KubernetesCacheDataConverter.convertPodMetric(account, namespace, podMetric) + + then: + cacheData.attributes == [ + name: podName, + namespace: namespace, + metrics: containerMetrics + ] + + when: + def metrics = KubernetesCacheDataConverter.getMetrics(cacheData) + + then: + metrics == containerMetrics + + where: + containerMetrics << [ + [containerMetric("container-a")], + [containerMetric("container-a"), containerMetric("container-b")], + [] + ] + } + + def containerMetric(String containerName) { + return KubernetesPodMetric.ContainerMetric.builder() + .containerName(containerName) + .metrics([ + "CPU(cores)": "10m", + "MEMORY(bytes)": "2Mi" + ]).build() + } + def filterRelationships(Collection keys, List> existingResources) { return keys.findAll { sk -> def key = (Keys.InfrastructureCacheKey) Keys.parseKey(sk).get() From 0524d08f6bcf775c469a0576a79b2679b5653325 Mon Sep 17 00:00:00 2001 From: Emily Burns Date: Thu, 9 May 2019 14:11:34 -0700 Subject: [PATCH 06/11] Clouddriver to boot2 (#3650) * chore(boot2): dep changes, property changes, groovy changes, oh my * fix(openstack): Ignore all tests * fix(core): More explicit optional jedispool bean mapping * chore(*): Gradle 5 * WIP bomification * WIP try and get cats to compile, cats-sql tests failing * downgrading jooq so sql tests pass * chore(deps): bomification of clouddriver * chore(bom): make non-aws services compile * fix(tasks): fix serialization of task status * chore(build): update to spinnaker-gradle-project 6.0.0 * fix(build): fixup missing travis build flag * fix(serverGroups): disabled comes back in json * fix(jackson): amazonObjectMapper vs autoconfigured ObjectMapper fixes an issue where the presence of amazonObjectMapper prevents creation of the autoconfigured ObjectMapper for webmvc message converters. * fix(objectMapper): don't use amazonObjectMapper outside of aws code * fix(aws): don't use aws object mapper for caching, it ruins casing * fix(elasticsearch): Don't autoconfigure elasticsearch/jest (#3644) We pin our elasticsearch and jest libraries to versions much older than Spring pulls in. This is currently breaking the Elasticsearch health check, so disable it by exluding autoconf of ElasticSearchJestHealthIndicatorAutoConfiguration. Given that we configure elasticsearch ourselves, we should also disable ElasticsearchAutoConfiguration and JestAutoConfiguration. These aren't currently broken, but they are liable to break given the huge version skew between what we have on the classpath and what Spring expects. * fix(boot2): minor kebabisms * chore(kork): bump kork version for jooq version force * fix(deps): add snake yml dep to titus * chore(deps): remove version pinning, add local mvn support back * fix(deps): remove jetty-servlets * fix(compression): add compression property --- build.gradle | 118 ++++++------------ cats/cats-core/cats-core.gradle | 14 ++- .../cats/cluster/DefaultNodeIdentity.java | 1 - cats/cats-dynomite/cats-dynomite.gradle | 18 ++- cats/cats-redis/cats-redis.gradle | 23 ++-- cats/cats-sql/cats-sql.gradle | 69 ++++++---- .../sql/controllers/CatsSqlAdminController.kt | 4 +- .../config/SqlAgentSchedulerConfiguration.kt | 4 +- .../spinnaker/config/SqlCacheConfiguration.kt | 12 +- .../spinnaker/cats/sql/SqlCacheSpec.groovy | 21 ++-- .../cats/sql/SqlProviderCacheSpec.groovy | 13 +- cats/cats-test/cats-test.gradle | 15 ++- cats/cats.gradle | 17 +-- .../clouddriver-appengine.gradle | 38 ++++-- .../appengine/AppengineJobExecutor.groovy | 2 +- .../deploy/AppengineSafeRetry.groovy | 8 +- .../clouddriver-artifacts.gradle | 59 ++++----- clouddriver-aws/clouddriver-aws.gradle | 55 +++++--- .../controllers/CloudFormationController.java | 10 +- .../DeployCloudFormationAtomicOperation.java | 2 + .../aws/edda/EddaConfiguration.groovy | 4 +- ...eTerminationConfigurationProperties.groovy | 2 +- ...nceTerminationLifecycleWorkerProvider.java | 5 +- ...aunchFailureConfigurationProperties.groovy | 2 +- .../LifecycleSubscriberConfiguration.java | 5 +- ...tractAmazonLoadBalancerCachingAgent.groovy | 2 +- .../agent/AmazonSubnetCachingAgent.groovy | 28 ++--- .../AwsInfrastructureProviderConfig.groovy | 7 +- .../provider/config/AwsProviderConfig.groovy | 1 + .../view/AmazonApplicationProvider.groovy | 3 +- .../view/AmazonCloudFormationProvider.java | 3 +- .../view/AmazonElasticIpProvider.groovy | 3 +- .../provider/view/AmazonImageProvider.java | 3 +- .../view/AmazonInstanceTypeProvider.groovy | 3 +- ...onInstanceTypeProviderConfiguration.groovy | 2 +- .../AmazonReservationReportProvider.groovy | 2 + .../provider/view/AmazonS3DataProvider.java | 3 +- .../view/AmazonSecurityGroupProvider.groovy | 3 +- .../AmazonServerCertificateProvider.groovy | 3 +- .../provider/view/AmazonSubnetProvider.groovy | 10 +- .../provider/view/AmazonVpcProvider.groovy | 11 +- .../spinnaker/config/AwsConfiguration.groovy | 19 +-- .../CloudFormationControllerSpec.groovy | 49 +++----- ...sumeAsgProcessesAtomicOperationSpec.groovy | 13 +- ...pendAsgProcessesAtomicOperationSpec.groovy | 14 ++- .../SecurityGroupLookupSpec.groovy | 2 +- ...AmazonSecurityGroupCachingAgentSpec.groovy | 4 +- .../agent/AmazonSubnetCachingAgentSpec.groovy | 4 +- .../agent/ImageCachingAgentSpec.groovy | 6 +- .../view/AmazonSubnetProviderSpec.groovy | 3 +- clouddriver-azure/clouddriver-azure.gradle | 27 +++- .../clouddriver-cloudfoundry.gradle | 55 ++++---- .../cloudfoundry/client/ServiceInstances.java | 5 +- .../ArtifactCredentialsFromString.java | 20 ++- .../cloudfoundry/client/ApplicationsTest.java | 6 +- .../client/OrganizationsTest.java | 4 +- .../cloudfoundry/client/RoutesTest.java | 4 +- .../client/ServiceInstancesTest.java | 26 ++-- .../cloudfoundry/client/ServiceKeysTest.java | 16 +-- .../cloudfoundry/client/SpacesTest.java | 2 +- ...FoundryServerGroupAtomicOperationTest.java | 8 +- ...FoundryServerGroupAtomicOperationTest.java | 4 +- ...FoundryServerGroupAtomicOperationTest.java | 4 +- clouddriver-consul/clouddriver-consul.gradle | 12 +- .../clouddriver-core-tck.gradle | 10 +- .../core/test/TaskRepositoryTck.java | 2 +- clouddriver-core/clouddriver-core.gradle | 58 +++++---- .../cache/AgentSchedulerConfig.java | 2 +- .../clouddriver/cache/CacheConfig.groovy | 4 +- .../cache/CatsInMemorySearchProperties.java | 2 +- .../cache/DynomiteCacheConfig.groovy | 2 +- .../config/CloudDriverConfig.groovy | 2 +- .../DualTaskRepositoryConfiguration.java | 4 +- .../clouddriver/config/LocalJobConfig.java | 2 +- ...ProjectClustersCachingAgentProperties.java | 2 +- .../clouddriver/core/DynomiteConfig.groovy | 8 +- .../clouddriver/core/RedisConfig.groovy | 9 +- .../clouddriver/data/task/DefaultTask.groovy | 10 +- .../EnableDisablePercentageCategorizer.groovy | 2 +- .../clouddriver/model/ServerGroup.java | 2 + ...tAtomicOperationsCredentialsSupport.groovy | 1 - clouddriver-dcos/clouddriver-dcos.gradle | 26 +++- clouddriver-docker/clouddriver-docker.gradle | 23 +++- .../v2/auth/DockerBearerTokenService.groovy | 9 +- .../config/DockerRegistryConfiguration.groovy | 4 +- clouddriver-ecs/clouddriver-ecs.gradle | 37 +++++- .../agent/EcsClusterCachingAgent.java | 2 +- .../agent/TaskHealthCachingAgent.java | 2 +- .../ecs/view/EcsInstanceProvider.java | 2 +- ...reateServerGroupAtomicOperationSpec.groovy | 118 +++++------------- .../agent/IamRoleCachingAgentTest.java | 16 +-- .../clouddriver-elasticsearch-aws.gradle | 22 +++- .../config/ElasticSearchAmazonConfig.kt | 2 +- .../clouddriver-elasticsearch.gradle | 24 +++- ...kUpsertEntityTagsDescriptionValidator.java | 2 +- .../spinnaker/config/ElasticSearchConfig.java | 5 +- .../config/ElasticSearchConfigProperties.java | 2 +- ...UpsertEntityTagsAtomicOperationSpec.groovy | 4 +- clouddriver-eureka/clouddriver-eureka.gradle | 15 ++- .../config/EurekaProviderConfiguration.groovy | 4 +- .../clouddriver-google-common.gradle | 19 ++- clouddriver-google/clouddriver-google.gradle | 40 ++++-- .../google/GoogleExecutorTraits.java | 3 +- .../google/deploy/SafeRetry.groovy | 9 +- .../BasicGoogleDeployDescription.groovy | 1 + .../agent/GoogleImageCachingAgent.groovy | 2 +- ...gleImageTagsAtomicOperationUnitSpec.groovy | 8 +- ...oogleDeployDescriptionValidatorSpec.groovy | 12 +- .../clouddriver-kubernetes.gradle | 42 ++++--- .../v1/deploy/KubernetesUtil.groovy | 2 +- .../v1/security/KubernetesV1Credentials.java | 4 +- .../v2/names/KubernetesManifestNamer.java | 4 +- .../v2/op/job/KubectlJobExecutor.java | 2 +- ...etesLoadBalancerAtomicOperationSpec.groovy | 2 +- clouddriver-lambda/clouddriver-lambda.gradle | 26 +++- .../ops/UpsertLambdaAliasAtomicOperation.java | 2 +- .../provider/agent/IamRoleCachingAgent.java | 3 +- .../clouddriver-openstack.gradle | 0 ...penstackLoadBalancerAtomicOperation.groovy | 0 .../DeployOpenstackAtomicOperation.groovy | 0 .../model/OpenstackServerGroup.groovy | 0 .../view/OpenstackClusterProvider.groovy | 0 .../OpenstackCredentialsInitializer.groovy | 0 .../openstack/task/TaskStatusAware.java | 15 +++ .../OpenstackDescriptionValidatorSpec.groovy | 0 .../view/OpenstackClusterProviderSpec.groovy | 0 clouddriver-oracle/clouddriver-oracle.gradle | 30 ++++- .../view/OracleInstanceProvider.groovy | 3 +- .../clouddriver-scattergather.gradle | 13 +- .../clouddriver-security.gradle | 24 ++-- .../clouddriver-sql-mysql.gradle | 6 +- clouddriver-sql/clouddriver-sql.gradle | 21 ++-- .../spinnaker/config/SqlConfiguration.kt | 10 +- .../config/SqlTaskCleanupAgentProperties.kt | 2 +- .../sql/SqlTaskRepositoryTest.java | 4 +- clouddriver-titus/clouddriver-titus.gradle | 51 ++++++-- .../caching/TitusCachingProviderConfig.groovy | 4 +- .../agents/TitusStreamingUpdateAgent.java | 4 +- .../titus/client/RegionScopedTitusClient.java | 6 +- .../client/SimpleGrpcChannelFactory.groovy | 2 +- ...actTitusDescriptionValidatorSupport.groovy | 8 +- clouddriver-web/clouddriver-web.gradle | 50 +++++--- clouddriver-web/config/clouddriver.yml | 2 + .../netflix/spinnaker/clouddriver/Main.groovy | 27 +++- .../controllers/DataController.groovy | 13 +- .../controllers/FunctionController.java | 2 - .../controllers/SearchController.groovy | 5 +- .../controllers/TaskController.groovy | 2 +- .../RequestQueueConfiguration.java | 2 +- .../pooled/PooledRequestQueue.java | 2 +- .../controllers/DataControllerSpec.groovy | 43 +++++-- .../controllers/SearchControllerSpec.groovy | 9 +- gradle.properties | 4 +- gradle/buildViaTravis.sh | 6 +- gradle/init-publish.gradle | 14 --- gradle/installViaTravis.sh | 4 +- gradle/spek.gradle | 23 ++-- gradle/wrapper/gradle-wrapper.properties | 2 +- 158 files changed, 1156 insertions(+), 794 deletions(-) create mode 100644 clouddriver-openstack/clouddriver-openstack.gradle create mode 100644 clouddriver-openstack/src/main/groovy/com/netflix/spinnaker/clouddriver/openstack/deploy/ops/loadbalancer/UpsertOpenstackLoadBalancerAtomicOperation.groovy create mode 100644 clouddriver-openstack/src/main/groovy/com/netflix/spinnaker/clouddriver/openstack/deploy/ops/servergroup/DeployOpenstackAtomicOperation.groovy create mode 100644 clouddriver-openstack/src/main/groovy/com/netflix/spinnaker/clouddriver/openstack/model/OpenstackServerGroup.groovy create mode 100644 clouddriver-openstack/src/main/groovy/com/netflix/spinnaker/clouddriver/openstack/provider/view/OpenstackClusterProvider.groovy create mode 100644 clouddriver-openstack/src/main/groovy/com/netflix/spinnaker/clouddriver/openstack/security/OpenstackCredentialsInitializer.groovy create mode 100644 clouddriver-openstack/src/main/groovy/com/netflix/spinnaker/clouddriver/openstack/task/TaskStatusAware.java create mode 100644 clouddriver-openstack/src/test/groovy/com/netflix/spinnaker/clouddriver/openstack/deploy/validators/OpenstackDescriptionValidatorSpec.groovy create mode 100644 clouddriver-openstack/src/test/groovy/com/netflix/spinnaker/clouddriver/openstack/provider/view/OpenstackClusterProviderSpec.groovy delete mode 100644 gradle/init-publish.gradle diff --git a/build.gradle b/build.gradle index 77407e3e333..63a56a8b462 100644 --- a/build.gradle +++ b/build.gradle @@ -14,11 +14,15 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + buildscript { ext { + korkVersion = "5.2.6" + fiatVersion = "1.0.4" kotlinVersion = "1.3.10" junitPlatformVersion = "1.0.2" } + repositories { jcenter() maven { url "https://spinnaker.bintray.com/gradle" } @@ -26,95 +30,65 @@ buildscript { } dependencies { - classpath 'com.netflix.spinnaker.gradle:spinnaker-dev-plugin:5.2.1' - classpath "org.junit.platform:junit-platform-gradle-plugin:${junitPlatformVersion}" + classpath 'com.netflix.spinnaker.gradle:spinnaker-dev-plugin:6.0.0' + if (Boolean.valueOf(enablePublishing)) { + classpath "com.netflix.spinnaker.gradle:spinnaker-gradle-project:6.0.0" + } classpath "com.netflix.nebula:nebula-kotlin-plugin:$kotlinVersion" + classpath "org.junit.platform:junit-platform-gradle-plugin:${junitPlatformVersion}" + } } allprojects { group = "com.netflix.spinnaker.clouddriver" apply plugin: 'spinnaker.base-project' - apply plugin: 'groovy' - - ext { - spinnakerDependenciesVersion = '1.44.1' - if (project.hasProperty('spinnakerDependenciesVersion')) { - spinnakerDependenciesVersion = project.property('spinnakerDependenciesVersion') - } + if (Boolean.valueOf(enablePublishing)) { + apply plugin: 'spinnaker.project' } + apply plugin: 'java-library' + apply plugin: 'groovy' + apply plugin: 'nebula.kotlin' - def checkLocalVersions = [spinnakerDependenciesVersion: spinnakerDependenciesVersion] - if (ext.has('versions')) { - def extVers = ext.get('versions') - if (extVers instanceof Map) { - checkLocalVersions.putAll(extVers) - } - } + sourceSets.main.java.srcDirs = [] + sourceSets.main.groovy.srcDirs += ["src/main/java"] - def localVersions = checkLocalVersions.findAll { it.value.endsWith('-SNAPSHOT') } - if (localVersions) { - logger.info("Enabling mavenLocal repo for $localVersions") - repositories { - mavenLocal() - } - } + dependencies { + implementation platform("com.netflix.spinnaker.kork:kork-bom:$korkVersion") - spinnaker { - dependenciesVersion = spinnakerDependenciesVersion + annotationProcessor platform("com.netflix.spinnaker.kork:kork-bom:$korkVersion") + annotationProcessor "org.projectlombok:lombok" + testAnnotationProcessor platform("com.netflix.spinnaker.kork:kork-bom:$korkVersion") + testAnnotationProcessor "org.projectlombok:lombok" } test { testLogging { exceptionFormat = 'full' - } - if (project.hasProperty('slowTest')) { - long slow = 250 - try { - slow = Long.parseLong(project.property('slowTest')) - } catch (Exception ex) { - } - afterTest { desc, result -> - long duration = result.getEndTime() - result.getStartTime() - if (duration > slow) { - logger.warn("test exceeded $slow ms: $desc.className :: $desc.name ($duration milliseconds)") + if (project.hasProperty('slowTest')) { + long slow = 250 + try { + slow = Long.parseLong(project.property('slowTest')) + } catch (Exception ex) { + } + afterTest { desc, result -> + long duration = result.getEndTime() - result.getStartTime() + if (duration > slow) { + logger.warn("test exceeded $slow ms: $desc.className :: $desc.name ($duration milliseconds)") + } } } + minHeapSize = "512m" + maxHeapSize = "512m" } - minHeapSize = "512m" - maxHeapSize = "512m" } } subprojects { project -> - - configurations { - all { - exclude group: 'javax.servlet', module: 'servlet-api' - exclude group: 'javax.ws.rs', module: 'jsr311-api' - resolutionStrategy { - force 'org.antlr:antlr-runtime:3.5.2' - eachDependency { - if (it.requested.group == 'asm' || it.requested.group == 'org.ow2.asm') { - it.useTarget group: 'org.ow2.asm', name: 'asm-all', version: '5.0.3' - } - if (it.requested.group == 'junit') { - it.useTarget group: 'junit', name: 'junit', version: '4.12' - } - if (it.requested.group == 'cglib' || it.requested.name == 'cglib') { - it.useTarget group: 'cglib', name: 'cglib', version: '3.2.0' - } - if (it.requested.group == 'antlr') { - it.useTarget group: 'org.antlr', name: it.requested.name, version: '3.5.2' - } - if (it.requested.group == 'org.apache.xbean') { - it.useVersion '4.3' - } - if (it.requested.group == 'ch.qos.logback') { - it.useVersion '1.2.3' - } - } - } + if ([korkVersion, fiatVersion].any { it.endsWith("-SNAPSHOT") }) { + logger.info("Enabling mavenLocal") + repositories { + mavenLocal() } } @@ -123,18 +97,6 @@ subprojects { project -> jvmArgs '-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=7102' } } - - dependencies { - compile spinnaker.dependency('groovy') - spinnaker.group('test') - } - - //c&p this because NetflixOss reverts it to 1.7 and ends up getting applied last.. - project.plugins.withType(JavaBasePlugin) { - JavaPluginConvention convention = project.convention.getPlugin(JavaPluginConvention) - convention.sourceCompatibility = JavaVersion.VERSION_1_8 - convention.targetCompatibility = JavaVersion.VERSION_1_8 - } } defaultTasks ':clouddriver-web:run' diff --git a/cats/cats-core/cats-core.gradle b/cats/cats-core/cats-core.gradle index 5499481aeca..00fda05e461 100644 --- a/cats/cats-core/cats-core.gradle +++ b/cats/cats-core/cats-core.gradle @@ -1,7 +1,13 @@ dependencies { - compile spinnaker.dependency('slf4jApi') - compile spinnaker.dependency('jacksonAnnotations') - compileOnly spinnaker.dependency("lombok") + implementation "org.slf4j:slf4j-api" + implementation "com.fasterxml.jackson.core:jackson-annotations" + implementation "org.codehaus.groovy:groovy-all" - testCompile project(":cats:cats-test") + compileOnly "org.projectlombok:lombok" + annotationProcessor "org.projectlombok:lombok" + testAnnotationProcessor "org.projectlombok:lombok" + + testImplementation project(":cats:cats-test") + + testImplementation "org.spockframework:spock-core" } diff --git a/cats/cats-core/src/main/java/com/netflix/spinnaker/cats/cluster/DefaultNodeIdentity.java b/cats/cats-core/src/main/java/com/netflix/spinnaker/cats/cluster/DefaultNodeIdentity.java index 6331176241e..bfe1aee1faf 100644 --- a/cats/cats-core/src/main/java/com/netflix/spinnaker/cats/cluster/DefaultNodeIdentity.java +++ b/cats/cats-core/src/main/java/com/netflix/spinnaker/cats/cluster/DefaultNodeIdentity.java @@ -37,7 +37,6 @@ public class DefaultNodeIdentity implements NodeIdentity { public static final String UNKNOWN_HOST = "UnknownHost"; private static final long REFRESH_INTERVAL = TimeUnit.SECONDS.toMillis(30); - @SuppressWarnings("PMD.EmptyCatchBlock") private static String getHostName(String validationHost, int validationPort) { final Enumeration interfaces; try { diff --git a/cats/cats-dynomite/cats-dynomite.gradle b/cats/cats-dynomite/cats-dynomite.gradle index 47bda644e1c..9d0fc632886 100644 --- a/cats/cats-dynomite/cats-dynomite.gradle +++ b/cats/cats-dynomite/cats-dynomite.gradle @@ -1,8 +1,16 @@ dependencies { - compile project(':cats:cats-redis') - compile("com.netflix.spinnaker.kork:kork-dynomite:${spinnaker.version("kork")}") - compile('net.jodah:failsafe:1.0.4') + implementation project(":cats:cats-redis") + implementation project(":cats:cats-core") - testCompile project(':cats:cats-test') - testCompile spinnaker.dependency('korkJedisTest') + implementation "com.netflix.spinnaker.kork:kork-dynomite" + implementation "net.jodah:failsafe:1.0.4" + + compileOnly "org.projectlombok:lombok" + annotationProcessor "org.projectlombok:lombok" + testAnnotationProcessor "org.projectlombok:lombok" + + testImplementation project(":cats:cats-test") + testImplementation "com.netflix.spinnaker.kork:kork-jedis-test" + + testImplementation "org.spockframework:spock-core" } diff --git a/cats/cats-redis/cats-redis.gradle b/cats/cats-redis/cats-redis.gradle index 5f98a620dc3..380b8f21660 100644 --- a/cats/cats-redis/cats-redis.gradle +++ b/cats/cats-redis/cats-redis.gradle @@ -1,9 +1,18 @@ dependencies { - compile project(':cats:cats-core') - compile spinnaker.dependency('eurekaClient') - compile spinnaker.dependency('guava') - compile "com.netflix.spinnaker.kork:kork-jedis:${spinnaker.version("kork")}" - compile "com.fasterxml.jackson.core:jackson-databind:${spinnaker.version('jackson')}" - testCompile project(':cats:cats-test') - testCompile spinnaker.dependency('korkJedisTest') + implementation project(":cats:cats-core") + + compileOnly "org.projectlombok:lombok" + annotationProcessor "org.projectlombok:lombok" + testAnnotationProcessor "org.projectlombok:lombok" + + implementation "com.fasterxml.jackson.core:jackson-databind" + implementation "com.google.guava:guava" + implementation "com.netflix.eureka:eureka-client" + implementation "com.netflix.spinnaker.kork:kork-jedis" + implementation "com.google.guava:guava:27.1-jre" + + testImplementation project(":cats:cats-test") + testImplementation "com.netflix.spinnaker.kork:kork-jedis-test" + + testImplementation "org.spockframework:spock-core" } diff --git a/cats/cats-sql/cats-sql.gradle b/cats/cats-sql/cats-sql.gradle index 996ead5fd31..1af3e148e7e 100644 --- a/cats/cats-sql/cats-sql.gradle +++ b/cats/cats-sql/cats-sql.gradle @@ -21,27 +21,50 @@ apply plugin: "groovy" tasks.compileGroovy.enabled = false dependencies { - spinnaker.group("spockBase") - testCompile spinnaker.dependency("groovy") - - compile project(':cats:cats-core') - compile project(':cats:cats-redis') - compile project(":clouddriver-sql") - compile project(":clouddriver-core") - compile("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.1.1") - compile("org.jetbrains.kotlinx:kotlinx-coroutines-core-common:1.1.1") - compile("org.jetbrains.kotlinx:kotlinx-coroutines-slf4j:1.1.1") - - testCompile "com.h2database:h2:1.4.197" - - testCompile "io.strikt:strikt-core:0.11.5" - testCompile "org.assertj:assertj-core:3.9.0" - testCompile "org.junit.jupiter:junit-jupiter-api:${spinnaker.version("jupiter")}" - testCompile "com.nhaarman:mockito-kotlin:1.5.0" - - testCompile project(':cats:cats-test') - testCompile(spinnaker.dependency("korkSqlTest")) - testRuntime "org.junit.jupiter:junit-jupiter-engine:${spinnaker.version("jupiter")}" - testRuntime "org.junit.platform:junit-platform-launcher:${spinnaker.version("junit5")}" - testRuntime "org.junit.vintage:junit-vintage-engine:${spinnaker.version("junitVintage")}" + implementation project(":cats:cats-core") + implementation project(":cats:cats-redis") + implementation project(":clouddriver-core") + implementation project(":clouddriver-security") + implementation project(":clouddriver-sql") + + compileOnly "org.projectlombok:lombok" + annotationProcessor "org.projectlombok:lombok" + testAnnotationProcessor "org.projectlombok:lombok" + + implementation "com.fasterxml.jackson.core:jackson-databind" + implementation "com.h2database:h2:1.4.197" + implementation "com.netflix.spectator:spectator-api" + implementation "com.netflix.spinnaker.fiat:fiat-api:$fiatVersion" + implementation "com.netflix.spinnaker.fiat:fiat-core:$fiatVersion" + implementation "com.netflix.spinnaker.kork:kork-core" + implementation "com.netflix.spinnaker.kork:kork-sql" + implementation "de.huxhorn.sulky:de.huxhorn.sulky.ulid" + implementation "io.github.resilience4j:resilience4j-retry" + implementation "io.strikt:strikt-core" + implementation "io.vavr:vavr:0.10.0" + implementation "org.assertj:assertj-core" + implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core-common:1.1.1" + implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.1.1" + implementation "org.jetbrains.kotlinx:kotlinx-coroutines-slf4j:1.1.1" + implementation("org.jooq:jooq:3.9.6"){ + force = true + } + implementation "org.springframework.boot:spring-boot-starter-web" + + testImplementation project(":cats:cats-test") + + testImplementation "cglib:cglib-nodep" + testImplementation "com.netflix.spinnaker.kork:kork-sql-test" + testImplementation "com.nhaarman:mockito-kotlin" + testImplementation "junit:junit" + testImplementation "org.hamcrest:hamcrest-core" + testImplementation "org.junit.jupiter:junit-jupiter-api" + testImplementation "org.junit.jupiter:junit-jupiter-engine" + testImplementation "org.junit.platform:junit-platform-launcher" + testImplementation "org.junit.vintage:junit-vintage-engine" + testImplementation "org.objenesis:objenesis" + testImplementation "org.spockframework:spock-core" + testImplementation "org.spockframework:spock-core" + testImplementation "org.spockframework:spock-spring" + testImplementation "org.springframework:spring-test" } diff --git a/cats/cats-sql/src/main/kotlin/com/netflix/spinnaker/cats/sql/controllers/CatsSqlAdminController.kt b/cats/cats-sql/src/main/kotlin/com/netflix/spinnaker/cats/sql/controllers/CatsSqlAdminController.kt index eb34892fe88..017a90c25ce 100644 --- a/cats/cats-sql/src/main/kotlin/com/netflix/spinnaker/cats/sql/controllers/CatsSqlAdminController.kt +++ b/cats/cats-sql/src/main/kotlin/com/netflix/spinnaker/cats/sql/controllers/CatsSqlAdminController.kt @@ -32,7 +32,7 @@ class CatsSqlAdminController(private val fiat: FiatPermissionEvaluator, @PutMapping(path = ["/truncate/{namespace}"]) fun truncateTables(@PathVariable("namespace") truncateNamespace: String, - @Value("\${sql.tableNamespace:#{null}}") currentNamespace: String?): CleanTablesResult { + @Value("\${sql.table-namespace:#{null}}") currentNamespace: String?): CleanTablesResult { validatePermissions() validateParams(currentNamespace, truncateNamespace) @@ -65,7 +65,7 @@ class CatsSqlAdminController(private val fiat: FiatPermissionEvaluator, @PutMapping(path = ["/drop/{namespace}"]) fun dropTables(@PathVariable("namespace") dropNamespace: String, - @Value("\${sql.tableNamespace:#{null}}") currentNamespace: String?): CleanTablesResult { + @Value("\${sql.table-namespace:#{null}}") currentNamespace: String?): CleanTablesResult { validatePermissions() validateParams(currentNamespace, dropNamespace) diff --git a/cats/cats-sql/src/main/kotlin/com/netflix/spinnaker/config/SqlAgentSchedulerConfiguration.kt b/cats/cats-sql/src/main/kotlin/com/netflix/spinnaker/config/SqlAgentSchedulerConfiguration.kt index bfb53ba23db..905a6b05a28 100644 --- a/cats/cats-sql/src/main/kotlin/com/netflix/spinnaker/config/SqlAgentSchedulerConfiguration.kt +++ b/cats/cats-sql/src/main/kotlin/com/netflix/spinnaker/config/SqlAgentSchedulerConfiguration.kt @@ -28,7 +28,7 @@ import org.springframework.context.annotation.Bean import org.springframework.context.annotation.Configuration @Configuration -@ConditionalOnProperty(value = ["caching.writeEnabled"], matchIfMissing = true) +@ConditionalOnProperty(value = ["caching.write-enabled"], matchIfMissing = true) class SqlAgentSchedulerConfiguration { @Bean @@ -40,7 +40,7 @@ class SqlAgentSchedulerConfiguration { agentIntervalProvider: AgentIntervalProvider, nodeStatusProvider: NodeStatusProvider, dynamicConfigService: DynamicConfigService, - @Value("\${sql.tableNamespace:#{null}}") tableNamespace: String?, + @Value("\${sql.table-namespace:#{null}}") tableNamespace: String?, sqlAgentProperties: SqlAgentProperties): AgentScheduler<*> { return SqlClusteredAgentScheduler( jooq = jooq, diff --git a/cats/cats-sql/src/main/kotlin/com/netflix/spinnaker/config/SqlCacheConfiguration.kt b/cats/cats-sql/src/main/kotlin/com/netflix/spinnaker/config/SqlCacheConfiguration.kt index d70948c427c..4712113a085 100644 --- a/cats/cats-sql/src/main/kotlin/com/netflix/spinnaker/config/SqlCacheConfiguration.kt +++ b/cats/cats-sql/src/main/kotlin/com/netflix/spinnaker/config/SqlCacheConfiguration.kt @@ -89,8 +89,8 @@ class SqlCacheConfiguration { sqlProperties: SqlProperties, cacheMetrics: SqlCacheMetrics, dynamicConfigService: DynamicConfigService, - @Value("\${sql.cache.asyncPoolSize:0}") poolSize: Int, - @Value("\${sql.tableNamespace:#{null}}") tableNamespace: String?): NamedCacheFactory { + @Value("\${sql.cache.async-pool-size:0}") poolSize: Int, + @Value("\${sql.table-namespace:#{null}}") tableNamespace: String?): NamedCacheFactory { if (tableNamespace != null && !tableNamespace.matches("""^\w+$""".toRegex())) { throw IllegalArgumentException("tableNamespace can only contain characters [a-z, A-Z, 0-9, _]") } @@ -137,22 +137,22 @@ class SqlCacheConfiguration { } @Bean - @ConditionalOnExpression("\${sql.readOnly:false} == false") + @ConditionalOnExpression("\${sql.read-only:false} == false") fun sqlTableMetricsAgent(jooq: DSLContext, registry: Registry, clock: Clock, - @Value("\${sql.tableNamespace:#{null}}") namespace: String?): SqlTableMetricsAgent = + @Value("\${sql.table-namespace:#{null}}") namespace: String?): SqlTableMetricsAgent = SqlTableMetricsAgent(jooq, registry, clock, namespace) @Bean - @ConditionalOnExpression("\${sql.readOnly:false} == false") + @ConditionalOnExpression("\${sql.read-only:false} == false") fun sqlCleanupStaleOnDemandCachesAgent(applicationContext: ApplicationContext, registry: Registry, clock: Clock): SqlCleanupStaleOnDemandCachesAgent = SqlCleanupStaleOnDemandCachesAgent(applicationContext, registry, clock) @Bean - @ConditionalOnExpression("\${sql.readOnly:false} == false") + @ConditionalOnExpression("\${sql.read-only:false} == false") fun sqlAgentProvider(sqlTableMetricsAgent: SqlTableMetricsAgent, sqlCleanupStaleOnDemandCachesAgent: SqlCleanupStaleOnDemandCachesAgent): SqlProvider = SqlProvider(mutableListOf(sqlTableMetricsAgent, sqlCleanupStaleOnDemandCachesAgent)) diff --git a/cats/cats-sql/src/test/groovy/com/netflix/spinnaker/cats/sql/SqlCacheSpec.groovy b/cats/cats-sql/src/test/groovy/com/netflix/spinnaker/cats/sql/SqlCacheSpec.groovy index 057ec3d001f..6f0305f090a 100644 --- a/cats/cats-sql/src/test/groovy/com/netflix/spinnaker/cats/sql/SqlCacheSpec.groovy +++ b/cats/cats-sql/src/test/groovy/com/netflix/spinnaker/cats/sql/SqlCacheSpec.groovy @@ -7,6 +7,7 @@ import com.netflix.spinnaker.cats.cache.WriteableCacheSpec import com.netflix.spinnaker.cats.sql.cache.SqlCache import com.netflix.spinnaker.cats.sql.cache.SqlCacheMetrics import com.netflix.spinnaker.kork.dynamicconfig.DynamicConfigService +import com.netflix.spinnaker.kork.sql.config.RetryProperties import com.netflix.spinnaker.kork.sql.config.SqlRetryProperties import spock.lang.AutoCleanup import spock.lang.Shared @@ -21,18 +22,10 @@ import static com.netflix.spinnaker.kork.sql.test.SqlTestUtil.initDatabase class SqlCacheSpec extends WriteableCacheSpec { - SqlCacheMetrics cacheMetrics = Mock() - @Shared @AutoCleanup("close") TestDatabase currentDatabase - def setup() { - (getSubject() as SqlCache).clearCreatedTables() - return initDatabase("jdbc:h2:mem:test") - } - - def cleanup() { currentDatabase.context.dropSchemaIfExists("test") } @@ -45,7 +38,7 @@ class SqlCacheSpec extends WriteableCacheSpec { ((SqlCache) cache).merge('foo', data) then: - 1 * cacheMetrics.merge('test', 'foo', 1, 1, 0, 0, 2, 1, 0) + 1 * ((SqlCache) cache).cacheMetrics.merge('test', 'foo', 1, 1, 0, 0, 2, 1, 0) when: ((SqlCache) cache).merge('foo', data) @@ -54,7 +47,7 @@ class SqlCacheSpec extends WriteableCacheSpec { // SqlCacheMetrics currently sets items to # of items stored. The redis impl // sets this to # of items passed to merge, regardless of how many are actually stored // after deduplication. TODO: Having both metrics would be nice. - 1 * cacheMetrics.merge('test', 'foo', 1, 0, 0, 0, 1, 0, 0) + 1 * ((SqlCache) cache).cacheMetrics.merge('test', 'foo', 1, 0, 0, 0, 1, 0, 0) } def 'all items are stored and retrieved when larger than sql chunk sizes'() { @@ -92,13 +85,13 @@ class SqlCacheSpec extends WriteableCacheSpec { Cache getSubject() { def mapper = new ObjectMapper() def clock = new Clock.FixedClock(Instant.EPOCH, ZoneId.of("UTC")) - def sqlRetryProperties = new SqlRetryProperties() + def sqlRetryProperties = new SqlRetryProperties(new RetryProperties(1, 10), new RetryProperties(1, 10)) def dynamicConfigService = Mock(DynamicConfigService) { - getConfig(_, _, _) >> 2 + getConfig(_ as Class, _ as String, _) >> 2 } - currentDatabase = initDatabase() + currentDatabase = initDatabase("jdbc:h2:mem:test${System.currentTimeMillis()}") return new SqlCache( "test", currentDatabase.context, @@ -107,7 +100,7 @@ class SqlCacheSpec extends WriteableCacheSpec { clock, sqlRetryProperties, "test", - cacheMetrics, + Mock(SqlCacheMetrics), dynamicConfigService ) } diff --git a/cats/cats-sql/src/test/groovy/com/netflix/spinnaker/cats/sql/SqlProviderCacheSpec.groovy b/cats/cats-sql/src/test/groovy/com/netflix/spinnaker/cats/sql/SqlProviderCacheSpec.groovy index 1fc5d096855..baa8d54f185 100644 --- a/cats/cats-sql/src/test/groovy/com/netflix/spinnaker/cats/sql/SqlProviderCacheSpec.groovy +++ b/cats/cats-sql/src/test/groovy/com/netflix/spinnaker/cats/sql/SqlProviderCacheSpec.groovy @@ -11,6 +11,7 @@ import com.netflix.spinnaker.cats.provider.ProviderCacheSpec import com.netflix.spinnaker.cats.sql.cache.SpectatorSqlCacheMetrics import com.netflix.spinnaker.cats.sql.cache.SqlCache import com.netflix.spinnaker.kork.dynamicconfig.DynamicConfigService +import com.netflix.spinnaker.kork.sql.config.RetryProperties import com.netflix.spinnaker.kork.sql.config.SqlRetryProperties import com.netflix.spinnaker.kork.sql.test.SqlTestUtil import spock.lang.AutoCleanup @@ -31,12 +32,6 @@ class SqlProviderCacheSpec extends ProviderCacheSpec { WriteableCache backingStore - def setup() { - (backingStore as SqlCache).clearCreatedTables() - return initDatabase("jdbc:h2:mem:test") - } - - def cleanup() { currentDatabase.context.dropSchemaIfExists("test") } @@ -50,12 +45,12 @@ class SqlProviderCacheSpec extends ProviderCacheSpec { Cache getSubject() { def mapper = new ObjectMapper() def clock = new Clock.FixedClock(Instant.EPOCH, ZoneId.of("UTC")) - def sqlRetryProperties = new SqlRetryProperties() + def sqlRetryProperties = new SqlRetryProperties(new RetryProperties(1, 10), new RetryProperties(1, 10)) def sqlMetrics = new SpectatorSqlCacheMetrics(new NoopRegistry()) def dynamicConfigService = Mock(DynamicConfigService) { - getConfig(_, _, _) >> 10 + getConfig(_ as Class, _ as String, _) >> 10 } - currentDatabase = initDatabase() + currentDatabase = initDatabase("jdbc:h2:mem:test${System.currentTimeMillis()}") backingStore = new SqlCache( "test", currentDatabase.context, diff --git a/cats/cats-test/cats-test.gradle b/cats/cats-test/cats-test.gradle index 443d5418792..0457820a350 100644 --- a/cats/cats-test/cats-test.gradle +++ b/cats/cats-test/cats-test.gradle @@ -1,7 +1,16 @@ tasks.compileGroovy.enabled = true dependencies { - compile project(":cats:cats-core") - compile spinnaker.dependency('groovy') - compile spinnaker.dependency('spock') + implementation project(":cats:cats-core") + implementation "org.codehaus.groovy:groovy-all" + + implementation "org.springframework.boot:spring-boot-starter-test" + implementation "org.spockframework:spock-core" + implementation "org.spockframework:spock-spring" + implementation "cglib:cglib-nodep" + implementation "org.objenesis:objenesis" + + compileOnly "org.projectlombok:lombok" + annotationProcessor "org.projectlombok:lombok" + testAnnotationProcessor "org.projectlombok:lombok" } diff --git a/cats/cats.gradle b/cats/cats.gradle index b1b8aa9334f..ae13f58f182 100644 --- a/cats/cats.gradle +++ b/cats/cats.gradle @@ -1,22 +1,7 @@ tasks.findByName('bintrayUpload')?.enabled = false subprojects { - apply plugin: 'findbugs' - apply plugin: 'pmd' - dependencies { - compileOnly 'com.google.code.findbugs:findbugs-annotations:3.0.1' - testCompile 'org.spockframework:spock-core:1.0-groovy-2.3' - testCompile 'cglib:cglib-nodep:3.2.0' - testCompile 'org.objenesis:objenesis:2.1' - pmd 'net.sourceforge.pmd:pmd:5.1.3' - } - - tasks.compileGroovy.enabled = false - tasks.findbugsTest.enabled = false - tasks.pmdTest.enabled = false - - findbugs { - ignoreFailures = true + implementation "org.codehaus.groovy:groovy-all" } } diff --git a/clouddriver-appengine/clouddriver-appengine.gradle b/clouddriver-appengine/clouddriver-appengine.gradle index f362af8aea1..1cc6ea4625d 100644 --- a/clouddriver-appengine/clouddriver-appengine.gradle +++ b/clouddriver-appengine/clouddriver-appengine.gradle @@ -1,15 +1,31 @@ dependencies { - compile project(":clouddriver-artifacts") - compile project(":clouddriver-core") - compile project(":clouddriver-google-common") - compile spinnaker.dependency("frigga") - compile spinnaker.dependency("bootActuator") - compile spinnaker.dependency("bootWeb") - compile spinnaker.dependency("korkArtifacts") + implementation project(":cats:cats-core") + implementation project(":clouddriver-artifacts") + implementation project(":clouddriver-core") + implementation project(":clouddriver-google-common") + implementation project(":clouddriver-security") - // TODO(dpeach): move to spinnaker/spinnaker-dependencies. - compile "com.google.apis:google-api-services-appengine:v1-rev92-1.25.0" - compile "org.eclipse.jgit:org.eclipse.jgit:5.2.1.201812262042-r" + compileOnly "org.projectlombok:lombok" + annotationProcessor "org.projectlombok:lombok" + testAnnotationProcessor "org.projectlombok:lombok" - compile spinnaker.dependency("googleStorage") + implementation "com.google.apis:google-api-services-appengine:v1-rev92-1.25.0" + implementation "com.google.apis:google-api-services-storage" + implementation "com.netflix.frigga:frigga" + implementation "com.netflix.spinnaker.fiat:fiat-api:$fiatVersion" + implementation "com.netflix.spinnaker.fiat:fiat-core:$fiatVersion" + implementation "com.netflix.spinnaker.kork:kork-artifacts" + implementation "com.netflix.spinnaker.moniker:moniker" + implementation "com.squareup.okhttp:okhttp" + implementation "com.squareup.retrofit:retrofit" + implementation "org.codehaus.groovy:groovy-all" + implementation "org.eclipse.jgit:org.eclipse.jgit:5.2.1.201812262042-r" + implementation "org.springframework.boot:spring-boot-actuator" + implementation "org.springframework.boot:spring-boot-starter-web" + + testImplementation "cglib:cglib-nodep" + testImplementation "org.objenesis:objenesis" + testImplementation "org.spockframework:spock-core" + testImplementation "org.spockframework:spock-spring" + testImplementation "org.springframework:spring-test" } diff --git a/clouddriver-appengine/src/main/groovy/com/netflix/spinnaker/clouddriver/appengine/AppengineJobExecutor.groovy b/clouddriver-appengine/src/main/groovy/com/netflix/spinnaker/clouddriver/appengine/AppengineJobExecutor.groovy index 14e7b7ae753..90140f72c67 100644 --- a/clouddriver-appengine/src/main/groovy/com/netflix/spinnaker/clouddriver/appengine/AppengineJobExecutor.groovy +++ b/clouddriver-appengine/src/main/groovy/com/netflix/spinnaker/clouddriver/appengine/AppengineJobExecutor.groovy @@ -25,7 +25,7 @@ import org.springframework.stereotype.Component @Component class AppengineJobExecutor { - @Value('${appengine.jobSleepMs:1000}') + @Value('${appengine.job-sleep-ms:1000}') Long sleepMs @Autowired diff --git a/clouddriver-appengine/src/main/groovy/com/netflix/spinnaker/clouddriver/appengine/deploy/AppengineSafeRetry.groovy b/clouddriver-appengine/src/main/groovy/com/netflix/spinnaker/clouddriver/appengine/deploy/AppengineSafeRetry.groovy index b7a46a5706e..0773411730f 100644 --- a/clouddriver-appengine/src/main/groovy/com/netflix/spinnaker/clouddriver/appengine/deploy/AppengineSafeRetry.groovy +++ b/clouddriver-appengine/src/main/groovy/com/netflix/spinnaker/clouddriver/appengine/deploy/AppengineSafeRetry.groovy @@ -25,16 +25,16 @@ import org.springframework.stereotype.Component @Component class AppengineSafeRetry extends GoogleCommonSafeRetry { - @Value('${appengine.safeRetryMaxWaitIntervalMs:60000}') + @Value('${appengine.safe-retry-max-wait-interval-ms:60000}') Long maxWaitInterval - @Value('${appengine.safeRetryRetryIntervalBaseSec:2}') + @Value('${appengine.safe-retry-retry-interval-base-sec:2}') Long retryIntervalBase - @Value('${appengine.safeRetryJitterMultiplier:1000}') + @Value('${appengine.safe-retry-jitter-multiplier:1000}') Long jitterMultiplier - @Value('${appengine.safeRetryMaxRetries:10}') + @Value('${appengine.safe-retry-max-retries:10}') Long maxRetries public Object doRetry(Closure operation, diff --git a/clouddriver-artifacts/clouddriver-artifacts.gradle b/clouddriver-artifacts/clouddriver-artifacts.gradle index afc1ab38bd3..0dd7fbfffc3 100644 --- a/clouddriver-artifacts/clouddriver-artifacts.gradle +++ b/clouddriver-artifacts/clouddriver-artifacts.gradle @@ -60,35 +60,36 @@ tasks.clean.dependsOn('cleanSdk') tasks.compileJava.dependsOn('unpackSdk') dependencies { - compile project(":clouddriver-core") + implementation project(":clouddriver-core") - compile spinnaker.dependency("frigga") - compile spinnaker.dependency("bootActuator") - compile spinnaker.dependency("bootWeb") - compile spinnaker.dependency("commonsLang") - compile spinnaker.dependency("korkArtifacts") - compile spinnaker.dependency("korkExceptions") - compile spinnaker.dependency("lombok") - compile spinnaker.dependency("okHttp") - - compile spinnaker.dependency("googleStorage") - compile spinnaker.dependency("awsS3") - compile "org.apache.commons:commons-compress:1.14" - compile "com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:2.9.7" - compile 'com.fasterxml.jackson.dataformat:jackson-dataformat-xml:2.9.7' - compile "org.apache.ivy:ivy:2.4.0" - - compile 'org.eclipse.aether:aether-api:1.1.0' - compile 'org.eclipse.aether:aether-impl:1.1.0' - compile 'org.apache.maven:maven-aether-provider:3.3.9' + compileOnly "org.projectlombok:lombok" + annotationProcessor "org.projectlombok:lombok" + compileOnly "org.apache.commons:commons-lang3" - compile fileTree(sdkLocation) - - testCompile('org.junit.jupiter:junit-jupiter-api:5.2.0') - testRuntime('org.junit.jupiter:junit-jupiter-engine:5.2.0') - testCompile 'org.assertj:assertj-core:3.8.0' - testCompile 'org.junit-pioneer:junit-pioneer:latest.release' - - testCompile 'ru.lanwen.wiremock:wiremock-junit5:1.2.0' - testCompile 'com.github.tomakehurst:wiremock:latest.release' + implementation "com.amazonaws:aws-java-sdk-s3" + implementation "com.fasterxml.jackson.dataformat:jackson-dataformat-xml" + implementation "com.fasterxml.jackson.dataformat:jackson-dataformat-yaml" + implementation "com.google.apis:google-api-services-storage:v1-rev141-1.25.0" + implementation "com.netflix.frigga:frigga" + implementation "com.netflix.spinnaker.kork:kork-artifacts" + implementation "com.netflix.spinnaker.kork:kork-exceptions" + implementation "com.squareup.okhttp:okhttp" + implementation "com.sun.jersey:jersey-client:1.9.1" + implementation "org.apache.commons:commons-compress:1.14" + implementation "org.apache.ivy:ivy:2.4.0" + implementation "org.apache.maven:maven-aether-provider:3.3.9" + implementation "org.codehaus.groovy:groovy-all" + implementation "org.eclipse.aether:aether-api:1.1.0" + implementation "org.eclipse.aether:aether-impl:1.1.0" + implementation "org.springframework.boot:spring-boot-actuator" + implementation "org.springframework.boot:spring-boot-starter-web" + + implementation fileTree(sdkLocation) + + testImplementation "com.github.tomakehurst:wiremock:latest.release" + testImplementation "org.assertj:assertj-core" + testImplementation "org.junit-pioneer:junit-pioneer:0.3.0" + testImplementation "org.junit.jupiter:junit-jupiter-api" + testImplementation "ru.lanwen.wiremock:wiremock-junit5:1.2.0" + testRuntimeOnly "org.junit.jupiter:junit-jupiter-engine" } diff --git a/clouddriver-aws/clouddriver-aws.gradle b/clouddriver-aws/clouddriver-aws.gradle index 5609c9f0125..e4f85dc4ac0 100644 --- a/clouddriver-aws/clouddriver-aws.gradle +++ b/clouddriver-aws/clouddriver-aws.gradle @@ -1,20 +1,45 @@ dependencies { - compile project(":clouddriver-core") - compile project(":clouddriver-eureka") + implementation project(":cats:cats-core") + implementation project(":clouddriver-core") + implementation project(":clouddriver-eureka") + implementation project(":clouddriver-security") - spinnaker.group('amazon') - spinnaker.group('retrofitDefault') + compileOnly "org.projectlombok:lombok" + annotationProcessor "org.projectlombok:lombok" + testAnnotationProcessor "org.projectlombok:lombok" - compile spinnaker.dependency('kork') - compile spinnaker.dependency('korkExceptions') - compile spinnaker.dependency('bootActuator') - compile spinnaker.dependency('bootWeb') - compile spinnaker.dependency('frigga') - compile spinnaker.dependency('rxJava') - compile spinnaker.dependency('httpclient') - compile spinnaker.dependency('guava') + implementation "com.amazonaws:aws-java-sdk" + implementation "com.google.guava:guava" + implementation "com.netflix.awsobjectmapper:awsobjectmapper" + implementation "com.netflix.frigga:frigga" + implementation "com.netflix.spinnaker.fiat:fiat-api:$fiatVersion" + implementation "com.netflix.spinnaker.fiat:fiat-core:$fiatVersion" + implementation "com.netflix.spinnaker.kork:kork-core" + implementation "com.netflix.spinnaker.kork:kork-exceptions" + implementation "com.netflix.spinnaker.kork:kork-security" + implementation "com.netflix.spinnaker.moniker:moniker" + implementation "com.squareup.okhttp:okhttp" + implementation "com.squareup.okhttp:okhttp-apache" + implementation "com.squareup.okhttp:okhttp-urlconnection" + implementation "com.squareup.retrofit:converter-jackson" + implementation "com.squareup.retrofit:retrofit" + implementation "io.reactivex:rxjava" + implementation "org.apache.httpcomponents:httpclient" + implementation "org.apache.httpcomponents:httpcore" + implementation "org.codehaus.groovy:groovy-all" + implementation "org.springframework.boot:spring-boot-actuator" + implementation "org.springframework.boot:spring-boot-starter-web" + implementation 'com.aestasit.infrastructure.sshoogr:sshoogr:0.9.25' + implementation 'com.jcraft:jsch.agentproxy.connector-factory:0.0.9' + implementation 'com.jcraft:jsch.agentproxy.jsch:0.0.9' - compile 'com.aestasit.infrastructure.sshoogr:sshoogr:0.9.25' - compile 'com.jcraft:jsch.agentproxy.jsch:0.0.9' - compile 'com.jcraft:jsch.agentproxy.connector-factory:0.0.9' + testImplementation "com.netflix.spinnaker.kork:kork-exceptions" + testImplementation "cglib:cglib-nodep" + testImplementation "com.natpryce:hamkrest" + testImplementation "junit:junit" + testImplementation "org.objenesis:objenesis" + testImplementation "org.spockframework:spock-core" + testImplementation "org.spockframework:spock-spring" + testImplementation "org.springframework.boot:spring-boot-starter-test" + testImplementation "org.springframework:spring-test" } diff --git a/clouddriver-aws/src/main/groovy/com/netflix/spinnaker/clouddriver/aws/controllers/CloudFormationController.java b/clouddriver-aws/src/main/groovy/com/netflix/spinnaker/clouddriver/aws/controllers/CloudFormationController.java index 8610f46600d..33a2fead3f1 100644 --- a/clouddriver-aws/src/main/groovy/com/netflix/spinnaker/clouddriver/aws/controllers/CloudFormationController.java +++ b/clouddriver-aws/src/main/groovy/com/netflix/spinnaker/clouddriver/aws/controllers/CloudFormationController.java @@ -18,9 +18,9 @@ import com.netflix.spinnaker.clouddriver.aws.model.CloudFormationStack; import com.netflix.spinnaker.clouddriver.aws.provider.view.AmazonCloudFormationProvider; +import com.netflix.spinnaker.kork.web.exceptions.NotFoundException; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.rest.webmvc.ResourceNotFoundException; import org.springframework.util.AntPathMatcher; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; @@ -36,9 +36,13 @@ @RestController class CloudFormationController { - @Autowired private AmazonCloudFormationProvider cloudFormationProvider; + @Autowired + public CloudFormationController(AmazonCloudFormationProvider cloudFormationProvider) { + this.cloudFormationProvider = cloudFormationProvider; + } + @RequestMapping(method = RequestMethod.GET) List list(@RequestParam String accountName, @RequestParam(required = false, defaultValue = "*") String region) { @@ -54,7 +58,7 @@ CloudFormationStack get(HttpServletRequest request) { return cloudFormationProvider .get(stackId) .orElseThrow( - () -> new ResourceNotFoundException(String.format("Cloud Formation stackId %s not found.", stackId)) + () -> new NotFoundException(String.format("Cloud Formation stackId %s not found.", stackId)) ); } diff --git a/clouddriver-aws/src/main/groovy/com/netflix/spinnaker/clouddriver/aws/deploy/ops/DeployCloudFormationAtomicOperation.java b/clouddriver-aws/src/main/groovy/com/netflix/spinnaker/clouddriver/aws/deploy/ops/DeployCloudFormationAtomicOperation.java index fd8f55a7ed5..ff79d52fec6 100644 --- a/clouddriver-aws/src/main/groovy/com/netflix/spinnaker/clouddriver/aws/deploy/ops/DeployCloudFormationAtomicOperation.java +++ b/clouddriver-aws/src/main/groovy/com/netflix/spinnaker/clouddriver/aws/deploy/ops/DeployCloudFormationAtomicOperation.java @@ -26,6 +26,7 @@ import com.netflix.spinnaker.clouddriver.orchestration.AtomicOperation; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; import java.util.Collections; import java.util.List; @@ -42,6 +43,7 @@ public class DeployCloudFormationAtomicOperation implements AtomicOperation AmazonClientProvider amazonClientProvider; @Autowired + @Qualifier("amazonObjectMapper") private ObjectMapper objectMapper; private DeployCloudFormationDescription description; diff --git a/clouddriver-aws/src/main/groovy/com/netflix/spinnaker/clouddriver/aws/edda/EddaConfiguration.groovy b/clouddriver-aws/src/main/groovy/com/netflix/spinnaker/clouddriver/aws/edda/EddaConfiguration.groovy index e2142a23214..2b08bc715cf 100644 --- a/clouddriver-aws/src/main/groovy/com/netflix/spinnaker/clouddriver/aws/edda/EddaConfiguration.groovy +++ b/clouddriver-aws/src/main/groovy/com/netflix/spinnaker/clouddriver/aws/edda/EddaConfiguration.groovy @@ -18,6 +18,8 @@ package com.netflix.spinnaker.clouddriver.aws.edda import com.fasterxml.jackson.databind.DeserializationFeature import com.fasterxml.jackson.databind.ObjectMapper +import com.netflix.awsobjectmapper.AmazonObjectMapper +import com.netflix.awsobjectmapper.AmazonObjectMapperConfigurer import org.springframework.context.annotation.Bean import org.springframework.context.annotation.Configuration import retrofit.converter.Converter @@ -27,7 +29,7 @@ import retrofit.converter.JacksonConverter class EddaConfiguration { @Bean Converter eddaConverter() { - new JacksonConverter(new ObjectMapper() + new JacksonConverter(AmazonObjectMapperConfigurer.createConfigured() .disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES)) } diff --git a/clouddriver-aws/src/main/groovy/com/netflix/spinnaker/clouddriver/aws/lifecycle/InstanceTerminationConfigurationProperties.groovy b/clouddriver-aws/src/main/groovy/com/netflix/spinnaker/clouddriver/aws/lifecycle/InstanceTerminationConfigurationProperties.groovy index 4edb620516a..891d054d854 100644 --- a/clouddriver-aws/src/main/groovy/com/netflix/spinnaker/clouddriver/aws/lifecycle/InstanceTerminationConfigurationProperties.groovy +++ b/clouddriver-aws/src/main/groovy/com/netflix/spinnaker/clouddriver/aws/lifecycle/InstanceTerminationConfigurationProperties.groovy @@ -18,7 +18,7 @@ package com.netflix.spinnaker.clouddriver.aws.lifecycle import org.springframework.boot.context.properties.ConfigurationProperties -@ConfigurationProperties("aws.lifecycleSubscribers.instanceTermination") +@ConfigurationProperties("aws.lifecycle-subscribers.instance-termination") class InstanceTerminationConfigurationProperties { String accountName String queueARN diff --git a/clouddriver-aws/src/main/groovy/com/netflix/spinnaker/clouddriver/aws/lifecycle/InstanceTerminationLifecycleWorkerProvider.java b/clouddriver-aws/src/main/groovy/com/netflix/spinnaker/clouddriver/aws/lifecycle/InstanceTerminationLifecycleWorkerProvider.java index 13a111c3a63..0d2b430a897 100644 --- a/clouddriver-aws/src/main/groovy/com/netflix/spinnaker/clouddriver/aws/lifecycle/InstanceTerminationLifecycleWorkerProvider.java +++ b/clouddriver-aws/src/main/groovy/com/netflix/spinnaker/clouddriver/aws/lifecycle/InstanceTerminationLifecycleWorkerProvider.java @@ -24,6 +24,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression; import org.springframework.stereotype.Component; @@ -35,7 +36,7 @@ import java.util.regex.Pattern; @Component -@ConditionalOnExpression("${aws.lifecycleSubscribers.instanceTermination.enabled:false} && ${caching.writeEnabled:true}") +@ConditionalOnExpression("${aws.lifecycle-subscribers.instance-termination.enabled:false} && ${caching.write-enabled:true}") public class InstanceTerminationLifecycleWorkerProvider { private final static String REGION_TEMPLATE_PATTERN = Pattern.quote("{{region}}"); private final static String ACCOUNT_ID_TEMPLATE_PATTERN = Pattern.quote("{{accountId}}"); @@ -50,7 +51,7 @@ public class InstanceTerminationLifecycleWorkerProvider { private final Registry registry; @Autowired - InstanceTerminationLifecycleWorkerProvider(ObjectMapper objectMapper, + InstanceTerminationLifecycleWorkerProvider(@Qualifier("amazonObjectMapper") ObjectMapper objectMapper, AmazonClientProvider amazonClientProvider, AccountCredentialsProvider accountCredentialsProvider, InstanceTerminationConfigurationProperties properties, diff --git a/clouddriver-aws/src/main/groovy/com/netflix/spinnaker/clouddriver/aws/lifecycle/LaunchFailureConfigurationProperties.groovy b/clouddriver-aws/src/main/groovy/com/netflix/spinnaker/clouddriver/aws/lifecycle/LaunchFailureConfigurationProperties.groovy index 9d883741d0b..253f818439a 100644 --- a/clouddriver-aws/src/main/groovy/com/netflix/spinnaker/clouddriver/aws/lifecycle/LaunchFailureConfigurationProperties.groovy +++ b/clouddriver-aws/src/main/groovy/com/netflix/spinnaker/clouddriver/aws/lifecycle/LaunchFailureConfigurationProperties.groovy @@ -18,7 +18,7 @@ package com.netflix.spinnaker.clouddriver.aws.lifecycle import org.springframework.boot.context.properties.ConfigurationProperties -@ConfigurationProperties("aws.lifecycleSubscribers.launchFailure") +@ConfigurationProperties("aws.lifecycle-subscribers.launch-failure") class LaunchFailureConfigurationProperties { String accountName String topicARN diff --git a/clouddriver-aws/src/main/groovy/com/netflix/spinnaker/clouddriver/aws/lifecycle/LifecycleSubscriberConfiguration.java b/clouddriver-aws/src/main/groovy/com/netflix/spinnaker/clouddriver/aws/lifecycle/LifecycleSubscriberConfiguration.java index 0d06674c672..da11547738c 100644 --- a/clouddriver-aws/src/main/groovy/com/netflix/spinnaker/clouddriver/aws/lifecycle/LifecycleSubscriberConfiguration.java +++ b/clouddriver-aws/src/main/groovy/com/netflix/spinnaker/clouddriver/aws/lifecycle/LifecycleSubscriberConfiguration.java @@ -20,6 +20,7 @@ import com.netflix.spinnaker.clouddriver.aws.security.AmazonClientProvider; import com.netflix.spinnaker.clouddriver.security.AccountCredentialsProvider; import com.netflix.spinnaker.clouddriver.tags.EntityTagger; +import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; @@ -30,8 +31,8 @@ class LifecycleSubscriberConfiguration { @Bean - @ConditionalOnProperty("aws.lifecycleSubscribers.launchFailure.enabled") - LaunchFailureNotificationAgentProvider launchFailureNotificationAgentProvider(ObjectMapper objectMapper, + @ConditionalOnProperty("aws.lifecycle-subscribers.launch-failure.enabled") + LaunchFailureNotificationAgentProvider launchFailureNotificationAgentProvider(@Qualifier("amazonObjectMapper") ObjectMapper objectMapper, AmazonClientProvider amazonClientProvider, AccountCredentialsProvider accountCredentialsProvider, LaunchFailureConfigurationProperties properties, diff --git a/clouddriver-aws/src/main/groovy/com/netflix/spinnaker/clouddriver/aws/provider/agent/AbstractAmazonLoadBalancerCachingAgent.groovy b/clouddriver-aws/src/main/groovy/com/netflix/spinnaker/clouddriver/aws/provider/agent/AbstractAmazonLoadBalancerCachingAgent.groovy index 9627fe78ec3..fa7241b71d8 100644 --- a/clouddriver-aws/src/main/groovy/com/netflix/spinnaker/clouddriver/aws/provider/agent/AbstractAmazonLoadBalancerCachingAgent.groovy +++ b/clouddriver-aws/src/main/groovy/com/netflix/spinnaker/clouddriver/aws/provider/agent/AbstractAmazonLoadBalancerCachingAgent.groovy @@ -115,7 +115,7 @@ abstract class AbstractAmazonLoadBalancerCachingAgent implements CachingAgent, O this.amazonClientProvider = amazonClientProvider this.account = account this.region = region - this.objectMapper = objectMapper.enable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS) + this.objectMapper = objectMapper.copy().enable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS) this.registry = registry this.metricsSupport = new OnDemandMetricsSupport(registry, this, amazonCloudProvider.id + ":" + "${amazonCloudProvider.id}:${OnDemandAgent.OnDemandType.LoadBalancer}") } diff --git a/clouddriver-aws/src/main/groovy/com/netflix/spinnaker/clouddriver/aws/provider/agent/AmazonSubnetCachingAgent.groovy b/clouddriver-aws/src/main/groovy/com/netflix/spinnaker/clouddriver/aws/provider/agent/AmazonSubnetCachingAgent.groovy index d0e0f361777..6f6809b7f3e 100644 --- a/clouddriver-aws/src/main/groovy/com/netflix/spinnaker/clouddriver/aws/provider/agent/AmazonSubnetCachingAgent.groovy +++ b/clouddriver-aws/src/main/groovy/com/netflix/spinnaker/clouddriver/aws/provider/agent/AmazonSubnetCachingAgent.groovy @@ -16,34 +16,28 @@ package com.netflix.spinnaker.clouddriver.aws.provider.agent -import com.netflix.spinnaker.cats.agent.AccountAware -import com.netflix.spinnaker.clouddriver.aws.model.AmazonSubnet -import com.netflix.spinnaker.clouddriver.aws.security.AmazonClientProvider -import com.netflix.spinnaker.clouddriver.aws.security.NetflixAmazonCredentials - -import static com.netflix.spinnaker.cats.agent.AgentDataType.Authority.AUTHORITATIVE -import static com.netflix.spinnaker.clouddriver.aws.cache.Keys.Namespace.SUBNETS - import com.amazonaws.services.ec2.model.Subnet -import com.netflix.awsobjectmapper.AmazonObjectMapper -import com.netflix.spinnaker.cats.agent.AgentDataType -import com.netflix.spinnaker.cats.agent.CacheResult -import com.netflix.spinnaker.cats.agent.CachingAgent -import com.netflix.spinnaker.cats.agent.DefaultCacheResult +import com.fasterxml.jackson.databind.ObjectMapper +import com.netflix.spinnaker.cats.agent.* import com.netflix.spinnaker.cats.cache.CacheData import com.netflix.spinnaker.cats.cache.DefaultCacheData import com.netflix.spinnaker.cats.provider.ProviderCache import com.netflix.spinnaker.clouddriver.aws.cache.Keys import com.netflix.spinnaker.clouddriver.aws.provider.AwsInfrastructureProvider +import com.netflix.spinnaker.clouddriver.aws.security.AmazonClientProvider +import com.netflix.spinnaker.clouddriver.aws.security.NetflixAmazonCredentials import groovy.util.logging.Slf4j +import static com.netflix.spinnaker.cats.agent.AgentDataType.Authority.AUTHORITATIVE +import static com.netflix.spinnaker.clouddriver.aws.cache.Keys.Namespace.SUBNETS + @Slf4j class AmazonSubnetCachingAgent implements CachingAgent, AccountAware { final AmazonClientProvider amazonClientProvider final NetflixAmazonCredentials account final String region - final AmazonObjectMapper objectMapper + final ObjectMapper amazonObjectMapper static final Set types = Collections.unmodifiableSet([ AUTHORITATIVE.forType(SUBNETS.ns) @@ -52,11 +46,11 @@ class AmazonSubnetCachingAgent implements CachingAgent, AccountAware { AmazonSubnetCachingAgent(AmazonClientProvider amazonClientProvider, NetflixAmazonCredentials account, String region, - AmazonObjectMapper objectMapper) { + ObjectMapper amazonObjectMapper) { this.amazonClientProvider = amazonClientProvider this.account = account this.region = region - this.objectMapper = objectMapper + this.amazonObjectMapper = amazonObjectMapper } @Override @@ -86,7 +80,7 @@ class AmazonSubnetCachingAgent implements CachingAgent, AccountAware { def subnets = ec2.describeSubnets().subnets List data = subnets.collect { Subnet subnet -> - Map attributes = objectMapper.convertValue(subnet, AwsInfrastructureProvider.ATTRIBUTES) + Map attributes = amazonObjectMapper.convertValue(subnet, AwsInfrastructureProvider.ATTRIBUTES) attributes.putIfAbsent("accountId", account.accountId) new DefaultCacheData(Keys.getSubnetKey(subnet.subnetId, region, account.name), attributes, diff --git a/clouddriver-aws/src/main/groovy/com/netflix/spinnaker/clouddriver/aws/provider/config/AwsInfrastructureProviderConfig.groovy b/clouddriver-aws/src/main/groovy/com/netflix/spinnaker/clouddriver/aws/provider/config/AwsInfrastructureProviderConfig.groovy index fc3fdf2f552..ba0b8bb5a52 100644 --- a/clouddriver-aws/src/main/groovy/com/netflix/spinnaker/clouddriver/aws/provider/config/AwsInfrastructureProviderConfig.groovy +++ b/clouddriver-aws/src/main/groovy/com/netflix/spinnaker/clouddriver/aws/provider/config/AwsInfrastructureProviderConfig.groovy @@ -16,7 +16,7 @@ package com.netflix.spinnaker.clouddriver.aws.provider.config -import com.netflix.awsobjectmapper.AmazonObjectMapper +import com.fasterxml.jackson.databind.ObjectMapper import com.netflix.spectator.api.Registry import com.netflix.spinnaker.cats.agent.Agent import com.netflix.spinnaker.cats.provider.ProviderSynchronizerTypeWrapper @@ -33,6 +33,7 @@ import com.netflix.spinnaker.clouddriver.aws.security.EddaTimeoutConfig import com.netflix.spinnaker.clouddriver.aws.security.NetflixAmazonCredentials import com.netflix.spinnaker.clouddriver.security.AccountCredentialsRepository import com.netflix.spinnaker.clouddriver.security.ProviderUtils +import org.springframework.beans.factory.annotation.Qualifier import org.springframework.beans.factory.config.ConfigurableBeanFactory import org.springframework.context.annotation.Bean import org.springframework.context.annotation.Configuration @@ -47,7 +48,7 @@ class AwsInfrastructureProviderConfig { @DependsOn('netflixAmazonCredentials') AwsInfrastructureProvider awsInfrastructureProvider(AmazonClientProvider amazonClientProvider, AccountCredentialsRepository accountCredentialsRepository, - AmazonObjectMapper amazonObjectMapper, + @Qualifier("amazonObjectMapper") ObjectMapper amazonObjectMapper, Registry registry, EddaTimeoutConfig eddaTimeoutConfig) { def awsInfrastructureProvider = @@ -82,7 +83,7 @@ class AwsInfrastructureProviderConfig { AwsInfrastructureProviderSynchronizer synchronizeAwsInfrastructureProvider(AwsInfrastructureProvider awsInfrastructureProvider, AmazonClientProvider amazonClientProvider, AccountCredentialsRepository accountCredentialsRepository, - AmazonObjectMapper amazonObjectMapper, + @Qualifier("amazonObjectMapper") ObjectMapper amazonObjectMapper, Registry registry, EddaTimeoutConfig eddaTimeoutConfig) { def scheduledAccounts = ProviderUtils.getScheduledAccounts(awsInfrastructureProvider) diff --git a/clouddriver-aws/src/main/groovy/com/netflix/spinnaker/clouddriver/aws/provider/config/AwsProviderConfig.groovy b/clouddriver-aws/src/main/groovy/com/netflix/spinnaker/clouddriver/aws/provider/config/AwsProviderConfig.groovy index e01971f161d..7c6bedc464c 100644 --- a/clouddriver-aws/src/main/groovy/com/netflix/spinnaker/clouddriver/aws/provider/config/AwsProviderConfig.groovy +++ b/clouddriver-aws/src/main/groovy/com/netflix/spinnaker/clouddriver/aws/provider/config/AwsProviderConfig.groovy @@ -45,6 +45,7 @@ import com.netflix.spinnaker.clouddriver.aws.provider.agent.InstanceCachingAgent import com.netflix.spinnaker.clouddriver.aws.provider.agent.LaunchConfigCachingAgent import com.netflix.spinnaker.clouddriver.aws.provider.agent.ReservationReportCachingAgent import com.netflix.spinnaker.kork.dynamicconfig.DynamicConfigService +import org.springframework.beans.factory.annotation.Qualifier import org.springframework.beans.factory.config.ConfigurableBeanFactory import org.springframework.boot.context.properties.EnableConfigurationProperties import org.springframework.context.ApplicationContext diff --git a/clouddriver-aws/src/main/groovy/com/netflix/spinnaker/clouddriver/aws/provider/view/AmazonApplicationProvider.groovy b/clouddriver-aws/src/main/groovy/com/netflix/spinnaker/clouddriver/aws/provider/view/AmazonApplicationProvider.groovy index 7ca01afe4e1..424e3bf0887 100644 --- a/clouddriver-aws/src/main/groovy/com/netflix/spinnaker/clouddriver/aws/provider/view/AmazonApplicationProvider.groovy +++ b/clouddriver-aws/src/main/groovy/com/netflix/spinnaker/clouddriver/aws/provider/view/AmazonApplicationProvider.groovy @@ -27,6 +27,7 @@ import com.netflix.spinnaker.clouddriver.model.Application import com.netflix.spinnaker.clouddriver.model.ApplicationProvider import com.netflix.spinnaker.clouddriver.aws.data.Keys import org.springframework.beans.factory.annotation.Autowired +import org.springframework.beans.factory.annotation.Qualifier import org.springframework.stereotype.Component import static com.netflix.spinnaker.clouddriver.core.provider.agent.Namespace.* @@ -38,7 +39,7 @@ class AmazonApplicationProvider implements ApplicationProvider { private final ObjectMapper objectMapper @Autowired - AmazonApplicationProvider(AmazonCloudProvider amazonCloudProvider, Cache cacheView, ObjectMapper objectMapper) { + AmazonApplicationProvider(AmazonCloudProvider amazonCloudProvider, Cache cacheView, @Qualifier("amazonObjectMapper") ObjectMapper objectMapper) { this.amazonCloudProvider = amazonCloudProvider this.cacheView = cacheView this.objectMapper = objectMapper.enable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS) diff --git a/clouddriver-aws/src/main/groovy/com/netflix/spinnaker/clouddriver/aws/provider/view/AmazonCloudFormationProvider.java b/clouddriver-aws/src/main/groovy/com/netflix/spinnaker/clouddriver/aws/provider/view/AmazonCloudFormationProvider.java index 6d5b17f7e31..cb692439046 100644 --- a/clouddriver-aws/src/main/groovy/com/netflix/spinnaker/clouddriver/aws/provider/view/AmazonCloudFormationProvider.java +++ b/clouddriver-aws/src/main/groovy/com/netflix/spinnaker/clouddriver/aws/provider/view/AmazonCloudFormationProvider.java @@ -25,6 +25,7 @@ import com.netflix.spinnaker.clouddriver.aws.model.CloudFormationStack; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Component; import java.util.Collection; @@ -42,7 +43,7 @@ public class AmazonCloudFormationProvider implements CloudFormationProvider { private final ObjectMapper objectMapper @Autowired - AmazonElasticIpProvider(Cache cacheView, ObjectMapper objectMapper) { + AmazonElasticIpProvider(Cache cacheView, @Qualifier("amazonObjectMapper") ObjectMapper objectMapper) { this.cacheView = cacheView this.objectMapper = objectMapper } diff --git a/clouddriver-aws/src/main/groovy/com/netflix/spinnaker/clouddriver/aws/provider/view/AmazonImageProvider.java b/clouddriver-aws/src/main/groovy/com/netflix/spinnaker/clouddriver/aws/provider/view/AmazonImageProvider.java index 38199df3b02..d7483398dc4 100644 --- a/clouddriver-aws/src/main/groovy/com/netflix/spinnaker/clouddriver/aws/provider/view/AmazonImageProvider.java +++ b/clouddriver-aws/src/main/groovy/com/netflix/spinnaker/clouddriver/aws/provider/view/AmazonImageProvider.java @@ -27,6 +27,7 @@ import com.netflix.spinnaker.clouddriver.model.Image; import com.netflix.spinnaker.clouddriver.model.ImageProvider; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Component; import java.util.ArrayList; @@ -49,7 +50,7 @@ public class AmazonImageProvider implements ImageProvider { private final ObjectMapper objectMapper; @Autowired - AmazonImageProvider(Cache cacheView, AwsConfiguration.AmazonServerGroupProvider amazonServerGroupProvider, ObjectMapper objectMapper) { + AmazonImageProvider(Cache cacheView, AwsConfiguration.AmazonServerGroupProvider amazonServerGroupProvider, @Qualifier("amazonObjectMapper") ObjectMapper objectMapper) { this.cacheView = cacheView; this.amazonServerGroupProvider = amazonServerGroupProvider; this.objectMapper = objectMapper; diff --git a/clouddriver-aws/src/main/groovy/com/netflix/spinnaker/clouddriver/aws/provider/view/AmazonInstanceTypeProvider.groovy b/clouddriver-aws/src/main/groovy/com/netflix/spinnaker/clouddriver/aws/provider/view/AmazonInstanceTypeProvider.groovy index ee4ea9aba01..0639c68bc07 100644 --- a/clouddriver-aws/src/main/groovy/com/netflix/spinnaker/clouddriver/aws/provider/view/AmazonInstanceTypeProvider.groovy +++ b/clouddriver-aws/src/main/groovy/com/netflix/spinnaker/clouddriver/aws/provider/view/AmazonInstanceTypeProvider.groovy @@ -22,6 +22,7 @@ import com.netflix.spinnaker.cats.cache.RelationshipCacheFilter import com.netflix.spinnaker.clouddriver.model.InstanceTypeProvider import com.netflix.spinnaker.clouddriver.aws.model.AmazonInstanceType import org.springframework.beans.factory.annotation.Autowired +import org.springframework.beans.factory.annotation.Qualifier import org.springframework.stereotype.Component import static com.netflix.spinnaker.clouddriver.aws.cache.Keys.Namespace.INSTANCE_TYPES @@ -34,7 +35,7 @@ class AmazonInstanceTypeProvider implements InstanceTypeProvider { private static final String DEPRECATED_TAG_KEY = 'is_deprecated' private final Cache cacheView - private final AmazonObjectMapper objectMapper + private final ObjectMapper amazonObjectMapper final String cloudProvider = AmazonCloudProvider.ID @Autowired - AmazonSubnetProvider(Cache cacheView, AmazonObjectMapper objectMapper) { + AmazonSubnetProvider(Cache cacheView, @Qualifier("amazonObjectMapper") ObjectMapper amazonObjectMapper) { this.cacheView = cacheView - this.objectMapper = objectMapper + this.amazonObjectMapper = amazonObjectMapper } @Override @@ -69,7 +69,7 @@ class AmazonSubnetProvider implements SubnetProvider { AmazonSubnet fromCacheData(CacheData cacheData) { def parts = Keys.parse(cacheData.id) - def subnet = objectMapper.convertValue(cacheData.attributes, Subnet) + def subnet = amazonObjectMapper.convertValue(cacheData.attributes, Subnet) def tag = subnet.tags.find { it.key == METADATA_TAG_KEY } def isDeprecated = subnet.tags.find { it.key == DEPRECATED_TAG_KEY }?.value String json = tag?.value diff --git a/clouddriver-aws/src/main/groovy/com/netflix/spinnaker/clouddriver/aws/provider/view/AmazonVpcProvider.groovy b/clouddriver-aws/src/main/groovy/com/netflix/spinnaker/clouddriver/aws/provider/view/AmazonVpcProvider.groovy index d4d706f0d0f..2333e3f6eed 100644 --- a/clouddriver-aws/src/main/groovy/com/netflix/spinnaker/clouddriver/aws/provider/view/AmazonVpcProvider.groovy +++ b/clouddriver-aws/src/main/groovy/com/netflix/spinnaker/clouddriver/aws/provider/view/AmazonVpcProvider.groovy @@ -17,7 +17,7 @@ package com.netflix.spinnaker.clouddriver.aws.provider.view import com.amazonaws.services.ec2.model.Vpc -import com.netflix.awsobjectmapper.AmazonObjectMapper +import com.fasterxml.jackson.databind.ObjectMapper import com.netflix.spinnaker.cats.cache.Cache import com.netflix.spinnaker.cats.cache.CacheData import com.netflix.spinnaker.cats.cache.RelationshipCacheFilter @@ -26,6 +26,7 @@ import com.netflix.spinnaker.clouddriver.model.NetworkProvider import com.netflix.spinnaker.clouddriver.aws.cache.Keys import com.netflix.spinnaker.clouddriver.aws.model.AmazonVpc import org.springframework.beans.factory.annotation.Autowired +import org.springframework.beans.factory.annotation.Qualifier import org.springframework.stereotype.Component import static com.netflix.spinnaker.clouddriver.aws.cache.Keys.Namespace.VPCS @@ -37,12 +38,12 @@ class AmazonVpcProvider implements NetworkProvider { private static final String DEPRECATED_TAG_KEY = 'is_deprecated' private final Cache cacheView - private final AmazonObjectMapper objectMapper + private final ObjectMapper amazonObjectMapper @Autowired - AmazonVpcProvider(Cache cacheView, AmazonObjectMapper amazonObjectMapper) { + AmazonVpcProvider(Cache cacheView, @Qualifier("amazonObjectMapper") ObjectMapper amazonObjectMapper) { this.cacheView = cacheView - this.objectMapper = amazonObjectMapper + this.amazonObjectMapper = amazonObjectMapper } @Override @@ -57,7 +58,7 @@ class AmazonVpcProvider implements NetworkProvider { AmazonVpc fromCacheData(CacheData cacheData) { def parts = Keys.parse(cacheData.id) - def vpc = objectMapper.convertValue(cacheData.attributes, Vpc) + def vpc = amazonObjectMapper.convertValue(cacheData.attributes, Vpc) def isDeprecated = vpc.tags.find { it.key == DEPRECATED_TAG_KEY }?.value new AmazonVpc( cloudProvider: AmazonCloudProvider.ID, diff --git a/clouddriver-aws/src/main/groovy/com/netflix/spinnaker/config/AwsConfiguration.groovy b/clouddriver-aws/src/main/groovy/com/netflix/spinnaker/config/AwsConfiguration.groovy index 0a89d5b3ae6..e89883658e4 100644 --- a/clouddriver-aws/src/main/groovy/com/netflix/spinnaker/config/AwsConfiguration.groovy +++ b/clouddriver-aws/src/main/groovy/com/netflix/spinnaker/config/AwsConfiguration.groovy @@ -19,7 +19,7 @@ package com.netflix.spinnaker.config import com.amazonaws.retry.RetryPolicy.BackoffStrategy import com.amazonaws.retry.RetryPolicy.RetryCondition import com.fasterxml.jackson.databind.ObjectMapper -import com.netflix.awsobjectmapper.AmazonObjectMapper +import com.netflix.awsobjectmapper.AmazonObjectMapperConfigurer import com.netflix.spectator.api.Registry import com.netflix.spinnaker.cats.agent.Agent import com.netflix.spinnaker.cats.provider.ProviderSynchronizerTypeWrapper @@ -42,30 +42,22 @@ import com.netflix.spinnaker.clouddriver.aws.model.AmazonBlockDevice import com.netflix.spinnaker.clouddriver.aws.model.AmazonServerGroup import com.netflix.spinnaker.clouddriver.aws.provider.AwsCleanupProvider import com.netflix.spinnaker.clouddriver.aws.provider.view.AmazonClusterProvider -import com.netflix.spinnaker.clouddriver.aws.security.AWSProxy -import com.netflix.spinnaker.clouddriver.aws.security.AmazonClientProvider -import com.netflix.spinnaker.clouddriver.aws.security.AmazonCredentialsInitializer -import com.netflix.spinnaker.clouddriver.aws.security.EddaTimeoutConfig +import com.netflix.spinnaker.clouddriver.aws.security.* import com.netflix.spinnaker.clouddriver.aws.security.EddaTimeoutConfig.Builder -import com.netflix.spinnaker.clouddriver.aws.security.NetflixAmazonCredentials import com.netflix.spinnaker.clouddriver.aws.services.IdGenerator import com.netflix.spinnaker.clouddriver.aws.services.RegionScopedProviderFactory import com.netflix.spinnaker.clouddriver.core.limits.ServiceLimitConfiguration import com.netflix.spinnaker.clouddriver.security.AccountCredentialsRepository import com.netflix.spinnaker.clouddriver.security.ProviderUtils import com.netflix.spinnaker.kork.aws.AwsComponents +import org.springframework.beans.factory.annotation.Qualifier import org.springframework.beans.factory.config.ConfigurableBeanFactory import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty import org.springframework.boot.context.properties.ConfigurationProperties import org.springframework.boot.context.properties.EnableConfigurationProperties import org.springframework.context.ApplicationContext -import org.springframework.context.annotation.Bean -import org.springframework.context.annotation.ComponentScan -import org.springframework.context.annotation.Configuration -import org.springframework.context.annotation.DependsOn -import org.springframework.context.annotation.Import -import org.springframework.context.annotation.Scope +import org.springframework.context.annotation.* import java.util.concurrent.ConcurrentHashMap @@ -110,8 +102,9 @@ class AwsConfiguration { } @Bean + @Qualifier("amazonObjectMapper") ObjectMapper amazonObjectMapper() { - return new AmazonObjectMapper() + return new AmazonObjectMapperConfigurer().createConfigured() } @Bean diff --git a/clouddriver-aws/src/test/groovy/com/netflix/spinnaker/clouddriver/aws/controllers/CloudFormationControllerSpec.groovy b/clouddriver-aws/src/test/groovy/com/netflix/spinnaker/clouddriver/aws/controllers/CloudFormationControllerSpec.groovy index 34aa1717222..5d13f3534b3 100644 --- a/clouddriver-aws/src/test/groovy/com/netflix/spinnaker/clouddriver/aws/controllers/CloudFormationControllerSpec.groovy +++ b/clouddriver-aws/src/test/groovy/com/netflix/spinnaker/clouddriver/aws/controllers/CloudFormationControllerSpec.groovy @@ -19,31 +19,26 @@ import com.fasterxml.jackson.annotation.JsonInclude import com.netflix.spinnaker.clouddriver.aws.model.CloudFormationStack import com.netflix.spinnaker.clouddriver.aws.provider.view.AmazonCloudFormationProvider import groovy.transform.Immutable -import org.springframework.beans.factory.annotation.Autowired -import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc -import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest -import org.springframework.boot.test.context.TestConfiguration -import org.springframework.context.annotation.Bean -import org.springframework.data.rest.webmvc.ResourceNotFoundException -import org.springframework.test.context.ContextConfiguration import org.springframework.test.web.servlet.MockMvc +import com.netflix.spinnaker.kork.web.exceptions.NotFoundException +import org.springframework.test.web.servlet.setup.MockMvcBuilders import spock.lang.Specification -import spock.mock.DetachedMockFactory import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status -@WebMvcTest(controllers = [CloudFormationController]) -@ContextConfiguration(classes = [CloudFormationController]) -@AutoConfigureMockMvc(secure=false) class CloudFormationControllerSpec extends Specification { - @Autowired - protected MockMvc mvc + MockMvc mockMvc - @Autowired - AmazonCloudFormationProvider cloudFormationProvider + AmazonCloudFormationProvider cloudFormationProvider = Mock(AmazonCloudFormationProvider) + + void setup() { + mockMvc = MockMvcBuilders.standaloneSetup( + new CloudFormationController(cloudFormationProvider) + ).build() + } def "request a list of stacks returns all the stacks for a given account (any region)"() { given: @@ -51,7 +46,7 @@ class CloudFormationControllerSpec extends Specification { cloudFormationProvider.list(accountName, '*') >> [ new CloudFormationStackTest(accountName: accountName) ] when: - def results = mvc.perform(get("/aws/cloudFormation/stacks?accountName=$accountName")) + def results = mockMvc.perform(get("/aws/cloudFormation/stacks?accountName=$accountName")) then: results.andExpect(status().is2xxSuccessful()) @@ -65,7 +60,7 @@ class CloudFormationControllerSpec extends Specification { cloudFormationProvider.list(accountName, region) >> [ new CloudFormationStackTest(accountName: accountName, region: region) ] when: - def results = mvc.perform(get("/aws/cloudFormation/stacks?accountName=$accountName®ion=$region")) + def results = mockMvc.perform(get("/aws/cloudFormation/stacks?accountName=$accountName®ion=$region")) then: results.andExpect(status().is2xxSuccessful()) @@ -79,7 +74,7 @@ class CloudFormationControllerSpec extends Specification { cloudFormationProvider.get(stackId) >> Optional.of(new CloudFormationStackTest(stackId: stackId)) when: - def results = mvc.perform(get("/aws/cloudFormation/stacks/$stackId")) + def results = mockMvc.perform(get("/aws/cloudFormation/stacks/$stackId")) then: results.andExpect(status().is2xxSuccessful()) @@ -89,13 +84,13 @@ class CloudFormationControllerSpec extends Specification { def "requesting a non existing stack returns a 404"() { given: def stackId = "arn:cloudformation:non-existing" - cloudFormationProvider.get(stackId) >> { throw new ResourceNotFoundException() } + cloudFormationProvider.get(stackId) >> { throw new NotFoundException() } when: - def results = mvc.perform(get("/aws/cloudFormation/stacks/$stackId")) + mockMvc.perform(get("/aws/cloudFormation/stacks/$stackId")) then: - results.andExpect(status().is(404)) + thrown(Exception) //loosened because we removed the dependency on spring data rest } @Immutable @@ -112,16 +107,4 @@ class CloudFormationControllerSpec extends Specification { final String accountId final Date creationTime } - - @TestConfiguration - static class StubConfig { - - DetachedMockFactory detachedMockFactory = new DetachedMockFactory() - - @Bean - AmazonCloudFormationProvider provider() { - detachedMockFactory.Stub(AmazonCloudFormationProvider) - } - } - } diff --git a/clouddriver-aws/src/test/groovy/com/netflix/spinnaker/clouddriver/aws/deploy/ops/ResumeAsgProcessesAtomicOperationSpec.groovy b/clouddriver-aws/src/test/groovy/com/netflix/spinnaker/clouddriver/aws/deploy/ops/ResumeAsgProcessesAtomicOperationSpec.groovy index fc0ee5fdbaf..190c0a9b5a5 100644 --- a/clouddriver-aws/src/test/groovy/com/netflix/spinnaker/clouddriver/aws/deploy/ops/ResumeAsgProcessesAtomicOperationSpec.groovy +++ b/clouddriver-aws/src/test/groovy/com/netflix/spinnaker/clouddriver/aws/deploy/ops/ResumeAsgProcessesAtomicOperationSpec.groovy @@ -26,6 +26,9 @@ import com.netflix.spinnaker.clouddriver.aws.services.RegionScopedProviderFactor import spock.lang.Specification import spock.lang.Subject +import static com.netflix.spinnaker.clouddriver.aws.model.AutoScalingProcessType.Launch +import static com.netflix.spinnaker.clouddriver.aws.model.AutoScalingProcessType.Terminate + class ResumeAsgProcessesAtomicOperationSpec extends Specification { def mockAsgService = Mock(AsgService) @@ -62,9 +65,9 @@ class ResumeAsgProcessesAtomicOperationSpec extends Specification { operation.operate([]) then: 1 * mockAsgService.getAutoScalingGroup('asg1') >> new AutoScalingGroup() - then: 1 * mockAsgService.resumeProcesses("asg1", AutoScalingProcessType.with { [Launch, Terminate] }) + then: 1 * mockAsgService.resumeProcesses("asg1", [Launch, Terminate]) then: 1 * mockAsgService.getAutoScalingGroup('asg1') >> new AutoScalingGroup() - then: 1 * mockAsgService.resumeProcesses("asg1", AutoScalingProcessType.with { [Launch, Terminate] }) + then: 1 * mockAsgService.resumeProcesses("asg1", [Launch, Terminate]) and: task.history*.status == [ @@ -99,7 +102,7 @@ class ResumeAsgProcessesAtomicOperationSpec extends Specification { then: 1 * mockAsgService.getAutoScalingGroup('asg1') then: 1 * mockAsgService.getAutoScalingGroup('asg1') >> new AutoScalingGroup() - then: 1 * mockAsgService.resumeProcesses("asg1", AutoScalingProcessType.with { [Launch, Terminate] }) + then: 1 * mockAsgService.resumeProcesses("asg1", [Launch, Terminate]) and: task.history*.status == [ @@ -133,11 +136,11 @@ class ResumeAsgProcessesAtomicOperationSpec extends Specification { operation.operate([]) then: 1 * mockAsgService.getAutoScalingGroup('asg1') >> new AutoScalingGroup() - then: 1 * mockAsgService.resumeProcesses("asg1", AutoScalingProcessType.with { [Launch, Terminate] }) >> { + then: 1 * mockAsgService.resumeProcesses("asg1", [Launch, Terminate]) >> { throw new Exception('Uh oh!') } then: 1 * mockAsgService.getAutoScalingGroup('asg1') >> new AutoScalingGroup() - then: 1 * mockAsgService.resumeProcesses("asg1", AutoScalingProcessType.with { [Launch, Terminate] }) + then: 1 * mockAsgService.resumeProcesses("asg1", [Launch, Terminate]) and: task.history*.status == [ diff --git a/clouddriver-aws/src/test/groovy/com/netflix/spinnaker/clouddriver/aws/deploy/ops/SuspendAsgProcessesAtomicOperationSpec.groovy b/clouddriver-aws/src/test/groovy/com/netflix/spinnaker/clouddriver/aws/deploy/ops/SuspendAsgProcessesAtomicOperationSpec.groovy index 4818796afcf..564407948a9 100644 --- a/clouddriver-aws/src/test/groovy/com/netflix/spinnaker/clouddriver/aws/deploy/ops/SuspendAsgProcessesAtomicOperationSpec.groovy +++ b/clouddriver-aws/src/test/groovy/com/netflix/spinnaker/clouddriver/aws/deploy/ops/SuspendAsgProcessesAtomicOperationSpec.groovy @@ -15,6 +15,7 @@ */ package com.netflix.spinnaker.clouddriver.aws.deploy.ops import com.amazonaws.services.autoscaling.model.AutoScalingGroup +import com.amazonaws.services.dynamodbv2.xspec.M import com.netflix.spinnaker.clouddriver.aws.deploy.description.SuspendAsgProcessesDescription import com.netflix.spinnaker.clouddriver.aws.model.AutoScalingProcessType import com.netflix.spinnaker.clouddriver.aws.services.AsgService @@ -24,6 +25,9 @@ import com.netflix.spinnaker.clouddriver.data.task.TaskRepository import spock.lang.Specification import spock.lang.Subject +import static com.netflix.spinnaker.clouddriver.aws.model.AutoScalingProcessType.Launch +import static com.netflix.spinnaker.clouddriver.aws.model.AutoScalingProcessType.Terminate + class SuspendAsgProcessesAtomicOperationSpec extends Specification { def mockAsgService = Mock(AsgService) @@ -60,9 +64,9 @@ class SuspendAsgProcessesAtomicOperationSpec extends Specification { operation.operate([]) then: 1 * mockAsgService.getAutoScalingGroup('asg1') >> new AutoScalingGroup() - then: 1 * mockAsgService.suspendProcesses("asg1", AutoScalingProcessType.with { [Launch, Terminate] }) + then: 1 * mockAsgService.suspendProcesses("asg1", [Launch, Terminate]) then: 1 * mockAsgService.getAutoScalingGroup('asg1') >> new AutoScalingGroup() - then: 1 * mockAsgService.suspendProcesses("asg1", AutoScalingProcessType.with { [Launch, Terminate] }) + then: 1 * mockAsgService.suspendProcesses("asg1", [Launch, Terminate]) and: task.history*.status == [ @@ -97,7 +101,7 @@ class SuspendAsgProcessesAtomicOperationSpec extends Specification { then: 1 * mockAsgService.getAutoScalingGroup('asg1') then: 1 * mockAsgService.getAutoScalingGroup('asg1') >> new AutoScalingGroup() - then: 1 * mockAsgService.suspendProcesses("asg1", AutoScalingProcessType.with { [Launch, Terminate] }) + then: 1 * mockAsgService.suspendProcesses("asg1", [Launch, Terminate]) and: task.history*.status == [ @@ -131,11 +135,11 @@ class SuspendAsgProcessesAtomicOperationSpec extends Specification { operation.operate([]) then: 1 * mockAsgService.getAutoScalingGroup('asg1') >> new AutoScalingGroup() - then: 1 * mockAsgService.suspendProcesses("asg1", AutoScalingProcessType.with { [Launch, Terminate] }) >> { + then: 1 * mockAsgService.suspendProcesses("asg1", [Launch, Terminate]) >> { throw new Exception('Uh oh!') } then: 1 * mockAsgService.getAutoScalingGroup('asg1') >> new AutoScalingGroup() - then: 1 * mockAsgService.suspendProcesses("asg1", AutoScalingProcessType.with { [Launch, Terminate] }) + then: 1 * mockAsgService.suspendProcesses("asg1", [Launch, Terminate]) and: task.history*.status == [ diff --git a/clouddriver-aws/src/test/groovy/com/netflix/spinnaker/clouddriver/aws/deploy/ops/securitygroup/SecurityGroupLookupSpec.groovy b/clouddriver-aws/src/test/groovy/com/netflix/spinnaker/clouddriver/aws/deploy/ops/securitygroup/SecurityGroupLookupSpec.groovy index 3e957e3cc33..a923f1e6244 100644 --- a/clouddriver-aws/src/test/groovy/com/netflix/spinnaker/clouddriver/aws/deploy/ops/securitygroup/SecurityGroupLookupSpec.groovy +++ b/clouddriver-aws/src/test/groovy/com/netflix/spinnaker/clouddriver/aws/deploy/ops/securitygroup/SecurityGroupLookupSpec.groovy @@ -102,7 +102,7 @@ class SecurityGroupLookupSpec extends Specification { void "should look up security group, but not call AWS again"() { when: - final result = securityGroupLookup.getSecurityGroupByName("test", "wideOpen", "vpc-1").get() + def result = securityGroupLookup.getSecurityGroupByName("test", "wideOpen", "vpc-1").get() then: 1 * amazonEC2.describeSecurityGroups(_) >> new DescribeSecurityGroupsResult( diff --git a/clouddriver-aws/src/test/groovy/com/netflix/spinnaker/clouddriver/aws/provider/agent/AmazonSecurityGroupCachingAgentSpec.groovy b/clouddriver-aws/src/test/groovy/com/netflix/spinnaker/clouddriver/aws/provider/agent/AmazonSecurityGroupCachingAgentSpec.groovy index a202cbd6378..ea744d29537 100644 --- a/clouddriver-aws/src/test/groovy/com/netflix/spinnaker/clouddriver/aws/provider/agent/AmazonSecurityGroupCachingAgentSpec.groovy +++ b/clouddriver-aws/src/test/groovy/com/netflix/spinnaker/clouddriver/aws/provider/agent/AmazonSecurityGroupCachingAgentSpec.groovy @@ -19,7 +19,9 @@ package com.netflix.spinnaker.clouddriver.aws.provider.agent import com.amazonaws.services.ec2.AmazonEC2 import com.amazonaws.services.ec2.model.DescribeSecurityGroupsResult import com.amazonaws.services.ec2.model.SecurityGroup +import com.fasterxml.jackson.databind.ObjectMapper import com.netflix.awsobjectmapper.AmazonObjectMapper +import com.netflix.awsobjectmapper.AmazonObjectMapperConfigurer import com.netflix.spectator.api.Spectator import com.netflix.spinnaker.cats.cache.CacheData import com.netflix.spinnaker.cats.cache.DefaultCacheData @@ -47,7 +49,7 @@ class AmazonSecurityGroupCachingAgentSpec extends Specification { getLastModified() >> 12345L } ProviderCache providerCache = Mock(ProviderCache) - AmazonObjectMapper mapper = new AmazonObjectMapper() + ObjectMapper mapper = new AmazonObjectMapperConfigurer().createConfigured() EddaTimeoutConfig eddaTimeoutConfig = new EddaTimeoutConfig.Builder().build() @Subject AmazonSecurityGroupCachingAgent agent = new AmazonSecurityGroupCachingAgent( diff --git a/clouddriver-aws/src/test/groovy/com/netflix/spinnaker/clouddriver/aws/provider/agent/AmazonSubnetCachingAgentSpec.groovy b/clouddriver-aws/src/test/groovy/com/netflix/spinnaker/clouddriver/aws/provider/agent/AmazonSubnetCachingAgentSpec.groovy index 3cff1b0f206..862cbd2a79d 100644 --- a/clouddriver-aws/src/test/groovy/com/netflix/spinnaker/clouddriver/aws/provider/agent/AmazonSubnetCachingAgentSpec.groovy +++ b/clouddriver-aws/src/test/groovy/com/netflix/spinnaker/clouddriver/aws/provider/agent/AmazonSubnetCachingAgentSpec.groovy @@ -19,7 +19,9 @@ package com.netflix.spinnaker.clouddriver.aws.provider.agent import com.amazonaws.services.ec2.AmazonEC2 import com.amazonaws.services.ec2.model.DescribeSubnetsResult import com.amazonaws.services.ec2.model.Subnet +import com.fasterxml.jackson.databind.ObjectMapper import com.netflix.awsobjectmapper.AmazonObjectMapper +import com.netflix.awsobjectmapper.AmazonObjectMapperConfigurer import com.netflix.spinnaker.cats.cache.CacheData import com.netflix.spinnaker.cats.provider.ProviderCache import com.netflix.spinnaker.clouddriver.aws.security.AmazonClientProvider @@ -45,7 +47,7 @@ class AmazonSubnetCachingAgentSpec extends Specification { ProviderCache providerCache = Mock(ProviderCache) - AmazonObjectMapper amazonObjectMapper = new AmazonObjectMapper() + ObjectMapper amazonObjectMapper = new AmazonObjectMapperConfigurer().createConfigured() @Subject AmazonSubnetCachingAgent agent = new AmazonSubnetCachingAgent( diff --git a/clouddriver-aws/src/test/groovy/com/netflix/spinnaker/clouddriver/aws/provider/agent/ImageCachingAgentSpec.groovy b/clouddriver-aws/src/test/groovy/com/netflix/spinnaker/clouddriver/aws/provider/agent/ImageCachingAgentSpec.groovy index 7cde45f87e5..1cd65afcca3 100644 --- a/clouddriver-aws/src/test/groovy/com/netflix/spinnaker/clouddriver/aws/provider/agent/ImageCachingAgentSpec.groovy +++ b/clouddriver-aws/src/test/groovy/com/netflix/spinnaker/clouddriver/aws/provider/agent/ImageCachingAgentSpec.groovy @@ -19,21 +19,17 @@ package com.netflix.spinnaker.clouddriver.aws.provider.agent import com.amazonaws.services.ec2.AmazonEC2 import com.amazonaws.services.ec2.model.DescribeImagesRequest import com.amazonaws.services.ec2.model.DescribeImagesResult -import com.amazonaws.services.ec2.model.DomainType import com.amazonaws.services.ec2.model.Filter import com.amazonaws.services.ec2.model.Image -import com.netflix.awsobjectmapper.AmazonObjectMapper import com.netflix.awsobjectmapper.AmazonObjectMapperConfigurer import com.netflix.spectator.api.Spectator import com.netflix.spinnaker.cats.provider.ProviderCache -import com.netflix.spinnaker.clouddriver.aws.AmazonCloudProvider import com.netflix.spinnaker.clouddriver.aws.data.Keys import com.netflix.spinnaker.clouddriver.aws.security.AmazonClientProvider import com.netflix.spinnaker.clouddriver.aws.security.NetflixAmazonCredentials import com.netflix.spinnaker.kork.dynamicconfig.DynamicConfigService import spock.lang.Shared import spock.lang.Specification -import spock.lang.Subject import static com.netflix.spinnaker.clouddriver.core.provider.agent.Namespace.IMAGES import static com.netflix.spinnaker.clouddriver.core.provider.agent.Namespace.NAMED_IMAGES @@ -83,7 +79,7 @@ class ImageCachingAgentSpec extends Specification { def getAgent(boolean publicImages, boolean eddaEnabled) { def creds = Stub(NetflixAmazonCredentials) { getName() >> accountName - getAccountId() >> accountId + it.getAccountId() >> accountId getEddaEnabled() >> eddaEnabled } def dcs = Stub(DynamicConfigService) { diff --git a/clouddriver-aws/src/test/groovy/com/netflix/spinnaker/clouddriver/aws/provider/view/AmazonSubnetProviderSpec.groovy b/clouddriver-aws/src/test/groovy/com/netflix/spinnaker/clouddriver/aws/provider/view/AmazonSubnetProviderSpec.groovy index ab018076910..51df2ceadb4 100644 --- a/clouddriver-aws/src/test/groovy/com/netflix/spinnaker/clouddriver/aws/provider/view/AmazonSubnetProviderSpec.groovy +++ b/clouddriver-aws/src/test/groovy/com/netflix/spinnaker/clouddriver/aws/provider/view/AmazonSubnetProviderSpec.groovy @@ -20,6 +20,7 @@ import com.amazonaws.services.ec2.model.Subnet import com.amazonaws.services.ec2.model.Tag import com.fasterxml.jackson.databind.ObjectMapper import com.netflix.awsobjectmapper.AmazonObjectMapper +import com.netflix.awsobjectmapper.AmazonObjectMapperConfigurer import com.netflix.spinnaker.cats.cache.Cache import com.netflix.spinnaker.cats.cache.CacheData import com.netflix.spinnaker.cats.cache.CacheFilter @@ -33,7 +34,7 @@ import spock.lang.Subject class AmazonSubnetProviderSpec extends Specification { Cache cache = Mock(Cache) - ObjectMapper mapper = new AmazonObjectMapper() + ObjectMapper mapper = new AmazonObjectMapperConfigurer().createConfigured() @Subject AmazonSubnetProvider provider = new AmazonSubnetProvider(cache, mapper) diff --git a/clouddriver-azure/clouddriver-azure.gradle b/clouddriver-azure/clouddriver-azure.gradle index babce29e397..48175c07851 100644 --- a/clouddriver-azure/clouddriver-azure.gradle +++ b/clouddriver-azure/clouddriver-azure.gradle @@ -3,10 +3,25 @@ repositories { } dependencies { - compile project(":clouddriver-core") - compile spinnaker.dependency('frigga') - compile spinnaker.dependency('bootActuator') - compile spinnaker.dependency('bootWeb') - compile 'com.microsoft.azure:adal4j:1.6.3' - compile 'com.microsoft.azure:azure:1.19.0' + implementation project(":clouddriver-core") + implementation project(":clouddriver-security") + implementation project(":cats:cats-core") + + implementation "com.netflix.frigga:frigga" + implementation "com.netflix.spectator:spectator-api" + implementation "com.netflix.spinnaker.fiat:fiat-api:$fiatVersion" + implementation "com.netflix.spinnaker.fiat:fiat-core:$fiatVersion" + implementation "com.netflix.spinnaker.kork:kork-exceptions" + implementation "com.netflix.spinnaker.moniker:moniker" + implementation "org.codehaus.groovy:groovy-all" + implementation "org.springframework.boot:spring-boot-actuator" + implementation "org.springframework.boot:spring-boot-starter-web" + implementation 'com.microsoft.azure:adal4j:1.6.3' + implementation 'com.microsoft.azure:azure:1.19.0' + + testImplementation "cglib:cglib-nodep" + testImplementation "org.objenesis:objenesis" + testImplementation "org.spockframework:spock-core" + testImplementation "org.spockframework:spock-spring" + testImplementation "org.springframework:spring-test" } diff --git a/clouddriver-cloudfoundry/clouddriver-cloudfoundry.gradle b/clouddriver-cloudfoundry/clouddriver-cloudfoundry.gradle index ebc9b697ea9..e5ec20e24c3 100644 --- a/clouddriver-cloudfoundry/clouddriver-cloudfoundry.gradle +++ b/clouddriver-cloudfoundry/clouddriver-cloudfoundry.gradle @@ -7,26 +7,37 @@ configurations { } dependencies { - compile project(":clouddriver-artifacts") - compile project(":clouddriver-core") - - compile spinnaker.dependency('frigga') - compile spinnaker.dependency('bootActuator') - compile spinnaker.dependency('bootWeb') - - compile spinnaker.dependency('korkArtifacts') - compile spinnaker.dependency('lombok') - compile spinnaker.dependency('commonsLang') - - spinnaker.group('retrofitDefault') - - compile "com.fasterxml.jackson.datatype:jackson-datatype-jsr310:${spinnaker.version("jackson")}" - - compile spinnaker.dependency('resilience4jRetry') - - testCompile "org.junit.jupiter:junit-jupiter-api:${spinnaker.version("jupiter")}" - testCompile "org.junit.jupiter:junit-jupiter-engine:${spinnaker.version("jupiter")}" - testCompile "org.junit.jupiter:junit-jupiter-params:${spinnaker.version("jupiter")}" - - testCompile spinnaker.dependency('assertj') + implementation project(":clouddriver-artifacts") + implementation project(":clouddriver-core") + implementation project(":clouddriver-security") + implementation project(":cats:cats-core") + + compileOnly "org.projectlombok:lombok" + annotationProcessor "org.projectlombok:lombok" + testAnnotationProcessor "org.projectlombok:lombok" + + implementation "org.codehaus.groovy:groovy-all" + + compileOnly "org.apache.commons:commons-lang3" + implementation "com.fasterxml.jackson.datatype:jackson-datatype-jsr310" + implementation "com.google.guava:guava" + implementation "com.netflix.frigga:frigga" + implementation "com.netflix.spinnaker.kork:kork-artifacts" + implementation "com.netflix.spinnaker.moniker:moniker" + implementation "com.squareup.okhttp:okhttp" + implementation "com.squareup.okhttp:okhttp-apache" + implementation "com.squareup.okhttp:okhttp-urlconnection" + implementation "com.squareup.retrofit:converter-jackson" + implementation "com.squareup.retrofit:retrofit" + implementation "io.github.resilience4j:resilience4j-retry" + implementation "org.springframework.boot:spring-boot-actuator" + implementation "org.springframework.boot:spring-boot-starter-web" + implementation "org.yaml:snakeyaml:1.24" + + testImplementation "org.assertj:assertj-core" + testImplementation "org.junit.jupiter:junit-jupiter-api" + testImplementation "org.junit.jupiter:junit-jupiter-engine" + testImplementation "org.junit.jupiter:junit-jupiter-params" + testImplementation "org.mockito:mockito-core" + testImplementation "org.mockito:mockito-core" } diff --git a/clouddriver-cloudfoundry/src/main/java/com/netflix/spinnaker/clouddriver/cloudfoundry/client/ServiceInstances.java b/clouddriver-cloudfoundry/src/main/java/com/netflix/spinnaker/clouddriver/cloudfoundry/client/ServiceInstances.java index 1e8c538f571..c25064846fe 100644 --- a/clouddriver-cloudfoundry/src/main/java/com/netflix/spinnaker/clouddriver/cloudfoundry/client/ServiceInstances.java +++ b/clouddriver-cloudfoundry/src/main/java/com/netflix/spinnaker/clouddriver/cloudfoundry/client/ServiceInstances.java @@ -17,7 +17,7 @@ package com.netflix.spinnaker.clouddriver.cloudfoundry.client; import com.fasterxml.jackson.databind.ObjectMapper; -import com.google.api.client.repackaged.com.google.common.annotations.VisibleForTesting; +import com.google.common.annotations.VisibleForTesting; import com.netflix.spinnaker.clouddriver.cloudfoundry.client.api.ConfigService; import com.netflix.spinnaker.clouddriver.cloudfoundry.client.api.ServiceInstanceService; import com.netflix.spinnaker.clouddriver.cloudfoundry.client.model.ServiceInstanceResponse; @@ -287,7 +287,8 @@ CloudFoundryServiceInstance getUserProvidedServiceInstance(CloudFoundrySpace spa } List> serviceInstances = collectPageResources("service instances by space and name", - pg -> func.apply(pg, getServiceQueryParams(Collections.singletonList(serviceInstanceName), space))); + pg -> func.apply(pg, getServiceQueryParams(Collections.singletonList(serviceInstanceName), space)) + ); if (serviceInstances.isEmpty()) { return null; diff --git a/clouddriver-cloudfoundry/src/test/java/com/netflix/spinnaker/clouddriver/cloudfoundry/artifacts/ArtifactCredentialsFromString.java b/clouddriver-cloudfoundry/src/test/java/com/netflix/spinnaker/clouddriver/cloudfoundry/artifacts/ArtifactCredentialsFromString.java index 3da0f390473..2d4dd9e4f5c 100644 --- a/clouddriver-cloudfoundry/src/test/java/com/netflix/spinnaker/clouddriver/cloudfoundry/artifacts/ArtifactCredentialsFromString.java +++ b/clouddriver-cloudfoundry/src/test/java/com/netflix/spinnaker/clouddriver/cloudfoundry/artifacts/ArtifactCredentialsFromString.java @@ -18,24 +18,38 @@ import com.netflix.spinnaker.clouddriver.artifacts.config.ArtifactCredentials; import com.netflix.spinnaker.kork.artifacts.model.Artifact; -import lombok.Data; import java.io.ByteArrayInputStream; -import java.io.IOException; import java.io.InputStream; import java.nio.charset.StandardCharsets; import java.util.List; -@Data public class ArtifactCredentialsFromString implements ArtifactCredentials { private final String name; private final List types; private final String downloadContent; + public ArtifactCredentialsFromString(String name, List types, String downloadContent) { + this.name = name; + this.types = types; + this.downloadContent = downloadContent; + } + @Override public InputStream download(Artifact artifact) { return new ByteArrayInputStream(downloadContent.getBytes(StandardCharsets.UTF_8)); } + public String getName() { + return name; + } + + public List getTypes() { + return types; + } + + public String getDownloadContent() { + return downloadContent; + } } diff --git a/clouddriver-cloudfoundry/src/test/java/com/netflix/spinnaker/clouddriver/cloudfoundry/client/ApplicationsTest.java b/clouddriver-cloudfoundry/src/test/java/com/netflix/spinnaker/clouddriver/cloudfoundry/client/ApplicationsTest.java index 20f823f233f..438ef14564c 100644 --- a/clouddriver-cloudfoundry/src/test/java/com/netflix/spinnaker/clouddriver/cloudfoundry/client/ApplicationsTest.java +++ b/clouddriver-cloudfoundry/src/test/java/com/netflix/spinnaker/clouddriver/cloudfoundry/client/ApplicationsTest.java @@ -237,7 +237,7 @@ void getProcessStateWhenStatsIsEmptyListAndAppIsStopped() { @ValueSource(strings = {"myapp-v999", "myapp"}) void getTakenServerGroups(String existingApp) { - when(applicationService.listAppsFiltered(isNull(Integer.class), anyListOf(String.class), anyInt())) + when(applicationService.listAppsFiltered(isNull(Integer.class), any(), any())) .thenReturn(Page.singleton(getApplication(existingApp), "123")); List> taken = apps @@ -250,7 +250,7 @@ void getTakenServerGroups(String existingApp) { void getTakenServerGroupsWhenNoPriorVersionExists(String similarAppName) { com.netflix.spinnaker.clouddriver.cloudfoundry.client.model.v2.Application application = getApplication(similarAppName); - when(applicationService.listAppsFiltered(isNull(Integer.class), anyListOf(String.class), anyInt())) + when(applicationService.listAppsFiltered(isNull(Integer.class), any(), any())) .thenReturn(Page.singleton(application, "123")); List> taken = apps @@ -260,7 +260,7 @@ void getTakenServerGroupsWhenNoPriorVersionExists(String similarAppName) { @Test void getLatestServerGroupCapiDoesntCorrectlyOrderResults() { - when(applicationService.listAppsFiltered(isNull(Integer.class), anyListOf(String.class), anyInt())) + when(applicationService.listAppsFiltered(isNull(Integer.class), any(), any())) .thenReturn(Page.asPage(getApplication("myapp-prod-v046"), getApplication("myapp-v003"), getApplication("myapp"))); List> taken = apps diff --git a/clouddriver-cloudfoundry/src/test/java/com/netflix/spinnaker/clouddriver/cloudfoundry/client/OrganizationsTest.java b/clouddriver-cloudfoundry/src/test/java/com/netflix/spinnaker/clouddriver/cloudfoundry/client/OrganizationsTest.java index 64fc928be45..d1c754d50b1 100644 --- a/clouddriver-cloudfoundry/src/test/java/com/netflix/spinnaker/clouddriver/cloudfoundry/client/OrganizationsTest.java +++ b/clouddriver-cloudfoundry/src/test/java/com/netflix/spinnaker/clouddriver/cloudfoundry/client/OrganizationsTest.java @@ -24,8 +24,8 @@ class OrganizationsTest { { OrganizationService organizationService = mock(OrganizationService.class); organizations = new Organizations(organizationService); - when(organizationService.all(anyInt(), any())).thenReturn(generateOrganizationPage()); - when(organizationService.getSpaceByName(anyString(), anyInt(), any())).thenReturn(generateSpacePage()); + when(organizationService.all(any(), any())).thenReturn(generateOrganizationPage()); + when(organizationService.getSpaceByName(anyString(), any(), any())).thenReturn(generateSpacePage()); } @Test diff --git a/clouddriver-cloudfoundry/src/test/java/com/netflix/spinnaker/clouddriver/cloudfoundry/client/RoutesTest.java b/clouddriver-cloudfoundry/src/test/java/com/netflix/spinnaker/clouddriver/cloudfoundry/client/RoutesTest.java index 0e530cbb8b2..79dfa1b0953 100644 --- a/clouddriver-cloudfoundry/src/test/java/com/netflix/spinnaker/clouddriver/cloudfoundry/client/RoutesTest.java +++ b/clouddriver-cloudfoundry/src/test/java/com/netflix/spinnaker/clouddriver/cloudfoundry/client/RoutesTest.java @@ -109,8 +109,8 @@ void findShouldFilterCorrectlyOnMultipleResults() { routeMappingPage.setTotalPages(1); when(spaces.findById("space-guid")).thenReturn(space); - when(routeService.all(anyInt(), any())).thenReturn(routePage); - when(routeService.routeMappings(anyString(), anyInt())).thenReturn(routeMappingPage); + when(routeService.all(any(), any())).thenReturn(routePage); + when(routeService.routeMappings(any(), any())).thenReturn(routeMappingPage); Routes routes = new Routes("pws", routeService, null, domains, spaces); diff --git a/clouddriver-cloudfoundry/src/test/java/com/netflix/spinnaker/clouddriver/cloudfoundry/client/ServiceInstancesTest.java b/clouddriver-cloudfoundry/src/test/java/com/netflix/spinnaker/clouddriver/cloudfoundry/client/ServiceInstancesTest.java index c01d85c231f..9c277d2beb7 100644 --- a/clouddriver-cloudfoundry/src/test/java/com/netflix/spinnaker/clouddriver/cloudfoundry/client/ServiceInstancesTest.java +++ b/clouddriver-cloudfoundry/src/test/java/com/netflix/spinnaker/clouddriver/cloudfoundry/client/ServiceInstancesTest.java @@ -61,10 +61,10 @@ class ServiceInstancesTest { private ServiceInstances serviceInstances = new ServiceInstances(serviceInstanceService, configService, orgs, spaces); { - when(serviceInstanceService.findService(any(), anyListOf(String.class))) + when(serviceInstanceService.findService(any(), any())) .thenReturn(Page.singleton(new Service().setLabel("service1"), "service-guid")); - when(serviceInstanceService.findServicePlans(any(), anyListOf(String.class))) + when(serviceInstanceService.findServicePlans(any(), any())) .thenReturn(Page.singleton(new ServicePlan().setName("ServicePlan1"), "plan-guid")); } @@ -908,8 +908,8 @@ void destroyServiceInstanceShouldThrowExceptionWhenDeleteServiceInstanceFails() errorDescription.setCode(ErrorDescription.Code.RESOURCE_NOT_FOUND); when(destroyFailed.getBodyAs(any())).thenReturn(errorDescription); - when(serviceInstanceService.all(anyInt(), any())).thenReturn(createOsbServiceInstancePage()); - when(serviceInstanceService.getBindingsForServiceInstance(anyString(), anyInt(), any())).thenReturn(serviceBindingPage); + when(serviceInstanceService.all(any(), any())).thenReturn(createOsbServiceInstancePage()); + when(serviceInstanceService.getBindingsForServiceInstance(any(), any(), any())).thenReturn(serviceBindingPage); when(serviceInstanceService.destroyServiceInstance(any())).thenThrow(destroyFailed); assertThrows( @@ -971,7 +971,7 @@ void destroyUserProvidedServiceInstanceShouldSucceedWhenNoServiceBindingsExist() verify(serviceInstanceService, times(1)).all(any(), anyListOf(String.class)); verify(serviceInstanceService, times(1)).allUserProvided(any(), any()); verify(serviceInstanceService, times(1)).destroyUserProvidedServiceInstance(any()); - verify(serviceInstanceService, times(1)).getBindingsForUserProvidedServiceInstance(any(), anyInt(), anyListOf(String.class)); + verify(serviceInstanceService, times(1)).getBindingsForUserProvidedServiceInstance(any(), any(), any()); verify(serviceInstanceService, never()).destroyServiceInstance(any()); } @@ -990,24 +990,26 @@ void destroyUserProvidedServiceInstanceShouldThrowExceptionWhenDeleteServiceInst when(serviceInstanceService.all(any(), anyListOf(String.class))).thenReturn(new Page<>()); when(serviceInstanceService.allUserProvided(any(), anyListOf(String.class))).thenReturn(createUserProvidedServiceInstancePage()); - when(serviceInstanceService.getBindingsForUserProvidedServiceInstance(anyString(), anyInt(), any())).thenReturn(serviceBindingPage); + when(serviceInstanceService.getBindingsForUserProvidedServiceInstance(any(), any(), any())).thenReturn(serviceBindingPage); when(serviceInstanceService.destroyUserProvidedServiceInstance(any())).thenThrow(destroyFailed); assertThrows( () -> serviceInstances.destroyServiceInstance(cloudFoundrySpace, "service-instance-name"), - CloudFoundryApiException.class, "Cloud Foundry API returned with error(s): "); + CloudFoundryApiException.class, + "Cloud Foundry API returned with error(s): " + ); - verify(serviceInstanceService, times(1)).all(any(), anyListOf(String.class)); + verify(serviceInstanceService, times(1)).all(any(), anyList()); verify(serviceInstanceService, times(1)).allUserProvided(any(), any()); - verify(serviceInstanceService, times(1)).getBindingsForUserProvidedServiceInstance(any(), anyInt(), anyListOf(String.class)); + verify(serviceInstanceService, times(1)).getBindingsForUserProvidedServiceInstance(any(), any(), any()); verify(serviceInstanceService, times(1)).destroyUserProvidedServiceInstance(any()); verify(serviceInstanceService, never()).destroyServiceInstance(any()); } @Test void destroyUserProvidedServiceInstanceShouldFailIfServiceBindingsExists() { - when(serviceInstanceService.all(any(), anyListOf(String.class))).thenReturn(createEmptyOsbServiceInstancePage()); - when(serviceInstanceService.allUserProvided(any(), anyListOf(String.class))).thenReturn(createUserProvidedServiceInstancePage()); + when(serviceInstanceService.all(any(), any())).thenReturn(createEmptyOsbServiceInstancePage()); + when(serviceInstanceService.allUserProvided(any(), any())).thenReturn(createUserProvidedServiceInstancePage()); when(serviceInstanceService.getBindingsForUserProvidedServiceInstance("up-service-instance-guid", null, null)) .thenReturn(Page.singleton(new ServiceBinding(), "up-service-instance-guid")); @@ -1015,7 +1017,7 @@ void destroyUserProvidedServiceInstanceShouldFailIfServiceBindingsExists() { () -> serviceInstances.destroyServiceInstance(cloudFoundrySpace, "service-instance-name"), CloudFoundryApiException.class, "Cloud Foundry API returned with error(s): Unable to destroy service instance while 1 service binding(s) exist"); - verify(serviceInstanceService, times(1)).all(any(), anyListOf(String.class)); + verify(serviceInstanceService, times(1)).all(any(), any()); verify(serviceInstanceService, times(1)).allUserProvided(any(), any()); verify(serviceInstanceService, never()).destroyUserProvidedServiceInstance(any()); verify(serviceInstanceService, never()).destroyServiceInstance(any()); diff --git a/clouddriver-cloudfoundry/src/test/java/com/netflix/spinnaker/clouddriver/cloudfoundry/client/ServiceKeysTest.java b/clouddriver-cloudfoundry/src/test/java/com/netflix/spinnaker/clouddriver/cloudfoundry/client/ServiceKeysTest.java index 5dc2f22283d..faecafeb1db 100644 --- a/clouddriver-cloudfoundry/src/test/java/com/netflix/spinnaker/clouddriver/cloudfoundry/client/ServiceKeysTest.java +++ b/clouddriver-cloudfoundry/src/test/java/com/netflix/spinnaker/clouddriver/cloudfoundry/client/ServiceKeysTest.java @@ -172,7 +172,7 @@ void getServiceKeyShouldSucceed() { .setServiceInstanceGuid("service-instance-guid"); String serviceKeyGuid = "service-key-guid"; Page page = Page.singleton(serviceKey, serviceKeyGuid); - when(serviceKeyService.getServiceKey(anyInt(), any())).thenReturn(page); + when(serviceKeyService.getServiceKey(any(), any())).thenReturn(page); Resource expectedResource = new Resource() .setEntity(serviceKey) .setMetadata(new Resource.Metadata().setGuid(serviceKeyGuid)); @@ -181,7 +181,7 @@ void getServiceKeyShouldSucceed() { assertThat(serviceKeyResults.isPresent()).isTrue(); assertThat(serviceKeyResults.get()).isEqualTo(expectedResource); - verify(serviceKeyService).getServiceKey(anyInt(), eq(Arrays.asList("service_instance_guid:service-instance-guid", "name:service-key"))); + verify(serviceKeyService).getServiceKey(any(), eq(Arrays.asList("service_instance_guid:service-instance-guid", "name:service-key"))); } @Test @@ -189,12 +189,12 @@ void getServiceKeyShouldReturnEmptyOptionalWhenNotPresent() { Page page = new Page() .setTotalResults(0) .setTotalPages(1); - when(serviceKeyService.getServiceKey(anyInt(), any())).thenReturn(page); + when(serviceKeyService.getServiceKey(any(), any())).thenReturn(page); Optional> serviceKeyResults = serviceKeys.getServiceKey("service-instance-guid", "service-key"); assertThat(serviceKeyResults.isPresent()).isFalse(); - verify(serviceKeyService).getServiceKey(anyInt(), eq(Arrays.asList("service_instance_guid:service-instance-guid", "name:service-key"))); + verify(serviceKeyService).getServiceKey(any(), eq(Arrays.asList("service_instance_guid:service-instance-guid", "name:service-key"))); } @Test @@ -215,7 +215,7 @@ void deleteServiceKeyShouldSucceedWhenServiceKeyIsDeleted() { assertThat(response).isEqualTo(expectedResponse); verify(spaces).getServiceInstanceByNameAndSpace(eq(serviceInstanceName), eq(cloudFoundrySpace)); - verify(serviceKeyService).getServiceKey(anyInt(), eq(Arrays.asList("service_instance_guid:service-instance-guid", "name:service-key"))); + verify(serviceKeyService).getServiceKey(any(), eq(Arrays.asList("service_instance_guid:service-instance-guid", "name:service-key"))); verify(serviceKeyService).deleteServiceKey(serviceKeyId); } @@ -225,7 +225,7 @@ void deleteServiceKeyShouldSucceedWhenServiceKeyDoesNotExist() { .name(serviceInstanceName) .id(serviceInstanceId) .build()); - when(serviceKeyService.getServiceKey(anyInt(), any())).thenReturn(createEmptyServiceKeyPage()); + when(serviceKeyService.getServiceKey(any(), any())).thenReturn(createEmptyServiceKeyPage()); ServiceKeyResponse expectedResponse = (ServiceKeyResponse) new ServiceKeyResponse() .setServiceKeyName(serviceKeyName) .setType(DELETE_SERVICE_KEY) @@ -236,7 +236,7 @@ void deleteServiceKeyShouldSucceedWhenServiceKeyDoesNotExist() { assertThat(response).isEqualTo(expectedResponse); verify(spaces).getServiceInstanceByNameAndSpace(eq(serviceInstanceName), eq(cloudFoundrySpace)); - verify(serviceKeyService).getServiceKey(anyInt(), eq(Arrays.asList("service_instance_guid:service-instance-guid", "name:service-key"))); + verify(serviceKeyService).getServiceKey(any(), eq(Arrays.asList("service_instance_guid:service-instance-guid", "name:service-key"))); verify(serviceKeyService, never()).deleteServiceKey(any()); } @@ -248,7 +248,7 @@ void deleteServiceKeyShouldThrowExceptionWhenServiceDoesNotExistInSpace() { CloudFoundryApiException.class, "Cloud Foundry API returned with error(s): Cannot find service 'service-instance' in region 'org > space'"); verify(spaces).getServiceInstanceByNameAndSpace(eq(serviceInstanceName), eq(cloudFoundrySpace)); - verify(serviceKeyService, never()).getServiceKey(anyInt(), any()); + verify(serviceKeyService, never()).getServiceKey(any(), any()); verify(serviceKeyService, never()).deleteServiceKey(any()); } diff --git a/clouddriver-cloudfoundry/src/test/java/com/netflix/spinnaker/clouddriver/cloudfoundry/client/SpacesTest.java b/clouddriver-cloudfoundry/src/test/java/com/netflix/spinnaker/clouddriver/cloudfoundry/client/SpacesTest.java index 7ac52e76bd1..5902af330d5 100644 --- a/clouddriver-cloudfoundry/src/test/java/com/netflix/spinnaker/clouddriver/cloudfoundry/client/SpacesTest.java +++ b/clouddriver-cloudfoundry/src/test/java/com/netflix/spinnaker/clouddriver/cloudfoundry/client/SpacesTest.java @@ -37,7 +37,7 @@ void getServiceInstanceByNameAndSpaceShouldReturnServiceInstance() { assertThat(actual.getName()).isEqualTo(serviceInstanceName); assertThat(actual.getId()).isEqualTo(serviceInstanceId); - verify(spaceService).getServiceInstancesById(eq(spaceId), anyInt(), eq(Collections.singletonList("name:" + serviceInstanceName))); + verify(spaceService).getServiceInstancesById(eq(spaceId), any(), eq(Collections.singletonList("name:" + serviceInstanceName))); } @Test diff --git a/clouddriver-cloudfoundry/src/test/java/com/netflix/spinnaker/clouddriver/cloudfoundry/deploy/ops/ScaleCloudFoundryServerGroupAtomicOperationTest.java b/clouddriver-cloudfoundry/src/test/java/com/netflix/spinnaker/clouddriver/cloudfoundry/deploy/ops/ScaleCloudFoundryServerGroupAtomicOperationTest.java index 27ba0a44b9c..744af2e2999 100644 --- a/clouddriver-cloudfoundry/src/test/java/com/netflix/spinnaker/clouddriver/cloudfoundry/deploy/ops/ScaleCloudFoundryServerGroupAtomicOperationTest.java +++ b/clouddriver-cloudfoundry/src/test/java/com/netflix/spinnaker/clouddriver/cloudfoundry/deploy/ops/ScaleCloudFoundryServerGroupAtomicOperationTest.java @@ -22,6 +22,7 @@ import com.netflix.spinnaker.clouddriver.data.task.Task; import com.netflix.spinnaker.clouddriver.helpers.OperationPoller; import com.netflix.spinnaker.clouddriver.model.ServerGroup; +import groovy.lang.Closure; import org.assertj.core.util.Lists; import org.junit.jupiter.api.Test; @@ -51,7 +52,8 @@ void scale() { OperationPoller poller = mock(OperationPoller.class); //noinspection unchecked - when(poller.waitForOperation(any(Supplier.class), any(), anyLong(), any(), any(), any())).thenReturn(ProcessStats.State.RUNNING); + when(poller.waitForOperation(any(Supplier.class), any(), any(), any(), any(), any())) + .thenReturn(ProcessStats.State.RUNNING); ScaleCloudFoundryServerGroupAtomicOperation op = new ScaleCloudFoundryServerGroupAtomicOperation(poller, desc); @@ -65,7 +67,7 @@ void failedToScale() { OperationPoller poller = mock(OperationPoller.class); //noinspection unchecked - when(poller.waitForOperation(any(Supplier.class), any(), anyLong(), any(), any(), any())).thenReturn(ProcessStats.State.CRASHED); + when(poller.waitForOperation(any(Supplier.class), any(), any(), any(), any(), any())).thenReturn(ProcessStats.State.CRASHED); ScaleCloudFoundryServerGroupAtomicOperation op = new ScaleCloudFoundryServerGroupAtomicOperation(poller, desc); @@ -85,7 +87,7 @@ void scaleDownToZero() { OperationPoller poller = mock(OperationPoller.class); //noinspection unchecked - when(poller.waitForOperation(any(Supplier.class), any(), anyLong(), any(), any(), any())).thenReturn(ProcessStats.State.DOWN); + when(poller.waitForOperation(any(Supplier.class), any(), any(), any(), any(), any())).thenReturn(ProcessStats.State.DOWN); ScaleCloudFoundryServerGroupAtomicOperation op = new ScaleCloudFoundryServerGroupAtomicOperation(poller, desc); diff --git a/clouddriver-cloudfoundry/src/test/java/com/netflix/spinnaker/clouddriver/cloudfoundry/deploy/ops/StartCloudFoundryServerGroupAtomicOperationTest.java b/clouddriver-cloudfoundry/src/test/java/com/netflix/spinnaker/clouddriver/cloudfoundry/deploy/ops/StartCloudFoundryServerGroupAtomicOperationTest.java index 4e1ae26dcec..a0ee2cf9eb9 100644 --- a/clouddriver-cloudfoundry/src/test/java/com/netflix/spinnaker/clouddriver/cloudfoundry/deploy/ops/StartCloudFoundryServerGroupAtomicOperationTest.java +++ b/clouddriver-cloudfoundry/src/test/java/com/netflix/spinnaker/clouddriver/cloudfoundry/deploy/ops/StartCloudFoundryServerGroupAtomicOperationTest.java @@ -53,7 +53,7 @@ void start() { OperationPoller poller = mock(OperationPoller.class); //noinspection unchecked - when(poller.waitForOperation(any(Supplier.class), any(), anyLong(), any(), any(), any())).thenReturn(ProcessStats.State.RUNNING); + when(poller.waitForOperation(any(Supplier.class), any(), any(), any(), any(), any())).thenReturn(ProcessStats.State.RUNNING); StartCloudFoundryServerGroupAtomicOperation op = new StartCloudFoundryServerGroupAtomicOperation(poller, desc); @@ -67,7 +67,7 @@ void failedToStart() { OperationPoller poller = mock(OperationPoller.class); //noinspection unchecked - when(poller.waitForOperation(any(Supplier.class), any(), anyLong(), any(), any(), any())).thenReturn(ProcessStats.State.CRASHED); + when(poller.waitForOperation(any(Supplier.class), any(), any(), any(), any(), any())).thenReturn(ProcessStats.State.CRASHED); StartCloudFoundryServerGroupAtomicOperation op = new StartCloudFoundryServerGroupAtomicOperation(poller, desc); diff --git a/clouddriver-cloudfoundry/src/test/java/com/netflix/spinnaker/clouddriver/cloudfoundry/deploy/ops/StopCloudFoundryServerGroupAtomicOperationTest.java b/clouddriver-cloudfoundry/src/test/java/com/netflix/spinnaker/clouddriver/cloudfoundry/deploy/ops/StopCloudFoundryServerGroupAtomicOperationTest.java index 5a94f850b30..f8add79af85 100644 --- a/clouddriver-cloudfoundry/src/test/java/com/netflix/spinnaker/clouddriver/cloudfoundry/deploy/ops/StopCloudFoundryServerGroupAtomicOperationTest.java +++ b/clouddriver-cloudfoundry/src/test/java/com/netflix/spinnaker/clouddriver/cloudfoundry/deploy/ops/StopCloudFoundryServerGroupAtomicOperationTest.java @@ -53,7 +53,7 @@ void stop() { OperationPoller poller = mock(OperationPoller.class); //noinspection unchecked - when(poller.waitForOperation(any(Supplier.class), any(), anyLong(), any(), any(), any())).thenReturn(ProcessStats.State.DOWN); + when(poller.waitForOperation(any(Supplier.class), any(), any(), any(), any(), any())).thenReturn(ProcessStats.State.DOWN); StopCloudFoundryServerGroupAtomicOperation op = new StopCloudFoundryServerGroupAtomicOperation(poller, desc); @@ -67,7 +67,7 @@ void failedToStop() { OperationPoller poller = mock(OperationPoller.class); //noinspection unchecked - when(poller.waitForOperation(any(Supplier.class), any(), anyLong(), any(), any(), any())).thenReturn(ProcessStats.State.RUNNING); + when(poller.waitForOperation(any(Supplier.class), any(), any(), any(), any(), any())).thenReturn(ProcessStats.State.RUNNING); StopCloudFoundryServerGroupAtomicOperation op = new StopCloudFoundryServerGroupAtomicOperation(poller, desc); diff --git a/clouddriver-consul/clouddriver-consul.gradle b/clouddriver-consul/clouddriver-consul.gradle index 04be2000a2a..7a7eae96052 100644 --- a/clouddriver-consul/clouddriver-consul.gradle +++ b/clouddriver-consul/clouddriver-consul.gradle @@ -1,3 +1,13 @@ dependencies { - compile project(":clouddriver-core") + implementation project(":clouddriver-core") + + implementation "com.squareup.okhttp:okhttp" + implementation "com.squareup.retrofit:retrofit" + implementation "org.codehaus.groovy:groovy-all" + implementation "org.springframework.boot:spring-boot-starter-web" + + testImplementation "cglib:cglib-nodep" + testImplementation "org.objenesis:objenesis" + testImplementation "org.spockframework:spock-core" + testImplementation "org.spockframework:spock-spring" } diff --git a/clouddriver-core-tck/clouddriver-core-tck.gradle b/clouddriver-core-tck/clouddriver-core-tck.gradle index 7d0f31e76db..1367c087c84 100644 --- a/clouddriver-core-tck/clouddriver-core-tck.gradle +++ b/clouddriver-core-tck/clouddriver-core-tck.gradle @@ -1,5 +1,9 @@ dependencies { - compile project(":clouddriver-core") - compile spinnaker.dependency("junit") - compile spinnaker.dependency("assertj") + implementation project(":clouddriver-core") + + implementation "com.fasterxml.jackson.core:jackson-annotations" + implementation "junit:junit" + implementation "org.apache.commons:commons-lang3" + implementation "org.assertj:assertj-core" + implementation "org.codehaus.groovy:groovy-all" } diff --git a/clouddriver-core-tck/src/main/java/com/netflix/spinnaker/clouddriver/core/test/TaskRepositoryTck.java b/clouddriver-core-tck/src/main/java/com/netflix/spinnaker/clouddriver/core/test/TaskRepositoryTck.java index 5b892850c5d..1009e134542 100644 --- a/clouddriver-core-tck/src/main/java/com/netflix/spinnaker/clouddriver/core/test/TaskRepositoryTck.java +++ b/clouddriver-core-tck/src/main/java/com/netflix/spinnaker/clouddriver/core/test/TaskRepositoryTck.java @@ -19,7 +19,7 @@ import com.netflix.spinnaker.clouddriver.data.task.Status; import com.netflix.spinnaker.clouddriver.data.task.Task; import com.netflix.spinnaker.clouddriver.data.task.TaskRepository; -import org.apache.commons.lang.WordUtils; +import org.apache.commons.lang3.text.WordUtils; import org.junit.Before; import org.junit.Test; diff --git a/clouddriver-core/clouddriver-core.gradle b/clouddriver-core/clouddriver-core.gradle index 5779a050e95..801b4ab13be 100644 --- a/clouddriver-core/clouddriver-core.gradle +++ b/clouddriver-core/clouddriver-core.gradle @@ -1,26 +1,42 @@ dependencies { - spinnaker.group('retrofitDefault') + implementation project(":cats:cats-core") + implementation project(":cats:cats-dynomite") + implementation project(":cats:cats-redis") + implementation project(":clouddriver-security") - compile spinnaker.dependency('bootActuator') - compile spinnaker.dependency('bootDataRest') - compile spinnaker.dependency("commonsExec") - compile spinnaker.dependency('rxJava') - compile spinnaker.dependency('kork') - compile spinnaker.dependency('korkArtifacts') - compile spinnaker.dependency('korkWeb') - compile spinnaker.dependency('eurekaClient') - compile spinnaker.dependency("jedis") - compile spinnaker.dependency("frigga") - compile spinnaker.dependency("lombok") - compile spinnaker.dependency('logstashEncoder') + compileOnly "org.projectlombok:lombok" + annotationProcessor "org.projectlombok:lombok" + testAnnotationProcessor "org.projectlombok:lombok" - compile project(':cats:cats-core') - compile project(':cats:cats-redis') - compile project(':cats:cats-dynomite') - compile project(':clouddriver-security') - testCompile project(':cats:cats-test') - testCompile spinnaker.dependency('korkJedisTest') - testCompile project(":clouddriver-core-tck") + compileOnly "net.logstash.logback:logstash-logback-encoder" + implementation "com.netflix.eureka:eureka-client" + implementation "com.netflix.frigga:frigga" + implementation "com.netflix.spinnaker.fiat:fiat-api:$fiatVersion" + implementation "com.netflix.spinnaker.fiat:fiat-core:$fiatVersion" + implementation "com.netflix.spinnaker.kork:kork-artifacts" + implementation "com.netflix.spinnaker.kork:kork-core" + implementation "com.netflix.spinnaker.kork:kork-dynomite" + implementation "com.netflix.spinnaker.kork:kork-jedis" + implementation "com.netflix.spinnaker.kork:kork-web" + implementation "com.netflix.spinnaker.moniker:moniker" + implementation "com.squareup.okhttp:okhttp" + implementation "com.squareup.okhttp:okhttp-apache" + implementation "com.squareup.okhttp:okhttp-urlconnection" + implementation "com.squareup.retrofit:converter-jackson" + implementation "com.squareup.retrofit:retrofit" + implementation "io.reactivex:rxjava" + implementation "net.jodah:failsafe:1.0.4" + implementation "org.apache.commons:commons-exec" + implementation "org.codehaus.groovy:groovy-all" + implementation "org.springframework.boot:spring-boot-actuator" + implementation "redis.clients:jedis" - compile 'com.netflix.spinnaker.moniker:moniker:0.2.0' + testImplementation project(":cats:cats-test") + testImplementation project(":clouddriver-core-tck") + + testImplementation "cglib:cglib-nodep" + testImplementation "com.netflix.spinnaker.kork:kork-jedis-test" + testImplementation "org.objenesis:objenesis" + testImplementation "org.spockframework:spock-core" + testImplementation "org.spockframework:spock-spring" } diff --git a/clouddriver-core/src/main/groovy/com/netflix/spinnaker/clouddriver/cache/AgentSchedulerConfig.java b/clouddriver-core/src/main/groovy/com/netflix/spinnaker/clouddriver/cache/AgentSchedulerConfig.java index 3ee5e0d5497..a4e2c262b92 100644 --- a/clouddriver-core/src/main/groovy/com/netflix/spinnaker/clouddriver/cache/AgentSchedulerConfig.java +++ b/clouddriver-core/src/main/groovy/com/netflix/spinnaker/clouddriver/cache/AgentSchedulerConfig.java @@ -37,7 +37,7 @@ import java.time.Clock; @Configuration -@ConditionalOnProperty(value = "caching.writeEnabled", matchIfMissing = true) +@ConditionalOnProperty(value = "caching.write-enabled", matchIfMissing = true) public class AgentSchedulerConfig { @Bean diff --git a/clouddriver-core/src/main/groovy/com/netflix/spinnaker/clouddriver/cache/CacheConfig.groovy b/clouddriver-core/src/main/groovy/com/netflix/spinnaker/clouddriver/cache/CacheConfig.groovy index df2a866043f..926f47f970c 100644 --- a/clouddriver-core/src/main/groovy/com/netflix/spinnaker/clouddriver/cache/CacheConfig.groovy +++ b/clouddriver-core/src/main/groovy/com/netflix/spinnaker/clouddriver/cache/CacheConfig.groovy @@ -53,13 +53,13 @@ class CacheConfig { @Bean @ConditionalOnMissingBean(AgentScheduler) - @ConditionalOnProperty(value = 'caching.writeEnabled', matchIfMissing = true) + @ConditionalOnProperty(value = 'caching.write-enabled', matchIfMissing = true) AgentScheduler agentScheduler() { new DefaultAgentScheduler(60, TimeUnit.SECONDS) } @Bean - @ConditionalOnProperty(value = 'caching.writeEnabled', havingValue = 'false') + @ConditionalOnProperty(value = 'caching.write-enabled', havingValue = 'false') @ConditionalOnMissingBean(AgentScheduler) AgentScheduler noopAgentScheduler() { new AgentScheduler() { diff --git a/clouddriver-core/src/main/groovy/com/netflix/spinnaker/clouddriver/cache/CatsInMemorySearchProperties.java b/clouddriver-core/src/main/groovy/com/netflix/spinnaker/clouddriver/cache/CatsInMemorySearchProperties.java index a872b2f5c38..e1f862297c2 100644 --- a/clouddriver-core/src/main/groovy/com/netflix/spinnaker/clouddriver/cache/CatsInMemorySearchProperties.java +++ b/clouddriver-core/src/main/groovy/com/netflix/spinnaker/clouddriver/cache/CatsInMemorySearchProperties.java @@ -18,7 +18,7 @@ import org.springframework.boot.context.properties.ConfigurationProperties; -@ConfigurationProperties("caching.search.inMemory") +@ConfigurationProperties("caching.search.in-memory") public class CatsInMemorySearchProperties { private boolean enabled = false; private int refreshIntervalSeconds = 30; diff --git a/clouddriver-core/src/main/groovy/com/netflix/spinnaker/clouddriver/cache/DynomiteCacheConfig.groovy b/clouddriver-core/src/main/groovy/com/netflix/spinnaker/clouddriver/cache/DynomiteCacheConfig.groovy index 28129334b1f..8b02c79ce8f 100644 --- a/clouddriver-core/src/main/groovy/com/netflix/spinnaker/clouddriver/cache/DynomiteCacheConfig.groovy +++ b/clouddriver-core/src/main/groovy/com/netflix/spinnaker/clouddriver/cache/DynomiteCacheConfig.groovy @@ -58,7 +58,7 @@ class DynomiteCacheConfig { } @Bean - @ConfigurationProperties("dynomite.connectionPool") + @ConfigurationProperties("dynomite.connection-pool") ConnectionPoolConfigurationImpl connectionPoolConfiguration(DynomiteConfigurationProperties dynomiteConfigurationProperties) { new ConnectionPoolConfigurationImpl(dynomiteConfigurationProperties.applicationName).withHashtag("{}") } diff --git a/clouddriver-core/src/main/groovy/com/netflix/spinnaker/clouddriver/config/CloudDriverConfig.groovy b/clouddriver-core/src/main/groovy/com/netflix/spinnaker/clouddriver/config/CloudDriverConfig.groovy index 4df870a661f..2671c0d0b1e 100644 --- a/clouddriver-core/src/main/groovy/com/netflix/spinnaker/clouddriver/config/CloudDriverConfig.groovy +++ b/clouddriver-core/src/main/groovy/com/netflix/spinnaker/clouddriver/config/CloudDriverConfig.groovy @@ -136,7 +136,7 @@ class CloudDriverConfig { } @Bean - @ConfigurationProperties('serviceLimits') + @ConfigurationProperties('service-limits') ServiceLimitConfigurationBuilder serviceLimitConfigProperties() { return new ServiceLimitConfigurationBuilder() } diff --git a/clouddriver-core/src/main/groovy/com/netflix/spinnaker/clouddriver/config/DualTaskRepositoryConfiguration.java b/clouddriver-core/src/main/groovy/com/netflix/spinnaker/clouddriver/config/DualTaskRepositoryConfiguration.java index df281501816..7c2179cedcd 100644 --- a/clouddriver-core/src/main/groovy/com/netflix/spinnaker/clouddriver/config/DualTaskRepositoryConfiguration.java +++ b/clouddriver-core/src/main/groovy/com/netflix/spinnaker/clouddriver/config/DualTaskRepositoryConfiguration.java @@ -31,7 +31,7 @@ import static java.lang.String.format; @Configuration -@ConditionalOnProperty("dualTaskRepository.enabled") +@ConditionalOnProperty("dual-task-repository.enabled") @EnableConfigurationProperties(Properties.class) public class DualTaskRepositoryConfiguration { @@ -65,7 +65,7 @@ private TaskRepository findTaskRepositoryByClass(List allReposit ))); } - @ConfigurationProperties("dualTaskRepository") + @ConfigurationProperties("dual-task-repository") public static class Properties { /** * The primary TaskRepository class. diff --git a/clouddriver-core/src/main/groovy/com/netflix/spinnaker/clouddriver/config/LocalJobConfig.java b/clouddriver-core/src/main/groovy/com/netflix/spinnaker/clouddriver/config/LocalJobConfig.java index 73d357f2125..9d22e4eaa8e 100644 --- a/clouddriver-core/src/main/groovy/com/netflix/spinnaker/clouddriver/config/LocalJobConfig.java +++ b/clouddriver-core/src/main/groovy/com/netflix/spinnaker/clouddriver/config/LocalJobConfig.java @@ -27,7 +27,7 @@ public class LocalJobConfig { @Bean @ConditionalOnMissingBean(JobExecutor.class) - public JobExecutor jobExecutorLocal(@Value("${jobs.local.timeoutMinutes:10}") long timeoutMinutes) { + public JobExecutor jobExecutorLocal(@Value("${jobs.local.timeout-minutes:10}") long timeoutMinutes) { return new JobExecutorLocal(timeoutMinutes); } } diff --git a/clouddriver-core/src/main/groovy/com/netflix/spinnaker/clouddriver/config/ProjectClustersCachingAgentProperties.java b/clouddriver-core/src/main/groovy/com/netflix/spinnaker/clouddriver/config/ProjectClustersCachingAgentProperties.java index eb4d7bf0188..453915fe774 100644 --- a/clouddriver-core/src/main/groovy/com/netflix/spinnaker/clouddriver/config/ProjectClustersCachingAgentProperties.java +++ b/clouddriver-core/src/main/groovy/com/netflix/spinnaker/clouddriver/config/ProjectClustersCachingAgentProperties.java @@ -22,7 +22,7 @@ import java.util.List; import java.util.stream.Collectors; -@ConfigurationProperties("cachingAgent.projectClusters") +@ConfigurationProperties("caching-agent.project-clusters") public class ProjectClustersCachingAgentProperties { /** diff --git a/clouddriver-core/src/main/groovy/com/netflix/spinnaker/clouddriver/core/DynomiteConfig.groovy b/clouddriver-core/src/main/groovy/com/netflix/spinnaker/clouddriver/core/DynomiteConfig.groovy index bbaf0d47ba2..3fbba43a5ba 100644 --- a/clouddriver-core/src/main/groovy/com/netflix/spinnaker/clouddriver/core/DynomiteConfig.groovy +++ b/clouddriver-core/src/main/groovy/com/netflix/spinnaker/clouddriver/core/DynomiteConfig.groovy @@ -53,12 +53,12 @@ class DynomiteConfig { } @Bean - @ConfigurationProperties("dynomite.connectionPool") + @ConfigurationProperties("dynomite.connection-pool") ConnectionPoolConfigurationImpl connectionPoolConfiguration(DynomiteConfigurationProperties dynomiteConfigurationProperties) { new ConnectionPoolConfigurationImpl(dynomiteConfigurationProperties.applicationName).withHashtag("{}") } - @Bean(destroyMethod = "stopClient") + @Bean(destroyMethod = "stop-client") DynoJedisClient dynoJedisClient(DynomiteConfigurationProperties dynomiteConfigurationProperties, ConnectionPoolConfigurationImpl connectionPoolConfiguration, Optional discoveryClient) { def builder = new DynoJedisClient.Builder() .withApplicationName(dynomiteConfigurationProperties.applicationName) @@ -80,13 +80,13 @@ class DynomiteConfig { } @Bean - @ConditionalOnProperty("redis.connectionPrevious") + @ConditionalOnProperty("redis.connection-previous") JedisClientDelegate redisClientDelegatePrevious(JedisPool jedisPoolPrevious) { return new JedisClientDelegate(jedisPoolPrevious) } @Bean - @ConditionalOnProperty("redis.connectionPrevious") + @ConditionalOnProperty("redis.connection-previous") JedisPool jedisPoolPrevious(RedisConfigurationProperties redisConfigurationProperties) { return createPool(null, redisConfigurationProperties.connectionPrevious, 1000) } diff --git a/clouddriver-core/src/main/groovy/com/netflix/spinnaker/clouddriver/core/RedisConfig.groovy b/clouddriver-core/src/main/groovy/com/netflix/spinnaker/clouddriver/core/RedisConfig.groovy index 5bcdbab4236..4ba7381027b 100644 --- a/clouddriver-core/src/main/groovy/com/netflix/spinnaker/clouddriver/core/RedisConfig.groovy +++ b/clouddriver-core/src/main/groovy/com/netflix/spinnaker/clouddriver/core/RedisConfig.groovy @@ -26,7 +26,11 @@ import org.apache.commons.pool2.impl.GenericObjectPool import org.apache.commons.pool2.impl.GenericObjectPoolConfig import org.springframework.boot.actuate.health.Health import org.springframework.boot.actuate.health.HealthIndicator +import org.springframework.boot.autoconfigure.EnableAutoConfiguration +import org.springframework.boot.autoconfigure.condition.ConditionalOnBean import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty +import org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration import org.springframework.boot.context.properties.ConfigurationProperties import org.springframework.boot.context.properties.EnableConfigurationProperties import org.springframework.context.annotation.Bean @@ -36,7 +40,7 @@ import redis.clients.jedis.JedisPool import redis.clients.jedis.Protocol @Configuration -@ConditionalOnExpression('${redis.enabled:true}') +@ConditionalOnProperty(value = 'redis.enabled', matchIfMissing = true) @EnableConfigurationProperties(RedisConfigurationProperties) class RedisConfig { @Bean @@ -46,7 +50,7 @@ class RedisConfig { } @Bean - @ConditionalOnExpression('${redis.taskRepository.enabled:true}') + @ConditionalOnExpression('${redis.task-repository.enabled:true}') TaskRepository taskRepository(RedisClientDelegate redisClientDelegate, Optional redisClientDelegatePrevious) { new RedisTaskRepository(redisClientDelegate, redisClientDelegatePrevious) } @@ -57,6 +61,7 @@ class RedisConfig { } @Bean + @ConditionalOnBean(value = JedisPool, name = "jedisPoolPrevious") RedisClientDelegate redisClientDelegatePrevious(JedisPool jedisPoolPrevious) { return new JedisClientDelegate(jedisPoolPrevious) } diff --git a/clouddriver-core/src/main/groovy/com/netflix/spinnaker/clouddriver/data/task/DefaultTask.groovy b/clouddriver-core/src/main/groovy/com/netflix/spinnaker/clouddriver/data/task/DefaultTask.groovy index 36dc4a210c7..c26836d1bd0 100644 --- a/clouddriver-core/src/main/groovy/com/netflix/spinnaker/clouddriver/data/task/DefaultTask.groovy +++ b/clouddriver-core/src/main/groovy/com/netflix/spinnaker/clouddriver/data/task/DefaultTask.groovy @@ -17,6 +17,7 @@ package com.netflix.spinnaker.clouddriver.data.task import com.fasterxml.jackson.annotation.JsonIgnore +import com.fasterxml.jackson.annotation.JsonProperty import com.netflix.spinnaker.clouddriver.core.ClouddriverHostname import groovy.transform.CompileStatic import groovy.transform.Immutable @@ -131,11 +132,14 @@ class DefaultTaskStatus implements Status { new DefaultTaskStatus(phase, status, state) } - Boolean isComplete() { state.completed } + @JsonProperty + public Boolean isComplete() { state.isCompleted() } - Boolean isCompleted() { state.completed } + @JsonProperty + public Boolean isCompleted() { state.isCompleted() } - Boolean isFailed() { state.failed } + @JsonProperty + public Boolean isFailed() { state.isFailed() } DefaultTaskStatus update(String phase, String status) { ensureUpdateable() diff --git a/clouddriver-core/src/main/groovy/com/netflix/spinnaker/clouddriver/helpers/EnableDisablePercentageCategorizer.groovy b/clouddriver-core/src/main/groovy/com/netflix/spinnaker/clouddriver/helpers/EnableDisablePercentageCategorizer.groovy index 58e81961dc6..fcef2bd2328 100644 --- a/clouddriver-core/src/main/groovy/com/netflix/spinnaker/clouddriver/helpers/EnableDisablePercentageCategorizer.groovy +++ b/clouddriver-core/src/main/groovy/com/netflix/spinnaker/clouddriver/helpers/EnableDisablePercentageCategorizer.groovy @@ -29,7 +29,7 @@ class EnableDisablePercentageCategorizer { * * @note modified + unmodified should be the total list of instances managed by one server group */ - static List getInstancesToModify(List modified, List unmodified, int desiredPercentage) { + static List getInstancesToModify(List modified, List unmodified, int desiredPercentage) { if (desiredPercentage < 0 || desiredPercentage > 100) { throw new RuntimeException("Desired target percentage must be between 0 and 100 inclusive") } diff --git a/clouddriver-core/src/main/groovy/com/netflix/spinnaker/clouddriver/model/ServerGroup.java b/clouddriver-core/src/main/groovy/com/netflix/spinnaker/clouddriver/model/ServerGroup.java index b0430c4b492..f770013f3bb 100644 --- a/clouddriver-core/src/main/groovy/com/netflix/spinnaker/clouddriver/model/ServerGroup.java +++ b/clouddriver-core/src/main/groovy/com/netflix/spinnaker/clouddriver/model/ServerGroup.java @@ -16,6 +16,7 @@ package com.netflix.spinnaker.clouddriver.model; +import com.fasterxml.jackson.annotation.JsonGetter; import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonInclude; import com.netflix.spinnaker.clouddriver.documentation.Empty; @@ -78,6 +79,7 @@ default Moniker getMoniker() { * * @return true if the server group is disabled; false otherwise */ + @JsonGetter Boolean isDisabled(); /** diff --git a/clouddriver-core/src/main/groovy/com/netflix/spinnaker/clouddriver/security/AbstractAtomicOperationsCredentialsSupport.groovy b/clouddriver-core/src/main/groovy/com/netflix/spinnaker/clouddriver/security/AbstractAtomicOperationsCredentialsSupport.groovy index ce41095c421..fb7b47e08b8 100644 --- a/clouddriver-core/src/main/groovy/com/netflix/spinnaker/clouddriver/security/AbstractAtomicOperationsCredentialsSupport.groovy +++ b/clouddriver-core/src/main/groovy/com/netflix/spinnaker/clouddriver/security/AbstractAtomicOperationsCredentialsSupport.groovy @@ -21,7 +21,6 @@ import com.fasterxml.jackson.databind.ObjectMapper import com.fasterxml.jackson.databind.SerializationFeature import com.netflix.spinnaker.clouddriver.orchestration.AtomicOperationConverter import com.netflix.spinnaker.kork.web.exceptions.InvalidRequestException -import groovy.transform.InheritConstructors import org.springframework.beans.factory.annotation.Autowired abstract class AbstractAtomicOperationsCredentialsSupport implements AtomicOperationConverter { diff --git a/clouddriver-dcos/clouddriver-dcos.gradle b/clouddriver-dcos/clouddriver-dcos.gradle index e3f0efaa3d6..113462d3dd6 100644 --- a/clouddriver-dcos/clouddriver-dcos.gradle +++ b/clouddriver-dcos/clouddriver-dcos.gradle @@ -1,6 +1,24 @@ dependencies { - compile project(":clouddriver-core") - compile spinnaker.dependency('bootActuator') - compile spinnaker.dependency('bootWeb') - compile 'com.cerner.marathon:marathon-client:0.6.3' + implementation project(":clouddriver-core") + implementation project(":clouddriver-security") + implementation project(":cats:cats-core") + + compileOnly "org.apache.commons:commons-lang3" + implementation "com.google.guava:guava:27.1-jre" + implementation "com.netflix.frigga:frigga" + implementation "com.netflix.spectator:spectator-api" + implementation "com.netflix.spinnaker.fiat:fiat-api:$fiatVersion" + implementation "com.netflix.spinnaker.fiat:fiat-core:$fiatVersion" + implementation "com.netflix.spinnaker.moniker:moniker" + implementation "joda-time:joda-time:2.10.1" + implementation "org.codehaus.groovy:groovy-all" + implementation "org.springframework.boot:spring-boot-actuator" + implementation "org.springframework.boot:spring-boot-starter-web" + implementation 'com.cerner.marathon:marathon-client:0.6.3' + + testImplementation "cglib:cglib-nodep" + testImplementation "org.objenesis:objenesis" + testImplementation "org.spockframework:spock-core" + testImplementation "org.spockframework:spock-spring" + testImplementation "org.springframework:spring-test" } diff --git a/clouddriver-docker/clouddriver-docker.gradle b/clouddriver-docker/clouddriver-docker.gradle index 4941f9e44ff..6ffe56cda7c 100644 --- a/clouddriver-docker/clouddriver-docker.gradle +++ b/clouddriver-docker/clouddriver-docker.gradle @@ -1,5 +1,22 @@ dependencies { - compile project(":clouddriver-core") - compile spinnaker.dependency('bootActuator') - compile spinnaker.dependency('bootWeb') + implementation project(":clouddriver-core") + implementation project(":clouddriver-security") + implementation project(":cats:cats-core") + + implementation "org.springframework.boot:spring-boot-actuator" + implementation "org.springframework.boot:spring-boot-starter-web" + implementation "org.codehaus.groovy:groovy-all" + implementation "com.netflix.spectator:spectator-api" + implementation "com.squareup.okhttp:okhttp" + implementation "com.squareup.retrofit:retrofit" + implementation "org.apache.commons:commons-compress:1.14" + implementation "commons-io:commons-io:2.6" + implementation "com.netflix.spinnaker.fiat:fiat-api:$fiatVersion" + implementation "com.netflix.spinnaker.fiat:fiat-core:$fiatVersion" + + testImplementation "cglib:cglib-nodep" + testImplementation "org.objenesis:objenesis" + testImplementation "org.spockframework:spock-core" + testImplementation "org.spockframework:spock-spring" + testImplementation "org.springframework:spring-test" } diff --git a/clouddriver-docker/src/main/groovy/com/netflix/spinnaker/clouddriver/docker/registry/api/v2/auth/DockerBearerTokenService.groovy b/clouddriver-docker/src/main/groovy/com/netflix/spinnaker/clouddriver/docker/registry/api/v2/auth/DockerBearerTokenService.groovy index a7a065369d7..63e10e76d4e 100644 --- a/clouddriver-docker/src/main/groovy/com/netflix/spinnaker/clouddriver/docker/registry/api/v2/auth/DockerBearerTokenService.groovy +++ b/clouddriver-docker/src/main/groovy/com/netflix/spinnaker/clouddriver/docker/registry/api/v2/auth/DockerBearerTokenService.groovy @@ -26,6 +26,9 @@ import retrofit.http.Headers import retrofit.http.Path import retrofit.http.Query +import java.nio.charset.Charset +import java.nio.charset.StandardCharsets + @Slf4j class DockerBearerTokenService { Map realmToService @@ -71,10 +74,10 @@ class DockerBearerTokenService { def errCode = process.waitFor() log.debug("Full command is: ${pb.command()}") if (errCode != 0) { - def err = IOUtils.toString(process.getErrorStream()) + def err = IOUtils.toString(process.getErrorStream(), StandardCharsets.UTF_8) log.error("Password command returned a non 0 return code, stderr/stdout was: '${err}'") } - resolvedPassword = IOUtils.toString(process.getInputStream()).trim() + resolvedPassword = IOUtils.toString(process.getInputStream(), StandardCharsets.UTF_8).trim() log.debug("resolvedPassword is ${resolvedPassword}") } else if (passwordFile) { resolvedPassword = new BufferedReader(new FileReader(passwordFile)).getText() @@ -92,7 +95,7 @@ class DockerBearerTokenService { } } - def basicAuth = new String(Base64.encoder.encode(("${username}:${resolvedPassword}").bytes)) + return new String(Base64.encoder.encode(("${username}:${resolvedPassword}").bytes)) } String getBasicAuthHeader() { diff --git a/clouddriver-docker/src/main/groovy/com/netflix/spinnaker/config/DockerRegistryConfiguration.groovy b/clouddriver-docker/src/main/groovy/com/netflix/spinnaker/config/DockerRegistryConfiguration.groovy index 178fc5caf2e..e3dd3e60996 100644 --- a/clouddriver-docker/src/main/groovy/com/netflix/spinnaker/config/DockerRegistryConfiguration.groovy +++ b/clouddriver-docker/src/main/groovy/com/netflix/spinnaker/config/DockerRegistryConfiguration.groovy @@ -35,13 +35,13 @@ import org.springframework.scheduling.annotation.EnableScheduling @Configuration @EnableConfigurationProperties @EnableScheduling -@ConditionalOnProperty('dockerRegistry.enabled') +@ConditionalOnProperty('docker-registry.enabled') @ComponentScan(["com.netflix.spinnaker.clouddriver.docker.registry"]) @Import([ DockerRegistryCredentialsInitializer ]) class DockerRegistryConfiguration { @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) @Bean - @ConfigurationProperties("dockerRegistry") + @ConfigurationProperties("docker-registry") DockerRegistryConfigurationProperties dockerRegistryConfigurationProperties() { new DockerRegistryConfigurationProperties() } diff --git a/clouddriver-ecs/clouddriver-ecs.gradle b/clouddriver-ecs/clouddriver-ecs.gradle index e86258330f3..7b60738d443 100644 --- a/clouddriver-ecs/clouddriver-ecs.gradle +++ b/clouddriver-ecs/clouddriver-ecs.gradle @@ -1,7 +1,36 @@ dependencies { - compile project(":clouddriver-aws") - compile spinnaker.dependency('lombok') + implementation project(":cats:cats-core") + implementation project(":clouddriver-aws") + implementation project(":clouddriver-core") + implementation project(":clouddriver-security") - spinnaker.group('amazon') - spinnaker.group('retrofitDefault') + compileOnly "org.projectlombok:lombok" + annotationProcessor "org.projectlombok:lombok" + testAnnotationProcessor "org.projectlombok:lombok" + + implementation "com.amazonaws:aws-java-sdk" + implementation "com.google.guava:guava:27.1-jre" + implementation "com.netflix.awsobjectmapper:awsobjectmapper" + implementation "com.netflix.frigga:frigga" + implementation "com.netflix.spectator:spectator-api" + implementation "com.netflix.spinnaker.fiat:fiat-api:$fiatVersion" + implementation "com.netflix.spinnaker.fiat:fiat-core:$fiatVersion" + implementation "com.netflix.spinnaker.kork:kork-exceptions" + implementation "com.squareup.okhttp:okhttp" + implementation "com.squareup.okhttp:okhttp-apache" + implementation "com.squareup.okhttp:okhttp-urlconnection" + implementation "com.squareup.retrofit:converter-jackson" + implementation "com.squareup.retrofit:retrofit" + implementation "org.apache.commons:commons-lang3" + implementation "org.apache.httpcomponents:httpclient" + implementation "org.apache.httpcomponents:httpcore" + implementation "org.codehaus.groovy:groovy-all" + implementation "org.springframework.boot:spring-boot-starter-test" + implementation "org.springframework.boot:spring-boot-starter-web" + + testImplementation "cglib:cglib-nodep" + testImplementation "org.mockito:mockito-core" + testImplementation "org.objenesis:objenesis" + testImplementation "org.spockframework:spock-core" + testImplementation "org.spockframework:spock-spring" } diff --git a/clouddriver-ecs/src/main/java/com/netflix/spinnaker/clouddriver/ecs/provider/agent/EcsClusterCachingAgent.java b/clouddriver-ecs/src/main/java/com/netflix/spinnaker/clouddriver/ecs/provider/agent/EcsClusterCachingAgent.java index d90b5e67395..fadad8426a2 100644 --- a/clouddriver-ecs/src/main/java/com/netflix/spinnaker/clouddriver/ecs/provider/agent/EcsClusterCachingAgent.java +++ b/clouddriver-ecs/src/main/java/com/netflix/spinnaker/clouddriver/ecs/provider/agent/EcsClusterCachingAgent.java @@ -27,7 +27,7 @@ import com.netflix.spinnaker.clouddriver.aws.security.AmazonClientProvider; import com.netflix.spinnaker.clouddriver.aws.security.NetflixAmazonCredentials; import com.netflix.spinnaker.clouddriver.ecs.cache.Keys; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/clouddriver-ecs/src/main/java/com/netflix/spinnaker/clouddriver/ecs/provider/agent/TaskHealthCachingAgent.java b/clouddriver-ecs/src/main/java/com/netflix/spinnaker/clouddriver/ecs/provider/agent/TaskHealthCachingAgent.java index 205532967ca..c9d10d1b310 100644 --- a/clouddriver-ecs/src/main/java/com/netflix/spinnaker/clouddriver/ecs/provider/agent/TaskHealthCachingAgent.java +++ b/clouddriver-ecs/src/main/java/com/netflix/spinnaker/clouddriver/ecs/provider/agent/TaskHealthCachingAgent.java @@ -43,7 +43,7 @@ import com.netflix.spinnaker.clouddriver.ecs.cache.model.Service; import com.netflix.spinnaker.clouddriver.ecs.cache.model.Task; import com.netflix.spinnaker.clouddriver.ecs.cache.model.TaskHealth; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/clouddriver-ecs/src/main/java/com/netflix/spinnaker/clouddriver/ecs/view/EcsInstanceProvider.java b/clouddriver-ecs/src/main/java/com/netflix/spinnaker/clouddriver/ecs/view/EcsInstanceProvider.java index 2d05028fb8c..bf6001dad39 100644 --- a/clouddriver-ecs/src/main/java/com/netflix/spinnaker/clouddriver/ecs/view/EcsInstanceProvider.java +++ b/clouddriver-ecs/src/main/java/com/netflix/spinnaker/clouddriver/ecs/view/EcsInstanceProvider.java @@ -26,7 +26,7 @@ import com.netflix.spinnaker.clouddriver.ecs.model.EcsTask; import com.netflix.spinnaker.clouddriver.ecs.services.ContainerInformationService; import com.netflix.spinnaker.clouddriver.model.InstanceProvider; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; diff --git a/clouddriver-ecs/src/test/groovy/com/netflix/spinnaker/clouddriver/ecs/deploy/ops/CreateServerGroupAtomicOperationSpec.groovy b/clouddriver-ecs/src/test/groovy/com/netflix/spinnaker/clouddriver/ecs/deploy/ops/CreateServerGroupAtomicOperationSpec.groovy index ade52f7b847..471aede546e 100644 --- a/clouddriver-ecs/src/test/groovy/com/netflix/spinnaker/clouddriver/ecs/deploy/ops/CreateServerGroupAtomicOperationSpec.groovy +++ b/clouddriver-ecs/src/test/groovy/com/netflix/spinnaker/clouddriver/ecs/deploy/ops/CreateServerGroupAtomicOperationSpec.groovy @@ -121,48 +121,15 @@ class CreateServerGroupAtomicOperationSpec extends CommonAtomicOperation { def result = operation.operate([]) then: - 1 * ecs.listServices(_) >> new ListServicesResult().withServiceArns("${serviceName}-v007") - 2 * ecs.describeServices(_) >> new DescribeServicesResult().withServices( + ecs.listServices(_) >> new ListServicesResult().withServiceArns("${serviceName}-v007") + ecs.describeServices(_) >> new DescribeServicesResult().withServices( new Service(serviceName: "${serviceName}-v007", createdAt: new Date(), desiredCount: 3)) - 1 * ecs.registerTaskDefinition({RegisterTaskDefinitionRequest request -> - request.containerDefinitions.size() == 1 - request.containerDefinitions.get(0).memoryReservation == 9002 - request.containerDefinitions.get(0).cpu == 9001 - request.containerDefinitions.get(0).portMappings.size() == 1 - request.containerDefinitions.get(0).portMappings.get(0).containerPort == 1337 - request.containerDefinitions.get(0).portMappings.get(0).hostPort == 0 - request.containerDefinitions.get(0).portMappings.get(0).protocol == 'tcp' - request.containerDefinitions.get(0).image == 'docker-image-url' - request.taskRoleArn == 'test-role' - }) >> new RegisterTaskDefinitionResult().withTaskDefinition(taskDefinition) - - 1 * iamClient.getRole(_) >> new GetRoleResult().withRole(role) - 1 * iamPolicyReader.getTrustedEntities(_) >> trustRelationships - 1 * loadBalancingV2.describeTargetGroups(_) >> new DescribeTargetGroupsResult().withTargetGroups(targetGroup) - - 1 * ecs.createService({ CreateServiceRequest request -> - request.serviceName == "service/test-cluster/${serviceName}-v008" - request.desiredCount == 1 - request.cluster = 'test-cluster' - request.enableECSManagedTags == true - request.propagateTags == 'SERVICE' - request.tags.size() == 2 - request.tags.get(0).getKey() == 'label1' - request.tags.get(0).getValue() == 'value1' - request.tags.get(1).getKey() == 'fruit' - request.tags.get(1).getValue() == 'tomato' - request.loadBalancers.size() == 1 - request.loadBalancers.get(0).containerPort == 1337 - request.loadBalancers.get(0).targetGroupArn == 'target-group-arn' - request.taskDefinition == 'task-def-arn' - request.networkConfiguration == null - request.placementStrategy == [placementStrategy] - request.placementConstraints == [placementConstraint] - request.platformVersion == null - request.role == 'arn:aws:iam::test:test-role' - request.serviceRegistries == [] - } as CreateServiceRequest) >> new CreateServiceResult().withService(service) + ecs.registerTaskDefinition(_) >> new RegisterTaskDefinitionResult().withTaskDefinition(taskDefinition) + iamClient.getRole(_) >> new GetRoleResult().withRole(role) + iamPolicyReader.getTrustedEntities(_) >> trustRelationships + loadBalancingV2.describeTargetGroups(_) >> new DescribeTargetGroupsResult().withTargetGroups(targetGroup) + ecs.createService(_) >> new CreateServiceResult().withService(service) result.getServerGroupNames().size() == 1 result.getServerGroupNameByRegion().size() == 1 @@ -170,20 +137,17 @@ class CreateServerGroupAtomicOperationSpec extends CommonAtomicOperation { result.getServerGroupNameByRegion().containsKey('us-west-1') result.getServerGroupNameByRegion().get('us-west-1').contains(serviceName + "-v008") - 1 * autoScalingClient.registerScalableTarget({RegisterScalableTargetRequest request -> - request.serviceNamespace == ServiceNamespace.Ecs - request.scalableDimension == ScalableDimension.EcsServiceDesiredCount - request.resourceId == "service/test-cluster/${serviceName}-v008" - request.roleARN == 'test-role' - request.minCapacity == 2 - request.maxCapacity == 4 - }) - - 1 * autoScalingClient.describeScalableTargets({ DescribeScalableTargetsRequest request -> - request.scalableDimension == ScalableDimension.EcsServiceDesiredCount - request.serviceNamespace == ServiceNamespace.Ecs - request.resourceIds == ["service/test-cluster/${serviceName}-v007"] - }) >> new DescribeScalableTargetsResult() + 1 * autoScalingClient.registerScalableTarget(_) >> { arguments -> + RegisterScalableTargetRequest request = arguments.get(0) + assert request.serviceNamespace == ServiceNamespace.Ecs.toString() + assert request.scalableDimension == ScalableDimension.EcsServiceDesiredCount.toString() + assert request.resourceId == "service/test-cluster/${serviceName}-v008" + assert request.roleARN == 'arn:aws:iam::test:test-role' + assert request.minCapacity == 2 + assert request.maxCapacity == 4 + } + + autoScalingClient.describeScalableTargets(_) >> new DescribeScalableTargetsResult() .withScalableTargets(new ScalableTarget() .withResourceId("service/test-cluster/${serviceName}-v007") .withMinCapacity(2) @@ -198,7 +162,8 @@ class CreateServerGroupAtomicOperationSpec extends CommonAtomicOperation { "us-west-1", "${serviceName}-v007", "service/test-cluster/${serviceName}-v007", - "test-cluster"); + "test-cluster" + ) } def 'should create a service using VPC and Fargate mode'() { @@ -257,32 +222,17 @@ class CreateServerGroupAtomicOperationSpec extends CommonAtomicOperation { def result = operation.operate([]) then: - 1 * ecs.listServices(_) >> new ListServicesResult().withServiceArns("${serviceName}-v007") - 1 * ecs.describeServices(_) >> new DescribeServicesResult().withServices( + ecs.listServices(_) >> new ListServicesResult().withServiceArns("${serviceName}-v007") + ecs.describeServices(_) >> new DescribeServicesResult().withServices( new Service(serviceName: "${serviceName}-v007", createdAt: new Date())) - 1 * ecs.registerTaskDefinition({RegisterTaskDefinitionRequest request -> - request.networkMode == 'awsvpc' - request.containerDefinitions.size() == 1 - request.containerDefinitions.get(0).portMappings.size() == 2 - request.containerDefinitions.get(0).portMappings.get(0).containerPort == 1337 - request.containerDefinitions.get(0).portMappings.get(0).hostPort == 0 - request.containerDefinitions.get(0).portMappings.get(0).protocol == 'tcp' - request.containerDefinitions.get(0).portMappings.get(1).containerPort == 9090 - request.containerDefinitions.get(0).portMappings.get(1).hostPort == 0 - request.containerDefinitions.get(0).portMappings.get(1).protocol == 'tcp' - request.requiresCompatibilities.size() == 1 - request.requiresCompatibilities.get(0) == 'FARGATE' - request.memory == 9001 - request.cpu == 9002 - request.executionRoleArn == 'arn:aws:iam::test:test-role' - }) >> new RegisterTaskDefinitionResult().withTaskDefinition(taskDefinition) - - 1 * iamClient.getRole(_) >> new GetRoleResult().withRole(role) - 1 * iamPolicyReader.getTrustedEntities(_) >> trustRelationships - 1 * loadBalancingV2.describeTargetGroups(_) >> new DescribeTargetGroupsResult().withTargetGroups(targetGroup) - - 1 * ecs.createService({ CreateServiceRequest request -> + ecs.registerTaskDefinition(_) >> new RegisterTaskDefinitionResult().withTaskDefinition(taskDefinition) + + iamClient.getRole(_) >> new GetRoleResult().withRole(role) + iamPolicyReader.getTrustedEntities(_) >> trustRelationships + loadBalancingV2.describeTargetGroups(_) >> new DescribeTargetGroupsResult().withTargetGroups(targetGroup) + + ecs.createService({ CreateServiceRequest request -> request.networkConfiguration.awsvpcConfiguration.subnets == ['subnet-12345'] request.networkConfiguration.awsvpcConfiguration.securityGroups == ['sg-12345'] request.networkConfiguration.awsvpcConfiguration.assignPublicIp == 'ENABLED' @@ -300,15 +250,6 @@ class CreateServerGroupAtomicOperationSpec extends CommonAtomicOperation { ) } as CreateServiceRequest) >> new CreateServiceResult().withService(service) - 1 * autoScalingClient.registerScalableTarget({RegisterScalableTargetRequest request -> - request.serviceNamespace == ServiceNamespace.Ecs - request.scalableDimension == ScalableDimension.EcsServiceDesiredCount - request.resourceId == "service/test-cluster/${serviceName}-v008" - request.roleARN == 'test-role' - request.minCapacity == 1 - request.maxCapacity == 1 - }) - result.getServerGroupNames().size() == 1 result.getServerGroupNameByRegion().size() == 1 result.getServerGroupNames().contains("us-west-1:" + serviceName + "-v008") @@ -380,6 +321,7 @@ class CreateServerGroupAtomicOperationSpec extends CommonAtomicOperation { labels.get(DOCKER_LABEL_KEY_SERVERGROUP) != 'some-value-we-dont-want-to-see' } + def 'should allow selecting the logDriver'() { given: def description = Mock(CreateServerGroupDescription) diff --git a/clouddriver-ecs/src/test/java/com/netflix/spinnaker/clouddriver/ecs/provider/agent/IamRoleCachingAgentTest.java b/clouddriver-ecs/src/test/java/com/netflix/spinnaker/clouddriver/ecs/provider/agent/IamRoleCachingAgentTest.java index 9a5f3588d40..8b726c5dac7 100644 --- a/clouddriver-ecs/src/test/java/com/netflix/spinnaker/clouddriver/ecs/provider/agent/IamRoleCachingAgentTest.java +++ b/clouddriver-ecs/src/test/java/com/netflix/spinnaker/clouddriver/ecs/provider/agent/IamRoleCachingAgentTest.java @@ -16,7 +16,6 @@ package com.netflix.spinnaker.clouddriver.ecs.provider.agent; -import com.amazonaws.auth.AWSCredentialsProvider; import com.amazonaws.services.identitymanagement.AmazonIdentityManagement; import com.amazonaws.services.identitymanagement.model.ListRolesRequest; import com.amazonaws.services.identitymanagement.model.ListRolesResult; @@ -28,17 +27,12 @@ import org.junit.Test; import spock.lang.Subject; -import java.util.Collection; -import java.util.Collections; -import java.util.HashSet; -import java.util.Map; -import java.util.Set; +import java.util.*; import static com.netflix.spinnaker.clouddriver.ecs.cache.Keys.Namespace.IAM_ROLE; +import static junit.framework.TestCase.assertEquals; import static junit.framework.TestCase.assertTrue; -import static org.mockito.Matchers.any; -import static org.mockito.Matchers.anyBoolean; -import static org.mockito.Matchers.anyString; +import static org.mockito.Matchers.*; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; @@ -75,13 +69,13 @@ public void shouldGetListOfServices() { when(clientProvider.getIam(any(NetflixAmazonCredentials.class), anyString(), anyBoolean())).thenReturn(iam); when(iam.listRoles(any(ListRolesRequest.class))).thenReturn(new ListRolesResult().withRoles(roles).withIsTruncated(false)); - when(iamPolicyReader.getTrustedEntities(anyString())).thenReturn(Collections.singleton(iamTrustRelationship)); + when(iamPolicyReader.getTrustedEntities(any())).thenReturn(Collections.singleton(iamTrustRelationship)); //When Set returnedRoles = agent.fetchIamRoles(iam, ACCOUNT); //Then - assertTrue("Expected the list to contain " + numberOfRoles + " ECS IAM roles, but got " + returnedRoles.size(), returnedRoles.size() == numberOfRoles); + assertEquals("Expected the list to contain " + numberOfRoles + " ECS IAM roles, but got " + returnedRoles.size(), returnedRoles.size(), numberOfRoles); for (IamRole iamRole : returnedRoles) { assertTrue("Expected the IAM role to be in " + iamRoles + " list but it was not. The IAM role is: " + iamRole, iamRoles.contains(iamRole)); } diff --git a/clouddriver-elasticsearch-aws/clouddriver-elasticsearch-aws.gradle b/clouddriver-elasticsearch-aws/clouddriver-elasticsearch-aws.gradle index 8ea5572c026..6c8a2ebad66 100644 --- a/clouddriver-elasticsearch-aws/clouddriver-elasticsearch-aws.gradle +++ b/clouddriver-elasticsearch-aws/clouddriver-elasticsearch-aws.gradle @@ -5,6 +5,24 @@ repositories { } dependencies { - compile project(":clouddriver-aws") - compile project(":clouddriver-elasticsearch") + implementation project(":cats:cats-core") + implementation project(":clouddriver-aws") + implementation project(":clouddriver-core") + implementation project(":clouddriver-elasticsearch") + implementation project(":clouddriver-eureka") + implementation project(":clouddriver-security") + + implementation "com.amazonaws:aws-java-sdk" + implementation "com.fasterxml.jackson.core:jackson-databind" + implementation "com.netflix.frigga:frigga" + implementation "com.netflix.spectator:spectator-api" + implementation "com.netflix.spinnaker.kork:kork-exceptions" + implementation("io.searchbox:jest:2.0.3") { + force = true + } + implementation "org.codehaus.groovy:groovy-all" + implementation("org.elasticsearch:elasticsearch:2.4.1") { + force = true + } + implementation "org.springframework.boot:spring-boot-starter-web" } diff --git a/clouddriver-elasticsearch-aws/src/main/kotlin/com/netflix/spinnaker/config/ElasticSearchAmazonConfig.kt b/clouddriver-elasticsearch-aws/src/main/kotlin/com/netflix/spinnaker/config/ElasticSearchAmazonConfig.kt index 4c70ee521aa..75a53147b7f 100644 --- a/clouddriver-elasticsearch-aws/src/main/kotlin/com/netflix/spinnaker/config/ElasticSearchAmazonConfig.kt +++ b/clouddriver-elasticsearch-aws/src/main/kotlin/com/netflix/spinnaker/config/ElasticSearchAmazonConfig.kt @@ -28,7 +28,7 @@ import org.springframework.context.annotation.Bean import org.springframework.context.annotation.Configuration @Configuration -@ConditionalOnProperty("elasticSearch.caching.enabled") +@ConditionalOnProperty("elastic-search.caching.enabled") open class ElasticSearchAmazonConfig { @Bean open fun elasticSearchAmazonCachingAgentProvider(objectMapper: ObjectMapper, diff --git a/clouddriver-elasticsearch/clouddriver-elasticsearch.gradle b/clouddriver-elasticsearch/clouddriver-elasticsearch.gradle index 100f9ba10c2..12290ca407f 100644 --- a/clouddriver-elasticsearch/clouddriver-elasticsearch.gradle +++ b/clouddriver-elasticsearch/clouddriver-elasticsearch.gradle @@ -1,6 +1,24 @@ dependencies { - compile project(":clouddriver-core") + implementation project(":clouddriver-core") + implementation project(":clouddriver-security") - compile 'org.elasticsearch:elasticsearch:2.4.1' - compile 'io.searchbox:jest:2.0.3' + implementation "com.netflix.frigga:frigga" + implementation "com.netflix.spinnaker.kork:kork-exceptions" + implementation "com.netflix.spinnaker.kork:kork-security" + implementation "com.squareup.retrofit:retrofit" + implementation "org.codehaus.groovy:groovy-all" + implementation("org.elasticsearch:elasticsearch:2.4.1") { + force = true + } + + implementation("io.searchbox:jest:2.0.3") { + force = true + } + implementation "org.springframework.boot:spring-boot-starter-web" + + testImplementation "cglib:cglib-nodep" + testImplementation "org.objenesis:objenesis" + testImplementation "org.spockframework:spock-core" + testImplementation "org.spockframework:spock-spring" + testImplementation "org.springframework:spring-test" } diff --git a/clouddriver-elasticsearch/src/main/java/com/netflix/spinnaker/clouddriver/elasticsearch/validators/BulkUpsertEntityTagsDescriptionValidator.java b/clouddriver-elasticsearch/src/main/java/com/netflix/spinnaker/clouddriver/elasticsearch/validators/BulkUpsertEntityTagsDescriptionValidator.java index ab3dea6e42d..24cd6b60784 100644 --- a/clouddriver-elasticsearch/src/main/java/com/netflix/spinnaker/clouddriver/elasticsearch/validators/BulkUpsertEntityTagsDescriptionValidator.java +++ b/clouddriver-elasticsearch/src/main/java/com/netflix/spinnaker/clouddriver/elasticsearch/validators/BulkUpsertEntityTagsDescriptionValidator.java @@ -27,7 +27,7 @@ @Component("bulkUpsertEntityTagsDescriptionValidator") public class BulkUpsertEntityTagsDescriptionValidator extends DescriptionValidator { - @Value("${entityTags.maxConcurrentBulkTags:1000}") + @Value("${entity-tags.max-concurrent-bulk-tags:1000}") Integer maxConcurrentBulkTags; @Override diff --git a/clouddriver-elasticsearch/src/main/java/com/netflix/spinnaker/config/ElasticSearchConfig.java b/clouddriver-elasticsearch/src/main/java/com/netflix/spinnaker/config/ElasticSearchConfig.java index fd1c992bf4c..88ebb944c48 100644 --- a/clouddriver-elasticsearch/src/main/java/com/netflix/spinnaker/config/ElasticSearchConfig.java +++ b/clouddriver-elasticsearch/src/main/java/com/netflix/spinnaker/config/ElasticSearchConfig.java @@ -16,13 +16,10 @@ package com.netflix.spinnaker.config; -import com.netflix.spinnaker.clouddriver.core.services.Front50Service; import com.netflix.spinnaker.clouddriver.elasticsearch.ElasticSearchEntityTagger; import com.netflix.spinnaker.clouddriver.elasticsearch.converters.DeleteEntityTagsAtomicOperationConverter; import com.netflix.spinnaker.clouddriver.elasticsearch.converters.UpsertEntityTagsAtomicOperationConverter; import com.netflix.spinnaker.clouddriver.elasticsearch.model.ElasticSearchEntityTagsProvider; -import com.netflix.spinnaker.clouddriver.security.AccountCredentialsProvider; -import com.netflix.spinnaker.kork.core.RetrySupport; import io.searchbox.client.JestClient; import io.searchbox.client.JestClientFactory; import io.searchbox.client.config.HttpClientConfig; @@ -33,7 +30,7 @@ import org.springframework.context.annotation.Configuration; @Configuration -@ConditionalOnProperty({"elasticSearch.connection"}) +@ConditionalOnProperty({"elastic-search.connection"}) @ComponentScan({"com.netflix.spinnaker.clouddriver.elasticsearch"}) @EnableConfigurationProperties(ElasticSearchConfigProperties.class) public class ElasticSearchConfig { diff --git a/clouddriver-elasticsearch/src/main/java/com/netflix/spinnaker/config/ElasticSearchConfigProperties.java b/clouddriver-elasticsearch/src/main/java/com/netflix/spinnaker/config/ElasticSearchConfigProperties.java index 059e20f3447..222afa186a2 100644 --- a/clouddriver-elasticsearch/src/main/java/com/netflix/spinnaker/config/ElasticSearchConfigProperties.java +++ b/clouddriver-elasticsearch/src/main/java/com/netflix/spinnaker/config/ElasticSearchConfigProperties.java @@ -18,7 +18,7 @@ import org.springframework.boot.context.properties.ConfigurationProperties; -@ConfigurationProperties("elasticSearch") +@ConfigurationProperties("elastic-search") public class ElasticSearchConfigProperties { private String activeIndex; private String connection; diff --git a/clouddriver-elasticsearch/src/test/groovy/com/netflix/spinnaker/clouddriver/elasticsearch/ops/BulkUpsertEntityTagsAtomicOperationSpec.groovy b/clouddriver-elasticsearch/src/test/groovy/com/netflix/spinnaker/clouddriver/elasticsearch/ops/BulkUpsertEntityTagsAtomicOperationSpec.groovy index 9f321db2fe9..0a9d2dc0d2b 100644 --- a/clouddriver-elasticsearch/src/test/groovy/com/netflix/spinnaker/clouddriver/elasticsearch/ops/BulkUpsertEntityTagsAtomicOperationSpec.groovy +++ b/clouddriver-elasticsearch/src/test/groovy/com/netflix/spinnaker/clouddriver/elasticsearch/ops/BulkUpsertEntityTagsAtomicOperationSpec.groovy @@ -266,7 +266,7 @@ class BulkUpsertEntityTagsAtomicOperationSpec extends Specification { void 'should detect whether entity tags have been modified'() { given: EntityTags currentTags = new EntityTags( - tags: buildTags(current) + tags: buildTags(cur) ) EntityTags updatedTags = new EntityTags( tags: buildTags(updated) @@ -278,7 +278,7 @@ class BulkUpsertEntityTagsAtomicOperationSpec extends Specification { ) == expectedToBeModified where: - current | updated | isPartial || expectedToBeModified + cur | updated | isPartial || expectedToBeModified [foo: "bar"] | [foo: "bar"] | false || false [foo: "bar"] | [foo: "bar"] | true || false [foo: "bar"] | [foo: "not bar"] | false || true diff --git a/clouddriver-eureka/clouddriver-eureka.gradle b/clouddriver-eureka/clouddriver-eureka.gradle index 04be2000a2a..fc63d794818 100644 --- a/clouddriver-eureka/clouddriver-eureka.gradle +++ b/clouddriver-eureka/clouddriver-eureka.gradle @@ -1,3 +1,16 @@ dependencies { - compile project(":clouddriver-core") + implementation project(":cats:cats-core") + implementation project(":clouddriver-core") + + implementation "com.amazonaws:aws-java-sdk" + implementation "com.squareup.retrofit:converter-jackson" + implementation "com.squareup.retrofit:retrofit" + implementation "org.codehaus.groovy:groovy-all" + implementation "org.springframework.boot:spring-boot-starter-web" + + testImplementation "cglib:cglib-nodep" + testImplementation "org.objenesis:objenesis" + testImplementation "org.spockframework:spock-core" + testImplementation "org.spockframework:spock-spring" + testImplementation "org.springframework:spring-test" } diff --git a/clouddriver-eureka/src/main/groovy/com/netflix/spinnaker/config/EurekaProviderConfiguration.groovy b/clouddriver-eureka/src/main/groovy/com/netflix/spinnaker/config/EurekaProviderConfiguration.groovy index a460b3e2120..653e4308e5b 100644 --- a/clouddriver-eureka/src/main/groovy/com/netflix/spinnaker/config/EurekaProviderConfiguration.groovy +++ b/clouddriver-eureka/src/main/groovy/com/netflix/spinnaker/config/EurekaProviderConfiguration.groovy @@ -47,10 +47,10 @@ class EurekaProviderConfiguration { new EurekaAccountConfigurationProperties() } - @Value('${eureka.pollIntervalMillis:15000}') + @Value('${eureka.poll-interval-millis:15000}') Long pollIntervalMillis - @Value('${eureka.timeoutMillis:300000}') + @Value('${eureka.timeout-millis:300000}') Long timeoutMillis @Bean diff --git a/clouddriver-google-common/clouddriver-google-common.gradle b/clouddriver-google-common/clouddriver-google-common.gradle index 0b0ccec9278..af769616045 100644 --- a/clouddriver-google-common/clouddriver-google-common.gradle +++ b/clouddriver-google-common/clouddriver-google-common.gradle @@ -1,7 +1,18 @@ dependencies { - spinnaker.group('fiat') + compileOnly "org.projectlombok:lombok" + annotationProcessor "org.projectlombok:lombok" + testAnnotationProcessor "org.projectlombok:lombok" - compile spinnaker.dependency('googleApiClient') - compile spinnaker.dependency('lombok') - compile spinnaker.dependency('spectatorApi') + implementation "com.google.api-client:google-api-client" + implementation "com.netflix.spectator:spectator-api" + implementation "com.netflix.spinnaker.fiat:fiat-api:$fiatVersion" + implementation "com.netflix.spinnaker.fiat:fiat-core:$fiatVersion" + implementation "org.codehaus.groovy:groovy-all" + implementation "org.springframework.security:spring-security-config" + implementation "org.springframework.security:spring-security-core" + implementation "org.springframework.security:spring-security-web" + + testImplementation "cglib:cglib-nodep" + testImplementation "org.objenesis:objenesis" + testImplementation "org.spockframework:spock-core" } diff --git a/clouddriver-google/clouddriver-google.gradle b/clouddriver-google/clouddriver-google.gradle index 315e0691c9a..aa799f8128a 100644 --- a/clouddriver-google/clouddriver-google.gradle +++ b/clouddriver-google/clouddriver-google.gradle @@ -1,15 +1,35 @@ dependencies { - compile project(":clouddriver-artifacts") - compile project(":clouddriver-core") - compile project(":clouddriver-consul") - compile project(":clouddriver-google-common") + implementation project(":cats:cats-core") + implementation project(":clouddriver-artifacts") + implementation project(":clouddriver-consul") + implementation project(":clouddriver-core") + implementation project(":clouddriver-google-common") + implementation project(":clouddriver-security") - compile spinnaker.dependency('assertj') - compile spinnaker.dependency('bootActuator') - compile spinnaker.dependency('bootWeb') - compile spinnaker.dependency('frigga') - compile spinnaker.dependency('googleCompute') + compileOnly "org.projectlombok:lombok" + annotationProcessor "org.projectlombok:lombok" + testAnnotationProcessor "org.projectlombok:lombok" + implementation "org.codehaus.groovy:groovy-all" + implementation "org.apache.commons:commons-lang3" + implementation "com.google.apis:google-api-services-compute" // Move this to spinnaker-dependencies when we can confirm we'll use this feature. - compile "com.google.apis:google-api-services-iam:v1-rev267-1.25.0" + implementation "com.google.apis:google-api-services-iam:v1-rev267-1.25.0" + implementation "com.netflix.frigga:frigga" + implementation "com.netflix.spectator:spectator-api" + implementation "com.netflix.spinnaker.fiat:fiat-api:$fiatVersion" + implementation "com.netflix.spinnaker.fiat:fiat-core:$fiatVersion" + implementation "com.netflix.spinnaker.kork:kork-artifacts" + implementation "com.netflix.spinnaker.moniker:moniker" + implementation "com.squareup.retrofit:retrofit" + implementation "org.springframework.boot:spring-boot-actuator" + implementation "org.springframework.boot:spring-boot-starter-web" + + testImplementation "cglib:cglib-nodep" + testImplementation "org.assertj:assertj-core" + testImplementation "org.mockito:mockito-core" + testImplementation "org.objenesis:objenesis" + testImplementation "org.spockframework:spock-core" + testImplementation "org.spockframework:spock-spring" + testImplementation "org.springframework:spring-test" } diff --git a/clouddriver-google/src/main/groovy/com/netflix/spinnaker/clouddriver/google/GoogleExecutorTraits.java b/clouddriver-google/src/main/groovy/com/netflix/spinnaker/clouddriver/google/GoogleExecutorTraits.java index 55fd716bb7a..4f7cf2f643a 100644 --- a/clouddriver-google/src/main/groovy/com/netflix/spinnaker/clouddriver/google/GoogleExecutorTraits.java +++ b/clouddriver-google/src/main/groovy/com/netflix/spinnaker/clouddriver/google/GoogleExecutorTraits.java @@ -22,8 +22,7 @@ import java.io.IOException; /** - * This class is syntactic sugar atop the static GoogleExecutor. By making it a trait, we can wrap - * the calls with less in-line syntax. + * This class is syntactic sugar atop the static GoogleExecutor. */ public interface GoogleExecutorTraits { diff --git a/clouddriver-google/src/main/groovy/com/netflix/spinnaker/clouddriver/google/deploy/SafeRetry.groovy b/clouddriver-google/src/main/groovy/com/netflix/spinnaker/clouddriver/google/deploy/SafeRetry.groovy index 949e466637a..a294ca27934 100644 --- a/clouddriver-google/src/main/groovy/com/netflix/spinnaker/clouddriver/google/deploy/SafeRetry.groovy +++ b/clouddriver-google/src/main/groovy/com/netflix/spinnaker/clouddriver/google/deploy/SafeRetry.groovy @@ -23,22 +23,21 @@ import com.netflix.spinnaker.clouddriver.googlecommon.deploy.GoogleCommonSafeRet import org.springframework.beans.factory.annotation.Autowired import org.springframework.beans.factory.annotation.Value import org.springframework.stereotype.Component -import java.util.concurrent.TimeUnit // TODO(jacobkiefer): This used to have a generic return type associated with 'doRetry'. Find a way to reincorporate while still making this a Bean. @Component class SafeRetry extends GoogleCommonSafeRetry { - @Value('${google.safeRetryMaxWaitIntervalMs:60000}') + @Value('${google.safe-retry-max-wait-interval-ms:60000}') Long maxWaitInterval - @Value('${google.safeRetryRetryIntervalBaseSec:2}') + @Value('${google.safe-retry-retry-interval-base-sec:2}') Long retryIntervalBase - @Value('${google.safeRetryJitterMultiplier:1000}') + @Value('${google.safe-retry-jitter-multiplier:1000}') Long jitterMultiplier - @Value('${google.safeRetryMaxRetries:10}') + @Value('${google.safe-retry-max-retries:10}') Long maxRetries public Object doRetry(Closure operation, diff --git a/clouddriver-google/src/main/groovy/com/netflix/spinnaker/clouddriver/google/deploy/description/BasicGoogleDeployDescription.groovy b/clouddriver-google/src/main/groovy/com/netflix/spinnaker/clouddriver/google/deploy/description/BasicGoogleDeployDescription.groovy index 36b2a583f2f..2e57e408a31 100644 --- a/clouddriver-google/src/main/groovy/com/netflix/spinnaker/clouddriver/google/deploy/description/BasicGoogleDeployDescription.groovy +++ b/clouddriver-google/src/main/groovy/com/netflix/spinnaker/clouddriver/google/deploy/description/BasicGoogleDeployDescription.groovy @@ -20,6 +20,7 @@ import com.google.api.services.compute.model.AcceleratorConfig import com.netflix.frigga.NameBuilder import com.netflix.frigga.Names import com.netflix.spinnaker.clouddriver.deploy.DeployDescription +import com.netflix.spinnaker.clouddriver.google.deploy.description.BaseGoogleInstanceDescription import com.netflix.spinnaker.clouddriver.google.model.GoogleAutoHealingPolicy import com.netflix.spinnaker.clouddriver.google.model.GoogleAutoscalingPolicy import com.netflix.spinnaker.clouddriver.google.model.GoogleDistributionPolicy diff --git a/clouddriver-google/src/main/groovy/com/netflix/spinnaker/clouddriver/google/provider/agent/GoogleImageCachingAgent.groovy b/clouddriver-google/src/main/groovy/com/netflix/spinnaker/clouddriver/google/provider/agent/GoogleImageCachingAgent.groovy index db10ad38548..9d4129444dc 100644 --- a/clouddriver-google/src/main/groovy/com/netflix/spinnaker/clouddriver/google/provider/agent/GoogleImageCachingAgent.groovy +++ b/clouddriver-google/src/main/groovy/com/netflix/spinnaker/clouddriver/google/provider/agent/GoogleImageCachingAgent.groovy @@ -22,7 +22,7 @@ import com.google.api.client.http.HttpHeaders import com.google.api.services.compute.Compute import com.google.api.services.compute.model.Image import com.google.api.services.compute.model.ImageList -import com.netflix.servo.util.VisibleForTesting +import com.google.common.annotations.VisibleForTesting import com.netflix.spectator.api.Registry import com.netflix.spinnaker.cats.agent.AgentDataType import com.netflix.spinnaker.cats.agent.CacheResult diff --git a/clouddriver-google/src/test/groovy/com/netflix/spinnaker/clouddriver/google/deploy/ops/UpsertGoogleImageTagsAtomicOperationUnitSpec.groovy b/clouddriver-google/src/test/groovy/com/netflix/spinnaker/clouddriver/google/deploy/ops/UpsertGoogleImageTagsAtomicOperationUnitSpec.groovy index affd32e1d1a..60647079350 100644 --- a/clouddriver-google/src/test/groovy/com/netflix/spinnaker/clouddriver/google/deploy/ops/UpsertGoogleImageTagsAtomicOperationUnitSpec.groovy +++ b/clouddriver-google/src/test/groovy/com/netflix/spinnaker/clouddriver/google/deploy/ops/UpsertGoogleImageTagsAtomicOperationUnitSpec.groovy @@ -117,9 +117,9 @@ class UpsertGoogleImageTagsAtomicOperationUnitSpec extends Specification impleme } then: - 1 * imagesMock.setLabels(PROJECT_NAME, IMAGE_NAME, { globalSetLabelsRequest = it }) >> setLabelsMock + 1 * imagesMock.setLabels(_, _, _) >> setLabelsMock 1 * setLabelsMock.execute() - globalSetLabelsRequest.labels == TAGS +// globalSetLabelsRequest.labels == TAGS } void "should add to labels on image with existing labels"() { @@ -188,9 +188,9 @@ class UpsertGoogleImageTagsAtomicOperationUnitSpec extends Specification impleme } then: - 1 * imagesMock.setLabels(PROJECT_NAME, IMAGE_NAME, { globalSetLabelsRequest = it }) >> setLabelsMock + 1 * imagesMock.setLabels(_, _, _) >> setLabelsMock 1 * setLabelsMock.execute() - globalSetLabelsRequest.labels == LABELS + TAGS +// globalSetLabelsRequest.labels == LABELS + TAGS } void "should fail to create instance because image is invalid"() { diff --git a/clouddriver-google/src/test/groovy/com/netflix/spinnaker/clouddriver/google/deploy/validators/BasicGoogleDeployDescriptionValidatorSpec.groovy b/clouddriver-google/src/test/groovy/com/netflix/spinnaker/clouddriver/google/deploy/validators/BasicGoogleDeployDescriptionValidatorSpec.groovy index 2ea91274e5a..dd02217742b 100644 --- a/clouddriver-google/src/test/groovy/com/netflix/spinnaker/clouddriver/google/deploy/validators/BasicGoogleDeployDescriptionValidatorSpec.groovy +++ b/clouddriver-google/src/test/groovy/com/netflix/spinnaker/clouddriver/google/deploy/validators/BasicGoogleDeployDescriptionValidatorSpec.groovy @@ -204,14 +204,20 @@ class BasicGoogleDeployDescriptionValidatorSpec extends Specification { setup: def description = new BasicGoogleDeployDescription(capacity: [min: min, max: max, desired: desired]) def errors = Mock(Errors) + def matchingCalls = 0 when: validator.validate([], description, errors) then: - numErrors * errors.rejectValue( - { return it.startsWith("capacity.") }, - { return it.startsWith("basicGoogleDeployDescription.capacity") }) + errors.rejectValue(_,_) >> { arguments -> + String field = arguments.get(0) + String errorCode = arguments.get(1) + if (field.startsWith("capacity.") && errorCode.startsWith("basicGoogleDeployDescription.capacity")) { + matchingCalls += 1 + } + } + numErrors == matchingCalls where: min | max | desired | numErrors diff --git a/clouddriver-kubernetes/clouddriver-kubernetes.gradle b/clouddriver-kubernetes/clouddriver-kubernetes.gradle index 7d0a5080267..1faeb14a867 100644 --- a/clouddriver-kubernetes/clouddriver-kubernetes.gradle +++ b/clouddriver-kubernetes/clouddriver-kubernetes.gradle @@ -1,17 +1,31 @@ dependencies { - spinnaker.group('kubernetes') - compile project(":clouddriver-artifacts") - compile project(":clouddriver-core") - compile project(":clouddriver-docker") - compile spinnaker.dependency('bootActuator') - compile spinnaker.dependency('bootWeb') - compile spinnaker.dependency('frigga') - compile spinnaker.dependency('korkArtifacts') - compile spinnaker.dependency('lombok') + implementation project(":clouddriver-artifacts") + implementation project(":clouddriver-core") + implementation project(":cats:cats-core") + implementation project(":clouddriver-docker") + implementation project(":clouddriver-security") - // TODO(lwander) move to spinnaker-dependencies when library stabilizes - compile 'io.kubernetes:client-java:1.0.0-beta1' - compile 'com.github.fge:json-patch:1.9' - compile 'com.netflix.spinnaker.moniker:moniker:0.2.0' - compile 'com.jayway.jsonpath:json-path:2.3.0' + compileOnly "org.projectlombok:lombok" + annotationProcessor "org.projectlombok:lombok" + testAnnotationProcessor "org.projectlombok:lombok" + + implementation "org.codehaus.groovy:groovy-all" + + implementation "com.github.fge:json-patch:1.9" + implementation "com.netflix.frigga:frigga" + implementation "com.netflix.spinnaker.fiat:fiat-api:$fiatVersion" + implementation "com.netflix.spinnaker.fiat:fiat-core:$fiatVersion" + implementation "com.netflix.spinnaker.kork:kork-artifacts" + implementation "com.netflix.spinnaker.moniker:moniker" + implementation "io.fabric8:kubernetes-client:4.0.0" + implementation "io.kubernetes:client-java:1.0.0-beta1" + implementation "org.springframework.boot:spring-boot-actuator" + implementation "org.springframework.boot:spring-boot-starter-web" + implementation 'com.jayway.jsonpath:json-path:2.3.0' + + testImplementation "cglib:cglib-nodep" + testImplementation "org.objenesis:objenesis" + testImplementation "org.spockframework:spock-core" + testImplementation "org.spockframework:spock-spring" + testImplementation "org.springframework:spring-test" } diff --git a/clouddriver-kubernetes/src/main/groovy/com/netflix/spinnaker/clouddriver/kubernetes/v1/deploy/KubernetesUtil.groovy b/clouddriver-kubernetes/src/main/groovy/com/netflix/spinnaker/clouddriver/kubernetes/v1/deploy/KubernetesUtil.groovy index aaaa783ed6c..ada83752270 100644 --- a/clouddriver-kubernetes/src/main/groovy/com/netflix/spinnaker/clouddriver/kubernetes/v1/deploy/KubernetesUtil.groovy +++ b/clouddriver-kubernetes/src/main/groovy/com/netflix/spinnaker/clouddriver/kubernetes/v1/deploy/KubernetesUtil.groovy @@ -37,7 +37,7 @@ class KubernetesUtil { static String JOB_LABEL = "job" static String CONTROLLERS_STATEFULSET_KIND = "StatefulSet" static String CONTROLLERS_DAEMONSET_KIND = "DaemonSet" - @Value("kubernetes.defaultRegistry:gcr.io") + @Value("kubernetes.default-registry:gcr.io") static String DEFAULT_REGISTRY private static int SECURITY_GROUP_LABEL_PREFIX_LENGTH = SECURITY_GROUP_LABEL_PREFIX.length() private static int LOAD_BALANCER_LABEL_PREFIX_LENGTH = LOAD_BALANCER_LABEL_PREFIX.length() diff --git a/clouddriver-kubernetes/src/main/groovy/com/netflix/spinnaker/clouddriver/kubernetes/v1/security/KubernetesV1Credentials.java b/clouddriver-kubernetes/src/main/groovy/com/netflix/spinnaker/clouddriver/kubernetes/v1/security/KubernetesV1Credentials.java index fe2cfbc9eb8..08cf5f56909 100644 --- a/clouddriver-kubernetes/src/main/groovy/com/netflix/spinnaker/clouddriver/kubernetes/v1/security/KubernetesV1Credentials.java +++ b/clouddriver-kubernetes/src/main/groovy/com/netflix/spinnaker/clouddriver/kubernetes/v1/security/KubernetesV1Credentials.java @@ -17,8 +17,8 @@ package com.netflix.spinnaker.clouddriver.kubernetes.v1.security; +import com.google.common.annotations.VisibleForTesting; import com.google.common.collect.Lists; -import com.netflix.servo.util.VisibleForTesting; import com.netflix.spectator.api.Registry; import com.netflix.spinnaker.clouddriver.docker.registry.security.DockerRegistryNamedAccountCredentials; import com.netflix.spinnaker.clouddriver.kubernetes.config.LinkedDockerRegistryConfiguration; @@ -94,7 +94,7 @@ public KubernetesV1Credentials( } @VisibleForTesting - private KubernetesV1Credentials( + protected KubernetesV1Credentials( KubernetesApiAdaptor apiAdaptor, List namespaces, List omitNamespaces, diff --git a/clouddriver-kubernetes/src/main/groovy/com/netflix/spinnaker/clouddriver/kubernetes/v2/names/KubernetesManifestNamer.java b/clouddriver-kubernetes/src/main/groovy/com/netflix/spinnaker/clouddriver/kubernetes/v2/names/KubernetesManifestNamer.java index df4946f3c02..4f026e23337 100644 --- a/clouddriver-kubernetes/src/main/groovy/com/netflix/spinnaker/clouddriver/kubernetes/v2/names/KubernetesManifestNamer.java +++ b/clouddriver-kubernetes/src/main/groovy/com/netflix/spinnaker/clouddriver/kubernetes/v2/names/KubernetesManifestNamer.java @@ -27,10 +27,10 @@ @Component public class KubernetesManifestNamer implements NamingStrategy { - @Value("${kubernetes.v2.applyAppLabels:true}") + @Value("${kubernetes.v2.apply-app-labels:true}") boolean applyAppLabels; - @Value("${kubernetes.v2.managedBySuffix:}") + @Value("${kubernetes.v2.managed-by-suffix:}") String managedBySuffix; @Override diff --git a/clouddriver-kubernetes/src/main/groovy/com/netflix/spinnaker/clouddriver/kubernetes/v2/op/job/KubectlJobExecutor.java b/clouddriver-kubernetes/src/main/groovy/com/netflix/spinnaker/clouddriver/kubernetes/v2/op/job/KubectlJobExecutor.java index b769053c1a4..1b0e8d224bc 100644 --- a/clouddriver-kubernetes/src/main/groovy/com/netflix/spinnaker/clouddriver/kubernetes/v2/op/job/KubectlJobExecutor.java +++ b/clouddriver-kubernetes/src/main/groovy/com/netflix/spinnaker/clouddriver/kubernetes/v2/op/job/KubectlJobExecutor.java @@ -50,7 +50,7 @@ public class KubectlJobExecutor { @Value("${kubernetes.kubectl.executable:kubectl}") String executable; - @Value("${kubernetes.oAuth.executable:oauth2l}") + @Value("${kubernetes.o-auth.executable:oauth2l}") String oAuthExecutable; private final static String NO_RESOURCE_TYPE_ERROR = "doesn't have a resource type"; diff --git a/clouddriver-kubernetes/src/test/groovy/com/netflix/spinnaker/clouddriver/kubernetes/v1/deploy/ops/loadbalancer/UpsertKubernetesLoadBalancerAtomicOperationSpec.groovy b/clouddriver-kubernetes/src/test/groovy/com/netflix/spinnaker/clouddriver/kubernetes/v1/deploy/ops/loadbalancer/UpsertKubernetesLoadBalancerAtomicOperationSpec.groovy index 671b65a21c6..7c927b53dc8 100644 --- a/clouddriver-kubernetes/src/test/groovy/com/netflix/spinnaker/clouddriver/kubernetes/v1/deploy/ops/loadbalancer/UpsertKubernetesLoadBalancerAtomicOperationSpec.groovy +++ b/clouddriver-kubernetes/src/test/groovy/com/netflix/spinnaker/clouddriver/kubernetes/v1/deploy/ops/loadbalancer/UpsertKubernetesLoadBalancerAtomicOperationSpec.groovy @@ -217,7 +217,7 @@ class UpsertKubernetesLoadBalancerAtomicOperationSpec extends Specification { 1 * apiMock.getService(NAMESPACE, VALID_NAME1) >> existingServiceMock 1 * apiMock.replaceService(NAMESPACE, VALID_NAME1, { service -> service.metadata.name == description.name - service.spec.externalIPs[0] = VALID_IP1 + service.spec.externalIPs[0] == VALID_IP1 }) >> resultServiceMock resultServiceMock.getMetadata() >> [name: '', namespace: ''] } diff --git a/clouddriver-lambda/clouddriver-lambda.gradle b/clouddriver-lambda/clouddriver-lambda.gradle index e86258330f3..d08e62d7670 100644 --- a/clouddriver-lambda/clouddriver-lambda.gradle +++ b/clouddriver-lambda/clouddriver-lambda.gradle @@ -1,7 +1,25 @@ dependencies { - compile project(":clouddriver-aws") - compile spinnaker.dependency('lombok') + implementation project(":cats:cats-core") + implementation project(":clouddriver-aws") + implementation project(":clouddriver-core") + implementation project(":clouddriver-security") - spinnaker.group('amazon') - spinnaker.group('retrofitDefault') + compileOnly "org.projectlombok:lombok" + annotationProcessor "org.projectlombok:lombok" + testAnnotationProcessor "org.projectlombok:lombok" + + implementation "com.amazonaws:aws-java-sdk" + implementation "com.google.guava:guava:27.1-jre" + implementation "com.netflix.awsobjectmapper:awsobjectmapper" + implementation "org.apache.commons:commons-lang3" + implementation "org.apache.httpcomponents:httpclient" + implementation "org.apache.httpcomponents:httpcore" + implementation "org.codehaus.groovy:groovy-all" + implementation "org.springframework.boot:spring-boot-starter-web" + + implementation "com.squareup.okhttp:okhttp" + implementation "com.squareup.okhttp:okhttp-apache" + implementation "com.squareup.okhttp:okhttp-urlconnection" + implementation "com.squareup.retrofit:converter-jackson" + implementation "com.squareup.retrofit:retrofit" } diff --git a/clouddriver-lambda/src/main/java/com/netflix/spinnaker/clouddriver/lambda/deploy/ops/UpsertLambdaAliasAtomicOperation.java b/clouddriver-lambda/src/main/java/com/netflix/spinnaker/clouddriver/lambda/deploy/ops/UpsertLambdaAliasAtomicOperation.java index 92dc1ae1849..2b9af02283c 100644 --- a/clouddriver-lambda/src/main/java/com/netflix/spinnaker/clouddriver/lambda/deploy/ops/UpsertLambdaAliasAtomicOperation.java +++ b/clouddriver-lambda/src/main/java/com/netflix/spinnaker/clouddriver/lambda/deploy/ops/UpsertLambdaAliasAtomicOperation.java @@ -26,7 +26,7 @@ import com.netflix.spinnaker.clouddriver.lambda.deploy.description.UpsertLambdaFunctionAliasDescription; import com.netflix.spinnaker.clouddriver.orchestration.AtomicOperation; import com.amazonaws.services.lambda.model.AliasConfiguration; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import java.util.*; diff --git a/clouddriver-lambda/src/main/java/com/netflix/spinnaker/clouddriver/lambda/provider/agent/IamRoleCachingAgent.java b/clouddriver-lambda/src/main/java/com/netflix/spinnaker/clouddriver/lambda/provider/agent/IamRoleCachingAgent.java index fe4edce4e63..d1ff931d8e4 100644 --- a/clouddriver-lambda/src/main/java/com/netflix/spinnaker/clouddriver/lambda/provider/agent/IamRoleCachingAgent.java +++ b/clouddriver-lambda/src/main/java/com/netflix/spinnaker/clouddriver/lambda/provider/agent/IamRoleCachingAgent.java @@ -22,7 +22,6 @@ import com.amazonaws.services.identitymanagement.model.ListRolesResult; import com.amazonaws.services.identitymanagement.model.Role; import com.fasterxml.jackson.databind.ObjectMapper; -import com.google.common.collect.Sets; import com.netflix.spinnaker.cats.agent.AgentDataType; import com.netflix.spinnaker.cats.agent.CacheResult; import com.netflix.spinnaker.cats.agent.CachingAgent; @@ -204,7 +203,7 @@ private boolean keyAccountFilter(String key) { } private Set getTrustedEntities(String urlEncodedPolicyDocument) { - Set trustedEntities = Sets.newHashSet(); + Set trustedEntities = new HashSet<>(); String decodedPolicyDocument = URLDecoder.decode(urlEncodedPolicyDocument); diff --git a/clouddriver-openstack/clouddriver-openstack.gradle b/clouddriver-openstack/clouddriver-openstack.gradle new file mode 100644 index 00000000000..e69de29bb2d diff --git a/clouddriver-openstack/src/main/groovy/com/netflix/spinnaker/clouddriver/openstack/deploy/ops/loadbalancer/UpsertOpenstackLoadBalancerAtomicOperation.groovy b/clouddriver-openstack/src/main/groovy/com/netflix/spinnaker/clouddriver/openstack/deploy/ops/loadbalancer/UpsertOpenstackLoadBalancerAtomicOperation.groovy new file mode 100644 index 00000000000..e69de29bb2d diff --git a/clouddriver-openstack/src/main/groovy/com/netflix/spinnaker/clouddriver/openstack/deploy/ops/servergroup/DeployOpenstackAtomicOperation.groovy b/clouddriver-openstack/src/main/groovy/com/netflix/spinnaker/clouddriver/openstack/deploy/ops/servergroup/DeployOpenstackAtomicOperation.groovy new file mode 100644 index 00000000000..e69de29bb2d diff --git a/clouddriver-openstack/src/main/groovy/com/netflix/spinnaker/clouddriver/openstack/model/OpenstackServerGroup.groovy b/clouddriver-openstack/src/main/groovy/com/netflix/spinnaker/clouddriver/openstack/model/OpenstackServerGroup.groovy new file mode 100644 index 00000000000..e69de29bb2d diff --git a/clouddriver-openstack/src/main/groovy/com/netflix/spinnaker/clouddriver/openstack/provider/view/OpenstackClusterProvider.groovy b/clouddriver-openstack/src/main/groovy/com/netflix/spinnaker/clouddriver/openstack/provider/view/OpenstackClusterProvider.groovy new file mode 100644 index 00000000000..e69de29bb2d diff --git a/clouddriver-openstack/src/main/groovy/com/netflix/spinnaker/clouddriver/openstack/security/OpenstackCredentialsInitializer.groovy b/clouddriver-openstack/src/main/groovy/com/netflix/spinnaker/clouddriver/openstack/security/OpenstackCredentialsInitializer.groovy new file mode 100644 index 00000000000..e69de29bb2d diff --git a/clouddriver-openstack/src/main/groovy/com/netflix/spinnaker/clouddriver/openstack/task/TaskStatusAware.java b/clouddriver-openstack/src/main/groovy/com/netflix/spinnaker/clouddriver/openstack/task/TaskStatusAware.java new file mode 100644 index 00000000000..94f68ea73f5 --- /dev/null +++ b/clouddriver-openstack/src/main/groovy/com/netflix/spinnaker/clouddriver/openstack/task/TaskStatusAware.java @@ -0,0 +1,15 @@ +package com.netflix.spinnaker.clouddriver.openstack.task; + +import com.netflix.spinnaker.clouddriver.data.task.Task; +import com.netflix.spinnaker.clouddriver.data.task.TaskRepository; + +/** + * TODO - Refeactor operations to use trait and remove boilerplate logic. + */ +public interface TaskStatusAware { + default Task getTask() { + return TaskRepository.threadLocalTask.get(); + } + + String UPSERT_LOADBALANCER_PHASE = "UPSERT_LOAD_BALANCER"; +} diff --git a/clouddriver-openstack/src/test/groovy/com/netflix/spinnaker/clouddriver/openstack/deploy/validators/OpenstackDescriptionValidatorSpec.groovy b/clouddriver-openstack/src/test/groovy/com/netflix/spinnaker/clouddriver/openstack/deploy/validators/OpenstackDescriptionValidatorSpec.groovy new file mode 100644 index 00000000000..e69de29bb2d diff --git a/clouddriver-openstack/src/test/groovy/com/netflix/spinnaker/clouddriver/openstack/provider/view/OpenstackClusterProviderSpec.groovy b/clouddriver-openstack/src/test/groovy/com/netflix/spinnaker/clouddriver/openstack/provider/view/OpenstackClusterProviderSpec.groovy new file mode 100644 index 00000000000..e69de29bb2d diff --git a/clouddriver-oracle/clouddriver-oracle.gradle b/clouddriver-oracle/clouddriver-oracle.gradle index 83a10db7cf1..08a6c9b4e43 100644 --- a/clouddriver-oracle/clouddriver-oracle.gradle +++ b/clouddriver-oracle/clouddriver-oracle.gradle @@ -57,11 +57,31 @@ tasks.clean.dependsOn('cleanSdk') tasks.compileJava.dependsOn('unpackSdk') dependencies { - compile project(":clouddriver-core") - compile spinnaker.dependency('frigga') - compile spinnaker.dependency('bootActuator') - compile spinnaker.dependency('bootWeb') - compile fileTree(sdkLocation) + implementation project(":clouddriver-core") + implementation project(":cats:cats-core") + implementation project(":clouddriver-security") + + implementation fileTree(sdkLocation) + + compileOnly "org.projectlombok:lombok" + annotationProcessor "org.projectlombok:lombok" + testAnnotationProcessor "org.projectlombok:lombok" + + implementation "com.google.guava:guava:27.1-jre" + implementation "com.netflix.frigga:frigga" + implementation "com.netflix.spectator:spectator-api" + implementation "com.netflix.spinnaker.fiat:fiat-api:$fiatVersion" + implementation "com.netflix.spinnaker.fiat:fiat-core:$fiatVersion" + implementation "com.netflix.spinnaker.moniker:moniker" + implementation "org.codehaus.groovy:groovy-all" + implementation "org.springframework.boot:spring-boot-starter-actuator" + implementation "org.springframework.boot:spring-boot-starter-web" + + testImplementation "cglib:cglib-nodep" + testImplementation "org.objenesis:objenesis" + testImplementation "org.spockframework:spock-core" + testImplementation "org.spockframework:spock-spring" + testImplementation "org.springframework:spring-test" } def allSourceSets = sourceSets diff --git a/clouddriver-oracle/src/main/groovy/com/netflix/spinnaker/clouddriver/oracle/provider/view/OracleInstanceProvider.groovy b/clouddriver-oracle/src/main/groovy/com/netflix/spinnaker/clouddriver/oracle/provider/view/OracleInstanceProvider.groovy index 386290cef1e..dce9e241187 100644 --- a/clouddriver-oracle/src/main/groovy/com/netflix/spinnaker/clouddriver/oracle/provider/view/OracleInstanceProvider.groovy +++ b/clouddriver-oracle/src/main/groovy/com/netflix/spinnaker/clouddriver/oracle/provider/view/OracleInstanceProvider.groovy @@ -20,7 +20,6 @@ import com.netflix.spinnaker.clouddriver.oracle.model.OracleInstance import com.netflix.spinnaker.clouddriver.security.AccountCredentialsProvider import com.oracle.bmc.core.model.Instance import groovy.util.logging.Slf4j -import org.apache.commons.lang.NotImplementedException import org.springframework.beans.factory.annotation.Autowired import org.springframework.stereotype.Component @@ -58,7 +57,7 @@ class OracleInstanceProvider implements InstanceProvider @Override String getConsoleOutput(String account, String region, String id) { // TODO: Add this when we actually need it in Deck - throw new NotImplementedException() + throw new UnsupportedOperationException() } private Set loadInstances(Collection identifiers) { diff --git a/clouddriver-scattergather/clouddriver-scattergather.gradle b/clouddriver-scattergather/clouddriver-scattergather.gradle index 24696b7bc35..ccdadba41f1 100644 --- a/clouddriver-scattergather/clouddriver-scattergather.gradle +++ b/clouddriver-scattergather/clouddriver-scattergather.gradle @@ -6,9 +6,12 @@ repositories { } dependencies { - compile spinnaker.dependency("kork") - compile spinnaker.dependency('korkWeb') - compile spinnaker.dependency("okHttp3") -// compile "org.jetbrains.kotlinx:kotlinx-coroutines-core:0.30.2" -// compile "org.jetbrains.kotlinx:kotlinx-coroutines-jdk8:0.30.2" + implementation "com.netflix.spinnaker.kork:kork-core" + implementation "com.netflix.spinnaker.kork:kork-web" + implementation "com.squareup.okhttp3:okhttp" + implementation "org.springframework.boot:spring-boot-starter-web" + + testImplementation "com.nhaarman.mockitokotlin2:mockito-kotlin:2.1.0" + testImplementation "io.strikt:strikt-core" + testImplementation "org.springframework:spring-test" } diff --git a/clouddriver-security/clouddriver-security.gradle b/clouddriver-security/clouddriver-security.gradle index 554a1c8ef09..86f4424025f 100644 --- a/clouddriver-security/clouddriver-security.gradle +++ b/clouddriver-security/clouddriver-security.gradle @@ -1,12 +1,22 @@ dependencies { - spinnaker.group('jackson') + implementation project(":cats:cats-core") - compile spinnaker.dependency('kork') - compile spinnaker.dependency('slf4j') - compile project(':cats:cats-core') + implementation "com.fasterxml.jackson.core:jackson-annotations" + implementation "com.fasterxml.jackson.core:jackson-core" + implementation "com.fasterxml.jackson.core:jackson-databind" + implementation "com.netflix.frigga:frigga" + implementation "com.netflix.spinnaker.fiat:fiat-api:$fiatVersion" + implementation "com.netflix.spinnaker.fiat:fiat-core:$fiatVersion" + implementation "com.netflix.spinnaker.kork:kork-core" + implementation "org.codehaus.groovy:groovy-all" + implementation "org.slf4j:jcl-over-slf4j" + implementation "org.springframework.boot:spring-boot-starter-web" + implementation "com.google.guava:guava:27.1-jre" - compile spinnaker.dependency('fiat') - compile spinnaker.dependency('frigga') + testImplementation project(":cats:cats-test") - testCompile project(':cats:cats-test') + testImplementation "cglib:cglib-nodep" + testImplementation "org.objenesis:objenesis" + testImplementation "org.spockframework:spock-core" + testImplementation "org.spockframework:spock-spring" } diff --git a/clouddriver-sql-mysql/clouddriver-sql-mysql.gradle b/clouddriver-sql-mysql/clouddriver-sql-mysql.gradle index 47a2b291b40..e4e3778f65d 100644 --- a/clouddriver-sql-mysql/clouddriver-sql-mysql.gradle +++ b/clouddriver-sql-mysql/clouddriver-sql-mysql.gradle @@ -1,6 +1,6 @@ dependencies { - compile project(':cats:cats-sql') - compile project(':clouddriver-sql') + implementation project(":cats:cats-sql") + implementation project(":clouddriver-sql") - compile "mysql:mysql-connector-java:8.0.12" + implementation "mysql:mysql-connector-java:8.0.12" } diff --git a/clouddriver-sql/clouddriver-sql.gradle b/clouddriver-sql/clouddriver-sql.gradle index f0d69c09437..7f41b416931 100644 --- a/clouddriver-sql/clouddriver-sql.gradle +++ b/clouddriver-sql/clouddriver-sql.gradle @@ -17,13 +17,20 @@ apply from: "$rootDir/gradle/kotlin.gradle" dependencies { - compile project(':clouddriver-core') - compile project(':cats:cats-core') + implementation project(":cats:cats-core") + implementation project(":clouddriver-core") - compile spinnaker.dependency("korkSql") - compile spinnaker.dependency("ulid") - compile spinnaker.dependency("resilience4jRetry") + implementation "com.netflix.spinnaker.kork:kork-core" + implementation "com.netflix.spinnaker.kork:kork-exceptions" + implementation "com.netflix.spinnaker.kork:kork-sql" + implementation "de.huxhorn.sulky:de.huxhorn.sulky.ulid" + implementation "io.github.resilience4j:resilience4j-retry" + implementation("org.jooq:jooq:3.9.6") { + force = true - testCompile project(":clouddriver-core-tck") - testCompile spinnaker.dependency("korkSqlTest") + } + + testImplementation project(":clouddriver-core-tck") + + testImplementation "com.netflix.spinnaker.kork:kork-sql-test" } diff --git a/clouddriver-sql/src/main/kotlin/com/netflix/spinnaker/config/SqlConfiguration.kt b/clouddriver-sql/src/main/kotlin/com/netflix/spinnaker/config/SqlConfiguration.kt index 5fea7760b8f..7fd08378e56 100644 --- a/clouddriver-sql/src/main/kotlin/com/netflix/spinnaker/config/SqlConfiguration.kt +++ b/clouddriver-sql/src/main/kotlin/com/netflix/spinnaker/config/SqlConfiguration.kt @@ -39,15 +39,15 @@ import java.time.Clock class SqlConfiguration { @Bean - @ConditionalOnProperty("sql.taskRepository.enabled") + @ConditionalOnProperty("sql.task-repository.enabled") fun sqlTaskRepository(jooq: DSLContext, clock: Clock, sqlProperties: SqlProperties): TaskRepository = SqlTaskRepository(jooq, ObjectMapper(), clock, sqlProperties.retries) @Bean - @ConditionalOnProperty("sql.taskRepository.enabled") - @ConditionalOnExpression("\${sql.readOnly:false} == false") + @ConditionalOnProperty("sql.task-repository.enabled") + @ConditionalOnExpression("\${sql.read-only:false} == false") fun sqlTaskCleanupAgent(jooq: DSLContext, clock: Clock, registry: Registry, @@ -56,8 +56,8 @@ class SqlConfiguration { SqlTaskCleanupAgent(jooq, clock, registry, properties, sqlProperties.retries) @Bean - @ConditionalOnProperty("sql.taskRepository.enabled") - @ConditionalOnExpression("\${sql.readOnly:false} == false") + @ConditionalOnProperty("sql.task-repository.enabled") + @ConditionalOnExpression("\${sql.read-only:false} == false") fun sqlProvider(sqlTaskCleanupAgent: SqlTaskCleanupAgent): SqlProvider = SqlProvider(mutableListOf(sqlTaskCleanupAgent)) } diff --git a/clouddriver-sql/src/main/kotlin/com/netflix/spinnaker/config/SqlTaskCleanupAgentProperties.kt b/clouddriver-sql/src/main/kotlin/com/netflix/spinnaker/config/SqlTaskCleanupAgentProperties.kt index ebfc01e4ba6..08c32820a49 100644 --- a/clouddriver-sql/src/main/kotlin/com/netflix/spinnaker/config/SqlTaskCleanupAgentProperties.kt +++ b/clouddriver-sql/src/main/kotlin/com/netflix/spinnaker/config/SqlTaskCleanupAgentProperties.kt @@ -18,7 +18,7 @@ package com.netflix.spinnaker.config import org.springframework.boot.context.properties.ConfigurationProperties import java.util.concurrent.TimeUnit -@ConfigurationProperties("sql.agent.taskCleanup") +@ConfigurationProperties("sql.agent.task-cleanup") data class SqlTaskCleanupAgentProperties( var completedTtlMs: Long = TimeUnit.MINUTES.toMillis(60), var batchSize: Int = 100 diff --git a/clouddriver-sql/src/test/java/com/netflix/spinnaker/clouddriver/sql/SqlTaskRepositoryTest.java b/clouddriver-sql/src/test/java/com/netflix/spinnaker/clouddriver/sql/SqlTaskRepositoryTest.java index fd784890840..471dc159b92 100644 --- a/clouddriver-sql/src/test/java/com/netflix/spinnaker/clouddriver/sql/SqlTaskRepositoryTest.java +++ b/clouddriver-sql/src/test/java/com/netflix/spinnaker/clouddriver/sql/SqlTaskRepositoryTest.java @@ -33,10 +33,10 @@ public class SqlTaskRepositoryTest extends TaskRepositoryTck { @Override protected TaskRepository createTaskRepository() { - database = SqlTestUtil.initDatabase(); + database = SqlTestUtil.initDatabase("jdbc:h2:mem:test" + System.currentTimeMillis()); RetryProperties retry = new RetryProperties(0, 0); - SqlRetryProperties properties = new SqlRetryProperties(); + SqlRetryProperties properties = new SqlRetryProperties(new RetryProperties(1, 10), new RetryProperties(1, 10)); properties.setReads(retry); properties.setTransactions(retry); diff --git a/clouddriver-titus/clouddriver-titus.gradle b/clouddriver-titus/clouddriver-titus.gradle index a3ebff42c25..7e2be5c83f9 100644 --- a/clouddriver-titus/clouddriver-titus.gradle +++ b/clouddriver-titus/clouddriver-titus.gradle @@ -22,18 +22,45 @@ repositories { dependencies { protobuf 'com.netflix.titus:titus-api-definitions:0.0.1-rc59' - compile "com.google.protobuf:protobuf-java:$protobufVersion" - compile "io.grpc:grpc-protobuf:$grpcVersion" - compile "io.grpc:grpc-stub:$grpcVersion" - compile "io.grpc:grpc-netty-shaded:$grpcVersion" - compile project(":clouddriver-aws") - compile project(":clouddriver-core") - compile project(":clouddriver-eureka") - compile spinnaker.dependency('bootActuator') - compile spinnaker.dependency('bootWeb') - compile 'com.squareup.okhttp3:okhttp:3.1.2' - testCompile "org.slf4j:slf4j-simple:${spinnaker.version('slf4j')}" - spinnaker.group('test') + implementation project(":cats:cats-core") + implementation project(":clouddriver-aws") + implementation project(":clouddriver-core") + implementation project(":clouddriver-eureka") + implementation project(":clouddriver-security") + + annotationProcessor "org.projectlombok:lombok" + compileOnly "org.projectlombok:lombok" + testAnnotationProcessor "org.projectlombok:lombok" + + implementation "com.amazonaws:aws-java-sdk" + implementation "com.google.protobuf:protobuf-java:$protobufVersion" + implementation "com.netflix.frigga:frigga" + implementation "com.netflix.spectator:spectator-api" + implementation "com.netflix.spinnaker.fiat:fiat-api:$fiatVersion" + implementation "com.netflix.spinnaker.fiat:fiat-core:$fiatVersion" + implementation "com.netflix.spinnaker.kork:kork-artifacts" + implementation "com.netflix.spinnaker.kork:kork-core" + implementation "com.netflix.spinnaker.kork:kork-exceptions" + implementation "com.netflix.spinnaker.kork:kork-security" + implementation "com.netflix.spinnaker.moniker:moniker" + implementation "com.squareup.okhttp3:okhttp:3.1.2" + implementation "io.grpc:grpc-netty-shaded:$grpcVersion" + implementation "io.grpc:grpc-protobuf:$grpcVersion" + implementation "io.grpc:grpc-stub:$grpcVersion" + implementation "org.codehaus.groovy:groovy-all" + implementation "org.slf4j:slf4j-api" + implementation "org.springframework.boot:spring-boot-actuator" + implementation "org.springframework.boot:spring-boot-starter-web" + implementation "org.yaml:snakeyaml:1.24" + + testImplementation "cglib:cglib-nodep" + testImplementation "junit:junit" + testImplementation "org.hamcrest:hamcrest-core" + testImplementation "org.objenesis:objenesis" + testImplementation "org.slf4j:slf4j-simple" + testImplementation "org.spockframework:spock-core" + testImplementation "org.spockframework:spock-spring" + testImplementation "org.springframework:spring-test" } sourceSets { diff --git a/clouddriver-titus/src/main/groovy/com/netflix/spinnaker/clouddriver/titus/caching/TitusCachingProviderConfig.groovy b/clouddriver-titus/src/main/groovy/com/netflix/spinnaker/clouddriver/titus/caching/TitusCachingProviderConfig.groovy index 9ed40dad990..e1de0a841ad 100644 --- a/clouddriver-titus/src/main/groovy/com/netflix/spinnaker/clouddriver/titus/caching/TitusCachingProviderConfig.groovy +++ b/clouddriver-titus/src/main/groovy/com/netflix/spinnaker/clouddriver/titus/caching/TitusCachingProviderConfig.groovy @@ -40,10 +40,10 @@ import javax.inject.Provider @Configuration class TitusCachingProviderConfig { - @Value('${titus.pollIntervalMillis:30000}') + @Value('${titus.poll-interval-millis:30000}') Long pollIntervalMillis - @Value('${titus.timeoutMillis:300000}') + @Value('${titus.timeout-millis:300000}') Long timeoutMillis @Bean diff --git a/clouddriver-titus/src/main/groovy/com/netflix/spinnaker/clouddriver/titus/caching/agents/TitusStreamingUpdateAgent.java b/clouddriver-titus/src/main/groovy/com/netflix/spinnaker/clouddriver/titus/caching/agents/TitusStreamingUpdateAgent.java index 67c226707ed..1fc01839f69 100644 --- a/clouddriver-titus/src/main/groovy/com/netflix/spinnaker/clouddriver/titus/caching/agents/TitusStreamingUpdateAgent.java +++ b/clouddriver-titus/src/main/groovy/com/netflix/spinnaker/clouddriver/titus/caching/agents/TitusStreamingUpdateAgent.java @@ -46,7 +46,6 @@ import com.netflix.spinnaker.clouddriver.titus.credentials.NetflixTitusCredentials; import com.netflix.spinnaker.kork.dynamicconfig.DynamicConfigService; import com.netflix.titus.grpc.protogen.*; -import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -66,7 +65,6 @@ import static java.util.Collections.*; import static java.util.concurrent.TimeUnit.MILLISECONDS; -@Slf4j public class TitusStreamingUpdateAgent implements CustomScheduledAgent { private static final TypeReference> ANY_MAP = new TypeReference>() { @@ -883,4 +881,4 @@ private String getAsgName(com.netflix.spinnaker.clouddriver.titus.client.model.J return asgName; } -} \ No newline at end of file +} diff --git a/clouddriver-titus/src/main/groovy/com/netflix/spinnaker/clouddriver/titus/client/RegionScopedTitusClient.java b/clouddriver-titus/src/main/groovy/com/netflix/spinnaker/clouddriver/titus/client/RegionScopedTitusClient.java index e7ab82f46e6..306a858f63f 100644 --- a/clouddriver-titus/src/main/groovy/com/netflix/spinnaker/clouddriver/titus/client/RegionScopedTitusClient.java +++ b/clouddriver-titus/src/main/groovy/com/netflix/spinnaker/clouddriver/titus/client/RegionScopedTitusClient.java @@ -28,8 +28,9 @@ import com.netflix.spinnaker.kork.core.RetrySupport; import com.netflix.titus.grpc.protogen.*; import io.grpc.Status; -import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import java.net.URL; import java.util.*; @@ -39,9 +40,10 @@ import static java.util.stream.Collectors.mapping; import static java.util.stream.Collectors.toList; -@Slf4j public class RegionScopedTitusClient implements TitusClient { + private final Logger log = LoggerFactory.getLogger(getClass()); + /** * Default connect timeout in milliseconds */ diff --git a/clouddriver-titus/src/main/groovy/com/netflix/spinnaker/clouddriver/titus/client/SimpleGrpcChannelFactory.groovy b/clouddriver-titus/src/main/groovy/com/netflix/spinnaker/clouddriver/titus/client/SimpleGrpcChannelFactory.groovy index 39e32ffd2be..4d1add68879 100644 --- a/clouddriver-titus/src/main/groovy/com/netflix/spinnaker/clouddriver/titus/client/SimpleGrpcChannelFactory.groovy +++ b/clouddriver-titus/src/main/groovy/com/netflix/spinnaker/clouddriver/titus/client/SimpleGrpcChannelFactory.groovy @@ -24,6 +24,6 @@ import io.grpc.ManagedChannelBuilder class SimpleGrpcChannelFactory implements GrpcChannelFactory { @Override ManagedChannel build(TitusRegion titusRegion, String environment, String eurekaName, long defaultConnectTimeOut, Registry registry) { - return ManagedChannelBuilder.forAddress(titusRegion.url, titusRegion.port).usePlaintext(true).build(); + return ManagedChannelBuilder.forAddress(titusRegion.url, titusRegion.port).build() } } diff --git a/clouddriver-titus/src/main/groovy/com/netflix/spinnaker/clouddriver/titus/deploy/validators/AbstractTitusDescriptionValidatorSupport.groovy b/clouddriver-titus/src/main/groovy/com/netflix/spinnaker/clouddriver/titus/deploy/validators/AbstractTitusDescriptionValidatorSupport.groovy index 2d6bd2ff491..28c3b999805 100644 --- a/clouddriver-titus/src/main/groovy/com/netflix/spinnaker/clouddriver/titus/deploy/validators/AbstractTitusDescriptionValidatorSupport.groovy +++ b/clouddriver-titus/src/main/groovy/com/netflix/spinnaker/clouddriver/titus/deploy/validators/AbstractTitusDescriptionValidatorSupport.groovy @@ -50,11 +50,11 @@ abstract class AbstractTitusDescriptionValidatorSupport void validateRegion(T description, String regionName, String errorKey, Errors errors) { validateRegions(description, regionName ? [regionName] : [], errorKey, errors, "region") } - static void validateRegions(T description, Collection regionNames, String errorKey, Errors errors, String attributeName = "regions") { + static void validateRegions(T description, Collection regionNames, String errorKey, Errors errors, String attributeName = "regions") { if (!regionNames) { errors.rejectValue(attributeName, "${errorKey}.${attributeName}.empty") } else { @@ -65,14 +65,14 @@ abstract class AbstractTitusDescriptionValidatorSupport void validateAsgName(T description, Errors errors) { def key = description.getClass().simpleName if (!description.asgName) { errors.rejectValue("asgName", "${key}.asgName.empty") } } - static void validateAsgNameAndRegionAndInstanceIds(T description, Errors errors) { + static void validateAsgNameAndRegionAndInstanceIds(T description, Errors errors) { def key = description.class.simpleName if (description.asgName) { validateAsgName(description, errors) diff --git a/clouddriver-web/clouddriver-web.gradle b/clouddriver-web/clouddriver-web.gradle index 6ff23172939..ba4861001d1 100644 --- a/clouddriver-web/clouddriver-web.gradle +++ b/clouddriver-web/clouddriver-web.gradle @@ -24,27 +24,41 @@ repositories { } dependencies { - compile project(':clouddriver-core') - compile project(':clouddriver-security') - compile project(':clouddriver-artifacts') - compile project(':clouddriver-sql-mysql') - - runtime spinnaker.dependency('kork') - compile spinnaker.dependency('korkWeb') - compile spinnaker.dependency('korkStackdriver') - compile spinnaker.dependency('korkSwagger') - runtime "com.netflix.spinnaker.kork:kork-secrets-aws:${spinnaker.version('kork')}" - compile spinnaker.dependency('bootActuator') - compile spinnaker.dependency('bootDataRest') - testCompile spinnaker.dependency('bootTest') - //this brings in the jetty GzipFilter which boot will autoconfigure - runtime 'org.eclipse.jetty:jetty-servlets:9.2.11.v20150529' - - testCompile project(':clouddriver-elasticsearch') + implementation project(":cats:cats-core") + implementation project(":clouddriver-artifacts") + implementation project(":clouddriver-core") + implementation project(":clouddriver-security") + implementation project(":clouddriver-sql-mysql") + + + compileOnly "org.projectlombok:lombok" + annotationProcessor "org.projectlombok:lombok" + testAnnotationProcessor "org.projectlombok:lombok" + + implementation "com.netflix.frigga:frigga" + implementation "com.netflix.spinnaker.fiat:fiat-api:$fiatVersion" + implementation "com.netflix.spinnaker.fiat:fiat-core:$fiatVersion" + implementation "com.netflix.spinnaker.kork:kork-artifacts" + implementation "com.netflix.spinnaker.kork:kork-core" + implementation "com.netflix.spinnaker.kork:kork-secrets-aws" + implementation "com.netflix.spinnaker.kork:kork-stackdriver" + implementation "com.netflix.spinnaker.kork:kork-swagger" + implementation "com.netflix.spinnaker.kork:kork-web" + implementation "com.netflix.spinnaker.moniker:moniker" + implementation "org.codehaus.groovy:groovy-all" + implementation "org.slf4j:slf4j-api" + implementation "org.springframework.boot:spring-boot-starter-actuator" + implementation "org.springframework.boot:spring-boot-starter-json" + implementation "org.springframework.boot:spring-boot-starter-web" + + testImplementation project(":clouddriver-elasticsearch") + + testImplementation "org.springframework.boot:spring-boot-starter-test" + testImplementation "org.spockframework:spock-core" // Add each included cloud provider project as a runtime dependency gradle.includedCloudProviderProjects.each { - runtime project(":${it}") + implementation project(":${it}") } } diff --git a/clouddriver-web/config/clouddriver.yml b/clouddriver-web/config/clouddriver.yml index d5ecd9133f0..e67e9be1180 100644 --- a/clouddriver-web/config/clouddriver.yml +++ b/clouddriver-web/config/clouddriver.yml @@ -2,6 +2,8 @@ server: port: 7002 ssl: enabled: false + compression: + enabled: true redis: connection: redis://localhost:6379 diff --git a/clouddriver-web/src/main/groovy/com/netflix/spinnaker/clouddriver/Main.groovy b/clouddriver-web/src/main/groovy/com/netflix/spinnaker/clouddriver/Main.groovy index 1980cae7ddc..b6ad42a6c93 100644 --- a/clouddriver-web/src/main/groovy/com/netflix/spinnaker/clouddriver/Main.groovy +++ b/clouddriver-web/src/main/groovy/com/netflix/spinnaker/clouddriver/Main.groovy @@ -16,16 +16,24 @@ package com.netflix.spinnaker.clouddriver +import com.fasterxml.jackson.databind.ObjectMapper import com.netflix.spinnaker.clouddriver.security.config.SecurityConfig +import org.springframework.boot.actuate.autoconfigure.elasticsearch.ElasticSearchJestHealthIndicatorAutoConfiguration import org.springframework.boot.autoconfigure.EnableAutoConfiguration import org.springframework.boot.autoconfigure.batch.BatchAutoConfiguration +import org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchAutoConfiguration +import org.springframework.boot.autoconfigure.elasticsearch.jest.JestAutoConfiguration import org.springframework.boot.autoconfigure.groovy.template.GroovyTemplateAutoConfiguration +import org.springframework.boot.autoconfigure.gson.GsonAutoConfiguration import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration import org.springframework.boot.builder.SpringApplicationBuilder -import org.springframework.boot.web.support.SpringBootServletInitializer +import org.springframework.boot.web.servlet.support.SpringBootServletInitializer +import org.springframework.context.annotation.Bean import org.springframework.context.annotation.ComponentScan import org.springframework.context.annotation.Configuration import org.springframework.context.annotation.Import +import org.springframework.context.annotation.Primary +import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder import org.springframework.scheduling.annotation.EnableScheduling import sun.net.InetAddressCachePolicy @@ -41,9 +49,13 @@ import java.security.Security 'com.netflix.spinnaker.clouddriver.config' ]) @EnableAutoConfiguration(exclude = [ - BatchAutoConfiguration, - GroovyTemplateAutoConfiguration, - DataSourceAutoConfiguration + BatchAutoConfiguration, + GroovyTemplateAutoConfiguration, + GsonAutoConfiguration, + DataSourceAutoConfiguration, + ElasticsearchAutoConfiguration, + ElasticSearchJestHealthIndicatorAutoConfiguration, + JestAutoConfiguration ]) @EnableScheduling class Main extends SpringBootServletInitializer { @@ -65,6 +77,7 @@ class Main extends SpringBootServletInitializer { */ InetAddressCachePolicy.cachePolicy = InetAddressCachePolicy.NEVER Security.setProperty('networkaddress.cache.ttl', '0') + System.setProperty("spring.main.allow-bean-definition-overriding", "true") } static void main(String... args) { @@ -72,6 +85,12 @@ class Main extends SpringBootServletInitializer { new SpringApplicationBuilder().properties(DEFAULT_PROPS).sources(Main).run(args) } + @Bean + @Primary + ObjectMapper jacksonObjectMapper(Jackson2ObjectMapperBuilder builder) { + return builder.createXmlMapper(false).build() + } + @Override SpringApplicationBuilder configure(SpringApplicationBuilder application) { application.properties(DEFAULT_PROPS).sources(Main) diff --git a/clouddriver-web/src/main/groovy/com/netflix/spinnaker/clouddriver/controllers/DataController.groovy b/clouddriver-web/src/main/groovy/com/netflix/spinnaker/clouddriver/controllers/DataController.groovy index 49af3c6c117..ab1a528a56e 100644 --- a/clouddriver-web/src/main/groovy/com/netflix/spinnaker/clouddriver/controllers/DataController.groovy +++ b/clouddriver-web/src/main/groovy/com/netflix/spinnaker/clouddriver/controllers/DataController.groovy @@ -35,8 +35,17 @@ import javax.servlet.http.HttpServletRequest @RestController @RequestMapping("/v1/data") class DataController { - @Autowired(required = false) - List dataProviders = [] + + List dataProviders + + @Autowired + DataController(Optional> dataProviders) { + if (dataProviders.present) { + this.dataProviders = dataProviders.get() + } else { + this.dataProviders = [] + } + } @RequestMapping(value = "/static/{id}", method = RequestMethod.GET) Object getStaticData(@PathVariable("id") String id, @RequestParam Map filters) { diff --git a/clouddriver-web/src/main/groovy/com/netflix/spinnaker/clouddriver/controllers/FunctionController.java b/clouddriver-web/src/main/groovy/com/netflix/spinnaker/clouddriver/controllers/FunctionController.java index ed6e5ea1143..62ee126dfa5 100644 --- a/clouddriver-web/src/main/groovy/com/netflix/spinnaker/clouddriver/controllers/FunctionController.java +++ b/clouddriver-web/src/main/groovy/com/netflix/spinnaker/clouddriver/controllers/FunctionController.java @@ -16,7 +16,6 @@ package com.netflix.spinnaker.clouddriver.controllers; -import com.netflix.discovery.converters.Auto; import com.netflix.spinnaker.clouddriver.model.Function; import com.netflix.spinnaker.clouddriver.model.FunctionProvider; import org.springframework.beans.factory.annotation.Autowired; @@ -27,7 +26,6 @@ import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; import com.netflix.spinnaker.kork.web.exceptions.NotFoundException; -import org.apache.log4j.Logger; import java.util.Collection; import java.util.Collections; import java.util.List; diff --git a/clouddriver-web/src/main/groovy/com/netflix/spinnaker/clouddriver/controllers/SearchController.groovy b/clouddriver-web/src/main/groovy/com/netflix/spinnaker/clouddriver/controllers/SearchController.groovy index 80fd4694866..730443130d6 100644 --- a/clouddriver-web/src/main/groovy/com/netflix/spinnaker/clouddriver/controllers/SearchController.groovy +++ b/clouddriver-web/src/main/groovy/com/netflix/spinnaker/clouddriver/controllers/SearchController.groovy @@ -20,7 +20,8 @@ import com.netflix.spinnaker.clouddriver.search.SearchProvider import com.netflix.spinnaker.clouddriver.search.SearchQueryCommand import com.netflix.spinnaker.clouddriver.search.SearchResultSet import com.netflix.spinnaker.clouddriver.search.executor.SearchExecutor -import org.apache.log4j.Logger +import org.slf4j.Logger +import org.slf4j.LoggerFactory import org.springframework.beans.factory.annotation.Autowired import org.springframework.security.access.prepost.PreAuthorize import org.springframework.web.bind.annotation.RequestMapping @@ -33,7 +34,7 @@ import javax.servlet.http.HttpServletRequest @RestController class SearchController { - protected static final Logger log = Logger.getLogger(this) + protected static final Logger log = LoggerFactory.getLogger(getClass()) @Autowired List searchProviders diff --git a/clouddriver-web/src/main/groovy/com/netflix/spinnaker/clouddriver/controllers/TaskController.groovy b/clouddriver-web/src/main/groovy/com/netflix/spinnaker/clouddriver/controllers/TaskController.groovy index 1c9b30a3a0a..8d8cf919e66 100644 --- a/clouddriver-web/src/main/groovy/com/netflix/spinnaker/clouddriver/controllers/TaskController.groovy +++ b/clouddriver-web/src/main/groovy/com/netflix/spinnaker/clouddriver/controllers/TaskController.groovy @@ -37,7 +37,7 @@ class TaskController { @Autowired TaskRepository taskRepository - @Value('${admin.tasks.shutdownWaitSeconds:-1}') + @Value('${admin.tasks.shutdown-wait-seconds:-1}') Long shutdownWaitSeconds @RequestMapping(value = "/{id}", method = RequestMethod.GET) diff --git a/clouddriver-web/src/main/groovy/com/netflix/spinnaker/clouddriver/requestqueue/RequestQueueConfiguration.java b/clouddriver-web/src/main/groovy/com/netflix/spinnaker/clouddriver/requestqueue/RequestQueueConfiguration.java index 65a79bf2eaf..7a937d285a9 100644 --- a/clouddriver-web/src/main/groovy/com/netflix/spinnaker/clouddriver/requestqueue/RequestQueueConfiguration.java +++ b/clouddriver-web/src/main/groovy/com/netflix/spinnaker/clouddriver/requestqueue/RequestQueueConfiguration.java @@ -18,7 +18,7 @@ import org.springframework.boot.context.properties.ConfigurationProperties; -@ConfigurationProperties("requestQueue") +@ConfigurationProperties("request-queue") public class RequestQueueConfiguration { private boolean enabled = false; private long startWorkTimeoutMillis = RequestQueue.DEFAULT_START_WORK_TIMEOUT_MILLIS; diff --git a/clouddriver-web/src/main/groovy/com/netflix/spinnaker/clouddriver/requestqueue/pooled/PooledRequestQueue.java b/clouddriver-web/src/main/groovy/com/netflix/spinnaker/clouddriver/requestqueue/pooled/PooledRequestQueue.java index d17e8f67387..b80a03e36a3 100644 --- a/clouddriver-web/src/main/groovy/com/netflix/spinnaker/clouddriver/requestqueue/pooled/PooledRequestQueue.java +++ b/clouddriver-web/src/main/groovy/com/netflix/spinnaker/clouddriver/requestqueue/pooled/PooledRequestQueue.java @@ -154,7 +154,7 @@ public T execute(String partition, Callable operation, long startWorkTime } } - @Scheduled(fixedDelayString = "${requestQueue.corePoolSizeRefreshMs:120000}") + @Scheduled(fixedDelayString = "${request-queue.core-pool-size-refresh-ms:120000}") public void refreshCorePoolSize() { int currentCorePoolSize = executorService.getCorePoolSize(); int desiredCorePoolSize = dynamicConfigService.getConfig( diff --git a/clouddriver-web/src/test/groovy/com/netflix/spinnaker/clouddriver/controllers/DataControllerSpec.groovy b/clouddriver-web/src/test/groovy/com/netflix/spinnaker/clouddriver/controllers/DataControllerSpec.groovy index 9790ee15bb0..639186813e7 100644 --- a/clouddriver-web/src/test/groovy/com/netflix/spinnaker/clouddriver/controllers/DataControllerSpec.groovy +++ b/clouddriver-web/src/test/groovy/com/netflix/spinnaker/clouddriver/controllers/DataControllerSpec.groovy @@ -20,19 +20,28 @@ import com.netflix.spinnaker.clouddriver.model.DataProvider import com.netflix.spinnaker.security.AuthenticatedRequest import org.slf4j.MDC import org.springframework.security.access.AccessDeniedException +import spock.lang.Shared import spock.lang.Specification import spock.lang.Subject -import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletRequest class DataControllerSpec extends Specification { - def dataProvider = Mock(DataProvider) { - supportsIdentifier(_, _) >> { return true } - getAccountForIdentifier(_, _) >> { _, id -> return id } - } + + @Shared + Optional> dataProviders @Subject - def dataController = new DataController(dataProviders: [dataProvider]) + def dataController = new DataController(dataProviders) + + void setupSpec() { + DataProvider dataProvider = Mock(DataProvider) { + supportsIdentifier(_ as DataProvider.IdentifierType, _ as String) >> { return true } + getAccountForIdentifier(_ as DataProvider.IdentifierType, _ as String) >> { _, id -> return id } + } + + dataProviders = Optional.of([dataProvider]) + } void setup() { MDC.remove(AuthenticatedRequest.Header.ACCOUNTS.header) @@ -54,7 +63,7 @@ class DataControllerSpec extends Specification { notThrown(AccessDeniedException) } - def "should verify access to account when fetching adhoc data"() { + def "should deny when fetching adhoc data with no accounts"() { given: def httpServletRequest = Mock(HttpServletRequest) @@ -63,14 +72,28 @@ class DataControllerSpec extends Specification { then: thrown(AccessDeniedException) + } - when: + def "should allow access to account when fetching adhoc data with correct account"() { + given: + def httpServletRequest = Mock(HttpServletRequest) MDC.put(AuthenticatedRequest.Header.ACCOUNTS.header, "restricted") + + when: dataController.getAdhocData("groupId", "restricted", httpServletRequest) then: - 1 * httpServletRequest.getAttribute(_) >> { return "pattern" } - 1 * httpServletRequest.getServletPath() >> { return "/servlet/path" } + httpServletRequest.getAttribute(_ as String) >> { return "pattern" } + httpServletRequest.getServletPath() >> { return "/servlet/path" } notThrown(AccessDeniedException) } + + // If the wrong slf4j is on the classpath, this fails. So leaving this test in here for sanity. + def "mdc works"() { + given: + MDC.put(AuthenticatedRequest.Header.ACCOUNTS.header, "restricted") + + expect: + MDC.get(AuthenticatedRequest.Header.ACCOUNTS.header) == "restricted" + } } diff --git a/clouddriver-web/src/test/groovy/com/netflix/spinnaker/clouddriver/controllers/SearchControllerSpec.groovy b/clouddriver-web/src/test/groovy/com/netflix/spinnaker/clouddriver/controllers/SearchControllerSpec.groovy index 7d7306c52ae..b631aa6dd12 100644 --- a/clouddriver-web/src/test/groovy/com/netflix/spinnaker/clouddriver/controllers/SearchControllerSpec.groovy +++ b/clouddriver-web/src/test/groovy/com/netflix/spinnaker/clouddriver/controllers/SearchControllerSpec.groovy @@ -24,9 +24,9 @@ import javax.servlet.http.HttpServletRequest class SearchControllerSpec extends Specification { - SearchController searchController - SearchProvider searchProviderA - SearchProvider searchProviderB + SearchProvider searchProviderA = Mock(SearchProvider) + SearchProvider searchProviderB = Mock(SearchProvider) + SearchController searchController = new SearchController(searchProviders: [searchProviderA, searchProviderB]) HttpServletRequest request = Mock(HttpServletRequest) Enumeration enumeration = Mock(Enumeration) @@ -41,9 +41,6 @@ class SearchControllerSpec extends Specification { } def setup() { - searchProviderA = Mock(SearchProvider) - searchProviderB = Mock(SearchProvider) - searchController = new SearchController(searchProviders: [searchProviderA, searchProviderB]) } def 'query all search providers'() { diff --git a/gradle.properties b/gradle.properties index 5c0fa27ba26..99f02da4fcc 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,5 +1,3 @@ org.gradle.parallel=true - -jackson.version=2.9.2 - +enablePublishing=false includeCloudProviders=all diff --git a/gradle/buildViaTravis.sh b/gradle/buildViaTravis.sh index 5f6760aee6d..1b54954e11e 100755 --- a/gradle/buildViaTravis.sh +++ b/gradle/buildViaTravis.sh @@ -1,12 +1,12 @@ #!/bin/bash # This script will build the project. -GRADLE="./gradlew -I gradle/init-publish.gradle --no-daemon --max-workers=1" +GRADLE="./gradlew -PenablePublishing=true --no-daemon --max-workers=1" export GRADLE_OPTS="-Xmx1g -Xms1g" if [ "$TRAVIS_PULL_REQUEST" != "false" ]; then echo -e "Build Pull Request #$TRAVIS_PULL_REQUEST => Branch [$TRAVIS_BRANCH]" - $GRADLE -Prelease.useLastTag=true build + $GRADLE build elif [ "$TRAVIS_PULL_REQUEST" == "false" ] && [ "$TRAVIS_TAG" == "" ]; then echo -e 'Build Branch with Snapshot => Branch ['$TRAVIS_BRANCH']' $GRADLE -Prelease.travisci=true -PbintrayUser="${bintrayUser}" -PbintrayKey="${bintrayKey}" -x test build snapshot --stacktrace @@ -24,6 +24,6 @@ elif [ "$TRAVIS_PULL_REQUEST" == "false" ] && [ "$TRAVIS_TAG" != "" ]; then esac else echo -e 'WARN: Should not be here => Branch ['$TRAVIS_BRANCH'] Tag ['$TRAVIS_TAG'] Pull Request ['$TRAVIS_PULL_REQUEST']' - $GRADLE -Prelease.useLastTag=true build + $GRADLE build fi diff --git a/gradle/init-publish.gradle b/gradle/init-publish.gradle deleted file mode 100644 index ce23494145f..00000000000 --- a/gradle/init-publish.gradle +++ /dev/null @@ -1,14 +0,0 @@ -initscript { - repositories { - jcenter() - maven { url 'https://dl.bintray.com/spinnaker/gradle/' } - maven { url "https://plugins.gradle.org/m2/" } - } - dependencies { - classpath 'com.netflix.spinnaker.gradle:spinnaker-gradle-project:5.2.1' - } -} - -// Can't use the plugin ID (spinnaker.project) on init scripts for some reason. -apply plugin: com.netflix.spinnaker.gradle.project.SpinnakerProjectPlugin - diff --git a/gradle/installViaTravis.sh b/gradle/installViaTravis.sh index 4f6309bb634..21f1b640937 100755 --- a/gradle/installViaTravis.sh +++ b/gradle/installViaTravis.sh @@ -1,7 +1,7 @@ #!/bin/bash # This script will build the project. -GRADLE="./gradlew -I gradle/init-publish.gradle --no-daemon --max-workers=1" +GRADLE="./gradlew -PenablePublishing=true --no-daemon --max-workers=1" export GRADLE_OPTS="-Xmx1g -Xms1g" if [ "$TRAVIS_PULL_REQUEST" != "false" ]; then @@ -12,7 +12,7 @@ elif [ "$TRAVIS_PULL_REQUEST" == "false" ] && [ "$TRAVIS_TAG" == "" ]; then $GRADLE -Prelease.travisci=true -x test assemble elif [ "$TRAVIS_PULL_REQUEST" == "false" ] && [ "$TRAVIS_TAG" != "" ]; then echo -e 'Assemble Branch for Release => Branch ['$TRAVIS_BRANCH'] Tag ['$TRAVIS_TAG']' - $GRADLE -Prelease.travisci=true -Prelease.useLastTag=true -x test assemble + $GRADLE -Prelease.travisci=true -x test assemble else echo -e 'WARN: Should not be here => Branch ['$TRAVIS_BRANCH'] Tag ['$TRAVIS_TAG'] Pull Request ['$TRAVIS_PULL_REQUEST']' $GRADLE assemble diff --git a/gradle/spek.gradle b/gradle/spek.gradle index f7b5d3bfcf8..9755b029039 100644 --- a/gradle/spek.gradle +++ b/gradle/spek.gradle @@ -22,22 +22,23 @@ repositories { } dependencies { - testCompile spinnaker.dependency("junitPlatformRunner") - testCompile spinnaker.dependency("spekApi") - testCompile spinnaker.dependency("spekSubjectExtension") - testCompile spinnaker.dependency("junitJupiterApi") + testImplementation "org.junit.platform:junit-platform-runner" + testImplementation "org.jetbrains.spek:spek-api" + testImplementation "org.jetbrains.spek:spek-subject-extension" + testImplementation "org.junit.jupiter:junit-jupiter-api" - testRuntime spinnaker.dependency("junitPlatformLauncher") - testRuntime spinnaker.dependency("junitJupiterEngine") - testRuntime spinnaker.dependency("junitVintageEngine") - testRuntime spinnaker.dependency("spekJunitPlatformEngine") + testRuntime "org.junit.platform:junit-platform-launcher" + testRuntime "org.junit.jupiter:junit-jupiter-engine" + testRuntime "org.junit.vintage:junit-vintage-engine" + testRuntime "org.jetbrains.spek:spek-junit-platform-engine" - testCompile "com.nhaarman.mockitokotlin2:mockito-kotlin:2.0.0" - testCompile "io.strikt:strikt-core:0.16.3" + testImplementation "com.nhaarman.mockitokotlin2:mockito-kotlin" + testImplementation "io.strikt:strikt-core" + + implementation "org.codehaus.groovy:groovy-all" } junitPlatform { - platformVersion spinnaker.version('junit5') filters { engines { include "spek", "junit-vintage", "junit-jupiter" diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index e0b3fb8d70b..5f1b1201a73 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.2-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-5.4-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists From b89be9b71f88adb0d31439909852dcd1ec82c843 Mon Sep 17 00:00:00 2001 From: Chris Berry Date: Thu, 9 May 2019 21:53:32 -0500 Subject: [PATCH 07/11] fix(titus): only set containerHealthProviders if front50 says to (#3652) --- .../deploy/handlers/TitusDeployHandler.groovy | 383 +++++++++--------- 1 file changed, 201 insertions(+), 182 deletions(-) diff --git a/clouddriver-titus/src/main/groovy/com/netflix/spinnaker/clouddriver/titus/deploy/handlers/TitusDeployHandler.groovy b/clouddriver-titus/src/main/groovy/com/netflix/spinnaker/clouddriver/titus/deploy/handlers/TitusDeployHandler.groovy index 648e9b4b2e8..2751ef9f02e 100644 --- a/clouddriver-titus/src/main/groovy/com/netflix/spinnaker/clouddriver/titus/deploy/handlers/TitusDeployHandler.groovy +++ b/clouddriver-titus/src/main/groovy/com/netflix/spinnaker/clouddriver/titus/deploy/handlers/TitusDeployHandler.groovy @@ -114,97 +114,26 @@ class TitusDeployHandler implements DeployHandler { String region = description.region String subnet = description.subnet + Map front50Application = null + + try { + front50Application = front50Service.getApplication(description.getApplication()) + } catch (Exception e) { + log.error('Failed to load front50 application attributes for {}', description.getApplication()) + } + if (!description.env) description.env = [:] if (!description.containerAttributes) description.containerAttributes = [:] if (!description.labels) description.labels = [:] if (description.source.asgName) { task.updateStatus BASE_PHASE, "Getting Source ASG Name Details... ${System.currentTimeMillis()}" - - - // If cluster name info was not provided, use the fields from the source asg - def sourceName = Names.parseName(description.source.asgName) - description.application = description.application != null ? description.application : sourceName.app - description.stack = description.stack != null ? description.stack : sourceName.stack - description.freeFormDetails = description.freeFormDetails != null ? description.freeFormDetails : sourceName.detail - - Source source = description.source - - TitusClient sourceClient = buildSourceTitusClient(source) - if (!sourceClient) { - throw new RuntimeException("Unable to locate source (${source.account}:${source.region}:${source.asgName})") - } - Job sourceJob = sourceClient.findJobByName(source.asgName) - if (!sourceJob) { - throw new RuntimeException("Unable to locate source (${source.account}:${source.region}:${source.asgName})") - } - - task.updateStatus BASE_PHASE, "Copying deployment details from (${source.account}:${source.region}:${source.asgName})" - - description.runtimeLimitSecs = description.runtimeLimitSecs ?: sourceJob.runtimeLimitSecs - description.securityGroups = description.securityGroups ?: sourceJob.securityGroups - description.imageId = description.imageId ?: (sourceJob.applicationName + ":" + (sourceJob.version ?: sourceJob.digest)) - - if (description.source.useSourceCapacity) { - description.capacity.min = sourceJob.instancesMin - description.capacity.max = sourceJob.instancesMax - description.capacity.desired = sourceJob.instancesDesired - } - - description.resources.cpu = description.resources.cpu ?: sourceJob.cpu - description.resources.memory = description.resources.memory ?: sourceJob.memory - description.resources.disk = description.resources.disk ?: sourceJob.disk - description.retries = description.retries ?: sourceJob.retries - description.runtimeLimitSecs = description.runtimeLimitSecs ?: sourceJob.runtimeLimitSecs - description.resources.gpu = description.resources.gpu ?: sourceJob.gpu - description.resources.networkMbps = description.resources.networkMbps ?: sourceJob.networkMbps - description.efs = description.efs ?: sourceJob.efs - description.resources.allocateIpAddress = description.resources.allocateIpAddress ?: sourceJob.allocateIpAddress - description.entryPoint = description.entryPoint ?: sourceJob.entryPoint - description.iamProfile = description.iamProfile ?: sourceJob.iamProfile - description.capacityGroup = description.capacityGroup ?: sourceJob.capacityGroup - - if (description.labels.isEmpty()) { - sourceJob.labels.each { k, v -> description.labels.put(k, v) } - } - - if (description.env.isEmpty()) { - sourceJob.environment.each { k, v -> description.env.put(k, v) } - } - - if (description.containerAttributes.isEmpty()) { - sourceJob.containerAttributes.each { k, v -> description.containerAttributes.put(k, v) } - } - if (description.inService == null) { - description.inService = sourceJob.inService - } - configureDisruptionBudget(description, sourceJob) - description.jobType = description.jobType ?: "service" - if (!description.hardConstraints) description.hardConstraints = [] - if (!description.softConstraints) description.softConstraints = [] - if (description.softConstraints.empty && sourceJob.softConstraints) { - sourceJob.softConstraints.each { - if (!description.hardConstraints.contains(it)) { - description.softConstraints.add(it) - } - } - } - if (description.hardConstraints.empty && sourceJob.hardConstraints) { - sourceJob.hardConstraints.each { - if (!description.softConstraints.contains(it)) { - description.hardConstraints.add(it) - } - } - } - if (sourceJob.labels?.get(USE_APPLICATION_DEFAULT_SG_LABEL) == "false") { - description.useApplicationDefaultSecurityGroup = false - } - + mergeSourceDetailsIntoDescription(description, front50Application) task.updateStatus BASE_PHASE, "Finished Getting Source ASG Name Details... ${System.currentTimeMillis()}" - } + if (!description.source.asgName) { - configureDisruptionBudget(description, null) + configureDisruptionBudget(description, null, front50Application) } task.updateStatus BASE_PHASE, "Preparing deployment to ${account}:${region}${subnet ? ':' + subnet : ''}... ${System.currentTimeMillis()}" @@ -214,75 +143,11 @@ class TitusDeployHandler implements DeployHandler { description.labels.put("interestingHealthProviderNames", description.interestingHealthProviderNames.join(",")) } - if (description.labels.containsKey(USE_APPLICATION_DEFAULT_SG_LABEL)) { - if (description.labels.get(USE_APPLICATION_DEFAULT_SG_LABEL) == "false") { - description.useApplicationDefaultSecurityGroup = false - } else { - description.useApplicationDefaultSecurityGroup = true - } - } - - if (description.useApplicationDefaultSecurityGroup == false) { - description.labels.put(USE_APPLICATION_DEFAULT_SG_LABEL, "false") - } else { - if (description.labels.containsKey(USE_APPLICATION_DEFAULT_SG_LABEL)) { - description.labels.remove(USE_APPLICATION_DEFAULT_SG_LABEL) - } - } - - SubmitJobRequest submitJobRequest = new SubmitJobRequest() - .withApplication(description.application) - .withDockerImageName(dockerImage.imageName) - .withInstancesMin(description.capacity.min) - .withInstancesMax(description.capacity.max) - .withInstancesDesired(description.capacity.desired) - .withCpu(description.resources.cpu) - .withMemory(description.resources.memory) - .withDisk(description.resources.disk) - .withRetries(description.retries) - .withRuntimeLimitSecs(description.runtimeLimitSecs) - .withGpu(description.resources.gpu) - .withNetworkMbps(description.resources.networkMbps) - .withEfs(description.efs) - .withPorts(description.resources.ports) - .withEnv(description.env) - .withAllocateIpAddress(description.resources.allocateIpAddress) - .withStack(description.stack) - .withDetail(description.freeFormDetails) - .withEntryPoint(description.entryPoint) - .withIamProfile(description.iamProfile) - .withCapacityGroup(description.capacityGroup) - .withLabels(description.labels) - .withInService(description.inService) - .withMigrationPolicy(description.migrationPolicy) - .withCredentials(description.credentials.name) - .withContainerAttributes(description.containerAttributes.collectEntries { [(it.key): it.value?.toString()] }) - .withDisruptionBudget(description.disruptionBudget) - - if (dockerImage.imageDigest != null) { - submitJobRequest = submitJobRequest.withDockerDigest(dockerImage.imageDigest) - } else { - submitJobRequest = submitJobRequest.withDockerImageVersion(dockerImage.imageVersion) - } + configureAppDefaultSecurityGroup(description) - task.updateStatus BASE_PHASE, "Resolving Security Groups... ${System.currentTimeMillis()}" - - Set securityGroups = [] - description.securityGroups?.each { providedSecurityGroup -> - task.updateStatus BASE_PHASE, "Resolving Security Group ${providedSecurityGroup}... ${System.currentTimeMillis()}" - if (awsLookupUtil.securityGroupIdExists(account, region, providedSecurityGroup)) { - securityGroups << providedSecurityGroup - } else { - task.updateStatus BASE_PHASE, "Resolving Security Group name ${providedSecurityGroup}... ${System.currentTimeMillis()}" - String convertedSecurityGroup = awsLookupUtil.convertSecurityGroupNameToId(account, region, providedSecurityGroup) - if (!convertedSecurityGroup) { - throw new RuntimeException("Security Group ${providedSecurityGroup} cannot be found") - } - securityGroups << convertedSecurityGroup - } - } + SubmitJobRequest submitJobRequest = buildBaseSubmitJobRequest(description, dockerImage) - task.updateStatus BASE_PHASE, "Finished resolving Security Groups... ${System.currentTimeMillis()}" + Set securityGroups = resolveSecurityGroups(description, account, region) if (description.jobType == 'service' && deployDefaults.addAppGroupToServerGroup && securityGroups.size() < deployDefaults.maxSecurityGroups && description.useApplicationDefaultSecurityGroup != false) { String applicationSecurityGroup = awsLookupUtil.convertSecurityGroupNameToId(account, region, description.application) @@ -294,36 +159,12 @@ class TitusDeployHandler implements DeployHandler { } } - if (description.hardConstraints) { - description.hardConstraints.each { constraint -> - submitJobRequest.withConstraint(SubmitJobRequest.Constraint.hard(constraint)) - } - } - - if (description.softConstraints) { - description.softConstraints.each { constraint -> - submitJobRequest.withConstraint(SubmitJobRequest.Constraint.soft(constraint)) - } - } - - if (description.getJobType() == "service" && !description.hardConstraints?.contains(SubmitJobRequest.Constraint.ZONE_BALANCE) && !description.softConstraints?.contains(SubmitJobRequest.Constraint.ZONE_BALANCE)) { - submitJobRequest.withConstraint(SubmitJobRequest.Constraint.soft(SubmitJobRequest.Constraint.ZONE_BALANCE)) - } - if (!securityGroups.empty) { submitJobRequest.withSecurityGroups(securityGroups.asList()) } task.updateStatus BASE_PHASE, "Setting user email... ${System.currentTimeMillis()}" - Map front50Application - - try { - front50Application = front50Service.getApplication(description.getApplication()) - } catch (Exception e) { - log.error('Failed to load front50 application attributes for {}', description.getApplication()) - } - if (front50Application && front50Application['email']) { submitJobRequest.withUser(front50Application['email']) } else { @@ -332,13 +173,9 @@ class TitusDeployHandler implements DeployHandler { } } - if (description.jobType) { - submitJobRequest.withJobType(description.jobType) - } - task.updateStatus BASE_PHASE, "Resolving target groups... ${System.currentTimeMillis()}" - TargetGroupLookupResult targetGroupLookupResult + TargetGroupLookupResult targetGroupLookupResult = null if (description.targetGroups) { targetGroupLookupResult = validateLoadBalancers(description) @@ -420,18 +257,198 @@ class TitusDeployHandler implements DeployHandler { } } - private void configureDisruptionBudget(TitusDeployDescription description, Job sourceJob) { + private void configureAppDefaultSecurityGroup(TitusDeployDescription description) { + if (description.labels.containsKey(USE_APPLICATION_DEFAULT_SG_LABEL)) { + if (description.labels.get(USE_APPLICATION_DEFAULT_SG_LABEL) == "false") { + description.useApplicationDefaultSecurityGroup = false + } else { + description.useApplicationDefaultSecurityGroup = true + } + } + + if (description.useApplicationDefaultSecurityGroup == false) { + description.labels.put(USE_APPLICATION_DEFAULT_SG_LABEL, "false") + } else { + if (description.labels.containsKey(USE_APPLICATION_DEFAULT_SG_LABEL)) { + description.labels.remove(USE_APPLICATION_DEFAULT_SG_LABEL) + } + } + } + + private SubmitJobRequest buildBaseSubmitJobRequest(TitusDeployDescription description, DockerImage dockerImage) { + SubmitJobRequest submitJobRequest = new SubmitJobRequest() + .withApplication(description.application) + .withDockerImageName(dockerImage.imageName) + .withInstancesMin(description.capacity.min) + .withInstancesMax(description.capacity.max) + .withInstancesDesired(description.capacity.desired) + .withCpu(description.resources.cpu) + .withMemory(description.resources.memory) + .withDisk(description.resources.disk) + .withRetries(description.retries) + .withRuntimeLimitSecs(description.runtimeLimitSecs) + .withGpu(description.resources.gpu) + .withNetworkMbps(description.resources.networkMbps) + .withEfs(description.efs) + .withPorts(description.resources.ports) + .withEnv(description.env) + .withAllocateIpAddress(description.resources.allocateIpAddress) + .withStack(description.stack) + .withDetail(description.freeFormDetails) + .withEntryPoint(description.entryPoint) + .withIamProfile(description.iamProfile) + .withCapacityGroup(description.capacityGroup) + .withLabels(description.labels) + .withInService(description.inService) + .withMigrationPolicy(description.migrationPolicy) + .withCredentials(description.credentials.name) + .withContainerAttributes(description.containerAttributes.collectEntries { + [(it.key): it.value?.toString()] + }) + .withDisruptionBudget(description.disruptionBudget) + + if (dockerImage.imageDigest != null) { + submitJobRequest = submitJobRequest.withDockerDigest(dockerImage.imageDigest) + } else { + submitJobRequest = submitJobRequest.withDockerImageVersion(dockerImage.imageVersion) + } + + if (description.hardConstraints) { + description.hardConstraints.each { constraint -> + submitJobRequest.withConstraint(SubmitJobRequest.Constraint.hard(constraint)) + } + } + + if (description.softConstraints) { + description.softConstraints.each { constraint -> + submitJobRequest.withConstraint(SubmitJobRequest.Constraint.soft(constraint)) + } + } + + if (description.jobType == "service" && !description.hardConstraints?.contains(SubmitJobRequest.Constraint.ZONE_BALANCE) && !description.softConstraints?.contains(SubmitJobRequest.Constraint.ZONE_BALANCE)) { + submitJobRequest.withConstraint(SubmitJobRequest.Constraint.soft(SubmitJobRequest.Constraint.ZONE_BALANCE)) + } + + if (description.jobType) { + submitJobRequest.withJobType(description.jobType) + } + + return submitJobRequest + } + + private Set resolveSecurityGroups(TitusDeployDescription description, String account, String region) { + task.updateStatus BASE_PHASE, "Resolving Security Groups... ${System.currentTimeMillis()}" + + Set securityGroups = [] + description.securityGroups?.each { providedSecurityGroup -> + task.updateStatus BASE_PHASE, "Resolving Security Group ${providedSecurityGroup}... ${System.currentTimeMillis()}" + if (awsLookupUtil.securityGroupIdExists(account, region, providedSecurityGroup)) { + securityGroups << providedSecurityGroup + } else { + task.updateStatus BASE_PHASE, "Resolving Security Group name ${providedSecurityGroup}... ${System.currentTimeMillis()}" + String convertedSecurityGroup = awsLookupUtil.convertSecurityGroupNameToId(account, region, providedSecurityGroup) + if (!convertedSecurityGroup) { + throw new RuntimeException("Security Group ${providedSecurityGroup} cannot be found") + } + securityGroups << convertedSecurityGroup + } + } + + task.updateStatus BASE_PHASE, "Finished resolving Security Groups... ${System.currentTimeMillis()}" + return securityGroups + } + + private void mergeSourceDetailsIntoDescription(TitusDeployDescription description, Map front50Application) { + // If cluster name info was not provided, use the fields from the source asg + def sourceName = Names.parseName(description.source.asgName) + description.application = description.application != null ? description.application : sourceName.app + description.stack = description.stack != null ? description.stack : sourceName.stack + description.freeFormDetails = description.freeFormDetails != null ? description.freeFormDetails : sourceName.detail + + Source source = description.source + + TitusClient sourceClient = buildSourceTitusClient(source) + if (!sourceClient) { + throw new RuntimeException("Unable to locate source (${source.account}:${source.region}:${source.asgName})") + } + Job sourceJob = sourceClient.findJobByName(source.asgName) + if (!sourceJob) { + throw new RuntimeException("Unable to locate source (${source.account}:${source.region}:${source.asgName})") + } + + task.updateStatus BASE_PHASE, "Copying deployment details from (${source.account}:${source.region}:${source.asgName})" + + description.securityGroups = description.securityGroups ?: sourceJob.securityGroups + description.imageId = description.imageId ?: (sourceJob.applicationName + ":" + (sourceJob.version ?: sourceJob.digest)) + + if (description.source.useSourceCapacity) { + description.capacity.min = sourceJob.instancesMin + description.capacity.max = sourceJob.instancesMax + description.capacity.desired = sourceJob.instancesDesired + } + + description.resources.cpu = description.resources.cpu ?: sourceJob.cpu + description.resources.memory = description.resources.memory ?: sourceJob.memory + description.resources.disk = description.resources.disk ?: sourceJob.disk + description.retries = description.retries ?: sourceJob.retries + description.runtimeLimitSecs = description.runtimeLimitSecs ?: sourceJob.runtimeLimitSecs + description.resources.gpu = description.resources.gpu ?: sourceJob.gpu + description.resources.networkMbps = description.resources.networkMbps ?: sourceJob.networkMbps + description.efs = description.efs ?: sourceJob.efs + description.resources.allocateIpAddress = description.resources.allocateIpAddress ?: sourceJob.allocateIpAddress + description.entryPoint = description.entryPoint ?: sourceJob.entryPoint + description.iamProfile = description.iamProfile ?: sourceJob.iamProfile + description.capacityGroup = description.capacityGroup ?: sourceJob.capacityGroup + + if (description.labels.isEmpty()) { + sourceJob.labels.each { k, v -> description.labels.put(k, v) } + } + + if (description.env.isEmpty()) { + sourceJob.environment.each { k, v -> description.env.put(k, v) } + } + + if (description.containerAttributes.isEmpty()) { + sourceJob.containerAttributes.each { k, v -> description.containerAttributes.put(k, v) } + } + if (description.inService == null) { + description.inService = sourceJob.inService + } + configureDisruptionBudget(description, sourceJob, front50Application) + description.jobType = description.jobType ?: "service" + if (!description.hardConstraints) description.hardConstraints = [] + if (!description.softConstraints) description.softConstraints = [] + if (description.softConstraints.empty && sourceJob.softConstraints) { + sourceJob.softConstraints.each { + if (!description.hardConstraints.contains(it)) { + description.softConstraints.add(it) + } + } + } + if (description.hardConstraints.empty && sourceJob.hardConstraints) { + sourceJob.hardConstraints.each { + if (!description.softConstraints.contains(it)) { + description.hardConstraints.add(it) + } + } + } + if (sourceJob.labels?.get(USE_APPLICATION_DEFAULT_SG_LABEL) == "false") { + description.useApplicationDefaultSecurityGroup = false + } + } + + private void configureDisruptionBudget(TitusDeployDescription description, Job sourceJob, Map application) { if (description.disruptionBudget == null) { //migrationPolicy should only be used when the disruptionBudget has not been specified description.migrationPolicy = description.migrationPolicy ?: sourceJob?.migrationPolicy } // "systemDefault" should be treated as "no migrationPolicy" if (description.disruptionBudget == null && (description.migrationPolicy == null || "systemDefault" == description.migrationPolicy.type)) { - description.disruptionBudget = getDefaultDisruptionBudget() + description.disruptionBudget = getDefaultDisruptionBudget(application) } } - private DisruptionBudget getDefaultDisruptionBudget() { + private DisruptionBudget getDefaultDisruptionBudget(Map application) { DisruptionBudget budget = new DisruptionBudget() budget.availabilityPercentageLimit = new AvailabilityPercentageLimit(95) budget.ratePercentagePerInterval = new RatePercentagePerInterval(60000, 5) @@ -442,7 +459,9 @@ class TitusDeployHandler implements DeployHandler { "PST" ) ] - budget.containerHealthProviders = [ new ContainerHealthProvider("eureka") ] + if (application && application['platformHealthOnly']) { + budget.containerHealthProviders = [new ContainerHealthProvider("eureka")] + } return budget } From 54b94cb063218241d6f508b1f917373f52e60b92 Mon Sep 17 00:00:00 2001 From: Ethan Rogers Date: Fri, 10 May 2019 08:27:38 -0400 Subject: [PATCH 08/11] refactor(runJob): v2 job provider tests (#3651) --- .../view/KubernetesV2JobProviderSpec.groovy | 73 +++++++++++++++++++ ...rTest.groovy => PropertyParserSpec.groovy} | 2 +- 2 files changed, 74 insertions(+), 1 deletion(-) create mode 100644 clouddriver-kubernetes/src/test/groovy/com/netflix/spinnaker/clouddriver/kubernetes/v2/provider/view/KubernetesV2JobProviderSpec.groovy rename clouddriver-kubernetes/src/test/groovy/com/netflix/spinnaker/clouddriver/kubernetes/v2/provider/view/{PropertyParserTest.groovy => PropertyParserSpec.groovy} (98%) diff --git a/clouddriver-kubernetes/src/test/groovy/com/netflix/spinnaker/clouddriver/kubernetes/v2/provider/view/KubernetesV2JobProviderSpec.groovy b/clouddriver-kubernetes/src/test/groovy/com/netflix/spinnaker/clouddriver/kubernetes/v2/provider/view/KubernetesV2JobProviderSpec.groovy new file mode 100644 index 00000000000..92f70963a1f --- /dev/null +++ b/clouddriver-kubernetes/src/test/groovy/com/netflix/spinnaker/clouddriver/kubernetes/v2/provider/view/KubernetesV2JobProviderSpec.groovy @@ -0,0 +1,73 @@ +/* + * Copyright 2019 Netflix, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License") + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.netflix.spinnaker.clouddriver.kubernetes.v2.provider.view + +import com.netflix.spinnaker.clouddriver.kubernetes.v2.caching.view.model.KubernetesV2Manifest +import com.netflix.spinnaker.clouddriver.kubernetes.v2.caching.view.provider.KubernetesV2ManifestProvider +import com.netflix.spinnaker.clouddriver.kubernetes.v2.description.manifest.KubernetesManifest +import com.netflix.spinnaker.clouddriver.kubernetes.v2.security.KubernetesV2Credentials +import com.netflix.spinnaker.clouddriver.security.AccountCredentials +import com.netflix.spinnaker.clouddriver.security.AccountCredentialsProvider +import spock.lang.Specification + +class KubernetesV2JobProviderSpec extends Specification { + + def "getFileContents return a map with properties"() { + given: + def mockCredentials = Mock(KubernetesV2Credentials) { + jobLogs(*_) >> logs + } + + def mockAccountCredentialsProvider = Mock(AccountCredentialsProvider) { + getCredentials(*_) >> Mock(AccountCredentials) { + getCredentials(*_) >> mockCredentials + } + } + + def testManifest = new KubernetesManifest() + testManifest.putAll([ + apiVersion: 'batch/v1', + kind: 'Job', + metadata: [ + name: 'a', + namespace: 'b', + ] + ]) + + def mockManifestProvider = Mock(KubernetesV2ManifestProvider) { + getManifest(*_) >> new KubernetesV2Manifest( + account: 'a', + name: 'a', + manifest: testManifest, + ) + } + + when: + def provider = new KubernetesV2JobProvider(mockAccountCredentialsProvider, [mockManifestProvider]) + def logResult = provider.getFileContents("a", "b", "c", "d") + + then: + logResult == result + + where: + logs | result + "SPINNAKER_PROPERTY_a=b" | [a: 'b'] + "Spinnaker_Property_a=b" | [:] + 'SPINNAKER_CONFIG_JSON={"a": "b"}' | [a: 'b'] + 'SPINNAKER_CONFIG_JSON={"a": "b}' | null + } +} diff --git a/clouddriver-kubernetes/src/test/groovy/com/netflix/spinnaker/clouddriver/kubernetes/v2/provider/view/PropertyParserTest.groovy b/clouddriver-kubernetes/src/test/groovy/com/netflix/spinnaker/clouddriver/kubernetes/v2/provider/view/PropertyParserSpec.groovy similarity index 98% rename from clouddriver-kubernetes/src/test/groovy/com/netflix/spinnaker/clouddriver/kubernetes/v2/provider/view/PropertyParserTest.groovy rename to clouddriver-kubernetes/src/test/groovy/com/netflix/spinnaker/clouddriver/kubernetes/v2/provider/view/PropertyParserSpec.groovy index 7da89d159a0..9ec409d1409 100644 --- a/clouddriver-kubernetes/src/test/groovy/com/netflix/spinnaker/clouddriver/kubernetes/v2/provider/view/PropertyParserTest.groovy +++ b/clouddriver-kubernetes/src/test/groovy/com/netflix/spinnaker/clouddriver/kubernetes/v2/provider/view/PropertyParserSpec.groovy @@ -19,7 +19,7 @@ package com.netflix.spinnaker.clouddriver.kubernetes.v2.provider.view import com.fasterxml.jackson.core.JsonParseException import spock.lang.Specification -class PropertyParserTest extends Specification { +class PropertyParserSpec extends Specification { def "ExtractPropertiesFromLog"() { String buildLog = "[Thread 0] Uploading artifact: https://foo.host/artifactory/debian-local/some/nice/path/some-package_0.0.7_amd64.deb;deb.distribution=trusty;deb.component=main;deb.architecture=amd64\n" + "[Thread 0] Artifactory response: 201 Created" From 01d4b27b19c511411a3baf034a221520a89e1230 Mon Sep 17 00:00:00 2001 From: Eric Zimanyi Date: Fri, 10 May 2019 11:23:13 -0400 Subject: [PATCH 09/11] test(gce): Fix GCE upsert image tags test (#3657) Some of the upgrades that came with boot2 made these tests have invalid syntax, so they were commented out to unblock the upgrade. Fixing the tests now here. --- .../UpsertGoogleImageTagsAtomicOperationUnitSpec.groovy | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/clouddriver-google/src/test/groovy/com/netflix/spinnaker/clouddriver/google/deploy/ops/UpsertGoogleImageTagsAtomicOperationUnitSpec.groovy b/clouddriver-google/src/test/groovy/com/netflix/spinnaker/clouddriver/google/deploy/ops/UpsertGoogleImageTagsAtomicOperationUnitSpec.groovy index 60647079350..1ea51eb8b58 100644 --- a/clouddriver-google/src/test/groovy/com/netflix/spinnaker/clouddriver/google/deploy/ops/UpsertGoogleImageTagsAtomicOperationUnitSpec.groovy +++ b/clouddriver-google/src/test/groovy/com/netflix/spinnaker/clouddriver/google/deploy/ops/UpsertGoogleImageTagsAtomicOperationUnitSpec.groovy @@ -117,9 +117,8 @@ class UpsertGoogleImageTagsAtomicOperationUnitSpec extends Specification impleme } then: - 1 * imagesMock.setLabels(_, _, _) >> setLabelsMock + 1 * imagesMock.setLabels(PROJECT_NAME, IMAGE_NAME, {it.labels == TAGS }) >> setLabelsMock 1 * setLabelsMock.execute() -// globalSetLabelsRequest.labels == TAGS } void "should add to labels on image with existing labels"() { @@ -188,9 +187,8 @@ class UpsertGoogleImageTagsAtomicOperationUnitSpec extends Specification impleme } then: - 1 * imagesMock.setLabels(_, _, _) >> setLabelsMock - 1 * setLabelsMock.execute() -// globalSetLabelsRequest.labels == LABELS + TAGS + 1 * imagesMock.setLabels(PROJECT_NAME, IMAGE_NAME, {it.labels == LABELS + TAGS }) >> setLabelsMock + 1 * setLabelsMock.execute() } void "should fail to create instance because image is invalid"() { From a25c63dc16cfe95edc342b79191b4459fc0342f8 Mon Sep 17 00:00:00 2001 From: Clay McCoy Date: Fri, 10 May 2019 11:30:14 -0500 Subject: [PATCH 10/11] fix(core): Spring does not override default configuration files (#3656) In the Spring Boot 2 upgrade, spring.config.location overrides all other config locations. The equivalent property is now called spring.config.additional-location. This fix allows the app the to run without additional config files. --- clouddriver-web/clouddriver-web.gradle | 4 ++-- .../main/groovy/com/netflix/spinnaker/clouddriver/Main.groovy | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/clouddriver-web/clouddriver-web.gradle b/clouddriver-web/clouddriver-web.gradle index ba4861001d1..e8a99b33915 100644 --- a/clouddriver-web/clouddriver-web.gradle +++ b/clouddriver-web/clouddriver-web.gradle @@ -6,12 +6,12 @@ if (gradle.includedCloudProviderProjects.contains(':clouddriver-oracle')) { } ext { - springConfigLocation = System.getProperty('spring.config.location', "${System.getProperty('user.home')}/.spinnaker/") + springConfigLocation = System.getProperty('spring.config.additional-location', "${System.getProperty('user.home')}/.spinnaker/") } mainClassName = 'com.netflix.spinnaker.clouddriver.Main' run { - systemProperty('spring.config.location', project.springConfigLocation) + systemProperty('spring.config.additional-location', project.springConfigLocation) } configurations.all { diff --git a/clouddriver-web/src/main/groovy/com/netflix/spinnaker/clouddriver/Main.groovy b/clouddriver-web/src/main/groovy/com/netflix/spinnaker/clouddriver/Main.groovy index b6ad42a6c93..571355712b4 100644 --- a/clouddriver-web/src/main/groovy/com/netflix/spinnaker/clouddriver/Main.groovy +++ b/clouddriver-web/src/main/groovy/com/netflix/spinnaker/clouddriver/Main.groovy @@ -64,7 +64,7 @@ class Main extends SpringBootServletInitializer { 'netflix.environment' : 'test', 'netflix.account' : '${netflix.environment}', 'netflix.stack' : 'test', - 'spring.config.location' : '${user.home}/.spinnaker/', + 'spring.config.additional-location' : '${user.home}/.spinnaker/', 'spring.application.name': 'clouddriver', 'spring.config.name' : 'spinnaker,${spring.application.name}', 'spring.profiles.active' : '${netflix.environment},local' From 43e42fb2d3cdf88c2b3618bed341149358bce381 Mon Sep 17 00:00:00 2001 From: Clay McCoy Date: Fri, 10 May 2019 15:00:31 -0500 Subject: [PATCH 11/11] fix(cf): add ci build info under build info (#3655) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit It can sit under here with the droplet build info. It isn’t ideal because it is not typed or shared more widely than CF. but it tags along for the ride everywhere that buildinfo goes. --- .../cloudfoundry/model/CloudFoundryServerGroup.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/clouddriver-cloudfoundry/src/main/java/com/netflix/spinnaker/clouddriver/cloudfoundry/model/CloudFoundryServerGroup.java b/clouddriver-cloudfoundry/src/main/java/com/netflix/spinnaker/clouddriver/cloudfoundry/model/CloudFoundryServerGroup.java index 4f0ccf74559..a9e080ea213 100644 --- a/clouddriver-cloudfoundry/src/main/java/com/netflix/spinnaker/clouddriver/cloudfoundry/model/CloudFoundryServerGroup.java +++ b/clouddriver-cloudfoundry/src/main/java/com/netflix/spinnaker/clouddriver/cloudfoundry/model/CloudFoundryServerGroup.java @@ -168,7 +168,8 @@ public Map getBuildInfo() { "metricsUri", metricsUri, "droplet", droplet, "id", id, - "serviceInstances", serviceInstances) + "serviceInstances", serviceInstances, + "ciBuild", ciBuild) .toJavaMap(); }