summaryrefslogtreecommitdiff
blob: a64c2354dba14f8f1aa51bac541d7eb1101daadc (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
# Copyright 1999-2020 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2

EAPI=7

PYTHON_COMPAT=( python3_7 )

MY_PN="curator"
ES_VERSION="7.3.2"

inherit distutils-r1

DESCRIPTION="Tending time-series indices in Elasticsearch"
HOMEPAGE="https://github.com/elastic/curator"
SRC_URI="https://github.com/elastic/${MY_PN}/archive/v${PV}.tar.gz -> ${P}.tar.gz
	test? ( https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-${ES_VERSION}-linux-x86_64.tar.gz )"

LICENSE="Apache-2.0"
SLOT="0"
KEYWORDS="amd64 x86"
# tests fail in chroot
# https://github.com/elastic/elasticsearch/issues/12018
RESTRICT="test"
IUSE="doc test"

# vulnerable pyyaml
# https://github.com/elastic/curator/issues/1415
RDEPEND="
	>=dev-python/elasticsearch-py-7.0.4[${PYTHON_USEDEP}]
	<dev-python/elasticsearch-py-8.0.0[${PYTHON_USEDEP}]
	>=dev-python/click-6.7[${PYTHON_USEDEP}]
	<dev-python/click-7.0[${PYTHON_USEDEP}]
	>=dev-python/certifi-2019.9.11[${PYTHON_USEDEP}]
	>=dev-python/requests-2.20.0[${PYTHON_USEDEP}]
	>=dev-python/urllib3-1.24.2[${PYTHON_USEDEP}]
	<dev-python/urllib3-1.26[${PYTHON_USEDEP}]
	>=dev-python/voluptuous-0.9.3[${PYTHON_USEDEP}]"
DEPEND="dev-python/setuptools[${PYTHON_USEDEP}]
	>=dev-python/six-1.11.0[${PYTHON_USEDEP}]
	dev-python/sphinx
	dev-python/pyyaml[${PYTHON_USEDEP}]
	test? ( ${RDEPEND}
		virtual/jre
		dev-python/mock[${PYTHON_USEDEP}]
		dev-python/nose[${PYTHON_USEDEP}]
		dev-python/six[${PYTHON_USEDEP}] )"

S="${WORKDIR}/${MY_PN}-${PV}"

python_prepare_all() {
	# avoid downloading from net
	sed -e '/^intersphinx_mapping/,+3d' -i docs/conf.py || die

	# requests_aws4auth not in portage
	sed -e '/boto3/d' \
		-e '/requests_aws4auth/d' \
		-e 's/pyyaml==3.13/pyyaml/g' \
		-e '/tests_require/s/, "coverage", "nosexcover"//g' \
		-i setup.cfg setup.py || die

	# Bug 713342
	sed -i 's/yaml.load/yaml.unsafe_load/g' curator/utils.py test/unit/* || die

	distutils-r1_python_prepare_all
}

python_compile_all() {
	emake -C docs -j1 man $(usex doc html "")
}

# running tests in non-chroot environments:
# FEATURES="test -usersandbox" emerge dev-python/elasticsearch-curator
python_test_all() {
	# starts two ES instances (local,remote) and runs the tests
	# https://github.com/elastic/curator/blob/master/travis-run.sh
	local ES_INSTANCES="local remote"
	local ES_PATH="${WORKDIR}/elasticsearch-${ES_VERSION}"

	declare -A ES_PORT
	ES_PORT[local]=9200
	ES_PORT[remote]=9201

	local i transport
	declare -A ES_CONFIG_DIR ES_CONFIG_PATH ES_INSTANCE ES_LOG ES_PID
	for i in ${ES_INSTANCES}; do
		ES_CONFIG_DIR[$i]="${ES_PATH}/$i"
		ES_CONFIG_PATH[$i]="${ES_CONFIG_DIR[$i]}/elasticsearch.yml"
		ES_PID[$i]="${ES_PATH}/$i.pid"
		ES_LOG[$i]="${ES_PATH}/logs/$i.log"
	done

	# configure ES instances
	for i in ${ES_INSTANCES}; do
		mkdir -p "${ES_CONFIG_DIR[$i]}" || die
		cp ${ES_PATH}/config/{jvm.options,log4j2.properties} "${ES_CONFIG_DIR[$i]}"/ || die
		echo 'network.host: 127.0.0.1' > "${ES_CONFIG_PATH[$i]}" || die
		echo "http.port: ${ES_PORT[$i]}" >> "${ES_CONFIG_PATH[$i]}" || die
		echo "cluster.name: $i" >> "${ES_CONFIG_PATH[$i]}" || die
		echo "node.name: $i" >> "${ES_CONFIG_PATH[$i]}" || die
		echo 'node.max_local_storage_nodes: 2' >> "${ES_CONFIG_PATH[$i]}" || die
		transport=$((${ES_PORT[$i]}+100))
		echo "transport.port: ${transport}" >> "${ES_CONFIG_PATH[$i]}" || die
		echo "discovery.seed_hosts: [\"localhost:${transport}\"]" >> "${ES_CONFIG_PATH[$i]}" || die
		echo "discovery.type: single-node" >> "${ES_CONFIG_PATH[$i]}" || die
	done

	echo 'path.repo: /' >> "${ES_CONFIG_PATH[local]}" || die
	echo "reindex.remote.whitelist: localhost:${ES_PORT[remote]}" >> "${ES_CONFIG_PATH[local]}" || die

	# start ES instances
	for i in ${ES_INSTANCES}; do
		ES_PATH_CONF=${ES_CONFIG_DIR[$i]} "${ES_PATH}/bin/elasticsearch" -d -p "${ES_PID[$i]}" || die

		local j
		local es_started=0
		for j in {1..30}; do
			grep -q "started" "${ES_LOG[$i]}" 2> /dev/null
			if [[ $? -eq 0 ]]; then
				einfo "Elasticsearch $i started"
				es_started=1
				eend 0
				break
			elif grep -q 'BindException\[Address already in use\]' "${ES_LOG[$i]}" 2>/dev/null; then
				eend 1
				eerror "Elasticsearch $i already running"
				die "Cannot start Elasticsearch $i for tests"
			else
				einfo "Waiting for Elasticsearch $i"
				eend 1
				sleep 2
				continue
			fi
		done

		[[ $es_started -eq 0 ]] && die "Elasticsearch failed to start"
	done

	export TEST_ES_SERVER="localhost:${ES_PORT[local]}"
	export REMOTE_ES_SERVER="localhost:${ES_PORT[remote]}"

	# run tests
	nosetests -v || die

	for i in ${ES_INSTANCES}; do
		pkill -F ${ES_PID[$i]}
	done
}

python_install_all() {
	use doc && local HTML_DOCS=( docs/_build/html/. )
	doman docs/_build/man/*
	distutils-r1_python_install_all
}

pkg_postinst() {
	ewarn ""
	ewarn "For Python 3 support information please read: http://click.pocoo.org/latest/python3/"
	ewarn ""
	ewarn "Example usage on Python 3:"
	ewarn "export LC_ALL=en_US.UTF-8"
	ewarn "export LANG=en_US.UTF-8"
	ewarn "curator ..."
}