Skip to content

Commit 118677f

Browse files
ozgengreenbonebot
authored andcommitted
add: add get and modify integration config commands
Implement `get_integration_configs` and `modify_integration_config` commands and add unit tests for both GMP requests.
1 parent ef009ab commit 118677f

8 files changed

Lines changed: 457 additions & 0 deletions

File tree

gvm/protocols/gmp/_gmpnext.py

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
Credentials,
1717
CredentialStoreCredentialType,
1818
CredentialStores,
19+
IntegrationConfigs,
1920
OCIImageTargets,
2021
Tasks,
2122
)
@@ -927,3 +928,68 @@ def stop_task(self, task_id: EntityID) -> T:
927928
return self._send_request_and_transform_response(
928929
Tasks.stop_task(task_id=task_id)
929930
)
931+
932+
def get_integration_config(
933+
self, integration_config_id: EntityID, *, details: Optional[bool] = None
934+
) -> T:
935+
"""Request a single Integration Configuration.
936+
937+
Args:
938+
integration_config_id: UUID of the integration config to request.
939+
details: Whether to include detail information.
940+
"""
941+
return self._send_request_and_transform_response(
942+
IntegrationConfigs.get_integration_config(
943+
integration_config_id=integration_config_id, details=details
944+
)
945+
)
946+
947+
def get_integration_configs(
948+
self,
949+
*,
950+
filter_string: Optional[str] = None,
951+
filter_id: Optional[EntityID] = None,
952+
) -> T:
953+
"""Request a list of Integration Configurations.
954+
955+
Args:
956+
filter_string: Filter term to use for the query.
957+
filter_id: UUID of an existing filter to use for the query.
958+
"""
959+
return self._send_request_and_transform_response(
960+
IntegrationConfigs.get_integration_configs(
961+
filter_string=filter_string,
962+
filter_id=filter_id,
963+
)
964+
)
965+
966+
def modify_integration_config(
967+
self,
968+
integration_config_id: EntityID,
969+
*,
970+
service_url: Optional[str] = None,
971+
service_cacert: Optional[str] = None,
972+
oidc_provider_url: Optional[str] = None,
973+
oidc_provider_client_id: Optional[str] = None,
974+
oidc_provider_client_secret: Optional[str] = None,
975+
) -> T:
976+
"""Modify an existing Integration Configuration.
977+
978+
Args:
979+
integration_config_id: UUID of configuration to modify.
980+
service_url: Integration Service URL.
981+
service_cacert: Integration Service Certificate.
982+
oidc_provider_url: OIDC Provider URL.
983+
oidc_provider_client_id: OIDC Provider Client ID.
984+
oidc_provider_client_secret: OIDC Provider Client Secret.
985+
"""
986+
return self._send_request_and_transform_response(
987+
IntegrationConfigs.modify_integration_config(
988+
integration_config_id=integration_config_id,
989+
service_url=service_url,
990+
service_cacert=service_cacert,
991+
oidc_provider_url=oidc_provider_url,
992+
oidc_provider_client_id=oidc_provider_client_id,
993+
oidc_provider_client_secret=oidc_provider_client_secret,
994+
)
995+
)

gvm/protocols/gmp/requests/next/__init__.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,9 @@
1010
Credentials,
1111
CredentialStoreCredentialType,
1212
)
13+
from gvm.protocols.gmp.requests.next._integration_configs import (
14+
IntegrationConfigs,
15+
)
1316
from gvm.protocols.gmp.requests.next._oci_image_targets import OCIImageTargets
1417
from gvm.protocols.gmp.requests.next._tasks import Tasks
1518

