Skip to content

Commit

Permalink
fix(events): Add dynamic config service to send events (#724)
Browse files Browse the repository at this point in the history
It's not currently possible to start/stop `igor` from sending events of completed builds/newly published images to `echo`.
It is useful to have this functionality because igor should always be "polling" to have a local cache of "triggered" builds/images.

This change allows an operator to:
* have two clusters of `igor` both polling but only one sending events (i.e. triggering pipeline)
* switch which cluster is sending events without generating duplicate events/double triggering
  • Loading branch information
marchello2000 committed May 5, 2020
1 parent 0c58b0e commit ec2ce88
Show file tree
Hide file tree
Showing 17 changed files with 70 additions and 19 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
import com.netflix.spectator.api.Id;
import com.netflix.spectator.api.Registry;
import com.netflix.spinnaker.igor.IgorConfigurationProperties;
import com.netflix.spinnaker.kork.dynamicconfig.DynamicConfigService;
import com.netflix.spinnaker.kork.eureka.RemoteStatusChangedEvent;
import java.time.Duration;
import java.util.Optional;
Expand Down Expand Up @@ -50,23 +51,33 @@ public abstract class CommonPollingMonitor<I extends DeltaItem, T extends Pollin
private final Optional<LockService> lockService;
protected Logger log = LoggerFactory.getLogger(getClass());
protected Scheduler.Worker worker;
protected final DynamicConfigService dynamicConfigService;

public CommonPollingMonitor(
IgorConfigurationProperties igorProperties,
Registry registry,
DynamicConfigService dynamicConfigService,
Optional<DiscoveryClient> discoveryClient,
Optional<LockService> lockService) {
this(igorProperties, registry, discoveryClient, lockService, Schedulers.io());
this(
igorProperties,
registry,
dynamicConfigService,
discoveryClient,
lockService,
Schedulers.io());
}

public CommonPollingMonitor(
IgorConfigurationProperties igorProperties,
Registry registry,
DynamicConfigService dynamicConfigService,
Optional<DiscoveryClient> discoveryClient,
Optional<LockService> lockService,
Scheduler scheduler) {
this.igorProperties = igorProperties;
this.registry = registry;
this.dynamicConfigService = dynamicConfigService;
this.discoveryClient = discoveryClient;
this.lockService = lockService;
this.worker = scheduler.createWorker();
Expand Down Expand Up @@ -208,6 +219,8 @@ protected void internalPollSingle(PollContext ctx) {
.set(0);
}

sendEvents = sendEvents && isSendingEventsEnabled();

commitDelta(delta, sendEvents);
registry
.gauge(itemsCachedId.withTags("monitor", monitorName, "partition", ctx.partitionName))
Expand Down Expand Up @@ -264,6 +277,10 @@ public Long getLastPoll() {
return lastPoll.get();
}

private boolean isSendingEventsEnabled() {
return dynamicConfigService.isEnabled("igor.build.sendEvents", true);
}

protected @Nullable Integer getPartitionUpperThreshold(String partition) {
return null;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@
import com.netflix.spinnaker.igor.polling.PollContext;
import com.netflix.spinnaker.igor.polling.PollingDelta;
import com.netflix.spinnaker.kork.artifacts.model.Artifact;
import com.netflix.spinnaker.kork.dynamicconfig.DynamicConfigService;
import com.netflix.spinnaker.security.AuthenticatedRequest;
import java.io.IOException;
import java.time.Instant;
Expand Down Expand Up @@ -63,12 +64,13 @@ public class ArtifactoryBuildMonitor
public ArtifactoryBuildMonitor(
IgorConfigurationProperties properties,
Registry registry,
DynamicConfigService dynamicConfigService,
Optional<DiscoveryClient> discoveryClient,
Optional<LockService> lockService,
Optional<EchoService> echoService,
ArtifactoryCache cache,
ArtifactoryProperties artifactoryProperties) {
super(properties, registry, discoveryClient, lockService);
super(properties, registry, dynamicConfigService, discoveryClient, lockService);
this.cache = cache;
this.artifactoryProperties = artifactoryProperties;
this.echoService = echoService;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ import com.netflix.spinnaker.igor.artifactory.model.ArtifactorySearch
import com.netflix.spinnaker.igor.config.ArtifactoryProperties
import com.netflix.spinnaker.igor.history.EchoService
import com.netflix.spinnaker.igor.polling.LockService
import com.netflix.spinnaker.kork.dynamicconfig.DynamicConfigService
import com.squareup.okhttp.mockwebserver.MockResponse
import com.squareup.okhttp.mockwebserver.MockWebServer
import rx.schedulers.Schedulers
Expand All @@ -41,6 +42,7 @@ class ArtifactoryBuildMonitorSpec extends Specification {
monitor = new ArtifactoryBuildMonitor(
igorConfigurationProperties,
new NoopRegistry(),
new DynamicConfigService.NoopDynamicConfig(),
Optional.empty(),
Optional.ofNullable(lockService),
Optional.of(echoService),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ import com.netflix.spinnaker.igor.polling.LockService
import com.netflix.spinnaker.igor.polling.PollContext
import com.netflix.spinnaker.igor.polling.PollingDelta
import com.netflix.spinnaker.kork.artifacts.model.Artifact
import com.netflix.spinnaker.kork.dynamicconfig.DynamicConfigService
import com.netflix.spinnaker.security.AuthenticatedRequest
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty
Expand All @@ -57,6 +58,7 @@ class DockerMonitor extends CommonPollingMonitor<ImageDelta, DockerPollingDelta>
@Autowired
DockerMonitor(IgorConfigurationProperties properties,
Registry registry,
DynamicConfigService dynamicConfigService,
Optional<DiscoveryClient> discoveryClient,
Optional<LockService> lockService,
DockerRegistryCache cache,
Expand All @@ -65,7 +67,7 @@ class DockerMonitor extends CommonPollingMonitor<ImageDelta, DockerPollingDelta>
Optional<KeelService> keelService,
Optional<DockerRegistryCacheV2KeysMigration> keysMigration,
DockerRegistryProperties dockerRegistryProperties) {
super(properties, registry, discoveryClient, lockService)
super(properties, registry, dynamicConfigService, discoveryClient, lockService)
this.cache = cache
this.dockerRegistryAccounts = dockerRegistryAccounts
this.echoService = echoService
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@
import com.netflix.spinnaker.igor.polling.PollContext;
import com.netflix.spinnaker.igor.polling.PollingDelta;
import com.netflix.spinnaker.igor.service.BuildServices;
import com.netflix.spinnaker.kork.dynamicconfig.DynamicConfigService;
import com.netflix.spinnaker.security.AuthenticatedRequest;
import java.util.ArrayList;
import java.util.Date;
Expand Down Expand Up @@ -66,13 +67,14 @@ public class GitlabCiBuildMonitor
public GitlabCiBuildMonitor(
IgorConfigurationProperties properties,
Registry registry,
DynamicConfigService dynamicConfigService,
Optional<DiscoveryClient> discoveryClient,
Optional<LockService> lockService,
BuildCache buildCache,
BuildServices buildServices,
GitlabCiProperties gitlabCiProperties,
Optional<EchoService> echoService) {
super(properties, registry, discoveryClient, lockService);
super(properties, registry, dynamicConfigService, discoveryClient, lockService);
this.buildCache = buildCache;
this.buildServices = buildServices;
this.gitlabCiProperties = gitlabCiProperties;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ import com.netflix.spinnaker.igor.polling.LockService
import com.netflix.spinnaker.igor.polling.PollContext
import com.netflix.spinnaker.igor.polling.PollingDelta
import com.netflix.spinnaker.igor.service.BuildServices
import com.netflix.spinnaker.kork.dynamicconfig.DynamicConfigService
import com.netflix.spinnaker.security.AuthenticatedRequest
import groovy.time.TimeCategory
import org.springframework.beans.factory.annotation.Autowired
Expand Down Expand Up @@ -61,14 +62,15 @@ class JenkinsBuildMonitor extends CommonPollingMonitor<JobDelta, JobPollingDelta
@Autowired
JenkinsBuildMonitor(IgorConfigurationProperties properties,
Registry registry,
DynamicConfigService dynamicConfigService,
Optional<DiscoveryClient> discoveryClient,
Optional<LockService> lockService,
JenkinsCache cache,
BuildServices buildServices,
@Value('${jenkins.polling.enabled:true}') boolean pollingEnabled,
Optional<EchoService> echoService,
JenkinsProperties jenkinsProperties) {
super(properties, registry, discoveryClient, lockService)
super(properties, registry, dynamicConfigService, discoveryClient, lockService)
this.cache = cache
this.buildServices = buildServices
this.pollingEnabled = pollingEnabled
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
*/
package com.netflix.spinnaker.igor.wercker

import com.netflix.spinnaker.kork.dynamicconfig.DynamicConfigService
import com.netflix.spinnaker.security.AuthenticatedRequest

import static com.netflix.spinnaker.igor.wercker.model.Run.finishedAtComparator
Expand Down Expand Up @@ -61,16 +62,17 @@ class WerckerBuildMonitor extends CommonPollingMonitor<PipelineDelta, PipelinePo

@Autowired
WerckerBuildMonitor(
IgorConfigurationProperties properties,
Registry registry,
Optional<DiscoveryClient> discoveryClient,
Optional<LockService> lockService,
WerckerCache cache,
BuildServices buildServices,
@Value('${wercker.polling.enabled:true}') boolean pollingEnabled,
Optional<EchoService> echoService,
WerckerProperties werckerProperties) {
super(properties, registry, discoveryClient, lockService)
IgorConfigurationProperties properties,
Registry registry,
DynamicConfigService dynamicConfigService,
Optional<DiscoveryClient> discoveryClient,
Optional<LockService> lockService,
WerckerCache cache,
BuildServices buildServices,
@Value('${wercker.polling.enabled:true}') boolean pollingEnabled,
Optional<EchoService> echoService,
WerckerProperties werckerProperties) {
super(properties, registry, dynamicConfigService, discoveryClient, lockService)
this.cache = cache
this.buildServices = buildServices
this.pollingEnabled = pollingEnabled
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@
import com.netflix.spinnaker.igor.history.model.GenericBuildEvent;
import com.netflix.spinnaker.igor.polling.*;
import com.netflix.spinnaker.igor.service.BuildServices;
import com.netflix.spinnaker.kork.dynamicconfig.DynamicConfigService;
import com.netflix.spinnaker.security.AuthenticatedRequest;
import java.util.Date;
import java.util.List;
Expand Down Expand Up @@ -57,13 +58,14 @@ public class ConcourseBuildMonitor
public ConcourseBuildMonitor(
IgorConfigurationProperties properties,
Registry registry,
DynamicConfigService dynamicConfigService,
Optional<DiscoveryClient> discoveryClient,
Optional<LockService> lockService,
Optional<EchoService> echoService,
BuildServices buildServices,
ConcourseCache cache,
ConcourseProperties concourseProperties) {
super(properties, registry, discoveryClient, lockService);
super(properties, registry, dynamicConfigService, discoveryClient, lockService);
this.buildServices = buildServices;
this.cache = cache;
this.concourseProperties = concourseProperties;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@
import com.netflix.spinnaker.igor.travis.client.model.v3.TravisBuildState;
import com.netflix.spinnaker.igor.travis.client.model.v3.V3Build;
import com.netflix.spinnaker.igor.travis.service.TravisService;
import com.netflix.spinnaker.kork.dynamicconfig.DynamicConfigService;
import com.netflix.spinnaker.security.AuthenticatedRequest;
import java.time.Duration;
import java.time.Instant;
Expand Down Expand Up @@ -72,13 +73,14 @@ public class TravisBuildMonitor
public TravisBuildMonitor(
IgorConfigurationProperties properties,
Registry registry,
DynamicConfigService dynamicConfigService,
Optional<DiscoveryClient> discoveryClient,
BuildCache buildCache,
BuildServices buildServices,
TravisProperties travisProperties,
Optional<EchoService> echoService,
Optional<LockService> lockService) {
super(properties, registry, discoveryClient, lockService);
super(properties, registry, dynamicConfigService, discoveryClient, lockService);
this.buildCache = buildCache;
this.buildServices = buildServices;
this.travisProperties = travisProperties;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,13 +27,15 @@ import com.netflix.spinnaker.igor.history.EchoService
import com.netflix.spinnaker.igor.history.model.DockerEvent
import com.netflix.spinnaker.igor.keel.KeelService
import com.netflix.spinnaker.igor.polling.LockService
import com.netflix.spinnaker.kork.dynamicconfig.DynamicConfigService
import spock.lang.Specification
import spock.lang.Unroll

class DockerMonitorSpec extends Specification {

def properties = new IgorConfigurationProperties()
def registry = new NoopRegistry()
def dynamicConfig = new DynamicConfigService.NoopDynamicConfig()
Optional<DiscoveryClient> discoveryClient = Optional.empty()
Optional<LockService> lockService = Optional.empty()
def dockerRegistryCache = Mock(DockerRegistryCache)
Expand All @@ -55,7 +57,7 @@ class DockerMonitorSpec extends Specification {
)

when:
new DockerMonitor(properties, registry, discoveryClient, lockService, dockerRegistryCache, dockerRegistryAccounts, Optional.of(echoService), Optional.of(keelService), Optional.empty(), dockerRegistryProperties)
new DockerMonitor(properties, registry, dynamicConfig, discoveryClient, lockService, dockerRegistryCache, dockerRegistryAccounts, Optional.of(echoService), Optional.of(keelService), Optional.empty(), dockerRegistryProperties)
.postEvent(cachedImages, taggedImage, "imageId")

then:
Expand Down Expand Up @@ -172,7 +174,7 @@ class DockerMonitorSpec extends Specification {
}

private DockerMonitor createSubject() {
return new DockerMonitor(properties, registry, discoveryClient, lockService, dockerRegistryCache, dockerRegistryAccounts, Optional.of(echoService), Optional.of(keelService), keysMigration, dockerRegistryProperties)
return new DockerMonitor(properties, registry, dynamicConfig, discoveryClient, lockService, dockerRegistryCache, dockerRegistryAccounts, Optional.of(echoService), Optional.of(keelService), keysMigration, dockerRegistryProperties)
}

private static String keyFromTaggedImage(TaggedImage taggedImage) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ import com.netflix.spinnaker.igor.gitlabci.service.GitlabCiService
import com.netflix.spinnaker.igor.history.EchoService
import com.netflix.spinnaker.igor.polling.PollContext
import com.netflix.spinnaker.igor.service.BuildServices
import com.netflix.spinnaker.kork.dynamicconfig.DynamicConfigService
import spock.lang.Ignore
import spock.lang.Specification
import spock.lang.Unroll
Expand All @@ -47,6 +48,7 @@ class GitlabCiBuildMonitorSpec extends Specification {
buildMonitor = new GitlabCiBuildMonitor(
new IgorConfigurationProperties(),
new NoopRegistry(),
new DynamicConfigService.NoopDynamicConfig(),
Optional.empty(),
Optional.empty(),
buildCache,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ import com.netflix.spinnaker.igor.jenkins.client.model.ProjectsList
import com.netflix.spinnaker.igor.jenkins.service.JenkinsService
import com.netflix.spinnaker.igor.model.BuildServiceProvider
import com.netflix.spinnaker.igor.service.BuildServices
import com.netflix.spinnaker.kork.dynamicconfig.DynamicConfigService
import com.netflix.spinnaker.kork.eureka.RemoteStatusChangedEvent
import rx.schedulers.TestScheduler
import spock.lang.Specification
Expand Down Expand Up @@ -52,6 +53,7 @@ class JenkinsBuildMonitorSchedulingSpec extends Specification {
monitor = new JenkinsBuildMonitor(
cfg,
new NoopRegistry(),
new DynamicConfigService.NoopDynamicConfig(),
Optional.empty(),
Optional.empty(),
cache,
Expand Down Expand Up @@ -102,6 +104,7 @@ class JenkinsBuildMonitorSchedulingSpec extends Specification {
monitor = new JenkinsBuildMonitor(
cfg,
new NoopRegistry(),
new DynamicConfigService.NoopDynamicConfig(),
Optional.empty(),
Optional.empty(),
cache,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ import com.netflix.spinnaker.igor.jenkins.client.model.ProjectsList
import com.netflix.spinnaker.igor.jenkins.service.JenkinsService
import com.netflix.spinnaker.igor.polling.PollContext
import com.netflix.spinnaker.igor.service.BuildServices
import com.netflix.spinnaker.kork.dynamicconfig.DynamicConfigService
import org.slf4j.Logger
import retrofit.RetrofitError
import rx.schedulers.Schedulers
Expand All @@ -51,6 +52,7 @@ class JenkinsBuildMonitorSpec extends Specification {
monitor = new JenkinsBuildMonitor(
igorConfigurationProperties,
new NoopRegistry(),
new DynamicConfigService.NoopDynamicConfig(),
Optional.empty(),
Optional.empty(),
cache,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ import com.netflix.spinnaker.igor.travis.client.model.v3.V3Commit
import com.netflix.spinnaker.igor.travis.client.model.v3.V3Repository
import com.netflix.spinnaker.igor.travis.service.TravisBuildConverter
import com.netflix.spinnaker.igor.travis.service.TravisService
import com.netflix.spinnaker.kork.dynamicconfig.DynamicConfigService
import spock.lang.Specification

class TravisBuildMonitorSpec extends Specification {
Expand All @@ -48,6 +49,7 @@ class TravisBuildMonitorSpec extends Specification {
travisBuildMonitor = new TravisBuildMonitor(
new IgorConfigurationProperties(),
new NoopRegistry(),
new DynamicConfigService.NoopDynamicConfig(),
Optional.empty(),
buildCache,
buildServices,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import com.netflix.spinnaker.igor.IgorConfigurationProperties
import com.netflix.spinnaker.igor.config.WerckerProperties
import com.netflix.spinnaker.igor.model.BuildServiceProvider
import com.netflix.spinnaker.igor.service.BuildServices
import com.netflix.spinnaker.kork.dynamicconfig.DynamicConfigService
import com.netflix.spinnaker.kork.eureka.RemoteStatusChangedEvent

import java.util.concurrent.TimeUnit
Expand Down Expand Up @@ -43,6 +44,7 @@ class WerckerBuildMonitorSchedulingSpec extends Specification {
monitor = new WerckerBuildMonitor(
cfg,
new NoopRegistry(),
new DynamicConfigService.NoopDynamicConfig(),
Optional.empty(),
Optional.empty(),
cache,
Expand Down Expand Up @@ -92,6 +94,7 @@ class WerckerBuildMonitorSchedulingSpec extends Specification {
monitor = new WerckerBuildMonitor(
cfg,
new NoopRegistry(),
new DynamicConfigService.NoopDynamicConfig(),
Optional.empty(),
Optional.empty(),
cache,
Expand Down
Loading

0 comments on commit ec2ce88

Please sign in to comment.