Initial hardware_vtep schema changes 21/8221/2
authorMadhu Venugopal <mavenugo@gmail.com>
Sun, 22 Jun 2014 15:13:43 +0000 (08:13 -0700)
committerMadhu Venugopal <mavenugo@gmail.com>
Mon, 23 Jun 2014 17:37:03 +0000 (10:37 -0700)
These initial fixes wont consider IntegrationTests because vtep schema is not enabled in OpenVSwitch soft switches
and we need an vtep emulator to have this Integration Tested.

We need to invest extra effort in getting such a IT infra in place & hence the IT for hardware_vtep schema can be
considered once the hardware_vtep emulator setup is in place.

Change-Id: Ia60bac094a7ca3321be531ad3d16b9fd17ca18da
Signed-off-by: Madhu Venugopal <mavenugo@gmail.com>
schemas/hardware_vtep/pom.xml [new file with mode: 0755]
schemas/hardware_vtep/src/main/java/org/opendaylight/ovsdb/schema/hardwarevtep/Global.java [new file with mode: 0644]
schemas/hardware_vtep/src/main/java/org/opendaylight/ovsdb/schema/hardwarevtep/Manager.java [new file with mode: 0644]
schemas/hardware_vtep/src/test/java/org/opendaylight/ovsdb/schema/hardwarevtep/OvsdbTestBase.java [new file with mode: 0644]
schemas/hardware_vtep/src/test/java/org/opendaylight/ovsdb/schema/hardwarevtep/TypedHardwareVTepSchemaIT.java [new file with mode: 0644]
schemas/hardware_vtep/src/test/resources/logback.xml [new file with mode: 0644]

