Skip to content

Commit

Permalink
feat(ecs): Make ECS agents implement AccountAware (#5044)
Browse files Browse the repository at this point in the history
Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
  • Loading branch information
nabuskey and mergify[bot] committed Oct 27, 2020
1 parent 8bdc9eb commit c9aa633
Show file tree
Hide file tree
Showing 13 changed files with 60 additions and 77 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
import com.amazonaws.services.ecs.model.ListClustersRequest;
import com.amazonaws.services.ecs.model.ListClustersResult;
import com.google.common.base.CaseFormat;
import com.netflix.spinnaker.cats.agent.AccountAware;
import com.netflix.spinnaker.cats.agent.AgentDataType;
import com.netflix.spinnaker.cats.agent.CacheResult;
import com.netflix.spinnaker.cats.agent.CachingAgent;
Expand All @@ -45,7 +46,7 @@
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

abstract class AbstractEcsCachingAgent<T> implements CachingAgent {
abstract class AbstractEcsCachingAgent<T> implements CachingAgent, AccountAware {
private final Logger log = LoggerFactory.getLogger(getClass());

final AmazonClientProvider amazonClientProvider;
Expand Down Expand Up @@ -228,4 +229,13 @@ protected Map<String, Collection<String>> addExtraEvictions(
Map<String, Collection<String>> evictions) {
return evictions;
}
/**
* Returns the account name with which this agent is associated.
*
* @return The name of the account this agent handles.
*/
@Override
public String getAccountName() {
return accountName;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -19,11 +19,11 @@
import static com.netflix.spinnaker.cats.agent.AgentDataType.Authority.AUTHORITATIVE;
import static com.netflix.spinnaker.clouddriver.ecs.cache.Keys.Namespace.ALARMS;

import com.amazonaws.auth.AWSCredentialsProvider;
import com.amazonaws.services.cloudwatch.AmazonCloudWatch;
import com.amazonaws.services.cloudwatch.model.DescribeAlarmsRequest;
import com.amazonaws.services.cloudwatch.model.DescribeAlarmsResult;
import com.amazonaws.services.cloudwatch.model.MetricAlarm;
import com.netflix.spinnaker.cats.agent.AccountAware;
import com.netflix.spinnaker.cats.agent.AgentDataType;
import com.netflix.spinnaker.cats.agent.CacheResult;
import com.netflix.spinnaker.cats.agent.CachingAgent;
Expand All @@ -46,27 +46,22 @@
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class EcsCloudMetricAlarmCachingAgent implements CachingAgent {
public class EcsCloudMetricAlarmCachingAgent implements CachingAgent, AccountAware {
static final Collection<AgentDataType> types =
Collections.unmodifiableCollection(Arrays.asList(AUTHORITATIVE.forType(ALARMS.toString())));

private final Logger log = LoggerFactory.getLogger(getClass());
private AmazonClientProvider amazonClientProvider;
private AWSCredentialsProvider awsCredentialsProvider;
private NetflixAmazonCredentials account;
private String accountName;
private String region;

public EcsCloudMetricAlarmCachingAgent(
NetflixAmazonCredentials account,
String region,
AmazonClientProvider amazonClientProvider,
AWSCredentialsProvider awsCredentialsProvider) {
NetflixAmazonCredentials account, String region, AmazonClientProvider amazonClientProvider) {
this.region = region;
this.account = account;
this.accountName = account.getName();
this.amazonClientProvider = amazonClientProvider;
this.awsCredentialsProvider = awsCredentialsProvider;
}

public static Map<String, Object> convertMetricAlarmToAttributes(
Expand Down Expand Up @@ -170,4 +165,9 @@ public String getAgentType() {
public String getProviderName() {
return EcsProvider.NAME;
}

@Override
public String getAccountName() {
return accountName;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -19,12 +19,12 @@
import static com.netflix.spinnaker.cats.agent.AgentDataType.Authority.AUTHORITATIVE;
import static com.netflix.spinnaker.clouddriver.ecs.cache.Keys.Namespace.IAM_ROLE;

import com.amazonaws.auth.AWSCredentialsProvider;
import com.amazonaws.regions.Regions;
import com.amazonaws.services.identitymanagement.AmazonIdentityManagement;
import com.amazonaws.services.identitymanagement.model.ListRolesRequest;
import com.amazonaws.services.identitymanagement.model.ListRolesResult;
import com.amazonaws.services.identitymanagement.model.Role;
import com.netflix.spinnaker.cats.agent.AccountAware;
import com.netflix.spinnaker.cats.agent.AgentDataType;
import com.netflix.spinnaker.cats.agent.CacheResult;
import com.netflix.spinnaker.cats.agent.CachingAgent;
Expand All @@ -50,26 +50,23 @@
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class IamRoleCachingAgent implements CachingAgent {
public class IamRoleCachingAgent implements CachingAgent, AccountAware {

static final Collection<AgentDataType> types =
Collections.unmodifiableCollection(Arrays.asList(AUTHORITATIVE.forType(IAM_ROLE.toString())));
private final Logger log = LoggerFactory.getLogger(getClass());
private AmazonClientProvider amazonClientProvider;
private AWSCredentialsProvider awsCredentialsProvider;
private NetflixAmazonCredentials account;
private String accountName;
private IamPolicyReader iamPolicyReader;

public IamRoleCachingAgent(
NetflixAmazonCredentials account,
AmazonClientProvider amazonClientProvider,
AWSCredentialsProvider awsCredentialsProvider,
IamPolicyReader iamPolicyReader) {
this.account = account;
this.accountName = account.getName();
this.amazonClientProvider = amazonClientProvider;
this.awsCredentialsProvider = awsCredentialsProvider;
this.iamPolicyReader = iamPolicyReader;
}

Expand Down Expand Up @@ -217,4 +214,9 @@ public String getProviderName() {
public Collection<AgentDataType> getProvidedDataTypes() {
return types;
}

@Override
public String getAccountName() {
return accountName;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -19,13 +19,13 @@
import static com.netflix.spinnaker.cats.agent.AgentDataType.Authority.AUTHORITATIVE;
import static com.netflix.spinnaker.clouddriver.ecs.cache.Keys.Namespace.SCALABLE_TARGETS;

import com.amazonaws.auth.AWSCredentialsProvider;
import com.amazonaws.services.applicationautoscaling.AWSApplicationAutoScaling;
import com.amazonaws.services.applicationautoscaling.model.DescribeScalableTargetsRequest;
import com.amazonaws.services.applicationautoscaling.model.DescribeScalableTargetsResult;
import com.amazonaws.services.applicationautoscaling.model.ScalableTarget;
import com.amazonaws.services.applicationautoscaling.model.ServiceNamespace;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.netflix.spinnaker.cats.agent.AccountAware;
import com.netflix.spinnaker.cats.agent.AgentDataType;
import com.netflix.spinnaker.cats.agent.CacheResult;
import com.netflix.spinnaker.cats.agent.CachingAgent;
Expand All @@ -48,15 +48,14 @@
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class ScalableTargetsCachingAgent implements CachingAgent {
public class ScalableTargetsCachingAgent implements CachingAgent, AccountAware {
static final Collection<AgentDataType> types =
Collections.unmodifiableCollection(
Arrays.asList(AUTHORITATIVE.forType(SCALABLE_TARGETS.toString())));

private final Logger log = LoggerFactory.getLogger(getClass());
private final ObjectMapper objectMapper;
private AmazonClientProvider amazonClientProvider;
private AWSCredentialsProvider awsCredentialsProvider;
private NetflixAmazonCredentials account;
private String accountName;
private String region;
Expand All @@ -65,13 +64,11 @@ public ScalableTargetsCachingAgent(
NetflixAmazonCredentials account,
String region,
AmazonClientProvider amazonClientProvider,
AWSCredentialsProvider awsCredentialsProvider,
ObjectMapper objectMapper) {
this.region = region;
this.account = account;
this.accountName = account.getName();
this.amazonClientProvider = amazonClientProvider;
this.awsCredentialsProvider = awsCredentialsProvider;
this.objectMapper = objectMapper;
}

Expand Down Expand Up @@ -169,4 +166,9 @@ public String getAgentType() {
public String getProviderName() {
return EcsProvider.NAME;
}

@Override
public String getAccountName() {
return accountName;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,12 +18,11 @@
import static com.netflix.spinnaker.cats.agent.AgentDataType.Authority.AUTHORITATIVE;
import static com.netflix.spinnaker.clouddriver.ecs.cache.Keys.Namespace.SECRETS;

import com.amazonaws.auth.AWSCredentialsProvider;
import com.amazonaws.services.secretsmanager.AWSSecretsManager;
import com.amazonaws.services.secretsmanager.model.ListSecretsRequest;
import com.amazonaws.services.secretsmanager.model.ListSecretsResult;
import com.amazonaws.services.secretsmanager.model.SecretListEntry;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.netflix.spinnaker.cats.agent.AccountAware;
import com.netflix.spinnaker.cats.agent.AgentDataType;
import com.netflix.spinnaker.cats.agent.CacheResult;
import com.netflix.spinnaker.cats.agent.CachingAgent;
Expand All @@ -40,30 +39,22 @@
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class SecretCachingAgent implements CachingAgent {
public class SecretCachingAgent implements CachingAgent, AccountAware {
static final Collection<AgentDataType> types =
Collections.unmodifiableCollection(Arrays.asList(AUTHORITATIVE.forType(SECRETS.toString())));

private final Logger log = LoggerFactory.getLogger(getClass());
private final ObjectMapper objectMapper;
private AmazonClientProvider amazonClientProvider;
private AWSCredentialsProvider awsCredentialsProvider;
private NetflixAmazonCredentials account;
private String accountName;
private String region;

public SecretCachingAgent(
NetflixAmazonCredentials account,
String region,
AmazonClientProvider amazonClientProvider,
AWSCredentialsProvider awsCredentialsProvider,
ObjectMapper objectMapper) {
NetflixAmazonCredentials account, String region, AmazonClientProvider amazonClientProvider) {
this.region = region;
this.account = account;
this.accountName = account.getName();
this.amazonClientProvider = amazonClientProvider;
this.awsCredentialsProvider = awsCredentialsProvider;
this.objectMapper = objectMapper;
}

public static Map<String, Object> convertSecretToAttributes(
Expand Down Expand Up @@ -164,4 +155,9 @@ public String getAgentType() {
public String getProviderName() {
return EcsProvider.NAME;
}

@Override
public String getAccountName() {
return accountName;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,12 +18,11 @@
import static com.netflix.spinnaker.cats.agent.AgentDataType.Authority.AUTHORITATIVE;
import static com.netflix.spinnaker.clouddriver.ecs.cache.Keys.Namespace.SERVICE_DISCOVERY_REGISTRIES;

import com.amazonaws.auth.AWSCredentialsProvider;
import com.amazonaws.services.servicediscovery.AWSServiceDiscovery;
import com.amazonaws.services.servicediscovery.model.ListServicesRequest;
import com.amazonaws.services.servicediscovery.model.ListServicesResult;
import com.amazonaws.services.servicediscovery.model.ServiceSummary;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.netflix.spinnaker.cats.agent.AccountAware;
import com.netflix.spinnaker.cats.agent.AgentDataType;
import com.netflix.spinnaker.cats.agent.CacheResult;
import com.netflix.spinnaker.cats.agent.CachingAgent;
Expand All @@ -40,31 +39,23 @@
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class ServiceDiscoveryCachingAgent implements CachingAgent {
public class ServiceDiscoveryCachingAgent implements CachingAgent, AccountAware {
static final Collection<AgentDataType> types =
Collections.unmodifiableCollection(
Arrays.asList(AUTHORITATIVE.forType(SERVICE_DISCOVERY_REGISTRIES.toString())));

private final Logger log = LoggerFactory.getLogger(getClass());
private final ObjectMapper objectMapper;
private AmazonClientProvider amazonClientProvider;
private AWSCredentialsProvider awsCredentialsProvider;
private NetflixAmazonCredentials account;
private String accountName;
private String region;

public ServiceDiscoveryCachingAgent(
NetflixAmazonCredentials account,
String region,
AmazonClientProvider amazonClientProvider,
AWSCredentialsProvider awsCredentialsProvider,
ObjectMapper objectMapper) {
NetflixAmazonCredentials account, String region, AmazonClientProvider amazonClientProvider) {
this.region = region;
this.account = account;
this.accountName = account.getName();
this.amazonClientProvider = amazonClientProvider;
this.awsCredentialsProvider = awsCredentialsProvider;
this.objectMapper = objectMapper;
}

public static Map<String, Object> convertServiceToAttributes(
Expand Down Expand Up @@ -166,4 +157,9 @@ public String getAgentType() {
public String getProviderName() {
return EcsProvider.NAME;
}

@Override
public String getAccountName() {
return accountName;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,6 @@ private void synchronizeEcsProvider(
new IamRoleCachingAgent(
credentials,
amazonClientProvider,
awsCredentialsProvider,
iamPolicyReader)); // IAM is region-agnostic, so one caching agent per account is
// enough

Expand Down Expand Up @@ -137,28 +136,15 @@ private void synchronizeEcsProvider(
objectMapper));
newAgents.add(
new EcsCloudMetricAlarmCachingAgent(
credentials, region.getName(), amazonClientProvider, awsCredentialsProvider));
credentials, region.getName(), amazonClientProvider));
newAgents.add(
new ScalableTargetsCachingAgent(
credentials,
region.getName(),
amazonClientProvider,
awsCredentialsProvider,
objectMapper));
credentials, region.getName(), amazonClientProvider, objectMapper));
newAgents.add(
new SecretCachingAgent(
credentials,
region.getName(),
amazonClientProvider,
awsCredentialsProvider,
objectMapper));
new SecretCachingAgent(credentials, region.getName(), amazonClientProvider));
newAgents.add(
new ServiceDiscoveryCachingAgent(
credentials,
region.getName(),
amazonClientProvider,
awsCredentialsProvider,
objectMapper));
credentials, region.getName(), amazonClientProvider));
newAgents.add(
new TargetHealthCachingAgent(
credentials,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@ import com.amazonaws.services.cloudwatch.AmazonCloudWatch
import com.amazonaws.services.cloudwatch.model.DescribeAlarmsResult
import com.netflix.spinnaker.cats.provider.ProviderCache
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 com.netflix.spinnaker.clouddriver.ecs.cache.model.EcsMetricAlarm
import spock.lang.Shared
Expand All @@ -39,7 +38,7 @@ class EcsCloudMetricAlarmCachingAgentSpec extends Specification {
AWSCredentialsProvider credentialsProvider

@Subject
EcsCloudMetricAlarmCachingAgent agent = new EcsCloudMetricAlarmCachingAgent(CommonCachingAgent.netflixAmazonCredentials, REGION, clientProvider, credentialsProvider)
EcsCloudMetricAlarmCachingAgent agent = new EcsCloudMetricAlarmCachingAgent(CommonCachingAgent.netflixAmazonCredentials, REGION, clientProvider)

def setup() {
cloudWatch = Mock(AmazonCloudWatch)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ class ScalableTargetCachingAgentSpec extends Specification {
.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)

@Subject
ScalableTargetsCachingAgent agent = new ScalableTargetsCachingAgent(CommonCachingAgent.netflixAmazonCredentials, 'us-west-1', clientProvider, credentialsProvider, objectMapper)
ScalableTargetsCachingAgent agent = new ScalableTargetsCachingAgent(CommonCachingAgent.netflixAmazonCredentials, 'us-west-1', clientProvider, objectMapper)

def 'should get a list of cloud watch alarms'() {
given:
Expand Down
Loading

0 comments on commit c9aa633

Please sign in to comment.