content: // Licensed to the Apache Software Foundation (ASF) under one
  // or more contributor license agreements.  See the NOTICE file
  // distributed with this work for additional information
  // regarding copyright ownership.  The ASF licenses this file
  // to you 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 org.apache.cloudstack.network.contrail.management;
  
  import java.io.BufferedReader;
  import java.io.File;
  import java.io.InputStreamReader;
  import java.net.ServerSocket;
  
  import org.apache.commons.configuration.PropertiesConfiguration;
  
  public class TestDbSetup {
  
      public static int findFreePort() throws Exception {
  
          int port;
          ServerSocket socket = new ServerSocket(0);
          port = socket.getLocalPort();
          socket.close();
  
          return port;
      }
  
      public static void startMysqlServer(int port, String startMysqlScript) throws Exception {
  
          try {
              String cwd = new java.io.File(".").getCanonicalPath();
              Runtime r = Runtime.getRuntime();
              String script = startMysqlScript;
              if (script == null) {
                  script = "test/resources/mysql_db_start.sh " + port;
              }
              Process process = r.exec("sh " + cwd + "/" + script);
              process.waitFor();
              System.out.println("new sql server instance launched on port: " + port);
          } catch (Exception e) {
  
              String cause = e.getMessage();
              if (cause.equals("sh: not found"))
                  System.out.println("No sh interpreter found.");
              throw e;
          }
      }
  
      public static void stopMysqlServer(int port, String stopMysqlScript) throws Exception {
  
          try {
              Runtime r = Runtime.getRuntime();
              String script = stopMysqlScript;
              if (script == null) {
                  script = "test/resources/mysql_db_stop.sh " + port;
              }
              Process process = r.exec("sh " + script);
              process.waitFor();
              System.out.println("sql server instance running at port " + port + " stopped");
          } catch (Exception e) {
  
              String cause = e.getMessage();
              if (cause.equals("sh: not found"))
                  System.out.println("No sh interpreter found.");
              throw e;
          }
      }
  
      /* this is required for deploying db with new set of sql server parameters */
      public static void copyDbPropertiesFile() throws Exception {
          Runtime.getRuntime().exec("cp ../../../utils/conf/db.properties ../../../utils/conf/db.properties.override");
      }
  
      public static void updateSqlPort(int port, String propertyFileOverride) throws Exception {
  
          PropertiesConfiguration config = new PropertiesConfiguration(propertyFileOverride);
          System.out.println("File: " + propertyFileOverride + "; old: db.properties port: " + config.getProperty("db.cloud.port") + ", new port: " + port);
          config.setProperty("db.cloud.port", "" + port);
          config.setProperty("db.cloud.username", System.getProperty("user.name"));
          config.setProperty("db.cloud.password", "");
  
          config.setProperty("db.usage.port", "" + port);
          config.setProperty("db.usage.username", System.getProperty("user.name"));
          config.setProperty("db.usage.password", "");
  
          config.setProperty("db.simulator.port", "" + port);
          config.setProperty("db.simulator.username", System.getProperty("user.name"));
          config.setProperty("db.simulator.password", "");
  
          config.save();
      }
  
      public static void initCloudstackDb() throws Exception {
          try {
              File dir = new File("../../../");
              Runtime r = Runtime.getRuntime();
              Process process = r.exec("mvn -P developer -pl developer -Ddeploydb ", null, dir);
              dumpProcessOutput(process);
              process.waitFor();
          } catch (Exception e) {
              String cause = e.getMessage();
              System.out.println("e: " + cause);
              throw e;
          }
      }
  
      public static void dumpProcessOutput(Process p) throws Exception {
  
          BufferedReader istream = null;
          istream = new BufferedReader(new InputStreamReader(p.getInputStream()));
          String line = null;
          while ((line = istream.readLine()) != null) {
              System.out.println(line);
          }
      }
  
      public static int init(String startScript) throws Exception {
          int port = TestDbSetup.findFreePort();
          TestDbSetup.startMysqlServer(port, startScript);
          copyDbPropertiesFile();
          /* both of these files needs to have mysql port, username password details */
          TestDbSetup.updateSqlPort(port, "db.properties"); /* for cloudstack runtime */
          TestDbSetup.updateSqlPort(port, "../../../utils/conf/db.properties.override"); /* for deploying db */
          TestDbSetup.initCloudstackDb();
          return port;
      }
  
      public static void destroy(int port, String stopScript) throws Exception {
          TestDbSetup.stopMysqlServer(port, stopScript);
      }
  }
  