Skip to content

Commit

Permalink
Merge remote-tracking branch 'origin/release-1.x' into develop
Browse files Browse the repository at this point in the history
  • Loading branch information
Jesse White committed Jul 8, 2019
2 parents 5dbe734 + 2992c25 commit bdfde07
Show file tree
Hide file tree
Showing 11 changed files with 170 additions and 21 deletions.
6 changes: 4 additions & 2 deletions .circleci/config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -166,7 +166,7 @@ commands:
- v1-docker-{{ checksum "smoke-test/src/main/resources/docker_fixed_images" }}

- run:
name: Import docker images
name: Import Docker images
command: |
if [ -z "$(ls /tmp/docker 2> /dev/null)" ]; then exit 0; fi
source smoke-test/src/main/resources/docker_fixed_images
Expand Down Expand Up @@ -212,11 +212,13 @@ commands:
key: v1-docker-{{ checksum "smoke-test/src/main/resources/docker_fixed_images" }}

- run:
name: Save test results
name: Gather test artifacts
command: |
mkdir -p ~/junit/
find . -type f -regex ".*/target/failsafe-reports/.*xml" -exec cp {} ~/junit/ \;
find . -type f -regex ".*/target/surefire-reports/.*xml" -exec cp {} ~/junit/ \;
mkdir -p ~/logs/
cp -R smoke-test/target/logs/* ~/logs/ || true
when: always

- store_test_results:
Expand Down
4 changes: 4 additions & 0 deletions driver/main/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,10 @@
<groupId>io.dropwizard.metrics</groupId>
<artifactId>metrics-core</artifactId>
</dependency>
<dependency>
<groupId>io.dropwizard.metrics</groupId>
<artifactId>metrics-jmx</artifactId>
</dependency>

<dependency>
<groupId>junit</groupId>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -84,15 +84,15 @@ public class Driver implements EngineRegistry {
private Timer timer;

// Health
private final MetricRegistry metrics = new MetricRegistry();
private final com.codahale.metrics.Timer ticks = metrics.timer(name(Driver.class, "ticks"));
private final com.codahale.metrics.Timer ticks;
private long tickResolutionMs = 0;
private DriverState state = DriverState.CREATED;

public Driver(BundleContext bundleContext, AlarmDatasource alarmDatasource,
AlarmFeedbackDatasource alarmFeedbackDatasource, InventoryDatasource inventoryDatasource,
SituationDatasource situationDatasource, EngineFactory engineFactory,
SituationProcessorFactory situationProcessorFactory) {
SituationProcessorFactory situationProcessorFactory,
MetricRegistry metrics) {
this.bundleContext = Objects.requireNonNull(bundleContext);
this.alarmDatasource = Objects.requireNonNull(alarmDatasource);
this.alarmFeedbackDatasource = Objects.requireNonNull(alarmFeedbackDatasource);
Expand All @@ -102,6 +102,7 @@ public Driver(BundleContext bundleContext, AlarmDatasource alarmDatasource,
this.situationProcessor =
Objects.requireNonNull(situationProcessorFactory).getInstance();
confirmingSituationHandler = SituationConfirmer.newInstance(situationProcessor);
ticks = metrics.timer(name(engineFactory.getName(), "ticks"));
}

public void init() {
Expand Down
15 changes: 15 additions & 0 deletions driver/main/src/main/resources/OSGI-INF/blueprint/blueprint.xml
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,20 @@
<!-- Situation Processor -->
<reference id="situationProcessorFactory" interface="org.opennms.alec.processor.api.SituationProcessorFactory"/>

<!-- Metrics -->
<bean id="metricRegistry" class="com.codahale.metrics.MetricRegistry"/>
<bean id="metricRegistryJmxReporterBuilder" class="com.codahale.metrics.jmx.JmxReporter" factory-method="forRegistry">
<argument ref="metricRegistry"/>
</bean>
<bean id="metricRegistryDomainedJmxReporterBuilder" factory-ref="metricRegistryJmxReporterBuilder" factory-method="inDomain">
<argument value="org.opennms.alec.driver.main"/>
</bean>
<bean id="metricRegistryJmxReporter"
factory-ref="metricRegistryDomainedJmxReporterBuilder"
factory-method="build"
init-method="start"
destroy-method="stop" />

<bean id="driver" class="org.opennms.alec.driver.main.Driver" init-method="init" destroy-method="destroy">
<argument ref="blueprintBundleContext"/>
<argument ref="alarmDatasource"/>
Expand All @@ -20,6 +34,7 @@
<argument ref="situationDatasource"/>
<argument ref="engineFactory"/>
<argument ref="situationProcessorFactory"/>
<argument ref="metricRegistry"/>
</bean>
<service ref="driver" interface="org.opennms.alec.engine.api.EngineRegistry"/>

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,8 @@
import org.opennms.alec.processor.api.SituationProcessorFactory;
import org.osgi.framework.BundleContext;

import com.codahale.metrics.MetricRegistry;

public class DriverTest {

@Test
Expand All @@ -61,10 +63,11 @@ public void canGenerateTicks() throws InterruptedException, ExecutionException {
when(situationProcessorFactory.getInstance()).thenReturn(mock(SituationProcessor.class));
TickLoggingEngine tickLoggingEngine = new TickLoggingEngine();
when(engineFactory.createEngine()).thenReturn(tickLoggingEngine);
MetricRegistry metrics = new MetricRegistry();

// Create and initialize the driver
Driver driver = new Driver(bundleContext, alarmDatasource, alarmFeedbackDatasource, inventoryDatasource,
situationDatasource, engineFactory, situationProcessorFactory);
situationDatasource, engineFactory, situationProcessorFactory, metrics);
driver.initAsync().get();

// Tick tock
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -142,12 +142,7 @@
openconfirm(5)
established(6)
&lt;/p>&lt;/td>&lt;/tr>&lt;/table></descr>
<logmsg dest="logndisplay">&lt;p>
bgpBackwardTransition trap received
bgpPeerRemoteAddr=%parm[#1]%
bgpPeerLastError=%parm[#2]%
bgpPeerState=%parm[#3]%&lt;/p>
</logmsg>
<logmsg dest="logndisplay">bgpBackwardTransition trap received bgpPeerRemoteAddr=%parm[#1]% bgpPeerLastError=%parm[#2]% bgpPeerState=%parm[#3]%</logmsg>
<severity>Warning</severity>
<parameter name="bgpPeer" value="%parm[#1]%" expand="true"/>
<alarm-data reduction-key="%uei%:%dpname%:%nodeid%:%parm[bgpPeer]%" alarm-type="1" auto-clean="true">
Expand Down
3 changes: 2 additions & 1 deletion karaf-features/src/main/resources/features.xml
Original file line number Diff line number Diff line change
Expand Up @@ -100,7 +100,8 @@
<feature version="${opennms.api.version}" dependency="true">opennms-integration-api</feature>
<feature version="${project.version}">alec-engine-api</feature>
<feature version="${project.version}">alec-processor-api</feature>
<bundle dependency="true">mvn:io.dropwizard.metrics/metrics-core/${metrics.core.version}</bundle>
<bundle dependency="true">mvn:io.dropwizard.metrics/metrics-core/${metrics.version}</bundle>
<bundle dependency="true">mvn:io.dropwizard.metrics/metrics-jmx/${metrics.version}</bundle>
<bundle>mvn:org.opennms.alec.driver/org.opennms.alec.driver.main/${project.version}</bundle>
</feature>

Expand Down
9 changes: 7 additions & 2 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@
<junit.version>4.12</junit.version>
<karaf.version>4.2.3</karaf.version>
<log4j.version>2.8.2</log4j.version>
<metrics.core.version>4.0.5</metrics.core.version>
<metrics.version>4.1.0</metrics.version>
<mockito.version>2.18.0</mockito.version>
<moxy.version>2.7.3</moxy.version>
<okhttp.version>3.10.0</okhttp.version>
Expand Down Expand Up @@ -344,7 +344,12 @@
<dependency>
<groupId>io.dropwizard.metrics</groupId>
<artifactId>metrics-core</artifactId>
<version>${metrics.core.version}</version>
<version>${metrics.version}</version>
</dependency>
<dependency>
<groupId>io.dropwizard.metrics</groupId>
<artifactId>metrics-jmx</artifactId>
<version>${metrics.version}</version>
</dependency>
<dependency>
<groupId>org.apache.karaf.shell</groupId>
Expand Down
4 changes: 2 additions & 2 deletions smoke-test/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,9 @@
<jersey.version>2.28</jersey.version>
<selenium.version>3.4.0</selenium.version>
<!--This module needs a newer version of guava than the root pom version -->
<guava.version>21.0</guava.version>
<guava.version>28.0-jre</guava.version>
<commonsLang3Version>3.4</commonsLang3Version>
<testContainersVersion>1.10.7</testContainersVersion>
<testContainersVersion>1.11.3</testContainersVersion>
</properties>
<build>
<plugins>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,104 @@
/*******************************************************************************
* This file is part of OpenNMS(R).
*
* Copyright (C) 2019 The OpenNMS Group, Inc.
* OpenNMS(R) is Copyright (C) 1999-2019 The OpenNMS Group, Inc.
*
* OpenNMS(R) is a registered trademark of The OpenNMS Group, Inc.
*
* OpenNMS(R) is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published
* by the Free Software Foundation, either version 3 of the License,
* or (at your option) any later version.
*
* OpenNMS(R) is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with OpenNMS(R). If not, see:
* http://www.gnu.org/licenses/
*
* For more information contact:
* OpenNMS(R) Licensing <license@opennms.org>
* http://www.opennms.org/
* http://www.opennms.com/
*******************************************************************************/

