Search in sources :

Example 11 with ZkConfigManager

use of org.apache.solr.common.cloud.ZkConfigManager in project lucene-solr by apache.

the class TestConfigSetsAPI method testDelete.

@Test
public void testDelete() throws Exception {
    final String baseUrl = solrCluster.getJettySolrRunners().get(0).getBaseUrl().toString();
    final SolrClient solrClient = getHttpSolrClient(baseUrl);
    final String configSet = "configSet";
    solrCluster.uploadConfigSet(configset("configset-2"), configSet);
    SolrZkClient zkClient = new SolrZkClient(solrCluster.getZkServer().getZkAddress(), AbstractZkTestCase.TIMEOUT, AbstractZkTestCase.TIMEOUT, null);
    try {
        ZkConfigManager configManager = new ZkConfigManager(zkClient);
        assertTrue(configManager.configExists(configSet));
        Delete delete = new Delete();
        delete.setConfigSetName(configSet);
        ConfigSetAdminResponse response = delete.process(solrClient);
        assertNotNull(response.getResponse());
        assertFalse(configManager.configExists(configSet));
    } finally {
        zkClient.close();
    }
    solrClient.close();
}
Also used : Delete(org.apache.solr.client.solrj.request.ConfigSetAdminRequest.Delete) HttpSolrClient(org.apache.solr.client.solrj.impl.HttpSolrClient) CloudSolrClient(org.apache.solr.client.solrj.impl.CloudSolrClient) SolrClient(org.apache.solr.client.solrj.SolrClient) ZkConfigManager(org.apache.solr.common.cloud.ZkConfigManager) ConfigSetAdminResponse(org.apache.solr.client.solrj.response.ConfigSetAdminResponse) SolrZkClient(org.apache.solr.common.cloud.SolrZkClient) BasicAuthIntegrationTest(org.apache.solr.security.BasicAuthIntegrationTest) Test(org.junit.Test)

Example 12 with ZkConfigManager

use of org.apache.solr.common.cloud.ZkConfigManager in project lucene-solr by apache.

the class OverseerConfigSetMessageHandler method createConfigSet.

private void createConfigSet(ZkNodeProps message) throws IOException {
    String configSetName = getTaskKey(message);
    if (configSetName == null || configSetName.length() == 0) {
        throw new SolrException(ErrorCode.BAD_REQUEST, "ConfigSet name not specified");
    }
    String baseConfigSetName = message.getStr(BASE_CONFIGSET);
    if (baseConfigSetName == null || baseConfigSetName.length() == 0) {
        throw new SolrException(ErrorCode.BAD_REQUEST, "Base ConfigSet name not specified");
    }
    ZkConfigManager configManager = new ZkConfigManager(zkStateReader.getZkClient());
    if (configManager.configExists(configSetName)) {
        throw new SolrException(ErrorCode.BAD_REQUEST, "ConfigSet already exists: " + configSetName);
    }
    // is there a base config that already exists
    if (!configManager.configExists(baseConfigSetName)) {
        throw new SolrException(ErrorCode.BAD_REQUEST, "Base ConfigSet does not exist: " + baseConfigSetName);
    }
    String propertyPath = ConfigSetProperties.DEFAULT_FILENAME;
    Map<String, Object> props = getNewProperties(message);
    if (props != null) {
        // read the old config properties and do a merge, if necessary
        NamedList oldProps = getConfigSetProperties(getPropertyPath(baseConfigSetName, propertyPath));
        if (oldProps != null) {
            mergeOldProperties(props, oldProps);
        }
    }
    byte[] propertyData = getPropertyData(props);
    Set<String> copiedToZkPaths = new HashSet<String>();
    try {
        configManager.copyConfigDir(baseConfigSetName, configSetName, copiedToZkPaths);
        if (propertyData != null) {
            try {
                zkStateReader.getZkClient().makePath(getPropertyPath(configSetName, propertyPath), propertyData, CreateMode.PERSISTENT, null, false, true);
            } catch (KeeperException | InterruptedException e) {
                throw new IOException("Error writing new properties", SolrZkClient.checkInterrupted(e));
            }
        }
    } catch (Exception e) {
        // that would make it impossible for the user to delete.
        try {
            if (configManager.configExists(configSetName) && copiedToZkPaths.size() > 0) {
                deleteConfigSet(configSetName, true);
            }
        } catch (IOException ioe) {
            log.error("Error while trying to delete partially created ConfigSet", ioe);
        }
        throw e;
    }
}
Also used : ZkConfigManager(org.apache.solr.common.cloud.ZkConfigManager) NamedList(org.apache.solr.common.util.NamedList) IOException(java.io.IOException) SolrException(org.apache.solr.common.SolrException) KeeperException(org.apache.zookeeper.KeeperException) IOException(java.io.IOException) SolrException(org.apache.solr.common.SolrException) KeeperException(org.apache.zookeeper.KeeperException) HashSet(java.util.HashSet)

