Skip to content

Commit d16c365

Browse files
kremerspryorda
authored andcommitted
feat(recursion): Fixing different recursion issues.
- Fix errors with more complicated folder structure - Refactor static logging to fine tunable logging Folder structs like the following will work now: Folder (Root) - Folder (Company) - Folder (Country) - Datacenter Folder - Project Folder (Compute Ressource or CCR here) - Customer related Folder - Production/Dev Folder (Compute Ressource or CCR here)
1 parent 679e6e4 commit d16c365

File tree

4 files changed

+171
-118
lines changed

4 files changed

+171
-118
lines changed

.travis.yml

Lines changed: 52 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1,40 +1,56 @@
1+
---
2+
13
language: python
2-
python:
3-
- 3.6
4-
cache: pip
5-
jobs:
4+
dist: xenial # required for Python >= 3.7
5+
sudo: required
6+
cache:
7+
directories:
8+
- "$HOME/.cache/pip"
9+
- "$HOME/.pyenv"
10+
matrix:
611
include:
7-
- language: python
8-
python:
9-
- '3.6'
10-
cache: pip
11-
sudo: required
12-
script:
13-
- pip install -e . -r requirements.txt -r requirements-tests.txt
14-
- grep -Rl packagecloud /etc/apt/ |sudo xargs rm -vf
15-
- sudo apt-get update && sudo apt-get install -y nodejs npm && npm install -g dockerfilelint
16-
- dockerfilelint ./Dockerfile
17-
- flake8 vmware_exporter tests
18-
- pytest --cov=. tests/unit
19-
after_success:
20-
- codecov
21-
- language: python
22-
python: '3.6'
23-
cache: pip
24-
sudo: required
25-
services:
26-
- docker
27-
script:
28-
- pip install -e . -r requirements.txt -r requirements-tests.txt
29-
- pytest tests/integration
30-
after_success:
31-
- git config --global user.name "semantic-release (via TravisCI)"
32-
- git config --global user.email "semantic-release@travis"
33-
- pip install python-semantic-release
34-
- semantic-release publish
35-
- semantic-release changelog --post
12+
- name: "Python 3.6 Unit-test"
13+
python: 3.6
14+
- name: "Python 3.7 Unit-test"
15+
python: 3.7
16+
- name: "Python 3.7 Docker Unit and Integration-test"
17+
python: 3.7
18+
services:
19+
- docker
20+
env:
21+
- BUILD_SDIST=true
22+
- INTEGRATION_TEST=true
23+
24+
install:
25+
- pip install -e . -r requirements.txt -r requirements-tests.txt
26+
- grep -Rl packagecloud /etc/apt/ |sudo xargs rm -vf
27+
- sudo apt-get update && sudo apt-get install -y nodejs npm
28+
- npm install -g dockerfilelint
29+
- if [ $INTEGRATION_TEST == "true" ]; then
30+
pip install python-semantic-release;
31+
fi
32+
33+
script:
34+
- dockerfilelint ./Dockerfile
35+
- flake8 vmware_exporter tests
36+
- pytest --cov=. -v tests/unit
37+
- if [ $INTEGRATION_TEST == "true" ]; then
38+
pytest tests/integration;
39+
else
40+
echo "Skipped Integration-Tests";
41+
fi
42+
43+
after_success:
44+
- codecov
45+
- if [ $INTEGRATION_TEST == "true" ]; then
46+
git config --global user.name "semantic-release (via TravisCI)";
47+
git config --global user.email "semantic-release@travis";
48+
semantic-release publish;
49+
semantic-release changelog --post;
50+
fi
51+
3652
env:
3753
global:
38-
- secure: qC8DzqyxBiBBBUGLuNOO2O6XgmUaLhTi1ArfhYxVDjv5vTJvCNO1DpXfFqXJGR3wrRKe1DOddXildOEL7d7xX6Y3b+k3urnPfqnAM/Hvr0djqDWRPuZl89Fg1mrAvBV3LL/ZsrWKHDc3keD/vTcPAsrnJl3MdS5fMKBwEuDmhpnNdGk0Wty357WxWBaz1JYBoGaqbw0JWAAA5UdfyF3aOybRONXcVqnxqSeR43drBLSdAwBJVVhyv3IYX3HRMCP8vXz43LqWK16z8KVPyrwwzE2WXlq+2FypLtM4A/XOssx4M77MefIMC6ydAimLh33gYtaiuO7+fYipLlOlChNO/pxX43FM+7UuKWaL9MWaUvypmOGo+jp/y6PzbIDz/RH4T8mjaswIe22nyTR/Gbtph/58CISGGEtRNKXjE4/OD1gjodcNS2NkwNQimxjHv30rH4X4Z+JYU+I3iobpmWJ5WJsyMnS3jWkRluRgA+8djuRviK4sdIBwk2qC2AGuZ1c6EJbEN7f3sRIgtQMYd1JAiZVwYmRa08hpulvrZAzxqx/PfkaEOBFQrBwISkD2Oq3MGlDSV+sUe53TmRM1KO9y5fC8XnJHRJv5mw+iWaEIImP2muXufdm101oXNzHbs3hC2kYIFD+u1BoVDgWACUIkj2oRxMJ4p3ynlbccALUc8y0=
39-
- secure: GWTsOe1CGvEi/n7k+c91UisQAf7UcofZKeO8EI6n0abRPQii0rfMIQ7fS2KFUyR7I/nk02YrZcd1etAGTVthc9K3YrUhM68eu+ztlUX6Sr5SM6PseYWkgf+G0I+IIoCpqSjwL/9J4jTP1hvNlP7nofUbo43OyEEX7ndNr1r8Ab0Zu48VYFj3sb3whMovakEVH5SIUe001Jix4wIZ9TYUNnSReNzMb8M+s/xK+RUnT3SYYutBbw0Dc+wTaaW/A5g1kSK35VZZ7OWN+l1Sc0xCa9tfJYKuxXFuyKmBRe3z1WUk+4yQxbGKQ0s47LpICo2qKm2iYoKVoWAGXBtWKCbLDoVy1tRTE3bcBMFbNsHXHT4+1F6djJjfr8ndFAoLpXyVBPsD3/ik8k7GzC7Gvam1fzCisjPDZFbdUpUCXU5HDrknB6yKNvekkltgkGajS0rzY6UPPiUdGccoXMngrS8FhD7zPxqfCtbK9WYBM5yXZ/kCgCqy0+dMu0+1iUR8h4hoQxonp2c7cAEnHMcd90o0IK8NEZMNpu5b/F+34/wj3cy+QYpE99pF5ztnPQfzUPZzR7rAl/TzesDLFVQceykYNczoD1YDMUFareV+nyzZp/W4gECaRkqgZxxfYcSUXQCaQfHWSvSdHHLaoIMzQi7lL1c6YxmWx8UireQEChbKfyw=
40-
- secure: sbOF44qJH2JyblAVIgbVZ/xmIuF9+ypzmyB6EOvbMagAdcySxYEz7BIadIMtP8wWGM2TZQKFxUTJhJblSBbKAKdC/6o6RLUy/MxyCShJafr9NkBhhbLIzYdVGOC5TjswLBXtvNdTbyUgEu6NQnkBjVoBm8FXfhWxRWzJ7SJHSJYMOB8Fnr7gjxiMbenQUJYfRtVowmExrHq0WxyvNMxqKEW4qWFU3AwAZEc7M5hvf+Upju/rnHsBRZrm/RvfRdhQnAXPVaSJXMzy5Msa6KheqswczSSlLTgpUxCF412EXD2rZsjG3sRFMLnokVw983z2Kw4ov3Y7eYHBpmyz7wg9ICD4TdlbbAPJJIgY7lZzYYtt2sQ6DhLwsNZyCCXBGn6b8tmNiOXdRkZJU7aAW6yuXDSx6RZCRNfn4JFFt1o9yzEbea6oKfovB7cy/3d3ty4+3ud9ozXB9G/m7UzsjCvry7gIxEv2rVYtdNeOvslyftXXXzPl4IRJv99WcSmum0nuOpQrlvOzq+1yQNa3ImCRBkFmqUUa34FObzIaGegq4fD3kMKz9N+impQRvNI9WiDqtRvBJTCaP28ibUainxslW4Ep4rcmWo6synf2q6aWTrUPxXl0jvd6eIuCCvWPH7uLXZhL0dYm5ID/9BOCd3TZcvVjBKW0xWkFafNyt2USJto=
54+
- secure: qC8DzqyxBiBBBUGLuNOO2O6XgmUaLhTi1ArfhYxVDjv5vTJvCNO1DpXfFqXJGR3wrRKe1DOddXildOEL7d7xX6Y3b+k3urnPfqnAM/Hvr0djqDWRPuZl89Fg1mrAvBV3LL/ZsrWKHDc3keD/vTcPAsrnJl3MdS5fMKBwEuDmhpnNdGk0Wty357WxWBaz1JYBoGaqbw0JWAAA5UdfyF3aOybRONXcVqnxqSeR43drBLSdAwBJVVhyv3IYX3HRMCP8vXz43LqWK16z8KVPyrwwzE2WXlq+2FypLtM4A/XOssx4M77MefIMC6ydAimLh33gYtaiuO7+fYipLlOlChNO/pxX43FM+7UuKWaL9MWaUvypmOGo+jp/y6PzbIDz/RH4T8mjaswIe22nyTR/Gbtph/58CISGGEtRNKXjE4/OD1gjodcNS2NkwNQimxjHv30rH4X4Z+JYU+I3iobpmWJ5WJsyMnS3jWkRluRgA+8djuRviK4sdIBwk2qC2AGuZ1c6EJbEN7f3sRIgtQMYd1JAiZVwYmRa08hpulvrZAzxqx/PfkaEOBFQrBwISkD2Oq3MGlDSV+sUe53TmRM1KO9y5fC8XnJHRJv5mw+iWaEIImP2muXufdm101oXNzHbs3hC2kYIFD+u1BoVDgWACUIkj2oRxMJ4p3ynlbccALUc8y0=
55+
- secure: GWTsOe1CGvEi/n7k+c91UisQAf7UcofZKeO8EI6n0abRPQii0rfMIQ7fS2KFUyR7I/nk02YrZcd1etAGTVthc9K3YrUhM68eu+ztlUX6Sr5SM6PseYWkgf+G0I+IIoCpqSjwL/9J4jTP1hvNlP7nofUbo43OyEEX7ndNr1r8Ab0Zu48VYFj3sb3whMovakEVH5SIUe001Jix4wIZ9TYUNnSReNzMb8M+s/xK+RUnT3SYYutBbw0Dc+wTaaW/A5g1kSK35VZZ7OWN+l1Sc0xCa9tfJYKuxXFuyKmBRe3z1WUk+4yQxbGKQ0s47LpICo2qKm2iYoKVoWAGXBtWKCbLDoVy1tRTE3bcBMFbNsHXHT4+1F6djJjfr8ndFAoLpXyVBPsD3/ik8k7GzC7Gvam1fzCisjPDZFbdUpUCXU5HDrknB6yKNvekkltgkGajS0rzY6UPPiUdGccoXMngrS8FhD7zPxqfCtbK9WYBM5yXZ/kCgCqy0+dMu0+1iUR8h4hoQxonp2c7cAEnHMcd90o0IK8NEZMNpu5b/F+34/wj3cy+QYpE99pF5ztnPQfzUPZzR7rAl/TzesDLFVQceykYNczoD1YDMUFareV+nyzZp/W4gECaRkqgZxxfYcSUXQCaQfHWSvSdHHLaoIMzQi7lL1c6YxmWx8UireQEChbKfyw=
56+
- secure: sbOF44qJH2JyblAVIgbVZ/xmIuF9+ypzmyB6EOvbMagAdcySxYEz7BIadIMtP8wWGM2TZQKFxUTJhJblSBbKAKdC/6o6RLUy/MxyCShJafr9NkBhhbLIzYdVGOC5TjswLBXtvNdTbyUgEu6NQnkBjVoBm8FXfhWxRWzJ7SJHSJYMOB8Fnr7gjxiMbenQUJYfRtVowmExrHq0WxyvNMxqKEW4qWFU3AwAZEc7M5hvf+Upju/rnHsBRZrm/RvfRdhQnAXPVaSJXMzy5Msa6KheqswczSSlLTgpUxCF412EXD2rZsjG3sRFMLnokVw983z2Kw4ov3Y7eYHBpmyz7wg9ICD4TdlbbAPJJIgY7lZzYYtt2sQ6DhLwsNZyCCXBGn6b8tmNiOXdRkZJU7aAW6yuXDSx6RZCRNfn4JFFt1o9yzEbea6oKfovB7cy/3d3ty4+3ud9ozXB9G/m7UzsjCvry7gIxEv2rVYtdNeOvslyftXXXzPl4IRJv99WcSmum0nuOpQrlvOzq+1yQNa3ImCRBkFmqUUa34FObzIaGegq4fD3kMKz9N+impQRvNI9WiDqtRvBJTCaP28ibUainxslW4Ep4rcmWo6synf2q6aWTrUPxXl0jvd6eIuCCvWPH7uLXZhL0dYm5ID/9BOCd3TZcvVjBKW0xWkFafNyt2USJto=

