Support for MariaDB
[ccsdk/features.git] / sdnr / wt / data-provider / dblib / src / test / java / org / onap / ccsdk / features / sdnr / wt / dataprovider / dblib / test / util / MariaDBTestBase.java
1 /*
2  * ============LICENSE_START=======================================================
3  * ONAP : ccsdk features
4  * ================================================================================
5  * Copyright (C) 2021 highstreet technologies GmbH Intellectual Property.
6  * All rights reserved.
7  * ================================================================================
8  * Licensed under the Apache License, Version 2.0 (the "License");
9  * you may not use this file except in compliance with the License.
10  * You may obtain a copy of the License at
11  *
12  *     http://www.apache.org/licenses/LICENSE-2.0
13  *
14  * Unless required by applicable law or agreed to in writing, software
15  * distributed under the License is distributed on an "AS IS" BASIS,
16  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17  * See the License for the specific language governing permissions and
18  * limitations under the License.
19  * ============LICENSE_END=========================================================
20  *
21  */
22 package org.onap.ccsdk.features.sdnr.wt.dataprovider.dblib.test.util;
23
24 import static org.junit.Assert.fail;
25 import java.io.File;
26 import java.util.HashMap;
27 import java.util.Map;
28 import java.util.Random;
29 import org.onap.ccsdk.features.sdnr.wt.common.configuration.ConfigurationFileRepresentation;
30 import org.onap.ccsdk.features.sdnr.wt.common.configuration.subtypes.Section;
31 import org.onap.ccsdk.features.sdnr.wt.common.configuration.subtypes.Section.EnvGetter;
32 import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.sqldb.SqlDBClient;
33 import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.sqldb.SqlDBConfig;
34 import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.sqldb.data.SqlDBDataProvider;
35 import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.sqldb.database.SqlDBMapper;
36 import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.sqldb.database.SqlDBMapper.UnableToMapClassException;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.ConnectionlogEntity;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.Entity;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.EventlogEntity;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.FaultcurrentEntity;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.FaultlogEntity;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.GuicutthroughEntity;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.InventoryEntity;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.MaintenanceEntity;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.MediatorServerEntity;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.NetworkElementConnectionEntity;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.Pmdata15mEntity;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.Pmdata24hEntity;
49 import ch.vorburger.exec.ManagedProcessException;
50 import ch.vorburger.mariadb4j.DB;
51 import ch.vorburger.mariadb4j.DBConfigurationBuilder;
52
53 public class MariaDBTestBase {
54
55     private final SqlDBDataProvider dbProvider;
56     private final DB db;
57     private SqlDBConfig config;
58     private static final Map<String, String> envDefaultValues = initEnvDefaultValues();
59     private static final String SDNRDBDATABASETEST = "test";
60
61     public MariaDBTestBase() throws ManagedProcessException {
62         this(new Random().nextInt(1000) + 50000);
63     }
64
65     private static String dbUrl(String host, int port, String dbName) {
66         return String.format("jdbc:mysql://%s:%d/%s", host, port, dbName);
67     }
68
69     private static Map<String, String> initEnvDefaultValues() {
70         Map<String, String> defaults = new HashMap<>();
71         defaults.put("SDNRDBURL", dbUrl("localhost", 3306, SDNRDBDATABASETEST));
72         defaults.put("SDNRDBDATABASE", "test");
73
74         return defaults;
75     }
76
77     public MariaDBTestBase(String host, int port) {
78         this(host, port, SDNRDBDATABASETEST);
79     }
80
81     public MariaDBTestBase(String host, int port, String dbName) {
82         EnvGetter env = Section.getEnvGetter();
83         envDefaultValues.put("SDNRDBURL", dbUrl(host, port, dbName));
84         envDefaultValues.put("SDNRDBUSERNAME", "sdnrdb");
85         envDefaultValues.put("SDNRDBPASSWORD", "sdnrdb");
86         Section.setEnvGetter((envname) -> {
87             return envDefaultValues.getOrDefault(envname, env.getenv(envname));
88         });
89         this.config = new SqlDBConfig(new ConfigurationFileRepresentation("test.properties"));
90         this.config.setDbSuffix("");
91         this.config.setControllerId("test123");
92         this.db = null;
93         this.dbProvider = new SqlDBDataProvider(config, false);
94     }
95
96     public MariaDBTestBase(int port) throws ManagedProcessException {
97         EnvGetter env = Section.getEnvGetter();
98         envDefaultValues.put("SDNRDBURL", dbUrl("localhost", port, SDNRDBDATABASETEST));
99         Section.setEnvGetter((envname) -> {
100             return envDefaultValues.getOrDefault(envname, env.getenv(envname));
101         });
102         this.config = new SqlDBConfig(new ConfigurationFileRepresentation("test.properties"));
103         this.config.setDbSuffix("");
104         this.config.setControllerId("test123");
105         //start db server
106         this.db = startDatabase(port);
107         //create db with name sdnrdb
108         this.dbProvider = new SqlDBDataProvider(config, false);
109     }
110
111     public void close() throws ManagedProcessException {
112         if (db != null) {
113             this.db.stop();
114         }
115         File f = new File("test.properties");
116         if(f.exists()) {
117             f.delete();
118         }
119     }
120
121     public SqlDBDataProvider getDbProvider() {
122         return dbProvider;
123     }
124
125     public DB getDb() {
126         return db;
127     }
128
129     private static DB startDatabase(int port) throws ManagedProcessException {
130         // Start MariaDB4j database
131         DBConfigurationBuilder dbconfig = DBConfigurationBuilder.newBuilder();
132         dbconfig.setPort(port); // 0 => autom. detect free port
133         DB db = DB.newEmbeddedDB(dbconfig.build());
134         db.start();
135         return db;
136     }
137
138     public String getDBUrl() {
139         return envDefaultValues.get("SDNRDBURL");
140     }
141
142     public String getDBUsername() {
143         return envDefaultValues.getOrDefault("SDNRDBUSERNAME", "");
144     }
145
146     public String getDBPassword() {
147         return envDefaultValues.getOrDefault("SDNRDBPASSWORD", "");
148     }
149
150     public SqlDBClient createRawClient() {
151         return new SqlDBClient(this.config.getUrl(), this.config.getUsername(), this.config.getPassword());
152     }
153
154     public String getDBName() {
155         String url = this.getDBUrl();
156         return url.substring(url.lastIndexOf("/") + 1);
157     }
158
159     public static void testCreateTableStructure(SqlDBClient dbService) {
160         createTableOdl(dbService);
161         createTable(dbService, ConnectionlogEntity.class, Entity.Connectionlog, true);
162         createTable(dbService, EventlogEntity.class, Entity.Eventlog, true);
163         createTable(dbService, FaultcurrentEntity.class, Entity.Faultcurrent, false);
164         createTable(dbService, FaultlogEntity.class, Entity.Faultlog, true);
165         createTable(dbService, GuicutthroughEntity.class, Entity.Guicutthrough, false);
166         createTable(dbService, Pmdata15mEntity.class, Entity.Historicalperformance15min, false);
167         createTable(dbService, Pmdata24hEntity.class, Entity.Historicalperformance24h, false);
168         createTable(dbService, InventoryEntity.class, Entity.Inventoryequipment, false);
169         createTable(dbService, MaintenanceEntity.class, Entity.Maintenancemode, false);
170         createTable(dbService, MediatorServerEntity.class, Entity.MediatorServer, true);
171         createTable(dbService, NetworkElementConnectionEntity.class, Entity.NetworkelementConnection, false);
172     }
173
174     public static boolean createTableOdl(SqlDBClient dbService) {
175         String createStatement = null;
176         createStatement = SqlDBMapper.createTableOdl();
177         System.out.println(createStatement);
178         return dbService.createTable(createStatement);
179     }
180
181     public static boolean createTable(SqlDBClient dbService, Class<?> cls, Entity entity, boolean autoIndex) {
182         String createStatement = null;
183         try {
184             createStatement = SqlDBMapper.createTable(cls, entity, "", autoIndex);
185         } catch (UnableToMapClassException e) {
186             fail(e.getMessage());
187         }
188         System.out.println(createStatement);
189         return dbService.createTable(createStatement);
190     }
191 }
192