Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Run Python tests in libbeat #28438

Merged
merged 5 commits into from
Oct 18, 2021
Merged
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Follow up changes in dashboard tests
kvch committed Oct 15, 2021
commit 0ae5baee670cbfed03992e7d257485534ae236c9
Binary file modified libbeat/tests/files/testbeat-dashboards.zip
Binary file not shown.
176 changes: 16 additions & 160 deletions libbeat/tests/system/test_dashboard.py
Original file line number Diff line number Diff line change
@@ -126,30 +126,6 @@ def test_load_only_index_patterns(self):

assert self.log_contains("Kibana dashboards successfully loaded") is True

@unittest.skipUnless(INTEGRATION_TESTS, "integration test")
@pytest.mark.tag('integration')
def test_export_dashboard_cmd_export_dashboard_by_id_and_decoding(self):
"""
Test testbeat export dashboard can export dashboards
and removes unsupported characters
"""
self.render_config_template()
self.test_load_dashboard()
beat = self.start_beat(
logging_args=["-e", "-d", "*"],
extra_args=["export",
"dashboard",
"-E", "setup.kibana.protocol=http",
"-E", "setup.kibana.host=" + self.get_kibana_host(),
"-E", "setup.kibana.port=" + self.get_kibana_port(),
"-decode",
"-id", "Metricbeat-system-overview"]
)

beat.check_wait(exit_code=0)

assert self.log_contains("\"id\": \"Metricbeat-system-overview\",") is True

@unittest.skipUnless(INTEGRATION_TESTS, "integration test")
@pytest.mark.tag('integration')
def test_export_dashboard_cmd_export_dashboard_by_id(self):
@@ -165,12 +141,12 @@ def test_export_dashboard_cmd_export_dashboard_by_id(self):
"-E", "setup.kibana.protocol=http",
"-E", "setup.kibana.host=" + self.get_kibana_host(),
"-E", "setup.kibana.port=" + self.get_kibana_port(),
"-id", "Metricbeat-system-overview"]
"-id", "Metricbeat-system-overview",
"-folder", "system-overview"]
)

beat.check_wait(exit_code=0)

assert self.log_contains("\"id\": \"Metricbeat-system-overview\",") is True
self._check_if_dashboard_exported("system-overview")

@unittest.skipUnless(INTEGRATION_TESTS, "integration test")
@pytest.mark.tag('integration')
@@ -186,69 +162,15 @@ def test_export_dashboard_cmd_export_dashboard_by_id_unknown_id(self):
"-E", "setup.kibana.protocol=http",
"-E", "setup.kibana.host=" + self.get_kibana_host(),
"-E", "setup.kibana.port=" + self.get_kibana_port(),
"-id", "No-such-dashboard"]
"-id", "No-such-dashboard",
"-folder", "system-overview"]
)

beat.check_wait(exit_code=1)

expected_error = re.compile("error exporting dashboard:.*not found", re.IGNORECASE)
assert self.log_contains(expected_error)

@unittest.skipUnless(INTEGRATION_TESTS, "integration test")
@pytest.mark.tag('integration')
def test_export_dashboard_cmd_export_dashboard_from_yml(self):
"""
Test testbeat export dashboard can export dashboards from dashboards YAML file
and removes unsupported characters
"""

self.render_config_template()
self.test_load_dashboard()
beat = self.start_beat(
logging_args=["-e", "-d", "*"],
extra_args=["export",
"dashboard",
"-E", "setup.kibana.protocol=http",
"-E", "setup.kibana.host=" + self.get_kibana_host(),
"-E", "setup.kibana.port=" + self.get_kibana_port(),
"-yml", os.path.join(self.beat_path, "tests", "files", "dashboards.yml")]
)

beat.check_wait(exit_code=0)

version = self.get_version()
kibana_semver = semver.VersionInfo.parse(version)
exported_dashboard_path = os.path.join(self.beat_path, "tests", "files", "_meta",
"kibana", str(kibana_semver.major), "dashboard", "Metricbeat-system-test-overview.ndjson")

with open(exported_dashboard_path) as f:
content = f.read()
assert "Metricbeat-system-overview" in content

os.remove(exported_dashboard_path)

@unittest.skipUnless(INTEGRATION_TESTS, "integration test")
@pytest.mark.tag('integration')
def test_export_dashboard_cmd_export_dashboard_from_not_existent_yml(self):
"""
Test testbeat export dashboard fails gracefully when cannot find YAML file
"""

self.render_config_template()
beat = self.start_beat(
logging_args=["-e", "-d", "*"],
extra_args=["export",
"dashboard",
"-E", "setup.kibana.protocol=http",
"-E", "setup.kibana.host=" + self.get_kibana_host(),
"-E", "setup.kibana.port=" + self.get_kibana_port(),
"-yml", os.path.join(self.beat_path, "tests", "files", "no-such-file.yml")]
)

beat.check_wait(exit_code=1)
assert self.log_contains("Error exporting dashboards from yml")
assert self.log_contains("error opening the list of dashboards")

