Merge pull request #63606 from guvishal989/metadata_azure

Add support of exposing meta_server_grains for Azure VMs
This commit is contained in:
Gareth J. Greenaway 2023-02-10 06:32:45 -08:00 committed by GitHub
commit 2e30ac0a02
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 148 additions and 0 deletions

1
changelog/63606.added Normal file
View file

@ -0,0 +1 @@
Add support of exposing meta_server_grains for Azure VMs

View file

@ -25,6 +25,7 @@ grains modules
mdadm
mdata
metadata
metadata_azure
metadata_gce
minion_process
napalm

View file

@ -0,0 +1,5 @@
salt.grains.metadata_azure
==========================
.. automodule:: salt.grains.metadata_azure
:members:

View file

@ -0,0 +1,45 @@
"""
Grains from cloud metadata servers at 169.254.169.254 in Azure Virtual Machine
.. versionadded:: 3006.0
:depends: requests
To enable these grains that pull from the http://169.254.169.254/metadata/instance?api-version=2020-09-01
metadata server set `metadata_server_grains: True` in the minion config.
.. code-block:: yaml
metadata_server_grains: True
"""
import logging
import salt.utils.http as http
import salt.utils.json
HOST = "http://169.254.169.254"
URL = f"{HOST}/metadata/instance?api-version=2020-09-01"
log = logging.getLogger(__name__)
def __virtual__():
# Check if metadata_server_grains minion option is enabled
if __opts__.get("metadata_server_grains", False) is False:
return False
azuretest = http.query(
URL, status=True, headers=True, header_list=["Metadata: true"]
)
if azuretest.get("status", 404) != 200:
return False
return True
def metadata():
"""Takes no arguments, returns a dictionary of metadata values from Azure."""
log.debug("All checks true - loading azure metadata")
result = http.query(URL, headers=True, header_list=["Metadata: true"])
metadata = salt.utils.json.loads(result.get("body", {}))
return metadata

View file

@ -0,0 +1,96 @@
"""
Unit test for salt.grains.metadata_azure
:codeauthor: :email" `Vishal Gupta <guvishal@vmware.com>
"""
import logging
import pytest
import salt.grains.metadata_azure as metadata
import salt.utils.http as http
from tests.support.mock import create_autospec, patch
# from Exception import Exception, ValueError
log = logging.getLogger(__name__)
@pytest.fixture
def configure_loader_modules():
return {metadata: {"__opts__": {"metadata_server_grains": "True"}}}
def test_metadata_azure_search():
def mock_http(url="", headers=False, header_list=None):
metadata_vals = {
"http://169.254.169.254/metadata/instance?api-version=2020-09-01": {
"body": '{"compute": {"test": "fulltest"}}',
"headers": {"Content-Type": "application/json; charset=utf-8"},
},
}
return metadata_vals[url]
with patch(
"salt.utils.http.query",
create_autospec(http.query, autospec=True, side_effect=mock_http),
):
assert metadata.metadata() == {"compute": {"test": "fulltest"}}
def test_metadata_virtual():
print("running 1st")
with patch(
"salt.utils.http.query",
create_autospec(
http.query,
autospec=True,
return_value={
"error": "Bad request: . Required metadata header not specified"
},
),
):
assert metadata.__virtual__() is False
with patch(
"salt.utils.http.query",
create_autospec(
http.query,
autospec=True,
return_value={
"body": '{"compute": {"test": "fulltest"}}',
"headers": {"Content-Type": "application/json; charset=utf-8"},
"status": 200,
},
),
):
assert metadata.__virtual__() is True
with patch(
"salt.utils.http.query",
create_autospec(
http.query,
autospec=True,
return_value={
"body": "test",
"headers": {"Content-Type": "application/json; charset=utf-8"},
"status": 404,
},
),
):
assert metadata.__virtual__() is False
with patch(
"salt.utils.http.query",
create_autospec(
http.query,
autospec=True,
return_value={
"body": "test",
"headers": {"Content-Type": "application/json; charset=utf-8"},
"status": 400,
},
),
):
assert metadata.__virtual__() is False