http://git-wip-us.apache.org/repos/asf/ambari/blob/8842be0c/ambari-logsearch/ambari-infra-solr-client/src/main/java/org/apache/ambari/infra/solr/commands/EnableKerberosPluginSolrZkCommand.java ---------------------------------------------------------------------- diff --git a/ambari-logsearch/ambari-infra-solr-client/src/main/java/org/apache/ambari/infra/solr/commands/EnableKerberosPluginSolrZkCommand.java b/ambari-logsearch/ambari-infra-solr-client/src/main/java/org/apache/ambari/infra/solr/commands/EnableKerberosPluginSolrZkCommand.java deleted file mode 100644 index 793addd..0000000 --- a/ambari-logsearch/ambari-infra-solr-client/src/main/java/org/apache/ambari/infra/solr/commands/EnableKerberosPluginSolrZkCommand.java +++ /dev/null @@ -1,88 +0,0 @@ -/* - * 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.infra.solr.commands; - -import org.apache.ambari.infra.solr.AmbariSolrCloudClient; -import org.apache.commons.io.FileUtils; -import org.apache.commons.lang.StringUtils; -import org.apache.solr.common.cloud.SolrZkClient; -import org.apache.solr.common.cloud.SolrZooKeeper; -import org.apache.zookeeper.CreateMode; - -import java.io.File; -import java.io.IOException; -import java.nio.charset.StandardCharsets; - -public class EnableKerberosPluginSolrZkCommand extends AbstractZookeeperRetryCommand<String> { - - private static final String SECURITY_JSON = "/security.json"; - private static final String UNSECURE_CONTENT = "{}"; - - public EnableKerberosPluginSolrZkCommand(int maxRetries, int interval) { - super(maxRetries, interval); - } - - @Override - protected String executeZkCommand(AmbariSolrCloudClient client, SolrZkClient zkClient, SolrZooKeeper solrZooKeeper) throws Exception { - String result = ""; - String filePath = client.getZnode() + SECURITY_JSON; - String fileContent = getFileContentFromZnode(zkClient, filePath); - String securityContent = getFileContent(client.getSecurityJsonLocation()); - if (client.isSecure()) { - if (!fileContent.equals(securityContent)) { - putFileContent(zkClient, filePath, securityContent); - } - result = securityContent; - } else { - if (!fileContent.equals(UNSECURE_CONTENT)) { - putFileContent(zkClient, filePath, UNSECURE_CONTENT); - } - result = UNSECURE_CONTENT; - } - return result; - } - - private void putFileContent(SolrZkClient zkClient, String fileName, String content) throws Exception { - if (zkClient.exists(fileName, true)) { - zkClient.setData(fileName, content.getBytes(StandardCharsets.UTF_8), true); - } else { - zkClient.create(fileName, content.getBytes(StandardCharsets.UTF_8), CreateMode.PERSISTENT, true); - } - } - - private String getFileContentFromZnode(SolrZkClient zkClient, String fileName) throws Exception { - String result; - if (zkClient.exists(fileName, true)) { - byte[] data = zkClient.getData(fileName, null, null, true); - result = new String(data, StandardCharsets.UTF_8); - } else { - result = UNSECURE_CONTENT; - } - return result; - } - - private String getFileContent(String fileLocation) throws IOException { - File securityJson = new File(fileLocation); - if (StringUtils.isNotEmpty(fileLocation) && securityJson.exists()) { - return FileUtils.readFileToString(securityJson); - } else { - return UNSECURE_CONTENT; - } - } -}
http://git-wip-us.apache.org/repos/asf/ambari/blob/8842be0c/ambari-logsearch/ambari-infra-solr-client/src/main/java/org/apache/ambari/infra/solr/commands/GetShardsCommand.java ---------------------------------------------------------------------- diff --git a/ambari-logsearch/ambari-infra-solr-client/src/main/java/org/apache/ambari/infra/solr/commands/GetShardsCommand.java b/ambari-logsearch/ambari-infra-solr-client/src/main/java/org/apache/ambari/infra/solr/commands/GetShardsCommand.java deleted file mode 100644 index e49bfec..0000000 --- a/ambari-logsearch/ambari-infra-solr-client/src/main/java/org/apache/ambari/infra/solr/commands/GetShardsCommand.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * 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.infra.solr.commands; - -import org.apache.ambari.infra.solr.AmbariSolrCloudClient; -import org.apache.solr.common.cloud.Slice; -import org.apache.solr.common.cloud.ZkStateReader; - -import java.util.Collection; - -public class GetShardsCommand extends AbstractRetryCommand<Collection<Slice>> { - - public GetShardsCommand(int maxRetries, int interval) { - super(maxRetries, interval); - } - - @Override - public Collection<Slice> createAndProcessRequest(AmbariSolrCloudClient solrCloudClient) throws Exception { - ZkStateReader zkReader = new ZkStateReader(solrCloudClient.getSolrZkClient()); - zkReader.createClusterStateWatchersAndUpdate(); - return zkReader.getClusterState().getSlices(solrCloudClient.getCollection()); - } -} http://git-wip-us.apache.org/repos/asf/ambari/blob/8842be0c/ambari-logsearch/ambari-infra-solr-client/src/main/java/org/apache/ambari/infra/solr/commands/GetSolrHostsCommand.java ---------------------------------------------------------------------- diff --git a/ambari-logsearch/ambari-infra-solr-client/src/main/java/org/apache/ambari/infra/solr/commands/GetSolrHostsCommand.java b/ambari-logsearch/ambari-infra-solr-client/src/main/java/org/apache/ambari/infra/solr/commands/GetSolrHostsCommand.java deleted file mode 100644 index 5a14a44..0000000 --- a/ambari-logsearch/ambari-infra-solr-client/src/main/java/org/apache/ambari/infra/solr/commands/GetSolrHostsCommand.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - * 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.infra.solr.commands; - -import org.apache.ambari.infra.solr.AmbariSolrCloudClient; -import org.apache.zookeeper.ZooKeeper; - -import java.net.InetAddress; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; - -public class GetSolrHostsCommand extends AbstractRetryCommand<Collection<String>> { - - public GetSolrHostsCommand(int maxRetries, int interval) { - super(maxRetries, interval); - } - - @Override - public Collection<String> createAndProcessRequest(AmbariSolrCloudClient solrCloudClient) throws Exception { - List<String> solrHosts = new ArrayList<>(); - - ZooKeeper zk = new ZooKeeper(solrCloudClient.getZkConnectString(), 10000, null); - List<String> ids = zk.getChildren("/live_nodes", false); - for (String id : ids) { - if (id.endsWith("_solr")) { - String hostAndPort = id.substring(0, id.length() - 5); - String[] tokens = hostAndPort.split(":"); - String host = InetAddress.getByName(tokens[0]).getHostName(); - - solrHosts.add(host); - } - } - - return solrHosts; - } -} http://git-wip-us.apache.org/repos/asf/ambari/blob/8842be0c/ambari-logsearch/ambari-infra-solr-client/src/main/java/org/apache/ambari/infra/solr/commands/GetStateFileZkCommand.java ---------------------------------------------------------------------- diff --git a/ambari-logsearch/ambari-infra-solr-client/src/main/java/org/apache/ambari/infra/solr/commands/GetStateFileZkCommand.java b/ambari-logsearch/ambari-infra-solr-client/src/main/java/org/apache/ambari/infra/solr/commands/GetStateFileZkCommand.java deleted file mode 100644 index 10a8daa..0000000 --- a/ambari-logsearch/ambari-infra-solr-client/src/main/java/org/apache/ambari/infra/solr/commands/GetStateFileZkCommand.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - * 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.infra.solr.commands; - -import org.apache.ambari.infra.solr.AmbariSolrCloudClient; -import org.apache.ambari.infra.solr.domain.AmbariSolrState; -import org.apache.solr.common.cloud.SolrZkClient; -import org.apache.solr.common.cloud.SolrZooKeeper; - -public class GetStateFileZkCommand extends AbstractStateFileZkCommand { - private String unsecureZnode; - - public GetStateFileZkCommand(int maxRetries, int interval, String unsecureZnode) { - super(maxRetries, interval); - this.unsecureZnode = unsecureZnode; - } - - @Override - protected AmbariSolrState executeZkCommand(AmbariSolrCloudClient client, SolrZkClient zkClient, SolrZooKeeper solrZooKeeper) throws Exception { - AmbariSolrState result = AmbariSolrState.UNSECURE; - String stateFile = String.format("%s/%s", unsecureZnode, AbstractStateFileZkCommand.STATE_FILE); - if (zkClient.exists(stateFile, true)) { - result = getStateFromJson(client, stateFile); - } - return result; - } -} http://git-wip-us.apache.org/repos/asf/ambari/blob/8842be0c/ambari-logsearch/ambari-infra-solr-client/src/main/java/org/apache/ambari/infra/solr/commands/ListCollectionCommand.java ---------------------------------------------------------------------- diff --git a/ambari-logsearch/ambari-infra-solr-client/src/main/java/org/apache/ambari/infra/solr/commands/ListCollectionCommand.java b/ambari-logsearch/ambari-infra-solr-client/src/main/java/org/apache/ambari/infra/solr/commands/ListCollectionCommand.java deleted file mode 100644 index 41094c7..0000000 --- a/ambari-logsearch/ambari-infra-solr-client/src/main/java/org/apache/ambari/infra/solr/commands/ListCollectionCommand.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * 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.infra.solr.commands; - -import org.apache.ambari.infra.solr.AmbariSolrCloudClient; -import org.apache.solr.client.solrj.request.CollectionAdminRequest; -import org.apache.solr.client.solrj.response.CollectionAdminResponse; - -import java.util.List; - -public class ListCollectionCommand extends AbstractSolrRetryCommand<CollectionAdminRequest.List, List<String>> { - - public ListCollectionCommand(int maxRetries, int interval) { - super(maxRetries, interval); - } - - @Override - public List<String> handleResponse(CollectionAdminResponse response, AmbariSolrCloudClient client) throws Exception { - List<String> allCollectionList = (List<String>) response - .getResponse().get("collections"); - return allCollectionList; - } - - @Override - public CollectionAdminRequest.List createRequest(AmbariSolrCloudClient client) { - return new CollectionAdminRequest.List(); - } - - @Override - public String errorMessage(AmbariSolrCloudClient client) { - return "Cannot get collections."; - } -} http://git-wip-us.apache.org/repos/asf/ambari/blob/8842be0c/ambari-logsearch/ambari-infra-solr-client/src/main/java/org/apache/ambari/infra/solr/commands/SecureSolrZNodeZkCommand.java ---------------------------------------------------------------------- diff --git a/ambari-logsearch/ambari-infra-solr-client/src/main/java/org/apache/ambari/infra/solr/commands/SecureSolrZNodeZkCommand.java b/ambari-logsearch/ambari-infra-solr-client/src/main/java/org/apache/ambari/infra/solr/commands/SecureSolrZNodeZkCommand.java deleted file mode 100644 index 6958623..0000000 --- a/ambari-logsearch/ambari-infra-solr-client/src/main/java/org/apache/ambari/infra/solr/commands/SecureSolrZNodeZkCommand.java +++ /dev/null @@ -1,86 +0,0 @@ -/* - * 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.infra.solr.commands; - -import org.apache.ambari.infra.solr.AmbariSolrCloudClient; -import org.apache.ambari.infra.solr.util.AclUtils; -import org.apache.commons.lang.StringUtils; -import org.apache.solr.common.cloud.SolrZkClient; -import org.apache.solr.common.cloud.SolrZooKeeper; -import org.apache.zookeeper.KeeperException; -import org.apache.zookeeper.ZooDefs; -import org.apache.zookeeper.data.ACL; -import org.apache.zookeeper.data.Id; -import org.apache.zookeeper.data.Stat; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - -public class SecureSolrZNodeZkCommand extends AbstractZookeeperRetryCommand<Boolean> { - - private static final Logger LOG = LoggerFactory.getLogger(SecureSolrZNodeZkCommand.class); - - public SecureSolrZNodeZkCommand(int maxRetries, int interval) { - super(maxRetries, interval); - } - - @Override - protected Boolean executeZkCommand(AmbariSolrCloudClient client, SolrZkClient zkClient, SolrZooKeeper solrZooKeeper) throws Exception { - String zNode = client.getZnode(); - List<ACL> newAclList = new ArrayList<>(); - List<ACL> saslUserList = AclUtils.createAclListFromSaslUsers(client.getSaslUsers().split(",")); - newAclList.addAll(saslUserList); - newAclList.add(new ACL(ZooDefs.Perms.READ, new Id("world", "anyone"))); - - String configsPath = String.format("%s/%s", zNode, "configs"); - String collectionsPath = String.format("%s/%s", zNode, "collections"); - String aliasesPath = String.format("%s/%s", zNode, "aliases.json"); // TODO: protect this later somehow - List<String> excludePaths = Arrays.asList(configsPath, collectionsPath, aliasesPath); - - createZnodeIfNeeded(configsPath, client.getSolrZkClient()); - createZnodeIfNeeded(collectionsPath, client.getSolrZkClient()); - - AclUtils.setRecursivelyOn(client.getSolrZkClient().getSolrZooKeeper(), zNode, newAclList, excludePaths); - - List<ACL> commonConfigAcls = new ArrayList<>(); - commonConfigAcls.addAll(saslUserList); - commonConfigAcls.add(new ACL(ZooDefs.Perms.READ | ZooDefs.Perms.CREATE, new Id("world", "anyone"))); - - LOG.info("Set sasl users for znode '{}' : {}", client.getZnode(), StringUtils.join(saslUserList, ",")); - LOG.info("Skip {}/configs and {}/collections", client.getZnode(), client.getZnode()); - solrZooKeeper.setACL(configsPath, AclUtils.mergeAcls(solrZooKeeper.getACL(configsPath, new Stat()), commonConfigAcls), -1); - solrZooKeeper.setACL(collectionsPath, AclUtils.mergeAcls(solrZooKeeper.getACL(collectionsPath, new Stat()), commonConfigAcls), -1); - - LOG.info("Set world:anyone to 'cr' on {}/configs and {}/collections", client.getZnode(), client.getZnode()); - AclUtils.setRecursivelyOn(solrZooKeeper, configsPath, saslUserList); - AclUtils.setRecursivelyOn(solrZooKeeper, collectionsPath, saslUserList); - - return true; - } - - private void createZnodeIfNeeded(String configsPath, SolrZkClient zkClient) throws KeeperException, InterruptedException { - if (!zkClient.exists(configsPath, true)) { - LOG.info("'{}' does not exist. Creating it ...", configsPath); - zkClient.makePath(configsPath, true); - } - } -} http://git-wip-us.apache.org/repos/asf/ambari/blob/8842be0c/ambari-logsearch/ambari-infra-solr-client/src/main/java/org/apache/ambari/infra/solr/commands/SecureZNodeZkCommand.java ---------------------------------------------------------------------- diff --git a/ambari-logsearch/ambari-infra-solr-client/src/main/java/org/apache/ambari/infra/solr/commands/SecureZNodeZkCommand.java b/ambari-logsearch/ambari-infra-solr-client/src/main/java/org/apache/ambari/infra/solr/commands/SecureZNodeZkCommand.java deleted file mode 100644 index a96dc5d..0000000 --- a/ambari-logsearch/ambari-infra-solr-client/src/main/java/org/apache/ambari/infra/solr/commands/SecureZNodeZkCommand.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * 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.infra.solr.commands; - -import org.apache.ambari.infra.solr.AmbariSolrCloudClient; -import org.apache.ambari.infra.solr.util.AclUtils; -import org.apache.solr.common.cloud.SolrZkClient; -import org.apache.solr.common.cloud.SolrZooKeeper; -import org.apache.zookeeper.ZooDefs; -import org.apache.zookeeper.data.ACL; -import org.apache.zookeeper.data.Id; - -import java.util.ArrayList; -import java.util.List; - -public class SecureZNodeZkCommand extends AbstractZookeeperRetryCommand<Boolean> { - - public SecureZNodeZkCommand(int maxRetries, int interval) { - super(maxRetries, interval); - } - - @Override - protected Boolean executeZkCommand(AmbariSolrCloudClient client, SolrZkClient zkClient, SolrZooKeeper solrZooKeeper) throws Exception { - String zNode = client.getZnode(); - List<ACL> newAclList = new ArrayList<>(); - List<ACL> saslUserList = AclUtils.createAclListFromSaslUsers(client.getSaslUsers().split(",")); - newAclList.addAll(saslUserList); - newAclList.add(new ACL(ZooDefs.Perms.READ, new Id("world", "anyone"))); - AclUtils.setRecursivelyOn(client.getSolrZkClient().getSolrZooKeeper(), zNode, newAclList); - return true; - } - -} http://git-wip-us.apache.org/repos/asf/ambari/blob/8842be0c/ambari-logsearch/ambari-infra-solr-client/src/main/java/org/apache/ambari/infra/solr/commands/SetClusterPropertyZkCommand.java ---------------------------------------------------------------------- diff --git a/ambari-logsearch/ambari-infra-solr-client/src/main/java/org/apache/ambari/infra/solr/commands/SetClusterPropertyZkCommand.java b/ambari-logsearch/ambari-infra-solr-client/src/main/java/org/apache/ambari/infra/solr/commands/SetClusterPropertyZkCommand.java deleted file mode 100644 index 34597c6..0000000 --- a/ambari-logsearch/ambari-infra-solr-client/src/main/java/org/apache/ambari/infra/solr/commands/SetClusterPropertyZkCommand.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * 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.infra.solr.commands; - -import org.apache.ambari.infra.solr.AmbariSolrCloudClient; -import org.apache.solr.common.cloud.SolrZkClient; -import org.apache.solr.common.cloud.SolrZooKeeper; -import org.apache.solr.common.cloud.ZkStateReader; - -public class SetClusterPropertyZkCommand extends AbstractZookeeperRetryCommand<String>{ - - public SetClusterPropertyZkCommand(int maxRetries, int interval) { - super(maxRetries, interval); - } - - @Override - protected String executeZkCommand(AmbariSolrCloudClient client, SolrZkClient zkClient, SolrZooKeeper solrZooKeeper) throws Exception { - String propertyName = client.getPropName(); - String propertyValue = client.getPropValue(); - ZkStateReader reader = new ZkStateReader(zkClient); - reader.setClusterProperty(propertyName, propertyValue); - return propertyValue; - } -} http://git-wip-us.apache.org/repos/asf/ambari/blob/8842be0c/ambari-logsearch/ambari-infra-solr-client/src/main/java/org/apache/ambari/infra/solr/commands/UpdateStateFileZkCommand.java ---------------------------------------------------------------------- diff --git a/ambari-logsearch/ambari-infra-solr-client/src/main/java/org/apache/ambari/infra/solr/commands/UpdateStateFileZkCommand.java b/ambari-logsearch/ambari-infra-solr-client/src/main/java/org/apache/ambari/infra/solr/commands/UpdateStateFileZkCommand.java deleted file mode 100644 index 2b360fb..0000000 --- a/ambari-logsearch/ambari-infra-solr-client/src/main/java/org/apache/ambari/infra/solr/commands/UpdateStateFileZkCommand.java +++ /dev/null @@ -1,84 +0,0 @@ -/* - * 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.infra.solr.commands; - -import org.apache.ambari.infra.solr.AmbariSolrCloudClient; -import org.apache.ambari.infra.solr.domain.AmbariSolrState; -import org.apache.solr.common.cloud.SolrZkClient; -import org.apache.solr.common.cloud.SolrZooKeeper; -import org.apache.zookeeper.CreateMode; -import org.codehaus.jackson.map.ObjectMapper; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.nio.charset.StandardCharsets; -import java.util.HashMap; -import java.util.Map; - -public class UpdateStateFileZkCommand extends AbstractStateFileZkCommand { - - private static final Logger LOG = LoggerFactory.getLogger(UpdateStateFileZkCommand.class); - - private String unsecureZnode; - - public UpdateStateFileZkCommand(int maxRetries, int interval, String unsecureZnode) { - super(maxRetries, interval); - this.unsecureZnode = unsecureZnode; - } - - @Override - protected AmbariSolrState executeZkCommand(AmbariSolrCloudClient client, SolrZkClient zkClient, SolrZooKeeper solrZooKeeper) throws Exception { - boolean secure = client.isSecure(); - String stateFile = String.format("%s/%s", unsecureZnode, AbstractStateFileZkCommand.STATE_FILE); - AmbariSolrState result = null; - if (secure) { - LOG.info("Update state file in secure mode."); - updateStateFile(client, zkClient, AmbariSolrState.SECURE, stateFile); - result = AmbariSolrState.SECURE; - } else { - LOG.info("Update state file in unsecure mode."); - updateStateFile(client, zkClient, AmbariSolrState.UNSECURE, stateFile); - result = AmbariSolrState.UNSECURE; - } - return result; - } - - private void updateStateFile(AmbariSolrCloudClient client, SolrZkClient zkClient, AmbariSolrState stateToUpdate, - String stateFile) throws Exception { - if (!zkClient.exists(stateFile, true)) { - LOG.info("State file does not exits. Initializing it as '{}'", stateToUpdate); - zkClient.create(stateFile, createStateJson(stateToUpdate).getBytes(StandardCharsets.UTF_8), - CreateMode.PERSISTENT, true); - } else { - AmbariSolrState stateOnSecure = getStateFromJson(client, stateFile); - if (stateToUpdate.equals(stateOnSecure)) { - LOG.info("State file is in '{}' mode. No update.", stateOnSecure); - } else { - LOG.info("State file is in '{}' mode. Updating it to '{}'", stateOnSecure, stateToUpdate); - zkClient.setData(stateFile, createStateJson(stateToUpdate).getBytes(StandardCharsets.UTF_8), true); - } - } - } - - private String createStateJson(AmbariSolrState state) throws Exception { - Map<String, String> secStateMap = new HashMap<>(); - secStateMap.put(AbstractStateFileZkCommand.STATE_FIELD, state.toString()); - return new ObjectMapper().writeValueAsString(secStateMap); - } -} http://git-wip-us.apache.org/repos/asf/ambari/blob/8842be0c/ambari-logsearch/ambari-infra-solr-client/src/main/java/org/apache/ambari/infra/solr/commands/UploadConfigZkCommand.java ---------------------------------------------------------------------- diff --git a/ambari-logsearch/ambari-infra-solr-client/src/main/java/org/apache/ambari/infra/solr/commands/UploadConfigZkCommand.java b/ambari-logsearch/ambari-infra-solr-client/src/main/java/org/apache/ambari/infra/solr/commands/UploadConfigZkCommand.java deleted file mode 100644 index fc7482d..0000000 --- a/ambari-logsearch/ambari-infra-solr-client/src/main/java/org/apache/ambari/infra/solr/commands/UploadConfigZkCommand.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * 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.infra.solr.commands; - -import org.apache.ambari.infra.solr.AmbariSolrCloudClient; -import org.apache.solr.common.cloud.ZkConfigManager; - -import java.io.IOException; -import java.nio.file.Path; -import java.nio.file.Paths; - -public class UploadConfigZkCommand extends AbstractZookeeperConfigCommand<String> { - - public UploadConfigZkCommand(int maxRetries, int interval) { - super(maxRetries, interval); - } - - @Override - protected String executeZkConfigCommand(ZkConfigManager zkConfigManager, AmbariSolrCloudClient client) throws Exception { - Path configDir = Paths.get(client.getConfigDir()); - String configSet = client.getConfigSet(); - zkConfigManager.uploadConfigDir(configDir, configSet); - return configSet; - } -} http://git-wip-us.apache.org/repos/asf/ambari/blob/8842be0c/ambari-logsearch/ambari-infra-solr-client/src/main/java/org/apache/ambari/infra/solr/domain/AmbariSolrState.java ---------------------------------------------------------------------- diff --git a/ambari-logsearch/ambari-infra-solr-client/src/main/java/org/apache/ambari/infra/solr/domain/AmbariSolrState.java b/ambari-logsearch/ambari-infra-solr-client/src/main/java/org/apache/ambari/infra/solr/domain/AmbariSolrState.java deleted file mode 100644 index 489d3f1..0000000 --- a/ambari-logsearch/ambari-infra-solr-client/src/main/java/org/apache/ambari/infra/solr/domain/AmbariSolrState.java +++ /dev/null @@ -1,26 +0,0 @@ -/* - * 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.infra.solr.domain; - -/** - * Enum state values for storing security status in unsecure znode - */ -public enum AmbariSolrState { - SECURE, UNSECURE -} http://git-wip-us.apache.org/repos/asf/ambari/blob/8842be0c/ambari-logsearch/ambari-infra-solr-client/src/main/java/org/apache/ambari/infra/solr/util/AclUtils.java ---------------------------------------------------------------------- diff --git a/ambari-logsearch/ambari-infra-solr-client/src/main/java/org/apache/ambari/infra/solr/util/AclUtils.java b/ambari-logsearch/ambari-infra-solr-client/src/main/java/org/apache/ambari/infra/solr/util/AclUtils.java deleted file mode 100644 index dd5d6c8..0000000 --- a/ambari-logsearch/ambari-infra-solr-client/src/main/java/org/apache/ambari/infra/solr/util/AclUtils.java +++ /dev/null @@ -1,85 +0,0 @@ -/* - * 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.infra.solr.util; - -import org.apache.solr.common.cloud.SolrZooKeeper; -import org.apache.zookeeper.KeeperException; -import org.apache.zookeeper.ZooDefs; -import org.apache.zookeeper.data.ACL; -import org.apache.zookeeper.data.Id; -import org.apache.zookeeper.data.Stat; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -public class AclUtils { - - public static List<ACL> mergeAcls(List<ACL> originalAcls, List<ACL> updateAcls) { - Map<String, ACL> aclMap = new HashMap<>(); - List<ACL> acls = new ArrayList<>(); - if (originalAcls != null) { - for (ACL acl : originalAcls) { - aclMap.put(acl.getId().getId(), acl); - } - } - - if (updateAcls != null) { - for (ACL acl : updateAcls) { - aclMap.put(acl.getId().getId(), acl); - } - } - - for (Map.Entry<String, ACL> aclEntry : aclMap.entrySet()) { - acls.add(aclEntry.getValue()); - } - return acls; - } - - public static List<ACL> createAclListFromSaslUsers(String[] saslUsers) { - List<ACL> saslUserList = new ArrayList<>(); - for (String saslUser : saslUsers) { - ACL acl = new ACL(); - acl.setId(new Id("sasl", saslUser)); - acl.setPerms(ZooDefs.Perms.ALL); - saslUserList.add(acl); - } - return saslUserList; - } - - public static void setRecursivelyOn(SolrZooKeeper solrZooKeeper, String node, List<ACL> acls) throws KeeperException, InterruptedException { - setRecursivelyOn(solrZooKeeper, node, acls, new ArrayList<String>()); - } - - public static void setRecursivelyOn(SolrZooKeeper solrZooKeeper, String node, List<ACL> acls, List<String> excludePaths) - throws KeeperException, InterruptedException { - if (!excludePaths.contains(node)) { - List<ACL> newAcls = AclUtils.mergeAcls(solrZooKeeper.getACL(node, new Stat()), acls); - solrZooKeeper.setACL(node, newAcls, -1); - for (String child : solrZooKeeper.getChildren(node, null)) { - setRecursivelyOn(solrZooKeeper, path(node, child), acls, excludePaths); - } - } - } - - private static String path(String node, String child) { - return node.endsWith("/") ? node + child : node + "/" + child; - } -} http://git-wip-us.apache.org/repos/asf/ambari/blob/8842be0c/ambari-logsearch/ambari-infra-solr-client/src/main/java/org/apache/ambari/infra/solr/util/ShardUtils.java ---------------------------------------------------------------------- diff --git a/ambari-logsearch/ambari-infra-solr-client/src/main/java/org/apache/ambari/infra/solr/util/ShardUtils.java b/ambari-logsearch/ambari-infra-solr-client/src/main/java/org/apache/ambari/infra/solr/util/ShardUtils.java deleted file mode 100644 index f46565b..0000000 --- a/ambari-logsearch/ambari-infra-solr-client/src/main/java/org/apache/ambari/infra/solr/util/ShardUtils.java +++ /dev/null @@ -1,71 +0,0 @@ -/* - * 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.infra.solr.util; - -import org.apache.solr.common.cloud.Replica; -import org.apache.solr.common.cloud.Slice; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; - -public class ShardUtils { - - private static final Logger LOG = LoggerFactory.getLogger(ShardUtils.class); - - public static String generateShardListStr(int maxShardsPerNode) { - String shardsListStr = ""; - for (int i = 0; i < maxShardsPerNode; i++) { - if (i != 0) { - shardsListStr += ","; - } - String shard = "shard" + i; - shardsListStr += shard; - } - return shardsListStr; - } - - public static List<String> generateShardList(int maxShardsPerNode) { - List<String> shardsList = new ArrayList<>(); - for (int i = 0; i < maxShardsPerNode; i++) { - shardsList.add("shard" + i); - } - return shardsList; - } - - public static Collection<String> getShardNamesFromSlices(Collection<Slice> slices, String collection) { - Collection<String> result = new HashSet<String>(); - Iterator<Slice> iter = slices.iterator(); - while (iter.hasNext()) { - Slice slice = iter.next(); - for (Replica replica : slice.getReplicas()) { - LOG.info("collectionName=" + collection + ", slice.name=" - + slice.getName() + ", slice.state=" + slice.getState() - + ", replica.core=" + replica.getStr("core") - + ", replica.state=" + replica.getStr("state")); - result.add(slice.getName()); - } - } - return result; - } -} http://git-wip-us.apache.org/repos/asf/ambari/blob/8842be0c/ambari-logsearch/ambari-infra-solr-client/src/main/resources/log4j.properties ---------------------------------------------------------------------- diff --git a/ambari-logsearch/ambari-infra-solr-client/src/main/resources/log4j.properties b/ambari-logsearch/ambari-infra-solr-client/src/main/resources/log4j.properties deleted file mode 100644 index e8dca12..0000000 --- a/ambari-logsearch/ambari-infra-solr-client/src/main/resources/log4j.properties +++ /dev/null @@ -1,31 +0,0 @@ -# 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. - -log4j.rootLogger=INFO,stdout,stderr - -log4j.appender.stdout=org.apache.log4j.ConsoleAppender -log4j.appender.stdout.Threshold=INFO -log4j.appender.stdout.Target=System.out -log4j.appender.stdout.layout=org.apache.log4j.PatternLayout -log4j.appender.stdout.layout.ConversionPattern=%m%n - -log4j.appender.stderr=org.apache.log4j.ConsoleAppender -log4j.appender.stderr.Threshold=ERROR -log4j.appender.stderr.Target=System.err -log4j.appender.stderr.layout=org.apache.log4j.PatternLayout -log4j.appender.stderr.layout.ConversionPattern=%m%n \ No newline at end of file http://git-wip-us.apache.org/repos/asf/ambari/blob/8842be0c/ambari-logsearch/ambari-infra-solr-client/src/main/resources/solrCloudCli.sh ---------------------------------------------------------------------- diff --git a/ambari-logsearch/ambari-infra-solr-client/src/main/resources/solrCloudCli.sh b/ambari-logsearch/ambari-infra-solr-client/src/main/resources/solrCloudCli.sh deleted file mode 100644 index cd47f06..0000000 --- a/ambari-logsearch/ambari-infra-solr-client/src/main/resources/solrCloudCli.sh +++ /dev/null @@ -1,20 +0,0 @@ -#!/bin/bash -# 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. - -JVM="java" -sdir="`dirname \"$0\"`" - -PATH=$JAVA_HOME/bin:$PATH $JVM -classpath "$sdir:$sdir/libs/*" org.apache.ambari.logsearch.solr.AmbariSolrCloudCLI ${1+"$@"} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/ambari/blob/8842be0c/ambari-logsearch/ambari-infra-solr-client/src/test/java/org/apache/ambari/infra/solr/AmbariSolrCloudClientTest.java ---------------------------------------------------------------------- diff --git a/ambari-logsearch/ambari-infra-solr-client/src/test/java/org/apache/ambari/infra/solr/AmbariSolrCloudClientTest.java b/ambari-logsearch/ambari-infra-solr-client/src/test/java/org/apache/ambari/infra/solr/AmbariSolrCloudClientTest.java deleted file mode 100644 index 44f3ec5..0000000 --- a/ambari-logsearch/ambari-infra-solr-client/src/test/java/org/apache/ambari/infra/solr/AmbariSolrCloudClientTest.java +++ /dev/null @@ -1,134 +0,0 @@ -/* - * 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.infra.solr; - -import static org.easymock.EasyMock.anyString; -import static org.easymock.EasyMock.anyObject; -import static org.easymock.EasyMock.createMock; -import static org.easymock.EasyMock.expect; -import static org.easymock.EasyMock.replay; -import static org.easymock.EasyMock.verify; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; - -import org.apache.solr.client.solrj.impl.CloudSolrClient; -import org.apache.solr.client.solrj.request.CollectionAdminRequest; -import org.apache.solr.client.solrj.response.CollectionAdminResponse; -import org.apache.solr.common.cloud.SolrZkClient; -import org.apache.solr.common.util.NamedList; -import org.junit.Before; -import org.junit.Test; - -import java.util.Arrays; -import java.util.List; - -public class AmbariSolrCloudClientTest { - - private AmbariSolrCloudClient underTest; - - private CloudSolrClient mockedSolrClient; - - private SolrZkClient mockedSolrZkClient; - - private CollectionAdminResponse mockedResponse; - - @Before - public void setUp() { - AmbariSolrCloudClientBuilder builder = new AmbariSolrCloudClientBuilder(); - - mockedSolrClient = createMock(CloudSolrClient.class); - mockedSolrZkClient = createMock(SolrZkClient.class); - mockedResponse = createMock(CollectionAdminResponse.class); - - builder.solrCloudClient = mockedSolrClient; - builder.solrZkClient = mockedSolrZkClient; - - underTest = builder - .withZkConnectString("localhost1:2181,localhost2:2182") - .withCollection("collection1") - .withConfigSet("configSet") - .withShards(1) - .withReplication(1) - .withMaxShardsPerNode(2) - .withInterval(1) - .withRetry(2) - .withRouterName("routerName") - .withRouterField("routerField") - .build(); - } - - @Test - public void testCreateCollectionWhenCollectionDoesNotExist() throws Exception { - // GIVEN - NamedList<Object> namedList = new NamedList<>(); - namedList.add("collections", Arrays.asList("collection1", "collection2")); - - expect(mockedSolrClient.request(anyObject(CollectionAdminRequest.class), anyString())).andReturn(namedList).times(1); - replay(mockedSolrClient); - - // WHEN - String result = underTest.createCollection(); - // THEN - assertEquals("collection1", result); - verify(mockedSolrClient); - } - - @Test - public void testCreateCollectionWhenCollectionExists() throws Exception { - // GIVEN - NamedList<Object> namedList = new NamedList<>(); - namedList.add("collections", Arrays.asList("collection2", "collection3")); - - expect(mockedSolrClient.request(anyObject(CollectionAdminRequest.class), anyString())).andReturn(namedList).times(2); - replay(mockedSolrClient); - - // WHEN - String result = underTest.createCollection(); - // THEN - assertEquals("collection1", result); - verify(mockedSolrClient); - } - - @Test - public void testListCollections() throws Exception { - // GIVEN - NamedList<Object> namedList = new NamedList<>(); - namedList.add("collections", Arrays.asList("collection1", "collection2")); - - expect(mockedSolrClient.request(anyObject(CollectionAdminRequest.class), anyString())).andReturn(namedList); - - replay(mockedSolrClient); - // WHEN - List<String> result = underTest.listCollections(); - - // THEN - assertTrue(result.contains("collection1")); - assertTrue(result.contains("collection2")); - assertEquals(2, result.size()); - } - - @Test(expected = AmbariSolrCloudClientException.class) - public void testRetries() throws Exception { - // GIVEN - expect(mockedSolrClient.request(anyObject(CollectionAdminRequest.class), anyString())).andThrow(new RuntimeException("ex")).times(2); - replay(mockedSolrClient); - // WHEN - underTest.listCollections(); - } -} http://git-wip-us.apache.org/repos/asf/ambari/blob/8842be0c/ambari-logsearch/ambari-infra-solr-plugin/pom.xml ---------------------------------------------------------------------- diff --git a/ambari-logsearch/ambari-infra-solr-plugin/pom.xml b/ambari-logsearch/ambari-infra-solr-plugin/pom.xml deleted file mode 100644 index dbd4bff..0000000 --- a/ambari-logsearch/ambari-infra-solr-plugin/pom.xml +++ /dev/null @@ -1,56 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- - 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. ---> -<project xmlns="http://maven.apache.org/POM/4.0.0" - xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> - <parent> - <artifactId>ambari-logsearch</artifactId> - <groupId>org.apache.ambari</groupId> - <version>2.0.0.0-SNAPSHOT</version> - </parent> - <name>Ambari Infra Solr Plugin</name> - <url>http://maven.apache.org</url> - <modelVersion>4.0.0</modelVersion> - <artifactId>ambari-infra-solr-plugin</artifactId> - <dependencies> - <dependency> - <groupId>org.apache.solr</groupId> - <artifactId>solr-core</artifactId> - <version>${solr.version}</version> - </dependency> - <dependency> - <groupId>org.apache.solr</groupId> - <artifactId>solr-test-framework</artifactId> - <version>${solr.version}</version> - <scope>test</scope> - </dependency> - </dependencies> - <build> - <plugins> - <plugin> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-compiler-plugin</artifactId> - <version>3.3</version> - <configuration> - <source>1.7</source> - <target>1.7</target> - </configuration> - </plugin> - </plugins> - </build> -</project> \ No newline at end of file http://git-wip-us.apache.org/repos/asf/ambari/blob/8842be0c/ambari-logsearch/ambari-infra-solr-plugin/src/main/java/org.apache.ambari.infra.security/InfraKerberosHostValidator.java ---------------------------------------------------------------------- diff --git a/ambari-logsearch/ambari-infra-solr-plugin/src/main/java/org.apache.ambari.infra.security/InfraKerberosHostValidator.java b/ambari-logsearch/ambari-infra-solr-plugin/src/main/java/org.apache.ambari.infra.security/InfraKerberosHostValidator.java deleted file mode 100644 index 4a47a89..0000000 --- a/ambari-logsearch/ambari-infra-solr-plugin/src/main/java/org.apache.ambari.infra.security/InfraKerberosHostValidator.java +++ /dev/null @@ -1,54 +0,0 @@ -/* - * 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.infra.security; - -import org.apache.commons.collections.CollectionUtils; -import org.apache.commons.collections.MapUtils; -import org.apache.hadoop.security.authentication.server.AuthenticationToken; -import org.apache.hadoop.security.authentication.util.KerberosName; - -import java.security.Principal; -import java.util.Map; -import java.util.Set; - -/** - * Validate that the user has the right access based on the hostname in the kerberos principal - */ -public class InfraKerberosHostValidator { - - public boolean validate(Principal principal, Map<String, Set<String>> userVsHosts, Map<String, String> userVsHostRegex) { - if (principal instanceof AuthenticationToken) { - AuthenticationToken authenticationToken = (AuthenticationToken) principal; - KerberosName kerberosName = new KerberosName(authenticationToken.getName()); - String hostname = kerberosName.getHostName(); - String serviceUserName = kerberosName.getServiceName(); - if (MapUtils.isNotEmpty(userVsHostRegex)) { - String regex = userVsHostRegex.get(serviceUserName); - return hostname.matches(regex); - } - if (MapUtils.isNotEmpty(userVsHosts)) { - Set<String> hosts = userVsHosts.get(serviceUserName); - if (CollectionUtils.isNotEmpty(hosts)) { - return hosts.contains(hostname); - } - } - } - return true; - } -} http://git-wip-us.apache.org/repos/asf/ambari/blob/8842be0c/ambari-logsearch/ambari-infra-solr-plugin/src/main/java/org.apache.ambari.infra.security/InfraRuleBasedAuthorizationPlugin.java ---------------------------------------------------------------------- diff --git a/ambari-logsearch/ambari-infra-solr-plugin/src/main/java/org.apache.ambari.infra.security/InfraRuleBasedAuthorizationPlugin.java b/ambari-logsearch/ambari-infra-solr-plugin/src/main/java/org.apache.ambari.infra.security/InfraRuleBasedAuthorizationPlugin.java deleted file mode 100644 index 2f1a558..0000000 --- a/ambari-logsearch/ambari-infra-solr-plugin/src/main/java/org.apache.ambari.infra.security/InfraRuleBasedAuthorizationPlugin.java +++ /dev/null @@ -1,542 +0,0 @@ -/* - * 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.infra.security; - -import com.google.common.collect.ImmutableSet; -import java.io.IOException; -import java.lang.invoke.MethodHandles; -import java.security.Principal; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.HashMap; -import java.util.HashSet; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.Set; -import org.apache.solr.common.SolrException; -import org.apache.solr.common.params.CollectionParams; -import org.apache.solr.common.util.Utils; -import org.apache.solr.security.AuthorizationContext; -import org.apache.solr.security.AuthorizationPlugin; -import org.apache.solr.security.AuthorizationResponse; -import org.apache.solr.security.ConfigEditablePlugin; -import org.apache.solr.util.CommandOperation; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import static java.util.Collections.singleton; -import static org.apache.solr.common.params.CommonParams.NAME; -import static org.apache.solr.common.util.Utils.getDeepCopy; -import static org.apache.solr.handler.admin.SecurityConfHandler.getListValue; -import static org.apache.solr.handler.admin.SecurityConfHandler.getMapValue; - -/** - * Modified copy of solr.RuleBasedAuthorizationPlugin to handle role - permission mappings with KereberosPlugin - * Added 2 new JSON map: (precedence: user-host-regex > user-host) - * 1. "user-host": user host mappings (array) for hostname validation - * 2. "user-host-regex": user host regex mapping (string) for hostname validation - */ -public class InfraRuleBasedAuthorizationPlugin implements AuthorizationPlugin, ConfigEditablePlugin { - - private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass()); - - private final Map<String, Set<String>> usersVsRoles = new HashMap<>(); - private final Map<String, WildCardSupportMap> mapping = new HashMap<>(); - private final List<Permission> permissions = new ArrayList<>(); - private final Map<String, Set<String>> userVsHosts = new HashMap<>(); - private final Map<String, String> userVsHostRegex = new HashMap<>(); - - private final InfraUserRolesLookupStrategy infraUserRolesLookupStrategy = new InfraUserRolesLookupStrategy(); - private final InfraKerberosHostValidator infraKerberosDomainValidator = new InfraKerberosHostValidator(); - - private static class WildCardSupportMap extends HashMap<String, List<Permission>> { - final Set<String> wildcardPrefixes = new HashSet<>(); - - @Override - public List<Permission> put(String key, List<Permission> value) { - if (key != null && key.endsWith("/*")) { - key = key.substring(0, key.length() - 2); - wildcardPrefixes.add(key); - } - return super.put(key, value); - } - - @Override - public List<Permission> get(Object key) { - List<Permission> result = super.get(key); - if (key == null || result != null) return result; - if (!wildcardPrefixes.isEmpty()) { - for (String s : wildcardPrefixes) { - if (key.toString().startsWith(s)) { - List<Permission> l = super.get(s); - if (l != null) { - result = result == null ? new ArrayList<Permission>() : new ArrayList<Permission>(result); - result.addAll(l); - } - } - } - } - return result; - } - } - - @Override - public AuthorizationResponse authorize(AuthorizationContext context) { - List<AuthorizationContext.CollectionRequest> collectionRequests = context.getCollectionRequests(); - if (context.getRequestType() == AuthorizationContext.RequestType.ADMIN) { - MatchStatus flag = checkCollPerm(mapping.get(null), context); - return flag.rsp; - } - - for (AuthorizationContext.CollectionRequest collreq : collectionRequests) { - //check permissions for each collection - MatchStatus flag = checkCollPerm(mapping.get(collreq.collectionName), context); - if (flag != MatchStatus.NO_PERMISSIONS_FOUND) return flag.rsp; - } - //check wildcard (all=*) permissions. - MatchStatus flag = checkCollPerm(mapping.get("*"), context); - return flag.rsp; - } - - private MatchStatus checkCollPerm(Map<String, List<Permission>> pathVsPerms, - AuthorizationContext context) { - if (pathVsPerms == null) return MatchStatus.NO_PERMISSIONS_FOUND; - - String path = context.getResource(); - MatchStatus flag = checkPathPerm(pathVsPerms.get(path), context); - if (flag != MatchStatus.NO_PERMISSIONS_FOUND) return flag; - return checkPathPerm(pathVsPerms.get(null), context); - } - - private MatchStatus checkPathPerm(List<Permission> permissions, AuthorizationContext context) { - if (permissions == null || permissions.isEmpty()) return MatchStatus.NO_PERMISSIONS_FOUND; - Principal principal = context.getUserPrincipal(); - loopPermissions: - for (int i = 0; i < permissions.size(); i++) { - Permission permission = permissions.get(i); - if (permission.method != null && !permission.method.contains(context.getHttpMethod())) { - //this permissions HTTP method does not match this rule. try other rules - continue; - } - if(permission.predicate != null){ - if(!permission.predicate.test(context)) continue ; - } - - if (permission.params != null) { - for (Map.Entry<String, Object> e : permission.params.entrySet()) { - String paramVal = context.getParams().get(e.getKey()); - Object val = e.getValue(); - if (val instanceof List) { - if (!((List) val).contains(paramVal)) continue loopPermissions; - } else if (!Objects.equals(val, paramVal)) continue loopPermissions; - } - } - - if (permission.role == null) { - //no role is assigned permission.That means everybody is allowed to access - return MatchStatus.PERMITTED; - } - if (principal == null) { - log.info("request has come without principal. failed permission {} ",permission); - //this resource needs a principal but the request has come without - //any credential. - return MatchStatus.USER_REQUIRED; - } else if (permission.role.contains("*")) { - return MatchStatus.PERMITTED; - } - - for (String role : permission.role) { - Set<String> userRoles = infraUserRolesLookupStrategy.getUserRolesFromPrincipal(usersVsRoles, principal); - boolean validHostname = infraKerberosDomainValidator.validate(principal, userVsHosts, userVsHostRegex); - if (!validHostname) { - log.warn("Hostname is not valid for principal {}", principal); - return MatchStatus.FORBIDDEN; - } - if (userRoles != null && userRoles.contains(role)) return MatchStatus.PERMITTED; - } - log.info("This resource is configured to have a permission {}, The principal {} does not have the right role ", permission, principal); - return MatchStatus.FORBIDDEN; - } - log.debug("No permissions configured for the resource {} . So allowed to access", context.getResource()); - return MatchStatus.NO_PERMISSIONS_FOUND; - } - - @Override - public void init(Map<String, Object> initInfo) { - mapping.put(null, new WildCardSupportMap()); - Map<String, Object> map = getMapValue(initInfo, "user-role"); - for (Object o : map.entrySet()) { - Map.Entry e = (Map.Entry) o; - String roleName = (String) e.getKey(); - usersVsRoles.put(roleName, readValueAsSet(map, roleName)); - } - List<Map> perms = getListValue(initInfo, "permissions"); - for (Map o : perms) { - Permission p; - try { - p = Permission.load(o); - } catch (Exception exp) { - log.error("Invalid permission ", exp); - continue; - } - permissions.add(p); - add2Mapping(p); - } - // adding user-host - Map<String, Object> userHostsMap = getMapValue(initInfo, "user-host"); - for (Object userHost : userHostsMap.entrySet()) { - Map.Entry e = (Map.Entry) userHost; - String roleName = (String) e.getKey(); - userVsHosts.put(roleName, readValueAsSet(userHostsMap, roleName)); - } - // adding user-host-regex - Map<String, Object> userHostRegexMap = getMapValue(initInfo, "user-host-regex"); - for (Map.Entry<String, Object> entry : userHostRegexMap.entrySet()) { - userVsHostRegex.put(entry.getKey(), entry.getValue().toString()); - } - - } - - //this is to do optimized lookup of permissions for a given collection/path - private void add2Mapping(Permission permission) { - for (String c : permission.collections) { - WildCardSupportMap m = mapping.get(c); - if (m == null) mapping.put(c, m = new WildCardSupportMap()); - for (String path : permission.path) { - List<Permission> perms = m.get(path); - if (perms == null) m.put(path, perms = new ArrayList<>()); - perms.add(permission); - } - } - } - - /** - * read a key value as a set. if the value is a single string , - * return a singleton set - * - * @param m the map from which to lookup - * @param key the key with which to do lookup - */ - static Set<String> readValueAsSet(Map m, String key) { - Set<String> result = new HashSet<>(); - Object val = m.get(key); - if (val == null) { - if("collection".equals(key)){ - //for collection collection: null means a core admin/ collection admin request - // otherwise it means a request where collection name is ignored - return m.containsKey(key) ? singleton((String) null) : singleton("*"); - } - return null; - } - if (val instanceof Collection) { - Collection list = (Collection) val; - for (Object o : list) result.add(String.valueOf(o)); - } else if (val instanceof String) { - result.add((String) val); - } else { - throw new RuntimeException("Bad value for : " + key); - } - return result.isEmpty() ? null : Collections.unmodifiableSet(result); - } - - @Override - public void close() throws IOException { } - - static class Permission { - String name; - Set<String> path, role, collections, method; - Map<String, Object> params; - Predicate<AuthorizationContext> predicate; - Map originalConfig; - - private Permission() { - } - - static Permission load(Map m) { - Permission p = new Permission(); - p.originalConfig = new LinkedHashMap<>(m); - String name = (String) m.get(NAME); - if (!m.containsKey("role")) throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, "role not specified"); - p.role = readValueAsSet(m, "role"); - if (well_known_permissions.containsKey(name)) { - HashSet<String> disAllowed = new HashSet<>(knownKeys); - disAllowed.remove("role");//these are the only - disAllowed.remove(NAME);//allowed keys for well-known permissions - for (String s : disAllowed) { - if (m.containsKey(s)) - throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, s + " is not a valid key for the permission : " + name); - } - p.predicate = (Predicate<AuthorizationContext>) ((Map) well_known_permissions.get(name)).get(Predicate.class.getName()); - m = well_known_permissions.get(name); - } - p.name = name; - p.path = readSetSmart(name, m, "path"); - p.collections = readSetSmart(name, m, "collection"); - p.method = readSetSmart(name, m, "method"); - p.params = (Map<String, Object>) m.get("params"); - return p; - } - - @Override - public String toString() { - return Utils.toJSONString(originalConfig); - } - - static final Set<String> knownKeys = ImmutableSet.of("collection", "role", "params", "path", "method", NAME); - } - - enum MatchStatus { - USER_REQUIRED(AuthorizationResponse.PROMPT), - NO_PERMISSIONS_FOUND(AuthorizationResponse.OK), - PERMITTED(AuthorizationResponse.OK), - FORBIDDEN(AuthorizationResponse.FORBIDDEN); - - final AuthorizationResponse rsp; - - MatchStatus(AuthorizationResponse rsp) { - this.rsp = rsp; - } - } - - /** - * This checks for the defaults available other rules for the keys - */ - private static Set<String> readSetSmart(String permissionName, Map m, String key) { - Set<String> set = readValueAsSet(m, key); - if (set == null && well_known_permissions.containsKey(permissionName)) { - set = readValueAsSet((Map) well_known_permissions.get(permissionName), key); - } - if ("method".equals(key)) { - if (set != null) { - for (String s : set) if (!HTTP_METHODS.contains(s)) return null; - } - return set; - } - return set == null ? singleton((String)null) : set; - } - - @Override - public Map<String, Object> edit(Map<String, Object> latestConf, List<CommandOperation> commands) { - for (CommandOperation op : commands) { - OPERATION operation = null; - for (OPERATION o : OPERATION.values()) { - if (o.name.equals(op.name)) { - operation = o; - break; - } - } - if (operation == null) { - op.unknownOperation(); - return null; - } - latestConf = operation.edit(latestConf, op); - if (latestConf == null) return null; - - } - return latestConf; - } - - enum OPERATION { - SET_USER_ROLE("set-user-role") { - @Override - public Map<String, Object> edit(Map<String, Object> latestConf, CommandOperation op) { - Map<String, Object> roleMap = getMapValue(latestConf, "user-role"); - Map<String, Object> map = op.getDataMap(); - if (op.hasError()) return null; - for (Map.Entry<String, Object> e : map.entrySet()) { - if (e.getValue() == null) { - roleMap.remove(e.getKey()); - continue; - } - if (e.getValue() instanceof String || e.getValue() instanceof List) { - roleMap.put(e.getKey(), e.getValue()); - } else { - op.addError("Unexpected value "); - return null; - } - } - return latestConf; - } - }, - SET_PERMISSION("set-permission") { - @Override - public Map<String, Object> edit(Map<String, Object> latestConf, CommandOperation op) { - String name = op.getStr(NAME); - Map<String, Object> dataMap = op.getDataMap(); - if (op.hasError()) return null; - dataMap = getDeepCopy(dataMap, 3); - String before = (String) dataMap.remove("before"); - for (String key : dataMap.keySet()) { - if (!Permission.knownKeys.contains(key)) op.addError("Unknown key, " + key); - } - try { - Permission.load(dataMap); - } catch (Exception e) { - op.addError(e.getMessage()); - return null; - } - List<Map> permissions = getListValue(latestConf, "permissions"); - List<Map> permissionsCopy = new ArrayList<>(); - boolean added = false; - for (Map e : permissions) { - Object n = e.get(NAME); - if (n.equals(before) || n.equals(name)) { - added = true; - permissionsCopy.add(dataMap); - } - if (!n.equals(name)) permissionsCopy.add(e); - } - if (!added && before != null) { - op.addError("Invalid 'before' :" + before); - return null; - } - if (!added) permissionsCopy.add(dataMap); - latestConf.put("permissions", permissionsCopy); - return latestConf; - } - }, - UPDATE_PERMISSION("update-permission") { - @Override - public Map<String, Object> edit(Map<String, Object> latestConf, CommandOperation op) { - String name = op.getStr(NAME); - if (op.hasError()) return null; - for (Map permission : (List<Map>) getListValue(latestConf, "permissions")) { - if (name.equals(permission.get(NAME))) { - LinkedHashMap copy = new LinkedHashMap<>(permission); - copy.putAll(op.getDataMap()); - op.setCommandData(copy); - return SET_PERMISSION.edit(latestConf, op); - } - } - op.addError("No such permission " + name); - return null; - } - }, - DELETE_PERMISSION("delete-permission") { - @Override - public Map<String, Object> edit(Map<String, Object> latestConf, CommandOperation op) { - List<String> names = op.getStrs(""); - if (names == null || names.isEmpty()) { - op.addError("Invalid command"); - return null; - } - names = new ArrayList<>(names); - List<Map> copy = new ArrayList<>(); - List<Map> p = getListValue(latestConf, "permissions"); - for (Map map : p) { - Object n = map.get(NAME); - if (names.contains(n)) { - names.remove(n); - continue; - } else { - copy.add(map); - } - } - if (!names.isEmpty()) { - op.addError("Unknown permission name(s) " + names); - return null; - } - latestConf.put("permissions", copy); - return latestConf; - } - }; - - public abstract Map<String, Object> edit(Map<String, Object> latestConf, CommandOperation op); - - public final String name; - - OPERATION(String s) { - this.name = s; - } - - public static OPERATION get(String name) { - for (OPERATION o : values()) if (o.name.equals(name)) return o; - return null; - } - } - - public static final Set<String> HTTP_METHODS = ImmutableSet.of("GET", "POST", "DELETE", "PUT", "HEAD"); - - private static final Map<String, Map<String,Object>> well_known_permissions = (Map) Utils.fromJSONString( - " { " + - " security-edit :{" + - " path:['/admin/authentication','/admin/authorization']," + - " collection:null," + - " method:POST }," + - " security-read :{" + - " path:['/admin/authentication','/admin/authorization']," + - " collection:null," + - " method:GET}," + - " schema-edit :{" + - " method:POST," + - " path:'/schema/*'}," + - " collection-admin-edit :{" + - " collection:null," + - " path:'/admin/collections'}," + - " collection-admin-read :{" + - " collection:null," + - " path:'/admin/collections'}," + - " schema-read :{" + - " method:GET," + - " path:'/schema/*'}," + - " config-read :{" + - " method:GET," + - " path:'/config/*'}," + - " update :{" + - " path:'/update/*'}," + - " read :{" + - " path:['/select', '/get','/browse','/tvrh','/terms','/clustering','/elevate', '/export','/spell','/clustering']}," + - " config-edit:{" + - " method:POST," + - " path:'/config/*'}," + - " all:{collection:['*', null]}" + - "}"); - - static { - ((Map) well_known_permissions.get("collection-admin-edit")).put(Predicate.class.getName(), getCollectionActionPredicate(true)); - ((Map) well_known_permissions.get("collection-admin-read")).put(Predicate.class.getName(), getCollectionActionPredicate(false)); - } - - private static Predicate<AuthorizationContext> getCollectionActionPredicate(final boolean isEdit) { - return new Predicate<AuthorizationContext>() { - @Override - public boolean test(AuthorizationContext context) { - String action = context.getParams().get("action"); - if (action == null) return false; - CollectionParams.CollectionAction collectionAction = CollectionParams.CollectionAction.get(action); - if (collectionAction == null) return false; - return isEdit ? collectionAction.isWrite : !collectionAction.isWrite; - } - }; - } - - - public static void main(String[] args) { - System.out.println(Utils.toJSONString(well_known_permissions)); - - } - - public interface Predicate<T> { - - boolean test(T t); - } -} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/ambari/blob/8842be0c/ambari-logsearch/ambari-infra-solr-plugin/src/main/java/org.apache.ambari.infra.security/InfraUserRolesLookupStrategy.java ---------------------------------------------------------------------- diff --git a/ambari-logsearch/ambari-infra-solr-plugin/src/main/java/org.apache.ambari.infra.security/InfraUserRolesLookupStrategy.java b/ambari-logsearch/ambari-infra-solr-plugin/src/main/java/org.apache.ambari.infra.security/InfraUserRolesLookupStrategy.java deleted file mode 100644 index a54e4ad..0000000 --- a/ambari-logsearch/ambari-infra-solr-plugin/src/main/java/org.apache.ambari.infra.security/InfraUserRolesLookupStrategy.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * 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.infra.security; - -import org.apache.commons.collections.CollectionUtils; -import org.apache.hadoop.security.authentication.server.AuthenticationToken; -import org.apache.hadoop.security.authentication.util.KerberosName; - -import java.security.Principal; -import java.util.Map; -import java.util.Set; - - -/** - * Strategy class to get roles with the principal name (in a specific format e.g.: 'name@DOMAIN') - * in case of KerberosPlugin is used for authentication - */ -public class InfraUserRolesLookupStrategy { - - public Set<String> getUserRolesFromPrincipal(Map<String, Set<String>> usersVsRoles, Principal principal) { - if (principal instanceof AuthenticationToken) { - AuthenticationToken authenticationToken = (AuthenticationToken) principal; - KerberosName kerberosName = new KerberosName(authenticationToken.getName()); - Set<String> rolesResult = usersVsRoles.get(String.format("%s@%s", kerberosName.getServiceName(), kerberosName.getRealm())); - if (CollectionUtils.isEmpty(rolesResult)) { - rolesResult = usersVsRoles.get(principal.getName()); - } - return rolesResult; - } else { - return usersVsRoles.get(principal.getName()); - } - } -} http://git-wip-us.apache.org/repos/asf/ambari/blob/8842be0c/ambari-logsearch/ambari-infra-solr-plugin/src/test/java/org/apache/ambari/infra/security/InfraKerberosHostValidatorTest.java ---------------------------------------------------------------------- diff --git a/ambari-logsearch/ambari-infra-solr-plugin/src/test/java/org/apache/ambari/infra/security/InfraKerberosHostValidatorTest.java b/ambari-logsearch/ambari-infra-solr-plugin/src/test/java/org/apache/ambari/infra/security/InfraKerberosHostValidatorTest.java deleted file mode 100644 index 828f09a..0000000 --- a/ambari-logsearch/ambari-infra-solr-plugin/src/test/java/org/apache/ambari/infra/security/InfraKerberosHostValidatorTest.java +++ /dev/null @@ -1,114 +0,0 @@ -/* - * 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.infra.security; - -import org.apache.hadoop.security.authentication.server.AuthenticationToken; -import org.junit.Before; -import org.junit.Test; - -import java.util.HashMap; -import java.util.HashSet; -import java.util.Map; -import java.util.Set; - -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; - -public class InfraKerberosHostValidatorTest { - - private static final String DEFAULT_SERVICE_USER = "logsearch"; - - private InfraKerberosHostValidator underTest = new InfraKerberosHostValidator(); - private AuthenticationToken principal; - - - @Before - public void setUp() { - principal = new AuthenticationToken(DEFAULT_SERVICE_USER, DEFAULT_SERVICE_USER + "/c6401.ambari.apache....@example.com", "kerberos"); - } - - @Test - public void testValidateHosts() { - // GIVEN - Map<String, Set<String>> userHostsMap = generateUserHostMap("c6401.ambari.apache.org"); - // WHEN - boolean result = underTest.validate(principal, userHostsMap, new HashMap<String, String>()); - // THEN - assertTrue(result); - } - - @Test - public void testValidateHostsValid() { - // GIVEN - Map<String, Set<String>> userHostsMap = generateUserHostMap("c6402.ambari.apache.org"); - // WHEN - boolean result = underTest.validate(principal, userHostsMap, new HashMap<String, String>()); - // THEN - assertFalse(result); - - } - - @Test - public void testValidateHostRegex() { - // GIVEN - Map<String, String> userHostRegex = generateRegexMap("c\\d+.*.apache.org"); - // WHEN - boolean result = underTest.validate(principal, new HashMap<String, Set<String>>(), userHostRegex); - // THEN - assertTrue(result); - - } - - @Test - public void testValidateHostRegexInvalid() { - // GIVEN - Map<String, String> userHostRegex = generateRegexMap("c\\d+.*.org.apache"); - // WHEN - boolean result = underTest.validate(principal, new HashMap<String, Set<String>>(), userHostRegex); - // THEN - assertFalse(result); - } - - @Test - public void testPrecedence() { - // GIVEN - Map<String, Set<String>> userHostsMap = generateUserHostMap("c6402.ambari.apache.org"); - Map<String, String> userHostRegex = generateRegexMap("c\\d+.*.apache.org"); - // WHEN - boolean result = underTest.validate(principal, userHostsMap, userHostRegex); - // THEN - assertTrue(result); - } - - private Map<String, Set<String>> generateUserHostMap(String... hosts) { - Map<String, Set<String>> map = new HashMap<>(); - Set<String> hostSet = new HashSet<>(); - for (String host : hosts) { - hostSet.add(host); - } - map.put(DEFAULT_SERVICE_USER, hostSet); - return map; - } - - private Map<String, String> generateRegexMap(String regex) { - Map<String, String> map = new HashMap<>(); - map.put(DEFAULT_SERVICE_USER, regex); - return map; - } -}