package org.opennms.alec.smoke.util;

import com.google.common.base.Strings;
import com.google.common.util.concurrent.SimpleTimeLimiter;
import com.google.common.util.concurrent.TimeLimiter;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.testcontainers.containers.BindMode;
import org.testcontainers.containers.Container;
import org.testcontainers.containers.SelinuxContext;

import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Arrays;
import java.util.List;
import java.util.Locale;
import java.util.concurrent.Executor;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;

public class DevDebugUtils {
private static final Logger LOG = LoggerFactory.getLogger(DevDebugUtils.class);

public static void copyLogs(Container container, Path targetLogFolder, Path sourceLogFolder, List<String> logFiles) {
try {
Files.createDirectories(targetLogFolder);
} catch (IOException e) {
throw new RuntimeException("Failed to create " + targetLogFolder, e);
}

// Copying files from the containers seems to block some times
// We limit their execution times so we don't block for too long when this happen
final ExecutorService executor = Executors.newCachedThreadPool();
final TimeLimiter limiter = SimpleTimeLimiter.create(executor);

final Path containerLogOutputFile = targetLogFolder.resolve("container_stdout_stderr");
try {
limiter.runWithTimeout(() -> {
try {
Files.write(containerLogOutputFile, container.getLogs().getBytes(StandardCharsets.UTF_8));
} catch (IOException e) {
throw new RuntimeException(e);
}
}, 1, TimeUnit.MINUTES);
} catch (Exception e) {
LOG.info("Failed to copy stdout/stderr from container to file {}: {}", containerLogOutputFile, e.getMessage());
}

for (String logFile : logFiles) {
try {
limiter.runWithTimeout(() -> {
try {
container.copyFileFromContainer(sourceLogFolder.resolve(logFile).toString(),
targetLogFolder.resolve(logFile).toString());
} catch (IOException|InterruptedException e) {
throw new RuntimeException(e);
}
}, 1, TimeUnit.MINUTES);
} catch (Exception e) {
LOG.info("Failed to copy log file {} from container: {}", logFile, e.getMessage());
}
}

executor.shutdownNow();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -37,8 +37,10 @@
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.function.Supplier;
Expand All @@ -48,6 +50,7 @@
import org.apache.commons.io.FileUtils;
import org.junit.runner.Description;
import org.opennms.alec.smoke.util.Cleanup;
import org.opennms.alec.smoke.util.DevDebugUtils;
import org.opennms.alec.smoke.util.Karaf;
import org.opennms.alec.smoke.util.Network;
import org.opennms.alec.smoke.util.Overlay;
Expand All @@ -56,8 +59,10 @@
import org.testcontainers.containers.BindMode;
import org.testcontainers.containers.GenericContainer;
import org.testcontainers.containers.SelinuxContext;
import org.testcontainers.lifecycle.TestDescription;
import org.testcontainers.lifecycle.TestLifecycleAware;

public class ALECSentinelContainer extends GenericContainer {
public class ALECSentinelContainer extends GenericContainer implements TestLifecycleAware {
private static final Logger LOG = LoggerFactory.getLogger(ALECSentinelContainer.class);
private static final int SENTINEL_SSH_PORT = 8301;
private static final String OVERLAY_STANDALONE_DIR = "sentinel-overlay-standalone";
Expand Down Expand Up @@ -193,9 +198,23 @@ public String toString() {
return getIndexedAlias();
}


@Override
protected void failed(Throwable e, Description description) {
Cleanup.skipCleanupIfNeeded(e);
super.failed(e, description);
public void afterTest(TestDescription description, Optional<Throwable> throwable) {
Cleanup.skipCleanupIfNeeded(throwable.get());
LOG.info("Gathering logs...");
copyLogs(description.getFilesystemFriendlyName());
}

private void copyLogs(String prefix) {
// List of known log files we expect to find in the container
final List<String> logFiles = Arrays.asList("karaf.log");
DevDebugUtils.copyLogs(this,
// dest
Paths.get("target", "logs", prefix, "sentinel"),
// source folder
Paths.get("/opt", "sentinel", "data", "log"),
// log files
logFiles);
}
}

0 comments on commit bdfde07

Please sign in to comment.