@@ -118,6 +121,7 @@
118121
"Hosts",
119122
"HostsOrdering",
120123
"InfoType",
124+
"IntegrationConfigs",
121125
"Notes",
122126
"Nvts",
123127
"OCIImageTargets",
Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,112 @@
1+
from typing import Optional
2+
3+
from gvm.errors import RequiredArgument
4+
from gvm.protocols.core import Request
5+
from gvm.protocols.gmp.requests import EntityID
6+
from gvm.utils import to_bool
7+
from gvm.xml import XmlCommand
8+
9+
10+
class IntegrationConfigs:
11+
@classmethod
12+
def get_integration_config(
13+
cls, integration_config_id: EntityID, *, details: Optional[bool] = None
14+
) -> Request:
15+
"""Request a single Integration Configuration.
16+
17+
Args:
18+
integration_config_id: UUID of the integration config to request.
19+
details: Whether to include detail information.
20+
"""
21+
if not integration_config_id:
22+
raise RequiredArgument(
23+
function=cls.get_integration_config.__name__,
24+
argument="integration_config_id",
25+
)
26+
27+
cmd = XmlCommand("get_integration_configs")
28+
cmd.set_attribute("integration_config_id", str(integration_config_id))
29+
30+
if details is not None:
31+
cmd.set_attribute("details", to_bool(details))
32+
33+
return cmd
34+
35+
@classmethod
36+
def get_integration_configs(
37+
cls,
38+
*,
39+
filter_string: Optional[str] = None,
40+
filter_id: Optional[EntityID] = None,
41+
) -> Request:
42+
"""Request a list of Integration Configurations.
43+
44+
Args:
45+
filter_string: Filter term to use for the query.
46+
filter_id: UUID of an existing filter to use for the query.
47+
"""
48+
cmd = XmlCommand("get_integration_configs")
49+
cmd.add_filter(filter_string, filter_id)
50+
51+
return cmd
52+
53+
@classmethod
54+
def modify_integration_config(
55+
cls,
56+
integration_config_id: EntityID,
57+
*,
58+
service_url: Optional[str] = None,
59+
service_cacert: Optional[str] = None,
60+
oidc_provider_url: Optional[str] = None,
61+
oidc_provider_client_id: Optional[str] = None,
62+
oidc_provider_client_secret: Optional[str] = None,
63+
) -> Request:
64+
"""Modify an existing Integration Configuration.
65+
66+
Args:
67+
integration_config_id: UUID of configuration to modify.
68+
service_url: Integration Service URL.
69+
service_cacert: Integration Service Certificate.
70+
oidc_provider_url: OIDC Provider URL.
71+
oidc_provider_client_id: OIDC Provider Client ID.
72+
oidc_provider_client_secret: OIDC Provider Client Secret.
73+
"""
74+
if not integration_config_id:
75+
raise RequiredArgument(
76+
function=cls.modify_integration_config.__name__,
77+
argument="integration_config_id",
78+
)
79+
80+
cmd = XmlCommand("modify_integration_config")
81+
cmd.set_attribute("uuid", str(integration_config_id))
82+
83+
# <service> element
84+
service = cmd.add_element("service")
85+
86+
if service_url is not None:
87+
service.add_element("url", service_url)
88+
else:
89+
service.add_element("url")
90+
if service_cacert is not None:
91+
service.add_element("cacert", service_cacert)
92+
else:
93+
service.add_element("cacert")
94+
95+
# <oidc> element
96+
oidc = cmd.add_element("oidc")
97+
if oidc_provider_url is not None:
98+
oidc.add_element("oidc_provider_url", oidc_provider_url)
99+
else:
100+
oidc.add_element("oidc_provider_url")
101+
102+
oidc_client = oidc.add_element("client")
103+
if oidc_provider_client_id is not None:
104+
oidc_client.add_element("id", oidc_provider_client_id)
105+
else:
106+
oidc_client.add_element("id")
107+
if oidc_provider_client_secret is not None:
108+
oidc_client.add_element("secret", oidc_provider_client_secret)
109+
else:
110+
oidc_client.add_element("secret")
111+
112+
return cmd
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
# SPDX-FileCopyrightText: 2026 Greenbone AG
2+
#
3+
# SPDX-License-Identifier: GPL-3.0-or-later
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
# SPDX-FileCopyrightText: 2026 Greenbone AG
2+
#
3+
# SPDX-License-Identifier: GPL-3.0-or-later
4+
#
5+
6+
from gvm.errors import RequiredArgument
7+
8+
9+
class GmpGetIntegrationConfigTestMixin:
10+
def test_get_integration_config(self):
11+
self.gmp.get_integration_config("uuid")
12+
13+
self.connection.send.has_been_called_with(
14+
b'<get_integration_configs integration_config_id="uuid"/>'
15+
)
16+
self.gmp.get_integration_config(integration_config_id="uuid")
17+
18+
self.connection.send.has_been_called_with(
19+
b'<get_integration_configs integration_config_id="uuid"/>'
20+
)
21+
22+
def test_get_integration_config_without_id(self):
23+
with self.assertRaises(RequiredArgument):
24+
self.gmp.get_integration_config(integration_config_id=None)
25+
26+
with self.assertRaises(RequiredArgument):
27+
self.gmp.get_integration_config("")
28+
29+
def test_get_integration_config_with_details(self):
30+
self.gmp.get_integration_config(
31+
integration_config_id="uuid", details=True
32+
)
33+
34+
self.connection.send.has_been_called_with(
35+
b'<get_integration_configs integration_config_id="uuid" details="1"/>'
36+
)
37+
38+
self.gmp.get_integration_config(
39+
integration_config_id="uuid", details=False
40+
)
41+
42+
self.connection.send.has_been_called_with(
43+
b'<get_integration_configs integration_config_id="uuid" details="0"/>'
44+
)
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
# SPDX-FileCopyrightText: 2026 Greenbone AG
2+
#
3+
# SPDX-License-Identifier: GPL-3.0-or-later
4+
#
5+
6+
7+
class GmpGetIntegrationConfigsTestMixin:
8+
def test_get_integration_configs(self):
9+
self.gmp.get_integration_configs()
10+
11+
self.connection.send.has_been_called_with(b"<get_integration_configs/>")
12+
13+
def test_get_integration_configs_with_filter_string(self):
14+
self.gmp.get_integration_configs(filter_string="foo=bar")
15+
16+
self.connection.send.has_been_called_with(
17+
b'<get_integration_configs filter="foo=bar"/>'
18+
)
19+
20+
def test_get_integration_configs_with_filter_id(self):
21+
self.gmp.get_integration_configs(filter_id="f1")
22+
23+
self.connection.send.has_been_called_with(
24+
b'<get_integration_configs filt_id="f1"/>'
25+
)

0 commit comments

Comments
 (0)