diff --git a/schemas/hardware_vtep/pom.xml b/schemas/hardware_vtep/pom.xml
new file mode 100755 (executable)
index 0000000..78f93c3
--- /dev/null
@@ -0,0 +1,180 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+  <parent>
+    <groupId>org.opendaylight.ovsdb</groupId>
+    <artifactId>ovsdb_commons</artifactId>
+    <version>1.1.0-SNAPSHOT</version>
+    <relativePath>../../commons/parent</relativePath>
+  </parent>
+  <artifactId>ovsdb_schema.hardware_vtep</artifactId>
+  <version>1.0.0-SNAPSHOT</version>
+  <packaging>bundle</packaging>
+
+  <properties>
+    <skip.integrationtest>true</skip.integrationtest>
+  </properties>
+  <dependencies>
+    <dependency>
+      <groupId>ch.qos.logback</groupId>
+      <artifactId>logback-classic</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>ch.qos.logback</groupId>
+      <artifactId>logback-core</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>com.fasterxml.jackson.core</groupId>
+      <artifactId>jackson-annotations</artifactId>
+      <version>${jackson.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>com.fasterxml.jackson.core</groupId>
+      <artifactId>jackson-core</artifactId>
+      <version>${jackson.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>com.fasterxml.jackson.core</groupId>
+      <artifactId>jackson-databind</artifactId>
+      <version>${jackson.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>com.google.code.gson</groupId>
+      <artifactId>gson</artifactId>
+      <version>2.1</version>
+      <scope>compile</scope>
+    </dependency>
+    <dependency>
+      <groupId>com.google.guava</groupId>
+      <artifactId>guava</artifactId>
+      <version>${guava.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>commons-codec</groupId>
+      <artifactId>commons-codec</artifactId>
+      <version>1.4</version>
+      <optional>true</optional>
+    </dependency>
+    <dependency>
+      <groupId>commons-collections</groupId>
+      <artifactId>commons-collections</artifactId>
+      <version>1.0</version>
+    </dependency>
+    <dependency>
+      <groupId>commons-lang</groupId>
+      <artifactId>commons-lang</artifactId>
+      <version>2.3</version>
+    </dependency>
+    <dependency>
+      <groupId>equinoxSDK381</groupId>
+      <artifactId>org.eclipse.osgi</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>io.netty</groupId>
+      <artifactId>netty-all</artifactId>
+      <version>4.0.10.Final</version>
+    </dependency>
+    <dependency>
+      <groupId>javax.portlet</groupId>
+      <artifactId>portlet-api</artifactId>
+      <version>2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>junit</groupId>
+      <artifactId>junit</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.httpcomponents</groupId>
+      <artifactId>httpcore-nio</artifactId>
+      <version>4.2.1</version>
+      <optional>true</optional>
+    </dependency>
+    <dependency>
+      <groupId>org.opendaylight.ovsdb</groupId>
+      <artifactId>ovsdb_library</artifactId>
+      <version>1.0.0-SNAPSHOT</version>
+    </dependency>
+    <dependency>
+      <groupId>org.slf4j</groupId>
+      <artifactId>slf4j-api</artifactId>
+    </dependency>
+  </dependencies>
+
+  <build>
+    <testResources>
+      <testResource>
+        <filtering>true</filtering>
+        <directory>src/test/resources</directory>
+      </testResource>
+    </testResources>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.felix</groupId>
+        <artifactId>maven-bundle-plugin</artifactId>
+        <version>2.3.6</version>
+        <extensions>true</extensions>
+        <configuration>
+          <instructions>
+            <Import-Package>org.opendaylight.ovsdb.lib,
+                org.opendaylight.ovsdb.lib.table,
+                org.opendaylight.ovsdb.lib.jsonrpc,
+                org.opendaylight.ovsdb.lib.notation,
+                org.opendaylight.ovsdb.lib.database,
+                org.opendaylight.ovsdb.lib.operations,
+                org.opendaylight.ovsdb.lib.message,
+                org.opendaylight.ovsdb.lib.schema,
+                org.opendaylight.ovsdb.lib.schema.typed,
+                org.apache.commons.lang3.builder,
+                org.apache.commons.lang3.tuple,
+                org.apache.felix.dm,
+                org.slf4j,
+                org.eclipse.osgi.framework.console,
+                org.osgi.framework,
+                javax.net.ssl,
+                *</Import-Package>
+            <Embed-Transitive>true</Embed-Transitive>
+            <Export-Package>org.opendaylight.ovsdb.schema.hardwarevtep</Export-Package>
+          </instructions>
+          <manifestLocation>${project.basedir}/META-INF</manifestLocation>
+        </configuration>
+      </plugin>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-failsafe-plugin</artifactId>
+        <configuration>
+          <skipITs>${skip.integrationtest}</skipITs>
+          <includes>
+            <include>**/*IT*</include>
+          </includes>
+        </configuration>
+      </plugin>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-surefire-plugin</artifactId>
+        <version>2.16</version>
+        <configuration>
+          <excludes>
+            <!--  Exclude integration tests -->
+            <exclude>**/*IT*</exclude>
+          </excludes>
+        </configuration>
+      </plugin>
+    </plugins>
+  </build>
+  <scm>
+    <connection>scm:git:ssh://git.opendaylight.org:29418/ovsdb.git</connection>
+    <developerConnection>scm:git:ssh://git.opendaylight.org:29418/ovsdb.git</developerConnection>
+    <tag>HEAD</tag>
+    <url>https://wiki.opendaylight.org/view/OVSDB_Integration:Main</url>
+  </scm>
+
+  <profiles>
+    <profile>
+      <id>integrationtest</id>
+      <activation></activation>
+      <properties>
+        <skip.integrationtest>false</skip.integrationtest>
+      </properties>
+    </profile>
+  </profiles>
+</project>
diff --git a/schemas/hardware_vtep/src/main/java/org/opendaylight/ovsdb/schema/hardwarevtep/Global.java b/schemas/hardware_vtep/src/main/java/org/opendaylight/ovsdb/schema/hardwarevtep/Global.java
new file mode 100644 (file)
index 0000000..31c0f2f
--- /dev/null
@@ -0,0 +1,37 @@
+/*
+ * Copyright (C) 2014 Red Hat, Inc.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Authors : Madhu Venugopal
+ */
+
+package org.opendaylight.ovsdb.schema.hardwarevtep;
+
+import java.util.Set;
+
+import org.opendaylight.ovsdb.lib.notation.Column;
+import org.opendaylight.ovsdb.lib.notation.UUID;
+import org.opendaylight.ovsdb.lib.schema.GenericTableSchema;
+import org.opendaylight.ovsdb.lib.schema.typed.MethodType;
+import org.opendaylight.ovsdb.lib.schema.typed.TypedBaseTable;
+import org.opendaylight.ovsdb.lib.schema.typed.TypedColumn;
+import org.opendaylight.ovsdb.lib.schema.typed.TypedTable;
+
+@TypedTable(name="Global", database="hardware_vtep", fromVersion="1.0.0")
+public interface Global extends TypedBaseTable {
+
+    @TypedColumn(name="managers", method=MethodType.GETCOLUMN, fromVersion="1.0.0")
+    public Column<GenericTableSchema, Set<UUID>> getManagersColumn();
+
+    @TypedColumn(name="managers", method=MethodType.SETDATA, fromVersion="1.0.0")
+    public void setManagers(Set<UUID> managers);
+
+    @TypedColumn(name="switches", method=MethodType.GETCOLUMN, fromVersion="1.0.0")
+    public Column<GenericTableSchema, Set<UUID>> getSwitchesColumn();
+
+    @TypedColumn(name="switches", method=MethodType.SETDATA, fromVersion="1.0.0")
+    public void setSwitches(Set<UUID> switches);
+}
diff --git a/schemas/hardware_vtep/src/main/java/org/opendaylight/ovsdb/schema/hardwarevtep/Manager.java b/schemas/hardware_vtep/src/main/java/org/opendaylight/ovsdb/schema/hardwarevtep/Manager.java
new file mode 100644 (file)
index 0000000..b5a0852
--- /dev/null
@@ -0,0 +1,61 @@
+/*
+ * Copyright (C) 2014 Red Hat, Inc.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Authors : Madhu Venugopal
+ */
+
+package org.opendaylight.ovsdb.schema.hardwarevtep;
+
+import java.util.Map;
+import java.util.Set;
+
+import org.opendaylight.ovsdb.lib.notation.Column;
+import org.opendaylight.ovsdb.lib.schema.GenericTableSchema;
+import org.opendaylight.ovsdb.lib.schema.typed.MethodType;
+import org.opendaylight.ovsdb.lib.schema.typed.TypedBaseTable;
+import org.opendaylight.ovsdb.lib.schema.typed.TypedColumn;
+import org.opendaylight.ovsdb.lib.schema.typed.TypedTable;
+
+@TypedTable(name="Manager", database="hardware_vtep", fromVersion="1.0.0")
+public interface Manager extends TypedBaseTable {
+
+    @TypedColumn(name="target", method=MethodType.GETCOLUMN, fromVersion="1.0.0")
+    public Column<GenericTableSchema, String> getTargetColumn();
+
+    @TypedColumn(name="target", method=MethodType.SETDATA, fromVersion="1.0.0")
+    public void setTarget(String target);
+
+    @TypedColumn(name="max_backoff", method=MethodType.GETCOLUMN, fromVersion="1.0.0")
+    public Column<GenericTableSchema, Set<Integer>> getMaxBackoffColumn();
+
+    @TypedColumn(name="max_backoff", method=MethodType.SETDATA, fromVersion="1.0.0")
+    public void setMaxBackoff(Set<Integer> maxBackoff);
+
+    @TypedColumn(name="inactivity_probe", method=MethodType.GETCOLUMN, fromVersion="1.0.0")
+    public Column<GenericTableSchema, Set<Integer>> getInactivityProbeColumn();
+
+    @TypedColumn(name="inactivity_probe", method=MethodType.SETDATA, fromVersion="1.0.0")
+    public void setInactivityProbe(Set<Integer> inactivityProbe);
+
+    @TypedColumn(name="other_config", method=MethodType.GETCOLUMN, fromVersion="1.0.0")
+    public Column<GenericTableSchema, Map<String, String>> getOtherConfigColumn();
+
+    @TypedColumn(name="other_config", method=MethodType.SETDATA, fromVersion="1.0.0")
+    public void setOtherConfig(Map<String, String> otherConfig);
+
+    @TypedColumn(name="is_connected", method=MethodType.GETCOLUMN, fromVersion="1.0.0")
+    public Column<GenericTableSchema, Boolean> getIsConnectedColumn();
+
+    @TypedColumn(name="is_connected", method=MethodType.SETDATA, fromVersion="1.0.0")
+    public void setIsConnectedColumn(Boolean isConnected);
+
+    @TypedColumn(name="status", method=MethodType.GETCOLUMN, fromVersion="1.0.0")
+    public Column<GenericTableSchema, Map<String, String>> getStatusColumn();
+
+    @TypedColumn(name="status", method=MethodType.SETDATA, fromVersion="1.0.0")
+    public void setStatus(Map<String, String> status);
+}
\ No newline at end of file
diff --git a/schemas/hardware_vtep/src/test/java/org/opendaylight/ovsdb/schema/hardwarevtep/OvsdbTestBase.java b/schemas/hardware_vtep/src/test/java/org/opendaylight/ovsdb/schema/hardwarevtep/OvsdbTestBase.java
new file mode 100644 (file)
index 0000000..2a83c07
--- /dev/null
@@ -0,0 +1,136 @@
+/*
+ * Copyright (C) 2014 Red Hat, Inc.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Authors : Madhu Venugopal
+ */
+
+package org.opendaylight.ovsdb.schema.hardwarevtep;
+
+import io.netty.bootstrap.Bootstrap;
+import io.netty.channel.AdaptiveRecvByteBufAllocator;
+import io.netty.channel.Channel;
+import io.netty.channel.ChannelFuture;
+import io.netty.channel.ChannelInitializer;
+import io.netty.channel.ChannelOption;
+import io.netty.channel.nio.NioEventLoopGroup;
+import io.netty.channel.socket.SocketChannel;
+import io.netty.channel.socket.nio.NioSocketChannel;
+import io.netty.handler.codec.string.StringEncoder;
+import io.netty.util.CharsetUtil;
+
+import java.io.IOException;
+import java.net.InetAddress;
+import java.util.Properties;
+import java.util.concurrent.ExecutionException;
+
+import junit.framework.Assert;
+
+import org.opendaylight.ovsdb.lib.jsonrpc.JsonRpcDecoder;
+import org.opendaylight.ovsdb.lib.jsonrpc.JsonRpcEndpoint;
+import org.opendaylight.ovsdb.lib.jsonrpc.JsonRpcServiceBinderHandler;
+import org.opendaylight.ovsdb.lib.message.OvsdbRPC;
+
+import com.fasterxml.jackson.annotation.JsonInclude.Include;
+import com.fasterxml.jackson.databind.DeserializationFeature;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+public abstract class OvsdbTestBase implements OvsdbRPC.Callback{
+    private final static String SERVER_IPADDRESS = "ovsdbserver.ipaddress";
+    private final static String SERVER_PORT = "ovsdbserver.port";
+    private final static String DEFAULT_SERVER_PORT = "6640";
+
+    /**
+     * Represents the Hardware VTEP Schema
+     */
+    public final static String HARDWARE_VTEP_SCHEMA = "hardware_vtep";
+
+    public Properties loadProperties() {
+        Properties props = new Properties(System.getProperties());
+        return props;
+    }
+
+    private Channel connect(String addressStr, String portStr) {
+        InetAddress address;
+        try {
+            address = InetAddress.getByName(addressStr);
+        } catch (Exception e) {
+            System.out.println("Unable to resolve " + addressStr);
+            e.printStackTrace();
+            return null;
+        }
+
+        Integer port;
+        try {
+            port = Integer.parseInt(portStr);
+        } catch (NumberFormatException e) {
+            System.out.println("Invalid port number : " + portStr);
+            e.printStackTrace();
+            return null;
+        }
+
+        try {
+            Bootstrap bootstrap = new Bootstrap();
+            bootstrap.group(new NioEventLoopGroup());
+            bootstrap.channel(NioSocketChannel.class);
+            bootstrap.option(ChannelOption.TCP_NODELAY, true);
+            bootstrap.option(ChannelOption.RCVBUF_ALLOCATOR, new AdaptiveRecvByteBufAllocator(65535, 65535, 65535));
+
+            bootstrap.handler(new ChannelInitializer<SocketChannel>() {
+                @Override
+                public void initChannel(SocketChannel channel) throws Exception {
+                    channel.pipeline().addLast(
+                            //new LoggingHandler(LogLevel.INFO),
+                            new JsonRpcDecoder(100000),
+                            new StringEncoder(CharsetUtil.UTF_8));
+                }
+            });
+
+            ChannelFuture future = bootstrap.connect(address, port).sync();
+            Channel channel = future.channel();
+            return channel;
+        } catch (InterruptedException e) {
+            System.out.println("Thread was interrupted during connect");
+        }
+        return null;
+    }
+
+    public OvsdbRPC getTestConnection() throws IOException {
+        Properties props = loadProperties();
+        String address = props.getProperty(SERVER_IPADDRESS);
+        String port = props.getProperty(SERVER_PORT, DEFAULT_SERVER_PORT);
+
+        if (address == null) {
+            Assert.fail("Integration Test requires a valid ovsdbserver.ipaddress value.\n" +
+                        "Usage : mvn -Pintegrationtest -Dovsdbserver.ipaddress=x.x.x.x -Dovsdbserver.port=yyyy verify");
+        }
+        Channel channel = this.connect(address, port);
+        if (channel == null) {
+            throw new IOException("Failed to connect to ovsdb server");
+        }
+        try {
+            return this.handleNewConnection(channel);
+        } catch (InterruptedException | ExecutionException e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+    private OvsdbRPC handleNewConnection(Channel channel) throws InterruptedException, ExecutionException {
+        ObjectMapper objectMapper = new ObjectMapper();
+        objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+        objectMapper.setSerializationInclusion(Include.NON_NULL);
+
+        JsonRpcEndpoint factory = new JsonRpcEndpoint(objectMapper, channel);
+        JsonRpcServiceBinderHandler binderHandler = new JsonRpcServiceBinderHandler(factory);
+        binderHandler.setContext(channel);
+        channel.pipeline().addLast(binderHandler);
+
+        OvsdbRPC ovsdb = factory.getClient(channel, OvsdbRPC.class);
+        ovsdb.registerCallback(this);
+        return ovsdb;
+    }
+}
diff --git a/schemas/hardware_vtep/src/test/java/org/opendaylight/ovsdb/schema/hardwarevtep/TypedHardwareVTepSchemaIT.java b/schemas/hardware_vtep/src/test/java/org/opendaylight/ovsdb/schema/hardwarevtep/TypedHardwareVTepSchemaIT.java
new file mode 100644 (file)
index 0000000..da23ccc
--- /dev/null
@@ -0,0 +1,87 @@
+/*
+ * Copyright (C) 2014 Red Hat, Inc.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Authors : Madhu Venugopal
+ */
+package org.opendaylight.ovsdb.schema.hardwarevtep;
+
+import java.io.IOException;
+import java.util.List;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+
+import junit.framework.Assert;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.opendaylight.ovsdb.lib.OvsDBClientImpl;
+import org.opendaylight.ovsdb.lib.message.OvsdbRPC;
+import org.opendaylight.ovsdb.lib.message.UpdateNotification;
+import org.opendaylight.ovsdb.lib.schema.DatabaseSchema;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.google.common.util.concurrent.ListenableFuture;
+
+public class TypedHardwareVTepSchemaIT extends OvsdbTestBase {
+
+    Logger logger = LoggerFactory.getLogger(TypedHardwareVTepSchemaIT.class);
+    OvsDBClientImpl ovs;
+    DatabaseSchema dbSchema = null;
+
+    @Test
+    public void testGetDBs() throws ExecutionException, InterruptedException {
+        ListenableFuture<List<String>> databases = ovs.getDatabases();
+        List<String> dbNames = databases.get();
+        Assert.assertNotNull(dbNames);
+        boolean hasHardwareVTepSchema = false;
+        for(String dbName : dbNames) {
+           if (dbName.equals(HARDWARE_VTEP_SCHEMA)) {
+                hasHardwareVTepSchema = true;
+                break;
+           }
+        }
+        Assert.assertTrue(HARDWARE_VTEP_SCHEMA+" schema is not supported by the switch", hasHardwareVTepSchema);
+    }
+
+    @Before
+    public  void setUp() throws IOException, ExecutionException, InterruptedException {
+        if (ovs != null) {
+            return;
+        }
+        OvsdbRPC rpc = getTestConnection();
+        if (rpc == null) {
+            System.out.println("Unable to Establish Test Connection");
+        }
+        ExecutorService executorService = Executors.newFixedThreadPool(3);
+        ovs = new OvsDBClientImpl(rpc, executorService);
+        testGetDBs();
+        dbSchema = ovs.getSchema(HARDWARE_VTEP_SCHEMA, true).get();
+    }
+
+    @After
+    public void tearDown() throws InterruptedException, ExecutionException {
+    }
+
+    @Override
+    public void update(Object node, UpdateNotification upadateNotification) {
+        // TODO Auto-generated method stub
+
+    }
+    @Override
+    public void locked(Object node, List<String> ids) {
+        // TODO Auto-generated method stub
+
+    }
+    @Override
+    public void stolen(Object node, List<String> ids) {
+        // TODO Auto-generated method stub
+
+    }
+}
diff --git a/schemas/hardware_vtep/src/test/resources/logback.xml b/schemas/hardware_vtep/src/test/resources/logback.xml
new file mode 100644 (file)
index 0000000..70118ce
--- /dev/null
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<configuration>
+
+    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
+        <!-- encoders are assigned the type
+             ch.qos.logback.classic.encoder.PatternLayoutEncoder by default -->
+        <encoder>
+            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{5} - %msg%n</pattern>
+        </encoder>
+    </appender>
+
+    <logger name="org.opendaylight.ovsdb.lib.jsonrpc.JsonRpcEndpoint" level="TRACE" additivity="false">
+        <appender-ref ref="STDOUT" />
+    </logger>
+
+    <!--<logger name="com.lordofthejars.foo" level="INFO" additivity="false">-->
+        <!--<appender-ref ref="STDOUT" />-->
+    <!--</logger>-->
+
+    <root level="INFO">
+        <appender-ref ref="STDOUT" />
+    </root>
+
+</configuration>
\ No newline at end of file