Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ COPY ./run_tool.sh /app
COPY ./conf/default-config.json /app/conf/
COPY ./conf/*.xml /app/conf/

RUN apk add --no-cache --upgrade libpng libcrypto3 libssl3 musl musl-utils gnutls && addgroup --gid 1100 uidusers && adduser -D -G uidusers --uid 1100 uid2-optout && mkdir -p /opt/uid2 && chmod 755 -R /opt/uid2 && mkdir -p /app && chmod 705 -R /app && mkdir -p /app/file-uploads && chmod 777 -R /app/file-uploads
RUN apk add --no-cache --upgrade libpng libcrypto3 libssl3 musl musl-utils gnutls && addgroup --gid 1100 uidusers && adduser -D -G uidusers --uid 1100 uid2-optout && mkdir -p /opt/uid2 && chmod 755 -R /opt/uid2 && mkdir -p /app && chmod 705 -R /app && mkdir -p /app/file-uploads && chmod 777 -R /app/file-uploads && mkdir -p /app/pod_terminating && chmod 777 -R /app/pod_terminating
USER uid2-optout

CMD java \
Expand Down
2 changes: 1 addition & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

<groupId>com.uid2</groupId>
<artifactId>uid2-optout</artifactId>
<version>4.10.3</version>
<version>4.10.5-alpha-234-SNAPSHOT</version>
<name>uid2-optout</name>
<url>https://github.com/IABTechLab/uid2-optout</url>

Expand Down
1 change: 1 addition & 0 deletions src/main/java/com/uid2/optout/Const.java
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ public static class Config extends com.uid2.shared.Const.Config {
public static final String OptOutSqsDeltaWindowSecondsProp = "optout_sqs_delta_window_seconds";
public static final String OptOutSqsMaxQueueSizeProp = "optout_sqs_max_queue_size";
public static final String AwsSqsEndpointProp = "aws_sqs_endpoint";
public static final String PodTerminationCheckInterval = "pod_termination_check_interval";
}

public static class Event {
Expand Down
4 changes: 4 additions & 0 deletions src/main/java/com/uid2/optout/Main.java
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@
import com.uid2.shared.audit.UidInstanceIdProvider;
import com.uid2.shared.auth.RotatingOperatorKeyProvider;
import com.uid2.shared.cloud.*;
import com.uid2.shared.health.HealthManager;
import com.uid2.shared.health.PodTerminationMonitor;
import com.uid2.shared.jmx.AdminApi;
import com.uid2.shared.optout.OptOutCloudSync;
import com.uid2.shared.store.CloudPath;
Expand Down Expand Up @@ -65,6 +67,8 @@ public class Main {
public Main(Vertx vertx, JsonObject config) throws Exception {
this.vertx = vertx;
this.config = config;
HealthManager.instance.registerGenericComponent(new PodTerminationMonitor(
config.getInteger(Const.Config.PodTerminationCheckInterval, 3000)));
this.observeOnly = config.getBoolean(Const.Config.OptOutObserveOnlyProp);
if (this.observeOnly) {
LOGGER.warn("Running Observe ONLY mode: no producer, no sender");
Expand Down
79 changes: 79 additions & 0 deletions src/test/java/com/uid2/optout/MainTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
package com.uid2.optout;

import com.uid2.shared.health.HealthManager;
import com.uid2.shared.health.IHealthComponent;
import com.uid2.shared.health.PodTerminationMonitor;
import io.vertx.core.json.JsonObject;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.io.TempDir;

import java.nio.file.Files;
import java.nio.file.Path;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertInstanceOf;

class MainTest {
@TempDir
Path tempDir;

private HealthManager originalHealthManager;
private CapturingHealthManager healthManager;

@BeforeEach
void setUp() {
originalHealthManager = HealthManager.instance;
healthManager = new CapturingHealthManager();
HealthManager.instance = healthManager;
}

@AfterEach
void tearDown() {
HealthManager.instance = originalHealthManager;
}

@Test
void constructorRegistersPodTerminationMonitorWithDefaultInterval() throws Exception {
new Main(null, createConfig());

PodTerminationMonitor monitor = assertInstanceOf(
PodTerminationMonitor.class, healthManager.registeredComponent);
assertEquals(3000L, getFileCheckInterval(monitor));
}

@Test
void constructorUsesConfiguredPodTerminationCheckInterval() throws Exception {
JsonObject config = createConfig()
.put(Const.Config.PodTerminationCheckInterval, 1250);

new Main(null, config);

PodTerminationMonitor monitor = assertInstanceOf(
PodTerminationMonitor.class, healthManager.registeredComponent);
assertEquals(1250L, getFileCheckInterval(monitor));
}

private JsonObject createConfig() throws Exception {
JsonObject config = new JsonObject(Files.readString(Path.of("conf/default-config.json")));
config.mergeIn(new JsonObject(Files.readString(Path.of("conf/local-config.json"))));
return config.put(Const.Config.OptOutDataDirProp, tempDir.toString());
}

private static long getFileCheckInterval(PodTerminationMonitor monitor) throws Exception {
var field = PodTerminationMonitor.class.getDeclaredField("fileCheckIntervalMs");
field.setAccessible(true);
return field.getLong(monitor);
}

private static class CapturingHealthManager extends HealthManager {
private IHealthComponent registeredComponent;

@Override
public synchronized <T extends IHealthComponent> T registerGenericComponent(T component) {
registeredComponent = component;
return component;
}
}
}