README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@ Get VMware vCenter information:
1919

2020
## Usage
2121

22+
*Requires Python >= 3.6*
23+
2224
- Install with `$ python setup.py install` or via pip `$ pip install vmware_exporter`. The docker command below is preferred.
2325
- Create `config.yml` based on the configuration section. Some variables can be passed as environment variables
2426
- Run `$ vmware_exporter -c /path/to/your/config`

tests/unit/test_vmware_exporter.py

Lines changed: 30 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import pytz
88
from pyVmomi import vim, vmodl
99
from twisted.internet import defer
10+
from twisted.internet.error import ReactorAlreadyRunning
1011
from twisted.web.server import NOT_DONE_YET
1112

1213
from vmware_exporter.vmware_exporter import main, HealthzResource, VmwareCollector, VMWareMetricsResource
@@ -526,19 +527,19 @@ def _fake_get_vms(*args, **kwargs):
526527

527528
@pytest_twisted.inlineCallbacks
528529
def test_vmware_get_inventory():
529-
content = mock.Mock()
530+
content = mock.Mock(spec=vim.ServiceInstanceContent)
530531

531532
# Compute case 1
532-
host_1 = mock.Mock()
533+
host_1 = mock.Mock(spec=vim.HostSystem)
533534
host_1._moId = 'host:1'
534535
host_1.name = 'host-1'
535536
host_1.summary.config.name = 'host-1.'
536537