Example 13 with ZkConfigManager

use of org.apache.solr.common.cloud.ZkConfigManager in project lucene-solr by apache.

the class ZkCLI method main.

/**
   * Allows you to perform a variety of zookeeper related tasks, such as:
   * 
   * Bootstrap the current configs for all collections in solr.xml.
   * 
   * Upload a named config set from a given directory.
   * 
   * Link a named config set explicity to a collection.
   * 
   * Clear ZooKeeper info.
   * 
   * If you also pass a solrPort, it will be used to start an embedded zk useful
   * for single machine, multi node tests.
   */
public static void main(String[] args) throws InterruptedException, TimeoutException, IOException, ParserConfigurationException, SAXException, KeeperException {
    CommandLineParser parser = new PosixParser();
    Options options = new Options();
    options.addOption(OptionBuilder.hasArg(true).withDescription("cmd to run: " + BOOTSTRAP + ", " + UPCONFIG + ", " + DOWNCONFIG + ", " + LINKCONFIG + ", " + MAKEPATH + ", " + PUT + ", " + PUT_FILE + "," + GET + "," + GET_FILE + ", " + LIST + ", " + CLEAR + ", " + UPDATEACLS + ", " + LS).create(CMD));
    Option zkHostOption = new Option("z", ZKHOST, true, "ZooKeeper host address");
    options.addOption(zkHostOption);
    Option solrHomeOption = new Option("s", SOLRHOME, true, "for " + BOOTSTRAP + ", " + RUNZK + ": solrhome location");
    options.addOption(solrHomeOption);
    options.addOption("d", CONFDIR, true, "for " + UPCONFIG + ": a directory of configuration files");
    options.addOption("n", CONFNAME, true, "for " + UPCONFIG + ", " + LINKCONFIG + ": name of the config set");
    options.addOption("c", COLLECTION, true, "for " + LINKCONFIG + ": name of the collection");
    options.addOption(EXCLUDE_REGEX_SHORT, EXCLUDE_REGEX, true, "for " + UPCONFIG + ": files matching this regular expression won't be uploaded");
    options.addOption("r", RUNZK, true, "run zk internally by passing the solr run port - only for clusters on one machine (tests, dev)");
    options.addOption("h", HELP, false, "bring up this help page");
    options.addOption(NAME, true, "name of the cluster property to set");
    options.addOption(VALUE_LONG, true, "value of the cluster to set");
    try {
        // parse the command line arguments
        CommandLine line = parser.parse(options, args);
        if (line.hasOption(HELP) || !line.hasOption(ZKHOST) || !line.hasOption(CMD)) {
            // automatically generate the help statement
            HelpFormatter formatter = new HelpFormatter();
            formatter.printHelp(ZK_CLI_NAME, options);
            stdout.println("Examples:");
            stdout.println("zkcli.sh -zkhost localhost:9983 -cmd " + BOOTSTRAP + " -" + SOLRHOME + " /opt/solr");
            stdout.println("zkcli.sh -zkhost localhost:9983 -cmd " + UPCONFIG + " -" + CONFDIR + " /opt/solr/collection1/conf" + " -" + CONFNAME + " myconf");
            stdout.println("zkcli.sh -zkhost localhost:9983 -cmd " + DOWNCONFIG + " -" + CONFDIR + " /opt/solr/collection1/conf" + " -" + CONFNAME + " myconf");
            stdout.println("zkcli.sh -zkhost localhost:9983 -cmd " + LINKCONFIG + " -" + COLLECTION + " collection1" + " -" + CONFNAME + " myconf");
            stdout.println("zkcli.sh -zkhost localhost:9983 -cmd " + MAKEPATH + " /apache/solr");
            stdout.println("zkcli.sh -zkhost localhost:9983 -cmd " + PUT + " /solr.conf 'conf data'");
            stdout.println("zkcli.sh -zkhost localhost:9983 -cmd " + PUT_FILE + " /solr.xml /User/myuser/solr/solr.xml");
            stdout.println("zkcli.sh -zkhost localhost:9983 -cmd " + GET + " /solr.xml");
            stdout.println("zkcli.sh -zkhost localhost:9983 -cmd " + GET_FILE + " /solr.xml solr.xml.file");
            stdout.println("zkcli.sh -zkhost localhost:9983 -cmd " + CLEAR + " /solr");
            stdout.println("zkcli.sh -zkhost localhost:9983 -cmd " + LIST);
            stdout.println("zkcli.sh -zkhost localhost:9983 -cmd " + LS + " /solr/live_nodes");
            stdout.println("zkcli.sh -zkhost localhost:9983 -cmd " + CLUSTERPROP + " -" + NAME + " urlScheme -" + VALUE_LONG + " https");
            stdout.println("zkcli.sh -zkhost localhost:9983 -cmd " + UPDATEACLS + " /solr");
            return;
        }
        // start up a tmp zk server first
        String zkServerAddress = line.getOptionValue(ZKHOST);
        String solrHome = line.getOptionValue(SOLRHOME);
        String solrPort = null;
        if (line.hasOption(RUNZK)) {
            if (!line.hasOption(SOLRHOME)) {
                stdout.println("-" + SOLRHOME + " is required for " + RUNZK);
                System.exit(1);
            }
            solrPort = line.getOptionValue(RUNZK);
        }
        SolrZkServer zkServer = null;
        if (solrPort != null) {
            zkServer = new SolrZkServer("true", null, solrHome + "/zoo_data", solrHome, Integer.parseInt(solrPort));
            zkServer.parseConfig();
            zkServer.start();
        }
        SolrZkClient zkClient = null;
        try {
            zkClient = new SolrZkClient(zkServerAddress, 30000, 30000, () -> {
            });
            if (line.getOptionValue(CMD).equalsIgnoreCase(BOOTSTRAP)) {
                if (!line.hasOption(SOLRHOME)) {
                    stdout.println("-" + SOLRHOME + " is required for " + BOOTSTRAP);
                    System.exit(1);
                }
                CoreContainer cc = new CoreContainer(solrHome);
                if (!ZkController.checkChrootPath(zkServerAddress, true)) {
                    stdout.println("A chroot was specified in zkHost but the znode doesn't exist. ");
                    System.exit(1);
                }
                ZkController.bootstrapConf(zkClient, cc, solrHome);
            // No need to close the CoreContainer, as it wasn't started
            // up in the first place...
            } else if (line.getOptionValue(CMD).equalsIgnoreCase(UPCONFIG)) {
                if (!line.hasOption(CONFDIR) || !line.hasOption(CONFNAME)) {
                    stdout.println("-" + CONFDIR + " and -" + CONFNAME + " are required for " + UPCONFIG);
                    System.exit(1);
                }
                String confDir = line.getOptionValue(CONFDIR);
                String confName = line.getOptionValue(CONFNAME);
                final String excludeExpr = line.getOptionValue(EXCLUDE_REGEX, EXCLUDE_REGEX_DEFAULT);
                if (!ZkController.checkChrootPath(zkServerAddress, true)) {
                    stdout.println("A chroot was specified in zkHost but the znode doesn't exist. ");
                    System.exit(1);
                }
                ZkConfigManager configManager = new ZkConfigManager(zkClient);
                final Pattern excludePattern = Pattern.compile(excludeExpr);
                configManager.uploadConfigDir(Paths.get(confDir), confName, excludePattern);
            } else if (line.getOptionValue(CMD).equalsIgnoreCase(DOWNCONFIG)) {
                if (!line.hasOption(CONFDIR) || !line.hasOption(CONFNAME)) {
                    stdout.println("-" + CONFDIR + " and -" + CONFNAME + " are required for " + DOWNCONFIG);
                    System.exit(1);
                }
                String confDir = line.getOptionValue(CONFDIR);
                String confName = line.getOptionValue(CONFNAME);
                ZkConfigManager configManager = new ZkConfigManager(zkClient);
                configManager.downloadConfigDir(confName, Paths.get(confDir));
            } else if (line.getOptionValue(CMD).equalsIgnoreCase(LINKCONFIG)) {
                if (!line.hasOption(COLLECTION) || !line.hasOption(CONFNAME)) {
                    stdout.println("-" + COLLECTION + " and -" + CONFNAME + " are required for " + LINKCONFIG);
                    System.exit(1);
                }
                String collection = line.getOptionValue(COLLECTION);
                String confName = line.getOptionValue(CONFNAME);
                ZkController.linkConfSet(zkClient, collection, confName);
            } else if (line.getOptionValue(CMD).equalsIgnoreCase(LIST)) {
                zkClient.printLayoutToStream(stdout);
            } else if (line.getOptionValue(CMD).equals(LS)) {
                List argList = line.getArgList();
                if (argList.size() != 1) {
                    stdout.println("-" + LS + " requires one arg - the path to list");
                    System.exit(1);
                }
                StringBuilder sb = new StringBuilder();
                String path = argList.get(0).toString();
                zkClient.printLayout(path == null ? "/" : path, 0, sb);
                stdout.println(sb.toString());
            } else if (line.getOptionValue(CMD).equalsIgnoreCase(CLEAR)) {
                List arglist = line.getArgList();
                if (arglist.size() != 1) {
                    stdout.println("-" + CLEAR + " requires one arg - the path to clear");
                    System.exit(1);
                }
                zkClient.clean(arglist.get(0).toString());
            } else if (line.getOptionValue(CMD).equalsIgnoreCase(MAKEPATH)) {
                List arglist = line.getArgList();
                if (arglist.size() != 1) {
                    stdout.println("-" + MAKEPATH + " requires one arg - the path to make");
                    System.exit(1);
                }
                zkClient.makePath(arglist.get(0).toString(), true);
            } else if (line.getOptionValue(CMD).equalsIgnoreCase(PUT)) {
                List arglist = line.getArgList();
                if (arglist.size() != 2) {
                    stdout.println("-" + PUT + " requires two args - the path to create and the data string");
                    System.exit(1);
                }
                String path = arglist.get(0).toString();
                if (zkClient.exists(path, true)) {
                    zkClient.setData(path, arglist.get(1).toString().getBytes(StandardCharsets.UTF_8), true);
                } else {
                    zkClient.create(path, arglist.get(1).toString().getBytes(StandardCharsets.UTF_8), CreateMode.PERSISTENT, true);
                }
            } else if (line.getOptionValue(CMD).equalsIgnoreCase(PUT_FILE)) {
                List arglist = line.getArgList();
                if (arglist.size() != 2) {
                    stdout.println("-" + PUT_FILE + " requires two args - the path to create in ZK and the path to the local file");
                    System.exit(1);
                }
                String path = arglist.get(0).toString();
                InputStream is = new FileInputStream(arglist.get(1).toString());
                try {
                    if (zkClient.exists(path, true)) {
                        zkClient.setData(path, IOUtils.toByteArray(is), true);
                    } else {
                        zkClient.create(path, IOUtils.toByteArray(is), CreateMode.PERSISTENT, true);
                    }
                } finally {
                    IOUtils.closeQuietly(is);
                }
            } else if (line.getOptionValue(CMD).equalsIgnoreCase(GET)) {
                List arglist = line.getArgList();
                if (arglist.size() != 1) {
                    stdout.println("-" + GET + " requires one arg - the path to get");
                    System.exit(1);
                }
                byte[] data = zkClient.getData(arglist.get(0).toString(), null, null, true);
                stdout.println(new String(data, StandardCharsets.UTF_8));
            } else if (line.getOptionValue(CMD).equalsIgnoreCase(GET_FILE)) {
                List arglist = line.getArgList();
                if (arglist.size() != 2) {
                    stdout.println("-" + GET_FILE + "requires two args - the path to get and the file to save it to");
                    System.exit(1);
                }
                byte[] data = zkClient.getData(arglist.get(0).toString(), null, null, true);
                FileUtils.writeByteArrayToFile(new File(arglist.get(1).toString()), data);
            } else if (line.getOptionValue(CMD).equals(UPDATEACLS)) {
                List arglist = line.getArgList();
                if (arglist.size() != 1) {
                    stdout.println("-" + UPDATEACLS + " requires one arg - the path to update");
                    System.exit(1);
                }
                zkClient.updateACLs(arglist.get(0).toString());
            } else if (line.getOptionValue(CMD).equalsIgnoreCase(CLUSTERPROP)) {
                if (!line.hasOption(NAME)) {
                    stdout.println("-" + NAME + " is required for " + CLUSTERPROP);
                }
                String propertyName = line.getOptionValue(NAME);
                //If -val option is missing, we will use the null value. This is required to maintain
                //compatibility with Collections API.
                String propertyValue = line.getOptionValue(VALUE_LONG);
                ClusterProperties props = new ClusterProperties(zkClient);
                try {
                    props.setClusterProperty(propertyName, propertyValue);
                } catch (IOException ex) {
                    stdout.println("Unable to set the cluster property due to following error : " + ex.getLocalizedMessage());
                    System.exit(1);
                }
            } else {
                // If not cmd matches
                stdout.println("Unknown command " + line.getOptionValue(CMD) + ". Use -h to get help.");
                System.exit(1);
            }
        } finally {
            if (solrPort != null) {
                zkServer.stop();
            }
            if (zkClient != null) {
                zkClient.close();
            }
        }
    } catch (ParseException exp) {
        stdout.println("Unexpected exception:" + exp.getMessage());
    }
}
Also used : Options(org.apache.commons.cli.Options) Pattern(java.util.regex.Pattern) ZkConfigManager(org.apache.solr.common.cloud.ZkConfigManager) FileInputStream(java.io.FileInputStream) InputStream(java.io.InputStream) PosixParser(org.apache.commons.cli.PosixParser) IOException(java.io.IOException) SolrZkClient(org.apache.solr.common.cloud.SolrZkClient) FileInputStream(java.io.FileInputStream) HelpFormatter(org.apache.commons.cli.HelpFormatter) CommandLine(org.apache.commons.cli.CommandLine) CoreContainer(org.apache.solr.core.CoreContainer) ClusterProperties(org.apache.solr.common.cloud.ClusterProperties) Option(org.apache.commons.cli.Option) List(java.util.List) CommandLineParser(org.apache.commons.cli.CommandLineParser) ParseException(org.apache.commons.cli.ParseException) File(java.io.File)

Aggregations

ZkConfigManager (org.apache.solr.common.cloud.ZkConfigManager)13 SolrZkClient (org.apache.solr.common.cloud.SolrZkClient)6 SolrException (org.apache.solr.common.SolrException)4 IOException (java.io.IOException)3 Path (java.nio.file.Path)3 SolrClient (org.apache.solr.client.solrj.SolrClient)3 ConfigSetAdminResponse (org.apache.solr.client.solrj.response.ConfigSetAdminResponse)3 Test (org.junit.Test)3 Map (java.util.Map)2 CloudSolrClient (org.apache.solr.client.solrj.impl.CloudSolrClient)2 HttpSolrClient (org.apache.solr.client.solrj.impl.HttpSolrClient)2 Create (org.apache.solr.client.solrj.request.ConfigSetAdminRequest.Create)2 NamedList (org.apache.solr.common.util.NamedList)2 KeeperException (org.apache.zookeeper.KeeperException)2 BeforeClass (org.junit.BeforeClass)2 ImmutableMap (com.google.common.collect.ImmutableMap)1 File (java.io.File)1 FileInputStream (java.io.FileInputStream)1 InputStream (java.io.InputStream)1 ByteBuffer (java.nio.ByteBuffer)1