/** * 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 * <p/> * http://www.apache.org/licenses/LICENSE-2.0 * <p/> * 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.ambari.view.huetoambarimigration.migration.revertchange; import java.beans.PropertyVetoException; import java.io.BufferedReader; import java.io.File; import java.io.IOException; import java.net.URISyntaxException; import java.security.PrivilegedExceptionAction; import java.sql.Connection; import java.sql.SQLException; import java.sql.Statement; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.List; import org.apache.ambari.view.ViewContext; import org.apache.ambari.view.huetoambarimigration.resources.scripts.models.MigrationModel; import org.apache.ambari.view.huetoambarimigration.persistence.utils.ItemNotFound; import org.apache.ambari.view.huetoambarimigration.resources.PersonalCRUDResourceManager; import org.apache.ambari.view.huetoambarimigration.resources.scripts.MigrationResourceManager; import org.apache.ambari.view.huetoambarimigration.resources.scripts.models.MigrationResponse; import org.apache.log4j.Logger; import org.jdom.Document; import org.jdom.Element; import org.jdom.JDOMException; import org.jdom.input.SAXBuilder; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; import org.apache.hadoop.security.UserGroupInformation; import org.apache.ambari.view.huetoambarimigration.datasource.DataSourceAmbariDatabase; import org.apache.ambari.view.huetoambarimigration.migration.configuration.ConfigurationCheckImplementation; public class RevertChangeUtility { protected MigrationResourceManager resourceManager = null; public synchronized PersonalCRUDResourceManager<MigrationResponse> getResourceManager(ViewContext view) { if (resourceManager == null) { resourceManager = new MigrationResourceManager(view); } return resourceManager; } public boolean stringtoDatecompare(String datefromservlet, String datefromfile) throws ParseException { SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); Date date1 = formatter.parse(datefromservlet); Date date2 = formatter.parse(datefromfile); if (date1.compareTo(date2) < 0) { return true; } else { return false; } } public void removedir(final String dir, final String namenodeuri) throws IOException, URISyntaxException { try { UserGroupInformation ugi = UserGroupInformation .createRemoteUser("hdfs"); ugi.doAs(new PrivilegedExceptionAction<Void>() { public Void run() throws Exception { Configuration conf = new Configuration(); conf.set("fs.hdfs.impl", org.apache.hadoop.hdfs.DistributedFileSystem.class .getName()); conf.set("fs.file.impl", org.apache.hadoop.fs.LocalFileSystem.class .getName()); conf.set("fs.defaultFS", namenodeuri); conf.set("hadoop.job.ugi", "hdfs"); FileSystem fs = FileSystem.get(conf); Path src = new Path(dir); fs.delete(src, true); return null; } }); } catch (Exception e) { e.printStackTrace(); } } public MigrationModel revertChangeUtility(String instance, String revertDate,String jobid,ViewContext view,MigrationResponse migrationresult) throws IOException, ItemNotFound { long startTime = System.currentTimeMillis(); final Logger logger = Logger.getLogger(RevertChangeUtility.class); logger.info("------------------------------"); logger.info("Reverting the changes Start:"); logger.info("------------------------------"); logger.info("Revert Date " + revertDate); logger.info("instance name " + instance); int i = 0; BufferedReader br = null; Connection connectionAmbariDatabase = null; try { connectionAmbariDatabase = DataSourceAmbariDatabase.getInstance(view.getProperties().get("ambaridrivername"), view.getProperties().get("ambarijdbcurl"), view.getProperties().get("ambaridbusername"), view.getProperties().get("ambaridbpassword")).getConnection(); connectionAmbariDatabase.setAutoCommit(false); Statement stmt = null; stmt = connectionAmbariDatabase.createStatement(); SAXBuilder builder = new SAXBuilder(); File xmlFile = new File(ConfigurationCheckImplementation.getHomeDir() + "RevertChangesService.xml"); try { Document document = (Document) builder.build(xmlFile); Element rootNode = document.getRootElement(); List list = rootNode.getChildren("RevertRecord"); logger.info("list size is = "+list.size()); for (i = 0; i < list.size(); i++) { float calc = ((float) (i + 1)) / list.size() * 100; int progressPercentage = Math.round(calc); migrationresult.setIsNoQuerySelected("yes"); migrationresult.setProgressPercentage(progressPercentage); migrationresult.setNumberOfQueryTransfered(i+1); migrationresult.setTotalNoQuery(list.size()); getResourceManager(view).update(migrationresult, jobid); Element node = (Element) list.get(i); if (node.getChildText("instance").equals(instance)) { logger.info("instance matched"); if (stringtoDatecompare(revertDate, node.getChildText("datetime").toString())) { logger.info("date is less query is sucess"); String sql = node.getChildText("query"); logger.info(sql); stmt.executeUpdate(sql); removedir(node.getChildText("dirname").toString(), view.getProperties().get("namenode_URI_Ambari")); logger.info(node.getChildText("dirname").toString() + " deleted"); } else { logger.info("date is big query is failed"); } } } connectionAmbariDatabase.commit(); logger.info("------------------------------"); logger.info("Reverting the changes End"); logger.info("------------------------------"); } catch (IOException e) { logger.error("IOException: ", e); } catch (ParseException e) { logger.error("ParseException: ", e); } catch (JDOMException e) { logger.error("JDOMException: ", e); } catch (URISyntaxException e) { logger.error("URISyntaxException: ", e); } } catch (SQLException e1) { logger.error("SqlException ", e1); try { connectionAmbariDatabase.rollback(); logger.info("Rollback done"); } catch (SQLException e2) { logger.error("SqlException in Rollback ", e2); } } catch (PropertyVetoException e) { logger.error("PropertyVetoException: ", e); } long stopTime = System.currentTimeMillis(); long elapsedTime = stopTime - startTime; MigrationModel model = new MigrationModel(); // model.setInstanceName(instance); // model.setNumberofQueryTransfered(i + 1); // model.setTimeTakentotransfer(String.valueOf(elapsedTime)); return model; } }