apiVersion: v1
kind: ConfigMap
metadata:
  annotations:
    description: |-
      Holds configuration and initialization files used to deploy Solr.

      ckan-solr-init.sh
      =================
      Should be mounted under /docker-entrypoint-initdb.d as executable
      so that the initialization mechanism of the solr container will execute it prior to
      starting the main process.
      As documented here: https://github.com/docker-solr/docker-solr#extending-the-image
      The script has the following functions:
      - finds and uses/replaces the solr.in.sh startup configuration file, if supplied
      - solves the Java heap memory problem for versions prior to Java 9 by using the container's defined RAM
      limit as a java runtime argument
      More info: https://docs.okd.io/latest/dev_guide/application_memory_sizing.html#sizing-openjdk

      solr.in.sh
      ==========
      Mounted under /opt/config
      If found by the ckan-solr-init.sh script is copied and used at startup

      Note: This separate config file is similar in structure to the one inside the template.
      It is provided as a convenient way to edit and load the configuration settings herein.
  labels:
    ckan.component: solr
  name: solr-conf
data:
  ckan-solr-init.sh: |-
    #!/bin/bash

    # if there is a solr.in.sh file mounted in the /opt/config directory use this for starting Solr
    if [ -s "/opt/config/solr.in.sh" ]; then
      echo "---> Found user supplied solr.in.sh; Using it to start Solr"
      rm -f /opt/solr/bin/solr.in.sh
      cp /opt/config/solr.in.sh /opt/solr/bin/solr.in.sh
    fi


    #need to specify additional JAVA_OPTS to make Java respect container limits
    #https://docs.okd.io/3.10/dev_guide/application_memory_sizing.html#sizing-openjdk
    #if java major version is lower than 10, should add the -XX:MaxRAM option
    java -version > /tmp/jvers 2>&1
    jvers=$(cat /tmp/jvers | head -1 | cut -d ' ' -f3 | sed 's/\"\([0-9]*\).*/\1/')
    rm -f /tmp/jvers

    if [ 10 -gt $jvers ]; then
        if [ -z "$SOLR_RAM_LIMIT" ]; then
          SOLR_RAM_LIMIT="512Mi"
          echo "---> using default SOLR_RAM_LIMIT as: $SOLR_RAM_LIMIT"
        fi
        #when env variable comes linked to OKD mem limit notation,eg 512M or 512 Mi,
        #should change it to java size equivalent notation
        value=$(echo "$SOLR_RAM_LIMIT" | sed 's/\([0-9]*\)[a-zA-Z]*/\1/')
        suffix=$(echo "$SOLR_RAM_LIMIT" | sed 's/\([0-9]*\)\([a-zA-Z]*\)/\2/')

        #the case where there's no scale (Mi, GI, etc) then the value is in bytes
        if [ "x"$suffix = "x" ]; then
            SOLR_RAM_LIMIT=$(awk "BEGIN {print $value/1024/1024}")"m"
        # if suffix has len=1 => OKD decimal scale; approximate only the top factor
        elif [ ${#suffix} -eq 1 ]; then
            SOLR_RAM_LIMIT=$(awk "BEGIN {print $value/1024*1000}")"${suffix:0:1}"
        # if suffix has len>1 => OKD binary scale
        else
            SOLR_RAM_LIMIT=$value"${suffix:0:1}"
        fi

        echo "---> adding -XX:MaxRAM=$SOLR_RAM_LIMIT option for java version < 10"
        # if there is an active SOLR_OPTS variable, just append the MaxRam arg
        # otherwise(default) also add tuning for JVM memory release
        active_opts=$(sed -n "s/^SOLR_OPTS=\(.*\)\"/\1/p" /opt/solr/bin/solr.in.sh)
        if [ ${#active_opts} -eq 0 ]; then
            echo >> /opt/solr/bin/solr.in.sh
            echo "SOLR_OPTS=\"$SOLR_OPTS -XX:MaxRAM=$SOLR_RAM_LIMIT -XX:MinHeapFreeRatio=5 -XX:MaxHeapFreeRatio=10 -XX:GCTimeRatio=4 -XX:AdaptiveSizePolicyWeight=90\"" \
            >> /opt/solr/bin/solr.in.sh
        else
            # for convenience modifies all the occurences
            sed -i "s/^\(#*\)\(SOLR_OPTS=\)\(.*\)\"/\1\2\3 -XX:MaxRAM=$SOLR_RAM_LIMIT\"/" /opt/solr/bin/solr.in.sh
        fi
        active_opts=$(sed -n "s/^SOLR_OPTS=\(.*\)\"/\1/p" /opt/solr/bin/solr.in.sh)
      echo "---> active SOLR_OPTS: $active_opts"
    fi
  solr.in.sh: |-
    # 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.

    # Settings here will override settings in existing env vars or in bin/solr.  The default shipped state
    # of this file is completely commented.

    # By default the script will use JAVA_HOME to determine which java
    # to use, but you can set a specific path for Solr to use without
    # affecting other Java applications on your server/workstation.
    #SOLR_JAVA_HOME=""

    # This controls the number of seconds that the solr script will wait for
    # Solr to stop gracefully or Solr to start.  If the graceful stop fails,
    # the script will forcibly stop Solr.  If the start fails, the script will
    # give up waiting and display the last few lines of the logfile.
    #SOLR_STOP_WAIT="180"

    # Increase Java Heap as needed to support your indexing / query needs
    #SOLR_HEAP="512m"

    # Expert: If you want finer control over memory options, specify them directly
    # Comment out SOLR_HEAP if you are using this though, that takes precedence
    SOLR_JAVA_MEM="-Xms64m"

    # Enable verbose GC logging...
    #  * If this is unset, various default options will be selected depending on which JVM version is in use
    #  * For Java 8: if this is set, additional params will be added to specify the log file & rotation
    #  * For Java 9 or higher: each included opt param that starts with '-Xlog:gc', but does not include an
    #    output specifier, will have a 'file' output specifier (as well as formatting & rollover options)
    #    appended, using the effective value of the SOLR_LOGS_DIR.
    #
    #GC_LOG_OPTS='-Xlog:gc*'  # (Java 9+)
    #GC_LOG_OPTS="-verbose:gc -XX:+PrintHeapAtGC -XX:+PrintGCDetails \
    #  -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps -XX:+PrintTenuringDistribution -XX:+PrintGCApplicationStoppedTime"

    # These GC settings have shown to work well for a number of common Solr workloads
    #GC_TUNE="-XX:NewRatio=3 -XX:SurvivorRatio=4    etc.

    # Set the ZooKeeper connection string if using an external ZooKeeper ensemble
    # e.g. host1:2181,host2:2181/chroot
    # Leave empty if not using SolrCloud
    #ZK_HOST=""

    # Set the ZooKeeper client timeout (for SolrCloud mode)
    #ZK_CLIENT_TIMEOUT="15000"

    # By default the start script uses "localhost"; override the hostname here
    # for production SolrCloud environments to control the hostname exposed to cluster state
    #SOLR_HOST="192.168.1.1"

    # By default the start script uses UTC; override the timezone if needed
    #SOLR_TIMEZONE="UTC"

    # Set to true to activate the JMX RMI connector to allow remote JMX client applications
    # to monitor the JVM hosting Solr; set to "false" to disable that behavior
    # (false is recommended in production environments)
    #ENABLE_REMOTE_JMX_OPTS="false"

    # The script will use SOLR_PORT+10000 for the RMI_PORT or you can set it here
    # RMI_PORT=18983

    # Anything you add to the SOLR_OPTS variable will be included in the java
    # start command line as-is, in ADDITION to other options. If you specify the
    # -a option on start script, those options will be appended as well. Examples:
    #SOLR_OPTS="$SOLR_OPTS -Dsolr.autoSoftCommit.maxTime=3000"
    #SOLR_OPTS="$SOLR_OPTS -Dsolr.autoCommit.maxTime=60000"
    #SOLR_OPTS="$SOLR_OPTS -Dsolr.clustering.enabled=true"

    # Location where the bin/solr script will save PID files for running instances
    # If not set, the script will create PID files in $SOLR_TIP/bin
    #SOLR_PID_DIR=

    # Path to a directory for Solr to store cores and their data. By default, Solr will use server/solr
    # If solr.xml is not stored in ZooKeeper, this directory needs to contain solr.xml
    #SOLR_HOME=

    # Solr provides a default Log4J configuration properties file in server/resources
    # however, you may want to customize the log settings and file appender location
    # so you can point the script to use a different log4j.properties file
    #LOG4J_PROPS=/var/solr/log4j.properties

    # Changes the logging level. Valid values: ALL, TRACE, DEBUG, INFO, WARN, ERROR, FATAL, OFF. Default is INFO
    # This is an alternative to changing the rootLogger in log4j.properties
    #SOLR_LOG_LEVEL=INFO

    # Location where Solr should write logs to. Absolute or relative to solr start dir
    #SOLR_LOGS_DIR=logs

    # Enables log rotation, cleanup, and archiving during start. Setting SOLR_LOG_PRESTART_ROTATION=false will skip start
    # time rotation of logs, and the archiving of the last GC and console log files. It does not affect Log4j configuration.
    # This pre-startup rotation may need to be disabled depending how much you customize the default logging setup.
    #SOLR_LOG_PRESTART_ROTATION=true

    # Sets the port Solr binds to, default is 8983
    #SOLR_PORT=8983

    # Uncomment to set SSL-related system properties
    # Be sure to update the paths to the correct keystore for your environment
    #SOLR_SSL_KEY_STORE=/home/shalin/work/oss/shalin-lusolr/solr/server/etc/solr-ssl.keystore.jks
    #SOLR_SSL_KEY_STORE_PASSWORD=secret
    #SOLR_SSL_KEY_STORE_TYPE=JKS
    #SOLR_SSL_TRUST_STORE=/home/shalin/work/oss/shalin-lusolr/solr/server/etc/solr-ssl.keystore.jks
    #SOLR_SSL_TRUST_STORE_PASSWORD=secret
    #SOLR_SSL_TRUST_STORE_TYPE=JKS
    #SOLR_SSL_NEED_CLIENT_AUTH=false
    #SOLR_SSL_WANT_CLIENT_AUTH=false

    # Uncomment if you want to override previously defined SSL values for HTTP client
    # otherwise keep them commented and the above values will automatically be set for HTTP clients
    #SOLR_SSL_CLIENT_KEY_STORE=
    #SOLR_SSL_CLIENT_KEY_STORE_PASSWORD=
    #SOLR_SSL_CLIENT_KEY_STORE_TYPE=
    #SOLR_SSL_CLIENT_TRUST_STORE=
    #SOLR_SSL_CLIENT_TRUST_STORE_PASSWORD=
    #SOLR_SSL_CLIENT_TRUST_STORE_TYPE=

    # Settings for authentication
    # Please configure only one of SOLR_AUTHENTICATION_CLIENT_CONFIGURER or SOLR_AUTH_TYPE parameters
    #SOLR_AUTHENTICATION_CLIENT_CONFIGURER="org.apache.solr.client.solrj.impl.PreemptiveBasicAuthConfigurer"
    #SOLR_AUTH_TYPE="basic"
    #SOLR_AUTHENTICATION_OPTS="-Dbasicauth=solr:SolrRocks"

    # Settings for ZK ACL
    #SOLR_ZK_CREDS_AND_ACLS="-DzkACLProvider=org.apache.solr.common.cloud.VMParamsAllAndReadonlyDigestZkACLProvider \
    #  -DzkCredentialsProvider=org.apache.solr.common.cloud.VMParamsSingleSetCredentialsDigestZkCredentialsProvider \
    #  -DzkDigestUsername=admin-user -DzkDigestPassword=CHANGEME-ADMIN-PASSWORD \
    #  -DzkDigestReadonlyUsername=readonly-user -DzkDigestReadonlyPassword=CHANGEME-READONLY-PASSWORD"
    #SOLR_OPTS="$SOLR_OPTS $SOLR_ZK_CREDS_AND_ACLS"

