http://git-wip-us.apache.org/repos/asf/ambari/blob/853a1ce7/contrib/views/hive20/src/main/java/org/apache/ambari/view/hive20/resources/uploads/query/DeleteQueryInput.java ---------------------------------------------------------------------- diff --git a/contrib/views/hive20/src/main/java/org/apache/ambari/view/hive20/resources/uploads/query/DeleteQueryInput.java b/contrib/views/hive20/src/main/java/org/apache/ambari/view/hive20/resources/uploads/query/DeleteQueryInput.java new file mode 100644 index 0000000..e7cbf0a --- /dev/null +++ b/contrib/views/hive20/src/main/java/org/apache/ambari/view/hive20/resources/uploads/query/DeleteQueryInput.java @@ -0,0 +1,48 @@ +/** + * 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.hive20.resources.uploads.query; + +public class DeleteQueryInput { + private String database; + private String table; + + public DeleteQueryInput() { + } + + public DeleteQueryInput(String database, String table) { + this.database = database; + this.table = table; + } + + public String getDatabase() { + return database; + } + + public void setDatabase(String database) { + this.database = database; + } + + public String getTable() { + return table; + } + + public void setTable(String table) { + this.table = table; + } +}
http://git-wip-us.apache.org/repos/asf/ambari/blob/853a1ce7/contrib/views/hive20/src/main/java/org/apache/ambari/view/hive20/resources/uploads/query/InsertFromQueryInput.java ---------------------------------------------------------------------- diff --git a/contrib/views/hive20/src/main/java/org/apache/ambari/view/hive20/resources/uploads/query/InsertFromQueryInput.java b/contrib/views/hive20/src/main/java/org/apache/ambari/view/hive20/resources/uploads/query/InsertFromQueryInput.java new file mode 100644 index 0000000..027baff --- /dev/null +++ b/contrib/views/hive20/src/main/java/org/apache/ambari/view/hive20/resources/uploads/query/InsertFromQueryInput.java @@ -0,0 +1,92 @@ +/** + * 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.hive20.resources.uploads.query; + +import org.apache.ambari.view.hive20.resources.uploads.ColumnDescriptionImpl; + +import java.util.List; + +public class InsertFromQueryInput { + private String fromDatabase; + private String fromTable; + private String toDatabase; + private String toTable; + private List<ColumnDescriptionImpl> header; + private Boolean unhexInsert = Boolean.FALSE; + + public InsertFromQueryInput() { + } + + public InsertFromQueryInput(String fromDatabase, String fromTable, String toDatabase, String toTable, List<ColumnDescriptionImpl> header, Boolean unhexInsert) { + this.fromDatabase = fromDatabase; + this.fromTable = fromTable; + this.toDatabase = toDatabase; + this.toTable = toTable; + this.header = header; + this.unhexInsert = unhexInsert; + } + + public List<ColumnDescriptionImpl> getHeader() { + return header; + } + + public void setHeader(List<ColumnDescriptionImpl> header) { + this.header = header; + } + + public Boolean getUnhexInsert() { + return unhexInsert; + } + + public void setUnhexInsert(Boolean unhexInsert) { + this.unhexInsert = unhexInsert; + } + + public String getFromDatabase() { + return fromDatabase; + } + + public void setFromDatabase(String fromDatabase) { + this.fromDatabase = fromDatabase; + } + + public String getFromTable() { + return fromTable; + } + + public void setFromTable(String fromTable) { + this.fromTable = fromTable; + } + + public String getToDatabase() { + return toDatabase; + } + + public void setToDatabase(String toDatabase) { + this.toDatabase = toDatabase; + } + + public String getToTable() { + return toTable; + } + + public void setToTable(String toTable) { + this.toTable = toTable; + } +} http://git-wip-us.apache.org/repos/asf/ambari/blob/853a1ce7/contrib/views/hive20/src/main/java/org/apache/ambari/view/hive20/resources/uploads/query/LoadQueryInput.java ---------------------------------------------------------------------- diff --git a/contrib/views/hive20/src/main/java/org/apache/ambari/view/hive20/resources/uploads/query/LoadQueryInput.java b/contrib/views/hive20/src/main/java/org/apache/ambari/view/hive20/resources/uploads/query/LoadQueryInput.java new file mode 100644 index 0000000..7873144 --- /dev/null +++ b/contrib/views/hive20/src/main/java/org/apache/ambari/view/hive20/resources/uploads/query/LoadQueryInput.java @@ -0,0 +1,67 @@ +/** + * 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.hive20.resources.uploads.query; + +/** + * input for QueryGenerator for generating Load From Query + */ +public class LoadQueryInput { + private String hdfsFilePath; + private String databaseName; + private String tableName; + + public LoadQueryInput(String hdfsFilePath, String databaseName, String tableName) { + this.hdfsFilePath = hdfsFilePath; + this.databaseName = databaseName; + this.tableName = tableName; + } + + public String getHdfsFilePath() { + return hdfsFilePath; + } + + public void setHdfsFilePath(String hdfsFilePath) { + this.hdfsFilePath = hdfsFilePath; + } + + public String getDatabaseName() { + return databaseName; + } + + public void setDatabaseName(String databaseName) { + this.databaseName = databaseName; + } + + public String getTableName() { + return tableName; + } + + public void setTableName(String tableName) { + this.tableName = tableName; + } + + @Override + public String toString() { + return "LoadQueryInput{" + + "hdfsFilePath='" + hdfsFilePath + '\'' + + ", databaseName='" + databaseName + '\'' + + ", tableName='" + tableName + '\'' + + '}'; + } +} http://git-wip-us.apache.org/repos/asf/ambari/blob/853a1ce7/contrib/views/hive20/src/main/java/org/apache/ambari/view/hive20/resources/uploads/query/QueryGenerator.java ---------------------------------------------------------------------- diff --git a/contrib/views/hive20/src/main/java/org/apache/ambari/view/hive20/resources/uploads/query/QueryGenerator.java b/contrib/views/hive20/src/main/java/org/apache/ambari/view/hive20/resources/uploads/query/QueryGenerator.java new file mode 100644 index 0000000..dda178d --- /dev/null +++ b/contrib/views/hive20/src/main/java/org/apache/ambari/view/hive20/resources/uploads/query/QueryGenerator.java @@ -0,0 +1,143 @@ +/** + * 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.hive20.resources.uploads.query; + +import org.apache.ambari.view.hive.resources.uploads.query.RowFormat; +import org.apache.ambari.view.hive20.client.ColumnDescription; +import org.apache.ambari.view.hive20.resources.uploads.ColumnDescriptionImpl; +import org.apache.ambari.view.hive20.resources.uploads.HiveFileType; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.Collections; +import java.util.Comparator; +import java.util.List; + +/** + * generates the sql query from given data + */ +public class QueryGenerator { + protected final static Logger LOG = + LoggerFactory.getLogger(QueryGenerator.class); + + public String generateCreateQuery(TableInfo tableInfo) { + String tableName = tableInfo.getTableName(); + List<ColumnDescriptionImpl> cdList = tableInfo.getHeader(); + + StringBuilder query = new StringBuilder(); + query.append("CREATE TABLE ").append(tableName).append(" ("); + Collections.sort(cdList, new Comparator<ColumnDescription>() { + @Override + public int compare(ColumnDescription o1, ColumnDescription o2) { + return o1.getPosition() - o2.getPosition(); + } + }); + + boolean first = true; + for (ColumnDescriptionImpl cd : cdList) { + if (first) { + first = false; + } else { + query.append(", "); + } + + query.append(cd.getName()).append(" ").append(cd.getType()); + if (cd.getPrecision() != null) { + query.append("(").append(cd.getPrecision()); + if (cd.getScale() != null) { + query.append(",").append(cd.getScale()); + } + query.append(")"); + } + + } + + query.append(")"); + + if(tableInfo.getHiveFileType().equals(HiveFileType.TEXTFILE)) { + query.append(getRowFormatQuery(tableInfo.getRowFormat())); + } + query.append(" STORED AS ").append(tableInfo.getHiveFileType().toString()); + String queryString = query.append(";").toString(); + LOG.info("Query : {}", queryString); + return queryString; + } + + private String getRowFormatQuery(RowFormat rowFormat) { + StringBuilder sb = new StringBuilder(); + if(rowFormat != null) { + sb.append(" ROW FORMAT DELIMITED"); + if(rowFormat.getFieldsTerminatedBy() != null ){ + sb.append(" FIELDS TERMINATED BY '").append(rowFormat.getFieldsTerminatedBy()).append('\''); + } + if(rowFormat.getEscapedBy() != null){ + String escape = String.valueOf(rowFormat.getEscapedBy()); + if(rowFormat.getEscapedBy() == '\\'){ + escape = escape + '\\'; // special handling of slash as its escape char for strings in hive as well. + } + sb.append(" ESCAPED BY '").append(escape).append('\''); + } + } + + return sb.toString(); + } + + public String generateInsertFromQuery(InsertFromQueryInput ifqi) { + StringBuilder insertQuery = new StringBuilder("INSERT INTO TABLE ").append(ifqi.getToDatabase()).append(".") + .append(ifqi.getToTable()).append(" SELECT "); + + boolean first = true; + for(ColumnDescriptionImpl column : ifqi.getHeader()){ + String type = column.getType(); + boolean unhex = ifqi.getUnhexInsert() && ( + ColumnDescription.DataTypes.STRING.toString().equals(type) + || ColumnDescription.DataTypes.VARCHAR.toString().equals(type) + || ColumnDescription.DataTypes.CHAR.toString().equals(type) + ); + + if(!first){ + insertQuery.append(", "); + } + + if(unhex) { + insertQuery.append("UNHEX("); + } + + insertQuery.append(column.getName()); + + if(unhex) { + insertQuery.append(")"); + } + + first = false; + } + + insertQuery.append(" FROM ").append(ifqi.getFromDatabase()).append(".").append(ifqi.getFromTable()).append(";"); + String query = insertQuery.toString(); + LOG.info("Insert Query : {}", query); + return query; + } + + public String generateDropTableQuery(DeleteQueryInput deleteQueryInput) { + String dropQuery = new StringBuilder("DROP TABLE ").append(deleteQueryInput.getDatabase()) + .append(".").append(deleteQueryInput.getTable()).append(";").toString(); + LOG.info("Drop Query : {}", dropQuery); + return dropQuery; + } +} http://git-wip-us.apache.org/repos/asf/ambari/blob/853a1ce7/contrib/views/hive20/src/main/java/org/apache/ambari/view/hive20/resources/uploads/query/RowFormat.java ---------------------------------------------------------------------- diff --git a/contrib/views/hive20/src/main/java/org/apache/ambari/view/hive20/resources/uploads/query/RowFormat.java b/contrib/views/hive20/src/main/java/org/apache/ambari/view/hive20/resources/uploads/query/RowFormat.java new file mode 100644 index 0000000..4c1cb2b --- /dev/null +++ b/contrib/views/hive20/src/main/java/org/apache/ambari/view/hive20/resources/uploads/query/RowFormat.java @@ -0,0 +1,57 @@ +/** + * 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.hive.resources.uploads.query; + +public class RowFormat { + private Character fieldsTerminatedBy; + private Character escapedBy; + + private RowFormat() { + } + + public RowFormat(Character fieldsTerminatedBy, Character escapedBy) { + this.fieldsTerminatedBy = fieldsTerminatedBy; + this.escapedBy = escapedBy; + } + + public Character getFieldsTerminatedBy() { + return fieldsTerminatedBy; + } + + public void setFieldsTerminatedBy(Character fieldsTerminatedBy) { + this.fieldsTerminatedBy = fieldsTerminatedBy; + } + + public Character getEscapedBy() { + return escapedBy; + } + + public void setEscapedBy(Character escapedBy) { + this.escapedBy = escapedBy; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder("RowFormat{ fieldsTerminatedBy='"); + sb.append(fieldsTerminatedBy).append( '\'').append(", escapedBy='") + .append(escapedBy).append("\'}"); + + return sb.toString(); + } +} http://git-wip-us.apache.org/repos/asf/ambari/blob/853a1ce7/contrib/views/hive20/src/main/java/org/apache/ambari/view/hive20/resources/uploads/query/TableInfo.java ---------------------------------------------------------------------- diff --git a/contrib/views/hive20/src/main/java/org/apache/ambari/view/hive20/resources/uploads/query/TableInfo.java b/contrib/views/hive20/src/main/java/org/apache/ambari/view/hive20/resources/uploads/query/TableInfo.java new file mode 100644 index 0000000..bb39271 --- /dev/null +++ b/contrib/views/hive20/src/main/java/org/apache/ambari/view/hive20/resources/uploads/query/TableInfo.java @@ -0,0 +1,97 @@ +/** + * 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.hive20.resources.uploads.query; + +import org.apache.ambari.view.hive.resources.uploads.query.RowFormat; +import org.apache.ambari.view.hive20.resources.uploads.ColumnDescriptionImpl; +import org.apache.ambari.view.hive20.resources.uploads.HiveFileType; + +import java.io.Serializable; +import java.util.List; + +/** + * used as input in Query generation + */ +public class TableInfo implements Serializable{ + private String tableName; + private String databaseName; + private List<ColumnDescriptionImpl> header; + private HiveFileType hiveFileType; + + private RowFormat rowFormat; + + public String getTableName() { + return tableName; + } + + public void setTableName(String tableName) { + this.tableName = tableName; + } + + public String getDatabaseName() { + return databaseName; + } + + public void setDatabaseName(String databaseName) { + this.databaseName = databaseName; + } + + public List<ColumnDescriptionImpl> getHeader() { + return header; + } + + public void setHeader(List<ColumnDescriptionImpl> header) { + this.header = header; + } + + public HiveFileType getHiveFileType() { + return hiveFileType; + } + + public void setHiveFileType(HiveFileType hiveFileType) { + this.hiveFileType = hiveFileType; + } + + public RowFormat getRowFormat() { + return rowFormat; + } + + public void setRowFormat(RowFormat rowFormat) { + this.rowFormat = rowFormat; + } + + public TableInfo(String databaseName, String tableName, List<ColumnDescriptionImpl> header, HiveFileType hiveFileType, RowFormat rowFormat) { + this.databaseName = databaseName; + this.tableName = tableName; + this.header = header; + this.hiveFileType = hiveFileType; + this.rowFormat = rowFormat; + } + + public TableInfo(TableInfo tableInfo) { + this.tableName = tableInfo.tableName; + this.databaseName = tableInfo.databaseName; + this.header = tableInfo.header; + this.hiveFileType = tableInfo.hiveFileType; + this.rowFormat = tableInfo.rowFormat; + } + + public TableInfo() { + } +} http://git-wip-us.apache.org/repos/asf/ambari/blob/853a1ce7/contrib/views/hive20/src/main/java/org/apache/ambari/view/hive20/utils/BadRequestFormattedException.java ---------------------------------------------------------------------- diff --git a/contrib/views/hive20/src/main/java/org/apache/ambari/view/hive20/utils/BadRequestFormattedException.java b/contrib/views/hive20/src/main/java/org/apache/ambari/view/hive20/utils/BadRequestFormattedException.java new file mode 100644 index 0000000..e152d79 --- /dev/null +++ b/contrib/views/hive20/src/main/java/org/apache/ambari/view/hive20/utils/BadRequestFormattedException.java @@ -0,0 +1,27 @@ +/** + * 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.ambari.view.hive20.utils; + +public class BadRequestFormattedException extends ServiceFormattedException { + private final static int STATUS = 400; + + public BadRequestFormattedException(String message, Throwable exception) { + super(message, exception, STATUS); + } +} http://git-wip-us.apache.org/repos/asf/ambari/blob/853a1ce7/contrib/views/hive20/src/main/java/org/apache/ambari/view/hive20/utils/FilePaginator.java ---------------------------------------------------------------------- diff --git a/contrib/views/hive20/src/main/java/org/apache/ambari/view/hive20/utils/FilePaginator.java b/contrib/views/hive20/src/main/java/org/apache/ambari/view/hive20/utils/FilePaginator.java new file mode 100644 index 0000000..92a0237 --- /dev/null +++ b/contrib/views/hive20/src/main/java/org/apache/ambari/view/hive20/utils/FilePaginator.java @@ -0,0 +1,127 @@ +/** + * 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.ambari.view.hive20.utils; + +import org.apache.ambari.view.utils.hdfs.HdfsApi; +import org.apache.hadoop.fs.FSDataInputStream; + +import java.io.IOException; +import java.nio.charset.Charset; +import java.util.Arrays; + +import static java.lang.Math.ceil; + +/** + * Pagination for HDFS file implementation + */ +public class FilePaginator { + public static int MB = 1024*1024; + public static int PAGE_SIZE = 1*MB; + + private String filePath; + private HdfsApi hdfsApi; + + /** + * Constructor + * @param filePath Path to file on HDFS + * @param hdfsApi hdfs api + */ + public FilePaginator(String filePath, HdfsApi hdfsApi) { + this.filePath = filePath; + this.hdfsApi = hdfsApi; + } + + /** + * Set page size + * @param PAGE_SIZE size + */ + public static void setPageSize(int PAGE_SIZE) { + FilePaginator.PAGE_SIZE = PAGE_SIZE; + } + + /** + * Get page count + * @return page count + * @throws java.io.IOException + * @throws InterruptedException + */ + public long pageCount() throws IOException, InterruptedException { + return (long) + ceil( hdfsApi.getFileStatus(filePath).getLen() / ((double)PAGE_SIZE) ); + } + + /** + * Read one page of size PAGE_SIZE + * @param page page index + * @return data in UTF-8 + * @throws java.io.IOException + * @throws InterruptedException + */ + public String readPage(long page) throws IOException, InterruptedException { + FSDataInputStream stream = hdfsApi.open(filePath); + try { + stream.seek(page * PAGE_SIZE); + } catch (IOException e) { + throw new IllegalArgumentException("Page " + page + " does not exists"); + } + + byte[] buffer = new byte[PAGE_SIZE]; + int readCount = 0; + int read = 0; + while(read < PAGE_SIZE) { + try { + readCount = stream.read(buffer, read, PAGE_SIZE-read); + } catch (IOException e) { + stream.close(); + throw e; + } + if (readCount == -1) + break; + read += readCount; + } + if (read != 0) { + byte[] readData = Arrays.copyOfRange(buffer, 0, read); + return new String(readData, Charset.forName("UTF-8")); + } else { + if (page == 0) { + return ""; + } + throw new IllegalArgumentException("Page " + page + " does not exists"); + } + } + + public String readFull(long sizeLimit) throws IOException, InterruptedException { + StringBuilder builder = new StringBuilder(); + int i = 0; + while (true) { + try { + builder.append(readPage(i++)); + } catch (IllegalArgumentException ex) { + break; + } + if (sizeLimit != -1 && (i+1)*PAGE_SIZE > sizeLimit) + break; + } + return builder.toString(); + } + + public String readFull() throws IOException, InterruptedException { + return readFull(-1); + } +} http://git-wip-us.apache.org/repos/asf/ambari/blob/853a1ce7/contrib/views/hive20/src/main/java/org/apache/ambari/view/hive20/utils/HiveActorConfiguration.java ---------------------------------------------------------------------- diff --git a/contrib/views/hive20/src/main/java/org/apache/ambari/view/hive20/utils/HiveActorConfiguration.java b/contrib/views/hive20/src/main/java/org/apache/ambari/view/hive20/utils/HiveActorConfiguration.java new file mode 100644 index 0000000..f759390 --- /dev/null +++ b/contrib/views/hive20/src/main/java/org/apache/ambari/view/hive20/utils/HiveActorConfiguration.java @@ -0,0 +1,71 @@ +/* + * 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.ambari.view.hive20.utils; + +import org.apache.ambari.view.ViewContext; + +/** + * This fetches the configuration for the actor system from ambari.properties + */ +public class HiveActorConfiguration { + private static String DEFAULT_CONFIG = "default"; + private static String CONNECTION_PREFIX = "views.ambari.hive."; + private static String CONNECTION_INACTIVITY_TIMEOUT_PATTERN = CONNECTION_PREFIX + "%s.connection.inactivity.timeout"; + private static String CONNECTION_TERMINATION_TIMEOUT_PATTERN = CONNECTION_PREFIX + "%s.connection.termination.timeout"; + private static String SYNC_QUERY_TIMEOUT_PATTERN = CONNECTION_PREFIX + "%s.sync.query.timeout"; + private static String RESULT_FETCH_TIMEOUT_PATTERN = CONNECTION_PREFIX + "%s.result.fetch.timeout"; + + private final ViewContext context; + + public HiveActorConfiguration(ViewContext context) { + this.context = context; + } + + public long getInactivityTimeout(long defaultValue) { + return Long.parseLong(getPropertiesFromContext(CONNECTION_INACTIVITY_TIMEOUT_PATTERN, String.valueOf(defaultValue))); + } + + public long getTerminationTimeout(long defaultValue) { + return Long.parseLong(getPropertiesFromContext(CONNECTION_TERMINATION_TIMEOUT_PATTERN, String.valueOf(defaultValue))); + } + + public long getSyncQueryTimeout(long defaultValue) { + return Long.parseLong(getPropertiesFromContext(SYNC_QUERY_TIMEOUT_PATTERN, String.valueOf(defaultValue))); + } + + public long getResultFetchTimeout(long defaultValue) { + return Long.parseLong(getPropertiesFromContext(RESULT_FETCH_TIMEOUT_PATTERN, String.valueOf(defaultValue))); + } + + /** + * Tries to get the specific configuration with the instance name. If not found then tries to + * find the default set in ambari.properties. If not found then returns the default value passed + * @param keyPattern Pattern used to generate ambari.properties key + * @param defaultValue Returned when the value is not found in ambari.properties + * @return value of the property + */ + private String getPropertiesFromContext(String keyPattern, String defaultValue) { + String value; + value = context.getAmbariProperty(String.format(keyPattern, context.getInstanceName())); + if(value == null) { + value = context.getAmbariProperty(String.format(keyPattern, DEFAULT_CONFIG)); + } + return value == null ? defaultValue: value; + } +} http://git-wip-us.apache.org/repos/asf/ambari/blob/853a1ce7/contrib/views/hive20/src/main/java/org/apache/ambari/view/hive20/utils/HiveClientFormattedException.java ---------------------------------------------------------------------- diff --git a/contrib/views/hive20/src/main/java/org/apache/ambari/view/hive20/utils/HiveClientFormattedException.java b/contrib/views/hive20/src/main/java/org/apache/ambari/view/hive20/utils/HiveClientFormattedException.java new file mode 100644 index 0000000..ac63708 --- /dev/null +++ b/contrib/views/hive20/src/main/java/org/apache/ambari/view/hive20/utils/HiveClientFormattedException.java @@ -0,0 +1,26 @@ +/** + * 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.ambari.view.hive20.utils; + +public class HiveClientFormattedException extends ServiceFormattedException { + + public HiveClientFormattedException(Throwable exception) { + super(exception.getMessage(), exception); + } +} http://git-wip-us.apache.org/repos/asf/ambari/blob/853a1ce7/contrib/views/hive20/src/main/java/org/apache/ambari/view/hive20/utils/LoggingOutputStream.java ---------------------------------------------------------------------- diff --git a/contrib/views/hive20/src/main/java/org/apache/ambari/view/hive20/utils/LoggingOutputStream.java b/contrib/views/hive20/src/main/java/org/apache/ambari/view/hive20/utils/LoggingOutputStream.java new file mode 100644 index 0000000..bf13faf --- /dev/null +++ b/contrib/views/hive20/src/main/java/org/apache/ambari/view/hive20/utils/LoggingOutputStream.java @@ -0,0 +1,85 @@ +/* + * 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.ambari.view.hive20.utils; + +import org.slf4j.Logger; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.OutputStream; + +public class LoggingOutputStream extends OutputStream { + + private final ByteArrayOutputStream baos = new ByteArrayOutputStream(1000); + private final Logger logger; + private final LogLevel level; + + public enum LogLevel { + TRACE, DEBUG, INFO, WARN, ERROR, + } + + public LoggingOutputStream(Logger logger, LogLevel level) { + this.logger = logger; + this.level = level; + } + + @Override + public void write(int b) { + if (b == '\n') { + String line = baos.toString(); + baos.reset(); + + switch (level) { + case TRACE: + logger.trace(line); + break; + case DEBUG: + logger.debug(line); + break; + case ERROR: + logger.error(line); + break; + case INFO: + logger.info(line); + break; + case WARN: + logger.warn(line); + break; + } + } else { + baos.write(b); + } + } + + + /** + * Closes this output stream and releases any system resources + * associated with this stream. The general contract of <code>close</code> + * is that it closes the output stream. A closed stream cannot perform + * output operations and cannot be reopened. + * <p/> + * The <code>close</code> method of <code>OutputStream</code> does nothing. + * + * @throws IOException if an I/O error occurs. + */ + @Override + public void close() throws IOException { + baos.close(); + } +} http://git-wip-us.apache.org/repos/asf/ambari/blob/853a1ce7/contrib/views/hive20/src/main/java/org/apache/ambari/view/hive20/utils/MisconfigurationFormattedException.java ---------------------------------------------------------------------- diff --git a/contrib/views/hive20/src/main/java/org/apache/ambari/view/hive20/utils/MisconfigurationFormattedException.java b/contrib/views/hive20/src/main/java/org/apache/ambari/view/hive20/utils/MisconfigurationFormattedException.java new file mode 100644 index 0000000..ddcc342 --- /dev/null +++ b/contrib/views/hive20/src/main/java/org/apache/ambari/view/hive20/utils/MisconfigurationFormattedException.java @@ -0,0 +1,47 @@ +/** + * 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.ambari.view.hive20.utils; + +import org.json.simple.JSONObject; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.ws.rs.WebApplicationException; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Response; +import java.util.HashMap; + +public class MisconfigurationFormattedException extends WebApplicationException { + private final static int STATUS = 500; + private final static String message = "Parameter \"%s\" is set to null"; + private final static Logger LOG = + LoggerFactory.getLogger(MisconfigurationFormattedException.class); + + public MisconfigurationFormattedException(String name) { + super(errorEntity(name)); + } + + protected static Response errorEntity(String name) { + HashMap<String, Object> response = new HashMap<String, Object>(); + response.put("message", String.format(message, name)); + response.put("trace", null); + response.put("status", STATUS); + return Response.status(STATUS).entity(new JSONObject(response)).type(MediaType.APPLICATION_JSON).build(); + } +} http://git-wip-us.apache.org/repos/asf/ambari/blob/853a1ce7/contrib/views/hive20/src/main/java/org/apache/ambari/view/hive20/utils/NotFoundFormattedException.java ---------------------------------------------------------------------- diff --git a/contrib/views/hive20/src/main/java/org/apache/ambari/view/hive20/utils/NotFoundFormattedException.java b/contrib/views/hive20/src/main/java/org/apache/ambari/view/hive20/utils/NotFoundFormattedException.java new file mode 100644 index 0000000..fd18dfa --- /dev/null +++ b/contrib/views/hive20/src/main/java/org/apache/ambari/view/hive20/utils/NotFoundFormattedException.java @@ -0,0 +1,27 @@ +/** + * 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.ambari.view.hive20.utils; + +public class NotFoundFormattedException extends ServiceFormattedException { + private final static int STATUS = 404; + + public NotFoundFormattedException(String message, Throwable exception) { + super(message, exception, STATUS); + } +} http://git-wip-us.apache.org/repos/asf/ambari/blob/853a1ce7/contrib/views/hive20/src/main/java/org/apache/ambari/view/hive20/utils/ResultFetchFormattedException.java ---------------------------------------------------------------------- diff --git a/contrib/views/hive20/src/main/java/org/apache/ambari/view/hive20/utils/ResultFetchFormattedException.java b/contrib/views/hive20/src/main/java/org/apache/ambari/view/hive20/utils/ResultFetchFormattedException.java new file mode 100644 index 0000000..d83d361 --- /dev/null +++ b/contrib/views/hive20/src/main/java/org/apache/ambari/view/hive20/utils/ResultFetchFormattedException.java @@ -0,0 +1,27 @@ +/** + * 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.ambari.view.hive20.utils; + +public class ResultFetchFormattedException extends ServiceFormattedException { + private final static int STATUS = 500; + + public ResultFetchFormattedException(String message, Throwable exception) { + super(message, exception, STATUS); + } +} http://git-wip-us.apache.org/repos/asf/ambari/blob/853a1ce7/contrib/views/hive20/src/main/java/org/apache/ambari/view/hive20/utils/ResultNotReadyFormattedException.java ---------------------------------------------------------------------- diff --git a/contrib/views/hive20/src/main/java/org/apache/ambari/view/hive20/utils/ResultNotReadyFormattedException.java b/contrib/views/hive20/src/main/java/org/apache/ambari/view/hive20/utils/ResultNotReadyFormattedException.java new file mode 100644 index 0000000..cf8081f --- /dev/null +++ b/contrib/views/hive20/src/main/java/org/apache/ambari/view/hive20/utils/ResultNotReadyFormattedException.java @@ -0,0 +1,27 @@ +/** + * 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.ambari.view.hive20.utils; + +public class ResultNotReadyFormattedException extends ServiceFormattedException { + private final static int STATUS = 409; + + public ResultNotReadyFormattedException(String message, Throwable exception) { + super(message, exception, STATUS); + } +} http://git-wip-us.apache.org/repos/asf/ambari/blob/853a1ce7/contrib/views/hive20/src/main/java/org/apache/ambari/view/hive20/utils/ServiceFormattedException.java ---------------------------------------------------------------------- diff --git a/contrib/views/hive20/src/main/java/org/apache/ambari/view/hive20/utils/ServiceFormattedException.java b/contrib/views/hive20/src/main/java/org/apache/ambari/view/hive20/utils/ServiceFormattedException.java new file mode 100644 index 0000000..909a219 --- /dev/null +++ b/contrib/views/hive20/src/main/java/org/apache/ambari/view/hive20/utils/ServiceFormattedException.java @@ -0,0 +1,105 @@ +/** + * 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.ambari.view.hive20.utils; + +import org.json.simple.JSONObject; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.ws.rs.WebApplicationException; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Response; +import java.io.PrintWriter; +import java.io.StringWriter; +import java.security.AccessControlException; +import java.util.HashMap; + +public class ServiceFormattedException extends WebApplicationException { + private final static Logger LOG = + LoggerFactory.getLogger(ServiceFormattedException.class); + + public ServiceFormattedException(String message) { + super(errorEntity(message, null, suggestStatus(null), null)); + } + + public ServiceFormattedException(Throwable exception) { + super(errorEntity(null, exception, suggestStatus(exception), null)); + } + + public ServiceFormattedException(String message, Throwable exception) { + super(errorEntity(message, exception, suggestStatus(exception), null)); + } + + public ServiceFormattedException(String message, Throwable exception, int status) { + super(errorEntity(message, exception, status, null)); + } + + public ServiceFormattedException(String message, Exception ex, String curl) { + super(errorEntity(message, ex, suggestStatus(ex), curl)); + } + + private static int suggestStatus(Throwable exception) { + int status = 500; + if (exception == null) { + return status; + } + if (exception instanceof AccessControlException) { + status = 403; + } + /*if (exception instanceof HiveInvalidQueryException) { + status = 400; + }*/ + return status; + } + + protected static Response errorEntity(String message, Throwable e, int status, String header) { + HashMap<String, Object> response = new HashMap<String, Object>(); + + String trace = null; + + response.put("message", message); + if (e != null) { + trace = e.toString() + "\n\n"; + StringWriter sw = new StringWriter(); + e.printStackTrace(new PrintWriter(sw)); + trace += sw.toString(); + + if (message == null) { + String innerMessage = e.getMessage(); + String autoMessage; + + if (innerMessage != null) + autoMessage = String.format("E090 %s [%s]", innerMessage, e.getClass().getSimpleName()); + else + autoMessage = "E090 " + e.getClass().getSimpleName(); + response.put("message", autoMessage); + } + } + response.put("trace", trace); + response.put("status", status); + + if(message != null && status != 400) LOG.error(message); + if(trace != null && status != 400) LOG.error(trace); + + Response.ResponseBuilder responseBuilder = Response.status(status).entity(new JSONObject(response)).type(MediaType.APPLICATION_JSON); + if (header != null) + responseBuilder.header("X-INFO", header); + return responseBuilder.build(); + } +} http://git-wip-us.apache.org/repos/asf/ambari/blob/853a1ce7/contrib/views/hive20/src/main/java/org/apache/ambari/view/hive20/utils/SharedObjectsFactory.java ---------------------------------------------------------------------- diff --git a/contrib/views/hive20/src/main/java/org/apache/ambari/view/hive20/utils/SharedObjectsFactory.java b/contrib/views/hive20/src/main/java/org/apache/ambari/view/hive20/utils/SharedObjectsFactory.java new file mode 100644 index 0000000..5bc6070 --- /dev/null +++ b/contrib/views/hive20/src/main/java/org/apache/ambari/view/hive20/utils/SharedObjectsFactory.java @@ -0,0 +1,185 @@ +/** + * 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.ambari.view.hive20.utils; + +import org.apache.ambari.view.ViewContext; +import org.apache.ambari.view.hive20.persistence.IStorageFactory; +import org.apache.ambari.view.hive20.persistence.Storage; +import org.apache.ambari.view.hive20.persistence.utils.StorageFactory; +import org.apache.ambari.view.hive20.resources.jobs.atsJobs.ATSParser; +import org.apache.ambari.view.hive20.resources.jobs.atsJobs.ATSParserFactory; +import org.apache.ambari.view.hive20.resources.jobs.rm.RMParser; +import org.apache.ambari.view.hive20.resources.jobs.rm.RMParserFactory; +import org.apache.ambari.view.hive20.resources.jobs.viewJobs.IJobControllerFactory; +import org.apache.ambari.view.hive20.resources.jobs.viewJobs.JobControllerFactory; +import org.apache.ambari.view.hive20.resources.savedQueries.SavedQueryResourceManager; +import org.apache.ambari.view.utils.hdfs.HdfsApi; +import org.apache.ambari.view.utils.hdfs.HdfsApiException; +import org.apache.ambari.view.utils.hdfs.HdfsUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.Iterator; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +/** + * Generates shared connections. Clients with same tag will get the same connection. + * e.g. user 'admin' using view instance 'HIVE1' will use one connection, another user + * will use different connection. + */ +public class SharedObjectsFactory implements IStorageFactory { + protected final static Logger LOG = + LoggerFactory.getLogger(SharedObjectsFactory.class); + + private ViewContext context; + private final IStorageFactory storageFactory; + private final ATSParserFactory atsParserFactory; + private final RMParserFactory rmParserFactory; + + private static final Map<Class, Map<String, Object>> localObjects = new ConcurrentHashMap<Class, Map<String, Object>>(); + + public SharedObjectsFactory(ViewContext context) { + this.context = context; + this.storageFactory = new StorageFactory(context); + this.atsParserFactory = new ATSParserFactory(context); + this.rmParserFactory = new RMParserFactory(context); + + synchronized (localObjects) { + if (localObjects.size() == 0) { + //localObjects.put(OperationHandleControllerFactory.class, new ConcurrentHashMap<String, Object>()); + localObjects.put(Storage.class, new ConcurrentHashMap<String, Object>()); + localObjects.put(IJobControllerFactory.class, new ConcurrentHashMap<String, Object>()); + localObjects.put(ATSParser.class, new ConcurrentHashMap<String, Object>()); + localObjects.put(SavedQueryResourceManager.class, new ConcurrentHashMap<String, Object>()); + localObjects.put(HdfsApi.class, new ConcurrentHashMap<String, Object>()); + localObjects.put(RMParser.class, new ConcurrentHashMap<String, Object>()); + } + } + } + + // ============================= + + /*public OperationHandleControllerFactory getOperationHandleControllerFactory() { + if (!localObjects.get(OperationHandleControllerFactory.class).containsKey(getTagName())) + localObjects.get(OperationHandleControllerFactory.class).put(getTagName(), new OperationHandleControllerFactory(context, this)); + return (OperationHandleControllerFactory) localObjects.get(OperationHandleControllerFactory.class).get(getTagName()); + }*/ + + // ============================= + @Override + public Storage getStorage() { + if (!localObjects.get(Storage.class).containsKey(getTagName())) + localObjects.get(Storage.class).put(getTagName(), storageFactory.getStorage()); + return (Storage) localObjects.get(Storage.class).get(getTagName()); + } + + // ============================= + public IJobControllerFactory getJobControllerFactory() { + if (!localObjects.get(IJobControllerFactory.class).containsKey(getTagName())) + localObjects.get(IJobControllerFactory.class).put(getTagName(), new JobControllerFactory(context, this)); + return (IJobControllerFactory) localObjects.get(IJobControllerFactory.class).get(getTagName()); + } + + // ============================= + + public SavedQueryResourceManager getSavedQueryResourceManager() { + if (!localObjects.get(SavedQueryResourceManager.class).containsKey(getTagName())) + localObjects.get(SavedQueryResourceManager.class).put(getTagName(), new SavedQueryResourceManager(context, this)); + return (SavedQueryResourceManager) localObjects.get(SavedQueryResourceManager.class).get(getTagName()); + } + + // ============================= + public ATSParser getATSParser() { + if (!localObjects.get(ATSParser.class).containsKey(getTagName())) + localObjects.get(ATSParser.class).put(getTagName(), atsParserFactory.getATSParser()); + return (ATSParser) localObjects.get(ATSParser.class).get(getTagName()); + } + + // ============================= + public RMParser getRMParser() { + if (!localObjects.get(RMParser.class).containsKey(getTagName())) + localObjects.get(RMParser.class).put(getTagName(), rmParserFactory.getRMParser()); + return (RMParser) localObjects.get(RMParser.class).get(getTagName()); + } + + // ============================= + public HdfsApi getHdfsApi() { + if (!localObjects.get(HdfsApi.class).containsKey(getTagName())) { + try { + localObjects.get(HdfsApi.class).put(getTagName(), HdfsUtil.connectToHDFSApi(context)); + } catch (HdfsApiException e) { + String message = "F060 Couldn't open connection to HDFS"; + LOG.error(message); + throw new ServiceFormattedException(message, e); + } + } + return (HdfsApi) localObjects.get(HdfsApi.class).get(getTagName()); + } + + /** + * Generates tag name. Clients with same tag will share one connection. + * @return tag name + */ + public String getTagName() { + if (context == null) + return "<null>"; + return String.format("%s:%s", context.getInstanceName(), context.getUsername()); + } + + /** + * For testing purposes, ability to substitute some local object + */ + public void setInstance(Class clazz, Object object) { + localObjects.get(clazz).put(getTagName(), object); + } + + /** + * For testing purposes, ability to clear all local objects of particular class + */ + public void clear(Class clazz) { + localObjects.get(clazz).clear(); + } + + /** + * For testing purposes, ability to clear all connections + */ + public void clear() { + for(Map<String, Object> map : localObjects.values()) { + map.clear(); + } + } + + /** + * + * Drops all objects for give instance name. + * + * @param instanceName + */ + public static void dropInstanceCache(String instanceName){ + for(Map<String,Object> cache : localObjects.values()){ + for(Iterator<Map.Entry<String, Object>> it = cache.entrySet().iterator(); it.hasNext();){ + Map.Entry<String, Object> entry = it.next(); + if(entry.getKey().startsWith(instanceName+":")){ + it.remove(); + } + } + } + } +} http://git-wip-us.apache.org/repos/asf/ambari/blob/853a1ce7/contrib/views/hive20/src/main/java/org/apache/ambari/view/hive20/utils/UniqueConstraintViolationException.java ---------------------------------------------------------------------- diff --git a/contrib/views/hive20/src/main/java/org/apache/ambari/view/hive20/utils/UniqueConstraintViolationException.java b/contrib/views/hive20/src/main/java/org/apache/ambari/view/hive20/utils/UniqueConstraintViolationException.java new file mode 100644 index 0000000..8d25f7a --- /dev/null +++ b/contrib/views/hive20/src/main/java/org/apache/ambari/view/hive20/utils/UniqueConstraintViolationException.java @@ -0,0 +1,31 @@ +/** + * 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.hive20.utils; + +/** + * + */ +public class UniqueConstraintViolationException extends ServiceFormattedException { + + private final static int STATUS = 409; + + public UniqueConstraintViolationException(String message) { + super(message, null, STATUS); + } +} http://git-wip-us.apache.org/repos/asf/ambari/blob/853a1ce7/contrib/views/hive20/src/main/resources/application.conf ---------------------------------------------------------------------- diff --git a/contrib/views/hive20/src/main/resources/application.conf b/contrib/views/hive20/src/main/resources/application.conf new file mode 100644 index 0000000..8cb45ad --- /dev/null +++ b/contrib/views/hive20/src/main/resources/application.conf @@ -0,0 +1,57 @@ +# +# Copyright 2011 The Apache Software Foundation +# +# 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. +# + +akka { + + # Log level used by the configured loggers (see "loggers") as soon + # as they have been started; before that, see "stdout-loglevel" + # Options: OFF, ERROR, WARNING, INFO, DEBUG + loglevel = "DEBUG" + + # Log level for the very basic logger activated during ActorSystem startup. + # This logger prints the log messages to stdout (System.out). + # Options: OFF, ERROR, WARNING, INFO, DEBUG + stdout-loglevel = "WARNING" + + actor { + + # Dispatcher to be used for creating Jdbc Connector actors (sync/Async) + jdbc-connector-dispatcher { + fork-join-executor { + parallelism-factor = 5.0 + } + } + + # Dispatcher to be used for creating Resultset related actors + result-dispatcher { + fork-join-executor { + parallelism-factor = 10.0 + } + } + + # Dispatcher to be used for creating miscellaneous actors like logger, exceptionWriter etc + misc-dispatcher { + fork-join-executor { + parallelism-factor = 5.0 + } + } + } + +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/ambari/blob/853a1ce7/contrib/views/hive20/src/main/resources/ui/.bowerrc ---------------------------------------------------------------------- diff --git a/contrib/views/hive20/src/main/resources/ui/.bowerrc b/contrib/views/hive20/src/main/resources/ui/.bowerrc new file mode 100644 index 0000000..959e169 --- /dev/null +++ b/contrib/views/hive20/src/main/resources/ui/.bowerrc @@ -0,0 +1,4 @@ +{ + "directory": "bower_components", + "analytics": false +} http://git-wip-us.apache.org/repos/asf/ambari/blob/853a1ce7/contrib/views/hive20/src/main/resources/ui/.editorconfig ---------------------------------------------------------------------- diff --git a/contrib/views/hive20/src/main/resources/ui/.editorconfig b/contrib/views/hive20/src/main/resources/ui/.editorconfig new file mode 100644 index 0000000..219985c --- /dev/null +++ b/contrib/views/hive20/src/main/resources/ui/.editorconfig @@ -0,0 +1,20 @@ +# EditorConfig helps developers define and maintain consistent +# coding styles between different editors and IDEs +# editorconfig.org + +root = true + + +[*] +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true +indent_style = space +indent_size = 2 + +[*.hbs] +insert_final_newline = false + +[*.{diff,md}] +trim_trailing_whitespace = false http://git-wip-us.apache.org/repos/asf/ambari/blob/853a1ce7/contrib/views/hive20/src/main/resources/ui/.ember-cli ---------------------------------------------------------------------- diff --git a/contrib/views/hive20/src/main/resources/ui/.ember-cli b/contrib/views/hive20/src/main/resources/ui/.ember-cli new file mode 100644 index 0000000..5a339b9 --- /dev/null +++ b/contrib/views/hive20/src/main/resources/ui/.ember-cli @@ -0,0 +1,27 @@ +/** + * 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. + */ + +{ + /** + Ember CLI sends analytics information by default. The data is completely + anonymous, but there are times when you might want to disable this behavior. + + Setting `disableAnalytics` to true will prevent any data from being sent. + */ + "disableAnalytics": false +} http://git-wip-us.apache.org/repos/asf/ambari/blob/853a1ce7/contrib/views/hive20/src/main/resources/ui/.gitignore ---------------------------------------------------------------------- diff --git a/contrib/views/hive20/src/main/resources/ui/.gitignore b/contrib/views/hive20/src/main/resources/ui/.gitignore new file mode 100644 index 0000000..8470f82 --- /dev/null +++ b/contrib/views/hive20/src/main/resources/ui/.gitignore @@ -0,0 +1,18 @@ +# See http://help.github.com/ignore-files/ for more about ignoring files. + +# compiled output +/dist +/tmp + +# dependencies +/node +/node_modules +/bower_components + +# misc +/.sass-cache +/connect.lock +/coverage/* +/libpeerconnection.log +npm-debug.log +testem.log http://git-wip-us.apache.org/repos/asf/ambari/blob/853a1ce7/contrib/views/hive20/src/main/resources/ui/.jshintrc ---------------------------------------------------------------------- diff --git a/contrib/views/hive20/src/main/resources/ui/.jshintrc b/contrib/views/hive20/src/main/resources/ui/.jshintrc new file mode 100644 index 0000000..d421faa --- /dev/null +++ b/contrib/views/hive20/src/main/resources/ui/.jshintrc @@ -0,0 +1,32 @@ +{ + "predef": [ + "document", + "window", + "-Promise" + ], + "browser": true, + "boss": true, + "curly": true, + "debug": false, + "devel": true, + "eqeqeq": true, + "evil": true, + "forin": false, + "immed": false, + "laxbreak": false, + "newcap": true, + "noarg": true, + "noempty": false, + "nonew": false, + "nomen": false, + "onevar": false, + "plusplus": false, + "regexp": false, + "undef": true, + "sub": true, + "strict": false, + "white": false, + "eqnull": true, + "esversion": 6, + "unused": true +} http://git-wip-us.apache.org/repos/asf/ambari/blob/853a1ce7/contrib/views/hive20/src/main/resources/ui/.travis.yml ---------------------------------------------------------------------- diff --git a/contrib/views/hive20/src/main/resources/ui/.travis.yml b/contrib/views/hive20/src/main/resources/ui/.travis.yml new file mode 100644 index 0000000..a4519ba --- /dev/null +++ b/contrib/views/hive20/src/main/resources/ui/.travis.yml @@ -0,0 +1,40 @@ +# 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. + +--- +language: node_js +node_js: + - "4" + +sudo: false + +cache: + directories: + - node_modules + +before_install: + - npm config set spin false + - npm install -g bower + - bower --version + - npm install phantomjs-prebuilt + - phantomjs --version + +install: + - npm install + - bower install + +script: + - npm test http://git-wip-us.apache.org/repos/asf/ambari/blob/853a1ce7/contrib/views/hive20/src/main/resources/ui/.watchmanconfig ---------------------------------------------------------------------- diff --git a/contrib/views/hive20/src/main/resources/ui/.watchmanconfig b/contrib/views/hive20/src/main/resources/ui/.watchmanconfig new file mode 100644 index 0000000..6ec27cc --- /dev/null +++ b/contrib/views/hive20/src/main/resources/ui/.watchmanconfig @@ -0,0 +1,21 @@ +/** + * 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. + */ + +{ + "ignore_dirs": ["tmp", "dist"] +} http://git-wip-us.apache.org/repos/asf/ambari/blob/853a1ce7/contrib/views/hive20/src/main/resources/ui/README.md ---------------------------------------------------------------------- diff --git a/contrib/views/hive20/src/main/resources/ui/README.md b/contrib/views/hive20/src/main/resources/ui/README.md new file mode 100644 index 0000000..5b6e3e5 --- /dev/null +++ b/contrib/views/hive20/src/main/resources/ui/README.md @@ -0,0 +1,28 @@ +<!--- +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](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. +--> + +# Ui + +To start the UI in development mode, developer has to proxy the xhr calls +to correct ambari endpoint. + +**ember serve --proxy http://c6401.ambari.apache.org:8080/api/v1/views/HIVE/versions/{version}/instances/{instance_name}** + +Example: +``` +$ cd src/main/resources/ui +$ ember serve --proxy http://c6401.ambari.apache.org:8080/api/v1/views/HIVE/versions/1.5.0/instances/AUTO_HIVE_INSTANCE +``` + http://git-wip-us.apache.org/repos/asf/ambari/blob/853a1ce7/contrib/views/hive20/src/main/resources/ui/app/adapters/application.js ---------------------------------------------------------------------- diff --git a/contrib/views/hive20/src/main/resources/ui/app/adapters/application.js b/contrib/views/hive20/src/main/resources/ui/app/adapters/application.js new file mode 100644 index 0000000..82d53e4 --- /dev/null +++ b/contrib/views/hive20/src/main/resources/ui/app/adapters/application.js @@ -0,0 +1,62 @@ +/** + * 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. + */ + +import Ember from 'ember'; +import DS from 'ember-data'; +import ENV from 'ui/config/environment'; + +export default DS.RESTAdapter.extend({ + init: function() { + Ember.$.ajaxSetup({ + cache: false + }); + }, + + namespace: Ember.computed(function() { + var parts = window.location.pathname.split('/').filter(function(i) { + return i !== ""; + }); + var view = parts[parts.length - 3]; + var version = '/versions/' + parts[parts.length - 2]; + var instance = parts[parts.length - 1]; + + if (!/^(\d+\.){2,3}\d+$/.test(parts[parts.length - 2])) { // version is not present + instance = parts[parts.length - 2]; + version = ''; + } + if(ENV.environment === 'development') { + return 'resources'; + } + return 'api/v1/views/' + view + version + '/instances/' + instance + '/resources'; + }), + + headers: Ember.computed(function() { + let headers = { + 'X-Requested-By': 'ambari', + 'Content-Type': 'application/json' + }; + + if(ENV.environment === 'development') { + // In development mode when the UI is served using ember serve the xhr requests are proxied to ambari server + // by setting the proxyurl parameter in ember serve and for ambari to authenticate the requests, it needs this + // basic authorization. This is for default admin/admin username/password combination. + headers['Authorization'] = 'Basic YWRtaW46YWRtaW4='; + } + return headers; + }), +}); http://git-wip-us.apache.org/repos/asf/ambari/blob/853a1ce7/contrib/views/hive20/src/main/resources/ui/app/adapters/database.js ---------------------------------------------------------------------- diff --git a/contrib/views/hive20/src/main/resources/ui/app/adapters/database.js b/contrib/views/hive20/src/main/resources/ui/app/adapters/database.js new file mode 100644 index 0000000..6594309 --- /dev/null +++ b/contrib/views/hive20/src/main/resources/ui/app/adapters/database.js @@ -0,0 +1,22 @@ +/** + * 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. + */ + +import DDLAdapter from './ddl'; + +export default DDLAdapter.extend({ +}); http://git-wip-us.apache.org/repos/asf/ambari/blob/853a1ce7/contrib/views/hive20/src/main/resources/ui/app/adapters/ddl.js ---------------------------------------------------------------------- diff --git a/contrib/views/hive20/src/main/resources/ui/app/adapters/ddl.js b/contrib/views/hive20/src/main/resources/ui/app/adapters/ddl.js new file mode 100644 index 0000000..003b445 --- /dev/null +++ b/contrib/views/hive20/src/main/resources/ui/app/adapters/ddl.js @@ -0,0 +1,26 @@ +/** + * 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. + */ + +import Ember from 'ember'; +import ApplicationAdapter from './application'; + +export default ApplicationAdapter.extend({ + namespace: Ember.computed(function() { + return this._super(...arguments) + '/ddl'; + }) +}); http://git-wip-us.apache.org/repos/asf/ambari/blob/853a1ce7/contrib/views/hive20/src/main/resources/ui/app/adapters/hdfs-viewer.js ---------------------------------------------------------------------- diff --git a/contrib/views/hive20/src/main/resources/ui/app/adapters/hdfs-viewer.js b/contrib/views/hive20/src/main/resources/ui/app/adapters/hdfs-viewer.js new file mode 100644 index 0000000..dcd52b8 --- /dev/null +++ b/contrib/views/hive20/src/main/resources/ui/app/adapters/hdfs-viewer.js @@ -0,0 +1,26 @@ +/** + * 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. + */ + +import ApplicationAdapter from './application'; + +export default ApplicationAdapter.extend({ + + namespace: Ember.computed(function() { + return this._super(...arguments) + '/directories/ops/listdir'; + }) +}); http://git-wip-us.apache.org/repos/asf/ambari/blob/853a1ce7/contrib/views/hive20/src/main/resources/ui/app/adapters/job.js ---------------------------------------------------------------------- diff --git a/contrib/views/hive20/src/main/resources/ui/app/adapters/job.js b/contrib/views/hive20/src/main/resources/ui/app/adapters/job.js new file mode 100644 index 0000000..8ccd7ad --- /dev/null +++ b/contrib/views/hive20/src/main/resources/ui/app/adapters/job.js @@ -0,0 +1,31 @@ +/** + * 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. + */ + +import ApplicationAdapter from './application'; + +export default ApplicationAdapter.extend({ + fetchResult(jobId) { + let resultUrl = this.urlForFindRecord(jobId, 'job') + "/results"; + return this.ajax(resultUrl, 'GET'); + }, + + getQuery(job) { + let queryUrl = this.buildURL() + "/file" + encodeURI(job.get('queryFile')); + console.log(queryUrl); + } +}); http://git-wip-us.apache.org/repos/asf/ambari/blob/853a1ce7/contrib/views/hive20/src/main/resources/ui/app/adapters/ping.js ---------------------------------------------------------------------- diff --git a/contrib/views/hive20/src/main/resources/ui/app/adapters/ping.js b/contrib/views/hive20/src/main/resources/ui/app/adapters/ping.js new file mode 100644 index 0000000..20c6d9c --- /dev/null +++ b/contrib/views/hive20/src/main/resources/ui/app/adapters/ping.js @@ -0,0 +1,30 @@ +/** + * 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. + */ + +import ApplicationAdapter from './application'; + +export default ApplicationAdapter.extend({ + ping() { + const url = this.urlForCreateRecord('ping'); + return this.ajax(url, 'POST'); + }, + + pathForType() { + return "system/ping"; + } +}); http://git-wip-us.apache.org/repos/asf/ambari/blob/853a1ce7/contrib/views/hive20/src/main/resources/ui/app/adapters/query.js ---------------------------------------------------------------------- diff --git a/contrib/views/hive20/src/main/resources/ui/app/adapters/query.js b/contrib/views/hive20/src/main/resources/ui/app/adapters/query.js new file mode 100644 index 0000000..a666b09 --- /dev/null +++ b/contrib/views/hive20/src/main/resources/ui/app/adapters/query.js @@ -0,0 +1,44 @@ +/** + * 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. + */ + +import Ember from 'ember'; +import ApplicationAdapter from './application'; + +export default ApplicationAdapter.extend({ + + buildURL(){ + return this._super(...arguments) + '/jobs/'; + }, + + createJob(payload) { + let postURL = this.buildURL(); + return this.ajax(postURL , 'POST', { data: {job: payload} }); + }, + getJob(jobId, dateSubmitted, firstCall){ + + let url = ''; + if(firstCall){ + url = this.buildURL() + jobId + '/results?first=true&_='+ dateSubmitted; + }else { + url = this.buildURL() + jobId + '/results?_='+ dateSubmitted; + } + + return this.ajax(url, 'GET') + } + +}); http://git-wip-us.apache.org/repos/asf/ambari/blob/853a1ce7/contrib/views/hive20/src/main/resources/ui/app/adapters/table-info.js ---------------------------------------------------------------------- diff --git a/contrib/views/hive20/src/main/resources/ui/app/adapters/table-info.js b/contrib/views/hive20/src/main/resources/ui/app/adapters/table-info.js new file mode 100644 index 0000000..46e7591 --- /dev/null +++ b/contrib/views/hive20/src/main/resources/ui/app/adapters/table-info.js @@ -0,0 +1,37 @@ +/** + * 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. + */ + +import Ember from 'ember'; +import DDLAdapter from './ddl'; + +export default DDLAdapter.extend({ + + buildURL(modelName, id, snapshot, requestType, query) { + // Check if the query is to find all tables for a particular database + if(Ember.isEmpty(id) && (requestType === 'query' || requestType == 'queryRecord')) { + let dbId = query.databaseId; + let tableName = query.tableName; + let origFindAllUrl = this._super(...arguments); + let prefix = origFindAllUrl.substr(0, origFindAllUrl.lastIndexOf("/")); + delete query.databaseId; + delete query.tableName; + return `${prefix}/databases/${dbId}/tables/${tableName}/info`; + } + return this._super(...arguments); + } +}); http://git-wip-us.apache.org/repos/asf/ambari/blob/853a1ce7/contrib/views/hive20/src/main/resources/ui/app/adapters/table.js ---------------------------------------------------------------------- diff --git a/contrib/views/hive20/src/main/resources/ui/app/adapters/table.js b/contrib/views/hive20/src/main/resources/ui/app/adapters/table.js new file mode 100644 index 0000000..f4d1615 --- /dev/null +++ b/contrib/views/hive20/src/main/resources/ui/app/adapters/table.js @@ -0,0 +1,48 @@ +/** + * 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. + */ + +import Ember from 'ember'; +import DDLAdapter from './ddl'; + +export default DDLAdapter.extend({ + buildURL(modelName, id, snapshot, requestType, query) { + // Check if the query is to find all tables for a particular database + if(Ember.isEmpty(id) && (requestType === 'query' || requestType == 'queryRecord')) { + let dbId = query.databaseId; + let tableName = query.tableName; + let origFindAllUrl = this._super(...arguments); + let prefix = origFindAllUrl.substr(0, origFindAllUrl.lastIndexOf("/")); + delete query.databaseId; + delete query.tableName; + if(Ember.isEmpty(tableName)) { + return `${prefix}/databases/${dbId}/tables`; + } else { + return `${prefix}/databases/${dbId}/tables/${tableName}`; + } + } + return this._super(...arguments); + }, + + + createTable(tableMetaInfo) { + let postURL = this.buildURL('table', null, null, 'query', {databaseId: tableMetaInfo.database}); + console.log(postURL); + console.log(tableMetaInfo); + return this.ajax(postURL, 'POST', { data: {tableInfo: tableMetaInfo} }); + } +}); http://git-wip-us.apache.org/repos/asf/ambari/blob/853a1ce7/contrib/views/hive20/src/main/resources/ui/app/app.js ---------------------------------------------------------------------- diff --git a/contrib/views/hive20/src/main/resources/ui/app/app.js b/contrib/views/hive20/src/main/resources/ui/app/app.js new file mode 100644 index 0000000..af4fdc4 --- /dev/null +++ b/contrib/views/hive20/src/main/resources/ui/app/app.js @@ -0,0 +1,36 @@ +/** + * 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. + */ + +import Ember from 'ember'; +import Resolver from './resolver'; +import loadInitializers from 'ember-load-initializers'; +import config from './config/environment'; + +let App; + +Ember.MODEL_FACTORY_INJECTIONS = true; + +App = Ember.Application.extend({ + modulePrefix: config.modulePrefix, + podModulePrefix: config.podModulePrefix, + Resolver +}); + +loadInitializers(App, config.modulePrefix); + +export default App; http://git-wip-us.apache.org/repos/asf/ambari/blob/853a1ce7/contrib/views/hive20/src/main/resources/ui/app/breakpoints.js ---------------------------------------------------------------------- diff --git a/contrib/views/hive20/src/main/resources/ui/app/breakpoints.js b/contrib/views/hive20/src/main/resources/ui/app/breakpoints.js new file mode 100644 index 0000000..f358473 --- /dev/null +++ b/contrib/views/hive20/src/main/resources/ui/app/breakpoints.js @@ -0,0 +1,23 @@ +/** + * 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. + */ + +export default { + mobile: '(max-width: 767px)', + tablet: '(min-width: 768px) and (max-width: 991px)', + desktop: '(min-width: 992px) and (max-width: 1200px)' +}; http://git-wip-us.apache.org/repos/asf/ambari/blob/853a1ce7/contrib/views/hive20/src/main/resources/ui/app/components/.gitkeep ---------------------------------------------------------------------- diff --git a/contrib/views/hive20/src/main/resources/ui/app/components/.gitkeep b/contrib/views/hive20/src/main/resources/ui/app/components/.gitkeep new file mode 100644 index 0000000..e69de29