537-
folder_1 = mock.Mock()
538+
folder_1 = mock.Mock(spec=vim.ComputeResource)
538539
folder_1.host = [host_1]
539540

540541
# Computer case 2
541-
host_2 = mock.Mock()
542+
host_2 = mock.Mock(spec=vim.HostSystem)
542543
host_2._moId = 'host:2'
543544
host_2.name = 'host-2'
544545
host_2.summary.config.name = 'host-2.'
@@ -548,12 +549,12 @@ def test_vmware_get_inventory():
548549
folder_2.__dict__['host'] = [host_2]
549550

550551
# Folders case
551-
host_3 = mock.Mock()
552+
host_3 = mock.Mock(spec=vim.HostSystem)
552553
host_3._moId = 'host:3'
553554
host_3.name = 'host-3'
554555
host_3.summary.config.name = 'host-3.'
555556

556-
folder_3 = mock.Mock()
557+
folder_3 = mock.Mock(spec=vim.ComputeResource)
557558
folder_3.host = [host_3]
558559

559560
folder_4 = vim.Folder('folder:4')
@@ -576,12 +577,20 @@ def test_vmware_get_inventory():
576577
datastore_2_folder.__dict__['childEntity'] = [datastore_2]
577578
datastore_2_folder.__dict__['name'] = 'datastore2-folder'
578579

