/**
   * Perform sentry store schema upgrade
   *
   * @param fromSchemaVer Existing version of the sentry store. If null, then read from the sentry
   *     store
   * @throws SentryUserException
   */
  public void doUpgrade(String fromSchemaVer) throws SentryUserException {
    if (SentryStoreSchemaInfo.getSentrySchemaVersion().equals(fromSchemaVer)) {
      System.out.println("No schema upgrade required from version " + fromSchemaVer);
      return;
    }
    // Find the list of scripts to execute for this upgrade
    List<String> upgradeScripts = SentryStoreSchemaInfo.getUpgradeScripts(fromSchemaVer);
    testConnectionToMetastore();
    System.out.println(
        "Starting upgrade sentry store schema from version "
            + fromSchemaVer
            + " to "
            + SentryStoreSchemaInfo.getSentrySchemaVersion());
    String scriptDir = SentryStoreSchemaInfo.getSentryStoreScriptDir();
    try {
      for (String scriptFile : upgradeScripts) {
        System.out.println("Upgrade script " + scriptFile);
        if (!dryRun) {
          runBeeLine(scriptDir, scriptFile);
          System.out.println("Completed " + scriptFile);
        }
      }
    } catch (IOException eIO) {
      throw new SentryUserException(
          "Upgrade FAILED! Metastore state would be inconsistent !!", eIO);
    }

    // Revalidated the new version after upgrade
    verifySchemaVersion();
  }
 /**
  * * Print Hive version and schema version
  *
  * @throws SentryUserException
  */
 public void showInfo() throws SentryUserException {
   Connection sentryStoreConn = getConnectionToMetastore(true);
   System.out.println(
       "Sentry distribution version:\t " + SentryStoreSchemaInfo.getSentryVersion());
   System.out.println(
       "SentryStore schema version:\t " + getMetaStoreSchemaVersion(sentryStoreConn));
 }
  /**
   * Initialize the sentry store schema
   *
   * @param toVersion If null then current hive version is used
   * @throws SentryUserException
   */
  public void doInit(String toVersion) throws SentryUserException {
    testConnectionToMetastore();
    System.out.println("Starting sentry store schema initialization to " + toVersion);

    String initScriptDir = SentryStoreSchemaInfo.getSentryStoreScriptDir();
    String initScriptFile = SentryStoreSchemaInfo.generateInitFileName(toVersion);

    try {
      System.out.println("Initialization script " + initScriptFile);
      if (!dryRun) {
        runBeeLine(initScriptDir, initScriptFile);
        System.out.println("Initialization script completed");
      }
    } catch (IOException e) {
      throw new SentryUserException(
          "Schema initialization FAILED!" + " Metastore state would be inconsistent !!", e);
    }
  }
 /**
  * check if the current schema version in sentry store matches the Hive version
  *
  * @throws SentryUserException
  */
 public void verifySchemaVersion() throws SentryUserException {
   // don't check version if its a dry run
   if (dryRun) {
     return;
   }
   String newSchemaVersion = getMetaStoreSchemaVersion(getConnectionToMetastore(false));
   // verify that the new version is added to schema
   if (!SentryStoreSchemaInfo.getSentrySchemaVersion().equalsIgnoreCase(newSchemaVersion)) {
     throw new SentryUserException("Found unexpected schema version " + newSchemaVersion);
   }
 }
  /**
   * Initialize the sentry store schema to current version
   *
   * @throws SentryUserException
   */
  public void doInit() throws SentryUserException {
    doInit(SentryStoreSchemaInfo.getSentrySchemaVersion());

    // Revalidated the new version after upgrade
    verifySchemaVersion();
  }