@unittest.skipUnless(INTEGRATION_TESTS, "integration test")
@pytest.mark.tag('integration')
def test_dev_tool_export_dashboard_by_id(self):
@@ -258,60 +180,17 @@ def test_dev_tool_export_dashboard_by_id(self):

self.test_load_dashboard()

path = os.path.normpath(self.beat_path + "/../dev-tools/cmd/dashboards/export_dashboards.go")
command = path + " -kibana http://" + self.get_kibana_host() + ":" + self.get_kibana_port()
command = "go run " + command + " -dashboard Metricbeat-system-overview"

p = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
content, err = p.communicate()

assert p.returncode == 0

assert os.path.isfile("output.ndjson") is True

with open('output.ndjson') as f:
content = f.read()
assert "Metricbeat-system-overview" in content

os.remove("output.ndjson")

@unittest.skipUnless(INTEGRATION_TESTS, "integration test")
@pytest.mark.tag('integration')
def test_dev_tool_export_dashboard_by_id_to_folder(self):
"""
Test dev-tools/cmd/dashboards exports dashboard and removes unsupported characters
and separates each asset into a file under the appropriate folder
"""

self.test_load_dashboard()

folder_name = "my-system"
folder_name = "system-overview"
path = os.path.normpath(self.beat_path + "/../dev-tools/cmd/dashboards/export_dashboards.go")
command = path + " -kibana http://" + self.get_kibana_host() + ":" + self.get_kibana_port()
command = "go run " + command + " -dashboard Metricbeat-system-overview -folder " + folder_name

p = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
content, err = p.communicate()
print(content, err)

assert p.returncode == 0

assert os.path.isfile("output.ndjson") is False
assert os.path.isdir(folder_name) is True

kibana_semver = semver.VersionInfo.parse(self.get_version())
assets_root = os.path.join(folder_name, "_meta", "kibana", str(kibana_semver.major))
assert os.path.isdir(assets_root) is True
assert os.path.isdir(os.path.join(assets_root, "dashboard")) is True
assert os.path.isdir(os.path.join(assets_root, "visualization")) is True

with open(os.path.join(assets_root, "dashboard", "Metricbeat-system-overview.json")) as dashboard_file:
dashboard = json.load(dashboard_file)
for reference in dashboard["references"]:
reference_path = os.path.join(assets_root, reference["type"], reference["id"]+".json")
assert os.path.isfile(reference_path)

shutil.rmtree(folder_name)
self._check_if_dashboard_exported(folder_name)

@unittest.skipUnless(INTEGRATION_TESTS, "integration test")
@pytest.mark.tag('integration')
@@ -343,52 +222,29 @@ def test_dev_tool_export_dashboard_by_id_from_space(self):

self.test_load_dashboard_into_space(False)

folder_name = "system-overview"
path = os.path.normpath(self.beat_path + "/../dev-tools/cmd/dashboards/export_dashboards.go")
command = path + " -kibana http://" + self.get_kibana_host() + ":" + self.get_kibana_port()
command = "go run " + command + " -dashboard Metricbeat-system-overview -space-id foo-bar"
command = "go run " + command + " -dashboard Metricbeat-system-overview -space-id foo-bar -folder " + folder_name

p = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
content, err = p.communicate()

assert p.returncode == 0

assert os.path.isfile("output.ndjson") is True

with open('output.ndjson') as f:
content = f.read()
assert "Metricbeat-system-overview" in content

os.remove("output.ndjson")
self._check_if_dashboard_exported(folder_name)

@unittest.skipUnless(INTEGRATION_TESTS, "integration test")
@pytest.mark.tag('integration')
def test_dev_tool_export_dashboard_from_yml(self):
"""
Test dev-tools/cmd/dashboards exports dashboard from dashboards YAML file
and removes unsupported characters
"""

self.test_load_dashboard()

path = os.path.normpath(self.beat_path + "/../dev-tools/cmd/dashboards/export_dashboards.go")
command = path + " -kibana http://" + self.get_kibana_host() + ":" + self.get_kibana_port()
command = "go run " + command + " -yml " + os.path.join(self.beat_path, "tests", "files", "dashboards.yml")

p = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
content, err = p.communicate()

assert p.returncode == 0

version = self.get_version()
kibana_semver = semver.VersionInfo.parse(version)
exported_dashboard_path = os.path.join(self.beat_path, "tests", "files", "_meta",
"kibana", str(kibana_semver.major), "dashboard", "Metricbeat-system-test-overview.ndjson")
def _check_if_dashboard_exported(self, folder_name):
kibana_semver = semver.VersionInfo.parse(self.get_version())
dashboard_folder = os.path.join(folder_name, "_meta", "kibana", str(kibana_semver.major), "dashboard")
assert os.path.isdir(dashboard_folder)

with open(exported_dashboard_path) as f:
with open(os.path.join(dashboard_folder, "Metricbeat-system-overview.json")) as f:
content = f.read()
assert "Metricbeat-system-overview" in content

os.remove(exported_dashboard_path)
shutil.rmtree(folder_name)

def get_host(self):
return os.getenv('ES_HOST', 'localhost') + ':' + os.getenv('ES_PORT', '9200')