579-
data_center_1 = mock.Mock()
580+
data_center_1 = mock.Mock(spec=vim.Datacenter)
580581
data_center_1.name = 'dc-1'
581-
data_center_1.hostFolder.childEntity = [folder_1, folder_2, folder_5]
582-
data_center_1.datastoreFolder.childEntity = [datastore_1, datastore_2_folder]
582+
data_center_1_hostfolder = mock.Mock(spec=vim.Folder)
583+
data_center_1_hostfolder.childEntity = [folder_1, folder_2, folder_5]
584+
data_center_1.hostFolder = data_center_1_hostfolder
585+
586+
dc1_datastoreFolder = mock.Mock(spec=vim.Folder)
587+
dc1_datastoreFolder.childEntity = [datastore_1, datastore_2_folder]
583588

584-
content.rootFolder.childEntity = [data_center_1]
589+
data_center_1.datastoreFolder = dc1_datastoreFolder
590+
591+
rootFolder1 = mock.Mock(spec=vim.Folder)
592+
rootFolder1.childEntity = [data_center_1]
593+
content.rootFolder = rootFolder1
585594

586595
collect_only = {
587596
'vms': True,
@@ -895,6 +904,16 @@ def test_config_env_multiple_sections():
895904
}
896905

897906

907+
def test_invalid_loglevel_cli_argument():
908+
with pytest.raises(ValueError):
909+
main(['-l', 'dog'])
910+
911+
912+
def test_valid_loglevel_cli_argument():
913+
with pytest.raises(ReactorAlreadyRunning):
914+
main(['-l', 'INFO'])
915+
916+
898917
def test_main():
899918
with pytest.raises(SystemExit):
900-
main(['-h'])
919+
main(['-h', '-l debug'])

0 commit comments

Comments
 (0)