This is an automated email from the ASF dual-hosted git repository.
utkarsharma pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/airflow.git
The following commit(s) were added to refs/heads/main by this push:
new 6b49bb3a4f Fix metadata override for ComputeEngineSSHHook (#37192)
6b49bb3a4f is described below
commit 6b49bb3a4f0994d8beb95b789c07ed894b577abf
Author: M. Olcay Tercanlı <[email protected]>
AuthorDate: Wed Feb 7 18:45:05 2024 +0000
Fix metadata override for ComputeEngineSSHHook (#37192)
Co-authored-by: Utkarsh Sharma <[email protected]>
---
.../providers/google/cloud/hooks/compute_ssh.py | 2 +-
.../google/cloud/hooks/test_compute_ssh.py | 40 ++++++++++++++++++++++
2 files changed, 41 insertions(+), 1 deletion(-)
diff --git a/airflow/providers/google/cloud/hooks/compute_ssh.py
b/airflow/providers/google/cloud/hooks/compute_ssh.py
index 13b1bb3f4b..ee6eb63b02 100644
--- a/airflow/providers/google/cloud/hooks/compute_ssh.py
+++ b/airflow/providers/google/cloud/hooks/compute_ssh.py
@@ -327,7 +327,7 @@ class ComputeEngineSSHHook(SSHHook):
break
else:
new_dict = {"key": "ssh-keys", "value": keys}
- metadata["items"] = [new_dict]
+ metadata["items"] = [*items, new_dict]
self._compute_hook.set_instance_metadata(
zone=self.zone, resource_id=self.instance_name, metadata=metadata,
project_id=self.project_id
diff --git a/tests/providers/google/cloud/hooks/test_compute_ssh.py
b/tests/providers/google/cloud/hooks/test_compute_ssh.py
index ed972afb03..27cfe4fc1b 100644
--- a/tests/providers/google/cloud/hooks/test_compute_ssh.py
+++ b/tests/providers/google/cloud/hooks/test_compute_ssh.py
@@ -507,3 +507,43 @@ class TestComputeEngineHookWithPassedProjectId:
assert isinstance(hook.use_oslogin, bool)
assert 300 == hook.expire_time
assert isinstance(hook.expire_time, int)
+
+ @pytest.mark.parametrize(
+ "metadata, expected_metadata",
+ [
+ ({"items": []}, {"items": [{"key": "ssh-keys", "value":
"user:pubkey\n"}]}),
+ (
+ {"items": [{"key": "test", "value": "test"}]},
+ {"items": [{"key": "ssh-keys", "value": "user:pubkey\n"},
{"key": "test", "value": "test"}]},
+ ),
+ (
+ {"items": [{"key": "ssh-keys", "value": "test"}, {"key":
"test", "value": "test"}]},
+ {
+ "items": [
+ {"key": "ssh-keys", "value": "user:pubkey\ntest"},
+ {"key": "test", "value": "test"},
+ ]
+ },
+ ),
+ ],
+ )
+
@mock.patch("airflow.providers.google.cloud.hooks.compute_ssh.ComputeEngineHook.set_instance_metadata")
+
@mock.patch("airflow.providers.google.cloud.hooks.compute_ssh.ComputeEngineHook.get_instance_info")
+ def test__authorize_compute_engine_instance_metadata(
+ self, mock_get_instance_info, mock_set_instance_metadata, metadata,
expected_metadata
+ ):
+ """Test to ensure the addition metadata is retained"""
+ mock_get_instance_info.return_value = {"metadata": metadata}
+ conn = Connection(
+ conn_type="gcpssh",
+ extra=json.dumps({}),
+ )
+ conn_uri = conn.get_uri()
+ with mock.patch.dict("os.environ", AIRFLOW_CONN_GCPSSH=conn_uri):
+ hook = ComputeEngineSSHHook(gcp_conn_id="gcpssh")
+ hook.user = "user"
+ pubkey = "pubkey"
+ hook._authorize_compute_engine_instance_metadata(pubkey=pubkey)
+
mock_set_instance_metadata.call_args.kwargs["metadata"]["items"].sort(key=lambda
x: x["key"])
+ expected_metadata["items"].sort(key=lambda x: x["key"])
+ assert mock_set_instance_metadata.call_args.kwargs["metadata"] ==
expected_metadata