blob: 7e3466daac786fd963200c8520da5d949e38d782 [file]
# SPDX-License-Identifier: Apache-2.0
#
# Modifications by Apache Solr contributors; see git log for details.
# Licensed under the Apache License, Version 2.0.
#
# The OpenSearch Contributors require contributions made to
# this file be licensed under the Apache-2.0 license or a
# compatible open source license.
# Modifications Copyright OpenSearch Contributors. See
# GitHub history for details.
# Licensed to Elasticsearch B.V. under one or more contributor
# license agreements. See the NOTICE file distributed with
# this work for additional information regarding copyright
# ownership. Elasticsearch B.V. licenses this file to you under
# the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
import os
from unittest import TestCase
import unittest.mock as mock
from solrorbit.utils import opts
class ConfigHelperFunctionTests(TestCase):
def test_csv_to_list(self):
self.assertEqual([], opts.csv_to_list(""))
self.assertEqual(["a", "b", "c", "d"], opts.csv_to_list(" a,b,c , d"))
self.assertEqual(["a-;d", "b", "c", "d"], opts.csv_to_list(" a-;d ,b,c , d"))
def test_kv_to_map(self):
self.assertEqual({}, opts.kv_to_map([]))
# explicit treatment as string
self.assertEqual({"k": "3"}, opts.kv_to_map(["k:'3'"]))
self.assertEqual({"k": 3}, opts.kv_to_map(["k:3"]))
# implicit treatment as string
self.assertEqual({"k": "v"}, opts.kv_to_map(["k:v"]))
self.assertEqual({"k": "v", "size": 4, "empty": False, "temperature": 0.5},
opts.kv_to_map(["k:'v'", "size:4", "empty:false", "temperature:0.5"]))
class GenericHelperFunctionTests(TestCase):
def test_list_as_bulleted_list(self):
src_list = ["param-1", "param-2", "a_longer-parameter"]
self.assertEqual(
["- param-1", "- param-2", "- a_longer-parameter"],
opts.bulleted_list_of(src_list)
)
def test_list_as_double_quoted_list(self):
src_list = ["oneitem", "_another-weird_item", "param-3"]
self.assertEqual(
opts.double_quoted_list_of(src_list),
['"oneitem"', '"_another-weird_item"', '"param-3"']
)
def test_make_list_of_close_matches(self):
word_list = [
"bulk_indexing_clients",
"bulk_indexing_iterations",
"target_throughput",
"bulk_size",
"number_of-shards",
"number_of_replicas",
"index_refresh_interval"]
available_word_list = [
"bulk_indexing_clients",
"bulk_indexing_iterations",
"bulk_size",
"cluster_health",
"disk_type",
"duration",
"forcemerge",
"index_alias",
"index_refresh_interval",
"indices_delete_pattern",
"joiner",
"max_rolledover_indices",
"number_of_replicas",
"number_of_shards",
"ops_per_25_gb",
"p1_bulk_indexing_clients",
"p1_bulk_size",
"p1_duration_secs",
"p2_bulk_indexing_clients",
"p2_bulk_size",
"p2_duration_secs",
"p2_ops",
"p2_query1_target_interval",
"p2_query2_target_interval",
"p2_query3_target_interval",
"p2_query4_target_interval",
"phase_duration_secs",
"pre_filter_shard_size",
"query_iterations",
"range",
"rate_limit_duration_secs",
"rate_limit_max",
"rate_limit_step",
"rolledover_indices_suffix_separator",
"rollover_max_age",
"rollover_max_size",
"shard_sizing_iterations",
"shard_sizing_queries",
"source_enabled",
"target_throughput",
"translog_sync"]
self.assertEqual(
['bulk_indexing_clients',
'bulk_indexing_iterations',
'target_throughput',
'bulk_size',
# number_of-shards had a typo
'number_of_shards',
'number_of_replicas',
'index_refresh_interval'],
opts.make_list_of_close_matches(word_list, available_word_list)
)
def test_make_list_of_close_matches_returns_with_empty_word_list(self):
self.assertEqual(
[],
opts.make_list_of_close_matches([], ["number_of_shards"])
)
def test_make_list_of_close_matches_returns_empty_list_with_no_close_matches(self):
self.assertEqual(
[],
opts.make_list_of_close_matches(
["number_of_shards", "number_of-replicas"],
[])
)
def test_to_dict_str(self):
json = '{ "field": 2 }'
rsl = opts.to_dict(json)
self.assertEqual(rsl, {"field": 2})
rsl = opts.to_dict('a:1,b:2')
self.assertEqual(rsl, {'a': 1, 'b': 2})
@mock.patch("json.loads")
def test_to_dict_file(self, json_loads):
mo = mock.mock_open()
with mock.patch("builtins.open", mo):
opts.to_dict('params.json')
mo.assert_called()
mo = mock.mock_open()
with mock.patch("builtins.open", mo):
opts.to_dict('index_body:idx.json')
mo.assert_not_called()
class TestTargetHosts(TestCase):
def test_empty_arg_parses_as_empty_list(self):
self.assertEqual([], opts.TargetHosts('').default)
self.assertEqual({'default': []}, opts.TargetHosts('').all_hosts)
def test_csv_hosts_parses(self):
target_hosts = '127.0.0.1:9200,10.17.0.5:19200'
self.assertEqual(
{'default': [{'host': '127.0.0.1', 'port': 9200},{'host': '10.17.0.5', 'port': 19200}]},
opts.TargetHosts(target_hosts).all_hosts
)
self.assertEqual(
[{'host': '127.0.0.1', 'port': 9200},{'host': '10.17.0.5', 'port': 19200}],
opts.TargetHosts(target_hosts).default
)
self.assertEqual(
[{'host': '127.0.0.1', 'port': 9200},{'host': '10.17.0.5', 'port': 19200}],
opts.TargetHosts(target_hosts).default)
def test_jsonstring_parses_as_dict_of_clusters(self):
target_hosts = ('{"default": ["127.0.0.1:9200","10.17.0.5:19200"],'
' "remote_1": ["88.33.22.15:19200"],'
' "remote_2": ["10.18.0.6:19200","10.18.0.7:19201"]}')
self.assertEqual(
{'default': ['127.0.0.1:9200','10.17.0.5:19200'],
'remote_1': ['88.33.22.15:19200'],
'remote_2': ['10.18.0.6:19200','10.18.0.7:19201']},
opts.TargetHosts(target_hosts).all_hosts)
def test_json_file_parameter_parses(self):
self.assertEqual(
{"default": ["127.0.0.1:9200","10.127.0.3:19200"] },
opts.TargetHosts(os.path.join(os.path.dirname(__file__), "resources", "target_hosts_1.json")).all_hosts)
self.assertEqual(
{
"default": [
{"host": "127.0.0.1", "port": 9200},
{"host": "127.0.0.1", "port": 19200}
],
"remote_1":[
{"host": "10.127.0.3", "port": 9200},
{"host": "10.127.0.8", "port": 9201}
],
"remote_2":[
{"host": "88.33.27.15", "port": 39200}
]
},
opts.TargetHosts(os.path.join(os.path.dirname(__file__), "resources", "target_hosts_2.json")).all_hosts)
class TestClientOptions(TestCase):
def test_csv_client_options_parses(self):
client_options_string = "use_ssl:true,verify_certs:true,ca_certs:'/path/to/cacert.pem'"
self.assertEqual(
{'use_ssl': True, 'verify_certs': True, 'ca_certs': '/path/to/cacert.pem'},
opts.ClientOptions(client_options_string).default)
self.assertEqual(
{'use_ssl': True, 'verify_certs': True, 'ca_certs': '/path/to/cacert.pem'},
opts.ClientOptions(client_options_string).default
)
self.assertEqual(
{'default': {'use_ssl': True, 'verify_certs': True, 'ca_certs': '/path/to/cacert.pem'}},
opts.ClientOptions(client_options_string).all_client_options
)
def test_jsonstring_client_options_parses(self):
client_options_string = '{"default": {"timeout": 60},' \
'"remote_1": {"use_ssl":true,"verify_certs":true,"basic_auth_user": "solr", "basic_auth_password": "changeme"},'\
'"remote_2": {"use_ssl":true,"verify_certs":true,"ca_certs":"/path/to/cacert.pem"}}'
self.assertEqual(
{'timeout': 60},
opts.ClientOptions(client_options_string).default)
self.assertEqual(
{'timeout': 60},
opts.ClientOptions(client_options_string).default)
self.assertEqual(
{'default': {'timeout':60},
'remote_1': {'use_ssl': True,'verify_certs': True,'basic_auth_user':'solr','basic_auth_password':'changeme'},
'remote_2': {'use_ssl': True,'verify_certs': True, 'ca_certs':'/path/to/cacert.pem'}},
opts.ClientOptions(client_options_string).all_client_options)
def test_json_file_parameter_parses(self):
self.assertEqual(
{'default': {'timeout':60},
'remote_1': {'use_ssl': True,'verify_certs': True,'basic_auth_user':'solr','basic_auth_password':'changeme'},
'remote_2': {'use_ssl': True,'verify_certs': True, 'ca_certs':'/path/to/cacert.pem'}},
opts.ClientOptions(os.path.join(os.path.dirname(__file__), "resources", "client_options_1.json")).all_client_options)
self.assertEqual(
{'default': {'timeout':60}},
opts.ClientOptions(os.path.join(os.path.dirname(__file__), "resources", "client_options_2.json")).all_client_options)
def test_no_client_option_parses_to_default(self):
client_options_string = opts.ClientOptions.DEFAULT_CLIENT_OPTIONS
target_hosts = None
self.assertEqual(
{"timeout": 60},
opts.ClientOptions(client_options_string,
target_hosts=target_hosts).default)
self.assertEqual(
{"default": {"timeout": 60}},
opts.ClientOptions(client_options_string,
target_hosts=target_hosts).all_client_options)
self.assertEqual(
{"timeout": 60},
opts.ClientOptions(client_options_string,
target_hosts=target_hosts).default)
def test_no_client_option_parses_to_default_with_multicluster(self):
client_options_string = opts.ClientOptions.DEFAULT_CLIENT_OPTIONS
target_hosts = opts.TargetHosts('{"default": ["127.0.0.1:9200,10.17.0.5:19200"], "remote": ["88.33.22.15:19200"]}')
self.assertEqual(
{"timeout": 60},
opts.ClientOptions(client_options_string,
target_hosts=target_hosts).default)
self.assertEqual(
{"default": {"timeout": 60}, "remote": {"timeout": 60}},
opts.ClientOptions(client_options_string,
target_hosts=target_hosts).all_client_options)
self.assertEqual(
{"timeout": 60},
opts.ClientOptions(client_options_string,
target_hosts=target_hosts).default)
def test_amends_with_max_connections(self):
client_options_string = opts.ClientOptions.DEFAULT_CLIENT_OPTIONS
target_hosts = opts.TargetHosts('{"default": ["10.17.0.5:9200"], "remote": ["88.33.22.15:9200"]}')
self.assertEqual(
{"default": {"timeout": 60, "max_connections": 128}, "remote": {"timeout": 60, "max_connections": 128}},
opts.ClientOptions(client_options_string, target_hosts=target_hosts).with_max_connections(128))
def test_keeps_already_specified_max_connections(self):
client_options_string = '{"default": {"timeout":60,"max_connections":5}, "remote": {"timeout":60}}'
target_hosts = opts.TargetHosts('{"default": ["10.17.0.5:9200"], "remote": ["88.33.22.15:9200"]}')
self.assertEqual(
{"default": {"timeout": 60, "max_connections": 5}, "remote": {"timeout": 60, "max_connections": 32}},
opts.ClientOptions(client_options_string, target_hosts=target_hosts).with_max_connections(32))