Skip to content

Commit f71c1d7

Browse files
authored
[AAP-18358] Add key/value pair validation for extra var (#569)
* Add validation for extra var on create Solves: AAP-18358
1 parent 3b60826 commit f71c1d7

File tree

4 files changed

+58
-7
lines changed

4 files changed

+58
-7
lines changed

src/aap_eda/api/serializers/project.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
from rest_framework.validators import UniqueValidator
1717

1818
from aap_eda.api.serializers.credential import CredentialRefSerializer
19-
from aap_eda.core import models
19+
from aap_eda.core import models, validators
2020

2121

2222
class ProjectSerializer(serializers.ModelSerializer):
@@ -143,6 +143,7 @@ class ExtraVarSerializer(serializers.ModelSerializer):
143143
extra_var = serializers.CharField(
144144
required=True,
145145
help_text="Content of the extra_var",
146+
validators=[validators.is_extra_var_dict],
146147
)
147148

148149
class Meta:

src/aap_eda/core/validators.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
# limitations under the License.
1414
import logging
1515

16+
import yaml
1617
from rest_framework import serializers
1718

1819
from aap_eda.core import models
@@ -68,3 +69,16 @@ def check_awx_tokens(user_id: int) -> int:
6869
)
6970

7071
return user_id
72+
73+
74+
def is_extra_var_dict(extra_var: str):
75+
try:
76+
data = yaml.safe_load(extra_var)
77+
if not isinstance(data, dict):
78+
raise serializers.ValidationError(
79+
"Extra var is not in object format"
80+
)
81+
except yaml.YAMLError:
82+
raise serializers.ValidationError(
83+
"Extra var must be in JSON or YAML format"
84+
)

src/aap_eda/services/activation/manager.py

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1036,12 +1036,6 @@ def _create_activation_instance(self):
10361036
def _build_container_request(self) -> ContainerRequest:
10371037
if self.db_instance.extra_var:
10381038
context = yaml.safe_load(self.db_instance.extra_var.extra_var)
1039-
# TODO: This will be validated by the api
1040-
# https://issues.redhat.com/browse/AAP-18358
1041-
if not isinstance(context, dict):
1042-
msg = f"{context} is not in dict format."
1043-
LOGGER.error(msg)
1044-
raise exceptions.ActivationStartError(msg)
10451039
else:
10461040
context = {}
10471041

tests/integration/api/test_extra_var.py

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,3 +56,45 @@ def test_retrieve_extra_var(client: APIClient):
5656
def test_retrieve_extra_var_not_exist(client: APIClient):
5757
response = client.get(f"{api_url_v1}/extra-vars/42/")
5858
assert response.status_code == status.HTTP_404_NOT_FOUND
59+
60+
61+
NOT_OBJECT_ERROR_MSG = "Extra var is not in object format"
62+
NOT_YAML_JSON_ERROR_MSG = "Extra var must be in JSON or YAML format"
63+
64+
65+
@pytest.mark.parametrize(
66+
"extra_var,error_message",
67+
[
68+
("John", NOT_OBJECT_ERROR_MSG),
69+
("John, ", NOT_OBJECT_ERROR_MSG),
70+
("[John, 3,]", NOT_OBJECT_ERROR_MSG),
71+
('{"name": "John" - 2 }', NOT_YAML_JSON_ERROR_MSG),
72+
],
73+
)
74+
@pytest.mark.django_db
75+
def test_extra_var_invalid_data(client: APIClient, extra_var, error_message):
76+
invalid_data = {
77+
"extra_var": extra_var,
78+
}
79+
response = client.post(f"{api_url_v1}/extra-vars/", data=invalid_data)
80+
assert response.status_code == status.HTTP_400_BAD_REQUEST
81+
assert str(response.data["extra_var"][0]) == error_message
82+
83+
84+
@pytest.mark.parametrize(
85+
"extra_var",
86+
[
87+
"John: Doe",
88+
"John: 2",
89+
'{"name": "John"}',
90+
'"age": 20',
91+
"---\nname: hello\nhosts: localhost\ngather_facts: false",
92+
],
93+
)
94+
@pytest.mark.django_db
95+
def test_extra_var_valid_data(client: APIClient, extra_var):
96+
valid_data = {
97+
"extra_var": extra_var,
98+
}
99+
response = client.post(f"{api_url_v1}/extra-vars/", data=valid_data)
100+
assert response.status_code == status.HTTP_201_CREATED

0 commit comments

Comments
 (0)