summaryrefslogtreecommitdiffstats
path: root/infra/bgp-distribution/src/test
diff options
context:
space:
mode:
Diffstat (limited to 'infra/bgp-distribution/src/test')
-rw-r--r--infra/bgp-distribution/src/test/java/io/fd/honeycomb/infra/bgp/distro/BgpDistributionTest.java125
-rw-r--r--infra/bgp-distribution/src/test/resources/WEB-INF/web.xml74
-rw-r--r--infra/bgp-distribution/src/test/resources/bgp-peers.json90
-rw-r--r--infra/bgp-distribution/src/test/resources/bgp.json9
-rw-r--r--infra/bgp-distribution/src/test/resources/honeycomb-keystorebin0 -> 2392 bytes
-rw-r--r--infra/bgp-distribution/src/test/resources/honeycomb.json40
-rw-r--r--infra/bgp-distribution/src/test/resources/logback.xml31
7 files changed, 369 insertions, 0 deletions
diff --git a/infra/bgp-distribution/src/test/java/io/fd/honeycomb/infra/bgp/distro/BgpDistributionTest.java b/infra/bgp-distribution/src/test/java/io/fd/honeycomb/infra/bgp/distro/BgpDistributionTest.java
new file mode 100644
index 000000000..095d61c39
--- /dev/null
+++ b/infra/bgp-distribution/src/test/java/io/fd/honeycomb/infra/bgp/distro/BgpDistributionTest.java
@@ -0,0 +1,125 @@
+/*
+ * Copyright (c) 2016 Cisco and/or its affiliates.
+ *
+ * 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 io.fd.honeycomb.infra.bgp.distro;
+
+import static com.google.common.collect.ImmutableSet.of;
+
+import com.google.common.io.ByteStreams;
+import com.google.inject.Module;
+import com.mashape.unirest.http.Unirest;
+import io.fd.honeycomb.infra.bgp.BgpConfigurationModule;
+import io.fd.honeycomb.infra.bgp.BgpExtensionsModule;
+import io.fd.honeycomb.infra.bgp.BgpModule;
+import io.fd.honeycomb.infra.bgp.BgpReadersModule;
+import io.fd.honeycomb.infra.bgp.BgpWritersModule;
+import io.fd.honeycomb.infra.distro.cfgattrs.CfgAttrsModule;
+import io.fd.honeycomb.infra.distro.data.ConfigAndOperationalPipelineModule;
+import io.fd.honeycomb.infra.distro.data.context.ContextPipelineModule;
+import io.fd.honeycomb.infra.distro.initializer.InitializerPipelineModule;
+import io.fd.honeycomb.infra.distro.netconf.NetconfModule;
+import io.fd.honeycomb.infra.distro.netconf.NetconfReadersModule;
+import io.fd.honeycomb.infra.distro.restconf.RestconfModule;
+import io.fd.honeycomb.infra.distro.schema.SchemaModule;
+import io.fd.honeycomb.infra.distro.schema.YangBindingProviderModule;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.InetAddress;
+import java.net.Socket;
+import java.util.Set;
+import javax.net.ssl.SSLContext;
+import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
+import org.apache.http.conn.ssl.TrustSelfSignedStrategy;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClients;
+import org.apache.http.ssl.SSLContexts;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class BgpDistributionTest {
+
+ private static final Logger LOG = LoggerFactory.getLogger(BgpDistributionTest.class);
+ private static final String CERT_PASSWORD = "testing";
+ private static final int HELLO_WAIT = 2500;
+
+ private static final int BGP_MSG_TYPE_OFFSET = 18; // 16 (MARKER) + 2 (LENGTH);
+ private static final byte BGP_OPEN_MSG_TYPE = 1;
+ private static final int BGP_PORT = 1790;
+
+ public static final Set<Module> BASE_MODULES = of(
+ new YangBindingProviderModule(),
+ new SchemaModule(),
+ new ConfigAndOperationalPipelineModule(),
+ new ContextPipelineModule(),
+ new InitializerPipelineModule(),
+ new NetconfModule(),
+ new NetconfReadersModule(),
+ new RestconfModule(),
+ new CfgAttrsModule(),
+ new BgpModule(),
+ new BgpExtensionsModule(),
+ new BgpReadersModule(),
+ new BgpWritersModule(),
+ new BgpConfigurationModule());
+
+ @Before
+ public void setUp() throws Exception {
+ SSLContext sslcontext = SSLContexts.custom()
+ .loadTrustMaterial(getClass().getResource("/honeycomb-keystore"),
+ CERT_PASSWORD.toCharArray(), new TrustSelfSignedStrategy())
+ .build();
+
+ SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslcontext);
+ CloseableHttpClient httpclient = HttpClients.custom()
+ .setSSLSocketFactory(sslsf)
+ .build();
+ Unirest.setHttpClient(httpclient);
+ }
+
+ @Test(timeout = 60000)
+ public void test() throws Exception {
+ io.fd.honeycomb.infra.bgp.distro.Main.init(BASE_MODULES);
+ LOG.info("Testing Honeycomb BGP distribution");
+ assertBgp();
+ }
+
+ private byte[] readMessage(final InputStream inputStream) throws IOException {
+ final int available = inputStream.available();
+ final byte[] msg = new byte[available];
+ ByteStreams.read(inputStream, msg, 0, available);
+ return msg;
+ }
+
+ private void assertBgp() throws Exception {
+ // Wait until BGP server is started
+ Thread.sleep(HELLO_WAIT);
+ final InetAddress bgpHost = InetAddress.getByName("127.0.0.1");
+ final InetAddress bgpPeerAddress = InetAddress.getByName("127.0.0.2");
+ try (final Socket localhost = new Socket(bgpHost, BGP_PORT, bgpPeerAddress, 0);
+ final InputStream inputStream = localhost.getInputStream()) {
+ // Wait until bgp message is sent
+ Thread.sleep(HELLO_WAIT);
+
+ final byte[] msg = readMessage(inputStream);
+ LOG.info("Received BGP message: {}", msg);
+
+ Assert.assertEquals(BGP_OPEN_MSG_TYPE, msg[BGP_MSG_TYPE_OFFSET]);
+ }
+ }
+} \ No newline at end of file
diff --git a/infra/bgp-distribution/src/test/resources/WEB-INF/web.xml b/infra/bgp-distribution/src/test/resources/WEB-INF/web.xml
new file mode 100644
index 000000000..6cf487170
--- /dev/null
+++ b/infra/bgp-distribution/src/test/resources/WEB-INF/web.xml
@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<!--
+ ~ Copyright (c) 2016 Cisco and/or its affiliates.
+ ~
+ ~ 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.
+ -->
+
+<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
+ version="3.0">
+
+ <servlet>
+ <servlet-name>JAXRSRestconf</servlet-name>
+ <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
+ <init-param>
+ <param-name>javax.ws.rs.Application</param-name>
+ <param-value>org.opendaylight.netconf.sal.rest.impl.RestconfApplication</param-value>
+ </init-param>
+ <load-on-startup>1</load-on-startup>
+ </servlet>
+
+ <servlet-mapping>
+ <servlet-name>JAXRSRestconf</servlet-name>
+ <url-pattern>/*</url-pattern>
+ </servlet-mapping>
+ <filter>
+ <filter-name>cross-origin-restconf</filter-name>
+ <filter-class>org.eclipse.jetty.servlets.CrossOriginFilter</filter-class>
+ <init-param>
+ <param-name>allowedOrigins</param-name>
+ <param-value>*</param-value>
+ </init-param>
+ <init-param>
+ <param-name>allowedMethods</param-name>
+ <param-value>GET,POST,OPTIONS,DELETE,PUT,HEAD</param-value>
+ </init-param>
+ <init-param>
+ <param-name>allowedHeaders</param-name>
+ <param-value>origin, content-type, accept, authorization</param-value>
+ </init-param>
+ <init-param>
+ <param-name>exposedHeaders</param-name>
+ <param-value>location</param-value>
+ </init-param>
+ </filter>
+ <filter-mapping>
+ <filter-name>cross-origin-restconf</filter-name>
+ <url-pattern>/*</url-pattern>
+ </filter-mapping>
+
+ <security-constraint>
+ <web-resource-collection>
+ <web-resource-name>NB api</web-resource-name>
+ <url-pattern>/*</url-pattern>
+ <http-method>POST</http-method>
+ <http-method>GET</http-method>
+ <http-method>PUT</http-method>
+ <http-method>PATCH</http-method>
+ <http-method>DELETE</http-method>
+ <http-method>HEAD</http-method>
+ </web-resource-collection>
+ </security-constraint>
+
+</web-app>
diff --git a/infra/bgp-distribution/src/test/resources/bgp-peers.json b/infra/bgp-distribution/src/test/resources/bgp-peers.json
new file mode 100644
index 000000000..3a7e01060
--- /dev/null
+++ b/infra/bgp-distribution/src/test/resources/bgp-peers.json
@@ -0,0 +1,90 @@
+{
+ "bgp-openconfig-extensions:neighbors": {
+ "neighbor": [
+ {
+ "neighbor-address": "10.25.1.9",
+ "config": {
+ "peer-group": "application-peers"
+ },
+ "afi-safis": {
+ "afi-safi": [
+ {
+ "afi-safi-name": "openconfig-bgp-types:IPV4-UNICAST",
+ "receive": true,
+ "send-max": 0
+ }
+ ]
+ }
+ },
+ {
+ "neighbor-address": "10.25.1.10",
+ "config": {
+ "peer-group": "application-peers"
+ },
+ "afi-safis": {
+ "afi-safi": [
+ {
+ "afi-safi-name": "openconfig-bgp-types:IPV4-UNICAST",
+ "receive": true,
+ "send-max": 0
+ }
+ ]
+ }
+ },
+ {
+ "neighbor-address": "127.0.0.2",
+ "config": {
+ "peer-type": "INTERNAL"
+ },
+ "timers": {
+ "config": {
+ "connect-retry": 10,
+ "hold-time": 90
+ }
+ },
+ "transport": {
+ "config": {
+ "remote-port": 17900,
+ "passive-mode": false
+ }
+ },
+ "afi-safis": {
+ "afi-safi": [
+ {
+ "afi-safi-name": "openconfig-bgp-types:IPV4-UNICAST",
+ "receive": true,
+ "send-max": 0
+ }
+ ]
+ }
+ },
+ {
+ "neighbor-address": "127.0.0.3",
+ "config": {
+ "peer-type": "EXTERNAL"
+ },
+ "timers": {
+ "config": {
+ "connect-retry": 10,
+ "hold-time": 90
+ }
+ },
+ "transport": {
+ "config": {
+ "remote-port": 17900,
+ "passive-mode": false
+ }
+ },
+ "afi-safis": {
+ "afi-safi": [
+ {
+ "afi-safi-name": "openconfig-bgp-types:IPV4-UNICAST",
+ "receive": true,
+ "send-max": 0
+ }
+ ]
+ }
+ }
+ ]
+ }
+} \ No newline at end of file
diff --git a/infra/bgp-distribution/src/test/resources/bgp.json b/infra/bgp-distribution/src/test/resources/bgp.json
new file mode 100644
index 000000000..494b6a965
--- /dev/null
+++ b/infra/bgp-distribution/src/test/resources/bgp.json
@@ -0,0 +1,9 @@
+ {
+ "bgp-enabled": "true",
+ "bgp-binding-address": "127.0.0.1",
+ "bgp-port": 1790,
+ "bgp-as-number": 65000,
+ "bgp-receive-multiple-paths": "true",
+ "bgp-send-max-paths": 0,
+ "bgp-netty-threads": 2
+} \ No newline at end of file
diff --git a/infra/bgp-distribution/src/test/resources/honeycomb-keystore b/infra/bgp-distribution/src/test/resources/honeycomb-keystore
new file mode 100644
index 000000000..44093dc09
--- /dev/null
+++ b/infra/bgp-distribution/src/test/resources/honeycomb-keystore
Binary files differ
diff --git a/infra/bgp-distribution/src/test/resources/honeycomb.json b/infra/bgp-distribution/src/test/resources/honeycomb.json
new file mode 100644
index 000000000..a0b2a633c
--- /dev/null
+++ b/infra/bgp-distribution/src/test/resources/honeycomb.json
@@ -0,0 +1,40 @@
+ {
+ "persisted-context-path": "/tmp/honeycomb/persist/context/data.json",
+ "persisted-context-restoration-type": "Merge",
+ "persisted-config-path": "/tmp/honeycomb/persist/config/data.json",
+ "persisted-config-restoration-type": "Merge",
+
+ "notification-service-queue-depth": 1,
+
+ "restconf-http-enabled": "true",
+ "restconf-root-path": "/restconf",
+ "restconf-binding-address": "127.0.0.1",
+ "restconf-port": 8182,
+ "restconf-https-enabled": "true",
+ "restconf-https-binding-address": "127.0.0.1",
+ "restconf-https-port": 8444,
+ "restconf-keystore": "/honeycomb-keystore",
+ "restconf-keystore-password": "testing",
+ "restconf-keystore-manager-password": "testing",
+ "restconf-truststore": "/honeycomb-keystore",
+ "restconf-truststore-password": "testing",
+ "restconf-websocket-port": 7780,
+ "restconf-pool-max-size": 10,
+ "restconf-pool-min-size": 1,
+ "restconf-acceptors-size": 1,
+ "restconf-selectors-size": 1,
+ "restconf-https-acceptors-size": 1,
+ "restconf-https-selectors-size": 1,
+
+ "netconf-netty-threads": 2,
+ "netconf-tcp-enabled" : "true",
+ "netconf-tcp-binding-address": "127.0.0.1",
+ "netconf-tcp-binding-port": 7778,
+ "netconf-ssh-enabled" : "true",
+ "netconf-ssh-binding-address": "127.0.0.1",
+ "netconf-ssh-binding-port": 2832,
+ "netconf-notification-stream-name": "honeycomb",
+
+ "username": "admin",
+ "password": "admin"
+} \ No newline at end of file
diff --git a/infra/bgp-distribution/src/test/resources/logback.xml b/infra/bgp-distribution/src/test/resources/logback.xml
new file mode 100644
index 000000000..2ee89db4e
--- /dev/null
+++ b/infra/bgp-distribution/src/test/resources/logback.xml
@@ -0,0 +1,31 @@
+ <!--
+ ~ Copyright (c) 2016 Cisco and/or its affiliates.
+ ~
+ ~ 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.
+ -->
+
+<configuration scan="true">
+
+ <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
+ <encoder>
+ <pattern>%date{"yyyy-MM-dd HH:mm:ss.SSS z"} [%thread] %-5level %logger{36} - %msg%n</pattern>
+ </encoder>
+ </appender>
+
+ <root level="warn">
+ <appender-ref ref="STDOUT" />
+ </root>
+
+ <logger name="org.opendaylight" level="INFO"/>
+ <logger name="io.fd" level="INFO"/>
+</configuration>