From c486bc51a82856f07d5ec2e986d0ced7c64551cf Mon Sep 17 00:00:00 2001
From: karsa zoltan <karsazoltan@gmail.com>
Date: Mon, 25 Jul 2022 20:57:52 +0200
Subject: [PATCH] validation ci data

---
 circle/dashboard/forms.py      | 13 ++++++-------
 circle/dashboard/validators.py | 17 +++++++++++++++++
 circle/vm/models/instance.py   | 10 ++--------
 3 files changed, 25 insertions(+), 15 deletions(-)

diff --git a/circle/dashboard/forms.py b/circle/dashboard/forms.py
index d9915e5..280de48 100644
--- a/circle/dashboard/forms.py
+++ b/circle/dashboard/forms.py
@@ -60,7 +60,7 @@ from vm.models import (
     InstanceTemplate, Lease, InterfaceTemplate, Node, Trait, Instance
 )
 from .models import Profile, GroupProfile, Message
-from .validators import domain_validator
+from .validators import domain_validator, meta_data_validator, user_data_validator
 
 LANGUAGES_WITH_CODE = ((l[0], ugettext_lazy(l[1], " (", l[0], ")"))
                        for l in LANGUAGES)
@@ -569,6 +569,9 @@ class TemplateForm(forms.ModelForm):
 
         self.fields['raw_data'].validators.append(domain_validator)
 
+        self.fields['ci_user_data'].validators.append(user_data_validator) 
+        self.fields['ci_meta_data'].validators.append(meta_data_validator) 
+
     def clean_owner(self):
         if self.instance.pk is not None:
             return User.objects.get(pk=self.instance.owner.pk)
@@ -1535,9 +1538,11 @@ class RawDataForm(forms.ModelForm):
 
 class CIDataForm(forms.ModelForm):
     ci_meta_data = forms.CharField(disabled=True, help_text='meta-data',
+                                validators=[meta_data_validator],
                                widget=forms.Textarea(attrs={'rows': 5}),
                                required=False)
     ci_user_data = forms.CharField(disabled=True, help_text='user-data',
+                                validators=[user_data_validator], 
                                widget=forms.Textarea(attrs={'rows': 5}),
                                required=False)
 
@@ -1551,12 +1556,6 @@ class CIDataForm(forms.ModelForm):
         helper.form_show_labels = False
         return helper
 
-    def clean(self):
-        cleaned_data = super(forms.ModelForm, self).clean()
-        Instance.validate_meta_data(cleaned_data['ci_meta_data'])
-        Instance.validate_user_data(cleaned_data['ci_user_data'])
-        return cleaned_data
-
 
 class GroupPermissionForm(forms.ModelForm):
     permissions = forms.ModelMultipleChoiceField(
diff --git a/circle/dashboard/validators.py b/circle/dashboard/validators.py
index 3fb9970..825794b 100644
--- a/circle/dashboard/validators.py
+++ b/circle/dashboard/validators.py
@@ -20,6 +20,9 @@ from django.utils.translation import ugettext_lazy as _
 
 from lxml import etree as ET
 import logging
+import yaml
+
+from vm.models import Instance
 
 rng_file = "/usr/share/libvirt/schemas/domain.rng"
 
@@ -50,6 +53,20 @@ def domain_validator(value):
             raise ValidationError(e.message)
 
 
+def meta_data_validator(value):
+    try:
+        Instance.validate_meta_data(value)
+    except yaml.YAMLError as exc:
+        raise ValidationError(exc.problem_mark)
+
+
+def user_data_validator(value):
+    try:
+        Instance.validate_user_data(value)
+    except yaml.YAMLError as exc:
+        raise ValidationError(exc.problem_mark)
+
+
 def connect_command_template_validator(value):
     """Validate value as a connect command template.
 
diff --git a/circle/vm/models/instance.py b/circle/vm/models/instance.py
index fcf8421..7022ec2 100644
--- a/circle/vm/models/instance.py
+++ b/circle/vm/models/instance.py
@@ -376,10 +376,7 @@ class Instance(AclBase, VirtualMachineDescModel, StatusModel, OperatedMixin,
     def validate_user_data(cls, user_data):
         data = user_data.replace('{{user}}', 'user')
         data = data.replace('{{password}}', 'passwd')
-        try:
-            yaml.dump(yaml.load(data, Loader=yaml.Loader))
-        except yaml.YAMLError as exc:
-            raise forms.ValidationError(exc.problem_mark)
+        yaml.dump(yaml.load(data, Loader=yaml.Loader))
         return True
 
     @property
@@ -390,10 +387,7 @@ class Instance(AclBase, VirtualMachineDescModel, StatusModel, OperatedMixin,
     @classmethod
     def validate_meta_data(cls, meta_data):
         data = meta_data.replace('{{hostname}}', 'hostname')
-        try:
-            yaml.dump(yaml.load(data, Loader=yaml.Loader))
-        except yaml.YAMLError as exc:
-            raise forms.ValidationError(exc.problem_mark)
+        yaml.dump(yaml.load(data, Loader=yaml.Loader))
         return True
         
 
--
libgit2 0.26.0